EhsdPurchaseUpdateFlow.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. package com.fjhx.sale.flow;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.baomidou.mybatisplus.core.toolkit.IdWorker;
  4. import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
  5. import com.fjhx.common.entity.AvailableStockBo;
  6. import com.fjhx.common.enums.FlowStatusEnum1;
  7. import com.fjhx.common.utils.Assert;
  8. import com.fjhx.common.utils.Utils;
  9. import com.fjhx.flow.core.FlowDelegate;
  10. import com.fjhx.flow.enums.FlowStatusEnum;
  11. import com.fjhx.item.enums.ProductAvailableRecordType;
  12. import com.fjhx.item.service.product.ProductInfoService;
  13. import com.fjhx.purchase.entity.purchase.enums.PurchaseStatusEnum;
  14. import com.fjhx.sale.entity.purchase.dto.EhsdPurchaseDto;
  15. import com.fjhx.sale.entity.purchase.po.EhsdPurchase;
  16. import com.fjhx.sale.entity.purchase.po.EhsdPurchaseProduct;
  17. import com.fjhx.sale.entity.purchase.po.EhsdPurchaseProject;
  18. import com.fjhx.sale.service.purchase.EhsdPurchaseProductService;
  19. import com.fjhx.sale.service.purchase.EhsdPurchaseProjectService;
  20. import com.fjhx.sale.service.purchase.EhsdPurchaseService;
  21. import com.fjhx.wms.entity.stock.po.StockWaitDetails;
  22. import com.fjhx.wms.service.stock.StockWaitDetailsService;
  23. import com.fjhx.wms.service.stock.StockWaitService;
  24. import com.ruoyi.common.core.domain.BasePo;
  25. import com.ruoyi.common.exception.ServiceException;
  26. import com.ruoyi.common.utils.SecurityUtils;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.stereotype.Component;
  29. import java.math.BigDecimal;
  30. import java.util.ArrayList;
  31. import java.util.Date;
  32. import java.util.List;
  33. import java.util.Map;
  34. /**
  35. * 采购变更流程
  36. */
  37. @Component
  38. public class EhsdPurchaseUpdateFlow extends FlowDelegate {
  39. @Autowired
  40. private EhsdPurchaseService ehsdPurchaseService;
  41. @Autowired
  42. private EhsdPurchaseFlow ehsdPurchaseFlow;
  43. @Autowired
  44. private EhsdPurchaseProductService ehsdPurchaseProductService;
  45. @Autowired
  46. private EhsdPurchaseProjectService ehsdPurchaseProjectService;
  47. @Autowired
  48. private ProductInfoService productInfoService;
  49. @Autowired
  50. private StockWaitDetailsService stockWaitDetailsService;
  51. @Autowired
  52. private StockWaitService stockWaitService;
  53. @Override
  54. public String getFlowKey() {
  55. return "purchase_update_flow";
  56. }
  57. /**
  58. * 发起流程
  59. */
  60. @Override
  61. public Long start(Long flowId, JSONObject submitData) {
  62. EhsdPurchaseDto purchase = submitData.toJavaObject(EhsdPurchaseDto.class);
  63. Assert.notEmpty(purchase.getId(), "原采购订单id不能为空");
  64. //赋值原采购id 并 清空id
  65. purchase.setOldPurchaseId(purchase.getId());
  66. purchase.setId(null);
  67. //赋值流程id
  68. purchase.setFlowId(flowId);
  69. //获取原采购id
  70. Long oldPurchaseId = purchase.getOldPurchaseId();
  71. //判断合同是否在变更中,防止用户缓存导致重复变更
  72. EhsdPurchase oldPurchase = ehsdPurchaseService.getById(oldPurchaseId);
  73. Assert.notEmpty(oldPurchase, "查询不到原采购订单信息");
  74. if (oldPurchase.getStatus().equals(FlowStatusEnum1.UPDATE_LOADING.getKey())) {
  75. throw new ServiceException("原采购订单正在变更中,禁止重复变更!");
  76. }
  77. //原采购订单修改为变更中
  78. ehsdPurchaseService.update(q -> q.eq(EhsdPurchase::getId, oldPurchaseId).set(EhsdPurchase::getStatus, FlowStatusEnum1.UPDATE_LOADING.getKey()));
  79. //赋值新单号
  80. purchase.setCode(Utils.getNewCode(oldPurchase.getCode()));
  81. //获取明细信息
  82. List<EhsdPurchaseProduct> purchaseProductList = purchase.getPurchaseProductList();
  83. List<EhsdPurchaseProject> purchaseProjectList = purchase.getPurchaseProjectList();
  84. //赋值原id 清除id字段
  85. for (EhsdPurchaseProduct ehsdPurchaseProduct : purchaseProductList) {
  86. ehsdPurchaseProduct.setOldPurchaseProductId(ehsdPurchaseProduct.getId());
  87. ehsdPurchaseProduct.setId(null);
  88. }
  89. purchaseProjectList.forEach(item -> item.setId(null));
  90. //调用采购发起公共代码块
  91. purchase = ehsdPurchaseFlow.connStart(purchase);
  92. return purchase.getId();
  93. }
  94. /**
  95. * 结束流程
  96. */
  97. @Override
  98. public void end(Long flowId, Long businessId, JSONObject submitData) {
  99. //通过业务ID查询采购数据
  100. EhsdPurchase purchase = ehsdPurchaseService.getById(businessId);
  101. Assert.notEmpty(purchase, "采购单不存在,或已被删除");
  102. //修改采购状态为审批通过
  103. purchase.setStatus(PurchaseStatusEnum.PASS.getKey());
  104. purchase.setApprovedDate(new Date());
  105. ehsdPurchaseService.updateById(purchase);
  106. //原合同改为 已变更
  107. EhsdPurchase oldEhsdPurchase = ehsdPurchaseService.getById(purchase.getOldPurchaseId());
  108. oldEhsdPurchase.setStatus(FlowStatusEnum1.UPDATE.getKey());
  109. ehsdPurchaseService.updateById(oldEhsdPurchase);
  110. //---------------------------------------------
  111. //获取新采购明细数据
  112. Map<Long, BigDecimal> newQuantityMap = ehsdPurchaseProductService.mapKV(
  113. EhsdPurchaseProduct::getOldPurchaseProductId, EhsdPurchaseProduct::getQuantity,
  114. q -> q.eq(EhsdPurchaseProduct::getPurchaseId, businessId)
  115. );
  116. List<EhsdPurchaseProduct> oldPurchaseProductList = ehsdPurchaseProductService.list(q -> q.eq(EhsdPurchaseProduct::getPurchaseId, purchase.getOldPurchaseId()));
  117. List<AvailableStockBo> availableStockBoList = new ArrayList<>();
  118. //旧数据处理
  119. Long stockWaitId = null;
  120. for (EhsdPurchaseProduct oldPurchaseProduct : oldPurchaseProductList) {
  121. //新数量
  122. BigDecimal newQuantity = newQuantityMap.get(oldPurchaseProduct.getId());
  123. //已入库数量
  124. StockWaitDetails stockWaitDetails = stockWaitDetailsService.getOne(q -> q.eq(StockWaitDetails::getBusinessDetailsId, oldPurchaseProduct.getId()));
  125. stockWaitId = stockWaitDetails.getStockWaitId();
  126. //生成操作可用库存的实体
  127. AvailableStockBo availableStockBo = new AvailableStockBo();
  128. availableStockBo.setProductId(oldPurchaseProduct.getProductId());
  129. availableStockBo.setQuantity(oldPurchaseProduct.getQuantity());
  130. availableStockBo.setNewQuantity(newQuantity);
  131. availableStockBo.setInStockQuantity(stockWaitDetails.getReceiptQuantity());
  132. availableStockBoList.add(availableStockBo);
  133. //操作待入库数据
  134. if (ObjectUtils.isEmpty(newQuantity)) {
  135. //原数据被删,检查已入库数量,>0禁止变更
  136. stockWaitDetailsService.removeById(stockWaitDetails);
  137. } else {
  138. stockWaitDetails.setQuantity(newQuantity);
  139. //计算状态
  140. int status = stockWaitDetails.getReceiptQuantity().compareTo(stockWaitDetails.getQuantity()) >= 0 ? 2 : 1;
  141. if (stockWaitDetails.getReceiptQuantity().compareTo(BigDecimal.ZERO) == 0) {
  142. status = 0;
  143. }
  144. stockWaitDetails.setStatus(status);
  145. stockWaitDetailsService.updateById(stockWaitDetails);
  146. stockWaitService.updateStatus(stockWaitDetails.getStockWaitId());
  147. }
  148. }
  149. //新添加的数据处理
  150. List<EhsdPurchaseProduct> newPurchaseProductInfo = ehsdPurchaseProductService.list(q -> q
  151. .eq(EhsdPurchaseProduct::getPurchaseId, businessId)
  152. .isNull(EhsdPurchaseProduct::getOldPurchaseProductId)
  153. );
  154. for (EhsdPurchaseProduct newPurchaseProduct : newPurchaseProductInfo) {
  155. //生成操作可用库存的实体
  156. AvailableStockBo availableStockBo = new AvailableStockBo();
  157. availableStockBo.setProductId(newPurchaseProduct.getProductId());
  158. availableStockBo.setQuantity(null);
  159. availableStockBo.setNewQuantity(newPurchaseProduct.getQuantity());
  160. availableStockBo.setInStockQuantity(null);
  161. availableStockBoList.add(availableStockBo);
  162. //生成待入库
  163. Assert.notEmpty(stockWaitId, "查询不到待入库信息!");
  164. StockWaitDetails stockWaitDetails = new StockWaitDetails();
  165. stockWaitDetails.setStockWaitId(stockWaitId);
  166. stockWaitDetails.setBusinessDetailsId(newPurchaseProduct.getId());
  167. stockWaitDetails.setPurchaseDetailId(newPurchaseProduct.getId());
  168. stockWaitDetails.setProductId(newPurchaseProduct.getProductId());
  169. stockWaitDetails.setQuantity(newPurchaseProduct.getQuantity());
  170. stockWaitDetails.setStatus(0);
  171. stockWaitDetailsService.save(stockWaitDetails);
  172. stockWaitService.updateStatus(stockWaitDetails.getStockWaitId());
  173. }
  174. //修改可用库存
  175. productInfoService.editAvailableQuantity(availableStockBoList, businessId, ProductAvailableRecordType.PURCHASE_UPDATE, purchase.getCompanyId());
  176. Long oldPurchaseId = purchase.getOldPurchaseId();
  177. //先将当前合同id 以及 当前合同关联数据的合同id 改为临时id
  178. long tempId = IdWorker.getId();
  179. ehsdPurchaseService.updatePurchaseId(businessId, tempId, SecurityUtils.getUserId(), null);
  180. ehsdPurchaseProductService.update(q -> q.eq(EhsdPurchaseProduct::getPurchaseId, businessId).set(EhsdPurchaseProduct::getPurchaseId, tempId));
  181. ehsdPurchaseProjectService.update(q -> q.eq(EhsdPurchaseProject::getPurchaseId, businessId).set(EhsdPurchaseProject::getPurchaseId, tempId));
  182. //将旧合同的id改为新合同id
  183. ehsdPurchaseService.updatePurchaseId(oldPurchaseId, businessId, SecurityUtils.getUserId(), null);
  184. ehsdPurchaseProductService.update(q -> q
  185. .eq(EhsdPurchaseProduct::getPurchaseId, oldPurchaseId)
  186. .set(EhsdPurchaseProduct::getPurchaseId, businessId)
  187. .set(BasePo::getUpdateTime, new Date())
  188. .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
  189. );
  190. ehsdPurchaseProjectService.update(q -> q
  191. .eq(EhsdPurchaseProject::getPurchaseId, oldPurchaseId)
  192. .set(EhsdPurchaseProject::getPurchaseId, businessId)
  193. .set(BasePo::getUpdateTime, new Date())
  194. .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
  195. );
  196. //将新合同id改为旧合同id
  197. ehsdPurchaseService.updatePurchaseId(tempId, oldPurchaseId, SecurityUtils.getUserId(), businessId);
  198. ehsdPurchaseProductService.update(q -> q
  199. .eq(EhsdPurchaseProduct::getPurchaseId, tempId)
  200. .set(EhsdPurchaseProduct::getPurchaseId, oldPurchaseId)
  201. .set(BasePo::getUpdateTime, new Date())
  202. .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
  203. );
  204. ehsdPurchaseProjectService.update(q -> q
  205. .eq(EhsdPurchaseProject::getPurchaseId, tempId)
  206. .set(EhsdPurchaseProject::getPurchaseId, oldPurchaseId)
  207. .set(BasePo::getUpdateTime, new Date())
  208. .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
  209. );
  210. }
  211. /**
  212. * 重新发起
  213. */
  214. @Override
  215. public void relaunch(Long flowId, Long businessId, FlowStatusEnum flowStatus, JSONObject submitData) {
  216. EhsdPurchaseDto purchase = submitData.toJavaObject(EhsdPurchaseDto.class);
  217. if (ObjectUtils.isEmpty(purchase)) {
  218. throw new ServiceException("采购数据不能为空");
  219. }
  220. purchase.setFlowId(flowId);
  221. ehsdPurchaseFlow.connStart(purchase);
  222. }
  223. /**
  224. * 驳回
  225. */
  226. @Override
  227. public void reject(Long flowId, Long businessId, FlowStatusEnum flowStatus) {
  228. ehsdPurchaseService.update(q -> q
  229. .eq(EhsdPurchase::getId, businessId)
  230. .set(EhsdPurchase::getStatus, FlowStatusEnum1.REJECT.getKey())
  231. .set(EhsdPurchase::getUpdateTime, new Date())
  232. .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
  233. );
  234. //恢复原合同
  235. EhsdPurchase ehsdPurchase = ehsdPurchaseService.getById(businessId);
  236. ehsdPurchaseService.update(q -> q
  237. .eq(BasePo::getId, ehsdPurchase.getOldPurchaseId())
  238. .set(EhsdPurchase::getStatus, FlowStatusEnum1.PASS.getKey())
  239. .set(BasePo::getUpdateTime, new Date())
  240. .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
  241. );
  242. }
  243. /**
  244. * 作废
  245. */
  246. @Override
  247. public void cancellation(Long flowId, Long businessId, FlowStatusEnum flowStatus) {
  248. super.cancellation(flowId, businessId, flowStatus);
  249. ehsdPurchaseService.update(q -> q
  250. .eq(EhsdPurchase::getId, businessId)
  251. .set(EhsdPurchase::getStatus, FlowStatusEnum1.CANCELLATION.getKey())
  252. .set(EhsdPurchase::getUpdateTime, new Date())
  253. .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
  254. );
  255. //恢复原合同
  256. EhsdPurchase ehsdPurchase = ehsdPurchaseService.getById(businessId);
  257. ehsdPurchaseService.update(q -> q
  258. .eq(BasePo::getId, ehsdPurchase.getOldPurchaseId())
  259. .set(EhsdPurchase::getStatus, FlowStatusEnum1.PASS.getKey())
  260. .set(BasePo::getUpdateTime, new Date())
  261. .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
  262. );
  263. }
  264. }