EhsdPurchaseUpdateFlow.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. package com.fjhx.sale.flow;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.baomidou.dynamic.datasource.annotation.DS;
  4. import com.baomidou.mybatisplus.core.toolkit.IdWorker;
  5. import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
  6. import com.fjhx.common.constant.SourceConstant;
  7. import com.fjhx.common.enums.FlowStatusEnum1;
  8. import com.fjhx.common.utils.Assert;
  9. import com.fjhx.flow.core.FlowDelegate;
  10. import com.fjhx.flow.enums.FlowStatusEnum;
  11. import com.fjhx.purchase.entity.purchase.enums.PurchaseDataResourceEnum;
  12. import com.fjhx.sale.entity.contract.po.ContractProduct;
  13. import com.fjhx.sale.entity.purchase.dto.EhsdPurchaseDto;
  14. import com.fjhx.sale.entity.purchase.po.EhsdPurchase;
  15. import com.fjhx.sale.entity.purchase.po.EhsdPurchaseArrival;
  16. import com.fjhx.sale.entity.purchase.po.EhsdPurchaseProduct;
  17. import com.fjhx.sale.entity.purchase.po.EhsdPurchaseProject;
  18. import com.fjhx.sale.entity.sample.po.SampleProduct;
  19. import com.fjhx.sale.service.contract.ContractProductService;
  20. import com.fjhx.sale.service.purchase.EhsdPurchaseArrivalService;
  21. import com.fjhx.sale.service.purchase.EhsdPurchaseProductService;
  22. import com.fjhx.sale.service.purchase.EhsdPurchaseProjectService;
  23. import com.fjhx.sale.service.purchase.EhsdPurchaseService;
  24. import com.fjhx.sale.service.sample.SampleProductService;
  25. import com.ruoyi.common.annotation.LogicIgnore;
  26. import com.ruoyi.common.core.domain.BasePo;
  27. import com.ruoyi.common.exception.ServiceException;
  28. import com.ruoyi.common.utils.SecurityUtils;
  29. import org.springframework.beans.factory.annotation.Autowired;
  30. import org.springframework.stereotype.Component;
  31. import org.springframework.transaction.annotation.Transactional;
  32. import java.util.Date;
  33. import java.util.List;
  34. import java.util.regex.Matcher;
  35. import java.util.regex.Pattern;
  36. /**
  37. * EHSD采购变更流程
  38. */
  39. @Component
  40. @DS(SourceConstant.SALE)
  41. public class EhsdPurchaseUpdateFlow extends FlowDelegate {
  42. @Autowired
  43. private EhsdPurchaseService ehsdPurchaseService;
  44. @Autowired
  45. private EhsdPurchaseFlow ehsdPurchaseFlow;
  46. @Autowired
  47. private EhsdPurchaseProductService ehsdPurchaseProductService;
  48. @Autowired
  49. private EhsdPurchaseProjectService ehsdPurchaseProjectService;
  50. @Autowired
  51. private EhsdPurchaseArrivalService ehsdPurchaseArrivalService;
  52. @Autowired
  53. private ContractProductService contractProductService;
  54. @Autowired
  55. private SampleProductService sampleProductService;
  56. @Override
  57. public String getFlowKey() {
  58. return "ehsd_purchase_update_flow";
  59. }
  60. /**
  61. * 发起流程
  62. */
  63. @Override
  64. public Long start(Long flowId, JSONObject submitData) {
  65. EhsdPurchaseDto purchase = submitData.toJavaObject(EhsdPurchaseDto.class);
  66. Assert.notEmpty(purchase.getId(), "采购合同id不能为空");
  67. //判断合同是否在变更中,防止用户缓存导致重复变更
  68. EhsdPurchase byId = ehsdPurchaseService.getById(purchase.getId());
  69. Assert.notEmpty(byId, "查询不到采购信息");
  70. if (byId.getStatus().equals(FlowStatusEnum1.UPDATE_LOADING.getKey())) {
  71. throw new ServiceException("合同正在变更中,禁止重复变更!");
  72. }
  73. //赋值原合同id
  74. purchase.setOldPurchaseId(purchase.getId());
  75. //赋值流程id
  76. purchase.setFlowId(flowId);
  77. //变更 用原来合同号加后缀
  78. EhsdPurchase oldPurchase = ehsdPurchaseService.getById(purchase.getOldPurchaseId());
  79. Assert.notEmpty(oldPurchase, "查询不到原合同信息");
  80. //原合同修改为变更中
  81. oldPurchase.setStatus(FlowStatusEnum1.UPDATE_LOADING.getKey());
  82. ehsdPurchaseService.updateById(oldPurchase);
  83. String code = oldPurchase.getCode();
  84. Matcher matcher = Pattern.compile(".*\\((.*?)\\)$").matcher(code);
  85. int index = 2;
  86. if (matcher.find()) {
  87. index = (Integer.parseInt(matcher.group(1)) + 1);
  88. code = code.substring(0, code.lastIndexOf("("));
  89. }
  90. purchase.setCode(code + "(" + index + ")");
  91. //获取明细信息
  92. List<EhsdPurchaseProduct> purchaseProductList = purchase.getPurchaseProductList();
  93. List<EhsdPurchaseProject> purchaseProjectList = purchase.getPurchaseProjectList();
  94. List<EhsdPurchaseArrival> purchaseArrivalList = purchase.getPurchaseArrivalList();
  95. //清空采购合同的id
  96. purchase.setId(null);
  97. //清空采购明细的id 以及 配件id 方便后面重新发起
  98. for (EhsdPurchaseProduct ehsdPurchaseProduct : purchaseProductList) {
  99. ehsdPurchaseProduct.setId(null);
  100. ehsdPurchaseProduct.getPurchaseProductMountingsList().forEach(item -> item.setId(null));
  101. }
  102. //清空其他费用的id方便后面重新发起
  103. purchaseProjectList.forEach(item -> item.setId(null));
  104. //清空到货要求的id方便后面重新发起
  105. purchaseArrivalList.forEach(item -> item.setId(null));
  106. //调用采购发起公共代码块
  107. purchase = ehsdPurchaseFlow.updateStart(purchase);
  108. return purchase.getId();
  109. }
  110. /**
  111. * 重新发起
  112. */
  113. @Override
  114. @LogicIgnore
  115. @Transactional(rollbackFor = Exception.class)
  116. public void relaunch(Long flowId, Long businessId, FlowStatusEnum flowStatus, JSONObject submitData) {
  117. //删除采购合同
  118. EhsdPurchaseDto purchase = submitData.toJavaObject(EhsdPurchaseDto.class);
  119. if(ObjectUtils.isEmpty(purchase)){
  120. throw new ServiceException("采购数据不能为空");
  121. }
  122. purchase.setFlowId(flowId);
  123. ehsdPurchaseFlow.connStart(purchase);
  124. }
  125. /**
  126. * 驳回
  127. */
  128. @Override
  129. public void reject(Long flowId, Long businessId, FlowStatusEnum flowStatus) {
  130. ehsdPurchaseService.update(q -> q
  131. .eq(EhsdPurchase::getId, businessId)
  132. .set(EhsdPurchase::getStatus, FlowStatusEnum1.REJECT.getKey())
  133. .set(EhsdPurchase::getUpdateTime, new Date())
  134. .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
  135. );
  136. //恢复原合同
  137. EhsdPurchase ehsdPurchase = ehsdPurchaseService.getById(businessId);
  138. ehsdPurchaseService.update(q -> q
  139. .eq(BasePo::getId, ehsdPurchase.getOldPurchaseId())
  140. .set(EhsdPurchase::getStatus, FlowStatusEnum1.PASS.getKey())
  141. .set(BasePo::getUpdateTime, new Date())
  142. .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
  143. );
  144. }
  145. /**
  146. * 作废
  147. */
  148. @Override
  149. public void cancellation(Long flowId, Long businessId, FlowStatusEnum flowStatus) {
  150. super.cancellation(flowId, businessId, flowStatus);
  151. ehsdPurchaseService.update(q -> q
  152. .eq(EhsdPurchase::getId, businessId)
  153. .set(EhsdPurchase::getStatus, FlowStatusEnum1.CANCELLATION.getKey())
  154. .set(EhsdPurchase::getUpdateTime, new Date())
  155. .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
  156. );
  157. //恢复原合同
  158. EhsdPurchase ehsdPurchase = ehsdPurchaseService.getById(businessId);
  159. ehsdPurchaseService.update(q -> q
  160. .eq(BasePo::getId, ehsdPurchase.getOldPurchaseId())
  161. .set(EhsdPurchase::getStatus, FlowStatusEnum1.PASS.getKey())
  162. .set(BasePo::getUpdateTime, new Date())
  163. .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
  164. );
  165. }
  166. /**
  167. * 结束流程
  168. */
  169. @Override
  170. public void end(Long flowId, Long businessId, JSONObject submitData) {
  171. //通过业务ID查询采购数据
  172. EhsdPurchase purchase = ehsdPurchaseService.getById(businessId);
  173. Assert.notEmpty(purchase, "采购单不存在,或已被删除");
  174. //原合同改为 已变更
  175. EhsdPurchase oldEhsdPurchase = ehsdPurchaseService.getById(purchase.getOldPurchaseId());
  176. oldEhsdPurchase.setStatus(FlowStatusEnum1.UPDATE.getKey());
  177. ehsdPurchaseService.updateById(oldEhsdPurchase);
  178. //回滚旧合同的已采购数量
  179. List<EhsdPurchaseProduct> oldPurchaseProductList = ehsdPurchaseProductService.list(q -> q.eq(EhsdPurchaseProduct::getPurchaseId, purchase.getOldPurchaseId()));
  180. for (EhsdPurchaseProduct ehsdPurchaseProduct : oldPurchaseProductList) {
  181. if (ObjectUtils.isNotEmpty(ehsdPurchaseProduct.getDataResourceId()) && ehsdPurchaseProduct.getDataResource() == PurchaseDataResourceEnum.DATA_RESOURCE_1.getKey()) {//如果采购的是外销合同
  182. ContractProduct contractProduct = contractProductService.getById(ehsdPurchaseProduct.getDataResourceId());
  183. //回滚变更前待采购数量
  184. contractProduct.setExpendQuantity(contractProduct.getExpendQuantity().add(ehsdPurchaseProduct.getQuantity()));
  185. contractProductService.updateById(contractProduct);
  186. }
  187. if (ObjectUtils.isNotEmpty(ehsdPurchaseProduct.getDataResourceId()) && ehsdPurchaseProduct.getDataResource() == PurchaseDataResourceEnum.DATA_RESOURCE_2.getKey()) {//如果采购的是样品单
  188. SampleProduct sampleProduct = sampleProductService.getById(ehsdPurchaseProduct.getDataResourceId());
  189. //回滚变更前待采购数量
  190. sampleProduct.setExpendQuantity(sampleProduct.getExpendQuantity().add(ehsdPurchaseProduct.getQuantity()));
  191. sampleProductService.updateById(sampleProduct);
  192. }
  193. }
  194. //调用采购发起流程的结束方法
  195. ehsdPurchaseFlow.end(flowId, businessId, submitData);
  196. Long oldPurchaseId = purchase.getOldPurchaseId();
  197. //先将当前合同id 以及 当前合同关联数据的合同id 改为临时id
  198. long tempId = IdWorker.getId();
  199. ehsdPurchaseService.updatePurchaseId(businessId,tempId,SecurityUtils.getUserId(),null);
  200. ehsdPurchaseProductService.update(q -> q.eq(EhsdPurchaseProduct::getPurchaseId, businessId).set(EhsdPurchaseProduct::getPurchaseId, tempId));
  201. ehsdPurchaseProjectService.update(q -> q.eq(EhsdPurchaseProject::getPurchaseId, businessId).set(EhsdPurchaseProject::getPurchaseId, tempId));
  202. ehsdPurchaseArrivalService.update(q -> q.eq(EhsdPurchaseArrival::getPurchaseId, businessId).set(EhsdPurchaseArrival::getPurchaseId, tempId));
  203. //将旧合同的id改为新合同id
  204. ehsdPurchaseService.updatePurchaseId(oldPurchaseId,businessId,SecurityUtils.getUserId(),null);
  205. ehsdPurchaseProductService.update(q -> q
  206. .eq(EhsdPurchaseProduct::getPurchaseId, oldPurchaseId)
  207. .set(EhsdPurchaseProduct::getPurchaseId, businessId)
  208. .set(BasePo::getUpdateTime, new Date())
  209. .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
  210. );
  211. ehsdPurchaseProjectService.update(q -> q
  212. .eq(EhsdPurchaseProject::getPurchaseId, oldPurchaseId)
  213. .set(EhsdPurchaseProject::getPurchaseId, businessId)
  214. .set(BasePo::getUpdateTime, new Date())
  215. .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
  216. );
  217. ehsdPurchaseArrivalService.update(q -> q
  218. .eq(EhsdPurchaseArrival::getPurchaseId, oldPurchaseId)
  219. .set(EhsdPurchaseArrival::getPurchaseId, businessId)
  220. .set(BasePo::getUpdateTime, new Date())
  221. .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
  222. );
  223. //将新合同id改为旧合同id
  224. ehsdPurchaseService.updatePurchaseId(tempId,oldPurchaseId,SecurityUtils.getUserId(),businessId);
  225. ehsdPurchaseProductService.update(q -> q
  226. .eq(EhsdPurchaseProduct::getPurchaseId, tempId)
  227. .set(EhsdPurchaseProduct::getPurchaseId, oldPurchaseId)
  228. .set(BasePo::getUpdateTime, new Date())
  229. .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
  230. );
  231. ehsdPurchaseProjectService.update(q -> q
  232. .eq(EhsdPurchaseProject::getPurchaseId, tempId)
  233. .set(EhsdPurchaseProject::getPurchaseId, oldPurchaseId)
  234. .set(BasePo::getUpdateTime, new Date())
  235. .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
  236. );
  237. ehsdPurchaseArrivalService.update(q -> q
  238. .eq(EhsdPurchaseArrival::getPurchaseId, tempId)
  239. .set(EhsdPurchaseArrival::getPurchaseId, oldPurchaseId)
  240. .set(BasePo::getUpdateTime, new Date())
  241. .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
  242. );
  243. }
  244. }