diff --git a/src/main/java/com/qs/serve/modules/oms/controller/api/OmsSaleOrderApi.java b/src/main/java/com/qs/serve/modules/oms/controller/api/OmsSaleOrderApi.java index fc6943ee..27516316 100644 --- a/src/main/java/com/qs/serve/modules/oms/controller/api/OmsSaleOrderApi.java +++ b/src/main/java/com/qs/serve/modules/oms/controller/api/OmsSaleOrderApi.java @@ -366,7 +366,11 @@ public class OmsSaleOrderApi { BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); OmsSaleOrder omsOrder = omsSaleOrderService.getById(id); if(omsOrder.getOrderType().equals(3)&&omsOrder.getOrderCheckState().equals(OmsOrderCheckState.Commiting.getCode())){ - omsSaleOrderOptionsService.runCompensate(omsOrder.getId()+""); + try { + omsSaleOrderOptionsService.runCompensate(omsOrder.getId()+""); + } catch (Exception e) { + e.printStackTrace(); + } omsOrder = omsSaleOrderService.getById(id); } // 关联折扣信息 @@ -377,6 +381,14 @@ public class OmsSaleOrderApi { omsOrder.setBrandRuleInfo(goodsCategoryRuleService.getById(omsOrder.getBrandRuleId())); omsOrder.setAddressInfo(bmsSupplierAddressService.getById(omsOrder.getSupplierAddrId())); omsOrder.setSupplierInfo(bmsSupplierMapper.selectById(omsOrder.getSupplierId())); + if(StringUtils.hasText(omsOrder.getCusSaleRegionAll())){ + String value = omsOrder.getCusSaleRegionAll().replace("_null",""); + omsOrder.setCusSaleRegionAll(value); + } + if(StringUtils.hasText(omsOrder.getCusBizRegionAll())){ + String value = omsOrder.getCusBizRegionAll().replace("_null",""); + omsOrder.setCusBizRegionAll(value); + } if(omsOrder.getSupplierId().toString().equals(supplier.getId())){ LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw.eq(OmsSaleOrderItem::getOrderId,id); diff --git a/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderServiceImpl.java b/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderServiceImpl.java index a5042ee3..69508f4e 100644 --- a/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderServiceImpl.java @@ -188,7 +188,12 @@ public class OmsSaleOrderServiceImpl extends ServiceImpl() - .eq(TbsCostApply::getCode,code)).get(0); - Long costApplyId = costApply.getId(); - deleteLogService.deleteCostApply(costApplyId,remark,skipPayFlag!=null&&skipPayFlag.equals(1)); - BirActivityCenterGoodsUtil.buildBir(costApplyId); + List costApplys = tbsCostApplyMapper.selectList(new LambdaQueryWrapper() + .eq(TbsCostApply::getCode,code)); + if(costApplys.size()>0){ + TbsCostApply costApply = costApplys.get(0); + Long costApplyId = costApply.getId(); + deleteLogService.deleteCostApply(costApplyId,remark,skipPayFlag!=null&&skipPayFlag.equals(1)); + BirActivityCenterGoodsUtil.buildBir(costApplyId); + } return R.ok(); } diff --git a/src/main/java/com/qs/serve/modules/third/PortalOfCostController.java b/src/main/java/com/qs/serve/modules/third/PortalOfCostController.java index 2bf0a964..bcdd993b 100644 --- a/src/main/java/com/qs/serve/modules/third/PortalOfCostController.java +++ b/src/main/java/com/qs/serve/modules/third/PortalOfCostController.java @@ -8,12 +8,17 @@ import com.qs.serve.common.model.dto.R; import com.qs.serve.common.util.Assert; import com.qs.serve.common.util.CollectionUtil; import com.qs.serve.common.util.JsonUtil; +import com.qs.serve.modules.bir.consts.BirActivityCenterGoodsUtil; import com.qs.serve.modules.pay.entity.bo.PayPaymentBo; import com.qs.serve.modules.sys.entity.SysSyncLog; +import com.qs.serve.modules.sys.service.SysDeleteLogService; import com.qs.serve.modules.sys.service.SysSyncLogService; import com.qs.serve.modules.tbs.entity.TbsCostApply; +import com.qs.serve.modules.tbs.mapper.TbsCostApplyMapper; import com.qs.serve.modules.third.consts.ThirtyConst; import com.qs.serve.modules.third.entity.*; +import com.qs.serve.modules.third.entity.param.DHXDelCostParam; +import com.qs.serve.modules.third.service.PortalOfCost2Application; import com.qs.serve.modules.third.service.PortalOfCostApplication; import com.qs.serve.modules.third.service.PortalOfCostPartApplication; import com.qs.serve.modules.third.util.ThirtyVerificationUtil; @@ -27,6 +32,7 @@ import com.qs.serve.modules.vtb.service.VtbVerificationService; import com.qs.serve.modules.vtb.service.VtbVerificationSubjectService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; @@ -51,16 +57,48 @@ public class PortalOfCostController { private VtbVerificationService vtbVerificationService; private VtbVerificationSubjectService verificationSubjectService; private PortalOfCostApplication portalOfCostApplication; + private PortalOfCost2Application portalOfCost2Application; private SysSyncLogService sysSyncLogService; private PortalOfCostPartApplication portalOfCostPartApplication; + private TbsCostApplyMapper tbsCostApplyMapper; + private SysDeleteLogService deleteLogService; + + /** + * 删除DHX费用(调度系统调用的) + * @param param + * @return + */ + @PostMapping("removeDhxCost") + @Transactional(rollbackFor = Exception.class) + public R removeDhxCost(@RequestBody DHXDelCostParam param){ + if(!param.getCode().contains("DHX")){ + return R.error("非DHX费用,不支持删除"); + } + //赠品按照新的流程,是不用删ERP的赠品费用的 + boolean skipPayFlag = true; + List costApplys = tbsCostApplyMapper.selectList(new LambdaQueryWrapper() + .eq(TbsCostApply::getCode,param.getCode())); + if(costApplys.size()>0){ + TbsCostApply costApply = costApplys.get(0); + Long costApplyId = costApply.getId(); + deleteLogService.deleteCostApply(costApplyId,param.getRemark(),skipPayFlag); + try { + BirActivityCenterGoodsUtil.buildBir(costApplyId); + } catch (Exception e) { + e.printStackTrace(); + } + } + return R.ok(); + } /** * 一站式创建费用(费用申请) + * 单成本中心 * @param createBo * @return */ @PostMapping("createByCostApply") - public R createCostProcess(@Valid @RequestBody ProcessCreateCostApplyBo createBo,HttpServletRequest request){ + public R createCostProcess2(@Valid @RequestBody ProcessCreateCostApplyBo createBo,HttpServletRequest request){ SysSyncLog syncLog = new SysSyncLog(); syncLog.setFromPlat("一站式费用"); syncLog.setUrl(request.getRequestURI()); @@ -83,6 +121,36 @@ public class PortalOfCostController { return R.error("支付异常"); } + /** + * 一站式创建费用(费用申请,赠品,赔付单) + * 支持多成本中心 + * @param createBo + * @return + */ + @PostMapping("createByCostApplyMulti") + public R createCostProcess(@RequestBody ProcessCreateCostApplyBo createBo,HttpServletRequest request){ + SysSyncLog syncLog = new SysSyncLog(); + syncLog.setFromPlat("一站式费用"); + syncLog.setUrl(request.getRequestURI()); + syncLog.setRequestJson(JsonUtil.objectToJson(createBo)); + syncLog.setEntityClass(ProcessCreateCostApplyBo.class.getName()); + try { + ThirdTokenUtil.checkToken(request); + portalOfCost2Application.createCostProcess(createBo); + syncLog.setSuccessStatus(1); + } catch (Exception e) { + log.error("站式创建费用(费用申请)===>{}", JsonUtil.objectToJson(createBo)); + syncLog.setFailReason(e.getMessage()); + sysSyncLogService.save(syncLog); + return R.error(e.getMessage()); + } + sysSyncLogService.save(syncLog); + if(syncLog.getSuccessStatus()!=null&&syncLog.getSuccessStatus().equals(1)){ + return R.ok(); + } + return R.error("支付异常"); + } + /** * 协议类费用 核销支付记录 diff --git a/src/main/java/com/qs/serve/modules/third/entity/ProcessCenterItem.java b/src/main/java/com/qs/serve/modules/third/entity/ProcessCenterItem.java new file mode 100644 index 00000000..b834e83a --- /dev/null +++ b/src/main/java/com/qs/serve/modules/third/entity/ProcessCenterItem.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.third.entity; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/2/14 + */ +@Data +public class ProcessCenterItem { + + private String centerType; + private String centerCode; + private BigDecimal centerRate; + +} diff --git a/src/main/java/com/qs/serve/modules/third/entity/ProcessCreateCostApplyBo.java b/src/main/java/com/qs/serve/modules/third/entity/ProcessCreateCostApplyBo.java index ba230812..2a73b814 100644 --- a/src/main/java/com/qs/serve/modules/third/entity/ProcessCreateCostApplyBo.java +++ b/src/main/java/com/qs/serve/modules/third/entity/ProcessCreateCostApplyBo.java @@ -30,6 +30,8 @@ public class ProcessCreateCostApplyBo { private String centerCode; + private List centerList; + /** 活动标题(可为空) */ private String activityTitle; @@ -73,4 +75,5 @@ public class ProcessCreateCostApplyBo { * 不进行支付,目前只支持赠品类费用 */ private Integer ignorePayFlag; + } diff --git a/src/main/java/com/qs/serve/modules/third/entity/param/DHXDelCostParam.java b/src/main/java/com/qs/serve/modules/third/entity/param/DHXDelCostParam.java new file mode 100644 index 00000000..f1e37f83 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/third/entity/param/DHXDelCostParam.java @@ -0,0 +1,15 @@ +package com.qs.serve.modules.third.entity.param; + +import lombok.Data; + +/** + * @author YenHex + * @since 2025/3/31 + */ +@Data +public class DHXDelCostParam { + + String code; + String remark; + +} diff --git a/src/main/java/com/qs/serve/modules/third/service/PortalOfCost2Application.java b/src/main/java/com/qs/serve/modules/third/service/PortalOfCost2Application.java new file mode 100644 index 00000000..dae20fde --- /dev/null +++ b/src/main/java/com/qs/serve/modules/third/service/PortalOfCost2Application.java @@ -0,0 +1,663 @@ +package com.qs.serve.modules.third.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.qs.serve.common.config.properties.ProjectApisProperties; +import com.qs.serve.common.model.consts.ResultFlag; +import com.qs.serve.common.model.consts.SysConfigKey; +import com.qs.serve.common.model.enums.BudgetLogOptFlag; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bms.entity.*; +import com.qs.serve.modules.bms.service.*; +import com.qs.serve.modules.goods.entity.GoodsCategory; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.entity.dto.TbsCenterDto; +import com.qs.serve.modules.goods.service.GoodsCategoryService; +import com.qs.serve.modules.goods.service.GoodsSkuService; +import com.qs.serve.modules.goods.service.GoodsSpuService; +import com.qs.serve.modules.pay.common.PaymentType; +import com.qs.serve.modules.pay.entity.PayPayment; +import com.qs.serve.modules.pay.entity.PayPaymentItem; +import com.qs.serve.modules.pay.service.PayPaymentItemService; +import com.qs.serve.modules.pay.service.PayPaymentService; +import com.qs.serve.modules.seeyon.service.XiaoLuTonService; +import com.qs.serve.modules.sys.entity.SysConfig; +import com.qs.serve.modules.sys.entity.SysSyncLog; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysTableTempMapper; +import com.qs.serve.modules.sys.mapper.SysUserCodeMathMapper; +import com.qs.serve.modules.sys.service.SysConfigService; +import com.qs.serve.modules.sys.service.SysSyncLogService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsActivityState; +import com.qs.serve.modules.tbs.common.TbsCostApplyState; +import com.qs.serve.modules.tbs.common.util.TbsBudgetLogBuildUtil; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.dto.TbsBudgetCostResult; +import com.qs.serve.modules.tbs.entity.so.TbsScheduleItemSearch; +import com.qs.serve.modules.tbs.mapper.TbsBudgetMapper; +import com.qs.serve.modules.tbs.mapper.TbsCostApplyMapper; +import com.qs.serve.modules.tbs.service.*; +import com.qs.serve.modules.third.entity.*; +import com.qs.serve.modules.third.util.ThirtyVerificationUtil; +import com.qs.serve.modules.tzc.common.TzPolicyItemStatus; +import com.qs.serve.modules.tzc.entity.TzcPolicyItem; +import com.qs.serve.modules.tzc.entity.TzcPolicyItemLog; +import com.qs.serve.modules.tzc.mapper.TzcPolicyItemMapper; +import com.qs.serve.modules.tzc.service.TzcPolicyGoodsSyncService; +import com.qs.serve.modules.tzc.service.TzcPolicyItemLogService; +import com.qs.serve.modules.tzc.service.TzcPolicyItemService; +import com.qs.serve.modules.vtb.common.VtbVerificationState; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.entity.VtbVerificationSubject; +import com.qs.serve.modules.vtb.mapper.VtbVerificationSubjectMapper; +import com.qs.serve.modules.vtb.service.VtbFundFlowService; +import com.qs.serve.modules.vtb.service.VtbVerificationService; +import com.qs.serve.modules.vtb.service.VtbVerificationSubjectService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +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.*; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2023/2/14 + */ +@Slf4j +@Service +@AllArgsConstructor +public class PortalOfCost2Application { + + private SysUserCodeMathMapper userCodeMathMapper; + private final SysSyncLogService sysSyncLogService; + private TbsActivityService activityService; + private TbsActivityCenterService activityCenterService; + private TbsActivitySubjectService activitySubjectService; + private TbsActivityGoodsService activityGoodsService; + private TbsActivityCenterGoodsService activityCenterGoodsService; + + private BmsSupplierService supplierService; + private BmsSubjectService subjectService; + private BmsCostCenterService costCenterService; + private BmsRegionService saleRegionService; + private BmsRegion2Service bizRegionService; + + private SysUserService userService; + + private TbsCostApplyService costApplyService; + private TbsBudgetCostItemService costItemService; + private TbsBudgetLogService budgetLogService; + private TbsBudgetApplicationService budgetApplicationService; + + + private GoodsSkuService goodsSkuService; + private GoodsSpuService goodsSpuService; + private GoodsCategoryService goodsCategoryService; + + private PayPaymentService paymentService; + + private VtbVerificationService verificationService; + private VtbVerificationSubjectService verificationSubjectService; + + + private ProjectApisProperties projectApisProperties; + + @Transactional(rollbackFor = Exception.class) + public void createCostProcess(ProcessCreateCostApplyBo createBo){ + SysUser user = userService.getByAccount(createBo.getUserCode()); + if(user==null){ + String newUcode = userCodeMathMapper.getNewCode(createBo.getUserCode()); + if(newUcode!=null){ + user = userService.getByAccount(newUcode); + } + } + if(user==null){Assert.throwEx("用户不存在,请重新编辑");} + BmsSupplier supplier = supplierService.getByCode(createBo.getCustomerCode(),createBo.getCustomerBelong()); + if(supplier==null){Assert.throwEx("客户不存在,请重新编辑");} + BmsSubject subject = subjectService.getByCode(createBo.getSubjectCode()); + if(subject==null){Assert.throwEx("科目不存在,请重新编辑");} + + final BigDecimal OneHundred = new BigDecimal("100"); + BigDecimal totalRate = BigDecimal.ZERO; + for (ProcessCenterItem item : createBo.getCenterList()) { + totalRate = totalRate.add(item.getCenterRate()); + if(item.getCenterRate().compareTo(BigDecimal.ZERO)<=0){ + Assert.throwEx("成本中心权重必须大于0"); + } + } + if(totalRate.compareTo(OneHundred)!=0){ + Assert.throwEx("成本中心权重合计必须为100"); + } + // 获取成本中心列表 + Map centerDtoMap = this.getTbsCenterDtoMap(createBo.getCenterList()); + //发票号 + String billNumber = createBo.getBillNumber(); + String disNumber = createBo.getErpCode(); + this.validBillNumAndDisNum(billNumber, disNumber); + //初始化sku列表 + List processGoodsItems = createBo.getGoodsList(); + List invCodeList = new ArrayList<>(); + if(CollectionUtil.isNotEmpty(createBo.getGoodsList())){ + invCodeList = createBo.getGoodsList().stream() + .map(ProcessGoodsItem::getInventoryCode).distinct() + .filter(StringUtils::hasText).collect(Collectors.toList()); + } + if(invCodeList.size()<1){ + Assert.throwEx("请选择存货提交"); + } + String costCode = createBo.getCostCode(); + String costTheme = createBo.getCostTheme(); + List skuList = this.initSkuListOfProcess(invCodeList,!costCode.contains("YX06")); + //排除重复的sku + skuList = this.filterRepSku(invCodeList, skuList); + //常用参数 + final String GOODS_TYPE = "sku"; + LocalDateTime nowTime = LocalDateTime.now(); + LocalDate nowDate = LocalDate.now(); + LocalDate startDate = createBo.getStartDate(); + LocalDate endDate = createBo.getEndDate(); + String erpCode = createBo.getErpCode(); + Long supplierId = Long.parseLong(supplier.getId()); + BigDecimal totalAmount = createBo.getTotalAmount(); + + if(totalAmount.compareTo(BigDecimal.ZERO)==0){ + Assert.throwEx("统计金额不能为0"); + } + + String activityTitle = createBo.getActivityTitle(); + if(!StringUtils.hasText(activityTitle)){ + activityTitle = "由核销API生成的活动"; + } + //构建费用申请 + TbsCostApply costApply = new TbsCostApply(); + costApply.setDisCode(disNumber); + costApply.setBillNumber(billNumber); + costApply.setCode(costCode); + costApply.setMatchType(1); + costApply.setChargeTheme(costTheme); + costApply.setChargeState(TbsCostApplyState.State_3_finished.getCode()); + costApply.setSupplierId(supplierId); + costApply.setSupplierName(supplier.getName()); + costApply.setSupplierCode(supplier.getCode()); + costApply.setUserId(user.getId()); + costApply.setUserCode(user.getCode()); + costApply.setUserName(user.getName()); + costApply.setTotalActivity(1); + costApply.setTotalActivityAmount(totalAmount); + costApply.setTotalActivityUsedAmount(totalAmount); + costApply.setSubmitTime(LocalDateTime.now()); + costApply.setRemark(createBo.getRemark()); + //构建活动 + TbsActivity activity = new TbsActivity(); + activity.setActivityCode(costCode); + activity.setActivityState(TbsActivityState.STATE_1_Finished); + activity.setCostPassFlag(1); + activity.setCostPassTime(nowTime); + activity.setActTitle(activityTitle); + activity.setSupplierId(supplierId); + activity.setSupplierName(supplier.getName()); + activity.setSupplierCode(supplier.getCode()); + activity.setActStartDate(startDate); + activity.setActEndDate(endDate); + activity.setPreStartDate(startDate); + activity.setPreEndDate(endDate); + activity.setPreCheckDate(nowDate); + activity.setTotalAmount(totalAmount); + activity.setUsedAmount(totalAmount); + activity.setFinishedFlag(ResultFlag.OK); + activity.setFinishedTime(nowTime); + //活动-科目 + TbsActivitySubject activitySubject = new TbsActivitySubject(); + activitySubject.setSubjectId(subject.getId()); + activitySubject.setSubjectCode(subject.getSubjectCode()); + activitySubject.setSubjectName(subject.getSubjectName()); + activitySubject.setAmount(totalAmount); + activitySubject.setUsedAmount(totalAmount); + activitySubject.setCountSession(0); + activitySubject.setCountPerson(0); + + // 分配成本中心 + List activityCenterList = getTbsActivityCenters(subject, OneHundred, centerDtoMap, totalAmount); + + //活动-商品 + List activityGoodsList = new ArrayList<>(); + for (GoodsSku sku : skuList) { + GoodsSpu goodsSpu = goodsSpuService.getById(sku.getSpuId()); + GoodsCategory category1 = goodsCategoryService.getById(goodsSpu.getCategoryFirst()); + GoodsCategory category2 = goodsCategoryService.getById(goodsSpu.getCategorySecond()); + GoodsCategory category3 = goodsCategoryService.getById(goodsSpu.getCategoryThird()); + TbsActivityGoods activityGoods = new TbsActivityGoods(); + activityGoods.setTargetType(GOODS_TYPE); + activityGoods.setTargetId(sku.getId()); + activityGoods.setTargetCode(sku.getSkuCode()); + activityGoods.setTargetName(sku.getSkuName()); + activityGoods.setTargetLevelPathIds(category1.getId()+"_"+category2.getId()+"_"+category3.getId()+"_"+goodsSpu.getId()+"_"+sku.getId()); + activityGoods.setTargetLevelPathNames(category1.getName()+"_"+category2.getName()+"_"+category3.getName()+"_"+goodsSpu.getName()+"_"+sku.getSpecInfos()); + activityGoodsList.add(activityGoods); + } + //活动-商品与成本中心记录 + List activityCenterGoodsList = getTbsActivityCenterGoods(supplier, subject, OneHundred, + processGoodsItems, costCode, nowDate, startDate, endDate, supplierId, totalAmount, activity, + activityCenterList, activityGoodsList); + + //保存活动有关数据 + costApplyService.save(costApply); + activity.setCostApplyId(costApply.getId()); + activityService.save(activity); + activitySubject.setCostApplyId(costApply.getId()); + activitySubject.setActivityId(activity.getId()); + activitySubjectService.save(activitySubject); + activityCenterList.forEach(center->{ + center.setCostApplyId(costApply.getId()); + center.setActivityId(activity.getId()); + }); + activityCenterService.saveBatch(activityCenterList); + activityGoodsList.forEach(item->{ + item.setCostApplyId(costApply.getId()); + item.setActivityId(activity.getId()); + }); + activityGoodsService.saveBatch(activityGoodsList); + activityCenterGoodsList.forEach(item->{ + item.setCostApplyId(costApply.getId()); + item.setActivityId(activity.getId()); + }); + activityCenterGoodsService.saveBatch(activityCenterGoodsList); + + //获取匹配的预算结果 + TbsBudgetCostResult budgetCostResult = budgetApplicationService.buildBudgetCostResult( + costApply.getId(), + Arrays.asList(activity), + Arrays.asList(activitySubject), + activityCenterGoodsList, + activityCenterList,false,true,false); + + //不匹配的商品,保存到无预算表 + List unMatchBudgetItem = budgetCostResult.getBudgetUnMatchList(); + if(unMatchBudgetItem.size()>0){ + String codes = unMatchBudgetItem.stream().map(TbsBudgetCostItem::getTargetCode).collect(Collectors.joining(",")); + Assert.throwEx("未能匹配到预算:"+codes); + } + + //匹配的商品,生成预算日志 + List matchBudgetItem = budgetCostResult.getBudgetMatchList(); + List budgetLogList = new ArrayList<>(); + if(CollectionUtil.isNotEmpty(matchBudgetItem)){ + for (TbsBudgetCostItem costItem : matchBudgetItem) { + TbsBudget currBudget = null; + for (TbsBudget budget : budgetCostResult.getBudgetList()) { + if(costItem.getBudgetId().equals(budget.getId())){ + currBudget = budget; + break; + } + } + TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.buildTbsBudgetLog(BudgetLogOptFlag.State_1,user, costApply, costItem, currBudget,costItem.getCenterGoodsAmount(),activity); + budgetLogList.add(budgetLog); + } + } + costItemService.saveBatch(matchBudgetItem); + budgetLogService.saveBatch(budgetLogList); + + //保存核销申请 + VtbVerification verification = new VtbVerification(); + verification.setDisCode(disNumber); + verification.setBillNumber(billNumber); + verification.setVerificationCode(costCode); + verification.setVerificationMainCode(verification.getVerificationCode()); + verification.setCostApplyId(costApply.getId()); + verification.setFinishedTime(nowTime); + verification.setVerificationState(VtbVerificationState.Finished.getCode()); + verification.setActivityId(activity.getId()); + verification.setSupplierId(activity.getSupplierId()); + verification.setSupplierCode(activity.getSupplierCode()); + verification.setSupplierName(activity.getSupplierName()); + verification.setUserId(user.getId()); + verification.setUserCode(user.getCode()); + verification.setUserName(user.getName()); + verification.setAmount(totalAmount); + verification.setAmountRecord(totalAmount); + verification.setPaymentState(ResultFlag.OK); + verificationService.save(verification); + + //保存核销费用结果 + VtbVerificationSubject verificationSubject = new VtbVerificationSubject(); + verificationSubject.setVerificationId(verification.getId()); + verificationSubject.setVerificationSubCode(verification.getVerificationCode()+"_1"); + verificationSubject.setCostApplyId(costApply.getId()); + verificationSubject.setActivityId(activity.getId()); + verificationSubject.setSubjectId(subject.getId()); + verificationSubject.setSubjectCode(subject.getSubjectCode()); + verificationSubject.setSubjectName(subject.getSubjectName()); + verificationSubject.setSupplierId(Long.parseLong(supplier.getId())); + verificationSubject.setSupplierCode(supplier.getCode()); + verificationSubject.setSupplierName(supplier.getName()); + verificationSubject.setPayFinishedFlag(ResultFlag.OK); + verificationSubject.setUsedAmount(totalAmount); + verificationSubject.setUsedAmountRecord(totalAmount); + verificationSubject.setCountPerson(0); + verificationSubject.setCountSession(0); + verificationSubjectService.save(verificationSubject); + + //保存支付信息(DHX赠品) + if(costCode.indexOf("DHX")==0||costCode.contains("YX06")) { + // 赠品支持忽略参数 + boolean ignoreDhxPay = costCode.indexOf("DHX")==0&&createBo.getIgnorePayFlag()!=null&&createBo.getIgnorePayFlag()==1; + if(!ignoreDhxPay){ + this.payToErpAPI(supplier, subject, totalAmount, costApply, activity, activitySubject, + activityCenterList.get(0), activityGoodsList, activityCenterGoodsList, + budgetLogList, verification, verificationSubject); + } + } + + } + + @NotNull + private List getTbsActivityCenterGoods(BmsSupplier supplier, BmsSubject subject, BigDecimal OneHundred, List processGoodsItems, String costCode, LocalDate nowDate, LocalDate startDate, LocalDate endDate, Long supplierId, BigDecimal totalAmount, TbsActivity activity, List activityCenterList, List activityGoodsList) { + List activityCenterGoodsList = new ArrayList<>(); + + for (TbsActivityCenter activityCenter : activityCenterList) { + BigDecimal yx06Surplus = activityCenter.getCenterAmount(); + BigDecimal yx06SurplusRate = new BigDecimal("100"); + BigDecimal yx06ItemAmt = activityCenter.getCenterAmount() + .divide(new BigDecimal(activityGoodsList.size()), RoundingMode.DOWN); + BigDecimal yx06Rate = yx06ItemAmt.divide(activityCenter.getCenterAmount(), RoundingMode.DOWN); + for (int i = 0; i < activityGoodsList.size(); i++) { + TbsActivityGoods activityGoods = activityGoodsList.get(i); + TbsActivityCenterGoods centerGoods = new TbsActivityCenterGoods(); + centerGoods.setActivityCode(activity.getActivityCode()); + centerGoods.setCenterGoodsCode(activity.getActivityCode()+"_"+(i+1)); + centerGoods.setSupplierId(supplierId); + centerGoods.setSupplierCode(supplier.getCode()); + centerGoods.setSupplierName(supplier.getName()); + //设置成本中心 + centerGoods.setCenterType(activityCenter.getCenterType()); + centerGoods.setCenterId(activityCenter.getCenterId()); + centerGoods.setCenterName(activityCenter.getCenterName()); + centerGoods.setCenterCode(activityCenter.getCenterCode()); + centerGoods.setCenterRate(OneHundred); + centerGoods.setCenterAmount(totalAmount); + //设置科目 + centerGoods.setSubjectId(subject.getId()); + centerGoods.setSubjectCode(subject.getSubjectCode()); + centerGoods.setSubjectName(subject.getSubjectName()); + //设置活动时间 + centerGoods.setActEndDate(endDate); + centerGoods.setActStartDate(startDate); + centerGoods.setPreEndDate(endDate); + centerGoods.setPreStartDate(startDate); + centerGoods.setPreCheckDate(nowDate); + //设置目标 + centerGoods.setTargetId(activityGoods.getTargetId()); + centerGoods.setTargetType(activityGoods.getTargetType()); + centerGoods.setTargetCode(activityGoods.getTargetCode()); + centerGoods.setTargetName(activityGoods.getTargetName()); + centerGoods.setTargetLevelPathIds(activityGoods.getTargetLevelPathIds()); + centerGoods.setTargetLevelPathNames(activityGoods.getTargetLevelPathNames()); + // 分配金额 + if (costCode.contains("YX06")){ + if(i+1== activityGoodsList.size()){ + centerGoods.setCenterGoodsAmount(yx06Surplus); + centerGoods.setCenterGoodsRate(yx06SurplusRate); + centerGoods.setUsedAmount(yx06Surplus); + }else { + yx06SurplusRate = yx06SurplusRate.subtract(yx06Rate); + yx06Surplus = yx06Surplus.subtract(yx06ItemAmt); + centerGoods.setCenterGoodsAmount(yx06ItemAmt); + centerGoods.setCenterGoodsRate(yx06Rate); + centerGoods.setUsedAmount(yx06ItemAmt); + } + }else { + BigDecimal totalSkuAmt = BigDecimal.ZERO; + for (ProcessGoodsItem goodsItem : processGoodsItems) { + if(goodsItem.getInventoryCode().equals(activityGoods.getTargetCode())){ + totalSkuAmt = totalSkuAmt.add(goodsItem.getAmount()); + } + } + BigDecimal rate = totalSkuAmt.divide(totalAmount, RoundingMode.UP); + centerGoods.setCenterGoodsAmount(totalSkuAmt); + centerGoods.setCenterGoodsRate(rate); + centerGoods.setUsedAmount(totalSkuAmt); + } + activityCenterGoodsList.add(centerGoods); + } + } + return activityCenterGoodsList; + } + + @NotNull + private List getTbsActivityCenters(BmsSubject subject, BigDecimal OneHundred, Map centerDtoMap, BigDecimal totalAmount) { + List activityCenterList = new ArrayList<>(); + BigDecimal surplusAmount = totalAmount; + Set centerTypes = centerDtoMap.keySet(); + Iterator itr = centerTypes.iterator(); + while (itr.hasNext()){ + String centerType = itr.next(); + TbsCenterDto center = centerDtoMap.get(centerType); + BigDecimal rateAmt = null; + if(itr.hasNext()){ + rateAmt = center.getCenterRate() + .divide(OneHundred,2,BigDecimal.ROUND_HALF_UP) + .multiply(totalAmount); + surplusAmount = surplusAmount.subtract(rateAmt); + }else { + // 最后一项使用剩余 + rateAmt = surplusAmount; + } + //活动-成本中心 + TbsActivityCenter activityCenter = new TbsActivityCenter(); + activityCenter.setSubjectId(subject.getId()); + activityCenter.setCenterAmount(rateAmt); + activityCenter.setCenterRate(OneHundred); + activityCenter.setCenterType(centerType); + activityCenter.setCenterId(center.getId()); + activityCenter.setCenterName(center.getCenterName()); + activityCenter.setCenterCode(center.getCenterCode()); + activityCenter.setUsedAmount(rateAmt); + activityCenterList.add(activityCenter); + } + return activityCenterList; + } + + private void validBillNumAndDisNum(String billNumber, String disNumber) { + //拦截是否已保存 + if(StringUtils.hasText(billNumber)){ + LambdaQueryWrapper payLqw = new LambdaQueryWrapper<>(); + payLqw.eq(PayPayment::getBillNumber, billNumber); + long countPay = paymentService.count(payLqw); + if(countPay>0){Assert.throwEx("发票号已存在,请勿重复提交");} + + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsCostApply::getBillNumber, billNumber); + long countPay2 = costApplyService.count(lqw); + if(countPay2>0){Assert.throwEx("发票号已存在,请勿重复提交");} + + }else if (StringUtils.hasText(disNumber)){ + LambdaQueryWrapper payLqw = new LambdaQueryWrapper<>(); + payLqw.eq(PayPayment::getErpCode, disNumber); + long countPay = paymentService.count(payLqw); + if(countPay>0){Assert.throwEx("发货单已存在,请勿重复提交");} + + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsCostApply::getDisCode, disNumber); + long countPay2 = costApplyService.count(lqw); + if(countPay2>0){Assert.throwEx("发货单已存在,请勿重复提交");} + + }else { + Assert.throwEx("发票号或发货单号不能为空"); + } + } + + @NotNull + private Map getTbsCenterDtoMap(List centerList) { + Map centerDtoMap = new HashMap<>(); + for (ProcessCenterItem item : centerList) { + String centerCode = item.getCenterCode(); + String centerType = item.getCenterType(); + if (centerType.equals("center")){ + BmsCostCenter costCenter = costCenterService.getByCode(centerCode); + if(costCenter==null){Assert.throwEx("自定义成本中心不存在,请重新编辑:"+centerCode);} + TbsCenterDto centerDto = new TbsCenterDto(costCenter); + centerDto.setCenterRate(item.getCenterRate()); + centerDtoMap.put(centerType+"_"+centerCode,centerDto); + }else if (centerType.equals("saleRegion")){ + BmsRegion region = saleRegionService.getByCode(centerCode); + if(region==null){Assert.throwEx("销售区域不存在,请重新编辑:"+centerCode);} + TbsCenterDto centerDto = new TbsCenterDto(region); + centerDto.setCenterRate(item.getCenterRate()); + centerDtoMap.put(centerType+"_"+centerCode,centerDto); + }else if (centerType.equals("bizRegion")){ + BmsRegion2 region = bizRegionService.getByCode(centerCode); + if(region==null){Assert.throwEx("行政区域不存在,请重新编辑:"+centerCode);} + TbsCenterDto centerDto = new TbsCenterDto(region); + centerDto.setCenterRate(item.getCenterRate()); + centerDtoMap.put(centerType+"_"+centerCode,centerDto); + }else if (centerType.equals("supplier")){ + BmsSupplier supplierCenter = supplierService.getByCode(centerCode,null); + if(supplierCenter==null){Assert.throwEx("供应商不存在,请重新编辑:"+centerCode);} + TbsCenterDto centerDto = new TbsCenterDto(supplierCenter); + centerDto.setCenterRate(item.getCenterRate()); + centerDtoMap.put(centerType+"_"+centerCode,centerDto); + }else { + Assert.throwEx("成本中心类型不存在,请重新编辑:"+centerType); + } + } + return centerDtoMap; + } + + private void payToErpAPI(BmsSupplier supplier, BmsSubject subject, BigDecimal totalAmount, TbsCostApply costApply, + TbsActivity activity, TbsActivitySubject activitySubject, TbsActivityCenter activityCenter, + List activityGoodsList, List activityCenterGoodsList, + List budgetLogList, VtbVerification verification, + VtbVerificationSubject verificationSubject) { + //发货单的 + String json = ThirtyVerificationUtil.buildJson(supplier, subject, totalAmount, activity, verification); + String COST_TO_PAY_API = projectApisProperties.getCostToPay(); + log.info("COST_TO_PAY_API 支付单信息:{} 数据:{}", verification.getVerificationCode(), json); + String rs = HttpUtil.doPost(COST_TO_PAY_API, json, null); + + SysSyncLog syncLog = new SysSyncLog(); + syncLog.setFromPlat("to支付请求"); + syncLog.setUrl(COST_TO_PAY_API); + syncLog.setRequestJson(json); + if(rs==null||!rs.contains("200")){ + log.error("COST_TO_PAY_API \n 请求参数:{},\n 支付单信息:{},\n 结果:{}", json, verification.getVerificationCode(),rs); + syncLog.setEntityClass("ThirtyVerification"); + syncLog.setFailReason(rs); + syncLog.setRemark("支付失败:["+ verification.getVerificationCode()+"]"); + }else { + syncLog.setSuccessStatus(1); + syncLog.setRemark("支付完成:["+ verification.getVerificationCode()+"]"); + } + sysSyncLogService.save(syncLog); + + if (rs == null || !rs.contains("200")) { + log.error("COST_TO_PAY_API \n 请求参数:{},\n 支付单信息:{},\n 结果:{}", json, verification.getVerificationCode(), rs); + //核销调度接口事务补偿 + costApplyService.removeById(costApply.getId()); + activityService.removeById(activity.getId()); + activitySubjectService.removeById(activitySubject.getId()); + activityCenterService.removeById(activityCenter.getId()); + List goodIds = activityGoodsList.stream().map(TbsActivityGoods::getId).collect(Collectors.toList()); + if (goodIds.size() > 0) { + activityGoodsService.removeBatchByIds(goodIds); + } + List good2Ids = activityCenterGoodsList.stream().map(TbsActivityCenterGoods::getId).collect(Collectors.toList()); + if (good2Ids.size() > 0) { + activityCenterGoodsService.removeBatchByIds(good2Ids); + } + List logIds = budgetLogList.stream().map(TbsBudgetLog::getId).collect(Collectors.toList()); + if (logIds.size() > 0) { + budgetLogService.removeBatchByIds(logIds); + } + verificationService.removeById(verification.getId()); + verificationSubjectService.removeById(verificationSubject.getId()); + Assert.throwEx("请求支付失败"); + } + log.info("COST_TO_PAY_API 支付单信息:{},结果:{}", verification.getVerificationCode(), rs); + } + + @NotNull + private List filterRepSku(List invCodeList, List skuList) { + if (skuList.size() > invCodeList.size()){ + List skuList1 = new ArrayList<>(); + Set codes = new HashSet<>(); + for (String invCode : invCodeList) { + for (GoodsSku goodsSku : skuList) { + if(goodsSku.getSkuCode().equals(invCode)){ + if(codes.contains(invCode)){ + continue; + } + codes.add(invCode); + skuList1.add(goodsSku); + } + } + } + skuList = skuList1; + } + if(skuList.size() < invCodeList.size()){ + Set missCodes = new HashSet<>(); + for (String code : invCodeList) { + boolean anyMatch = skuList.stream().anyMatch(a->a.getSkuCode().equals(code)); + if(!anyMatch){ + missCodes.add(code); + } + } + Assert.throwEx("品类缺失("+ skuList.size()+"-"+ invCodeList.size()+"-"+missCodes.size()+"):"+missCodes.stream().collect(Collectors.joining(","))); + } + if(skuList.size()<1){ + Assert.throwEx("请选择品类再提交"); + } + return skuList; + } + + + /** + * 创建流程中,初始化SKU列表 + * @param invCodes + * @param filterEnable YX06赔款单,不需要过滤商品是否下架 + * @return + */ + private List initSkuListOfProcess(List invCodes,boolean filterEnable) { + List goodsSkus = null; + if(CollectionUtil.isNotEmpty(invCodes)){ + LambdaQueryWrapper skuLqw = new LambdaQueryWrapper<>(); + skuLqw.in(GoodsSku::getSkuCode,invCodes); + skuLqw.eq(filterEnable,GoodsSku::getEnable,1); + goodsSkus = goodsSkuService.list(skuLqw); + if(invCodes.size()!=goodsSkus.size()){ + List skuCodeNotExistList = new ArrayList<>(); + for (String invCode : invCodes) { + boolean notExist = true; + for (GoodsSku sku : goodsSkus) { + if(sku.getSkuCode().equals(invCode)){ + notExist = false; + break; + } + } + if(notExist){ + skuCodeNotExistList.add(invCode); + } + } + if(skuCodeNotExistList.size()>0){ + String invCodesString = skuCodeNotExistList.stream().collect(Collectors.joining(",")); + Assert.throwEx("存货编码["+invCodesString+"]不存在,请重新编辑"); + } + } + } + if(goodsSkus==null){ + Assert.throwEx("存货编码未设置,请重新编辑"); + } + return goodsSkus; + } + + +} diff --git a/src/main/java/com/qs/serve/modules/third/service/PortalOfCostApplication.java b/src/main/java/com/qs/serve/modules/third/service/PortalOfCostApplication.java index aad6302a..ab1e96ee 100644 --- a/src/main/java/com/qs/serve/modules/third/service/PortalOfCostApplication.java +++ b/src/main/java/com/qs/serve/modules/third/service/PortalOfCostApplication.java @@ -9,6 +9,7 @@ import com.qs.serve.common.model.consts.SysConfigKey; import com.qs.serve.common.model.enums.BudgetLogOptFlag; import com.qs.serve.common.model.consts.ResultFlag; import com.qs.serve.common.util.*; +import com.qs.serve.modules.bir.consts.BirActivityCenterGoodsUtil; import com.qs.serve.modules.bms.entity.*; import com.qs.serve.modules.bms.service.*; import com.qs.serve.modules.goods.entity.GoodsCategory; @@ -537,6 +538,7 @@ public class PortalOfCostApplication { verificationSubject.setCountSession(0); verificationSubjectService.save(verificationSubject); + BirActivityCenterGoodsUtil.buildBir(costApply.getId()); } @Transactional(rollbackFor = Exception.class) diff --git a/src/main/resources/mapper/bms/BmsSupplierMapper.xml b/src/main/resources/mapper/bms/BmsSupplierMapper.xml index bf85a048..777829ee 100644 --- a/src/main/resources/mapper/bms/BmsSupplierMapper.xml +++ b/src/main/resources/mapper/bms/BmsSupplierMapper.xml @@ -84,6 +84,7 @@ bms_supplier.`cooperate_pause_flag`, bms_supplier.`stop_flag_date`, bms_supplier.`cooperate_pause_flag_date`, + bms_supplier.`transport_visible`, bms_supplier.`cd_order_flag`, bms_supplier.`del_flag`