|
@@ -0,0 +1,363 @@
|
|
|
+package com.gree.mall.manager.logic.material.manage;
|
|
|
+
|
|
|
+import cn.hutool.core.collection.CollectionUtil;
|
|
|
+import cn.hutool.core.date.DateTime;
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import com.gree.mall.manager.bean.admin.AdminUserCom;
|
|
|
+import com.gree.mall.manager.bean.material.manage.*;
|
|
|
+import com.gree.mall.manager.commonmapper.MaterialMapper;
|
|
|
+import com.gree.mall.manager.enums.IsEnum;
|
|
|
+import com.gree.mall.manager.enums.material.*;
|
|
|
+import com.gree.mall.manager.exception.RemoteServiceException;
|
|
|
+import com.gree.mall.manager.logic.common.CommonLogic;
|
|
|
+import com.gree.mall.manager.plus.entity.*;
|
|
|
+import com.gree.mall.manager.plus.service.*;
|
|
|
+import com.gree.mall.manager.zfire.bean.ZfireParamBean;
|
|
|
+import com.gree.mall.manager.zfire.util.FieldUtils;
|
|
|
+import io.jsonwebtoken.lang.Collections;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.*;
|
|
|
+import java.util.function.Function;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+@RequiredArgsConstructor
|
|
|
+public class WebsitPartsSalesOrderLogic {
|
|
|
+
|
|
|
+ private final CommonLogic commonLogic;
|
|
|
+ private final MaterialMapper materialMapper;
|
|
|
+ private final WebsitPartsSalesService websitPartsSalesService;
|
|
|
+ private final WebsitPartsSalesItemService websitPartsSalesItemService;
|
|
|
+ private final AdminWebsitService adminWebsitService;
|
|
|
+ private final WebsitGoodsService websitGoodsService;
|
|
|
+ private final WebsitPartsRefundConfigService websitPartsRefundConfigService;
|
|
|
+ private final WebsitStockService websitStockService;
|
|
|
+ private final StorageService storageService;
|
|
|
+ private final MaterialConfigService materialConfigService;
|
|
|
+
|
|
|
+ private Map<String, Object> validate(WebsitPartsSalesBean partsSalesOrderBean) {
|
|
|
+ Map<String, Object> result = new HashMap<>();
|
|
|
+ result.put("isSuccess" , Boolean.TRUE);
|
|
|
+
|
|
|
+ if(StringUtils.isBlank(partsSalesOrderBean.getWebsitId())) {
|
|
|
+ result.put("isSuccess", Boolean.FALSE);
|
|
|
+ result.put("msg", "新增配件销售单失败,没有网点");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (StringUtils.isBlank(partsSalesOrderBean.getBuyPeople())) {
|
|
|
+ result.put("isSuccess", Boolean.FALSE);
|
|
|
+ result.put("msg", "请选择销售类型");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (BuyPeopleEnum.WORKER.getKey().equals(partsSalesOrderBean.getBuyPeople())) {
|
|
|
+ if(StringUtils.isBlank(partsSalesOrderBean.getIdentity())) {
|
|
|
+ result.put("isSuccess", Boolean.FALSE);
|
|
|
+ result.put("msg", "新增配件销售单失败,服务人员身份证不能为空,请选择服务人员");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //获取申请类别
|
|
|
+ if(StringUtils.isBlank(partsSalesOrderBean.getApplyCategory())) {
|
|
|
+ result.put("isSuccess", Boolean.FALSE);
|
|
|
+ result.put("msg", "新增配件销售单失败,请选择申请类别");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取对应网点
|
|
|
+ AdminWebsit websit = adminWebsitService.getById(partsSalesOrderBean.getWebsitId());
|
|
|
+ if (Objects.isNull(websit) || StringUtils.isBlank(websit.getPartsWebsitId())) {
|
|
|
+ result.put("isSuccess", Boolean.FALSE);
|
|
|
+ result.put("msg", "新增配件销售单失败,没有找到该网点" + partsSalesOrderBean.getWebsitId());
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ partsSalesOrderBean.setWebsitName(websit.getName());
|
|
|
+ partsSalesOrderBean.setPartsWebsitId(websit.getPartsWebsitId());
|
|
|
+
|
|
|
+ if (StringUtils.isBlank(partsSalesOrderBean.getStorageId())) {
|
|
|
+ final Storage storage = storageService.lambdaQuery()
|
|
|
+ .eq(Storage::getCompanyWechatId, partsSalesOrderBean.getCompanyWechatId())
|
|
|
+ .eq(Storage::getWebsitId, partsSalesOrderBean.getWebsitId())
|
|
|
+ .eq(Storage::getIsDefault, IsEnum.Y.getValue())
|
|
|
+ .one();
|
|
|
+ partsSalesOrderBean.setStorageId(storage.getStorageId())
|
|
|
+ .setStorageName(storage.getStorageName());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (Objects.isNull(partsSalesOrderBean.getApplyType())) {
|
|
|
+ result.put("isSuccess", Boolean.FALSE);
|
|
|
+ result.put("msg", "新增配件销售单失败,没有申请类型");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ if (Objects.isNull(partsSalesOrderBean.getDeliveryType())) {
|
|
|
+ result.put("isSuccess", Boolean.FALSE);
|
|
|
+ result.put("msg", "新增配件销售单失败,请先选择发货方式");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ if (Collections.isEmpty(partsSalesOrderBean.getItemList())) {
|
|
|
+ result.put("isSuccess", Boolean.FALSE);
|
|
|
+ result.put("msg", "新增配件销售单失败,没有配件明细信息");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 快递必填详细地址
|
|
|
+ if (partsSalesOrderBean.getDeliveryType().equals(DeliveryTypeEnum.EXPRESS.getValue())
|
|
|
+ && StringUtils.isBlank(partsSalesOrderBean.getAddr())) {
|
|
|
+ result.put("isSuccess", Boolean.FALSE);
|
|
|
+ result.put("msg", "新增配件销售单失败,请填写详细地址");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ //校验配件明细列表
|
|
|
+ LinkedHashSet<String> partsNumbers = new LinkedHashSet<>();
|
|
|
+ for(WebsitPartsSalesItem item : partsSalesOrderBean.getItemList()) {
|
|
|
+ if(StringUtils.isEmpty(item.getPartsNumber())) {
|
|
|
+ result.put("isSuccess", Boolean.FALSE);
|
|
|
+ result.put("msg", "新增配件销售单失败,配件编码不能为空");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ if(Objects.isNull(item.getQty()) || Integer.parseInt(item.getQty().toString()) <= 0) {
|
|
|
+ result.put("isSuccess", Boolean.FALSE);
|
|
|
+ result.put("msg", "新增配件销售单失败,配件编码"+item.getPartsNumber() + "数量不能小于或等于0");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ item.setCompanyWechatId(partsSalesOrderBean.getCompanyWechatId())
|
|
|
+ .setWebsitId(partsSalesOrderBean.getWebsitId())
|
|
|
+ .setPartsWebsitId(partsSalesOrderBean.getPartsWebsitId());
|
|
|
+
|
|
|
+ partsNumbers.add(item.getPartsNumber());
|
|
|
+ }
|
|
|
+ //根据配件编码查询对应的配件列表
|
|
|
+ final List<WebsitGoods> partsList = websitGoodsService.lambdaQuery()
|
|
|
+ .eq(WebsitGoods::getGoodsType, WebsitGoodsTypeEnum.P.getKey())
|
|
|
+ .eq(WebsitGoods::getNormType, NormTypeEnum.M.getKey())
|
|
|
+ .in(WebsitGoods::getGoodsCode, partsNumbers)
|
|
|
+ .eq(WebsitGoods::getStatus, StateEnum.ON.getKey())
|
|
|
+ .list();
|
|
|
+
|
|
|
+ if(Collections.isEmpty(partsList)) {
|
|
|
+ result.put("isSuccess", Boolean.FALSE);
|
|
|
+ result.put("msg", "新增配件销售单失败,系统找不到该配件配件编码: " + String.join(",", partsNumbers));
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ final Map<String, WebsitGoods> partsMap = partsList.stream().collect(Collectors.toMap(WebsitGoods::getGoodsCode, Function.identity()));
|
|
|
+ //检验每个配件明细是否在数据库里查到
|
|
|
+ LinkedHashSet<String> notExsistisPartsNumbers = new LinkedHashSet<>();
|
|
|
+ for(String partsNumber : partsNumbers) {
|
|
|
+ if( !partsMap.containsKey(partsNumber) || Objects.isNull(partsMap.get(partsNumber))) {
|
|
|
+ notExsistisPartsNumbers.add(partsNumber);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(!Collections.isEmpty(notExsistisPartsNumbers)) {
|
|
|
+ result.put("isSuccess", Boolean.FALSE);
|
|
|
+ result.put("msg", "新增配件销售单失败,以下配件配件编码不存在: "+String.join(",", notExsistisPartsNumbers));
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ List<WebsitPartsSalesItemBean> values = new ArrayList<>(partsSalesOrderBean.getItemList().stream()
|
|
|
+ .collect(Collectors.toMap(WebsitPartsSalesItemBean::getPartsNumber, Function.identity(), (key1, key2) -> {
|
|
|
+ key1.setQty(key1.getQty().add(key2.getQty()));
|
|
|
+ return key1;
|
|
|
+ })).values());
|
|
|
+ partsSalesOrderBean.getItemList().clear();
|
|
|
+ partsSalesOrderBean.setItemList(values);
|
|
|
+
|
|
|
+ if(CollectionUtil.isNotEmpty(partsSalesOrderBean.getItemList())) {
|
|
|
+ WebsitPartsRefundConfig partsConfig = websitPartsRefundConfigService.lambdaQuery()
|
|
|
+ .eq(WebsitPartsRefundConfig::getCompanyWechatId, partsSalesOrderBean.getCompanyWechatId())
|
|
|
+ .eq(WebsitPartsRefundConfig::getIsDefault, Boolean.TRUE)
|
|
|
+ .one();
|
|
|
+
|
|
|
+ //检查是否有可用库存
|
|
|
+ final List<WebsitStock> partsWebsitStockList = websitStockService.lambdaQuery()
|
|
|
+ .in(WebsitStock::getGoodsId, partsNumbers)
|
|
|
+ .eq(WebsitStock::getCompanyWechatId, partsSalesOrderBean.getCompanyWechatId())
|
|
|
+ .eq(WebsitStock::getWebsitId, partsSalesOrderBean.getWebsitId())
|
|
|
+ .list();
|
|
|
+
|
|
|
+ for (WebsitPartsSalesItem item : partsSalesOrderBean.getItemList()) {
|
|
|
+ if (!partsMap.containsKey(item.getPartsNumber()) || Objects.isNull(partsMap.get(item.getPartsNumber()))) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(item.getPartsWebsitId())) {
|
|
|
+ result.put("isSuccess", Boolean.FALSE);
|
|
|
+ result.put("msg", "配件网点编号不能为空");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(item.getPartsNumber())) {
|
|
|
+ result.put("isSuccess", Boolean.FALSE);
|
|
|
+ result.put("msg", "配件编号不能为空");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ // 非申请单检验配件网点库存是否大于0
|
|
|
+ if (partsSalesOrderBean.getIsApply()) {
|
|
|
+ if (partsWebsitStockList.stream().noneMatch(o ->
|
|
|
+ item.getPartsWebsitId().equals(o.getPartsWebsitId())
|
|
|
+ && item.getPartsNumber().equals(o.getGoodsId())
|
|
|
+ )) {
|
|
|
+ result.put("isSuccess", Boolean.FALSE);
|
|
|
+ result.put("msg", String.join("配件编号:", item.getPartsNumber(), ",在网点编号:", partsSalesOrderBean.getWebsitId(), "没有库存"));
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ List<WebsitStock> stockList = partsWebsitStockList.stream().filter(o ->
|
|
|
+ item.getPartsWebsitId().equals(o.getPartsWebsitId())
|
|
|
+ && item.getPartsNumber().equals(o.getGoodsId())
|
|
|
+ ).collect(Collectors.toList());
|
|
|
+ WebsitGoods parts = partsMap.get(item.getPartsNumber());
|
|
|
+ item.setWebsitId(partsSalesOrderBean.getWebsitId());
|
|
|
+ item.setPartsId(parts.getGoodsId());
|
|
|
+ item.setMaterialGroupName(parts.getMaterialGroupName());
|
|
|
+ item.setUnitName(parts.getGoodsStockUnit());
|
|
|
+ item.setPartsWebsitId(stockList.get(0).getPartsWebsitId());
|
|
|
+ item.setPartsNumber(stockList.get(0).getGoodsId());
|
|
|
+ item.setMarketPrice(parts.getMarketPrice());
|
|
|
+ item.setExamineQty(item.getQty());
|
|
|
+ item.setSecondPrice(parts.getSecondPrice());
|
|
|
+ computeSalesPrice(partsConfig, parts, item, result);
|
|
|
+ } else {
|
|
|
+ WebsitGoods parts = partsMap.get(item.getPartsNumber());
|
|
|
+ item.setWebsitId(partsSalesOrderBean.getWebsitId());
|
|
|
+ item.setPartsId(parts.getGoodsId());
|
|
|
+ item.setMaterialGroupName(parts.getMaterialGroupName());
|
|
|
+ item.setUnitName(parts.getGoodsStockUnit());
|
|
|
+ item.setPartsWebsitId(partsSalesOrderBean.getPartsWebsitId());
|
|
|
+ item.setPartsNumber(parts.getGoodsId());
|
|
|
+ item.setMarketPrice(parts.getMarketPrice());
|
|
|
+ item.setExamineQty(item.getQty());
|
|
|
+ item.setSecondPrice(parts.getSecondPrice());
|
|
|
+ computeSalesPrice(partsConfig, parts, item, result);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void computeSalesPrice(WebsitPartsRefundConfig partsConfig, WebsitGoods parts, WebsitPartsSalesItem item, Map<String, Object> result) {
|
|
|
+ final MaterialConfig materialConfig = materialConfigService.lambdaQuery()
|
|
|
+ .eq(MaterialConfig::getCompanyWechatId, partsConfig.getCompanyWechatId())
|
|
|
+ .one();
|
|
|
+ switch (Optional.ofNullable(parts.getPartType()).orElse("")) {
|
|
|
+ case "":
|
|
|
+ result.put("isSuccess", Boolean.FALSE);
|
|
|
+ result.put("msg", "配件类型不能为空");
|
|
|
+ break;
|
|
|
+ case "空调":
|
|
|
+ item.setSalesPrice(item.getMarketPrice().multiply(materialConfig.getPriceRate1()).setScale(2, BigDecimal.ROUND_HALF_UP));
|
|
|
+ break;
|
|
|
+ case "冰箱":
|
|
|
+ item.setSalesPrice(item.getMarketPrice().multiply(materialConfig.getPriceRate2()).setScale(2, BigDecimal.ROUND_HALF_UP));
|
|
|
+ break;
|
|
|
+ case "生活电器":
|
|
|
+ item.setSalesPrice(item.getMarketPrice().multiply(materialConfig.getPriceRate3()).setScale(2, BigDecimal.ROUND_HALF_UP));
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ item.setSalesPrice(item.getMarketPrice().multiply(new BigDecimal("1.2")).setScale(2, BigDecimal.ROUND_HALF_UP));
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional
|
|
|
+ public void add(WebsitPartsSalesBean partsSalesOrderBean) {
|
|
|
+ AdminUserCom adminUser = commonLogic.getAdminUser();
|
|
|
+ if (adminUser.getType() == 2) {
|
|
|
+ throw new RemoteServiceException("平台账号禁止操作");
|
|
|
+ }
|
|
|
+ partsSalesOrderBean.setCompanyWechatId(adminUser.getCompanyWechatId())
|
|
|
+ .setCompanyWechatName(adminUser.getCompanyName());
|
|
|
+ //一系列校验
|
|
|
+ Map<String, Object> validateMap = this.validate(partsSalesOrderBean);
|
|
|
+ if(validateMap.containsKey("isSuccess") && !Boolean.parseBoolean(validateMap.get("isSuccess").toString())) {
|
|
|
+ throw new RemoteServiceException(validateMap.get("msg").toString());
|
|
|
+ }
|
|
|
+ //获取登录人昵称
|
|
|
+ DateTime curDate = DateUtil.date();
|
|
|
+
|
|
|
+ if (Objects.isNull(partsSalesOrderBean.getPayType())) {
|
|
|
+ // 默认通联
|
|
|
+ partsSalesOrderBean.setPayType(PayTypeEnum.ALLINPAY.getKey());
|
|
|
+ }
|
|
|
+ List<WebsitPartsSalesItemBean> itemList = partsSalesOrderBean.getItemList();
|
|
|
+ BigDecimal totalPrice = BigDecimal.ZERO;
|
|
|
+
|
|
|
+ if (CollectionUtil.isEmpty(itemList)) {
|
|
|
+ throw new RemoteServiceException("请选择配件");
|
|
|
+ }
|
|
|
+
|
|
|
+ for(WebsitPartsSalesItem partsSalesOrderItem : itemList) {
|
|
|
+ partsSalesOrderItem.setTotalAmount(partsSalesOrderItem.getSalesPrice().multiply(partsSalesOrderItem.getQty())
|
|
|
+ .setScale(2, BigDecimal.ROUND_HALF_UP));
|
|
|
+ totalPrice = totalPrice.add(partsSalesOrderItem.getTotalAmount());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 记录总金额
|
|
|
+ partsSalesOrderBean.setTotalPrice(totalPrice);
|
|
|
+ partsSalesOrderBean.setStatus(PartsOrderStatusEnum.SAVE.getKey());
|
|
|
+ // 生成订单号
|
|
|
+ String sheetId = commonLogic.generateMaterialNo(adminUser.getCompanyWechatId(), "PJ", PartsRefTypeEnum.SALES.getKey(), 13);
|
|
|
+ partsSalesOrderBean.setId(sheetId);
|
|
|
+ websitPartsSalesService.save(partsSalesOrderBean);
|
|
|
+
|
|
|
+ // 保存销售单明细
|
|
|
+ List<WebsitPartsSalesItem> partsSalesOrderItems = this.createSalesOrderItem(partsSalesOrderBean, itemList);
|
|
|
+ websitPartsSalesItemService.saveBatch(partsSalesOrderItems);
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<WebsitPartsSalesItem> createSalesOrderItem(WebsitPartsSalesBean partsSalesOrderBean, List<WebsitPartsSalesItemBean> itemList) {
|
|
|
+ List<WebsitPartsSalesItem> partsSalesOrderItems = new ArrayList<>();
|
|
|
+ for(WebsitPartsSalesItemBean partsSalesOrderItemBean : itemList) {
|
|
|
+ WebsitPartsSalesItem partsSalesOrderItem = new WebsitPartsSalesItem();
|
|
|
+ BeanUtils.copyProperties(partsSalesOrderItemBean, partsSalesOrderItem);
|
|
|
+ partsSalesOrderItem.setSalesId(partsSalesOrderBean.getId())
|
|
|
+ .setWebsitId(partsSalesOrderBean.getWebsitId())
|
|
|
+ .setIdentity(partsSalesOrderBean.getIdentity());
|
|
|
+ partsSalesOrderItems.add(partsSalesOrderItem);
|
|
|
+ }
|
|
|
+ return partsSalesOrderItems;
|
|
|
+ }
|
|
|
+
|
|
|
+ public WebsitPartsSalesBean loadSalesOrderById(String id, Object o) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ public IPage<WebsitPartsSalesVO> list(ZfireParamBean zfireParamBean) {
|
|
|
+ AdminUserCom adminUser = commonLogic.getAdminUser();
|
|
|
+ FieldUtils.materialParam(zfireParamBean, WebsitPartsSalesVO.class, adminUser);
|
|
|
+
|
|
|
+ return materialMapper.websitPartsSalesPage(new Page(zfireParamBean.getPageNum(), zfireParamBean.getPageSize()), zfireParamBean);
|
|
|
+ }
|
|
|
+
|
|
|
+ public IPage<WebsitPartsSalesWVO> websitList(ZfireParamBean zfireParamBean) {
|
|
|
+ AdminUserCom adminUser = commonLogic.getAdminUser();
|
|
|
+ FieldUtils.materialParam(zfireParamBean, WebsitPartsSalesWVO.class, adminUser);
|
|
|
+
|
|
|
+ return materialMapper.websitPartsSalesWPage(new Page(zfireParamBean.getPageNum(), zfireParamBean.getPageSize()), zfireParamBean);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据网点编码,配件网点编号,配件编码查询配件网点库存,前端下拉配件编码的时候带出可用库存
|
|
|
+ * @param websitId
|
|
|
+ * @param partsWebsitId
|
|
|
+ * @param partsNumber
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public WebsitStock queryPartsNewQty(String websitId, String partsWebsitId, String partsNumber) {
|
|
|
+ AdminUserCom adminUser = commonLogic.getAdminUser();
|
|
|
+ return websitStockService.lambdaQuery()
|
|
|
+ .eq(WebsitStock::getCompanyWechatId, adminUser.getCompanyWechatId())
|
|
|
+ .eq(WebsitStock::getGoodsType, WebsitGoodsTypeEnum.P.getKey())
|
|
|
+ .eq(WebsitStock::getGoodsId, partsNumber)
|
|
|
+ .eq(WebsitStock::getWebsitId, websitId)
|
|
|
+ .eq(WebsitStock::getPartsWebsitId, partsWebsitId)
|
|
|
+ .one();
|
|
|
+ }
|
|
|
+}
|