Browse Source

opt: 创建费用支持多成本中心

muti_db
Yen 4 months ago
parent
commit
340b049637
  1. 12
      src/main/java/com/qs/serve/modules/oms/controller/api/OmsSaleOrderApi.java
  2. 7
      src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderServiceImpl.java
  3. 2
      src/main/java/com/qs/serve/modules/other/entity/ZbiReport.java
  4. 7
      src/main/java/com/qs/serve/modules/tbs/controller/TbsCostApplyController.java
  5. 70
      src/main/java/com/qs/serve/modules/third/PortalOfCostController.java
  6. 18
      src/main/java/com/qs/serve/modules/third/entity/ProcessCenterItem.java
  7. 3
      src/main/java/com/qs/serve/modules/third/entity/ProcessCreateCostApplyBo.java
  8. 15
      src/main/java/com/qs/serve/modules/third/entity/param/DHXDelCostParam.java
  9. 663
      src/main/java/com/qs/serve/modules/third/service/PortalOfCost2Application.java
  10. 2
      src/main/java/com/qs/serve/modules/third/service/PortalOfCostApplication.java
  11. 1
      src/main/resources/mapper/bms/BmsSupplierMapper.xml

12
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())){
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<OmsSaleOrderItem> lqw = new LambdaQueryWrapper<>();
lqw.eq(OmsSaleOrderItem::getOrderId,id);

7
src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderServiceImpl.java

@ -188,7 +188,12 @@ public class OmsSaleOrderServiceImpl extends ServiceImpl<OmsSaleOrderMapper, Oms
invItemList.add(invItem);
}
omsPlanParam.setInvItemList(invItemList);
this.getPlanList(omsPlanParam);
OmsPlanResult planResult = this.getPlanList(omsPlanParam);
LocalDate date = DateUtils.toLocalDate(planResult.getDeliveryDate());
order.setPreProductionDate(date);
order.setPreProductionDate(date);
order.setProductionRemark(planResult.getRemark());
this.updateById(order);
}
}

2
src/main/java/com/qs/serve/modules/other/entity/ZbiReport.java

@ -45,6 +45,8 @@ public class ZbiReport implements Serializable {
@Length(max = 255,message = "备注长度不能超过255字")
private String remark;
private String filterType;
/** 创建时间 */
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")

7
src/main/java/com/qs/serve/modules/tbs/controller/TbsCostApplyController.java

@ -592,11 +592,14 @@ public class TbsCostApplyController {
if(!code.contains("DHX")){
return R.error("非DHX费用,不支持删除");
}
TbsCostApply costApply = tbsCostApplyMapper.selectList(new LambdaQueryWrapper<TbsCostApply>()
.eq(TbsCostApply::getCode,code)).get(0);
List<TbsCostApply> costApplys = tbsCostApplyMapper.selectList(new LambdaQueryWrapper<TbsCostApply>()
.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();
}

70
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<TbsCostApply> costApplys = tbsCostApplyMapper.selectList(new LambdaQueryWrapper<TbsCostApply>()
.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("支付异常");
}
/**
* 协议类费用 核销支付记录

18
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;
}

3
src/main/java/com/qs/serve/modules/third/entity/ProcessCreateCostApplyBo.java

@ -30,6 +30,8 @@ public class ProcessCreateCostApplyBo {
private String centerCode;
private List<ProcessCenterItem> centerList;
/** 活动标题(可为空) */
private String activityTitle;
@ -73,4 +75,5 @@ public class ProcessCreateCostApplyBo {
* 不进行支付目前只支持赠品类费用
*/
private Integer ignorePayFlag;
}

15
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;
}

663
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<String, TbsCenterDto> centerDtoMap = this.getTbsCenterDtoMap(createBo.getCenterList());
//发票号
String billNumber = createBo.getBillNumber();
String disNumber = createBo.getErpCode();
this.validBillNumAndDisNum(billNumber, disNumber);
//初始化sku列表
List<ProcessGoodsItem> processGoodsItems = createBo.getGoodsList();
List<String> 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<GoodsSku> 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<TbsActivityCenter> activityCenterList = getTbsActivityCenters(subject, OneHundred, centerDtoMap, totalAmount);
//活动-商品
List<TbsActivityGoods> 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<TbsActivityCenterGoods> 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<TbsBudgetCostItem> unMatchBudgetItem = budgetCostResult.getBudgetUnMatchList();
if(unMatchBudgetItem.size()>0){
String codes = unMatchBudgetItem.stream().map(TbsBudgetCostItem::getTargetCode).collect(Collectors.joining(","));
Assert.throwEx("未能匹配到预算:"+codes);
}
//匹配的商品,生成预算日志
List<TbsBudgetCostItem> matchBudgetItem = budgetCostResult.getBudgetMatchList();
List<TbsBudgetLog> 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<TbsActivityCenterGoods> getTbsActivityCenterGoods(BmsSupplier supplier, BmsSubject subject, BigDecimal OneHundred, List<ProcessGoodsItem> processGoodsItems, String costCode, LocalDate nowDate, LocalDate startDate, LocalDate endDate, Long supplierId, BigDecimal totalAmount, TbsActivity activity, List<TbsActivityCenter> activityCenterList, List<TbsActivityGoods> activityGoodsList) {
List<TbsActivityCenterGoods> 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<TbsActivityCenter> getTbsActivityCenters(BmsSubject subject, BigDecimal OneHundred, Map<String, TbsCenterDto> centerDtoMap, BigDecimal totalAmount) {
List<TbsActivityCenter> activityCenterList = new ArrayList<>();
BigDecimal surplusAmount = totalAmount;
Set<String> centerTypes = centerDtoMap.keySet();
Iterator<String> 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<PayPayment> payLqw = new LambdaQueryWrapper<>();
payLqw.eq(PayPayment::getBillNumber, billNumber);
long countPay = paymentService.count(payLqw);
if(countPay>0){Assert.throwEx("发票号已存在,请勿重复提交");}
LambdaQueryWrapper<TbsCostApply> lqw = new LambdaQueryWrapper<>();
lqw.eq(TbsCostApply::getBillNumber, billNumber);
long countPay2 = costApplyService.count(lqw);
if(countPay2>0){Assert.throwEx("发票号已存在,请勿重复提交");}
}else if (StringUtils.hasText(disNumber)){
LambdaQueryWrapper<PayPayment> payLqw = new LambdaQueryWrapper<>();
payLqw.eq(PayPayment::getErpCode, disNumber);
long countPay = paymentService.count(payLqw);
if(countPay>0){Assert.throwEx("发货单已存在,请勿重复提交");}
LambdaQueryWrapper<TbsCostApply> lqw = new LambdaQueryWrapper<>();
lqw.eq(TbsCostApply::getDisCode, disNumber);
long countPay2 = costApplyService.count(lqw);
if(countPay2>0){Assert.throwEx("发货单已存在,请勿重复提交");}
}else {
Assert.throwEx("发票号或发货单号不能为空");
}
}
@NotNull
private Map<String, TbsCenterDto> getTbsCenterDtoMap(List<ProcessCenterItem> centerList) {
Map<String, TbsCenterDto> 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<TbsActivityGoods> activityGoodsList, List<TbsActivityCenterGoods> activityCenterGoodsList,
List<TbsBudgetLog> 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<Long> goodIds = activityGoodsList.stream().map(TbsActivityGoods::getId).collect(Collectors.toList());
if (goodIds.size() > 0) {
activityGoodsService.removeBatchByIds(goodIds);
}
List<Long> good2Ids = activityCenterGoodsList.stream().map(TbsActivityCenterGoods::getId).collect(Collectors.toList());
if (good2Ids.size() > 0) {
activityCenterGoodsService.removeBatchByIds(good2Ids);
}
List<Long> 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<GoodsSku> filterRepSku(List<String> invCodeList, List<GoodsSku> skuList) {
if (skuList.size() > invCodeList.size()){
List<GoodsSku> skuList1 = new ArrayList<>();
Set<String> 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<String> 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<GoodsSku> initSkuListOfProcess(List<String> invCodes,boolean filterEnable) {
List<GoodsSku> goodsSkus = null;
if(CollectionUtil.isNotEmpty(invCodes)){
LambdaQueryWrapper<GoodsSku> skuLqw = new LambdaQueryWrapper<>();
skuLqw.in(GoodsSku::getSkuCode,invCodes);
skuLqw.eq(filterEnable,GoodsSku::getEnable,1);
goodsSkus = goodsSkuService.list(skuLqw);
if(invCodes.size()!=goodsSkus.size()){
List<String> 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;
}
}

2
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)

1
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` </sql>

Loading…
Cancel
Save