InboundPurchaseService.java 99 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816
  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.ivt.InventoryMapper;
  20. import com.dk.mdm.mapper.pur.PurchaseItemMapper;
  21. import com.dk.mdm.mapper.pur.PurchaseMapper;
  22. import com.dk.mdm.model.pojo.ivt.Inbound;
  23. import com.dk.mdm.model.pojo.ivt.InboundItem;
  24. import com.dk.mdm.model.pojo.ivt.Outbound;
  25. import com.dk.mdm.model.pojo.ivt.OutboundItem;
  26. import com.dk.mdm.model.pojo.pur.Purchase;
  27. import com.dk.mdm.model.pojo.pur.PurchaseItem;
  28. import com.dk.mdm.model.pojo.sale.Order;
  29. import com.dk.mdm.model.pojo.sale.OrderItem;
  30. import com.dk.mdm.model.query.ivt.InboundItemQuery;
  31. import com.dk.mdm.model.query.ivt.InboundQuery;
  32. import com.dk.mdm.model.query.ivt.InventoryQuery;
  33. import com.dk.mdm.model.query.ivt.OutboundItemQuery;
  34. import com.dk.mdm.model.response.ivt.*;
  35. import com.dk.mdm.model.response.pur.PurchaseItemResponse;
  36. import com.dk.mdm.model.response.pur.PurchaseResponse;
  37. import com.dk.mdm.model.response.sale.OrderItemResponse;
  38. import com.dk.mdm.model.response.sale.OrderResponse;
  39. import com.dk.mdm.model.vo.ivt.InboundItemVO;
  40. import com.dk.mdm.model.vo.ivt.InboundVO;
  41. import com.dk.mdm.model.vo.ivt.OutboundItemVO;
  42. import com.dk.mdm.model.vo.ivt.OutboundVO;
  43. import com.dk.mdm.service.common.CommonService;
  44. import com.dk.mdm.service.ivt.inventory.InventoryService;
  45. import com.dk.mdm.service.mac.AccountService;
  46. import org.springframework.beans.factory.annotation.Autowired;
  47. import org.springframework.stereotype.Service;
  48. import org.springframework.transaction.annotation.Transactional;
  49. import java.math.BigDecimal;
  50. import java.time.LocalDate;
  51. import java.util.HashMap;
  52. import java.util.List;
  53. import java.util.Map;
  54. import java.util.UUID;
  55. import java.util.stream.Collectors;
  56. /**
  57. * @author : 寇珊珊
  58. * @desc : 采购入库业务层
  59. * @date : 2024/3/7 14:11
  60. */
  61. @Service
  62. public class InboundPurchaseService extends BaseService<Inbound> {
  63. @Override
  64. public BaseMapper<Inbound> getRepository() {
  65. return inboundMapper;
  66. }
  67. @Autowired
  68. private InboundMapper inboundMapper;
  69. @Autowired
  70. private InboundConvert inboundConvert;
  71. @Autowired
  72. private InboundItemMapper inboundItemMapper;
  73. @Autowired
  74. private InboundItemConvert inboundItemConvert;
  75. @Autowired
  76. private PurchaseMapper purchaseMapper;
  77. @Autowired
  78. private PurchaseItemMapper purchaseItemMapper;
  79. @Autowired
  80. private CommonService commonService;
  81. @Autowired
  82. private CommonMapper commonMapper;
  83. @Autowired
  84. private InventoryService inventoryService;
  85. @Autowired
  86. private AccountService accountService;
  87. @Autowired
  88. private InventoryMapper inventoryMapper;
  89. /**
  90. * @desc : 条件查询
  91. * @date : 2024/3/7 14:12
  92. * @author : 寇珊珊
  93. */
  94. @Pagination
  95. public ResponseResultVO<PageList<InboundResponse>> selectByCond(InboundQuery inboundQuery) {
  96. return super.mergeListWithCount(inboundQuery, inboundMapper.selectByCond(inboundQuery),
  97. inboundMapper.countByCond(inboundQuery));
  98. }
  99. /**
  100. * @desc : 查询明细
  101. * @date : 2024/3/9 15:43
  102. * @author : 寇珊珊
  103. */
  104. @Pagination
  105. public ResponseResultVO<Map<String, Object>> selectPurchaseInboundItemInfoById(String id) {
  106. Map<String, Object> result = new HashMap<>();
  107. // 商品明细
  108. List<InboundItemResponse> inboundItemResponses = inboundItemMapper.selectByCond(new InboundItemQuery().setIntoId(id));
  109. result.put("itemList", inboundItemResponses);
  110. // 收款
  111. // 附件
  112. return ResponseResultUtil.success(result);
  113. }
  114. /**
  115. * @desc : 查询入库价
  116. * @date : 2024/7/1 11:29
  117. * @author : 寇珊珊
  118. */
  119. @Transactional(rollbackFor = {Exception.class})
  120. public InboundItemResponse selectPriceInto(InboundItemVO inboundItemVO) {
  121. List<InboundItemResponse> inboundItemResponses = inboundItemMapper.selectPriceInto(new InboundItemQuery().setSkuId(inboundItemVO.getSkuId())
  122. .setNonStdCode(inboundItemVO.getNonStdCode())
  123. .setWhId(inboundItemVO.getWhId()));
  124. if (inboundItemResponses != null && inboundItemResponses.size() > 0) {
  125. return inboundItemResponses.get(0);
  126. }
  127. return null;
  128. }
  129. /**
  130. * @desc : 采购入库新建
  131. * @date : 2024/3/7 14:13
  132. * 入库中数量/金额 已入库数量/金额 由调用方传入
  133. * @author : 寇珊珊
  134. */
  135. @Transactional(rollbackFor = {Exception.class})
  136. public ResponseResultVO<?> purchaseInboundInsert(InboundVO inboundVO) {
  137. //region 校验明细
  138. if (inboundVO.getItemList().size() == 0) {
  139. throw new BaseBusinessException(ErrorCodeEnum.INBOUND_ITEM_NOT_EXIST.getCode(),
  140. ErrorCodeEnum.INBOUND_ITEM_NOT_EXIST.getMessage());
  141. }
  142. //endregion
  143. //region 查询当前入库明细中是否存在未空或者0的入库价,如果存在去库存流水差最近一条有价格的数据赋值到当前明细
  144. Boolean priceIntoFlag = false;
  145. for (InboundItemVO inboundItemVO : inboundVO.getItemList()) {
  146. if (inboundItemVO.getCostPrice() == null || inboundItemVO.getCostPrice().compareTo(BigDecimal.ZERO) == 0) {
  147. priceIntoFlag = true;
  148. //查询库存批次最近一条入库价
  149. InboundItemResponse inboundItemResponse = this.selectPriceInto(inboundItemVO);
  150. //todo 2024年7月5日15:57:01 priceOut和outingAmt 前台传 z确认修改
  151. //todo 2024年7月9日08:52:55 入库价和入库价总和后台计算 z确认修改
  152. inboundItemVO.setCostPrice(inboundItemResponse != null ? inboundItemResponse.getCostPrice() : BigDecimal.ZERO);
  153. inboundItemVO.setCostAmt(inboundItemResponse != null ? inboundItemResponse.getCostPrice().multiply(inboundItemVO.getIntoingQty()).setScale(2, BigDecimal.ROUND_HALF_UP) : BigDecimal.ZERO);
  154. inboundItemVO.setPriceInto(inboundItemResponse != null ? inboundItemResponse.getCostPrice() : BigDecimal.ZERO);
  155. inboundItemVO.setIntoingAmt(inboundItemResponse != null ? inboundItemResponse.getPriceInto().multiply(inboundItemVO.getIntoingQty()).setScale(2, BigDecimal.ROUND_HALF_UP) : BigDecimal.ZERO);
  156. }
  157. }
  158. if (priceIntoFlag) {
  159. BigDecimal intoingAmt = inboundVO.getItemList().stream().map(InboundItemVO::getIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  160. inboundVO.setIntoingAmt(intoingAmt);
  161. }
  162. //endregion
  163. //region 查询当前公司的系统参数 自动办理信息 并赋值
  164. Map<String, Object> map = new HashMap<>();
  165. map.put("cpId", inboundVO.getCpId());
  166. map.put("code", Constant.SystemConstant.IVT_001.getValue());
  167. //自动办理标识
  168. String flgHandleSetting = commonMapper.getSettingValue(map);
  169. //自动办理标识为1 自动办理入库
  170. if (Constant.FlgAutoHandleStringType.ONE.getValue().equals(flgHandleSetting)) {
  171. inboundVO.setFlgAutoHandle(Constant.FlgAutoHandle.TRUE.getValue());
  172. }
  173. //endregion
  174. //region 总单
  175. //获取 id/单号
  176. Map<String, Object> codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.PURCASEINBOUND.getName(), false);
  177. inboundVO.setIntoId(codeMap.get("outId").toString()).
  178. setIntoNo(codeMap.get("outNote").toString());
  179. //入库类型
  180. inboundVO.setIntoType(Constant.IntoType.SALE.getName());
  181. //自动入库标识
  182. if (inboundVO.getFlgAutoHandle()) {
  183. //已入库
  184. inboundVO.setIntoStatus(Constant.IntoStatus.YIRUKU.getName());
  185. //入库日期
  186. inboundVO.setIntoDate(inboundVO.getIntoDate() == null ? LocalDate.now() : inboundVO.getIntoDate());
  187. } else {
  188. //入库中
  189. inboundVO.setIntoStatus(Constant.IntoStatus.RUKUZHONG.getName());
  190. }
  191. //入库状态等于已入库 更新合计入库数量/金额 = 入库中数量/入库中金额
  192. if (Constant.IntoStatus.YIRUKU.getName().equals(inboundVO.getIntoStatus())) {
  193. inboundVO.setIntoQty(inboundVO.getIntoingQty())
  194. .setIntoAmt(inboundVO.getIntoingAmt())
  195. .setIntoingQty(BigDecimal.ZERO)
  196. .setIntoingAmt(BigDecimal.ZERO)
  197. ;
  198. } else {
  199. inboundVO.setIntoQty(BigDecimal.ZERO)
  200. .setIntoAmt(BigDecimal.ZERO)
  201. ;
  202. }
  203. //实体转换
  204. Inbound inbound = inboundConvert.convertToPo(inboundVO);
  205. inboundMapper.insert(inbound);
  206. //endregion
  207. //region 采购总单
  208. this.insertOrderMessageByEdit(inboundVO,inboundVO.getItemList());
  209. //endregion
  210. //region 明细
  211. for (InboundItemVO inboundItemVO : inboundVO.getItemList()) {
  212. //region 将库存需要的参数赋值
  213. inboundItemVO.setInventoryType(Constant.InventoryType.INBOUND.getName());
  214. inboundItemVO.setInventoryDocCode(Constant.InventoryDocCode.PURCHASE_ORDER.getValue());
  215. inboundItemVO.setAddOrEditFlag(true);
  216. //endregion
  217. //总单id
  218. inboundItemVO.setIntoId(inboundVO.getIntoId());
  219. //入库类型
  220. inboundItemVO.setIntoType(inboundVO.getIntoType());
  221. //入库状态等于已入库 更新合计入库数量/金额 = 入库中数量/入库中金额
  222. if (Constant.IntoStatus.YIRUKU.getName().equals(inboundVO.getIntoStatus())) {
  223. inboundItemVO
  224. .setIntoQty(inboundItemVO.getIntoingQty())
  225. .setIntoAmt(inboundItemVO.getIntoingAmt())
  226. .setIntoingQty(BigDecimal.ZERO)
  227. .setIntoingAmt(BigDecimal.ZERO)
  228. ;
  229. } else {
  230. inboundItemVO
  231. .setIntoQty(BigDecimal.ZERO)
  232. .setIntoAmt(BigDecimal.ZERO);
  233. }
  234. //入库状态
  235. inboundItemVO.setIntoStatus(inboundVO.getIntoStatus());
  236. //实体转换
  237. InboundItem inboundItem = inboundItemConvert.convertToPo(inboundItemVO);
  238. inboundItemMapper.insert(inboundItem);
  239. inboundItemVO.setItemId(inboundItem.getItemId());
  240. //endregion
  241. //region 采购明细
  242. if (inboundItemVO.getFromItemId() != null) {
  243. //赋值(这里重写了更新方法,数量在更新方法中有数据库院士数量+本次数量)
  244. PurchaseItem purchaseItem = new PurchaseItem();
  245. purchaseItem.setItemId(inboundItemVO.getFromItemId());
  246. //根据id查询
  247. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemVO.getFromItemId());
  248. //已入库
  249. if (Constant.IntoStatus.YIRUKU.getName().equals(inboundVO.getIntoStatus())) {
  250. purchaseItem.setIntoingQty(BigDecimal.ZERO);
  251. purchaseItem.setIntoingAmt(BigDecimal.ZERO);
  252. purchaseItem.setIntoQty(inboundItemVO.getIntoQty());
  253. purchaseItem.setIntoAmt(inboundItemVO.getIntoAmt());
  254. }
  255. //入库中
  256. else {
  257. purchaseItem.setIntoingQty(inboundItemVO.getIntoingQty());
  258. purchaseItem.setIntoingAmt(inboundItemVO.getIntoingAmt());
  259. purchaseItem.setIntoQty(BigDecimal.ZERO);
  260. purchaseItem.setIntoAmt(BigDecimal.ZERO);
  261. }
  262. //入库状态
  263. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  264. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  265. purchaseItem.setIntoStatus(intoStatus);
  266. int countRow = purchaseItemMapper.updateById(purchaseItem);
  267. //数量超出
  268. if (countRow == 0) {
  269. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  270. }
  271. }
  272. //endregion
  273. }
  274. //endregion
  275. //region 入账
  276. if (Constant.IntoStatus.YIRUKU.getName().equals(inboundVO.getIntoStatus())) {
  277. accountService.accPayable(inboundVO.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  278. }
  279. //endregion
  280. //region 库存
  281. if (Constant.IntoStatus.YIRUKU.getName().equals(inboundVO.getIntoStatus())) {
  282. Map<String, Object> invMap = new HashMap<>();
  283. invMap.put("intoDetail", inboundVO.getItemList());
  284. inventoryService.operatingInventoryInformation(invMap);
  285. }
  286. //endregion
  287. return ResponseResultUtil.success(inboundVO);
  288. }
  289. /**
  290. * @desc : 新建采购入库修改采购订单信息
  291. * @date : 2024/7/6 15:15
  292. * @author : 寇珊珊
  293. */
  294. @Transactional(rollbackFor = {Exception.class})
  295. public void insertOrderMessageByEdit(InboundVO inboundVO , List<InboundItemVO> itemList){
  296. //入库明细汇总
  297. Map<String, List<InboundItemVO>> purchaseIntoItemVOListMap = itemList.stream().collect(Collectors.groupingBy(InboundItemVO::getFromId));
  298. //入库明细汇总循环
  299. for (String fromId : purchaseIntoItemVOListMap.keySet()) {
  300. //region 提取新建分组后的明细
  301. List<InboundItemVO> purchaseIntoItemVOListGroup = purchaseIntoItemVOListMap.get(fromId);
  302. //分组后的明细 入库数量和金额总和
  303. BigDecimal purchaseSumQty = purchaseIntoItemVOListGroup.stream().map(InboundItemVO::getIntoingQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  304. BigDecimal purchaseSumAmt = purchaseIntoItemVOListGroup.stream().map(InboundItemVO::getIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  305. //endregion
  306. //region 反写订单数据
  307. //根据id查询
  308. PurchaseResponse purchaseResponse = purchaseMapper.selectById(fromId);
  309. Purchase purchase = new Purchase();
  310. purchase.setPurId(fromId);
  311. //已入库
  312. if (Constant.IntoStatus.YIRUKU.getName().equals(inboundVO.getIntoStatus())) {
  313. purchase.setIntoingQty(BigDecimal.ZERO);
  314. purchase.setIntoingAmt(BigDecimal.ZERO);
  315. purchase.setIntoQty(purchaseSumQty);
  316. purchase.setIntoAmt(purchaseSumAmt);
  317. }
  318. //出库中
  319. else {
  320. purchase.setIntoingQty(purchaseSumQty);
  321. purchase.setIntoingAmt(purchaseSumAmt);
  322. purchase.setIntoQty(BigDecimal.ZERO);
  323. purchase.setIntoAmt(BigDecimal.ZERO);
  324. }
  325. //入库状态
  326. String intoStatus = this.setIntoStatus(purchaseResponse.getIntoingQty().add(purchase.getIntoingQty()),
  327. purchaseResponse.getIntoQty().add(purchase.getIntoQty()), purchaseResponse.getSumQuantity());
  328. purchase.setIntoStatus(intoStatus);
  329. //修改
  330. int countRow = purchaseMapper.updateById(purchase);
  331. //数量超出
  332. if (countRow == 0) {
  333. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  334. }
  335. //endregion
  336. }
  337. }
  338. /**
  339. * @desc : 采购入库编辑
  340. * @date : 2024/3/25 16:25
  341. * @author : 寇珊珊
  342. */
  343. @Transactional(rollbackFor = {Exception.class})
  344. public ResponseResultVO<?> purchaseInboundUpdate(InboundVO inboundVO) {
  345. //region 小编辑
  346. if (!inboundVO.getLimitEdit()) {
  347. Inbound inbound = new Inbound();
  348. inbound.setIntoId(inboundVO.getIntoId());
  349. inbound.setRemarks(inboundVO.getRemarks());
  350. inbound.setAnnexPaths(inboundVO.getAnnexPaths());
  351. inboundMapper.update(inbound,
  352. new UpdateWrapper<Inbound>().lambda()
  353. .eq(Inbound::getIntoId, UUID.fromString(inbound.getIntoId()))
  354. );
  355. for (InboundItemVO inboundItemVO : inboundVO.getItemList()) {
  356. InboundItem inboundItem = new InboundItem();
  357. inboundItem.setItemId(inboundItemVO.getItemId());
  358. if (inboundItemVO.getRemarks() != null && inboundItemVO.getRemarks() != "") {
  359. inboundItem.setRemarks(inboundItemVO.getRemarks());
  360. inboundItemMapper.update(inboundItem,
  361. new UpdateWrapper<InboundItem>().lambda()
  362. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  363. );
  364. }
  365. }
  366. }
  367. //endregion
  368. //region 大编辑
  369. else {
  370. //region 根据id查询 此条入库单的数据还未更改前的数据
  371. InboundResponse inboundResponse = inboundMapper.selectById(inboundVO.getIntoId());
  372. BigDecimal sumQty = inboundVO.getItemList().stream().map(InboundItemVO::getIntoingQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  373. BigDecimal sumAmt = inboundVO.getItemList().stream().map(InboundItemVO::getIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  374. //endregion
  375. //region 已入库编辑
  376. if (Constant.IntoStatus.YIRUKU.getName().equals(inboundResponse.getIntoStatus())) {
  377. //region 退账
  378. if (inboundVO.getReceivableId() != null) {
  379. accountService.reversePayable(inboundVO.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  380. }
  381. //endregion
  382. //region 修改明细
  383. List<InboundItemVO> itemList = inboundVO.getItemList();
  384. for (InboundItemVO inboundItemVO : itemList) {
  385. //根据id查询
  386. InboundItemResponse inboundItemResponse = inboundItemMapper.selectById(inboundItemVO.getItemId());
  387. //region 编辑明细
  388. if (inboundItemVO.getItemId() != null) {
  389. //region 反写订单总单 数据需要 把查出来的已入库数量用别的变量存起来
  390. inboundItemVO.setUpdatePurchaseIntoQty(inboundItemResponse.getIntoQty());
  391. inboundItemVO.setUpdatePurchaseIntoAmt(inboundItemResponse.getIntoAmt());
  392. //endregion
  393. //region 将库存需要的参数赋值
  394. inboundItemVO.setInventoryType(Constant.InventoryType.INBOUND.getName());
  395. inboundItemVO.setInventoryDocCode(Constant.InventoryDocCode.PURCHASE_ORDER.getValue());
  396. //编辑之前的数
  397. inboundItemVO.setQtyBeforeUpdate(inboundItemResponse.getIntoQty());
  398. inboundItemVO.setAmtBeforeUpdate(inboundItemResponse.getIntoAmt());
  399. //编辑之后的数
  400. inboundItemVO.setIntoQty(inboundItemVO.getIntoingQty());
  401. inboundItemVO.setIntoAmt(inboundItemVO.getIntoingAmt());
  402. inboundItemVO.setAddOrEditFlag(false);
  403. //endregion
  404. InboundItem inboundItem = new InboundItem();
  405. inboundItem.setItemId(inboundItemVO.getItemId());
  406. inboundItem.setIntoQty(inboundItemVO.getIntoingQty());
  407. inboundItem.setIntoAmt(inboundItemVO.getIntoingAmt());
  408. //修改
  409. inboundItemMapper.update(inboundItem,
  410. new UpdateWrapper<InboundItem>().lambda()
  411. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  412. );
  413. }
  414. //endregion
  415. //region 新建明细
  416. else {
  417. inboundItemVO
  418. .setIntoQty(inboundItemVO.getIntoingQty())
  419. .setIntoAmt(inboundItemVO.getIntoingAmt())
  420. .setIntoingQty(BigDecimal.ZERO)
  421. .setIntoingAmt(BigDecimal.ZERO)
  422. ;
  423. inboundItemVO.setIntoId(inboundVO.getIntoId());
  424. //入库状态
  425. inboundItemVO.setIntoStatus(inboundVO.getIntoStatus());
  426. inboundItemVO.setIntoType(Constant.IntoType.SALE.getName());
  427. //实体转换
  428. InboundItem inboundItem = inboundItemConvert.convertToPo(inboundItemVO);
  429. inboundItemMapper.insert(inboundItem);
  430. inboundItemVO.setItemId(inboundItem.getItemId());
  431. //region 将库存需要的参数赋值
  432. inboundItemVO.setInventoryType(Constant.InventoryType.INBOUND.getName());
  433. inboundItemVO.setInventoryDocCode(Constant.InventoryDocCode.PURCHASE_ORDER.getValue());
  434. inboundItemVO.setIntoQty(inboundItemVO.getIntoQty());
  435. inboundItemVO.setIntoAmt(inboundItemVO.getIntoAmt());
  436. inboundItemVO.setAddOrEditFlag(true);
  437. //endregion
  438. }
  439. //endregion
  440. //region 销售明细
  441. if (inboundItemVO.getFromItemId() != null) {
  442. //根据id查询
  443. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemVO.getFromItemId());
  444. PurchaseItem purchaseItem = new PurchaseItem();
  445. purchaseItem.setItemId(inboundItemVO.getFromItemId());
  446. purchaseItem.setIntoQty(inboundItemResponse.getIntoQty().negate().add(inboundItemVO.getIntoingQty()));
  447. purchaseItem.setIntoAmt(inboundItemResponse.getIntoAmt().negate().add(inboundItemVO.getIntoingAmt()));
  448. //入库状态
  449. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty(),
  450. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  451. purchaseItem.setIntoStatus(intoStatus);
  452. int countRow = purchaseItemMapper.updateById(purchaseItem);
  453. //数量超出
  454. if (countRow == 0) {
  455. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  456. }
  457. }
  458. //endregion
  459. }
  460. //endregion
  461. //region 删除明细
  462. BigDecimal delIntoQty = BigDecimal.ZERO;
  463. BigDecimal delIntoAmt = BigDecimal.ZERO;
  464. if (inboundVO.getDeleteItemList() != null && inboundVO.getDeleteItemList().size() > 0) {
  465. delIntoQty = inboundVO.getDeleteItemList().stream().map(InboundItemVO::getIntoQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  466. delIntoAmt = inboundVO.getDeleteItemList().stream().map(InboundItemVO::getIntoAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  467. for (InboundItemVO inboundItemVO : inboundVO.getDeleteItemList()) {
  468. if (inboundItemVO.getItemId() != null) {
  469. //region 将库存需要的参数赋值
  470. inboundItemVO.setInventoryType(Constant.InventoryType.INBOUND.getName());
  471. inboundItemVO.setInventoryDocCode(Constant.InventoryDocCode.PURCHASE_ORDER.getValue());
  472. inboundItemVO.setIntoQty(inboundItemVO.getIntoQty());
  473. inboundItemVO.setIntoAmt(inboundItemVO.getIntoAmt());
  474. //endregion
  475. InboundItem inboundItem = inboundItemConvert.convertToPo(inboundItemVO);
  476. inboundItem.setFlgValid(false);
  477. //修改
  478. inboundItemMapper.update(inboundItem,
  479. new UpdateWrapper<InboundItem>().lambda()
  480. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  481. );
  482. }
  483. //region 销售明细
  484. if (inboundItemVO.getFromItemId() != null) {
  485. //根据id查询
  486. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemVO.getFromItemId());
  487. PurchaseItem purchaseItem = new PurchaseItem();
  488. purchaseItem.setItemId(inboundItemVO.getFromItemId());
  489. purchaseItem.setIntoQty(inboundItemVO.getIntoQty().negate());
  490. purchaseItem.setIntoAmt(inboundItemVO.getIntoAmt().negate());
  491. purchaseItem.setIntoingQty(inboundItemVO.getIntoQty());
  492. purchaseItem.setIntoingAmt(inboundItemVO.getIntoAmt());
  493. //入库状态
  494. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  495. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  496. purchaseItem.setIntoStatus(intoStatus);
  497. int countRow = purchaseItemMapper.updateById(purchaseItem);
  498. //数量超出
  499. if (countRow == 0) {
  500. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  501. }
  502. }
  503. //endregion
  504. }
  505. }
  506. //endregion
  507. //region 修改入库总单
  508. Inbound inbound = new Inbound();
  509. inbound.setIntoId(inboundVO.getIntoId());
  510. inbound.setIntoQty(sumQty);
  511. inbound.setIntoAmt(sumAmt);
  512. //修改
  513. inboundMapper.update(inbound,
  514. new UpdateWrapper<Inbound>().lambda().eq(Inbound::getIntoId, UUID.fromString(inbound.getIntoId()))
  515. );
  516. //endregion
  517. //region 修改采购订单总单
  518. this.updateOrderMessageByEdit(inboundResponse, inboundVO.getItemList(), inboundVO.getDeleteItemList());
  519. //endregion
  520. //region 入账
  521. if (inboundVO.getReceivableId() != null) {
  522. accountService.accPayable(inboundVO.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  523. }
  524. //endregion
  525. //region 调用库存
  526. Map<String, Object> map = new HashMap<>();
  527. map.put("intoDetail", inboundVO.getItemList());
  528. map.put("delIntoDetail", inboundVO.getDeleteItemList());
  529. inventoryService.operatingInventoryInformation(map);
  530. //endregion
  531. }
  532. //endregion
  533. //region 入库中编辑
  534. if (Constant.IntoStatus.RUKUZHONG.getName().equals(inboundResponse.getIntoStatus()) ||
  535. Constant.IntoStatus.DAIRUKU.getName().equals(inboundResponse.getIntoStatus())) {
  536. //region 修改明细
  537. List<InboundItemVO> itemList = inboundVO.getItemList();
  538. for (InboundItemVO inboundItemVO : itemList) {
  539. //根据id查询 获取到还未进行修改的数据
  540. InboundItemResponse inboundItemResponse = inboundItemMapper.selectById(inboundItemVO.getItemId());
  541. //region 编辑明细
  542. if (inboundItemVO.getItemId() != null) {
  543. //region 反写订单总单 数据需要 把查出来的入库中数量用别的变量存起来
  544. inboundItemVO.setUpdatePurchaseIntoingQty(inboundItemResponse.getIntoingQty());
  545. inboundItemVO.setUpdatePurchaseIntoingAmt(inboundItemResponse.getIntoingAmt());
  546. //endregion
  547. InboundItem inboundItem = new InboundItem();
  548. inboundItem.setItemId(inboundItemVO.getItemId());
  549. inboundItem.setIntoingQty(inboundItemVO.getIntoingQty());
  550. inboundItem.setIntoingAmt(inboundItemVO.getIntoingAmt());
  551. //修改
  552. inboundItemMapper.update(inboundItem,
  553. new UpdateWrapper<InboundItem>().lambda()
  554. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  555. );
  556. }
  557. //endregion
  558. //region 新建明细
  559. else {
  560. inboundItemVO
  561. .setIntoQty(BigDecimal.ZERO)
  562. .setIntoAmt(BigDecimal.ZERO)
  563. ;
  564. inboundItemVO.setIntoId(inboundVO.getIntoId());
  565. //入库状态
  566. inboundItemVO.setIntoStatus(inboundVO.getIntoStatus());
  567. inboundItemVO.setIntoType(Constant.IntoType.SALE.getName());
  568. //实体转换
  569. InboundItem inboundItem = inboundItemConvert.convertToPo(inboundItemVO);
  570. inboundItemMapper.insert(inboundItem);
  571. inboundItemVO.setItemId(inboundItem.getItemId());
  572. }
  573. //endregion
  574. //region 销售明细
  575. if (inboundItemVO.getFromItemId() != null) {
  576. //根据id查询
  577. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemVO.getFromItemId());
  578. PurchaseItem purchaseItem = new PurchaseItem();
  579. purchaseItem.setItemId(inboundItemVO.getFromItemId());
  580. //本次修改几个传几个(负数) sql中是原数据+本次修改数据
  581. purchaseItem.setIntoingQty(inboundItemResponse.getIntoingQty().negate().add(inboundItemVO.getIntoingQty()));
  582. purchaseItem.setIntoingAmt(inboundItemResponse.getIntoingAmt().negate().add(inboundItemVO.getIntoingAmt()));
  583. //入库状态
  584. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  585. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  586. purchaseItem.setIntoStatus(intoStatus);
  587. int countRow = purchaseItemMapper.updateById(purchaseItem);
  588. //数量超出
  589. if (countRow == 0) {
  590. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  591. }
  592. }
  593. //endregion
  594. }
  595. //endregion
  596. //region 删除明细
  597. BigDecimal delIntoQty = BigDecimal.ZERO;
  598. BigDecimal delIntoAmt = BigDecimal.ZERO;
  599. if (inboundVO.getDeleteItemList() != null && inboundVO.getDeleteItemList().size() > 0) {
  600. delIntoQty = inboundVO.getDeleteItemList().stream().map(InboundItemVO::getIntoingQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  601. delIntoAmt = inboundVO.getDeleteItemList().stream().map(InboundItemVO::getIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  602. for (InboundItemVO inboundItemVO : inboundVO.getDeleteItemList()) {
  603. //region 明细
  604. if (inboundItemVO.getItemId() != null) {
  605. InboundItem inboundItem = inboundItemConvert.convertToPo(inboundItemVO);
  606. inboundItem.setFlgValid(false);
  607. //修改
  608. inboundItemMapper.update(inboundItem,
  609. new UpdateWrapper<InboundItem>().lambda()
  610. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  611. );
  612. }
  613. //endregion
  614. //region 销售明细
  615. if (inboundItemVO.getFromItemId() != null) {
  616. //根据id查询
  617. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemVO.getFromItemId());
  618. PurchaseItem purchaseItem = new PurchaseItem();
  619. purchaseItem.setItemId(inboundItemVO.getFromItemId());
  620. purchaseItem.setIntoingQty(inboundItemVO.getIntoingQty().negate());
  621. purchaseItem.setIntoingAmt(inboundItemVO.getIntoingAmt().negate());
  622. //入库状态
  623. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  624. purchaseItemResponse.getIntoQty(), purchaseItemResponse.getItemQty());
  625. purchaseItem.setIntoStatus(intoStatus);
  626. int countRow = purchaseItemMapper.updateById(purchaseItem);
  627. //数量超出
  628. if (countRow == 0) {
  629. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  630. }
  631. }
  632. //endregion
  633. }
  634. }
  635. //endregion
  636. //region 修改入库总单
  637. Inbound inbound = new Inbound();
  638. inbound.setIntoId(inboundVO.getIntoId());
  639. inbound.setIntoingQty(sumQty);
  640. inbound.setIntoingAmt(sumAmt);
  641. //修改
  642. inboundMapper.update(inbound,
  643. new UpdateWrapper<Inbound>().lambda().eq(Inbound::getIntoId, UUID.fromString(inbound.getIntoId()))
  644. );
  645. //endregion
  646. //region 修改采购订单总单
  647. this.updateOrderMessageByEdit(inboundResponse, inboundVO.getItemList(), inboundVO.getDeleteItemList());
  648. //endregion
  649. }
  650. //endregion
  651. }
  652. //endregion
  653. return ResponseResultUtil.success(inboundVO);
  654. }
  655. /**
  656. * @desc : 采购入库编辑修改订单信息
  657. * @date : 2024/7/8 9:12
  658. * @author : 寇珊珊
  659. */
  660. @Transactional(rollbackFor = {Exception.class})
  661. public void updateOrderMessageByEdit(InboundResponse inboundResponse, List<InboundItemVO> itemList, List<InboundItemVO> deleteItemList) {
  662. //入库明细汇总
  663. Map<String, List<InboundItemVO>> purchaseIntoItemVOListMap = itemList.stream().collect(Collectors.groupingBy(InboundItemVO::getFromId));
  664. //入库明细删除汇总
  665. Map<String, List<InboundItemVO>> delPurchaseIntoItemVOListMap = deleteItemList.stream().collect(Collectors.groupingBy(InboundItemVO::getFromId));
  666. //人库明细汇总循环
  667. for (String fromId : purchaseIntoItemVOListMap.keySet()) {
  668. //有需要删除的修改数据
  669. if(delPurchaseIntoItemVOListMap!=null && delPurchaseIntoItemVOListMap.keySet().size()>0){
  670. //出库明细删除汇总循环
  671. for (String delFromId : delPurchaseIntoItemVOListMap.keySet()) {
  672. //新建入库明细来源Id = 删除入库明细来源Id
  673. if (fromId.equals(delFromId)) {
  674. //region 提取新建分组后的明细
  675. List<InboundItemVO> purchaseIntoItemVOListGroup = purchaseIntoItemVOListMap.get(fromId);
  676. //分组后的明细 出库数量和金额总和
  677. BigDecimal purchaseSumQty = purchaseIntoItemVOListGroup.stream().map(InboundItemVO::getIntoingQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  678. BigDecimal purchaseSumAmt = purchaseIntoItemVOListGroup.stream().map(InboundItemVO::getIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  679. //分组后的明细 原出库数量和金额总和
  680. BigDecimal updatePurchaseIntoQty = BigDecimal.ZERO;
  681. BigDecimal updatePurchaseIntoAmt = BigDecimal.ZERO;
  682. BigDecimal updatePurchaseIntoingQty = BigDecimal.ZERO;
  683. BigDecimal updatePurchaseIntoingAmt = BigDecimal.ZERO;
  684. //已入库
  685. if (Constant.IntoStatus.YIRUKU.getName().equals(inboundResponse.getIntoStatus())) {
  686. updatePurchaseIntoQty = purchaseIntoItemVOListGroup.stream().filter(it->it.getUpdatePurchaseIntoQty()!=null).map(InboundItemVO::getUpdatePurchaseIntoQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  687. updatePurchaseIntoAmt = purchaseIntoItemVOListGroup.stream().filter(it->it.getUpdatePurchaseIntoAmt()!=null).map(InboundItemVO::getUpdatePurchaseIntoAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  688. }
  689. //入库中
  690. else {
  691. updatePurchaseIntoingQty = purchaseIntoItemVOListGroup.stream().filter(it->it.getUpdatePurchaseIntoingQty()!=null).map(InboundItemVO::getUpdatePurchaseIntoingQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  692. updatePurchaseIntoingAmt = purchaseIntoItemVOListGroup.stream().filter(it->it.getUpdatePurchaseIntoingAmt()!=null).map(InboundItemVO::getUpdatePurchaseIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  693. }
  694. //endregion
  695. //region 提取删除分组后的明细
  696. List<InboundItemVO> delPurchaseIntoItemVOListGroup = delPurchaseIntoItemVOListMap.get(delFromId);
  697. BigDecimal purchaseDelOutQty = BigDecimal.ZERO;
  698. BigDecimal purchaseDelOutAmt = BigDecimal.ZERO;
  699. //已出库
  700. if (Constant.IntoStatus.YIRUKU.getName().equals(inboundResponse.getIntoStatus())) {
  701. purchaseDelOutQty = delPurchaseIntoItemVOListGroup.stream().map(InboundItemVO::getIntoQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  702. purchaseDelOutAmt = delPurchaseIntoItemVOListGroup.stream().map(InboundItemVO::getIntoAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  703. }
  704. //出库中
  705. else if (Constant.IntoStatus.RUKUZHONG.getName().equals(inboundResponse.getIntoStatus())) {
  706. purchaseDelOutQty = delPurchaseIntoItemVOListGroup.stream().map(InboundItemVO::getIntoingQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  707. purchaseDelOutAmt = delPurchaseIntoItemVOListGroup.stream().map(InboundItemVO::getIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  708. }
  709. //endregion
  710. //region 反写订单数据
  711. //根据id查询
  712. PurchaseResponse purchaseResponse = purchaseMapper.selectById(fromId);
  713. Purchase purchase = new Purchase();
  714. purchase.setPurId(fromId);
  715. //已入库
  716. if (Constant.IntoStatus.YIRUKU.getName().equals(inboundResponse.getIntoStatus())) {
  717. purchase.setIntoQty(purchaseSumQty.subtract(updatePurchaseIntoQty).subtract(purchaseDelOutQty));
  718. purchase.setIntoAmt(purchaseSumAmt.subtract(updatePurchaseIntoAmt).subtract(purchaseDelOutAmt));
  719. purchase.setIntoingQty(purchaseDelOutQty);
  720. purchase.setIntoingAmt(purchaseDelOutAmt);
  721. purchase.setUpdateIntoingMessageFlag(true);
  722. //入库状态
  723. String intoStatus = this.setIntoStatus(purchaseResponse.getIntoingQty().add(purchase.getIntoingQty()),
  724. purchaseResponse.getIntoQty().add(purchase.getIntoQty()), purchaseResponse.getSumQuantity());
  725. purchase.setIntoStatus(intoStatus);
  726. }
  727. //入库中
  728. else if (Constant.IntoStatus.RUKUZHONG.getName().equals(inboundResponse.getIntoStatus())) {
  729. purchase.setIntoingQty(purchaseSumQty.subtract(updatePurchaseIntoingQty).subtract(purchaseDelOutQty));
  730. purchase.setIntoingAmt(purchaseSumAmt.subtract(updatePurchaseIntoingAmt).subtract(purchaseDelOutAmt));
  731. purchase.setUpdateIntoingMessageFlag(true);
  732. //入库状态
  733. String intoStatus = this.setIntoStatus(purchaseResponse.getIntoingQty().add(purchase.getIntoingQty()),
  734. purchaseResponse.getIntoQty(), purchaseResponse.getSumQuantity());
  735. purchase.setIntoStatus(intoStatus);
  736. }
  737. //修改
  738. int countRow = purchaseMapper.updateById(purchase);
  739. //数量超出
  740. if (countRow == 0) {
  741. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  742. }
  743. //endregion
  744. }
  745. }
  746. }
  747. //没有需要删除的修改数据
  748. else{
  749. //region 提取新建分组后的明细
  750. List<InboundItemVO> purchaseIntoItemVOListGroup = purchaseIntoItemVOListMap.get(fromId);
  751. //分组后的明细 出库数量和金额总和
  752. BigDecimal purchaseSumQty = purchaseIntoItemVOListGroup.stream().map(InboundItemVO::getIntoQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  753. BigDecimal purchaseSumAmt = purchaseIntoItemVOListGroup.stream().map(InboundItemVO::getIntoAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  754. //分组后的明细 原出库数量和金额总和
  755. BigDecimal updatePurchaseIntoQty = BigDecimal.ZERO;
  756. BigDecimal updatePurchaseIntoAmt = BigDecimal.ZERO;
  757. BigDecimal updatePurchaseIntoingQty = BigDecimal.ZERO;
  758. BigDecimal updatePurchaseIntoingAmt = BigDecimal.ZERO;
  759. //已入库
  760. if (Constant.IntoStatus.YIRUKU.getName().equals(inboundResponse.getIntoStatus())) {
  761. updatePurchaseIntoQty = purchaseIntoItemVOListGroup.stream().filter(it -> it.getUpdatePurchaseIntoQty() != null).map(InboundItemVO::getUpdatePurchaseIntoQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  762. updatePurchaseIntoAmt = purchaseIntoItemVOListGroup.stream().filter(it -> it.getUpdatePurchaseIntoAmt() != null).map(InboundItemVO::getUpdatePurchaseIntoAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  763. }
  764. //入库中
  765. else {
  766. updatePurchaseIntoingQty = purchaseIntoItemVOListGroup.stream().filter(it->it.getUpdatePurchaseIntoingQty()!=null).map(InboundItemVO::getUpdatePurchaseIntoingQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  767. updatePurchaseIntoingAmt = purchaseIntoItemVOListGroup.stream().filter(it->it.getUpdatePurchaseIntoingAmt()!=null).map(InboundItemVO::getUpdatePurchaseIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  768. }
  769. //endregion
  770. //region 反写订单数据
  771. //根据id查询
  772. PurchaseResponse purchaseResponse = purchaseMapper.selectById(fromId);
  773. Purchase purchase = new Purchase();
  774. purchase.setPurId(fromId);
  775. //已出库
  776. if (Constant.IntoStatus.YIRUKU.getName().equals(inboundResponse.getIntoStatus())) {
  777. purchase.setIntoQty(purchaseSumQty.subtract(updatePurchaseIntoQty));
  778. purchase.setIntoAmt(purchaseSumAmt.subtract(updatePurchaseIntoAmt));
  779. purchase.setUpdateIntoMessageFlag(true);
  780. //入库状态
  781. String intoStatus = this.setIntoStatus(purchaseResponse.getIntoingQty().add(purchase.getIntoingQty()),
  782. purchaseResponse.getIntoQty().add(purchase.getIntoQty()), purchaseResponse.getSumQuantity());
  783. purchase.setIntoStatus(intoStatus);
  784. }
  785. //入库中
  786. else if (Constant.IntoStatus.RUKUZHONG.getName().equals(inboundResponse.getIntoStatus())) {
  787. purchase.setIntoingQty(updatePurchaseIntoingQty.negate());
  788. purchase.setIntoingAmt(updatePurchaseIntoingAmt.negate());
  789. purchase.setUpdateIntoingMessageFlag(true);
  790. //入库状态
  791. String intoStatus = this.setIntoStatus(purchaseResponse.getIntoingQty().add(purchase.getIntoingQty()),
  792. purchaseResponse.getIntoQty(), purchaseResponse.getSumQuantity());
  793. purchase.setIntoStatus(intoStatus);
  794. }
  795. //修改
  796. int countRow = purchaseMapper.updateById(purchase);
  797. //数量超出
  798. if (countRow == 0) {
  799. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  800. }
  801. //endregion
  802. }
  803. }
  804. }
  805. /**
  806. * @desc : 采购入库作废
  807. * @date : 2024/3/26 9:24
  808. * @author : 寇珊珊
  809. */
  810. @Transactional(rollbackFor = {Exception.class})
  811. public ResponseResultVO<?> purchaseInboundRepeal(String intoId) {
  812. //region 查询总单 查询明细
  813. //根据id查询 此条入库单的数据还未更改前的数据
  814. InboundResponse inboundResponse = inboundMapper.selectById(intoId);
  815. //根据总单id查询
  816. List<InboundItemResponse> inboundItemResponseList = inboundItemMapper.selectByCond(new InboundItemQuery().setIntoId(inboundResponse.getIntoId()));
  817. //endregion
  818. //region 已入库作废
  819. if (Constant.IntoStatus.YIRUKU.getName().equals(inboundResponse.getIntoStatus())) {
  820. //region 退账
  821. if (inboundResponse.getReceivableId() != null) {
  822. accountService.reversePayable(inboundResponse.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  823. }
  824. //endregion
  825. //region 修改明细
  826. for (InboundItemResponse inboundItemResponse : inboundItemResponseList) {
  827. //region 将库存需要的参数赋值
  828. inboundItemResponse.setInventoryType(Constant.InventoryType.INBOUND.getName());
  829. inboundItemResponse.setInventoryDocCode(Constant.InventoryDocCode.PURCHASE_ORDER.getValue());
  830. inboundItemResponse.setIntoQty(inboundItemResponse.getIntoQty().negate());
  831. inboundItemResponse.setIntoAmt(inboundItemResponse.getIntoAmt().negate());
  832. //endregion
  833. //region 编辑明细 赋值 赋值明细 防止作废的单据查不到明细 故注掉下面代码
  834. // InboundItem inboundItem = new InboundItem();
  835. // inboundItem.setItemId(inboundItemResponse.getItemId());
  836. // inboundItem.setFlgValid(false);
  837. // //修改
  838. // inboundItemMapper.update(inboundItem,
  839. // new UpdateWrapper<InboundItem>().lambda()
  840. // .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  841. // );
  842. //endregion
  843. //region 销售明细
  844. if (inboundItemResponse.getFromItemId() != null) {
  845. //根据id查询
  846. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemResponse.getFromItemId());
  847. PurchaseItem purchaseItem = new PurchaseItem();
  848. purchaseItem.setItemId(inboundItemResponse.getFromItemId());
  849. purchaseItem.setIntoQty(inboundItemResponse.getIntoQty().negate());
  850. purchaseItem.setIntoAmt(inboundItemResponse.getIntoAmt().negate());
  851. //入库状态
  852. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty(),
  853. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  854. purchaseItem.setIntoStatus(intoStatus);
  855. int countRow = purchaseItemMapper.updateById(purchaseItem);
  856. //数量超出
  857. if (countRow == 0) {
  858. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  859. }
  860. }
  861. //endregion
  862. }
  863. //endregion
  864. //region 修改入库总单
  865. Inbound inbound = new Inbound();
  866. inbound.setIntoId(inboundResponse.getIntoId());
  867. inbound.setFlgValid(false);
  868. //修改
  869. inboundMapper.update(inbound,
  870. new UpdateWrapper<Inbound>().lambda().eq(Inbound::getIntoId, UUID.fromString(inbound.getIntoId()))
  871. );
  872. //endregion
  873. //region 修改采购总单
  874. this.updateOrderMessageByRepeal(inboundResponse, inboundItemResponseList);
  875. //endregion
  876. //region 入账
  877. if (inboundResponse.getReceivableId() != null) {
  878. accountService.accPayable(inboundResponse.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  879. }
  880. //endregion
  881. //region 调用库存
  882. Map<String, Object> map = new HashMap<>();
  883. map.put("delIntoDetail", inboundItemResponseList);
  884. inventoryService.operatingInventoryInformation(map);
  885. //endregion
  886. }
  887. //endregion
  888. //region 入库中、待入库作废
  889. if (Constant.IntoStatus.RUKUZHONG.getName().equals(inboundResponse.getIntoStatus()) ||
  890. Constant.IntoStatus.DAIRUKU.getName().equals(inboundResponse.getIntoStatus())) {
  891. //region 修改明细
  892. for (InboundItemResponse inboundItemResponse : inboundItemResponseList) {
  893. //region 编辑明细 赋值
  894. InboundItem inboundItem = new InboundItem();
  895. inboundItem.setItemId(inboundItemResponse.getItemId());
  896. inboundItem.setIntoingQty(BigDecimal.ZERO);
  897. inboundItem.setIntoingAmt(BigDecimal.ZERO);
  898. // inboundItem.setFlgValid(false);
  899. //修改
  900. inboundItemMapper.update(inboundItem,
  901. new UpdateWrapper<InboundItem>().lambda()
  902. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  903. );
  904. //endregion
  905. //region 销售明细
  906. if (inboundItemResponse.getFromItemId() != null) {
  907. //根据id查询
  908. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemResponse.getFromItemId());
  909. PurchaseItem purchaseItem = new PurchaseItem();
  910. purchaseItem.setItemId(inboundItemResponse.getFromItemId());
  911. purchaseItem.setIntoingQty(inboundItemResponse.getIntoingQty().negate());
  912. purchaseItem.setIntoingAmt(inboundItemResponse.getIntoingAmt().negate());
  913. //入库状态
  914. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  915. purchaseItemResponse.getIntoQty(), purchaseItemResponse.getItemQty());
  916. purchaseItem.setIntoStatus(intoStatus);
  917. int countRow = purchaseItemMapper.updateById(purchaseItem);
  918. //数量超出
  919. if (countRow == 0) {
  920. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  921. }
  922. }
  923. //endregion
  924. }
  925. //endregion
  926. //region 修改入库总单
  927. Inbound inbound = new Inbound();
  928. inbound.setIntoId(inboundResponse.getIntoId());
  929. inbound.setIntoingQty(BigDecimal.ZERO);
  930. inbound.setIntoAmt(BigDecimal.ZERO);
  931. inbound.setFlgValid(false);
  932. //修改
  933. inboundMapper.update(inbound,
  934. new UpdateWrapper<Inbound>().lambda().eq(Inbound::getIntoId, UUID.fromString(inbound.getIntoId()))
  935. );
  936. //endregion
  937. //region 修改采购总单
  938. this.updateOrderMessageByRepeal(inboundResponse, inboundItemResponseList);
  939. //endregion
  940. }
  941. //endregion
  942. return ResponseResultUtil.success();
  943. }
  944. /**
  945. * @desc : 采购入库作废修改采购订单信息
  946. * @date : 2024/7/6 15:27
  947. * @author : 寇珊珊
  948. */
  949. @Transactional(rollbackFor = {Exception.class})
  950. public void updateOrderMessageByRepeal(InboundResponse inboundResponse, List<InboundItemResponse> itemList) {
  951. //出库明细汇总
  952. Map<String, List<InboundItemResponse>> purchaseIntoItemListMap = itemList.stream().collect(Collectors.groupingBy(InboundItemResponse::getFromId));
  953. //出库明细汇总循环
  954. for (String fromId : purchaseIntoItemListMap.keySet()) {
  955. //region 提取新建分组后的明细
  956. //分组后的明细 原入库数量和金额总和
  957. List<InboundItemResponse> purchaseIntoItemListGroup = purchaseIntoItemListMap.get(fromId);
  958. BigDecimal updatePurchaseIntoQty = BigDecimal.ZERO;
  959. BigDecimal updatePurchaseIntoAmt = BigDecimal.ZERO;
  960. BigDecimal updatePurchaseIntoingQty = BigDecimal.ZERO;
  961. BigDecimal updatePurchaseIntoingAmt = BigDecimal.ZERO;
  962. //已入库
  963. if (Constant.IntoStatus.YIRUKU.getName().equals(inboundResponse.getIntoStatus())) {
  964. updatePurchaseIntoQty = purchaseIntoItemListGroup.stream().map(InboundItemResponse::getIntoQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  965. updatePurchaseIntoAmt = purchaseIntoItemListGroup.stream().map(InboundItemResponse::getOutQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  966. }
  967. //入库中
  968. else {
  969. updatePurchaseIntoingQty = purchaseIntoItemListGroup.stream().map(InboundItemResponse::getIntoingQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  970. updatePurchaseIntoingAmt = purchaseIntoItemListGroup.stream().map(InboundItemResponse::getIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  971. }
  972. //endregion
  973. //region 反写订单数据
  974. //根据id查询
  975. PurchaseResponse purchaseResponse = purchaseMapper.selectById(fromId);
  976. Purchase purchase = new Purchase();
  977. purchase.setPurId(fromId);
  978. //已入库
  979. if (Constant.IntoStatus.YIRUKU.getName().equals(purchaseResponse.getIntoStatus())) {
  980. purchase.setIntoQty(updatePurchaseIntoQty.negate());
  981. purchase.setIntoAmt(updatePurchaseIntoAmt.negate());
  982. //入库转态
  983. String intoStatus = this.setIntoStatus(purchaseResponse.getIntoingQty(),
  984. purchaseResponse.getIntoQty().add(purchase.getIntoQty()), purchaseResponse.getSumQuantity());
  985. purchase.setIntoStatus(intoStatus);
  986. }
  987. //入库中
  988. else if (Constant.IntoStatus.RUKUZHONG.getName().equals(purchaseResponse.getIntoStatus())) {
  989. purchase.setIntoingQty(updatePurchaseIntoingQty.negate());
  990. purchase.setIntoingAmt(updatePurchaseIntoingAmt.negate());
  991. //入库状态
  992. String intoStatus = this.setIntoStatus(purchaseResponse.getIntoingQty().add(purchase.getIntoingQty()),
  993. purchaseResponse.getIntoQty(), purchaseResponse.getSumQuantity());
  994. purchase.setIntoStatus(intoStatus);
  995. }
  996. //修改
  997. int countRow = purchaseMapper.updateById(purchase);
  998. //数量超出
  999. if (countRow == 0) {
  1000. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  1001. }
  1002. //endregion
  1003. }
  1004. }
  1005. /**
  1006. * @desc : 采购入库办理
  1007. * @date : 2024/3/7 15:47
  1008. * @author : 寇珊珊
  1009. */
  1010. @Transactional(rollbackFor = {Exception.class})
  1011. public ResponseResultVO<?> purchaseHandleInbound(InboundVO inboundVO) {
  1012. //region 根据id查询 此条入库单的数据还未更改前的数据
  1013. InboundResponse inboundResponse = inboundMapper.selectById(inboundVO.getIntoId());
  1014. //endregion
  1015. //region 退账
  1016. if (inboundResponse.getReceivableId() != null) {
  1017. accountService.reversePayable(inboundResponse.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  1018. }
  1019. //endregion
  1020. //region 编辑明细
  1021. //校验明细
  1022. if (inboundVO.getItemList().size() == 0) {
  1023. throw new BaseBusinessException(ErrorCodeEnum.INBOUND_ITEM_NOT_EXIST.getCode(),
  1024. ErrorCodeEnum.INBOUND_ITEM_NOT_EXIST.getMessage());
  1025. }
  1026. for (InboundItemVO inboundItemVO : inboundVO.getItemList()) {
  1027. //region 编辑明细
  1028. if (inboundItemVO.getItemId() != null) {
  1029. //入库明细根据id查询
  1030. InboundItemResponse inboundItemResponse = inboundItemMapper.selectById(inboundItemVO.getItemId());
  1031. //region 校验数量是否超出
  1032. if (inboundItemVO.getIntoingQty().compareTo(inboundItemResponse.getIntoingQty()) > 0) {
  1033. throw new BaseBusinessException(ErrorCodeEnum.CANNOT_EXCEED_THE_QUANTITY_IN_THE_OUTBOUND_SHIPMENT.getCode(),
  1034. ErrorCodeEnum.CANNOT_EXCEED_THE_QUANTITY_IN_THE_OUTBOUND_SHIPMENT.getMessage());
  1035. }
  1036. //endregion
  1037. //region 反写订单总单 数据需要 把查出来的出库中数量用别的变量存起来
  1038. inboundItemVO.setUpdatePurchaseIntoingQty(inboundItemResponse.getIntoingQty());
  1039. inboundItemVO.setUpdatePurchaseIntoingAmt(inboundItemResponse.getIntoingAmt());
  1040. //endregion
  1041. inboundItemVO
  1042. .setIntoQty(inboundItemResponse.getIntoQty().add(inboundItemVO.getIntoingQty()))
  1043. .setIntoAmt(inboundItemResponse.getIntoAmt().add(inboundItemVO.getIntoingAmt()))
  1044. .setIntoingQty(BigDecimal.ZERO)
  1045. .setIntoingAmt(BigDecimal.ZERO)
  1046. ;
  1047. //入库状态
  1048. String intoStatus = this.setIntoStatus(inboundItemVO.getIntoingQty(), inboundItemVO.getIntoQty());
  1049. inboundItemVO.setIntoStatus(intoStatus);
  1050. //实体转换
  1051. InboundItem inboundItem = inboundItemConvert.convertToPo(inboundItemVO);
  1052. //修改
  1053. inboundItemMapper.update(inboundItem,
  1054. new UpdateWrapper<InboundItem>().lambda()
  1055. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  1056. );
  1057. //region 将库存需要的参数赋值
  1058. inboundItemVO.setInventoryType(Constant.InventoryType.INBOUND.getName());
  1059. inboundItemVO.setInventoryDocCode(Constant.InventoryDocCode.PURCHASE_ORDER.getValue());
  1060. //编辑之前的数
  1061. if (inboundItemResponse.getIntoQty().compareTo(BigDecimal.ZERO) > 0) {
  1062. inboundItemVO.setQtyBeforeUpdate(inboundItemResponse.getIntoQty());
  1063. inboundItemVO.setAmtBeforeUpdate(inboundItemResponse.getIntoAmt());
  1064. }
  1065. inboundItemVO.setAddOrEditFlag(true);
  1066. //endregion
  1067. }
  1068. //endregion
  1069. //region 新建明细
  1070. else {
  1071. inboundItemVO
  1072. .setIntoQty(inboundItemVO.getIntoingQty())
  1073. .setIntoAmt(inboundItemVO.getIntoingAmt())
  1074. .setIntoId(inboundVO.getIntoId())
  1075. .setIntoType(Constant.IntoType.SALE.getName())
  1076. .setIntoingQty(BigDecimal.ZERO)
  1077. .setIntoingAmt(BigDecimal.ZERO)
  1078. ;
  1079. //入库状态
  1080. String intoStatus = this.setIntoStatus(inboundItemVO.getIntoingQty(), inboundItemVO.getIntoQty());
  1081. inboundItemVO.setIntoStatus(intoStatus);
  1082. //实体转换
  1083. InboundItem inboundItem = inboundItemConvert.convertToPo(inboundItemVO);
  1084. //新建
  1085. inboundItemMapper.insert(inboundItem);
  1086. inboundItemVO.setItemId(inboundItem.getItemId());
  1087. //region 将库存需要的参数赋值
  1088. inboundItemVO.setInventoryType(Constant.InventoryType.INBOUND.getName());
  1089. inboundItemVO.setInventoryDocCode(Constant.InventoryDocCode.PURCHASE_ORDER.getValue());
  1090. inboundItemVO.setAddOrEditFlag(true);
  1091. //endregion
  1092. }
  1093. //endregion
  1094. //region 采购明细
  1095. if (inboundItemVO.getFromItemId() != null) {
  1096. //根据id查询
  1097. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemVO.getFromItemId());
  1098. //赋值(这里重写了更新方法,数量在更新方法中有数据库院士数量+本次数量)
  1099. PurchaseItem purchaseItem = new PurchaseItem();
  1100. purchaseItem.setItemId(inboundItemVO.getFromItemId());
  1101. purchaseItem.setIntoingQty(inboundItemVO.getIntoQty().negate());
  1102. purchaseItem.setIntoingAmt(inboundItemVO.getIntoAmt().negate());
  1103. purchaseItem.setIntoQty(inboundItemVO.getIntoQty());
  1104. purchaseItem.setIntoAmt(inboundItemVO.getIntoAmt());
  1105. //入库状态
  1106. String purItemIntoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  1107. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  1108. purchaseItem.setIntoStatus(purItemIntoStatus);
  1109. int countRow = purchaseItemMapper.updateById(purchaseItem);
  1110. //数量超出
  1111. if (countRow == 0) {
  1112. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  1113. }
  1114. }
  1115. //endregion
  1116. }
  1117. //endregion
  1118. //region 删除明细
  1119. BigDecimal delIntoingQty = BigDecimal.ZERO;
  1120. BigDecimal delIntoingAmt = BigDecimal.ZERO;
  1121. BigDecimal delIntoQty = BigDecimal.ZERO;
  1122. BigDecimal delIntoAmt = BigDecimal.ZERO;
  1123. if (inboundVO.getDeleteItemList() != null && inboundVO.getDeleteItemList().size() > 0) {
  1124. delIntoingQty = inboundVO.getDeleteItemList().stream().map(InboundItemVO::getIntoingQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  1125. delIntoingAmt = inboundVO.getDeleteItemList().stream().map(InboundItemVO::getIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  1126. delIntoQty = inboundVO.getDeleteItemList().stream().map(InboundItemVO::getIntoQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  1127. delIntoAmt = inboundVO.getDeleteItemList().stream().map(InboundItemVO::getIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  1128. for (InboundItemVO inboundItemVO : inboundVO.getDeleteItemList()) {
  1129. if (inboundItemVO.getItemId() != null) {
  1130. //region 将库存需要的参数赋值
  1131. inboundItemVO.setInventoryType(Constant.InventoryType.INBOUND.getName());
  1132. inboundItemVO.setInventoryDocCode(Constant.InventoryDocCode.PURCHASE_ORDER.getValue());
  1133. //endregion
  1134. InboundItem inboundItem = inboundItemConvert.convertToPo(inboundItemVO);
  1135. inboundItem.setFlgValid(false);
  1136. //修改
  1137. inboundItemMapper.update(inboundItem,
  1138. new UpdateWrapper<InboundItem>().lambda()
  1139. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  1140. );
  1141. }
  1142. //region 采购
  1143. if (inboundItemVO.getFromItemId() != null) {
  1144. //region 采购订单明细
  1145. //赋值(这里重写了更新方法,数量在更新方法中有数据库院士数量+本次数量)
  1146. PurchaseItem purchaseItem = new PurchaseItem();
  1147. purchaseItem.setItemId(inboundItemVO.getFromItemId());
  1148. purchaseItem.setIntoingQty(inboundItemVO.getIntoingQty().negate());
  1149. purchaseItem.setIntoingAmt(inboundItemVO.getIntoingAmt().negate());
  1150. purchaseItem.setIntoQty(inboundItemVO.getIntoQty().negate());
  1151. purchaseItem.setIntoAmt(inboundItemVO.getIntoAmt().negate());
  1152. //根据id查询
  1153. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemVO.getFromItemId());
  1154. //入库状态
  1155. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  1156. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  1157. purchaseItem.setIntoStatus(intoStatus);
  1158. int countRow = purchaseItemMapper.updateById(purchaseItem);
  1159. //数量超出
  1160. if (countRow == 0) {
  1161. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  1162. }
  1163. //endregion
  1164. }
  1165. //endregion
  1166. }
  1167. }
  1168. //endregion
  1169. //region 编辑总单
  1170. BigDecimal sumIntoQty = inboundVO.getItemList().stream().map(InboundItemVO::getIntoQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  1171. BigDecimal sumIntoAmt = inboundVO.getItemList().stream().map(InboundItemVO::getIntoAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  1172. inboundVO.setIntoQty(sumIntoQty);
  1173. inboundVO.setIntoAmt(sumIntoAmt);
  1174. inboundVO.setIntoingQty(BigDecimal.ZERO);
  1175. inboundVO.setIntoingAmt(BigDecimal.ZERO);
  1176. //入库状态
  1177. String intoStatus = this.setIntoStatus(inboundVO.getIntoingQty(), inboundVO.getIntoQty());
  1178. inboundVO.setIntoStatus(intoStatus);
  1179. //实体转换
  1180. Inbound inbound = inboundConvert.convertToPo(inboundVO);
  1181. //修改
  1182. inboundMapper.update(inbound,
  1183. new UpdateWrapper<Inbound>().lambda().eq(Inbound::getIntoId, UUID.fromString(inbound.getIntoId()))
  1184. );
  1185. //endregion
  1186. //region 修改采购订单
  1187. this.updateOrderMessageByHandle(inboundVO.getItemList(),inboundVO.getDeleteItemList());
  1188. //endregion
  1189. //region 入账
  1190. accountService.accPayable(inboundVO.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  1191. //endregion
  1192. //region 调用库存
  1193. Map<String, Object> map = new HashMap<>();
  1194. map.put("intoDetail", inboundVO.getItemList());
  1195. map.put("delIntoDetail", inboundVO.getDeleteItemList());
  1196. inventoryService.operatingInventoryInformation(map);
  1197. //endregion
  1198. return ResponseResultUtil.success(inboundVO);
  1199. }
  1200. /**
  1201. * @desc : 采购入库办理修改采购订单信息
  1202. * @date : 2024/7/8 14:03
  1203. * @author : 寇珊珊
  1204. */
  1205. @Transactional(rollbackFor = {Exception.class})
  1206. public void updateOrderMessageByHandle(List<InboundItemVO> itemList, List<InboundItemVO> deleteItemList) {
  1207. //出库明细汇总
  1208. Map<String, List<InboundItemVO>> purchaseIntoItemVOListMap = itemList.stream().collect(Collectors.groupingBy(InboundItemVO::getFromId));
  1209. //出库明细删除汇总
  1210. Map<String, List<InboundItemVO>> delPurchaseIntoItemVOListMap = deleteItemList.stream().collect(Collectors.groupingBy(InboundItemVO::getFromId));
  1211. //出库明细汇总循环g
  1212. for (String fromId : purchaseIntoItemVOListMap.keySet()) {
  1213. //有需要删除的办理数据
  1214. if (delPurchaseIntoItemVOListMap != null && delPurchaseIntoItemVOListMap.keySet().size() > 0) {
  1215. //入库明细删除汇总循环
  1216. for (String delFromId : delPurchaseIntoItemVOListMap.keySet()) {
  1217. //新建入库明细来源Id = 删除入库明细来源Id
  1218. if (fromId.equals(delFromId)) {
  1219. //region 提取新建分组后的明细
  1220. List<InboundItemVO> purchaseIntoItemVOListGroup = purchaseIntoItemVOListMap.get(fromId);
  1221. //分组后的明细 入库数量和金额总和
  1222. BigDecimal purchaseSumQty = purchaseIntoItemVOListGroup.stream().map(InboundItemVO::getIntoQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  1223. BigDecimal purchaseSumAmt = purchaseIntoItemVOListGroup.stream().map(InboundItemVO::getIntoAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  1224. //分组后的明细 原入库数量和金额总和
  1225. BigDecimal updatePurchaseIntoingQty = purchaseIntoItemVOListGroup.stream().filter(it->it.getUpdatePurchaseIntoingQty()!=null).map(InboundItemVO::getUpdatePurchaseIntoingQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  1226. BigDecimal updatePurchaseIntoingAmt = purchaseIntoItemVOListGroup.stream().filter(it->it.getUpdatePurchaseIntoingAmt()!=null).map(InboundItemVO::getUpdatePurchaseIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  1227. //endregion
  1228. //region 提取删除分组后的明细
  1229. List<InboundItemVO> delPurchaseIntoItemVOListGroup = delPurchaseIntoItemVOListMap.get(delFromId);
  1230. BigDecimal purchaseDelIntoingQty = delPurchaseIntoItemVOListGroup.stream().map(InboundItemVO::getIntoingQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  1231. BigDecimal purchaseDelIntoingAmt = delPurchaseIntoItemVOListGroup.stream().map(InboundItemVO::getIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  1232. BigDecimal purchaseDelIntoQty = delPurchaseIntoItemVOListGroup.stream().map(InboundItemVO::getIntoQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  1233. BigDecimal purchaseDelIntoAmt = delPurchaseIntoItemVOListGroup.stream().map(InboundItemVO::getIntoAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  1234. //endregion
  1235. //region 反写订单数据
  1236. //根据id查询
  1237. PurchaseResponse purchaseResponse = purchaseMapper.selectById(fromId);
  1238. Purchase purchase = new Purchase();
  1239. purchase.setPurId(fromId);
  1240. purchase.setIntoQty(purchaseSumQty.subtract(purchaseDelIntoQty));
  1241. purchase.setIntoAmt(purchaseSumAmt.subtract(purchaseDelIntoAmt));
  1242. purchase.setIntoingQty((updatePurchaseIntoingQty.add(purchaseDelIntoingQty)).negate());
  1243. purchase.setIntoingAmt((updatePurchaseIntoingAmt.add(purchaseDelIntoingAmt)).negate());
  1244. //入库状态
  1245. String purIntoStatus = this.setIntoStatus(purchaseResponse.getIntoingQty().add(purchase.getIntoingQty()),
  1246. purchaseResponse.getIntoQty().add(purchase.getIntoQty()), purchaseResponse.getSumQuantity());
  1247. purchase.setIntoStatus(purIntoStatus);
  1248. //修改
  1249. int countRow = purchaseMapper.updateById(purchase);
  1250. //数量超出
  1251. if (countRow == 0) {
  1252. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  1253. }
  1254. //endregion
  1255. }
  1256. }
  1257. }
  1258. //没有需要删除的办理数据
  1259. else {
  1260. //region 提取新建分组后的明细
  1261. List<InboundItemVO> purchaseIntoItemVOListGroup = purchaseIntoItemVOListMap.get(fromId);
  1262. //分组后的明细 入库数量和金额总和
  1263. BigDecimal purchaseSumQty = purchaseIntoItemVOListGroup.stream().map(InboundItemVO::getIntoQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  1264. BigDecimal purchaseSumAmt = purchaseIntoItemVOListGroup.stream().map(InboundItemVO::getIntoAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  1265. //分组后的明细 原入库数量和金额总和
  1266. BigDecimal updatePurchaseIntoingQty = purchaseIntoItemVOListGroup.stream().filter(it->it.getUpdatePurchaseIntoingQty()!=null).map(InboundItemVO::getUpdatePurchaseIntoingQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  1267. BigDecimal updatePurchaseIntoingAmt = purchaseIntoItemVOListGroup.stream().filter(it->it.getUpdatePurchaseIntoingAmt()!=null).map(InboundItemVO::getUpdatePurchaseIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  1268. //endregion
  1269. //region 反写订单数据
  1270. //根据id查询
  1271. PurchaseResponse purchaseResponse = purchaseMapper.selectById(fromId);
  1272. Purchase purchase = new Purchase();
  1273. purchase.setPurId(fromId);
  1274. purchase.setIntoQty(purchaseSumQty);
  1275. purchase.setIntoAmt(purchaseSumAmt);
  1276. purchase.setIntoingAmt(updatePurchaseIntoingQty.negate());
  1277. purchase.setIntoingQty(updatePurchaseIntoingAmt.negate());
  1278. //入库状态
  1279. String purIntoStatus = this.setIntoStatus(purchaseResponse.getIntoingQty().add(purchase.getIntoingQty()),
  1280. purchaseResponse.getIntoQty().add(purchase.getIntoQty()), purchaseResponse.getSumQuantity());
  1281. purchase.setIntoStatus(purIntoStatus);
  1282. //修改
  1283. int countRow = purchaseMapper.updateById(purchase);
  1284. //数量超出
  1285. if (countRow == 0) {
  1286. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  1287. }
  1288. //endregion
  1289. }
  1290. }
  1291. }
  1292. /**
  1293. * @desc : 采购入库撤销
  1294. * @date : 2024/3/7 17:06
  1295. * @author : 寇珊珊
  1296. */
  1297. @Transactional(rollbackFor = {Exception.class})
  1298. public ResponseResultVO<?> purchaseInboundCancel(InboundVO inboundVO) {
  1299. //region 查询入库总单数据信息
  1300. InboundResponse inboundResponse = inboundMapper.selectById(inboundVO.getIntoId());
  1301. //endregion
  1302. //region 根据总单id查明细
  1303. List<InboundItemResponse> inboundItemResponseList = inboundItemMapper.selectByCond(new InboundItemQuery().setIntoId(inboundResponse.getIntoId()));
  1304. //endregion
  1305. //region 退账
  1306. if (inboundResponse.getReceivableId() != null) {
  1307. accountService.reversePayable(inboundVO.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  1308. }
  1309. //endregion
  1310. //region 修改订单数据信息
  1311. this.updateOrderMessageByCancel(inboundItemResponseList);
  1312. //endregion
  1313. //region 修改总单数据信息
  1314. Inbound inbound = new Inbound();
  1315. inbound.setIntoId(inboundVO.getIntoId());
  1316. inbound.setIntoDate(null);
  1317. inbound.setIntoStatus(Constant.IntoStatus.RUKUZHONG.getName());
  1318. inbound.setIntoingQty(inboundResponse.getIntoingQty().add(inboundResponse.getIntoQty()));
  1319. inbound.setIntoingAmt(inboundResponse.getIntoingAmt().add(inboundResponse.getIntoAmt()));
  1320. inbound.setIntoQty(BigDecimal.ZERO);
  1321. inbound.setIntoAmt(BigDecimal.ZERO);
  1322. //修改
  1323. inboundMapper.update(inbound,
  1324. new UpdateWrapper<Inbound>().lambda()
  1325. .eq(Inbound::getIntoId, UUID.fromString(inbound.getIntoId()))
  1326. );
  1327. //endregion
  1328. //region 明细数据
  1329. for (InboundItemResponse inboundItemResponse : inboundItemResponseList) {
  1330. //region 修改采购明细数据信息
  1331. if (inboundItemResponse.getFromItemId() != null) {
  1332. //根据id查询
  1333. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemResponse.getFromItemId());
  1334. //赋值 (这里重写了更新方法,数量在更新方法中有数据库院士数量+本次数量)
  1335. PurchaseItem purchaseItem = new PurchaseItem();
  1336. purchaseItem.setItemId(inboundItemResponse.getFromItemId());
  1337. purchaseItem.setIntoQty(inboundItemResponse.getIntoQty().negate());
  1338. purchaseItem.setIntoAmt(inboundItemResponse.getIntoAmt().negate());
  1339. purchaseItem.setIntoingQty(inboundItemResponse.getIntoQty());
  1340. purchaseItem.setIntoingAmt(inboundItemResponse.getIntoAmt());
  1341. //入库状态
  1342. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  1343. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  1344. purchaseItem.setIntoStatus(intoStatus);
  1345. //修改
  1346. int countRow = purchaseItemMapper.updateById(purchaseItem);
  1347. //数量超出
  1348. if (countRow == 0) {
  1349. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  1350. }
  1351. }
  1352. //endregion
  1353. //region修改入库明细信息
  1354. InboundItem inboundItem = new InboundItem();
  1355. //region 将库存需要的参数赋值
  1356. inboundItemResponse.setInventoryType(Constant.InventoryType.INBOUND.getName());
  1357. inboundItemResponse.setInventoryDocCode(Constant.InventoryDocCode.PURCHASE_ORDER.getValue());
  1358. inboundItemResponse.setIntoQty(inboundItemResponse.getIntoQty().negate());
  1359. inboundItemResponse.setIntoAmt(inboundItemResponse.getIntoAmt().negate());
  1360. //endregion
  1361. inboundItem
  1362. .setIntoId(inbound.getIntoId())
  1363. .setIntoStatus(Constant.IntoStatus.RUKUZHONG.getName())
  1364. .setIntoingQty(inboundItemResponse.getIntoingQty().add(inboundItemResponse.getIntoQty()))
  1365. .setIntoingAmt(inboundItemResponse.getIntoingAmt().add(inboundItemResponse.getIntoAmt()))
  1366. .setIntoQty(BigDecimal.ZERO)
  1367. .setIntoAmt(BigDecimal.ZERO)
  1368. .setCostPrice(BigDecimal.ZERO)
  1369. .setCostAmt(BigDecimal.ZERO)
  1370. .setItemId(inboundItemResponse.getItemId());
  1371. //入库状态
  1372. String intoStatus = this.setIntoStatus(inboundItem.getIntoingQty(), inboundItem.getIntoQty());
  1373. inboundItem.setIntoStatus(intoStatus);
  1374. //修改
  1375. inboundItemMapper.update(inboundItem,
  1376. new UpdateWrapper<InboundItem>().lambda()
  1377. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  1378. );
  1379. //endregion
  1380. }
  1381. //endregion
  1382. //region 调用库存
  1383. Map<String, Object> map = new HashMap<>();
  1384. map.put("delIntoDetail", inboundItemResponseList);
  1385. inventoryService.operatingInventoryInformation(map);
  1386. //endregion
  1387. return ResponseResultUtil.success();
  1388. }
  1389. /**
  1390. * @desc : 采购入库撤销修改采购订单信息
  1391. * @date : 2024/7/8 16:50
  1392. * @author : 寇珊珊
  1393. */
  1394. @Transactional(rollbackFor = {Exception.class})
  1395. public void updateOrderMessageByCancel(List<InboundItemResponse> itemList) {
  1396. //出库明细汇总
  1397. Map<String, List<InboundItemResponse>> purchaseIntoItemListMap = itemList.stream().collect(Collectors.groupingBy(InboundItemResponse::getFromId));
  1398. //出库明细汇总循环
  1399. for (String fromId : purchaseIntoItemListMap.keySet()) {
  1400. //region 提取新建分组后的明细
  1401. List<InboundItemResponse> purchaseIntoItemListGroup = purchaseIntoItemListMap.get(fromId);
  1402. //分组后的明细 入库数量和金额总和
  1403. BigDecimal purchaseSumQty = purchaseIntoItemListGroup.stream().map(InboundItemResponse::getIntoQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  1404. BigDecimal purchaseSumAmt = purchaseIntoItemListGroup.stream().map(InboundItemResponse::getIntoAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  1405. //endregion
  1406. //region 反写订单数据
  1407. //根据id查询
  1408. //根据id查询
  1409. PurchaseResponse purchaseResponse = purchaseMapper.selectById(fromId);
  1410. Purchase purchase = new Purchase();
  1411. purchase.setPurId(fromId);
  1412. purchase.setIntoingQty(purchaseSumQty);
  1413. purchase.setIntoingAmt(purchaseSumAmt);
  1414. purchase.setIntoQty(purchaseSumQty.negate());
  1415. purchase.setIntoAmt(purchaseSumAmt.negate());
  1416. //入库状态
  1417. String intoStatus = this.setIntoStatus(purchaseResponse.getIntoingQty().add(purchase.getIntoingQty()),
  1418. purchaseResponse.getIntoQty().add(purchase.getIntoQty()), purchaseResponse.getSumQuantity());
  1419. purchase.setIntoStatus(intoStatus);
  1420. int countRow = purchaseMapper.updateById(purchase);
  1421. //数量超出
  1422. if (countRow == 0) {
  1423. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  1424. }
  1425. //endregion
  1426. }
  1427. }
  1428. /**
  1429. * @desc : 校验库存是否存在和库存量是否足够本次退货作废
  1430. * @date : 2024/7/6 10:52
  1431. * @author : 寇珊珊
  1432. */
  1433. @Transactional(
  1434. rollbackFor = {Exception.class}
  1435. )
  1436. public void checkInventoryExist(List<InboundItemResponse> inboundItemResponseList) {
  1437. for (InboundItemResponse inboundItemResponse : inboundItemResponseList) {
  1438. //存在标识
  1439. //根据sku,仓库,非标号查询
  1440. InventoryResponse inventoryResponse = null;
  1441. if (inboundItemResponse.getSkuId() != null) {
  1442. inventoryResponse = inventoryMapper.selectByOther(new InventoryQuery()
  1443. .setSkuId(inboundItemResponse.getSkuId())
  1444. .setWhId(inboundItemResponse.getWhId())
  1445. .setNonStdCode(inboundItemResponse.getNonStdCode()));
  1446. }
  1447. //库存不存在
  1448. if (inventoryResponse == null) {
  1449. //当前出库商品中在库存中不存在
  1450. throw new BaseBusinessException(ErrorCodeEnum.SKU_IS_NOT_IN_INVENTORY.getCode(),
  1451. ErrorCodeEnum.SKU_IS_NOT_IN_INVENTORY.getMessage());
  1452. }
  1453. //判断库存中的数量是否足够本次采购退货作废(采购退货作废等于出库)
  1454. if (inventoryResponse.getInvQty().compareTo(inboundItemResponse.getIntoQty()) < 0) {
  1455. //当前库存数量不足,不允许采购退货作废操作
  1456. throw new BaseBusinessException(ErrorCodeEnum.INSUFFICIENT_INVENTORY_NOT_ALLOW_PURCHASE_RETURN.getCode(),
  1457. ErrorCodeEnum.INSUFFICIENT_INVENTORY_NOT_ALLOW_PURCHASE_RETURN.getMessage());
  1458. }
  1459. }
  1460. }
  1461. /**
  1462. * @desc : 一键作废
  1463. * @date : 2024/7/6 11:03
  1464. * @author : 寇珊珊
  1465. */
  1466. @Transactional(rollbackFor = {Exception.class})
  1467. public ResponseResultVO<?> oneKeyPurchaseInboundRepeal(String orderId) {
  1468. List<InboundItemResponse> InboundItemResponses = inboundItemMapper.selectByCond(new InboundItemQuery().setSPurId(orderId));
  1469. if (InboundItemResponses != null && InboundItemResponses.size() > 0) {
  1470. Map<String, List<InboundItemResponse>> inboundItemMap = InboundItemResponses.stream().collect(Collectors.groupingBy(InboundItemResponse::getIntoId));
  1471. for (String str : inboundItemMap.keySet()) {
  1472. //region 查询总单 查询明细
  1473. //根据id查询 此条入库单的数据还未更改前的数据
  1474. InboundResponse inboundResponse = inboundMapper.selectById(str);
  1475. //根据总单id查询
  1476. List<InboundItemResponse> inboundItemResponseList = inboundItemMapper.selectByCond(new InboundItemQuery().setOutId(inboundResponse.getIntoId()));
  1477. //endregion
  1478. //region 已入库状态作废
  1479. if (Constant.IntoStatus.YIRUKU.getName().equals(inboundResponse.getIntoStatus())) {
  1480. //region 查询当前订单下的入库单的库存是否足够允许作废
  1481. this.checkInventoryExist(inboundItemResponseList);
  1482. //endregion
  1483. //region 退账
  1484. if (inboundResponse.getReceivableId() != null) {
  1485. accountService.reversePayable(inboundResponse.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  1486. }
  1487. //endregion
  1488. //region 修改明细
  1489. for (InboundItemResponse inboundItemResponse : inboundItemResponseList) {
  1490. //region 将库存需要的参数赋值
  1491. inboundItemResponse.setInventoryType(Constant.InventoryType.INBOUND.getName());
  1492. inboundItemResponse.setInventoryDocCode(Constant.InventoryDocCode.PURCHASE_ORDER.getValue());
  1493. inboundItemResponse.setIntoQty(inboundItemResponse.getIntoQty().negate());
  1494. inboundItemResponse.setIntoAmt(inboundItemResponse.getIntoAmt().negate());
  1495. //endregion
  1496. //region 编辑明细 赋值 赋值明细 防止作废的单据查不到明细 故注掉下面代码
  1497. // InboundItem inboundItem = new InboundItem();
  1498. // inboundItem.setItemId(inboundItemResponse.getItemId());
  1499. // inboundItem.setFlgValid(false);
  1500. // //修改
  1501. // inboundItemMapper.update(inboundItem,
  1502. // new UpdateWrapper<InboundItem>().lambda()
  1503. // .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  1504. // );
  1505. //endregion
  1506. //region 销售明细
  1507. if (inboundItemResponse.getFromItemId() != null) {
  1508. //根据id查询
  1509. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemResponse.getFromItemId());
  1510. PurchaseItem purchaseItem = new PurchaseItem();
  1511. purchaseItem.setItemId(inboundItemResponse.getFromItemId());
  1512. purchaseItem.setIntoQty(inboundItemResponse.getIntoQty().negate());
  1513. purchaseItem.setIntoAmt(inboundItemResponse.getIntoAmt().negate());
  1514. //入库状态
  1515. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty(),
  1516. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  1517. purchaseItem.setIntoStatus(intoStatus);
  1518. int countRow = purchaseItemMapper.updateById(purchaseItem);
  1519. //数量超出
  1520. if (countRow == 0) {
  1521. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  1522. }
  1523. }
  1524. //endregion
  1525. }
  1526. //endregion
  1527. //region 修改入库总单
  1528. Inbound inbound = new Inbound();
  1529. inbound.setIntoId(inboundResponse.getIntoId());
  1530. inbound.setFlgValid(false);
  1531. //修改
  1532. inboundMapper.update(inbound,
  1533. new UpdateWrapper<Inbound>().lambda().eq(Inbound::getIntoId, UUID.fromString(inbound.getIntoId()))
  1534. );
  1535. //endregion
  1536. //region 修改采购总单
  1537. this.updateOrderMessageByRepeal(inboundResponse, inboundItemResponseList);
  1538. //endregion
  1539. //region 入账
  1540. if (inboundResponse.getReceivableId() != null) {
  1541. accountService.accPayable(inboundResponse.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  1542. }
  1543. //endregion
  1544. //region 调用库存
  1545. Map<String, Object> map = new HashMap<>();
  1546. map.put("delIntoDetail", inboundItemResponseList);
  1547. inventoryService.operatingInventoryInformation(map);
  1548. //endregion
  1549. }
  1550. //endregion
  1551. //region 出库中、待出库状态作废
  1552. if (Constant.IntoStatus.DAIRUKU.getName().equals(inboundResponse.getIntoStatus()) ||
  1553. Constant.IntoStatus.RUKUZHONG.getName().equals(inboundResponse.getIntoStatus())) {
  1554. //region 修改明细
  1555. for (InboundItemResponse inboundItemResponse : inboundItemResponseList) {
  1556. //region 编辑明细 赋值
  1557. InboundItem inboundItem = new InboundItem();
  1558. inboundItem.setItemId(inboundItemResponse.getItemId());
  1559. inboundItem.setIntoingQty(BigDecimal.ZERO);
  1560. inboundItem.setIntoingAmt(BigDecimal.ZERO);
  1561. // inboundItem.setFlgValid(false);
  1562. //修改
  1563. inboundItemMapper.update(inboundItem,
  1564. new UpdateWrapper<InboundItem>().lambda()
  1565. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  1566. );
  1567. //endregion
  1568. //region 销售明细
  1569. if (inboundItemResponse.getFromItemId() != null) {
  1570. //根据id查询
  1571. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemResponse.getFromItemId());
  1572. PurchaseItem purchaseItem = new PurchaseItem();
  1573. purchaseItem.setItemId(inboundItemResponse.getFromItemId());
  1574. purchaseItem.setIntoingQty(inboundItemResponse.getIntoingQty().negate());
  1575. purchaseItem.setIntoingAmt(inboundItemResponse.getIntoingAmt().negate());
  1576. //入库状态
  1577. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  1578. purchaseItemResponse.getIntoQty(), purchaseItemResponse.getItemQty());
  1579. purchaseItem.setIntoStatus(intoStatus);
  1580. int countRow = purchaseItemMapper.updateById(purchaseItem);
  1581. //数量超出
  1582. if (countRow == 0) {
  1583. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  1584. }
  1585. }
  1586. //endregion
  1587. }
  1588. //endregion
  1589. //region 修改入库总单
  1590. Inbound inbound = new Inbound();
  1591. inbound.setIntoId(inboundResponse.getIntoId());
  1592. inbound.setIntoingQty(BigDecimal.ZERO);
  1593. inbound.setIntoAmt(BigDecimal.ZERO);
  1594. inbound.setFlgValid(false);
  1595. //修改
  1596. inboundMapper.update(inbound,
  1597. new UpdateWrapper<Inbound>().lambda().eq(Inbound::getIntoId, UUID.fromString(inbound.getIntoId()))
  1598. );
  1599. //endregion
  1600. //region 修改采购总单
  1601. this.updateOrderMessageByRepeal(inboundResponse, inboundItemResponseList);
  1602. //endregion
  1603. }
  1604. //endregion
  1605. }
  1606. }
  1607. return ResponseResultUtil.success();
  1608. }
  1609. /**
  1610. * @desc : 入库状态通用(目前本页面)
  1611. * @date : 2024/3/9 8:59
  1612. * @author : 寇珊珊
  1613. */
  1614. @Transactional(rollbackFor = {Exception.class})
  1615. public String setIntoStatus(BigDecimal intoingQty, BigDecimal intoQty) {
  1616. //入库状态
  1617. String intoStatus = null;
  1618. //已入库数量>0 入库中数量>0
  1619. if (intoQty.compareTo(BigDecimal.ZERO) >= 0 && intoingQty.compareTo(BigDecimal.ZERO) > 0) {
  1620. //入库中
  1621. intoStatus = Constant.IntoStatus.RUKUZHONG.getName();
  1622. }
  1623. //已入库数量=0 入库中数量=0
  1624. else if (intoQty.compareTo(BigDecimal.ZERO) == 0 && intoingQty.compareTo(BigDecimal.ZERO) == 0) {
  1625. //待入库
  1626. intoStatus = Constant.IntoStatus.DAIRUKU.getName();
  1627. }
  1628. //已入库数量>0 入库中数量=0
  1629. else if (intoQty.compareTo(BigDecimal.ZERO) > 0 && intoingQty.compareTo(BigDecimal.ZERO) == 0) {
  1630. //已入库
  1631. intoStatus = Constant.IntoStatus.YIRUKU.getName();
  1632. }
  1633. return intoStatus;
  1634. }
  1635. /**
  1636. * @desc : 上游单据入库状态通用(目前本页面)
  1637. * @date : 2024/4/1 17:14
  1638. * @author : 寇珊珊
  1639. */
  1640. @Transactional(rollbackFor = {Exception.class})
  1641. public String setIntoStatus(BigDecimal intoingQty, BigDecimal intoQty, BigDecimal sumQty) {
  1642. //入库状态
  1643. String intoStatus = null;
  1644. //入库中小于等于总数,已入库小于总数,并且入库中+已入库大于0
  1645. if (intoingQty.compareTo(sumQty) <= 0 && intoQty.compareTo(sumQty) < 0 && intoingQty.add(intoQty).compareTo(BigDecimal.ZERO) > 0) {
  1646. //入库中
  1647. intoStatus = Constant.IntoStatus.RUKUZHONG.getName();
  1648. }
  1649. //已入库数量=0 入库中数量=0
  1650. else if (intoQty.compareTo(BigDecimal.ZERO) == 0 && intoingQty.compareTo(BigDecimal.ZERO) == 0) {
  1651. //待入库
  1652. intoStatus = Constant.IntoStatus.DAIRUKU.getName();
  1653. }
  1654. //入库中+已入库 等于 总数 并且 入库中数量小于等于订单总数量
  1655. else if (intoingQty.compareTo(sumQty) < 0 && intoingQty.add(intoQty).compareTo(sumQty) == 0) {
  1656. //已入库
  1657. intoStatus = Constant.IntoStatus.YIRUKU.getName();
  1658. }
  1659. return intoStatus;
  1660. }
  1661. }