PurchaseService.java 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574
  1. package com.dk.mdm.service.pur;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  4. import com.dk.common.exception.BaseBusinessException;
  5. import com.dk.common.infrastructure.annotaiton.Pagination;
  6. import com.dk.common.infrastructure.constant.Constant;
  7. import com.dk.common.infrastructure.enums.ErrorCodeEnum;
  8. import com.dk.common.model.pojo.PageList;
  9. import com.dk.common.response.ResponseCodeEnum;
  10. import com.dk.common.response.ResponseResultUtil;
  11. import com.dk.common.response.ResponseResultVO;
  12. import com.dk.mdm.infrastructure.convert.ivt.InboundConvert;
  13. import com.dk.mdm.infrastructure.convert.ivt.InboundItemConvert;
  14. import com.dk.mdm.infrastructure.convert.pur.PurChaseConvert;
  15. import com.dk.mdm.infrastructure.convert.pur.PurChaseItemConvert;
  16. import com.dk.mdm.mapper.common.CommonMapper;
  17. import com.dk.mdm.mapper.ivt.InboundItemMapper;
  18. import com.dk.mdm.mapper.ivt.InboundMapper;
  19. import com.dk.mdm.mapper.ivt.InventoryMapper;
  20. import com.dk.mdm.mapper.mst.GoodsSkuMapper;
  21. import com.dk.mdm.mapper.pur.PurchaseItemMapper;
  22. import com.dk.mdm.model.pojo.mst.GoodsSku;
  23. import com.dk.mdm.model.pojo.pur.Purchase;
  24. import com.dk.mdm.mapper.pur.PurchaseMapper;
  25. import com.dk.common.service.BaseService;
  26. import com.dk.common.mapper.BaseMapper;
  27. import com.dk.mdm.model.pojo.pur.PurchaseItem;
  28. import com.dk.mdm.model.pojo.sale.Order;
  29. import com.dk.mdm.model.query.ivt.InboundItemQuery;
  30. import com.dk.mdm.model.query.ivt.InventoryQuery;
  31. import com.dk.mdm.model.query.pur.PurchaseItemQuery;
  32. import com.dk.mdm.model.query.pur.PurchaseQuery;
  33. import com.dk.mdm.model.response.ivt.InboundItemResponse;
  34. import com.dk.mdm.model.response.ivt.InventoryResponse;
  35. import com.dk.mdm.model.response.mst.GoodsSkuResponse;
  36. import com.dk.mdm.model.response.pur.PurchaseItemResponse;
  37. import com.dk.mdm.model.response.pur.PurchaseResponse;
  38. import com.dk.mdm.model.vo.ivt.InboundItemVO;
  39. import com.dk.mdm.model.vo.ivt.InboundVO;
  40. import com.dk.mdm.model.vo.ivt.OutboundItemVO;
  41. import com.dk.mdm.model.vo.ivt.OutboundVO;
  42. import com.dk.mdm.model.vo.pur.PurchaseItemVO;
  43. import com.dk.mdm.model.vo.pur.PurchaseVO;
  44. import com.dk.mdm.service.common.CommonService;
  45. import com.dk.mdm.service.ivt.inbound.InboundItemService;
  46. import com.dk.mdm.service.ivt.inbound.InboundPurchaseReturnService;
  47. import com.dk.mdm.service.ivt.inbound.InboundPurchaseService;
  48. import com.dk.mdm.service.ivt.inbound.InboundService;
  49. import org.springframework.stereotype.Service;
  50. import org.springframework.beans.factory.annotation.Autowired;
  51. import org.springframework.transaction.annotation.Transactional;
  52. import java.math.BigDecimal;
  53. import java.math.RoundingMode;
  54. import java.time.LocalDate;
  55. import java.time.LocalDateTime;
  56. import java.util.ArrayList;
  57. import java.util.List;
  58. import java.util.Map;
  59. import java.util.UUID;
  60. import java.util.stream.Collectors;
  61. @Service
  62. @Transactional
  63. public class PurchaseService extends BaseService<Purchase> {
  64. @Override
  65. public BaseMapper<Purchase> getRepository() {
  66. return purchaseMapper;
  67. }
  68. @Autowired
  69. private PurchaseMapper purchaseMapper;
  70. @Autowired
  71. private PurChaseConvert purChaseConvert;
  72. @Autowired
  73. private PurChaseItemConvert purchaseItemConvert;
  74. @Autowired
  75. private PurchaseItemMapper purchaseItemMapper;
  76. @Autowired
  77. private CommonMapper commonMapper;
  78. @Autowired
  79. private CommonService commonService;
  80. @Autowired
  81. private PurchaseItemService purchaseItemService;
  82. @Autowired
  83. private InboundService inboundService;
  84. @Autowired
  85. private InboundItemService inboundItemService;
  86. @Autowired
  87. private InboundItemConvert inboundItemConvert;
  88. @Autowired
  89. private InboundConvert inboundConvert;
  90. @Autowired
  91. private GoodsSkuMapper goodsSkuMapper;
  92. @Autowired
  93. private InboundPurchaseService inboundPurchaseService;
  94. @Autowired
  95. private InboundItemMapper inboundItemMapper;
  96. /**
  97. * @desc : 条件查询
  98. * @author : 常皓宁
  99. * @date : 2024/2/28 9:47
  100. */
  101. @Pagination
  102. public ResponseResultVO<PageList<PurchaseResponse>> selectByCond(PurchaseQuery purchaseQuery) {
  103. return super.mergeListWithCount(purchaseQuery, purchaseMapper.selectByCond(purchaseQuery), purchaseMapper.countByCond(purchaseQuery));
  104. }
  105. /**
  106. * @desc : 条件查询 带明细(采购入库 查询采购订单 过滤已入库数据)
  107. * @author : 王英杰
  108. * @date : 2024/2/28 9:47
  109. */
  110. @Pagination
  111. public ResponseResultVO<PageList<Map<String, Object>>> selectByCondItem(PurchaseQuery purchaseQuery) {
  112. return super.mergeListWithCount(purchaseQuery, purchaseMapper.selectPurOrderAndDeatil(purchaseQuery), purchaseMapper.countByCond(purchaseQuery));
  113. }
  114. /**
  115. * @desc : 采购订单 待入库查询
  116. * @author : 王英杰
  117. * @date : 2024/2/28 9:46
  118. */
  119. @Pagination
  120. public ResponseResultVO<PageList<PurchaseResponse>> noStoredSelectByCond(PurchaseQuery purchaseQuery) {
  121. return super.mergeListWithCount(purchaseQuery, purchaseMapper.noStoredSelectByCond(purchaseQuery), purchaseMapper.noStoredCountByCond(purchaseQuery));
  122. }
  123. /**
  124. * @desc : 新建
  125. * @author : 常皓宁
  126. * @date : 2024/2/28 9:42
  127. */
  128. @Transactional(rollbackFor = {Exception.class})
  129. public ResponseResultVO<Boolean> insert(PurchaseVO purchasevo) {
  130. //region 组织结构不能为空
  131. if (purchasevo.getOrgId() == null) {
  132. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ORGANIZATION_CANNOT_BE_EMPTY.getMessage());
  133. }
  134. //endregion
  135. //region 员工不能为空
  136. if (purchasevo.getStaffId() == null) {
  137. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.STAFF_CANNOT_BE_EMPTY.getMessage());
  138. }
  139. //endregion
  140. //region 供应商不能为空
  141. if (purchasevo.getSupId() == null) {
  142. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.SUPLIER_CANNOT_BE_EMPTY.getMessage());
  143. }
  144. //endregion
  145. //region 设置采购订单总单信息并新建
  146. // 制单时间
  147. purchasevo.setMakeTime(LocalDateTime.now());
  148. // 单据类型
  149. purchasevo.setPurType(Constant.DocumentType.PUR_CHASE.getName());
  150. // 订单状态
  151. purchasevo.setPurStatus(Constant.OrderStatus.STATUS_DEAL.getName());
  152. // 获取单号
  153. Map<String, Object> codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.PURCHASE.getName(), false);
  154. purchasevo.setPurId(codeMap.get("outId").toString());
  155. purchasevo.setPurNo(codeMap.get("outNote").toString());
  156. Purchase purchase = purChaseConvert.convertToPo(purchasevo);
  157. super.insert(purchase);
  158. purchasevo.setPurId(purchase.getPurId());
  159. //endregion
  160. //region 设置采购订单明细信息并新建
  161. // List<PurchaseItemVO> purchaseItemVOList = purchasevo.getPurchaseItemVOList().stream().filter(it -> it.getItemId() == null).collect(Collectors.toList());
  162. // List<PurchaseItemVO> purchaseItemVOList = purchasevo.getPurchaseItemVOList();
  163. // 商品顺序
  164. for (PurchaseItemVO purchaseItemVO : purchasevo.getPurchaseItemVOList()) {
  165. PurchaseItem purchaseItem = purchaseItemConvert.convertToPo(purchaseItemVO);
  166. purchaseItem.setPurId(purchase.getPurId());
  167. purchaseItem.setItemIndex(purchaseItemVO.getItemIndex());
  168. purchaseItem.setCpId(purchase.getCpId());
  169. // purchaseItem.setItemId(null);
  170. purchaseItem.setPriceDiscount(purchaseItemVO.getPriceDiscount());
  171. purchaseItemMapper.insert(purchaseItem);
  172. purchaseItemVO.setItemId(purchaseItem.getItemId());
  173. }
  174. //endregion
  175. /****************************************判断是否生成采购入库单****************************************/
  176. //region 判断是否生成采购入库单
  177. if(purchasevo.getInboundProcessingFlag()!=null && purchasevo.getInboundProcessingFlag()){
  178. List<InboundItemVO> inboundItemVOList = new ArrayList<>();
  179. //region 明细
  180. for (PurchaseItemVO purchaseItemVO : purchasevo.getPurchaseItemVOList()) {
  181. //region 采购订单明细转换采购入库明细
  182. InboundItemVO inboundItemVO = inboundItemConvert.convertPurchaseItemVOToInboundItemVO(purchaseItemVO);
  183. //endregion
  184. //region 赋值 采购订单明细和入库单明细不一致的字段要单独set
  185. //id制空,这里的id经过转换以后是采购订单明细的id
  186. inboundItemVO.setItemId(null);
  187. //来源id
  188. inboundItemVO.setFromId(purchasevo.getPurId());
  189. //来源明细id
  190. inboundItemVO.setFromItemId(purchaseItemVO.getItemId());
  191. //入库价
  192. inboundItemVO.setPriceInto(purchaseItemVO.getPricePur());
  193. //入库中数量
  194. inboundItemVO.setIntoingQty(purchaseItemVO.getItemQty());
  195. //已入库数量
  196. inboundItemVO.setIntoingAmt(purchaseItemVO.getItemAmt());
  197. //todo 2024年7月10日10:19:01 成本单价和成本金额取前台传入的采购单价和采购金额 dl和z确认
  198. //成本单价
  199. inboundItemVO.setCostPrice(purchaseItemVO.getPricePur());
  200. //成本基恩
  201. inboundItemVO.setCostAmt(purchaseItemVO.getItemAmt());
  202. //endregion
  203. //region 根据sku查询商品信息
  204. if (inboundItemVO.getSkuId() != null) {
  205. GoodsSkuResponse goodsSku = goodsSkuMapper.selectById(inboundItemVO.getSkuId());
  206. //商品名称
  207. inboundItemVO.setSkuName(goodsSku.getSkuName());
  208. //商品型号
  209. inboundItemVO.setSkuModel(goodsSku.getSkuModel());
  210. }
  211. //endregion
  212. //region 箱片计算
  213. //入库中 或者待入库
  214. if (Constant.IntoStatus.RUKUZHONG.getName().equals(inboundItemVO.getIntoStatus()) ||
  215. Constant.IntoStatus.DAIRUKU.getName().equals(inboundItemVO.getIntoStatus())) {
  216. //箱
  217. inboundItemVO.setIntoingBox(Integer.valueOf(inboundItemVO.getIntoingQty().divide(inboundItemVO.getPackBox(), 0, RoundingMode.DOWN).toString()));
  218. //片
  219. inboundItemVO.setIntoingPiece(inboundItemVO.getIntoingQty().remainder(inboundItemVO.getPackBox()));
  220. }
  221. //已入库
  222. else {
  223. //箱
  224. inboundItemVO.setIntoBox(Integer.valueOf(inboundItemVO.getIntoingQty().divide(inboundItemVO.getPackBox(), 0, RoundingMode.DOWN).toString()));
  225. //片
  226. inboundItemVO.setIntoPiece(inboundItemVO.getIntoingQty().remainder(inboundItemVO.getPackBox()));
  227. }
  228. //endregion
  229. //region 入库明细list添加
  230. inboundItemVOList.add(inboundItemVO);
  231. //endregion
  232. }
  233. //endregion
  234. //region 总单
  235. InboundVO inboundVO = inboundConvert.convertPurchaseVOToInboundVO(purchasevo);
  236. //入库中数量
  237. inboundVO.setIntoingQty(purchasevo.getSumQuantity());
  238. //已入库数量
  239. inboundVO.setIntoingAmt(purchasevo.getSumAmount());
  240. inboundVO.setItemList(inboundItemVOList);
  241. //来源id
  242. inboundVO.setFromId(purchasevo.getPurId());
  243. //来源单号
  244. inboundVO.setFromNo(purchasevo.getPurNo());
  245. //endregion
  246. //新建采购入库单
  247. inboundPurchaseService.purchaseInboundInsert(inboundVO);
  248. }
  249. //endregion
  250. /****************************************判断是否生成采购入库单****************************************/
  251. return ResponseResultUtil.success();
  252. }
  253. /**
  254. * @desc : 新建
  255. * @author : 常皓宁
  256. * @date : 2024/2/28 9:42
  257. */
  258. @Transactional(rollbackFor = {Exception.class})
  259. public ResponseResultVO<Boolean> soldAndPurchasedInsert(PurchaseVO purchasevo) {
  260. this.insert(purchasevo);
  261. return ResponseResultUtil.success();
  262. }
  263. /**
  264. * @desc : 根据总单id查询
  265. * @author : 常皓宁
  266. * @date : 2024/2/29 9:56
  267. */
  268. public ResponseResultVO selectById(String purId) {
  269. //根据id查询
  270. PurchaseResponse purchaseResponse = purchaseMapper.selectById(purId);
  271. //不存在
  272. if (purchaseResponse == null) {
  273. return ResponseResultUtil.error(ErrorCodeEnum.PURCHASE_CANNOT_BE_EMPTY.getCode(),
  274. ErrorCodeEnum.PURCHASE_CANNOT_BE_EMPTY.getMessage());
  275. }
  276. //查询明细
  277. List<PurchaseItemResponse> purchaseItemResponses = purchaseItemMapper.selectByCond(new PurchaseItemQuery().setPurId(purId));
  278. for (PurchaseItemResponse item : purchaseItemResponses) {
  279. item.setPurNo(purchaseResponse.getPurNo());
  280. }
  281. purchaseResponse.setPurchaseItemResponseList(purchaseItemResponses);
  282. return ResponseResultUtil.success(purchaseResponse);
  283. }
  284. /**
  285. * @desc : 转入库 查询采购订单 总单带明细(过滤明细已入库数据)
  286. * @author : 王英杰
  287. * @date : 2024/2/28 14:56
  288. */
  289. public ResponseResultVO purSelectById(String purId) {
  290. //根据id查询
  291. PurchaseResponse purchaseResponse = purchaseMapper.selectById(purId);
  292. //不存在
  293. if (purchaseResponse == null) {
  294. return ResponseResultUtil.error(ErrorCodeEnum.PURCHASE_CANNOT_BE_EMPTY.getCode(),
  295. ErrorCodeEnum.PURCHASE_CANNOT_BE_EMPTY.getMessage());
  296. }
  297. //查询明细 (过滤掉已入库数据)
  298. List<PurchaseItemResponse> purchaseItemResponses = purchaseItemMapper.purSelectByCond(new PurchaseItemQuery().setPurId(purId));
  299. for (PurchaseItemResponse item : purchaseItemResponses) {
  300. item.setPurNo(purchaseResponse.getPurNo());
  301. }
  302. purchaseResponse.setPurchaseItemResponseList(purchaseItemResponses);
  303. return ResponseResultUtil.success(purchaseResponse);
  304. }
  305. /**
  306. * @desc : 编辑方法
  307. * @author : 常皓宁
  308. * @date : 2024/2/28 10:57
  309. */
  310. @Transactional(
  311. rollbackFor = {Exception.class}
  312. )
  313. public ResponseResultVO<Boolean> update(PurchaseVO purchasevo) {
  314. // 转化实体
  315. Purchase purchase = purChaseConvert.convertToPo(purchasevo);
  316. //删除的
  317. List<PurchaseItemVO> deletePurchaseItemVOList = purchasevo.getDeletePurchaseItemList().stream().filter(it -> it.getItemId() != null).collect(Collectors.toList());
  318. if (deletePurchaseItemVOList.size() > 0) {
  319. for (PurchaseItemVO purchaseItemVO : deletePurchaseItemVOList) {
  320. // 非待入库单据不能删除
  321. if (!Constant.IntoStatus.DAIRUKU.getName().equals(purchaseItemVO.getIntoStatus())) {
  322. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.NO_WAIT_INTO.getMessage());
  323. } else {
  324. purchaseItemMapper.deleteById(purchaseItemVO.getItemId());
  325. }
  326. }
  327. }
  328. // 编辑的(包括新增的)
  329. // 新增的
  330. List<PurchaseItemVO> insertPurchaseItemVOList = purchasevo.getEditPurchaseItemList().stream().filter(it -> it.getItemId() == null).collect(Collectors.toList());
  331. for (PurchaseItemVO purchaseItemVO : insertPurchaseItemVOList) {
  332. PurchaseItem purchaseItem = purchaseItemConvert.convertToPo(purchaseItemVO);
  333. purchaseItem.setPurId(purchase.getPurId());
  334. purchaseItem.setItemIndex(purchaseItemVO.getItemIndex());
  335. purchaseItem.setIntoStatus(Constant.IntoStatus.DAIRUKU.getName());
  336. purchaseItem.setCpId(purchase.getCpId());
  337. purchaseItem.setFromId(purchaseItemVO.getFromId());
  338. purchaseItem.setFromItemId(purchaseItemVO.getFromItemId());
  339. purchaseItem.setPriceDiscount(purchaseItemVO.getPriceDiscount());
  340. purchaseItemMapper.insert(purchaseItem);
  341. }
  342. // 编辑的
  343. List<PurchaseItemVO> editPurchaseItemVOList = purchasevo.getEditPurchaseItemList().stream().filter(it -> it.getItemId() != null).collect(Collectors.toList());
  344. for (PurchaseItemVO purchaseItemVO : editPurchaseItemVOList) {
  345. // 商品数量不能小于可转入库数量数量(入库中+已入库)
  346. if (purchaseItemVO.getItemQty().compareTo(purchaseItemVO.getIntoQty().add(purchaseItemVO.getIntoingQty())) == -1) {
  347. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ITEMQTY_NO_LESS_INTOQTY.getMessage());
  348. } else {
  349. PurchaseItem purchaseItem = purchaseItemConvert.convertToPo(purchaseItemVO);
  350. purchaseItemService.updataById(purchaseItem);
  351. }
  352. }
  353. return ResponseResultUtil.success(super.update(purchase, new UpdateWrapper<Purchase>().lambda().eq(Purchase::getPurId,
  354. UUID.fromString(purchase.getPurId ()))));
  355. }
  356. /**
  357. * @desc : 作废
  358. * @author : 常皓宁
  359. * @date : 2024-03-08 16:38
  360. */
  361. public ResponseResultVO<?> invalid(String id) {
  362. Purchase purForUpdate = purchaseMapper.selectByIdForUpdate(id);
  363. // 并发校验
  364. if (!purForUpdate.getFlgValid()) {
  365. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISFLGVALID_FALSE.getMessage());
  366. }
  367. // 如果入库中数量或已入库数量不是0,不能作废
  368. if (purForUpdate.getIntoQty().compareTo(BigDecimal.ZERO) != 0 || purForUpdate.getIntoingQty().compareTo(BigDecimal.ZERO) != 0) {
  369. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISEXISTS_AFTER_OPERATE.getMessage());
  370. }
  371. // 作废
  372. Purchase purUpdate = new Purchase();
  373. purUpdate.setFlgValid(false).setPurId(id);
  374. super.update(purUpdate, new UpdateWrapper<Purchase>().lambda().eq(Purchase::getPurId,
  375. UUID.fromString(purUpdate.getPurId ())));
  376. return ResponseResultUtil.success();
  377. }
  378. /**
  379. * @desc : 采购订单 转 采购入库 (目前废弃)
  380. * @author : 王英杰
  381. * @date : 2024年3月11日
  382. */
  383. @Transactional(
  384. rollbackFor = {Exception.class}
  385. )
  386. public ResponseResultVO<Boolean> insertInbound(PurchaseVO purchasevo) {
  387. ResponseResultVO<Boolean> result = new ResponseResultVO<>();
  388. // todo 给 inboundVO 实体放入数据
  389. InboundVO inboundVO = convertEntity(purchasevo); //转换实体
  390. inboundService.insert(inboundVO); //新建入库单
  391. //TODO 反更 采购订单 状态为已入库
  392. // PurchaseService.update(purchasevo);
  393. // 检查入库单是否成功插入
  394. if (inboundVO.getIntoId() != null) { //插入入库单成功
  395. List<InboundItemVO> itemList = new ArrayList<>();
  396. itemList = inboundVO.getItemList();
  397. for (InboundItemVO objitem : itemList) {
  398. inboundItemService.insert(objitem); //插入入库单明细
  399. //todo 插入一个 已入库明细 就要插入一个 库存明细
  400. }
  401. result.setData(true);
  402. } else {
  403. // 如果入库单插入失败,可以进行相应的处理,比如回滚事务或者返回错误信息
  404. result.setData(false);
  405. result.setMessage("插入入库单失败");
  406. }
  407. return result;
  408. }
  409. /**
  410. * @desc : 采购订单实体数据 转 入库单数据 (目前废弃)
  411. * @author : 王英杰
  412. * @date : 2024年3月11日
  413. */
  414. private InboundVO convertEntity (PurchaseVO purchaseVO){
  415. InboundVO inboundVO = new InboundVO();
  416. inboundVO.setItemList(convertEntityDetail(purchaseVO.getPurchaseItemVOList()));//转明细实体
  417. inboundVO.setIntoType("入库类型-采购入库");
  418. inboundVO.setFromId(purchaseVO.getPurId());
  419. inboundVO.setFromNo(purchaseVO.getPurNo());
  420. inboundVO.setOrgId(purchaseVO.getOrgId());
  421. inboundVO.setStaffId(purchaseVO.getStaffId());
  422. inboundVO.setCusId("");
  423. inboundVO.setSupId(purchaseVO.getSupId());
  424. inboundVO.setIntoStatus("入库状态-已入库");
  425. // inboundVO.setIntoingQty(); todo 合计 商品入库中数量
  426. // inboundVO.setIntoingAmt(); todo 合计 商品入库中金额
  427. inboundVO.setWhId(purchaseVO.getWhId());
  428. inboundVO.setIntoDate(LocalDate.now()); //入库时间为当前时间
  429. inboundVO.setRemarks(purchaseVO.getRemarks());
  430. // inboundVO.getAnnexPaths(purchaseVO.getAnnexPaths()); todo 附件
  431. inboundVO.setMakeStaff(purchaseVO.getMakeStaff());
  432. inboundVO.setMakeTime(purchaseVO.getMakeTime());
  433. inboundVO.setCpId(purchaseVO.getCpId());
  434. return inboundVO;
  435. }
  436. /**
  437. * @desc : 采购订单明细实体数据 转 入库单明细数据 (目前废弃)
  438. * @author : 王英杰
  439. * @date : 2024年3月11日
  440. */
  441. private List<InboundItemVO> convertEntityDetail( List <PurchaseItemVO> PurchaseItemVOList){
  442. List<InboundItemVO> InboundItemVOList = new ArrayList<>();
  443. for (int i=0 ; i<PurchaseItemVOList.size() ; i++){
  444. InboundItemVO inboundItemVO = new InboundItemVO();
  445. PurchaseItemVO purchaseItemVO = PurchaseItemVOList.get(i);
  446. inboundItemVO.setIntoId(purchaseItemVO.getPurId());
  447. inboundItemVO.setIntoType("入库类型-采购入库");
  448. inboundItemVO.setFromId(purchaseItemVO.getPurId());
  449. inboundItemVO.setFromItemId(purchaseItemVO.getItemId());
  450. inboundItemVO.setItemIndex(purchaseItemVO.getItemIndex());
  451. inboundItemVO.setSkuId(purchaseItemVO.getSkuId());
  452. inboundItemVO.setPriceInto(purchaseItemVO.getPricePur());
  453. // inboundItemVO.setNonStdCode(); todo 非标号
  454. inboundItemVO.setIntoStatus("入库状态-已入库");
  455. inboundItemVO.setIntoingQty(purchaseItemVO.getItemQty());
  456. inboundItemVO.setIntoingAmt(purchaseItemVO.getItemAmt());
  457. inboundItemVO.setRemarks(purchaseItemVO.getRemarks());
  458. // inboundItemVO.setInvId( ); todo 需要先生成 库存明细 在生成入库明细
  459. InboundItemVOList.add(inboundItemVO);
  460. }
  461. return InboundItemVOList;
  462. }
  463. /**
  464. * @desc : 采购跟踪
  465. * @author : 常皓宁
  466. * @date : 2024/4/22 10:19
  467. */
  468. public ResponseResultVO<PageList> selectTrackReport(Map<String, Object> param) {
  469. // 获取组合商品
  470. Map<String, Object> map = purchaseMapper.selectTrackReport(param);
  471. JSONObject sku = JSONObject.parseObject(map.get("f_query_pur_for_track").toString());
  472. // 定义返回值
  473. PageList data = new PageList<>();
  474. List dataList = sku.get("data") != null ? JSONObject.parseArray(sku.get("data").toString()).toJavaList(Map.class) : new ArrayList();
  475. // 组装返回值
  476. data.setList(dataList);
  477. return ResponseResultUtil.success(data);
  478. }
  479. /**
  480. * @desc : 一键作废
  481. * @date : 2024/7/6 9:17
  482. * @author : 寇珊珊
  483. */
  484. public ResponseResultVO<?> oneKeyInvalid(String id) {
  485. //region 查询当前订单下是否有退货单
  486. Long count = inboundItemMapper.selectHasReturn(new InboundItemQuery()
  487. .setSPurId(id)
  488. .setFlgValid(true)
  489. .setIntoType(Constant.IntoType.PURRETURN_RETURN.getName()));
  490. if (count != null && count > 0) {
  491. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ORDER_IS_EXISTS_RETURN_ORDERS.getMessage());
  492. }
  493. //endregion
  494. //锁表
  495. Purchase purForUpdate = purchaseMapper.selectByIdForUpdate(id);
  496. // 并发校验
  497. if (!purForUpdate.getFlgValid()) {
  498. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISFLGVALID_FALSE.getMessage());
  499. }
  500. // 如果入库中数量或已入库数量不是0,不能作废
  501. if (purForUpdate.getIntoQty().compareTo(BigDecimal.ZERO) != 0 || purForUpdate.getIntoingQty().compareTo(BigDecimal.ZERO) != 0) {
  502. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISEXISTS_AFTER_OPERATE.getMessage());
  503. }
  504. // 作废
  505. Purchase purUpdate = new Purchase();
  506. purUpdate.setFlgValid(false).setPurId(id);
  507. super.update(purUpdate, new UpdateWrapper<Purchase>().lambda().eq(Purchase::getPurId,
  508. UUID.fromString(purUpdate.getPurId ())));
  509. //region 作废出库单
  510. inboundPurchaseService.oneKeyPurchaseInboundRepeal(id);
  511. //endregion
  512. return ResponseResultUtil.success();
  513. }
  514. }