InboundPurchaseService.java 67 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301
  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", Constant.SystemConstant.IVT_001.getValue());
  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. inboundItemVO.setAddOrEditFlag(true);
  195. //endregion
  196. //总单id
  197. inboundItemVO.setIntoId(inboundVO.getIntoId());
  198. //入库类型
  199. inboundItemVO.setIntoType(inboundVO.getIntoType());
  200. //入库状态等于已入库 更新合计入库数量/金额 = 入库中数量/入库中金额
  201. if (Constant.IntoStatus.YIRUKU.getName().equals(inboundVO.getIntoStatus())) {
  202. inboundItemVO
  203. .setIntoQty(inboundItemVO.getIntoingQty())
  204. .setIntoAmt(inboundItemVO.getIntoingAmt())
  205. .setIntoingQty(BigDecimal.ZERO)
  206. .setIntoingAmt(BigDecimal.ZERO)
  207. .setCostPrice(inboundItemVO.getPriceInto())
  208. .setCostAmt(inboundItemVO.getIntoQty().multiply(inboundItemVO.getPriceInto()).setScale(2, BigDecimal.ROUND_HALF_UP))
  209. ;
  210. } else {
  211. inboundItemVO
  212. .setIntoQty(BigDecimal.ZERO)
  213. .setIntoAmt(BigDecimal.ZERO);
  214. }
  215. //入库状态
  216. inboundItemVO.setIntoStatus(inboundVO.getIntoStatus());
  217. //实体转换
  218. InboundItem inboundItem = inboundItemConvert.convertToPo(inboundItemVO);
  219. inboundItemMapper.insert(inboundItem);
  220. //endregion
  221. //region 采购明细
  222. if (inboundItemVO.getFromItemId() != null) {
  223. //赋值(这里重写了更新方法,数量在更新方法中有数据库院士数量+本次数量)
  224. PurchaseItem purchaseItem = new PurchaseItem();
  225. purchaseItem.setItemId(inboundItemVO.getFromItemId());
  226. //根据id查询
  227. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemVO.getFromItemId());
  228. //已入库
  229. if (Constant.IntoStatus.YIRUKU.getName().equals(inboundVO.getIntoStatus())) {
  230. purchaseItem.setIntoingQty(BigDecimal.ZERO);
  231. purchaseItem.setIntoingAmt(BigDecimal.ZERO);
  232. purchaseItem.setIntoQty(inboundItemVO.getIntoQty());
  233. purchaseItem.setIntoAmt(inboundItemVO.getIntoAmt());
  234. }
  235. //入库中
  236. else {
  237. purchaseItem.setIntoingQty(inboundItemVO.getIntoingQty());
  238. purchaseItem.setIntoingAmt(inboundItemVO.getIntoingAmt());
  239. purchaseItem.setIntoQty(BigDecimal.ZERO);
  240. purchaseItem.setIntoAmt(BigDecimal.ZERO);
  241. }
  242. //入库状态
  243. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  244. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  245. purchaseItem.setIntoStatus(intoStatus);
  246. int countRow = purchaseItemMapper.updateById(purchaseItem);
  247. //数量超出
  248. if (countRow == 0) {
  249. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  250. }
  251. }
  252. //endregion
  253. }
  254. //endregion
  255. //region 入账
  256. if (Constant.IntoStatus.YIRUKU.getName().equals(inboundVO.getIntoStatus())) {
  257. accountService.accPayable(inboundVO.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  258. }
  259. //endregion
  260. //region 库存
  261. if (Constant.IntoStatus.YIRUKU.getName().equals(inboundVO.getIntoStatus())) {
  262. Map<String, Object> invMap = new HashMap<>();
  263. invMap.put("intoDetail", inboundVO.getItemList());
  264. inventoryService.operatingInventoryInformation(map);
  265. }
  266. //endregion
  267. return ResponseResultUtil.success(inboundVO);
  268. }
  269. /**
  270. * @desc : 采购入库编辑
  271. * @date : 2024/3/25 16:25
  272. * @author : 寇珊珊
  273. */
  274. @Transactional(rollbackFor = {Exception.class})
  275. public ResponseResultVO<?> purchaseInboundUpdate(InboundVO inboundVO) {
  276. //region 小编辑
  277. if (!inboundVO.getLimitEdit()) {
  278. Inbound inbound = new Inbound();
  279. inbound.setIntoId(inboundVO.getIntoId());
  280. inbound.setRemarks(inboundVO.getRemarks());
  281. inbound.setAnnexPaths(inboundVO.getAnnexPaths());
  282. inboundMapper.update(inbound,
  283. new UpdateWrapper<Inbound>().lambda()
  284. .eq(Inbound::getIntoId, UUID.fromString(inbound.getIntoId()))
  285. );
  286. for (InboundItemVO inboundItemVO : inboundVO.getItemList()) {
  287. InboundItem inboundItem = new InboundItem();
  288. inboundItem.setItemId(inboundItemVO.getItemId());
  289. inboundItem.setRemarks(inboundItemVO.getRemarks());
  290. inboundItemMapper.update(inboundItem,
  291. new UpdateWrapper<InboundItem>().lambda()
  292. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  293. );
  294. }
  295. }
  296. //endregion
  297. //region 大编辑
  298. else {
  299. //region 根据id查询 此条入库单的数据还未更改前的数据
  300. InboundResponse inboundResponse = inboundMapper.selectById(inboundVO.getIntoId());
  301. BigDecimal sumQty = inboundVO.getItemList().stream().map(InboundItemVO::getIntoingQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  302. BigDecimal sumAmt = inboundVO.getItemList().stream().map(InboundItemVO::getIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  303. //endregion
  304. //region 自动办理参数为true 已入库编辑
  305. //自动办理参数为true
  306. if (Constant.FlgHandleSetting.TRUE.getValue().equals(inboundVO.getFlgHandleSetting())) {
  307. //region 退账
  308. if (inboundVO.getReceivableId() != null) {
  309. accountService.reversePayable(inboundVO.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  310. }
  311. //endregion
  312. //region 修改明细
  313. List<InboundItemVO> itemList = inboundVO.getItemList();
  314. for (InboundItemVO inboundItemVO : itemList) {
  315. //根据id查询
  316. InboundItemResponse inboundItemResponse = inboundItemMapper.selectById(inboundItemVO.getItemId());
  317. //region 不能新建
  318. if (inboundItemVO.getFromItemId() == null) {
  319. throw new BaseBusinessException(ErrorCodeEnum.ITEMS_THAT_ARE_NOT_AVAILABLE_HANDLE.getCode(),
  320. ErrorCodeEnum.ITEMS_THAT_ARE_NOT_AVAILABLE_HANDLE.getMessage());
  321. }
  322. //endregion
  323. //region 编辑明细 赋值
  324. if (inboundItemVO.getItemId() != null) {
  325. //region 将库存需要的参数赋值
  326. inboundItemVO.setInventoryType(Constant.InventoryType.INBOUND.getName());
  327. inboundItemVO.setInventoryDocCode(Constant.InventoryDocCode.PURCHASE_ORDER.getValue());
  328. //编辑之前的数
  329. inboundItemVO.setQtyBeforeUpdate(inboundItemResponse.getIntoQty());
  330. inboundItemVO.setAmtBeforeUpdate(inboundItemResponse.getIntoAmt());
  331. //编辑之后的数
  332. inboundItemVO.setIntoQty(inboundItemVO.getIntoingQty());
  333. inboundItemVO.setIntoAmt(inboundItemVO.getIntoingAmt());
  334. inboundItemVO.setAddOrEditFlag(false);
  335. //endregion
  336. InboundItem inboundItem = new InboundItem();
  337. inboundItem.setItemId(inboundItemVO.getItemId());
  338. inboundItem.setIntoQty(inboundItemVO.getIntoingQty());
  339. inboundItem.setIntoAmt(inboundItemVO.getIntoingAmt());
  340. inboundItem.setCostPrice(inboundItemVO.getPriceInto());
  341. inboundItem.setCostAmt(inboundItemVO.getIntoQty().multiply(inboundItemVO.getPriceInto()).setScale(6, BigDecimal.ROUND_HALF_UP));
  342. //修改
  343. inboundItemMapper.update(inboundItem,
  344. new UpdateWrapper<InboundItem>().lambda()
  345. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  346. );
  347. }
  348. //endregion
  349. //region 新建明细
  350. else {
  351. inboundItemVO
  352. .setIntoQty(inboundItemVO.getIntoingQty())
  353. .setIntoAmt(inboundItemVO.getIntoingAmt())
  354. .setIntoingQty(BigDecimal.ZERO)
  355. .setIntoingAmt(BigDecimal.ZERO)
  356. .setCostPrice(inboundItemVO.getPriceInto())
  357. .setCostAmt(inboundItemVO.getOutQty().multiply(inboundItemVO.getPriceInto()).setScale(2, BigDecimal.ROUND_HALF_UP))
  358. ;
  359. inboundItemVO.setIntoId(inboundVO.getIntoId());
  360. //入库状态
  361. inboundItemVO.setIntoStatus(inboundVO.getIntoStatus());
  362. inboundItemVO.setIntoType(Constant.IntoType.SALE.getName());
  363. //实体转换
  364. InboundItem inboundItem = inboundItemConvert.convertToPo(inboundItemVO);
  365. inboundItemMapper.insert(inboundItem);
  366. //region 将库存需要的参数赋值
  367. inboundItemVO.setInventoryType(Constant.InventoryType.INBOUND.getName());
  368. inboundItemVO.setInventoryDocCode(Constant.InventoryDocCode.PURCHASE_ORDER.getValue());
  369. inboundItemVO.setIntoQty(inboundItemVO.getIntoQty());
  370. inboundItemVO.setIntoAmt(inboundItemVO.getIntoAmt());
  371. inboundItemVO.setAddOrEditFlag(true);
  372. //endregion
  373. }
  374. //endregion
  375. //region 销售明细
  376. if (inboundItemVO.getFromItemId() != null) {
  377. //根据id查询
  378. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemVO.getFromItemId());
  379. PurchaseItem purchaseItem = new PurchaseItem();
  380. purchaseItem.setItemId(inboundItemVO.getFromItemId());
  381. purchaseItem.setIntoQty(inboundItemResponse.getIntoQty().negate().add(inboundItemVO.getIntoingQty()));
  382. purchaseItem.setIntoAmt(inboundItemResponse.getIntoAmt().negate().add(inboundItemVO.getIntoingAmt()));
  383. //入库状态
  384. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty(),
  385. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  386. purchaseItem.setIntoStatus(intoStatus);
  387. int countRow = purchaseItemMapper.updateById(purchaseItem);
  388. //数量超出
  389. if (countRow == 0) {
  390. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  391. }
  392. }
  393. //endregion
  394. }
  395. //endregion
  396. //region 删除明细
  397. BigDecimal delIntoQty = BigDecimal.ZERO;
  398. BigDecimal delIntoAmt = BigDecimal.ZERO;
  399. if (inboundVO.getDeleteItemList() != null) {
  400. delIntoQty = inboundVO.getDeleteItemList().stream().map(InboundItemVO::getIntoQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  401. delIntoAmt = inboundVO.getDeleteItemList().stream().map(InboundItemVO::getIntoAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  402. for (InboundItemVO inboundItemVO : inboundVO.getDeleteItemList()) {
  403. if (inboundItemVO.getItemId() != null) {
  404. //region 将库存需要的参数赋值
  405. inboundItemVO.setInventoryType(Constant.InventoryType.INBOUND.getName());
  406. inboundItemVO.setInventoryDocCode(Constant.InventoryDocCode.PURCHASE_ORDER.getValue());
  407. inboundItemVO.setIntoQty(inboundItemVO.getIntoQty());
  408. inboundItemVO.setIntoAmt(inboundItemVO.getIntoAmt());
  409. //endregion
  410. InboundItem inboundItem = inboundItemConvert.convertToPo(inboundItemVO);
  411. inboundItem.setFlgValid(false);
  412. //修改
  413. inboundItemMapper.update(inboundItem,
  414. new UpdateWrapper<InboundItem>().lambda()
  415. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  416. );
  417. }
  418. //region 销售明细
  419. if (inboundItemVO.getFromItemId() != null) {
  420. //根据id查询
  421. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemVO.getFromItemId());
  422. PurchaseItem purchaseItem = new PurchaseItem();
  423. purchaseItem.setItemId(inboundItemVO.getFromItemId());
  424. purchaseItem.setIntoQty(inboundItemVO.getIntoQty().negate());
  425. purchaseItem.setIntoAmt(inboundItemVO.getIntoAmt().negate());
  426. purchaseItem.setIntoingQty(inboundItemVO.getIntoQty());
  427. purchaseItem.setIntoingAmt(inboundItemVO.getIntoAmt());
  428. //入库状态
  429. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  430. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  431. purchaseItem.setIntoStatus(intoStatus);
  432. int countRow = purchaseItemMapper.updateById(purchaseItem);
  433. //数量超出
  434. if (countRow == 0) {
  435. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  436. }
  437. }
  438. //endregion
  439. }
  440. }
  441. //endregion
  442. //region 修改入库总单
  443. Inbound inbound = new Inbound();
  444. inbound.setIntoId(inboundVO.getIntoId());
  445. inbound.setIntoQty(sumQty);
  446. inbound.setIntoAmt(sumAmt);
  447. //修改
  448. inboundMapper.update(inbound,
  449. new UpdateWrapper<Inbound>().lambda().eq(Inbound::getIntoId, UUID.fromString(inbound.getIntoId()))
  450. );
  451. //endregion
  452. //region 修改销售总单
  453. if (inboundVO.getFromId() != null) {
  454. //根据id查询
  455. PurchaseResponse purchaseResponse = purchaseMapper.selectById(inboundVO.getFromId());
  456. Purchase purchase = new Purchase();
  457. purchase.setPurId(inboundVO.getFromId());
  458. purchase.setIntoQty(inboundResponse.getIntoQty().negate().add(sumQty).subtract(delIntoQty));
  459. purchase.setIntoAmt(inboundResponse.getIntoAmt().negate().add(sumAmt).subtract(delIntoAmt));
  460. purchase.setIntoingQty(delIntoQty);
  461. purchase.setIntoingAmt(delIntoAmt);
  462. //入库状态
  463. String intoStatus = this.setIntoStatus(purchaseResponse.getIntoingQty().add(purchase.getIntoingQty()),
  464. purchaseResponse.getIntoQty().add(purchase.getIntoQty()), purchaseResponse.getSumQuantity());
  465. purchase.setIntoStatus(intoStatus);
  466. //修改
  467. int countRow = purchaseMapper.updateById(purchase);
  468. //数量超出
  469. if (countRow == 0) {
  470. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  471. }
  472. //endregion
  473. }
  474. //region 入账
  475. if (inboundVO.getReceivableId() != null) {
  476. accountService.accPayable(inboundVO.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  477. }
  478. //endregion
  479. //region 调用库存
  480. Map<String, Object> map = new HashMap<>();
  481. map.put("intoDetail", inboundVO.getItemList());
  482. map.put("delIntoDetail", inboundVO.getDeleteItemList());
  483. inventoryService.operatingInventoryInformation(map);
  484. //endregion
  485. }
  486. else{
  487. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.FLG_HANDLE_SETTING_NOT_ENABLED_INTO.getMessage());
  488. }
  489. //endregion
  490. //region 自动办理参数false 入库中编辑
  491. //自动办理标识为false 并且 自动办理参数为false 入库中
  492. if (!inboundVO.getFlgAutoHandle() && Constant.FlgHandleSetting.FALSE.getValue().equals(inboundVO.getFlgHandleSetting())) {
  493. //region 修改明细
  494. List<InboundItemVO> itemList = inboundVO.getItemList();
  495. for (InboundItemVO inboundItemVO : itemList) {
  496. //region 不能新建
  497. if (inboundItemVO.getFromItemId() == null) {
  498. throw new BaseBusinessException(ErrorCodeEnum.ITEMS_THAT_ARE_NOT_AVAILABLE_HANDLE.getCode(),
  499. ErrorCodeEnum.ITEMS_THAT_ARE_NOT_AVAILABLE_HANDLE.getMessage());
  500. }
  501. //endregion
  502. //根据id查询 获取到还未进行修改的数据
  503. InboundItemResponse inboundItemResponse = inboundItemMapper.selectById(inboundItemVO.getItemId());
  504. //region 编辑明细
  505. if (inboundItemVO.getItemId() != null) {
  506. InboundItem inboundItem = new InboundItem();
  507. inboundItem.setItemId(inboundItemVO.getItemId());
  508. inboundItem.setIntoingQty(inboundItemVO.getIntoingQty());
  509. inboundItem.setIntoingAmt(inboundItemVO.getIntoingAmt());
  510. //修改
  511. inboundItemMapper.update(inboundItem,
  512. new UpdateWrapper<InboundItem>().lambda()
  513. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  514. );
  515. }
  516. //endregion
  517. //region 新建明细
  518. else {
  519. inboundItemVO
  520. .setIntoQty(BigDecimal.ZERO)
  521. .setIntoAmt(BigDecimal.ZERO)
  522. .setCostPrice(inboundItemVO.getPriceInto())
  523. .setCostAmt(inboundItemVO.getIntoingQty().multiply(inboundItemVO.getPriceInto()).setScale(2, BigDecimal.ROUND_HALF_UP))
  524. ;
  525. inboundItemVO.setIntoId(inboundVO.getIntoId());
  526. //入库状态
  527. inboundItemVO.setIntoStatus(inboundVO.getIntoStatus());
  528. inboundItemVO.setIntoType(Constant.IntoType.SALE.getName());
  529. //实体转换
  530. InboundItem inboundItem = inboundItemConvert.convertToPo(inboundItemVO);
  531. inboundItemMapper.insert(inboundItem);
  532. }
  533. //endregion
  534. //region 销售明细
  535. if (inboundItemVO.getFromItemId() != null) {
  536. //根据id查询
  537. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemVO.getFromItemId());
  538. PurchaseItem purchaseItem = new PurchaseItem();
  539. purchaseItem.setItemId(inboundItemVO.getFromItemId());
  540. //本次修改几个传几个(负数) sql中是原数据+本次修改数据
  541. purchaseItem.setIntoingQty(inboundItemResponse.getIntoingQty().negate().add(inboundItemVO.getIntoingQty()));
  542. purchaseItem.setIntoingAmt(inboundItemResponse.getIntoingAmt().negate().add(inboundItemVO.getIntoingAmt()));
  543. //入库状态
  544. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  545. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  546. purchaseItem.setIntoStatus(intoStatus);
  547. int countRow = purchaseItemMapper.updateById(purchaseItem);
  548. //数量超出
  549. if (countRow == 0) {
  550. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  551. }
  552. }
  553. //endregion
  554. }
  555. //endregion
  556. //region 删除明细
  557. BigDecimal delIntoQty = BigDecimal.ZERO;
  558. BigDecimal delIntoAmt = BigDecimal.ZERO;
  559. if (inboundVO.getDeleteItemList() != null) {
  560. delIntoQty = inboundVO.getDeleteItemList().stream().map(InboundItemVO::getIntoingQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  561. delIntoAmt = inboundVO.getDeleteItemList().stream().map(InboundItemVO::getIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  562. for (InboundItemVO inboundItemVO : inboundVO.getDeleteItemList()) {
  563. //region 明细
  564. if (inboundItemVO.getItemId() != null) {
  565. InboundItem inboundItem = inboundItemConvert.convertToPo(inboundItemVO);
  566. inboundItem.setFlgValid(false);
  567. //修改
  568. inboundItemMapper.update(inboundItem,
  569. new UpdateWrapper<InboundItem>().lambda()
  570. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  571. );
  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. purchaseItem.setIntoingQty(inboundItemVO.getIntoingQty().negate());
  581. purchaseItem.setIntoingAmt(inboundItemVO.getIntoingAmt().negate());
  582. //入库状态
  583. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  584. purchaseItemResponse.getIntoQty(), purchaseItemResponse.getItemQty());
  585. purchaseItem.setIntoStatus(intoStatus);
  586. int countRow = purchaseItemMapper.updateById(purchaseItem);
  587. //数量超出
  588. if (countRow == 0) {
  589. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  590. }
  591. }
  592. //endregion
  593. }
  594. }
  595. //endregion
  596. //region 修改入库总单
  597. Inbound inbound = new Inbound();
  598. inbound.setIntoId(inboundVO.getIntoId());
  599. inbound.setIntoingQty(sumQty);
  600. inbound.setIntoingAmt(sumAmt);
  601. //修改
  602. inboundMapper.update(inbound,
  603. new UpdateWrapper<Inbound>().lambda().eq(Inbound::getIntoId, UUID.fromString(inbound.getIntoId()))
  604. );
  605. //endregion
  606. //region 修改采购总单
  607. if (inboundVO.getFromId() != null) {
  608. //根据id查询
  609. PurchaseResponse purchaseResponse = purchaseMapper.selectById(inboundVO.getFromId());
  610. Purchase purchase = new Purchase();
  611. purchase.setPurId(inboundVO.getFromId());
  612. purchase.setIntoingQty(inboundResponse.getIntoingQty().negate().add(sumQty).subtract(delIntoQty));
  613. purchase.setIntoingAmt(inboundResponse.getIntoingAmt().negate().add(sumAmt).subtract(delIntoAmt));
  614. //入库状态
  615. String intoStatus = this.setIntoStatus(purchaseResponse.getIntoingQty().add(purchase.getIntoingQty()),
  616. purchaseResponse.getIntoQty(), purchaseResponse.getSumQuantity());
  617. purchase.setIntoStatus(intoStatus);
  618. //修改
  619. int countRow = purchaseMapper.updateById(purchase);
  620. //数量超出
  621. if (countRow == 0) {
  622. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  623. }
  624. }
  625. //endregion
  626. }
  627. else{
  628. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.FLG_HANDLE_SETTING_NOT_ENABLED_INTO.getMessage());
  629. }
  630. //endregion
  631. }
  632. //endregion
  633. return ResponseResultUtil.success(inboundVO);
  634. }
  635. /**
  636. * @desc : 采购入库作废
  637. * @date : 2024/3/26 9:24
  638. * @author : 寇珊珊
  639. */
  640. @Transactional(rollbackFor = {Exception.class})
  641. public ResponseResultVO<?> purchaseInboundRepeal(String intoId) {
  642. //region 查询总单 查询明细
  643. //根据id查询 此条入库单的数据还未更改前的数据
  644. InboundResponse inboundResponse = inboundMapper.selectById(intoId);
  645. //根据总单id查询
  646. List<InboundItemResponse> inboundItemResponseList = inboundItemMapper.selectByCond(new InboundItemQuery().setIntoId(inboundResponse.getIntoId()));
  647. //endregion
  648. //region 自动办理参数为true 已入库编辑
  649. //自动办理参数为true
  650. if (Constant.FlgHandleSetting.TRUE.getValue().equals(inboundResponse.getFlgHandleSetting())) {
  651. //region 退账
  652. if (inboundResponse.getReceivableId() != null) {
  653. accountService.reversePayable(inboundResponse.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  654. }
  655. //endregion
  656. //region 修改明细
  657. for (InboundItemResponse inboundItemResponse : inboundItemResponseList) {
  658. //region 将库存需要的参数赋值
  659. inboundItemResponse.setInventoryType(Constant.InventoryType.INBOUND.getName());
  660. inboundItemResponse.setInventoryDocCode(Constant.InventoryDocCode.PURCHASE_ORDER.getValue());
  661. inboundItemResponse.setIntoQty(inboundItemResponse.getIntoQty().negate());
  662. inboundItemResponse.setIntoAmt(inboundItemResponse.getIntoAmt().negate());
  663. //endregion
  664. //region 编辑明细 赋值
  665. InboundItem inboundItem = new InboundItem();
  666. inboundItem.setItemId(inboundItemResponse.getItemId());
  667. inboundItem.setFlgValid(false);
  668. //修改
  669. inboundItemMapper.update(inboundItem,
  670. new UpdateWrapper<InboundItem>().lambda()
  671. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  672. );
  673. //endregion
  674. //region 销售明细
  675. if (inboundItemResponse.getFromItemId() != null) {
  676. //根据id查询
  677. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemResponse.getFromItemId());
  678. PurchaseItem purchaseItem = new PurchaseItem();
  679. purchaseItem.setItemId(inboundItemResponse.getFromItemId());
  680. purchaseItem.setIntoQty(inboundItemResponse.getIntoQty().negate());
  681. purchaseItem.setIntoAmt(inboundItemResponse.getIntoAmt().negate());
  682. //入库状态
  683. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty(),
  684. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  685. purchaseItem.setIntoStatus(intoStatus);
  686. int countRow = purchaseItemMapper.updateById(purchaseItem);
  687. //数量超出
  688. if (countRow == 0) {
  689. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  690. }
  691. }
  692. //endregion
  693. }
  694. //endregion
  695. //region 修改入库总单
  696. Inbound inbound = new Inbound();
  697. inbound.setIntoId(inboundResponse.getIntoId());
  698. inbound.setFlgValid(false);
  699. //修改
  700. inboundMapper.update(inbound,
  701. new UpdateWrapper<Inbound>().lambda().eq(Inbound::getIntoId, UUID.fromString(inbound.getIntoId()))
  702. );
  703. //endregion
  704. //region 修改销售总单
  705. if (inboundResponse.getFromId() != null) {
  706. //根据id查询
  707. PurchaseResponse purchaseResponse = purchaseMapper.selectById(inboundResponse.getFromId());
  708. Purchase purchase = new Purchase();
  709. purchase.setPurId(inboundResponse.getFromId());
  710. purchase.setIntoQty(inboundResponse.getIntoQty().negate());
  711. purchase.setIntoQty(inboundResponse.getIntoAmt().negate());
  712. //入库状态
  713. String intoStatus = this.setIntoStatus(purchaseResponse.getIntoingQty(),
  714. purchaseResponse.getIntoQty().add(purchase.getIntoQty()), purchaseResponse.getSumQuantity());
  715. purchase.setIntoStatus(intoStatus);
  716. //修改
  717. int countRow = purchaseMapper.updateById(purchase);
  718. //数量超出
  719. if (countRow == 0) {
  720. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  721. }
  722. }
  723. //endregion
  724. //region 入账
  725. if (inboundResponse.getReceivableId() != null) {
  726. accountService.accPayable(inboundResponse.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  727. }
  728. //endregion
  729. //region 调用库存
  730. Map<String, Object> map = new HashMap<>();
  731. map.put("delIntoDetail", inboundItemResponseList);
  732. inventoryService.operatingInventoryInformation(map);
  733. //endregion
  734. }
  735. else{
  736. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.FLG_HANDLE_SETTING_NOT_ENABLED_INTO.getMessage());
  737. }
  738. //endregion
  739. //region 自动办理参数false 入库中编辑
  740. //自动办理标识为false 并且 自动办理参数为false 入库中
  741. if (!inboundResponse.getFlgAutoHandle() && Constant.FlgHandleSetting.FALSE.getValue().equals(inboundResponse.getFlgHandleSetting())) {
  742. //region 修改明细
  743. for (InboundItemResponse inboundItemResponse : inboundItemResponseList) {
  744. //region 编辑明细 赋值
  745. InboundItem inboundItem = new InboundItem();
  746. inboundItem.setItemId(inboundItemResponse.getItemId());
  747. inboundItem.setIntoingQty(BigDecimal.ZERO);
  748. inboundItem.setIntoingAmt(BigDecimal.ZERO);
  749. inboundItem.setFlgValid(false);
  750. //修改
  751. inboundItemMapper.update(inboundItem,
  752. new UpdateWrapper<InboundItem>().lambda()
  753. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  754. );
  755. //endregion
  756. //region 销售明细
  757. if (inboundItemResponse.getFromItemId() != null) {
  758. //根据id查询
  759. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemResponse.getFromItemId());
  760. PurchaseItem purchaseItem = new PurchaseItem();
  761. purchaseItem.setItemId(inboundItemResponse.getFromItemId());
  762. purchaseItem.setIntoingQty(inboundItemResponse.getIntoingQty().negate());
  763. purchaseItem.setIntoingAmt(inboundItemResponse.getIntoingAmt().negate());
  764. //入库状态
  765. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  766. purchaseItemResponse.getIntoQty(), purchaseItemResponse.getItemQty());
  767. purchaseItem.setIntoStatus(intoStatus);
  768. int countRow = purchaseItemMapper.updateById(purchaseItem);
  769. //数量超出
  770. if (countRow == 0) {
  771. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  772. }
  773. }
  774. //endregion
  775. }
  776. //endregion
  777. //region 修改入库总单
  778. Inbound inbound = new Inbound();
  779. inbound.setIntoId(inboundResponse.getIntoId());
  780. inbound.setIntoingQty(BigDecimal.ZERO);
  781. inbound.setIntoAmt(BigDecimal.ZERO);
  782. inbound.setFlgValid(false);
  783. //修改
  784. inboundMapper.update(inbound,
  785. new UpdateWrapper<Inbound>().lambda().eq(Inbound::getIntoId, UUID.fromString(inbound.getIntoId()))
  786. );
  787. //endregion
  788. //region 修改销售总单
  789. if (inboundResponse.getFromId() != null) {
  790. //根据id查询
  791. PurchaseResponse purchaseResponse = purchaseMapper.selectById(inboundResponse.getFromId());
  792. Purchase purchase = new Purchase();
  793. purchase.setPurId(inboundResponse.getFromId());
  794. purchase.setIntoingQty(inboundResponse.getIntoingQty().negate());
  795. purchase.setIntoingAmt(inboundResponse.getIntoingAmt().negate());
  796. //入库状态
  797. String intoStatus = this.setIntoStatus(purchaseResponse.getIntoingQty().add(purchase.getIntoingQty()),
  798. purchaseResponse.getIntoQty(), purchaseResponse.getSumQuantity());
  799. purchase.setIntoStatus(intoStatus);
  800. //修改
  801. int countRow = purchaseMapper.updateById(purchase);
  802. //数量超出
  803. if (countRow == 0) {
  804. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  805. }
  806. }
  807. //endregion
  808. }
  809. else{
  810. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.FLG_HANDLE_SETTING_NOT_ENABLED_INTO.getMessage());
  811. }
  812. //endregion
  813. return ResponseResultUtil.success();
  814. }
  815. /**
  816. * @desc : 采购入库办理
  817. * @date : 2024/3/7 15:47
  818. * @author : 寇珊珊
  819. */
  820. @Transactional(rollbackFor = {Exception.class})
  821. public ResponseResultVO<?> purchaseHandleInbound(InboundVO inboundVO) {
  822. //region 根据id查询 此条入库单的数据还未更改前的数据
  823. InboundResponse inboundResponse = inboundMapper.selectById(inboundVO.getIntoId());
  824. //endregion
  825. //region 退账
  826. if (inboundResponse.getReceivableId() != null) {
  827. accountService.reversePayable(inboundResponse.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  828. }
  829. //region 编辑明细
  830. //校验明细
  831. if (inboundVO.getItemList().size() == 0) {
  832. throw new BaseBusinessException(ErrorCodeEnum.INBOUND_ITEM_NOT_EXIST.getCode(),
  833. ErrorCodeEnum.INBOUND_ITEM_NOT_EXIST.getMessage());
  834. }
  835. for (InboundItemVO inboundItemVO : inboundVO.getItemList()) {
  836. //region 不能新建
  837. if (inboundItemVO.getFromItemId() == null) {
  838. throw new BaseBusinessException(ErrorCodeEnum.ITEMS_THAT_ARE_NOT_AVAILABLE_HANDLE.getCode(),
  839. ErrorCodeEnum.ITEMS_THAT_ARE_NOT_AVAILABLE_HANDLE.getMessage());
  840. }
  841. //endregion
  842. //入库明细根据id查询
  843. InboundItemResponse inboundItemResponse = inboundItemMapper.selectById(inboundItemVO.getItemId());
  844. //region 校验数量是否超出
  845. if (inboundItemVO.getIntoingQty().compareTo(inboundItemResponse.getIntoingQty()) > 0) {
  846. throw new BaseBusinessException(ErrorCodeEnum.CANNOT_EXCEED_THE_QUANTITY_IN_THE_OUTBOUND_SHIPMENT.getCode(),
  847. ErrorCodeEnum.CANNOT_EXCEED_THE_QUANTITY_IN_THE_OUTBOUND_SHIPMENT.getMessage());
  848. }
  849. //endregion
  850. //region 编辑明细
  851. if (inboundItemVO.getItemId() != null) {
  852. inboundItemVO
  853. .setIntoQty(inboundItemResponse.getIntoQty().add(inboundItemVO.getIntoingQty()))
  854. .setIntoAmt(inboundItemResponse.getIntoAmt().add(inboundItemVO.getIntoingAmt()))
  855. .setIntoingQty(BigDecimal.ZERO)
  856. .setIntoingAmt(BigDecimal.ZERO)
  857. .setCostPrice(inboundItemVO.getPriceInto())
  858. .setCostAmt(inboundItemVO.getIntoQty().multiply(inboundItemVO.getPriceInto()).setScale(2, BigDecimal.ROUND_HALF_UP))
  859. ;
  860. //入库状态
  861. String intoStatus = this.setIntoStatus(inboundItemVO.getIntoingQty(), inboundItemVO.getIntoQty());
  862. inboundItemVO.setIntoStatus(intoStatus);
  863. //实体转换
  864. InboundItem inboundItem = inboundItemConvert.convertToPo(inboundItemVO);
  865. //修改
  866. inboundItemMapper.update(inboundItem,
  867. new UpdateWrapper<InboundItem>().lambda()
  868. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  869. );
  870. //region 将库存需要的参数赋值
  871. inboundItemVO.setInventoryType(Constant.InventoryType.INBOUND.getName());
  872. inboundItemVO.setInventoryDocCode(Constant.InventoryDocCode.PURCHASE_ORDER.getValue());
  873. //编辑之前的数
  874. inboundItemVO.setQtyBeforeUpdate(inboundItemResponse.getIntoQty());
  875. inboundItemVO.setAmtBeforeUpdate(inboundItemResponse.getIntoAmt());
  876. inboundItemVO.setAddOrEditFlag(false);
  877. //endregion
  878. }
  879. //endregion
  880. //region 新建明细
  881. else {
  882. inboundItemVO
  883. .setIntoQty(inboundItemVO.getIntoingQty())
  884. .setIntoAmt(inboundItemVO.getIntoingAmt())
  885. .setIntoId(inboundVO.getIntoId())
  886. .setCostPrice(inboundItemVO.getPriceInto())
  887. .setCostAmt(inboundItemVO.getIntoQty().multiply(inboundItemVO.getPriceInto()).setScale(2, BigDecimal.ROUND_HALF_UP))
  888. .setIntoType(Constant.IntoType.SALE.getName())
  889. .setIntoingQty(BigDecimal.ZERO)
  890. .setIntoingAmt(BigDecimal.ZERO)
  891. ;
  892. //入库状态
  893. String intoStatus = this.setIntoStatus(inboundItemVO.getIntoingQty(), inboundItemVO.getIntoQty());
  894. inboundItemVO.setIntoStatus(intoStatus);
  895. //实体转换
  896. InboundItem inboundItem = inboundItemConvert.convertToPo(inboundItemVO);
  897. //新建
  898. inboundItemMapper.insert(inboundItem);
  899. //region 将库存需要的参数赋值
  900. inboundItemVO.setInventoryType(Constant.InventoryType.INBOUND.getName());
  901. inboundItemVO.setInventoryDocCode(Constant.InventoryDocCode.PURCHASE_ORDER.getValue());
  902. inboundItemVO.setAddOrEditFlag(true);
  903. //endregion
  904. }
  905. //endregion
  906. //region 采购明细
  907. //根据id查询
  908. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemVO.getFromItemId());
  909. //赋值(这里重写了更新方法,数量在更新方法中有数据库院士数量+本次数量)
  910. PurchaseItem purchaseItem = new PurchaseItem();
  911. purchaseItem.setItemId(inboundItemVO.getFromItemId());
  912. purchaseItem.setIntoingQty(inboundItemVO.getIntoQty().negate());
  913. purchaseItem.setIntoingAmt(inboundItemVO.getIntoAmt().negate());
  914. purchaseItem.setIntoQty(inboundItemVO.getIntoQty());
  915. purchaseItem.setIntoAmt(inboundItemVO.getIntoAmt());
  916. //入库状态
  917. String purItemIntoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  918. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  919. purchaseItem.setIntoStatus(purItemIntoStatus);
  920. int countRow = purchaseItemMapper.updateById(purchaseItem);
  921. //数量超出
  922. if (countRow == 0) {
  923. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  924. }
  925. //endregion
  926. }
  927. //endregion
  928. //region 删除明细
  929. BigDecimal delIntoingQty = BigDecimal.ZERO;
  930. BigDecimal delIntoingAmt = BigDecimal.ZERO;
  931. BigDecimal delIntoQty = BigDecimal.ZERO;
  932. BigDecimal delIntoAmt = BigDecimal.ZERO;
  933. if (inboundVO.getDeleteItemList() != null) {
  934. delIntoingQty = inboundVO.getDeleteItemList().stream().map(InboundItemVO::getIntoingQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  935. delIntoingAmt = inboundVO.getDeleteItemList().stream().map(InboundItemVO::getIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  936. delIntoQty = inboundVO.getDeleteItemList().stream().map(InboundItemVO::getIntoQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  937. delIntoAmt = inboundVO.getDeleteItemList().stream().map(InboundItemVO::getIntoingAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  938. for (InboundItemVO inboundItemVO : inboundVO.getDeleteItemList()) {
  939. if (inboundItemVO.getItemId() != null) {
  940. //region 将库存需要的参数赋值
  941. inboundItemVO.setInventoryType(Constant.InventoryType.INBOUND.getName());
  942. inboundItemVO.setInventoryDocCode(Constant.InventoryDocCode.PURCHASE_ORDER.getValue());
  943. //endregion
  944. InboundItem inboundItem = inboundItemConvert.convertToPo(inboundItemVO);
  945. inboundItem.setFlgValid(false);
  946. //修改
  947. inboundItemMapper.update(inboundItem,
  948. new UpdateWrapper<InboundItem>().lambda()
  949. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  950. );
  951. }
  952. //region 采购
  953. if (inboundItemVO.getFromItemId() != null) {
  954. //region 采购订单明细
  955. //赋值(这里重写了更新方法,数量在更新方法中有数据库院士数量+本次数量)
  956. PurchaseItem purchaseItem = new PurchaseItem();
  957. purchaseItem.setItemId(inboundItemVO.getFromItemId());
  958. purchaseItem.setIntoingQty(inboundItemVO.getIntoingQty().negate());
  959. purchaseItem.setIntoingAmt(inboundItemVO.getIntoingAmt().negate());
  960. purchaseItem.setIntoQty(inboundItemVO.getIntoQty().negate());
  961. purchaseItem.setIntoAmt(inboundItemVO.getIntoAmt().negate());
  962. //根据id查询
  963. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemVO.getFromItemId());
  964. //入库状态
  965. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  966. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  967. purchaseItem.setIntoStatus(intoStatus);
  968. int countRow = purchaseItemMapper.updateById(purchaseItem);
  969. //数量超出
  970. if (countRow == 0) {
  971. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  972. }
  973. //endregion
  974. }
  975. //endregion
  976. }
  977. }
  978. //endregion
  979. //region 编辑总单
  980. BigDecimal sumIntoQty = inboundVO.getItemList().stream().map(InboundItemVO::getIntoQty).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(6, BigDecimal.ROUND_HALF_UP);
  981. BigDecimal sumIntoAmt = inboundVO.getItemList().stream().map(InboundItemVO::getIntoAmt).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_HALF_UP);
  982. inboundVO.setIntoQty(sumIntoQty);
  983. inboundVO.setIntoAmt(sumIntoAmt);
  984. inboundVO.setIntoingQty(BigDecimal.ZERO);
  985. inboundVO.setIntoingAmt(BigDecimal.ZERO);
  986. //入库状态
  987. String intoStatus = this.setIntoStatus(inboundVO.getIntoingQty(), inboundVO.getIntoQty());
  988. inboundVO.setIntoStatus(intoStatus);
  989. //实体转换
  990. Inbound inbound = inboundConvert.convertToPo(inboundVO);
  991. //修改
  992. inboundMapper.update(inbound,
  993. new UpdateWrapper<Inbound>().lambda().eq(Inbound::getIntoId, UUID.fromString(inbound.getIntoId()))
  994. );
  995. //endregion
  996. //region 修改采购订单
  997. if (inboundVO.getFromId() != null) {
  998. //赋值(这里重写了更新方法,数量在更新方法中有数据库院士数量+本次数量)
  999. Purchase purchase = new Purchase();
  1000. purchase.setPurId(inboundVO.getFromId());
  1001. purchase.setIntoQty(sumIntoQty.subtract(delIntoQty));
  1002. purchase.setIntoAmt(sumIntoAmt.subtract(delIntoAmt));
  1003. purchase.setIntoingQty((inboundResponse.getIntoingQty().add(delIntoingQty)).negate());
  1004. purchase.setIntoingAmt((inboundResponse.getIntoingAmt().add(delIntoingAmt)).negate());
  1005. //根据id查询
  1006. PurchaseResponse purchaseResponse = purchaseMapper.selectById(inboundVO.getFromId());
  1007. //入库状态
  1008. String purIntoStatus = this.setIntoStatus(purchaseResponse.getIntoingQty().add(purchase.getIntoingQty()),
  1009. purchaseResponse.getIntoQty().add(purchase.getIntoQty()), purchase.getSumQuantity());
  1010. purchase.setIntoStatus(purIntoStatus);
  1011. //修改
  1012. int countRow = purchaseMapper.updateById(purchase);
  1013. //数量超出
  1014. if (countRow == 0) {
  1015. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  1016. }
  1017. }
  1018. //endregion
  1019. //region 入账
  1020. accountService.accPayable(inboundVO.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  1021. //endregion
  1022. //region 调用库存
  1023. Map<String, Object> map = new HashMap<>();
  1024. map.put("intoDetail", inboundVO.getItemList());
  1025. map.put("delIntoDetail", inboundVO.getDeleteItemList());
  1026. inventoryService.operatingInventoryInformation(map);
  1027. //endregion
  1028. //endregion
  1029. return ResponseResultUtil.success(inboundVO);
  1030. }
  1031. /**
  1032. * @desc : 采购入库撤销
  1033. * @date : 2024/3/7 17:06
  1034. * @author : 寇珊珊
  1035. */
  1036. @Transactional(rollbackFor = {Exception.class})
  1037. public ResponseResultVO<?> purchaseInboundCancel(InboundVO inboundVO) {
  1038. //region 查询入库总单数据信息
  1039. InboundResponse inboundResponse = inboundMapper.selectById(inboundVO.getIntoId());
  1040. //endregion
  1041. //region 退账
  1042. if (inboundResponse.getReceivableId() != null) {
  1043. accountService.reversePayable(inboundVO.getIntoId(), Constant.InventoryDocCode.INTOBOUND.getTableName());
  1044. }
  1045. //endregion
  1046. //region 修改订单数据信息
  1047. if (inboundResponse.getFromId() != null) {
  1048. //根据id查询
  1049. PurchaseResponse purchaseResponse = purchaseMapper.selectById(inboundVO.getFromId());
  1050. //赋值 (这里重写了更新方法,数量在更新方法中有数据库院士数量+本次数量)
  1051. Purchase purchase = new Purchase();
  1052. purchase.setPurId(inboundResponse.getFromId());
  1053. purchase.setIntoQty(inboundResponse.getIntoQty().negate());
  1054. purchase.setIntoAmt(inboundResponse.getIntoAmt().negate());
  1055. purchase.setIntoingQty(inboundResponse.getIntoQty());
  1056. purchase.setIntoingAmt(inboundResponse.getIntoAmt());
  1057. //入库状态
  1058. String intoStatus = this.setIntoStatus(purchaseResponse.getIntoingQty().add(purchase.getIntoingQty()),
  1059. purchaseResponse.getIntoQty().add(purchase.getIntoQty()), purchaseResponse.getSumQuantity());
  1060. purchase.setIntoStatus(intoStatus);
  1061. int countRow = purchaseMapper.updateById(purchase);
  1062. //数量超出
  1063. if (countRow == 0) {
  1064. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  1065. }
  1066. }
  1067. //endregion
  1068. //region 修改总单数据信息
  1069. Inbound inbound = new Inbound();
  1070. inbound.setIntoId(inboundVO.getIntoId());
  1071. inbound.setIntoDate(null);
  1072. inbound.setIntoStatus(Constant.IntoStatus.RUKUZHONG.getName());
  1073. inbound.setIntoingQty(inboundResponse.getIntoingQty().add(inboundResponse.getIntoQty()));
  1074. inbound.setIntoingAmt(inboundResponse.getIntoingAmt().add(inboundResponse.getIntoAmt()));
  1075. inbound.setIntoQty(BigDecimal.ZERO);
  1076. inbound.setIntoAmt(BigDecimal.ZERO);
  1077. //修改
  1078. inboundMapper.update(inbound,
  1079. new UpdateWrapper<Inbound>().lambda()
  1080. .eq(Inbound::getIntoId, UUID.fromString(inbound.getIntoId()))
  1081. );
  1082. //endregion
  1083. //region 明细数据
  1084. //根据总单id查明细
  1085. List<InboundItemResponse> inboundItemResponseList = inboundItemMapper.selectByCond(new InboundItemQuery().setIntoId(inbound.getIntoId()));
  1086. for (InboundItemResponse inboundItemResponse : inboundItemResponseList) {
  1087. //region 修改采购明细数据信息
  1088. if (inboundItemResponse.getFromItemId() != null) {
  1089. //根据id查询
  1090. PurchaseItemResponse purchaseItemResponse = purchaseItemMapper.selectById(inboundItemResponse.getFromItemId());
  1091. //赋值 (这里重写了更新方法,数量在更新方法中有数据库院士数量+本次数量)
  1092. PurchaseItem purchaseItem = new PurchaseItem();
  1093. purchaseItem.setItemId(inboundItemResponse.getFromItemId());
  1094. purchaseItem.setIntoQty(inboundItemResponse.getIntoQty().negate());
  1095. purchaseItem.setIntoAmt(inboundItemResponse.getIntoAmt().negate());
  1096. purchaseItem.setIntoingQty(inboundItemResponse.getIntoQty());
  1097. purchaseItem.setIntoingAmt(inboundItemResponse.getIntoAmt());
  1098. //入库状态
  1099. String intoStatus = this.setIntoStatus(purchaseItemResponse.getIntoingQty().add(purchaseItem.getIntoingQty()),
  1100. purchaseItemResponse.getIntoQty().add(purchaseItem.getIntoQty()), purchaseItemResponse.getItemQty());
  1101. purchaseItem.setIntoStatus(intoStatus);
  1102. //修改
  1103. int countRow = purchaseItemMapper.updateById(purchaseItem);
  1104. //数量超出
  1105. if (countRow == 0) {
  1106. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.INVENTORY_QUANTITY_EXCEEDED.getMessage());
  1107. }
  1108. }
  1109. //endregion
  1110. //region修改入库明细信息
  1111. InboundItem inboundItem = new InboundItem();
  1112. //region 将库存需要的参数赋值
  1113. inboundItemResponse.setInventoryType(Constant.InventoryType.INBOUND.getName());
  1114. inboundItemResponse.setInventoryDocCode(Constant.InventoryDocCode.PURCHASE_ORDER.getValue());
  1115. inboundItemResponse.setIntoQty(inboundItemResponse.getIntoQty().negate());
  1116. inboundItemResponse.setIntoAmt(inboundItemResponse.getIntoAmt().negate());
  1117. //endregion
  1118. inboundItem
  1119. .setIntoId(inbound.getIntoId())
  1120. .setIntoStatus(Constant.IntoStatus.RUKUZHONG.getName())
  1121. .setIntoingQty(inboundItemResponse.getIntoingQty().add(inboundItemResponse.getIntoQty()))
  1122. .setIntoingAmt(inboundItemResponse.getIntoingAmt().add(inboundItemResponse.getIntoAmt()))
  1123. .setIntoQty(BigDecimal.ZERO)
  1124. .setIntoAmt(BigDecimal.ZERO)
  1125. .setCostPrice(BigDecimal.ZERO)
  1126. .setCostAmt(BigDecimal.ZERO)
  1127. .setItemId(inboundItemResponse.getItemId());
  1128. //入库状态
  1129. String intoStatus = this.setIntoStatus(inboundItem.getIntoingQty(), inboundItem.getIntoQty());
  1130. inboundItem.setIntoStatus(intoStatus);
  1131. //修改
  1132. inboundItemMapper.update(inboundItem,
  1133. new UpdateWrapper<InboundItem>().lambda()
  1134. .eq(InboundItem::getItemId, UUID.fromString(inboundItem.getItemId()))
  1135. );
  1136. //endregion
  1137. }
  1138. //endregion
  1139. //region 调用库存
  1140. Map<String, Object> map = new HashMap<>();
  1141. map.put("delIntoDetail", inboundItemResponseList);
  1142. inventoryService.operatingInventoryInformation(map);
  1143. //endregion
  1144. return ResponseResultUtil.success();
  1145. }
  1146. /**
  1147. * @desc : 入库状态通用(目前本页面)
  1148. * @date : 2024/3/9 8:59
  1149. * @author : 寇珊珊
  1150. */
  1151. public String setIntoStatus(BigDecimal intoingQty, BigDecimal intoQty) {
  1152. //入库状态
  1153. String intoStatus = null;
  1154. //已入库数量>0 入库中数量>0
  1155. if (intoQty.compareTo(BigDecimal.ZERO) >= 0 && intoingQty.compareTo(BigDecimal.ZERO) > 0) {
  1156. //入库中
  1157. intoStatus = Constant.IntoStatus.RUKUZHONG.getName();
  1158. }
  1159. //已入库数量=0 入库中数量=0
  1160. else if (intoQty.compareTo(BigDecimal.ZERO) == 0 && intoingQty.compareTo(BigDecimal.ZERO) == 0) {
  1161. //待入库
  1162. intoStatus = Constant.IntoStatus.DAIRUKU.getName();
  1163. }
  1164. //已入库数量>0 入库中数量=0
  1165. else if (intoQty.compareTo(BigDecimal.ZERO) > 0 && intoingQty.compareTo(BigDecimal.ZERO) == 0) {
  1166. //已入库
  1167. intoStatus = Constant.IntoStatus.YIRUKU.getName();
  1168. }
  1169. return intoStatus;
  1170. }
  1171. /**
  1172. * @desc : 上游单据入库状态通用(目前本页面)
  1173. * @date : 2024/4/1 17:14
  1174. * @author : 寇珊珊
  1175. */
  1176. public String setIntoStatus(BigDecimal intoingQty, BigDecimal intoQty, BigDecimal sumQty) {
  1177. //入库状态
  1178. String intoStatus = null;
  1179. //入库中+已入库 小于 总数
  1180. if (intoingQty.add(intoingQty).compareTo(sumQty) < 0) {
  1181. //入库中
  1182. intoStatus = Constant.IntoStatus.RUKUZHONG.getName();
  1183. }
  1184. //已入库数量=0 入库中数量=0
  1185. else if (intoQty.compareTo(BigDecimal.ZERO) == 0 && intoingQty.compareTo(BigDecimal.ZERO) == 0) {
  1186. //待入库
  1187. intoStatus = Constant.IntoStatus.DAIRUKU.getName();
  1188. }
  1189. //入库中+已入库 等于 总数
  1190. else if (intoingQty.add(intoingQty).compareTo(sumQty) == 0) {
  1191. //已入库
  1192. intoStatus = Constant.IntoStatus.YIRUKU.getName();
  1193. }
  1194. return intoStatus;
  1195. }
  1196. }