diff --git a/src/main/java/com/qs/serve/common/model/enums/MonthValues.java b/src/main/java/com/qs/serve/common/model/enums/MonthValues.java new file mode 100644 index 00000000..22ac1596 --- /dev/null +++ b/src/main/java/com/qs/serve/common/model/enums/MonthValues.java @@ -0,0 +1,40 @@ +package com.qs.serve.common.model.enums; + +/** + * @author YenHex + * @since 2023/9/13 + */ +public class MonthValues { + + public static final int[] Q1 = {1,2,3}; + public static final int[] Q2 = {4,5,6}; + public static final int[] Q3 = {7,8,9}; + public static final int[] Q4 = {10,11,12}; + + + + public static int[] getQArr(Integer val){ + for (int i = 0; i < Q1.length; i++) { + if(val==Q1[i]){ + return Q1; + } + } + for (int i = 0; i < Q2.length; i++) { + if(val==Q2[i]){ + return Q2; + } + } + for (int i = 0; i < Q3.length; i++) { + if(val==Q3[i]){ + return Q3; + } + } + for (int i = 0; i < Q4.length; i++) { + if(val==Q4[i]){ + return Q4; + } + } + return null; + } + +} diff --git a/src/main/java/com/qs/serve/modules/bir/service/impl/BirCenterRateServiceImpl.java b/src/main/java/com/qs/serve/modules/bir/service/impl/BirCenterRateServiceImpl.java index dc5c1340..0fdb30d3 100644 --- a/src/main/java/com/qs/serve/modules/bir/service/impl/BirCenterRateServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/bir/service/impl/BirCenterRateServiceImpl.java @@ -62,6 +62,7 @@ public class BirCenterRateServiceImpl implements BirCenterRateService { private TzcPolicyItemMapper tzcPolicyItemMapper; private TbsBudgetLogMapper tbsBudgetLogMapper; + @Override public List findCostCenterDataByCostApplyId(Long costApplyId,Long policyId){ List centerDataList = new ArrayList<>(); if(costApplyId!=null) { diff --git a/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierTarget.java b/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierTarget.java new file mode 100644 index 00000000..ac296b86 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierTarget.java @@ -0,0 +1,77 @@ +package com.qs.serve.modules.bms.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.NotBlank; + +/** + * 实体类 + * @author YenHex + * @since 2023-09-13 + */ +@Data +@TableName("bms_supplier_target") +public class BmsSupplierTarget implements Serializable { + + private static final long serialVersionUID = 1L; + + /** */ + @TableId(type = IdType.AUTO) + private Long id; + + /** */ + private Long supplierId; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String supplierCode; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String supplierName; + + /** 对应tbs_schedule的ID */ + private Long scheduleId; + + /** 对应tbs_schedule_item的ID */ + private Long scheduleItemId; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String scheduleItemName; + + /** */ + private BigDecimal targetDispatchAmount; + + /** */ + private BigDecimal targetCostAmount; + + + public static BmsSupplierTarget toNewObject(BmsSupplierTarget source){ + BmsSupplierTarget supplierTarget = new BmsSupplierTarget(); + supplierTarget.setId(source.getId()); + supplierTarget.setSupplierId(source.getSupplierId()); + supplierTarget.setSupplierCode(source.getSupplierCode()); + supplierTarget.setSupplierName(source.getSupplierName()); + supplierTarget.setScheduleId(source.getScheduleId()); + supplierTarget.setScheduleItemId(source.getScheduleItemId()); + supplierTarget.setScheduleItemName(source.getScheduleItemName()); + supplierTarget.setTargetDispatchAmount(source.getTargetDispatchAmount()); + supplierTarget.setTargetCostAmount(source.getTargetCostAmount()); + return supplierTarget; + } + +} + diff --git a/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierTargetMapper.java b/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierTargetMapper.java new file mode 100644 index 00000000..6650e584 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierTargetMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsSupplierTarget; + +/** + * Mapper + * @author YenHex + * @date 2023-09-13 + */ +public interface BmsSupplierTargetMapper extends BaseMapper { + +} + diff --git a/src/main/java/com/qs/serve/modules/seeyon/SeeYonController.java b/src/main/java/com/qs/serve/modules/seeyon/SeeYonController.java index 2dbe2ec8..558b4e37 100644 --- a/src/main/java/com/qs/serve/modules/seeyon/SeeYonController.java +++ b/src/main/java/com/qs/serve/modules/seeyon/SeeYonController.java @@ -75,8 +75,8 @@ public class SeeYonController { * @return */ @GetMapping("pageMyCallback") - public R> pageCallbackList(){ - return R.ok(commonCheckService.pageCallback(new TodoVoQuery())); + public R> pageCallbackList(TodoVoQuery todoVoQuery){ + return R.ok(commonCheckService.pageCallback(todoVoQuery)); } /** diff --git a/src/main/java/com/qs/serve/modules/seeyon/entity/dto/TodoVoQuery.java b/src/main/java/com/qs/serve/modules/seeyon/entity/dto/TodoVoQuery.java index 28d85ef3..6a449a8b 100644 --- a/src/main/java/com/qs/serve/modules/seeyon/entity/dto/TodoVoQuery.java +++ b/src/main/java/com/qs/serve/modules/seeyon/entity/dto/TodoVoQuery.java @@ -1,6 +1,9 @@ package com.qs.serve.modules.seeyon.entity.dto; import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; /** * @author YenHex @@ -9,6 +12,18 @@ import lombok.Data; @Data public class TodoVoQuery { + private String title; + + private String targetType; + + private String targetCode; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate startDate; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate endDate; + private String userId; private Integer startRow; diff --git a/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivitySlottingFeeController.java b/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivitySlottingFeeController.java index d11e579e..aee0644a 100644 --- a/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivitySlottingFeeController.java +++ b/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivitySlottingFeeController.java @@ -88,6 +88,12 @@ public class TbsActivitySlottingFeeController { List channelIds = channelList.stream().map(TbsActivityChannel::getChannelId).distinct().collect(Collectors.toList()); List pointIds = pointList.stream().map(TbsActivityChannelPoint::getPointId).distinct().collect(Collectors.toList()); LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.like(StringUtils.hasText(param.getTargetName()),TbsActivitySlottingFee::getTargetName,param.getTargetName()); + lqw.like(StringUtils.hasText(param.getTargetCode()),TbsActivitySlottingFee::getTargetCode,param.getTargetCode()); + lqw.like(StringUtils.hasText(param.getChannelName()),TbsActivitySlottingFee::getChannelName,param.getChannelName()); + lqw.like(StringUtils.hasText(param.getChannelCode()),TbsActivitySlottingFee::getChannelCode,param.getChannelCode()); + lqw.like(StringUtils.hasText(param.getPointName()),TbsActivitySlottingFee::getPointName,param.getPointName()); + lqw.like(StringUtils.hasText(param.getPointCode()),TbsActivitySlottingFee::getPointCode,param.getPointCode()); if (goodsIds.size() > 0) { lqw.in(TbsActivitySlottingFee::getTargetId, goodsIds); lqw.eq(TbsActivitySlottingFee::getTargetType, "spu"); diff --git a/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsContractCostSubItem.java b/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsContractCostSubItem.java index 8579b4d1..6cc7eeaf 100644 --- a/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsContractCostSubItem.java +++ b/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsContractCostSubItem.java @@ -52,4 +52,25 @@ public class TbsContractCostSubItem { } + @Data + public static class CusCenterRate{ + // 季度客户所属成本中心费用金额 + private String qtdCusCenterCost; + // 季度客户所属成本中心发货金额 + private String qtdCusCenterSend; + // 季度客户所属成本中心费用率 + private String qtdCusCenterExpenseRate; + // 季度客户所属成本中心目标费用率 + private String qtdCusCenterTargetExpenseRate; + + // 年度客户所属成本中心费用金额 + private String ytdCusCenterCost; + // 年度客户所属成本中心发货金额 + private String ytdCusCenterSend; + // 年度客户所属成本中心费用率 + private String ytdCusCenterExpenseRate; + // 年度客户所属成本中心目标费用率 + private String ytdCusCenterTargetExpenseRate; + } + } diff --git a/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsBudgetSo.java b/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsBudgetSo.java index 3d93f516..a7c0122c 100644 --- a/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsBudgetSo.java +++ b/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsBudgetSo.java @@ -34,6 +34,9 @@ public class TbsBudgetSo implements Serializable { /** 预算编码 */ private String budgetNumber; + /** 审批流程状态 */ + private Integer budgetCheckState; + /** 科目编码搜索值 */ private String subjectValue; diff --git a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetApplyOperationServiceImpl.java b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetApplyOperationServiceImpl.java index 56236206..f4ae70ba 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetApplyOperationServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetApplyOperationServiceImpl.java @@ -47,7 +47,7 @@ public class TbsBudgetApplyOperationServiceImpl implements SeeYonOperationServic @Override public void doCommitBacked(String targetId) { - AsyncFactory.submitBudgetApply(targetId); + AsyncManager.me().execute(AsyncFactory.submitBudgetApply(targetId)); } @Override diff --git a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyServiceImpl.java b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyServiceImpl.java index 2f92253d..7b356eeb 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyServiceImpl.java @@ -10,22 +10,23 @@ import com.qs.serve.common.framework.manager.AsyncManager; import com.qs.serve.common.model.enums.BudgetLogOptFlag; import com.qs.serve.common.model.consts.BudgetLogRollbackFlag; import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.enums.MonthValues; import com.qs.serve.common.util.*; import com.qs.serve.common.util.model.DateFormatString; import com.qs.serve.modules.bir.entity.BirActivityCenterGoods; import com.qs.serve.modules.bir.entity.BirBaseActivity; import com.qs.serve.modules.bir.entity.dto.BirRoiCostDTO; +import com.qs.serve.modules.bir.entity.vo.BirRoiCostItemVo; import com.qs.serve.modules.bir.entity.vo.YtdQtdToOAVo; import com.qs.serve.modules.bir.mapper.BirActivityCenterGoodsMapper; import com.qs.serve.modules.bir.mapper.BirBaseActivityMapper; +import com.qs.serve.modules.bir.mapper.BirRoiRateMapper; import com.qs.serve.modules.bir.service.BirCenterRateService; import com.qs.serve.modules.bir.service.BirRoiRateService; -import com.qs.serve.modules.bms.entity.BmsRegion; -import com.qs.serve.modules.bms.entity.BmsRegion2; -import com.qs.serve.modules.bms.entity.BmsSubject; -import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.*; import com.qs.serve.modules.bms.mapper.BmsRegion2Mapper; import com.qs.serve.modules.bms.mapper.BmsRegionMapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierTargetMapper; import com.qs.serve.modules.bms.service.BmsSubjectService; import com.qs.serve.modules.bms.service.BmsSupplierService; import com.qs.serve.modules.erp.entity.dto.ErpDispatchSumVo; @@ -112,6 +113,11 @@ public class TbsCostApplyServiceImpl extends ServiceImpl contracts = costContractMapper.selectList(lqw); if(contracts.size()>0){ - //活动的科目和成本中心 - List tbsActivityCenters = tbsActivityCenterService.listByCostApplyId(Long.parseLong(id)); - String concatCenterCodes = tbsActivityCenters.stream().map(TbsActivityCenter::getCenterCode).collect(Collectors.joining(",")); - String concatCenterNames = tbsActivityCenters.stream().map(TbsActivityCenter::getCenterName).collect(Collectors.joining(",")); - List tbsActivitySubjects = tbsActivitySubjectService.listByCostApplyId(Long.parseLong(id)); - List subjectIds = tbsActivitySubjects.stream().map(a->a.getSubjectId()).collect(Collectors.toList()); - if(subjectIds.size()>0){ - List subjectList = subjectService.listByIds(subjectIds); - String concatSubjectCodes = subjectList.stream().map(BmsSubject::getThirdCode).collect(Collectors.joining(",")); - String concatSubjectNames = subjectList.stream().map(BmsSubject::getThirdName).collect(Collectors.joining(",")); - - data.put("financeAccountCode",concatSubjectCodes); - data.put("financeAccountName",concatSubjectNames); - data.put("accountCode",concatSubjectCodes); - data.put("accountName",concatSubjectNames); - } - - TbsCostContract contract = contracts.get(0); - data.put("payee",contract.getPayee()); - data.put("bankName",contract.getBankName()); - data.put("bankAccount",contract.getBankAccount()); - data.put("sealID",contract.getSealId()); - data.put("sealName",contract.getSealName()); - data.put("sealNum",contract.getSealNum()); - data.put("fileNum",contract.getFileNum()); - - data.put("costCenterNo",concatCenterCodes); - data.put("costCenterName",concatCenterNames); - - data.put("businessCompany",contract.getBusinessCompany()); - data.put("businessCompanyId",contract.getDutyNumber()); - - data.put("contractName",contract.getContractName()); - data.put("applyMoney",contract.getContractAmount()); - data.put("signDate",contract.getSignTime()==null?null:contract.getSignTime().toString()); - data.put("expireDate",contract.getExpireTime()==null?null:contract.getExpireTime().toString()); - data.put("contractContent",contract.getContractCondition()); - String urls = ""; - final String ossPrefix = "https://qsjslservice.oss-cn-guangzhou.aliyuncs.com/"; - if (CollectionUtil.isNotEmpty(contract.getAttachIds())){ - List attachIds = Arrays.asList(contract.getAttachIds()); - List attachList = sysAttachService.listByIds(attachIds); - urls = attachList.stream().map(a->{ - if(a.getPath()!=null){ - try { - String tmp = URLEncoder.encode(a.getPath(), "UTF8").replace("%2F","/"); - return ossPrefix+tmp; - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - } - return ""; - }).collect(Collectors.joining(" , ")); - } - data.put("contractFile",urls); + //构建合同DATA + buildContractSeeyonData(id, data, contracts); }else { Assert.throwEx("请补充合同信息"); } @@ -635,33 +588,7 @@ public class TbsCostApplyServiceImpl extends ServiceImpl subList = new ArrayList<>(); //活动明细 - LambdaQueryWrapper actCgLqw = new LambdaQueryWrapper<>(); - actCgLqw.eq(TbsActivityCenterGoods::getCostApplyId, id); - List activityCenterGoodsList = tbsActivityCenterGoodsMapper.selectList(actCgLqw); - for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) { - TbsActivity currActivity = null; - for (TbsActivity activity : activityList) { - if(centerGoods.getActivityId().equals(activity.getId())){ - currActivity = activity; - break; - } - } - TbsContractCostSubItem.Activity dataActivity = new TbsContractCostSubItem.Activity(); - dataActivity.setActivityCode(currActivity.getActivityCode()); - dataActivity.setActivityPurpose(currActivity.getActTitle()); - dataActivity.setCostCode(tbsCostApply.getCode()); - dataActivity.setStartDate(currActivity.getActStartDate()==null?null:currActivity.getActStartDate().toString()); - dataActivity.setEndDate(currActivity.getActEndDate()==null?null:currActivity.getActEndDate().toString()); - dataActivity.setWriteOffDate(currActivity.getPreCheckDate()==null?null:currActivity.getPreCheckDate().toString()); - dataActivity.setProductType(GoodsType.getName(centerGoods.getTargetType())); - dataActivity.setProduct(centerGoods.getTargetName()); - dataActivity.setActivityAccountCode(centerGoods.getSubjectCode()); - dataActivity.setActivityAccountName(centerGoods.getSubjectName()); - dataActivity.setActivityCostCenterNo(centerGoods.getCenterCode()); - dataActivity.setActivityCostCenterName(centerGoods.getCenterName()+"("+centerGoods.getCenterType()+")"); - dataActivity.setMoney(centerGoods.getCenterGoodsAmount()); - subList.add(dataActivity); - } + buildActivityCenterGoodsSeeyonData(id, tbsCostApply, activityList, subList); // 付款条件 for (TbsActivityPayCondition payCondition : payConditions) { // TbsActivity currActivity = null; @@ -697,10 +624,240 @@ public class TbsCostApplyServiceImpl extends ServiceImpl cusCenterRateList = buildCusRateMain(supplier); + subList.addAll(cusCenterRateList); + } catch (Exception e) { + log.error("[构造客户维度的 年度、季度合计]异常:{}",e.getMessage()); + } //关联 data.put("sub", subList); } + private void buildActivityCenterGoodsSeeyonData(String id, TbsCostApply tbsCostApply, List activityList, List subList) { + LambdaQueryWrapper actCgLqw = new LambdaQueryWrapper<>(); + actCgLqw.eq(TbsActivityCenterGoods::getCostApplyId, id); + List activityCenterGoodsList = tbsActivityCenterGoodsMapper.selectList(actCgLqw); + for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) { + TbsActivity currActivity = null; + for (TbsActivity activity : activityList) { + if(centerGoods.getActivityId().equals(activity.getId())){ + currActivity = activity; + break; + } + } + TbsContractCostSubItem.Activity dataActivity = new TbsContractCostSubItem.Activity(); + dataActivity.setActivityCode(currActivity.getActivityCode()); + dataActivity.setActivityPurpose(currActivity.getActTitle()); + dataActivity.setCostCode(tbsCostApply.getCode()); + dataActivity.setStartDate(currActivity.getActStartDate()==null?null:currActivity.getActStartDate().toString()); + dataActivity.setEndDate(currActivity.getActEndDate()==null?null:currActivity.getActEndDate().toString()); + dataActivity.setWriteOffDate(currActivity.getPreCheckDate()==null?null:currActivity.getPreCheckDate().toString()); + dataActivity.setProductType(GoodsType.getName(centerGoods.getTargetType())); + dataActivity.setProduct(centerGoods.getTargetName()); + dataActivity.setActivityAccountCode(centerGoods.getSubjectCode()); + dataActivity.setActivityAccountName(centerGoods.getSubjectName()); + dataActivity.setActivityCostCenterNo(centerGoods.getCenterCode()); + dataActivity.setActivityCostCenterName(centerGoods.getCenterName()+"("+centerGoods.getCenterType()+")"); + dataActivity.setMoney(centerGoods.getCenterGoodsAmount()); + subList.add(dataActivity); + } + } + + private void buildContractSeeyonData(String id, Map data, List contracts) { + //活动的科目和成本中心 + List tbsActivityCenters = tbsActivityCenterService.listByCostApplyId(Long.parseLong(id)); + String concatCenterCodes = tbsActivityCenters.stream().map(TbsActivityCenter::getCenterCode).collect(Collectors.joining(",")); + String concatCenterNames = tbsActivityCenters.stream().map(TbsActivityCenter::getCenterName).collect(Collectors.joining(",")); + List tbsActivitySubjects = tbsActivitySubjectService.listByCostApplyId(Long.parseLong(id)); + List subjectIds = tbsActivitySubjects.stream().map(a->a.getSubjectId()).collect(Collectors.toList()); + if(subjectIds.size()>0){ + List subjectList = subjectService.listByIds(subjectIds); + String concatSubjectCodes = subjectList.stream().map(BmsSubject::getThirdCode).collect(Collectors.joining(",")); + String concatSubjectNames = subjectList.stream().map(BmsSubject::getThirdName).collect(Collectors.joining(",")); + + data.put("financeAccountCode",concatSubjectCodes); + data.put("financeAccountName",concatSubjectNames); + data.put("accountCode",concatSubjectCodes); + data.put("accountName",concatSubjectNames); + } + + TbsCostContract contract = contracts.get(0); + data.put("payee",contract.getPayee()); + data.put("bankName",contract.getBankName()); + data.put("bankAccount",contract.getBankAccount()); + data.put("sealID",contract.getSealId()); + data.put("sealName",contract.getSealName()); + data.put("sealNum",contract.getSealNum()); + data.put("fileNum",contract.getFileNum()); + + data.put("costCenterNo",concatCenterCodes); + data.put("costCenterName",concatCenterNames); + + data.put("businessCompany",contract.getBusinessCompany()); + data.put("businessCompanyId",contract.getDutyNumber()); + + data.put("contractName",contract.getContractName()); + data.put("applyMoney",contract.getContractAmount()); + data.put("signDate",contract.getSignTime()==null?null:contract.getSignTime().toString()); + data.put("expireDate",contract.getExpireTime()==null?null:contract.getExpireTime().toString()); + data.put("contractContent",contract.getContractCondition()); + String urls = ""; + final String ossPrefix = "https://qsjslservice.oss-cn-guangzhou.aliyuncs.com/"; + if (CollectionUtil.isNotEmpty(contract.getAttachIds())){ + List attachIds = Arrays.asList(contract.getAttachIds()); + List attachList = sysAttachService.listByIds(attachIds); + urls = attachList.stream().map(a->{ + if(a.getPath()!=null){ + try { + String tmp = URLEncoder.encode(a.getPath(), "UTF8").replace("%2F","/"); + return ossPrefix+tmp; + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + return ""; + }).collect(Collectors.joining(" , ")); + } + data.put("contractFile",urls); + } + + @NotNull + private List buildCusRateMain(BmsSupplier supplier) { + List supplierTargetList = bmsSupplierTargetMapper.selectList( + new LambdaQueryWrapper() + .eq(BmsSupplierTarget::getSupplierId, supplier.getId()) + ); + List scheduleItemIds = supplierTargetList.stream().map(BmsSupplierTarget::getScheduleItemId).collect(Collectors.toList()); + List scheduleIds = supplierTargetList.stream().map(BmsSupplierTarget::getScheduleId).collect(Collectors.toList()); + List scheduleItems = null; + if(scheduleItemIds.size()>0&&scheduleIds.size()>0){ + LambdaQueryWrapper scheduleItemsLqw = new LambdaQueryWrapper<>(); + scheduleItemsLqw.in(TbsScheduleItem::getId,scheduleItemIds); + scheduleItemsLqw.in(TbsScheduleItem::getScheduleId,scheduleIds); + scheduleItems = tbsScheduleItemMapper.selectList(scheduleItemsLqw); + } + //最近12个月 + LocalDate currMonth = LocalDate.now(); + + int currMonthNum = currMonth.getYear()*100 + currMonth.getMonthValue(); + LocalDate startMonth = currMonth.plusMonths(-12); + int startMonthNum = startMonth.getYear()*100 + startMonth.getMonthValue(); + + //发货金额 + List dispatchSumVos = dispatchDataMapper.querySumCost(startMonthNum,currMonthNum,Arrays.asList(supplier.getCode())); + //客户核销金额 + BirRoiCostDTO costDTO = new BirRoiCostDTO(); + costDTO.setStartMonthNum(startMonthNum); + costDTO.setEndMonthNum(currMonthNum); + costDTO.setSupplierId(supplier.getId()); + List costItemVoList = birRoiRateMapper.queryRoiCostItems(costDTO); + //用户季度费率 + List cusCenterRateList = + this.buildCusCenterRate(supplierTargetList, scheduleItems, currMonth, startMonth, dispatchSumVos, costItemVoList); + //用户年费率 + this.buildCusCenterYearRate(supplierTargetList, dispatchSumVos, costItemVoList, cusCenterRateList); + return cusCenterRateList; + } + + /** + * 用户年费率 + * @param supplierTargetList + * @param dispatchSumVos + * @param costItemVoList + * @param cusCenterRateList + */ + private void buildCusCenterYearRate(List supplierTargetList, List dispatchSumVos, List costItemVoList, List cusCenterRateList) { + BigDecimal dispatchAmt = BigDecimal.ZERO; + BigDecimal totalCost = BigDecimal.ZERO; + BigDecimal cusDispatch = BigDecimal.ZERO; + BigDecimal cusCost = BigDecimal.ZERO; + for (ErpDispatchSumVo dispatchSumVo : dispatchSumVos) { + dispatchAmt = dispatchAmt.add(dispatchSumVo.getDispatchSumCost()); + } + for (BirRoiCostItemVo itemVo : costItemVoList) { + totalCost = totalCost.add(itemVo.getCostRealAmt()); + } + for (BmsSupplierTarget supplierTarget : supplierTargetList) { + cusDispatch = cusDispatch.add(supplierTarget.getTargetCostAmount()); + cusCost = cusCost.add(supplierTarget.getTargetCostAmount()); + } + for (TbsContractCostSubItem.CusCenterRate centerRate : cusCenterRateList) { + centerRate.setYtdCusCenterCost(totalCost.toString()); + centerRate.setYtdCusCenterSend(dispatchAmt.toString()); + centerRate.setYtdCusCenterExpenseRate(totalCost.divide(dispatchAmt, RoundingMode.DOWN).toString()); + if(cusCost.compareTo(BigDecimal.ZERO)!=0&&cusDispatch.compareTo(BigDecimal.ZERO)!=0){ + centerRate.setYtdCusCenterTargetExpenseRate(cusCost.divide(cusDispatch,RoundingMode.DOWN).toString()); + } + } + } + + /** + * 创建客户维度的季度费率 + * @param supplierTargetList + * @param scheduleItems + * @param currMonth + * @param startMonth + * @param dispatchSumVos + * @param costItemVoList + */ + private List buildCusCenterRate(List supplierTargetList, + List scheduleItems, + LocalDate currMonth, LocalDate startMonth, + List dispatchSumVos, + List costItemVoList) { + List cusCenterRateList = new ArrayList<>(); + int[] currQ = MonthValues.getQArr(startMonth.getMonthValue()); + if(currQ!=null){ + BigDecimal dispatchAmt = BigDecimal.ZERO; + BigDecimal totalCost = BigDecimal.ZERO; + BigDecimal cusDispatch = BigDecimal.ZERO; + BigDecimal cusCost = BigDecimal.ZERO; + for (int monthVal : currQ) { + int monthNum = currMonth.getYear()*100 + monthVal; + if(dispatchSumVos !=null){ + for (ErpDispatchSumVo dispatchSumVo : dispatchSumVos) { + if(dispatchSumVo.getYearMonth().equals(monthNum)){ + dispatchAmt = dispatchAmt.add(dispatchSumVo.getDispatchSumCost()); + break; + } + } + } + for (BirRoiCostItemVo itemVo : costItemVoList) { + if(itemVo.getYearMonth().equals(monthNum)){ + totalCost = totalCost.add(itemVo.getCostRealAmt()); + } + } + if(scheduleItems !=null){ + for (BmsSupplierTarget supplierTarget : supplierTargetList) { + for (TbsScheduleItem item : scheduleItems) { + //匹配条件 + if(supplierTarget.getScheduleItemId().equals(item.getId())){ + //匹配时间 + int itemMonth = item.getStartDate().getMonthValue(); + if(itemMonth==monthVal){ + cusDispatch = cusDispatch.add(supplierTarget.getTargetCostAmount()); + cusCost = cusCost.add(supplierTarget.getTargetCostAmount()); + break; + } + } + } + } + } + } + TbsContractCostSubItem.CusCenterRate centerRate = new TbsContractCostSubItem.CusCenterRate(); + centerRate.setQtdCusCenterCost(totalCost.toString()); + centerRate.setQtdCusCenterSend(dispatchAmt.toString()); + centerRate.setQtdCusCenterExpenseRate(totalCost.divide(dispatchAmt, RoundingMode.DOWN).toString()); + if(cusCost.compareTo(BigDecimal.ZERO)!=0&&cusDispatch.compareTo(BigDecimal.ZERO)!=0){ + centerRate.setQtdCusCenterTargetExpenseRate(cusCost.divide(cusDispatch,RoundingMode.DOWN).toString()); + } + cusCenterRateList.add(centerRate); + } + return cusCenterRateList; + } + private void buildCommonApplyData(String id, TbsCostApply tbsCostApply, List activityList, BmsSupplier supplier ,SysUser sysUser, Map data) { String actTitles = activityList.stream().map(TbsActivity::getActTitle).collect(Collectors.joining("; ")); data.put("costApplyCode", tbsCostApply.getCode()); @@ -753,7 +910,14 @@ public class TbsCostApplyServiceImpl extends ServiceImpl cusCenterRateList = buildCusRateMain(supplier); + subList.addAll(cusCenterRateList); + } catch (Exception e) { + log.error("【费用申请,创建客户维度费率数据】:{}",e.getMessage()); } //创建商品抬头列表 List tbsActivityGoods = tbsActivityGoodsService.listByCostApplyId(Long.parseLong(id)); @@ -827,7 +991,7 @@ public class TbsCostApplyServiceImpl extends ServiceImpl> centerMapList = tbsActivityCenters.stream().collect(Collectors.groupingBy(a->a.getCenterType()+"-"+a.getCenterId())); List centerList = centerMapList.values().stream().map(a->a.get(0)).collect(Collectors.toList()); - + // TODO 有异常 for(TbsActivityCenter center : centerList){ TbsCostSubItem.CostCenterTranStr costCenter = centerRateService.buildCostCenter(center.getCenterType(),center.getCenterId(),center.getCenterName()); subList.add(costCenter); 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 50898fd2..3c939e98 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 @@ -5,8 +5,10 @@ import com.qs.serve.common.config.properties.ProjectApisProperties; 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.bms.entity.BmsCostCenter; import com.qs.serve.modules.bms.entity.BmsSubject; import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.BmsCostCenterService; import com.qs.serve.modules.bms.service.BmsSubjectService; import com.qs.serve.modules.bms.service.BmsSupplierService; import com.qs.serve.modules.goods.entity.GoodsCategory; @@ -77,6 +79,7 @@ public class PortalOfCostApplication { private BmsSupplierService supplierService; private BmsSubjectService subjectService; + private BmsCostCenterService costCenterService; private SysUserService userService; @@ -140,7 +143,6 @@ public class PortalOfCostApplication { //保存核销申请 VtbVerification verification = new VtbVerification(); verification.setVerificationCode("HX"+ IdUtil.timeStampId()); - verification.setVerificationMainCode(verification.getVerificationCode()); verification.setFinishedTime(nowTime); verification.setVerificationState(VtbVerificationState.Finished.getCode()); verification.setPolicyItemId(policyItem.getId()); @@ -417,7 +419,6 @@ public class PortalOfCostApplication { //保存核销申请 VtbVerification verification = new VtbVerification(); verification.setVerificationCode("HX"+ IdUtil.timeStampId()); - verification.setVerificationMainCode(verification.getVerificationCode()); verification.setFinishedTime(nowTime); verification.setVerificationState(VtbVerificationState.Finished.getCode()); verification.setActivityId(activity.getId()); @@ -540,6 +541,8 @@ public class PortalOfCostApplication { if(supplier==null){Assert.throwEx("客户不存在,请重新编辑");} BmsSubject subject = subjectService.getByCode(createBo.getSubjectCode()); if(subject==null){Assert.throwEx("科目不存在,请重新编辑");} + BmsCostCenter costCenter = costCenterService.getByCode(createBo.getCenterCode()); + if(costCenter==null){Assert.throwEx("成本中心不存在,请重新编辑");} //发票号 String billNumber = createBo.getBillNumber(); String disNumber = createBo.getErpCode(); @@ -567,7 +570,7 @@ public class PortalOfCostApplication { List skuList = this.initSkuListOfProcess(invCodeList); //常用参数 final String GOODS_TYPE = "sku"; - final String CENTER_TYPE = "customer"; + final String CENTER_TYPE = "center"; final BigDecimal OneHundred = new BigDecimal("100"); LocalDateTime nowTime = LocalDateTime.now(); LocalDate nowDate = LocalDate.now(); @@ -579,6 +582,10 @@ public class PortalOfCostApplication { String activityCode = costCode; + if(StringUtils.hasText(activityCode)){ + activityCode = CodeGenUtil.generate(CodeGenUtil.SourceKey.Activity); + } + String activityTitle = createBo.getActivityTitle(); if(!StringUtils.hasText(activityTitle)){ activityTitle = "由核销API生成的活动"; @@ -586,6 +593,7 @@ public class PortalOfCostApplication { //构建费用申请 TbsCostApply costApply = new TbsCostApply(); costApply.setCode(costCode); + costApply.setMatchType(1); costApply.setChargeTheme(costTheme); costApply.setChargeState(TbsCostApplyState.State_3_finished.getCode()); costApply.setSupplierId(supplierId); @@ -632,9 +640,9 @@ public class PortalOfCostApplication { activityCenter.setCenterAmount(totalAmount); activityCenter.setCenterRate(OneHundred); activityCenter.setCenterType(CENTER_TYPE); - activityCenter.setCenterId(supplier.getId()); - activityCenter.setCenterName(supplier.getName()); - activityCenter.setCenterCode(supplier.getCode()); + activityCenter.setCenterId(costCenter.getId()+""); + activityCenter.setCenterName(costCenter.getName()); + activityCenter.setCenterCode(costCenter.getCode()); activityCenter.setUsedAmount(totalAmount); //活动-商品 @@ -665,9 +673,9 @@ public class PortalOfCostApplication { centerGoods.setSupplierName(supplier.getName()); //设置成本中心 centerGoods.setCenterType(CENTER_TYPE); - centerGoods.setCenterId(supplier.getId()); - centerGoods.setCenterCode(supplier.getCode()); - centerGoods.setCenterName(supplier.getName()); + centerGoods.setCenterId(costCenter.getId()+""); + centerGoods.setCenterCode(costCenter.getCode()); + centerGoods.setCenterName(costCenter.getName()); centerGoods.setCenterRate(OneHundred); centerGoods.setCenterAmount(totalAmount); //设置科目 @@ -727,7 +735,7 @@ public class PortalOfCostApplication { Arrays.asList(activity), Arrays.asList(activitySubject), activityCenterGoodsList, - Arrays.asList(activityCenter),true,false,false); + Arrays.asList(activityCenter),false,false,false); //不匹配的商品,保存到无预算表 List unMatchBudgetItem = budgetCostResult.getBudgetUnMatchList(); @@ -763,8 +771,7 @@ public class PortalOfCostApplication { //保存核销申请 VtbVerification verification = new VtbVerification(); - verification.setVerificationCode("HX"+ CodeGenUtil.generate(CodeGenUtil.SourceKey.Verification)); - verification.setVerificationMainCode(verification.getVerificationCode()); + verification.setVerificationCode("MHX"+ CodeGenUtil.generate(CodeGenUtil.SourceKey.Verification)); verification.setCostApplyId(costApply.getId()); verification.setFinishedTime(nowTime); verification.setVerificationState(VtbVerificationState.Finished.getCode()); @@ -804,7 +811,7 @@ public class PortalOfCostApplication { ThirtyVerification tv = new ThirtyVerification(); tv.setId(IdUtil.getSnowFlakeId()+""); - tv.setVerificationCode(verification.getVerificationMainCode()); + tv.setVerificationCode(verificationSubject.getVerificationSubCode()); tv.setActivityTitle(activityTitle); //tv.setActivityCode(activityCode); tv.setCreateDate(timeString); @@ -815,17 +822,17 @@ public class PortalOfCostApplication { tv.setMoney(totalAmount); //tv.setCreateUser(); tv.setCreateTime(timeString); - tv.setCheckUser(user.getName()); + //tv.setCheckUser(user.getName()); tv.setCheckTime(timeString); tv.setCusCode(supplier.getCode()); tv.setCusName(supplier.getName()); - tv.setRecId(verificationSubject.getVerificationMainCode()); + tv.setRecId(verificationSubject.getVerificationSubCode()); String COST_TO_PAY_API = projectApisProperties.getCostToPay(); String json = JsonUtil.objectToJson(tv); - log.info("COST_TO_PAY_API 支付单信息:{} 数据:{}",verification.getVerificationMainCode(),json); + log.info("COST_TO_PAY_API 支付单信息:{} 数据:{}",verificationSubject.getVerificationSubCode(),json); String rs = HttpUtil.doPost(COST_TO_PAY_API,json,null); if(rs==null||!rs.contains("200")){ - log.error("COST_TO_PAY_API \n 请求参数:{},\n 支付单信息:{},\n 结果:{}",json,verification.getVerificationMainCode(),rs); + log.error("COST_TO_PAY_API \n 请求参数:{},\n 支付单信息:{},\n 结果:{}",json,verificationSubject.getVerificationSubCode(),rs); //核销调度接口事务补偿 costApplyService.removeById(costApply.getId()); activityService.removeById(activity.getId()); diff --git a/src/main/resources/mapper/bms/BmsChannelPointMapper.xml b/src/main/resources/mapper/bms/BmsChannelPointMapper.xml index 77d8e889..438c74f6 100644 --- a/src/main/resources/mapper/bms/BmsChannelPointMapper.xml +++ b/src/main/resources/mapper/bms/BmsChannelPointMapper.xml @@ -66,11 +66,14 @@ bms_channel_point.`update_by` - select + + select 'CostBill' as target_type, cost.id as target_id, cost.`code` as target_code, cost.charge_theme as title, - cost.submit_time - from tbs_cost_apply cost where cost.charge_state = 4 and cost.user_id = #{query.userId} and cost.del_flag = 0 - UNION - select + cost.submit_time as `time` + from tbs_cost_apply cost where cost.charge_state = 4 and cost.user_id = #{query.userId} and cost.del_flag = 0 + + and cost.charge_theme like concat('%',#{query.title},'%') + + + and cost.code like concat('%',#{query.targetCode},'%') + + + and cost.submit_time >= #{query.startDate} + + + and cost.submit_time <= #{query.endDate} + + + + select 'ReleasePolicy' as target_type, policy.id as target_id, policy.policy_code as target_code, policy.title, - policy.submit_time - from tzc_policy policy where policy.policy_status = 4 and policy.user_id = #{query.userId} and policy.del_flag = 0 - UNION - select + policy.submit_time as `time` + from tzc_policy policy where policy.policy_status = 4 and policy.user_id = #{query.userId} and policy.del_flag = 0 + + and policy.title like concat('%',#{query.title},'%') + + + and policy.policy_code like concat('%',#{query.targetCode},'%') + + + and policy.submit_time >= #{query.startDate} + + + and policy.submit_time <= #{query.endDate} + + + + + select 'CheckCost' as target_type, vtb.id as target_id, vtb.`verification_code` as target_code, act.act_title as title, - vtb.create_time as submit_time - from vtb_verification vtb - left join tbs_activity act on vtb.activity_id = act.id - where vtb.verification_state = 3 and vtb.user_id = #{query.userId} and act.del_flag = 0 and vtb.del_flag = 0 - UNION - select + vtb.create_time as `time` + from vtb_verification vtb + left join tbs_activity act on vtb.activity_id = act.id + where vtb.verification_state = 3 and vtb.user_id = #{query.userId} and act.del_flag = 0 and vtb.del_flag = 0 + + and act.act_title like concat('%',#{query.title},'%') + + + and vtb.`verification_code` like concat('%',#{query.targetCode},'%') + + + and vtb.create_time >= #{query.startDate} + + + and vtb.create_time <= #{query.endDate} + + + + + select 'budgetAdjust' as target_type, budget.id as target_id, budget.budget_number as target_code, budget.budget_code as title, - budget.submit_time - from tbs_budget budget - where budget.budget_check_state = 3 and budget.user_id = #{query.userId} and budget.del_flag = 0 - UNION - select + budget.submit_time as `time` + from tbs_budget budget + where budget.budget_check_state = 3 and budget.user_id = #{query.userId} and budget.del_flag = 0 + + and budget.budget_code like concat('%',#{query.title},'%') + + + and budget.budget_number like concat('%',#{query.targetCode},'%') + + + and budget.submit_time >= #{query.startDate} + + + and budget.submit_time <= #{query.endDate} + + + + + select 'budgetAdjust2' as target_type, budget_change.id as target_id, budget_change.change_code as target_code, budget_change.budget_title as title, - budget_change.submit_time - from tbs_budget_change budget_change - where budget_change.budget_check_state = 3 and budget_change.user_id = #{query.userId} and budget_change.del_flag = 0 + budget_change.submit_time as `time` + from tbs_budget_change budget_change + where budget_change.budget_check_state = 3 and budget_change.user_id = #{query.userId} and budget_change.del_flag = 0 + + and budget_change.budget_title like concat('%',#{query.title},'%') + + + and budget_change.change_code like concat('%',#{query.targetCode},'%') + + + and budget_change.submit_time >= #{query.startDate} + + + and budget_change.submit_time <= #{query.endDate} + + + + + select + 'CostBill' as target_type, + cost.id as target_id, + cost.`code` as target_code, + cost.charge_theme as title, + cost.submit_time as `time` + from tbs_cost_apply cost where cost.charge_state = 4 and cost.user_id = #{query.userId} and cost.del_flag = 0 + + and cost.charge_theme like concat('%',#{query.title},'%') + + + and cost.code like concat('%',#{query.targetCode},'%') + + + and cost.submit_time >= #{query.startDate} + + + and cost.submit_time <= #{query.endDate} + + UNION + select + 'ReleasePolicy' as target_type, + policy.id as target_id, + policy.policy_code as target_code, + policy.title, + policy.submit_time + from tzc_policy policy where policy.policy_status = 4 and policy.user_id = #{query.userId} and policy.del_flag = 0 + + and policy.title like concat('%',#{query.title},'%') + + + and policy.policy_code like concat('%',#{query.targetCode},'%') + + + and policy.submit_time >= #{query.startDate} + + + and policy.submit_time <= #{query.endDate} + + UNION + select + 'CheckCost' as target_type, + vtb.id as target_id, + vtb.`verification_code` as target_code, + act.act_title as title, + vtb.create_time as `time` + from vtb_verification vtb + left join tbs_activity act on vtb.activity_id = act.id + where vtb.verification_state = 3 and vtb.user_id = #{query.userId} and act.del_flag = 0 and vtb.del_flag = 0 + + and act.act_title like concat('%',#{query.title},'%') + + + and vtb.`verification_code` like concat('%',#{query.targetCode},'%') + + + and vtb.create_time >= #{query.startDate} + + + and vtb.create_time <= #{query.endDate} + + UNION + select + 'budgetAdjust' as target_type, + budget.id as target_id, + budget.budget_number as target_code, + budget.budget_code as title, + budget.submit_time as `time` + from tbs_budget budget + where budget.budget_check_state = 3 and budget.user_id = #{query.userId} and budget.del_flag = 0 + + and budget.budget_code like concat('%',#{query.title},'%') + + + and budget.budget_number like concat('%',#{query.targetCode},'%') + + + and budget.submit_time >= #{query.startDate} + + + and budget.submit_time <= #{query.endDate} + + UNION + select + 'budgetAdjust2' as target_type, + budget_change.id as target_id, + budget_change.change_code as target_code, + budget_change.budget_title as title, + budget_change.submit_time as `time` + from tbs_budget_change budget_change + where budget_change.budget_check_state = 3 and budget_change.user_id = #{query.userId} and budget_change.del_flag = 0 + + and budget_change.budget_title like concat('%',#{query.title},'%') + + + and budget_change.change_code like concat('%',#{query.targetCode},'%') + + + and budget_change.submit_time >= #{query.startDate} + + + and budget_change.submit_time <= #{query.endDate} + + limit #{query.startRow},#{query.pageSize} diff --git a/src/main/resources/mapper/tbs/TbsBudgetMapper.xml b/src/main/resources/mapper/tbs/TbsBudgetMapper.xml index 84137fc6..cde26ca5 100644 --- a/src/main/resources/mapper/tbs/TbsBudgetMapper.xml +++ b/src/main/resources/mapper/tbs/TbsBudgetMapper.xml @@ -79,8 +79,9 @@ #{selectId} - and `tbs_budget`.`budget_number` like concat('%',#{query.budgetNumber},'%') + and `tbs_budget`.`budget_number` like concat('%',#{query.budgetNumber},'%') and `tbs_budget`.`budget_state` = #{query.budgetState} + and `tbs_budget`.`budget_check_state` = #{query.budgetCheckState} and `tbs_budget`.`budget_code` like concat('%',#{query.budgetCode},'%') and ( @@ -98,7 +99,7 @@ and `tbs_budget`.`schedule_id` = #{query.scheduleId} and `tbs_budget`.`schedule_code` = #{query.scheduleCode} - and `tbs_budget`.`schedule_name` = #{query.scheduleName} + and `tbs_budget`.`schedule_name` like concat('%',#{query.scheduleName},'%') and ( `tbs_budget_condition`.`target_type` = 'brand' diff --git a/src/main/resources/mapper/tbs/TbsCostApplyMapper.xml b/src/main/resources/mapper/tbs/TbsCostApplyMapper.xml index 90ee5873..4605ac65 100644 --- a/src/main/resources/mapper/tbs/TbsCostApplyMapper.xml +++ b/src/main/resources/mapper/tbs/TbsCostApplyMapper.xml @@ -51,6 +51,7 @@ tbs_cost_apply.`supplier_biz_region_second_name`, tbs_cost_apply.`supplier_biz_region_third_name`, tbs_cost_apply.`charge_state`, + tbs_cost_apply.`check_state`, tbs_cost_apply.`submit_time`, tbs_cost_apply.`pass_time`, tbs_cost_apply.`remark`, @@ -142,6 +143,7 @@ + and `tbs_cost_apply`.`check_state` = #{query.checkState} and `tbs_cost_apply`.`id` = #{query.id} and `tbs_cost_apply`.`code` like concat('%', #{query.code},'%') and `tbs_cost_apply`.`charge_theme` like concat('%', #{query.chargeTheme},'%')