Browse Source

定时任务-物流

chao 3 years ago
parent
commit
b5a7453758

+ 27 - 0
pom.xml

@@ -50,6 +50,33 @@
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
         </dependency>
+        <!-- mysql -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>2.1.4</version>
+        </dependency>
+		<dependency>
+			<groupId>org.projectlombok</groupId>
+			<artifactId>lombok</artifactId>
+			<optional>true</optional>
+		</dependency>
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
+            <version>1.2.5</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>mybatis-spring-boot-starter</artifactId>
+                    <groupId>org.mybatis.spring.boot</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
         <!-- 快递100 SDK -->
 	    <dependency>
             <groupId>com.github.kuaidi100-api</groupId>

+ 30 - 0
src/main/java/com/caimei365/tools/mapper/LogisticsMapper.java

@@ -0,0 +1,30 @@
+package com.caimei365.tools.mapper;
+
+import com.caimei365.tools.model.po.LogisticsInfoPo;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/5/31
+ */
+@Mapper
+public interface LogisticsMapper {
+    /**
+     * 未签收物流列表
+     */
+    List<LogisticsInfoPo> getAllUnsignedLogistics();
+
+    /**
+     * 顺丰速运需要提供收/寄件人的电话号码查询
+     */
+    String getLogisticsPhoneByOrderId(Long orderId);
+
+    /**
+     * 更新数据库物流信息
+     */
+    void updateLogistics(LogisticsInfoPo logistics);
+}

+ 29 - 0
src/main/java/com/caimei365/tools/model/po/LogisticsInfoPo.java

@@ -0,0 +1,29 @@
+package com.caimei365.tools.model.po;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/5/31
+ */
+ @Data
+public class LogisticsInfoPo implements Serializable {
+    private Long id;
+    /** 订单ID */
+    private Long orderId;
+    /** 快递单号 */
+    private String nu;
+    /** 快递单当前的状态: 0在途,1揽收,2疑难,3签收,4退签(货物退回发货人并签收),5派件,6退回,7转单,10待清关,11清关中,12已清关,13清关异常,14收件人拒签 */
+    private String state;
+    /** 物流跟踪信息 */
+    private String info;
+    /** 物流公司代码 */
+    private String logisticsCompanyCode;
+    /** 最后更新时间 */
+    private Date updateDate;
+}

+ 21 - 21
src/main/java/com/caimei365/tools/service/impl/LogisticsServiceImpl.java

@@ -43,29 +43,28 @@ public class LogisticsServiceImpl implements LogisticsService {
         if (StringUtils.isEmpty(number)) {
             return ResponseJson.error("参数错误:快递单号不能为空!", null);
         }
-        if (StringUtils.isEmpty(companyCode)) {
-            // 智能获取物流公司代码
-            AutoNumReq autoNumReq = new AutoNumReq();
-            autoNumReq.setKey(LOGISTICS_KEY);
-            autoNumReq.setNum(number);
-            AutoNum baseClient = new AutoNum();
-            try {
-                String firstComByNum = baseClient.getFirstComByNum(autoNumReq);
-                if (StringUtils.isNotEmpty(firstComByNum)) {
-                    // 顺丰需要提供手机号
-                    if ("shunfeng".equals(firstComByNum) && StringUtils.isEmpty(mobile)){
-                        return ResponseJson.error(-2, "顺丰速运需要提供收/寄件人的电话号码查询,请提供后重试", null);
-                    }
-                    // 根据快递单号获取物流信息
-                    return queryLogistics(number, mobile, firstComByNum);
+        // 智能获取物流公司代码
+        AutoNumReq autoNumReq = new AutoNumReq();
+        autoNumReq.setKey(LOGISTICS_KEY);
+        autoNumReq.setNum(number);
+        AutoNum baseClient = new AutoNum();
+        try {
+            String firstComByNum = baseClient.getFirstComByNum(autoNumReq);
+            if (StringUtils.isEmpty(firstComByNum) && StringUtils.isNotEmpty(companyCode)) {
+                firstComByNum = companyCode;
+            }
+            if (StringUtils.isNotEmpty(firstComByNum)) {
+                // 顺丰需要提供手机号
+                if ("shunfeng".equals(firstComByNum) && StringUtils.isEmpty(mobile)){
+                    return ResponseJson.error(-2, "顺丰速运需要提供收/寄件人的电话号码查询,请提供后重试", null);
                 }
-                return ResponseJson.error("未能识别物流公司,请提供物流公司代码后重试!", null);
-            } catch (Exception e) {
-                log.error("智能获取物流公司代码,错误信息:", e);
-                return ResponseJson.error("智能获取物流公司出错,请提供物流公司代码后重试!", null);
+                // 根据快递单号获取物流信息
+                return queryLogistics(number, mobile, firstComByNum);
             }
-        } else {
-            return queryLogistics(number, mobile, companyCode);
+            return ResponseJson.error("未能识别物流公司,请提供正确的物流公司代码后重试!", null);
+        } catch (Exception e) {
+            log.error("智能获取物流公司代码,错误信息:", e);
+            return ResponseJson.error("智能获取物流公司出错,请提供物流公司代码后重试!", null);
         }
     }
 
@@ -96,6 +95,7 @@ public class LogisticsServiceImpl implements LogisticsService {
             HttpResult httpResult = baseClient.execute(queryTrackReq);
             if (httpResult.getStatus() == 200 && StringUtils.isNotBlank(httpResult.getBody())) {
                 QueryTrackResp queryTrackResp = (new Gson()).fromJson(httpResult.getBody(), QueryTrackResp.class);
+                log.info(">> 获取物流信息 >> " + new Gson().toJson(queryTrackResp));
                 return ResponseJson.success(queryTrackResp);
             }
             return ResponseJson.error(httpResult.toString(), null);

+ 83 - 0
src/main/java/com/caimei365/tools/task/LogisticsInfoTask.java

@@ -0,0 +1,83 @@
+package com.caimei365.tools.task;
+
+import com.caimei365.tools.mapper.LogisticsMapper;
+import com.caimei365.tools.model.ResponseJson;
+import com.caimei365.tools.model.po.LogisticsInfoPo;
+import com.caimei365.tools.service.LogisticsService;
+import com.google.gson.Gson;
+import com.kuaidi100.sdk.response.QueryTrackResp;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 物流信息定时查询
+ *
+ * @author : Charles
+ * @date : 2021/5/31
+ */
+@Slf4j
+@Configuration
+@EnableScheduling
+@RequiredArgsConstructor
+public class LogisticsInfoTask {
+
+    private final LogisticsService logisticsService;
+    @Resource
+    private LogisticsMapper logisticsMapper;
+    @Value("${spring.cloud.config.profile}")
+    private String profile;
+
+    /**
+     * 每小时执行一次查询物流信息
+     *
+     * cron表达式语法:秒 分 小时 日 月 周
+     * 年可省略
+     * * 表示所有值。
+     * ? 表示不指定值。
+     */
+    @Scheduled(cron = "0 0 * * * ?")
+    public void getLogistics() {
+        log.info(">> 定时查询物流信息");
+        // 正式环境才去查询物流信息
+        if ("prod".equals(profile)) {
+            // 未签收物流列表
+            List<LogisticsInfoPo> logisticsList = logisticsMapper.getAllUnsignedLogistics();
+            if (!CollectionUtils.isEmpty(logisticsList)) {
+                logisticsList.forEach(logistics -> {
+                    ResponseJson<QueryTrackResp> result = logisticsService.getLogisticsByNumber(logistics.getNu(), logistics.getLogisticsCompanyCode(), "");
+                    if (result.getCode() == -2) {
+                        // 顺丰速运需要提供收/寄件人的电话号码查询
+                        String mobile = logisticsMapper.getLogisticsPhoneByOrderId(logistics.getOrderId());
+                        if (StringUtils.isNotEmpty(mobile)) {
+                            result = logisticsService.getLogisticsByNumber(logistics.getNu(), logistics.getLogisticsCompanyCode(), mobile);
+                        }
+                    }
+                    if (result.getCode() == 0) {
+                        // 查询成功
+                        QueryTrackResp queryTrackResp = result.getData();
+                        String state = queryTrackResp.getState();
+                        String companyCode = queryTrackResp.getCom();
+                        String info = new Gson().toJson(queryTrackResp.getData());
+                        logistics.setState(state);
+                        logistics.setLogisticsCompanyCode(companyCode);
+                        logistics.setInfo(info);
+                        logistics.setUpdateDate(new Date());
+                        // 更新数据库物流信息
+                        logisticsMapper.updateLogistics(logistics);
+                        log.info(">> 物流跟踪信息 >> " + info);
+                    }
+                });
+            }
+        }
+    }
+}

+ 2 - 2
src/main/resources/bootstrap.yml

@@ -10,7 +10,7 @@ spring:
       profile: @activatedProperties@    # 启用配置后缀名称
       label: master                     # 分支名称
       # uri: http://localhost:18001
-      uri: http://47.119.112.46:18001          # 配置中心地址
-      # uri: http://120.79.162.1:18001     # 配置中心地址(正式环境)
+      # uri: http://47.119.112.46:18001          # 配置中心地址
+      uri: http://120.79.162.1:18001     # 配置中心地址(正式环境)
       name: tools                        # 配置文件名称
 

+ 25 - 0
src/main/resources/mapper/LogisticsMapper.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.caimei365.tools.mapper.LogisticsMapper">
+	<select id="getAllUnsignedLogistics" resultType="com.caimei365.tools.model.po.LogisticsInfoPo">
+		SELECT id,
+		       orderId,
+		       nu,
+		       state,
+		       info,
+		       logisticsCompanyCode
+		 FROM logistics_information WHERE (state != 3 AND state != 4) OR state IS NULL
+		ORDER BY id DESC
+    </select>
+	<select id="getLogisticsPhoneByOrderId" resultType="java.lang.String">
+		SELECT phone FROM bp_order_userinfo WHERE orderId=#{orderId} LIMIT 1
+	</select>
+	<update id="updateLogistics" parameterType="com.caimei365.tools.model.po.LogisticsInfoPo">
+		UPDATE logistics_information
+		SET state=#{state},
+			info=#{info},
+			logisticsCompanyCode = #{logisticsCompanyCode},
+			updateDate=#{updateDate}
+		WHERE id=#{id}
+	</update>
+</mapper>