OrderService.java 62 KB

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