OrderService.java 33 KB

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