PurchaseService.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. package com.dk.mdm.service.pur;
  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.pur.PurChaseConvert;
  12. import com.dk.mdm.infrastructure.convert.pur.PurChaseItemConvert;
  13. import com.dk.mdm.mapper.common.CommonMapper;
  14. import com.dk.mdm.mapper.pur.PurchaseItemMapper;
  15. import com.dk.mdm.model.pojo.pur.Purchase;
  16. import com.dk.mdm.mapper.pur.PurchaseMapper;
  17. import com.dk.common.service.BaseService;
  18. import com.dk.common.mapper.BaseMapper;
  19. import com.dk.mdm.model.pojo.pur.PurchaseItem;
  20. import com.dk.mdm.model.query.pur.PurchaseItemQuery;
  21. import com.dk.mdm.model.query.pur.PurchaseQuery;
  22. import com.dk.mdm.model.response.pur.PurchaseItemResponse;
  23. import com.dk.mdm.model.response.pur.PurchaseResponse;
  24. import com.dk.mdm.model.vo.ivt.InboundItemVO;
  25. import com.dk.mdm.model.vo.ivt.InboundVO;
  26. import com.dk.mdm.model.vo.pur.PurchaseItemVO;
  27. import com.dk.mdm.model.vo.pur.PurchaseVO;
  28. import com.dk.mdm.service.common.CommonService;
  29. import com.dk.mdm.service.ivt.inbound.InboundItemService;
  30. import com.dk.mdm.service.ivt.inbound.InboundService;
  31. import org.springframework.stereotype.Service;
  32. import org.springframework.beans.factory.annotation.Autowired;
  33. import org.springframework.transaction.annotation.Transactional;
  34. import java.time.LocalDate;
  35. import java.time.LocalDateTime;
  36. import java.util.ArrayList;
  37. import java.util.List;
  38. import java.util.Map;
  39. import java.util.UUID;
  40. import java.util.stream.Collectors;
  41. @Service
  42. @Transactional
  43. public class PurchaseService extends BaseService<Purchase> {
  44. @Override
  45. public BaseMapper<Purchase> getRepository() {
  46. return purchaseMapper;
  47. }
  48. @Autowired
  49. private PurchaseMapper purchaseMapper;
  50. @Autowired
  51. private PurChaseConvert purChaseConvert;
  52. @Autowired
  53. private PurChaseItemConvert purchaseItemConvert;
  54. @Autowired
  55. private PurchaseItemMapper purchaseItemMapper;
  56. @Autowired
  57. private CommonMapper commonMapper;
  58. @Autowired
  59. private CommonService commonService;
  60. @Autowired
  61. private PurchaseItemService purchaseItemService;
  62. @Autowired
  63. private InboundService inboundService;
  64. @Autowired
  65. private InboundItemService inboundItemService;
  66. /**
  67. * @desc : 条件查询
  68. * @author : 常皓宁
  69. * @date : 2024/2/28 9:47
  70. */
  71. @Pagination
  72. public ResponseResultVO<PageList<PurchaseResponse>> selectByCond(PurchaseQuery purchaseQuery) {
  73. return super.mergeListWithCount(purchaseQuery, purchaseMapper.selectByCond(purchaseQuery), purchaseMapper.countByCond(purchaseQuery));
  74. }
  75. /**
  76. * @desc : 条件查询 带明细
  77. * @author : 王英杰
  78. * @date : 2024/2/28 9:47
  79. */
  80. @Pagination
  81. public ResponseResultVO<PageList<PurchaseResponse>> selectByCondItem(PurchaseQuery purchaseQuery) {
  82. return super.mergeListWithCount(purchaseQuery, purchaseMapper.selectByCondItem(purchaseQuery), purchaseMapper.countByCond(purchaseQuery));
  83. }
  84. /**
  85. * @desc : 采购订单 待入库查询
  86. * @author : 王英杰
  87. * @date : 2024/2/28 9:46
  88. */
  89. @Pagination
  90. public ResponseResultVO<PageList<PurchaseResponse>> noStoredSelectByCond(PurchaseQuery purchaseQuery) {
  91. return super.mergeListWithCount(purchaseQuery, purchaseMapper.noStoredSelectByCond(purchaseQuery), purchaseMapper.noStoredCountByCond(purchaseQuery));
  92. }
  93. /**
  94. * @desc : 新建
  95. * @author : 常皓宁
  96. * @date : 2024/2/28 9:42
  97. */
  98. @Transactional(rollbackFor = {Exception.class})
  99. public ResponseResultVO<Boolean> insert(PurchaseVO purchasevo) {
  100. //region 组织结构不能为空
  101. if (purchasevo.getOrgId() == null) {
  102. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ORGANIZATION_CANNOT_BE_EMPTY.getMessage());
  103. }
  104. //endregion
  105. //region 员工不能为空
  106. if (purchasevo.getStaffId() == null) {
  107. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.STAFF_CANNOT_BE_EMPTY.getMessage());
  108. }
  109. //endregion
  110. //region 供应商不能为空
  111. if (purchasevo.getSupId() == null) {
  112. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.SUPLIER_CANNOT_BE_EMPTY.getMessage());
  113. }
  114. //endregion
  115. //region 设置采购订单总单信息并新建
  116. // 制单时间
  117. purchasevo.setMakeTime(LocalDateTime.now());
  118. // 单据类型
  119. purchasevo.setPurType(Constant.DocumentType.PUR_CHASE.getName());
  120. // 入库状态
  121. purchasevo.setIntoStatus(Constant.IntoStatus.DAIRUKU.getName());
  122. // 订单状态
  123. purchasevo.setPurStatus(Constant.OrderStatus.STATUS_DEAL.getName());
  124. // 获取单号
  125. Map<String, Object> codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.PURCHASE.getName(), false);
  126. purchasevo.setPurId(codeMap.get("outId").toString());
  127. purchasevo.setPurNo(codeMap.get("outNote").toString());
  128. Purchase purchase = purChaseConvert.convertToPo(purchasevo);
  129. super.insert(purchase);
  130. //endregion
  131. //region 设置采购订单明细信息并新建
  132. // List<PurchaseItemVO> purchaseItemVOList = purchasevo.getPurchaseItemVOList().stream().filter(it -> it.getItemId() == null).collect(Collectors.toList());
  133. List<PurchaseItemVO> purchaseItemVOList = purchasevo.getPurchaseItemVOList();
  134. // 商品顺序
  135. for (PurchaseItemVO purchaseItemVO : purchaseItemVOList) {
  136. PurchaseItem purchaseItem = purchaseItemConvert.convertToPo(purchaseItemVO);
  137. purchaseItem.setPurId(purchase.getPurId());
  138. purchaseItem.setItemIndex(purchaseItemVO.getItemIndex());
  139. purchaseItem.setIntoStatus(Constant.IntoStatus.DAIRUKU.getName());
  140. purchaseItem.setCpId(purchase.getCpId());
  141. purchaseItem.setItemId(null);
  142. purchaseItemMapper.insert(purchaseItem);
  143. }
  144. //endregion
  145. return ResponseResultUtil.success();
  146. }
  147. /**
  148. * @desc : 新建
  149. * @author : 常皓宁
  150. * @date : 2024/2/28 9:42
  151. */
  152. @Transactional(rollbackFor = {Exception.class})
  153. public ResponseResultVO<Boolean> soldAndPurchasedInsert(PurchaseVO purchasevo) {
  154. this.insert(purchasevo);
  155. return ResponseResultUtil.success();
  156. }
  157. /**
  158. * @desc : 根据总单id查询
  159. * @author : 常皓宁
  160. * @date : 2024/2/29 9:56
  161. */
  162. public ResponseResultVO selectById(String purId) {
  163. //根据id查询
  164. PurchaseResponse purchaseResponse = purchaseMapper.selectById(purId);
  165. //不存在
  166. if (purchaseResponse == null) {
  167. return ResponseResultUtil.error(ErrorCodeEnum.PURCHASE_CANNOT_BE_EMPTY.getCode(),
  168. ErrorCodeEnum.PURCHASE_CANNOT_BE_EMPTY.getMessage());
  169. }
  170. //查询明细
  171. List<PurchaseItemResponse> purchaseItemResponses = purchaseItemMapper.selectByCond(new PurchaseItemQuery().setPurId(purId));
  172. for (PurchaseItemResponse item : purchaseItemResponses) {
  173. item.setPurNo(purchaseResponse.getPurNo());
  174. }
  175. purchaseResponse.setPurchaseItemResponseList(purchaseItemResponses);
  176. return ResponseResultUtil.success(purchaseResponse);
  177. }
  178. /**
  179. * @desc : 编辑方法
  180. * @author : 常皓宁
  181. * @date : 2024/2/28 10:57
  182. */
  183. @Transactional(
  184. rollbackFor = {Exception.class}
  185. )
  186. public ResponseResultVO<Boolean> update(PurchaseVO purchasevo) {
  187. // 转化实体
  188. Purchase purchase = purChaseConvert.convertToPo(purchasevo);
  189. //删除的
  190. List<PurchaseItemVO> deletePurchaseItemVOList = purchasevo.getDeletePurchaseItemList().stream().filter(it -> it.getItemId() != null).collect(Collectors.toList());
  191. if (deletePurchaseItemVOList.size() > 0) {
  192. for (PurchaseItemVO purchaseItemVO : deletePurchaseItemVOList) {
  193. // 非待入库单据不能删除
  194. if (!Constant.IntoStatus.DAIRUKU.getName().equals(purchaseItemVO.getIntoStatus())) {
  195. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.NO_WAIT_INTO.getMessage());
  196. } else {
  197. purchaseItemMapper.deleteById(purchaseItemVO.getItemId());
  198. }
  199. }
  200. }
  201. // 编辑的(包括新增的)
  202. // 新增的
  203. List<PurchaseItemVO> insertPurchaseItemVOList = purchasevo.getEditPurchaseItemList().stream().filter(it -> it.getItemId() == null).collect(Collectors.toList());
  204. for (PurchaseItemVO purchaseItemVO : insertPurchaseItemVOList) {
  205. PurchaseItem purchaseItem = purchaseItemConvert.convertToPo(purchaseItemVO);
  206. purchaseItem.setPurId(purchase.getPurId());
  207. purchaseItem.setItemIndex(purchaseItemVO.getItemIndex());
  208. purchaseItem.setIntoStatus(Constant.IntoStatus.DAIRUKU.getName());
  209. purchaseItem.setCpId(purchase.getCpId());
  210. purchaseItem.setFromId(purchaseItemVO.getFromId());
  211. purchaseItem.setFromItemId(purchaseItemVO.getFromItemId());
  212. purchaseItemMapper.insert(purchaseItem);
  213. }
  214. // 编辑的
  215. List<PurchaseItemVO> editPurchaseItemVOList = purchasevo.getEditPurchaseItemList().stream().filter(it -> it.getItemId() != null).collect(Collectors.toList());
  216. for (PurchaseItemVO purchaseItemVO : editPurchaseItemVOList) {
  217. // 商品数量不能小于入库中数量
  218. if (purchaseItemVO.getItemQty().compareTo(purchaseItemVO.getIntoQty()) == -1) {
  219. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ITEMQTY_NO_LESS_INTOQTY.getMessage());
  220. } else {
  221. PurchaseItem purchaseItem = purchaseItemConvert.convertToPo(purchaseItemVO);
  222. purchaseItemService.updataById(purchaseItem);
  223. }
  224. }
  225. return ResponseResultUtil.success(super.update(purchase, new UpdateWrapper<Purchase>().lambda().eq(Purchase::getPurId,
  226. UUID.fromString(purchase.getPurId ()))));
  227. }
  228. /**
  229. * @desc : 采购订单 转 采购入库 (目前废弃)
  230. * @author : 王英杰
  231. * @date : 2024年3月11日
  232. */
  233. @Transactional(
  234. rollbackFor = {Exception.class}
  235. )
  236. public ResponseResultVO<Boolean> insertInbound(PurchaseVO purchasevo) {
  237. ResponseResultVO<Boolean> result = new ResponseResultVO<>();
  238. // todo 给 inboundVO 实体放入数据
  239. InboundVO inboundVO = convertEntity(purchasevo); //转换实体
  240. inboundService.insert(inboundVO); //新建入库单
  241. //TODO 反更 采购订单 状态为已入库
  242. // PurchaseService.update(purchasevo);
  243. // 检查入库单是否成功插入
  244. if (inboundVO.getIntoId() != null) { //插入入库单成功
  245. List<InboundItemVO> itemList = new ArrayList<>();
  246. itemList = inboundVO.getItemList();
  247. for (InboundItemVO objitem : itemList) {
  248. inboundItemService.insert(objitem); //插入入库单明细
  249. //todo 插入一个 已入库明细 就要插入一个 库存明细
  250. }
  251. result.setData(true);
  252. } else {
  253. // 如果入库单插入失败,可以进行相应的处理,比如回滚事务或者返回错误信息
  254. result.setData(false);
  255. result.setMessage("插入入库单失败");
  256. }
  257. return result;
  258. }
  259. /**
  260. * @desc : 采购订单实体数据 转 入库单数据 (目前废弃)
  261. * @author : 王英杰
  262. * @date : 2024年3月11日
  263. */
  264. private InboundVO convertEntity (PurchaseVO purchaseVO){
  265. InboundVO inboundVO = new InboundVO();
  266. inboundVO.setItemList(convertEntityDetail(purchaseVO.getPurchaseItemVOList()));//转明细实体
  267. inboundVO.setIntoType("入库类型-采购入库");
  268. inboundVO.setFromId(purchaseVO.getPurId());
  269. inboundVO.setFromNo(purchaseVO.getPurNo());
  270. inboundVO.setOrgId(purchaseVO.getOrgId());
  271. inboundVO.setStaffId(purchaseVO.getStaffId());
  272. inboundVO.setCusId("");
  273. inboundVO.setSupId(purchaseVO.getSupId());
  274. inboundVO.setIntoStatus("入库状态-已入库");
  275. // inboundVO.setIntoingQty(); todo 合计 商品入库中数量
  276. // inboundVO.setIntoingAmt(); todo 合计 商品入库中金额
  277. inboundVO.setWhId(purchaseVO.getWhId());
  278. inboundVO.setIntoDate(LocalDate.now()); //入库时间为当前时间
  279. inboundVO.setRemarks(purchaseVO.getRemarks());
  280. // inboundVO.getAnnexPaths(purchaseVO.getAnnexPaths()); todo 附件
  281. inboundVO.setMakeStaff(purchaseVO.getMakeStaff());
  282. inboundVO.setMakeTime(purchaseVO.getMakeTime());
  283. inboundVO.setCpId(purchaseVO.getCpId());
  284. return inboundVO;
  285. }
  286. /**
  287. * @desc : 采购订单明细实体数据 转 入库单明细数据 (目前废弃)
  288. * @author : 王英杰
  289. * @date : 2024年3月11日
  290. */
  291. private List<InboundItemVO> convertEntityDetail( List <PurchaseItemVO> PurchaseItemVOList){
  292. List<InboundItemVO> InboundItemVOList = new ArrayList<>();
  293. for (int i=0 ; i<PurchaseItemVOList.size() ; i++){
  294. InboundItemVO inboundItemVO = new InboundItemVO();
  295. PurchaseItemVO purchaseItemVO = PurchaseItemVOList.get(i);
  296. inboundItemVO.setIntoId(purchaseItemVO.getPurId());
  297. inboundItemVO.setIntoType("入库类型-采购入库");
  298. inboundItemVO.setFromId(purchaseItemVO.getPurId());
  299. inboundItemVO.setFromItemId(purchaseItemVO.getItemId());
  300. inboundItemVO.setItemIndex(purchaseItemVO.getItemIndex());
  301. inboundItemVO.setSkuId(purchaseItemVO.getSkuId());
  302. inboundItemVO.setPriceInto(purchaseItemVO.getPricePur());
  303. // inboundItemVO.setNonStdCode(); todo 非标号
  304. inboundItemVO.setIntoStatus("入库状态-已入库");
  305. inboundItemVO.setIntoingQty(purchaseItemVO.getItemQty());
  306. inboundItemVO.setIntoingAmt(purchaseItemVO.getItemAmt());
  307. inboundItemVO.setRemarks(purchaseItemVO.getRemarks());
  308. // inboundItemVO.setInvId( ); todo 需要先生成 库存明细 在生成入库明细
  309. InboundItemVOList.add(inboundItemVO);
  310. }
  311. return InboundItemVOList;
  312. }
  313. }