OrderService.java 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119
  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.infrastructure.util.AuthUtils;
  17. import com.dk.mdm.mapper.common.CommonMapper;
  18. import com.dk.mdm.mapper.ivt.OutboundItemMapper;
  19. import com.dk.mdm.mapper.ivt.OutboundMapper;
  20. import com.dk.mdm.mapper.mac.AccountItemMapper;
  21. import com.dk.mdm.mapper.mac.RecPayHandleItemMapper;
  22. import com.dk.mdm.mapper.mac.RecPayItemMapper;
  23. import com.dk.mdm.mapper.mac.RecPayMapper;
  24. import com.dk.mdm.mapper.mst.CustomerMapper;
  25. import com.dk.mdm.mapper.mst.MoneyAccountItemMapper;
  26. import com.dk.mdm.mapper.mst.MoneyAccountMapper;
  27. import com.dk.mdm.mapper.sale.MultiOwnerMapper;
  28. import com.dk.mdm.mapper.sale.OrderItemMapper;
  29. import com.dk.mdm.mapper.sale.OrderMapper;
  30. import com.dk.mdm.model.pojo.mac.Account;
  31. import com.dk.mdm.model.pojo.mac.AccountItem;
  32. import com.dk.mdm.model.pojo.mac.RecPay;
  33. import com.dk.mdm.model.pojo.mac.RecPayItem;
  34. import com.dk.mdm.model.pojo.mst.Customer;
  35. import com.dk.mdm.model.pojo.mst.MoneyAccount;
  36. import com.dk.mdm.model.pojo.mst.MoneyAccountItem;
  37. import com.dk.mdm.model.pojo.mst.Supplier;
  38. import com.dk.mdm.model.pojo.sale.MultiOwner;
  39. import com.dk.mdm.model.pojo.sale.Order;
  40. import com.dk.common.service.BaseService;
  41. import com.dk.common.mapper.BaseMapper;
  42. import com.dk.mdm.model.pojo.sale.OrderItem;
  43. import com.dk.mdm.model.query.ivt.OutboundItemQuery;
  44. import com.dk.mdm.model.query.ivt.OutboundQuery;
  45. import com.dk.mdm.model.query.mac.RecPayItemQuery;
  46. import com.dk.mdm.model.query.mac.RecPayQuery;
  47. import com.dk.mdm.model.query.sale.MultiOwnerQuery;
  48. import com.dk.mdm.model.query.sale.OrderItemQuery;
  49. import com.dk.mdm.model.query.sale.OrderQuery;
  50. import com.dk.mdm.model.response.ivt.OutboundItemResponse;
  51. import com.dk.mdm.model.response.ivt.OutboundResponse;
  52. import com.dk.mdm.model.response.mac.RecPayItemResponse;
  53. import com.dk.mdm.model.response.mac.RecPayResponse;
  54. import com.dk.mdm.model.response.sale.MultiOwnerResponse;
  55. import com.dk.mdm.model.response.sale.OrderItemResponse;
  56. import com.dk.mdm.model.response.sale.OrderResponse;
  57. import com.dk.mdm.model.vo.ivt.OutboundVO;
  58. import com.dk.mdm.model.vo.mac.RecPayItemVO;
  59. import com.dk.mdm.model.vo.mst.SupplierVo;
  60. import com.dk.mdm.model.vo.sale.OrderItemVO;
  61. import com.dk.mdm.model.vo.sale.OrderVO;
  62. import com.dk.mdm.service.common.CommonService;
  63. import com.dk.mdm.service.ivt.outbound.OutboundSaleOrderService;
  64. import com.dk.mdm.service.mac.AccountService;
  65. import com.dk.mdm.service.mac.RecPayItemService;
  66. import com.dk.mdm.service.mac.ReceiptService;
  67. import com.dk.mdm.service.mst.MoneyAccountService;
  68. import com.dk.mdm.service.mst.SupplierService;
  69. import org.springframework.stereotype.Service;
  70. import org.springframework.beans.factory.annotation.Autowired;
  71. import org.springframework.transaction.annotation.Transactional;
  72. import java.math.BigDecimal;
  73. import java.time.LocalDate;
  74. import java.util.*;
  75. import java.util.stream.Collectors;
  76. import java.util.stream.Stream;
  77. @Service
  78. @Transactional
  79. public class OrderService extends BaseService<Order> {
  80. @Override
  81. public String getPrimaryKey() {
  82. return "order_id";
  83. }
  84. @Override
  85. public BaseMapper<Order> getRepository() {
  86. return orderMapper;
  87. }
  88. @Autowired
  89. private OrderMapper orderMapper;
  90. @Autowired
  91. private OrderItemService orderItemService;
  92. @Autowired
  93. private OrderItemMapper orderItemMapper;
  94. @Autowired
  95. private CommonService commonService;
  96. @Autowired
  97. private CommonMapper commonMapper;
  98. @Autowired
  99. private CustomerMapper customerMapper;
  100. @Autowired
  101. MultiOwnerMapper multiOwnerMapper;
  102. @Autowired
  103. private RecPayItemService recPayItemService;
  104. @Autowired
  105. ReceiptService receiptService;
  106. @Autowired
  107. private RecPayMapper recPayMapper;
  108. @Autowired
  109. private RecPayItemMapper recPayItemMapper;
  110. @Autowired
  111. private AccountService accountService;
  112. @Autowired
  113. private AccountItemMapper accountItemMapper;
  114. @Autowired
  115. private MoneyAccountService moneyAccountService;
  116. @Autowired
  117. private MoneyAccountMapper moneyAccountMapper;
  118. @Autowired
  119. private MoneyAccountItemMapper moneyAccountItemMapper;
  120. @Autowired
  121. RecPayHandleItemMapper recPayHandleItemMapper;
  122. @Autowired
  123. private OrderConvert orderConvert;
  124. @Autowired
  125. private OrderItemConvert orderItemConvert;
  126. @Autowired
  127. private RecPayItemConvert recPayItemConvert;
  128. @Autowired
  129. private OutboundSaleOrderService outboundSaleOrderService;
  130. @Autowired
  131. private OutBoundDtoConvert outBoundDtoConvert;
  132. @Autowired
  133. private OutboundItemMapper outboundItemMapper;
  134. @Autowired
  135. private OutboundMapper outboundMapper;
  136. @Autowired
  137. private SupplierService supplierService;
  138. @Autowired
  139. private AuthUtils authUtils;
  140. /**
  141. * @desc : 条件查询
  142. * @author : 付斌
  143. * @date : 2023/1/9 10:40
  144. */
  145. @Pagination
  146. public ResponseResultVO<PageList<OrderResponse>> selectByCond(OrderQuery orderQuery) {
  147. return super.mergeListWithCount(orderQuery, orderMapper.selectByCond(orderQuery),
  148. orderMapper.countByCondForSelectByCond(orderQuery));
  149. }
  150. /**
  151. * @desc : 条件查询(数量)小程序使用
  152. * @author : 周兴
  153. * @date : 2024/4/10 10:40
  154. */
  155. public ResponseResultVO<?> countByCond(OrderQuery orderQuery) {
  156. return ResponseResultUtil.success(orderMapper.countByCond(orderQuery));
  157. }
  158. /**
  159. * @desc : 以销定采 查询
  160. * @author : 王英杰
  161. * @date : 2023/3/14 10:36
  162. */
  163. @Pagination
  164. public ResponseResultVO<PageList<Map<String, Object>>> purSaleSelectByCond(OrderQuery orderQuery) {
  165. return super.mergeListWithCount(orderQuery, orderMapper.purSaleSelectByCond(orderQuery),
  166. orderMapper.countByCond(orderQuery));
  167. }
  168. /**
  169. * @desc : 查询订单明细(货物、收款、附件)
  170. * @author : 付斌
  171. * @date : 2024-02-28 13:25
  172. */
  173. @Pagination
  174. public ResponseResultVO<Map<String, Object>> selectOrderInfoById(String id) {
  175. Map<String, Object> result = new HashMap<>();
  176. // 商品明细
  177. List<OrderItemResponse> orderItem = orderItemMapper.selectByCond(new OrderItemQuery().setOrderId(id));
  178. result.put("orderItem", orderItem);
  179. // 收款明细
  180. List<RecPayResponse> recPayList = recPayMapper.selectByCond(new RecPayQuery().setBiznisId(id).setFlgOrderHandle(false));
  181. if (recPayList != null && recPayList.size() > 0) {
  182. List<RecPayItemResponse> receiptItem = recPayItemMapper.selectByCond(new RecPayItemQuery().setRpId(recPayList.get(0).getRpId()));
  183. result.put("receiptItem", receiptItem);
  184. } else {
  185. result.put("receiptItem", new ArrayList<RecPayResponse>());
  186. }
  187. return ResponseResultUtil.success(result);
  188. }
  189. /**
  190. * @desc : 新建方法
  191. * @author : 付斌
  192. * @date : 2023/1/9 10:49
  193. */
  194. @Transactional(
  195. rollbackFor = {Exception.class}
  196. )
  197. public ResponseResultVO<?> insert(OrderVO orderVO) {
  198. // 如果没有客户id,要新建
  199. if (orderVO.getCusId() == null) {
  200. List<Customer> listCustomer = customerMapper.selectByCond(new Customer().setCpId(orderVO.getCpId()).setCusPhone(orderVO.getCusPhone()));
  201. // 如果客户电话已存在
  202. if (listCustomer.size() > 0) {
  203. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISEXISTS_CUSPHONE.getMessage());
  204. }
  205. // 创建客户,获取编码和主键UuId
  206. Map<String, Object> codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.CUSTOMER.getName(), true);
  207. Customer customer = new Customer();
  208. // 增加跟进人,用于权限分配
  209. List<String> followStaffs = new ArrayList<>();
  210. followStaffs.add(orderVO.getMakeStaff());
  211. customer.setCusId(codeMap.get("outId").toString()).setCusCode(codeMap.get("outNote").toString()).setCusName(orderVO.getCusName())
  212. .setCusPhone(orderVO.getCusPhone()).setAddressArea(orderVO.getAddressArea()).setAddressName(orderVO.getAddressName())
  213. .setAddressNo(orderVO.getAddressNo()).setAddressGcj02(orderVO.getAddressGcj02()).setAddressFull(orderVO.getAddressFull())
  214. .setContactName(orderVO.getContactName()).setContactPhone(orderVO.getContactPhone()).setCusFrom(orderVO.getCusFrom())
  215. .setChannelId(orderVO.getSalesChannel()).setOrgId(orderVO.getOrgId()).setStaffId(orderVO.getStaffId())
  216. .setFollowStaffs(followStaffs)
  217. .setReportStaff(orderVO.getMakeStaff()).setSaleStatus(Constant.SaleStatus.CHENGJIAO.getName()).setCpId(orderVO.getCpId());
  218. customerMapper.insert(customer);
  219. orderVO.setCusId(customer.getCusId());
  220. } else {
  221. // 如果当前跟进人
  222. Customer cus = customerMapper.selectByIdForUpdate(orderVO.getCusId());
  223. List<String> followStaffs = cus.getFollowStaffs();
  224. Boolean updateFollowFlag = false;
  225. if (followStaffs == null) {
  226. followStaffs.add(orderVO.getMakeStaff());
  227. updateFollowFlag = true;
  228. } else {
  229. if (!followStaffs.contains(orderVO.getMakeStaff())) {
  230. followStaffs.add(orderVO.getMakeStaff());
  231. updateFollowFlag = true;
  232. }
  233. }
  234. if (updateFollowFlag) {
  235. // 更新当前跟进人
  236. customerMapper.updateFollowStaffs(new Customer().setCusId(orderVO.getCusId())
  237. .setFollowStaffs(followStaffs));
  238. }
  239. }
  240. // 获取单号
  241. Map<String, Object> codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.ORDER.getName(), false);
  242. orderVO.setOrderId(codeMap.get("outId").toString()).setOrderNo(codeMap.get("outNote").toString())
  243. .setOrderType(Constant.DocumentType.ORDER.getName());
  244. // 转化实体
  245. Order order = orderConvert.convertToPo(orderVO);
  246. // 订单总单保存
  247. super.insert(order);
  248. // 业务部门业绩保存
  249. if (orderVO.getOrgList() != null && orderVO.getOrgList().size() > 0) {
  250. for (Map<String, Object> map : orderVO.getOrgList()) {
  251. MultiOwner multiOwner = new MultiOwner();
  252. multiOwner.setOrderId(order.getOrderId()).setOwnerId(map.get("orgId").toString())
  253. .setAllocationRatio(new BigDecimal(map.get("allocationRatio").toString())).setCpId(order.getCpId());
  254. if (Boolean.parseBoolean(map.get("ownerFlag").toString())) {
  255. multiOwner.setOwnerType(Constant.OwnerType.Z_ORG.getName());
  256. } else {
  257. multiOwner.setOwnerType(Constant.OwnerType.C_ORG.getName());
  258. }
  259. multiOwnerMapper.insert(multiOwner);
  260. }
  261. }
  262. // 业务员业绩保存
  263. if (orderVO.getStaffList() != null && orderVO.getStaffList().size() > 0) {
  264. for (Map<String, Object> map : orderVO.getStaffList()) {
  265. MultiOwner multiOwner = new MultiOwner();
  266. multiOwner.setOrderId(order.getOrderId()).setOwnerId(map.get("staffId").toString())
  267. .setAllocationRatio(new BigDecimal(map.get("allocationRatio").toString())).setCpId(order.getCpId());
  268. if (Boolean.parseBoolean(map.get("ownerFlag").toString())) {
  269. multiOwner.setOwnerType(Constant.OwnerType.Z_STAFF.getName());
  270. } else {
  271. multiOwner.setOwnerType(Constant.OwnerType.C_STAFF.getName());
  272. }
  273. multiOwnerMapper.insert(multiOwner);
  274. }
  275. }
  276. // 订单明细保存
  277. if (orderVO.getItemList() != null && orderVO.getItemList().size() > 0) {
  278. for (OrderItemVO orderItemVO : orderVO.getItemList()) {
  279. //外协品供应上只有name 没有id 的时候 要新建供应商
  280. if (orderItemVO.getSkuId() == null) { //说明外协品
  281. if (orderItemVO.getSupId() == null) { //说明在库里不存在这个供应商
  282. Supplier supplier = supplierService.saleinsert(new SupplierVo().setSupName(orderItemVO.getSupName()).setSupType("供应商类别-外协").setCpId(authUtils.getStaff().getCpId()));
  283. orderItemVO.setSupId(supplier.getSupId());
  284. }
  285. }
  286. OrderItem orderItem = orderItemConvert.convertToPo(orderItemVO);
  287. orderItem.setOrderId(order.getOrderId()).setCpId(order.getCpId()).setOutStatus(Constant.OutStatus.DAICHUKU.getName());
  288. if (orderItem.getPriceStd() == null) {
  289. orderItem.setPriceStd(BigDecimal.ZERO);
  290. }
  291. if (orderItem.getAmtStd() == null) {
  292. orderItem.setAmtStd(BigDecimal.ZERO);
  293. }
  294. orderItem.setItemId(UUID.randomUUID().toString());
  295. orderItemMapper.insert(orderItem);
  296. orderItemVO.setItemId(orderItem.getItemId());
  297. }
  298. }
  299. /**************************************** 客户收款begin ********************************/
  300. if (orderVO.getReceiptList() != null && orderVO.getReceiptList().size() > 0) {
  301. // 商户产品版本
  302. String gradeCode = "PRO";
  303. Map<String, Object> paramCompany = new HashMap<>();
  304. paramCompany.put("cpId", orderVO.getCpId());
  305. List<Map<String, Object>> listCompany = commonMapper.getCompany(paramCompany);
  306. if (listCompany.size() > 0) {
  307. gradeCode = listCompany.get(0).get("gradeCode").toString();
  308. }
  309. // 获取单号
  310. codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.RECPAY.getName(), false);
  311. RecPay recPay = new RecPay();
  312. // 专业版有定金
  313. if ("PRO".equals(gradeCode)) {
  314. recPay.setRpId(codeMap.get("outId").toString()).setRpNo(codeMap.get("outNote").toString())
  315. .setRpType(Constant.RpType.SHOU_KUAN.getName()).setObjectId(orderVO.getCusId())
  316. .setOrgId(orderVO.getOrgId()).setStaffId(orderVO.getStaffId()).setAccDate(LocalDate.now())
  317. .setBiznisType(Constant.InventoryDocCode.ORDER.getTableName()).setBiznisId(orderVO.getOrderId()).setBiznisNo(orderVO.getOrderNo())
  318. .setMakeStaff(orderVO.getMakeStaff()).setCpId(orderVO.getCpId()).setFlgLock(true);
  319. // 计算订单明细的出库中数量,金额合计
  320. RecPayItemVO itemSum = orderVO.getReceiptList().stream().reduce((x, y) -> {
  321. RecPayItemVO item = new RecPayItemVO();
  322. item.setAmtRec(x.getAmtRec().add(y.getAmtRec()));
  323. return item;
  324. }).get();
  325. recPay.setSumAmtRec(itemSum.getAmtRec());
  326. // 总单保存
  327. recPayMapper.insert(recPay);
  328. // 明细保存
  329. for (RecPayItemVO recPayItemVO : orderVO.getReceiptList()) {
  330. RecPayItem recPayItem = recPayItemConvert.convertToPo(recPayItemVO);
  331. recPayItem.setRpId(recPay.getRpId()).setCpId(recPay.getCpId()).setMakeStaff(recPay.getMakeStaff()).setAccDate(recPay.getAccDate());
  332. recPayItemMapper.insert(recPayItem);
  333. // 插入账款明细
  334. AccountItem accountItem = new AccountItem();
  335. accountItem.setAccItemType(Constant.accItemType.SHOU_KUAN.getName())
  336. .setObjectId(recPay.getObjectId()).setOrgId(recPay.getOrgId()).setStaffId(recPay.getStaffId())
  337. .setAccDate(recPay.getAccDate()).setRecStatus(Constant.recStatuse.QUE_DING.getName()).setAmtRec(recPayItem.getAmtRec())
  338. .setBiznisType(Constant.InventoryDocCode.REC_PAY_ITEM.getTableName()).setBiznisId(recPayItem.getItemId()).setBiznisNo(recPay.getRpNo())
  339. .setMakeStaff(recPay.getMakeStaff()).setCpId(recPay.getCpId()).setFlgLock(true);
  340. accountItemMapper.insert(accountItem);
  341. // 更新收款单上的账款明细Id
  342. RecPayItem recPayItemUpdate = new RecPayItem();
  343. recPayItemUpdate.setAccItemId(accountItem.getItemId()).setItemId(recPayItem.getItemId());
  344. recPayItemService.updateByUuid(recPayItemUpdate);
  345. // 插入资金流水
  346. MoneyAccountItem moneyAccountItem = new MoneyAccountItem();
  347. moneyAccountItem.setMacId(recPayItem.getMacId()).setFlowType(Constant.FlowType.SHOU_FU_KUAN.getName())
  348. .setInvoiceId(recPayItem.getItemId()).setAmtInflow(recPayItem.getAmtRec()).setAccDate(recPay.getAccDate())
  349. .setMakeStaff(recPayItem.getMakeStaff()).setCpId(recPayItem.getCpId());
  350. moneyAccountItemMapper.insert(moneyAccountItem);
  351. // 更新资金账户
  352. MoneyAccount moneyAccountForUpdate = moneyAccountMapper.selectByIdForUpdate(recPayItem.getMacId());
  353. MoneyAccount moneyAccountUpdate = new MoneyAccount();
  354. moneyAccountUpdate.setBalance(moneyAccountForUpdate.getBalance().add(recPayItem.getAmtRec()))
  355. .setMacId(moneyAccountForUpdate.getMacId());
  356. moneyAccountService.updateByUuid(moneyAccountUpdate);
  357. }
  358. // 插入账款总表
  359. Account accountForUpdate = accountService.getCusAccountForUpdate(recPay.getObjectId());
  360. // 更新账款总表上收款的相关字段
  361. Account accountUpdate = new Account();
  362. accountUpdate.setReceiptLock(accountForUpdate.getReceiptLock().add(recPay.getSumAmtRec()))// 锁定金额
  363. .setObjectId(accountForUpdate.getObjectId());
  364. accountService.updateByUuid(accountUpdate);
  365. } else if ("STD".equals(gradeCode)) {
  366. recPay.setRpId(codeMap.get("outId").toString()).setRpNo(codeMap.get("outNote").toString())
  367. .setRpType(Constant.RpType.SHOU_KUAN.getName()).setObjectId(orderVO.getCusId())
  368. .setOrgId(orderVO.getOrgId()).setStaffId(orderVO.getStaffId()).setAccDate(LocalDate.now())
  369. .setBiznisType(Constant.InventoryDocCode.ORDER.getTableName()).setBiznisId(orderVO.getOrderId()).setBiznisNo(orderVO.getOrderNo())
  370. .setMakeStaff(orderVO.getMakeStaff()).setCpId(orderVO.getCpId());
  371. // 计算订单明细的出库中数量,金额合计
  372. RecPayItemVO itemSum = orderVO.getReceiptList().stream().reduce((x, y) -> {
  373. RecPayItemVO item = new RecPayItemVO();
  374. item.setAmtRec(x.getAmtRec().add(y.getAmtRec()));
  375. return item;
  376. }).get();
  377. recPay.setSumAmtRec(itemSum.getAmtRec());
  378. // 总单保存
  379. recPayMapper.insert(recPay);
  380. // 明细保存
  381. for (RecPayItemVO recPayItemVO : orderVO.getReceiptList()) {
  382. RecPayItem recPayItem = recPayItemConvert.convertToPo(recPayItemVO);
  383. recPayItem.setRpId(recPay.getRpId()).setCpId(recPay.getCpId()).setMakeStaff(recPay.getMakeStaff()).setAccDate(recPay.getAccDate());
  384. recPayItemMapper.insert(recPayItem);
  385. // 插入账款明细
  386. AccountItem accountItem = new AccountItem();
  387. accountItem.setAccItemType(Constant.accItemType.SHOU_KUAN.getName())
  388. .setObjectId(recPay.getObjectId()).setOrgId(recPay.getOrgId()).setStaffId(recPay.getStaffId())
  389. .setAccDate(recPay.getAccDate()).setRecStatus(Constant.recStatuse.QUE_DING.getName()).setAmtRec(recPayItem.getAmtRec())
  390. .setBiznisType(Constant.InventoryDocCode.REC_PAY_ITEM.getTableName()).setBiznisId(recPayItem.getItemId()).setBiznisNo(recPay.getRpNo())
  391. .setMakeStaff(recPay.getMakeStaff()).setCpId(recPay.getCpId());
  392. accountItemMapper.insert(accountItem);
  393. // 更新收款单上的账款明细Id
  394. RecPayItem recPayItemUpdate = new RecPayItem();
  395. recPayItemUpdate.setAccItemId(accountItem.getItemId()).setItemId(recPayItem.getItemId());
  396. recPayItemService.updateByUuid(recPayItemUpdate);
  397. // 插入资金流水
  398. MoneyAccountItem moneyAccountItem = new MoneyAccountItem();
  399. moneyAccountItem.setMacId(recPayItem.getMacId()).setFlowType(Constant.FlowType.SHOU_FU_KUAN.getName())
  400. .setInvoiceId(recPayItem.getItemId()).setAmtInflow(recPayItem.getAmtRec()).setAccDate(recPay.getAccDate())
  401. .setMakeStaff(recPayItem.getMakeStaff()).setCpId(recPayItem.getCpId());
  402. moneyAccountItemMapper.insert(moneyAccountItem);
  403. // 更新资金账户
  404. MoneyAccount moneyAccountForUpdate = moneyAccountMapper.selectByIdForUpdate(recPayItem.getMacId());
  405. MoneyAccount moneyAccountUpdate = new MoneyAccount();
  406. moneyAccountUpdate.setBalance(moneyAccountForUpdate.getBalance().add(recPayItem.getAmtRec()))
  407. .setMacId(moneyAccountForUpdate.getMacId());
  408. moneyAccountService.updateByUuid(moneyAccountUpdate);
  409. }
  410. // 插入账款总表
  411. Account accountForUpdate = accountService.getCusAccountForUpdate(recPay.getObjectId());
  412. // 更新账款总表上收款的相关字段
  413. Account accountUpdate = new Account();
  414. accountUpdate.setReceipt(accountForUpdate.getReceipt().add(recPay.getSumAmtRec()))// 总收款金额
  415. .setReceiptResidue(accountForUpdate.getReceiptResidue().add(recPay.getSumAmtRec()))// 可退金额
  416. .setObjectId(accountForUpdate.getObjectId());
  417. accountService.updateByUuid(accountUpdate);
  418. }
  419. }
  420. /**************************************** 客户收款end ********************************/
  421. //开单并出库办理
  422. if (orderVO.getOutboundProcessingFlag() != null && orderVO.getOutboundProcessingFlag()) {
  423. for (OrderItemVO orderItemVO : orderVO.getItemList()) {
  424. orderItemVO.setOutingQty(orderItemVO.getItemQty());
  425. orderItemVO.setOutingAmt(orderItemVO.getItemAmt());
  426. orderItemVO.setPriceOut(orderItemVO.getFactPrice());
  427. orderItemVO.setFromId(orderVO.getOrderId());
  428. orderItemVO.setFromItemId(orderItemVO.getItemId());
  429. }
  430. OutboundVO outboundVO = outBoundDtoConvert.convertToPo(orderVO);
  431. outboundVO.setOutDate(LocalDate.now());
  432. outboundVO.setOutingQty(orderVO.getSumQuantity());
  433. outboundVO.setOutingAmt(orderVO.getFactAmt());
  434. outboundVO.setFlgAutoHandle(orderVO.getFlgAutoHandle());
  435. outboundVO.setFlgHandleSetting(orderVO.getFlgHandleSetting());
  436. outboundVO.setFromId(order.getOrderId());
  437. outboundVO.setFromNo(order.getOrderNo());
  438. outboundVO.setOutDate(orderVO.getDeliveryDate());
  439. outboundVO.setFactAmt(orderVO.getFactAmt());
  440. outboundVO.setDiscount(orderVO.getDiscount());
  441. outboundVO.setDiscAmt(orderVO.getDiscAmt());
  442. outboundVO.setSumAmount(orderVO.getSumAmount());
  443. outboundSaleOrderService.inventoryOUtBond(outboundVO);
  444. }
  445. return ResponseResultUtil.success();
  446. }
  447. /**
  448. * @desc : 编辑方法
  449. * @author : 付斌
  450. * @date : 2023/1/9 10:49
  451. */
  452. @Transactional(
  453. rollbackFor = {Exception.class}
  454. )
  455. public ResponseResultVO<?> update(OrderVO orderVO) {
  456. Order orderForUpdate = orderMapper.selectByIdForUpdate(orderVO.getOrderId());
  457. // 并发校验
  458. if (!orderForUpdate.getFlgValid()) {
  459. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISFLGVALID_FALSE.getMessage());
  460. }
  461. // 如果全部出库了
  462. //标:之前沟通允许大编辑,目前订单开单已出库的单子进行编辑是不允许操作的(请确定一下,到底系统设计是否允许大编辑?)
  463. //bug 6933可查
  464. // if (orderForUpdate.getSumQuantity().compareTo(orderForUpdate.getOutQty()) == 0) {
  465. // throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ORDER_IS_OUT.getMessage());
  466. // }
  467. // 明细实体(避免并发,需要再查一遍)
  468. OrderItem orderItemForUpdate;
  469. // 转化实体
  470. Order order = orderConvert.convertToPo(orderVO);
  471. //删除的
  472. if (orderVO.getDeleteItemList() != null) {
  473. List<OrderItemVO> deleteOrderItemVOList = orderVO.getDeleteItemList().stream().filter(it -> it.getItemId() != null).collect(Collectors.toList());
  474. if (deleteOrderItemVOList.size() > 0) {
  475. for (OrderItemVO orderItemVO : deleteOrderItemVOList) {
  476. orderItemForUpdate = orderItemMapper.selectByIdForUpdate(orderItemVO.getItemId());
  477. // 非待出库单据不能删除
  478. if (!Constant.OutStatus.DAICHUKU.getName().equals(orderItemForUpdate.getOutStatus())) {
  479. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.NO_WAIT_INTO.getMessage());
  480. } else {
  481. orderItemMapper.deleteById(orderItemVO.getItemId());
  482. }
  483. }
  484. }
  485. }
  486. // 商户产品版本
  487. String gradeCode = "PRO";
  488. Map<String, Object> paramCompany = new HashMap<>();
  489. paramCompany.put("cpId", orderVO.getCpId());
  490. List<Map<String, Object>> listCompany = commonMapper.getCompany(paramCompany);
  491. if (listCompany.size() > 0) {
  492. gradeCode = listCompany.get(0).get("gradeCode").toString();
  493. }
  494. // 编辑的
  495. List<OrderItemVO> editOrderItemVOList = orderVO.getItemList().stream().filter(it -> it.getItemId() != null).collect(Collectors.toList());
  496. for (OrderItemVO orderItemVO : editOrderItemVOList) {
  497. orderItemForUpdate = orderItemMapper.selectByIdForUpdate(orderItemVO.getItemId());
  498. // 出库数量
  499. BigDecimal outintOrOutQty = orderItemForUpdate.getOutingQty().add(orderItemForUpdate.getOutQty());
  500. if (!"STD".equals(gradeCode)) {
  501. // 商品数量不能小于(出库中数量+已出库数量)
  502. if (orderItemVO.getItemQty().compareTo(outintOrOutQty) == -1) {
  503. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ITEMQTY_NO_LESS_OUTQTY.getMessage());
  504. }
  505. }
  506. // 如果出库数量不是0,则不能改仓库
  507. if (outintOrOutQty.compareTo(BigDecimal.ZERO) != 0) {
  508. if (orderItemForUpdate.getSkuId() != null) { //过滤外协品
  509. if (!orderItemForUpdate.getWhId().equals(orderItemVO.getWhId())) {
  510. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ORDER_ISOUT.getMessage());
  511. }
  512. }
  513. }
  514. OrderItem orderItem = orderItemConvert.convertToPo(orderItemVO);
  515. orderItemService.updateByUuid(orderItem);
  516. // 免费版:
  517. // 订单编辑钱保存,要更改对应出库单的钱
  518. // 订单编辑数量保存,要更改对应出库单数量,并且更新库存;更改后数量不能小于退货数量;
  519. // 专业版:编辑保持原逻辑
  520. if ("STD".equals(gradeCode)) { //免費版特加逻辑
  521. //更改后数量不能小于退货数量;
  522. if (orderItemVO.getItemQty().compareTo(orderItemForUpdate.getReturnQty()) == -1) {
  523. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.GOODSQTY_NO_LESS_RETURNQTY.getMessage());
  524. }
  525. }
  526. }
  527. // 新增的
  528. List<OrderItemVO> insertOrderItemVOList = orderVO.getItemList().stream().filter(it -> it.getItemId() == null).collect(Collectors.toList());
  529. for (OrderItemVO orderItemVO : insertOrderItemVOList) {
  530. //外协品供应上只有name 没有id 的时候 要新建供应商
  531. if (orderItemVO.getSkuId() == null) { //说明外协品
  532. if (orderItemVO.getSupId() == null) { //说明在库里不存在这个供应商
  533. Supplier supplier = supplierService.saleinsert(new SupplierVo().setSupName(orderItemVO.getSupName()).setSupType("供应商类别-外协").setCpId(authUtils.getStaff().getCpId()));
  534. orderItemVO.setSupId(supplier.getSupId());
  535. }
  536. }
  537. OrderItem orderItem = orderItemConvert.convertToPo(orderItemVO);
  538. orderItem.setOrderId(order.getOrderId()).setCpId(order.getCpId()).setOutStatus(Constant.OutStatus.DAICHUKU.getName());
  539. orderItem.setItemId(UUID.randomUUID().toString());
  540. orderItemMapper.insert(orderItem);
  541. orderItemVO.setItemId(orderItem.getItemId());
  542. orderItemVO.setOrderId(orderVO.getOrderId());
  543. }
  544. // 删除业绩信息
  545. multiOwnerMapper.deleteByOrderId(order.getOrderId());
  546. // 重新保存业绩信息
  547. // 业务部门业绩保存
  548. if (orderVO.getOrgList() != null && orderVO.getOrgList().size() > 0) {
  549. for (Map<String, Object> map : orderVO.getOrgList()) {
  550. MultiOwner multiOwner = new MultiOwner();
  551. multiOwner.setOrderId(order.getOrderId()).setOwnerId(map.get("orgId").toString())
  552. .setAllocationRatio(new BigDecimal(map.get("allocationRatio").toString())).setCpId(order.getCpId());
  553. if (Boolean.parseBoolean(map.get("ownerFlag").toString())) {
  554. multiOwner.setOwnerType(Constant.OwnerType.Z_ORG.getName());
  555. } else {
  556. multiOwner.setOwnerType(Constant.OwnerType.C_ORG.getName());
  557. }
  558. multiOwnerMapper.insert(multiOwner);
  559. }
  560. }
  561. // 业务员业绩保存
  562. if (orderVO.getStaffList() != null && orderVO.getStaffList().size() > 0) {
  563. for (Map<String, Object> map : orderVO.getStaffList()) {
  564. MultiOwner multiOwner = new MultiOwner();
  565. multiOwner.setOrderId(order.getOrderId()).setOwnerId(map.get("staffId").toString())
  566. .setAllocationRatio(new BigDecimal(map.get("allocationRatio").toString())).setCpId(order.getCpId());
  567. if (Boolean.parseBoolean(map.get("ownerFlag").toString())) {
  568. multiOwner.setOwnerType(Constant.OwnerType.Z_STAFF.getName());
  569. } else {
  570. multiOwner.setOwnerType(Constant.OwnerType.C_STAFF.getName());
  571. }
  572. multiOwnerMapper.insert(multiOwner);
  573. }
  574. }
  575. // 更新总单
  576. super.update(order, new UpdateWrapper<Order>().lambda().eq(Order::getOrderId,
  577. UUID.fromString(order.getOrderId())));
  578. /**************************************** 客户收款begin ********************************/
  579. // 需要重新计算的资金账户
  580. List<String> macList = new ArrayList<>();
  581. // 收款明细
  582. RecPay recPayForUpdate = recPayMapper.selectByBiznisIdForUpdate(orderVO.getOrderId(), false);
  583. if (recPayForUpdate != null) {
  584. // 将之前的明细全部删除
  585. List<RecPayItem> recPayItemOriginalList = recPayItemMapper.selectByZIdForUpdate(recPayForUpdate.getRpId());
  586. for (RecPayItem recPayItem : recPayItemOriginalList) {
  587. // 删除收付款明细
  588. recPayItemMapper.deleteById(recPayItem.getItemId());
  589. // 删除账款明细
  590. accountItemMapper.deleteById(recPayItem.getAccItemId());
  591. // 删除账户流水
  592. moneyAccountItemMapper.deleteByInvoiceId(recPayItem.getItemId());
  593. if (!macList.contains(recPayItem.getMacId())) {
  594. macList.add(recPayItem.getMacId());
  595. }
  596. }
  597. }
  598. // 专业版有定金
  599. if ("PRO".equals(gradeCode)) {
  600. if (orderVO.getReceiptList() != null && orderVO.getReceiptList().size() > 0) {
  601. // 计算订单明细的出库中数量,金额合计
  602. RecPayItemVO itemSum = orderVO.getReceiptList().stream().reduce((x, y) -> {
  603. RecPayItemVO item = new RecPayItemVO();
  604. item.setAmtRec(x.getAmtRec().add(y.getAmtRec()));
  605. return item;
  606. }).get();
  607. RecPay recPay = null;
  608. if (recPayForUpdate == null) {
  609. recPay = new RecPay();
  610. // 获取单号
  611. Map<String, Object> codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.RECPAY.getName(), false);
  612. recPay.setRpId(codeMap.get("outId").toString()).setRpNo(codeMap.get("outNote").toString())
  613. .setRpType(Constant.RpType.SHOU_KUAN.getName()).setObjectId(orderVO.getCusId())
  614. .setOrgId(orderVO.getOrgId()).setStaffId(orderVO.getStaffId()).setAccDate(LocalDate.now())
  615. .setBiznisType(Constant.InventoryDocCode.ORDER.getTableName()).setBiznisId(orderVO.getOrderId()).setBiznisNo(orderVO.getOrderNo())
  616. .setMakeStaff(orderVO.getMakeStaff()).setCpId(orderVO.getCpId()).setFlgLock(true);
  617. recPay.setSumAmtRec(itemSum.getAmtRec());
  618. recPayMapper.insert(recPay);
  619. recPayForUpdate = recPay;
  620. } else {
  621. // 更新收款总额
  622. RecPay recPayUpdate = new RecPay();
  623. recPayUpdate.setSumAmtRec(itemSum.getAmtRec()).setRpId(recPayForUpdate.getRpId());
  624. receiptService.updateByUuid(recPayUpdate);
  625. // 赋值recPay,下面要用
  626. recPay = recPayForUpdate;
  627. }
  628. // 明细保存
  629. for (RecPayItemVO recPayItemVO : orderVO.getReceiptList()) {
  630. RecPayItem recPayItem = recPayItemConvert.convertToPo(recPayItemVO);
  631. recPayItem.setItemId(null).setRpId(recPay.getRpId()).setCpId(recPay.getCpId()).setMakeStaff(recPay.getMakeStaff()).setAccDate(recPay.getAccDate());
  632. recPayItemMapper.insert(recPayItem);
  633. // 插入账款明细
  634. AccountItem accountItem = new AccountItem();
  635. accountItem.setAccItemType(Constant.accItemType.SHOU_KUAN.getName())
  636. .setObjectId(recPay.getObjectId()).setOrgId(recPay.getOrgId()).setStaffId(recPay.getStaffId())
  637. .setAccDate(recPay.getAccDate()).setRecStatus(Constant.recStatuse.QUE_DING.getName()).setAmtRec(recPayItem.getAmtRec())
  638. .setBiznisType(Constant.InventoryDocCode.REC_PAY_ITEM.getTableName()).setBiznisId(recPayItem.getItemId()).setBiznisNo(recPay.getRpNo())
  639. .setMakeStaff(recPay.getMakeStaff()).setCpId(recPay.getCpId()).setFlgLock(true);
  640. accountItemMapper.insert(accountItem);
  641. // 更新收款单上的账款明细Id
  642. RecPayItem recPayItemUpdate = new RecPayItem();
  643. recPayItemUpdate.setAccItemId(accountItem.getItemId()).setItemId(recPayItem.getItemId());
  644. recPayItemService.updateByUuid(recPayItemUpdate);
  645. // 插入资金流水
  646. MoneyAccountItem moneyAccountItem = new MoneyAccountItem();
  647. moneyAccountItem.setMacId(recPayItem.getMacId()).setFlowType(Constant.FlowType.SHOU_FU_KUAN.getName())
  648. .setInvoiceId(recPayItem.getItemId()).setAmtInflow(recPayItem.getAmtRec()).setAccDate(recPay.getAccDate())
  649. .setMakeStaff(recPayItem.getMakeStaff()).setCpId(recPayItem.getCpId());
  650. moneyAccountItemMapper.insert(moneyAccountItem);
  651. if (!macList.contains(recPayItem.getMacId())) {
  652. macList.add(recPayItem.getMacId());
  653. }
  654. }
  655. }
  656. if (recPayForUpdate != null) {
  657. // 更新总账表的锁定金额
  658. accountService.updateReceiptLock(recPayForUpdate.getObjectId());
  659. }
  660. } else if ("STD".equals(gradeCode)) {
  661. if (orderVO.getReceiptList() != null && orderVO.getReceiptList().size() > 0) {
  662. // 计算订单明细的出库中数量,金额合计
  663. RecPayItemVO itemSum = orderVO.getReceiptList().stream().reduce((x, y) -> {
  664. RecPayItemVO item = new RecPayItemVO();
  665. item.setAmtRec(x.getAmtRec().add(y.getAmtRec()));
  666. return item;
  667. }).get();
  668. RecPay recPay = null;
  669. if (recPayForUpdate == null) {
  670. recPay = new RecPay();
  671. // 获取单号
  672. Map<String, Object> codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.RECPAY.getName(), false);
  673. recPay.setRpId(codeMap.get("outId").toString()).setRpNo(codeMap.get("outNote").toString())
  674. .setRpType(Constant.RpType.SHOU_KUAN.getName()).setObjectId(orderVO.getCusId())
  675. .setOrgId(orderVO.getOrgId()).setStaffId(orderVO.getStaffId()).setAccDate(LocalDate.now())
  676. .setBiznisType(Constant.InventoryDocCode.ORDER.getTableName()).setBiznisId(orderVO.getOrderId()).setBiznisNo(orderVO.getOrderNo())
  677. .setMakeStaff(orderVO.getMakeStaff()).setCpId(orderVO.getCpId());
  678. recPay.setSumAmtRec(itemSum.getAmtRec());
  679. recPayMapper.insert(recPay);
  680. recPayForUpdate = recPay;
  681. } else {
  682. // 更新收款总额
  683. RecPay recPayUpdate = new RecPay();
  684. recPayUpdate.setSumAmtRec(itemSum.getAmtRec()).setRpId(recPayForUpdate.getRpId());
  685. receiptService.updateByUuid(recPayUpdate);
  686. // 赋值recPay,下面要用
  687. recPay = recPayForUpdate;
  688. }
  689. // 明细保存
  690. for (RecPayItemVO recPayItemVO : orderVO.getReceiptList()) {
  691. RecPayItem recPayItem = recPayItemConvert.convertToPo(recPayItemVO);
  692. recPayItem.setItemId(null).setRpId(recPay.getRpId()).setCpId(recPay.getCpId()).setMakeStaff(recPay.getMakeStaff()).setAccDate(recPay.getAccDate());
  693. recPayItemMapper.insert(recPayItem);
  694. // 插入账款明细
  695. AccountItem accountItem = new AccountItem();
  696. accountItem.setAccItemType(Constant.accItemType.SHOU_KUAN.getName())
  697. .setObjectId(recPay.getObjectId()).setOrgId(recPay.getOrgId()).setStaffId(recPay.getStaffId())
  698. .setAccDate(recPay.getAccDate()).setRecStatus(Constant.recStatuse.QUE_DING.getName()).setAmtRec(recPayItem.getAmtRec())
  699. .setBiznisType(Constant.InventoryDocCode.REC_PAY_ITEM.getTableName()).setBiznisId(recPayItem.getItemId()).setBiznisNo(recPay.getRpNo())
  700. .setMakeStaff(recPay.getMakeStaff()).setCpId(recPay.getCpId());
  701. accountItemMapper.insert(accountItem);
  702. // 更新收款单上的账款明细Id
  703. RecPayItem recPayItemUpdate = new RecPayItem();
  704. recPayItemUpdate.setAccItemId(accountItem.getItemId()).setItemId(recPayItem.getItemId());
  705. recPayItemService.updateByUuid(recPayItemUpdate);
  706. // 插入资金流水
  707. MoneyAccountItem moneyAccountItem = new MoneyAccountItem();
  708. moneyAccountItem.setMacId(recPayItem.getMacId()).setFlowType(Constant.FlowType.SHOU_FU_KUAN.getName())
  709. .setInvoiceId(recPayItem.getItemId()).setAmtInflow(recPayItem.getAmtRec()).setAccDate(recPay.getAccDate())
  710. .setMakeStaff(recPayItem.getMakeStaff()).setCpId(recPayItem.getCpId());
  711. moneyAccountItemMapper.insert(moneyAccountItem);
  712. if (!macList.contains(recPayItem.getMacId())) {
  713. macList.add(recPayItem.getMacId());
  714. }
  715. }
  716. }
  717. if (recPayForUpdate != null) {
  718. // 更新总账表的总收款额和可用额
  719. accountService.updateReceipt(recPayForUpdate.getObjectId());
  720. }
  721. }
  722. // 更新账户余额
  723. for (String macId : macList) {
  724. accountService.updateMac(macId);
  725. }
  726. /**************************************** 客户收款end ********************************/
  727. if ("STD".equals(gradeCode)) { //订单 转 出库数据
  728. // 合并两个列表
  729. List<OrderItemVO> combinedList = Stream.concat(insertOrderItemVOList.stream(), editOrderItemVOList.stream())
  730. .collect(Collectors.toList());
  731. if (combinedList.size() > 0) { //编辑时新选的数据生成出库单
  732. //开单并出库办理
  733. if (orderVO.getOutboundProcessingFlag() != null && orderVO.getOutboundProcessingFlag()) {
  734. //标准版 只有一个出库单 所以get0 就可以 且 编辑销售订单得时候 一定是有出库单的
  735. List<OutboundResponse> outboundList = outboundMapper.selectByCond(new OutboundQuery().setFromId(orderVO.getOrderId()));
  736. if (outboundList.size() > 0) { //有订单有出库单后续才编辑 没有就不用编辑
  737. OutboundResponse outboundResponsejson = outboundList.get(0);
  738. for (OrderItemVO orderItemVO : combinedList) {
  739. //拿到 订单明细对应的出库明细 订单明细id 和 出库单来源明细 是一 一 对应的 所以 get0 也是不会有问题的
  740. List<OutboundItemResponse> outboundItemList = outboundItemMapper.selectByCond(new OutboundItemQuery().setFromItemId(orderItemVO.getItemId()));
  741. OutboundItemResponse outboundItemjson = null;
  742. if (outboundItemList.size() != 0) { //没查到库存数据说明是新增的品 还没出库呢
  743. outboundItemjson = outboundItemList.get(0);
  744. }
  745. orderItemVO.setOutingQty(orderItemVO.getItemQty());
  746. orderItemVO.setOutingAmt(orderItemVO.getItemAmt());
  747. orderItemVO.setPriceOut(orderItemVO.getFactPrice());
  748. orderItemVO.setFromId(orderVO.getOrderId());
  749. orderItemVO.setFromItemId(orderItemVO.getItemId());
  750. orderItemVO.setOutId(outboundResponsejson.getOutId());
  751. orderItemVO.setItemId(outboundItemjson == null ? null : outboundItemjson.getItemId());
  752. }
  753. if (orderVO.getDeleteItemList() != null) { //删除list
  754. List<OrderItemVO> deleteOrderItemVOList = orderVO.getDeleteItemList().stream().filter(it -> it.getItemId() != null).collect(Collectors.toList());
  755. if (deleteOrderItemVOList.size() > 0) {
  756. orderVO.setDeleteItemList(deleteOrderItemVOList);
  757. }
  758. }
  759. orderVO.setItemList(combinedList);
  760. OutboundVO outboundVO = outBoundDtoConvert.convertToPo(orderVO);
  761. outboundVO.setOutDate(LocalDate.now());
  762. outboundVO.setOutingQty(orderVO.getSumQuantity());
  763. outboundVO.setOutingAmt(orderVO.getFactAmt());
  764. outboundVO.setFlgAutoHandle(orderVO.getFlgAutoHandle());
  765. outboundVO.setFlgHandleSetting(orderVO.getFlgHandleSetting());
  766. outboundVO.setFromId(order.getOrderId());
  767. outboundVO.setFromNo(order.getOrderNo());
  768. outboundVO.setOutDate(orderVO.getDeliveryDate());
  769. outboundVO.setFactAmt(orderVO.getFactAmt());
  770. outboundVO.setDiscount(orderVO.getDiscount());
  771. outboundVO.setDiscAmt(orderVO.getDiscAmt());
  772. outboundVO.setSumAmount(orderVO.getSumAmount());
  773. outboundVO.setOutId(outboundResponsejson.getOutId());
  774. outboundVO.setLimitEdit(true);
  775. outboundSaleOrderService.saleOutboundUpdate(outboundVO);
  776. }
  777. }
  778. }
  779. }
  780. return ResponseResultUtil.success();
  781. }
  782. /**
  783. * @desc : 作废
  784. * @author : 付斌
  785. * @date : 2024-03-08 16:38
  786. */
  787. public ResponseResultVO<?> invalid(String id) {
  788. Order orderForUpdate = orderMapper.selectByIdForUpdate(id);
  789. // 并发校验
  790. if (!orderForUpdate.getFlgValid()) {
  791. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISFLGVALID_FALSE.getMessage());
  792. }
  793. // 如果出库中数量或已出库数量不是0,不能作废
  794. if (orderForUpdate.getOutingQty().compareTo(BigDecimal.ZERO) != 0 || orderForUpdate.getOutQty().compareTo(BigDecimal.ZERO) != 0) {
  795. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISEXISTS_AFTER_OPERATE.getMessage());
  796. }
  797. // 作废
  798. Order orderUpdate = new Order();
  799. orderUpdate.setFlgValid(false).setOrderId(id);
  800. super.update(orderUpdate, new UpdateWrapper<Order>().lambda().eq(Order::getOrderId,
  801. UUID.fromString(orderUpdate.getOrderId())));
  802. // 需要重新计算的资金账户
  803. List<String> macList = new ArrayList<>();
  804. // 收款明细
  805. RecPay recPayForUpdate = recPayMapper.selectByBiznisIdForUpdate(id, false);
  806. if (recPayForUpdate != null) {
  807. // 将之前的明细全部删除
  808. List<RecPayItem> recPayItemOriginalList = recPayItemMapper.selectByZIdForUpdate(recPayForUpdate.getRpId());
  809. for (RecPayItem recPayItem : recPayItemOriginalList) {
  810. // 删除收付款明细 240627
  811. // recPayItemMapper.deleteById(recPayItem.getItemId());
  812. // 改为更新false
  813. RecPayItem recPayItemNew = new RecPayItem();
  814. recPayItemNew.setItemId(recPayItem.getItemId()).setFlgValid(false);
  815. recPayItemService.updateByUuid(recPayItemNew);
  816. // 删除账款明细
  817. accountItemMapper.deleteById(recPayItem.getAccItemId());
  818. // 删除账户流水
  819. moneyAccountItemMapper.deleteByInvoiceId(recPayItem.getItemId());
  820. if (!macList.contains(recPayItem.getMacId())) {
  821. macList.add(recPayItem.getMacId());
  822. }
  823. }
  824. // 更新总账表的总收款额和可用额
  825. accountService.updateReceiptLock(recPayForUpdate.getObjectId());
  826. // 更新账户余额
  827. for (String macId : macList) {
  828. accountService.updateMac(macId);
  829. }
  830. // 作废
  831. RecPay recPayUpdate = new RecPay();
  832. recPayUpdate.setFlgValid(false).setRpId(recPayForUpdate.getRpId());
  833. receiptService.updateByUuid(recPayUpdate);
  834. }
  835. return ResponseResultUtil.success();
  836. }
  837. /**
  838. * @desc : 获取订单信息(编辑用)
  839. * @author : 付斌
  840. * @date : 2024-03-02 17:27
  841. */
  842. public ResponseResultVO<?> getOrderForUpdate(String id) {
  843. Map<String, Object> dataInfo = new HashMap<>();
  844. OrderResponse orderResponse = orderMapper.selectById(id);
  845. dataInfo.put("data", orderResponse);
  846. // 商品明细
  847. List<OrderItemResponse> orderItemResponse = orderItemMapper.selectByCond(new OrderItemQuery().setOrderId(id));
  848. dataInfo.put("dataItem", orderItemResponse);
  849. //查询主从业务员
  850. List<String> staffList = new ArrayList<>();
  851. staffList.add(Constant.OwnerType.Z_STAFF.getName());
  852. staffList.add(Constant.OwnerType.C_STAFF.getName());
  853. List<MultiOwnerResponse> multiOwnersStaff = multiOwnerMapper.selectByType(new MultiOwnerQuery().setOrderId(id).setOwnerTypes(staffList));
  854. if (multiOwnersStaff != null && multiOwnersStaff.size() > 0) {
  855. dataInfo.put("staffList", multiOwnersStaff);
  856. }
  857. //查询主从业务部门
  858. List<String> orgList = new ArrayList<>();
  859. orgList.add(Constant.OwnerType.Z_ORG.getName());
  860. orgList.add(Constant.OwnerType.C_ORG.getName());
  861. List<MultiOwnerResponse> multiOwnersOrg = multiOwnerMapper.selectByType(new MultiOwnerQuery().setOrderId(id).setOwnerTypes(orgList));
  862. if (multiOwnersOrg != null && multiOwnersOrg.size() > 0) {
  863. dataInfo.put("orgList", multiOwnersOrg);
  864. }
  865. // 获取实收金额
  866. Map<String, Object> mapFactReceipt = orderMapper.getFactReceipt(id);
  867. orderResponse.setAmtFactReceipt(new BigDecimal(mapFactReceipt.get("sumFactReceipt").toString()));
  868. // 收款明细
  869. List<RecPayResponse> recPayList = recPayMapper.selectByCond(new RecPayQuery().setBiznisId(id).setFlgOrderHandle(false));
  870. if (recPayList != null && recPayList.size() > 0) {
  871. // 如果有定金,实收金额加上定金
  872. if (recPayList.get(0).getFlgLock()) {
  873. orderResponse.setAmtFactReceipt(orderResponse.getAmtFactReceipt().add(recPayList.get(0).getSumAmtRec()));
  874. }
  875. List<RecPayItemResponse> receiptItem = recPayItemMapper.selectByCond(new RecPayItemQuery().setRpId(recPayList.get(0).getRpId()));
  876. dataInfo.put("receiptItem", receiptItem);
  877. } else {
  878. dataInfo.put("receiptItem", new ArrayList<RecPayResponse>());
  879. }
  880. return ResponseResultUtil.success(dataInfo);
  881. }
  882. /**
  883. * @desc : 获取订单信息(出库用)
  884. * @author : 付斌
  885. * @date : 2024-03-02 17:27
  886. */
  887. public ResponseResultVO<?> getOrderForOut(String id) {
  888. Map<String, Object> dataInfo = new HashMap<>();
  889. OrderResponse orderResponse = orderMapper.selectById(id);
  890. dataInfo.put("data", orderResponse);
  891. // 商品明细
  892. List<OrderItemResponse> orderItem = orderItemMapper.selectByCondForOut(new OrderItemQuery().setOrderId(id));
  893. dataInfo.put("dataItem", orderItem);
  894. return ResponseResultUtil.success(dataInfo);
  895. }
  896. /**
  897. * @desc : 获取订单信息(退货用)
  898. * @author : 付斌
  899. * @date : 2024-03-02 17:27
  900. */
  901. public ResponseResultVO<?> getOrderForReturn(String id) {
  902. Map<String, Object> dataInfo = new HashMap<>();
  903. OrderResponse orderResponse = orderMapper.selectById(id);
  904. // 数量金额取反
  905. orderResponse.setSumQuantity(orderResponse.getSumQuantity().negate()).setSumAmount(orderResponse.getSumAmount().negate());
  906. dataInfo.put("data", orderResponse);
  907. // 商品明细
  908. List<OrderItemResponse> orderItem = orderItemMapper.selectByCondForReturn(new OrderItemQuery().setOrderId(id));
  909. dataInfo.put("dataItem", orderItem);
  910. return ResponseResultUtil.success(dataInfo);
  911. }
  912. /**
  913. * @desc : 条件查询(总单带明细)
  914. * @author : 于继渤
  915. * @date : 2023/1/9 10:36
  916. */
  917. @Pagination
  918. public ResponseResultVO<PageList<OrderResponse>> selectTotalSingleTapeDetailPage(OrderQuery orderQuery) {
  919. return super.mergeListWithCount(orderQuery, orderMapper.selectByCondDetail(orderQuery),
  920. orderMapper.countByCondDetail(orderQuery));
  921. }
  922. /**
  923. * @desc : 销售跟踪报表
  924. * @author : 宋扬
  925. * @date : 2024/4/24 17:17
  926. */
  927. public ResponseResultVO<PageList> getOrderTrackReport(Map<String, Object> param) {
  928. // 获取组合商品
  929. Map<String, Object> map = orderMapper.getOrderTrackReport(param);
  930. JSONObject sku = JSONObject.parseObject(map.get("f_query_ord_for_track").toString());
  931. // 定义返回值
  932. PageList data = new PageList<>();
  933. List dataList = sku.get("data") != null ? JSONObject.parseArray(sku.get("data").toString()).toJavaList(Map.class) : new ArrayList();
  934. // 组装返回值
  935. data.setList(dataList);
  936. return ResponseResultUtil.success(data);
  937. }
  938. /**
  939. * @desc : 一键作废
  940. * @date : 2024/7/1 13:26
  941. * @author : 寇珊珊
  942. */
  943. public ResponseResultVO<?> oneKeyInvalid(String id) {
  944. Order orderForUpdate = orderMapper.selectByIdForUpdate(id);
  945. //region并发校验
  946. if (!orderForUpdate.getFlgValid()) {
  947. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISFLGVALID_FALSE.getMessage());
  948. }
  949. //endregion
  950. //region 作废
  951. Order orderUpdate = new Order();
  952. orderUpdate.setFlgValid(false).setOrderId(id);
  953. super.update(orderUpdate, new UpdateWrapper<Order>().lambda().eq(Order::getOrderId,
  954. UUID.fromString(orderUpdate.getOrderId())));
  955. //endregion
  956. //region 需要重新计算的资金账户
  957. List<String> macList = new ArrayList<>();
  958. // 收款明细
  959. RecPay recPayForUpdate = recPayMapper.selectByBiznisIdForUpdate(id, false);
  960. if (recPayForUpdate != null) {
  961. // 将之前的明细全部删除
  962. List<RecPayItem> recPayItemOriginalList = recPayItemMapper.selectByZIdForUpdate(recPayForUpdate.getRpId());
  963. for (RecPayItem recPayItem : recPayItemOriginalList) {
  964. //改为更新false
  965. RecPayItem recPayItemNew = new RecPayItem();
  966. recPayItemNew.setItemId(recPayItem.getItemId()).setFlgValid(false);
  967. recPayItemService.updateByUuid(recPayItemNew);
  968. // 删除账款明细
  969. accountItemMapper.deleteById(recPayItem.getAccItemId());
  970. // 删除账户流水
  971. moneyAccountItemMapper.deleteByInvoiceId(recPayItem.getItemId());
  972. if (!macList.contains(recPayItem.getMacId())) {
  973. macList.add(recPayItem.getMacId());
  974. }
  975. }
  976. // 更新总账表的总收款额和可用额
  977. accountService.updateReceiptLock(recPayForUpdate.getObjectId());
  978. // 更新账户余额
  979. for (String macId : macList) {
  980. accountService.updateMac(macId);
  981. }
  982. // 作废
  983. RecPay recPayUpdate = new RecPay();
  984. recPayUpdate.setFlgValid(false).setRpId(recPayForUpdate.getRpId());
  985. receiptService.updateByUuid(recPayUpdate);
  986. }
  987. //endregion
  988. //region 作废出库单
  989. outboundSaleOrderService.oneKeySaleOutboundRepeal(id);
  990. //endregion
  991. return ResponseResultUtil.success();
  992. }
  993. }