TransferService.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. package com.dk.mdm.service.ivt;
  2. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  3. import com.dk.common.exception.BaseBusinessException;
  4. import com.dk.common.infrastructure.annotaiton.Pagination;
  5. import com.dk.common.infrastructure.constant.Constant;
  6. import com.dk.common.infrastructure.enums.ErrorCodeEnum;
  7. import com.dk.common.model.pojo.PageList;
  8. import com.dk.common.response.ResponseCodeEnum;
  9. import com.dk.common.response.ResponseResultUtil;
  10. import com.dk.common.response.ResponseResultVO;
  11. import com.dk.mdm.infrastructure.convert.ivt.TransferConvert;
  12. import com.dk.mdm.infrastructure.convert.ivt.TransferItemConvert;
  13. import com.dk.mdm.mapper.ivt.InboundItemMapper;
  14. import com.dk.mdm.mapper.ivt.OutboundItemMapper;
  15. import com.dk.mdm.mapper.ivt.TransferItemMapper;
  16. import com.dk.mdm.model.pojo.ivt.*;
  17. import com.dk.mdm.mapper.ivt.TransferMapper;
  18. import com.dk.common.service.BaseService;
  19. import com.dk.common.mapper.BaseMapper;
  20. import com.dk.mdm.model.pojo.mac.RecPay;
  21. import com.dk.mdm.model.pojo.mac.RecPayItem;
  22. import com.dk.mdm.model.pojo.sale.Order;
  23. import com.dk.mdm.model.query.ivt.TransferQuery;
  24. import com.dk.mdm.model.response.ivt.InboundItemResponse;
  25. import com.dk.mdm.model.response.ivt.OutboundItemResponse;
  26. import com.dk.mdm.model.response.ivt.TransferResponse;
  27. import com.dk.mdm.model.vo.ivt.*;
  28. import com.dk.mdm.service.common.CommonService;
  29. import com.dk.mdm.service.ivt.inbound.InboundCheckService;
  30. import com.dk.mdm.service.ivt.inbound.InboundItemService;
  31. import com.dk.mdm.service.ivt.outbound.OutboundCheckService;
  32. import org.springframework.stereotype.Service;
  33. import org.springframework.beans.factory.annotation.Autowired;
  34. import org.springframework.transaction.annotation.Transactional;
  35. import org.springframework.transaction.interceptor.TransactionAspectSupport;
  36. import java.math.BigDecimal;
  37. import java.time.LocalDate;
  38. import java.time.LocalDateTime;
  39. import java.util.*;
  40. import java.util.stream.Collectors;
  41. @Service
  42. @Transactional
  43. public class TransferService extends BaseService<Transfer> {
  44. @Override
  45. public BaseMapper<Transfer> getRepository() {
  46. return transferMapper;
  47. }
  48. @Autowired
  49. private TransferMapper transferMapper;
  50. @Autowired
  51. private TransferItemMapper transferItemMapper;
  52. @Autowired
  53. private TransferConvert transferConvert;
  54. @Autowired
  55. private TransferItemConvert transferItemConvert;
  56. @Autowired
  57. private CommonService commonService;
  58. @Autowired
  59. private InboundCheckService inboundCheckService;
  60. @Autowired
  61. private OutboundCheckService outboundCheckService;
  62. @Autowired
  63. private InboundItemService inboundItemService;
  64. @Autowired
  65. private InboundItemMapper inboundItemMapper;
  66. @Autowired
  67. private OutboundItemMapper outboundItemMapper;
  68. /**
  69. * @desc : 重写主键
  70. * @author : 宋扬
  71. * @date : 2023/3/27 10:39
  72. */
  73. @Override
  74. public String getPrimaryKey() {
  75. return "transfer_id";
  76. }
  77. /**
  78. * @desc : 查询一览信息
  79. * @author : 宋扬
  80. * @date : 2024/4/2 9:24
  81. */
  82. @Pagination
  83. public ResponseResultVO<PageList<TransferResponse>> selectByCond(TransferQuery transferQuery) {
  84. return super.mergeListWithCount(transferQuery, transferMapper.selectByCond(transferQuery),
  85. transferMapper.countByCond(transferQuery));
  86. }
  87. /**
  88. * @desc : 新建调整单
  89. * @author : 宋扬
  90. * @date : 2024/3/27 11:08
  91. */
  92. @Transactional(rollbackFor = {Exception.class})
  93. public ResponseResultVO<?> insert(TransferVO transferVO) {
  94. // 转化实体
  95. Transfer transfer = transferConvert.convertToPo(transferVO);
  96. try {
  97. Map<String, Object> codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.Transfer.getName(), true);
  98. //判断调整类型 仓库调整
  99. if(transferVO.getTransferType().equals(Constant.transferType.CHECK_TYPE_WH.getName())){
  100. // 插入仓库调整单的实体
  101. transfer.setTransferId(codeMap.get("outId").toString()).setTransferNo(codeMap.get("outNote").toString())
  102. .setTransferDate(LocalDate.now()).setStaffId(transferVO.getStaffId()).setOrgId(transferVO.getOrgId())
  103. .setTransferType(transferVO.getTransferType()).setMakeStaff(transferVO.getMakeStaff())
  104. .setMakeTime(LocalDateTime.now()).setRemarks(transferVO.getRemarks())
  105. .setOWhId(transferVO.getOWhId()).setWhId(transferVO.getWhId());
  106. }else{
  107. // 插入非标号调整单的实体
  108. transfer.setTransferId(codeMap.get("outId").toString()).setTransferNo(codeMap.get("outNote").toString())
  109. .setTransferDate(LocalDate.now()).setStaffId(transferVO.getStaffId()).setOrgId(transferVO.getOrgId())
  110. .setTransferType(transferVO.getTransferType()).setMakeStaff(transferVO.getMakeStaff())
  111. .setMakeTime(LocalDateTime.now()).setRemarks(transferVO.getRemarks())
  112. .setONonStdCode(transferVO.getONonStdCode()).setNonStdCode(transferVO.getNonStdCode());
  113. }
  114. // 先插调整单主表数据
  115. super.insert(transfer);
  116. // 因为需要获取目标inv_id,所以必须先调用入库接口。
  117. // 定义入库Map
  118. Map<String, Object> inboundMap= new HashMap<>();
  119. // 定义出库Map
  120. Map<String, Object> outboundCheckMap= new HashMap<>();
  121. if (transferVO.getItemList() != null && transferVO.getItemList().size() > 0){
  122. // 计算总调整量
  123. BigDecimal transferQtySum = transferVO.getItemList().stream().map(TransferItemVO::getTransferQty).reduce(BigDecimal.ZERO, BigDecimal::add)
  124. .setScale(6, BigDecimal.ROUND_HALF_UP);
  125. // 计算总入库金额
  126. /*BigDecimal intoingAmtSum = transferVO.getItemList().stream().map(TransferItemVO::getIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add)
  127. .setScale(6, BigDecimal.ROUND_HALF_UP);*/
  128. // 获取入库表实体
  129. InboundVO inboundVO = new InboundVO();
  130. List<InboundItemVO> inboundItemVOList=new ArrayList<>();
  131. // 获取出库表实体
  132. OutboundVO outboundVO = new OutboundVO();
  133. List<OutboundItemVO> outboundItemVOList=new ArrayList<>();
  134. // 仓库调整
  135. if(transferVO.getTransferType().equals(Constant.transferType.CHECK_TYPE_WH.getName())) {
  136. // 赋值入库实体
  137. inboundVO.setOrgId(transferVO.getOrgId()).setStaffId(transferVO.getStaffId())
  138. .setMakeStaff(transferVO.getMakeStaff()).setIntoingQty(transferQtySum)
  139. .setFromId(transfer.getTransferId()).setFromNo(transfer.getTransferNo())
  140. .setMakeTime(LocalDateTime.now()).setIntoDate(LocalDate.now()).setWhId(transferVO.getWhId())
  141. .setFlgAutoHandle(true).setIntoingAmt(BigDecimal.ZERO)
  142. .setIntoType(Constant.IntoType.REMOVE.getName());
  143. // 赋值出库实体
  144. outboundVO.setOrgId(transferVO.getOrgId()).setStaffId(transferVO.getStaffId())
  145. .setMakeStaff(transferVO.getMakeStaff()).setOutingQty(transferQtySum)
  146. .setFromId(transfer.getTransferId()).setFromNo(transfer.getTransferNo())
  147. .setMakeTime(LocalDateTime.now()).setOutDate(LocalDate.now())
  148. .setOutingAmt(BigDecimal.ZERO).setOutType(Constant.OutType.REMOVE.getName());
  149. // 获取入库明细实体
  150. for (TransferItemVO transferItemVO : transferVO.getItemList()) {
  151. // 赋值入库明细实体
  152. InboundItemVO inboundItemVO=new InboundItemVO();
  153. inboundItemVO.setItemIndex(transferItemVO.getItemIndex()).setSkuId(transferItemVO.getSkuId())
  154. .setIntoingQty(transferItemVO.getTransferQty()).setFromId(transfer.getTransferId())
  155. .setIntoingAmt(BigDecimal.ZERO).setPriceInto(BigDecimal.ZERO)
  156. .setWhId(transferItemVO.getWhId()).setNonStdCode(transferItemVO.getONonStdCode());
  157. inboundItemVOList.add(inboundItemVO);
  158. // 赋值出库明细信息。
  159. OutboundItemVO outboundItemVO =new OutboundItemVO();
  160. outboundItemVO.setItemIndex(transferItemVO.getItemIndex()).setSkuId(transferItemVO.getSkuId())
  161. .setOutingQty(transferItemVO.getTransferQty()).setFromId(transfer.getTransferId())
  162. .setOutingAmt(BigDecimal.ZERO).setPriceOut(BigDecimal.ZERO)
  163. .setWhId(transferItemVO.getWhId()).setNonStdCode(transferItemVO.getONonStdCode());
  164. outboundItemVOList.add(outboundItemVO);
  165. }
  166. // 赋值出库接口参数 总表和明细
  167. outboundCheckMap.put("total",outboundVO);
  168. outboundCheckMap.put("detail",outboundItemVOList);
  169. // 调用盘点出库接口
  170. OutboundVO outboundTransferVO = outboundCheckService.otherOutboundInsert(outboundCheckMap);
  171. // 赋值入库接口参数 总表和明细
  172. inboundMap.put("total", inboundVO);
  173. inboundMap.put("detail", inboundItemVOList);
  174. // 调用入库接口
  175. InboundVO inboundTransferVO = inboundCheckService.checkInboundInsert(inboundMap);
  176. // 如果库存接口返回成功,则插入调整单明细数据
  177. if (transferVO.getItemList() != null && transferVO.getItemList().size() > 0) {
  178. for (TransferItemVO transferItemVO : transferVO.getItemList()) {
  179. // 转换库存调整单明细
  180. TransferItem transferItem = transferItemConvert.convertToPo(transferItemVO);
  181. // 在入库接口中获取入库明细数据
  182. inboundItemVOList = inboundTransferVO.getItemList().stream()
  183. .filter(it -> it.getItemIndex().equals(transferItemVO.getItemIndex())).collect(Collectors.toList());
  184. // 通过入库明细数据的item_id查询出inv_id
  185. InboundItemResponse inboundItemResponse = inboundItemMapper.selectById(inboundItemVOList.get(0).getItemId());
  186. // 获取调整主表uuid
  187. transferItem.setTransferId(transfer.getTransferId()).setTransferDate(LocalDate.now())
  188. .setInvId(inboundItemResponse.getInvId());
  189. // 插入调整单明细数据
  190. transferItemMapper.insert(transferItem);
  191. // 赋值入库明细值 并修改入库明细from_item_id值
  192. InboundItem inboundItem= new InboundItem();
  193. inboundItem.setFromItemId(transferItem.getItemId()).setItemId(inboundItemResponse.getItemId());
  194. inboundItemService.updateByUuid(inboundItem);
  195. // 在出库接口中获取入库明细数据
  196. outboundItemVOList = outboundTransferVO.getItemList().stream()
  197. .filter(it -> it.getItemIndex().equals(transferItemVO.getItemIndex())).collect(Collectors.toList());
  198. // 通过出库明细数据的item_id查询出inv_id
  199. OutboundItemResponse outboundItemResponse = outboundItemMapper.selectById(outboundItemVOList.get(0).getItemId());
  200. // 赋值出库明细值 并修改出库明细from_item_id值
  201. OutboundItem outboundItem= new OutboundItem();
  202. outboundItem.setFromItemId(transferItem.getItemId()).setItemId(outboundItemResponse.getItemId());
  203. inboundItemService.updateByUuid(inboundItem);
  204. }
  205. }
  206. }
  207. // 非标号调整
  208. else{
  209. // 赋值入库实体
  210. inboundVO.setOrgId(transferVO.getOrgId()).setStaffId(transferVO.getStaffId())
  211. .setMakeStaff(transferVO.getMakeStaff()).setIntoingQty(transferQtySum)
  212. .setFromId(transfer.getTransferId()).setFromNo(transfer.getTransferNo())
  213. .setMakeTime(LocalDateTime.now()).setIntoDate(LocalDate.now()).setWhId(transferVO.getOWhId())
  214. .setFlgAutoHandle(true).setIntoingAmt(BigDecimal.ZERO)
  215. .setIntoStatus(Constant.InventoryDocCode.MOVE.getTableName());
  216. // 赋值出库实体
  217. outboundVO.setOrgId(transferVO.getOrgId()).setStaffId(transferVO.getStaffId())
  218. .setMakeStaff(transferVO.getMakeStaff()).setOutingQty(transferQtySum)
  219. .setFromId(transfer.getTransferId()).setFromNo(transfer.getTransferNo())
  220. .setMakeTime(LocalDateTime.now()).setOutDate(LocalDate.now()).setOutingAmt(BigDecimal.ZERO)
  221. .setOutStatus(Constant.InventoryDocCode.MOVE.getTableName());
  222. // 获取入库明细实体
  223. for (TransferItemVO transferItemVO : transferVO.getItemList()) {
  224. // 赋值入库明细实体
  225. InboundItemVO inboundItemVO=new InboundItemVO();
  226. inboundItemVO.setItemIndex(transferItemVO.getItemIndex()).setSkuId(transferItemVO.getSkuId())
  227. .setIntoingQty(transferItemVO.getTransferQty()).setFromId(transfer.getTransferId())
  228. .setIntoingAmt(BigDecimal.ZERO).setPriceInto(BigDecimal.ZERO)
  229. .setWhId(transferItemVO.getOWhId()).setNonStdCode(transferItemVO.getNonStdCode());
  230. inboundItemVOList.add(inboundItemVO);
  231. // 赋值出库明细信息。
  232. OutboundItemVO outboundItemVO =new OutboundItemVO();
  233. outboundItemVO.setItemIndex(transferItemVO.getItemIndex()).setSkuId(transferItemVO.getSkuId())
  234. .setOutingQty(transferItemVO.getTransferQty()).setFromId(transfer.getTransferId())
  235. .setOutingAmt(BigDecimal.ZERO).setPriceOut(BigDecimal.ZERO)
  236. .setWhId(transferItemVO.getWhId()).setNonStdCode(transferItemVO.getONonStdCode());
  237. outboundItemVOList.add(outboundItemVO);
  238. }
  239. // 赋值出库接口参数 总表和明细
  240. outboundCheckMap.put("total",outboundVO);
  241. outboundCheckMap.put("detail",outboundItemVOList);
  242. // 调用盘点出库接口
  243. OutboundVO outboundTransferVO = outboundCheckService.otherOutboundInsert(outboundCheckMap);
  244. // 赋值入库接口参数 总表和明细
  245. inboundMap.put("total", inboundVO);
  246. inboundMap.put("detail", inboundItemVOList);
  247. // 调用入库接口
  248. InboundVO inboundTransferVO = inboundCheckService.checkInboundInsert(inboundMap);
  249. // 如果库存接口返回成功,则插入调整单明细数据
  250. if (transferVO.getItemList() != null && transferVO.getItemList().size() > 0) {
  251. for (TransferItemVO transferItemVO : transferVO.getItemList()) {
  252. // 转换库存调整单明细
  253. TransferItem transferItem = transferItemConvert.convertToPo(transferItemVO);
  254. // 在入库接口中获取入库明细数据
  255. inboundItemVOList = inboundTransferVO.getItemList().stream()
  256. .filter(it -> it.getItemIndex().equals(transferItemVO.getItemIndex())).collect(Collectors.toList());
  257. // 通过入库明细数据的item_id查询出inv_id
  258. InboundItemResponse inboundItemResponse = inboundItemMapper.selectById(inboundItemVOList.get(0).getItemId());
  259. // 获取调整主表uuid
  260. transferItem.setTransferId(transfer.getTransferId()).setTransferDate(LocalDate.now())
  261. .setInvId(inboundItemResponse.getInvId());
  262. // 插入调整单明细数据
  263. transferItemMapper.insert(transferItem);
  264. // 赋值入库明细值 并修改入库明细from_item_id值
  265. InboundItem inboundItem= new InboundItem();
  266. inboundItem.setFromItemId(transferItem.getItemId()).setItemId(inboundItemResponse.getItemId());
  267. inboundItemService.updateByUuid(inboundItem);
  268. // 在出库接口中获取入库明细数据
  269. outboundItemVOList = outboundTransferVO.getItemList().stream()
  270. .filter(it -> it.getItemIndex().equals(transferItemVO.getItemIndex())).collect(Collectors.toList());
  271. // 通过出库明细数据的item_id查询出inv_id
  272. OutboundItemResponse outboundItemResponse = outboundItemMapper.selectById(outboundItemVOList.get(0).getItemId());
  273. }
  274. }
  275. }
  276. }
  277. return ResponseResultUtil.success();
  278. } catch (Exception e) {
  279. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); // 手动回滚事务
  280. return ResponseResultUtil.error("保存失败");
  281. }
  282. }
  283. /**
  284. * @desc : 作废
  285. * @author : 宋扬
  286. * @date : 2024/4/15 16:28
  287. */
  288. public ResponseResultVO<?> invalid(String id) {
  289. Transfer transferForUpdate = transferMapper.selectByIdForUpdate(id);
  290. // 并发校验
  291. if (!transferForUpdate.getFlgValid()) {
  292. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISFLGVALID_FALSE.getMessage());
  293. }
  294. // 作废
  295. Transfer transferUpdate = new Transfer();
  296. transferUpdate.setFlgValid(false).setTransferId(id);
  297. super.updateByUuid(transferUpdate);
  298. // 调用入库作废接口
  299. inboundCheckService.inboundRepeal(id);
  300. // 调用出库作废接口
  301. outboundCheckService.outboundRepeal(id);
  302. return ResponseResultUtil.success();
  303. }
  304. }