瀏覽代碼

Merge remote-tracking branch 'origin/master'

颜琼丽 1 周之前
父節點
當前提交
5efd2c4bdf
共有 31 個文件被更改,包括 853 次插入386 次删除
  1. 25 0
      jd-logistics-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfig.java
  2. 65 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/front/controller/Kd100Controller.java
  3. 85 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/front/service/impl/Kuaidi100Service.java
  4. 2 36
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/callback/SfFeePushCallback.java
  5. 11 2
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/callback/SfPushOrderStatusCallback.java
  6. 128 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/callback/SfRoutingPushCallback.java
  7. 31 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/config/KD100ExpressConfig.java
  8. 1 1
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/controller/BizAddressBookController.java
  9. 13 13
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/controller/BizBannerController.java
  10. 8 1
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/controller/BizWaybillOrderController.java
  11. 10 10
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/domain/BizBanner.java
  12. 20 7
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/domain/BizWaybillOrder.java
  13. 15 15
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/mapper/BizBannerMapper.java
  14. 2 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/mapper/BizWaybillOrderMapper.java
  15. 16 16
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/IBizBannerService.java
  16. 5 1
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/IBizWaybillOrderService.java
  17. 2 1
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/LogisticsOrderService.java
  18. 2 1
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/LogisticsService.java
  19. 21 16
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/impl/BizBannerServiceImpl.java
  20. 5 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/impl/BizFinancialFeeItemsServiceImpl.java
  21. 26 3
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/impl/BizWaybillOrderServiceImpl.java
  22. 24 17
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/impl/FeePushService.java
  23. 44 19
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/impl/JDLogisticsService.java
  24. 47 13
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/impl/SFLogisticsService.java
  25. 2 1
      jd-logistics-modules/jd-logistics-system/src/main/resources/mapper/logistics/BizAddressBookMapper.xml
  26. 17 17
      jd-logistics-modules/jd-logistics-system/src/main/resources/mapper/logistics/BizBannerMapper.xml
  27. 1 0
      jd-logistics-modules/jd-logistics-system/src/main/resources/mapper/logistics/BizFinancialFeeItemsMapper.xml
  28. 52 1
      jd-logistics-modules/jd-logistics-system/src/main/resources/mapper/logistics/BizWaybillOrderMapper.xml
  29. 5 5
      jd-logistics-ui-v3/src/api/logistics/banner.js
  30. 151 178
      jd-logistics-ui-v3/src/views/logistics/banner/index.vue
  31. 17 12
      jd-logistics-ui-v3/src/views/logistics/inancialFee/index.vue

+ 25 - 0
jd-logistics-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfig.java

@@ -1,5 +1,8 @@
 package com.ruoyi.common.redis.configure;
 
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.MapperFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import org.springframework.boot.autoconfigure.AutoConfigureBefore;
 import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
 import org.springframework.cache.annotation.CachingConfigurerSupport;
@@ -8,6 +11,7 @@ import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.data.redis.connection.RedisConnectionFactory;
 import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
 import org.springframework.data.redis.serializer.StringRedisSerializer;
 
 /**
@@ -39,5 +43,26 @@ public class RedisConfig extends CachingConfigurerSupport
 
         template.afterPropertiesSet();
         return template;
+
+
+
+        /*// 配置 ObjectMapper 禁用类型信息
+        ObjectMapper objectMapper = new ObjectMapper();
+        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        objectMapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false);
+        objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
+        objectMapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);
+        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+
+        // 禁用类型信息输出
+        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+
+        GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(objectMapper);
+
+        template.setKeySerializer(new StringRedisSerializer());
+        template.setValueSerializer(serializer);
+        template.setHashKeySerializer(new StringRedisSerializer());
+        template.setHashValueSerializer(serializer);
+        template.afterPropertiesSet();*/
     }
 }

+ 65 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/front/controller/Kd100Controller.java

@@ -0,0 +1,65 @@
+package com.ruoyi.front.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.front.service.impl.Kuaidi100Service;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+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;
+
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+
+/**
+ * 快递100调用查询接口
+ *
+ * @author RuiJing
+ * @date 2026-01-29
+ */
+@RestController
+@RequestMapping("/kd100/wxmini")
+public class Kd100Controller {
+    private static final Logger logger = LoggerFactory.getLogger(Kd100Controller.class);
+
+   @Autowired
+   Kuaidi100Service kuaidi100Service;
+   @Autowired
+   RedisTemplate redisTemplate;
+
+    @PostMapping("/queryExpres")
+    public AjaxResult queryExpres(@RequestBody Map param)  {
+        try {
+            logger.info("调用快递100查询实时快递接口  运单号: {}", param.get("number"));
+            Object  redisResult= redisTemplate.opsForValue().get(param.get("number"));
+            if(redisResult==null){
+                String   result = kuaidi100Service.queryExpress(param);
+                ObjectMapper objectMapper = new ObjectMapper();
+                Map<String, Object> map = objectMapper.readValue(result, Map.class);
+                if("ok".equals(map.get("message"))){
+                    redisTemplate.opsForValue().set(param.get("number"), map, 30, TimeUnit.MINUTES);;
+                    return AjaxResult.success(map);
+                }
+                else{
+                   return  AjaxResult.error(map.get("message").toString());
+                }
+            }
+
+            return AjaxResult.success(redisResult);
+        } catch (Exception e) {
+            return AjaxResult.error("快递100查寻接口异常! 原因:{}" ,e.getMessage());
+        }
+
+
+    }
+
+
+}

+ 85 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/front/service/impl/Kuaidi100Service.java

@@ -0,0 +1,85 @@
+package com.ruoyi.front.service.impl;
+
+
+import com.alibaba.fastjson2.JSONObject;
+import com.ruoyi.logistics.config.KD100ExpressConfig;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.util.Map;
+
+
+@Service
+public class Kuaidi100Service {
+    @Autowired
+     KD100ExpressConfig kd100ExpressConfig;
+    /**
+     * 查询快递信息
+     * @return API原始返回的JSON字符串
+     */
+    public String  queryExpress(Map map) throws Exception {
+        // 1. 构建查询参数
+        String param = "{\"com\":\"" + map.get("company") + "\",\"num\":\"" + map.get("number") + "\"}";
+        // 2. 生成签名
+        String sign = md5(param + kd100ExpressConfig.getAppKey() + kd100ExpressConfig.getCustomer()).toUpperCase();
+        // 3. 构建请求体
+        String postData = "customer=" + URLEncoder.encode(kd100ExpressConfig.getCustomer(), "UTF-8")
+                + "&sign=" + URLEncoder.encode(sign, "UTF-8")
+                + "&param=" + URLEncoder.encode(param, "UTF-8");
+
+        // 4. 发送HTTP POST请求
+        URL url = new URL(kd100ExpressConfig.getQueryUrl());
+        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+        conn.setRequestMethod("POST");
+        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
+        conn.setDoOutput(true);
+        conn.setDoInput(true);
+        conn.setConnectTimeout(5000);
+        conn.setReadTimeout(10000);
+
+        // 5. 写入请求数据
+        try (OutputStream os = conn.getOutputStream()) {
+            os.write(postData.getBytes(StandardCharsets.UTF_8));
+            os.flush();
+        }
+
+        // 6. 读取响应结果
+        int responseCode = conn.getResponseCode();
+        StringBuilder response = new StringBuilder();
+
+        if (responseCode == HttpURLConnection.HTTP_OK) {
+            BufferedReader in = new BufferedReader(
+                    new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));
+            String inputLine;
+            while ((inputLine = in.readLine()) != null) {
+                response.append(inputLine);
+            }
+            in.close();
+        } else {
+            throw new RuntimeException("HTTP请求失败,状态码: " + responseCode);
+        }
+        conn.disconnect();
+        return response.toString();
+    }
+
+    /**
+     * MD5加密工具方法
+     */
+    private static String md5(String str) throws Exception {
+        MessageDigest md = MessageDigest.getInstance("MD5");
+        byte[] digest = md.digest(str.getBytes(StandardCharsets.UTF_8));
+        StringBuilder sb = new StringBuilder();
+        for (byte b : digest) {
+            sb.append(String.format("%02x", b));
+        }
+        return sb.toString();
+    }
+}

+ 2 - 36
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/callback/SfFeePushCallback.java

@@ -13,18 +13,13 @@ import org.springframework.web.bind.annotation.PostMapping;
 
 /**
  * 顺丰物流费用清单回调
- * 目前涉及的回调有:
- * 1.订单状态回调
- * 2.费用清单回调
- *
  * @author zxf
  * @date 2026-02-03
  */
 @RestController
-@RequestMapping("/feecallback")
+@RequestMapping("/callback")
 public class SfFeePushCallback {
     private static final Logger logger = LoggerFactory.getLogger(SfFeePushCallback.class);
-
     private final ObjectMapper objectMapper;
     private final FeePushService feePushService;
 
@@ -44,19 +39,10 @@ public class SfFeePushCallback {
     public ResponseEntity<SfFeeApiResponse> receiveFeePush(
             @RequestParam("sign") String sign,
             @RequestParam("content") String content) {
-
-        logger.info("收到顺丰运费清单推送,sign: {}", sign);
-
+        logger.info("收到顺丰运费清单推送,content: {}", content);
         try {
-          /*  // 1. 验证签名(根据顺丰文档实现)
-            if (!verifySignature(sign, content)) {
-                logger.error("签名验证失败");
-                return ResponseEntity.ok(SfFeeApiResponse.error("签名验证失败"));
-            }*/
-
             // 2. 解析JSON数据
             SfFeePushRequest feePushRequest = objectMapper.readValue(content, SfFeePushRequest.class);
-
             // 3. 参数验证
             if (feePushRequest.getWaybillNo() == null || feePushRequest.getWaybillNo().isEmpty()) {
                 return ResponseEntity.ok(SfFeeApiResponse.error("运单号不能为空"));
@@ -64,10 +50,8 @@ public class SfFeePushCallback {
             if (feePushRequest.getOrderNo() == null || feePushRequest.getOrderNo().isEmpty()) {
                 return ResponseEntity.ok(SfFeeApiResponse.error("订单号不能为空"));
             }
-
             // 4. 处理业务逻辑
             boolean success = feePushService.processFeePush(feePushRequest);
-
             if (success) {
                 logger.info("运费清单处理成功,运单号: {}, 订单号: {}",
                         feePushRequest.getWaybillNo(), feePushRequest.getOrderNo());
@@ -86,22 +70,4 @@ public class SfFeePushCallback {
         }
     }
 
-    /**
-     * 验证签名
-     * 根据顺丰文档实现签名验证逻辑
-     */
-    /*private boolean verifySignature(String sign, String content) {
-        // 实际实现应根据顺丰提供的签名算法
-        // 通常使用checkword对content进行加密,然后与sign比较
-        // 这里简化处理,实际应按照文档实现
-        try {
-            // 示例:使用MD5或SHA256等算法
-             String calculatedSign = calculateSign(content, yourCheckword);
-             return calculatedSign.equals(sign);
-
-        } catch (Exception e) {
-            logger.error("签名验证异常: {}", e.getMessage());
-            return false;
-        }
-    }*/
 }

+ 11 - 2
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/callback/SfPushOrderStatusCallback.java

@@ -1,10 +1,13 @@
 package com.ruoyi.logistics.callback;
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.ruoyi.logistics.domain.BizWaybillOrder;
 import com.ruoyi.logistics.domain.OrderStateDetail;
 import com.ruoyi.logistics.domain.SfApiResponse;
 import com.ruoyi.logistics.domain.SfPushOrderStateRequest;
+import com.ruoyi.logistics.service.IBizWaybillOrderService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+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;
@@ -28,6 +31,9 @@ public class SfPushOrderStatusCallback {
     private static final Logger logger = LoggerFactory.getLogger(SfPushOrderStatusCallback.class);
 
 
+    @Autowired
+    private IBizWaybillOrderService bizWaybillOrderService;
+
     /**
      * 顺丰物流订单状态回调
      * 说明:仅限于推送上门订单调度状态  非预约订单不推送
@@ -35,7 +41,7 @@ public class SfPushOrderStatusCallback {
      * @author zxf
      * @date 2026-02-03
      */
-    @PostMapping("/orderStatus")
+    @PostMapping("/orderStatus11")
     public SfApiResponse orderStatus(@RequestBody SfPushOrderStateRequest pushRequest) throws UnsupportedEncodingException, JsonProcessingException {
         logger.info("收到顺丰订单状态推送,requestId: {}", pushRequest.getRequestId());
 
@@ -80,7 +86,10 @@ public class SfPushOrderStatusCallback {
         // 根据顺丰返回的状态吗进行系统状态变更  目前还没对
         switch (state.getOrderStateCode()) {
             case "04":
-
+                BizWaybillOrder bizWaybillOrder= new BizWaybillOrder();
+                bizWaybillOrder.setExternalWaybillNo(state.getOrderNo());
+                bizWaybillOrder.setOrderStatus(1);
+                bizWaybillOrderService.updateBizWaybillOrder(bizWaybillOrder);
                 break;
             case "04-40001":
 

+ 128 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/callback/SfRoutingPushCallback.java

@@ -0,0 +1,128 @@
+package com.ruoyi.logistics.callback;
+
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ruoyi.logistics.domain.BizWaybillOrder;
+import com.ruoyi.logistics.service.IBizWaybillOrderService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+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;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 顺丰物流订单路由状态回调相关
+ *
+ * @author zxf
+ * @date 2026-02-03
+ */
+@RestController
+@RequestMapping("/callback")
+public class SfRoutingPushCallback {
+    private static final Logger logger = LoggerFactory.getLogger(SfRoutingPushCallback.class);
+
+    private static final ObjectMapper objectMapper = new ObjectMapper();
+    @Autowired
+    private IBizWaybillOrderService bizWaybillOrderService;
+    /**
+     * 接收JSON格式的路由推送数据
+     * 请求方法为"json"时使用此接口
+     */
+    @PostMapping("/orderStatus")
+    public Map<String, String> receiveRoutePushJson(@RequestBody Map<String, Object> requestBody) {
+        logger.info("收到顺丰物流路由推送,requestBody: {}", requestBody);
+        Map result = new HashMap<>();
+        try {
+            // 解析请求体
+            Map<String, Object> body = (Map<String, Object>) requestBody.get("Body");
+            if (body != null && body.containsKey("WaybillRoute")) {
+                List<Map<String, Object>> waybillRoutes = (List<Map<String, Object>>) body.get("WaybillRoute");
+                // 检查批次大小(顺丰限制最多10个WaybillRoute元素)
+                if (waybillRoutes.size() > 10) {
+                    result.put("return_code", "1000");
+                    result.put("return_msg", "路由信息批次大小不能超过10条");
+                    return result;
+                }
+
+                // 处理路由信息
+                for (Map<String, Object> route : waybillRoutes) {
+                    processRouteInfo(route);
+                }
+                // 返回成功响应(JSON格式)
+                result.put("return_code", "0000");
+                result.put("return_msg", "成功");
+                return result;
+            }
+            // 返回失败响应
+            result.put("return_code", "1000");
+            result.put("return_msg", "请求数据格式错误:缺少Body或WaybillRoute字段");
+            return result;
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.put("return_code", "0000");
+            result.put("return_msg", "系统异常:" + e.getMessage());
+            return result;
+
+        }
+    }
+
+    /**
+     * 处理路由信息
+     */
+    private void processRouteInfo(Map<String, Object> route) {
+        logger.info("开始处理顺丰路由信息 - 客户运单号: {}, 客户订单号: {}, 状态码: {}, 备注: {}, 收货时间: {}",
+                route.get("mailno"),
+                route.get("orderid"),
+                route.get("opCode"),
+                route.get("remark"),
+                route.get("acceptTime"));
+        // 提取路由信息
+        String mailno = (String) route.get("mailno");          // 客户运单号
+        String orderid = (String) route.get("orderid");       // 客户订单号
+        String acceptTime = (String) route.get("acceptTime"); // 收货时间
+        String remark = (String) route.get("remark");         // 备注
+        String opCode = (String) route.get("opCode");         // 操作码
+        // TODO:
+        BizWaybillOrder bizWaybillOrder= new BizWaybillOrder();
+        switch (opCode) {
+            case "50": // 已收取快件
+                bizWaybillOrder.setOrderStatus(2);
+                bizWaybillOrder.setExternalWaybillNo(mailno);
+                //揽收时间
+                bizWaybillOrder.setPickupTime(new Date());
+                bizWaybillOrderService.updateBizWaybillOrderState( bizWaybillOrder);
+                break;
+            case "30": // 到达中转场
+                bizWaybillOrder.setOrderStatus(3);
+                bizWaybillOrder.setExternalWaybillNo(mailno);
+                bizWaybillOrderService.updateBizWaybillOrderState( bizWaybillOrder);
+                break;
+            case "44": // 派送中
+                bizWaybillOrder.setOrderStatus(5);
+                bizWaybillOrder.setExternalWaybillNo(mailno);
+                bizWaybillOrder.setDeliveryTime(new Date());
+                bizWaybillOrderService.updateBizWaybillOrderState( bizWaybillOrder);
+                break;
+            case "80": // 已签收
+                bizWaybillOrder.setOrderStatus(6);
+                bizWaybillOrder.setExternalWaybillNo(mailno);
+                bizWaybillOrder.setSignTime(new Date());
+                bizWaybillOrderService.updateBizWaybillOrderState( bizWaybillOrder);
+                break;
+            default:
+                logger.info("收到未定义的状态码: {}", opCode);
+        }
+
+
+    }
+
+
+}

+ 31 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/config/KD100ExpressConfig.java

@@ -0,0 +1,31 @@
+package com.ruoyi.logistics.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "kd100.express")
+public class KD100ExpressConfig {
+    /**
+     * 应用编码
+     */
+    private String appKey;
+
+    /**
+     * 应用密钥
+     */
+    private String appSecret;
+
+    /**
+     * 客户编码
+     */
+    private String customer;
+
+    /**
+     * 实时查询地址
+     */
+    private String queryUrl;
+
+}

+ 1 - 1
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/controller/BizAddressBookController.java

@@ -23,7 +23,7 @@ import com.ruoyi.common.core.utils.poi.ExcelUtil;
 import com.ruoyi.common.core.web.page.TableDataInfo;
 
 /**
- * 地址簿管理Controller
+ * PC-地址簿管理
  * 
  * @author RuiJing
  * @date 2026-01-29

+ 13 - 13
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/controller/BizBannerController.java

@@ -23,10 +23,10 @@ import com.ruoyi.common.core.utils.poi.ExcelUtil;
 import com.ruoyi.common.core.web.page.TableDataInfo;
 
 /**
- * 系统轮播图Controller
+ * 轮播图Controller
  * 
  * @author RuiJing
- * @date 2026-01-29
+ * @date 2026-02-05
  */
 @RestController
 @RequestMapping("/banner")
@@ -36,7 +36,7 @@ public class BizBannerController extends BaseController
     private IBizBannerService bizBannerService;
 
     /**
-     * 查询系统轮播图列表
+     * 查询轮播图列表
      */
     @RequiresPermissions("system:banner:list")
     @GetMapping("/list")
@@ -48,20 +48,20 @@ public class BizBannerController extends BaseController
     }
 
     /**
-     * 导出系统轮播图列表
+     * 导出轮播图列表
      */
     @RequiresPermissions("system:banner:export")
-    @Log(title = "系统轮播图", businessType = BusinessType.EXPORT)
+    @Log(title = "轮播图", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response, BizBanner bizBanner)
     {
         List<BizBanner> list = bizBannerService.selectBizBannerList(bizBanner);
         ExcelUtil<BizBanner> util = new ExcelUtil<BizBanner>(BizBanner.class);
-        util.exportExcel(response, list, "系统轮播图数据");
+        util.exportExcel(response, list, "轮播图数据");
     }
 
     /**
-     * 获取系统轮播图详细信息
+     * 获取轮播图详细信息
      */
     @RequiresPermissions("system:banner:query")
     @GetMapping(value = "/{bannerId}")
@@ -71,10 +71,10 @@ public class BizBannerController extends BaseController
     }
 
     /**
-     * 新增系统轮播图
+     * 新增轮播图
      */
     @RequiresPermissions("system:banner:add")
-    @Log(title = "系统轮播图", businessType = BusinessType.INSERT)
+    @Log(title = "轮播图", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody BizBanner bizBanner)
     {
@@ -82,10 +82,10 @@ public class BizBannerController extends BaseController
     }
 
     /**
-     * 修改系统轮播图
+     * 修改轮播图
      */
     @RequiresPermissions("system:banner:edit")
-    @Log(title = "系统轮播图", businessType = BusinessType.UPDATE)
+    @Log(title = "轮播图", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@RequestBody BizBanner bizBanner)
     {
@@ -93,10 +93,10 @@ public class BizBannerController extends BaseController
     }
 
     /**
-     * 删除系统轮播图
+     * 删除轮播图
      */
     @RequiresPermissions("system:banner:remove")
-    @Log(title = "系统轮播图", businessType = BusinessType.DELETE)
+    @Log(title = "轮播图", businessType = BusinessType.DELETE)
 	@DeleteMapping("/{bannerIds}")
     public AjaxResult remove(@PathVariable Long[] bannerIds)
     {

+ 8 - 1
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/controller/BizWaybillOrderController.java

@@ -27,7 +27,7 @@ import com.ruoyi.common.core.utils.poi.ExcelUtil;
 import com.ruoyi.common.core.web.page.TableDataInfo;
 
 /**
- * 运单管理Controller
+ * PC-运单管理
  * 
  * @author RuiJing
  * @date 2026-01-29
@@ -93,6 +93,13 @@ public class BizWaybillOrderController extends BaseController
 
     }
 
+
+
+
+
+
+
+
     /**
      * 修改运单管理
      */

+ 10 - 10
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/domain/BizBanner.java

@@ -6,10 +6,10 @@ import com.ruoyi.common.core.annotation.Excel;
 import com.ruoyi.common.core.web.domain.BaseEntity;
 
 /**
- * 系统轮播图对象 biz_banner
+ * 轮播图对象 biz_banner
  * 
  * @author RuiJing
- * @date 2026-01-29
+ * @date 2026-02-05
  */
 public class BizBanner extends BaseEntity
 {
@@ -22,24 +22,24 @@ public class BizBanner extends BaseEntity
     @Excel(name = "轮播图名称")
     private String bannerName;
 
-    /** 图片存储路径 */
-    @Excel(name = "图片存储路径")
+    /** 图片路径 */
+    @Excel(name = "图片路径")
     private String imageUrl;
 
-    /** 点击图片时跳转链接 */
-    @Excel(name = "点击图片时跳转链接")
+    /** 跳转链接 */
+    @Excel(name = "跳转链接")
     private String linkUrl;
 
     /** 排序值 */
     @Excel(name = "排序值")
     private Long sortOrder;
 
-    /** 是否激活显示 0表示不显示,1表示显示 */
-    @Excel(name = "是否激活显示 0表示不显示,1表示显示")
+    /** 状态(0显示1隐藏) */
+    @Excel(name = "状态", readConverterExp = "0=显示1隐藏")
     private String isActive;
 
-    /** 系统类型 0管理端 1小程序 */
-    @Excel(name = "系统类型 0管理端 1小程序")
+    /** 系统类型(0PC管理、1小程序) */
+    @Excel(name = "系统类型", readConverterExp = "0=PC管理、1小程序")
     private String sysType;
 
     /** 删除标志(0代表存在 2代表删除) */

+ 20 - 7
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/domain/BizWaybillOrder.java

@@ -105,23 +105,28 @@ public class BizWaybillOrder extends BaseEntity
     @Excel(name = "取件类型")
     private Integer pickupType;
 
-    /** 上门取件时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "上门取件时间", width = 30, dateFormat = "yyyy-MM-dd")
+    /** 上门取件开始时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "上门取件开始时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date sendStartTime;
 
+    /** 上门取件结束时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "上门取件结束时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date sendEndTime;
+
     /** 揽收时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "揽收时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date pickupTime;
 
     /** 派送时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "派送时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date deliveryTime;
 
     /** 签收时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "签收时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date signTime;
 
@@ -389,7 +394,15 @@ public class BizWaybillOrder extends BaseEntity
         return sendStartTime;
     }
 
-    public void setPickupTime(Date pickupTime) 
+    public Date getSendEndTime() {
+        return sendEndTime;
+    }
+
+    public void setSendEndTime(Date sendEndTime) {
+        this.sendEndTime = sendEndTime;
+    }
+
+    public void setPickupTime(Date pickupTime)
     {
         this.pickupTime = pickupTime;
     }

+ 15 - 15
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/mapper/BizBannerMapper.java

@@ -4,55 +4,55 @@ import java.util.List;
 import com.ruoyi.logistics.domain.BizBanner;
 
 /**
- * 系统轮播图Mapper接口
+ * 轮播图Mapper接口
  * 
  * @author RuiJing
- * @date 2026-01-29
+ * @date 2026-02-05
  */
 public interface BizBannerMapper 
 {
     /**
-     * 查询系统轮播图
+     * 查询轮播图
      * 
-     * @param bannerId 系统轮播图主键
-     * @return 系统轮播图
+     * @param bannerId 轮播图主键
+     * @return 轮播图
      */
     public BizBanner selectBizBannerByBannerId(Long bannerId);
 
     /**
-     * 查询系统轮播图列表
+     * 查询轮播图列表
      * 
-     * @param bizBanner 系统轮播图
-     * @return 系统轮播图集合
+     * @param bizBanner 轮播图
+     * @return 轮播图集合
      */
     public List<BizBanner> selectBizBannerList(BizBanner bizBanner);
 
     /**
-     * 新增系统轮播图
+     * 新增轮播图
      * 
-     * @param bizBanner 系统轮播图
+     * @param bizBanner 轮播图
      * @return 结果
      */
     public int insertBizBanner(BizBanner bizBanner);
 
     /**
-     * 修改系统轮播图
+     * 修改轮播图
      * 
-     * @param bizBanner 系统轮播图
+     * @param bizBanner 轮播图
      * @return 结果
      */
     public int updateBizBanner(BizBanner bizBanner);
 
     /**
-     * 删除系统轮播图
+     * 删除轮播图
      * 
-     * @param bannerId 系统轮播图主键
+     * @param bannerId 轮播图主键
      * @return 结果
      */
     public int deleteBizBannerByBannerId(Long bannerId);
 
     /**
-     * 批量删除系统轮播图
+     * 批量删除轮播图
      * 
      * @param bannerIds 需要删除的数据主键集合
      * @return 结果

+ 2 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/mapper/BizWaybillOrderMapper.java

@@ -65,4 +65,6 @@ public interface BizWaybillOrderMapper
      * @return
      */
     public BizWaybillOrder selectBizWaybillOrderByQuery(BizWaybillOrder query);
+
+    void updateBizWaybillOrderState(BizWaybillOrder bizWaybillOrder);
 }

+ 16 - 16
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/IBizBannerService.java

@@ -4,57 +4,57 @@ import java.util.List;
 import com.ruoyi.logistics.domain.BizBanner;
 
 /**
- * 系统轮播图Service接口
+ * 轮播图Service接口
  * 
  * @author RuiJing
- * @date 2026-01-29
+ * @date 2026-02-05
  */
 public interface IBizBannerService 
 {
     /**
-     * 查询系统轮播图
+     * 查询轮播图
      * 
-     * @param bannerId 系统轮播图主键
-     * @return 系统轮播图
+     * @param bannerId 轮播图主键
+     * @return 轮播图
      */
     public BizBanner selectBizBannerByBannerId(Long bannerId);
 
     /**
-     * 查询系统轮播图列表
+     * 查询轮播图列表
      * 
-     * @param bizBanner 系统轮播图
-     * @return 系统轮播图集合
+     * @param bizBanner 轮播图
+     * @return 轮播图集合
      */
     public List<BizBanner> selectBizBannerList(BizBanner bizBanner);
 
     /**
-     * 新增系统轮播图
+     * 新增轮播图
      * 
-     * @param bizBanner 系统轮播图
+     * @param bizBanner 轮播图
      * @return 结果
      */
     public int insertBizBanner(BizBanner bizBanner);
 
     /**
-     * 修改系统轮播图
+     * 修改轮播图
      * 
-     * @param bizBanner 系统轮播图
+     * @param bizBanner 轮播图
      * @return 结果
      */
     public int updateBizBanner(BizBanner bizBanner);
 
     /**
-     * 批量删除系统轮播图
+     * 批量删除轮播图
      * 
-     * @param bannerIds 需要删除的系统轮播图主键集合
+     * @param bannerIds 需要删除的轮播图主键集合
      * @return 结果
      */
     public int deleteBizBannerByBannerIds(Long[] bannerIds);
 
     /**
-     * 删除系统轮播图信息
+     * 删除轮播图信息
      * 
-     * @param bannerId 系统轮播图主键
+     * @param bannerId 轮播图主键
      * @return 结果
      */
     public int deleteBizBannerByBannerId(Long bannerId);

+ 5 - 1
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/IBizWaybillOrderService.java

@@ -2,6 +2,8 @@ package com.ruoyi.logistics.service;
 
 import java.io.UnsupportedEncodingException;
 import java.util.List;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.ruoyi.logistics.domain.BizWaybillOrder;
 
 /**
@@ -34,7 +36,7 @@ public interface IBizWaybillOrderService
      * @param bizWaybillOrder 运单管理
      * @return 结果
      */
-    public int insertBizWaybillOrder(BizWaybillOrder bizWaybillOrder) throws UnsupportedEncodingException;
+    public int insertBizWaybillOrder(BizWaybillOrder bizWaybillOrder) throws UnsupportedEncodingException, JsonProcessingException;
 
     /**
      * 修改运单管理
@@ -66,4 +68,6 @@ public interface IBizWaybillOrderService
      * @return
      */
     public BizWaybillOrder selectBizWaybillOrderByQuery(BizWaybillOrder query);
+
+    void updateBizWaybillOrderState(BizWaybillOrder bizWaybillOrder);
 }

+ 2 - 1
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/LogisticsOrderService.java

@@ -1,6 +1,7 @@
 package com.ruoyi.logistics.service;
 
 import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.ruoyi.common.core.web.domain.AjaxResult;
 import com.ruoyi.logistics.domain.BizWaybillOrder;
 import com.ruoyi.logistics.domain.LogisticsOrder;
@@ -24,7 +25,7 @@ public class LogisticsOrderService {
     }
 
 
-    public JSONObject createOrder(BizWaybillOrder bizWaybillOrder) throws UnsupportedEncodingException {
+    public JSONObject createOrder(BizWaybillOrder bizWaybillOrder) throws UnsupportedEncodingException, JsonProcessingException {
         // 根据订单中的物流公司类型获取对应服务
         LogisticsService logisticsService = logisticsFactory.getLogisticsService(bizWaybillOrder.getOrderType()==1?"JD":"SF");
         JSONObject  createOrder= logisticsService.createOrder(bizWaybillOrder);

+ 2 - 1
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/LogisticsService.java

@@ -1,5 +1,6 @@
 package com.ruoyi.logistics.service;
 import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.ruoyi.logistics.domain.BizWaybillOrder;
 /**
  * 物流相关接口定义
@@ -23,7 +24,7 @@ public interface LogisticsService {
      * @author RuiJing
      * @date 2026-02-02
      */
-    JSONObject createOrder(BizWaybillOrder bizWaybillOrder) ;
+    JSONObject createOrder(BizWaybillOrder bizWaybillOrder) throws JsonProcessingException;
 
     /**
      * 取消物流订单

+ 21 - 16
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/impl/BizBannerServiceImpl.java

@@ -2,6 +2,7 @@ package com.ruoyi.logistics.service.impl;
 
 import java.util.List;
 import com.ruoyi.common.core.utils.DateUtils;
+import com.ruoyi.common.security.utils.SecurityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.ruoyi.logistics.mapper.BizBannerMapper;
@@ -9,10 +10,10 @@ import com.ruoyi.logistics.domain.BizBanner;
 import com.ruoyi.logistics.service.IBizBannerService;
 
 /**
- * 系统轮播图Service业务层处理
+ * 轮播图Service业务层处理
  * 
  * @author RuiJing
- * @date 2026-01-29
+ * @date 2026-02-05
  */
 @Service
 public class BizBannerServiceImpl implements IBizBannerService 
@@ -21,10 +22,10 @@ public class BizBannerServiceImpl implements IBizBannerService
     private BizBannerMapper bizBannerMapper;
 
     /**
-     * 查询系统轮播图
+     * 查询轮播图
      * 
-     * @param bannerId 系统轮播图主键
-     * @return 系统轮播图
+     * @param bannerId 轮播图主键
+     * @return 轮播图
      */
     @Override
     public BizBanner selectBizBannerByBannerId(Long bannerId)
@@ -33,10 +34,10 @@ public class BizBannerServiceImpl implements IBizBannerService
     }
 
     /**
-     * 查询系统轮播图列表
+     * 查询轮播图列表
      * 
-     * @param bizBanner 系统轮播图
-     * @return 系统轮播图
+     * @param bizBanner 轮播图
+     * @return 轮播图
      */
     @Override
     public List<BizBanner> selectBizBannerList(BizBanner bizBanner)
@@ -45,35 +46,39 @@ public class BizBannerServiceImpl implements IBizBannerService
     }
 
     /**
-     * 新增系统轮播图
+     * 新增轮播图
      * 
-     * @param bizBanner 系统轮播图
+     * @param bizBanner 轮播图
      * @return 结果
      */
     @Override
     public int insertBizBanner(BizBanner bizBanner)
     {
         bizBanner.setCreateTime(DateUtils.getNowDate());
+        bizBanner.setCreateBy(SecurityUtils.getLoginUser().getSysUser().getNickName());
+        bizBanner.setUserId(SecurityUtils.getUserId());
+        bizBanner.setDeptId(SecurityUtils.getLoginUser().getSysUser().getDeptId());
         return bizBannerMapper.insertBizBanner(bizBanner);
     }
 
     /**
-     * 修改系统轮播图
+     * 修改轮播图
      * 
-     * @param bizBanner 系统轮播图
+     * @param bizBanner 轮播图
      * @return 结果
      */
     @Override
     public int updateBizBanner(BizBanner bizBanner)
     {
         bizBanner.setUpdateTime(DateUtils.getNowDate());
+        bizBanner.setUpdateBy(SecurityUtils.getLoginUser().getSysUser().getNickName());
         return bizBannerMapper.updateBizBanner(bizBanner);
     }
 
     /**
-     * 批量删除系统轮播图
+     * 批量删除轮播图
      * 
-     * @param bannerIds 需要删除的系统轮播图主键
+     * @param bannerIds 需要删除的轮播图主键
      * @return 结果
      */
     @Override
@@ -83,9 +88,9 @@ public class BizBannerServiceImpl implements IBizBannerService
     }
 
     /**
-     * 删除系统轮播图信息
+     * 删除轮播图信息
      * 
-     * @param bannerId 系统轮播图主键
+     * @param bannerId 轮播图主键
      * @return 结果
      */
     @Override

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

@@ -2,6 +2,7 @@ package com.ruoyi.logistics.service.impl;
 
 import java.util.List;
 import com.ruoyi.common.core.utils.DateUtils;
+import com.ruoyi.common.security.utils.SecurityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.ruoyi.logistics.mapper.BizFinancialFeeItemsMapper;
@@ -55,6 +56,9 @@ public class BizFinancialFeeItemsServiceImpl implements IBizFinancialFeeItemsSer
     public int insertBizFinancialFeeItems(BizFinancialFeeItems bizFinancialFeeItems)
     {
         bizFinancialFeeItems.setCreateTime(DateUtils.getNowDate());
+        bizFinancialFeeItems.setCreateBy(SecurityUtils.getLoginUser().getSysUser().getNickName());
+        bizFinancialFeeItems.setUserId(SecurityUtils.getUserId());
+        bizFinancialFeeItems.setDeptId(SecurityUtils.getLoginUser().getSysUser().getDeptId());
         int result = bizFinancialFeeItemsMapper.insertBizFinancialFeeItems(bizFinancialFeeItems);
         return result;
     }
@@ -69,6 +73,7 @@ public class BizFinancialFeeItemsServiceImpl implements IBizFinancialFeeItemsSer
     public int updateBizFinancialFeeItems(BizFinancialFeeItems bizFinancialFeeItems)
     {
         bizFinancialFeeItems.setUpdateTime(DateUtils.getNowDate());
+        bizFinancialFeeItems.setUpdateBy(SecurityUtils.getLoginUser().getSysUser().getNickName());
         int result = bizFinancialFeeItemsMapper.updateBizFinancialFeeItems(bizFinancialFeeItems);
         return result;
     }

+ 26 - 3
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/impl/BizWaybillOrderServiceImpl.java

@@ -3,12 +3,15 @@ package com.ruoyi.logistics.service.impl;
 import java.io.UnsupportedEncodingException;
 import java.util.List;
 
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.ruoyi.common.core.exception.ServiceException;
 import com.ruoyi.common.core.utils.DateUtils;
 import com.ruoyi.common.datascope.annotation.DataScope;
 import com.ruoyi.common.redis.service.RedisIdGenerator;
 import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.logistics.enums.OrderStatusEnum;
 import com.ruoyi.logistics.service.LogisticsOrderService;
 import com.ruoyi.system.api.model.LoginUser;
 import org.checkerframework.checker.units.qual.A;
@@ -67,20 +70,34 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
      * @return 结果
      */
     @Override
-    public int insertBizWaybillOrder(BizWaybillOrder bizWaybillOrder) throws UnsupportedEncodingException {
+    public int insertBizWaybillOrder(BizWaybillOrder bizWaybillOrder) throws UnsupportedEncodingException, JsonProcessingException {
 
         LoginUser loginUser = SecurityUtils.getLoginUser();
         String orderId = redisIdGenerator.generateUniqueId("RJSD");
         bizWaybillOrder.setWaybillNo(orderId);
+        bizWaybillOrder.setOrderStatus(OrderStatusEnum.ORDER_STATUS_1.getCode());
         //前置校验
         JSONObject jsonObject= logisticsOrderService.precheckOrder(bizWaybillOrder);
         if(!jsonObject.getBooleanValue("success")){
             throw new ServiceException("下单前置校验未通过! 原因:"+jsonObject.getString("msg"));
-          }
+        }
         JSONObject orderObject= logisticsOrderService.createOrder(bizWaybillOrder);
         if(!orderObject.getBooleanValue("success")){
             throw new ServiceException("下单失败! 原因:"+orderObject.getString("msg"));
         }
+        if("1".equals(bizWaybillOrder.getOrderType())){
+            bizWaybillOrder.setExternalWaybillNo(orderObject.getString("data"));
+        }
+        //顺丰物流返回的运单号
+        JSONArray waybillNoArray=orderObject.getJSONArray("data");
+        for (int i = 0; i < waybillNoArray.size(); i++) {
+            JSONObject waybillNoJSONObject = waybillNoArray.getJSONObject(i);
+            int waybillType = waybillNoJSONObject.getIntValue("waybillType");
+            String  waybillNo = waybillNoJSONObject.getString("waybillNo");
+            if(waybillType==1){
+                bizWaybillOrder.setExternalWaybillNo(waybillNo) ;
+            }
+        }
         bizWaybillOrder.setCreateTime(DateUtils.getNowDate());
         bizWaybillOrder.setUserId(loginUser.getUserid());
         bizWaybillOrder.setDeptId(loginUser.getSysUser().getDeptId());
@@ -128,6 +145,12 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
 
     @Override
     public BizWaybillOrder selectBizWaybillOrderByQuery(BizWaybillOrder query) {
-        return null;
+        return bizWaybillOrderMapper.selectBizWaybillOrderByQuery(query);
+    }
+
+    @Override
+    public void updateBizWaybillOrderState(BizWaybillOrder bizWaybillOrder) {
+         bizWaybillOrderMapper.updateBizWaybillOrderState(bizWaybillOrder);
+
     }
 }

+ 24 - 17
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/impl/FeePushService.java

@@ -22,15 +22,14 @@ import java.util.List;
 
 @Service
 public class FeePushService {
+    private static final Logger logger = LoggerFactory.getLogger(FeePushService.class);
 
     @Autowired
     private IBizWaybillOrderService bizWaybillOrderService;
     @Autowired
     private IBizFinancialFeeItemsService BizFinancialFeeItemsService;
-
     @Autowired
     private IBizWaybillCostDetailsService bizWaybillCostDetailsService;
-    private static final Logger logger = LoggerFactory.getLogger(FeePushService.class);
 
     public boolean processFeePush(SfFeePushRequest request) {
         try {
@@ -40,9 +39,8 @@ public class FeePushService {
             Integer quantity = request.getQuantity();
             String productName = request.getProductName();
             List<SfFeeInfo> feeList = request.getFeeList();
-            logger.info("开始处理运费清单 - 运单号: {}, 订单号: {}, 产品: {}, 计费重量: {}kg",
+            logger.info("开始处理顺丰运费清单 - 运单号: {}, 订单号: {}, 产品: {}, 计费重量: {}kg",
                     waybillNo, orderNo, productName, totalWeight);
-
             // 1. 根据订单号查询本地订单 如果不存在该订单号  则不进行明细的入库
             BizWaybillOrder bizWaybillOrder= new BizWaybillOrder();
             bizWaybillOrder.setWaybillNo(orderNo);
@@ -52,32 +50,38 @@ public class FeePushService {
                 logger.error("订单不存在: {}", orderNo);
                 return false;
             }
-            //存在的话 就去拿到这个部门id 要知道这个供应商的费率
+            /**
+             * 存在的话 就去拿到这个部门id 要知道这个供应商的费率
+             * 还要拿到订单创建Id  数据权限可能到个人
+             */
             Long deptId=orderList.get(0).getDeptId();
-            //先写死
+            Long userId=orderList.get(0).getUserId();
+            Long waybillId=orderList.get(0).getWaybillId();
+            // TODO:先写死  这里差一个查询供应商费率的查询
             String  Rate="1.5";
-
-
-
-            // 2. 目前订单主表不涉及费用总计啥的  先不管
-
-
-            // 3. 处理费用明细
+            /*处理费用明细*/
             if (feeList != null && !feeList.isEmpty()) {
                 for (SfFeeInfo fee : feeList) {
                     BigDecimal feeAmt = fee.getFeeAmt();
-                    //回调回来的 费用类型  还需与系统 费用类型表-biz_inancial_fee_items
+                    /**
+                     * 回调回来的 费用类型  还需与系统 费用类型表-biz_inancial_fee_items
+                     *
+                     */
                     String feeTypeCode = fee.getFeeTypeCode();
                     BizFinancialFeeItems bizFinancialFeeItems = new BizFinancialFeeItems();
                     bizFinancialFeeItems.setFeeItemCategory("sf");
                     bizFinancialFeeItems.setExtFeeCode(feeTypeCode);
                     List<BizFinancialFeeItems> feeItemsList=BizFinancialFeeItemsService.selectBizFinancialFeeItemsList(bizFinancialFeeItems);
                     BizWaybillCostDetails bizWaybillCostDetails= new BizWaybillCostDetails();
-                    //顺丰的费用类型代码无法在费用类型表中匹配 这里默认给值 给到外部叫什么名字
+                    /**
+                     * 回顺丰的费用类型代码无法在费用类型表中匹配时
+                     * 匹配到---给到对应名称
+                     * 匹配不到 --- 还叫顺丰的自己的费用名称和编码
+                     */
                     bizWaybillCostDetails.setFeeName(feeItemsList.get(0).getExtFeeName());
                     if(StringUtils.isBlank(feeItemsList.get(0).getFeeItemCode())){
-                        bizWaybillCostDetails.setFeeItemCode("00");
-                        bizWaybillCostDetails.setFeeItemName("瑞鲸-其他");
+                        bizWaybillCostDetails.setFeeItemCode(feeItemsList.get(0).getExtFeeCode());
+                        bizWaybillCostDetails.setFeeItemName(feeItemsList.get(0).getExtFeeName());
                     }
                     else{
                         bizWaybillCostDetails.setFeeItemCode(feeItemsList.get(0).getFeeItemCode());
@@ -88,6 +92,9 @@ public class FeePushService {
                     BigDecimal result = feeAmt.multiply(deptRate);
                     bizWaybillCostDetails.setRateAmount(result);
                     bizWaybillCostDetails.setDeptId(deptId);
+                    bizWaybillCostDetails.setUserId(userId);
+                    bizWaybillCostDetails.setWaybillId(waybillId);
+                    bizWaybillCostDetails.setExternalWaybillNo(waybillNo);
                     // 记录费用明细
                     bizWaybillCostDetailsService.insertBizWaybillCostDetails(bizWaybillCostDetails);
                 }

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

@@ -71,9 +71,12 @@ public class JDLogisticsService  implements LogisticsService {
             receiverContact.setMobile(bizWaybillOrder.getReceiverPhone());
             receiverContact.setFullAddress(bizWaybillOrder.getReceiverProvince() + bizWaybillOrder.getReceiverCity() + bizWaybillOrder.getReceiverCounty() + bizWaybillOrder.getReceiverAddress());
 
+            //订单信息
             CommonCreateOrderRequest requestDTO = new  CommonCreateOrderRequest();
-            requestDTO.setOrderOrigin(1);
+            requestDTO.setOrderOrigin(getOrderOrigin(bizWaybillOrder.getProductCode()));
             requestDTO.setCustomerCode(sysConfigService.selectConfigByKey(SysConfigConstants.JD_LOGISTICS_CUSTOMERCODE));
+            requestDTO.setPickupStartTime(bizWaybillOrder.getSendStartTime().getTime());
+            requestDTO.setPickupEndTime(bizWaybillOrder.getSendEndTime().getTime());
 
             CommonProductInfo productInfo = new CommonProductInfo();
             productInfo.setProductCode(bizWaybillOrder.getProductCode());
@@ -88,13 +91,18 @@ public class JDLogisticsService  implements LogisticsService {
             LopPlugin lopPlugin = OAuth2PluginFactory.produceLopPlugin(jdExpressConfig.getAppKey(), jdExpressConfig.getAppSecret(), jdExpressConfig.getAccessToken());
             request.addLopPlugin(lopPlugin);
 
-            log.info("京东开放平台订单预校验接口,请求参数:{}", request);
+            log.info("京东开放平台订单预校验接口,请求参数:{}", JSON.toJSONString(request));
             EcapV1OrdersPrecheckLopResponse response = client.execute(request);
-            log.info("京东开放平台订单预校验接口,响应结果:{}", response);
+            log.info("京东开放平台订单预校验接口,响应结果:{}", JSON.toJSONString(response));
 
             if (response.getCode().equals("0")) {
-                result.put("success", true);
-                result.put("msg", "");
+                if (response.getResult().getCode() == 0) {
+                    result.put("success", true);
+                    result.put("msg", "");
+                } else {
+                    result.put("success", false);
+                    result.put("msg", "京东开放平台订单预校验!失败原因:" + response.getResult().getMsg());
+                }
             } else {
                 result.put("success", false);
                 result.put("msg", "京东开放平台订单预校验!失败原因:" + response.getMsg());
@@ -132,8 +140,8 @@ public class JDLogisticsService  implements LogisticsService {
             requestDTO.setOrderOrigin(getOrderOrigin(bizWaybillOrder.getProductCode()));
             requestDTO.setCustomerCode(sysConfigService.selectConfigByKey(SysConfigConstants.JD_LOGISTICS_CUSTOMERCODE));
             requestDTO.setSettleType(3);
-            requestDTO.setPickupStartTime(bizWaybillOrder.getPickupTime().getTime());
-            requestDTO.setPickupEndTime(DateUtils.addHours(bizWaybillOrder.getPickupTime(), 1).getTime());
+            requestDTO.setPickupStartTime(bizWaybillOrder.getSendStartTime().getTime());
+            requestDTO.setPickupEndTime(bizWaybillOrder.getSendEndTime().getTime());
             requestDTO.setPickupType(1);
 
             //产品信息
@@ -162,13 +170,20 @@ public class JDLogisticsService  implements LogisticsService {
             LopPlugin lopPlugin = OAuth2PluginFactory.produceLopPlugin(jdExpressConfig.getAppKey(), jdExpressConfig.getAppSecret(), jdExpressConfig.getAccessToken());
             request.addLopPlugin(lopPlugin);
 
-            log.info("京东开放平台下单接口,请求参数:{}", request);
+            log.info("京东开放平台下单接口,请求参数:{}", JSON.toJSONString(request));
             EcapV1OrdersCreateLopResponse response = client.execute(request);
-            log.info("京东开放平台下单接口,响应结果:{}", response);
+            log.info("京东开放平台下单接口,响应结果:{}", JSON.toJSONString(response));
 
             if (response.getCode().equals("0")) {
-                result.put("success", true);
-                result.put("msg", "");
+                if (response.getResult().getCode() == 0) {
+                    result.put("success", true);
+                    // 返回京东物流单号
+                    result.put("data", response.getResult().getData().getWaybillCode());
+                    result.put("msg", "");
+                } else {
+                    result.put("success", false);
+                    result.put("msg", "京东开放平台下单!失败原因:" + response.getResult().getMsg());
+                }
             } else {
                 result.put("success", false);
                 result.put("msg", "京东开放平台下单!失败原因:" + response.getMsg());
@@ -209,13 +224,18 @@ public class JDLogisticsService  implements LogisticsService {
             LopPlugin lopPlugin = OAuth2PluginFactory.produceLopPlugin(jdExpressConfig.getAppKey(), jdExpressConfig.getAppSecret(), jdExpressConfig.getAccessToken());
             request.addLopPlugin(lopPlugin);
 
-            log.info("京东开放平台取消订单接口,请求参数:{}", request);
+            log.info("京东开放平台取消订单接口,请求参数:{}", JSON.toJSONString(request));
             EcapV1OrdersCancelLopResponse response = client.execute(request);
-            log.info("京东开放平台取消订单接口,响应结果:{}", response);
+            log.info("京东开放平台取消订单接口,响应结果:{}", JSON.toJSONString(response));
 
             if (response.getCode().equals("0")) {
-                result.put("success", true);
-                result.put("msg", "");
+                if (response.getResult().getCode() == 0) {
+                    result.put("success", true);
+                    result.put("msg", "");
+                } else {
+                    result.put("success", false);
+                    result.put("msg", "京东开放平台取消订单!失败原因:" + response.getResult().getMsg());
+                }
             } else {
                 result.put("success", false);
                 result.put("msg", "京东开放平台取消订单!失败原因:" + response.getMsg());
@@ -286,13 +306,18 @@ public class JDLogisticsService  implements LogisticsService {
             LopPlugin lopPlugin = OAuth2PluginFactory.produceLopPlugin(jdExpressConfig.getAppKey(), jdExpressConfig.getAppSecret(), jdExpressConfig.getAccessToken());
             request.addLopPlugin(lopPlugin);
 
-            log.info("京东开放平台修改订单接口,请求参数:{}", request);
+            log.info("京东开放平台修改订单接口,请求参数:{}", JSON.toJSONString(request));
             EcapV1OrdersModifyLopResponse response = client.execute(request);
-            log.info("京东开放平台修改订单接口,响应结果:{}", response);
+            log.info("京东开放平台修改订单接口,响应结果:{}", JSON.toJSONString(response));
 
             if (response.getCode().equals("0")) {
-                result.put("success", true);
-                result.put("msg", "");
+                if (response.getResult().getCode() == 0) {
+                    result.put("success", true);
+                    result.put("msg", "");
+                } else {
+                    result.put("success", false);
+                    result.put("msg", "京东开放平台修改订单!失败原因:" + response.getResult().getMsg());
+                }
             } else {
                 result.put("success", false);
                 result.put("msg", "京东开放平台修改订单!失败原因:" + response.getMsg());

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

@@ -2,6 +2,9 @@ package com.ruoyi.logistics.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.type.TypeFactory;
 import com.ruoyi.common.core.web.domain.AjaxResult;
 import com.ruoyi.common.redis.service.RedisIdGenerator;
 import com.ruoyi.logistics.config.SFExpressConfig;
@@ -59,9 +62,9 @@ public class SFLogisticsService implements LogisticsService {
         1 顺丰特快
         2 顺丰标快
         6 顺丰即日*/
-        msgData.put("expressTypeId", 1);
+        msgData.put("expressTypeId", bizWaybillOrder.getProductCode());
         //包裹数  未定义  非必填
-        msgData.put("parcelQty", 1);
+        msgData.put("parcelQty", bizWaybillOrder.getGoodsQty());
         //收寄方地址参数
         List<Map<String, Object>> contactInfoList = new ArrayList<>();
         Map<String, Object> Consignor = new HashMap<>();
@@ -103,7 +106,7 @@ public class SFLogisticsService implements LogisticsService {
      * @date 2026-02-02
      */
     @Override
-    public JSONObject createOrder(BizWaybillOrder bizWaybillOrder) {
+    public JSONObject createOrder(BizWaybillOrder bizWaybillOrder) throws JsonProcessingException {
         IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_CREATE_ORDER; //下订单
         CallExpressServiceTools tools=CallExpressServiceTools.getInstance();
         Map<String, String> params = new HashMap<String, String>();
@@ -113,8 +116,10 @@ public class SFLogisticsService implements LogisticsService {
         //预下单 已返回订单id
         orderData.put("orderId",bizWaybillOrder.getWaybillNo());
         orderData.put("monthlyCard",sfExpressConfig.getMonthlyCord());//月结账户
-        //包裹数目前字段没有
-        orderData.put("parcelQty",1);
+        //包裹数
+        orderData.put("parcelQty",bizWaybillOrder.getGoodsQty());
+        //产品类别
+        orderData.put("expressTypeId",bizWaybillOrder.getProductCode());
         //商品信息
         List<Map<String,Object>> cargoDetails = new ArrayList<>();
         Map cargo=new HashMap<>();
@@ -123,13 +128,8 @@ public class SFLogisticsService implements LogisticsService {
         cargo.put("weight",bizWaybillOrder.getGoodsWeight());
         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);
+        //将增值服务字符串转换完增值服务参数
+        List<Map<String,Object>> serviceList=getAddedProducts(bizWaybillOrder.getAddedService());
         orderData.put("serviceList",serviceList);
         //收寄双方信息
         List<Map<String,Object>> contactInfoList = new ArrayList<>();
@@ -163,7 +163,8 @@ public class SFLogisticsService implements LogisticsService {
             JSONObject jsonObject = JSON.parseObject(result).getJSONObject("apiResultData");
             JSONObject resultInfo = new JSONObject();
             if (jsonObject != null && jsonObject.containsKey("success") && jsonObject.getBooleanValue("success")) {
-                resultInfo.put("success", true);
+                resultInfo.put("success", true);  //.getJSONObject("waybillNoInfoList")
+                resultInfo.put("data", jsonObject.getJSONObject("msgData").getJSONArray("waybillNoInfoList"));
                 resultInfo.put("msg", "下单成功!");
                 return resultInfo;
             } else {
@@ -179,6 +180,39 @@ public class SFLogisticsService implements LogisticsService {
 
     }
 
+    private List<Map<String, Object>> getAddedProducts(String addedService) throws JsonProcessingException {
+        List<Map<String, Object>> serviceList = new ArrayList<>();
+        ObjectMapper objectMapper = new ObjectMapper();
+        TypeFactory typeFactory = objectMapper.getTypeFactory();
+        Map<String, String> serviceMap = objectMapper.readValue(addedService, typeFactory.constructType(Map.class));
+
+        // 遍历Map的key
+        Set<String> keys = serviceMap.keySet();
+        for (String key : keys) {
+            switch (key) {
+                case "isPack":
+                    break;
+                case "guaranteeMoney": //顺丰基础包
+                    Map INSURE = new HashMap<>();
+                    INSURE.put("name", "INSURE");
+                    INSURE.put("value", serviceMap.get(key));
+                    serviceList.add(INSURE);
+                case "isOverLongWeight": //超长超重
+                    break;
+
+                case "isReceiptCollect": //签单返回
+                    break;
+                case "isWoodenCrate":   //打木架
+                    break;
+                default:
+                    log.info("收到未定义的增值服务代码: {}", key);
+
+            }
+
+        }
+       return serviceList;
+    }
+
 
     /**
      * 顺丰物流取消订单接口

+ 2 - 1
jd-logistics-modules/jd-logistics-system/src/main/resources/mapper/logistics/BizAddressBookMapper.xml

@@ -42,6 +42,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="deptId != null "> and dept_id = #{deptId}</if>
             <if test="userId != null "> and user_id = #{userId}</if>
         </where>
+        order by default_flag desc
     </select>
     
     <select id="selectBizAddressBookByAddressId" parameterType="Long" resultMap="BizAddressBookResult">
@@ -124,6 +125,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </delete>
 
     <update id="updateBizAddressBookDefault" parameterType="Long">
-        update biz_address_book set default_flag = 0 where usre_id = #{userId} and default_flag = 1
+        update biz_address_book set default_flag = '0' where user_id = #{userId} and default_flag = 1
     </update>
 </mapper>

+ 17 - 17
jd-logistics-modules/jd-logistics-system/src/main/resources/mapper/logistics/BizBannerMapper.xml

@@ -4,7 +4,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.logistics.mapper.BizBannerMapper">
     
-    <resultMap type="com.ruoyi.logistics.domain.BizBanner" id="BizBannerResult">
+    <resultMap type="BizBanner" id="BizBannerResult">
         <result property="bannerId"    column="banner_id"    />
         <result property="bannerName"    column="banner_name"    />
         <result property="imageUrl"    column="image_url"    />
@@ -26,18 +26,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         select banner_id, banner_name, image_url, link_url, sort_order, is_active, sys_type, remark, del_flag, create_time, update_time, create_by, update_by, dept_id, user_id from biz_banner
     </sql>
 
-    <select id="selectBizBannerList" parameterType="com.ruoyi.logistics.domain.BizBanner" resultMap="BizBannerResult">
+    <select id="selectBizBannerList" parameterType="BizBanner" resultMap="BizBannerResult">
         <include refid="selectBizBannerVo"/>
         <where>  
             <if test="bannerName != null  and bannerName != ''"> and banner_name like concat('%', #{bannerName}, '%')</if>
             <if test="imageUrl != null  and imageUrl != ''"> and image_url = #{imageUrl}</if>
             <if test="linkUrl != null  and linkUrl != ''"> and link_url = #{linkUrl}</if>
-            <if test="sortOrder != null "> and sort_order = #{sortOrder}</if>
             <if test="isActive != null  and isActive != ''"> and is_active = #{isActive}</if>
             <if test="sysType != null  and sysType != ''"> and sys_type = #{sysType}</if>
             <if test="deptId != null "> and dept_id = #{deptId}</if>
             <if test="userId != null "> and user_id = #{userId}</if>
         </where>
+        order by create_time desc
     </select>
     
     <select id="selectBizBannerByBannerId" parameterType="Long" resultMap="BizBannerResult">
@@ -45,15 +45,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where banner_id = #{bannerId}
     </select>
 
-    <insert id="insertBizBanner" parameterType="com.ruoyi.logistics.domain.BizBanner" useGeneratedKeys="true" keyProperty="bannerId">
+    <insert id="insertBizBanner" parameterType="BizBanner" useGeneratedKeys="true" keyProperty="bannerId">
         insert into biz_banner
         <trim prefix="(" suffix=")" suffixOverrides=",">
-            <if test="bannerName != null">banner_name,</if>
-            <if test="imageUrl != null">image_url,</if>
-            <if test="linkUrl != null">link_url,</if>
+            <if test="bannerName != null and bannerName != ''">banner_name,</if>
+            <if test="imageUrl != null and imageUrl != ''">image_url,</if>
+            <if test="linkUrl != null and linkUrl != ''">link_url,</if>
             <if test="sortOrder != null">sort_order,</if>
             <if test="isActive != null and isActive != ''">is_active,</if>
-            <if test="sysType != null">sys_type,</if>
+            <if test="sysType != null and sysType != ''">sys_type,</if>
             <if test="remark != null">remark,</if>
             <if test="delFlag != null">del_flag,</if>
             <if test="createTime != null">create_time,</if>
@@ -64,12 +64,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="userId != null">user_id,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
-            <if test="bannerName != null">#{bannerName},</if>
-            <if test="imageUrl != null">#{imageUrl},</if>
-            <if test="linkUrl != null">#{linkUrl},</if>
+            <if test="bannerName != null and bannerName != ''">#{bannerName},</if>
+            <if test="imageUrl != null and imageUrl != ''">#{imageUrl},</if>
+            <if test="linkUrl != null and linkUrl != ''">#{linkUrl},</if>
             <if test="sortOrder != null">#{sortOrder},</if>
             <if test="isActive != null and isActive != ''">#{isActive},</if>
-            <if test="sysType != null">#{sysType},</if>
+            <if test="sysType != null and sysType != ''">#{sysType},</if>
             <if test="remark != null">#{remark},</if>
             <if test="delFlag != null">#{delFlag},</if>
             <if test="createTime != null">#{createTime},</if>
@@ -81,15 +81,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
          </trim>
     </insert>
 
-    <update id="updateBizBanner" parameterType="com.ruoyi.logistics.domain.BizBanner">
+    <update id="updateBizBanner" parameterType="BizBanner">
         update biz_banner
         <trim prefix="SET" suffixOverrides=",">
-            <if test="bannerName != null">banner_name = #{bannerName},</if>
-            <if test="imageUrl != null">image_url = #{imageUrl},</if>
-            <if test="linkUrl != null">link_url = #{linkUrl},</if>
+            <if test="bannerName != null and bannerName != ''">banner_name = #{bannerName},</if>
+            <if test="imageUrl != null and imageUrl != ''">image_url = #{imageUrl},</if>
+            <if test="linkUrl != null and linkUrl != ''">link_url = #{linkUrl},</if>
             <if test="sortOrder != null">sort_order = #{sortOrder},</if>
             <if test="isActive != null and isActive != ''">is_active = #{isActive},</if>
-            <if test="sysType != null">sys_type = #{sysType},</if>
+            <if test="sysType != null and sysType != ''">sys_type = #{sysType},</if>
             <if test="remark != null">remark = #{remark},</if>
             <if test="delFlag != null">del_flag = #{delFlag},</if>
             <if test="createTime != null">create_time = #{createTime},</if>

+ 1 - 0
jd-logistics-modules/jd-logistics-system/src/main/resources/mapper/logistics/BizFinancialFeeItemsMapper.xml

@@ -36,6 +36,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="deptId != null "> and dept_id = #{deptId}</if>
             <if test="userId != null "> and user_id = #{userId}</if>
         </where>
+        or order by create_time desc
     </select>
     
     <select id="selectBizFinancialFeeItemsByFeeItemId" parameterType="Long" resultMap="BizFinancialFeeItemsResult">

File diff suppressed because it is too large
+ 52 - 1
jd-logistics-modules/jd-logistics-system/src/main/resources/mapper/logistics/BizWaybillOrderMapper.xml


+ 5 - 5
jd-logistics-ui-v3/src/api/logistics/banner.js

@@ -1,6 +1,6 @@
 import request from '@/utils/request'
 
-// 查询系统轮播图列表
+// 查询轮播图列表
 export function listBanner(query) {
   return request({
     url: '/system/banner/list',
@@ -9,7 +9,7 @@ export function listBanner(query) {
   })
 }
 
-// 查询系统轮播图详细
+// 查询轮播图详细
 export function getBanner(bannerId) {
   return request({
     url: '/system/banner/' + bannerId,
@@ -17,7 +17,7 @@ export function getBanner(bannerId) {
   })
 }
 
-// 新增系统轮播图
+// 新增轮播图
 export function addBanner(data) {
   return request({
     url: '/system/banner',
@@ -26,7 +26,7 @@ export function addBanner(data) {
   })
 }
 
-// 修改系统轮播图
+// 修改轮播图
 export function updateBanner(data) {
   return request({
     url: '/system/banner',
@@ -35,7 +35,7 @@ export function updateBanner(data) {
   })
 }
 
-// 删除系统轮播图
+// 删除轮播图
 export function delBanner(bannerId) {
   return request({
     url: '/system/banner/' + bannerId,

+ 151 - 178
jd-logistics-ui-v3/src/views/logistics/banner/index.vue

@@ -1,38 +1,58 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="名称" prop="bannerName">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="轮播图名称" prop="bannerName">
         <el-input
-          v-model="queryParams.bannerName"
-          placeholder="请输入名称"
-          clearable
-          @keyup.enter="handleQuery"
+            v-model="queryParams.bannerName"
+            placeholder="请输入轮播图名称"
+            clearable
+            @keyup.enter="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="是否显示" prop="isActive">
-        <el-select
-          v-model="queryParams.isActive"
-          placeholder="请选择是否显示"
-          clearable
-        >
-          <el-option label="是" :value="1" />
-          <el-option label="否" :value="0" />
+<!--      <el-form-item label="跳转链接" prop="linkUrl">
+        <el-input
+            v-model="queryParams.linkUrl"
+            placeholder="请输入跳转链接"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>-->
+      <el-form-item label="状态" prop="isActive">
+        <el-select v-model="queryParams.isActive" placeholder="请选择状态" clearable>
+          <el-option
+              v-for="dict in banner_status"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+          />
         </el-select>
       </el-form-item>
       <el-form-item label="系统类型" prop="sysType">
-        <el-select
-          v-model="queryParams.sysType"
-          placeholder="请选择系统类型"
-          clearable
-        >
+        <el-select v-model="queryParams.sysType" placeholder="请选择系统类型" clearable>
           <el-option
-            v-for="dict in banner_sys_type"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
+              v-for="dict in banner_sys_type"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
           />
         </el-select>
       </el-form-item>
+<!--      <el-form-item label="部门id" prop="deptId">
+        <el-input
+            v-model="queryParams.deptId"
+            placeholder="请输入部门id"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="用户id" prop="userId">
+        <el-input
+            v-model="queryParams.userId"
+            placeholder="请输入用户id"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>-->
       <el-form-item>
         <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
         <el-button icon="Refresh" @click="resetQuery">重置</el-button>
@@ -42,132 +62,135 @@
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
         <el-button
-          type="primary"
-          plain
-          icon="Plus"
-          @click="handleAdd"
-          v-hasPermi="['system:banner:add']"
+            type="primary"
+            plain
+            icon="Plus"
+            @click="handleAdd"
+            v-hasPermi="['logistics:banner:add']"
         >新增</el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
-          type="success"
-          plain
-          icon="Edit"
-          :disabled="single"
-          @click="handleUpdate"
-          v-hasPermi="['system:banner:edit']"
+            type="success"
+            plain
+            icon="Edit"
+            :disabled="single"
+            @click="handleUpdate"
+            v-hasPermi="['logistics:banner:edit']"
         >修改</el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
-          type="danger"
-          plain
-          icon="Delete"
-          :disabled="multiple"
-          @click="handleDelete"
-          v-hasPermi="['system:banner:remove']"
+            type="danger"
+            plain
+            icon="Delete"
+            :disabled="multiple"
+            @click="handleDelete"
+            v-hasPermi="['logistics:banner:remove']"
         >删除</el-button>
       </el-col>
-      <el-col :span="1.5">
+<!--      <el-col :span="1.5">
         <el-button
-          type="warning"
-          plain
-          icon="Download"
-          @click="handleExport"
-          v-hasPermi="['system:banner:export']"
+            type="warning"
+            plain
+            icon="Download"
+            @click="handleExport"
+            v-hasPermi="['logistics:banner:export']"
         >导出</el-button>
-      </el-col>
+      </el-col>-->
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
     <el-table v-loading="loading" :data="bannerList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="名称" align="center" prop="bannerName" />
-      <el-table-column label="轮播图" align="center" prop="imageUrl">
+<!--      <el-table-column label="轮播图id" align="center" prop="bannerId" />-->
+      <el-table-column label="轮播图名称" align="center" prop="bannerName" />
+      <el-table-column label="轮播图" align="center" prop="imageUrl" width="100">
         <template #default="scope">
-          <el-image
-            :src="scope.row.imageUrl"
-            :preview-src-list="[scope.row.imageUrl]"
-            fit="cover"
-            style="width: 60px; height: 60px; border-radius: 4px;"
-            :z-index="9999"
-          />
+          <image-preview :src="scope.row.imageUrl" :width="50" :height="50"/>
         </template>
       </el-table-column>
-      <el-table-column label="跳转链接" align="center" prop="linkUrl" />
-      <el-table-column label="排序" align="center" prop="sortOrder" />
-      <el-table-column label="是否显示" align="center" prop="isActive">
+      <el-table-column label="跳转链接" align="center" prop="linkUrl"  width="150" :show-overflow-tooltip="true"/>
+<!--      <el-table-column label="排序" align="center" prop="sortOrder" />-->
+      <el-table-column label="状态" align="center" prop="isActive">
         <template #default="scope">
-          <div>{{ scope.row.isActive === "1" ? '是' : '否' }}</div>
+          <dict-tag :options="banner_status" :value="scope.row.isActive"/>
         </template>
       </el-table-column>
       <el-table-column label="系统类型" align="center" prop="sysType">
         <template #default="scope">
-          <dict-tag :options="banner_sys_type" :value="scope.row.sysType" />
+          <dict-tag :options="banner_sys_type" :value="scope.row.sysType"/>
+        </template>
+      </el-table-column>
+<!--      <el-table-column label="备注" align="center" prop="remark" />-->
+<!--      <el-table-column label="部门id" align="center" prop="deptId" />-->
+<!--      <el-table-column label="用户id" align="center" prop="userId" />-->
+      <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="备注" align="center" prop="remark" />
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template #default="scope">
-          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:banner:edit']">修改</el-button>
-          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:banner:remove']">删除</el-button>
+          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['logistics:banner:edit']">修改</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['logistics:banner:remove']">删除</el-button>
         </template>
       </el-table-column>
     </el-table>
-    
+
     <pagination
-      v-show="total>0"
-      :total="total"
-      v-model:page="queryParams.pageNum"
-      v-model:limit="queryParams.pageSize"
-      @pagination="getList"
+        v-show="total>0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
     />
 
-    <!-- 添加或修改系统轮播图对话框 -->
+    <!-- 添加或修改轮播图对话框 -->
     <el-dialog :title="title" v-model="open" width="500px" append-to-body>
-      <el-form ref="bannerRef" :model="form" :rules="rules" label-width="80px">
+      <el-form ref="bannerRef" :model="form" :rules="rules" label-width="120px">
         <el-form-item label="轮播图名称" prop="bannerName">
           <el-input v-model="form.bannerName" placeholder="请输入轮播图名称" />
         </el-form-item>
-        <el-form-item label="上传图片" prop="imageUrl">
-          <el-upload
-            class="avatar-uploader"
-            :action="uploadUrl"
-            :show-file-list="false"
-            :on-success="handleAvatarSuccess"
-            :before-upload="beforeAvatarUpload"
-            :headers="headers"
-          >
-            <img v-if="form.imageUrl" :src="form.imageUrl" class="avatar" />
-            <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
-          </el-upload>
+        <el-form-item label="轮播图" prop="imageUrl">
+          <image-upload v-model="form.imageUrl" :limit="1"/>
         </el-form-item>
-        <el-form-item label="跳转链接" prop="linkUrl">
-          <el-input v-model="form.linkUrl" placeholder="请输入点击图片时跳转链接" />
+        <el-form-item label="跳转链接" prop="linkUrl">
+          <el-input v-model="form.linkUrl" placeholder="请输入跳转链接" />
         </el-form-item>
-        <el-form-item label="排序值" prop="sortOrder">
+<!--        <el-form-item label="排序值" prop="sortOrder">
           <el-input v-model="form.sortOrder" placeholder="请输入排序值" />
-        </el-form-item>
-        <el-form-item label="是否显示" prop="isActive">
-          <el-select v-model="form.isActive" placeholder="请选择是否显示">
-            <el-option label="否" :value="0" />
-            <el-option label="是" :value="1" />
-          </el-select>
+        </el-form-item>-->
+        <el-form-item label="状态" prop="isActive">
+          <el-radio-group v-model="form.isActive">
+            <el-radio
+                v-for="dict in banner_status"
+                :key="dict.value"
+                :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
         </el-form-item>
         <el-form-item label="系统类型" prop="sysType">
-          <el-select v-model="form.sysType" placeholder="请选择系统类型">
-            <el-option
-              v-for="dict in banner_sys_type"
-              :key="dict.value"
-              :label="dict.label"
-              :value="dict.value"
-            />
-          </el-select>
+          <el-radio-group v-model="form.sysType">
+            <el-radio
+                v-for="dict in banner_sys_type"
+                :key="dict.value"
+                :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+<!--        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="删除标志" prop="delFlag">
+          <el-input v-model="form.delFlag" placeholder="请输入删除标志" />
         </el-form-item>
-        <el-form-item label="备注" prop="remark">
-          <el-input v-model="form.remark" placeholder="请输入备注" />
+        <el-form-item label="部门id" prop="deptId">
+          <el-input v-model="form.deptId" placeholder="请输入部门id" />
         </el-form-item>
+        <el-form-item label="用户id" prop="userId">
+          <el-input v-model="form.userId" placeholder="请输入用户id" />
+        </el-form-item>-->
       </el-form>
       <template #footer>
         <div class="dialog-footer">
@@ -181,19 +204,9 @@
 
 <script setup name="Banner">
 import { listBanner, getBanner, delBanner, addBanner, updateBanner } from "@/api/logistics/banner"
-import { Plus } from '@element-plus/icons-vue'
-import { getToken } from "@/utils/auth"
-import DictTag from '@/components/DictTag'
-import { useDict } from '@/utils/dict'
 
 const { proxy } = getCurrentInstance()
-
-// 使用标准字典类型,但不在表单中使用
-const { banner_sys_type } = proxy.useDict("banner_sys_type")
-
-// 定义上传地址和请求头
-const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/file/upload")
-const headers = ref({ Authorization: "Bearer " + getToken() })
+const { banner_status, banner_sys_type } = proxy.useDict('banner_status', 'banner_sys_type')
 
 const bannerList = ref([])
 const open = ref(false)
@@ -211,17 +224,35 @@ const data = reactive({
     pageNum: 1,
     pageSize: 10,
     bannerName: null,
+    imageUrl: null,
+    linkUrl: null,
     isActive: null,
     sysType: null,
     deptId: null,
     userId: null
   },
-  rules: {}
+  rules: {
+    bannerName: [
+      { required: true, message: "轮播图名称不能为空", trigger: "blur" }
+    ],
+    imageUrl: [
+      { required: true, message: "图片路径不能为空", trigger: "blur" }
+    ],
+    linkUrl: [
+      { required: true, message: "跳转链接不能为空", trigger: "blur" }
+    ],
+    isActive: [
+      { required: true, message: "状态不能为空", trigger: "change" }
+    ],
+    sysType: [
+      { required: true, message: "系统类型不能为空", trigger: "change" }
+    ],
+  }
 })
 
 const { queryParams, form, rules } = toRefs(data)
 
-/** 查询系统轮播图列表 */
+/** 查询轮播图列表 */
 function getList() {
   loading.value = true
   listBanner(queryParams.value).then(response => {
@@ -231,31 +262,6 @@ function getList() {
   })
 }
 
-// 图片上传成功后的回调
-function handleAvatarSuccess(res, file) {
-  if(res.code === 200) {
-    // 根据实际返回的数据结构设置图片URL
-    form.value.imageUrl = res.data.url
-  } else {
-    proxy.$message.error('上传失败:' + res.msg)
-  }
-}
-
-// 上传前的校验
-function beforeAvatarUpload(file) {
-  const acceptTypes = ['image/jpeg', 'image/png', 'image/gif']
-  const isAcceptedType = acceptTypes.includes(file.type)
-  const isLt2M = file.size / 1024 / 1024 < 2
-
-  if (!isAcceptedType) {
-    proxy.$message.error('上传图片只能是 JPG/PNG/GIF 格式!')
-  }
-  if (!isLt2M) {
-    proxy.$message.error('上传图片大小不能超过 2MB!')
-  }
-  return isAcceptedType && isLt2M
-}
-
 // 取消按钮
 function cancel() {
   open.value = false
@@ -307,7 +313,7 @@ function handleSelectionChange(selection) {
 function handleAdd() {
   reset()
   open.value = true
-  title.value = "添加系统轮播图"
+  title.value = "添加轮播图"
 }
 
 /** 修改按钮操作 */
@@ -316,12 +322,8 @@ function handleUpdate(row) {
   const _bannerId = row.bannerId || ids.value
   getBanner(_bannerId).then(response => {
     form.value = response.data
-    // 确保isActive字段的值被正确转换为数字类型,以便与选项值匹配
-    if (form.value.isActive !== null && form.value.isActive !== undefined) {
-      form.value.isActive = Number(form.value.isActive)
-    }
     open.value = true
-    title.value = "修改系统轮播图"
+    title.value = "修改轮播图"
   })
 }
 
@@ -349,7 +351,7 @@ function submitForm() {
 /** 删除按钮操作 */
 function handleDelete(row) {
   const _bannerIds = row.bannerId || ids.value
-  proxy.$modal.confirm('是否确认删除系统轮播图编号为"' + _bannerIds + '"的数据项?').then(function() {
+  proxy.$modal.confirm('是否确认删除轮播图编号为"' + _bannerIds + '"的数据项?').then(function() {
     return delBanner(_bannerIds)
   }).then(() => {
     getList()
@@ -359,39 +361,10 @@ function handleDelete(row) {
 
 /** 导出按钮操作 */
 function handleExport() {
-  proxy.download('system/banner/export', {
+  proxy.download('logistics/banner/export', {
     ...queryParams.value
   }, `banner_${new Date().getTime()}.xlsx`)
 }
 
 getList()
 </script>
-
-<style>
-.avatar-uploader .el-upload {
-  border: 1px dashed var(--el-border-color);
-  border-radius: 6px;
-  cursor: pointer;
-  position: relative;
-  overflow: hidden;
-  transition: var(--el-transition-duration-fast);
-}
-
-.avatar-uploader .el-upload:hover {
-  border-color: var(--el-color-primary);
-}
-
-.avatar-uploader-icon {
-  font-size: 28px;
-  color: #8c939d;
-  width: 178px;
-  height: 178px;
-  text-align: center;
-}
-
-.avatar {
-  width: 178px;
-  height: 178px;
-  display: block;
-}
-</style>

+ 17 - 12
jd-logistics-ui-v3/src/views/logistics/inancialFee/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="98px">
       <el-form-item label="费用项目编码" prop="feeItemCode">
         <el-input
           v-model="queryParams.feeItemCode"
@@ -17,10 +17,10 @@
           @keyup.enter="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="外部渠道" prop="feeItemCategory">
+      <el-form-item label="渠道" prop="feeItemCategory">
         <el-select
           v-model="queryParams.feeItemCategory"
-          placeholder="请选择外部渠道"
+          placeholder="请选择渠道"
           clearable
         >
           <el-option
@@ -31,7 +31,7 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="外部费用编码" prop="extFeeCode">
+<!--      <el-form-item label="外部费用编码" prop="extFeeCode">
         <el-input
           v-model="queryParams.extFeeCode"
           placeholder="请输入外部费用编码"
@@ -46,7 +46,7 @@
           clearable
           @keyup.enter="handleQuery"
         />
-      </el-form-item>
+      </el-form-item>-->
       <el-form-item>
         <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
         <el-button icon="Refresh" @click="resetQuery">重置</el-button>
@@ -83,7 +83,7 @@
           v-hasPermi="['system:inancialFee:remove']"
         >删除</el-button>
       </el-col>
-      <el-col :span="1.5">
+<!--      <el-col :span="1.5">
         <el-button
           type="warning"
           plain
@@ -91,7 +91,7 @@
           @click="handleExport"
           v-hasPermi="['system:inancialFee:export']"
         >导出</el-button>
-      </el-col>
+      </el-col>-->
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
@@ -99,14 +99,19 @@
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="费用项目编码" align="center" prop="feeItemCode" />
       <el-table-column label="费用项目名称" align="center" prop="feeItemName" />
-      <el-table-column label="外部渠道" align="center" prop="feeItemCategory">
+      <el-table-column label="渠道" align="center" prop="feeItemCategory">
         <template #default="scope">
           <dict-tag :options="logistics_type" :value="scope.row.feeItemCategory" />
         </template>
       </el-table-column>
       <el-table-column label="外部费用编码" align="center" prop="extFeeCode" />
       <el-table-column label="外部费用名称" align="center" prop="extFeeName" />
-      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+<!--      <el-table-column label="备注" align="center" prop="remark" />-->
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template #default="scope">
           <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:inancialFee:edit']">修改</el-button>
@@ -125,7 +130,7 @@
 
     <!-- 添加或修改费用类型管理对话框 -->
     <el-dialog :title="title" v-model="open" width="500px" append-to-body>
-      <el-form ref="inancialFeeRef" :model="form" :rules="rules" label-width="80px">
+      <el-form ref="inancialFeeRef" :model="form" :rules="rules" label-width="120px">
         <el-form-item label="费用项目编码" prop="feeItemCode">
           <el-input v-model="form.feeItemCode" placeholder="请输入费用项目编码" />
         </el-form-item>
@@ -148,9 +153,9 @@
         <el-form-item label="外部费用名称" prop="extFeeName">
           <el-input v-model="form.extFeeName" placeholder="请输入外部费用名称" />
         </el-form-item>
-        <el-form-item label="备注" prop="remark">
+<!--        <el-form-item label="备注" prop="remark">
           <el-input v-model="form.remark" placeholder="请输入备注" />
-        </el-form-item>
+        </el-form-item>-->
       </el-form>
       <template #footer>
         <div class="dialog-footer">