OrderService.java 59 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176
  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. // 使用HashMap来存储SupName到SupId的映射
  279. Map<String, String> supNameToSupIdMap = new HashMap<>();
  280. for (OrderItemVO orderItemVO : orderVO.getItemList()) {
  281. // 如果SKU ID为空,表示外协品
  282. if (orderItemVO.getSkuId() == null) {
  283. // 如果SupId为空,表示在库中不存在这个供应商
  284. if (orderItemVO.getSupId() == null) {
  285. // 检查是否已经为这个SupName创建了供应商
  286. String existingSupId = supNameToSupIdMap.get(orderItemVO.getSupName());
  287. if (existingSupId == null) {
  288. // 尚未创建,新建供应商
  289. SupplierVo supplierVo = new SupplierVo()
  290. .setSupName(orderItemVO.getSupName())
  291. .setSupType("供应商类别-外协")
  292. .setCpId(authUtils.getStaff().getCpId());
  293. Supplier supplier = supplierService.saleinsert(supplierVo);
  294. // 将新创建的SupId存入映射
  295. supNameToSupIdMap.put(orderItemVO.getSupName(), supplier.getSupId());
  296. // 设置orderItemVO的SupId
  297. orderItemVO.setSupId(supplier.getSupId());
  298. } else {
  299. // 已经创建,直接设置orderItemVO的SupId
  300. orderItemVO.setSupId(existingSupId);
  301. }
  302. }
  303. }
  304. OrderItem orderItem = orderItemConvert.convertToPo(orderItemVO);
  305. orderItem.setOrderId(order.getOrderId()).setCpId(order.getCpId()).setOutStatus(Constant.OutStatus.DAICHUKU.getName());
  306. if (orderItem.getPriceStd() == null) {
  307. orderItem.setPriceStd(BigDecimal.ZERO);
  308. }
  309. if (orderItem.getAmtStd() == null) {
  310. orderItem.setAmtStd(BigDecimal.ZERO);
  311. }
  312. orderItem.setItemId(UUID.randomUUID().toString());
  313. orderItemMapper.insert(orderItem);
  314. orderItemVO.setItemId(orderItem.getItemId());
  315. }
  316. }
  317. /**************************************** 客户收款begin ********************************/
  318. if (orderVO.getReceiptList() != null && orderVO.getReceiptList().size() > 0) {
  319. // 商户产品版本
  320. String gradeCode = "PRO";
  321. Map<String, Object> paramCompany = new HashMap<>();
  322. paramCompany.put("cpId", orderVO.getCpId());
  323. List<Map<String, Object>> listCompany = commonMapper.getCompany(paramCompany);
  324. if (listCompany.size() > 0) {
  325. gradeCode = listCompany.get(0).get("gradeCode").toString();
  326. }
  327. // 获取单号
  328. codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.RECPAY.getName(), false);
  329. RecPay recPay = new RecPay();
  330. // 专业版有定金
  331. if ("PRO".equals(gradeCode)) {
  332. recPay.setRpId(codeMap.get("outId").toString()).setRpNo(codeMap.get("outNote").toString())
  333. .setRpType(Constant.RpType.SHOU_KUAN.getName()).setObjectId(orderVO.getCusId())
  334. .setOrgId(orderVO.getOrgId()).setStaffId(orderVO.getStaffId()).setAccDate(LocalDate.now())
  335. .setBiznisType(Constant.InventoryDocCode.ORDER.getTableName()).setBiznisId(orderVO.getOrderId()).setBiznisNo(orderVO.getOrderNo())
  336. .setMakeStaff(orderVO.getMakeStaff()).setCpId(orderVO.getCpId()).setFlgLock(true);
  337. // 计算订单明细的出库中数量,金额合计
  338. RecPayItemVO itemSum = orderVO.getReceiptList().stream().reduce((x, y) -> {
  339. RecPayItemVO item = new RecPayItemVO();
  340. item.setAmtRec(x.getAmtRec().add(y.getAmtRec()));
  341. return item;
  342. }).get();
  343. recPay.setSumAmtRec(itemSum.getAmtRec());
  344. // 总单保存
  345. recPayMapper.insert(recPay);
  346. // 明细保存
  347. for (RecPayItemVO recPayItemVO : orderVO.getReceiptList()) {
  348. RecPayItem recPayItem = recPayItemConvert.convertToPo(recPayItemVO);
  349. recPayItem.setRpId(recPay.getRpId()).setCpId(recPay.getCpId()).setMakeStaff(recPay.getMakeStaff()).setAccDate(recPay.getAccDate());
  350. recPayItemMapper.insert(recPayItem);
  351. // 插入账款明细
  352. AccountItem accountItem = new AccountItem();
  353. accountItem.setAccItemType(Constant.accItemType.SHOU_KUAN.getName())
  354. .setObjectId(recPay.getObjectId()).setOrgId(recPay.getOrgId()).setStaffId(recPay.getStaffId())
  355. .setAccDate(recPay.getAccDate()).setRecStatus(Constant.recStatuse.QUE_DING.getName()).setAmtRec(recPayItem.getAmtRec())
  356. .setBiznisType(Constant.InventoryDocCode.REC_PAY_ITEM.getTableName()).setBiznisId(recPayItem.getItemId()).setBiznisNo(recPay.getRpNo())
  357. .setMakeStaff(recPay.getMakeStaff()).setCpId(recPay.getCpId()).setFlgLock(true);
  358. accountItemMapper.insert(accountItem);
  359. // 更新收款单上的账款明细Id
  360. RecPayItem recPayItemUpdate = new RecPayItem();
  361. recPayItemUpdate.setAccItemId(accountItem.getItemId()).setItemId(recPayItem.getItemId());
  362. recPayItemService.updateByUuid(recPayItemUpdate);
  363. // 插入资金流水
  364. MoneyAccountItem moneyAccountItem = new MoneyAccountItem();
  365. moneyAccountItem.setMacId(recPayItem.getMacId()).setFlowType(Constant.FlowType.SHOU_FU_KUAN.getName())
  366. .setInvoiceId(recPayItem.getItemId()).setAmtInflow(recPayItem.getAmtRec()).setAccDate(recPay.getAccDate())
  367. .setMakeStaff(recPayItem.getMakeStaff()).setCpId(recPayItem.getCpId());
  368. moneyAccountItemMapper.insert(moneyAccountItem);
  369. // 更新资金账户
  370. MoneyAccount moneyAccountForUpdate = moneyAccountMapper.selectByIdForUpdate(recPayItem.getMacId());
  371. MoneyAccount moneyAccountUpdate = new MoneyAccount();
  372. moneyAccountUpdate.setBalance(moneyAccountForUpdate.getBalance().add(recPayItem.getAmtRec()))
  373. .setMacId(moneyAccountForUpdate.getMacId());
  374. moneyAccountService.updateByUuid(moneyAccountUpdate);
  375. }
  376. // 插入账款总表
  377. Account accountForUpdate = accountService.getCusAccountForUpdate(recPay.getObjectId());
  378. // 更新账款总表上收款的相关字段
  379. Account accountUpdate = new Account();
  380. accountUpdate.setReceiptLock(accountForUpdate.getReceiptLock().add(recPay.getSumAmtRec()))// 锁定金额
  381. .setObjectId(accountForUpdate.getObjectId());
  382. accountService.updateByUuid(accountUpdate);
  383. } else if ("STD".equals(gradeCode)) {
  384. recPay.setRpId(codeMap.get("outId").toString()).setRpNo(codeMap.get("outNote").toString())
  385. .setRpType(Constant.RpType.SHOU_KUAN.getName()).setObjectId(orderVO.getCusId())
  386. .setOrgId(orderVO.getOrgId()).setStaffId(orderVO.getStaffId()).setAccDate(LocalDate.now())
  387. .setBiznisType(Constant.InventoryDocCode.ORDER.getTableName()).setBiznisId(orderVO.getOrderId()).setBiznisNo(orderVO.getOrderNo())
  388. .setMakeStaff(orderVO.getMakeStaff()).setCpId(orderVO.getCpId());
  389. // 计算订单明细的出库中数量,金额合计
  390. RecPayItemVO itemSum = orderVO.getReceiptList().stream().reduce((x, y) -> {
  391. RecPayItemVO item = new RecPayItemVO();
  392. item.setAmtRec(x.getAmtRec().add(y.getAmtRec()));
  393. return item;
  394. }).get();
  395. recPay.setSumAmtRec(itemSum.getAmtRec());
  396. // 总单保存
  397. recPayMapper.insert(recPay);
  398. // 明细保存
  399. for (RecPayItemVO recPayItemVO : orderVO.getReceiptList()) {
  400. RecPayItem recPayItem = recPayItemConvert.convertToPo(recPayItemVO);
  401. recPayItem.setRpId(recPay.getRpId()).setCpId(recPay.getCpId()).setMakeStaff(recPay.getMakeStaff()).setAccDate(recPay.getAccDate());
  402. recPayItemMapper.insert(recPayItem);
  403. // 插入账款明细
  404. AccountItem accountItem = new AccountItem();
  405. accountItem.setAccItemType(Constant.accItemType.SHOU_KUAN.getName())
  406. .setObjectId(recPay.getObjectId()).setOrgId(recPay.getOrgId()).setStaffId(recPay.getStaffId())
  407. .setAccDate(recPay.getAccDate()).setRecStatus(Constant.recStatuse.QUE_DING.getName()).setAmtRec(recPayItem.getAmtRec())
  408. .setBiznisType(Constant.InventoryDocCode.REC_PAY_ITEM.getTableName()).setBiznisId(recPayItem.getItemId()).setBiznisNo(recPay.getRpNo())
  409. .setMakeStaff(recPay.getMakeStaff()).setCpId(recPay.getCpId());
  410. accountItemMapper.insert(accountItem);
  411. // 更新收款单上的账款明细Id
  412. RecPayItem recPayItemUpdate = new RecPayItem();
  413. recPayItemUpdate.setAccItemId(accountItem.getItemId()).setItemId(recPayItem.getItemId());
  414. recPayItemService.updateByUuid(recPayItemUpdate);
  415. // 插入资金流水
  416. MoneyAccountItem moneyAccountItem = new MoneyAccountItem();
  417. moneyAccountItem.setMacId(recPayItem.getMacId()).setFlowType(Constant.FlowType.SHOU_FU_KUAN.getName())
  418. .setInvoiceId(recPayItem.getItemId()).setAmtInflow(recPayItem.getAmtRec()).setAccDate(recPay.getAccDate())
  419. .setMakeStaff(recPayItem.getMakeStaff()).setCpId(recPayItem.getCpId());
  420. moneyAccountItemMapper.insert(moneyAccountItem);
  421. // 更新资金账户
  422. MoneyAccount moneyAccountForUpdate = moneyAccountMapper.selectByIdForUpdate(recPayItem.getMacId());
  423. MoneyAccount moneyAccountUpdate = new MoneyAccount();
  424. moneyAccountUpdate.setBalance(moneyAccountForUpdate.getBalance().add(recPayItem.getAmtRec()))
  425. .setMacId(moneyAccountForUpdate.getMacId());
  426. moneyAccountService.updateByUuid(moneyAccountUpdate);
  427. }
  428. // 插入账款总表
  429. Account accountForUpdate = accountService.getCusAccountForUpdate(recPay.getObjectId());
  430. // 更新账款总表上收款的相关字段
  431. Account accountUpdate = new Account();
  432. accountUpdate.setReceipt(accountForUpdate.getReceipt().add(recPay.getSumAmtRec()))// 总收款金额
  433. .setReceiptResidue(accountForUpdate.getReceiptResidue().add(recPay.getSumAmtRec()))// 可退金额
  434. .setObjectId(accountForUpdate.getObjectId());
  435. accountService.updateByUuid(accountUpdate);
  436. }
  437. }
  438. /**************************************** 客户收款end ********************************/
  439. //开单并出库办理
  440. if (orderVO.getOutboundProcessingFlag() != null && orderVO.getOutboundProcessingFlag()) {
  441. for (OrderItemVO orderItemVO : orderVO.getItemList()) {
  442. orderItemVO.setOutingQty(orderItemVO.getItemQty());
  443. orderItemVO.setOutingAmt(orderItemVO.getItemAmt());
  444. orderItemVO.setPriceOut(orderItemVO.getFactPrice());
  445. orderItemVO.setFromId(orderVO.getOrderId());
  446. orderItemVO.setFromItemId(orderItemVO.getItemId());
  447. }
  448. OutboundVO outboundVO = outBoundDtoConvert.convertToPo(orderVO);
  449. outboundVO.setOutDate(LocalDate.now());
  450. outboundVO.setOutingQty(orderVO.getSumQuantity());
  451. outboundVO.setOutingAmt(orderVO.getFactAmt());
  452. outboundVO.setFlgAutoHandle(orderVO.getFlgAutoHandle());
  453. outboundVO.setFlgHandleSetting(orderVO.getFlgHandleSetting());
  454. outboundVO.setFromId(order.getOrderId());
  455. outboundVO.setFromNo(order.getOrderNo());
  456. outboundVO.setOutDate(orderVO.getDeliveryDate());
  457. outboundVO.setFactAmt(orderVO.getFactAmt());
  458. outboundVO.setDiscount(orderVO.getDiscount());
  459. outboundVO.setDiscAmt(orderVO.getDiscAmt());
  460. outboundVO.setSumAmount(orderVO.getSumAmount());
  461. outboundSaleOrderService.inventoryOUtBond(outboundVO);
  462. }
  463. return ResponseResultUtil.success();
  464. }
  465. /**
  466. * @desc : 编辑方法
  467. * @author : 付斌
  468. * @date : 2023/1/9 10:49
  469. */
  470. @Transactional(
  471. rollbackFor = {Exception.class}
  472. )
  473. public ResponseResultVO<?> update(OrderVO orderVO) {
  474. Order orderForUpdate = orderMapper.selectByIdForUpdate(orderVO.getOrderId());
  475. // 并发校验
  476. if (!orderForUpdate.getFlgValid()) {
  477. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISFLGVALID_FALSE.getMessage());
  478. }
  479. // 如果全部出库了
  480. //标:之前沟通允许大编辑,目前订单开单已出库的单子进行编辑是不允许操作的(请确定一下,到底系统设计是否允许大编辑?)
  481. //bug 6933可查
  482. // if (orderForUpdate.getSumQuantity().compareTo(orderForUpdate.getOutQty()) == 0) {
  483. // throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ORDER_IS_OUT.getMessage());
  484. // }
  485. // 商户产品版本
  486. String gradeCode = "PRO";
  487. Map<String, Object> paramCompany = new HashMap<>();
  488. paramCompany.put("cpId", orderVO.getCpId());
  489. List<Map<String, Object>> listCompany = commonMapper.getCompany(paramCompany);
  490. if (listCompany.size() > 0) {
  491. gradeCode = listCompany.get(0).get("gradeCode").toString();
  492. }
  493. // 明细实体(避免并发,需要再查一遍)
  494. OrderItem orderItemForUpdate;
  495. // 转化实体
  496. Order order = orderConvert.convertToPo(orderVO);
  497. //删除的
  498. if (orderVO.getDeleteItemList() != null) {
  499. List<OrderItemVO> deleteOrderItemVOList = orderVO.getDeleteItemList().stream().filter(it -> it.getItemId() != null).collect(Collectors.toList());
  500. if (deleteOrderItemVOList.size() > 0) {
  501. for (OrderItemVO orderItemVO : deleteOrderItemVOList) {
  502. orderItemForUpdate = orderItemMapper.selectByIdForUpdate(orderItemVO.getItemId());
  503. //当gradeCode为"STD"时,无论outStatus是什么,都直接删除;而当gradeCode不是"STD"时,只有outStatus为DAICHUKU时才允许删除
  504. if (Constant.GradeCode.STD.getName().equals(gradeCode) ||
  505. (Constant.OutStatus.DAICHUKU.getName().equals(orderItemForUpdate.getOutStatus()))) {
  506. orderItemMapper.deleteById(orderItemVO.getItemId());
  507. } else {
  508. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.NO_WAIT_INTO.getMessage());
  509. }
  510. }
  511. }
  512. }
  513. // 编辑的
  514. List<OrderItemVO> editOrderItemVOList = orderVO.getItemList().stream().filter(it -> it.getItemId() != null).collect(Collectors.toList());
  515. for (OrderItemVO orderItemVO : editOrderItemVOList) {
  516. orderItemForUpdate = orderItemMapper.selectByIdForUpdate(orderItemVO.getItemId());
  517. // 出库数量
  518. BigDecimal outintOrOutQty = orderItemForUpdate.getOutingQty().add(orderItemForUpdate.getOutQty());
  519. if (!Constant.GradeCode.STD.getName().equals(gradeCode)) {
  520. // 商品数量不能小于(出库中数量+已出库数量)
  521. if (orderItemVO.getItemQty().compareTo(outintOrOutQty) == -1) {
  522. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ITEMQTY_NO_LESS_OUTQTY.getMessage());
  523. }
  524. }
  525. // 如果出库数量不是0,则不能改仓库
  526. if (outintOrOutQty.compareTo(BigDecimal.ZERO) != 0) {
  527. if (orderItemForUpdate.getSkuId() != null) { //过滤外协品
  528. if (!orderItemForUpdate.getWhId().equals(orderItemVO.getWhId())) {
  529. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ORDER_ISOUT.getMessage());
  530. }
  531. }
  532. }
  533. OrderItem orderItem = orderItemConvert.convertToPo(orderItemVO);
  534. orderItemService.updateByUuid(orderItem);
  535. // 免费版:
  536. // 订单编辑钱保存,要更改对应出库单的钱
  537. // 订单编辑数量保存,要更改对应出库单数量,并且更新库存;更改后数量不能小于退货数量;
  538. // 专业版:编辑保持原逻辑
  539. if ("STD".equals(gradeCode)) { //免費版特加逻辑
  540. //更改后数量不能小于退货数量;
  541. if (orderItemVO.getItemQty().compareTo(orderItemForUpdate.getReturnQty()) == -1) {
  542. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.GOODSQTY_NO_LESS_RETURNQTY.getMessage());
  543. }
  544. }
  545. }
  546. // 新增的
  547. List<OrderItemVO> insertOrderItemVOList = orderVO.getItemList().stream().filter(it -> it.getItemId() == null).collect(Collectors.toList());
  548. // 使用HashMap来存储SupName到SupId的映射
  549. Map<String, String> supNameToSupIdMap = new HashMap<>();
  550. for (OrderItemVO orderItemVO : insertOrderItemVOList) {
  551. // 如果SKU ID为空,表示外协品
  552. if (orderItemVO.getSkuId() == null) {
  553. // 如果SupId为空,表示在库中不存在这个供应商
  554. if (orderItemVO.getSupId() == null) {
  555. // 检查是否已经为这个SupName创建了供应商
  556. String existingSupId = supNameToSupIdMap.get(orderItemVO.getSupName());
  557. if (existingSupId == null) {
  558. // 尚未创建,新建供应商
  559. SupplierVo supplierVo = new SupplierVo()
  560. .setSupName(orderItemVO.getSupName())
  561. .setSupType("供应商类别-外协")
  562. .setCpId(authUtils.getStaff().getCpId());
  563. Supplier supplier = supplierService.saleinsert(supplierVo);
  564. // 将新创建的SupId存入映射
  565. supNameToSupIdMap.put(orderItemVO.getSupName(), supplier.getSupId());
  566. // 设置orderItemVO的SupId
  567. orderItemVO.setSupId(supplier.getSupId());
  568. } else {
  569. // 已经创建,直接设置orderItemVO的SupId
  570. orderItemVO.setSupId(existingSupId);
  571. }
  572. }
  573. }
  574. OrderItem orderItem = orderItemConvert.convertToPo(orderItemVO);
  575. orderItem.setOrderId(order.getOrderId()).setCpId(order.getCpId()).setOutStatus(Constant.OutStatus.DAICHUKU.getName());
  576. orderItem.setItemId(UUID.randomUUID().toString());
  577. orderItemMapper.insert(orderItem);
  578. orderItemVO.setItemId(orderItem.getItemId());
  579. orderItemVO.setOrderId(orderVO.getOrderId());
  580. }
  581. // 删除业绩信息
  582. multiOwnerMapper.deleteByOrderId(order.getOrderId());
  583. // 重新保存业绩信息
  584. // 业务部门业绩保存
  585. if (orderVO.getOrgList() != null && orderVO.getOrgList().size() > 0) {
  586. for (Map<String, Object> map : orderVO.getOrgList()) {
  587. MultiOwner multiOwner = new MultiOwner();
  588. multiOwner.setOrderId(order.getOrderId()).setOwnerId(map.get("orgId").toString())
  589. .setAllocationRatio(new BigDecimal(map.get("allocationRatio").toString())).setCpId(order.getCpId());
  590. if (Boolean.parseBoolean(map.get("ownerFlag").toString())) {
  591. multiOwner.setOwnerType(Constant.OwnerType.Z_ORG.getName());
  592. } else {
  593. multiOwner.setOwnerType(Constant.OwnerType.C_ORG.getName());
  594. }
  595. multiOwnerMapper.insert(multiOwner);
  596. }
  597. }
  598. // 业务员业绩保存
  599. if (orderVO.getStaffList() != null && orderVO.getStaffList().size() > 0) {
  600. for (Map<String, Object> map : orderVO.getStaffList()) {
  601. MultiOwner multiOwner = new MultiOwner();
  602. multiOwner.setOrderId(order.getOrderId()).setOwnerId(map.get("staffId").toString())
  603. .setAllocationRatio(new BigDecimal(map.get("allocationRatio").toString())).setCpId(order.getCpId());
  604. if (Boolean.parseBoolean(map.get("ownerFlag").toString())) {
  605. multiOwner.setOwnerType(Constant.OwnerType.Z_STAFF.getName());
  606. } else {
  607. multiOwner.setOwnerType(Constant.OwnerType.C_STAFF.getName());
  608. }
  609. multiOwnerMapper.insert(multiOwner);
  610. }
  611. }
  612. // 更新总单
  613. super.update(order, new UpdateWrapper<Order>().lambda().eq(Order::getOrderId,
  614. UUID.fromString(order.getOrderId())));
  615. /**************************************** 客户收款begin ********************************/
  616. // 需要重新计算的资金账户
  617. List<String> macList = new ArrayList<>();
  618. // 收款明细
  619. RecPay recPayForUpdate = recPayMapper.selectByBiznisIdForUpdate(orderVO.getOrderId(), false);
  620. if (recPayForUpdate != null) {
  621. // 将之前的明细全部删除
  622. List<RecPayItem> recPayItemOriginalList = recPayItemMapper.selectByZIdForUpdate(recPayForUpdate.getRpId());
  623. for (RecPayItem recPayItem : recPayItemOriginalList) {
  624. // 删除收付款明细
  625. recPayItemMapper.deleteById(recPayItem.getItemId());
  626. // 删除账款明细
  627. accountItemMapper.deleteById(recPayItem.getAccItemId());
  628. // 删除账户流水
  629. moneyAccountItemMapper.deleteByInvoiceId(recPayItem.getItemId());
  630. if (!macList.contains(recPayItem.getMacId())) {
  631. macList.add(recPayItem.getMacId());
  632. }
  633. }
  634. }
  635. // 专业版有定金
  636. if ("PRO".equals(gradeCode)) {
  637. if (orderVO.getReceiptList() != null && orderVO.getReceiptList().size() > 0) {
  638. // 计算订单明细的出库中数量,金额合计
  639. RecPayItemVO itemSum = orderVO.getReceiptList().stream().reduce((x, y) -> {
  640. RecPayItemVO item = new RecPayItemVO();
  641. item.setAmtRec(x.getAmtRec().add(y.getAmtRec()));
  642. return item;
  643. }).get();
  644. RecPay recPay = null;
  645. if (recPayForUpdate == null) {
  646. recPay = new RecPay();
  647. // 获取单号
  648. Map<String, Object> codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.RECPAY.getName(), false);
  649. recPay.setRpId(codeMap.get("outId").toString()).setRpNo(codeMap.get("outNote").toString())
  650. .setRpType(Constant.RpType.SHOU_KUAN.getName()).setObjectId(orderVO.getCusId())
  651. .setOrgId(orderVO.getOrgId()).setStaffId(orderVO.getStaffId()).setAccDate(LocalDate.now())
  652. .setBiznisType(Constant.InventoryDocCode.ORDER.getTableName()).setBiznisId(orderVO.getOrderId()).setBiznisNo(orderVO.getOrderNo())
  653. .setMakeStaff(orderVO.getMakeStaff()).setCpId(orderVO.getCpId()).setFlgLock(true);
  654. recPay.setSumAmtRec(itemSum.getAmtRec());
  655. recPayMapper.insert(recPay);
  656. recPayForUpdate = recPay;
  657. } else {
  658. // 更新收款总额
  659. RecPay recPayUpdate = new RecPay();
  660. recPayUpdate.setSumAmtRec(itemSum.getAmtRec()).setRpId(recPayForUpdate.getRpId());
  661. receiptService.updateByUuid(recPayUpdate);
  662. // 赋值recPay,下面要用
  663. recPay = recPayForUpdate;
  664. }
  665. // 明细保存
  666. for (RecPayItemVO recPayItemVO : orderVO.getReceiptList()) {
  667. RecPayItem recPayItem = recPayItemConvert.convertToPo(recPayItemVO);
  668. recPayItem.setItemId(null).setRpId(recPay.getRpId()).setCpId(recPay.getCpId()).setMakeStaff(recPay.getMakeStaff()).setAccDate(recPay.getAccDate());
  669. recPayItemMapper.insert(recPayItem);
  670. // 插入账款明细
  671. AccountItem accountItem = new AccountItem();
  672. accountItem.setAccItemType(Constant.accItemType.SHOU_KUAN.getName())
  673. .setObjectId(recPay.getObjectId()).setOrgId(recPay.getOrgId()).setStaffId(recPay.getStaffId())
  674. .setAccDate(recPay.getAccDate()).setRecStatus(Constant.recStatuse.QUE_DING.getName()).setAmtRec(recPayItem.getAmtRec())
  675. .setBiznisType(Constant.InventoryDocCode.REC_PAY_ITEM.getTableName()).setBiznisId(recPayItem.getItemId()).setBiznisNo(recPay.getRpNo())
  676. .setMakeStaff(recPay.getMakeStaff()).setCpId(recPay.getCpId()).setFlgLock(true);
  677. accountItemMapper.insert(accountItem);
  678. // 更新收款单上的账款明细Id
  679. RecPayItem recPayItemUpdate = new RecPayItem();
  680. recPayItemUpdate.setAccItemId(accountItem.getItemId()).setItemId(recPayItem.getItemId());
  681. recPayItemService.updateByUuid(recPayItemUpdate);
  682. // 插入资金流水
  683. MoneyAccountItem moneyAccountItem = new MoneyAccountItem();
  684. moneyAccountItem.setMacId(recPayItem.getMacId()).setFlowType(Constant.FlowType.SHOU_FU_KUAN.getName())
  685. .setInvoiceId(recPayItem.getItemId()).setAmtInflow(recPayItem.getAmtRec()).setAccDate(recPay.getAccDate())
  686. .setMakeStaff(recPayItem.getMakeStaff()).setCpId(recPayItem.getCpId());
  687. moneyAccountItemMapper.insert(moneyAccountItem);
  688. if (!macList.contains(recPayItem.getMacId())) {
  689. macList.add(recPayItem.getMacId());
  690. }
  691. }
  692. }
  693. if (recPayForUpdate != null) {
  694. // 更新总账表的锁定金额
  695. accountService.updateReceiptLock(recPayForUpdate.getObjectId());
  696. }
  697. } else if (Constant.GradeCode.STD.getName().equals(gradeCode)) {
  698. if (orderVO.getReceiptList() != null && orderVO.getReceiptList().size() > 0) {
  699. // 计算订单明细的出库中数量,金额合计
  700. RecPayItemVO itemSum = orderVO.getReceiptList().stream().reduce((x, y) -> {
  701. RecPayItemVO item = new RecPayItemVO();
  702. item.setAmtRec(x.getAmtRec().add(y.getAmtRec()));
  703. return item;
  704. }).get();
  705. RecPay recPay = null;
  706. if (recPayForUpdate == null) {
  707. recPay = new RecPay();
  708. // 获取单号
  709. Map<String, Object> codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.RECPAY.getName(), false);
  710. recPay.setRpId(codeMap.get("outId").toString()).setRpNo(codeMap.get("outNote").toString())
  711. .setRpType(Constant.RpType.SHOU_KUAN.getName()).setObjectId(orderVO.getCusId())
  712. .setOrgId(orderVO.getOrgId()).setStaffId(orderVO.getStaffId()).setAccDate(LocalDate.now())
  713. .setBiznisType(Constant.InventoryDocCode.ORDER.getTableName()).setBiznisId(orderVO.getOrderId()).setBiznisNo(orderVO.getOrderNo())
  714. .setMakeStaff(orderVO.getMakeStaff()).setCpId(orderVO.getCpId());
  715. recPay.setSumAmtRec(itemSum.getAmtRec());
  716. recPayMapper.insert(recPay);
  717. recPayForUpdate = recPay;
  718. } else {
  719. // 更新收款总额
  720. RecPay recPayUpdate = new RecPay();
  721. recPayUpdate.setSumAmtRec(itemSum.getAmtRec()).setRpId(recPayForUpdate.getRpId());
  722. receiptService.updateByUuid(recPayUpdate);
  723. // 赋值recPay,下面要用
  724. recPay = recPayForUpdate;
  725. }
  726. // 明细保存
  727. for (RecPayItemVO recPayItemVO : orderVO.getReceiptList()) {
  728. RecPayItem recPayItem = recPayItemConvert.convertToPo(recPayItemVO);
  729. recPayItem.setItemId(null).setRpId(recPay.getRpId()).setCpId(recPay.getCpId()).setMakeStaff(recPay.getMakeStaff()).setAccDate(recPay.getAccDate());
  730. recPayItemMapper.insert(recPayItem);
  731. // 插入账款明细
  732. AccountItem accountItem = new AccountItem();
  733. accountItem.setAccItemType(Constant.accItemType.SHOU_KUAN.getName())
  734. .setObjectId(recPay.getObjectId()).setOrgId(recPay.getOrgId()).setStaffId(recPay.getStaffId())
  735. .setAccDate(recPay.getAccDate()).setRecStatus(Constant.recStatuse.QUE_DING.getName()).setAmtRec(recPayItem.getAmtRec())
  736. .setBiznisType(Constant.InventoryDocCode.REC_PAY_ITEM.getTableName()).setBiznisId(recPayItem.getItemId()).setBiznisNo(recPay.getRpNo())
  737. .setMakeStaff(recPay.getMakeStaff()).setCpId(recPay.getCpId());
  738. accountItemMapper.insert(accountItem);
  739. // 更新收款单上的账款明细Id
  740. RecPayItem recPayItemUpdate = new RecPayItem();
  741. recPayItemUpdate.setAccItemId(accountItem.getItemId()).setItemId(recPayItem.getItemId());
  742. recPayItemService.updateByUuid(recPayItemUpdate);
  743. // 插入资金流水
  744. MoneyAccountItem moneyAccountItem = new MoneyAccountItem();
  745. moneyAccountItem.setMacId(recPayItem.getMacId()).setFlowType(Constant.FlowType.SHOU_FU_KUAN.getName())
  746. .setInvoiceId(recPayItem.getItemId()).setAmtInflow(recPayItem.getAmtRec()).setAccDate(recPay.getAccDate())
  747. .setMakeStaff(recPayItem.getMakeStaff()).setCpId(recPayItem.getCpId());
  748. moneyAccountItemMapper.insert(moneyAccountItem);
  749. if (!macList.contains(recPayItem.getMacId())) {
  750. macList.add(recPayItem.getMacId());
  751. }
  752. }
  753. }
  754. if (recPayForUpdate != null) {
  755. // 更新总账表的总收款额和可用额
  756. accountService.updateReceipt(recPayForUpdate.getObjectId());
  757. }
  758. }
  759. // 更新账户余额
  760. for (String macId : macList) {
  761. accountService.updateMac(macId);
  762. }
  763. /**************************************** 客户收款end ********************************/
  764. if (Constant.GradeCode.STD.getName().equals(gradeCode)) { //订单 转 出库数据
  765. // 合并两个列表
  766. List<OrderItemVO> combinedList = Stream.concat(insertOrderItemVOList.stream(), editOrderItemVOList.stream())
  767. .collect(Collectors.toList());
  768. if (combinedList.size() > 0) { //编辑时新选的数据生成出库单
  769. //开单并出库办理
  770. if (orderVO.getOutboundProcessingFlag() != null && orderVO.getOutboundProcessingFlag()) {
  771. //标准版 只有一个出库单 所以get0 就可以 且 编辑销售订单得时候 一定是有出库单的
  772. List<OutboundResponse> outboundList = outboundMapper.selectByCond(new OutboundQuery().setFromId(orderVO.getOrderId()));
  773. if (outboundList.size() > 0) { //有订单有出库单后续才编辑 没有就不用编辑
  774. OutboundResponse outboundResponsejson = outboundList.get(0);
  775. for (OrderItemVO orderItemVO : combinedList) {
  776. //拿到 订单明细对应的出库明细 订单明细id 和 出库单来源明细 是一 一 对应的 所以 get0 也是不会有问题的
  777. List<OutboundItemResponse> outboundItemList = outboundItemMapper.selectByCond(new OutboundItemQuery().setFromItemId(orderItemVO.getItemId()));
  778. OutboundItemResponse outboundItemjson = null;
  779. if (outboundItemList.size() != 0) { //没查到库存数据说明是新增的品 还没出库呢
  780. outboundItemjson = outboundItemList.get(0);
  781. }
  782. orderItemVO.setOutingQty(orderItemVO.getItemQty());
  783. orderItemVO.setOutingAmt(orderItemVO.getItemAmt());
  784. orderItemVO.setPriceOut(orderItemVO.getFactPrice());
  785. orderItemVO.setFromId(orderVO.getOrderId());
  786. orderItemVO.setFromItemId(orderItemVO.getItemId());
  787. orderItemVO.setOutId(outboundResponsejson.getOutId());
  788. orderItemVO.setItemId(outboundItemjson == null ? null : outboundItemjson.getItemId());
  789. }
  790. if (orderVO.getDeleteItemList() != null) { //删除list
  791. List<OrderItemVO> deleteOrderItemVOList = orderVO.getDeleteItemList().stream().filter(it -> it.getItemId() != null).collect(Collectors.toList());
  792. if (deleteOrderItemVOList.size() > 0) {
  793. for (OrderItemVO orderItemVO : deleteOrderItemVOList) {
  794. orderItemVO.setOutId(outboundResponsejson.getOutId());
  795. orderItemVO.setPriceOut(orderItemVO.getFactPrice());
  796. }
  797. orderVO.setDeleteItemList(deleteOrderItemVOList);
  798. }
  799. }
  800. orderVO.setItemList(combinedList);
  801. OutboundVO outboundVO = outBoundDtoConvert.convertToPo(orderVO);
  802. outboundVO.setOutDate(LocalDate.now());
  803. outboundVO.setOutingQty(orderVO.getSumQuantity());
  804. outboundVO.setOutingAmt(orderVO.getFactAmt());
  805. outboundVO.setFlgAutoHandle(orderVO.getFlgAutoHandle());
  806. outboundVO.setFlgHandleSetting(orderVO.getFlgHandleSetting());
  807. outboundVO.setFromId(order.getOrderId());
  808. outboundVO.setFromNo(order.getOrderNo());
  809. outboundVO.setOutDate(orderVO.getDeliveryDate());
  810. outboundVO.setFactAmt(orderVO.getFactAmt());
  811. outboundVO.setDiscount(orderVO.getDiscount());
  812. outboundVO.setDiscAmt(orderVO.getDiscAmt());
  813. outboundVO.setSumAmount(orderVO.getSumAmount());
  814. outboundVO.setOutId(outboundResponsejson.getOutId());
  815. outboundVO.setLimitEdit(true);
  816. outboundSaleOrderService.saleOutboundUpdate(outboundVO);
  817. }
  818. }
  819. }
  820. }
  821. return ResponseResultUtil.success();
  822. }
  823. /**
  824. * @desc : 作废
  825. * @author : 付斌
  826. * @date : 2024-03-08 16:38
  827. */
  828. public ResponseResultVO<?> invalid(String id) {
  829. Order orderForUpdate = orderMapper.selectByIdForUpdate(id);
  830. // 并发校验
  831. if (!orderForUpdate.getFlgValid()) {
  832. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISFLGVALID_FALSE.getMessage());
  833. }
  834. // 如果出库中数量或已出库数量不是0,不能作废
  835. if (orderForUpdate.getOutingQty().compareTo(BigDecimal.ZERO) != 0 || orderForUpdate.getOutQty().compareTo(BigDecimal.ZERO) != 0) {
  836. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISEXISTS_AFTER_OPERATE.getMessage());
  837. }
  838. // 作废
  839. Order orderUpdate = new Order();
  840. orderUpdate.setFlgValid(false).setOrderId(id);
  841. super.update(orderUpdate, new UpdateWrapper<Order>().lambda().eq(Order::getOrderId,
  842. UUID.fromString(orderUpdate.getOrderId())));
  843. // 需要重新计算的资金账户
  844. List<String> macList = new ArrayList<>();
  845. // 收款明细
  846. RecPay recPayForUpdate = recPayMapper.selectByBiznisIdForUpdate(id, false);
  847. if (recPayForUpdate != null) {
  848. // 将之前的明细全部删除
  849. List<RecPayItem> recPayItemOriginalList = recPayItemMapper.selectByZIdForUpdate(recPayForUpdate.getRpId());
  850. for (RecPayItem recPayItem : recPayItemOriginalList) {
  851. // 删除收付款明细 240627
  852. // recPayItemMapper.deleteById(recPayItem.getItemId());
  853. // 改为更新false
  854. RecPayItem recPayItemNew = new RecPayItem();
  855. recPayItemNew.setItemId(recPayItem.getItemId()).setFlgValid(false);
  856. recPayItemService.updateByUuid(recPayItemNew);
  857. // 删除账款明细
  858. accountItemMapper.deleteById(recPayItem.getAccItemId());
  859. // 删除账户流水
  860. moneyAccountItemMapper.deleteByInvoiceId(recPayItem.getItemId());
  861. if (!macList.contains(recPayItem.getMacId())) {
  862. macList.add(recPayItem.getMacId());
  863. }
  864. }
  865. // 更新总账表的总收款额和可用额
  866. accountService.updateReceiptLock(recPayForUpdate.getObjectId());
  867. // 更新账户余额
  868. for (String macId : macList) {
  869. accountService.updateMac(macId);
  870. }
  871. // 作废
  872. RecPay recPayUpdate = new RecPay();
  873. recPayUpdate.setFlgValid(false).setRpId(recPayForUpdate.getRpId());
  874. receiptService.updateByUuid(recPayUpdate);
  875. }
  876. return ResponseResultUtil.success();
  877. }
  878. /**
  879. * @desc : 获取订单信息(编辑用)
  880. * @author : 付斌
  881. * @date : 2024-03-02 17:27
  882. */
  883. public ResponseResultVO<?> getOrderForUpdate(String id) {
  884. Map<String, Object> dataInfo = new HashMap<>();
  885. OrderResponse orderResponse = orderMapper.selectById(id);
  886. dataInfo.put("data", orderResponse);
  887. // 商品明细
  888. List<OrderItemResponse> orderItemResponse = orderItemMapper.selectByCond(new OrderItemQuery().setOrderId(id));
  889. dataInfo.put("dataItem", orderItemResponse);
  890. //查询主从业务员
  891. List<String> staffList = new ArrayList<>();
  892. staffList.add(Constant.OwnerType.Z_STAFF.getName());
  893. staffList.add(Constant.OwnerType.C_STAFF.getName());
  894. List<MultiOwnerResponse> multiOwnersStaff = multiOwnerMapper.selectByType(new MultiOwnerQuery().setOrderId(id).setOwnerTypes(staffList));
  895. if (multiOwnersStaff != null && multiOwnersStaff.size() > 0) {
  896. dataInfo.put("staffList", multiOwnersStaff);
  897. }
  898. //查询主从业务部门
  899. List<String> orgList = new ArrayList<>();
  900. orgList.add(Constant.OwnerType.Z_ORG.getName());
  901. orgList.add(Constant.OwnerType.C_ORG.getName());
  902. List<MultiOwnerResponse> multiOwnersOrg = multiOwnerMapper.selectByType(new MultiOwnerQuery().setOrderId(id).setOwnerTypes(orgList));
  903. if (multiOwnersOrg != null && multiOwnersOrg.size() > 0) {
  904. dataInfo.put("orgList", multiOwnersOrg);
  905. }
  906. // 获取实收金额
  907. Map<String, Object> mapFactReceipt = orderMapper.getFactReceipt(id);
  908. orderResponse.setAmtFactReceipt(new BigDecimal(mapFactReceipt.get("sumFactReceipt").toString()));
  909. // 收款明细
  910. List<RecPayResponse> recPayList = recPayMapper.selectByCond(new RecPayQuery().setBiznisId(id).setFlgOrderHandle(false));
  911. if (recPayList != null && recPayList.size() > 0) {
  912. // 如果有定金,实收金额加上定金
  913. if (recPayList.get(0).getFlgLock()) {
  914. orderResponse.setAmtFactReceipt(orderResponse.getAmtFactReceipt().add(recPayList.get(0).getSumAmtRec()));
  915. }
  916. List<RecPayItemResponse> receiptItem = recPayItemMapper.selectByCond(new RecPayItemQuery().setRpId(recPayList.get(0).getRpId()));
  917. dataInfo.put("receiptItem", receiptItem);
  918. } else {
  919. dataInfo.put("receiptItem", new ArrayList<RecPayResponse>());
  920. }
  921. return ResponseResultUtil.success(dataInfo);
  922. }
  923. /**
  924. * @desc : 获取订单信息(出库用)
  925. * @author : 付斌
  926. * @date : 2024-03-02 17:27
  927. */
  928. public ResponseResultVO<?> getOrderForOut(String id) {
  929. Map<String, Object> dataInfo = new HashMap<>();
  930. OrderResponse orderResponse = orderMapper.selectById(id);
  931. dataInfo.put("data", orderResponse);
  932. // 商品明细
  933. List<OrderItemResponse> orderItem = orderItemMapper.selectByCondForOut(new OrderItemQuery().setOrderId(id));
  934. dataInfo.put("dataItem", orderItem);
  935. return ResponseResultUtil.success(dataInfo);
  936. }
  937. /**
  938. * @desc : 获取订单信息(退货用)
  939. * @author : 付斌
  940. * @date : 2024-03-02 17:27
  941. */
  942. public ResponseResultVO<?> getOrderForReturn(String id) {
  943. Map<String, Object> dataInfo = new HashMap<>();
  944. OrderResponse orderResponse = orderMapper.selectById(id);
  945. // 数量金额取反
  946. orderResponse.setSumQuantity(orderResponse.getSumQuantity().negate()).setSumAmount(orderResponse.getSumAmount().negate());
  947. dataInfo.put("data", orderResponse);
  948. // 商品明细
  949. List<OrderItemResponse> orderItem = orderItemMapper.selectByCondForReturn(new OrderItemQuery().setOrderId(id));
  950. dataInfo.put("dataItem", orderItem);
  951. return ResponseResultUtil.success(dataInfo);
  952. }
  953. /**
  954. * @desc : 条件查询(总单带明细)
  955. * @author : 于继渤
  956. * @date : 2023/1/9 10:36
  957. */
  958. @Pagination
  959. public ResponseResultVO<PageList<OrderResponse>> selectTotalSingleTapeDetailPage(OrderQuery orderQuery) {
  960. return super.mergeListWithCount(orderQuery, orderMapper.selectByCondDetail(orderQuery),
  961. orderMapper.countByCondDetail(orderQuery));
  962. }
  963. /**
  964. * @desc : 销售跟踪报表
  965. * @author : 宋扬
  966. * @date : 2024/4/24 17:17
  967. */
  968. public ResponseResultVO<PageList> getOrderTrackReport(Map<String, Object> param) {
  969. // 获取组合商品
  970. Map<String, Object> map = orderMapper.getOrderTrackReport(param);
  971. JSONObject sku = JSONObject.parseObject(map.get("f_query_ord_for_track").toString());
  972. // 定义返回值
  973. PageList data = new PageList<>();
  974. List dataList = sku.get("data") != null ? JSONObject.parseArray(sku.get("data").toString()).toJavaList(Map.class) : new ArrayList();
  975. // 组装返回值
  976. data.setList(dataList);
  977. return ResponseResultUtil.success(data);
  978. }
  979. /**
  980. * @desc : 一键作废
  981. * @date : 2024/7/1 13:26
  982. * @author : 寇珊珊
  983. */
  984. public ResponseResultVO<?> oneKeyInvalid(String id) {
  985. //region 查询当前订单下是否存在有效的退货单
  986. Long count = outboundItemMapper.selectHasReturn(new OutboundItemQuery()
  987. .setSOrderId(id)
  988. .setFlgValid(true)
  989. .setOutType(Constant.OutType.SALE_RETURN.getName()));
  990. if (count != null && count > 0) {
  991. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ORDER_IS_EXISTS_RETURN_ORDERS.getMessage());
  992. }
  993. //endregion
  994. Order orderForUpdate = orderMapper.selectByIdForUpdate(id);
  995. //region并发校验
  996. if (!orderForUpdate.getFlgValid()) {
  997. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISFLGVALID_FALSE.getMessage());
  998. }
  999. //endregion
  1000. //region 作废
  1001. Order orderUpdate = new Order();
  1002. orderUpdate.setFlgValid(false).setOrderId(id);
  1003. super.update(orderUpdate, new UpdateWrapper<Order>().lambda().eq(Order::getOrderId,
  1004. UUID.fromString(orderUpdate.getOrderId())));
  1005. //endregion
  1006. //region 需要重新计算的资金账户
  1007. List<String> macList = new ArrayList<>();
  1008. // 收款明细
  1009. RecPay recPayForUpdate = recPayMapper.selectByBiznisIdForUpdate(id, false);
  1010. if (recPayForUpdate != null) {
  1011. // 将之前的明细全部删除
  1012. List<RecPayItem> recPayItemOriginalList = recPayItemMapper.selectByZIdForUpdate(recPayForUpdate.getRpId());
  1013. for (RecPayItem recPayItem : recPayItemOriginalList) {
  1014. //改为更新false
  1015. RecPayItem recPayItemNew = new RecPayItem();
  1016. recPayItemNew.setItemId(recPayItem.getItemId()).setFlgValid(false);
  1017. recPayItemService.updateByUuid(recPayItemNew);
  1018. // 删除账款明细
  1019. accountItemMapper.deleteById(recPayItem.getAccItemId());
  1020. // 删除账户流水
  1021. moneyAccountItemMapper.deleteByInvoiceId(recPayItem.getItemId());
  1022. if (!macList.contains(recPayItem.getMacId())) {
  1023. macList.add(recPayItem.getMacId());
  1024. }
  1025. }
  1026. String gradeCode = authUtils.getStaff().getGradeCode();
  1027. // 更新总账表的总收款额和可用额
  1028. if (Constant.GradeCode.STD.getName().equals(gradeCode)) {
  1029. accountService.updateReceipt(recPayForUpdate.getObjectId());
  1030. } else {
  1031. accountService.updateReceiptLock(recPayForUpdate.getObjectId());
  1032. }
  1033. // 更新账户余额
  1034. for (String macId : macList) {
  1035. accountService.updateMac(macId);
  1036. }
  1037. // 作废
  1038. RecPay recPayUpdate = new RecPay();
  1039. recPayUpdate.setFlgValid(false).setRpId(recPayForUpdate.getRpId());
  1040. receiptService.updateByUuid(recPayUpdate);
  1041. }
  1042. //endregion
  1043. //region 作废出库单
  1044. outboundSaleOrderService.oneKeySaleOutboundRepeal(id);
  1045. //endregion
  1046. return ResponseResultUtil.success();
  1047. }
  1048. }