OrderService.java 60 KB

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