CheckService.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. package com.dk.mdm.service.ivt;
  2. import com.dk.common.exception.BaseBusinessException;
  3. import com.dk.common.infrastructure.annotaiton.Pagination;
  4. import com.dk.common.infrastructure.constant.Constant;
  5. import com.dk.common.infrastructure.enums.ErrorCodeEnum;
  6. import com.dk.common.model.pojo.PageList;
  7. import com.dk.common.response.ResponseCodeEnum;
  8. import com.dk.common.response.ResponseResultUtil;
  9. import com.dk.common.response.ResponseResultVO;
  10. import com.dk.mdm.infrastructure.convert.ivt.CheckConvert;
  11. import com.dk.mdm.infrastructure.convert.ivt.CheckItemConvert;
  12. import com.dk.mdm.mapper.ivt.CheckItemMapper;
  13. import com.dk.mdm.mapper.ivt.InventoryMapper;
  14. import com.dk.mdm.model.pojo.ivt.*;
  15. import com.dk.mdm.mapper.ivt.CheckMapper;
  16. import com.dk.common.service.BaseService;
  17. import com.dk.common.mapper.BaseMapper;
  18. import com.dk.mdm.model.pojo.sale.OrderItem;
  19. import com.dk.mdm.model.query.ivt.CheckItemQuery;
  20. import com.dk.mdm.model.query.ivt.CheckQuery;
  21. import com.dk.mdm.model.query.ivt.FreezeItemQuery;
  22. import com.dk.mdm.model.query.ivt.InventoryQuery;
  23. import com.dk.mdm.model.response.ivt.*;
  24. import com.dk.mdm.model.vo.ivt.*;
  25. import com.dk.mdm.model.vo.sale.OrderItemVO;
  26. import com.dk.mdm.service.common.CommonService;
  27. import com.dk.mdm.service.ivt.inbound.InboundCheckService;
  28. import com.dk.mdm.service.ivt.outbound.OutboundCheckService;
  29. import org.springframework.stereotype.Service;
  30. import org.springframework.beans.factory.annotation.Autowired;
  31. import org.springframework.transaction.annotation.Transactional;
  32. import org.springframework.transaction.interceptor.TransactionAspectSupport;
  33. import java.math.BigDecimal;
  34. import java.time.LocalDate;
  35. import java.time.LocalDateTime;
  36. import java.util.ArrayList;
  37. import java.util.HashMap;
  38. import java.util.List;
  39. import java.util.Map;
  40. import java.util.stream.Collectors;
  41. import java.util.stream.Stream;
  42. @Service
  43. @Transactional
  44. public class CheckService extends BaseService<Check> {
  45. @Override
  46. public BaseMapper<Check> getRepository() {
  47. return checkMapper;
  48. }
  49. @Autowired
  50. private CheckMapper checkMapper;
  51. @Autowired
  52. private CheckConvert checkConvert;
  53. @Autowired
  54. private CommonService commonService;
  55. @Autowired
  56. private CheckItemConvert checkItemConvert;
  57. @Autowired
  58. private CheckItemMapper checkItemMapper;
  59. @Autowired
  60. private CheckItemService checkItemService;
  61. @Autowired
  62. private InventoryMapper inventoryMapper;
  63. @Autowired
  64. private InboundCheckService inboundCheckService;
  65. @Autowired
  66. private OutboundCheckService outboundCheckService;
  67. /**
  68. * @desc : 重写主键
  69. * @author : 宋扬
  70. * @date : 2023/3/27 10:39
  71. */
  72. @Override
  73. public String getPrimaryKey() {
  74. return "check_id";
  75. }
  76. /**
  77. * @desc : 条件查询
  78. * @author : 宋扬
  79. * @date : 2023/2/29 10:40
  80. */
  81. @Pagination
  82. public ResponseResultVO<PageList<CheckResponse>> selectByCond(CheckQuery checkQuery) {
  83. return super.mergeListWithCount(checkQuery, checkMapper.selectByCond(checkQuery),
  84. checkMapper.countByCond(checkQuery));
  85. }
  86. /**
  87. * @desc : 新建盘点单
  88. * @author : 宋扬
  89. * @date : 2024/3/27 11:08
  90. */
  91. @Transactional(rollbackFor = {Exception.class})
  92. public ResponseResultVO<?> insert(CheckVO checkVO) {
  93. // 转化实体
  94. Check check = checkConvert.convertToPo(checkVO);
  95. try {
  96. Map<String, Object> codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.Check.getName(), true);
  97. // 获取冻结状态 获取冻结日期(当前日期) 插入冻结表的实体
  98. check.setMakeTime(LocalDateTime.now()).setStaffId(checkVO.getStaffId()).setCheckId(codeMap.get("outId").toString())
  99. .setRemarks(checkVO.getRemarks()).setCheckNo(codeMap.get("outNote").toString()).setCheckDate(LocalDate.now())
  100. .setOrgId(checkVO.getOrgId()).setFlgLock(checkVO.getFlgLock()).setCheckStatus(checkVO.getCheckStatus())
  101. .setRemarks(checkVO.getRemarks()).setStaffId(checkVO.getStaffId());
  102. // 先插入盘点单主表数据
  103. super.insert(check);
  104. // 插入盘点明细
  105. if (checkVO.getItemList() != null && checkVO.getItemList().size() > 0) {
  106. for (CheckItemVO checkItemVO : checkVO.getItemList()) {
  107. CheckItem checkItem = checkItemConvert.convertToPo(checkItemVO);
  108. // 获取盘点主表uuid
  109. checkItem.setCheckId(check.getCheckId()).setCheckDate(LocalDate.now())
  110. .setOInvQty(checkItemVO.getInvQty());
  111. // 插入盘点单明细数据
  112. checkItemMapper.insert(checkItem);
  113. checkItemVO.setFromitemId(checkItem.getItemId()).setIntoingQty(checkItem.getBalanceQty()).setOutingQty(checkItem.getBalanceQty().abs())
  114. .setFromId(checkItem.getCheckId()).setPriceOut(BigDecimal.ZERO);
  115. }
  116. }
  117. // 判断盘点点状态,如果是完成,需要生成出入库数据
  118. if(checkVO.getCheckStatus().equals(Constant.CheckkStatus.CHECK_STATUS_DONE.getName())){
  119. // 定义入库Map
  120. Map<String, Object> inboundCheckMap= new HashMap<>();
  121. // 定义出库Map
  122. Map<String, Object> outboundCheckMap= new HashMap<>();
  123. // 获取入库明细实体
  124. List<CheckItemVO> inCheckItemVOList = checkVO.getItemList().stream().filter(it -> it.getBalanceQty().compareTo(BigDecimal.ZERO) > 0).collect(Collectors.toList());
  125. // 盘点差额大于零,则为盘盈数据需生成盘盈入库
  126. if(inCheckItemVOList!=null && inCheckItemVOList.size()>0){
  127. // 计算总入库量
  128. BigDecimal intoQtySum = inCheckItemVOList.stream().map(CheckItemVO::getBalanceQty).reduce(BigDecimal.ZERO, BigDecimal::add)
  129. .setScale(6, BigDecimal.ROUND_HALF_UP);
  130. // 计算总入库金额
  131. BigDecimal intoingAmtSum = inCheckItemVOList.stream().map(CheckItemVO::getIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add)
  132. .setScale(6, BigDecimal.ROUND_HALF_UP);
  133. // 获取入库总表实体
  134. InboundVO inboundVO = new InboundVO();
  135. inboundVO.setOrgId(checkVO.getOrgId()).setStaffId(checkVO.getStaffId()==null?checkVO.getMakeStaff():checkVO.getStaffId())
  136. .setMakeStaff(checkVO.getMakeStaff()).setIntoingQty(intoQtySum).setFromId(check.getCheckId()).setFromNo(check.getCheckNo())
  137. .setMakeTime(LocalDateTime.now()).setIntoDate(LocalDate.now()).setWhId(checkVO.getWhId())
  138. .setFlgAutoHandle(true).setIntoingAmt(intoingAmtSum);
  139. // 赋值入库接口参数 总表和明细
  140. inboundCheckMap.put("total",inboundVO);
  141. inboundCheckMap.put("detail",inCheckItemVOList);
  142. // 调用入库接口
  143. inboundCheckService.checkInboundInsert(inboundCheckMap);
  144. }
  145. // 获取出库明细实体
  146. List<CheckItemVO> outCheckItemVOList = checkVO.getItemList().stream().filter(it -> it.getBalanceQty().compareTo(BigDecimal.ZERO) < 0).collect(Collectors.toList());
  147. // 盘点差额小于零,则为盘亏数据需生成盘亏出库
  148. if(outCheckItemVOList!=null && outCheckItemVOList.size()>0){
  149. // 计算总出库量
  150. BigDecimal outtoQtySum = outCheckItemVOList.stream().map(CheckItemVO::getBalanceQty).reduce(BigDecimal.ZERO, BigDecimal::add)
  151. .setScale(6, BigDecimal.ROUND_HALF_UP);
  152. // 获取出库总表实体
  153. OutboundVO outboundVO = new OutboundVO();
  154. outboundVO.setOrgId(checkVO.getOrgId()).setStaffId(checkVO.getStaffId()==null?checkVO.getMakeStaff():checkVO.getStaffId())
  155. .setMakeStaff(checkVO.getMakeStaff()).setOutingQty(outtoQtySum.abs()).setFromId(checkVO.getCheckId()).setFromNo(checkVO.getCheckNo())
  156. .setMakeTime(LocalDateTime.now()).setOutDate(LocalDate.now()).setOutingAmt(BigDecimal.ZERO);
  157. // 赋值出库接口参数 总表和明细
  158. outboundCheckMap.put("total",outboundVO);
  159. outboundCheckMap.put("detail",outCheckItemVOList);
  160. // 调用盘点出库接口
  161. outboundCheckService.otherOutboundInsert(outboundCheckMap);
  162. }
  163. }
  164. return ResponseResultUtil.success();
  165. } catch (Exception e) {
  166. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); // 手动回滚事务
  167. return ResponseResultUtil.error("保存失败");
  168. }
  169. }
  170. /**
  171. * @desc : 通过ID获取编辑盘点单信息
  172. * @author : 宋扬
  173. * @date : 2024/3/28 15:38
  174. */
  175. public ResponseResultVO<?> getCheckForUpdate(String id) {
  176. Map<String, Object> dataInfo = new HashMap<>();
  177. CheckResponse checkResponse = checkMapper.selectById(id);
  178. dataInfo.put("data", checkResponse);
  179. // 商品明细
  180. List<CheckItemResponse> checkItem = checkItemMapper.selectByCond(new CheckItemQuery().setCheckId(id));
  181. dataInfo.put("dataItem", checkItem);
  182. return ResponseResultUtil.success(dataInfo);
  183. }
  184. /**
  185. * @desc : 编辑盘点单
  186. * @author : 宋扬
  187. * @date : 2024/3/28 16:51
  188. */
  189. @Transactional(
  190. rollbackFor = {Exception.class}
  191. )
  192. public ResponseResultVO<?> update(CheckVO checkVO) {
  193. // 明细实体(避免并发,需要再查一遍)
  194. CheckItem checkItemForUpdate;
  195. // 转化实体
  196. Check check = checkConvert.convertToPo(checkVO);
  197. // 存货实体
  198. InventoryQuery query;
  199. //删除的
  200. List<CheckItemVO> deleteCheckItemVOList = checkVO.getDeleteItemList().stream().filter(it -> it.getItemId() != null).collect(Collectors.toList());
  201. if (deleteCheckItemVOList.size() > 0) {
  202. for (CheckItemVO checkItemVO : deleteCheckItemVOList) {
  203. checkItemForUpdate = checkItemMapper.selectByIdForUpdate(checkItemVO.getItemId());
  204. checkItemMapper.deleteById(checkItemVO.getItemId());
  205. }
  206. }
  207. //新建
  208. List<CheckItemVO> insertCheckItemVOList = checkVO.getItemList().stream().filter(it -> it.getItemId() == null).collect(Collectors.toList());
  209. for (CheckItemVO checkItemVO : insertCheckItemVOList) {
  210. CheckItem checkItem = checkItemConvert.convertToPo(checkItemVO);
  211. // 获取盘点主表uuid
  212. checkItem.setCheckId(check.getCheckId()).setCheckDate(LocalDate.now())
  213. .setOInvQty(checkItemVO.getInvQty());
  214. // 插入盘点单明细数据
  215. checkItemMapper.insert(checkItem);
  216. checkItemVO.setFromitemId(checkItem.getItemId()).setIntoingQty(checkItem.getBalanceQty())
  217. .setOutingQty(checkItem.getBalanceQty().abs()).setFromId(checkItem.getCheckId())
  218. .setPriceOut(BigDecimal.ZERO);
  219. }
  220. // 编辑
  221. List<CheckItemVO> editCheckItemVOList = checkVO.getItemList().stream().filter(it -> it.getItemId() != null).collect(Collectors.toList());
  222. for (CheckItemVO checkItemVO : editCheckItemVOList) {
  223. // 查询锁表
  224. checkItemForUpdate = checkItemMapper.selectByIdForUpdate(checkItemVO.getItemId());
  225. // 转化实体
  226. CheckItem checkItem = checkItemConvert.convertToPo(checkItemVO);
  227. // 获取存货明细里的存货数量
  228. InventoryResponse inventoryResponse = inventoryMapper.selectById(checkItemVO.getInvId());
  229. // 赋值库存数量
  230. checkItem.setInvQty(inventoryResponse.getInvQty());
  231. // 修改盘点明细
  232. checkItemService.updateByUuid(checkItem);
  233. }
  234. // 赋值盘点状态、ID和备注
  235. check.setCheckId(checkVO.getCheckId()).setCheckStatus(checkVO.getCheckStatus()).setRemarks(checkVO.getRemarks());
  236. // 判断盘点点状态,如果是完成,需要生成出入库数据
  237. if(checkVO.getCheckStatus().equals(Constant.CheckkStatus.CHECK_STATUS_DONE.getName())){
  238. // 定义入库Map
  239. Map<String, Object> inboundCheckMap= new HashMap<>();
  240. // 定义出库Map
  241. Map<String, Object> outboundCheckMap= new HashMap<>();
  242. // 获取入库明细实体
  243. List<CheckItemVO> inCheckItemVOList = checkVO.getItemList().stream().filter(it -> it.getBalanceQty().compareTo(BigDecimal.ZERO) > 0).collect(Collectors.toList());
  244. // 盘点差额大于零,则为盘盈数据需生成盘盈入库
  245. if(inCheckItemVOList!=null && inCheckItemVOList.size()>0){
  246. // 计算总入库量
  247. BigDecimal intoQtySum = inCheckItemVOList.stream().map(CheckItemVO::getBalanceQty).reduce(BigDecimal.ZERO, BigDecimal::add)
  248. .setScale(6, BigDecimal.ROUND_HALF_UP);
  249. // 计算总入库金额
  250. BigDecimal intoingAmtSum = inCheckItemVOList.stream().map(CheckItemVO::getIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add)
  251. .setScale(6, BigDecimal.ROUND_HALF_UP);
  252. // 获取入库总表实体
  253. InboundVO inboundVO = new InboundVO();
  254. inboundVO.setOrgId(checkVO.getOrgId()).setStaffId(checkVO.getStaffId()==null?checkVO.getMakeStaff():checkVO.getStaffId())
  255. .setMakeStaff(checkVO.getMakeStaff()).setIntoingQty(intoQtySum).setFromId(checkVO.getCheckId())
  256. .setFromNo(checkVO.getCheckNo()).setMakeTime(LocalDateTime.now()).setIntoDate(LocalDate.now()).setWhId(checkVO.getWhId())
  257. .setFlgAutoHandle(true).setIntoingAmt(intoingAmtSum);
  258. // 赋值入库接口参数 总表和明细
  259. inboundCheckMap.put("total",inboundVO);
  260. inboundCheckMap.put("detail",inCheckItemVOList);
  261. // 调用入库接口
  262. inboundCheckService.checkInboundInsert(inboundCheckMap);
  263. }
  264. // 获取出库明细实体
  265. List<CheckItemVO> outCheckItemVOList = checkVO.getItemList().stream().filter(it -> it.getBalanceQty().compareTo(BigDecimal.ZERO) < 0).collect(Collectors.toList());
  266. // 盘点差额小于零,则为盘亏数据需生成盘亏出库
  267. if(inCheckItemVOList!=null && inCheckItemVOList.size()>0){
  268. // 计算总出库量
  269. BigDecimal outtoQtySum = outCheckItemVOList.stream().map(CheckItemVO::getBalanceQty).reduce(BigDecimal.ZERO, BigDecimal::add)
  270. .setScale(6, BigDecimal.ROUND_HALF_UP);
  271. // 获取出库总表实体
  272. OutboundVO outboundVO = new OutboundVO();
  273. outboundVO.setOrgId(checkVO.getOrgId()).setStaffId(checkVO.getStaffId()==null?checkVO.getMakeStaff():checkVO.getStaffId())
  274. .setMakeStaff(checkVO.getMakeStaff()).setOutingQty(outtoQtySum.abs()).setFromId(checkVO.getCheckId())
  275. .setFromNo(checkVO.getCheckNo()).setMakeTime(LocalDateTime.now()).setOutDate(LocalDate.now()).setOutingAmt(BigDecimal.ZERO);
  276. // 赋值出库接口参数 总表和明细
  277. outboundCheckMap.put("total",outboundVO);
  278. outboundCheckMap.put("detail",inCheckItemVOList);
  279. // 调用盘点出库接口
  280. outboundCheckService.otherOutboundInsert(outboundCheckMap);
  281. }
  282. }
  283. // 更新盘点总单
  284. return ResponseResultUtil.success(super.updateByUuid(check));
  285. }
  286. }