InboundPurchaseService.java 64 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249
  1. package com.dk.mdm.service.ivt.inbound;
  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.mapper.BaseMapper;
  8. import com.dk.common.model.pojo.PageList;
  9. import com.dk.common.model.vo.AnnexVO;
  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.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.pur.PurchaseItemMapper;
  20. import com.dk.mdm.mapper.pur.PurchaseMapper;
  21. import com.dk.mdm.model.pojo.ivt.Inbound;
  22. import com.dk.mdm.model.pojo.ivt.InboundItem;
  23. import com.dk.mdm.model.pojo.pur.Purchase;
  24. import com.dk.mdm.model.pojo.pur.PurchaseItem;
  25. import com.dk.mdm.model.query.ivt.InboundItemQuery;
  26. import com.dk.mdm.model.query.ivt.InboundQuery;
  27. import com.dk.mdm.model.response.ivt.InboundItemResponse;
  28. import com.dk.mdm.model.response.ivt.InboundResponse;
  29. import com.dk.mdm.model.response.pur.PurchaseItemResponse;
  30. import com.dk.mdm.model.response.pur.PurchaseResponse;
  31. import com.dk.mdm.model.vo.ivt.InboundItemVO;
  32. import com.dk.mdm.model.vo.ivt.InboundVO;
  33. import com.dk.mdm.service.common.CommonService;
  34. import com.dk.mdm.service.ivt.inventory.InventoryService;
  35. import com.dk.mdm.service.mac.AccountService;
  36. import org.springframework.beans.factory.annotation.Autowired;
  37. import org.springframework.stereotype.Service;
  38. import org.springframework.transaction.annotation.Transactional;
  39. import java.math.BigDecimal;
  40. import java.util.HashMap;
  41. import java.util.List;
  42. import java.util.Map;
  43. import java.util.UUID;
  44. /**
  45. * @author : 寇珊珊
  46. * @desc : 采购入库业务层
  47. * @date : 2024/3/7 14:11
  48. */
  49. @Service
  50. public class InboundPurchaseService extends BaseService<Inbound> {
  51. @Override
  52. public BaseMapper<Inbound> getRepository() {
  53. return inboundMapper;
  54. }
  55. @Autowired
  56. private InboundMapper inboundMapper;
  57. @Autowired
  58. private InboundConvert inboundConvert;
  59. @Autowired
  60. private InboundItemMapper inboundItemMapper;
  61. @Autowired
  62. private InboundItemConvert inboundItemConvert;
  63. @Autowired
  64. private PurchaseMapper purchaseMapper;
  65. @Autowired
  66. private PurchaseItemMapper purchaseItemMapper;
  67. @Autowired
  68. private CommonService commonService;
  69. @Autowired
  70. private CommonMapper commonMapper;
  71. @Autowired
  72. private InventoryService inventoryService;
  73. @Autowired
  74. private AccountService accountService;
  75. /**
  76. * @desc : 条件查询
  77. * @date : 2024/3/7 14:12
  78. * @author : 寇珊珊
  79. */
  80. @Pagination
  81. public ResponseResultVO<PageList<InboundResponse>> selectByCond(InboundQuery inboundQuery) {
  82. return super.mergeListWithCount(inboundQuery, inboundMapper.selectByCond(inboundQuery),
  83. inboundMapper.countByCond(inboundQuery));
  84. }
  85. /**
  86. * @desc : 查询明细
  87. * @date : 2024/3/9 15:43
  88. * @author : 寇珊珊
  89. */
  90. @Pagination
  91. public ResponseResultVO<Map<String, Object>> selectPurchaseInboundItemInfoById(String id) {
  92. Map<String, Object> result = new HashMap<>();
  93. // 商品明细
  94. List<InboundItemResponse> inboundItemResponses = inboundItemMapper.selectByCond(new InboundItemQuery().setIntoId(id));
  95. result.put("itemList", inboundItemResponses);
  96. // 收款
  97. // 附件
  98. return ResponseResultUtil.success(result);
  99. }
  100. /**
  101. * @desc : 采购入库新建
  102. * @date : 2024/3/7 14:13
  103. * 入库中数量/金额 已入库数量/金额 由调用方传入
  104. * @author : 寇珊珊
  105. */
  106. @Transactional(rollbackFor = {Exception.class})
  107. public ResponseResultVO<?> purchaseInboundInsert(InboundVO inboundVO) {
  108. //region 查询当前公司的系统参数 自动办理信息 并赋值
  109. Map<String, Object> map = new HashMap<>();
  110. map.put("cpId", inboundVO.getCpId());
  111. map.put("code", "IVT_001");
  112. //自动办理标识
  113. String flgHandleSetting = commonMapper.getSettingValue(map);
  114. //自动办理标识为1 自动办理入库
  115. if (Constant.FlgAutoHandleStringType.ONE.getValue().equals(flgHandleSetting)) {
  116. inboundVO.setFlgHandleSetting(Constant.FlgHandleSetting.TRUE.getValue());
  117. inboundVO.setFlgAutoHandle(Constant.FlgAutoHandle.TRUE.getValue());
  118. }
  119. //endregion
  120. //region 总单
  121. //获取 id/单号
  122. Map<String, Object> codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.PURCASEINBOUND.getName(), false);
  123. inboundVO.setIntoId(codeMap.get("outId").toString()).
  124. setIntoNo(codeMap.get("outNote").toString());
  125. //入库类型
  126. inboundVO.setIntoType(Constant.IntoType.SALE.getName());
  127. //自动入库标识
  128. if (inboundVO.getFlgAutoHandle()) {
  129. //已入库
  130. inboundVO.setIntoStatus(Constant.IntoStatus.YIRUKU.getName());
  131. } else {
  132. //入库中
  133. inboundVO.setIntoStatus(Constant.IntoStatus.RUKUZHONG.getName());
  134. }
  135. //入库状态等于已入库 更新合计入库数量/金额 = 入库中数量/入库中金额
  136. if (Constant.IntoStatus.YIRUKU.getName().equals(inboundVO.getIntoStatus())) {
  137. inboundVO.setIntoQty(inboundVO.getIntoingQty())
  138. .setIntoAmt(inboundVO.getIntoingAmt())
  139. .setIntoingQty(BigDecimal.ZERO)
  140. .setIntoingAmt(BigDecimal.ZERO)
  141. ;
  142. } else {
  143. inboundVO.setIntoQty(BigDecimal.ZERO)
  144. .setIntoAmt(BigDecimal.ZERO)
  145. ;
  146. }
  147. //实体转换
  148. Inbound inbound = inboundConvert.convertToPo(inboundVO);
  149. inboundMapper.insert(inbound);
  150. //endregion
  151. //region 采购总单
  152. if (inboundVO.getFromId() != null) {
  153. //赋值(这里重写了更新方法,数量在更新方法中有数据库院士数量+本次数量)
  154. Purchase purchaseUpdate = new Purchase();
  155. purchaseUpdate.setPurId(inboundVO.getFromId());
  156. //根据id查询
  157. PurchaseResponse purchaseResponse = purchaseMapper.selectById(inboundVO.getFromId());
  158. //已入库
  159. if (Constant.IntoStatus.YIRUKU.getName().equals(inboundVO.getIntoStatus())) {
  160. purchaseUpdate.setIntoingQty(BigDecimal.ZERO);
  161. purchaseUpdate.setIntoingAmt(BigDecimal.ZERO);
  162. purchaseUpdate.setIntoQty(inboundVO.getIntoQty());
  163. purchaseUpdate.setIntoAmt(inboundVO.getIntoAmt());
  164. }
  165. //入库中
  166. else {
  167. purchaseUpdate.setIntoingQty(inboundVO.getIntoingQty());
  168. purchaseUpdate.setIntoingAmt(inboundVO.getIntoingAmt());
  169. purchaseUpdate.setIntoQty(BigDecimal.ZERO);
  170. purchaseUpdate.setIntoAmt(BigDecimal.ZERO);
  171. }
  172. //入库状态
  173. String intoStatus = this.setIntoStatus(purchaseResponse.getIntoingQty().add(purchaseUpdate.getIntoingQty()),
  174. purchaseResponse.getIntoQty().add(purchaseUpdate.getIntoQty()), purchaseResponse.getSumQuantity());
  175. purchaseUpdate.setIntoStatus(intoStatus);
  176. //修改
  177. int countRow = purchaseMapper.updateById(purchaseUpdate);
  178. //数量超出
  179. if (countRow == 0) {
  180. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  181. }
  182. }
  183. //endregion
  184. //region 明细
  185. //校验明细
  186. if (inboundVO.getItemList().size() == 0) {
  187. throw new BaseBusinessException(ErrorCodeEnum.INBOUND_ITEM_NOT_EXIST.getCode(),
  188. ErrorCodeEnum.INBOUND_ITEM_NOT_EXIST.getMessage());
  189. }
  190. for (InboundItemVO inboundItemVO : inboundVO.getItemList()) {
  191. //region 将库存需要的参数赋值
  192. inboundItemVO.setInventoryType(Constant.InventoryType.INBOUND.getName());
  193. inboundItemVO.setInventoryDocCode(Constant.InventoryDocCode.PURCHASE_ORDER.getValue());
  194. //endregion
  195. //总单id
  196. inboundItemVO.setIntoId(inboundVO.getIntoId());
  197. //入库类型
  198. inboundItemVO.setIntoType(inboundVO.getIntoType());
  199. //入库状态等于已入库 更新合计入库数量/金额 = 入库中数量/入库中金额
  200. if (Constant.IntoStatus.YIRUKU.getName().equals(inboundVO.getIntoStatus())) {
  201. inboundItemVO
  202. .setIntoQty(inboundItemVO.getIntoingQty())
  203. .setIntoAmt(inboundItemVO.getIntoingAmt())
  204. .setIntoingQty(BigDecimal.ZERO)
  205. .setIntoingAmt(BigDecimal.ZERO)
  206. .setCostPrice(inboundItemVO.getPriceInto())
  207. .setCostAmt(inboundItemVO.getIntoQty().multiply(inboundItemVO.getPriceInto()).setScale(2, BigDecimal.ROUND_HALF_UP))
  208. ;
  209. } else {
  210. inboundItemVO
  211. .setIntoQty(BigDecimal.ZERO)
  212. .setIntoAmt(BigDecimal.ZERO);
  213. }
  214. //入库状态
  215. inboundItemVO.setIntoStatus(inboundVO.getIntoStatus());
  216. //实体转换
  217. InboundItem inboundItem = inboundItemConvert.convertToPo(inboundItemVO);
  218. inboundItemMapper.insert(inboundItem);
  219. //endregion
  220. //region 采购明细
  221. if (inboundItemVO.getFromItemId() != null) {
  222. //赋值(这里重写了更新方法,数量在更新方法中有数据库院士数量+本次数量)
  223. PurchaseItem purchaseItem = new PurchaseItem();
  224. purchaseItem.setItemId(inboundItemVO.getFromItemId());
  225. //根据id查询
  226. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemVO.getFromItemId());
  227. //已入库
  228. if (Constant.IntoStatus.YIRUKU.getName().equals(inboundVO.getIntoStatus())) {
  229. purchaseItem.setIntoingQty(BigDecimal.ZERO);
  230. purchaseItem.setIntoingAmt(BigDecimal.ZERO);
  231. purchaseItem.setIntoQty(inboundItemVO.getIntoQty());
  232. purchaseItem.setIntoAmt(inboundItemVO.getIntoAmt());
  233. }
  234. //入库中
  235. else {
  236. purchaseItem.setIntoingQty(inboundItemVO.getIntoingQty());
  237. purchaseItem.setIntoingAmt(inboundItemVO.getIntoingAmt());
  238. purchaseItem.setIntoQty(BigDecimal.ZERO);
  239. purchaseItem.setIntoAmt(BigDecimal.ZERO);
  240. }
  241. //入库状态
  242. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  243. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  244. purchaseItem.setIntoStatus(intoStatus);
  245. int countRow = purchaseItemMapper.updateById(purchaseItem);
  246. //数量超出
  247. if (countRow == 0) {
  248. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  249. }
  250. }
  251. //endregion
  252. }
  253. //endregion
  254. //region 已入库调用账款
  255. if (Constant.IntoStatus.YIRUKU.getName().equals(inboundVO.getIntoStatus())) {
  256. accountService.accPayable(inboundVO.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  257. }
  258. //endregion
  259. //region 库存
  260. // if(Constant.IntoStatus.YIRUKU.getName().equals(inboundVO.getIntoStatus())){
  261. // Map<String, Object> invMap = new HashMap<>();
  262. // invMap.put("intoDetail",inboundVO.getItemList());
  263. // inventoryService.updateInventoryInformation(map);
  264. // }
  265. //endregion
  266. return ResponseResultUtil.success(inboundVO);
  267. }
  268. /**
  269. * @desc : 采购入库编辑
  270. * @date : 2024/3/25 16:25
  271. * @author : 寇珊珊
  272. */
  273. @Transactional(rollbackFor = {Exception.class})
  274. public ResponseResultVO<?> purchaseInboundUpdate(InboundVO inboundVO) {
  275. //region 小编辑
  276. if (!inboundVO.getLimitEdit()) {
  277. Inbound inbound = new Inbound();
  278. inbound.setIntoId(inboundVO.getIntoId());
  279. inbound.setRemarks(inboundVO.getRemarks());
  280. inbound.setAnnexPaths(inboundVO.getAnnexPaths());
  281. inboundMapper.update(inbound,
  282. new UpdateWrapper<Inbound>().lambda()
  283. .eq(Inbound::getIntoId, UUID.fromString(inbound.getIntoId()))
  284. );
  285. for (InboundItemVO inboundItemVO : inboundVO.getItemList()) {
  286. InboundItem inboundItem = new InboundItem();
  287. inboundItem.setItemId(inboundItemVO.getItemId());
  288. inboundItem.setRemarks(inboundItemVO.getRemarks());
  289. inboundItemMapper.update(inboundItem,
  290. new UpdateWrapper<InboundItem>().lambda()
  291. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  292. );
  293. }
  294. }
  295. //endregion
  296. //region 大编辑
  297. else {
  298. //region 根据id查询 此条入库单的数据还未更改前的数据
  299. InboundResponse inboundResponse = inboundMapper.selectById(inboundVO.getIntoId());
  300. BigDecimal sumQty = inboundVO.getItemList().stream().map(InboundItemVO::getIntoingQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  301. BigDecimal sumAmt = inboundVO.getItemList().stream().map(InboundItemVO::getIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  302. //endregion
  303. //region 自动办理参数为true 已入库编辑
  304. //自动办理参数为true
  305. if (Constant.FlgHandleSetting.TRUE.getValue().equals(inboundVO.getFlgHandleSetting())) {
  306. //region 退账
  307. if (inboundVO.getReceivableId() != null) {
  308. accountService.reversePayable(inboundVO.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  309. }
  310. //endregion
  311. //region 修改明细
  312. List<InboundItemVO> itemList = inboundVO.getItemList();
  313. for (InboundItemVO inboundItemVO : itemList) {
  314. //根据id查询
  315. InboundItemResponse inboundItemResponse = inboundItemMapper.selectById(inboundItemVO.getItemId());
  316. //region 不能新建
  317. if (inboundItemVO.getFromItemId() == null) {
  318. throw new BaseBusinessException(ErrorCodeEnum.ITEMS_THAT_ARE_NOT_AVAILABLE_HANDLE.getCode(),
  319. ErrorCodeEnum.ITEMS_THAT_ARE_NOT_AVAILABLE_HANDLE.getMessage());
  320. }
  321. //endregion
  322. //region 将库存需要的参数赋值
  323. inboundItemVO.setInventoryType(Constant.InventoryType.INBOUND.getName());
  324. inboundItemVO.setInventoryDocCode(Constant.InventoryDocCode.PURCHASE_ORDER.getValue());
  325. //编辑之前的数
  326. inboundItemVO.setQtyBeforeUpdate(inboundItemResponse.getIntoQty());
  327. inboundItemVO.setAmtBeforeUpdate(inboundItemResponse.getIntoAmt());
  328. //编辑之后的数
  329. inboundItemVO.setIntoQty(inboundItemVO.getIntoQty());
  330. inboundItemVO.setIntoAmt(inboundItemVO.getIntoAmt());
  331. //endregion
  332. //region 编辑明细 赋值
  333. if (inboundItemVO.getItemId() != null) {
  334. InboundItem inboundItem = new InboundItem();
  335. inboundItem.setItemId(inboundItemVO.getItemId());
  336. inboundItem.setIntoQty(inboundItemVO.getIntoingQty());
  337. inboundItem.setIntoAmt(inboundItemVO.getIntoingAmt());
  338. inboundItem.setCostPrice(inboundItemVO.getPriceInto());
  339. inboundItem.setCostAmt(inboundItemVO.getIntoQty().multiply(inboundItemVO.getPriceInto()).setScale(6, BigDecimal.ROUND_HALF_UP));
  340. //修改
  341. inboundItemMapper.update(inboundItem,
  342. new UpdateWrapper<InboundItem>().lambda()
  343. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  344. );
  345. }
  346. //endregion
  347. //region 新建明细
  348. else {
  349. inboundItemVO
  350. .setIntoQty(inboundItemVO.getIntoingQty())
  351. .setIntoAmt(inboundItemVO.getIntoingAmt())
  352. .setIntoingQty(BigDecimal.ZERO)
  353. .setIntoingAmt(BigDecimal.ZERO)
  354. .setCostPrice(inboundItemVO.getPriceInto())
  355. .setCostAmt(inboundItemVO.getOutQty().multiply(inboundItemVO.getPriceInto()).setScale(2, BigDecimal.ROUND_HALF_UP))
  356. ;
  357. inboundItemVO.setIntoId(inboundVO.getIntoId());
  358. //入库状态
  359. inboundItemVO.setIntoStatus(inboundVO.getIntoStatus());
  360. inboundItemVO.setIntoType(Constant.IntoType.SALE.getName());
  361. //实体转换
  362. InboundItem inboundItem = inboundItemConvert.convertToPo(inboundItemVO);
  363. inboundItemMapper.insert(inboundItem);
  364. }
  365. //endregion
  366. //region 销售明细
  367. if (inboundItemVO.getFromItemId() != null) {
  368. //根据id查询
  369. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemVO.getFromItemId());
  370. PurchaseItem purchaseItem = new PurchaseItem();
  371. purchaseItem.setItemId(inboundItemVO.getFromItemId());
  372. purchaseItem.setIntoQty(inboundItemResponse.getIntoQty().negate().add(inboundItemVO.getIntoingQty()));
  373. purchaseItem.setIntoAmt(inboundItemResponse.getIntoAmt().negate().add(inboundItemVO.getIntoingAmt()));
  374. //入库状态
  375. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty(),
  376. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  377. purchaseItem.setIntoStatus(intoStatus);
  378. int countRow = purchaseItemMapper.updateById(purchaseItem);
  379. //数量超出
  380. if (countRow == 0) {
  381. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  382. }
  383. }
  384. //endregion
  385. }
  386. //endregion
  387. //region 删除明细
  388. BigDecimal delIntoQty = BigDecimal.ZERO;
  389. BigDecimal delIntoAmt = BigDecimal.ZERO;
  390. if (inboundVO.getDeleteItemList() != null) {
  391. delIntoQty = inboundVO.getDeleteItemList().stream().map(InboundItemVO::getIntoQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  392. delIntoAmt = inboundVO.getDeleteItemList().stream().map(InboundItemVO::getIntoAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  393. for (InboundItemVO inboundItemVO : inboundVO.getDeleteItemList()) {
  394. if (inboundItemVO.getItemId() != null) {
  395. InboundItem inboundItem = inboundItemConvert.convertToPo(inboundItemVO);
  396. inboundItem.setFlgValid(false);
  397. //修改
  398. inboundItemMapper.update(inboundItem,
  399. new UpdateWrapper<InboundItem>().lambda()
  400. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  401. );
  402. }
  403. //region 销售明细
  404. if (inboundItemVO.getFromItemId() != null) {
  405. //根据id查询
  406. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemVO.getFromItemId());
  407. PurchaseItem purchaseItem = new PurchaseItem();
  408. purchaseItem.setItemId(inboundItemVO.getFromItemId());
  409. purchaseItem.setIntoQty(inboundItemVO.getIntoQty().negate());
  410. purchaseItem.setIntoAmt(inboundItemVO.getIntoAmt().negate());
  411. purchaseItem.setIntoingQty(inboundItemVO.getIntoQty());
  412. purchaseItem.setIntoingAmt(inboundItemVO.getIntoAmt());
  413. //入库状态
  414. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  415. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  416. purchaseItem.setIntoStatus(intoStatus);
  417. int countRow = purchaseItemMapper.updateById(purchaseItem);
  418. //数量超出
  419. if (countRow == 0) {
  420. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  421. }
  422. }
  423. //endregion
  424. }
  425. }
  426. //endregion
  427. //region 修改入库总单
  428. Inbound inbound = new Inbound();
  429. inbound.setIntoId(inboundVO.getIntoId());
  430. inbound.setIntoQty(sumQty);
  431. inbound.setIntoAmt(sumAmt);
  432. //修改
  433. inboundMapper.update(inbound,
  434. new UpdateWrapper<Inbound>().lambda().eq(Inbound::getIntoId, UUID.fromString(inbound.getIntoId()))
  435. );
  436. //endregion
  437. //region 修改销售总单
  438. if (inboundVO.getFromId() != null) {
  439. //根据id查询
  440. PurchaseResponse purchaseResponse = purchaseMapper.selectById(inboundVO.getFromId());
  441. Purchase purchase = new Purchase();
  442. purchase.setPurId(inboundVO.getFromId());
  443. purchase.setIntoQty(inboundResponse.getIntoQty().negate().add(sumQty).subtract(delIntoQty));
  444. purchase.setIntoAmt(inboundResponse.getIntoAmt().negate().add(sumAmt).subtract(delIntoAmt));
  445. purchase.setIntoingQty(delIntoQty);
  446. purchase.setIntoingAmt(delIntoAmt);
  447. //入库状态
  448. String intoStatus = this.setIntoStatus(purchaseResponse.getIntoingQty().add(purchase.getIntoingQty()),
  449. purchaseResponse.getIntoQty().add(purchase.getIntoQty()), purchaseResponse.getSumQuantity());
  450. purchase.setIntoStatus(intoStatus);
  451. //修改
  452. int countRow = purchaseMapper.updateById(purchase);
  453. //数量超出
  454. if (countRow == 0) {
  455. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  456. }
  457. //endregion
  458. }
  459. //region 账款
  460. if (inboundVO.getReceivableId() != null) {
  461. accountService.accPayable(inboundVO.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  462. }
  463. //endregion
  464. //region todo调用库存
  465. // Map<String, Object> map = new HashMap<>();
  466. // map.put("intoDetail",inboundVO.getItemList());
  467. // inventoryService.updateInventoryInformation(map);
  468. //endregion
  469. }
  470. //endregion
  471. //region 自动办理参数false 入库中编辑
  472. //自动办理标识为false 并且 自动办理参数为false 入库中
  473. if (!inboundVO.getFlgAutoHandle() && Constant.FlgHandleSetting.FALSE.getValue().equals(inboundVO.getFlgHandleSetting())) {
  474. //region 修改明细
  475. List<InboundItemVO> itemList = inboundVO.getItemList();
  476. for (InboundItemVO inboundItemVO : itemList) {
  477. //region 不能新建
  478. if (inboundItemVO.getFromItemId() == null) {
  479. throw new BaseBusinessException(ErrorCodeEnum.ITEMS_THAT_ARE_NOT_AVAILABLE_HANDLE.getCode(),
  480. ErrorCodeEnum.ITEMS_THAT_ARE_NOT_AVAILABLE_HANDLE.getMessage());
  481. }
  482. //endregion
  483. //根据id查询 获取到还未进行修改的数据
  484. InboundItemResponse inboundItemResponse = inboundItemMapper.selectById(inboundItemVO.getItemId());
  485. //region 编辑明细
  486. if (inboundItemVO.getItemId() != null) {
  487. InboundItem inboundItem = new InboundItem();
  488. inboundItem.setItemId(inboundItemVO.getItemId());
  489. inboundItem.setIntoingQty(inboundItemVO.getIntoingQty());
  490. inboundItem.setIntoingAmt(inboundItemVO.getIntoingAmt());
  491. //修改
  492. inboundItemMapper.update(inboundItem,
  493. new UpdateWrapper<InboundItem>().lambda()
  494. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  495. );
  496. }
  497. //endregion
  498. //region 新建明细
  499. else {
  500. inboundItemVO
  501. .setIntoQty(BigDecimal.ZERO)
  502. .setIntoAmt(BigDecimal.ZERO)
  503. .setCostPrice(inboundItemVO.getPriceInto())
  504. .setCostAmt(inboundItemVO.getIntoingQty().multiply(inboundItemVO.getPriceInto()).setScale(2, BigDecimal.ROUND_HALF_UP))
  505. ;
  506. inboundItemVO.setIntoId(inboundVO.getIntoId());
  507. //入库状态
  508. inboundItemVO.setIntoStatus(inboundVO.getIntoStatus());
  509. inboundItemVO.setIntoType(Constant.IntoType.SALE.getName());
  510. //实体转换
  511. InboundItem inboundItem = inboundItemConvert.convertToPo(inboundItemVO);
  512. inboundItemMapper.insert(inboundItem);
  513. }
  514. //endregion
  515. //region 销售明细
  516. if (inboundItemVO.getFromItemId() != null) {
  517. //根据id查询
  518. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemVO.getFromItemId());
  519. PurchaseItem purchaseItem = new PurchaseItem();
  520. purchaseItem.setItemId(inboundItemVO.getFromItemId());
  521. //本次修改几个传几个(负数) sql中是原数据+本次修改数据
  522. purchaseItem.setIntoingQty(inboundItemResponse.getIntoingQty().negate().add(inboundItemVO.getIntoingQty()));
  523. purchaseItem.setIntoingAmt(inboundItemResponse.getIntoingAmt().negate().add(inboundItemVO.getIntoingAmt()));
  524. //入库状态
  525. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  526. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  527. purchaseItem.setIntoStatus(intoStatus);
  528. int countRow = purchaseItemMapper.updateById(purchaseItem);
  529. //数量超出
  530. if (countRow == 0) {
  531. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  532. }
  533. }
  534. //endregion
  535. }
  536. //endregion
  537. //region 删除明细
  538. BigDecimal delIntoQty = BigDecimal.ZERO;
  539. BigDecimal delIntoAmt = BigDecimal.ZERO;
  540. if (inboundVO.getDeleteItemList() != null) {
  541. delIntoQty = inboundVO.getDeleteItemList().stream().map(InboundItemVO::getIntoingQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  542. delIntoAmt = inboundVO.getDeleteItemList().stream().map(InboundItemVO::getIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  543. for (InboundItemVO inboundItemVO : inboundVO.getDeleteItemList()) {
  544. //region 明细
  545. if (inboundItemVO.getItemId() != null) {
  546. InboundItem inboundItem = inboundItemConvert.convertToPo(inboundItemVO);
  547. inboundItem.setFlgValid(false);
  548. //修改
  549. inboundItemMapper.update(inboundItem,
  550. new UpdateWrapper<InboundItem>().lambda()
  551. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  552. );
  553. }
  554. //endregion
  555. //region 销售明细
  556. if (inboundItemVO.getFromItemId() != null) {
  557. //根据id查询
  558. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemVO.getFromItemId());
  559. PurchaseItem purchaseItem = new PurchaseItem();
  560. purchaseItem.setItemId(inboundItemVO.getFromItemId());
  561. purchaseItem.setIntoingQty(inboundItemVO.getIntoingQty().negate());
  562. purchaseItem.setIntoingAmt(inboundItemVO.getIntoingAmt().negate());
  563. //入库状态
  564. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  565. purchaseItemResponse.getIntoQty(), purchaseItemResponse.getItemQty());
  566. purchaseItem.setIntoStatus(intoStatus);
  567. int countRow = purchaseItemMapper.updateById(purchaseItem);
  568. //数量超出
  569. if (countRow == 0) {
  570. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  571. }
  572. }
  573. //endregion
  574. }
  575. }
  576. //endregion
  577. //region 修改入库总单
  578. Inbound inbound = new Inbound();
  579. inbound.setIntoId(inboundVO.getIntoId());
  580. inbound.setIntoingQty(sumQty);
  581. inbound.setIntoingAmt(sumAmt);
  582. //修改
  583. inboundMapper.update(inbound,
  584. new UpdateWrapper<Inbound>().lambda().eq(Inbound::getIntoId, UUID.fromString(inbound.getIntoId()))
  585. );
  586. //endregion
  587. //region 修改采购总单
  588. if (inboundVO.getFromId() != null) {
  589. //根据id查询
  590. PurchaseResponse purchaseResponse = purchaseMapper.selectById(inboundVO.getFromId());
  591. Purchase purchase = new Purchase();
  592. purchase.setPurId(inboundVO.getFromId());
  593. purchase.setIntoingQty(inboundResponse.getIntoingQty().negate().add(sumQty).subtract(delIntoQty));
  594. purchase.setIntoingAmt(inboundResponse.getIntoingAmt().negate().add(sumAmt).subtract(delIntoAmt));
  595. //入库状态
  596. String intoStatus = this.setIntoStatus(purchaseResponse.getIntoingQty().add(purchase.getIntoingQty()),
  597. purchaseResponse.getIntoQty(), purchaseResponse.getSumQuantity());
  598. purchase.setIntoStatus(intoStatus);
  599. //修改
  600. int countRow = purchaseMapper.updateById(purchase);
  601. //数量超出
  602. if (countRow == 0) {
  603. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  604. }
  605. }
  606. //endregion
  607. }
  608. //endregion
  609. }
  610. //endregion
  611. return ResponseResultUtil.success(inboundVO);
  612. }
  613. /**
  614. * @desc : 采购入库作废
  615. * @date : 2024/3/26 9:24
  616. * @author : 寇珊珊
  617. */
  618. @Transactional(rollbackFor = {Exception.class})
  619. public ResponseResultVO<?> purchaseInboundRepeal(String intoId) {
  620. //region 查询总单 查询明细
  621. //根据id查询 此条入库单的数据还未更改前的数据
  622. InboundResponse inboundResponse = inboundMapper.selectById(intoId);
  623. //根据总单id查询
  624. List<InboundItemResponse> inboundItemResponseList = inboundItemMapper.selectByCond(new InboundItemQuery().setIntoId(inboundResponse.getIntoId()));
  625. //endregion
  626. //region 自动办理参数为true 已入库编辑
  627. //自动办理参数为true
  628. if (Constant.FlgHandleSetting.TRUE.getValue().equals(inboundResponse.getFlgHandleSetting())) {
  629. //region 退账
  630. if (inboundResponse.getReceivableId() != null) {
  631. accountService.reversePayable(inboundResponse.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  632. }
  633. //endregion
  634. //region 修改明细
  635. for (InboundItemResponse inboundItemResponse : inboundItemResponseList) {
  636. //region 将库存需要的参数赋值
  637. inboundItemResponse.setInventoryType(Constant.InventoryType.INBOUND.getName());
  638. inboundItemResponse.setInventoryDocCode(Constant.InventoryDocCode.PURCHASE_ORDER.getValue());
  639. inboundItemResponse.setIntoQty(inboundItemResponse.getIntoQty().negate());
  640. inboundItemResponse.setIntoAmt(inboundItemResponse.getIntoAmt().negate());
  641. //endregion
  642. //region 编辑明细 赋值
  643. InboundItem inboundItem = new InboundItem();
  644. inboundItem.setItemId(inboundItemResponse.getItemId());
  645. inboundItem.setFlgValid(false);
  646. //修改
  647. inboundItemMapper.update(inboundItem,
  648. new UpdateWrapper<InboundItem>().lambda()
  649. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  650. );
  651. //endregion
  652. //region 销售明细
  653. if (inboundItemResponse.getFromItemId() != null) {
  654. //根据id查询
  655. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemResponse.getFromItemId());
  656. PurchaseItem purchaseItem = new PurchaseItem();
  657. purchaseItem.setItemId(inboundItemResponse.getFromItemId());
  658. purchaseItem.setIntoQty(inboundItemResponse.getIntoQty().negate());
  659. purchaseItem.setIntoAmt(inboundItemResponse.getIntoAmt().negate());
  660. //入库状态
  661. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty(),
  662. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  663. purchaseItem.setIntoStatus(intoStatus);
  664. int countRow = purchaseItemMapper.updateById(purchaseItem);
  665. //数量超出
  666. if (countRow == 0) {
  667. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  668. }
  669. }
  670. //endregion
  671. }
  672. //endregion
  673. //region 修改入库总单
  674. Inbound inbound = new Inbound();
  675. inbound.setIntoId(inboundResponse.getIntoId());
  676. inbound.setFlgValid(false);
  677. //修改
  678. inboundMapper.update(inbound,
  679. new UpdateWrapper<Inbound>().lambda().eq(Inbound::getIntoId, UUID.fromString(inbound.getIntoId()))
  680. );
  681. //endregion
  682. //region 修改销售总单
  683. if (inboundResponse.getFromId() != null) {
  684. //根据id查询
  685. PurchaseResponse purchaseResponse = purchaseMapper.selectById(inboundResponse.getFromId());
  686. Purchase purchase = new Purchase();
  687. purchase.setPurId(inboundResponse.getFromId());
  688. purchase.setIntoQty(inboundResponse.getIntoQty().negate());
  689. purchase.setIntoQty(inboundResponse.getIntoAmt().negate());
  690. //入库状态
  691. String intoStatus = this.setIntoStatus(purchaseResponse.getIntoingQty(),
  692. purchaseResponse.getIntoQty().add(purchase.getIntoQty()), purchaseResponse.getSumQuantity());
  693. purchase.setIntoStatus(intoStatus);
  694. //修改
  695. int countRow = purchaseMapper.updateById(purchase);
  696. //数量超出
  697. if (countRow == 0) {
  698. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  699. }
  700. }
  701. //endregion
  702. //region 账款
  703. if (inboundResponse.getReceivableId() != null) {
  704. accountService.accPayable(inboundResponse.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  705. }
  706. //endregion
  707. //region todo 调用库存
  708. // Map<String, Object> map = new HashMap<>();
  709. // map.put("intoDetail",inboundItemResponseList);
  710. // inventoryService.updateInventoryInformation(map);
  711. //endregion
  712. }
  713. //endregion
  714. //region 自动办理参数false 入库中编辑
  715. //自动办理标识为false 并且 自动办理参数为false 入库中
  716. if (!inboundResponse.getFlgAutoHandle() && Constant.FlgHandleSetting.FALSE.getValue().equals(inboundResponse.getFlgHandleSetting())) {
  717. //region 修改明细
  718. for (InboundItemResponse inboundItemResponse : inboundItemResponseList) {
  719. //region 编辑明细 赋值
  720. InboundItem inboundItem = new InboundItem();
  721. inboundItem.setItemId(inboundItemResponse.getItemId());
  722. inboundItem.setIntoingQty(BigDecimal.ZERO);
  723. inboundItem.setIntoingAmt(BigDecimal.ZERO);
  724. //修改
  725. inboundItemMapper.update(inboundItem,
  726. new UpdateWrapper<InboundItem>().lambda()
  727. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  728. );
  729. //endregion
  730. //region 销售明细
  731. if (inboundItemResponse.getFromItemId() != null) {
  732. //根据id查询
  733. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemResponse.getFromItemId());
  734. PurchaseItem purchaseItem = new PurchaseItem();
  735. purchaseItem.setItemId(inboundItemResponse.getFromItemId());
  736. purchaseItem.setIntoingQty(inboundItemResponse.getIntoingQty().negate());
  737. purchaseItem.setIntoingAmt(inboundItemResponse.getIntoingAmt().negate());
  738. //入库状态
  739. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  740. purchaseItemResponse.getIntoQty(), purchaseItemResponse.getItemQty());
  741. purchaseItem.setIntoStatus(intoStatus);
  742. int countRow = purchaseItemMapper.updateById(purchaseItem);
  743. //数量超出
  744. if (countRow == 0) {
  745. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  746. }
  747. }
  748. //endregion
  749. }
  750. //endregion
  751. //region 修改入库总单
  752. Inbound inbound = new Inbound();
  753. inbound.setIntoId(inboundResponse.getIntoId());
  754. inbound.setIntoingQty(BigDecimal.ZERO);
  755. inbound.setIntoAmt(BigDecimal.ZERO);
  756. //修改
  757. inboundMapper.update(inbound,
  758. new UpdateWrapper<Inbound>().lambda().eq(Inbound::getIntoId, UUID.fromString(inbound.getIntoId()))
  759. );
  760. //endregion
  761. //region 修改销售总单
  762. if (inboundResponse.getFromId() != null) {
  763. //根据id查询
  764. PurchaseResponse purchaseResponse = purchaseMapper.selectById(inboundResponse.getFromId());
  765. Purchase purchase = new Purchase();
  766. purchase.setPurId(inboundResponse.getFromId());
  767. purchase.setIntoingQty(inboundResponse.getIntoingQty().negate());
  768. purchase.setIntoingAmt(inboundResponse.getIntoingAmt().negate());
  769. //入库状态
  770. String intoStatus = this.setIntoStatus(purchaseResponse.getIntoingQty().add(purchase.getIntoingQty()),
  771. purchaseResponse.getIntoQty(), purchaseResponse.getSumQuantity());
  772. purchase.setIntoStatus(intoStatus);
  773. //修改
  774. int countRow = purchaseMapper.updateById(purchase);
  775. //数量超出
  776. if (countRow == 0) {
  777. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  778. }
  779. }
  780. //endregion
  781. }
  782. //endregion
  783. return ResponseResultUtil.success();
  784. }
  785. /**
  786. * @desc : 采购入库办理
  787. * @date : 2024/3/7 15:47
  788. * @author : 寇珊珊
  789. */
  790. @Transactional(rollbackFor = {Exception.class})
  791. public ResponseResultVO<?> purchaseHandleInbound(InboundVO inboundVO) {
  792. //region 根据id查询 此条入库单的数据还未更改前的数据
  793. InboundResponse inboundResponse = inboundMapper.selectById(inboundVO.getIntoId());
  794. //endregion
  795. //region 编辑明细
  796. //校验明细
  797. if (inboundVO.getItemList().size() == 0) {
  798. throw new BaseBusinessException(ErrorCodeEnum.INBOUND_ITEM_NOT_EXIST.getCode(),
  799. ErrorCodeEnum.INBOUND_ITEM_NOT_EXIST.getMessage());
  800. }
  801. for (InboundItemVO inboundItemVO : inboundVO.getItemList()) {
  802. //region 不能新建
  803. if (inboundItemVO.getFromItemId() == null) {
  804. throw new BaseBusinessException(ErrorCodeEnum.ITEMS_THAT_ARE_NOT_AVAILABLE_HANDLE.getCode(),
  805. ErrorCodeEnum.ITEMS_THAT_ARE_NOT_AVAILABLE_HANDLE.getMessage());
  806. }
  807. //endregion
  808. //入库明细根据id查询
  809. InboundItemResponse inboundItemResponse = inboundItemMapper.selectById(inboundItemVO.getItemId());
  810. //region 校验数量是否超出
  811. if (inboundItemVO.getIntoingQty().compareTo(inboundItemResponse.getIntoingQty()) > 0) {
  812. throw new BaseBusinessException(ErrorCodeEnum.CANNOT_EXCEED_THE_QUANTITY_IN_THE_OUTBOUND_SHIPMENT.getCode(),
  813. ErrorCodeEnum.CANNOT_EXCEED_THE_QUANTITY_IN_THE_OUTBOUND_SHIPMENT.getMessage());
  814. }
  815. //endregion
  816. //region 将库存需要的参数赋值
  817. inboundItemResponse.setInventoryType(Constant.InventoryType.INBOUND.getName());
  818. inboundItemResponse.setInventoryDocCode(Constant.InventoryDocCode.PURCHASE_ORDER.getValue());
  819. //endregion
  820. //region 编辑入库明细
  821. if (inboundItemVO.getItemId() != null) {
  822. inboundItemVO
  823. .setIntoQty(inboundItemResponse.getIntoQty().add(inboundItemVO.getIntoingQty()))
  824. .setIntoAmt(inboundItemResponse.getIntoAmt().add(inboundItemVO.getIntoingAmt()))
  825. .setIntoingQty(BigDecimal.ZERO)
  826. .setIntoingAmt(BigDecimal.ZERO)
  827. .setCostPrice(inboundItemVO.getPriceInto())
  828. .setCostAmt(inboundItemVO.getIntoQty().multiply(inboundItemVO.getPriceInto()).setScale(2, BigDecimal.ROUND_HALF_UP))
  829. ;
  830. //入库状态
  831. String intoStatus = this.setIntoStatus(inboundItemVO.getIntoingQty(), inboundItemVO.getIntoQty());
  832. inboundItemVO.setIntoStatus(intoStatus);
  833. //实体转换
  834. InboundItem inboundItem = inboundItemConvert.convertToPo(inboundItemVO);
  835. //修改
  836. inboundItemMapper.update(inboundItem,
  837. new UpdateWrapper<InboundItem>().lambda()
  838. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  839. );
  840. }
  841. //endregion
  842. //region 新建明细
  843. else {
  844. inboundItemVO
  845. .setIntoQty(inboundItemVO.getIntoingQty())
  846. .setIntoAmt(inboundItemVO.getIntoingAmt())
  847. .setIntoId(inboundVO.getIntoId())
  848. .setCostPrice(inboundItemVO.getPriceInto())
  849. .setCostAmt(inboundItemVO.getIntoQty().multiply(inboundItemVO.getPriceInto()).setScale(2, BigDecimal.ROUND_HALF_UP))
  850. .setIntoType(Constant.IntoType.SALE.getName())
  851. .setIntoingQty(BigDecimal.ZERO)
  852. .setIntoingAmt(BigDecimal.ZERO)
  853. ;
  854. //入库状态
  855. String intoStatus = this.setIntoStatus(inboundItemVO.getIntoingQty(), inboundItemVO.getIntoQty());
  856. inboundItemVO.setIntoStatus(intoStatus);
  857. //实体转换
  858. InboundItem inboundItem = inboundItemConvert.convertToPo(inboundItemVO);
  859. //新建
  860. inboundItemMapper.insert(inboundItem);
  861. }
  862. //endregion
  863. //region 采购明细
  864. //根据id查询
  865. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemVO.getFromItemId());
  866. //赋值(这里重写了更新方法,数量在更新方法中有数据库院士数量+本次数量)
  867. PurchaseItem purchaseItem = new PurchaseItem();
  868. purchaseItem.setItemId(inboundItemVO.getFromItemId());
  869. purchaseItem.setIntoingQty(inboundItemVO.getIntoQty().negate());
  870. purchaseItem.setIntoingAmt(inboundItemVO.getIntoAmt().negate());
  871. purchaseItem.setIntoQty(inboundItemVO.getIntoQty());
  872. purchaseItem.setIntoAmt(inboundItemVO.getIntoAmt());
  873. //入库状态
  874. String purItemIntoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  875. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  876. purchaseItem.setIntoStatus(purItemIntoStatus);
  877. int countRow = purchaseItemMapper.updateById(purchaseItem);
  878. //数量超出
  879. if (countRow == 0) {
  880. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  881. }
  882. //endregion
  883. }
  884. //endregion
  885. //region 删除明细
  886. BigDecimal delIntoingQty = BigDecimal.ZERO;
  887. BigDecimal delIntoingAmt = BigDecimal.ZERO;
  888. BigDecimal delIntoQty = BigDecimal.ZERO;
  889. BigDecimal delIntoAmt = BigDecimal.ZERO;
  890. if (inboundVO.getDeleteItemList() != null) {
  891. delIntoingQty = inboundVO.getDeleteItemList().stream().map(InboundItemVO::getIntoingQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  892. delIntoingAmt = inboundVO.getDeleteItemList().stream().map(InboundItemVO::getIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  893. delIntoQty = inboundVO.getDeleteItemList().stream().map(InboundItemVO::getIntoQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  894. delIntoAmt = inboundVO.getDeleteItemList().stream().map(InboundItemVO::getIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  895. for (InboundItemVO inboundItemVO : inboundVO.getDeleteItemList()) {
  896. if (inboundItemVO.getItemId() != null) {
  897. InboundItem inboundItem = inboundItemConvert.convertToPo(inboundItemVO);
  898. inboundItem.setFlgValid(false);
  899. //修改
  900. inboundItemMapper.update(inboundItem,
  901. new UpdateWrapper<InboundItem>().lambda()
  902. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  903. );
  904. }
  905. //region 采购
  906. if (inboundItemVO.getFromItemId() != null) {
  907. //region 采购订单明细
  908. //赋值(这里重写了更新方法,数量在更新方法中有数据库院士数量+本次数量)
  909. PurchaseItem purchaseItem = new PurchaseItem();
  910. purchaseItem.setItemId(inboundItemVO.getFromItemId());
  911. purchaseItem.setIntoingQty(inboundItemVO.getIntoingQty().negate());
  912. purchaseItem.setIntoingAmt(inboundItemVO.getIntoingAmt().negate());
  913. purchaseItem.setIntoQty(inboundItemVO.getIntoQty().negate());
  914. purchaseItem.setIntoAmt(inboundItemVO.getIntoAmt().negate());
  915. //根据id查询
  916. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemVO.getFromItemId());
  917. //入库状态
  918. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  919. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  920. purchaseItem.setIntoStatus(intoStatus);
  921. int countRow = purchaseItemMapper.updateById(purchaseItem);
  922. //数量超出
  923. if (countRow == 0) {
  924. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  925. }
  926. //endregion
  927. }
  928. //endregion
  929. }
  930. }
  931. //endregion
  932. //region 编辑总单
  933. BigDecimal sumIntoQty = inboundVO.getItemList().stream().map(InboundItemVO::getIntoQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  934. BigDecimal sumIntoAmt = inboundVO.getItemList().stream().map(InboundItemVO::getIntoAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  935. inboundVO.setIntoQty(sumIntoQty);
  936. inboundVO.setIntoAmt(sumIntoAmt);
  937. inboundVO.setIntoingQty(BigDecimal.ZERO);
  938. inboundVO.setIntoingAmt(BigDecimal.ZERO);
  939. //入库状态
  940. String intoStatus = this.setIntoStatus(inboundVO.getIntoingQty(), inboundVO.getIntoQty());
  941. inboundVO.setIntoStatus(intoStatus);
  942. //实体转换
  943. Inbound inbound = inboundConvert.convertToPo(inboundVO);
  944. //修改
  945. inboundMapper.update(inbound,
  946. new UpdateWrapper<Inbound>().lambda().eq(Inbound::getIntoId, UUID.fromString(inbound.getIntoId()))
  947. );
  948. //endregion
  949. //region 修改采购订单
  950. if (inboundVO.getFromId() != null) {
  951. //赋值(这里重写了更新方法,数量在更新方法中有数据库院士数量+本次数量)
  952. Purchase purchase = new Purchase();
  953. purchase.setPurId(inboundVO.getFromId());
  954. purchase.setIntoQty(sumIntoQty.subtract(delIntoQty));
  955. purchase.setIntoAmt(sumIntoAmt.subtract(delIntoAmt));
  956. purchase.setIntoingQty((inboundResponse.getIntoingQty().add(delIntoingQty)).negate());
  957. purchase.setIntoingAmt((inboundResponse.getIntoingAmt().add(delIntoingAmt)).negate());
  958. //根据id查询
  959. PurchaseResponse purchaseResponse = purchaseMapper.selectById(inboundVO.getFromId());
  960. //入库状态
  961. String purIntoStatus = this.setIntoStatus(purchaseResponse.getIntoingQty().add(purchase.getIntoingQty()),
  962. purchaseResponse.getIntoQty().add(purchase.getIntoQty()), purchase.getSumQuantity());
  963. purchase.setIntoStatus(purIntoStatus);
  964. //修改
  965. int countRow = purchaseMapper.updateById(purchase);
  966. //数量超出
  967. if (countRow == 0) {
  968. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  969. }
  970. }
  971. //endregion
  972. //region 账款
  973. accountService.accPayable(inboundVO.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  974. //endregion
  975. //region todo 调用库存 这里后续把删除的明细也加上
  976. // Map<String, Object> map = new HashMap<>();
  977. // map.put("intoDetail",inboundItemResponseList);
  978. // inventoryService.updateInventoryInformation(map);
  979. //endregion
  980. //endregion
  981. return ResponseResultUtil.success(inboundVO);
  982. }
  983. /**
  984. * @desc : 采购入库撤销
  985. * @date : 2024/3/7 17:06
  986. * @author : 寇珊珊
  987. */
  988. @Transactional(rollbackFor = {Exception.class})
  989. public ResponseResultVO<?> purchaseInboundCancel(InboundVO inboundVO) {
  990. //region 查询入库总单数据信息
  991. InboundResponse inboundResponse = inboundMapper.selectById(inboundVO.getIntoId());
  992. //endregion
  993. //region 退账
  994. if (inboundResponse.getReceivableId() != null) {
  995. accountService.reversePayable(inboundVO.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  996. }
  997. //endregion
  998. //region 修改订单数据信息
  999. if (inboundResponse.getFromId() != null) {
  1000. //根据id查询
  1001. PurchaseResponse purchaseResponse = purchaseMapper.selectById(inboundVO.getFromId());
  1002. //赋值 (这里重写了更新方法,数量在更新方法中有数据库院士数量+本次数量)
  1003. Purchase purchase = new Purchase();
  1004. purchase.setPurId(inboundResponse.getFromId());
  1005. purchase.setIntoQty(inboundResponse.getIntoQty().negate());
  1006. purchase.setIntoAmt(inboundResponse.getIntoAmt().negate());
  1007. purchase.setIntoingQty(inboundResponse.getIntoQty());
  1008. purchase.setIntoingAmt(inboundResponse.getIntoAmt());
  1009. //入库状态
  1010. String intoStatus = this.setIntoStatus(purchaseResponse.getIntoingQty().add(purchase.getIntoingQty()),
  1011. purchaseResponse.getIntoQty().add(purchase.getIntoQty()), purchaseResponse.getSumQuantity());
  1012. purchase.setIntoStatus(intoStatus);
  1013. int countRow = purchaseMapper.updateById(purchase);
  1014. //数量超出
  1015. if (countRow == 0) {
  1016. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  1017. }
  1018. }
  1019. //endregion
  1020. //region 修改总单数据信息
  1021. Inbound inbound = new Inbound();
  1022. inbound.setIntoId(inboundVO.getIntoId());
  1023. inbound.setIntoDate(null);
  1024. inbound.setIntoStatus(Constant.IntoStatus.RUKUZHONG.getName());
  1025. inbound.setIntoingQty(inboundResponse.getIntoingQty().add(inboundResponse.getIntoQty()));
  1026. inbound.setIntoingAmt(inboundResponse.getIntoingAmt().add(inboundResponse.getIntoAmt()));
  1027. inbound.setIntoQty(BigDecimal.ZERO);
  1028. inbound.setIntoAmt(BigDecimal.ZERO);
  1029. //修改
  1030. inboundMapper.update(inbound,
  1031. new UpdateWrapper<Inbound>().lambda()
  1032. .eq(Inbound::getIntoId, UUID.fromString(inbound.getIntoId()))
  1033. );
  1034. //endregion
  1035. //region 明细数据
  1036. //根据总单id查明细
  1037. List<InboundItemResponse> orderEntryItemResponsesList = inboundItemMapper.selectByCond(new InboundItemQuery().setIntoId(inbound.getIntoId()));
  1038. for (InboundItemResponse inboundItemResponse : orderEntryItemResponsesList) {
  1039. //region 修改采购明细数据信息
  1040. if (inboundItemResponse.getFromItemId() != null) {
  1041. //根据id查询
  1042. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemResponse.getFromItemId());
  1043. //赋值 (这里重写了更新方法,数量在更新方法中有数据库院士数量+本次数量)
  1044. PurchaseItem purchaseItem = new PurchaseItem();
  1045. purchaseItem.setItemId(inboundItemResponse.getFromItemId());
  1046. purchaseItem.setIntoQty(inboundItemResponse.getIntoQty().negate());
  1047. purchaseItem.setIntoAmt(inboundItemResponse.getIntoAmt().negate());
  1048. purchaseItem.setIntoingQty(inboundItemResponse.getIntoQty());
  1049. purchaseItem.setIntoingAmt(inboundItemResponse.getIntoAmt());
  1050. //入库状态
  1051. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  1052. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  1053. purchaseItem.setIntoStatus(intoStatus);
  1054. //修改
  1055. int countRow = purchaseItemMapper.updateById(purchaseItem);
  1056. //数量超出
  1057. if (countRow == 0) {
  1058. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  1059. }
  1060. }
  1061. //endregion
  1062. //region修改入库明细信息
  1063. InboundItem inboundItem = new InboundItem();
  1064. //region 将库存需要的参数赋值
  1065. inboundItemResponse.setInventoryType(Constant.InventoryType.INBOUND.getName());
  1066. inboundItemResponse.setInventoryDocCode(Constant.InventoryDocCode.PURCHASE_ORDER.getValue());
  1067. inboundItemResponse.setIntoQty(inboundItemResponse.getIntoQty().negate());
  1068. inboundItemResponse.setIntoAmt(inboundItemResponse.getIntoAmt().negate());
  1069. //endregion
  1070. inboundItem
  1071. .setIntoId(inbound.getIntoId())
  1072. .setIntoStatus(Constant.IntoStatus.RUKUZHONG.getName())
  1073. .setIntoingQty(inboundItemResponse.getIntoingQty().add(inboundItemResponse.getIntoQty()))
  1074. .setIntoingAmt(inboundItemResponse.getIntoingAmt().add(inboundItemResponse.getIntoAmt()))
  1075. .setIntoQty(BigDecimal.ZERO)
  1076. .setIntoAmt(BigDecimal.ZERO)
  1077. .setCostPrice(BigDecimal.ZERO)
  1078. .setCostAmt(BigDecimal.ZERO)
  1079. .setItemId(inboundItemResponse.getItemId());
  1080. //入库状态
  1081. String intoStatus = this.setIntoStatus(inboundItem.getIntoingQty(), inboundItem.getIntoQty());
  1082. inboundItem.setIntoStatus(intoStatus);
  1083. //修改
  1084. inboundItemMapper.update(inboundItem,
  1085. new UpdateWrapper<InboundItem>().lambda()
  1086. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  1087. );
  1088. //endregion
  1089. }
  1090. //endregion
  1091. //region todo 调用库存
  1092. // Map<String, Object> map = new HashMap<>();
  1093. // map.put("intoDetail",inboundItemResponseList);
  1094. // inventoryService.updateInventoryInformation(map);
  1095. //endregion
  1096. return ResponseResultUtil.success();
  1097. }
  1098. /**
  1099. * @desc : 入库状态通用(目前本页面)
  1100. * @date : 2024/3/9 8:59
  1101. * @author : 寇珊珊
  1102. */
  1103. public String setIntoStatus(BigDecimal intoingQty, BigDecimal intoQty) {
  1104. //入库状态
  1105. String intoStatus = null;
  1106. //已入库数量>0 入库中数量>0
  1107. if (intoQty.compareTo(BigDecimal.ZERO) >= 0 && intoingQty.compareTo(BigDecimal.ZERO) > 0) {
  1108. //入库中
  1109. intoStatus = Constant.IntoStatus.RUKUZHONG.getName();
  1110. }
  1111. //已入库数量=0 入库中数量=0
  1112. else if (intoQty.compareTo(BigDecimal.ZERO) == 0 && intoingQty.compareTo(BigDecimal.ZERO) == 0) {
  1113. //待入库
  1114. intoStatus = Constant.IntoStatus.DAIRUKU.getName();
  1115. }
  1116. //已入库数量>0 入库中数量=0
  1117. else if (intoQty.compareTo(BigDecimal.ZERO) > 0 && intoingQty.compareTo(BigDecimal.ZERO) == 0) {
  1118. //已入库
  1119. intoStatus = Constant.IntoStatus.YIRUKU.getName();
  1120. }
  1121. return intoStatus;
  1122. }
  1123. /**
  1124. * @desc : 上游单据入库状态通用(目前本页面)
  1125. * @date : 2024/4/1 17:14
  1126. * @author : 寇珊珊
  1127. */
  1128. public String setIntoStatus(BigDecimal intoingQty, BigDecimal intoQty, BigDecimal sumQty) {
  1129. //入库状态
  1130. String intoStatus = null;
  1131. //入库中+已入库 小于 总数
  1132. if (intoingQty.add(intoingQty).compareTo(sumQty) < 0) {
  1133. //入库中
  1134. intoStatus = Constant.IntoStatus.RUKUZHONG.getName();
  1135. }
  1136. //已入库数量=0 入库中数量=0
  1137. else if (intoQty.compareTo(BigDecimal.ZERO) == 0 && intoingQty.compareTo(BigDecimal.ZERO) == 0) {
  1138. //待入库
  1139. intoStatus = Constant.IntoStatus.DAIRUKU.getName();
  1140. }
  1141. //入库中+已入库 等于 总数
  1142. else if (intoingQty.add(intoingQty).compareTo(sumQty) == 0) {
  1143. //已入库
  1144. intoStatus = Constant.IntoStatus.YIRUKU.getName();
  1145. }
  1146. return intoStatus;
  1147. }
  1148. }