OrderService.java 30 KB

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