OrderService.java 34 KB

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