PurchaseService.java 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790
  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.mapper.BaseMapper;
  9. import com.dk.common.model.pojo.PageList;
  10. import com.dk.common.response.ResponseCodeEnum;
  11. import com.dk.common.response.ResponseResultUtil;
  12. import com.dk.common.response.ResponseResultVO;
  13. import com.dk.common.service.BaseService;
  14. import com.dk.mdm.infrastructure.convert.ivt.InboundConvert;
  15. import com.dk.mdm.infrastructure.convert.ivt.InboundItemConvert;
  16. import com.dk.mdm.infrastructure.convert.pur.PurChaseConvert;
  17. import com.dk.mdm.infrastructure.convert.pur.PurChaseItemConvert;
  18. import com.dk.mdm.infrastructure.util.AuthUtils;
  19. import com.dk.mdm.mapper.common.CommonMapper;
  20. import com.dk.mdm.mapper.ivt.InboundItemMapper;
  21. import com.dk.mdm.mapper.ivt.InboundMapper;
  22. import com.dk.mdm.mapper.mst.GoodsSkuMapper;
  23. import com.dk.mdm.mapper.pur.PurchaseItemMapper;
  24. import com.dk.mdm.mapper.pur.PurchaseMapper;
  25. import com.dk.mdm.model.pojo.pur.Purchase;
  26. import com.dk.mdm.model.pojo.pur.PurchaseItem;
  27. import com.dk.mdm.model.query.ivt.InboundItemQuery;
  28. import com.dk.mdm.model.query.ivt.InboundQuery;
  29. import com.dk.mdm.model.query.ivt.OutboundItemQuery;
  30. import com.dk.mdm.model.query.ivt.OutboundQuery;
  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.InboundResponse;
  35. import com.dk.mdm.model.response.ivt.OutboundItemResponse;
  36. import com.dk.mdm.model.response.ivt.OutboundResponse;
  37. import com.dk.mdm.model.response.mst.GoodsSkuResponse;
  38. import com.dk.mdm.model.response.pur.PurchaseItemResponse;
  39. import com.dk.mdm.model.response.pur.PurchaseResponse;
  40. import com.dk.mdm.model.vo.ivt.InboundItemVO;
  41. import com.dk.mdm.model.vo.ivt.InboundVO;
  42. import com.dk.mdm.model.vo.ivt.OutboundVO;
  43. import com.dk.mdm.model.vo.pur.PurchaseItemVO;
  44. import com.dk.mdm.model.vo.pur.PurchaseVO;
  45. import com.dk.mdm.service.common.CommonService;
  46. import com.dk.mdm.service.ivt.inbound.InboundItemService;
  47. import com.dk.mdm.service.ivt.inbound.InboundPurchaseService;
  48. import com.dk.mdm.service.ivt.inbound.InboundService;
  49. import org.springframework.beans.factory.annotation.Autowired;
  50. import org.springframework.stereotype.Service;
  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. @Autowired
  97. private AuthUtils authUtils;
  98. @Autowired
  99. private InboundMapper inboundMapper;
  100. /**
  101. * @desc : 条件查询
  102. * @author : 常皓宁
  103. * @date : 2024/2/28 9:47
  104. */
  105. @Pagination
  106. public ResponseResultVO<PageList<PurchaseResponse>> selectByCond(PurchaseQuery purchaseQuery) {
  107. return super.mergeListWithCount(purchaseQuery, purchaseMapper.selectByCond(purchaseQuery), purchaseMapper.countByCond(purchaseQuery));
  108. }
  109. /**
  110. * @desc : 条件查询 带明细(采购入库 查询采购订单 过滤已入库数据)
  111. * @author : 王英杰
  112. * @date : 2024/2/28 9:47
  113. */
  114. @Pagination
  115. public ResponseResultVO<PageList<Map<String, Object>>> selectByCondItem(PurchaseQuery purchaseQuery) {
  116. return super.mergeListWithCount(purchaseQuery, purchaseMapper.selectPurOrderAndDeatil(purchaseQuery), purchaseMapper.countByCond(purchaseQuery));
  117. }
  118. /**
  119. * @desc : 采购订单 待入库查询
  120. * @author : 王英杰
  121. * @date : 2024/2/28 9:46
  122. */
  123. @Pagination
  124. public ResponseResultVO<PageList<PurchaseResponse>> noStoredSelectByCond(PurchaseQuery purchaseQuery) {
  125. return super.mergeListWithCount(purchaseQuery, purchaseMapper.noStoredSelectByCond(purchaseQuery), purchaseMapper.noStoredCountByCond(purchaseQuery));
  126. }
  127. /**
  128. * @desc : 新建
  129. * @author : 常皓宁
  130. * @date : 2024/2/28 9:42
  131. */
  132. @Transactional(rollbackFor = {Exception.class})
  133. public ResponseResultVO<Boolean> insert(PurchaseVO purchasevo) {
  134. //region 组织结构不能为空
  135. if (purchasevo.getOrgId() == null) {
  136. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ORGANIZATION_CANNOT_BE_EMPTY.getMessage());
  137. }
  138. //endregion
  139. //region 员工不能为空
  140. if (purchasevo.getStaffId() == null) {
  141. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.STAFF_CANNOT_BE_EMPTY.getMessage());
  142. }
  143. //endregion
  144. //region 供应商不能为空
  145. if (purchasevo.getSupId() == null) {
  146. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.SUPLIER_CANNOT_BE_EMPTY.getMessage());
  147. }
  148. //endregion
  149. //region 设置采购订单总单信息并新建
  150. // 制单时间
  151. purchasevo.setMakeTime(LocalDateTime.now());
  152. // 单据类型
  153. purchasevo.setPurType(Constant.DocumentType.PUR_CHASE.getName());
  154. // 订单状态
  155. purchasevo.setPurStatus(Constant.OrderStatus.STATUS_DEAL.getName());
  156. // 获取单号
  157. Map<String, Object> codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.PURCHASE.getName(), false);
  158. purchasevo.setPurId(codeMap.get("outId").toString());
  159. purchasevo.setPurNo(codeMap.get("outNote").toString());
  160. Purchase purchase = purChaseConvert.convertToPo(purchasevo);
  161. super.insert(purchase);
  162. purchasevo.setPurId(purchase.getPurId());
  163. //endregion
  164. //region 设置采购订单明细信息并新建
  165. // List<PurchaseItemVO> purchaseItemVOList = purchasevo.getPurchaseItemVOList().stream().filter(it -> it.getItemId() == null).collect(Collectors.toList());
  166. // List<PurchaseItemVO> purchaseItemVOList = purchasevo.getPurchaseItemVOList();
  167. // 商品顺序
  168. for (PurchaseItemVO purchaseItemVO : purchasevo.getPurchaseItemVOList()) {
  169. PurchaseItem purchaseItem = purchaseItemConvert.convertToPo(purchaseItemVO);
  170. purchaseItem.setPurId(purchase.getPurId());
  171. purchaseItem.setItemIndex(purchaseItemVO.getItemIndex());
  172. purchaseItem.setCpId(purchase.getCpId());
  173. // purchaseItem.setItemId(null);
  174. purchaseItem.setPriceDiscount(purchaseItemVO.getPriceDiscount());
  175. //region 这里清零,后续在入库里有反写 不清零的话在入库那再加一次就翻倍了
  176. purchaseItem.setIntoQty(BigDecimal.ZERO);
  177. purchaseItem.setIntoAmt(BigDecimal.ZERO);
  178. purchaseItem.setIntoingQty(BigDecimal.ZERO);
  179. purchaseItem.setIntoingAmt(BigDecimal.ZERO);
  180. //endregion
  181. purchaseItemMapper.insert(purchaseItem);
  182. purchaseItemVO.setItemId(purchaseItem.getItemId());
  183. }
  184. //endregion
  185. /****************************************判断是否生成采购入库单****************************************/
  186. //region 判断是否生成采购入库单
  187. if(purchasevo.getInboundProcessingFlag()!=null && purchasevo.getInboundProcessingFlag()){
  188. List<InboundItemVO> inboundItemVOList = new ArrayList<>();
  189. //region 明细
  190. for (PurchaseItemVO purchaseItemVO : purchasevo.getPurchaseItemVOList()) {
  191. //region 采购订单明细转换采购入库明细
  192. InboundItemVO inboundItemVO = inboundItemConvert.convertPurchaseItemVOToInboundItemVO(purchaseItemVO);
  193. //endregion
  194. //region 赋值 采购订单明细和入库单明细不一致的字段要单独set
  195. //id制空,这里的id经过转换以后是采购订单明细的id
  196. inboundItemVO.setItemId(null);
  197. //来源id
  198. inboundItemVO.setFromId(purchasevo.getPurId());
  199. //来源明细id
  200. inboundItemVO.setFromItemId(purchaseItemVO.getItemId());
  201. //入库价
  202. inboundItemVO.setPriceInto(purchaseItemVO.getPricePur());
  203. //入库中数量
  204. inboundItemVO.setIntoingQty(purchaseItemVO.getItemQty());
  205. //已入库数量
  206. inboundItemVO.setIntoingAmt(purchaseItemVO.getItemAmt());
  207. //todo 2024年7月10日10:19:01 成本单价和成本金额取前台传入的采购单价和采购金额 dl和z确认
  208. //成本单价
  209. inboundItemVO.setCostPrice(purchaseItemVO.getPricePur());
  210. //成本金额
  211. inboundItemVO.setCostAmt(purchaseItemVO.getItemAmt());
  212. //出库数量
  213. inboundItemVO.setOutQty(BigDecimal.ZERO);
  214. //endregion
  215. //region 根据sku查询商品信息
  216. if (inboundItemVO.getSkuId() != null) {
  217. GoodsSkuResponse goodsSku = goodsSkuMapper.selectById(inboundItemVO.getSkuId());
  218. //商品名称
  219. inboundItemVO.setSkuName(goodsSku.getSkuName());
  220. //商品型号
  221. inboundItemVO.setSkuModel(goodsSku.getSkuModel());
  222. }
  223. //endregion
  224. //region 箱片计算
  225. //入库中 或者待入库
  226. if (Constant.IntoStatus.RUKUZHONG.getName().equals(inboundItemVO.getIntoStatus()) ||
  227. Constant.IntoStatus.DAIRUKU.getName().equals(inboundItemVO.getIntoStatus())) {
  228. //箱
  229. inboundItemVO.setIntoingBox(Integer.valueOf(inboundItemVO.getIntoingQty().divide(inboundItemVO.getPackBox(), 0, RoundingMode.DOWN).toString()));
  230. //片
  231. inboundItemVO.setIntoingPiece(inboundItemVO.getIntoingQty().remainder(inboundItemVO.getPackBox()));
  232. }
  233. //已入库
  234. else {
  235. //箱
  236. inboundItemVO.setIntoBox(Integer.valueOf(inboundItemVO.getIntoingQty().divide(inboundItemVO.getPackBox(), 0, RoundingMode.DOWN).toString()));
  237. //片
  238. inboundItemVO.setIntoPiece(inboundItemVO.getIntoingQty().remainder(inboundItemVO.getPackBox()));
  239. }
  240. //endregion
  241. //region 入库明细list添加
  242. inboundItemVOList.add(inboundItemVO);
  243. //endregion
  244. }
  245. //endregion
  246. //region 总单
  247. InboundVO inboundVO = inboundConvert.convertPurchaseVOToInboundVO(purchasevo);
  248. //入库中数量
  249. inboundVO.setIntoingQty(purchasevo.getSumQuantity());
  250. //已入库数量
  251. inboundVO.setIntoingAmt(purchasevo.getSumAmount());
  252. inboundVO.setItemList(inboundItemVOList);
  253. //来源id
  254. inboundVO.setFromId(purchasevo.getPurId());
  255. //来源单号
  256. inboundVO.setFromNo(purchasevo.getPurNo());
  257. //endregion
  258. //新建采购入库单
  259. inboundPurchaseService.purchaseInboundInsert(inboundVO);
  260. }
  261. //endregion
  262. /****************************************判断是否生成采购入库单****************************************/
  263. return ResponseResultUtil.success();
  264. }
  265. /**
  266. * @desc : 新建
  267. * @author : 常皓宁
  268. * @date : 2024/2/28 9:42
  269. */
  270. @Transactional(rollbackFor = {Exception.class})
  271. public ResponseResultVO<Boolean> soldAndPurchasedInsert(PurchaseVO purchasevo) {
  272. this.insert(purchasevo);
  273. return ResponseResultUtil.success();
  274. }
  275. /**
  276. * @desc : 根据总单id查询
  277. * @author : 常皓宁
  278. * @date : 2024/2/29 9:56
  279. */
  280. public ResponseResultVO selectById(String purId) {
  281. //根据id查询
  282. PurchaseResponse purchaseResponse = purchaseMapper.selectById(purId);
  283. //不存在
  284. if (purchaseResponse == null) {
  285. return ResponseResultUtil.error(ErrorCodeEnum.PURCHASE_CANNOT_BE_EMPTY.getCode(),
  286. ErrorCodeEnum.PURCHASE_CANNOT_BE_EMPTY.getMessage());
  287. }
  288. //查询明细
  289. List<PurchaseItemResponse> purchaseItemResponses = purchaseItemMapper.selectByCond(new PurchaseItemQuery().setPurId(purId));
  290. for (PurchaseItemResponse item : purchaseItemResponses) {
  291. item.setPurNo(purchaseResponse.getPurNo());
  292. item.setWhId(purchaseResponse.getWhId());
  293. item.setWhName(purchaseResponse.getWhName());
  294. }
  295. purchaseResponse.setPurchaseItemResponseList(purchaseItemResponses);
  296. return ResponseResultUtil.success(purchaseResponse);
  297. }
  298. /**
  299. * @desc : 转入库 查询采购订单 总单带明细(过滤明细已入库数据)
  300. * @author : 王英杰
  301. * @date : 2024/2/28 14:56
  302. */
  303. public ResponseResultVO purSelectById(String purId) {
  304. //根据id查询
  305. PurchaseResponse purchaseResponse = purchaseMapper.selectById(purId);
  306. //不存在
  307. if (purchaseResponse == null) {
  308. return ResponseResultUtil.error(ErrorCodeEnum.PURCHASE_CANNOT_BE_EMPTY.getCode(),
  309. ErrorCodeEnum.PURCHASE_CANNOT_BE_EMPTY.getMessage());
  310. }
  311. //查询明细 (过滤掉已入库数据)
  312. List<PurchaseItemResponse> purchaseItemResponses = purchaseItemMapper.purSelectByCond(new PurchaseItemQuery().setPurId(purId));
  313. for (PurchaseItemResponse item : purchaseItemResponses) {
  314. item.setPurNo(purchaseResponse.getPurNo());
  315. }
  316. purchaseResponse.setPurchaseItemResponseList(purchaseItemResponses);
  317. return ResponseResultUtil.success(purchaseResponse);
  318. }
  319. /**
  320. * @desc : 编辑方法
  321. * @author : 常皓宁
  322. * @date : 2024/2/28 10:57
  323. */
  324. @Transactional(
  325. rollbackFor = {Exception.class}
  326. )
  327. public ResponseResultVO<Boolean> update(PurchaseVO purchasevo) {
  328. String gradeCode = authUtils.getStaff().getGradeCode();
  329. // 转化实体
  330. Purchase purchase = purChaseConvert.convertToPo(purchasevo);
  331. //删除的
  332. List<PurchaseItemVO> deletePurchaseItemVOList = purchasevo.getDeletePurchaseItemList().stream().filter(it -> it.getItemId() != null).collect(Collectors.toList());
  333. if (deletePurchaseItemVOList.size() > 0) {
  334. for (PurchaseItemVO purchaseItemVO : deletePurchaseItemVOList) {
  335. if (!Constant.GradeCode.STD.getName().equals(gradeCode)) {
  336. //已转入库不能删除
  337. if (!Constant.IntoStatus.DAIRUKU.getName().equals(purchaseItemVO.getIntoStatus())) {
  338. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.NO_WAIT_INTO.getMessage());
  339. } else {
  340. purchaseItemMapper.deleteById(purchaseItemVO.getItemId());
  341. }
  342. }else{
  343. purchaseItemMapper.deleteById(purchaseItemVO.getItemId());
  344. }
  345. }
  346. }
  347. // 编辑的(包括新增的)
  348. // 新增的
  349. List<PurchaseItemVO> insertPurchaseItemVOList = purchasevo.getEditPurchaseItemList().stream().filter(it -> it.getItemId() == null).collect(Collectors.toList());
  350. for (PurchaseItemVO purchaseItemVO : insertPurchaseItemVOList) {
  351. PurchaseItem purchaseItem = purchaseItemConvert.convertToPo(purchaseItemVO);
  352. purchaseItem.setPurId(purchase.getPurId());
  353. purchaseItem.setItemIndex(purchaseItemVO.getItemIndex());
  354. purchaseItem.setIntoStatus(Constant.IntoStatus.DAIRUKU.getName());
  355. purchaseItem.setCpId(purchase.getCpId());
  356. purchaseItem.setFromId(purchaseItemVO.getFromId());
  357. purchaseItem.setFromItemId(purchaseItemVO.getFromItemId());
  358. purchaseItem.setPriceDiscount(purchaseItemVO.getPriceDiscount());
  359. //region 已入库数量和入库金额 在入库会反写 ,
  360. purchaseItem.setIntoQty(null);
  361. purchaseItem.setIntoAmt(null);
  362. //endregion
  363. purchaseItemMapper.insert(purchaseItem);
  364. purchaseItemVO.setItemId(purchaseItem.getItemId());
  365. }
  366. // 编辑的
  367. List<PurchaseItemVO> editPurchaseItemVOList = purchasevo.getEditPurchaseItemList().stream().filter(it -> it.getItemId() != null).collect(Collectors.toList());
  368. for (PurchaseItemVO purchaseItemVO : editPurchaseItemVOList) {
  369. // 商品数量不能小于可转入库数量数量(入库中+已入库) todo2024年7月15日15:22:14 注释掉,不然报错
  370. // if (purchaseItemVO.getItemQty().compareTo(purchaseItemVO.getIntoQty().add(purchaseItemVO.getIntoingQty())) >=0) {
  371. // throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ITEMQTY_NO_LESS_INTOQTY.getMessage());
  372. // } else {
  373. PurchaseItem purchaseItem = purchaseItemConvert.convertToPo(purchaseItemVO);
  374. //region 已入库数量和入库金额 在入库会反写 ,
  375. purchaseItem.setIntoQty(null);
  376. purchaseItem.setIntoAmt(null);
  377. //endregion
  378. purchaseItemService.updataById(purchaseItem);
  379. // }
  380. }
  381. super.update(purchase, new UpdateWrapper<Purchase>().lambda().eq(Purchase::getPurId,
  382. UUID.fromString(purchase.getPurId ())));
  383. //region采购订单转入库编辑
  384. if (Constant.GradeCode.STD.getName().equals(gradeCode)) {
  385. //自动入库
  386. if (purchasevo.getInboundProcessingFlag() != null && purchasevo.getInboundProcessingFlag()) {
  387. //标准版 只有一个入库单 所以get0 就可以 且 编辑采购订单得时候 一定是有入库单的
  388. List<InboundResponse> inboundResponseList = inboundMapper.selectByCond(new InboundQuery().setFromId(purchasevo.getPurId()));
  389. InboundResponse inboundResponse = inboundResponseList.get(0);
  390. List<InboundItemVO> delItemList = new ArrayList<>();
  391. List<InboundItemVO> itemList = new ArrayList<>();
  392. //存在明细
  393. if(inboundResponseList!=null && inboundResponseList.size()>0){
  394. //region 总单
  395. InboundVO inboundVO = inboundConvert.convertPurchaseVOToInboundVO(purchasevo);
  396. //id
  397. inboundVO.setIntoId(inboundResponse.getIntoId());
  398. //单号
  399. inboundVO.setIntoNo(inboundResponse.getIntoNo());
  400. //入库状态
  401. inboundVO.setIntoStatus(inboundResponse.getIntoStatus());
  402. //入库中数量
  403. inboundVO.setIntoingQty(purchasevo.getSumQuantity());
  404. //已入库数量
  405. inboundVO.setIntoingAmt(purchasevo.getSumAmount());
  406. //来源id
  407. inboundVO.setFromId(purchasevo.getPurId());
  408. //来源单号
  409. inboundVO.setFromNo(purchasevo.getPurNo());
  410. //大编辑标识
  411. inboundVO.setLimitEdit(true);
  412. //endregion
  413. //region 编辑的明细
  414. if(purchasevo.getEditPurchaseItemList() !=null && purchasevo.getEditPurchaseItemList() .size()>0){
  415. for (PurchaseItemVO purchaseItemVO : purchasevo.getEditPurchaseItemList()) {
  416. //region 根据订单明细id查询入库单明细id 注意:虽然查出来是list但实际上只会有1条
  417. List<InboundItemResponse> inboundItemResponses = inboundItemMapper.selectByCond(new InboundItemQuery().setFromItemId(purchaseItemVO.getItemId()));
  418. //endregion
  419. //region 采购订单明细转换采购入库明细
  420. InboundItemVO inboundItemVO = inboundItemConvert.convertPurchaseItemVOToInboundItemVO(purchaseItemVO);
  421. //endregion
  422. //region 赋值 采购订单明细和入库单明细不一致的字段要单独set
  423. //id制空,这里的id经过转换以后是采购订单明细的id
  424. inboundItemVO.setItemId(inboundItemResponses != null && inboundItemResponses.size()>0 ? inboundItemResponses.get(0).getItemId() : null );
  425. //总单id
  426. inboundItemVO.setIntoId(inboundResponse.getIntoId());
  427. //来源id
  428. inboundItemVO.setFromId(purchasevo.getPurId());
  429. //来源明细id
  430. inboundItemVO.setFromItemId(purchaseItemVO.getItemId());
  431. //入库价
  432. inboundItemVO.setPriceInto(purchaseItemVO.getPricePur());
  433. //入库中数量
  434. inboundItemVO.setIntoingQty(purchaseItemVO.getItemQty());
  435. //已入库数量
  436. inboundItemVO.setIntoingAmt(purchaseItemVO.getItemAmt());
  437. //todo 2024年7月10日10:19:01 成本单价和成本金额取前台传入的采购单价和采购金额 dl和z确认
  438. //成本单价
  439. inboundItemVO.setCostPrice(purchaseItemVO.getPricePur());
  440. //成本基恩
  441. inboundItemVO.setCostAmt(purchaseItemVO.getItemAmt());
  442. //原仓库
  443. inboundItemVO.setWhIdPri(purchaseItemVO.getWhIdPri());
  444. //原非标号
  445. inboundItemVO.setNonStdCodePri(purchaseItemVO.getNonStdCodePri());
  446. //endregion
  447. //region 根据sku查询商品信息
  448. if (inboundItemVO.getSkuId() != null) {
  449. GoodsSkuResponse goodsSku = goodsSkuMapper.selectById(inboundItemVO.getSkuId());
  450. //商品名称
  451. inboundItemVO.setSkuName(goodsSku.getSkuName());
  452. //商品型号
  453. inboundItemVO.setSkuModel(goodsSku.getSkuModel());
  454. }
  455. //endregion
  456. //region 箱片计算
  457. //入库中 或者待入库
  458. if (Constant.IntoStatus.RUKUZHONG.getName().equals(inboundItemVO.getIntoStatus()) ||
  459. Constant.IntoStatus.DAIRUKU.getName().equals(inboundItemVO.getIntoStatus())) {
  460. //箱
  461. inboundItemVO.setIntoingBox(Integer.valueOf(inboundItemVO.getIntoingQty().divide(inboundItemVO.getPackBox(), 0, RoundingMode.DOWN).toString()));
  462. //片
  463. inboundItemVO.setIntoingPiece(inboundItemVO.getIntoingQty().remainder(inboundItemVO.getPackBox()));
  464. }
  465. //已入库
  466. else {
  467. //箱
  468. inboundItemVO.setIntoBox(Integer.valueOf(inboundItemVO.getIntoingQty().divide(inboundItemVO.getPackBox(), 0, RoundingMode.DOWN).toString()));
  469. //片
  470. inboundItemVO.setIntoPiece(inboundItemVO.getIntoingQty().remainder(inboundItemVO.getPackBox()));
  471. }
  472. //endregion
  473. //region 入库明细list添加
  474. itemList.add(inboundItemVO);
  475. //endregion
  476. }
  477. }
  478. //endregion
  479. //region 删除的明细
  480. if (purchasevo.getDeletePurchaseItemList() != null && purchasevo.getDeletePurchaseItemList().size() > 0) {
  481. for (PurchaseItemVO purchaseItemVO : purchasevo.getDeletePurchaseItemList()) {
  482. //拿到 订单明细对应的出库明细 订单明细id 和 出库单来源明细 是一 一 对应的 所以 get0 也是不会有问题的
  483. List<InboundItemResponse> inboundItemResponseList = inboundItemMapper.selectByCond(new InboundItemQuery().setFromItemId(purchaseItemVO.getItemId()));
  484. InboundItemResponse intoboundItemjson = null;
  485. if (inboundItemResponseList.size() != 0) { //没查到库存数据说明是新增的品 还没出库呢
  486. intoboundItemjson = inboundItemResponseList.get(0);
  487. }
  488. //region 采购订单明细转换采购入库明细
  489. InboundItemVO inboundItemVO = inboundItemConvert.convertPurchaseItemVOToInboundItemVO(purchaseItemVO);
  490. //endregion
  491. //region 赋值 采购订单明细和入库单明细不一致的字段要单独set
  492. inboundItemVO.setItemId(intoboundItemjson == null ? null : intoboundItemjson.getItemId());
  493. //总单id
  494. inboundItemVO.setIntoId(inboundResponse.getIntoId());
  495. //来源id
  496. inboundItemVO.setFromId(purchasevo.getPurId());
  497. //来源明细id
  498. inboundItemVO.setFromItemId(purchaseItemVO.getItemId());
  499. //入库价
  500. inboundItemVO.setPriceInto(purchaseItemVO.getPricePur());
  501. //入库中数量
  502. inboundItemVO.setIntoQty(purchaseItemVO.getItemQty());
  503. //已入库数量
  504. inboundItemVO.setIntoAmt(purchaseItemVO.getItemAmt());
  505. //todo 2024年7月10日10:19:01 成本单价和成本金额取前台传入的采购单价和采购金额 dl和z确认
  506. //成本单价
  507. inboundItemVO.setCostPrice(purchaseItemVO.getPricePur());
  508. //成本基恩
  509. inboundItemVO.setCostAmt(purchaseItemVO.getItemAmt());
  510. //原仓库
  511. inboundItemVO.setWhIdPri(purchaseItemVO.getWhIdPri());
  512. //原非标号
  513. inboundItemVO.setNonStdCodePri(purchaseItemVO.getNonStdCodePri());
  514. //endregion
  515. //region 根据sku查询商品信息
  516. if (inboundItemVO.getSkuId() != null) {
  517. GoodsSkuResponse goodsSku = goodsSkuMapper.selectById(inboundItemVO.getSkuId());
  518. //商品名称
  519. inboundItemVO.setSkuName(goodsSku.getSkuName());
  520. //商品型号
  521. inboundItemVO.setSkuModel(goodsSku.getSkuModel());
  522. }
  523. //endregion
  524. //region 入库明细list添加
  525. delItemList.add(inboundItemVO);
  526. //endregion
  527. }
  528. }
  529. //endregion
  530. //region 赋值明细
  531. inboundVO.setItemList(itemList);
  532. inboundVO.setDeleteItemList(delItemList);
  533. //endregion
  534. //编辑采购入库单
  535. inboundPurchaseService.purchaseInboundUpdate(inboundVO);
  536. }
  537. }
  538. }
  539. //endregion
  540. return ResponseResultUtil.success();
  541. }
  542. /**
  543. * @desc : 作废
  544. * @author : 常皓宁
  545. * @date : 2024-03-08 16:38
  546. */
  547. public ResponseResultVO<?> invalid(String id) {
  548. Purchase purForUpdate = purchaseMapper.selectByIdForUpdate(id);
  549. // 并发校验
  550. if (!purForUpdate.getFlgValid()) {
  551. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISFLGVALID_FALSE.getMessage());
  552. }
  553. // 如果入库中数量或已入库数量不是0,不能作废
  554. if (purForUpdate.getIntoQty().compareTo(BigDecimal.ZERO) != 0 || purForUpdate.getIntoingQty().compareTo(BigDecimal.ZERO) != 0) {
  555. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISEXISTS_AFTER_OPERATE.getMessage());
  556. }
  557. // 作废
  558. Purchase purUpdate = new Purchase();
  559. purUpdate.setFlgValid(false).setPurId(id);
  560. super.update(purUpdate, new UpdateWrapper<Purchase>().lambda().eq(Purchase::getPurId,
  561. UUID.fromString(purUpdate.getPurId ())));
  562. return ResponseResultUtil.success();
  563. }
  564. /**
  565. * @desc : 采购订单 转 采购入库 (目前废弃)
  566. * @author : 王英杰
  567. * @date : 2024年3月11日
  568. */
  569. @Transactional(
  570. rollbackFor = {Exception.class}
  571. )
  572. public ResponseResultVO<Boolean> insertInbound(PurchaseVO purchasevo) {
  573. ResponseResultVO<Boolean> result = new ResponseResultVO<>();
  574. // todo 给 inboundVO 实体放入数据
  575. InboundVO inboundVO = convertEntity(purchasevo); //转换实体
  576. inboundService.insert(inboundVO); //新建入库单
  577. //TODO 反更 采购订单 状态为已入库
  578. // PurchaseService.update(purchasevo);
  579. // 检查入库单是否成功插入
  580. if (inboundVO.getIntoId() != null) { //插入入库单成功
  581. List<InboundItemVO> itemList = new ArrayList<>();
  582. itemList = inboundVO.getItemList();
  583. for (InboundItemVO objitem : itemList) {
  584. inboundItemService.insert(objitem); //插入入库单明细
  585. //todo 插入一个 已入库明细 就要插入一个 库存明细
  586. }
  587. result.setData(true);
  588. } else {
  589. // 如果入库单插入失败,可以进行相应的处理,比如回滚事务或者返回错误信息
  590. result.setData(false);
  591. result.setMessage("插入入库单失败");
  592. }
  593. return result;
  594. }
  595. /**
  596. * @desc : 采购订单实体数据 转 入库单数据 (目前废弃)
  597. * @author : 王英杰
  598. * @date : 2024年3月11日
  599. */
  600. private InboundVO convertEntity (PurchaseVO purchaseVO){
  601. InboundVO inboundVO = new InboundVO();
  602. inboundVO.setItemList(convertEntityDetail(purchaseVO.getPurchaseItemVOList()));//转明细实体
  603. inboundVO.setIntoType("入库类型-采购入库");
  604. inboundVO.setFromId(purchaseVO.getPurId());
  605. inboundVO.setFromNo(purchaseVO.getPurNo());
  606. inboundVO.setOrgId(purchaseVO.getOrgId());
  607. inboundVO.setStaffId(purchaseVO.getStaffId());
  608. inboundVO.setCusId("");
  609. inboundVO.setSupId(purchaseVO.getSupId());
  610. inboundVO.setIntoStatus("入库状态-已入库");
  611. // inboundVO.setIntoingQty(); todo 合计 商品入库中数量
  612. // inboundVO.setIntoingAmt(); todo 合计 商品入库中金额
  613. inboundVO.setWhId(purchaseVO.getWhId());
  614. inboundVO.setIntoDate(LocalDate.now()); //入库时间为当前时间
  615. inboundVO.setRemarks(purchaseVO.getRemarks());
  616. // inboundVO.getAnnexPaths(purchaseVO.getAnnexPaths()); todo 附件
  617. inboundVO.setMakeStaff(purchaseVO.getMakeStaff());
  618. inboundVO.setMakeTime(purchaseVO.getMakeTime());
  619. inboundVO.setCpId(purchaseVO.getCpId());
  620. return inboundVO;
  621. }
  622. /**
  623. * @desc : 采购订单明细实体数据 转 入库单明细数据 (目前废弃)
  624. * @author : 王英杰
  625. * @date : 2024年3月11日
  626. */
  627. private List<InboundItemVO> convertEntityDetail( List <PurchaseItemVO> PurchaseItemVOList){
  628. List<InboundItemVO> InboundItemVOList = new ArrayList<>();
  629. for (int i=0 ; i<PurchaseItemVOList.size() ; i++){
  630. InboundItemVO inboundItemVO = new InboundItemVO();
  631. PurchaseItemVO purchaseItemVO = PurchaseItemVOList.get(i);
  632. inboundItemVO.setIntoId(purchaseItemVO.getPurId());
  633. inboundItemVO.setIntoType("入库类型-采购入库");
  634. inboundItemVO.setFromId(purchaseItemVO.getPurId());
  635. inboundItemVO.setFromItemId(purchaseItemVO.getItemId());
  636. inboundItemVO.setItemIndex(purchaseItemVO.getItemIndex());
  637. inboundItemVO.setSkuId(purchaseItemVO.getSkuId());
  638. inboundItemVO.setPriceInto(purchaseItemVO.getPricePur());
  639. // inboundItemVO.setNonStdCode(); todo 非标号
  640. inboundItemVO.setIntoStatus("入库状态-已入库");
  641. inboundItemVO.setIntoingQty(purchaseItemVO.getItemQty());
  642. inboundItemVO.setIntoingAmt(purchaseItemVO.getItemAmt());
  643. inboundItemVO.setRemarks(purchaseItemVO.getRemarks());
  644. // inboundItemVO.setInvId( ); todo 需要先生成 库存明细 在生成入库明细
  645. InboundItemVOList.add(inboundItemVO);
  646. }
  647. return InboundItemVOList;
  648. }
  649. /**
  650. * @desc : 采购跟踪
  651. * @author : 常皓宁
  652. * @date : 2024/4/22 10:19
  653. */
  654. public ResponseResultVO<PageList> selectTrackReport(Map<String, Object> param) {
  655. // 获取组合商品
  656. Map<String, Object> map = purchaseMapper.selectTrackReport(param);
  657. JSONObject sku = JSONObject.parseObject(map.get("f_query_pur_for_track").toString());
  658. // 定义返回值
  659. PageList data = new PageList<>();
  660. List dataList = sku.get("data") != null ? JSONObject.parseArray(sku.get("data").toString()).toJavaList(Map.class) : new ArrayList();
  661. // 组装返回值
  662. data.setList(dataList);
  663. return ResponseResultUtil.success(data);
  664. }
  665. /**
  666. * @desc : 一键作废
  667. * @date : 2024/7/6 9:17
  668. * @author : 寇珊珊
  669. */
  670. public ResponseResultVO<?> oneKeyInvalid(String id) {
  671. //region 查询当前订单下是否有退货单
  672. Long count = inboundItemMapper.selectHasReturn(new InboundItemQuery()
  673. .setSPurId(id)
  674. .setFlgValid(true)
  675. .setIntoType(Constant.IntoType.PURRETURN_RETURN.getName()));
  676. if (count != null && count > 0) {
  677. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ORDER_IS_EXISTS_RETURN_ORDERS.getMessage());
  678. }
  679. //endregion
  680. //锁表
  681. Purchase purForUpdate = purchaseMapper.selectByIdForUpdate(id);
  682. // 并发校验
  683. if (!purForUpdate.getFlgValid()) {
  684. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISFLGVALID_FALSE.getMessage());
  685. }
  686. //todo 2024年7月10日11:45:12 这里在联调意见作废的时候能进分支,不知道为什么有这个校验
  687. // 如果入库中数量或已入库数量不是0,不能作废
  688. // if (purForUpdate.getIntoQty().compareTo(BigDecimal.ZERO) != 0 || purForUpdate.getIntoingQty().compareTo(BigDecimal.ZERO) != 0) {
  689. // throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISEXISTS_AFTER_OPERATE.getMessage());
  690. // }
  691. // 作废
  692. Purchase purUpdate = new Purchase();
  693. purUpdate.setFlgValid(false).setPurId(id);
  694. super.update(purUpdate, new UpdateWrapper<Purchase>().lambda().eq(Purchase::getPurId,
  695. UUID.fromString(purUpdate.getPurId ())));
  696. //region 作废入库单
  697. inboundPurchaseService.oneKeyPurchaseInboundRepeal(id);
  698. //endregion
  699. return ResponseResultUtil.success();
  700. }
  701. /**
  702. * @desc : 供应商详情用 查询总单带明细
  703. * @date : 2024/7/11 9:30
  704. * @author : 于继渤
  705. */
  706. @Pagination
  707. public ResponseResultVO<PageList<PurchaseResponse>> selectTotalDetail(PurchaseQuery purchaseQuery) {
  708. return super.mergeListWithCount(purchaseQuery, purchaseMapper.selectTotalDetail(purchaseQuery),
  709. purchaseMapper.selectTotalDetailCount(purchaseQuery));
  710. }
  711. }