Explorar o código

Merge branch 'dev_kuaidi_20221026' into ponline

liujunchi %!s(int64=2) %!d(string=hai) anos
pai
achega
527756de1c
Modificáronse 21 ficheiros con 977 adicións e 7 borrados
  1. 25 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/OmsOrderController.java
  2. 1 1
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/UmsAdminController.java
  3. 30 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/OmsOrderCourierService.java
  4. 68 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderCourierServiceImpl.java
  5. 39 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderServiceImpl.java
  6. 10 0
      cooleshow-mall/mall-common/pom.xml
  7. 150 0
      cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/courier/domain/CourierInfo.java
  8. 61 0
      cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/courier/enums/CompanyEnum.java
  9. 7 0
      cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/courier/package-info.java
  10. 42 0
      cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/courier/service/CourierService.java
  11. 150 0
      cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/courier/service/impl/Courier100ServiceImpl.java
  12. 1 0
      cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/enums/OrderCacheEnum.java
  13. 37 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/OmsOrderCourierMapper.java
  14. 1 1
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsOrder.java
  15. 75 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsOrderCourier.java
  16. 114 0
      cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/OmsOrderCourierMapper.xml
  17. 22 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java
  18. 39 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/open/OpenShareController.java
  19. 30 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsOrderCourierService.java
  20. 68 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsOrderCourierServiceImpl.java
  21. 7 5
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

+ 25 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/OmsOrderController.java

@@ -1,10 +1,12 @@
 package com.yonge.cooleshow.admin.controller;
 
+import com.yonge.cooleshow.admin.service.OmsOrderCourierService;
 import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
 import com.yonge.cooleshow.admin.dto.*;
 import com.yonge.cooleshow.mbg.model.OmsOrder;
 import com.yonge.cooleshow.admin.service.OmsOrderService;
+import com.yonge.cooleshow.mbg.model.OmsOrderCourier;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -27,6 +29,9 @@ public class OmsOrderController {
     @Autowired
     private OmsOrderService orderService;
 
+
+    @Autowired
+    private OmsOrderCourierService orderCourierService;
     @ApiOperation("查询订单")
     @RequestMapping(value = "/list", method = RequestMethod.GET)
     @ResponseBody
@@ -112,4 +117,24 @@ public class OmsOrderController {
         }
         return CommonResult.failed();
     }
+
+
+
+    @ApiOperation("用户查询物流")
+    @GetMapping(value = "/selectCourier")
+    @ResponseBody
+    public CommonResult<OmsOrderCourier> selectCourier(@RequestParam String  deliverySn) {
+        OmsOrderCourier omsOrderCourier = orderCourierService.getCourierInfo(deliverySn);
+        return CommonResult.success(omsOrderCourier);
+    }
+
+
+
+    @ApiOperation("用户刷新物流信息")
+    @GetMapping(value = "/refreshCourier")
+    @ResponseBody
+    public CommonResult refreshCourier(@RequestParam String  deliverySn) throws InterruptedException {
+        OmsOrderCourier omsOrderCourier = orderCourierService.refreshCourier(deliverySn);
+        return CommonResult.success(omsOrderCourier);
+    }
 }

+ 1 - 1
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/UmsAdminController.java

@@ -94,7 +94,7 @@ public class UmsAdminController {
         data.put("icon", umsAdmin.getIcon());
         List<UmsRole> roleList = adminService.getRoleList(umsAdmin.getId());
         if(CollUtil.isNotEmpty(roleList)){
-            List<String> roles = roleList.stream().map(UmsRole::getName).collect(Collectors.toList());
+            List<String> roles = roleList.stream().filter(role -> role != null).map(UmsRole::getName).collect(Collectors.toList());
             data.put("roles",roles);
         }
         return CommonResult.success(data);

+ 30 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/OmsOrderCourierService.java

@@ -0,0 +1,30 @@
+package com.yonge.cooleshow.admin.service;
+
+import com.yonge.cooleshow.mall.common.courier.domain.CourierInfo;
+import com.yonge.cooleshow.mbg.model.OmsOrderCourier;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-31
+ */
+public interface OmsOrderCourierService {
+
+
+    @Transactional
+    void updateCourierInfo(CourierInfo courierInfos);
+
+    /**
+     * 查询物流
+     */
+    OmsOrderCourier getCourierInfo(String deliverySn);
+
+    /**
+     * 刷新物流信息
+     * @return
+     */
+    @Transactional
+    OmsOrderCourier refreshCourier(String deliverySn) throws InterruptedException;
+}

+ 68 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderCourierServiceImpl.java

@@ -0,0 +1,68 @@
+package com.yonge.cooleshow.admin.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.admin.service.OmsOrderCourierService;
+import com.yonge.cooleshow.mall.common.courier.domain.CourierInfo;
+import com.yonge.cooleshow.mall.common.courier.enums.CompanyEnum;
+import com.yonge.cooleshow.mall.common.courier.service.CourierService;
+import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
+import com.yonge.cooleshow.mbg.mapper.OmsOrderCourierMapper;
+import com.yonge.cooleshow.mbg.model.OmsOrderCourier;
+import com.yonge.toolset.base.exception.BizException;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-31
+ */
+@Service
+public class OmsOrderCourierServiceImpl implements OmsOrderCourierService {
+
+    @Autowired
+    private OmsOrderCourierMapper omsOrderCourierMapper;
+    @Autowired
+    private CourierService courierService;
+
+    @Autowired
+    private RedissonClient redissonClient;
+
+    @Override
+    public void updateCourierInfo(CourierInfo courierInfos) {
+        String courierNo = courierInfos.getCourierNo();
+        String logistics = JSON.toJSONString(courierInfos.getLogisticsList());
+        omsOrderCourierMapper.updateByCourierNo(courierNo,logistics);
+    }
+
+    @Override
+    public OmsOrderCourier getCourierInfo(String deliverySn) {
+        OmsOrderCourier omsOrderCourier = omsOrderCourierMapper.queryByCourierNo(deliverySn);
+        if (omsOrderCourier == null) {
+            throw new BizException("未找到物流信息");
+        }
+        return omsOrderCourier;
+    }
+
+    @Override
+    public OmsOrderCourier refreshCourier(String deliverySn) throws InterruptedException {
+        RLock lock = redissonClient.getLock(OrderCacheEnum.COURIER_LOCK.getCode() + deliverySn);
+        boolean b = lock.tryLock(0,1, TimeUnit.HOURS);
+
+        OmsOrderCourier omsOrderCourier = omsOrderCourierMapper.queryByCourierNo(deliverySn);
+        if (b) {
+            if (omsOrderCourier == null) {
+                throw new BizException("未找到物流信息");
+            }
+            CourierInfo courierInfo = courierService.queryTrack(CompanyEnum.descOf(omsOrderCourier.getCompany()),
+                                                                omsOrderCourier.getCourierNo());
+            updateCourierInfo(courierInfo);
+        }
+        return omsOrderCourierMapper.queryByCourierNo(deliverySn);
+    }
+}

+ 39 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderServiceImpl.java

@@ -8,15 +8,22 @@ import com.yonge.cooleshow.admin.dto.search.OrderStatisticalSearch;
 import com.yonge.cooleshow.admin.dto.search.UserStatisticalSearch;
 import com.yonge.cooleshow.admin.service.OmsOrderReturnApplyService;
 import com.yonge.cooleshow.admin.service.PmsProductService;
+import com.yonge.cooleshow.mall.common.courier.enums.CompanyEnum;
+import com.yonge.cooleshow.mall.common.courier.service.CourierService;
+import com.yonge.cooleshow.mbg.mapper.OmsOrderCourierMapper;
 import com.yonge.cooleshow.mbg.mapper.OmsOrderMapper;
 import com.yonge.cooleshow.mbg.mapper.OmsOrderOperateHistoryMapper;
+import com.yonge.cooleshow.mbg.mapper.SysConfigMapper;
 import com.yonge.cooleshow.mbg.model.OmsOrder;
+import com.yonge.cooleshow.mbg.model.OmsOrderCourier;
 import com.yonge.cooleshow.mbg.model.OmsOrderExample;
 import com.yonge.cooleshow.mbg.model.OmsOrderOperateHistory;
 import com.yonge.cooleshow.admin.service.OmsOrderService;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.utils.date.DateUtil;
 import com.yonge.cooleshow.admin.enums.OrderStatisticalEnum;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
@@ -39,6 +46,8 @@ import java.util.stream.Collectors;
  */
 @Service
 public class OmsOrderServiceImpl implements OmsOrderService {
+
+    private static final Logger LOG = LoggerFactory.getLogger(OmsOrderServiceImpl.class);
     @Autowired
     private OmsOrderMapper orderMapper;
     @Autowired
@@ -54,6 +63,15 @@ public class OmsOrderServiceImpl implements OmsOrderService {
     @Autowired
     private PmsProductService productService;
 
+    @Autowired
+    private OmsOrderCourierMapper omsOrderCourierMapper;
+
+    @Autowired
+    private CourierService courierService;
+
+    @Autowired
+    private SysConfigMapper sysConfigMapper;
+
     @Override
     public List<OrderVo> list(OmsOrderQueryParam queryParam, Integer pageSize, Integer pageNum) {
         PageHelper.startPage(pageNum, pageSize);
@@ -76,6 +94,27 @@ public class OmsOrderServiceImpl implements OmsOrderService {
                     return history;
                 }).collect(Collectors.toList());
         orderOperateHistoryDao.insertList(operateHistoryList);
+
+        // 添加快递信息
+        List<OmsOrderCourier> omsOrderCouriers = new ArrayList<>();
+        for (OmsOrderDeliveryParam omsOrderDeliveryParam : deliveryParamList) {
+            OmsOrderCourier omsOrderCourier = new OmsOrderCourier();
+            omsOrderCourier.setOrderId(omsOrderDeliveryParam.getOrderId());
+            omsOrderCourier.setCourierNo(omsOrderDeliveryParam.getDeliverySn());
+            omsOrderCourier.setCompany(omsOrderDeliveryParam.getDeliveryCompany());
+            omsOrderCouriers.add(omsOrderCourier);
+        }
+        omsOrderCourierMapper.batchInsert(omsOrderCouriers);
+
+
+        for (OmsOrderCourier omsOrderCourier : omsOrderCouriers) {
+            try {
+                courierService.subscribe(CompanyEnum.descOf(omsOrderCourier.getCompany()),omsOrderCourier.getCourierNo(),sysConfigMapper.getConfig("kuaidiUrl"));
+
+            } catch (Exception e) {
+                LOG.error(e.getMessage());
+            }
+        }
         return count;
     }
 

+ 10 - 0
cooleshow-mall/mall-common/pom.xml

@@ -64,6 +64,16 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-validation</artifactId>
         </dependency>
+<!--        快递100-->
+        <dependency>
+            <groupId>com.github.kuaidi100-api</groupId>
+            <artifactId>sdk</artifactId>
+            <version>1.0.10</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
 
     </dependencies>
 

+ 150 - 0
cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/courier/domain/CourierInfo.java

@@ -0,0 +1,150 @@
+package com.yonge.cooleshow.mall.common.courier.domain;
+
+import com.yonge.cooleshow.mall.common.courier.enums.CompanyEnum;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Description 快递运输信息
+ *
+ * @author liujunchi
+ * @date 2022-10-26
+ */
+public class CourierInfo {
+
+    // 快递公司
+    private CompanyEnum company;
+
+    // 快递单号
+    private String courierNo;
+
+    // 物流信息
+    private List<Logistics> logisticsList;
+
+    public  static class Logistics {
+        // 时间
+        private Date time;
+
+        //内容
+        private String context;
+
+
+        //行政区域的编码
+        private String areaCode;
+
+        //行政区域的名称
+        private String areaName;
+
+        //物流状态名称或者高级状态名称
+        private String status;
+
+        //快件当前地点
+        private String location;
+
+        //行政区域经纬度
+        private String areaCenter;
+
+        //行政区域拼音
+        private String areaPinYin;
+
+        //高级物流状态值
+        private String statusCode;
+
+        public Date getTime() {
+            return time;
+        }
+
+        public void setTime(Date time) {
+            this.time = time;
+        }
+
+        public String getContext() {
+            return context;
+        }
+
+        public void setContext(String context) {
+            this.context = context;
+        }
+
+        public String getAreaCode() {
+            return areaCode;
+        }
+
+        public void setAreaCode(String areaCode) {
+            this.areaCode = areaCode;
+        }
+
+        public String getAreaName() {
+            return areaName;
+        }
+
+        public void setAreaName(String areaName) {
+            this.areaName = areaName;
+        }
+
+        public String getStatus() {
+            return status;
+        }
+
+        public void setStatus(String status) {
+            this.status = status;
+        }
+
+        public String getLocation() {
+            return location;
+        }
+
+        public void setLocation(String location) {
+            this.location = location;
+        }
+
+        public String getAreaCenter() {
+            return areaCenter;
+        }
+
+        public void setAreaCenter(String areaCenter) {
+            this.areaCenter = areaCenter;
+        }
+
+        public String getAreaPinYin() {
+            return areaPinYin;
+        }
+
+        public void setAreaPinYin(String areaPinYin) {
+            this.areaPinYin = areaPinYin;
+        }
+
+        public String getStatusCode() {
+            return statusCode;
+        }
+
+        public void setStatusCode(String statusCode) {
+            this.statusCode = statusCode;
+        }
+    }
+
+    public CompanyEnum getCompany() {
+        return company;
+    }
+
+    public void setCompany(CompanyEnum company) {
+        this.company = company;
+    }
+
+    public String getCourierNo() {
+        return courierNo;
+    }
+
+    public void setCourierNo(String courierNo) {
+        this.courierNo = courierNo;
+    }
+
+    public List<Logistics> getLogisticsList() {
+        return logisticsList;
+    }
+
+    public void setLogisticsList(List<Logistics> logisticsList) {
+        this.logisticsList = logisticsList;
+    }
+}

+ 61 - 0
cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/courier/enums/CompanyEnum.java

@@ -0,0 +1,61 @@
+package com.yonge.cooleshow.mall.common.courier.enums;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-26
+ */
+public enum CompanyEnum {
+
+    SHUNFENG("shunfeng","顺丰快递"),
+    ZHONGTONG("zhongtong","中通快递"),
+    YUANTONG("yuantong","圆通快递"),
+    HUITONGKUAIDI("huitongkuaidi","汇通"),
+    SHENTONG("shentong","申通"),
+    YUNDA("yunda","韵达快递"),
+    EMS("ems","ems"),
+    JD("jd","京东"),
+    ZHAIJISONG("zhaijisong","宅急送"),
+    DEBANGKUAIDI("debangkuaidi","德邦快递"),
+    ;
+
+
+    // 快递100对应编号
+    private String code;
+
+    // 公司描述
+    private String desc;
+
+    CompanyEnum(String code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public static CompanyEnum codeOf(String s) {
+        for (CompanyEnum value : CompanyEnum.values()) {
+            if (value.getCode().equals(s)) {
+                return value;
+            }
+        }
+        return null;
+    }
+
+
+    public static CompanyEnum descOf(String s) {
+        for (CompanyEnum value : CompanyEnum.values()) {
+            if (value.getDesc().equals(s)) {
+                return value;
+            }
+        }
+        return null;
+    }
+}

+ 7 - 0
cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/courier/package-info.java

@@ -0,0 +1,7 @@
+/**
+ * Description 快递
+ *
+ * @author: feng-ji
+ * @date: 2022-10-26
+ */
+package com.yonge.cooleshow.mall.common.courier;

+ 42 - 0
cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/courier/service/CourierService.java

@@ -0,0 +1,42 @@
+package com.yonge.cooleshow.mall.common.courier.service;
+
+import com.yonge.cooleshow.mall.common.courier.domain.CourierInfo;
+import com.yonge.cooleshow.mall.common.courier.enums.CompanyEnum;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-26
+ */
+public interface CourierService {
+
+
+    /**
+     * 查询快递信息
+     *
+     * @param company 快递公司
+     * @param courierNo 快递编号
+     */
+    CourierInfo queryTrack(CompanyEnum company,String courierNo);
+
+
+    /**
+     * 回调返回数据转 快递信息
+     *
+     * @param body
+     * @return
+     */
+    CourierInfo getCourierInfos(String body);
+
+    /**
+     * 快递信息订阅
+     *
+     * @param company 快递公司编号
+     * @param courierNo 快递单号
+     * @param url 回调地址
+     */
+    boolean subscribe(CompanyEnum company,String courierNo,String url) throws Exception;
+}

+ 150 - 0
cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/courier/service/impl/Courier100ServiceImpl.java

@@ -0,0 +1,150 @@
+package com.yonge.cooleshow.mall.common.courier.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.Gson;
+import com.kuaidi100.sdk.api.QueryTrack;
+import com.kuaidi100.sdk.api.Subscribe;
+import com.kuaidi100.sdk.contant.ApiInfoConstant;
+import com.kuaidi100.sdk.contant.CompanyConstant;
+import com.kuaidi100.sdk.core.IBaseClient;
+import com.kuaidi100.sdk.pojo.HttpResult;
+import com.kuaidi100.sdk.request.QueryTrackParam;
+import com.kuaidi100.sdk.request.QueryTrackReq;
+import com.kuaidi100.sdk.request.SubscribeParam;
+import com.kuaidi100.sdk.request.SubscribeParameters;
+import com.kuaidi100.sdk.request.SubscribeReq;
+import com.kuaidi100.sdk.utils.SignUtils;
+import com.yonge.cooleshow.mall.common.courier.domain.CourierInfo;
+import com.yonge.cooleshow.mall.common.courier.enums.CompanyEnum;
+import com.yonge.cooleshow.mall.common.courier.service.CourierService;
+import com.yonge.toolset.base.exception.BizException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-26
+ */
+@Service("Courier100Service")
+public class Courier100ServiceImpl implements CourierService {
+
+    private static final Logger LOG = LoggerFactory.getLogger(Courier100ServiceImpl.class);
+
+    @Value("${courier.courier100.key:jvpXSAFN9687}")
+    private String key;
+
+    @Value("${courier.courier100.customer:B6E26D57F060E7D9C87032AF7F000046}")
+    private String customer;
+
+
+    @Override
+    public CourierInfo queryTrack(CompanyEnum company, String courierNo) {
+        QueryTrackReq queryTrackReq = new QueryTrackReq();
+        QueryTrackParam queryTrackParam = new QueryTrackParam();
+
+        queryTrackParam.setCom(getCompanyConstant(company));
+        queryTrackParam.setNum(courierNo);
+        queryTrackParam.setResultv2("4");
+        String param = new Gson().toJson(queryTrackParam);
+
+        queryTrackReq.setParam(param);
+        queryTrackReq.setCustomer(customer);
+        queryTrackReq.setSign(SignUtils.querySign(param , key, customer));
+
+        IBaseClient baseClient = new QueryTrack();
+        try {
+            LOG.debug("查询快递参数: {}",queryTrackParam);
+            HttpResult execute = baseClient.execute(queryTrackReq);
+            LOG.info("查询快递信息参数: {}",execute);
+            if (execute.getStatus() != 200) {
+                throw new BizException(execute.getError());
+            }
+            String body = execute.getBody();
+            return getCourierInfos(body);
+        } catch (Exception e) {
+            LOG.error(e.getLocalizedMessage());
+            e.printStackTrace();
+            throw new BizException(e.getMessage());
+        }
+    }
+
+    @Override
+    public CourierInfo getCourierInfos(String body) {
+        JSONObject jsonObject = JSON.parseObject(body);
+        if (!"200".equals(jsonObject.getString("status"))) {
+            throw new BizException(jsonObject.getString("message"));
+        }
+        CourierInfo courierInfo = new CourierInfo();
+        List<CourierInfo.Logistics> data = JSON.parseArray(jsonObject.getString("data"), CourierInfo.Logistics.class);
+
+        courierInfo.setLogisticsList(data);
+        courierInfo.setCourierNo(jsonObject.getString("nu"));
+        courierInfo.setCompany(CompanyEnum.codeOf(jsonObject.getString("com")));
+        return courierInfo;
+    }
+
+    @Override
+    public boolean subscribe(CompanyEnum company, String courierNo, String url) {
+        SubscribeParameters subscribeParameters = new SubscribeParameters();
+        subscribeParameters.setCallbackurl(url);
+        subscribeParameters.setResultv2("4");
+
+        SubscribeParam subscribeParam = new SubscribeParam();
+        subscribeParam.setParameters(subscribeParameters);
+
+        subscribeParam.setCompany(getCompanyConstant(company));
+        subscribeParam.setNumber(courierNo);
+        subscribeParam.setKey(key);
+
+        SubscribeReq subscribeReq = new SubscribeReq();
+        subscribeReq.setSchema(ApiInfoConstant.SUBSCRIBE_SCHEMA);
+        subscribeReq.setParam(new Gson().toJson(subscribeParam));
+
+        IBaseClient subscribe = new Subscribe();
+        try {
+            LOG.debug("快递信息订阅参数: {}",subscribeReq);
+            HttpResult execute = subscribe.execute(subscribeReq);
+            LOG.info("快递信息订阅返回参数: {}",execute);
+            if (execute.getStatus() != 200) {
+                throw new BizException(execute.getError());
+            }
+            JSONObject jsonObject = JSON.parseObject(execute.getBody());
+            if (!"200".equals(jsonObject.getString("returnCode"))) {
+                throw new BizException(jsonObject.getString("message"));
+            }
+            return true;
+        } catch (Exception e) {
+            LOG.error(e.getLocalizedMessage());
+            e.printStackTrace();
+            throw new BizException(e.getMessage());
+        }
+    }
+
+    private String getCompanyConstant(CompanyEnum companyEnum) {
+        switch (companyEnum) {
+            case JD: return CompanyConstant.JD;
+            case EMS: return CompanyConstant.EMS;
+            case YUNDA: return CompanyConstant.YD;
+            case SHENTONG: return CompanyConstant.ST;
+            case SHUNFENG: return CompanyConstant.SF;
+            case YUANTONG: return CompanyConstant.YT;
+            case ZHONGTONG: return CompanyConstant.ZT;
+            case ZHAIJISONG: return CompanyConstant.ZJS;
+            case DEBANGKUAIDI: return CompanyConstant.DB;
+            case HUITONGKUAIDI: return CompanyConstant.HT;
+            default: return null;
+        }
+    }
+
+    public static void main(String[] args) {
+        Courier100ServiceImpl courier100Service = new Courier100ServiceImpl();
+        courier100Service.queryTrack(CompanyEnum.DEBANGKUAIDI,"75606690482924");
+    }
+}

+ 1 - 0
cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/enums/OrderCacheEnum.java

@@ -18,6 +18,7 @@ public enum OrderCacheEnum {
     LOCK_REFUND_ORDER_MALL("商城退款锁"),
     LOCK_ORDER_NO_MALL("订单号锁"),
     LOCK_STOCK_MALL("商品库存锁"),
+    COURIER_LOCK("快递单号锁"),
 
     ;
     /***

+ 37 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/OmsOrderCourierMapper.java

@@ -0,0 +1,37 @@
+package com.yonge.cooleshow.mbg.mapper;
+
+import com.yonge.cooleshow.mbg.model.OmsOrderCourier;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * Description
+ *
+ * @author: feng-ji
+ * @date: 2022-10-28
+ */
+public interface OmsOrderCourierMapper {
+    int deleteByPrimaryKey(Long id);
+
+    int insert(OmsOrderCourier record);
+
+    int insertSelective(OmsOrderCourier record);
+
+    OmsOrderCourier selectByPrimaryKey(Long id);
+
+    int updateByPrimaryKeySelective(OmsOrderCourier record);
+
+    int updateByPrimaryKey(OmsOrderCourier record);
+
+    int batchInsert(@Param("list") List<OmsOrderCourier> list);
+
+    /**
+     * 更新物流信息
+     */
+    void updateByCourierNo(@Param("courierNo") String courierNo, @Param("logistics") String logistics);
+
+    /**
+     * 查询物流信息
+     */
+    OmsOrderCourier queryByCourierNo(@Param("courierNo") String deliverySn);
+}

+ 1 - 1
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsOrder.java

@@ -55,7 +55,7 @@ public class OmsOrder implements Serializable {
     @ApiModelProperty(value = "订单来源:0->PC订单;1->app订单")
     private Integer sourceType;
 
-    @ApiModelProperty(value = "订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单")
+    @ApiModelProperty(value = "订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单 6 ->未拉起支付")
     private Integer status;
 
     @ApiModelProperty(value = "订单类型:0->正常订单;1->秒杀订单")

+ 75 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsOrderCourier.java

@@ -0,0 +1,75 @@
+package com.yonge.cooleshow.mbg.model;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * 快递信息表
+ */
+public class OmsOrderCourier {
+    @ApiModelProperty("")
+    private Long id;
+
+    /**
+    * 快递公司
+    */
+    @ApiModelProperty("快递公司名")
+    private String company;
+
+    /**
+     * 订单号
+     */
+    @ApiModelProperty("订单id")
+    private Long orderId;
+
+    /**
+     * 快递单号
+     */
+    @ApiModelProperty("快递单号")
+    private String courierNo;
+
+    /**
+     * 物流信息
+     */
+    @ApiModelProperty("物流信息 ")
+    private String logistics;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getCompany() {
+        return company;
+    }
+
+    public void setCompany(String company) {
+        this.company = company;
+    }
+
+    public Long getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Long orderId) {
+        this.orderId = orderId;
+    }
+
+    public String getCourierNo() {
+        return courierNo;
+    }
+
+    public void setCourierNo(String courierNo) {
+        this.courierNo = courierNo;
+    }
+
+    public String getLogistics() {
+        return logistics;
+    }
+
+    public void setLogistics(String logistics) {
+        this.logistics = logistics;
+    }
+}

+ 114 - 0
cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/OmsOrderCourierMapper.xml

@@ -0,0 +1,114 @@
+<?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.yonge.cooleshow.mbg.mapper.OmsOrderCourierMapper">
+  <resultMap id="BaseResultMap" type="com.yonge.cooleshow.mbg.model.OmsOrderCourier">
+    <!--@mbg.generated-->
+    <!--@Table oms_order_courier-->
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="company" jdbcType="VARCHAR" property="company" />
+    <result column="order_id" jdbcType="BIGINT" property="orderId" />
+    <result column="courier_no" jdbcType="VARCHAR" property="courierNo" />
+    <result column="logistics" jdbcType="LONGVARCHAR" property="logistics" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--@mbg.generated-->
+    id, company, order_id, courier_no, logistics
+  </sql>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    <!--@mbg.generated-->
+    select 
+    <include refid="Base_Column_List" />
+    from oms_order_courier
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    <!--@mbg.generated-->
+    delete from oms_order_courier
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.yonge.cooleshow.mbg.model.OmsOrderCourier" useGeneratedKeys="true">
+    <!--@mbg.generated-->
+    insert into oms_order_courier (company, order_id, courier_no, 
+      logistics)
+    values (#{company,jdbcType=VARCHAR}, #{orderId,jdbcType=BIGINT}, #{courierNo,jdbcType=VARCHAR}, 
+      #{logistics,jdbcType=LONGVARCHAR})
+  </insert>
+  <insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.yonge.cooleshow.mbg.model.OmsOrderCourier" useGeneratedKeys="true">
+    <!--@mbg.generated-->
+    insert into oms_order_courier
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="company != null">
+        company,
+      </if>
+      <if test="orderId != null">
+        order_id,
+      </if>
+      <if test="courierNo != null">
+        courier_no,
+      </if>
+      <if test="logistics != null">
+        logistics,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="company != null">
+        #{company,jdbcType=VARCHAR},
+      </if>
+      <if test="orderId != null">
+        #{orderId,jdbcType=BIGINT},
+      </if>
+      <if test="courierNo != null">
+        #{courierNo,jdbcType=VARCHAR},
+      </if>
+      <if test="logistics != null">
+        #{logistics,jdbcType=LONGVARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <update id="updateByPrimaryKeySelective" parameterType="com.yonge.cooleshow.mbg.model.OmsOrderCourier">
+    <!--@mbg.generated-->
+    update oms_order_courier
+    <set>
+      <if test="company != null">
+        company = #{company,jdbcType=VARCHAR},
+      </if>
+      <if test="orderId != null">
+        order_id = #{orderId,jdbcType=BIGINT},
+      </if>
+      <if test="courierNo != null">
+        courier_no = #{courierNo,jdbcType=VARCHAR},
+      </if>
+      <if test="logistics != null">
+        logistics = #{logistics,jdbcType=LONGVARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.yonge.cooleshow.mbg.model.OmsOrderCourier">
+    <!--@mbg.generated-->
+    update oms_order_courier
+    set company = #{company,jdbcType=VARCHAR},
+      order_id = #{orderId,jdbcType=BIGINT},
+      courier_no = #{courierNo,jdbcType=VARCHAR},
+      logistics = #{logistics,jdbcType=LONGVARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <insert id="batchInsert" keyColumn="id" keyProperty="id" parameterType="map" useGeneratedKeys="true">
+    <!--@mbg.generated-->
+    insert into oms_order_courier
+    (company, order_id, courier_no, logistics)
+    values
+    <foreach collection="list" item="item" separator=",">
+      (#{item.company,jdbcType=VARCHAR}, #{item.orderId,jdbcType=BIGINT}, #{item.courierNo,jdbcType=VARCHAR}, 
+        #{item.logistics,jdbcType=LONGVARCHAR})
+    </foreach>
+  </insert>
+
+  <update id="updateByCourierNo">
+    update oms_order_courier set logistics = #{logistics} where courier_no = #{courierNo};
+  </update>
+
+  <select id="queryByCourierNo" resultMap="BaseResultMap">
+    select * from oms_order_courier where courier_no = #{courierNo} order by  id desc limit  1
+    </select>
+</mapper>

+ 22 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java

@@ -4,9 +4,11 @@ import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
 import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
 import com.yonge.cooleshow.mbg.model.OmsOrder;
+import com.yonge.cooleshow.mbg.model.OmsOrderCourier;
 import com.yonge.cooleshow.portal.domain.ConfirmOrderResult;
 import com.yonge.cooleshow.portal.domain.OmsOrderDetail;
 import com.yonge.cooleshow.portal.domain.OrderParam;
+import com.yonge.cooleshow.portal.service.OmsOrderCourierService;
 import com.yonge.cooleshow.portal.service.OmsPortalOrderService;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.util.StringUtil;
@@ -37,6 +39,8 @@ public class OmsPortalOrderController {
     private OmsPortalOrderService portalOrderService;
 
 
+    @Autowired
+    private OmsOrderCourierService orderCourierService;
 
     @Value("${message.debugMode}")
     private boolean debugMode;
@@ -214,4 +218,22 @@ public class OmsPortalOrderController {
                                }, 60L, TimeUnit.SECONDS);
         return CommonResult.success(null);
     }
+
+
+    @ApiOperation("用户查询物流")
+    @GetMapping(value = "/selectCourier")
+    @ResponseBody
+    public CommonResult<OmsOrderCourier> selectCourier(@RequestParam String  deliverySn) {
+        OmsOrderCourier omsOrderCourier = orderCourierService.getCourierInfo(deliverySn);
+        return CommonResult.success(omsOrderCourier);
+    }
+
+
+
+    @ApiOperation("用户刷新物流信息")
+    @GetMapping(value = "/refreshCourier")
+    @ResponseBody
+    public CommonResult refreshCourier(@RequestParam String  deliverySn) throws InterruptedException {
+        return CommonResult.success(orderCourierService.refreshCourier(deliverySn));
+    }
 }

+ 39 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/open/OpenShareController.java

@@ -1,12 +1,18 @@
 package com.yonge.cooleshow.portal.controller.open;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
+import com.yonge.cooleshow.mall.common.courier.domain.CourierInfo;
+import com.yonge.cooleshow.mall.common.courier.service.CourierService;
 import com.yonge.cooleshow.portal.dto.ShareProductVo;
 import com.yonge.cooleshow.portal.dto.ShareProfitParam;
+import com.yonge.cooleshow.portal.service.OmsOrderCourierService;
+import com.yonge.cooleshow.portal.service.OmsPortalOrderService;
 import com.yonge.cooleshow.portal.service.PmsPortalProductService;
 import com.yonge.toolset.base.util.StringUtil;
 import io.swagger.annotations.Api;
@@ -14,9 +20,13 @@ import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 @RestController
 @RequestMapping("/open")
@@ -30,6 +40,11 @@ public class OpenShareController extends BaseController {
     @Autowired
     private PmsPortalProductService portalProductService;
 
+    @Autowired
+    private OmsOrderCourierService orderCourierService;
+
+    @Autowired
+    private CourierService courierService;
 
     @ApiOperation(value = "老师商品分享分润")
     @PostMapping(value="/productProfit")
@@ -49,4 +64,28 @@ public class OpenShareController extends BaseController {
         }
         return CommonResult.failed("分享功能暂未开放");
     }
+
+
+
+    @ApiOperation(value = "快递信息回调")
+    @PostMapping(value="/courierCallback", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
+    @ResponseBody
+    public Object courierCallback( String param) {
+        log.info("快递信息回调:{}",param);
+
+        JSONObject jsonObject = JSON.parseObject(param);
+        String data = jsonObject.getString("lastResult");
+        CourierInfo courierInfos = courierService.getCourierInfos(data);
+
+        // 保存快递信息
+        orderCourierService.updateCourierInfo(courierInfos);
+        Map<String,Object> result = new HashMap<>();
+        result.put("result",true);
+        result.put("returnCode","200");
+        result.put("message","成功");
+
+        return result;
+    }
+
+
 }

+ 30 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsOrderCourierService.java

@@ -0,0 +1,30 @@
+package com.yonge.cooleshow.portal.service;
+
+import com.yonge.cooleshow.mall.common.courier.domain.CourierInfo;
+import com.yonge.cooleshow.mbg.model.OmsOrderCourier;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-31
+ */
+public interface OmsOrderCourierService {
+
+
+    @Transactional
+    void updateCourierInfo(CourierInfo courierInfos);
+
+    /**
+     * 查询物流
+     */
+    OmsOrderCourier getCourierInfo(String deliverySn);
+
+    /**
+     * 刷新物流信息
+     * @return
+     */
+    @Transactional
+    OmsOrderCourier refreshCourier(String deliverySn) throws InterruptedException;
+}

+ 68 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsOrderCourierServiceImpl.java

@@ -0,0 +1,68 @@
+package com.yonge.cooleshow.portal.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.mall.common.courier.domain.CourierInfo;
+import com.yonge.cooleshow.mall.common.courier.enums.CompanyEnum;
+import com.yonge.cooleshow.mall.common.courier.service.CourierService;
+import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
+import com.yonge.cooleshow.mbg.mapper.OmsOrderCourierMapper;
+import com.yonge.cooleshow.mbg.model.OmsOrderCourier;
+import com.yonge.cooleshow.portal.service.OmsOrderCourierService;
+import com.yonge.toolset.base.exception.BizException;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-31
+ */
+@Service
+public class OmsOrderCourierServiceImpl implements OmsOrderCourierService {
+
+    @Autowired
+    private OmsOrderCourierMapper omsOrderCourierMapper;
+    @Autowired
+    private CourierService courierService;
+
+    @Autowired
+    private RedissonClient redissonClient;
+
+    @Override
+    public void updateCourierInfo(CourierInfo courierInfos) {
+        String courierNo = courierInfos.getCourierNo();
+        String logistics = JSON.toJSONString(courierInfos.getLogisticsList());
+        omsOrderCourierMapper.updateByCourierNo(courierNo,logistics);
+    }
+
+    @Override
+    public OmsOrderCourier getCourierInfo(String deliverySn) {
+        OmsOrderCourier omsOrderCourier = omsOrderCourierMapper.queryByCourierNo(deliverySn);
+        if (omsOrderCourier == null) {
+            throw new BizException("未找到物流信息");
+        }
+        return omsOrderCourier;
+    }
+
+    @Override
+    public OmsOrderCourier refreshCourier(String deliverySn) throws InterruptedException {
+        RLock lock = redissonClient.getLock(OrderCacheEnum.COURIER_LOCK.getCode() + deliverySn);
+        boolean b = lock.tryLock(0,1, TimeUnit.HOURS);
+
+        OmsOrderCourier omsOrderCourier = omsOrderCourierMapper.queryByCourierNo(deliverySn);
+        if (b) {
+            if (omsOrderCourier == null) {
+                throw new BizException("未找到物流信息");
+            }
+            CourierInfo courierInfo = courierService.queryTrack(CompanyEnum.descOf(omsOrderCourier.getCompany()),
+                                                                omsOrderCourier.getCourierNo());
+            updateCourierInfo(courierInfo);
+        }
+        return omsOrderCourierMapper.queryByCourierNo(deliverySn);
+    }
+}

+ 7 - 5
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -531,8 +531,8 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         // if (!member.getId().equals(order.getMemberId())) {
         //     Asserts.fail("不能确认他人订单!");
         // }
-        if (order.getStatus() != 2) {
-            Asserts.fail("该订单还未发货!");
+        if (order.getStatus() == 0 || order.getStatus() == 6) {
+            Asserts.fail("该订单还未付款!");
         }else if (order.getStatus() == 3) {
             Asserts.fail("已确认收货!");
         }
@@ -1059,16 +1059,18 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         }
 
         // 判断支付金额 是否正确
-        BigDecimal pay_amt;
+        BigDecimal pay_amt = null;
         if (data != null) {
             pay_amt = new BigDecimal(data.getExecutePaymentCallBack().getPayAmt());
 
             orderPayment.setTransNo(data.getId());
         } else {
-            pay_amt = new BigDecimal(payment.getPayAmt());
+            if (payment.getPayAmt() != null) {
+                pay_amt = new BigDecimal(payment.getPayAmt());
+            }
             orderPayment.setTransNo(payment.getId());
         }
-        if (pay_amt.compareTo(detail.getPayAmount()) != 0) {
+        if (pay_amt != null && pay_amt.compareTo(detail.getPayAmount()) != 0) {
             orderPayment.setPayFailMsg("订单金额和实际支付金额不符");
             orderRefund(orderPayment,pay_amt.setScale(2, RoundingMode.HALF_UP).toString(),orderPayment.getTransNo(),detail);
         } else {