OrderService.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  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.OrderItemMapper;
  15. import com.dk.mdm.mapper.sale.OrderMapper;
  16. import com.dk.mdm.model.pojo.mst.Customer;
  17. import com.dk.mdm.model.pojo.sale.Order;
  18. import com.dk.common.service.BaseService;
  19. import com.dk.common.mapper.BaseMapper;
  20. import com.dk.mdm.model.pojo.sale.OrderItem;
  21. import com.dk.mdm.model.query.sale.OrderItemQuery;
  22. import com.dk.mdm.model.query.sale.OrderQuery;
  23. import com.dk.mdm.model.response.sale.OrderItemResponse;
  24. import com.dk.mdm.model.response.sale.OrderResponse;
  25. import com.dk.mdm.model.vo.sale.OrderItemVO;
  26. import com.dk.mdm.model.vo.sale.OrderVO;
  27. import com.dk.mdm.service.common.CommonService;
  28. import org.springframework.stereotype.Service;
  29. import org.springframework.beans.factory.annotation.Autowired;
  30. import org.springframework.transaction.annotation.Transactional;
  31. import java.math.BigDecimal;
  32. import java.util.*;
  33. import java.util.stream.Collectors;
  34. @Service
  35. @Transactional
  36. public class OrderService extends BaseService<Order> {
  37. @Override
  38. public String getPrimaryKey() {
  39. return "order_id";
  40. }
  41. @Override
  42. public BaseMapper<Order> getRepository() {
  43. return orderMapper;
  44. }
  45. @Autowired
  46. private OrderMapper orderMapper;
  47. @Autowired
  48. private OrderConvert orderConvert;
  49. @Autowired
  50. private OrderItemConvert orderItemConvert;
  51. @Autowired
  52. private OrderItemService orderItemService;
  53. @Autowired
  54. private OrderItemMapper orderItemMapper;
  55. @Autowired
  56. private CommonService commonService;
  57. @Autowired
  58. private CustomerMapper customerMapper;
  59. /**
  60. * @desc : 条件查询
  61. * @author : 付斌
  62. * @date : 2023/1/9 10:40
  63. */
  64. @Pagination
  65. public ResponseResultVO<PageList<OrderResponse>> selectByCond(OrderQuery orderQuery) {
  66. return super.mergeListWithCount(orderQuery, orderMapper.selectByCond(orderQuery),
  67. orderMapper.countByCond(orderQuery));
  68. }
  69. /**
  70. * @desc : 查询订单明细(货物、收款、附件)
  71. * @author : 付斌
  72. * @date : 2024-02-28 13:25
  73. */
  74. @Pagination
  75. public ResponseResultVO<Map<String, Object>> selectOrderInfoById(String id) {
  76. Map<String, Object> result = new HashMap<>();
  77. // 商品明细
  78. List<OrderItemResponse> orderItem = orderItemMapper.selectByCond(new OrderItemQuery().setOrderId(id));
  79. result.put("orderItem", orderItem);
  80. // 收款
  81. // 附件
  82. return ResponseResultUtil.success(result);
  83. }
  84. /**
  85. * @desc : 新建方法
  86. * @author : 付斌
  87. * @date : 2023/1/9 10:49
  88. */
  89. @Transactional(
  90. rollbackFor = {Exception.class}
  91. )
  92. public ResponseResultVO<?> insert(OrderVO orderVO) {
  93. // 如果没有客户id,要新建
  94. if (orderVO.getCusId() == null) {
  95. List<Customer> listCustomer = customerMapper.selectByCond(new Customer().setCpId(orderVO.getCpId()).setCusPhone(orderVO.getCusPhone()));
  96. // 如果客户电话已存在
  97. if (listCustomer.size() > 0) {
  98. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISEXISTS_CUSPHONE.getMessage());
  99. }
  100. // 创建客户,获取编码和主键UuId
  101. Map<String, Object> codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.CUSTOMER.getName(), true);
  102. Customer customer = new Customer();
  103. customer.setCusId(codeMap.get("outId").toString()).setCusCode(codeMap.get("outNote").toString()).setCusName(orderVO.getCusName())
  104. .setCusPhone(orderVO.getCusPhone()).setAddressArea(orderVO.getAddressArea()).setAddressName(orderVO.getAddressName())
  105. .setAddressNo(orderVO.getAddressNo()).setAddressGcj02(orderVO.getAddressGcj02()).setAddressFull(orderVO.getAddressFull())
  106. .setContactName(orderVO.getContactName()).setContactPhone(orderVO.getContactPhone()).setCusFrom(orderVO.getCusFrom())
  107. .setChannelId(orderVO.getSalesChannel()).setOrgId(orderVO.getOrgId()).setStaffId(orderVO.getStaffId())
  108. .setReportStaff(orderVO.getMakeStaff()).setSaleStatus(Constant.SaleStatus.CHENGJIAO.getName()).setCpId(orderVO.getCpId());
  109. customerMapper.insert(customer);
  110. orderVO.setCusId(customer.getCusId());
  111. }
  112. // 获取单号
  113. Map<String, Object> codeMap = commonService.getUniqueNoteCode(Constant.docNameConstant.ORDER.getName(), false);
  114. orderVO.setOrderId(codeMap.get("outId").toString()).setOrderNo(codeMap.get("outNote").toString())
  115. .setOrderType(Constant.DocumentType.ORDER.getName());
  116. // 转化实体
  117. Order order = orderConvert.convertToPo(orderVO);
  118. // 订单总单保存
  119. super.insert(order);
  120. // 订单明细保存
  121. if (orderVO.getItemList() != null && orderVO.getItemList().size() > 0) {
  122. for (OrderItemVO orderItemVO : orderVO.getItemList()) {
  123. OrderItem orderItem = orderItemConvert.convertToPo(orderItemVO);
  124. orderItem.setOrderId(order.getOrderId()).setCpId(order.getCpId()).setOutStatus(Constant.OutStatus.DAICHUKU.getName());
  125. orderItemMapper.insert(orderItem);
  126. }
  127. }
  128. return ResponseResultUtil.success();
  129. }
  130. /**
  131. * @desc : 编辑方法
  132. * @author : 付斌
  133. * @date : 2023/1/9 10:49
  134. */
  135. @Transactional(
  136. rollbackFor = {Exception.class}
  137. )
  138. public ResponseResultVO<?> update(OrderVO orderVO) {
  139. // 明细实体(避免并发,需要再查一遍)
  140. OrderItem orderItemForUpdate;
  141. // 转化实体
  142. Order order = orderConvert.convertToPo(orderVO);
  143. //删除的
  144. List<OrderItemVO> deleteOrderItemVOList = orderVO.getDeleteItemList().stream().filter(it -> it.getItemId() != null).collect(Collectors.toList());
  145. if (deleteOrderItemVOList.size() > 0) {
  146. for (OrderItemVO orderItemVO : deleteOrderItemVOList) {
  147. orderItemForUpdate = orderItemMapper.selectByIdForUpdate(orderItemVO.getItemId());
  148. // 非待出库单据不能删除
  149. if (!Constant.OutStatus.DAICHUKU.getName().equals(orderItemForUpdate.getOutStatus())) {
  150. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.NO_WAIT_INTO.getMessage());
  151. } else {
  152. orderItemMapper.deleteById(orderItemVO.getItemId());
  153. }
  154. }
  155. }
  156. // 新增的
  157. List<OrderItemVO> insertOrderItemVOList = orderVO.getItemList().stream().filter(it -> it.getItemId() == null).collect(Collectors.toList());
  158. for (OrderItemVO orderItemVO : insertOrderItemVOList) {
  159. OrderItem orderItem = orderItemConvert.convertToPo(orderItemVO);
  160. orderItem.setOrderId(order.getOrderId()).setCpId(order.getCpId()).setOutStatus(Constant.OutStatus.DAICHUKU.getName());
  161. orderItemMapper.insert(orderItem);
  162. }
  163. // 编辑的
  164. List<OrderItemVO> editOrderItemVOList = orderVO.getItemList().stream().filter(it -> it.getItemId() != null).collect(Collectors.toList());
  165. for (OrderItemVO orderItemVO : editOrderItemVOList) {
  166. orderItemForUpdate = orderItemMapper.selectByIdForUpdate(orderItemVO.getItemId());
  167. // 商品数量不能小于出库中数量
  168. if (orderItemVO.getItemQty().compareTo(orderItemForUpdate.getOutingQty()) == -1) {
  169. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ITEMQTY_NO_LESS_OUTQTY.getMessage());
  170. }
  171. OrderItem orderItem = orderItemConvert.convertToPo(orderItemVO);
  172. orderItemService.updateByUuid(orderItem);
  173. }
  174. return ResponseResultUtil.success(super.update(order, new UpdateWrapper<Order>().lambda().eq(Order::getOrderId,
  175. UUID.fromString(order.getOrderId()))));
  176. }
  177. /**
  178. * @desc : 作废
  179. * @author : 付斌
  180. * @date : 2024-03-08 16:38
  181. */
  182. public ResponseResultVO<?> invalid(String id) {
  183. Order orderForUpdate = orderMapper.selectByIdForUpdate(id);
  184. // 并发校验
  185. if(!orderForUpdate.getFlgValid()){
  186. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISFLGVALID_FALSE.getMessage());
  187. }
  188. // 如果出库中数量不是0,不能作废
  189. if (orderForUpdate.getOutingQty().compareTo(BigDecimal.ZERO) != 0) {
  190. throw new BaseBusinessException(ResponseCodeEnum.OPERATE_FAIL.getCode(), ErrorCodeEnum.ISEXISTS_AFTER_OPERATE.getMessage());
  191. }
  192. // 作废
  193. Order orderUpdate = new Order();
  194. orderUpdate.setFlgValid(false).setOrderId(id);
  195. super.update(orderUpdate, new UpdateWrapper<Order>().lambda().eq(Order::getOrderId,
  196. UUID.fromString(orderUpdate.getOrderId())));
  197. return ResponseResultUtil.success();
  198. }
  199. /**
  200. * @desc : 获取订单信息(编辑用)
  201. * @author : 付斌
  202. * @date : 2024-03-02 17:27
  203. */
  204. public ResponseResultVO<?> getOrderForUpdate(String id) {
  205. Map<String, Object> dataInfo = new HashMap<>();
  206. OrderResponse orderResponse = orderMapper.selectById(id);
  207. dataInfo.put("data", orderResponse);
  208. // 商品明细
  209. List<OrderItemResponse> orderItem = orderItemMapper.selectByCond(new OrderItemQuery().setOrderId(id));
  210. dataInfo.put("dataItem", orderItem);
  211. return ResponseResultUtil.success(dataInfo);
  212. }
  213. /**
  214. * @desc : 获取订单信息(出库用)
  215. * @author : 付斌
  216. * @date : 2024-03-02 17:27
  217. */
  218. public ResponseResultVO<?> getOrderForOut(String id) {
  219. Map<String, Object> dataInfo = new HashMap<>();
  220. OrderResponse orderResponse = orderMapper.selectById(id);
  221. dataInfo.put("data", orderResponse);
  222. // 商品明细
  223. List<OrderItemResponse> orderItem = orderItemMapper.selectByCondForOut(new OrderItemQuery().setOrderId(id));
  224. dataInfo.put("dataItem", orderItem);
  225. return ResponseResultUtil.success(dataInfo);
  226. }
  227. /**
  228. * @desc : 获取订单信息(退货用)
  229. * @author : 付斌
  230. * @date : 2024-03-02 17:27
  231. */
  232. public ResponseResultVO<?> getOrderForReturn(String id) {
  233. Map<String, Object> dataInfo = new HashMap<>();
  234. OrderResponse orderResponse = orderMapper.selectById(id);
  235. dataInfo.put("data", orderResponse);
  236. // 商品明细
  237. List<OrderItemResponse> orderItem = orderItemMapper.selectByCondForReturn(new OrderItemQuery().setOrderId(id));
  238. dataInfo.put("dataItem", orderItem);
  239. return ResponseResultUtil.success(dataInfo);
  240. }
  241. }