OrderService.java 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632
  1. package com.dk.mdm.service.sale;
  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.model.pojo.PageList;
  8. import com.dk.common.response.ResponseCodeEnum;
  9. import com.dk.common.response.ResponseResultUtil;
  10. import com.dk.common.response.ResponseResultVO;
  11. import com.dk.mdm.infrastructure.convert.mac.RecPayItemConvert;
  12. import com.dk.mdm.infrastructure.convert.sale.OrderConvert;
  13. import com.dk.mdm.infrastructure.convert.sale.OrderItemConvert;
  14. import com.dk.mdm.mapper.mac.AccountItemMapper;
  15. import com.dk.mdm.mapper.mac.RecPayItemMapper;
  16. import com.dk.mdm.mapper.mac.RecPayMapper;
  17. import com.dk.mdm.mapper.mst.CustomerMapper;
  18. import com.dk.mdm.mapper.mst.MoneyAccountItemMapper;
  19. import com.dk.mdm.mapper.mst.MoneyAccountMapper;
  20. import com.dk.mdm.mapper.sale.MultiOwnerMapper;
  21. import com.dk.mdm.mapper.sale.OrderItemMapper;
  22. import com.dk.mdm.mapper.sale.OrderMapper;
  23. import com.dk.mdm.model.pojo.mac.Account;
  24. import com.dk.mdm.model.pojo.mac.AccountItem;
  25. import com.dk.mdm.model.pojo.mac.RecPay;
  26. import com.dk.mdm.model.pojo.mac.RecPayItem;
  27. import com.dk.mdm.model.pojo.mst.Customer;
  28. import com.dk.mdm.model.pojo.mst.MoneyAccount;
  29. import com.dk.mdm.model.pojo.mst.MoneyAccountItem;
  30. import com.dk.mdm.model.pojo.sale.MultiOwner;
  31. import com.dk.mdm.model.pojo.sale.Order;
  32. import com.dk.common.service.BaseService;
  33. import com.dk.common.mapper.BaseMapper;
  34. import com.dk.mdm.model.pojo.sale.OrderItem;
  35. import com.dk.mdm.model.query.mac.RecPayItemQuery;
  36. import com.dk.mdm.model.query.mac.RecPayQuery;
  37. import com.dk.mdm.model.query.sale.OrderItemQuery;
  38. import com.dk.mdm.model.query.sale.OrderQuery;
  39. import com.dk.mdm.model.response.mac.RecPayItemResponse;
  40. import com.dk.mdm.model.response.mac.RecPayResponse;
  41. import com.dk.mdm.model.response.sale.OrderItemResponse;
  42. import com.dk.mdm.model.response.sale.OrderResponse;
  43. import com.dk.mdm.model.vo.mac.RecPayItemVO;
  44. import com.dk.mdm.model.vo.sale.OrderItemVO;
  45. import com.dk.mdm.model.vo.sale.OrderVO;
  46. import com.dk.mdm.service.common.CommonService;
  47. import com.dk.mdm.service.mac.AccountService;
  48. import com.dk.mdm.service.mac.RecPayItemService;
  49. import com.dk.mdm.service.mac.ReceiptService;
  50. import com.dk.mdm.service.mst.MoneyAccountService;
  51. import org.springframework.stereotype.Service;
  52. import org.springframework.beans.factory.annotation.Autowired;
  53. import org.springframework.transaction.annotation.Transactional;
  54. import java.math.BigDecimal;
  55. import java.time.LocalDate;
  56. import java.util.*;
  57. import java.util.stream.Collectors;
  58. @Service
  59. @Transactional
  60. public class OrderService extends BaseService<Order> {
  61. @Override
  62. public String getPrimaryKey() {
  63. return "order_id";
  64. }
  65. @Override
  66. public BaseMapper<Order> getRepository() {
  67. return orderMapper;
  68. }
  69. @Autowired
  70. private OrderMapper orderMapper;
  71. @Autowired
  72. private OrderItemService orderItemService;
  73. @Autowired
  74. private OrderItemMapper orderItemMapper;
  75. @Autowired
  76. private CommonService commonService;
  77. @Autowired
  78. private CustomerMapper customerMapper;
  79. @Autowired
  80. MultiOwnerMapper multiOwnerMapper;
  81. @Autowired
  82. private RecPayItemService recPayItemService;
  83. @Autowired
  84. ReceiptService receiptService;
  85. @Autowired
  86. private RecPayMapper recPayMapper;
  87. @Autowired
  88. private RecPayItemMapper recPayItemMapper;
  89. @Autowired
  90. private AccountService accountService;
  91. @Autowired
  92. private AccountItemMapper accountItemMapper;
  93. @Autowired
  94. private MoneyAccountService moneyAccountService;
  95. @Autowired
  96. private MoneyAccountMapper moneyAccountMapper;
  97. @Autowired
  98. private MoneyAccountItemMapper moneyAccountItemMapper;
  99. @Autowired
  100. private OrderConvert orderConvert;
  101. @Autowired
  102. private OrderItemConvert orderItemConvert;
  103. @Autowired
  104. private RecPayItemConvert recPayItemConvert;
  105. /**
  106. * @desc : 条件查询
  107. * @author : 付斌
  108. * @date : 2023/1/9 10:40
  109. */
  110. @Pagination
  111. public ResponseResultVO<PageList<OrderResponse>> selectByCond(OrderQuery orderQuery) {
  112. return super.mergeListWithCount(orderQuery, orderMapper.selectByCond(orderQuery),
  113. orderMapper.countByCond(orderQuery));
  114. }
  115. /**
  116. * @desc : 以销定采 查询
  117. * @author : 王英杰
  118. * @date : 2023/3/14 10:36
  119. */
  120. @Pagination
  121. public ResponseResultVO<PageList<OrderResponse>> purSaleSelectByCond(OrderQuery orderQuery) {
  122. return super.mergeListWithCount(orderQuery, orderMapper.purSaleSelectByCond(orderQuery),
  123. orderMapper.countByCond(orderQuery));
  124. }
  125. /**
  126. * @desc : 查询订单明细(货物、收款、附件)
  127. * @author : 付斌
  128. * @date : 2024-02-28 13:25
  129. */
  130. @Pagination
  131. public ResponseResultVO<Map<String, Object>> selectOrderInfoById(String id) {
  132. Map<String, Object> result = new HashMap<>();
  133. // 商品明细
  134. List<OrderItemResponse> orderItem = orderItemMapper.selectByCond(new OrderItemQuery().setOrderId(id));
  135. result.put("orderItem", orderItem);
  136. // 收款明细
  137. List<RecPayResponse> recPayList = recPayMapper.selectByCond(new RecPayQuery().setBiznisId(id));
  138. if(recPayList != null && recPayList.size() > 0){
  139. List<RecPayItemResponse> receiptItem = recPayItemMapper.selectByCond(new RecPayItemQuery().setRpId(recPayList.get(0).getRpId()));
  140. result.put("receiptItem", receiptItem);
  141. }else{
  142. result.put("receiptItem", new ArrayList<RecPayResponse>());
  143. }
  144. return ResponseResultUtil.success(result);
  145. }
  146. /**
  147. * @desc : 新建方法
  148. * @author : 付斌
  149. * @date : 2023/1/9 10:49
  150. */
  151. @Transactional(
  152. rollbackFor = {Exception.class}
  153. )
  154. public ResponseResultVO<?> insert(OrderVO orderVO) {
  155. // 如果没有客户id,要新建
  156. if (orderVO.getCusId() == null) {
  157. List<Customer> listCustomer = customerMapper.selectByCond(new Customer().setCpId(orderVO.getCpId()).setCusPhone(orderVO.getCusPhone()));
  158. // 如果客户电话已存在
  159. if (listCustomer.size() > 0) {
  160. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISEXISTS_CUSPHONE.getMessage());
  161. }
  162. // 创建客户,获取编码和主键UuId
  163. Map<String, Object> codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.CUSTOMER.getName(), true);
  164. Customer customer = new Customer();
  165. customer.setCusId(codeMap.get("outId").toString()).setCusCode(codeMap.get("outNote").toString()).setCusName(orderVO.getCusName())
  166. .setCusPhone(orderVO.getCusPhone()).setAddressArea(orderVO.getAddressArea()).setAddressName(orderVO.getAddressName())
  167. .setAddressNo(orderVO.getAddressNo()).setAddressGcj02(orderVO.getAddressGcj02()).setAddressFull(orderVO.getAddressFull())
  168. .setContactName(orderVO.getContactName()).setContactPhone(orderVO.getContactPhone()).setCusFrom(orderVO.getCusFrom())
  169. .setChannelId(orderVO.getSalesChannel()).setOrgId(orderVO.getOrgId()).setStaffId(orderVO.getStaffId())
  170. .setReportStaff(orderVO.getMakeStaff()).setSaleStatus(Constant.SaleStatus.CHENGJIAO.getName()).setCpId(orderVO.getCpId());
  171. customerMapper.insert(customer);
  172. orderVO.setCusId(customer.getCusId());
  173. }
  174. // 获取单号
  175. Map<String, Object> codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.ORDER.getName(), false);
  176. orderVO.setOrderId(codeMap.get("outId").toString()).setOrderNo(codeMap.get("outNote").toString())
  177. .setOrderType(Constant.DocumentType.ORDER.getName());
  178. // 转化实体
  179. Order order = orderConvert.convertToPo(orderVO);
  180. // 订单总单保存
  181. super.insert(order);
  182. // 业务部门业绩保存
  183. if (orderVO.getOrgList() != null && orderVO.getOrgList().size() > 0) {
  184. for (Map<String, Object> map : orderVO.getOrgList()) {
  185. MultiOwner multiOwner = new MultiOwner();
  186. multiOwner.setOrderId(order.getOrderId()).setOwnerId(map.get("orgId").toString())
  187. .setAllocationRatio(new BigDecimal(map.get("allocationRatio").toString())).setCpId(order.getCpId());
  188. if (Boolean.parseBoolean(map.get("ownerFlag").toString())) {
  189. multiOwner.setOwnerType(Constant.OwnerType.Z_ORG.getName());
  190. } else {
  191. multiOwner.setOwnerType(Constant.OwnerType.C_ORG.getName());
  192. }
  193. multiOwnerMapper.insert(multiOwner);
  194. }
  195. }
  196. // 业务员业绩保存
  197. if (orderVO.getStaffList() != null && orderVO.getStaffList().size() > 0) {
  198. for (Map<String, Object> map : orderVO.getStaffList()) {
  199. MultiOwner multiOwner = new MultiOwner();
  200. multiOwner.setOrderId(order.getOrderId()).setOwnerId(map.get("staffId").toString())
  201. .setAllocationRatio(new BigDecimal(map.get("allocationRatio").toString())).setCpId(order.getCpId());
  202. if (Boolean.parseBoolean(map.get("ownerFlag").toString())) {
  203. multiOwner.setOwnerType(Constant.OwnerType.Z_STAFF.getName());
  204. } else {
  205. multiOwner.setOwnerType(Constant.OwnerType.C_STAFF.getName());
  206. }
  207. multiOwnerMapper.insert(multiOwner);
  208. }
  209. }
  210. // 订单明细保存
  211. if (orderVO.getItemList() != null && orderVO.getItemList().size() > 0) {
  212. for (OrderItemVO orderItemVO : orderVO.getItemList()) {
  213. OrderItem orderItem = orderItemConvert.convertToPo(orderItemVO);
  214. orderItem.setOrderId(order.getOrderId()).setCpId(order.getCpId()).setOutStatus(Constant.OutStatus.DAICHUKU.getName());
  215. orderItemMapper.insert(orderItem);
  216. }
  217. }
  218. /**************************************** 客户收款begin ********************************/
  219. if (orderVO.getReceiptList() != null && orderVO.getReceiptList().size() > 0) {
  220. RecPay recPay = new RecPay();
  221. // 获取单号
  222. codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.RECPAY.getName(), false);
  223. recPay.setRpId(codeMap.get("outId").toString()).setRpNo(codeMap.get("outNote").toString())
  224. .setRpType(Constant.RpType.SHOU_KUAN.getName()).setObjectId(orderVO.getCusId())
  225. .setOrgId(orderVO.getOrgId()).setStaffId(orderVO.getStaffId()).setAccDate(LocalDate.now())
  226. .setBiznisType(Constant.InventoryDocCode.ORDER.getTableName()).setBiznisId(orderVO.getOrderId()).setBiznisNo(orderVO.getOrderNo())
  227. .setMakeStaff(orderVO.getMakeStaff()).setCpId(orderVO.getCpId());
  228. // 计算订单明细的出库中数量,金额合计
  229. RecPayItemVO itemSum = orderVO.getReceiptList().stream().reduce((x, y) -> {
  230. RecPayItemVO item = new RecPayItemVO();
  231. item.setAmtRec(x.getAmtRec().add(y.getAmtRec()));
  232. return item;
  233. }).get();
  234. recPay.setSumAmtRec(itemSum.getAmtRec());
  235. // 总单保存
  236. recPayMapper.insert(recPay);
  237. // 明细保存
  238. for (RecPayItemVO recPayItemVO : orderVO.getReceiptList()) {
  239. RecPayItem recPayItem = recPayItemConvert.convertToPo(recPayItemVO);
  240. recPayItem.setRpId(recPay.getRpId()).setCpId(recPay.getCpId()).setMakeStaff(recPay.getMakeStaff()).setAccDate(recPay.getAccDate());
  241. recPayItemMapper.insert(recPayItem);
  242. // 插入账款明细
  243. AccountItem accountItem = new AccountItem();
  244. accountItem.setAccItemType(Constant.accItemType.SHOU_KUAN.getName())
  245. .setObjectId(recPay.getObjectId()).setOrgId(recPay.getOrgId()).setStaffId(recPay.getStaffId())
  246. .setAccDate(recPay.getAccDate()).setRecStatus(Constant.recStatuse.QUE_DING.getName()).setAmtRec(recPayItem.getAmtRec())
  247. .setBiznisType(Constant.InventoryDocCode.REC_PAY_ITEM.getTableName()).setBiznisId(recPayItem.getItemId()).setBiznisNo(recPay.getRpNo())
  248. .setMakeStaff(recPay.getMakeStaff()).setCpId(recPay.getCpId());
  249. accountItemMapper.insert(accountItem);
  250. // 更新收款单上的账款明细Id
  251. RecPayItem recPayItemUpdate = new RecPayItem();
  252. recPayItemUpdate.setAccItemId(accountItem.getItemId()).setItemId(recPayItem.getItemId());
  253. recPayItemService.updateByUuid(recPayItemUpdate);
  254. // 插入资金流水
  255. MoneyAccountItem moneyAccountItem = new MoneyAccountItem();
  256. moneyAccountItem.setMacId(recPayItem.getMacId()).setFlowType(Constant.FlowType.SHOU_FU_KUAN.getName())
  257. .setInvoiceId(recPayItem.getItemId()).setAmtInflow(recPayItem.getAmtRec()).setAccDate(recPay.getAccDate())
  258. .setMakeStaff(recPayItem.getMakeStaff()).setCpId(recPayItem.getCpId());
  259. moneyAccountItemMapper.insert(moneyAccountItem);
  260. // 更新资金账户
  261. MoneyAccount moneyAccountForUpdate = moneyAccountMapper.selectByIdForUpdate(recPayItem.getMacId());
  262. MoneyAccount moneyAccountUpdate = new MoneyAccount();
  263. moneyAccountUpdate.setBalance(moneyAccountForUpdate.getBalance().add(recPayItem.getAmtRec()))
  264. .setMacId(moneyAccountForUpdate.getMacId());
  265. moneyAccountService.updateByUuid(moneyAccountUpdate);
  266. }
  267. // 插入账款总表
  268. Account accountForUpdate = accountService.getCusAccountForUpdate(recPay.getObjectId());
  269. // 更新账款总表上收款的相关字段
  270. Account accountUpdate = new Account();
  271. accountUpdate.setReceipt(accountForUpdate.getReceipt().add(recPay.getSumAmtRec()))// 总收款金额
  272. .setReceiptResidue(accountForUpdate.getReceiptResidue().add(recPay.getSumAmtRec()))// 可退金额
  273. .setObjectId(accountForUpdate.getObjectId());
  274. accountService.updateByUuid(accountUpdate);
  275. }
  276. /**************************************** 客户收款end ********************************/
  277. return ResponseResultUtil.success();
  278. }
  279. /**
  280. * @desc : 编辑方法
  281. * @author : 付斌
  282. * @date : 2023/1/9 10:49
  283. */
  284. @Transactional(
  285. rollbackFor = {Exception.class}
  286. )
  287. public ResponseResultVO<?> update(OrderVO orderVO) {
  288. // 明细实体(避免并发,需要再查一遍)
  289. OrderItem orderItemForUpdate;
  290. // 转化实体
  291. Order order = orderConvert.convertToPo(orderVO);
  292. //删除的
  293. List<OrderItemVO> deleteOrderItemVOList = orderVO.getDeleteItemList().stream().filter(it -> it.getItemId() != null).collect(Collectors.toList());
  294. if (deleteOrderItemVOList.size() > 0) {
  295. for (OrderItemVO orderItemVO : deleteOrderItemVOList) {
  296. orderItemForUpdate = orderItemMapper.selectByIdForUpdate(orderItemVO.getItemId());
  297. // 非待出库单据不能删除
  298. if (!Constant.OutStatus.DAICHUKU.getName().equals(orderItemForUpdate.getOutStatus())) {
  299. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.NO_WAIT_INTO.getMessage());
  300. } else {
  301. orderItemMapper.deleteById(orderItemVO.getItemId());
  302. }
  303. }
  304. }
  305. // 新增的
  306. List<OrderItemVO> insertOrderItemVOList = orderVO.getItemList().stream().filter(it -> it.getItemId() == null).collect(Collectors.toList());
  307. for (OrderItemVO orderItemVO : insertOrderItemVOList) {
  308. OrderItem orderItem = orderItemConvert.convertToPo(orderItemVO);
  309. orderItem.setOrderId(order.getOrderId()).setCpId(order.getCpId()).setOutStatus(Constant.OutStatus.DAICHUKU.getName());
  310. orderItemMapper.insert(orderItem);
  311. }
  312. // 编辑的
  313. List<OrderItemVO> editOrderItemVOList = orderVO.getItemList().stream().filter(it -> it.getItemId() != null).collect(Collectors.toList());
  314. for (OrderItemVO orderItemVO : editOrderItemVOList) {
  315. orderItemForUpdate = orderItemMapper.selectByIdForUpdate(orderItemVO.getItemId());
  316. // 商品数量不能小于(出库中数量+已出库数量)
  317. if (orderItemVO.getItemQty().compareTo(orderItemForUpdate.getOutingQty().add(orderItemForUpdate.getOutQty())) == -1) {
  318. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ITEMQTY_NO_LESS_OUTQTY.getMessage());
  319. }
  320. OrderItem orderItem = orderItemConvert.convertToPo(orderItemVO);
  321. orderItemService.updateByUuid(orderItem);
  322. }
  323. // 删除业绩信息
  324. multiOwnerMapper.deleteByOrderId(order.getOrderId());
  325. // 重新保存业绩信息
  326. // 业务部门业绩保存
  327. if (orderVO.getOrgList() != null && orderVO.getOrgList().size() > 0) {
  328. for (Map<String, Object> map : orderVO.getOrgList()) {
  329. MultiOwner multiOwner = new MultiOwner();
  330. multiOwner.setOrderId(order.getOrderId()).setOwnerId(map.get("orgId").toString())
  331. .setAllocationRatio(new BigDecimal(map.get("allocationRatio").toString())).setCpId(order.getCpId());
  332. if (Boolean.parseBoolean(map.get("ownerFlag").toString())) {
  333. multiOwner.setOwnerType(Constant.OwnerType.Z_ORG.getName());
  334. } else {
  335. multiOwner.setOwnerType(Constant.OwnerType.C_ORG.getName());
  336. }
  337. multiOwnerMapper.insert(multiOwner);
  338. }
  339. }
  340. // 业务员业绩保存
  341. if (orderVO.getStaffList() != null && orderVO.getStaffList().size() > 0) {
  342. for (Map<String, Object> map : orderVO.getStaffList()) {
  343. MultiOwner multiOwner = new MultiOwner();
  344. multiOwner.setOrderId(order.getOrderId()).setOwnerId(map.get("staffId").toString())
  345. .setAllocationRatio(new BigDecimal(map.get("allocationRatio").toString())).setCpId(order.getCpId());
  346. if (Boolean.parseBoolean(map.get("ownerFlag").toString())) {
  347. multiOwner.setOwnerType(Constant.OwnerType.Z_STAFF.getName());
  348. } else {
  349. multiOwner.setOwnerType(Constant.OwnerType.C_STAFF.getName());
  350. }
  351. multiOwnerMapper.insert(multiOwner);
  352. }
  353. }
  354. // 更新总单
  355. super.update(order, new UpdateWrapper<Order>().lambda().eq(Order::getOrderId,
  356. UUID.fromString(order.getOrderId())));
  357. /**************************************** 客户收款begin ********************************/
  358. // 需要重新计算的资金账户
  359. List<String> macList = new ArrayList<>();
  360. // 收款明细
  361. RecPay recPayForUpdate = recPayMapper.selectByBiznisIdForUpdate(orderVO.getOrderId());
  362. if(recPayForUpdate != null){
  363. // 将之前的明细全部删除
  364. List<RecPayItem> recPayItemOriginalList = recPayItemMapper.selectByZIdForUpdate(recPayForUpdate.getRpId());
  365. for (RecPayItem recPayItem : recPayItemOriginalList) {
  366. // 删除收付款明细
  367. recPayItemMapper.deleteById(recPayItem.getItemId());
  368. // 删除账款明细
  369. accountItemMapper.deleteById(recPayItem.getAccItemId());
  370. // 删除账户流水
  371. moneyAccountItemMapper.deleteByInvoiceId(recPayItem.getItemId());
  372. if (!macList.contains(recPayItem.getMacId())) {
  373. macList.add(recPayItem.getMacId());
  374. }
  375. }
  376. }
  377. if (orderVO.getReceiptList() != null && orderVO.getReceiptList().size() > 0) {
  378. // 计算订单明细的出库中数量,金额合计
  379. RecPayItemVO itemSum = orderVO.getReceiptList().stream().reduce((x, y) -> {
  380. RecPayItemVO item = new RecPayItemVO();
  381. item.setAmtRec(x.getAmtRec().add(y.getAmtRec()));
  382. return item;
  383. }).get();
  384. RecPay recPay = null;
  385. if(recPayForUpdate == null){
  386. recPay = new RecPay();
  387. // 获取单号
  388. Map<String, Object> codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.RECPAY.getName(), false);
  389. recPay.setRpId(codeMap.get("outId").toString()).setRpNo(codeMap.get("outNote").toString())
  390. .setRpType(Constant.RpType.SHOU_KUAN.getName()).setObjectId(orderVO.getCusId())
  391. .setOrgId(orderVO.getOrgId()).setStaffId(orderVO.getStaffId()).setAccDate(LocalDate.now())
  392. .setBiznisType(Constant.InventoryDocCode.ORDER.getTableName()).setBiznisId(orderVO.getOrderId()).setBiznisNo(orderVO.getOrderNo())
  393. .setMakeStaff(orderVO.getMakeStaff()).setCpId(orderVO.getCpId());
  394. recPay.setSumAmtRec(itemSum.getAmtRec());
  395. recPayMapper.insert(recPay);
  396. }else{
  397. // 更新收款总额
  398. RecPay recPayUpdate = new RecPay();
  399. recPayUpdate.setSumAmtRec(itemSum.getAmtRec()).setRpId(recPayForUpdate.getRpId());
  400. receiptService.updateByUuid(recPayUpdate);
  401. // 赋值recPay,下面要用
  402. recPay = recPayForUpdate;
  403. }
  404. // 明细保存
  405. for (RecPayItemVO recPayItemVO : orderVO.getReceiptList()) {
  406. RecPayItem recPayItem = recPayItemConvert.convertToPo(recPayItemVO);
  407. recPayItem.setItemId(null).setRpId(recPay.getRpId()).setCpId(recPay.getCpId()).setMakeStaff(recPay.getMakeStaff()).setAccDate(recPay.getAccDate());
  408. recPayItemMapper.insert(recPayItem);
  409. // 插入账款明细
  410. AccountItem accountItem = new AccountItem();
  411. accountItem.setAccItemType(Constant.accItemType.SHOU_KUAN.getName())
  412. .setObjectId(recPay.getObjectId()).setOrgId(recPay.getOrgId()).setStaffId(recPay.getStaffId())
  413. .setAccDate(recPay.getAccDate()).setRecStatus(Constant.recStatuse.QUE_DING.getName()).setAmtRec(recPayItem.getAmtRec())
  414. .setBiznisType(Constant.InventoryDocCode.REC_PAY_ITEM.getTableName()).setBiznisId(recPayItem.getItemId()).setBiznisNo(recPay.getRpNo())
  415. .setMakeStaff(recPay.getMakeStaff()).setCpId(recPay.getCpId());
  416. accountItemMapper.insert(accountItem);
  417. // 更新收款单上的账款明细Id
  418. RecPayItem recPayItemUpdate = new RecPayItem();
  419. recPayItemUpdate.setAccItemId(accountItem.getItemId()).setItemId(recPayItem.getItemId());
  420. recPayItemService.updateByUuid(recPayItemUpdate);
  421. // 插入资金流水
  422. MoneyAccountItem moneyAccountItem = new MoneyAccountItem();
  423. moneyAccountItem.setMacId(recPayItem.getMacId()).setFlowType(Constant.FlowType.SHOU_FU_KUAN.getName())
  424. .setInvoiceId(recPayItem.getItemId()).setAmtInflow(recPayItem.getAmtRec()).setAccDate(recPay.getAccDate())
  425. .setMakeStaff(recPayItem.getMakeStaff()).setCpId(recPayItem.getCpId());
  426. moneyAccountItemMapper.insert(moneyAccountItem);
  427. if (!macList.contains(recPayItem.getMacId())) {
  428. macList.add(recPayItem.getMacId());
  429. }
  430. }
  431. }
  432. if(recPayForUpdate != null) {
  433. // 更新总账表的总收款额和可用额
  434. accountService.updateReceipt(recPayForUpdate.getObjectId());
  435. }
  436. // 更新账户余额
  437. for (String macId : macList) {
  438. accountService.updateMac(macId);
  439. }
  440. /**************************************** 客户收款end ********************************/
  441. return ResponseResultUtil.success();
  442. }
  443. /**
  444. * @desc : 作废
  445. * @author : 付斌
  446. * @date : 2024-03-08 16:38
  447. */
  448. public ResponseResultVO<?> invalid(String id) {
  449. Order orderForUpdate = orderMapper.selectByIdForUpdate(id);
  450. // 并发校验
  451. if (!orderForUpdate.getFlgValid()) {
  452. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISFLGVALID_FALSE.getMessage());
  453. }
  454. // 如果出库中数量或已出库数量不是0,不能作废
  455. if (orderForUpdate.getOutingQty().compareTo(BigDecimal.ZERO) != 0 || orderForUpdate.getOutQty().compareTo(BigDecimal.ZERO) != 0) {
  456. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISEXISTS_AFTER_OPERATE.getMessage());
  457. }
  458. // 作废
  459. Order orderUpdate = new Order();
  460. orderUpdate.setFlgValid(false).setOrderId(id);
  461. super.update(orderUpdate, new UpdateWrapper<Order>().lambda().eq(Order::getOrderId,
  462. UUID.fromString(orderUpdate.getOrderId())));
  463. // 需要重新计算的资金账户
  464. List<String> macList = new ArrayList<>();
  465. // 收款明细
  466. RecPay recPayForUpdate = recPayMapper.selectByBiznisIdForUpdate(id);
  467. if(recPayForUpdate != null){
  468. // 将之前的明细全部删除
  469. List<RecPayItem> recPayItemOriginalList = recPayItemMapper.selectByZIdForUpdate(recPayForUpdate.getRpId());
  470. for (RecPayItem recPayItem : recPayItemOriginalList) {
  471. // 删除收付款明细
  472. recPayItemMapper.deleteById(recPayItem.getItemId());
  473. // 删除账款明细
  474. accountItemMapper.deleteById(recPayItem.getAccItemId());
  475. // 删除账户流水
  476. moneyAccountItemMapper.deleteByInvoiceId(recPayItem.getItemId());
  477. if (!macList.contains(recPayItem.getMacId())) {
  478. macList.add(recPayItem.getMacId());
  479. }
  480. }
  481. // 更新总账表的总收款额和可用额
  482. accountService.updateReceipt(recPayForUpdate.getObjectId());
  483. // 更新账户余额
  484. for (String macId : macList) {
  485. accountService.updateMac(macId);
  486. }
  487. // 作废
  488. RecPay recPayUpdate = new RecPay();
  489. recPayUpdate.setFlgValid(false).setRpId(id);
  490. receiptService.updateByUuid(recPayUpdate);
  491. }
  492. return ResponseResultUtil.success();
  493. }
  494. /**
  495. * @desc : 获取订单信息(编辑用)
  496. * @author : 付斌
  497. * @date : 2024-03-02 17:27
  498. */
  499. public ResponseResultVO<?> getOrderForUpdate(String id) {
  500. Map<String, Object> dataInfo = new HashMap<>();
  501. OrderResponse orderResponse = orderMapper.selectById(id);
  502. dataInfo.put("data", orderResponse);
  503. // 商品明细
  504. List<OrderItemResponse> orderItemResponse = orderItemMapper.selectByCond(new OrderItemQuery().setOrderId(id));
  505. dataInfo.put("dataItem", orderItemResponse);
  506. // 收款明细
  507. List<RecPayResponse> recPayList = recPayMapper.selectByCond(new RecPayQuery().setBiznisId(id));
  508. if(recPayList != null && recPayList.size() > 0){
  509. List<RecPayItemResponse> receiptItem = recPayItemMapper.selectByCond(new RecPayItemQuery().setRpId(recPayList.get(0).getRpId()));
  510. dataInfo.put("receiptItem", receiptItem);
  511. }else{
  512. dataInfo.put("receiptItem", new ArrayList<RecPayResponse>());
  513. }
  514. return ResponseResultUtil.success(dataInfo);
  515. }
  516. /**
  517. * @desc : 获取订单信息(出库用)
  518. * @author : 付斌
  519. * @date : 2024-03-02 17:27
  520. */
  521. public ResponseResultVO<?> getOrderForOut(String id) {
  522. Map<String, Object> dataInfo = new HashMap<>();
  523. OrderResponse orderResponse = orderMapper.selectById(id);
  524. dataInfo.put("data", orderResponse);
  525. // 商品明细
  526. List<OrderItemResponse> orderItem = orderItemMapper.selectByCondForOut(new OrderItemQuery().setOrderId(id));
  527. dataInfo.put("dataItem", orderItem);
  528. return ResponseResultUtil.success(dataInfo);
  529. }
  530. /**
  531. * @desc : 获取订单信息(退货用)
  532. * @author : 付斌
  533. * @date : 2024-03-02 17:27
  534. */
  535. public ResponseResultVO<?> getOrderForReturn(String id) {
  536. Map<String, Object> dataInfo = new HashMap<>();
  537. OrderResponse orderResponse = orderMapper.selectById(id);
  538. // 数量金额取反
  539. orderResponse.setSumQuantity(orderResponse.getSumQuantity().negate()).setSumAmount(orderResponse.getSumAmount().negate());
  540. dataInfo.put("data", orderResponse);
  541. // 商品明细
  542. List<OrderItemResponse> orderItem = orderItemMapper.selectByCondForReturn(new OrderItemQuery().setOrderId(id));
  543. dataInfo.put("dataItem", orderItem);
  544. return ResponseResultUtil.success(dataInfo);
  545. }
  546. /**
  547. * @desc : 条件查询(总单带明细)
  548. * @author : 于继渤
  549. * @date : 2023/1/9 10:36
  550. */
  551. @Pagination
  552. public ResponseResultVO<PageList<OrderResponse>> selectTotalSingleTapeDetailPage(OrderQuery orderQuery) {
  553. return super.mergeListWithCount(orderQuery, orderMapper.selectByCondDetail(orderQuery),
  554. orderMapper.countByCondDetail(orderQuery));
  555. }
  556. }