zxfqwert недель назад: 2
Родитель
Сommit
d1b2faafc7
13 измененных файлов с 475 добавлено и 13 удалено
  1. 77 0
      jd-logistics-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfigInfo.java
  2. 47 0
      jd-logistics-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisIdGenerator.java
  3. 4 0
      jd-logistics-common/ruoyi-common-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  4. 7 0
      jd-logistics-modules/jd-logistics-system/pom.xml
  5. 4 5
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/JdLogisticsSystemApplication.java
  6. 99 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/config/SFExpressConfig.java
  7. 13 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/domain/LogisticsOrder.java
  8. 27 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/LogisticsOrderService.java
  9. 13 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/LogisticsService.java
  10. 26 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/factory/LogisticsFactory.java
  11. 14 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/impl/JDLogisticsService.java
  12. 100 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/impl/SFLogisticsService.java
  13. 44 8
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/controller/SysUserController.java

+ 77 - 0
jd-logistics-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfigInfo.java

@@ -0,0 +1,77 @@
+
+package com.ruoyi.common.redis.configure;
+
+import io.lettuce.core.RedisClient;
+import io.lettuce.core.RedisURI;
+import io.lettuce.core.api.StatefulRedisConnection;
+import io.lettuce.core.api.sync.RedisCommands;
+import io.lettuce.core.resource.ClientResources;
+import io.lettuce.core.resource.DefaultClientResources;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PreDestroy;
+import java.time.Duration;
+
+@Configuration
+public class RedisConfigInfo {
+
+    @Value("${spring.redis.host:localhost}")
+    private String redisHost;
+
+    @Value("${spring.redis.port:6379}")
+    private int redisPort;
+
+    @Value("${spring.redis.timeout:2000ms}")
+    private Duration timeout;
+
+    @Value("${spring.redis.password:#{null}}")
+    private String password;
+
+    private RedisClient redisClient;
+    private ClientResources clientResources;
+    private StatefulRedisConnection<String, String> connection;
+
+    @Bean
+    public RedisClient redisClient() {
+        clientResources = DefaultClientResources.builder().build();
+
+        RedisURI.Builder uriBuilder = RedisURI.Builder
+                .redis(redisHost, redisPort)
+                .withTimeout(timeout);
+
+        if (password != null && !password.isEmpty()) {
+            uriBuilder.withPassword(password.toCharArray());
+        }
+
+        RedisURI redisURI = uriBuilder.build();
+        redisClient = RedisClient.create(clientResources, redisURI);
+        return redisClient;
+    }
+
+    @Bean
+    public StatefulRedisConnection<String, String> redisConnection(RedisClient redisClient) {
+        connection = redisClient.connect();
+        return connection;
+    }
+
+    @Bean
+    public RedisCommands<String, String> redisCommands(StatefulRedisConnection<String, String> connection) {
+        return connection.sync();
+    }
+
+    @PreDestroy
+    public void destroy() {
+        if (connection != null) {
+            connection.close();
+        }
+        if (redisClient != null) {
+            redisClient.shutdown();
+        }
+        if (clientResources != null) {
+            clientResources.shutdown();
+        }
+    }
+}
+

+ 47 - 0
jd-logistics-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisIdGenerator.java

@@ -0,0 +1,47 @@
+
+package com.ruoyi.common.redis.service;
+import io.lettuce.core.api.sync.RedisCommands;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+
+@Component
+public class RedisIdGenerator {
+
+    @Autowired
+    private RedisCommands<String, String> redisCommands;
+    private final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
+
+/**
+     * 生成带日期前缀的唯一ID
+     * @param businessType 业务类型
+     * @return 格式为 YYYYMMDD_业务类型_序号 的唯一ID
+     */
+
+    public String generateUniqueId(String businessType) {
+        String dateStr = LocalDate.now().format(dateFormatter);
+        String key = "id_counter:" + businessType + ":" + dateStr;
+        // 使用INCR命令原子性递增
+        long sequence = redisCommands.incr(key);
+        // 设置过期时间(24小时)
+        if (sequence == 1) {
+            redisCommands.expire(key, 86400);
+        }
+        return  businessType + dateStr + String.format("%06d", sequence);
+    }
+
+
+/**
+     * 生成简单递增ID
+     * @param key 计数器键名
+     * @return 递增后的ID值
+     */
+
+    public long generateSimpleId(String key) {
+        return redisCommands.incr(key);
+    }
+}
+

+ 4 - 0
jd-logistics-common/ruoyi-common-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -1,2 +1,6 @@
 com.ruoyi.common.redis.configure.RedisConfig
 com.ruoyi.common.redis.service.RedisService
+com.ruoyi.common.redis.service.RedisIdGenerator
+com.ruoyi.common.redis.configure.RedisConfigInfo
+
+

+ 7 - 0
jd-logistics-modules/jd-logistics-system/pom.xml

@@ -71,6 +71,13 @@
             <artifactId>ruoyi-common-swagger</artifactId>
         </dependency>
 
+
+        <dependency>
+            <groupId>com.sf</groupId>
+            <artifactId>sf-csim</artifactId>
+            <type>jar</type>
+            <version>2.1.7</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 4 - 5
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/JdLogisticsSystemApplication.java

@@ -1,13 +1,12 @@
-package com.ruoyi.system;
+package com.ruoyi;
 
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
 import com.ruoyi.common.security.annotation.EnableCustomConfig;
 import com.ruoyi.common.security.annotation.EnableRyFeignClients;
-
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
 /**
  * 系统模块
- * 
+ *
  * @author lydgt
  */
 @EnableCustomConfig

+ 99 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/config/SFExpressConfig.java

@@ -0,0 +1,99 @@
+package com.ruoyi.logistics.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConfigurationProperties(prefix = "sf.express")
+public class SFExpressConfig {
+
+    /**
+     * 客户编码
+     */
+    private String clientCode;
+
+    /**
+     * 校验码
+     */
+    private String checkWord;
+
+    /**
+     * 月结吗(顺丰月结吗账号)
+     */
+    private String monthlyCord;
+    /**
+     * 沙箱环境API地址
+     */
+    private String sandboxUrl;
+
+    /**
+     * 生产环境API地址
+     */
+    private String productionUrl;
+
+    private Environment environment;
+
+
+
+    // 环境枚举
+    public enum Environment {
+        SANDBOX, PRODUCTION
+    }
+
+    // Getters and Setters
+    public String getClientCode() {
+        return clientCode;
+    }
+
+    public void setClientCode(String clientCode) {
+        this.clientCode = clientCode;
+    }
+
+    public String getCheckWord() {
+        return checkWord;
+    }
+
+    public void setCheckWord(String checkWord) {
+        this.checkWord = checkWord;
+    }
+
+    public String getSandboxUrl() {
+        return sandboxUrl;
+    }
+
+    public void setSandboxUrl(String sandboxUrl) {
+        this.sandboxUrl = sandboxUrl;
+    }
+
+    public String getProductionUrl() {
+        return productionUrl;
+    }
+
+    public void setProductionUrl(String productionUrl) {
+        this.productionUrl = productionUrl;
+    }
+
+    public Environment getEnvironment() {
+        return environment;
+    }
+
+    public void setEnvironment(Environment environment) {
+        this.environment = environment;
+    }
+
+    public void setMonthlyCord(String monthlyCord) {
+        this.monthlyCord = monthlyCord;
+    }
+
+    public String getMonthlyCord() {
+        return monthlyCord;
+    }
+
+    /**
+     * 获取当前环境的API地址
+     */
+    public String getCurrentApiUrl() {
+        return environment == Environment.SANDBOX ? sandboxUrl : productionUrl;
+    }
+}
+

+ 13 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/domain/LogisticsOrder.java

@@ -0,0 +1,13 @@
+package com.ruoyi.logistics.domain;
+
+
+import com.ruoyi.common.core.web.domain.BaseEntity;
+import lombok.Data;
+
+@Data
+public class LogisticsOrder extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    //物流订单类型
+    private String orderType;
+}

+ 27 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/LogisticsOrderService.java

@@ -0,0 +1,27 @@
+package com.ruoyi.logistics.service;
+
+import com.ruoyi.logistics.domain.LogisticsOrder;
+import com.ruoyi.logistics.service.factory.LogisticsFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.UnsupportedEncodingException;
+
+@Service
+public class LogisticsOrderService {
+    @Autowired
+    private LogisticsFactory logisticsFactory;
+
+    public String createOrder(LogisticsOrder logisticsOrder) throws UnsupportedEncodingException {
+        // 根据订单中的物流公司类型获取对应服务
+        LogisticsService logisticsService = logisticsFactory.getLogisticsService(logisticsOrder.getOrderType());
+        String trackingNumber = logisticsService.createOrder(logisticsOrder);
+
+        // 保存订单... logisticsOrder.save();
+        return trackingNumber;
+    }
+
+
+
+}
+

+ 13 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/LogisticsService.java

@@ -0,0 +1,13 @@
+package com.ruoyi.logistics.service;
+
+import com.ruoyi.logistics.domain.LogisticsOrder;
+
+import java.io.UnsupportedEncodingException;
+
+public interface LogisticsService {
+
+    //创建物流订单
+    String createOrder(LogisticsOrder logisticsOrder) throws UnsupportedEncodingException;
+    //取消物流订单
+
+}

+ 26 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/factory/LogisticsFactory.java

@@ -0,0 +1,26 @@
+package com.ruoyi.logistics.service.factory;
+
+import com.ruoyi.logistics.service.LogisticsService;
+import com.ruoyi.logistics.service.impl.JDLogisticsService;
+import com.ruoyi.logistics.service.impl.SFLogisticsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class LogisticsFactory {
+    @Autowired
+    private SFLogisticsService sfLogisticsService;
+    @Autowired
+    private JDLogisticsService jdLogisticsService;
+
+    public LogisticsService getLogisticsService(String companyCode) {
+        switch (companyCode) {
+            case "SF":
+                return sfLogisticsService;
+            case "JD":
+                return jdLogisticsService;
+            default:
+                throw new IllegalArgumentException("不支持的物流公司");
+        }
+    }
+}

+ 14 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/impl/JDLogisticsService.java

@@ -0,0 +1,14 @@
+package com.ruoyi.logistics.service.impl;
+
+import com.ruoyi.logistics.domain.LogisticsOrder;
+import com.ruoyi.logistics.service.LogisticsService;
+import org.springframework.stereotype.Service;
+
+
+@Service
+public class JDLogisticsService  implements LogisticsService {
+    @Override
+    public String createOrder(LogisticsOrder logisticsOrder) {
+        return null;
+    }
+}

+ 100 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/impl/SFLogisticsService.java

@@ -0,0 +1,100 @@
+package com.ruoyi.logistics.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.ruoyi.common.redis.service.RedisIdGenerator;
+import com.ruoyi.logistics.config.SFExpressConfig;
+import com.ruoyi.logistics.domain.LogisticsOrder;
+import com.ruoyi.logistics.service.LogisticsService;
+import com.sf.csim.express.service.CallExpressServiceTools;
+import com.sf.csim.express.service.HttpClientUtil;
+import com.sf.csim.express.service.IServiceCodeStandard;
+import com.sf.csim.express.service.code.ExpressServiceCodeEnum;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.UnsupportedEncodingException;
+import java.util.*;
+
+@Service
+public class SFLogisticsService implements LogisticsService {
+
+    @Autowired
+    private SFExpressConfig sfExpressConfig;
+    @Autowired
+    private RedisIdGenerator redisIdGenerator;
+    @Override
+    public String createOrder(LogisticsOrder logisticsOrder) throws UnsupportedEncodingException {
+        IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_CREATE_ORDER; //下订单
+
+        CallExpressServiceTools tools=CallExpressServiceTools.getInstance();
+        Map<String, String> params = new HashMap<String, String>();
+        String timeStamp = String.valueOf(System.currentTimeMillis());
+        Map<String,Object> orderData= new HashMap<>();
+        orderData.put("language","zh_CN");
+        orderData.put("orderId",redisIdGenerator.generateUniqueId("RJSD"));//客户订单号,重复使用订单号时返回第一次下单成功时的运单信息
+        orderData.put("monthlyCard","7551234567");//月结账户
+        orderData.put("parcelQty",3);
+        //商品信息
+        List<Map<String,Object>> cargoDetails = new ArrayList<>();
+        Map cargo=new HashMap<>();
+        cargo.put("name","笔记本");
+        cargo.put("count",1);
+        cargo.put("unit","个");
+        cargo.put("weight",1.012);
+        cargo.put("amount",4999.189);
+        cargoDetails.add(cargo);
+        orderData.put("cargoDetails",cargoDetails);
+        //增值服务信息 serviceList":[{"name":"INSURE","value":"500"}]
+        List<Map<String,Object>> serviceList = new ArrayList<>();
+        Map service=new HashMap<>();
+        service.put("name","INSURE");
+        service.put("value","500");
+        serviceList.add(service);
+        orderData.put("serviceList",serviceList);
+        //收寄双方信息
+        List<Map<String,Object>> contactInfoList = new ArrayList<>();
+        Map contactInfo1=new HashMap<>();
+        contactInfo1.put("address","河南省洛阳市洛龙区科技园街道和风雅叙");
+        contactInfo1.put("contact","张三");
+        contactInfo1.put("contactType",1);
+        contactInfo1.put("country","CN");
+        contactInfo1.put("postCode","580058");
+        contactInfo1.put("tel","15639072145");
+        contactInfoList.add(contactInfo1);
+        Map contactInfo=new HashMap<>();
+        contactInfo.put("address","河南省郑州市惠济区美景麟起城");
+        contactInfo.put("company","神州");
+        contactInfo.put("contact","小乔");
+        contactInfo.put("contactType",2);
+        contactInfo.put("country","CN");
+        contactInfo.put("tel","15539739074");
+        contactInfoList.add(contactInfo1);
+        contactInfoList.add(contactInfo);
+        orderData.put("contactInfoList",contactInfoList);
+
+        String msgData =tools.packageMsgData(standardService);
+        msgData= JSON.toJSONString(orderData);
+        params.put("partnerID", sfExpressConfig.getClientCode());  // 顾客编码 ,对应丰桥上获取的clientCode
+        params.put("requestID", UUID.randomUUID().toString().replace("-", ""));
+        params.put("serviceCode",standardService.getCode());// 接口服务码
+        params.put("timestamp", timeStamp);
+        params.put("msgData", msgData);
+        params.put("msgDigest", tools.getMsgDigest(msgData,timeStamp,sfExpressConfig.getCheckWord()));
+
+        // System.out.println(params.get("requestID"));
+        long startTime = System.currentTimeMillis();
+
+
+
+        //  System.out.println("====调用请求:" + params.get("msgData"));
+        System.out.println("====调用实际请求:" + params);
+        String result = HttpClientUtil.post(sfExpressConfig.getCurrentApiUrl(), params);
+
+        System.out.println("====调用丰桥的接口服务代码:" + String.valueOf(standardService.getCode()) + " 接口耗时:"+ String.valueOf(System.currentTimeMillis()-startTime)+"====");
+        System.out.println("===调用地址 ==="+sfExpressConfig.getCurrentApiUrl());
+        System.out.println("===顾客编码 ==="+sfExpressConfig.getClientCode());
+        System.out.println("===返回结果:" +result);
+
+        return result;
+    }
+}

+ 44 - 8
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/controller/SysUserController.java

@@ -1,22 +1,26 @@
 package com.ruoyi.system.controller;
 
 import java.io.IOException;
+import java.io.UnsupportedEncodingException;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.common.core.utils.SpringUtils;
+import com.ruoyi.common.redis.service.RedisIdGenerator;
+import com.ruoyi.common.redis.service.RedisService;
+import com.ruoyi.logistics.domain.LogisticsOrder;
+import com.ruoyi.logistics.service.LogisticsOrderService;
 import org.apache.commons.lang3.ArrayUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.text.Convert;
@@ -377,4 +381,36 @@ public class SysUserController extends BaseController
     {
         return success(deptService.selectDeptTreeList(dept));
     }
+
+
+    private static final Logger log = LoggerFactory.getLogger(SysUserController.class);
+
+
+        @Autowired
+        private RedisIdGenerator redisIdGenerator;
+         @Autowired
+         private LogisticsOrderService logisticsOrderService;
+    @PostMapping("/test")
+    public AjaxResult test(@RequestBody JSONObject json) throws UnsupportedEncodingException {
+
+        LogisticsOrder logisticsOrder= new LogisticsOrder();
+        logisticsOrder.setOrderType("SF");
+
+        System.out.println(logisticsOrderService.createOrder(logisticsOrder));
+       // String userId = redisIdGenerator.generateUniqueId("RJSD");
+        //String userI = SpringUtils.getBean(RedisIdGenerator.class).generateUniqueId("RJSD");
+
+       // System.out.println("生成订单ID: " + userId);
+       // log.info("生成订单ID: " + userId);
+        log.info("物流状态回调接口----状态"+json.get("orderState").toString());
+        return AjaxResult.success(json);
+    }
+
+
+    @PostMapping("/test1")
+    public AjaxResult test( @RequestParam Map<String,Object> content)
+    {
+        log.info("物流收费单据回调接口----"+content.get("content"));
+        return AjaxResult.success(content.get("content"));
+    }
 }