ContractUpdateFlow.java 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package com.fjhx.sale.flow;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
  5. import com.fjhx.common.enums.FlowStatusEnum1;
  6. import com.fjhx.common.utils.Assert;
  7. import com.fjhx.flow.core.FlowDelegate;
  8. import com.fjhx.flow.enums.FlowStatusEnum;
  9. import com.fjhx.sale.entity.contract.dto.ContractDto;
  10. import com.fjhx.sale.entity.contract.po.Contract;
  11. import com.fjhx.sale.entity.contract.po.ContractProduct;
  12. import com.fjhx.sale.entity.contract.po.ContractProject;
  13. import com.fjhx.sale.entity.contract.po.ContractShipment;
  14. import com.fjhx.sale.service.contract.ContractProductService;
  15. import com.fjhx.sale.service.contract.ContractService;
  16. import com.ruoyi.common.core.domain.BaseIdPo;
  17. import com.ruoyi.common.core.domain.BasePo;
  18. import com.ruoyi.common.exception.ServiceException;
  19. import com.ruoyi.common.utils.SecurityUtils;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. import org.springframework.stereotype.Component;
  22. import java.math.BigDecimal;
  23. import java.util.Date;
  24. import java.util.List;
  25. import java.util.Map;
  26. import java.util.function.Function;
  27. import java.util.regex.Matcher;
  28. import java.util.regex.Pattern;
  29. import java.util.stream.Collectors;
  30. /**
  31. * 合同变更流程
  32. */
  33. @Component
  34. public class ContractUpdateFlow extends FlowDelegate {
  35. @Autowired
  36. private ContractFlow contractFlow;
  37. @Autowired
  38. private ContractService contractService;
  39. @Autowired
  40. private ContractProductService contractProductService;
  41. @Override
  42. public String getFlowKey() {
  43. return "contract_update_flow";
  44. }
  45. /**
  46. * 发起流程
  47. *
  48. * @param flowId 流程ID
  49. * @param submitData 采购付款数据
  50. * @return
  51. */
  52. @Override
  53. public Long start(Long flowId, JSONObject submitData) {
  54. ContractDto contract = submitData.toJavaObject(ContractDto.class);
  55. Assert.notEmpty(contract.getOldContractId(), "原合同id不能为空");
  56. //变更 用原来合同号加后缀
  57. Contract oldContract = contractService.getById(contract.getOldContractId());
  58. Assert.notEmpty(oldContract, "查询不到原合同信息");
  59. String code = oldContract.getCode();
  60. Matcher matcher = Pattern.compile(".*\\((.*?)\\)$").matcher(code);
  61. int index = 2;
  62. if (matcher.find()) {
  63. index = (Integer.parseInt(matcher.group(1)) + 1);
  64. code = code.substring(0, code.lastIndexOf("("));
  65. }
  66. contract.setCode(code + "(" + index + ")");
  67. //变更合同提前操作数据
  68. contract = opDate(contract);
  69. //清空id 方便后面生成新合同
  70. contract.setId(null);
  71. // 清空合同产品id
  72. List<ContractProduct> contractProductList = contract.getContractProductList();
  73. if (CollectionUtils.isNotEmpty(contractProductList)) {
  74. contractProductList.forEach(item -> item.setId(null));
  75. }
  76. // 清空收费项目id
  77. List<ContractProject> contractProjectList = contract.getContractProjectList();
  78. if (CollectionUtils.isNotEmpty(contractProjectList)) {
  79. contractProjectList.forEach(item -> item.setId(null));
  80. }
  81. // 清空自定义出货id
  82. List<ContractShipment> contractShipmentList = contract.getContractShipmentList();
  83. if (CollectionUtils.isNotEmpty(contractShipmentList)) {
  84. contractShipmentList.forEach(item -> item.setId(null));
  85. }
  86. contract = contractFlow.commStart(contract, 0);
  87. return contract.getId();
  88. }
  89. /**
  90. * 结束流程
  91. *
  92. * @param flowId 流程ID
  93. * @param businessId 业务ID
  94. * @param submitData 数据
  95. */
  96. @Override
  97. public void end(Long flowId, Long businessId, JSONObject submitData) {
  98. contractFlow.end(flowId, businessId, submitData);
  99. // 通过业务id查询合同数据
  100. Contract contract = contractService.getById(businessId);
  101. // 原合同改为作废状态
  102. Long oldContractId = contract.getOldContractId();
  103. Contract oldContract = contractService.getById(oldContractId);
  104. if (oldContract == null) {
  105. throw new ServiceException("原合同不存在");
  106. }
  107. oldContract.setStatus(FlowStatusEnum1.UPDATE.getKey());
  108. oldContract.setIsChange("1");
  109. contractService.updateById(oldContract);
  110. }
  111. @Override
  112. public void defaultMethod(Long flowId, Long businessId, FlowStatusEnum flowStatusEnum, JSONObject submitData) {
  113. //重新发起
  114. if (FlowStatusEnum.READY_START.equals(flowStatusEnum)) {
  115. reStart(submitData);
  116. }
  117. //驳回
  118. if (FlowStatusEnum.REJECT.equals(flowStatusEnum)) {
  119. reject(businessId);
  120. }
  121. }
  122. /**
  123. * 变更合同时执行的数据操作公共代码
  124. */
  125. private ContractDto opDate(ContractDto contract) {
  126. // 原合同id不能为空
  127. Long oldContractId = contract.getOldContractId();
  128. if (oldContractId == null) {
  129. throw new ServiceException("原合同id不能为空");
  130. }
  131. List<ContractProduct> list = contractProductService.list(q -> q.eq(ContractProduct::getContractId, oldContractId));
  132. // 赋值待处理数量
  133. if (CollectionUtils.isNotEmpty(list)) {
  134. List<ContractProduct> contractProductList = contract.getContractProductList();
  135. if (ObjectUtil.isEmpty(contractProductList)) {
  136. throw new ServiceException("没有合同产品");
  137. }
  138. Map<Long, ContractProduct> contractProductMap = contractProductList
  139. .stream()
  140. .filter(item -> ObjectUtil.isNotEmpty(item.getId()))
  141. .collect(Collectors.toMap(BaseIdPo::getId, Function.identity()));
  142. for (ContractProduct item : list) {
  143. ContractProduct contractProduct = contractProductMap.get(item.getId());
  144. if (ObjectUtil.isNotEmpty(contractProduct)) {
  145. BigDecimal expendQuantity = item.getExpendQuantity().subtract(item.getQuantity().subtract(contractProduct.getQuantity()));
  146. contractProduct.setExpendQuantity(expendQuantity);
  147. }
  148. }
  149. }
  150. return contract;
  151. }
  152. /**
  153. * 重新发起
  154. */
  155. private void reStart(JSONObject submitData) {
  156. ContractDto contract = submitData.toJavaObject(ContractDto.class);
  157. Assert.notEmpty(contract.getId(), "合同id不能为空");
  158. //变更合同需要提前操作数据
  159. contract = opDate(contract);
  160. contractFlow.reStart1(contract);
  161. }
  162. /**
  163. * 驳回
  164. */
  165. private void reject(Long businessId) {
  166. contractService.update(q -> q
  167. .eq(Contract::getId, businessId)
  168. .set(Contract::getStatus, FlowStatusEnum1.REJECT.getKey())//20为驳回
  169. .set(BasePo::getUpdateTime, new Date())
  170. .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
  171. );
  172. }
  173. }