24282 1 年間 前
コミット
f5398b3426
23 ファイル変更843 行追加72 行削除
  1. 71 0
      sd-business/src/main/java/com/sd/business/controller/order/OrderSkuController.java
  2. 3 3
      sd-business/src/main/java/com/sd/business/entity/department/po/Department.java
  3. 17 0
      sd-business/src/main/java/com/sd/business/entity/order/dto/OrderSkuDto.java
  4. 17 0
      sd-business/src/main/java/com/sd/business/entity/order/dto/OrderSkuSelectDto.java
  5. 51 0
      sd-business/src/main/java/com/sd/business/entity/order/enums/OrderStatusEnum.java
  6. 38 7
      sd-business/src/main/java/com/sd/business/entity/order/po/Order.java
  7. 88 0
      sd-business/src/main/java/com/sd/business/entity/order/po/OrderSku.java
  8. 17 0
      sd-business/src/main/java/com/sd/business/entity/order/vo/OrderSkuVo.java
  9. 5 0
      sd-business/src/main/java/com/sd/business/entity/sku/po/Sku.java
  10. 4 4
      sd-business/src/main/java/com/sd/business/entity/sku/po/SkuClassify.java
  11. 5 0
      sd-business/src/main/java/com/sd/business/entity/sku/po/SkuSpec.java
  12. 26 0
      sd-business/src/main/java/com/sd/business/mapper/order/OrderSkuMapper.java
  13. 46 0
      sd-business/src/main/java/com/sd/business/service/order/OrderSkuService.java
  14. 57 0
      sd-business/src/main/java/com/sd/business/service/order/impl/OrderSkuServiceImpl.java
  15. 25 0
      sd-business/src/main/resources/mapper/order/OrderSkuMapper.xml
  16. 0 1
      sd-wln/src/main/java/com/sd/wln/entity/GoodsSpecParam.java
  17. 0 19
      sd-wln/src/main/java/com/sd/wln/entity/Signature.java
  18. 85 0
      sd-wln/src/main/java/com/sd/wln/entity/TradesParam.java
  19. 6 6
      sd-wln/src/main/java/com/sd/wln/scheduled/WlnSyncTask.java
  20. 1 1
      sd-wln/src/main/java/com/sd/wln/service/WlnOrderService.java
  21. 217 1
      sd-wln/src/main/java/com/sd/wln/service/impl/WlnOrderServiceImpl.java
  22. 18 21
      sd-wln/src/main/java/com/sd/wln/service/impl/WlnSkuServiceImpl.java
  23. 46 9
      sd-wln/src/main/java/com/sd/wln/util/WlnUtil.java

+ 71 - 0
sd-business/src/main/java/com/sd/business/controller/order/OrderSkuController.java

@@ -0,0 +1,71 @@
+package com.sd.business.controller.order;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import com.sd.business.entity.order.dto.OrderSkuDto;
+import com.sd.business.entity.order.dto.OrderSkuSelectDto;
+import com.sd.business.entity.order.vo.OrderSkuVo;
+import com.sd.business.service.order.OrderSkuService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * <p>
+ * 订单sku 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2023-07-06
+ */
+@RestController
+@RequestMapping("/orderSku")
+public class OrderSkuController {
+
+    @Autowired
+    private OrderSkuService orderSkuService;
+
+    /**
+     * 订单sku分页
+     */
+    @PostMapping("/page")
+    public Page<OrderSkuVo> page(@RequestBody OrderSkuSelectDto dto) {
+        return orderSkuService.getPage(dto);
+    }
+
+    /**
+     * 订单sku明细
+     */
+    @PostMapping("/detail")
+    public OrderSkuVo detail(@RequestBody BaseSelectDto dto) {
+        return orderSkuService.detail(dto.getId());
+    }
+
+    /**
+     * 订单sku新增
+     */
+    @PostMapping("/add")
+    public void add(@RequestBody OrderSkuDto orderSkuDto) {
+        orderSkuService.add(orderSkuDto);
+    }
+
+    /**
+     * 订单sku编辑
+     */
+    @PostMapping("/edit")
+    public void edit(@RequestBody OrderSkuDto orderSkuDto) {
+        orderSkuService.edit(orderSkuDto);
+    }
+
+    /**
+     * 订单sku删除
+     */
+    @PostMapping("/delete")
+    public void delete(@RequestBody BaseSelectDto dto) {
+        orderSkuService.delete(dto.getId());
+    }
+
+}

+ 3 - 3
sd-business/src/main/java/com/sd/business/entity/department/po/Department.java

@@ -61,7 +61,7 @@ public class Department extends BasePo {
     private String sellingPriceSystem;
 
     /**
-     * 下单模式 字典:department_orderMode
+     * 下单模式 字典:department_orderMode  1自建单+万里牛自动提单 2自建单+万里牛手动提单
      */
     private String orderMode;
 
@@ -86,9 +86,9 @@ public class Department extends BasePo {
     private BigDecimal usedCredit;
 
     /**
-     * 万里牛仓库编码 多个用,拼接 字典:wlnWarehouseCoding
+     * 万里牛仓库编码 多个用,拼接 字典:warehouse_code
      */
-    private String wlnWarehouseCoding;
+    private String wlnWarehouseCode;
 
     /**
      * 万里牛品牌 多个用,拼接 字典:wlnBrand

+ 17 - 0
sd-business/src/main/java/com/sd/business/entity/order/dto/OrderSkuDto.java

@@ -0,0 +1,17 @@
+package com.sd.business.entity.order.dto;
+
+import com.sd.business.entity.order.po.OrderSku;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 订单sku新增编辑入参实体
+ *
+ * @author
+ * @since 2023-07-06
+ */
+@Getter
+@Setter
+public class OrderSkuDto extends OrderSku {
+
+}

+ 17 - 0
sd-business/src/main/java/com/sd/business/entity/order/dto/OrderSkuSelectDto.java

@@ -0,0 +1,17 @@
+package com.sd.business.entity.order.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 订单sku列表查询入参实体
+ *
+ * @author
+ * @since 2023-07-06
+ */
+@Getter
+@Setter
+public class OrderSkuSelectDto extends BaseSelectDto {
+
+}

+ 51 - 0
sd-business/src/main/java/com/sd/business/entity/order/enums/OrderStatusEnum.java

@@ -0,0 +1,51 @@
+package com.sd.business.entity.order.enums;
+
+import com.ruoyi.common.exception.ServiceException;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * 订单状态
+ */
+@Getter
+@AllArgsConstructor
+public enum OrderStatusEnum {
+    DRAFT(0, "草稿"),
+    UNDER_REVIEW(10, "图稿上传"),
+    NO_UNDER_REVIEW(15, "图稿未上传"),
+    Al_UNDER_REVIEW(18, "图稿已设计"),
+    REJECT(20, "生产中"),
+    PASS(30, "已发货"),
+    COMPLETE(40, "生产完成"),
+    SHIPPED(50, "退款中"),
+    COMPLETED(60, "已退款"),
+    INVALID(70, "订单无效"),
+    DELETE(80, "订单删除审核中"),
+    EXCEPTION(90, "订单异常");
+
+    private static final Map<Integer, OrderStatusEnum> map = new LinkedHashMap<>();
+
+    static {
+        for (OrderStatusEnum orderStatusEnum : values()) {
+            map.put(orderStatusEnum.getKey(), orderStatusEnum);
+        }
+    }
+
+    private final Integer key;
+    private final String value;
+
+    /**
+     * 通过key获取名称
+     */
+    public static OrderStatusEnum getEnum(Integer key) {
+        OrderStatusEnum orderStatusEnum = map.get(key);
+        if (orderStatusEnum == null) {
+            throw new ServiceException("未知订单状态:" + key);
+        }
+        return orderStatusEnum;
+    }
+
+}

+ 38 - 7
sd-business/src/main/java/com/sd/business/entity/order/po/Order.java

@@ -2,25 +2,31 @@ package com.sd.business.entity.order.po;
 
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.ruoyi.common.core.domain.BasePo;
-import java.math.BigDecimal;
-import java.util.Date;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.math.BigDecimal;
+import java.util.Date;
+
 /**
  * <p>
  * 订单
  * </p>
  *
- * @author 
+ * @author
  * @since 2023-06-30
  */
 @Getter
 @Setter
-@TableName("order")
+@TableName("`order`")
 public class Order extends BasePo {
 
     /**
+     * 来源 1自定义添加 2万里牛
+     */
+    private Integer source;
+
+    /**
      * 订单号
      */
     private String code;
@@ -31,14 +37,39 @@ public class Order extends BasePo {
     private String wlnCode;
 
     /**
+     * 万里牛订单状态
+     */
+    private Integer wlnStatus;
+
+    /**
+     * 万里牛uid
+     */
+    private String wlnUid;
+
+    /**
+     * 万里牛同步时间戳
+     */
+    private Long modifyTime;
+
+    /**
+     * 数据创建时间
+     */
+    private Date wlnCreateTime;
+
+    /**
+     * 数据审核时间
+     */
+    private Date wlnApproveTime;
+
+    /**
      * 快递单号
      */
     private String expressDeliveryCode;
 
     /**
-     * 进度 1草稿 2订单待确认 3图稿未设计 4图稿已设计 5生产中 6生产完成 7已发货 8退款中 9已退款 10订单无效 11订单删除审核中
+     * 进度 {@link com.sd.business.entity.order.enums.OrderStatusEnum}
      */
-    private Integer schedule;
+    private Integer status;
 
     /**
      * 结算状态 1未结算 2已对账 3已结算
@@ -46,7 +77,7 @@ public class Order extends BasePo {
     private Integer settlementStatus;
 
     /**
-     * 电商平台 字典:commerce_platform
+     * 电商平台
      */
     private String commercePlatform;
 

+ 88 - 0
sd-business/src/main/java/com/sd/business/entity/order/po/OrderSku.java

@@ -0,0 +1,88 @@
+package com.sd.business.entity.order.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * <p>
+ * 订单sku
+ * </p>
+ *
+ * @author
+ * @since 2023-07-06
+ */
+@Getter
+@Setter
+@TableName("order_sku")
+public class OrderSku extends BasePo {
+
+    /**
+     * 订单id
+     */
+    private Long orderId;
+
+    /**
+     * sku id
+     */
+    private Long skuId;
+
+    /**
+     * sku规格id
+     */
+    private Long skuSpecId;
+
+    /**
+     * 万里牛 sku id
+     */
+    private String wlnSkuId;
+
+    /**
+     * 万里牛 sku规格id
+     */
+    private String wlnSkuSpecId;
+
+    /**
+     * 数量
+     */
+    private BigDecimal quantity;
+
+    /**
+     * 定制加工费
+     */
+    private BigDecimal customProcessingFee;
+
+    /**
+     * 代发费
+     */
+    private BigDecimal lssueFee;
+
+    /**
+     * 快递包材费
+     */
+    private BigDecimal deliveryMaterialsFee;
+
+    /**
+     * 包装人工费
+     */
+    private BigDecimal packingLabor;
+
+    /**
+     * 单价
+     */
+    private BigDecimal unitPrice;
+
+    /**
+     * 标识 1单面 2 双面
+     */
+    private Integer printType;
+
+    /**
+     * 包装要求
+     */
+    private String packageRemark;
+
+}

+ 17 - 0
sd-business/src/main/java/com/sd/business/entity/order/vo/OrderSkuVo.java

@@ -0,0 +1,17 @@
+package com.sd.business.entity.order.vo;
+
+import com.sd.business.entity.order.po.OrderSku;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 订单sku列表查询返回值实体
+ *
+ * @author
+ * @since 2023-07-06
+ */
+@Getter
+@Setter
+public class OrderSkuVo extends OrderSku {
+
+}

+ 5 - 0
sd-business/src/main/java/com/sd/business/entity/sku/po/Sku.java

@@ -19,6 +19,11 @@ import lombok.Setter;
 public class Sku extends BasePo {
 
     /**
+     * 万里牛uid
+     */
+    private String wlnUid;
+
+    /**
      * 类型 0非集团SKU 1集团SKU
      */
     private Integer type;

+ 4 - 4
sd-business/src/main/java/com/sd/business/entity/sku/po/SkuClassify.java

@@ -29,14 +29,14 @@ public class SkuClassify extends BasePo {
     private String name;
 
     /**
-     * 万里牛catagoryid
+     * 万里牛catagoryId
      */
-    private String wlnCatagoryid;
+    private String wlnCatagoryId;
 
     /**
-     * 万里牛parentid
+     * 万里牛parentId
      */
-    private String wlnParentid;
+    private String wlnParentId;
 
     /**
      * 排序

+ 5 - 0
sd-business/src/main/java/com/sd/business/entity/sku/po/SkuSpec.java

@@ -21,6 +21,11 @@ import java.math.BigDecimal;
 public class SkuSpec extends BasePo {
 
     /**
+     * 万里牛uid
+     */
+    private String wlnUid;
+
+    /**
      * sku id
      */
     private Long skuId;

+ 26 - 0
sd-business/src/main/java/com/sd/business/mapper/order/OrderSkuMapper.java

@@ -0,0 +1,26 @@
+package com.sd.business.mapper.order;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.order.po.OrderSku;
+import com.sd.business.entity.order.vo.OrderSkuVo;
+import org.apache.ibatis.annotations.Param;
+
+
+/**
+ * <p>
+ * 订单sku Mapper 接口
+ * </p>
+ *
+ * @author
+ * @since 2023-07-06
+ */
+public interface OrderSkuMapper extends BaseMapper<OrderSku> {
+
+    /**
+     * 订单sku分页
+     */
+    Page<OrderSkuVo> getPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<OrderSku> wrapper);
+
+}

+ 46 - 0
sd-business/src/main/java/com/sd/business/service/order/OrderSkuService.java

@@ -0,0 +1,46 @@
+package com.sd.business.service.order;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.service.BaseService;
+import com.sd.business.entity.order.dto.OrderSkuDto;
+import com.sd.business.entity.order.dto.OrderSkuSelectDto;
+import com.sd.business.entity.order.po.OrderSku;
+import com.sd.business.entity.order.vo.OrderSkuVo;
+
+
+/**
+ * <p>
+ * 订单sku 服务类
+ * </p>
+ *
+ * @author
+ * @since 2023-07-06
+ */
+public interface OrderSkuService extends BaseService<OrderSku> {
+
+    /**
+     * 订单sku分页
+     */
+    Page<OrderSkuVo> getPage(OrderSkuSelectDto dto);
+
+    /**
+     * 订单sku明细
+     */
+    OrderSkuVo detail(Long id);
+
+    /**
+     * 订单sku新增
+     */
+    void add(OrderSkuDto orderSkuDto);
+
+    /**
+     * 订单sku编辑
+     */
+    void edit(OrderSkuDto orderSkuDto);
+
+    /**
+     * 订单sku删除
+     */
+    void delete(Long id);
+
+}

+ 57 - 0
sd-business/src/main/java/com/sd/business/service/order/impl/OrderSkuServiceImpl.java

@@ -0,0 +1,57 @@
+package com.sd.business.service.order.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.order.dto.OrderSkuDto;
+import com.sd.business.entity.order.dto.OrderSkuSelectDto;
+import com.sd.business.entity.order.po.OrderSku;
+import com.sd.business.entity.order.vo.OrderSkuVo;
+import com.sd.business.mapper.order.OrderSkuMapper;
+import com.sd.business.service.order.OrderSkuService;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * <p>
+ * 订单sku 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2023-07-06
+ */
+@Service
+public class OrderSkuServiceImpl extends ServiceImpl<OrderSkuMapper, OrderSku> implements OrderSkuService {
+
+    @Override
+    public Page<OrderSkuVo> getPage(OrderSkuSelectDto dto) {
+        IWrapper<OrderSku> wrapper = getWrapper();
+        wrapper.orderByDesc("os", OrderSku::getId);
+        Page<OrderSkuVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
+        return page;
+    }
+
+    @Override
+    public OrderSkuVo detail(Long id) {
+        OrderSku OrderSku = this.getById(id);
+        OrderSkuVo result = BeanUtil.toBean(OrderSku, OrderSkuVo.class);
+        return result;
+    }
+
+    @Override
+    public void add(OrderSkuDto orderSkuDto) {
+        this.save(orderSkuDto);
+    }
+
+    @Override
+    public void edit(OrderSkuDto orderSkuDto) {
+        this.updateById(orderSkuDto);
+    }
+
+    @Override
+    public void delete(Long id) {
+        this.removeById(id);
+    }
+
+}

+ 25 - 0
sd-business/src/main/resources/mapper/order/OrderSkuMapper.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sd.business.mapper.order.OrderSkuMapper">
+    <select id="getPage" resultType="com.sd.business.entity.order.vo.OrderSkuVo">
+        select os.id,
+               os.order_id,
+               os.sku_id,
+               os.sku_spec_id,
+               os.quantity,
+               os.custom_processing_fee,
+               os.lssue_fee,
+               os.delivery_materials_fee,
+               os.packing_labor,
+               os.unit_price,
+               os.print_type,
+               os.package_remark,
+               os.create_user,
+               os.create_time,
+               os.update_user,
+               os.update_time
+        from order_sku os
+            ${ew.customSqlSegment}
+    </select>
+
+</mapper>

+ 0 - 1
sd-wln/src/main/java/com/sd/wln/entity/GoodsSpecParam.java

@@ -1,4 +1,3 @@
-
 package com.sd.wln.entity;
 
 import lombok.Getter;

+ 0 - 19
sd-wln/src/main/java/com/sd/wln/entity/Signature.java

@@ -1,19 +1,3 @@
-/*
- *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
- *
- *  Redistribution and use in source and binary forms, with or without
- *  modification, are permitted provided that the following conditions are met:
- *
- *  Redistributions of source code must retain the above copyright notice,
- *  this list of conditions and the following disclaimer.
- *  Redistributions in binary form must reproduce the above copyright
- *  notice, this list of conditions and the following disclaimer in the
- *  documentation and/or other materials provided with the distribution.
- *  Neither the name of the dreamlu.net developer nor the names of its
- *  contributors may be used to endorse or promote products derived from
- *  this software without specific prior written permission.
- *  Author: Chill 庄骞 (smallchill@163.com)
- */
 package com.sd.wln.entity;
 
 import com.ruoyi.common.utils.sign.Md5Utils;
@@ -24,9 +8,6 @@ import java.io.Serializable;
 
 /**
  * 签名参数实体类
- *
- * @author BladeX
- * @since 2022-8-03
  */
 @Data
 public class Signature implements Serializable {

+ 85 - 0
sd-wln/src/main/java/com/sd/wln/entity/TradesParam.java

@@ -0,0 +1,85 @@
+package com.sd.wln.entity;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 查询订单参数实体类
+ */
+@Getter
+@Setter
+public class TradesParam extends Signature {
+
+    /**
+     * 单据编码
+     */
+    private String bill_code;
+
+    /**
+     * 单据创建时间,修改时间为空是使用,仅支持近3个月的日期查询
+     */
+    private Long create_time;
+
+    /**
+     * 单据审核时间,时间戳毫秒格式
+     */
+    private Long approve_time;
+
+    /**
+     * 单据修改时间,仅支持近3个月的日期查询
+     */
+    private Long modify_time;
+
+    /**
+     * 发货时间,创建时间为空时使用,仅支持近3个月的日期查询
+     */
+    private Long send_goods_time;
+
+    /**
+     * 完成时间,发货时间为空时使用,仅支持近3个月的日期查询
+     */
+    private Long finish_time;
+
+    /**
+     * 查询结束时间;仅支持开始时间与结束时间间隔7天之内
+     */
+    private Long end_time;
+
+    /**
+     * 付款时间,仅支持近3个月的日期查询
+     */
+    private Long pay_time;
+
+    /**
+     * 仓库编码
+     */
+    private String storage_code;
+
+    /**
+     * 是否拆分组合商品
+     */
+    private Boolean is_split;
+
+    /**
+     * 手机
+     */
+    private String mobile;
+
+    /**
+     * 订单状态0:审核 1:打单配货 2:验货3:称重4:待发货5:财审8:已发货9:完成10:关闭13:配货中15:打包 PS:分销商订单不支持状态查询,支持多状态查询,中间使用英文逗号隔开,如1,2,3
+     */
+    private String trade_status;
+
+    /**
+     * 扩展字段 为JSON格式
+     * {"query_exchange_only":true}
+     */
+    private JSONObject query_extend;
+
+    /**
+     * 是否查询无数据也进行删除
+     */
+    private Boolean flag;
+
+}

+ 6 - 6
sd-wln/src/main/java/com/sd/wln/scheduled/WlnSyncTask.java

@@ -18,8 +18,8 @@ public class WlnSyncTask {
     /**
      * 每天同步库存
      */
-    @Scheduled(cron = "0 0 1 * * ?")
-    // @Scheduled(cron = "0/1 * * * * ?")
+    // @Scheduled(cron = "0 0 1 * * ?")
+    @Scheduled(cron = "0/1 * * * * ?")
     public void syncSku() {
         for (int i = 0; i < 3; i++) {
             boolean flag = wlnSkuService.syncSkuClassify();
@@ -36,9 +36,9 @@ public class WlnSyncTask {
         }
     }
 
-    @Scheduled(fixedDelay = 30 * 1000)
-    private void syncOrder() {
-        wlnOrderService.syncOrder();
-    }
+    // @Scheduled(fixedDelay = 30 * 1000)
+    // private void syncOrder() {
+    //     wlnOrderService.syncOrder();
+    // }
 
 }

+ 1 - 1
sd-wln/src/main/java/com/sd/wln/service/WlnOrderService.java

@@ -5,6 +5,6 @@ public interface WlnOrderService {
     /**
      * 同步订单
      */
-    void syncOrder();
+    boolean syncOrder();
 
 }

+ 217 - 1
sd-wln/src/main/java/com/sd/wln/service/impl/WlnOrderServiceImpl.java

@@ -1,14 +1,230 @@
 package com.sd.wln.service.impl;
 
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.fjhx.tenant.entity.dict.po.DictCommonData;
+import com.fjhx.tenant.service.dict.DictCommonDataService;
+import com.sd.business.entity.department.po.Department;
+import com.sd.business.entity.order.enums.OrderStatusEnum;
+import com.sd.business.entity.order.po.Order;
+import com.sd.business.entity.order.po.OrderSku;
+import com.sd.business.entity.sku.po.SkuSpec;
+import com.sd.business.service.department.DepartmentService;
+import com.sd.business.service.order.OrderService;
+import com.sd.business.service.order.OrderSkuService;
+import com.sd.business.service.sku.SkuSpecService;
 import com.sd.wln.service.WlnOrderService;
+import com.sd.wln.util.WlnUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Slf4j
 @Service
 public class WlnOrderServiceImpl implements WlnOrderService {
 
+    @Autowired
+    private DictCommonDataService dictCommonDataService;
+
+    @Autowired
+    private DepartmentService departmentService;
+
+    @Autowired
+    private OrderService orderService;
+
+    @Autowired
+    private OrderSkuService orderSkuService;
+
+    @Autowired
+    private SkuSpecService skuSpecService;
+
+    @DSTransactional
     @Override
-    public void syncOrder() {
+    public boolean syncOrder() {
+        Date endDate = new Date();
+
+        List<JSONObject> wlnOrderList = getWlnOrderList(endDate);
+        if (wlnOrderList == null) {
+            log.error("订单同步失败");
+            return false;
+        }
+        Map<String, Department> departmentMap = getDepartmentMap();
+
+        List<Order> saveOrderList = new ArrayList<>();
+        List<OrderSku> saveOrderSkuList = new ArrayList<>();
+
+        List<Order> updateOrderList = new ArrayList<>();
+
+        List<Order> orderList = orderService.list(q ->
+                q.between(Order::getWlnApproveTime, DateUtil.offsetDay(endDate, -3), endDate));
+        Map<String, Order> orderMap = orderList.stream().collect(Collectors.toMap(Order::getWlnUid, Function.identity()));
+
+        for (JSONObject wlnOrder : wlnOrderList) {
+            String uid = wlnOrder.getString("uid");
+            Order order = orderMap.get(uid);
+            if (order != null) {
+                Integer processStatus = wlnOrder.getInteger("process_status");
+                if (ObjectUtil.notEqual(order.getWlnStatus(), processStatus)) {
+                    order.setWlnStatus(processStatus);
+                    updateOrderList.add(order);
+                }
+                continue;
+            }
+
+            order = createOrder(wlnOrder, departmentMap);
+            List<JSONObject> wlnOrderSkuList = wlnOrder.getJSONArray("orders").toJavaList(JSONObject.class);
+
+            if (ObjectUtil.isNotEmpty(wlnOrderSkuList)) {
+                Map<String, SkuSpec> skuSpecMap = new HashMap<>();
+
+                List<String> skuCodeList = wlnOrderSkuList.stream().map(item -> item.getString("sys_spec_uid"))
+                        .filter(Objects::isNull).distinct().collect(Collectors.toList());
+
+                if (skuCodeList.size() > 0) {
+                    skuSpecMap = skuSpecService.mapKEntity(SkuSpec::getCode, q -> q.in(SkuSpec::getWlnUid, skuCodeList));
+                }
+
+                for (JSONObject wlnOrderSku : wlnOrderSkuList) {
+                    SkuSpec skuSpec = skuSpecMap.get(wlnOrderSku.getString("sys_spec_uid"));
+                    OrderSku orderSku = createOrderSku(wlnOrderSku, order, skuSpec);
+                    saveOrderSkuList.add(orderSku);
+                }
+
+            }
+
+            saveOrderList.add(order);
+        }
+
+        orderService.saveBatch(saveOrderList);
+        orderService.updateBatchById(updateOrderList);
+        orderSkuService.saveBatch(saveOrderSkuList);
+        return true;
+    }
+
+    /**
+     * 万里牛查询3天之内的全部订单
+     */
+    private List<JSONObject> getWlnOrderList(Date endDate) {
+        List<DictCommonData> warehouseCodeList = dictCommonDataService.list(
+                q -> q.eq(DictCommonData::getDictCode, "warehouse_code"));
+        if (warehouseCodeList.size() == 0) {
+            log.error("仓库字典:warehouse_code 为空");
+            return null;
+        }
+
+        List<JSONObject> list = new ArrayList<>();
+
+        long endTime = endDate.getTime();
+        long startTime = endTime - 1000 * 60 * 60 * 24 - 1;
+
+        for (int i = 0; i < 3; i++) {
+            for (DictCommonData dictCommonData : warehouseCodeList) {
+                int page = 1;
+                int size;
+                do {
+                    try {
+                        List<JSONObject> itemList = WlnUtil.getOrderList(page, 200, startTime, endTime, dictCommonData.getDictValue());
+                        page++;
+                        size = itemList.size();
+                        list.addAll(itemList);
+                    } catch (Exception e) {
+                        log.error("订单同步失败", e);
+                        return null;
+                    }
+                } while (size >= 200);
+            }
+            startTime -= 1000 * 60 * 60 * 24;
+            endTime -= 1000 * 60 * 60 * 24;
+        }
+
+        return list;
+    }
+
+    private Map<String, Department> getDepartmentMap() {
+        Map<String, Department> departmentMap = new HashMap<>();
+        for (Department department : departmentService.list()) {
+            String warehouseCode = department.getWlnWarehouseCode();
+            if (StrUtil.isBlank(warehouseCode)) {
+                continue;
+            }
+            for (String item : warehouseCode.split(",")) {
+                departmentMap.put(item, department);
+            }
+        }
+        return departmentMap;
+    }
+
+    private Order createOrder(JSONObject wlnOrder, Map<String, Department> departmentMap) {
+        Department department = departmentMap.get(wlnOrder.getString("storage_code"));
+
+        Order order = new Order();
+        order.setId(IdWorker.getId());
+        order.setSource(2);
+        order.setCode(wlnOrder.getString("tp_tid"));
+        order.setWlnCode(wlnOrder.getString("trade_no"));
+        order.setWlnUid(wlnOrder.getString("uid"));
+        order.setWlnCreateTime(wlnOrder.getDate("create_time"));
+        order.setWlnApproveTime(wlnOrder.getDate("approve_time"));
+        order.setModifyTime(wlnOrder.getLong("modify_time"));
+        order.setRemark(wlnOrder.getString("remark"));
+        order.setProvince(wlnOrder.getString("province"));
+        order.setCity(wlnOrder.getString("city"));
+        order.setCounty(wlnOrder.getString("district"));
+        order.setDetailedAddress(wlnOrder.getString("address"));
+        order.setPostcode(wlnOrder.getString("zip"));
+        order.setWlnStatus(wlnOrder.getInteger("process_status"));
+
+        StringBuilder builder = new StringBuilder();
+        // 订单来源平台
+        if (wlnOrder.containsKey("source_platform")) {
+            builder.append(wlnOrder.getString("source_platform"));
+        }
+        // 店铺名称
+        if (wlnOrder.containsKey("shop_name")) {
+            builder.append("_");
+            builder.append(wlnOrder.getString("shop_name"));
+        }
+        order.setCommercePlatform(builder.toString());
+
+        if (department != null) {
+            order.setDepartmentId(department.getId());
+            if (Objects.equals(department.getOrderMode(), "2")) {
+                order.setStatus(OrderStatusEnum.REJECT.getKey());
+            } else {
+                order.setStatus(OrderStatusEnum.UNDER_REVIEW.getKey());
+            }
+        } else {
+            order.setStatus(OrderStatusEnum.UNDER_REVIEW.getKey());
+        }
+
+        if (order.getWlnStatus() == 10 || order.getWlnStatus() == 11 || order.getWlnStatus() == 12) {
+            order.setStatus(OrderStatusEnum.EXCEPTION.getKey());
+        }
+
+        return order;
+    }
 
+    private OrderSku createOrderSku(JSONObject wlnOrderSku, Order order, SkuSpec skuSpec) {
+        OrderSku orderSku = new OrderSku();
+        orderSku.setId(IdWorker.getId());
+        orderSku.setOrderId(order.getId());
+        orderSku.setQuantity(wlnOrderSku.getBigDecimal("size"));
+        orderSku.setPrintType(1);
+        orderSku.setWlnSkuId(wlnOrderSku.getString("sys_goods_uid"));
+        orderSku.setWlnSkuSpecId(wlnOrderSku.getString("sys_spec_uid"));
+        if (skuSpec != null) {
+            orderSku.setSkuId(skuSpec.getSkuId());
+            orderSku.setSkuSpecId(skuSpec.getId());
+        }
+        return orderSku;
     }
 
 }

+ 18 - 21
sd-wln/src/main/java/com/sd/wln/service/impl/WlnSkuServiceImpl.java

@@ -57,7 +57,7 @@ public class WlnSkuServiceImpl implements WlnSkuService {
         // 查询数据库sku分类
         List<SkuClassify> mysqlSkuClassifyList = skuClassifyService.list();
         Map<String, SkuClassify> skuClassifyMap = mysqlSkuClassifyList.stream()
-                .collect(Collectors.toMap(SkuClassify::getWlnCatagoryid, Function.identity()));
+                .collect(Collectors.toMap(SkuClassify::getWlnCatagoryId, Function.identity()));
 
         // 去重合并
         List<SkuClassify> skuClassifyList = new ArrayList<>();
@@ -71,17 +71,17 @@ public class WlnSkuServiceImpl implements WlnSkuService {
                 skuClassify.setId(IdWorker.getId());
             }
             skuClassify.setName(item.getString("catagory_name"));
-            skuClassify.setWlnCatagoryid(catagoryid);
-            skuClassify.setWlnParentid(item.getString("parentid"));
+            skuClassify.setWlnCatagoryId(catagoryid);
+            skuClassify.setWlnParentId(item.getString("parentid"));
             skuClassify.setSort(i);
             skuClassifyList.add(skuClassify);
         }
 
         // 赋值parentId
         Map<String, Long> map = skuClassifyList.stream()
-                .collect(Collectors.toMap(SkuClassify::getWlnCatagoryid, SkuClassify::getId, (t1, t2) -> t1));
+                .collect(Collectors.toMap(SkuClassify::getWlnCatagoryId, SkuClassify::getId, (t1, t2) -> t1));
         for (SkuClassify skuClassify : skuClassifyList) {
-            skuClassify.setParentId(map.getOrDefault(skuClassify.getWlnParentid(), 0L));
+            skuClassify.setParentId(map.getOrDefault(skuClassify.getWlnParentId(), 0L));
         }
 
         // 更新数据库
@@ -96,35 +96,32 @@ public class WlnSkuServiceImpl implements WlnSkuService {
         int size;
         List<JSONObject> wlnSkuList = new ArrayList<>();
         do {
-            List<JSONObject> itemList;
             try {
-                itemList = WlnUtil.getSkuList(page, 200);
+                List<JSONObject> itemList = WlnUtil.getSkuList(page, 200);
+                page++;
+                size = itemList.size();
+                wlnSkuList.addAll(itemList);
             } catch (Exception e) {
                 log.error("sku同步失败", e);
                 return false;
             }
-            page++;
-            size = itemList.size();
-            wlnSkuList.addAll(itemList);
         } while (size >= 200);
 
         // 产品分类map
-        Map<String, Long> skuClassifyMap = skuClassifyService.list().stream()
-                .collect(Collectors.toMap(SkuClassify::getWlnCatagoryid, BaseIdPo::getId));
+        Map<String, Long> skuClassifyMap = skuClassifyService.mapKV(SkuClassify::getWlnCatagoryId, BaseIdPo::getId, null);
 
         // 产品map
-        Map<String, Sku> skuMap = skuService.list().stream().collect(
-                Collectors.toMap(Sku::getCode, Function.identity()));
+        Map<String, Sku> skuMap = skuService.mapKEntity(Sku::getWlnUid, null);
 
         // 产品规格map
         Map<Long, Map<String, SkuSpec>> specMap = skuSpecService.list().stream().collect(
-                Collectors.groupingBy(SkuSpec::getSkuId, Collectors.toMap(SkuSpec::getCode, Function.identity())));
+                Collectors.groupingBy(SkuSpec::getSkuId, Collectors.toMap(SkuSpec::getWlnUid, Function.identity())));
 
         List<Sku> newSkuList = new ArrayList<>();
         List<SkuSpec> newSkuSpecList = new ArrayList<>();
 
         for (JSONObject wlnSku : wlnSkuList) {
-            Sku sku = skuMap.get(wlnSku.getString("goods_code"));
+            Sku sku = skuMap.get(wlnSku.getString("sys_goods_uid"));
             if (sku == null) {
                 sku = createSku(wlnSku, skuClassifyMap);
                 newSkuList.add(sku);
@@ -132,13 +129,11 @@ public class WlnSkuServiceImpl implements WlnSkuService {
 
             List<JSONObject> specList = wlnSku.getJSONArray("specs").toJavaList(JSONObject.class);
             for (JSONObject wlnSkuSpec : specList) {
-                String code = wlnSkuSpec.getString("spec_code");
                 Map<String, SkuSpec> skuSpecMap = specMap.get(sku.getId());
-                if (skuSpecMap != null && skuSpecMap.get(code) != null) {
+                if (skuSpecMap != null && skuSpecMap.get(wlnSkuSpec.getString("sys_spec_uid")) != null) {
                     continue;
                 }
-                SkuSpec skuSpec = createSkuSpec(wlnSkuSpec, sku);
-                newSkuSpecList.add(skuSpec);
+                newSkuSpecList.add(createSkuSpec(wlnSkuSpec, sku));
             }
         }
 
@@ -158,7 +153,7 @@ public class WlnSkuServiceImpl implements WlnSkuService {
                 throw new ServiceException("sku分类同步失败");
             }
             skuClassifyMap = skuClassifyService.list().stream()
-                    .collect(Collectors.toMap(SkuClassify::getWlnCatagoryid, BaseIdPo::getId));
+                    .collect(Collectors.toMap(SkuClassify::getWlnCatagoryId, BaseIdPo::getId));
             skuClassifyId = skuClassifyMap.get(catagoryId);
             if (skuClassifyId == null) {
                 throw new ServiceException("未知万里牛分类id:" + catagoryId);
@@ -167,6 +162,7 @@ public class WlnSkuServiceImpl implements WlnSkuService {
 
         Sku sku = new Sku();
         sku.setId(IdWorker.getId());
+        sku.setWlnUid(wlnSku.getString("sys_goods_uid"));
         sku.setSource(2);
         sku.setSkuClassifyId(skuClassifyId);
         sku.setCode(wlnSku.getString("goods_code"));
@@ -180,6 +176,7 @@ public class WlnSkuServiceImpl implements WlnSkuService {
     private SkuSpec createSkuSpec(JSONObject wlnSku, Sku sku) {
         SkuSpec skuSpec = new SkuSpec();
         skuSpec.setId(IdWorker.getId());
+        skuSpec.setWlnUid(wlnSku.getString("sys_spec_uid"));
         skuSpec.setSkuId(sku.getId());
         skuSpec.setSpecImgUrl(wlnSku.getString("pic"));
         skuSpec.setCode(wlnSku.getString("spec_code"));

+ 46 - 9
sd-wln/src/main/java/com/sd/wln/util/WlnUtil.java

@@ -8,6 +8,7 @@ import com.ruoyi.common.utils.MapUtil;
 import com.sd.wln.constants.WlnConstant;
 import com.sd.wln.entity.GoodsSpecParam;
 import com.sd.wln.entity.SkuClassifyParam;
+import com.sd.wln.entity.TradesParam;
 import org.apache.http.HttpEntity;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.client.methods.HttpPost;
@@ -21,16 +22,21 @@ import java.util.List;
 
 public class WlnUtil {
 
-    // 万里牛路径前缀
+    /**
+     * 万里牛路径前缀
+     */
     private static final String PREFIX = "https://open-api.hupun.com/api/";
 
+    /**
+     * 获取sku分类
+     */
     public static List<JSONObject> getSkuClassifyList() throws Exception {
         SkuClassifyParam param = new SkuClassifyParam();
         param.setCom_uid(WlnConstant.COM_UID);
         String linkString = MapUtil.createLinkString(MapUtil.beanToMap(param));
         param.generateSign(linkString);
 
-        String result = sendPost(PREFIX + "/erp/goods/catagory/query", param);
+        String result = send(PREFIX + "erp/goods/catagory/query", param);
         JSONObject json = JSONObject.parseObject(result);
         Integer code = json.getInteger("code");
         if (code != 0) {
@@ -39,13 +45,37 @@ public class WlnUtil {
         return json.getJSONArray("data").toJavaList(JSONObject.class);
     }
 
+    /**
+     * 获取sku列表
+     */
     public static List<JSONObject> getSkuList(Integer page, Integer limit) throws Exception {
         GoodsSpecParam param = new GoodsSpecParam();
         param.setPage(page);
         param.setLimit(limit);
         param.setModify_time(965381503L);
         param.generateSign(MapUtil.createLinkString(MapUtil.beanToMap(param)));
-        String result = sendPost(PREFIX + "/erp/goods/spec/open/query/goodswithspeclist", MapUtil.beanToMap(param));
+        String result = send(PREFIX + "erp/goods/spec/open/query/goodswithspeclist", MapUtil.beanToMap(param));
+        JSONObject json = JSONObject.parseObject(result);
+        Integer code = json.getInteger("code");
+        if (code != 0) {
+            throw new ServiceException(result);
+        }
+        return json.getJSONArray("data").toJavaList(JSONObject.class);
+    }
+
+    /**
+     * 获取订单
+     */
+    public static List<JSONObject> getOrderList(Integer page, Integer limit, Long startTime, Long endTime, String warehouseCode) throws Exception {
+        TradesParam param = new TradesParam();
+        param.setApprove_time(startTime);
+        param.setEnd_time(endTime);
+        param.setPage(page);
+        param.setLimit(limit);
+        param.setStorage_code(warehouseCode);
+        param.setIs_split(true);
+        param.generateSign(MapUtil.createLinkString(MapUtil.beanToMap(param)));
+        String result = send(PREFIX + "erp/opentrade/list/trades", MapUtil.beanToMap(param));
         JSONObject json = JSONObject.parseObject(result);
         Integer code = json.getInteger("code");
         if (code != 0) {
@@ -54,16 +84,23 @@ public class WlnUtil {
         return json.getJSONArray("data").toJavaList(JSONObject.class);
     }
 
-    // public static void main(String[] args) throws Exception {
-    //     List<JSONObject> skuList = getSkuList(1, 200);
-    //     // List<JSONObject> skuClassifyList = getSkuClassifyList();
-    //     System.out.println();
-    // }
+    public static void main(String[] args) throws Exception {
+        // List<JSONObject> skuList = getSkuList(1, 200);
+
+        // List<JSONObject> skuClassifyList = getSkuClassifyList();
+
+        // long endTime = System.currentTimeMillis();
+        // long startTime = endTime - 1000 * 60 * 60 * 24;
+        // List<JSONObject> b012 = getOrderList(1, 50, startTime, endTime, "B012");
+
+        System.out.println();
+    }
+
 
     /**
      * post请求
      */
-    private static String sendPost(String url, Object param) throws IOException {
+    private static String send(String url, Object param) throws IOException {
         String params = JSONUtil.toJsonStr(param);
         StringEntity entity = new StringEntity(params, "UTF-8");