OrderContext.java 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. package com.sd.wln.context;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import cn.hutool.extra.spring.SpringUtil;
  4. import com.alibaba.fastjson2.JSONObject;
  5. import com.ruoyi.common.core.domain.BaseIdPo;
  6. import com.ruoyi.framework.mybatis.holder.LogicHolder;
  7. import com.sd.business.entity.bom.bo.BomSpecBo;
  8. import com.sd.business.entity.department.po.Department;
  9. import com.sd.business.entity.order.po.OrderInfo;
  10. import com.sd.business.entity.order.po.OrderPackageBom;
  11. import com.sd.business.entity.order.po.OrderSku;
  12. import com.sd.business.entity.order.po.OrderSkuBom;
  13. import com.sd.business.entity.price.po.PriceBillingStandardDetail;
  14. import com.sd.business.entity.sku.po.SkuSpec;
  15. import com.sd.business.entity.sku.po.SkuSpecLink;
  16. import com.sd.business.service.department.DepartmentService;
  17. import com.sd.business.service.order.OrderService;
  18. import com.sd.business.service.order.OrderSkuService;
  19. import com.sd.business.service.price.PriceBillingStandardDetailService;
  20. import com.sd.business.service.sku.SkuSpecLinkService;
  21. import com.sd.business.service.sku.SkuSpecService;
  22. import com.sd.wln.util.WlnUtil;
  23. import lombok.Getter;
  24. import lombok.extern.slf4j.Slf4j;
  25. import java.util.*;
  26. import java.util.stream.Collectors;
  27. import java.util.stream.Stream;
  28. @Slf4j
  29. public class OrderContext {
  30. private static final OrderService orderService = SpringUtil.getBean(OrderService.class);
  31. private static final OrderSkuService orderSkuService = SpringUtil.getBean(OrderSkuService.class);
  32. private static final DepartmentService departmentService = SpringUtil.getBean(DepartmentService.class);
  33. private static final SkuSpecService skuSpecService = SpringUtil.getBean(SkuSpecService.class);
  34. private static final SkuSpecLinkService skuSpecLinkService = SpringUtil.getBean(SkuSpecLinkService.class);
  35. private static final PriceBillingStandardDetailService priceBillingStandardDetailService = SpringUtil.getBean(PriceBillingStandardDetailService.class);
  36. /**
  37. * 保存订单列表
  38. */
  39. @Getter
  40. private final List<OrderInfo> saveOrderList = new ArrayList<>();
  41. /**
  42. * 更新订单列表
  43. */
  44. @Getter
  45. private final List<OrderInfo> updateOrderList = new ArrayList<>();
  46. /**
  47. * 保存订单明细列表
  48. */
  49. @Getter
  50. private final List<OrderSku> saveOrderSkuList = new ArrayList<>();
  51. /**
  52. * 保存订单包材
  53. */
  54. @Getter
  55. private final List<OrderSkuBom> saveOrderSkuBomList = new ArrayList<>();
  56. /**
  57. * 保存订单包装
  58. */
  59. @Getter
  60. private final List<OrderPackageBom> orderPackageBomList = new ArrayList<>();
  61. /**
  62. * 当前时间
  63. */
  64. @Getter
  65. private final Date endDate;
  66. /**
  67. * 万里牛订单列表
  68. */
  69. @Getter
  70. private final List<JSONObject> wlnOrderList;
  71. /**
  72. * 事业部
  73. */
  74. @Getter
  75. private final Department department;
  76. /**
  77. * 已存在数据库中的订单map
  78. * key:万里牛订单uid
  79. * value:订单实体
  80. */
  81. private Map<String, OrderInfo> existOrderMap;
  82. /**
  83. * 已存在数据库中的订单sku map
  84. * key:订单id
  85. * value:订单sku实体列表
  86. */
  87. private Map<Long, List<OrderSku>> existOrderSkuMap;
  88. /**
  89. * sku规格map
  90. * key:万里牛sku规格uid
  91. * value:sku规格实体
  92. */
  93. private Map<String, SkuSpec> skuSpecMap;
  94. /**
  95. * sku规格关联bom
  96. * key:sku规格id
  97. * value: key:类型 1包材 2快递包装 value:sku规格实体
  98. */
  99. private Map<Long, Map<Integer, List<SkuSpecLink>>> skuSpecLinkBomSpecMap;
  100. /**
  101. * bom规格明细
  102. * key:bom规格id
  103. * value:bom规格明细
  104. */
  105. private Map<Long, BomSpecBo> bomSpecBoMap;
  106. /**
  107. * 加工计费标准明细列表
  108. */
  109. private List<PriceBillingStandardDetail> priceBillingStandardList;
  110. /**
  111. * 实例化
  112. */
  113. public OrderContext(String warehouseCode) {
  114. this.endDate = new Date();
  115. this.wlnOrderList = selectWlnOrderList(warehouseCode);
  116. this.department = departmentService.getDepartmentByWarehouseCode(warehouseCode);
  117. }
  118. /**
  119. * 查询万里牛订单列表
  120. */
  121. private List<JSONObject> selectWlnOrderList(String warehouseCode) {
  122. long endTime = endDate.getTime();
  123. long startTime;
  124. OrderInfo orderInfo = orderService.getOne(q -> q
  125. .eq(OrderInfo::getWlnStorageCode, warehouseCode)
  126. .orderByDesc(OrderInfo::getWlnModifyTimestamp));
  127. if (orderInfo == null) {
  128. startTime = endTime - 1000 * 60 * 60 * 24;
  129. } else {
  130. startTime = orderInfo.getWlnModifyTimestamp();
  131. if (endTime - startTime > 1000 * 60 * 60 * 24 * 7) {
  132. startTime = endTime - 1000 * 60 * 60 * 24 * 7;
  133. }
  134. }
  135. List<JSONObject> list = new ArrayList<>();
  136. int page = 1;
  137. int size;
  138. do {
  139. try {
  140. List<JSONObject> itemList = WlnUtil.getOrderList(page, 200, startTime, endTime, warehouseCode);
  141. page++;
  142. size = itemList.size();
  143. list.addAll(itemList);
  144. } catch (Exception e) {
  145. log.error("订单同步失败", e);
  146. return Collections.emptyList();
  147. }
  148. } while (size >= 200);
  149. return list;
  150. }
  151. /**
  152. * 获取已存在数据库中的订单map
  153. */
  154. public Map<String, OrderInfo> getExistOrderMap() {
  155. if (existOrderMap == null) {
  156. LogicHolder.setLogicHolder(true);
  157. List<String> uidList = wlnOrderList.stream().map(item -> item.getString("uid")).collect(Collectors.toList());
  158. existOrderMap = orderService.mapKEntity(OrderInfo::getWlnUid, q -> q.in(OrderInfo::getWlnUid, uidList));
  159. LogicHolder.clear();
  160. }
  161. return existOrderMap;
  162. }
  163. /**
  164. * 已存在数据库中的订单sku map
  165. */
  166. public Map<Long, List<OrderSku>> getExistOrderSkuMap() {
  167. if (existOrderSkuMap == null) {
  168. List<Long> orderIdList = getExistOrderMap().values().stream().map(BaseIdPo::getId).collect(Collectors.toList());
  169. if (orderIdList.size() == 0) {
  170. existOrderSkuMap = Collections.emptyMap();
  171. } else {
  172. existOrderSkuMap = orderSkuService.mapKGroup(OrderSku::getOrderId, q -> q.in(OrderSku::getOrderId, orderIdList));
  173. }
  174. }
  175. return existOrderSkuMap;
  176. }
  177. /**
  178. * 获取sku规格map
  179. */
  180. public Map<String, SkuSpec> getSkuSpecMap() {
  181. if (skuSpecMap == null) {
  182. List<String> wlnSkuSpecUidList = wlnOrderList.stream()
  183. .flatMap(item -> item.getJSONArray("orders").toJavaList(JSONObject.class).stream())
  184. .map(item -> item.getString("sys_spec_uid"))
  185. .filter(ObjectUtil::isNotNull)
  186. .distinct()
  187. .collect(Collectors.toList());
  188. if (wlnSkuSpecUidList.size() == 0) {
  189. skuSpecMap = Collections.emptyMap();
  190. } else {
  191. skuSpecMap = skuSpecService.mapKEntity(SkuSpec::getWlnUid, q -> q.in(SkuSpec::getWlnUid, wlnSkuSpecUidList));
  192. }
  193. }
  194. return skuSpecMap;
  195. }
  196. /**
  197. * 获取sku规格关联bom
  198. */
  199. public Map<Long, Map<Integer, List<SkuSpecLink>>> getSkuSpecLinkBomSpecMap() {
  200. if (skuSpecLinkBomSpecMap == null) {
  201. if (department == null) {
  202. skuSpecLinkBomSpecMap = Collections.emptyMap();
  203. return skuSpecLinkBomSpecMap;
  204. }
  205. List<Long> skuSpecId = getSkuSpecMap().values().stream().map(SkuSpec::getId).collect(Collectors.toList());
  206. if (skuSpecId.size() == 0) {
  207. skuSpecLinkBomSpecMap = Collections.emptyMap();
  208. return skuSpecLinkBomSpecMap;
  209. }
  210. List<SkuSpecLink> list = skuSpecLinkService.list(q -> q
  211. .in(SkuSpecLink::getSkuSpecId, skuSpecId)
  212. .eq(SkuSpecLink::getDepartmentId, department.getId()));
  213. skuSpecLinkBomSpecMap = list.stream().collect(
  214. Collectors.groupingBy(SkuSpecLink::getSkuSpecId, Collectors.groupingBy(SkuSpecLink::getType)));
  215. }
  216. return skuSpecLinkBomSpecMap;
  217. }
  218. /**
  219. * 获取bom规格明细
  220. */
  221. public Map<Long, BomSpecBo> getBomSpecBoMap() {
  222. if (bomSpecBoMap == null) {
  223. List<Long> bomSpecIdList = Stream.concat(
  224. getSkuSpecMap().values().stream().map(SkuSpec::getBomSpecId),
  225. getSkuSpecLinkBomSpecMap().values().stream().flatMap(item -> Stream.concat(
  226. item.getOrDefault(1, Collections.emptyList()).stream(),
  227. item.getOrDefault(2, Collections.emptyList()).stream()
  228. )).map(SkuSpecLink::getBomSpecId))
  229. .distinct().collect(Collectors.toList());
  230. bomSpecBoMap = skuSpecService.getBomSpecBoByIdList(bomSpecIdList);
  231. }
  232. return bomSpecBoMap;
  233. }
  234. /**
  235. * 获取加工计费标准明细列表
  236. */
  237. public List<PriceBillingStandardDetail> getPriceBillingStandardList() {
  238. if (priceBillingStandardList == null) {
  239. if (department == null || department.getPriceBillingStandardId() == null) {
  240. priceBillingStandardList = Collections.emptyList();
  241. } else {
  242. priceBillingStandardList = priceBillingStandardDetailService.list(q -> q
  243. .eq(PriceBillingStandardDetail::getPriceBillingStandardId, department.getPriceBillingStandardId()));
  244. }
  245. }
  246. return priceBillingStandardList;
  247. }
  248. }