OrderService.java 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761
  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. // 增加跟进人,用于权限分配
  187. List<String> followStaffs = new ArrayList<>();
  188. followStaffs.add(orderVO.getMakeStaff());
  189. customer.setCusId(codeMap.get("outId").toString()).setCusCode(codeMap.get("outNote").toString()).setCusName(orderVO.getCusName())
  190. .setCusPhone(orderVO.getCusPhone()).setAddressArea(orderVO.getAddressArea()).setAddressName(orderVO.getAddressName())
  191. .setAddressNo(orderVO.getAddressNo()).setAddressGcj02(orderVO.getAddressGcj02()).setAddressFull(orderVO.getAddressFull())
  192. .setContactName(orderVO.getContactName()).setContactPhone(orderVO.getContactPhone()).setCusFrom(orderVO.getCusFrom())
  193. .setChannelId(orderVO.getSalesChannel()).setOrgId(orderVO.getOrgId()).setStaffId(orderVO.getStaffId())
  194. .setFollowStaffs(followStaffs)
  195. .setReportStaff(orderVO.getMakeStaff()).setSaleStatus(Constant.SaleStatus.CHENGJIAO.getName()).setCpId(orderVO.getCpId());
  196. customerMapper.insert(customer);
  197. orderVO.setCusId(customer.getCusId());
  198. }else{
  199. // 如果当前跟进人
  200. Customer cus = customerMapper.selectByIdForUpdate(orderVO.getCusId());
  201. List<String> followStaffs = cus.getFollowStaffs();
  202. Boolean updateFollowFlag = false;
  203. if(followStaffs == null ){
  204. followStaffs.add(orderVO.getMakeStaff());
  205. updateFollowFlag = true;
  206. }else{
  207. if(!followStaffs.contains(orderVO.getMakeStaff())){
  208. followStaffs.add(orderVO.getMakeStaff());
  209. updateFollowFlag = true;
  210. }
  211. }
  212. if(updateFollowFlag){
  213. // 更新当前跟进人
  214. customerMapper.updateFollowStaffs(new Customer().setCusId(orderVO.getCusId())
  215. .setFollowStaffs(followStaffs));
  216. }
  217. }
  218. // 获取单号
  219. Map<String, Object> codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.ORDER.getName(), false);
  220. orderVO.setOrderId(codeMap.get("outId").toString()).setOrderNo(codeMap.get("outNote").toString())
  221. .setOrderType(Constant.DocumentType.ORDER.getName());
  222. // 转化实体
  223. Order order = orderConvert.convertToPo(orderVO);
  224. // 订单总单保存
  225. super.insert(order);
  226. // 业务部门业绩保存
  227. if (orderVO.getOrgList() != null && orderVO.getOrgList().size() > 0) {
  228. for (Map<String, Object> map : orderVO.getOrgList()) {
  229. MultiOwner multiOwner = new MultiOwner();
  230. multiOwner.setOrderId(order.getOrderId()).setOwnerId(map.get("orgId").toString())
  231. .setAllocationRatio(new BigDecimal(map.get("allocationRatio").toString())).setCpId(order.getCpId());
  232. if (Boolean.parseBoolean(map.get("ownerFlag").toString())) {
  233. multiOwner.setOwnerType(Constant.OwnerType.Z_ORG.getName());
  234. } else {
  235. multiOwner.setOwnerType(Constant.OwnerType.C_ORG.getName());
  236. }
  237. multiOwnerMapper.insert(multiOwner);
  238. }
  239. }
  240. // 业务员业绩保存
  241. if (orderVO.getStaffList() != null && orderVO.getStaffList().size() > 0) {
  242. for (Map<String, Object> map : orderVO.getStaffList()) {
  243. MultiOwner multiOwner = new MultiOwner();
  244. multiOwner.setOrderId(order.getOrderId()).setOwnerId(map.get("staffId").toString())
  245. .setAllocationRatio(new BigDecimal(map.get("allocationRatio").toString())).setCpId(order.getCpId());
  246. if (Boolean.parseBoolean(map.get("ownerFlag").toString())) {
  247. multiOwner.setOwnerType(Constant.OwnerType.Z_STAFF.getName());
  248. } else {
  249. multiOwner.setOwnerType(Constant.OwnerType.C_STAFF.getName());
  250. }
  251. multiOwnerMapper.insert(multiOwner);
  252. }
  253. }
  254. // 订单明细保存
  255. if (orderVO.getItemList() != null && orderVO.getItemList().size() > 0) {
  256. for (OrderItemVO orderItemVO : orderVO.getItemList()) {
  257. OrderItem orderItem = orderItemConvert.convertToPo(orderItemVO);
  258. orderItem.setOrderId(order.getOrderId()).setCpId(order.getCpId()).setOutStatus(Constant.OutStatus.DAICHUKU.getName());
  259. orderItemMapper.insert(orderItem);
  260. }
  261. }
  262. /**************************************** 客户收款begin ********************************/
  263. if (orderVO.getReceiptList() != null && orderVO.getReceiptList().size() > 0) {
  264. RecPay recPay = new RecPay();
  265. // 获取单号
  266. codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.RECPAY.getName(), false);
  267. recPay.setRpId(codeMap.get("outId").toString()).setRpNo(codeMap.get("outNote").toString())
  268. .setRpType(Constant.RpType.SHOU_KUAN.getName()).setObjectId(orderVO.getCusId())
  269. .setOrgId(orderVO.getOrgId()).setStaffId(orderVO.getStaffId()).setAccDate(LocalDate.now())
  270. .setBiznisType(Constant.InventoryDocCode.ORDER.getTableName()).setBiznisId(orderVO.getOrderId()).setBiznisNo(orderVO.getOrderNo())
  271. .setMakeStaff(orderVO.getMakeStaff()).setCpId(orderVO.getCpId()).setFlgLock(true);
  272. // 计算订单明细的出库中数量,金额合计
  273. RecPayItemVO itemSum = orderVO.getReceiptList().stream().reduce((x, y) -> {
  274. RecPayItemVO item = new RecPayItemVO();
  275. item.setAmtRec(x.getAmtRec().add(y.getAmtRec()));
  276. return item;
  277. }).get();
  278. recPay.setSumAmtRec(itemSum.getAmtRec());
  279. // 总单保存
  280. recPayMapper.insert(recPay);
  281. // 明细保存
  282. for (RecPayItemVO recPayItemVO : orderVO.getReceiptList()) {
  283. RecPayItem recPayItem = recPayItemConvert.convertToPo(recPayItemVO);
  284. recPayItem.setRpId(recPay.getRpId()).setCpId(recPay.getCpId()).setMakeStaff(recPay.getMakeStaff()).setAccDate(recPay.getAccDate());
  285. recPayItemMapper.insert(recPayItem);
  286. // 插入账款明细
  287. AccountItem accountItem = new AccountItem();
  288. accountItem.setAccItemType(Constant.accItemType.SHOU_KUAN.getName())
  289. .setObjectId(recPay.getObjectId()).setOrgId(recPay.getOrgId()).setStaffId(recPay.getStaffId())
  290. .setAccDate(recPay.getAccDate()).setRecStatus(Constant.recStatuse.QUE_DING.getName()).setAmtRec(recPayItem.getAmtRec())
  291. .setBiznisType(Constant.InventoryDocCode.REC_PAY_ITEM.getTableName()).setBiznisId(recPayItem.getItemId()).setBiznisNo(recPay.getRpNo())
  292. .setMakeStaff(recPay.getMakeStaff()).setCpId(recPay.getCpId()).setFlgLock(true);
  293. accountItemMapper.insert(accountItem);
  294. // 更新收款单上的账款明细Id
  295. RecPayItem recPayItemUpdate = new RecPayItem();
  296. recPayItemUpdate.setAccItemId(accountItem.getItemId()).setItemId(recPayItem.getItemId());
  297. recPayItemService.updateByUuid(recPayItemUpdate);
  298. // 插入资金流水
  299. MoneyAccountItem moneyAccountItem = new MoneyAccountItem();
  300. moneyAccountItem.setMacId(recPayItem.getMacId()).setFlowType(Constant.FlowType.SHOU_FU_KUAN.getName())
  301. .setInvoiceId(recPayItem.getItemId()).setAmtInflow(recPayItem.getAmtRec()).setAccDate(recPay.getAccDate())
  302. .setMakeStaff(recPayItem.getMakeStaff()).setCpId(recPayItem.getCpId());
  303. moneyAccountItemMapper.insert(moneyAccountItem);
  304. // 更新资金账户
  305. MoneyAccount moneyAccountForUpdate = moneyAccountMapper.selectByIdForUpdate(recPayItem.getMacId());
  306. MoneyAccount moneyAccountUpdate = new MoneyAccount();
  307. moneyAccountUpdate.setBalance(moneyAccountForUpdate.getBalance().add(recPayItem.getAmtRec()))
  308. .setMacId(moneyAccountForUpdate.getMacId());
  309. moneyAccountService.updateByUuid(moneyAccountUpdate);
  310. }
  311. // 插入账款总表
  312. Account accountForUpdate = accountService.getCusAccountForUpdate(recPay.getObjectId());
  313. // 更新账款总表上收款的相关字段
  314. Account accountUpdate = new Account();
  315. accountUpdate.setReceiptLock(accountForUpdate.getReceiptLock().add(recPay.getSumAmtRec()))// 锁定金额
  316. .setObjectId(accountForUpdate.getObjectId());
  317. accountService.updateByUuid(accountUpdate);
  318. }
  319. /**************************************** 客户收款end ********************************/
  320. //开单并出库办理
  321. if (orderVO.getOutboundProcessingFlag()!=null&& orderVO.getOutboundProcessingFlag()){
  322. for (OrderItemVO orderItemVO : orderVO.getItemList()) {
  323. orderItemVO.setOutingQty(orderItemVO.getItemQty());
  324. orderItemVO.setOutingAmt(orderItemVO.getItemAmt());
  325. orderItemVO.setPriceOut(orderItemVO.getPriceSale());
  326. orderItemVO.setFromId(orderVO.getOrderId());
  327. orderItemVO.setFromItemId(orderItemVO.getFromItemId());
  328. }
  329. OutboundVO outboundVO = outBoundDtoConvert.convertToPo(orderVO);
  330. outboundVO.setOutDate(LocalDate.now());
  331. outboundVO.setOutingQty(orderVO.getSumQuantity());
  332. outboundVO.setOutingAmt(orderVO.getSumAmount());
  333. outboundVO.setFlgAutoHandle(orderVO.getFlgAutoHandle());
  334. outboundVO.setFlgHandleSetting(orderVO.getFlgHandleSetting());
  335. outboundSaleOrderService.inventoryOUtBond(outboundVO);
  336. }
  337. return ResponseResultUtil.success();
  338. }
  339. /**
  340. * @desc : 编辑方法
  341. * @author : 付斌
  342. * @date : 2023/1/9 10:49
  343. */
  344. @Transactional(
  345. rollbackFor = {Exception.class}
  346. )
  347. public ResponseResultVO<?> update(OrderVO orderVO) {
  348. Order orderForUpdate = orderMapper.selectByIdForUpdate(orderVO.getOrderId());
  349. // 并发校验
  350. if (!orderForUpdate.getFlgValid()) {
  351. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISFLGVALID_FALSE.getMessage());
  352. }
  353. // 如果全部出库了
  354. if (orderForUpdate.getSumQuantity().compareTo(orderForUpdate.getOutQty()) == 0) {
  355. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ORDER_IS_OUT.getMessage());
  356. }
  357. // 明细实体(避免并发,需要再查一遍)
  358. OrderItem orderItemForUpdate;
  359. // 转化实体
  360. Order order = orderConvert.convertToPo(orderVO);
  361. //删除的
  362. if(orderVO.getDeleteItemList() != null){
  363. List<OrderItemVO> deleteOrderItemVOList = orderVO.getDeleteItemList().stream().filter(it -> it.getItemId() != null).collect(Collectors.toList());
  364. if (deleteOrderItemVOList.size() > 0) {
  365. for (OrderItemVO orderItemVO : deleteOrderItemVOList) {
  366. orderItemForUpdate = orderItemMapper.selectByIdForUpdate(orderItemVO.getItemId());
  367. // 非待出库单据不能删除
  368. if (!Constant.OutStatus.DAICHUKU.getName().equals(orderItemForUpdate.getOutStatus())) {
  369. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.NO_WAIT_INTO.getMessage());
  370. } else {
  371. orderItemMapper.deleteById(orderItemVO.getItemId());
  372. }
  373. }
  374. }
  375. }
  376. // 新增的
  377. List<OrderItemVO> insertOrderItemVOList = orderVO.getItemList().stream().filter(it -> it.getItemId() == null).collect(Collectors.toList());
  378. for (OrderItemVO orderItemVO : insertOrderItemVOList) {
  379. OrderItem orderItem = orderItemConvert.convertToPo(orderItemVO);
  380. orderItem.setOrderId(order.getOrderId()).setCpId(order.getCpId()).setOutStatus(Constant.OutStatus.DAICHUKU.getName());
  381. orderItemMapper.insert(orderItem);
  382. }
  383. // 编辑的
  384. List<OrderItemVO> editOrderItemVOList = orderVO.getItemList().stream().filter(it -> it.getItemId() != null).collect(Collectors.toList());
  385. for (OrderItemVO orderItemVO : editOrderItemVOList) {
  386. orderItemForUpdate = orderItemMapper.selectByIdForUpdate(orderItemVO.getItemId());
  387. // 出库数量
  388. BigDecimal outintOrOutQty = orderItemForUpdate.getOutingQty().add(orderItemForUpdate.getOutQty());
  389. // 商品数量不能小于(出库中数量+已出库数量)
  390. if (orderItemVO.getItemQty().compareTo(outintOrOutQty) == -1) {
  391. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ITEMQTY_NO_LESS_OUTQTY.getMessage());
  392. }
  393. // 如果出库数量不是0,则不能改仓库
  394. if (outintOrOutQty.compareTo(BigDecimal.ZERO) != 0) {
  395. if (!orderItemForUpdate.getWhId().equals(orderItemVO.getWhId())) {
  396. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ORDER_ISOUT.getMessage());
  397. }
  398. }
  399. OrderItem orderItem = orderItemConvert.convertToPo(orderItemVO);
  400. orderItemService.updateByUuid(orderItem);
  401. }
  402. // 删除业绩信息
  403. multiOwnerMapper.deleteByOrderId(order.getOrderId());
  404. // 重新保存业绩信息
  405. // 业务部门业绩保存
  406. if (orderVO.getOrgList() != null && orderVO.getOrgList().size() > 0) {
  407. for (Map<String, Object> map : orderVO.getOrgList()) {
  408. MultiOwner multiOwner = new MultiOwner();
  409. multiOwner.setOrderId(order.getOrderId()).setOwnerId(map.get("orgId").toString())
  410. .setAllocationRatio(new BigDecimal(map.get("allocationRatio").toString())).setCpId(order.getCpId());
  411. if (Boolean.parseBoolean(map.get("ownerFlag").toString())) {
  412. multiOwner.setOwnerType(Constant.OwnerType.Z_ORG.getName());
  413. } else {
  414. multiOwner.setOwnerType(Constant.OwnerType.C_ORG.getName());
  415. }
  416. multiOwnerMapper.insert(multiOwner);
  417. }
  418. }
  419. // 业务员业绩保存
  420. if (orderVO.getStaffList() != null && orderVO.getStaffList().size() > 0) {
  421. for (Map<String, Object> map : orderVO.getStaffList()) {
  422. MultiOwner multiOwner = new MultiOwner();
  423. multiOwner.setOrderId(order.getOrderId()).setOwnerId(map.get("staffId").toString())
  424. .setAllocationRatio(new BigDecimal(map.get("allocationRatio").toString())).setCpId(order.getCpId());
  425. if (Boolean.parseBoolean(map.get("ownerFlag").toString())) {
  426. multiOwner.setOwnerType(Constant.OwnerType.Z_STAFF.getName());
  427. } else {
  428. multiOwner.setOwnerType(Constant.OwnerType.C_STAFF.getName());
  429. }
  430. multiOwnerMapper.insert(multiOwner);
  431. }
  432. }
  433. // 更新总单
  434. super.update(order, new UpdateWrapper<Order>().lambda().eq(Order::getOrderId,
  435. UUID.fromString(order.getOrderId())));
  436. /**************************************** 客户收款begin ********************************/
  437. // 需要重新计算的资金账户
  438. List<String> macList = new ArrayList<>();
  439. // 收款明细
  440. RecPay recPayForUpdate = recPayMapper.selectByBiznisIdForUpdate(orderVO.getOrderId(), false);
  441. if (recPayForUpdate != null) {
  442. // 将之前的明细全部删除
  443. List<RecPayItem> recPayItemOriginalList = recPayItemMapper.selectByZIdForUpdate(recPayForUpdate.getRpId());
  444. for (RecPayItem recPayItem : recPayItemOriginalList) {
  445. // 删除收付款明细
  446. recPayItemMapper.deleteById(recPayItem.getItemId());
  447. // 删除账款明细
  448. accountItemMapper.deleteById(recPayItem.getAccItemId());
  449. // 删除账户流水
  450. moneyAccountItemMapper.deleteByInvoiceId(recPayItem.getItemId());
  451. if (!macList.contains(recPayItem.getMacId())) {
  452. macList.add(recPayItem.getMacId());
  453. }
  454. }
  455. }
  456. if (orderVO.getReceiptList() != null && orderVO.getReceiptList().size() > 0) {
  457. // 计算订单明细的出库中数量,金额合计
  458. RecPayItemVO itemSum = orderVO.getReceiptList().stream().reduce((x, y) -> {
  459. RecPayItemVO item = new RecPayItemVO();
  460. item.setAmtRec(x.getAmtRec().add(y.getAmtRec()));
  461. return item;
  462. }).get();
  463. RecPay recPay = null;
  464. if (recPayForUpdate == null) {
  465. recPay = new RecPay();
  466. // 获取单号
  467. Map<String, Object> codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.RECPAY.getName(), false);
  468. recPay.setRpId(codeMap.get("outId").toString()).setRpNo(codeMap.get("outNote").toString())
  469. .setRpType(Constant.RpType.SHOU_KUAN.getName()).setObjectId(orderVO.getCusId())
  470. .setOrgId(orderVO.getOrgId()).setStaffId(orderVO.getStaffId()).setAccDate(LocalDate.now())
  471. .setBiznisType(Constant.InventoryDocCode.ORDER.getTableName()).setBiznisId(orderVO.getOrderId()).setBiznisNo(orderVO.getOrderNo())
  472. .setMakeStaff(orderVO.getMakeStaff()).setCpId(orderVO.getCpId()).setFlgLock(true);
  473. recPay.setSumAmtRec(itemSum.getAmtRec());
  474. recPayMapper.insert(recPay);
  475. } else {
  476. // 更新收款总额
  477. RecPay recPayUpdate = new RecPay();
  478. recPayUpdate.setSumAmtRec(itemSum.getAmtRec()).setRpId(recPayForUpdate.getRpId());
  479. receiptService.updateByUuid(recPayUpdate);
  480. // 赋值recPay,下面要用
  481. recPay = recPayForUpdate;
  482. }
  483. // 明细保存
  484. for (RecPayItemVO recPayItemVO : orderVO.getReceiptList()) {
  485. RecPayItem recPayItem = recPayItemConvert.convertToPo(recPayItemVO);
  486. recPayItem.setItemId(null).setRpId(recPay.getRpId()).setCpId(recPay.getCpId()).setMakeStaff(recPay.getMakeStaff()).setAccDate(recPay.getAccDate());
  487. recPayItemMapper.insert(recPayItem);
  488. // 插入账款明细
  489. AccountItem accountItem = new AccountItem();
  490. accountItem.setAccItemType(Constant.accItemType.SHOU_KUAN.getName())
  491. .setObjectId(recPay.getObjectId()).setOrgId(recPay.getOrgId()).setStaffId(recPay.getStaffId())
  492. .setAccDate(recPay.getAccDate()).setRecStatus(Constant.recStatuse.QUE_DING.getName()).setAmtRec(recPayItem.getAmtRec())
  493. .setBiznisType(Constant.InventoryDocCode.REC_PAY_ITEM.getTableName()).setBiznisId(recPayItem.getItemId()).setBiznisNo(recPay.getRpNo())
  494. .setMakeStaff(recPay.getMakeStaff()).setCpId(recPay.getCpId()).setFlgLock(true);
  495. accountItemMapper.insert(accountItem);
  496. // 更新收款单上的账款明细Id
  497. RecPayItem recPayItemUpdate = new RecPayItem();
  498. recPayItemUpdate.setAccItemId(accountItem.getItemId()).setItemId(recPayItem.getItemId());
  499. recPayItemService.updateByUuid(recPayItemUpdate);
  500. // 插入资金流水
  501. MoneyAccountItem moneyAccountItem = new MoneyAccountItem();
  502. moneyAccountItem.setMacId(recPayItem.getMacId()).setFlowType(Constant.FlowType.SHOU_FU_KUAN.getName())
  503. .setInvoiceId(recPayItem.getItemId()).setAmtInflow(recPayItem.getAmtRec()).setAccDate(recPay.getAccDate())
  504. .setMakeStaff(recPayItem.getMakeStaff()).setCpId(recPayItem.getCpId());
  505. moneyAccountItemMapper.insert(moneyAccountItem);
  506. if (!macList.contains(recPayItem.getMacId())) {
  507. macList.add(recPayItem.getMacId());
  508. }
  509. }
  510. }
  511. if (recPayForUpdate != null) {
  512. // 更新总账表的锁定金额
  513. accountService.updateReceiptLock(recPayForUpdate.getObjectId());
  514. }
  515. // 更新账户余额
  516. for (String macId : macList) {
  517. accountService.updateMac(macId);
  518. }
  519. /**************************************** 客户收款end ********************************/
  520. return ResponseResultUtil.success();
  521. }
  522. /**
  523. * @desc : 作废
  524. * @author : 付斌
  525. * @date : 2024-03-08 16:38
  526. */
  527. public ResponseResultVO<?> invalid(String id) {
  528. Order orderForUpdate = orderMapper.selectByIdForUpdate(id);
  529. // 并发校验
  530. if (!orderForUpdate.getFlgValid()) {
  531. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISFLGVALID_FALSE.getMessage());
  532. }
  533. // 如果出库中数量或已出库数量不是0,不能作废
  534. if (orderForUpdate.getOutingQty().compareTo(BigDecimal.ZERO) != 0 || orderForUpdate.getOutQty().compareTo(BigDecimal.ZERO) != 0) {
  535. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISEXISTS_AFTER_OPERATE.getMessage());
  536. }
  537. // 作废
  538. Order orderUpdate = new Order();
  539. orderUpdate.setFlgValid(false).setOrderId(id);
  540. super.update(orderUpdate, new UpdateWrapper<Order>().lambda().eq(Order::getOrderId,
  541. UUID.fromString(orderUpdate.getOrderId())));
  542. // 需要重新计算的资金账户
  543. List<String> macList = new ArrayList<>();
  544. // 收款明细
  545. RecPay recPayForUpdate = recPayMapper.selectByBiznisIdForUpdate(id, false);
  546. if (recPayForUpdate != null) {
  547. // 将之前的明细全部删除
  548. List<RecPayItem> recPayItemOriginalList = recPayItemMapper.selectByZIdForUpdate(recPayForUpdate.getRpId());
  549. for (RecPayItem recPayItem : recPayItemOriginalList) {
  550. // 删除收付款明细
  551. recPayItemMapper.deleteById(recPayItem.getItemId());
  552. // 删除账款明细
  553. accountItemMapper.deleteById(recPayItem.getAccItemId());
  554. // 删除账户流水
  555. moneyAccountItemMapper.deleteByInvoiceId(recPayItem.getItemId());
  556. if (!macList.contains(recPayItem.getMacId())) {
  557. macList.add(recPayItem.getMacId());
  558. }
  559. }
  560. // 更新总账表的总收款额和可用额
  561. accountService.updateReceiptLock(recPayForUpdate.getObjectId());
  562. // 更新账户余额
  563. for (String macId : macList) {
  564. accountService.updateMac(macId);
  565. }
  566. // 作废
  567. RecPay recPayUpdate = new RecPay();
  568. recPayUpdate.setFlgValid(false).setRpId(id);
  569. receiptService.updateByUuid(recPayUpdate);
  570. }
  571. return ResponseResultUtil.success();
  572. }
  573. /**
  574. * @desc : 获取订单信息(编辑用)
  575. * @author : 付斌
  576. * @date : 2024-03-02 17:27
  577. */
  578. public ResponseResultVO<?> getOrderForUpdate(String id) {
  579. Map<String, Object> dataInfo = new HashMap<>();
  580. OrderResponse orderResponse = orderMapper.selectById(id);
  581. dataInfo.put("data", orderResponse);
  582. // 商品明细
  583. List<OrderItemResponse> orderItemResponse = orderItemMapper.selectByCond(new OrderItemQuery().setOrderId(id));
  584. dataInfo.put("dataItem", orderItemResponse);
  585. //查询主从业务员
  586. List<String> staffList = new ArrayList<>();
  587. staffList.add(Constant.OwnerType.Z_STAFF.getName());
  588. staffList.add(Constant.OwnerType.C_STAFF.getName());
  589. List<MultiOwnerResponse> multiOwnersStaff = multiOwnerMapper.selectByType(new MultiOwnerQuery().setOrderId(id).setOwnerTypes(staffList));
  590. if(multiOwnersStaff != null && multiOwnersStaff.size() > 0){
  591. dataInfo.put("staffList", multiOwnersStaff);
  592. }
  593. //查询主从业务部门
  594. List<String> orgList = new ArrayList<>();
  595. orgList.add(Constant.OwnerType.Z_ORG.getName());
  596. orgList.add(Constant.OwnerType.C_ORG.getName());
  597. List<MultiOwnerResponse> multiOwnersOrg = multiOwnerMapper.selectByType(new MultiOwnerQuery().setOrderId(id).setOwnerTypes(orgList));
  598. if(multiOwnersOrg != null && multiOwnersOrg.size() > 0){
  599. dataInfo.put("orgList", multiOwnersOrg);
  600. }
  601. // 获取实收金额
  602. Map<String, Object> mapFactReceipt = orderMapper.getFactReceipt(id);
  603. orderResponse.setAmtFactReceipt(new BigDecimal(mapFactReceipt.get("sumFactReceipt").toString()));
  604. // 收款明细
  605. List<RecPayResponse> recPayList = recPayMapper.selectByCond(new RecPayQuery().setBiznisId(id).setFlgOrderHandle(false));
  606. if (recPayList != null && recPayList.size() > 0) {
  607. // 如果有定金,实收金额加上定金
  608. if (recPayList.get(0).getFlgLock()) {
  609. orderResponse.setAmtFactReceipt(orderResponse.getAmtFactReceipt().add(recPayList.get(0).getSumAmtRec()));
  610. }
  611. List<RecPayItemResponse> receiptItem = recPayItemMapper.selectByCond(new RecPayItemQuery().setRpId(recPayList.get(0).getRpId()));
  612. dataInfo.put("receiptItem", receiptItem);
  613. } else {
  614. dataInfo.put("receiptItem", new ArrayList<RecPayResponse>());
  615. }
  616. return ResponseResultUtil.success(dataInfo);
  617. }
  618. /**
  619. * @desc : 获取订单信息(出库用)
  620. * @author : 付斌
  621. * @date : 2024-03-02 17:27
  622. */
  623. public ResponseResultVO<?> getOrderForOut(String id) {
  624. Map<String, Object> dataInfo = new HashMap<>();
  625. OrderResponse orderResponse = orderMapper.selectById(id);
  626. dataInfo.put("data", orderResponse);
  627. // 商品明细
  628. List<OrderItemResponse> orderItem = orderItemMapper.selectByCondForOut(new OrderItemQuery().setOrderId(id));
  629. dataInfo.put("dataItem", orderItem);
  630. return ResponseResultUtil.success(dataInfo);
  631. }
  632. /**
  633. * @desc : 获取订单信息(退货用)
  634. * @author : 付斌
  635. * @date : 2024-03-02 17:27
  636. */
  637. public ResponseResultVO<?> getOrderForReturn(String id) {
  638. Map<String, Object> dataInfo = new HashMap<>();
  639. OrderResponse orderResponse = orderMapper.selectById(id);
  640. // 数量金额取反
  641. orderResponse.setSumQuantity(orderResponse.getSumQuantity().negate()).setSumAmount(orderResponse.getSumAmount().negate());
  642. dataInfo.put("data", orderResponse);
  643. // 商品明细
  644. List<OrderItemResponse> orderItem = orderItemMapper.selectByCondForReturn(new OrderItemQuery().setOrderId(id));
  645. dataInfo.put("dataItem", orderItem);
  646. return ResponseResultUtil.success(dataInfo);
  647. }
  648. /**
  649. * @desc : 条件查询(总单带明细)
  650. * @author : 于继渤
  651. * @date : 2023/1/9 10:36
  652. */
  653. @Pagination
  654. public ResponseResultVO<PageList<OrderResponse>> selectTotalSingleTapeDetailPage(OrderQuery orderQuery) {
  655. return super.mergeListWithCount(orderQuery, orderMapper.selectByCondDetail(orderQuery),
  656. orderMapper.countByCondDetail(orderQuery));
  657. }
  658. /**
  659. * @desc : 销售跟踪报表
  660. * @author : 宋扬
  661. * @date : 2024/4/24 17:17
  662. */
  663. public ResponseResultVO<PageList> getOrderTrackReport(Map<String, Object> param) {
  664. // 获取组合商品
  665. Map<String, Object> map = orderMapper.getOrderTrackReport(param);
  666. JSONObject sku = JSONObject.parseObject(map.get("f_query_ord_for_track").toString());
  667. // 定义返回值
  668. PageList data = new PageList<>();
  669. List dataList = sku.get("data") != null ? JSONObject.parseArray(sku.get("data").toString()).toJavaList(Map.class) : new ArrayList();
  670. // 组装返回值
  671. data.setList(dataList);
  672. return ResponseResultUtil.success(data);
  673. }
  674. }