diff --git a/pom.xml b/pom.xml
index e10c5f69..d7146001 100644
--- a/pom.xml
+++ b/pom.xml
@@ -114,6 +114,7 @@
${fastjson.version}
+
com.github.pagehelper
pagehelper-spring-boot-starter
diff --git a/src/main/java/com/qs/serve/common/util/JsonUtil.java b/src/main/java/com/qs/serve/common/util/JsonUtil.java
index 2e7c66b7..69fae846 100644
--- a/src/main/java/com/qs/serve/common/util/JsonUtil.java
+++ b/src/main/java/com/qs/serve/common/util/JsonUtil.java
@@ -7,6 +7,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.experimental.UtilityClass;
import java.util.ArrayList;
@@ -31,6 +32,7 @@ public class JsonUtil {
static {
MAPPER.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+ //MAPPER.registerModule(new JavaTimeModule());
}
/**
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 d75ccb76..24bd83b8 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..34cf01ed
--- /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 String startDate;
+ private String endDate;
+ private String writeOffDate;
+ private String productType;
+ private String product;
+ private String accountCode;
+ private String accountName;
+ private String costCenterNo;
+ private String costCenterName;
+ private BigDecimal applyMoney;
+
+ }
+
+ @Data
+ public static class Payment{
+ private String payItem;
+ private String payCondition;
+ private BigDecimal money;
+ private String payDate;
+ private String actualPayDate;
+ private Integer payCompleteState;
+ private String payRemark;
+ }
+
+ @Data
+ public static class ToDoItem{
+ private String serviceDescription;
+ private String deliveryStandard;
+ private String 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..783fc9ad 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,10 +5,20 @@ 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.SpringUtils;
+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.SysPostUser;
+import com.qs.serve.modules.sys.entity.SysUser;
import com.qs.serve.modules.sys.mapper.SysUserMapper;
+import com.qs.serve.modules.sys.service.SysPostUserService;
import com.qs.serve.modules.sys.service.SysUserService;
import com.qs.serve.modules.tbs.common.TbsActivityState;
import com.qs.serve.modules.tbs.common.TbsCostApplyState;
@@ -28,7 +38,10 @@ 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.Map;
import java.util.stream.Collectors;
/**
@@ -68,11 +81,101 @@ public class TbsCostApplyOperationServiceImpl implements SeeYonOperationService
return TbsSeeYonConst.CostApplyConf.Code();
}
+
+ @Override
+ public String checkAffairSummery(String targetId) {
+ TbsCostApply tbsCostApply = costApplyService.getById(targetId);
+ String templateCode = getTemplateCode();
+ if(tbsCostApply.getContractFlag()!=null&&tbsCostApply.getContractFlag().equals(1)){
+ templateCode = TbsSeeYonConst.CostApplyContractConf.Code();
+ }
+ R result = getRequestService().checkAffairSummery(templateCode,targetId);
+ if(result.getData()==null){
+ return "next";
+ }
+ return result.getData();
+ }
+
+ @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)){
+ templateCode = 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;
}
+ @Override
+ public R> pageAffair(String targetId) {
+ boolean existFormId = checkSyFormIdIsNotNull(targetId);
+ if (!existFormId){
+ return R.ok(new ArrayList<>());
+ }
+ String templateCode = getTemplateCode();
+ TbsCostApply costApply = costApplyService.getById(targetId);
+ if(costApply.getContractFlag()!=null&&costApply.getContractFlag().equals(1)){
+ templateCode = TbsSeeYonConst.CostApplyContractConf.Code();
+ }
+ R> syResult = getRequestService().commonListAffairs(targetId,null,templateCode);
+ List ctpAffairs = syResult.getData();
+ if(ctpAffairs.size()>0){
+ List oaUserIds = ctpAffairs.stream().map(CtpAffair::getMemberId).collect(Collectors.toList());
+ List userList = getSysUserService().listByOaMemberIds(oaUserIds);
+ SysPostUserService postUserService = SpringUtils.getBean(SysPostUserService.class);
+ List userIds = userList.stream().map(SysUser::getId).collect(Collectors.toList());
+ List postUserList = postUserService.listByUserIds(userIds);
+ Map> postMap = postUserList.stream().collect(Collectors.groupingBy(SysPostUser::getUserId));
+ List result = new ArrayList<>();
+ for (CtpAffair ctpAffair : ctpAffairs) {
+ CtpAffairVo ctpAffairVo = new CtpAffairVo();
+ ctpAffairVo.setAffairInfo(ctpAffair);
+ for (SysUser user : userList) {
+ if(ctpAffair.getMemberId().equals(user.getSyUserId())){
+ ctpAffairVo.setUserInfo(user.toSysUserVo());
+ List postUsers = postMap.get(user.getId());
+ ctpAffairVo.setUserPostList(postUsers);
+ }
+ }
+ result.add(ctpAffairVo);
+ }
+ return R.ok(result);
+ }
+ return R.ok(new ArrayList<>());
+ }
+
@Override
public SysUserMapper getUserMapper() {
return userMapper;
@@ -187,7 +290,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 +374,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 ca1ce96c..8f546549 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
@@ -14,8 +14,6 @@ import com.qs.serve.common.util.model.DateFormatString;
import com.qs.serve.modules.bir.entity.BirActivityCenterGoods;
import com.qs.serve.modules.bir.entity.dto.BirRoiCostDTO;
import com.qs.serve.modules.bir.entity.vo.YtdQtdToOAVo;
-import com.qs.serve.modules.bir.service.BirActivityCenterGoodsService;
-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;
@@ -42,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.*;
@@ -83,17 +82,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("请补充支付条件");
}
@@ -218,68 +218,147 @@ 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)){
- //拓展添加审批关联区域
- 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("title",tbsCostApply.getChargeTheme());
+ data.put("orgId",tbsCostApply.getId().toString());
+ 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("targetId", tbsCostApply.getId()+"");
+ data.put("targetCode", tbsCostApply.getCode());
+ data.put("exsp1",TbsSeeYonConst.CostApplyContractConf.Code());
+ //添加跳转地址业务
+ 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("rowDate",DateUtils.format(LocalDateTime.now(), DateFormatString.DATE_TIME));
+ data.put("rowState","03");
+
+ //拓展添加审批关联区域
+ 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("dataState",TbsCostApplyState.State_1_apply.getCode()+"");
+
+ //创建协议类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","0");
+ data.put("fileNum","0");
+
+ 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("contractTotalMoney",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());
+ data.put("contractFile","");
+ }
- //拓展添加审批关联
- data.put("biz_region",bizRegionNames);
- data.put("exsp2",saleRegionNames);
- data.put("data_state",TbsCostApplyState.State_1_apply.getCode()+"");
+ //创建子表数据
+ List