package com.mzl.flower.service.flower; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.mzl.flower.config.exception.ValidationException; import com.mzl.flower.config.security.SecurityUtils; import com.mzl.flower.constant.Constants; import com.mzl.flower.dto.request.flower.*; import com.mzl.flower.dto.request.flower.FlowerTagMultipleDTO; import com.mzl.flower.dto.response.flower.*; import com.mzl.flower.entity.customer.Collect; import com.mzl.flower.entity.customer.Customer; import com.mzl.flower.entity.flower.*; import com.mzl.flower.entity.payment.Cart; import com.mzl.flower.entity.payment.Order; import com.mzl.flower.entity.payment.OrderItem; import com.mzl.flower.entity.supplier.Station; import com.mzl.flower.entity.supplier.Supplier; import com.mzl.flower.entity.supplier.SupplierType; import com.mzl.flower.mapper.customer.CollectMapper; import com.mzl.flower.mapper.flower.*; import com.mzl.flower.mapper.payment.CartMapper; import com.mzl.flower.mapper.payment.OrderItemMapper; import com.mzl.flower.mapper.supplier.StationMapper; import com.mzl.flower.mapper.supplier.SupplierTypeMapper; import com.mzl.flower.service.BaseService; import com.mzl.flower.service.customer.BrowseService; import io.micrometer.core.instrument.util.StringUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.Map; @Slf4j @Service @Transactional public class FlowerService extends BaseService { @Autowired private FlowerMapper flowerMapper; @Autowired private FlowerCategoryMapper categoryMapper; @Autowired private FlowerParamService paramService; @Autowired private SupplierTypeMapper supplierTypeMapper; @Autowired private StationMapper stationMapper; @Autowired private FlowerCategoryDailyMapper categoryDailyMapper; @Autowired private BrowseService browseService; @Autowired private FlowerZoneMapper flowerZoneMapper; @Autowired private CollectMapper collectMapper; @Autowired private FlowerZoneMapMapper flowerZoneMapMapper; @Autowired private CartMapper cartMapper; @Autowired private OrderItemMapper orderItemMapper; @Async public synchronized void updateFlowerSales(Order order){ List items = orderItemMapper.selectList(new QueryWrapper() .eq("order_id", order.getId())); if(items != null && items.size() > 0){ for(OrderItem oi : items){ flowerMapper.updateFlowerSales(oi.getFlowerId(), oi.getNum()); } } } @Async public synchronized void updateCategoryInfo(Long category){ flowerMapper.updateFlowerCategoryInfo(category); } /** * 花农(供应商)提交商品 * * @param dto * @return */ public Long commitFlower(FlowerCreateDTO dto){ Supplier s = getCurrentSupplier(); if(!"P".equals(s.getStatus())){ throw new ValidationException("审核未通过,无法操作!"); } Flower g = new Flower(); BeanUtils.copyProperties(dto, g); String userId = SecurityUtils.getUserId(); g.create(userId); g.setBanners(toJSONString(dto.getBannerList())); g.setStatus(Constants.FLOWER_STATUS.PENDING.name()); g.setSupplierId(s.getId()); flowerMapper.insert(g); FlowerCategory fc = categoryMapper.selectById(g.getCategory()); if(fc.getParamId() != null){ List params = dto.getParams(); paramService.insertTableData(fc.getParamId(), g.getId(), params); } return g.getId(); } public Long editFlower(FlowerUpdateDTO dto){ Flower g = flowerMapper.selectById(dto.getId()); if(Constants.FLOWER_STATUS.PENDING.name().equals(g.getStatus()) || Constants.FLOWER_STATUS.REJECT.name().equals(g.getStatus()) || Constants.FLOWER_STATUS.DRAFT.name().equals(g.getStatus()) || Constants.FLOWER_STATUS.FORCE_OFF.name().equals(g.getStatus()) ){ BeanUtils.copyProperties(dto, g); g.setBanners(toJSONString(dto.getBannerList())); } else { g.setPrice(dto.getPrice()); g.setStock(dto.getStock()); } g.update(SecurityUtils.getUserId()); if(Constants.FLOWER_STATUS.DRAFT.name().equals(g.getStatus()) || Constants.FLOWER_STATUS.REJECT.name().equals(g.getStatus()) || Constants.FLOWER_STATUS.FORCE_OFF.name().equals(g.getStatus()) ){ g.setStatus(Constants.FLOWER_STATUS.PENDING.name()); } flowerMapper.updateById(g); FlowerCategory fc = categoryMapper.selectById(g.getCategory()); if(fc.getParamId() != null){ List params = dto.getParams(); Map m = paramService.getTableDataById(fc.getParamId(), g.getId()); if(m == null) { paramService.insertTableData(fc.getParamId(), g.getId(), params); } else { paramService.updateTableData(fc.getParamId(), g.getId(), params); } } return g.getId(); } public Long editFlowerAdmin(FlowerUpdateAdminDTO dto){ Flower g = flowerMapper.selectById(dto.getId()); g.setSales(dto.getSales()); g.update(SecurityUtils.getUserId()); flowerMapper.updateById(g); FlowerCategory fc = categoryMapper.selectById(g.getCategory()); if(fc.getParamId() != null){ List params = dto.getParams(); Map m = paramService.getTableDataById(fc.getParamId(), g.getId()); if(m == null) { paramService.insertTableData(fc.getParamId(), g.getId(), params); } else { paramService.updateTableData(fc.getParamId(), g.getId(), params); } } return g.getId(); } /** * 花农(供应商)商品列表 * * @param page * @param dto * @return */ public Page selectFlowerSupplierList(Page page, FlowerQueryDTO dto, int deleted){ Supplier s = getCurrentSupplier(); dto.setStatusList(splitParam(dto.getStatus())); List ls = flowerMapper.selectFlowerSupplierList(page, deleted, s.getId(), dto); page.setRecords(ls); return page; } /** * 花农(供应商)商品详情 * * @param id * @return */ public FlowerSupplierDTO getFlowerSupplierDetail(Long id){ FlowerSupplierDTO dto = new FlowerSupplierDTO(); Flower f = flowerMapper.selectById(id); setFlowerInfo(f, dto); return dto; } private void setFlowerInfo(Flower f, FlowerSupplierDTO dto){ if(f == null){ throw new ValidationException("商品未找到"); } BeanUtils.copyProperties(f, dto); dto.setBannerList(parseArray(f.getBanners(), String.class)); FlowerCategory fc = categoryMapper.selectById(f.getCategory()); dto.setCategoryStr(fc.getName()); dto.setParams(getFlowerParams(fc.getParamId(), f.getId())); } private List getFlowerParams(Long paramId, Long fId){ List result = new ArrayList<>(); if(paramId != null) { List params = paramService.getParamItemListByParamId(paramId); setParamResult(paramId, fId, params, result); } return result; } private void setParamResult(Long paramId, Long fId, List params, List result){ Map map = paramService.getTableDataById(paramId, fId); if(params != null && params.size() > 0 && map != null){ for(ParamItemDTO p : params){ ParamItemDTO it = new ParamItemDTO(); BeanUtils.copyProperties(p, it); it.setValue(map.get(p.getColumn())); result.add(it); } } } public List getFlowerParams(Long paramId, Long fId , Map> paramMap){ List result = new ArrayList<>(); if(paramId != null) { List params = paramMap.get(paramId); if(params == null){ params = paramService.getParamItemListByParamId(paramId); paramMap.put(paramId, params); } setParamResult(paramId, fId, params, result); } return result; } public void setFlowerShown(Long id, Boolean shown){ Flower f = flowerMapper.selectById(id); if(f == null){ throw new ValidationException("商品不存在"); } f.setShown(shown); flowerMapper.updateById(f); } /** * 运营端 商品列表 * * @param page * @param dto * @return */ public Page selectFlowerList(Page page, FlowerQueryDTO dto){ List statusList = splitParam(dto.getStatus()); dto.setStatusList(statusList); if(statusList != null && statusList.contains(Constants.FLOWER_STATUS.OFF.name())){ statusList.add(Constants.FLOWER_STATUS.FORCE_OFF.name()); } List ls = flowerMapper.selectFlowerList(page, dto); page.setRecords(ls); return page; } public FlowerDTO getFlowerDetail(Long id){ FlowerDTO dto = new FlowerDTO(); Flower f = flowerMapper.selectById(id); setFlowerInfo(f, dto); Supplier s = supplierMapper.selectById(f.getSupplierId()); dto.setSupplierName(s.getName()); dto.setSupplierTel(s.getContactTel()); SupplierType t = supplierTypeMapper.selectById(s.getTypeId()); dto.setSupplierType(t != null ? t.getName() : ""); Station a = stationMapper.selectById(s.getStationId()); dto.setSupplierStation(a != null ? a.getName() : ""); List ls = flowerZoneMapMapper.selectList(new QueryWrapper() .eq("flower_id", id).orderByAsc("zone_id")); List zoneIdLs = new ArrayList<>(); if(ls != null && ls.size() > 0){ for(FlowerZoneMap fzm : ls){ zoneIdLs.add(fzm.getZoneId()); } List zLs = flowerZoneMapper.selectBatchIds(zoneIdLs); List zoneIdStrLs = new ArrayList<>(); List zoneNameLs = new ArrayList<>(); for(FlowerZone fz : zLs){ zoneIdStrLs.add(fz.getId() + ""); zoneNameLs.add(fz.getName()); } dto.setZoneId(String.join(",", zoneIdStrLs)); dto.setZoneName(String.join(",", zoneNameLs)); } //TODO 合伙人加价列表 return dto; } public void auditFlower(Long id, String auditRemarks, String status){ Flower f = flowerMapper.selectById(id); if(f == null){ throw new ValidationException("商品未找到"); } f.setAuditRemarks(auditRemarks); f.setAuditTime(LocalDateTime.now()); f.setStatus(status); flowerMapper.updateById(f); /*if(Constants.FLOWER_STATUS.REJECT.name().equals(status)){ //通知花农。只是说花农在小程序可以查看驳回的商品,已包含驳回字段 }*/ } public void auditFlowers(FlowerAuditMultipleDTO dto, String status){ List ids = dto.getIds(); if(ids == null || ids.size() == 0){ throw new ValidationException("请选择商品"); } for(Long id : ids){ auditFlower(id, dto.getAuditRemarks(), status); } } public void setOffOn(Long id, String status){ Flower f = flowerMapper.selectById(id); if(f == null){ throw new ValidationException("商品未找到"); } String s = f.getStatus(); if(Constants.FLOWER_STATUS.FORCE_OFF.name().equals(s)){ throw new ValidationException("强制下架商品请编辑提交重新审核"); } if(!Constants.FLOWER_STATUS.UP.name().equals(s) && !Constants.FLOWER_STATUS.OFF.name().equals(s)){ throw new ValidationException("无法上下架"); } f.setStatus(status); flowerMapper.updateById(f); if(Constants.FLOWER_STATUS.OFF.name().equals(f.getStatus())){ //清除购物车商品 cartMapper.delete(new QueryWrapper().eq("flower_id", id)); } } public void deleteFlower(Long id){ flowerMapper.deleteById(id); //清除购物车商品 cartMapper.delete(new QueryWrapper().eq("flower_id", id)); } public void restoreFlower(Long id){ Flower f = flowerMapper.selectById(id); if(f == null){ throw new ValidationException("商品未找到"); } f.setDeleted(false); f.setStatus(Constants.FLOWER_STATUS.DRAFT.name()); flowerMapper.updateById(f); } public void editFlowerPrice(FlowerPriceDTO dto){ Flower f = flowerMapper.selectById(dto.getId()); if(f == null){ throw new ValidationException("商品未找到"); } f.setPrice(dto.getPrice()); flowerMapper.updateById(f); } public void editFlowerStock(FlowerStockDTO dto){ Flower f = flowerMapper.selectById(dto.getId()); if(f == null){ throw new ValidationException("商品未找到"); } f.setStock(dto.getStock()); flowerMapper.updateById(f); } public void setFlowersTags(FlowerTagMultipleDTO dto){ List ids = dto.getIds(); if(ids == null || ids.size() == 0){ throw new ValidationException("请选择商品"); } for(Long id : ids) { Flower f = flowerMapper.selectById(id); f.setTags(dto.getTags()); flowerMapper.updateById(f); } } public void setFlowersForceOff(FlowerOffDTO dto){ List ids = dto.getIds(); if(ids == null || ids.size() == 0){ throw new ValidationException("请选择商品"); } for(Long id : ids) { Flower f = flowerMapper.selectById(id); f.setStatus(Constants.FLOWER_STATUS.FORCE_OFF.name()); flowerMapper.updateById(f); //清除购物车商品 cartMapper.delete(new QueryWrapper().eq("flower_id", id)); } } /** * 花店交易大厅商品列表 * * @param page * @param dto * @return */ public Page selectShowFlowerList(Page page, FlowerShowQueryDTO dto) { /*if (StringUtils.isNotEmpty(dto.getColumn())) { List orders = new ArrayList<>(); OrderItem i = new OrderItem(); i.setColumn(dto.getColumn()); i.setAsc(dto.isAsc()); page.setOrders(orders); }*/ dto.setUserId(SecurityUtils.getUserId()); dto.setParamId(paramService.getParamIdByCategoryId(dto.getCategory())); List ls = flowerMapper.selectFlowerShowList(page, dto); if(ls != null && ls.size() > 0){ Long partnerId = getCurrentCustomerPartner(); for(FlowerShowListDTO s : ls){ BigDecimal price = getFinalPrice(partnerId, s.getCategory() , s.getId(), s.getPrice(), s.getLevel()); s.setPrice(price); s.setCollection(s.getCollectCount() > 0); s.setShopnum(s.getShopnum() == null ? 0 : s.getShopnum()); if(s.getSales() != null && s.getRealSales() != null){ s.setSales(s.getSales() + s.getRealSales()); } } } page.setRecords(ls); return page; } public FlowerShowDTO getShowFlowerDetail(Long id, Long partnerId){ FlowerShowDTO dto = new FlowerShowDTO(); Flower f = flowerMapper.selectById(id); setFlowerInfo(f, dto); Supplier s = supplierMapper.selectById(f.getSupplierId()); dto.setSupplierName(s.getName()); dto.setSupplierCover(s.getCover()); SupplierType t = supplierTypeMapper.selectById(s.getTypeId()); dto.setSupplierType(t != null ? t.getName() : ""); Station a = stationMapper.selectById(s.getStationId()); dto.setSupplierStation(a != null ? a.getName() : ""); Long pId = partnerId; if(pId == null){ pId = getCurrentCustomerPartner(); } BigDecimal price = getFinalPrice(pId, dto.getCategory() , s.getId(), dto.getPrice(), dto.getLevel()); dto.setPrice(price); String userId = SecurityUtils.getUserId(); if(StringUtils.isNotEmpty(userId)) { int count = collectMapper.selectCount(new QueryWrapper() .eq("user_id", userId) .eq("flower_id", id) ); dto.setCollection(count > 0); Integer num = cartMapper.getCartFlowerCount(userId, id); dto.setShopnum(num == null ? 0 : num); //添加浏览历史日志 browseService.addBrowseHistory(userId, f.getId()); } if(dto.getSales() != null && dto.getRealSales() != null){ dto.setSales(dto.getSales() + dto.getRealSales()); } return dto; } private FlowerCategoryDaily getCategoryDaily(Long categoryId, Long partnerId, LocalDate day){ QueryWrapper q = new QueryWrapper() .eq("category_id", categoryId).eq("day", day); if(partnerId == null){ q = q.isNull("partner_id"); } else { q = q.eq("partner_id", partnerId); } return categoryDailyMapper.selectOne(q); } public void calculateCategoryDaily(Long categoryId, Long partnerId){ List ls = flowerMapper.selectList(new QueryWrapper() .eq("category", categoryId).eq("status", Constants.FLOWER_STATUS.UP.name())); if(ls != null && ls.size() > 0){ LocalDate preDay = LocalDate.now().plusDays(-1); FlowerCategoryDaily pre = getCategoryDaily(categoryId, partnerId, preDay); int total = ls.size(); BigDecimal totalAmount = new BigDecimal(0); for(Flower f : ls){ BigDecimal price = getFinalPrice(partnerId, categoryId, f.getId(), f.getPrice(), f.getLevel()); totalAmount = totalAmount.add(price); } BigDecimal avePrice = totalAmount.divide(new BigDecimal(total), 2, RoundingMode.HALF_UP);//均价 BigDecimal avePriceDifference = new BigDecimal(0);//比前一天差价 double avePriceDifferenceRate = 0D;//差价百分比 if(pre != null){ avePriceDifference = avePrice.subtract(pre.getAvePrice()); if(pre.getAvePrice() != null && pre.getAvePrice().doubleValue() != 0) { BigDecimal rate = avePriceDifference.divide(pre.getAvePrice(), 2, RoundingMode.HALF_UP); avePriceDifferenceRate = rate.doubleValue(); } } FlowerCategoryDaily cd = getCategoryDaily(categoryId, partnerId, LocalDate.now()); if (cd == null) { cd = new FlowerCategoryDaily(); cd.setCategoryId(categoryId); cd.setPartnerId(partnerId); cd.setDay(LocalDate.now()); cd.create(); cd.setAvePrice(avePrice); cd.setAvePriceDifference(avePriceDifference); cd.setAvePriceDifferenceRate(avePriceDifferenceRate); categoryDailyMapper.insert(cd); } else { cd.setUpdateTime(LocalDateTime.now()); cd.setAvePrice(avePrice); cd.setAvePriceDifference(avePriceDifference); cd.setAvePriceDifferenceRate(avePriceDifferenceRate); categoryDailyMapper.updateById(cd); } } } public Page getHomeCategoryDaily(Page page){ Customer c = getCurrentCustomerWithoutCheck(); Long partnerId = c == null ? null : c.getPartnerId(); List ls = categoryMapper.selectHomeCategoryDaily(page, partnerId, LocalDate.now()); page.setRecords(ls); return page; } public Page myCollect(Page page, FlowerShowQueryDTO dto) { dto.setUserId(SecurityUtils.getUserId()); /*if (StringUtils.isNotEmpty(dto.getColumn())) { List orders = new ArrayList<>(); OrderItem i = new OrderItem(); i.setColumn(dto.getColumn()); i.setAsc(dto.isAsc()); page.setOrders(orders); }*/ dto.setParamId(paramService.getParamIdByCategoryId(dto.getCategory())); List flowerShowListDTOS = flowerMapper.myCollect(page, dto); page.setRecords(flowerShowListDTOS); return page; } public Page myBrowseHistory(Page page, FlowerShowQueryDTO dto) { dto.setUserId(SecurityUtils.getUserId()); /*if (StringUtils.isNotEmpty(dto.getColumn())) { List orders = new ArrayList<>(); OrderItem i = new OrderItem(); i.setColumn(dto.getColumn()); i.setAsc(dto.isAsc()); page.setOrders(orders); }*/ dto.setParamId(paramService.getParamIdByCategoryId(dto.getCategory())); List flowerShowListDTOS = flowerMapper.myBrowseHistory(page, dto); page.setRecords(flowerShowListDTOS); return page; } public void setFlowerZone(FlowerZoneBatchDTO dto) { if(dto.getZoneId()!=null && dto.getZoneId().size()>0){//添加专区 for (Long zoneId : dto.getZoneId()) { for(Long flowerId : dto.getIds()) { FlowerZoneMap fzp = flowerZoneMapMapper.selectOne(new QueryWrapper().eq("flower_id", flowerId).eq("zone_id", zoneId)); if(fzp==null){ fzp = new FlowerZoneMap(); fzp.setFlowerId(flowerId); fzp.setZoneId(zoneId); fzp.create(SecurityUtils.getUserId()); flowerZoneMapMapper.insert(fzp); } } } }else{ //移除专区 flowerZoneMapMapper.delete(new QueryWrapper().in("flower_id", dto.getIds())); } } public void clearInvalid(String userId) { List ids = flowerMapper.searchInvalidCollect(userId); if(ids!=null && ids.size()>0){ collectMapper.deleteBatchIds(ids); } } public void setFlowerRecommend(FlowerRecommendMultipleDTO dto) { List ids = dto.getIds(); if(ids == null || ids.size() == 0){ throw new ValidationException("请选择商品"); } for(Long id : ids) { Flower f = flowerMapper.selectById(id); f.setRecommend(true); flowerMapper.updateById(f); } } public void cancelFlowerRecommend(FlowerRecommendMultipleDTO dto) { List ids = dto.getIds(); if(ids == null || ids.size() == 0){ throw new ValidationException("请选择商品"); } for(Long id : ids) { Flower f = flowerMapper.selectById(id); f.setRecommend(false); flowerMapper.updateById(f); } } public Integer getUpFlowerStock(){ Integer c = flowerMapper.getUpFlowerStock(); return c == null ? 0 : c; } public void setFlowerRecommendRank(FlowerRecommendRankDTO dto) { Flower f = flowerMapper.selectById(dto.getId()); if(f==null){ throw new ValidationException("商品不存在"); } f.setRecommendRank(dto.getRecommendRank()); flowerMapper.updateById(f); } public Page selectZoneFlowerList(Page page, FlowerZoneQueryDTO dto) { List ls = flowerMapper.selectZoneFlowerList(page, dto); page.setRecords(ls); return page; } }