SampleUpdateFlow.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. package com.fjhx.sale.flow;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.baomidou.dynamic.datasource.annotation.DS;
  5. import com.baomidou.mybatisplus.core.toolkit.*;
  6. import com.fjhx.area.utils.CustomizeAreaUtil;
  7. import com.fjhx.common.constant.SourceConstant;
  8. import com.fjhx.common.enums.FlowStatusEnum1;
  9. import com.fjhx.common.utils.Assert;
  10. import com.fjhx.file.utils.ObsFileUtil;
  11. import com.fjhx.flow.core.FlowDelegate;
  12. import com.fjhx.sale.entity.contract.po.Contract;
  13. import com.fjhx.sale.entity.sample.dto.SampleDto;
  14. import com.fjhx.sale.entity.sample.po.Sample;
  15. import com.fjhx.sale.entity.sample.po.SampleProduct;
  16. import com.fjhx.sale.entity.sample.po.SampleProject;
  17. import com.fjhx.sale.entity.sample.po.SampleShipment;
  18. import com.fjhx.sale.service.sample.SampleProductService;
  19. import com.fjhx.sale.service.sample.SampleProjectService;
  20. import com.fjhx.sale.service.sample.SampleService;
  21. import com.fjhx.sale.service.sample.SampleShipmentService;
  22. import com.ruoyi.common.exception.ServiceException;
  23. import com.ruoyi.common.utils.SecurityUtils;
  24. import org.springframework.beans.factory.annotation.Autowired;
  25. import org.springframework.stereotype.Component;
  26. import java.util.*;
  27. import java.util.regex.Matcher;
  28. import java.util.regex.Pattern;
  29. import java.util.stream.Collectors;
  30. /**
  31. * 样品单变更流程
  32. */
  33. @Component
  34. @DS(SourceConstant.SALE)
  35. public class SampleUpdateFlow extends FlowDelegate {
  36. @Autowired
  37. private SampleFlow sampleFlow;
  38. @Autowired
  39. private SampleService sampleService;
  40. @Autowired
  41. private SampleProductService sampleProductService;
  42. @Autowired
  43. private SampleProjectService sampleProjectService;
  44. @Autowired
  45. private SampleShipmentService sampleShipmentService;
  46. @Override
  47. public String getFlowKey() {
  48. return "sample_update_flow";
  49. }
  50. /**
  51. * 发起流程
  52. *
  53. * @param flowId 流程ID
  54. * @param submitData 样品单数据
  55. * @return
  56. */
  57. @Override
  58. public Long start(Long flowId, JSONObject submitData) {
  59. SampleDto newSample = submitData.toJavaObject(SampleDto.class);
  60. //判断合同是否在变更中,防止用户缓存导致重复变更
  61. Sample byId = sampleService.getById(newSample.getOldSampleId());
  62. Assert.notEmpty(byId, "查询不到样品单信息");
  63. if (byId.getStatus().equals(FlowStatusEnum1.UPDATE_LOADING.getKey())) {
  64. throw new ServiceException("样品单正在变更中,禁止重复变更!");
  65. }
  66. // 原样品单id不能为空
  67. Long oldSampleId = newSample.getOldSampleId();
  68. if (oldSampleId == null) {
  69. throw new ServiceException("原样品单id不能为空");
  70. }
  71. //查询原样品单
  72. Sample oldSample = sampleService.getById(newSample.getOldSampleId());
  73. if(ObjectUtil.isEmpty(oldSample)){
  74. throw new ServiceException("查询不到原样品单信息");
  75. }
  76. //更新原样品单状态为变更中
  77. oldSample.setStatus(FlowStatusEnum1.UPDATE_LOADING.getKey());
  78. sampleService.updateById(oldSample);
  79. //查询旧样品单的订单产品
  80. List<SampleProduct> oldSampleProductList = sampleProductService.list(q -> q.eq(SampleProduct::getSampleId, oldSampleId));
  81. if(CollectionUtils.isEmpty(oldSampleProductList)){
  82. throw new ServiceException("原样品单没有产品");
  83. }
  84. Map<Long,List<SampleProduct>> oldSampleMap = oldSampleProductList.stream().collect(Collectors.groupingBy(SampleProduct::getId));
  85. List<SampleProduct> newSampleProductList = newSample.getSampleProductList();
  86. if(CollectionUtils.isEmpty(newSampleProductList)){
  87. throw new ServiceException("变更样品单产品不能为空");
  88. }
  89. /**
  90. * 赋值新的变更样品单号
  91. */
  92. String code = oldSample.getCode();
  93. Matcher matcher = Pattern.compile(".*\\((.*?)\\)$").matcher(code);
  94. int index = 2;
  95. if (matcher.find()) {
  96. index = (Integer.parseInt(matcher.group(1)) + 1);
  97. code = code.substring(0, code.lastIndexOf("("));
  98. }
  99. newSample.setCode(code + "(" + index + ")");
  100. newSample.setIsShow(1);//隐藏样品单
  101. /**
  102. * 计算新样品单的剩余数量
  103. */
  104. for(SampleProduct newCp:newSampleProductList){
  105. newCp.setExpendQuantity(newCp.getQuantity());
  106. if(ObjectUtil.isNotEmpty(newCp.getId())){//如果新样品单产品ID不为空
  107. //取出旧样品单
  108. SampleProduct oldSampleProduct = oldSampleMap.getOrDefault(newCp.getId(),null).get(0);
  109. //取出旧样品单包装方式
  110. JSONObject oldJson = JSONObject.parseObject(oldSampleProduct.getEhsdJson());
  111. String oldPackMethod = oldJson.getOrDefault("packMethod",null)==null?null:oldJson.getOrDefault("packMethod",null).toString();
  112. //取出新样品单包装方式
  113. JSONObject newJson = JSONObject.parseObject(newCp.getEhsdJson());
  114. String newPackMethod = newJson.getOrDefault("packMethod",null)==null?null:oldJson.getOrDefault("packMethod",null).toString();
  115. /**
  116. * 商品英文名、尺寸、包装方式、数量 没有变更---取原本的剩余数量
  117. */
  118. if(oldSampleProduct.getQuantity().compareTo(newCp.getQuantity())==0
  119. && StringUtils.equals(oldSampleProduct.getProductName(), newCp.getProductName())
  120. && StringUtils.equals(oldSampleProduct.getProductModel(),newCp.getProductModel())
  121. && StringUtils.equals(oldPackMethod,newPackMethod)){
  122. //取出旧的剩余数量
  123. newCp.setExpendQuantity(oldSampleProduct.getExpendQuantity());
  124. }
  125. }
  126. }
  127. long sampleId = update(newSample);
  128. // if(newSample.getStartType()==1){//直接审批通过
  129. // this.end(flowId,sampleId,submitData);
  130. // }
  131. return sampleId;
  132. }
  133. /**
  134. * 结束流程
  135. *
  136. * @param flowId 流程ID
  137. * @param businessId 业务ID
  138. * @param submitData 数据
  139. */
  140. @Override
  141. public void end(Long flowId, Long businessId, JSONObject submitData) {
  142. // 通过业务ID查询样品单数据
  143. Sample newSample = sampleService.getById(businessId);
  144. if (ObjectUtils.isEmpty(newSample)) {
  145. throw new ServiceException("样品单不存在");
  146. }
  147. long oldSampleId = newSample.getOldSampleId();//取出旧的样品单ID
  148. Sample oldSample = sampleService.getById(oldSampleId);
  149. if (oldSample == null) {
  150. throw new ServiceException("原样品单不存在");
  151. }
  152. long temOldId = IdWorker.getId();
  153. long temNewId = IdWorker.getId();
  154. Sample temOldUpSample = new Sample();
  155. temOldUpSample.setId(temOldId);
  156. temOldUpSample.setUpId(oldSampleId);
  157. Sample temNewUpSample = new Sample();
  158. temNewUpSample.setId(temNewId);
  159. temNewUpSample.setUpId(businessId);
  160. //替换新旧数据ID为临时ID
  161. sampleService.updateSample(temOldUpSample);
  162. sampleService.updateSample(temNewUpSample);
  163. //查询新数据产品、收费、出货
  164. List<Long> newSampleProductIds = sampleProductService.list(Wrappers.<SampleProduct>query().lambda().select(SampleProduct::getId).eq(SampleProduct::getSampleId,businessId)).stream().map(SampleProduct::getId).collect(Collectors.toList());
  165. List<Long> newSampleProjectIds = sampleProjectService.list(Wrappers.<SampleProject>query().lambda().select(SampleProject::getId).eq(SampleProject::getSampleId,businessId)).stream().map(SampleProject::getId).collect(Collectors.toList());
  166. List<Long> newSampleShipmentIds = sampleShipmentService.list(Wrappers.<SampleShipment>query().lambda().select(SampleShipment::getId).eq(SampleShipment::getSampleId,businessId)).stream().map(SampleShipment::getId).collect(Collectors.toList());
  167. //查询旧数据产品、收费、出货
  168. List<Long> oldSampleProductIds = sampleProductService.list(Wrappers.<SampleProduct>query().lambda().select(SampleProduct::getId).eq(SampleProduct::getSampleId,oldSampleId)).stream().map(SampleProduct::getId).collect(Collectors.toList());
  169. List<Long> oldSampleProjectIds = sampleProjectService.list(Wrappers.<SampleProject>query().lambda().select(SampleProject::getId).eq(SampleProject::getSampleId,oldSampleId)).stream().map(SampleProject::getId).collect(Collectors.toList());
  170. List<Long> oldSampleShipmentIds = sampleShipmentService.list(Wrappers.<SampleShipment>query().lambda().select(SampleShipment::getId).eq(SampleShipment::getSampleId,oldSampleId)).stream().map(SampleShipment::getId).collect(Collectors.toList());
  171. /**
  172. * 处理新样品单---
  173. */
  174. newSample.setId(oldSampleId);//id赋值为旧样品单的id
  175. newSample.setStatus(FlowStatusEnum1.PASS.getKey());
  176. newSample.setApprovedDate(new Date());
  177. newSample.setUpId(temNewId);
  178. newSample.setOldSampleId(businessId);
  179. newSample.setIsShow(0);//显示新样品单
  180. sampleService.updateSample(newSample);
  181. //修改样品单产品相关数据
  182. if(CollectionUtils.isNotEmpty(newSampleProductIds)){
  183. sampleProductService.update(Wrappers.<SampleProduct>update().lambda().set(SampleProduct::getSampleId,oldSampleId).in(SampleProduct::getId,newSampleProductIds));
  184. }
  185. //修改样品单收费相关数据
  186. if(CollectionUtils.isNotEmpty(newSampleProjectIds)){
  187. sampleProjectService.update(Wrappers.<SampleProject>update().lambda().set(SampleProject::getSampleId,oldSampleId).in(SampleProject::getId,newSampleProjectIds));
  188. }
  189. //修改样品单出货相关数据
  190. if(CollectionUtils.isNotEmpty(newSampleShipmentIds)){
  191. sampleShipmentService.update(Wrappers.<SampleShipment>update().lambda().set(SampleShipment::getSampleId,oldSampleId).in(SampleShipment::getId,newSampleShipmentIds));
  192. }
  193. /**
  194. * 处理旧的样品单---
  195. */
  196. oldSample.setId(businessId);
  197. oldSample.setStatus(FlowStatusEnum1.UPDATE.getKey());
  198. oldSample.setIsChange("1");
  199. oldSample.setUpId(temOldId);
  200. oldSample.setIsShow(1);//隐藏旧的样品单
  201. sampleService.updateSample(oldSample);
  202. //修改样品单产品相关数据
  203. if(CollectionUtils.isNotEmpty(oldSampleProductIds)){
  204. sampleProductService.update(Wrappers.<SampleProduct>update().lambda().set(SampleProduct::getSampleId,businessId).in(SampleProduct::getId,oldSampleProductIds));
  205. }
  206. //修改样品单收费相关数据
  207. if(CollectionUtils.isNotEmpty(oldSampleProjectIds)){
  208. sampleProjectService.update(Wrappers.<SampleProject>update().lambda().set(SampleProject::getSampleId,businessId).in(SampleProject::getId,oldSampleProjectIds));
  209. }
  210. //修改样品单出货相关数据
  211. if(CollectionUtils.isNotEmpty(oldSampleShipmentIds)){
  212. sampleShipmentService.update(Wrappers.<SampleShipment>update().lambda().set(SampleShipment::getSampleId,businessId).in(SampleShipment::getId,oldSampleShipmentIds));
  213. }
  214. ObsFileUtil.exchangeBusinessId(oldSampleId,businessId);
  215. }
  216. /**
  217. * 变更数据
  218. * @param sample
  219. * @return
  220. */
  221. public Long update(SampleDto sample){
  222. //赋值城市省份信息
  223. CustomizeAreaUtil.setAreaId(sample);
  224. sample.setBuyCityId(sample.getCityId());
  225. sample.setBuyCountryId(sample.getCountryId());
  226. sample.setBuyProvinceId(sample.getProvinceId());
  227. // sample.setCode(CodeEnum.SAMPLE_CODE.getCode());
  228. sample.setStatus(FlowStatusEnum1.UNDER_REVIEW.getKey());
  229. sample.setUserName(SecurityUtils.getUsername());
  230. sampleService.save(sample);
  231. List<SampleProduct> sampleProductList = sample.getSampleProductList();
  232. if(CollectionUtils.isNotEmpty(sampleProductList)){//保存样品单产品
  233. for(SampleProduct c : sampleProductList){
  234. c.setId(IdWorker.getId());
  235. c.setSampleId(sample.getId());
  236. c.setExpendQuantity(c.getQuantity());
  237. }
  238. sampleProductService.saveBatch(sampleProductList);
  239. }
  240. List<SampleProject> sampleProjectList = sample.getSampleProjectList();
  241. if(CollectionUtils.isNotEmpty(sampleProjectList)){//保存收费项目
  242. for(SampleProject c : sampleProjectList){
  243. c.setId(IdWorker.getId());
  244. c.setSampleId(sample.getId());
  245. }
  246. sampleProjectService.saveBatch(sampleProjectList);
  247. }
  248. List<SampleShipment> sampleShipmentList = sample.getSampleShipmentList();
  249. if(CollectionUtils.isNotEmpty(sampleShipmentList)){//保存自定义出货
  250. for(SampleShipment c : sampleShipmentList){
  251. c.setId(IdWorker.getId());
  252. c.setSampleId(sample.getId());
  253. }
  254. sampleShipmentService.saveBatch(sampleShipmentList);
  255. }
  256. //交接单附件
  257. ObsFileUtil.copyFileAndSave(sample.getFileList(),sample.getId(),1);
  258. //包装附件
  259. ObsFileUtil.copyFileAndSave(sample.getPackageFileList(),sample.getId(),2);
  260. return sample.getId();
  261. }
  262. }