OrderService.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. package com.dk.mdm.service.sale;
  2. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  3. import com.dk.common.exception.BaseBusinessException;
  4. import com.dk.common.infrastructure.annotaiton.Pagination;
  5. import com.dk.common.infrastructure.constant.Constant;
  6. import com.dk.common.infrastructure.enums.ErrorCodeEnum;
  7. import com.dk.common.model.pojo.PageList;
  8. import com.dk.common.response.ResponseCodeEnum;
  9. import com.dk.common.response.ResponseResultUtil;
  10. import com.dk.common.response.ResponseResultVO;
  11. import com.dk.mdm.infrastructure.convert.sale.OrderConvert;
  12. import com.dk.mdm.infrastructure.convert.sale.OrderItemConvert;
  13. import com.dk.mdm.mapper.mst.CustomerMapper;
  14. import com.dk.mdm.mapper.sale.MultiOwnerMapper;
  15. import com.dk.mdm.mapper.sale.OrderItemMapper;
  16. import com.dk.mdm.mapper.sale.OrderMapper;
  17. import com.dk.mdm.model.pojo.mst.Customer;
  18. import com.dk.mdm.model.pojo.sale.MultiOwner;
  19. import com.dk.mdm.model.pojo.sale.Order;
  20. import com.dk.common.service.BaseService;
  21. import com.dk.common.mapper.BaseMapper;
  22. import com.dk.mdm.model.pojo.sale.OrderItem;
  23. import com.dk.mdm.model.query.sale.OrderItemQuery;
  24. import com.dk.mdm.model.query.sale.OrderQuery;
  25. import com.dk.mdm.model.response.sale.OrderItemResponse;
  26. import com.dk.mdm.model.response.sale.OrderResponse;
  27. import com.dk.mdm.model.vo.sale.OrderItemVO;
  28. import com.dk.mdm.model.vo.sale.OrderVO;
  29. import com.dk.mdm.service.common.CommonService;
  30. import org.springframework.stereotype.Service;
  31. import org.springframework.beans.factory.annotation.Autowired;
  32. import org.springframework.transaction.annotation.Transactional;
  33. import java.math.BigDecimal;
  34. import java.util.*;
  35. import java.util.stream.Collectors;
  36. @Service
  37. @Transactional
  38. public class OrderService extends BaseService<Order> {
  39. @Override
  40. public String getPrimaryKey() {
  41. return "order_id";
  42. }
  43. @Override
  44. public BaseMapper<Order> getRepository() {
  45. return orderMapper;
  46. }
  47. @Autowired
  48. private OrderMapper orderMapper;
  49. @Autowired
  50. private OrderItemService orderItemService;
  51. @Autowired
  52. private OrderItemMapper orderItemMapper;
  53. @Autowired
  54. private CommonService commonService;
  55. @Autowired
  56. private CustomerMapper customerMapper;
  57. @Autowired
  58. MultiOwnerMapper multiOwnerMapper;
  59. @Autowired
  60. private OrderConvert orderConvert;
  61. @Autowired
  62. private OrderItemConvert orderItemConvert;
  63. /**
  64. * @desc : 条件查询
  65. * @author : 付斌
  66. * @date : 2023/1/9 10:40
  67. */
  68. @Pagination
  69. public ResponseResultVO<PageList<OrderResponse>> selectByCond(OrderQuery orderQuery) {
  70. return super.mergeListWithCount(orderQuery, orderMapper.selectByCond(orderQuery),
  71. orderMapper.countByCond(orderQuery));
  72. }
  73. /**
  74. * @desc : 以销定采 查询
  75. * @author : 王英杰
  76. * @date : 2023/3/14 10:36
  77. */
  78. @Pagination
  79. public ResponseResultVO<PageList<OrderResponse>> purSaleSelectByCond(OrderQuery orderQuery) {
  80. return super.mergeListWithCount(orderQuery, orderMapper.purSaleSelectByCond(orderQuery),
  81. orderMapper.countByCond(orderQuery));
  82. }
  83. /**
  84. * @desc : 查询订单明细(货物、收款、附件)
  85. * @author : 付斌
  86. * @date : 2024-02-28 13:25
  87. */
  88. @Pagination
  89. public ResponseResultVO<Map<String, Object>> selectOrderInfoById(String id) {
  90. Map<String, Object> result = new HashMap<>();
  91. // 商品明细
  92. List<OrderItemResponse> orderItem = orderItemMapper.selectByCond(new OrderItemQuery().setOrderId(id));
  93. result.put("orderItem", orderItem);
  94. // 收款
  95. // 附件
  96. return ResponseResultUtil.success(result);
  97. }
  98. /**
  99. * @desc : 新建方法
  100. * @author : 付斌
  101. * @date : 2023/1/9 10:49
  102. */
  103. @Transactional(
  104. rollbackFor = {Exception.class}
  105. )
  106. public ResponseResultVO<?> insert(OrderVO orderVO) {
  107. // 如果没有客户id,要新建
  108. if (orderVO.getCusId() == null) {
  109. List<Customer> listCustomer = customerMapper.selectByCond(new Customer().setCpId(orderVO.getCpId()).setCusPhone(orderVO.getCusPhone()));
  110. // 如果客户电话已存在
  111. if (listCustomer.size() > 0) {
  112. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISEXISTS_CUSPHONE.getMessage());
  113. }
  114. // 创建客户,获取编码和主键UuId
  115. Map<String, Object> codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.CUSTOMER.getName(), true);
  116. Customer customer = new Customer();
  117. customer.setCusId(codeMap.get("outId").toString()).setCusCode(codeMap.get("outNote").toString()).setCusName(orderVO.getCusName())
  118. .setCusPhone(orderVO.getCusPhone()).setAddressArea(orderVO.getAddressArea()).setAddressName(orderVO.getAddressName())
  119. .setAddressNo(orderVO.getAddressNo()).setAddressGcj02(orderVO.getAddressGcj02()).setAddressFull(orderVO.getAddressFull())
  120. .setContactName(orderVO.getContactName()).setContactPhone(orderVO.getContactPhone()).setCusFrom(orderVO.getCusFrom())
  121. .setChannelId(orderVO.getSalesChannel()).setOrgId(orderVO.getOrgId()).setStaffId(orderVO.getStaffId())
  122. .setReportStaff(orderVO.getMakeStaff()).setSaleStatus(Constant.SaleStatus.CHENGJIAO.getName()).setCpId(orderVO.getCpId());
  123. customerMapper.insert(customer);
  124. orderVO.setCusId(customer.getCusId());
  125. }
  126. // 获取单号
  127. Map<String, Object> codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.ORDER.getName(), false);
  128. orderVO.setOrderId(codeMap.get("outId").toString()).setOrderNo(codeMap.get("outNote").toString())
  129. .setOrderType(Constant.DocumentType.ORDER.getName());
  130. // 转化实体
  131. Order order = orderConvert.convertToPo(orderVO);
  132. // 订单总单保存
  133. super.insert(order);
  134. // 业务部门业绩保存
  135. if (orderVO.getOrgList() != null && orderVO.getOrgList().size() > 0) {
  136. for (Map<String, Object> map : orderVO.getOrgList()) {
  137. MultiOwner multiOwner = new MultiOwner();
  138. multiOwner.setOrderId(order.getOrderId()).setOwnerId(map.get("orgId").toString())
  139. .setAllocationRatio(new BigDecimal(map.get("allocationRatio").toString())).setCpId(order.getCpId());
  140. if (Boolean.parseBoolean(map.get("ownerFlag").toString())) {
  141. multiOwner.setOwnerType(Constant.OwnerType.Z_ORG.getName());
  142. } else {
  143. multiOwner.setOwnerType(Constant.OwnerType.C_ORG.getName());
  144. }
  145. multiOwnerMapper.insert(multiOwner);
  146. }
  147. }
  148. // 业务员业绩保存
  149. if (orderVO.getStaffList() != null && orderVO.getStaffList().size() > 0) {
  150. for (Map<String, Object> map : orderVO.getStaffList()) {
  151. MultiOwner multiOwner = new MultiOwner();
  152. multiOwner.setOrderId(order.getOrderId()).setOwnerId(map.get("staffId").toString())
  153. .setAllocationRatio(new BigDecimal(map.get("allocationRatio").toString())).setCpId(order.getCpId());
  154. if (Boolean.parseBoolean(map.get("ownerFlag").toString())) {
  155. multiOwner.setOwnerType(Constant.OwnerType.Z_STAFF.getName());
  156. } else {
  157. multiOwner.setOwnerType(Constant.OwnerType.C_STAFF.getName());
  158. }
  159. multiOwnerMapper.insert(multiOwner);
  160. }
  161. }
  162. // 订单明细保存
  163. if (orderVO.getItemList() != null && orderVO.getItemList().size() > 0) {
  164. for (OrderItemVO orderItemVO : orderVO.getItemList()) {
  165. OrderItem orderItem = orderItemConvert.convertToPo(orderItemVO);
  166. orderItem.setOrderId(order.getOrderId()).setCpId(order.getCpId()).setOutStatus(Constant.OutStatus.DAICHUKU.getName());
  167. orderItemMapper.insert(orderItem);
  168. }
  169. }
  170. return ResponseResultUtil.success();
  171. }
  172. /**
  173. * @desc : 编辑方法
  174. * @author : 付斌
  175. * @date : 2023/1/9 10:49
  176. */
  177. @Transactional(
  178. rollbackFor = {Exception.class}
  179. )
  180. public ResponseResultVO<?> update(OrderVO orderVO) {
  181. // 明细实体(避免并发,需要再查一遍)
  182. OrderItem orderItemForUpdate;
  183. // 转化实体
  184. Order order = orderConvert.convertToPo(orderVO);
  185. //删除的
  186. List<OrderItemVO> deleteOrderItemVOList = orderVO.getDeleteItemList().stream().filter(it -> it.getItemId() != null).collect(Collectors.toList());
  187. if (deleteOrderItemVOList.size() > 0) {
  188. for (OrderItemVO orderItemVO : deleteOrderItemVOList) {
  189. orderItemForUpdate = orderItemMapper.selectByIdForUpdate(orderItemVO.getItemId());
  190. // 非待出库单据不能删除
  191. if (!Constant.OutStatus.DAICHUKU.getName().equals(orderItemForUpdate.getOutStatus())) {
  192. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.NO_WAIT_INTO.getMessage());
  193. } else {
  194. orderItemMapper.deleteById(orderItemVO.getItemId());
  195. }
  196. }
  197. }
  198. // 新增的
  199. List<OrderItemVO> insertOrderItemVOList = orderVO.getItemList().stream().filter(it -> it.getItemId() == null).collect(Collectors.toList());
  200. for (OrderItemVO orderItemVO : insertOrderItemVOList) {
  201. OrderItem orderItem = orderItemConvert.convertToPo(orderItemVO);
  202. orderItem.setOrderId(order.getOrderId()).setCpId(order.getCpId()).setOutStatus(Constant.OutStatus.DAICHUKU.getName());
  203. orderItemMapper.insert(orderItem);
  204. }
  205. // 编辑的
  206. List<OrderItemVO> editOrderItemVOList = orderVO.getItemList().stream().filter(it -> it.getItemId() != null).collect(Collectors.toList());
  207. for (OrderItemVO orderItemVO : editOrderItemVOList) {
  208. orderItemForUpdate = orderItemMapper.selectByIdForUpdate(orderItemVO.getItemId());
  209. // 商品数量不能小于(出库中数量+已出库数量)
  210. if (orderItemVO.getItemQty().compareTo(orderItemForUpdate.getOutingQty().add(orderItemForUpdate.getOutQty())) == -1) {
  211. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ITEMQTY_NO_LESS_OUTQTY.getMessage());
  212. }
  213. OrderItem orderItem = orderItemConvert.convertToPo(orderItemVO);
  214. orderItemService.updateByUuid(orderItem);
  215. }
  216. // 删除业绩信息
  217. multiOwnerMapper.deleteByOrderId(order.getOrderId());
  218. // 重新保存业绩信息
  219. // 业务部门业绩保存
  220. if (orderVO.getOrgList() != null && orderVO.getOrgList().size() > 0) {
  221. for (Map<String, Object> map : orderVO.getOrgList()) {
  222. MultiOwner multiOwner = new MultiOwner();
  223. multiOwner.setOrderId(order.getOrderId()).setOwnerId(map.get("orgId").toString())
  224. .setAllocationRatio(new BigDecimal(map.get("allocationRatio").toString())).setCpId(order.getCpId());
  225. if (Boolean.parseBoolean(map.get("ownerFlag").toString())) {
  226. multiOwner.setOwnerType(Constant.OwnerType.Z_ORG.getName());
  227. } else {
  228. multiOwner.setOwnerType(Constant.OwnerType.C_ORG.getName());
  229. }
  230. multiOwnerMapper.insert(multiOwner);
  231. }
  232. }
  233. // 业务员业绩保存
  234. if (orderVO.getStaffList() != null && orderVO.getStaffList().size() > 0) {
  235. for (Map<String, Object> map : orderVO.getStaffList()) {
  236. MultiOwner multiOwner = new MultiOwner();
  237. multiOwner.setOrderId(order.getOrderId()).setOwnerId(map.get("staffId").toString())
  238. .setAllocationRatio(new BigDecimal(map.get("allocationRatio").toString())).setCpId(order.getCpId());
  239. if (Boolean.parseBoolean(map.get("ownerFlag").toString())) {
  240. multiOwner.setOwnerType(Constant.OwnerType.Z_STAFF.getName());
  241. } else {
  242. multiOwner.setOwnerType(Constant.OwnerType.C_STAFF.getName());
  243. }
  244. multiOwnerMapper.insert(multiOwner);
  245. }
  246. }
  247. return ResponseResultUtil.success(super.update(order, new UpdateWrapper<Order>().lambda().eq(Order::getOrderId,
  248. UUID.fromString(order.getOrderId()))));
  249. }
  250. /**
  251. * @desc : 作废
  252. * @author : 付斌
  253. * @date : 2024-03-08 16:38
  254. */
  255. public ResponseResultVO<?> invalid(String id) {
  256. Order orderForUpdate = orderMapper.selectByIdForUpdate(id);
  257. // 并发校验
  258. if (!orderForUpdate.getFlgValid()) {
  259. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISFLGVALID_FALSE.getMessage());
  260. }
  261. // 如果出库中数量或已出库数量不是0,不能作废
  262. if (orderForUpdate.getOutingQty().compareTo(BigDecimal.ZERO) != 0 || orderForUpdate.getOutQty().compareTo(BigDecimal.ZERO) != 0) {
  263. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISEXISTS_AFTER_OPERATE.getMessage());
  264. }
  265. // 作废
  266. Order orderUpdate = new Order();
  267. orderUpdate.setFlgValid(false).setOrderId(id);
  268. super.update(orderUpdate, new UpdateWrapper<Order>().lambda().eq(Order::getOrderId,
  269. UUID.fromString(orderUpdate.getOrderId())));
  270. return ResponseResultUtil.success();
  271. }
  272. /**
  273. * @desc : 获取订单信息(编辑用)
  274. * @author : 付斌
  275. * @date : 2024-03-02 17:27
  276. */
  277. public ResponseResultVO<?> getOrderForUpdate(String id) {
  278. Map<String, Object> dataInfo = new HashMap<>();
  279. OrderResponse orderResponse = orderMapper.selectById(id);
  280. dataInfo.put("data", orderResponse);
  281. // 商品明细
  282. List<OrderItemResponse> orderItemResponse = orderItemMapper.selectByCond(new OrderItemQuery().setOrderId(id));
  283. dataInfo.put("dataItem", orderItemResponse);
  284. return ResponseResultUtil.success(dataInfo);
  285. }
  286. /**
  287. * @desc : 获取订单信息(出库用)
  288. * @author : 付斌
  289. * @date : 2024-03-02 17:27
  290. */
  291. public ResponseResultVO<?> getOrderForOut(String id) {
  292. Map<String, Object> dataInfo = new HashMap<>();
  293. OrderResponse orderResponse = orderMapper.selectById(id);
  294. dataInfo.put("data", orderResponse);
  295. // 商品明细
  296. List<OrderItemResponse> orderItem = orderItemMapper.selectByCondForOut(new OrderItemQuery().setOrderId(id));
  297. dataInfo.put("dataItem", orderItem);
  298. return ResponseResultUtil.success(dataInfo);
  299. }
  300. /**
  301. * @desc : 获取订单信息(退货用)
  302. * @author : 付斌
  303. * @date : 2024-03-02 17:27
  304. */
  305. public ResponseResultVO<?> getOrderForReturn(String id) {
  306. Map<String, Object> dataInfo = new HashMap<>();
  307. OrderResponse orderResponse = orderMapper.selectById(id);
  308. dataInfo.put("data", orderResponse);
  309. // 商品明细
  310. List<OrderItemResponse> orderItem = orderItemMapper.selectByCondForReturn(new OrderItemQuery().setOrderId(id));
  311. dataInfo.put("dataItem", orderItem);
  312. return ResponseResultUtil.success(dataInfo);
  313. }
  314. /**
  315. * @desc : 条件查询(总单带明细)
  316. * @author : 于继渤
  317. * @date : 2023/1/9 10:36
  318. */
  319. @Pagination
  320. public ResponseResultVO<PageList<OrderResponse>> selectTotalSingleTapeDetailPage(OrderQuery orderQuery) {
  321. return super.mergeListWithCount(orderQuery, orderMapper.selectByCondDetail(orderQuery),
  322. orderMapper.countByCondDetail(orderQuery));
  323. }
  324. }