From 0d1713787eec87939f5a6595107dc38c2b48b649 Mon Sep 17 00:00:00 2001 From: Yen Date: Wed, 19 Jul 2023 15:36:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=8F=E8=AE=AE=E7=B1=BB=E8=B4=B9=E7=94=A8?= =?UTF-8?q?=E7=94=B3=E8=AF=B7=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/tbs/common/TbsSeeYonConst.java | 6 + .../entity/dto/TbsContractCostSubItem.java | 53 ++++ .../TbsCostApplyOperationServiceImpl.java | 108 +++++++- .../service/impl/TbsCostApplyServiceImpl.java | 233 +++++++++++++----- 4 files changed, 339 insertions(+), 61 deletions(-) create mode 100644 src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsContractCostSubItem.java diff --git a/src/main/java/com/qs/serve/modules/tbs/common/TbsSeeYonConst.java b/src/main/java/com/qs/serve/modules/tbs/common/TbsSeeYonConst.java index 7d373232..1f513b35 100644 --- a/src/main/java/com/qs/serve/modules/tbs/common/TbsSeeYonConst.java +++ b/src/main/java/com/qs/serve/modules/tbs/common/TbsSeeYonConst.java @@ -24,6 +24,12 @@ public interface TbsSeeYonConst { return DevEnvironmentConfig.isDev()?"CostBill_Test":"CostBill"; } } + /** 费用申请2-协议类 */ + class CostApplyContractConf{ + public static String Code(){ + return DevEnvironmentConfig.isDev()?"contractApply_Test":"contractApply"; + } + } /** 核销 */ class CostCheckConf{ 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 new file mode 100644 index 00000000..baf4128a --- /dev/null +++ b/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsContractCostSubItem.java @@ -0,0 +1,53 @@ +package com.qs.serve.modules.tbs.entity.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; + +/** + * @author YenHex + * @since 2023/5/9 + */ +public class TbsContractCostSubItem { + + @Data + public static class Activity{ + private String activityCode; + private String activityPurpose; + private String costCode; + private LocalDate startDate; + private LocalDate endDate; + private LocalDate writeOffDate; + private String productType; + private String product; + private String accountCode; + private String accountName; + private String costCenterNo; + private String costCenterName; + private BigDecimal costMoney; + + } + + @Data + public static class Payment{ + private String payItem; + private String payCondition; + private BigDecimal money; + private LocalDate payDate; + private String actualPayDate; + private Integer payCompleteState; + private String payRemark; + } + + @Data + public static class ToDoItem{ + private String serviceDescription; + private String deliveryStandard; + private LocalDate deliveryDate; + private String agreeRemark; + + } + +} diff --git a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyOperationServiceImpl.java b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyOperationServiceImpl.java index c5e8502f..7a432219 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyOperationServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyOperationServiceImpl.java @@ -5,9 +5,16 @@ 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.util.Assert; +import com.qs.serve.common.util.AuthContextUtils; +import com.qs.serve.common.util.StringUtils; import com.qs.serve.modules.seeyon.entity.CtpAffair; +import com.qs.serve.modules.seeyon.entity.SyAffairStateResult; +import com.qs.serve.modules.seeyon.entity.bo.CtpAddNodeDTO; +import com.qs.serve.modules.seeyon.entity.bo.CtpAddNodeParam; +import com.qs.serve.modules.seeyon.enums.SyAffairState; import com.qs.serve.modules.seeyon.service.SeeYonOperationService; import com.qs.serve.modules.seeyon.service.SeeYonRequestService; +import com.qs.serve.modules.sys.entity.SysUser; import com.qs.serve.modules.sys.mapper.SysUserMapper; import com.qs.serve.modules.sys.service.SysUserService; import com.qs.serve.modules.tbs.common.TbsActivityState; @@ -28,7 +35,9 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.stream.Collectors; /** @@ -68,6 +77,43 @@ public class TbsCostApplyOperationServiceImpl implements SeeYonOperationService return TbsSeeYonConst.CostApplyConf.Code(); } + @Override + public R addNode(CtpAddNodeParam param) { + getRequestService().testConnection(); + TbsCostApply tbsCostApply = costApplyService.getById(param.getTargetId()); + CtpAddNodeDTO addNodeDTO = new CtpAddNodeDTO(); + addNodeDTO.setBackToMe(param.getBackToMe()); + addNodeDTO.setTargetId(param.getTargetId()); + List selectUserIds = new ArrayList<>(); + SysUser loginUser = getUserMapper().selectById(AuthContextUtils.getSysUserId()); + for (String userId : param.getUserIds()) { + SysUser user = getUserMapper().selectById(userId); + if(loginUser.getSyUserId().equals(user.getSyUserId())){ + return R.error("不能选择相同的OA账号的员工"); + } + if(StringUtils.hasText(user.getSyUserId())&&!user.getSyUserId().equals("0")){ + selectUserIds.add(user.getSyUserId()); + } + } + if(selectUserIds.size()==0){ + Assert.throwEx("选中的用户未绑定OA凭证"); + } + addNodeDTO.setUserIds(selectUserIds); + SysUser sysUser = getUserMapper().selectById(AuthContextUtils.getSysUserId()); + addNodeDTO.setUserCode(sysUser.getAccount()); + addNodeDTO.setUserSyId(sysUser.getSyUserId()); + String templateCode = getTemplateCode(); + if(tbsCostApply.getContractFlag()!=null&&tbsCostApply.getContractFlag().equals(1)){ + addNodeDTO.setTemplateCode(TbsSeeYonConst.CostApplyContractConf.Code()); + } + addNodeDTO.setTemplateCode(templateCode); + R result = getRequestService().addNode(addNodeDTO); + if(result.getData()!=null&&result.getData().toLowerCase(Locale.ROOT).contains("ok")){ + return R.ok(); + } + return R.error(result.getMsg()); + } + @Override public SeeYonRequestService getRequestService() { return requestService; @@ -187,7 +233,42 @@ public class TbsCostApplyOperationServiceImpl implements SeeYonOperationService @Override public R commitAffair(TbsAffairCommitBo affairCommit) { - return SeeYonOperationService.super.commitAffair(affairCommit); + getRequestService().testConnection(); + TbsCostApply costApply = costApplyService.getById(affairCommit.getCostApplyId()); + if(!costApply.getChargeState().equals(TbsCostApplyState.State_1_apply.getCode())){ + Assert.throwEx("费用申请处于未非审批状态"); + } + String syFormId = costApply.getSyFormId(); + String templateCode = getTemplateCode(); + //判断是否协议类 + if(costApply.getContractFlag()!=null&&costApply.getContractFlag().equals(1)){ + templateCode = TbsSeeYonConst.CostApplyContractConf.Code(); + } + R result = getRequestService().commonCommit(affairCommit, templateCode ,syFormId); + boolean isBackCommit = affairCommit.getState()==2; + if(result.getStatus()==200){ + // 判断是否含有下个节点 + String flag = result.getData(); + //审批中(next)、完成(finish)、拒绝(refused) + if("finish".equals(flag)){ + this.doFinished(affairCommit); + return R.ok(); + }else if ("stop".equals(flag)){ + if(isBackCommit){ + this.doBacked(affairCommit); + return R.ok(); + }else { + this.doRefuse(affairCommit); + return R.ok(); + } + }else if ("next".equals(flag)){ + this.doNext(affairCommit); + return R.ok(); + } + }else if (result.getStatus()==500){ + return result; + } + return R.ok(); } @Override @@ -236,4 +317,29 @@ public class TbsCostApplyOperationServiceImpl implements SeeYonOperationService } return null; } + + @Override + public R runCompensate(String targetId) { + testConnection(); + String templateCode = getTemplateCode(); + TbsCostApply costApply = costApplyService.getById(targetId); + if(costApply.getContractFlag()!=null&&costApply.getContractFlag().equals(1)){ + templateCode = TbsSeeYonConst.CostApplyContractConf.Code(); + } + SyAffairStateResult stateResult =checkAffairState(targetId,templateCode); + SyAffairState affairState = stateResult.getState(); + if(affairState.equals(SyAffairState.next)){ + return R.ok(compensateNext(targetId)); + }else if(affairState.equals(SyAffairState.backed)){ + return R.ok(compensateBacked(targetId)); + }else if(affairState.equals(SyAffairState.finished)){ + return R.ok(compensateFinished(targetId)); + }else if(affairState.equals(SyAffairState.refuse)){ + return R.ok(compensateRefuse(targetId)); + }else if(affairState.equals(SyAffairState.error)){ + return R.error("数据异常请联系管理员"); + }else{ + return R.error("OA无相关审批数据"); + } + } } 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 a887ef2a..b6437f79 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 @@ -40,6 +40,7 @@ import com.qs.serve.modules.tbs.common.util.TbsBudgetLogBuildUtil; import com.qs.serve.modules.tbs.entity.*; import com.qs.serve.modules.tbs.entity.dto.TbsCenterGoodBirDTO; import com.qs.serve.modules.tbs.entity.dto.TbsBudgetCostResult; +import com.qs.serve.modules.tbs.entity.dto.TbsContractCostSubItem; import com.qs.serve.modules.tbs.entity.dto.TbsCostSubItem; import com.qs.serve.modules.tbs.mapper.*; import com.qs.serve.modules.tbs.service.*; @@ -80,14 +81,17 @@ public class TbsCostApplyServiceImpl extends ServiceImpl payConditions = null; if(tbsCostApply.getContractFlag()!=null&&tbsCostApply.getContractFlag().equals(1)){ LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw.eq(TbsActivityPayCondition::getCostApplyId,id); - List payConditions = tbsActivityPayConditionMapper.selectList(lqw); + payConditions = tbsActivityPayConditionMapper.selectList(lqw); if(payConditions.size()<1){ Assert.throwEx("请补充支付条件"); } @@ -212,71 +217,113 @@ public class TbsCostApplyServiceImpl extends ServiceImpl data = new HashMap<>(10); - String actTitles = activityList.stream().map(TbsActivity::getActTitle).collect(Collectors.joining("; ")); - data.put("costApplyCode",tbsCostApply.getCode()); - data.put("applyUserCode",sysUser.getCode()); - data.put("applyUserName",sysUser.getName()); - data.put("supplierName",tbsCostApply.getSupplierName()); - data.put("supplierCode",tbsCostApply.getSupplierCode()); - data.put("title",tbsCostApply.getChargeTheme()); - data.put("rowDate",DateUtils.format(LocalDateTime.now(), DateFormatString.DATE_TIME)); - data.put("rowState","03"); - data.put("orgId",tbsCostApply.getId()+""); - data.put("targetId",tbsCostApply.getId()+""); - data.put("targetCode",tbsCostApply.getCode()); - data.put("exsp1",TbsSeeYonConst.CostApplyConf.Code()); - data.put("money",tbsCostApply.getTotalActivityAmount()); - - //记录主表费率参数 - try { - this.buildMainData4ROI(tbsCostApply, data); - } catch (Exception e) { - e.printStackTrace(); - } + if(tbsCostApply.getContractFlag()!=null&&tbsCostApply.getContractFlag().equals(1)){ + //创建协议类data数据 + data.put("serialNumber",tbsCostApply.getCode()); + data.put("applySubject",tbsCostApply.getChargeTheme()); + data.put("supplierCode",tbsCostApply.getSupplierCode()); + data.put("supplierName",tbsCostApply.getSupplierName()); + data.put("totalSalesMoney",tbsCostApply.getTotalActivityAmount()); + data.put("totalExpenseRate",tbsCostApply.getTotalActivityPreNotAmount()); + data.put("remark",tbsCostApply.getRemark()); +// data.put("payee",""); +// data.put("bankName",""); +// data.put("bankAccount",""); +// data.put("sealID",""); +// data.put("sealName",""); +// data.put("sealNum",""); +// data.put("fileNum",""); + + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsCostContract::getCostApplyId,tbsCostApply.getId()); + List contracts = costContractMapper.selectList(lqw); + if(contracts.size()>0){ + TbsCostContract contract = contracts.get(0); + data.put("contractName",contract.getContractName()); + data.put("applyMoney",contract.getContractAmount()); + data.put("signDate",contract.getSignTime()); + data.put("expireDate",contract.getExpireTime()); + data.put("contractContent",contract.getContractCondition()); + //data.put("contractFile",""); + } - //拓展添加审批关联区域 - String saleRegionId = supplier.handleSaleRegionId(); - String bizRegionId = supplier.handleBizRegionId(); - BmsRegion saleRegion = regionMapper.selectById(saleRegionId); - BmsRegion2 bizRegion = region2Mapper.selectById(bizRegionId); - String saleRegionNames = saleRegion!=null?saleRegion.getPathNames():"null_申请时未录入"; - String bizRegionNames = bizRegion!=null?bizRegion.getPathNames():"null_申请时未录入"; + //创建子表数据 + List 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()); + dataActivity.setEndDate(currActivity.getActEndDate()); + dataActivity.setWriteOffDate(currActivity.getPreCheckDate()); + dataActivity.setProductType(centerGoods.getTargetType()); + dataActivity.setProduct(centerGoods.getTargetName()); + dataActivity.setAccountCode(centerGoods.getSubjectCode()); + dataActivity.setAccountName(centerGoods.getSubjectName()); + dataActivity.setCostCenterNo(centerGoods.getCenterType()); + dataActivity.setCostCenterName(centerGoods.getCenterName()); + dataActivity.setCostMoney(centerGoods.getCenterGoodsAmount()); + subList.add(dataActivity); + } - //拓展添加审批关联 - data.put("biz_region",bizRegionNames); - data.put("exsp2",saleRegionNames); - data.put("data_state",TbsCostApplyState.State_1_apply.getCode()+""); + // 付款条件 + for (TbsActivityPayCondition payCondition : payConditions) { + TbsActivity currActivity = null; + for (TbsActivity activity : activityList) { + if(payCondition.getActivityId().equals(activity.getId())){ + currActivity = activity; + break; + } + } + TbsContractCostSubItem.Payment subPayment = new TbsContractCostSubItem.Payment(); + subPayment.setPayItem(payCondition.getTitle()); + subPayment.setPayCondition(payCondition.getConditionMsg()); + subPayment.setMoney(currActivity.getTotalAmount()); + subPayment.setPayDate(payCondition.getPaymentDate()); + subPayment.setActualPayDate(null); + subPayment.setPayCompleteState(payCondition.getPreNotifyStatus()); + subPayment.setPayRemark(payCondition.getRemark()); + subList.add(subPayment); + } - //添加跳转地址业务 - String urlKey = "exsp5"+IdUtil.simpleUUID(); - String baseJumpUrl = JumpToUtil.getUrl(projectProperties.getHostUrl(),TbsSeeYonConst.CostApplyConf.Code(),urlKey); - data.put("exsp5",urlKey); - data.put("cmsLink",baseJumpUrl); - data.put("activitySummary",actTitles); + // 协议条款 + LambdaQueryWrapper todoLqw = new LambdaQueryWrapper<>(); + todoLqw.eq(TbsCostTodo::getCostApplyId,tbsCostApply.getId()); + List costTodoList = tbsCostTodoMapper.selectList(todoLqw); + for (TbsCostTodo costTodo : costTodoList) { + TbsContractCostSubItem.ToDoItem toDoItem = new TbsContractCostSubItem.ToDoItem(); + toDoItem.setServiceDescription(costTodo.getDescr()); + toDoItem.setDeliveryStandard(costTodo.getPayMsg()); + toDoItem.setDeliveryDate(costTodo.getPrePayDate()); + toDoItem.setAgreeRemark(costTodo.getRemark()); + subList.add(toDoItem); + } + //关联 + data.put("sub", subList); - //添加科目和成本中心 - List tbsActivityCenters = tbsActivityCenterService.listByCostApplyId(Long.parseLong(id)); - List tbsActivitySubjects = tbsActivitySubjectService.listByCostApplyId(Long.parseLong(id)); - List subjectNames = tbsActivitySubjects.stream().map(TbsActivitySubject::getSubjectName).distinct().collect(Collectors.toList()); - List subList = new ArrayList<>(); - //创建子表数据 - try { - this.buildSubList(result, tbsActivityCenters, subjectNames, subList); - } catch (Exception e) { - e.printStackTrace(); - } - //创建商品抬头列表 - List tbsActivityGoods = tbsActivityGoodsService.listByCostApplyId(Long.parseLong(id)); - Set bands = new HashSet<>(); - for (TbsActivityGoods tbsActivityGood : tbsActivityGoods) { - String band = tbsActivityGood.getTargetLevelPathNames().split("_")[0]; - bands.add(band); + }else { + //创建通用的费用申请Data + this.buildCommonApplyData(id, tbsCostApply, activityList, supplier, result, sysUser, data); } - String goods = bands.stream().collect(Collectors.joining(",")); - data.put("chanPinPinLei",goods); - data.put("sub",subList); + //修改申请编码 + String templateCode = tbsCostApply.getCostThemeEditFlag().equals(1) + ?TbsSeeYonConst.CostApplyContractConf.Code() + :TbsSeeYonConst.CostApplyConf.Code(); BaseCreateProcessBo createProcess = new BaseCreateProcessBo(); - createProcess.setTemplateCode(TbsSeeYonConst.CostApplyConf.Code()); + createProcess.setTemplateCode(templateCode); createProcess.setMemberLoginName(sysUser.getSyAccount()); createProcess.setSubjectTitle(TbsSeeYonConst.PRE_TITLE_COST_APPLY + tbsCostApply.getChargeTheme()); createProcess.setTargetId(tbsCostApply.getId()+""); @@ -358,6 +405,72 @@ public class TbsCostApplyServiceImpl extends ServiceImpl activityList, BmsSupplier supplier, TbsBudgetCostResult result, SysUser sysUser, Map data) { + String actTitles = activityList.stream().map(TbsActivity::getActTitle).collect(Collectors.joining("; ")); + data.put("costApplyCode", tbsCostApply.getCode()); + data.put("applyUserCode", sysUser.getCode()); + data.put("applyUserName", sysUser.getName()); + data.put("supplierName", tbsCostApply.getSupplierName()); + data.put("supplierCode", tbsCostApply.getSupplierCode()); + data.put("title", tbsCostApply.getChargeTheme()); + data.put("rowDate",DateUtils.format(LocalDateTime.now(), DateFormatString.DATE_TIME)); + data.put("rowState","03"); + data.put("orgId", tbsCostApply.getId()+""); + data.put("targetId", tbsCostApply.getId()+""); + data.put("targetCode", tbsCostApply.getCode()); + data.put("exsp1",TbsSeeYonConst.CostApplyConf.Code()); + data.put("money", tbsCostApply.getTotalActivityAmount()); + + //记录主表费率参数 + try { + this.buildMainData4ROI(tbsCostApply, data); + } catch (Exception e) { + e.printStackTrace(); + } + + //拓展添加审批关联区域 + String saleRegionId = supplier.handleSaleRegionId(); + String bizRegionId = supplier.handleBizRegionId(); + BmsRegion saleRegion = regionMapper.selectById(saleRegionId); + BmsRegion2 bizRegion = region2Mapper.selectById(bizRegionId); + String saleRegionNames = saleRegion!=null?saleRegion.getPathNames():"null_申请时未录入"; + String bizRegionNames = bizRegion!=null?bizRegion.getPathNames():"null_申请时未录入"; + + //拓展添加审批关联 + data.put("biz_region",bizRegionNames); + data.put("exsp2",saleRegionNames); + data.put("data_state",TbsCostApplyState.State_1_apply.getCode()+""); + + //添加跳转地址业务 + String urlKey = "exsp5"+IdUtil.simpleUUID(); + String baseJumpUrl = JumpToUtil.getUrl(projectProperties.getHostUrl(),TbsSeeYonConst.CostApplyConf.Code(),urlKey); + data.put("exsp5",urlKey); + data.put("cmsLink",baseJumpUrl); + data.put("activitySummary",actTitles); + + //添加科目和成本中心 + List tbsActivityCenters = tbsActivityCenterService.listByCostApplyId(Long.parseLong(id)); + List tbsActivitySubjects = tbsActivitySubjectService.listByCostApplyId(Long.parseLong(id)); + List subjectNames = tbsActivitySubjects.stream().map(TbsActivitySubject::getSubjectName).distinct().collect(Collectors.toList()); + List subList = new ArrayList<>(); + //创建子表数据 + try { + this.buildSubList(result, tbsActivityCenters, subjectNames, subList); + } catch (Exception e) { + e.printStackTrace(); + } + //创建商品抬头列表 + List tbsActivityGoods = tbsActivityGoodsService.listByCostApplyId(Long.parseLong(id)); + Set bands = new HashSet<>(); + for (TbsActivityGoods tbsActivityGood : tbsActivityGoods) { + String band = tbsActivityGood.getTargetLevelPathNames().split("_")[0]; + bands.add(band); + } + String goods = bands.stream().collect(Collectors.joining(",")); + data.put("chanPinPinLei",goods); + data.put("sub",subList); + } + /** * 记录主表费率参数 * @param tbsCostApply