Bläddra i källkod

Merge remote-tracking branch 'origin/master'

颜琼丽 11 timmar sedan
förälder
incheckning
dd4843310f
27 ändrade filer med 1423 tillägg och 170 borttagningar
  1. 39 10
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/front/controller/MonthQRCodeController.java
  2. 21 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/front/controller/WxMiniController.java
  3. 5 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/constant/RedisCacheConstants.java
  4. 105 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/controller/BizMonthQrcodeRecordController.java
  5. 116 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/domain/BizMonthQrcodeRecord.java
  6. 17 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/dto/MonthQRCodeDTO.java
  7. 61 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/mapper/BizMonthQrcodeRecordMapper.java
  8. 39 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/response/CommonOrderInfoResponse.java
  9. 73 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/response/Contact.java
  10. 61 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/IBizMonthQrcodeRecordService.java
  11. 12 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/IMonthQRCodeTaskService.java
  12. 71 5
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/LogisticsOrderService.java
  13. 5 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/LogisticsService.java
  14. 96 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/impl/BizMonthQrcodeRecordServiceImpl.java
  15. 65 11
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/impl/JDLogisticsService.java
  16. 179 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/impl/MonthQRCodeTaskServiceImpl.java
  17. 5 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/impl/SFLogisticsService.java
  18. 69 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/util/QRCodeUtils.java
  19. 92 0
      jd-logistics-modules/jd-logistics-system/src/main/resources/mapper/logistics/BizMonthQrcodeRecordMapper.xml
  20. 8 0
      jd-logistics-ui-v3/src/api/logistics/monthSummary.js
  21. 209 118
      jd-logistics-ui-v3/src/views/logistics/monthSummary/index.vue
  22. 21 20
      jd-logistics-ui-v3/src/views/logistics/order/personal.vue
  23. 15 0
      jd_logistics-app/api/mine.js
  24. 1 1
      jd_logistics-app/api/order.js
  25. 3 0
      jd_logistics-app/pages.json
  26. 10 3
      jd_logistics-app/pages/mine/settlementCode.vue
  27. 25 2
      jd_logistics-app/pages/order/index.vue

+ 39 - 10
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/front/controller/MonthQRCodeController.java

@@ -1,13 +1,19 @@
 package com.ruoyi.front.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.lop.open.api.sdk.domain.ECAP.CommonQueryOrderApi.commonGetOrderByMonthSettleQRV1.CommonMonthSettleQRQueryResponse;
+import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.exception.ServiceException;
+import com.ruoyi.common.core.web.controller.BaseController;
 import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.security.annotation.InnerAuth;
+import com.ruoyi.logistics.domain.BizWaybillOrder;
+import com.ruoyi.logistics.response.CommonOrderInfoResponse;
+import com.ruoyi.logistics.service.IMonthQRCodeTaskService;
 import com.ruoyi.logistics.service.LogisticsOrderService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * WX-月结二维码生成
@@ -16,18 +22,41 @@ import org.springframework.web.bind.annotation.RestController;
  * @date 2026-02-04
  */
 @RestController
-@RequestMapping("/front/qrcode")
-public class MonthQRCodeController {
+@RequestMapping("/callback/qrcode")
+public class MonthQRCodeController extends BaseController {
 
     @Autowired
     private LogisticsOrderService logisticsOrderService;
 
+    @Autowired
+    private IMonthQRCodeTaskService monthQRCodeService;
+
     @RequestMapping
-    public AjaxResult qrcode(@RequestParam("orderType") Integer orderType) {
-        JSONObject jsonObject = logisticsOrderService.getQRCode(orderType);
-        if(!jsonObject.getBooleanValue("success")){
-            throw new ServiceException("获取二维码失败! 原因:"+jsonObject.getString("msg"));
+    public AjaxResult qrcode(@RequestParam("source") Integer source, @RequestParam("waybillCode") String waybillCode) {
+        try{
+//            JSONObject jsonObject = logisticsOrderService.getQRCode(source);
+//            JSONObject jsonObject = logisticsOrderService.queryOrderDetailByWaybillCode(source, waybillCode);
+            JSONObject jsonObject = logisticsOrderService.queryOrderByQRCode(source, waybillCode);
+
+
+            CommonMonthSettleQRQueryResponse response = (CommonMonthSettleQRQueryResponse) jsonObject.get("msg");
+            // 返回完整的二维码信息,包括图片数据
+            return AjaxResult.success(response);
+        } catch (ServiceException e) {
+            return AjaxResult.error("获取二维码失败! 原因:"+e.getMessage());
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @InnerAuth
+    @PostMapping("/consume")
+    public R<String> consume() {
+        try {
+            monthQRCodeService.consumeQRCode();
+            return R.ok();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
         }
-        return AjaxResult.success(jsonObject.getString("msg"));
     }
 }

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

@@ -2,7 +2,9 @@ package com.ruoyi.front.controller;
 
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.core.web.domain.AjaxResult;
 import com.ruoyi.common.security.annotation.InnerAuth;
+import com.ruoyi.common.security.utils.SecurityUtils;
 import com.ruoyi.front.service.IWxService;
 import com.ruoyi.system.api.domain.SysUser;
 import com.ruoyi.system.api.model.LoginUser;
@@ -14,6 +16,9 @@ import org.springframework.web.bind.annotation.*;
 
 import java.util.Set;
 
+/**
+ * WX-用户信息管理
+ */
 @RestController
 @RequestMapping("/front/wxmini")
 public class WxMiniController {
@@ -72,4 +77,20 @@ public class WxMiniController {
         sysUserVo.setPermissions(permissions);
         return R.ok(sysUserVo);
     }
+
+
+    /**
+     * 获取用户信息
+     *
+     * @return 用户信息
+     */
+    @GetMapping("getInfo")
+    public AjaxResult getInfo()
+    {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        SysUser user = loginUser.getSysUser();
+        AjaxResult ajax = AjaxResult.success();
+        ajax.put("user", user);
+        return ajax;
+    }
 }

+ 5 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/constant/RedisCacheConstants.java

@@ -12,4 +12,9 @@ public class RedisCacheConstants {
      * 费用类型缓存KEY
      */
     public static final String FINANCIAL_FEE_ITEM_CACHE_KEY = "financial_fee_item_cache";
+
+    /**
+     * 月结二维码缓存KEY
+     */
+    public static final String MONTH_QRCODE_CACHE_KEY = "month:qrcode:cache:";
 }

+ 105 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/controller/BizMonthQrcodeRecordController.java

@@ -0,0 +1,105 @@
+package com.ruoyi.logistics.controller;
+
+import java.util.List;
+import java.io.IOException;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.log.annotation.Log;
+import com.ruoyi.common.log.enums.BusinessType;
+import com.ruoyi.common.security.annotation.RequiresPermissions;
+import com.ruoyi.logistics.domain.BizMonthQrcodeRecord;
+import com.ruoyi.logistics.service.IBizMonthQrcodeRecordService;
+import com.ruoyi.common.core.web.controller.BaseController;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.web.page.TableDataInfo;
+
+/**
+ * 月结二维码使用记录Controller
+ * 
+ * @author RuiJing
+ * @date 2026-02-12
+ */
+@RestController
+@RequestMapping("/record")
+public class BizMonthQrcodeRecordController extends BaseController
+{
+    @Autowired
+    private IBizMonthQrcodeRecordService bizMonthQrcodeRecordService;
+
+    /**
+     * 查询月结二维码使用记录列表
+     */
+    @RequiresPermissions("system:record:list")
+    @GetMapping("/list")
+    public TableDataInfo list(BizMonthQrcodeRecord bizMonthQrcodeRecord)
+    {
+        startPage();
+        List<BizMonthQrcodeRecord> list = bizMonthQrcodeRecordService.selectBizMonthQrcodeRecordList(bizMonthQrcodeRecord);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出月结二维码使用记录列表
+     */
+    @RequiresPermissions("system:record:export")
+    @Log(title = "月结二维码使用记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, BizMonthQrcodeRecord bizMonthQrcodeRecord)
+    {
+        List<BizMonthQrcodeRecord> list = bizMonthQrcodeRecordService.selectBizMonthQrcodeRecordList(bizMonthQrcodeRecord);
+        ExcelUtil<BizMonthQrcodeRecord> util = new ExcelUtil<BizMonthQrcodeRecord>(BizMonthQrcodeRecord.class);
+        util.exportExcel(response, list, "月结二维码使用记录数据");
+    }
+
+    /**
+     * 获取月结二维码使用记录详细信息
+     */
+    @RequiresPermissions("system:record:query")
+    @GetMapping(value = "/{qrcodeId}")
+    public AjaxResult getInfo(@PathVariable("qrcodeId") Long qrcodeId)
+    {
+        return success(bizMonthQrcodeRecordService.selectBizMonthQrcodeRecordByQrcodeId(qrcodeId));
+    }
+
+    /**
+     * 新增月结二维码使用记录
+     */
+    @RequiresPermissions("system:record:add")
+    @Log(title = "月结二维码使用记录", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody BizMonthQrcodeRecord bizMonthQrcodeRecord)
+    {
+        return toAjax(bizMonthQrcodeRecordService.insertBizMonthQrcodeRecord(bizMonthQrcodeRecord));
+    }
+
+    /**
+     * 修改月结二维码使用记录
+     */
+    @RequiresPermissions("system:record:edit")
+    @Log(title = "月结二维码使用记录", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody BizMonthQrcodeRecord bizMonthQrcodeRecord)
+    {
+        return toAjax(bizMonthQrcodeRecordService.updateBizMonthQrcodeRecord(bizMonthQrcodeRecord));
+    }
+
+    /**
+     * 删除月结二维码使用记录
+     */
+    @RequiresPermissions("system:record:remove")
+    @Log(title = "月结二维码使用记录", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{qrcodeIds}")
+    public AjaxResult remove(@PathVariable Long[] qrcodeIds)
+    {
+        return toAjax(bizMonthQrcodeRecordService.deleteBizMonthQrcodeRecordByQrcodeIds(qrcodeIds));
+    }
+}

+ 116 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/domain/BizMonthQrcodeRecord.java

@@ -0,0 +1,116 @@
+package com.ruoyi.logistics.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.core.annotation.Excel;
+import com.ruoyi.common.core.web.domain.BaseEntity;
+
+/**
+ * 月结二维码使用记录对象 biz_month_qrcode_record
+ * 
+ * @author RuiJing
+ * @date 2026-02-12
+ */
+public class BizMonthQrcodeRecord extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 二维码id */
+    private Long qrcodeId;
+
+    /** 二维码内容 */
+    @Excel(name = "二维码内容")
+    private String qrcodeContent;
+
+    /** 用户id */
+    @Excel(name = "用户id")
+    private Long userId;
+
+    /** 供应商id */
+    @Excel(name = "供应商id")
+    private Long deptId;
+
+    /** 1.JD 2.SF */
+    @Excel(name = "1.JD 2.SF")
+    private Integer source;
+
+    /** 默认0 0未核销 1已核销 */
+    @Excel(name = "默认0 0未核销 1已核销")
+    private Integer isVerify;
+
+    public void setQrcodeId(Long qrcodeId) 
+    {
+        this.qrcodeId = qrcodeId;
+    }
+
+    public Long getQrcodeId() 
+    {
+        return qrcodeId;
+    }
+
+    public void setQrcodeContent(String qrcodeContent) 
+    {
+        this.qrcodeContent = qrcodeContent;
+    }
+
+    public String getQrcodeContent() 
+    {
+        return qrcodeContent;
+    }
+
+    public void setUserId(Long userId) 
+    {
+        this.userId = userId;
+    }
+
+    public Long getUserId() 
+    {
+        return userId;
+    }
+
+    public void setDeptId(Long deptId) 
+    {
+        this.deptId = deptId;
+    }
+
+    public Long getDeptId() 
+    {
+        return deptId;
+    }
+
+    public void setSource(Integer source) 
+    {
+        this.source = source;
+    }
+
+    public Integer getSource() 
+    {
+        return source;
+    }
+
+    public void setIsVerify(Integer isVerify) 
+    {
+        this.isVerify = isVerify;
+    }
+
+    public Integer getIsVerify() 
+    {
+        return isVerify;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("qrcodeId", getQrcodeId())
+            .append("qrcodeContent", getQrcodeContent())
+            .append("userId", getUserId())
+            .append("deptId", getDeptId())
+            .append("source", getSource())
+            .append("isVerify", getIsVerify())
+            .append("createTime", getCreateTime())
+            .append("createBy", getCreateBy())
+            .append("updateTime", getUpdateTime())
+            .append("updateBy", getUpdateBy())
+            .toString();
+    }
+}

+ 17 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/dto/MonthQRCodeDTO.java

@@ -0,0 +1,17 @@
+package com.ruoyi.logistics.dto;
+
+import lombok.Data;
+
+@Data
+public class MonthQRCodeDTO {
+
+    private Long qrcodeId;
+
+    private String qrCodeContent;
+
+    private Long userId;
+
+    private Long deptId;
+
+    private Integer source;
+}

+ 61 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/mapper/BizMonthQrcodeRecordMapper.java

@@ -0,0 +1,61 @@
+package com.ruoyi.logistics.mapper;
+
+import java.util.List;
+import com.ruoyi.logistics.domain.BizMonthQrcodeRecord;
+
+/**
+ * 月结二维码使用记录Mapper接口
+ * 
+ * @author RuiJing
+ * @date 2026-02-12
+ */
+public interface BizMonthQrcodeRecordMapper 
+{
+    /**
+     * 查询月结二维码使用记录
+     * 
+     * @param qrcodeId 月结二维码使用记录主键
+     * @return 月结二维码使用记录
+     */
+    public BizMonthQrcodeRecord selectBizMonthQrcodeRecordByQrcodeId(Long qrcodeId);
+
+    /**
+     * 查询月结二维码使用记录列表
+     * 
+     * @param bizMonthQrcodeRecord 月结二维码使用记录
+     * @return 月结二维码使用记录集合
+     */
+    public List<BizMonthQrcodeRecord> selectBizMonthQrcodeRecordList(BizMonthQrcodeRecord bizMonthQrcodeRecord);
+
+    /**
+     * 新增月结二维码使用记录
+     * 
+     * @param bizMonthQrcodeRecord 月结二维码使用记录
+     * @return 结果
+     */
+    public int insertBizMonthQrcodeRecord(BizMonthQrcodeRecord bizMonthQrcodeRecord);
+
+    /**
+     * 修改月结二维码使用记录
+     * 
+     * @param bizMonthQrcodeRecord 月结二维码使用记录
+     * @return 结果
+     */
+    public int updateBizMonthQrcodeRecord(BizMonthQrcodeRecord bizMonthQrcodeRecord);
+
+    /**
+     * 删除月结二维码使用记录
+     * 
+     * @param qrcodeId 月结二维码使用记录主键
+     * @return 结果
+     */
+    public int deleteBizMonthQrcodeRecordByQrcodeId(Long qrcodeId);
+
+    /**
+     * 批量删除月结二维码使用记录
+     * 
+     * @param qrcodeIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteBizMonthQrcodeRecordByQrcodeIds(Long[] qrcodeIds);
+}

+ 39 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/response/CommonOrderInfoResponse.java

@@ -0,0 +1,39 @@
+package com.ruoyi.logistics.response;
+
+import com.lop.open.api.sdk.internal.fastjson.annotation.JSONField;
+
+import java.io.Serializable;
+
+public class CommonOrderInfoResponse extends com.lop.open.api.sdk.domain.ECAP.CommonQueryOrderApi.commonGetOrderInfoV1.CommonOrderInfoResponse implements Serializable {
+
+    private Contact receiverContact;
+    private Contact senderContact;
+
+    @JSONField(
+            name = "receiverContact"
+    )
+    public void setReceiverContact(Contact var1) {
+        this.receiverContact = var1;
+    }
+
+    @JSONField(
+            name = "receiverContact"
+    )
+    public Contact getReceiverContact() {
+        return this.receiverContact;
+    }
+
+    @JSONField(
+            name = "senderContact"
+    )
+    public void setSenderContact(Contact var1) {
+        this.senderContact = var1;
+    }
+
+    @JSONField(
+            name = "senderContact"
+    )
+    public Contact getSenderContact() {
+        return this.senderContact;
+    }
+}

+ 73 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/response/Contact.java

@@ -0,0 +1,73 @@
+package com.ruoyi.logistics.response;
+
+import com.lop.open.api.sdk.internal.fastjson.annotation.JSONField;
+
+import java.io.Serializable;
+
+public class Contact implements Serializable {
+
+    private String province;
+
+    private String city;
+
+    private String county;
+
+    private String town;
+
+
+    @JSONField(
+            name = "province"
+    )
+    public void setProvince(String var1) {
+        this.province = var1;
+    }
+
+    @JSONField(
+            name = "province"
+    )
+    public String getProvince() {
+        return this.province;
+    }
+
+    @JSONField(
+            name = "city"
+    )
+    public void setCity(String var1) {
+        this.city = var1;
+    }
+
+    @JSONField(
+            name = "city"
+    )
+    public String getCity() {
+        return this.city;
+    }
+
+    @JSONField(
+            name = "county"
+    )
+    public void setCounty(String var1) {
+        this.county = var1;
+    }
+
+    @JSONField(
+            name = "county"
+    )
+    public String getCounty() {
+        return this.county;
+    }
+
+    @JSONField(
+            name = "town"
+    )
+    public void setTown(String var1) {
+        this.town = var1;
+    }
+
+    @JSONField(
+            name = "town"
+    )
+    public String getTown() {
+        return this.town;
+    }
+}

+ 61 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/IBizMonthQrcodeRecordService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.logistics.service;
+
+import java.util.List;
+import com.ruoyi.logistics.domain.BizMonthQrcodeRecord;
+
+/**
+ * 月结二维码使用记录Service接口
+ * 
+ * @author RuiJing
+ * @date 2026-02-12
+ */
+public interface IBizMonthQrcodeRecordService 
+{
+    /**
+     * 查询月结二维码使用记录
+     * 
+     * @param qrcodeId 月结二维码使用记录主键
+     * @return 月结二维码使用记录
+     */
+    public BizMonthQrcodeRecord selectBizMonthQrcodeRecordByQrcodeId(Long qrcodeId);
+
+    /**
+     * 查询月结二维码使用记录列表
+     * 
+     * @param bizMonthQrcodeRecord 月结二维码使用记录
+     * @return 月结二维码使用记录集合
+     */
+    public List<BizMonthQrcodeRecord> selectBizMonthQrcodeRecordList(BizMonthQrcodeRecord bizMonthQrcodeRecord);
+
+    /**
+     * 新增月结二维码使用记录
+     * 
+     * @param bizMonthQrcodeRecord 月结二维码使用记录
+     * @return 结果
+     */
+    public int insertBizMonthQrcodeRecord(BizMonthQrcodeRecord bizMonthQrcodeRecord);
+
+    /**
+     * 修改月结二维码使用记录
+     * 
+     * @param bizMonthQrcodeRecord 月结二维码使用记录
+     * @return 结果
+     */
+    public int updateBizMonthQrcodeRecord(BizMonthQrcodeRecord bizMonthQrcodeRecord);
+
+    /**
+     * 批量删除月结二维码使用记录
+     * 
+     * @param qrcodeIds 需要删除的月结二维码使用记录主键集合
+     * @return 结果
+     */
+    public int deleteBizMonthQrcodeRecordByQrcodeIds(Long[] qrcodeIds);
+
+    /**
+     * 删除月结二维码使用记录信息
+     * 
+     * @param qrcodeId 月结二维码使用记录主键
+     * @return 结果
+     */
+    public int deleteBizMonthQrcodeRecordByQrcodeId(Long qrcodeId);
+}

+ 12 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/IMonthQRCodeTaskService.java

@@ -0,0 +1,12 @@
+package com.ruoyi.logistics.service;
+
+/**
+ * 月结二维码业务
+ *
+ * @author RuiJing
+ * @date 2026-01-29
+ */
+public interface IMonthQRCodeTaskService {
+
+    void consumeQRCode();
+}

+ 71 - 5
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/LogisticsOrderService.java

@@ -2,20 +2,33 @@ 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.common.core.exception.ServiceException;
+import com.ruoyi.common.core.utils.DateUtils;
+import com.ruoyi.common.redis.service.RedisService;
+import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.logistics.constant.RedisCacheConstants;
+import com.ruoyi.logistics.domain.BizMonthQrcodeRecord;
 import com.ruoyi.logistics.domain.BizWaybillOrder;
-import com.ruoyi.logistics.domain.LogisticsOrder;
+import com.ruoyi.logistics.dto.MonthQRCodeDTO;
 import com.ruoyi.logistics.service.factory.LogisticsFactory;
+import com.ruoyi.logistics.util.QRCodeUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.io.UnsupportedEncodingException;
+import java.util.concurrent.TimeUnit;
 
 @Service
 public class LogisticsOrderService {
     @Autowired
     private LogisticsFactory logisticsFactory;
 
+    @Autowired
+    private RedisService redisService;
+
+    @Autowired
+    private IBizMonthQrcodeRecordService bizMonthQrcodeRecordService;
+
 
     public JSONObject precheckOrder(BizWaybillOrder bizWaybillOrder) throws UnsupportedEncodingException {
         // 根据订单中的物流公司类型获取对应服务
@@ -39,11 +52,57 @@ public class LogisticsOrderService {
         return cancelOrder;
     }
 
-    public JSONObject getQRCode(Integer orderType) {
+    public JSONObject getQRCode(Integer source) {
         // 根据订单中的物流公司类型获取对应服务
-        LogisticsService logisticsService = logisticsFactory.getLogisticsService(orderType==1?"JD":"SF");
+        LogisticsService logisticsService = logisticsFactory.getLogisticsService(source==1?"JD":"SF");
         JSONObject qrCode = logisticsService.getMonthQRCode();
-        return qrCode;
+
+        if(!qrCode.getBooleanValue("success")){
+            throw new ServiceException("获取二维码失败! 原因:"+qrCode.getString("msg"));
+        }
+
+        String qrcodeContent = qrCode.getString("msg");
+
+        BizMonthQrcodeRecord bizMonthQrcodeRecord = new BizMonthQrcodeRecord();
+        bizMonthQrcodeRecord.setQrcodeContent(qrcodeContent);
+        bizMonthQrcodeRecord.setUserId(SecurityUtils.getUserId());
+        bizMonthQrcodeRecord.setDeptId(SecurityUtils.getLoginUser().getSysUser().getDeptId());
+        bizMonthQrcodeRecord.setSource(source);
+        bizMonthQrcodeRecord.setIsVerify(0);
+        bizMonthQrcodeRecord.setCreateTime(DateUtils.getNowDate());
+        bizMonthQrcodeRecord.setCreateBy(SecurityUtils.getLoginUser().getSysUser().getNickName());
+
+        bizMonthQrcodeRecordService.insertBizMonthQrcodeRecord(bizMonthQrcodeRecord);
+
+        MonthQRCodeDTO monthQRCodeDTO = new MonthQRCodeDTO();
+        monthQRCodeDTO.setQrcodeId(bizMonthQrcodeRecord.getQrcodeId());
+        monthQRCodeDTO.setQrCodeContent(qrcodeContent);
+        monthQRCodeDTO.setUserId(SecurityUtils.getUserId());
+        monthQRCodeDTO.setDeptId(SecurityUtils.getLoginUser().getSysUser().getDeptId());
+        monthQRCodeDTO.setSource(source);
+
+        redisService.setCacheObject(RedisCacheConstants.MONTH_QRCODE_CACHE_KEY + bizMonthQrcodeRecord.getQrcodeId(), monthQRCodeDTO, 660L, TimeUnit.SECONDS);
+
+        // 生成二维码图片
+        String qrCodeContent = qrCode.getString("msg");
+        return getQRCodeImage(qrCodeContent);
+    }
+
+    public JSONObject getQRCodeImage(String content) {
+        // 生成二维码图片并返回Base64编码的图片数据
+        try {
+            String base64Image = QRCodeUtils.generateQRCodeBase64(content, 300, 300);
+            JSONObject result = new JSONObject();
+            result.put("success", true);
+            result.put("qrCodeImage", "data:image/png;base64," + base64Image);
+            result.put("msg", "二维码生成成功");
+            return result;
+        } catch (Exception e) {
+            JSONObject result = new JSONObject();
+            result.put("success", false);
+            result.put("msg", "生成二维码失败: " + e.getMessage());
+            return result;
+        }
     }
 
     public JSONObject queryOrderByQRCode(Integer orderType, String qrCode) {
@@ -59,5 +118,12 @@ public class LogisticsOrderService {
         JSONObject jsonObject = logisticsService.queryOrderDetailByWaybillCode(waybillCode);
         return jsonObject;
     }
+
+    public JSONObject queryOrderFeeInfoByWaybillCode(Integer orderType, String waybillCode) {
+        // 根据订单中的物流公司类型获取对应服务
+        LogisticsService logisticsService = logisticsFactory.getLogisticsService(orderType==1?"JD":"SF");
+        JSONObject jsonObject = logisticsService.queryOrderFeeInfo(waybillCode);
+        return jsonObject;
+    }
 }
 

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

@@ -57,4 +57,9 @@ public interface LogisticsService {
      */
     JSONObject queryOrderDetailByWaybillCode(String waybillCode);
 
+    /**
+     * 根据运单号查询订单费用信息
+     */
+    JSONObject queryOrderFeeInfo(String waybillCode);
+
 }

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

@@ -0,0 +1,96 @@
+package com.ruoyi.logistics.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.core.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.logistics.mapper.BizMonthQrcodeRecordMapper;
+import com.ruoyi.logistics.domain.BizMonthQrcodeRecord;
+import com.ruoyi.logistics.service.IBizMonthQrcodeRecordService;
+
+/**
+ * 月结二维码使用记录Service业务层处理
+ * 
+ * @author RuiJing
+ * @date 2026-02-12
+ */
+@Service
+public class BizMonthQrcodeRecordServiceImpl implements IBizMonthQrcodeRecordService 
+{
+    @Autowired
+    private BizMonthQrcodeRecordMapper bizMonthQrcodeRecordMapper;
+
+    /**
+     * 查询月结二维码使用记录
+     * 
+     * @param qrcodeId 月结二维码使用记录主键
+     * @return 月结二维码使用记录
+     */
+    @Override
+    public BizMonthQrcodeRecord selectBizMonthQrcodeRecordByQrcodeId(Long qrcodeId)
+    {
+        return bizMonthQrcodeRecordMapper.selectBizMonthQrcodeRecordByQrcodeId(qrcodeId);
+    }
+
+    /**
+     * 查询月结二维码使用记录列表
+     * 
+     * @param bizMonthQrcodeRecord 月结二维码使用记录
+     * @return 月结二维码使用记录
+     */
+    @Override
+    public List<BizMonthQrcodeRecord> selectBizMonthQrcodeRecordList(BizMonthQrcodeRecord bizMonthQrcodeRecord)
+    {
+        return bizMonthQrcodeRecordMapper.selectBizMonthQrcodeRecordList(bizMonthQrcodeRecord);
+    }
+
+    /**
+     * 新增月结二维码使用记录
+     * 
+     * @param bizMonthQrcodeRecord 月结二维码使用记录
+     * @return 结果
+     */
+    @Override
+    public int insertBizMonthQrcodeRecord(BizMonthQrcodeRecord bizMonthQrcodeRecord)
+    {
+        bizMonthQrcodeRecord.setCreateTime(DateUtils.getNowDate());
+        return bizMonthQrcodeRecordMapper.insertBizMonthQrcodeRecord(bizMonthQrcodeRecord);
+    }
+
+    /**
+     * 修改月结二维码使用记录
+     * 
+     * @param bizMonthQrcodeRecord 月结二维码使用记录
+     * @return 结果
+     */
+    @Override
+    public int updateBizMonthQrcodeRecord(BizMonthQrcodeRecord bizMonthQrcodeRecord)
+    {
+        bizMonthQrcodeRecord.setUpdateTime(DateUtils.getNowDate());
+        return bizMonthQrcodeRecordMapper.updateBizMonthQrcodeRecord(bizMonthQrcodeRecord);
+    }
+
+    /**
+     * 批量删除月结二维码使用记录
+     * 
+     * @param qrcodeIds 需要删除的月结二维码使用记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteBizMonthQrcodeRecordByQrcodeIds(Long[] qrcodeIds)
+    {
+        return bizMonthQrcodeRecordMapper.deleteBizMonthQrcodeRecordByQrcodeIds(qrcodeIds);
+    }
+
+    /**
+     * 删除月结二维码使用记录信息
+     * 
+     * @param qrcodeId 月结二维码使用记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteBizMonthQrcodeRecordByQrcodeId(Long qrcodeId)
+    {
+        return bizMonthQrcodeRecordMapper.deleteBizMonthQrcodeRecordByQrcodeId(qrcodeId);
+    }
+}

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

@@ -10,6 +10,7 @@ import com.lop.open.api.sdk.domain.ECAP.CommonCreateOrderApi.commonCheckPreCreat
 import com.lop.open.api.sdk.domain.ECAP.CommonCreateOrderApi.commonCheckPreCreateOrderV1.Contact;
 import com.lop.open.api.sdk.domain.ECAP.CommonCreateOrderApi.commonCreateOrderV1.CommonCargoInfo;
 import com.lop.open.api.sdk.domain.ECAP.CommonModifyCancelOrderApi.commonCancelOrderV1.CommonOrderCancelRequest;
+import com.lop.open.api.sdk.domain.ECAP.CommonQueryOrderApi.commonGetActualFeeInfoV1.CommonActualFeeRequest;
 import com.lop.open.api.sdk.domain.ECAP.CommonQueryOrderApi.commonGetOrderByMonthSettleQRV1.CommonMonthSettleQRQueryRequest;
 import com.lop.open.api.sdk.domain.ECAP.CommonQueryOrderApi.commonGetOrderInfoV1.CommonOrderInfoRequest;
 import com.lop.open.api.sdk.plugin.LopPlugin;
@@ -19,10 +20,12 @@ import com.lop.open.api.sdk.response.ECAP.*;
 import com.ruoyi.common.core.exception.ServiceException;
 import com.ruoyi.common.core.utils.DateUtils;
 import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.core.utils.bean.BeanUtils;
 import com.ruoyi.logistics.config.JDExpressConfig;
 import com.ruoyi.logistics.constant.JDDictConstants;
 import com.ruoyi.logistics.constant.SysConfigConstants;
 import com.ruoyi.logistics.domain.BizWaybillOrder;
+import com.ruoyi.logistics.response.CommonOrderInfoResponse;
 import com.ruoyi.logistics.service.LogisticsService;
 import com.ruoyi.system.service.ISysConfigService;
 import lombok.extern.slf4j.Slf4j;
@@ -544,7 +547,7 @@ public class JDLogisticsService  implements LogisticsService {
 
     @Override
     public JSONObject queryOrderByQRCode(String qrCode) {
-        log.info("京东开放平台根据二维码查询运单接口,入参:{}", qrCode);
+        log.info("京东开放平台根据二维码查询运单接口,入参:{}", qrCode);
         JSONObject result = new JSONObject();
         try {
             //设置接口域名(有的对接方案同时支持生产和沙箱环境,有的仅支持生产,具体以对接方案中的【API文档-请求地址】为准),生产域名:https://api.jdl.com 预发环境域名:https://uat-api.jdl.com
@@ -566,25 +569,25 @@ public class JDLogisticsService  implements LogisticsService {
             LopPlugin lopPlugin = OAuth2PluginFactory.produceLopPlugin(jdExpressConfig.getAppKey(), jdExpressConfig.getAppSecret(), jdExpressConfig.getAccessToken());
             request.addLopPlugin(lopPlugin);
 
-            log.info("京东开放平台根据二维码查询运单接口,请求参数:{}", JSON.toJSONString(request));
+            log.info("京东开放平台根据二维码查询运单接口,请求参数:{}", JSON.toJSONString(request));
             CommonqueryorderapiCommongetorderbymonthsettleqrv1LopResponse response = client.execute(request);
-            log.info("京东开放平台根据二维码查询运单接口,响应结果:{}", JSON.toJSONString(response));
+            log.info("京东开放平台根据二维码查询运单接口,响应结果:{}", JSON.toJSONString(response));
 
             if (response.getCode().equals("0")) {
                 if (response.getResponse().getCode() == 0) {
                     result.put("success", true);
-                    result.put("msg", response.getResponse().getData().getWaybillQRVerifyInfoList());
+                    result.put("msg", response.getResponse().getData());
                 } else {
                     result.put("success", false);
-                    result.put("msg", "京东开放平台根据二维码查询运单接口!失败原因:" + response.getResponse().getMsg());
+                    result.put("msg", "京东开放平台根据二维码查询运单接口!失败原因:" + response.getResponse().getMsg());
                 }
             } else {
                 result.put("success", false);
-                result.put("msg", "京东开放平台根据二维码查询运单接口!失败原因:" + response.getMsg());
+                result.put("msg", "京东开放平台根据二维码查询运单接口!失败原因:" + response.getMsg());
             }
         } catch (LopException e) {
-            log.error("京东开放平台根据二维码查询运单接口异常:{}", e);
-            throw new ServiceException("京东开放平台根据二维码查询运单接口异常");
+            log.error("京东开放平台根据二维码查询运单接口异常:{}", e);
+            throw new ServiceException("京东开放平台根据二维码查询运单接口异常");
         }
         return result;
     }
@@ -620,7 +623,11 @@ public class JDLogisticsService  implements LogisticsService {
             if (response.getCode().equals("0")) {
                 if (response.getResult().getCode() == 0) {
                     result.put("success", true);
-                    result.put("msg", response.getResult().getData());
+                    JSONObject msgJson = JSON.parseObject(response.getMsg());
+                    JSONObject responseJson = msgJson.getJSONObject("response");
+                    JSONObject contentJson = responseJson.getJSONObject("content");
+                    CommonOrderInfoResponse commonOrderInfoResponse = JSON.parseObject(contentJson.getString("data"), CommonOrderInfoResponse.class);
+                    result.put("msg", commonOrderInfoResponse);
                 } else {
                     result.put("success", false);
                     result.put("msg", "京东开放平台根据运单号查询运单详情接口!失败原因:" + response.getResult().getMsg());
@@ -630,8 +637,55 @@ public class JDLogisticsService  implements LogisticsService {
                 result.put("msg", "京东开放平台根据运单号查询运单详情接口!失败原因:" + response.getMsg());
             }
         } catch (LopException e) {
-            log.error("京东开放平台根据运单号查询运单详情接口:{}", e);
-            throw new ServiceException("京东开放平台获取商家二维码接口异常");
+            log.error("京东开放平台根据运单号查询运单详情接口异常:{}", e);
+            throw new ServiceException("京东开放平台根据运单号查询运单详情接口异常");
+        }
+        return result;
+    }
+
+    @Override
+    public JSONObject queryOrderFeeInfo(String waybillCode) {
+        log.info("京东开放平台根据运单号查询运单费用接口,入参:{}", waybillCode);
+        JSONObject result = new JSONObject();
+        try {
+            //设置接口域名(有的对接方案同时支持生产和沙箱环境,有的仅支持生产,具体以对接方案中的【API文档-请求地址】为准),生产域名:https://api.jdl.com 预发环境域名:https://uat-api.jdl.com
+            //DefaultDomainApiClient对象全局只需要创建一次
+            DefaultDomainApiClient client = new DefaultDomainApiClient(jdExpressConfig.getServerUrl(),500,15000);
+
+            //入参对象
+            EcapV1OrdersActualfeeQueryLopRequest request = new EcapV1OrdersActualfeeQueryLopRequest();
+
+            CommonActualFeeRequest requestDTO = new CommonActualFeeRequest();
+            requestDTO.setCustomerCode(sysConfigService.selectConfigByKey(SysConfigConstants.JD_LOGISTICS_CUSTOMERCODE));
+            requestDTO.setBusinessUnitCode(sysConfigService.selectConfigByKey(SysConfigConstants.JD_LOGISTICS_BUSINESSUNITCODE));
+            requestDTO.setWaybillCode(waybillCode);
+
+            request.setRequest(requestDTO);
+
+            //设置插件,必须的操作,不同类型的应用入参不同,请看入参注释,公共参数按顺序分别为AppKey、AppSecret、AccessToken
+            //使用开放平台ISV/自研商家应用调用接口
+            LopPlugin lopPlugin = OAuth2PluginFactory.produceLopPlugin(jdExpressConfig.getAppKey(), jdExpressConfig.getAppSecret(), jdExpressConfig.getAccessToken());
+            request.addLopPlugin(lopPlugin);
+
+            log.info("京东开放平台根据运单号查询运单费用接口,请求参数:{}", JSON.toJSONString(request));
+            EcapV1OrdersActualfeeQueryLopResponse response = client.execute(request);
+            log.info("京东开放平台根据运单号查询运单费用接口,响应结果:{}", JSON.toJSONString(response));
+
+            if (response.getCode().equals("0")) {
+                if (response.getResult().getCode() == 0) {
+                    result.put("success", true);
+                    result.put("msg", response.getResult().getData());
+                } else {
+                    result.put("success", false);
+                    result.put("msg", "京东开放平台根据运单号查询运单费用接口!失败原因:" + response.getResult().getMsg());
+                }
+            } else {
+                result.put("success", false);
+                result.put("msg", "京东开放平台根据运单号查询运单费用接口!失败原因:" + response.getMsg());
+            }
+        } catch (LopException e) {
+            log.error("京东开放平台根据运单号查询运单费用接口异常:{}", e);
+            throw new ServiceException("京东开放平台根据运单号查询运单费用接口异常");
         }
         return result;
     }

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

@@ -0,0 +1,179 @@
+package com.ruoyi.logistics.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.lop.open.api.sdk.domain.ECAP.CommonQueryOrderApi.commonGetActualFeeInfoV1.CommonActualFeeInfoDetailResponse;
+import com.lop.open.api.sdk.domain.ECAP.CommonQueryOrderApi.commonGetActualFeeInfoV1.CommonActualFeeResponse;
+import com.lop.open.api.sdk.domain.ECAP.CommonQueryOrderApi.commonGetOrderByMonthSettleQRV1.CommonMonthSettleQRQueryResponse;
+import com.lop.open.api.sdk.domain.ECAP.CommonQueryOrderApi.commonGetOrderInfoV1.addedProducts;
+import com.ruoyi.common.core.utils.DateUtils;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.redis.service.RedisIdGenerator;
+import com.ruoyi.common.redis.service.RedisService;
+import com.ruoyi.logistics.constant.RedisCacheConstants;
+import com.ruoyi.logistics.domain.BizFinancialFeeItems;
+import com.ruoyi.logistics.domain.BizWaybillCostDetails;
+import com.ruoyi.logistics.domain.BizWaybillOrder;
+import com.ruoyi.logistics.dto.MonthQRCodeDTO;
+import com.ruoyi.logistics.mapper.BizWaybillCostDetailsMapper;
+import com.ruoyi.logistics.mapper.BizWaybillOrderMapper;
+import com.ruoyi.logistics.response.CommonOrderInfoResponse;
+import com.ruoyi.logistics.service.*;
+import com.ruoyi.system.api.domain.SysDept;
+import com.ruoyi.system.mapper.SysDeptMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class MonthQRCodeTaskServiceImpl implements IMonthQRCodeTaskService {
+
+    @Autowired
+    private RedisService redisService;
+
+    @Autowired
+    private LogisticsOrderService logisticsOrderService;
+
+    @Autowired
+    private FeeItemsCacheService feeItemsCacheService;
+
+    @Autowired
+    private BizWaybillOrderMapper bizWaybillOrderMapper;
+
+    @Autowired
+    private BizWaybillCostDetailsMapper bizWaybillCostDetailsMapper;
+
+    @Autowired
+    private SysDeptMapper sysDeptMapper;
+
+
+    @Autowired
+    private RedisIdGenerator redisIdGenerator;
+
+    @Override
+    public void consumeQRCode() {
+        Collection<String> keys = redisService.keys(RedisCacheConstants.MONTH_QRCODE_CACHE_KEY + "*");
+
+        keys.forEach(key -> {
+            MonthQRCodeDTO monthQRCodeDTO = redisService.getCacheObject(key);
+
+            SysDept sysDept = sysDeptMapper.selectDeptById(monthQRCodeDTO.getDeptId());
+
+            JSONObject waybillCode = logisticsOrderService.queryOrderByQRCode(1, monthQRCodeDTO.getQrCodeContent());
+
+            CommonMonthSettleQRQueryResponse response = JSON.parseObject(waybillCode.getString("msg"), CommonMonthSettleQRQueryResponse.class);
+
+            if (response.getWaybillQRVerifyInfoList() != null && response.getWaybillQRVerifyInfoList().size() > 0) {
+                log.info("用户:{} 扫描了二维码:{}", monthQRCodeDTO.getUserId(), monthQRCodeDTO.getQrCodeContent());
+
+                response.getWaybillQRVerifyInfoList().forEach(waybillQRVerifyInfo -> {
+                    JSONObject orderDetail = logisticsOrderService.queryOrderDetailByWaybillCode(1, waybillQRVerifyInfo.getWaybillCode());
+                    JSONObject orderFeeInfo = logisticsOrderService.queryOrderFeeInfoByWaybillCode(1, waybillQRVerifyInfo.getWaybillCode());
+
+                    CommonOrderInfoResponse orderInfo = (CommonOrderInfoResponse) orderDetail.get("msg");
+                    CommonActualFeeResponse actualFee = JSON.parseObject(orderFeeInfo.getString("msg"), CommonActualFeeResponse.class);
+
+                    BizWaybillOrder bizWaybillOrder = new BizWaybillOrder();
+                    bizWaybillOrder.setWaybillNo(redisIdGenerator.generateUniqueId("RJSD"));
+                    bizWaybillOrder.setExternalWaybillNo(orderInfo.getWaybillCode());
+                    bizWaybillOrder.setOrderType(1);
+//                    bizWaybillOrder.setSenderName(orderInfo.gets());
+//                    bizWaybillOrder.setSenderPhone(orderInfo.getSenderPhone());
+                    bizWaybillOrder.setSenderProvince(orderInfo.getSenderContact().getProvince());
+                    bizWaybillOrder.setSenderCity(orderInfo.getSenderContact().getCity());
+                    bizWaybillOrder.setSenderCounty(orderInfo.getSenderContact().getCounty());
+                    bizWaybillOrder.setSenderAddress(orderInfo.getSenderContact().getTown());
+//                    bizWaybillOrder.setReceiverName(orderInfo.getReceiverName());
+//                    bizWaybillOrder.setReceiverPhone(orderInfo.getReceiverPhone());
+                    bizWaybillOrder.setReceiverProvince(orderInfo.getReceiverContact().getProvince());
+                    bizWaybillOrder.setReceiverCity(orderInfo.getReceiverContact().getCity());
+                    bizWaybillOrder.setReceiverCounty(orderInfo.getReceiverContact().getCounty());
+                    bizWaybillOrder.setReceiverAddress(orderInfo.getReceiverContact().getTown());
+                    bizWaybillOrder.setGoodsName(orderInfo.getCargoes().get(0).getName());
+                    bizWaybillOrder.setGoodsWeight(new BigDecimal(orderInfo.getCargoes().get(0).getWeight()));
+                    bizWaybillOrder.setGoodsVolume(new BigDecimal(orderInfo.getCargoes().get(0).getVolume()));
+                    bizWaybillOrder.setGoodsQty(orderInfo.getCargoes().get(0).getQuantity().longValue());
+                    bizWaybillOrder.setOrderStatus(1);
+                    bizWaybillOrder.setPickupType(1);
+                    bizWaybillOrder.setSendStartTime(new Date(orderInfo.getShipmentInfo().getPickupStartTime()));
+                    bizWaybillOrder.setSendEndTime(new Date(orderInfo.getShipmentInfo().getPickupEndTime()));
+//                    bizWaybillOrder.setPickupTime(new Date(orderInfo.getShipmentInfo().geta()));
+//                    bizWaybillOrder.setDeliveryTime(waybillQRVerifyInfo.getDeliveryTime());
+//                    bizWaybillOrder.setSignTime(waybillQRVerifyInfo.getSignTime());
+                    bizWaybillOrder.setProductCode(orderInfo.getProducts().getProductCode());
+                    bizWaybillOrder.setAddedService(assembleAddedService(orderInfo.getProducts().getAddedProducts()));
+                    bizWaybillOrder.setCreateTime(DateUtils.getNowDate());
+                    bizWaybillOrder.setUserId(monthQRCodeDTO.getUserId());
+                    bizWaybillOrder.setDeptId(monthQRCodeDTO.getDeptId());
+
+                    bizWaybillOrderMapper.insertBizWaybillOrder(bizWaybillOrder);
+
+                    List<BizWaybillCostDetails> details = assembleCostDetails(sysDept, bizWaybillOrder, actualFee.getCommonActualFeeInfoDetails());
+
+                    details.forEach(detail -> {
+                        bizWaybillCostDetailsMapper.insertBizWaybillCostDetails(detail);
+                    });
+                });
+
+
+            }
+        });
+    }
+
+    private List<BizWaybillCostDetails> assembleCostDetails(SysDept sysDept, BizWaybillOrder bizWaybillOrder, List<CommonActualFeeInfoDetailResponse> commonActualFeeInfoDetails) {
+        List<BizWaybillCostDetails> details = new ArrayList<>();
+        commonActualFeeInfoDetails.forEach(item -> {
+            BizWaybillCostDetails costDetail = new BizWaybillCostDetails();
+            costDetail.setWaybillId(bizWaybillOrder.getWaybillId());
+            costDetail.setExternalWaybillNo(bizWaybillOrder.getExternalWaybillNo());
+
+            // 匹配费用类型项
+            BizFinancialFeeItems feeItemByExtFeeCode = feeItemsCacheService.getFeeItemByExtFeeCode(item.getFeeType());
+            if (feeItemByExtFeeCode != null) {
+                costDetail.setFeeItemCode(feeItemByExtFeeCode.getFeeItemCode());
+                costDetail.setFeeItemName(feeItemByExtFeeCode.getFeeItemName());
+                costDetail.setFeeName(item.getFeeTypeName());
+                costDetail.setAmount(item.getMoney());
+                costDetail.setRateAmount(item.getMoney().multiply(new BigDecimal(StringUtils.isNotBlank(sysDept.getRateValue()) ? sysDept.getRateValue() : "1")).setScale(2, BigDecimal.ROUND_HALF_UP));
+                costDetail.setDeptId(bizWaybillOrder.getDeptId());
+                costDetail.setUserId(bizWaybillOrder.getUserId());
+            }
+
+            details.add(costDetail);
+        });
+        return details;
+    }
+
+    private String assembleAddedService(List<addedProducts> addedProducts) {
+        JSONObject addedService = new JSONObject();
+
+        addedService.put("isPack", null);
+        addedService.put("isGuaranteeMoney", null);
+        addedService.put("isReceiptCollect", null);
+
+        List<String> collect = addedProducts.stream().map(com.lop.open.api.sdk.domain.ECAP.CommonQueryOrderApi.commonGetOrderInfoV1.addedProducts::getProductCode).collect(Collectors.toList());
+
+        collect.forEach(item -> {
+            switch (item) {
+                case "ed-a-0011":
+                case "fr-a-0005":
+                    addedService.put("isPack", true);
+                    break;
+                case "ed-a-0002":
+                case "fr-a-0002":
+                    addedService.put("isGuaranteeMoney", true);
+                    break;
+                case "ed-a-0010":
+                case "fr-a-0007":
+                    addedService.put("isReceiptCollect", true);
+            }
+        });
+        return addedService.toJSONString();
+    }
+}

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

@@ -354,4 +354,9 @@ public class SFLogisticsService implements LogisticsService {
     public JSONObject queryOrderDetailByWaybillCode(String waybillCode) {
         return null;
     }
+
+    @Override
+    public JSONObject queryOrderFeeInfo(String waybillCode) {
+        return null;
+    }
 }

+ 69 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/util/QRCodeUtils.java

@@ -0,0 +1,69 @@
+package com.ruoyi.logistics.util;
+
+import cn.hutool.core.img.ImgUtil;
+import cn.hutool.extra.qrcode.QrCodeUtil;
+import cn.hutool.extra.qrcode.QrConfig;
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+/**
+ * 二维码工具类
+ * 
+ * @author RuiJing
+ * @date 2026-02-11
+ */
+public class QRCodeUtils {
+
+    /**
+     * 生成二维码图片并返回字节数组
+     * 
+     * @param content 二维码内容
+     * @param width 二维码宽度
+     * @param height 二维码高度
+     * @return 二维码图片字节数组
+     */
+    public static byte[] generateQRCodeBytes(String content, int width, int height) {
+        // 设置二维码配置
+        QrConfig config = new QrConfig();
+        config.setWidth(width);
+        config.setHeight(height);
+        // 设置容错级别
+        config.setErrorCorrection(ErrorCorrectionLevel.M);
+        // 设置边距
+        config.setMargin(1);
+        
+        // 生成二维码图片
+        BufferedImage image = QrCodeUtil.generate(content, config);
+        
+        // 将BufferedImage转换为字节数组
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        try {
+            ImgUtil.write(image, "png", outputStream);
+            return outputStream.toByteArray();
+        } catch (Exception e) {
+            throw new RuntimeException("生成二维码失败", e);
+        } finally {
+            try {
+                outputStream.close();
+            } catch (IOException e) {
+                // 忽略关闭流的异常
+            }
+        }
+    }
+
+    /**
+     * 生成二维码图片并返回Base64编码字符串
+     * 
+     * @param content 二维码内容
+     * @param width 二维码宽度
+     * @param height 二维码高度
+     * @return Base64编码的二维码图片字符串
+     */
+    public static String generateQRCodeBase64(String content, int width, int height) {
+        byte[] qrCodeBytes = generateQRCodeBytes(content, width, height);
+        return java.util.Base64.getEncoder().encodeToString(qrCodeBytes);
+    }
+}

+ 92 - 0
jd-logistics-modules/jd-logistics-system/src/main/resources/mapper/logistics/BizMonthQrcodeRecordMapper.xml

@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.logistics.mapper.BizMonthQrcodeRecordMapper">
+    
+    <resultMap type="BizMonthQrcodeRecord" id="BizMonthQrcodeRecordResult">
+        <result property="qrcodeId"    column="qrcode_id"    />
+        <result property="qrcodeContent"    column="qrcode_content"    />
+        <result property="userId"    column="user_id"    />
+        <result property="deptId"    column="dept_id"    />
+        <result property="source"    column="source"    />
+        <result property="isVerify"    column="is_verify"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="updateBy"    column="update_by"    />
+    </resultMap>
+
+    <sql id="selectBizMonthQrcodeRecordVo">
+        select qrcode_id, qrcode_content, user_id, dept_id, source, is_verify, create_time, create_by, update_time, update_by from biz_month_qrcode_record
+    </sql>
+
+    <select id="selectBizMonthQrcodeRecordList" parameterType="BizMonthQrcodeRecord" resultMap="BizMonthQrcodeRecordResult">
+        <include refid="selectBizMonthQrcodeRecordVo"/>
+        <where>  
+            <if test="qrcodeContent != null  and qrcodeContent != ''"> and qrcode_content = #{qrcodeContent}</if>
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="deptId != null "> and dept_id = #{deptId}</if>
+            <if test="source != null "> and source = #{source}</if>
+            <if test="isVerify != null "> and is_verify = #{isVerify}</if>
+        </where>
+    </select>
+    
+    <select id="selectBizMonthQrcodeRecordByQrcodeId" parameterType="Long" resultMap="BizMonthQrcodeRecordResult">
+        <include refid="selectBizMonthQrcodeRecordVo"/>
+        where qrcode_id = #{qrcodeId}
+    </select>
+
+    <insert id="insertBizMonthQrcodeRecord" parameterType="BizMonthQrcodeRecord" useGeneratedKeys="true" keyProperty="qrcodeId">
+        insert into biz_month_qrcode_record
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="qrcodeContent != null">qrcode_content,</if>
+            <if test="userId != null">user_id,</if>
+            <if test="deptId != null">dept_id,</if>
+            <if test="source != null">source,</if>
+            <if test="isVerify != null">is_verify,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="updateBy != null">update_by,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="qrcodeContent != null">#{qrcodeContent},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="deptId != null">#{deptId},</if>
+            <if test="source != null">#{source},</if>
+            <if test="isVerify != null">#{isVerify},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+         </trim>
+    </insert>
+
+    <update id="updateBizMonthQrcodeRecord" parameterType="BizMonthQrcodeRecord">
+        update biz_month_qrcode_record
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="qrcodeContent != null">qrcode_content = #{qrcodeContent},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="deptId != null">dept_id = #{deptId},</if>
+            <if test="source != null">source = #{source},</if>
+            <if test="isVerify != null">is_verify = #{isVerify},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+        </trim>
+        where qrcode_id = #{qrcodeId}
+    </update>
+
+    <delete id="deleteBizMonthQrcodeRecordByQrcodeId" parameterType="Long">
+        delete from biz_month_qrcode_record where qrcode_id = #{qrcodeId}
+    </delete>
+
+    <delete id="deleteBizMonthQrcodeRecordByQrcodeIds" parameterType="String">
+        delete from biz_month_qrcode_record where qrcode_id in 
+        <foreach item="qrcodeId" collection="array" open="(" separator="," close=")">
+            #{qrcodeId}
+        </foreach>
+    </delete>
+</mapper>

+ 8 - 0
jd-logistics-ui-v3/src/api/logistics/monthSummary.js

@@ -42,3 +42,11 @@ export function delMonthSummary(summaryId) {
     method: 'delete'
   })
 }
+// 查询财务月度汇总详细
+export function costDetailsList(query) {
+  return request({
+    url: '/system/costDetails/list',
+    method: 'get',
+    params: query
+  })
+}

+ 209 - 118
jd-logistics-ui-v3/src/views/logistics/monthSummary/index.vue

@@ -1,77 +1,34 @@
 <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="100px">
       <el-form-item label="汇总月份" prop="summaryMonth">
-        <el-input
-          v-model="queryParams.summaryMonth"
-          placeholder="请输入汇总月份"
-          clearable
-          @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="应付金额" prop="payableAmount">
-        <el-input
-          v-model="queryParams.payableAmount"
-          placeholder="请输入应付金额"
-          clearable
-          @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="交易笔数" prop="transactionCount">
-        <el-input
-          v-model="queryParams.transactionCount"
-          placeholder="请输入交易笔数"
-          clearable
-          @keyup.enter="handleQuery"
-        />
-      </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 label="百旺开票单据编号" prop="bwDjbh">
-        <el-input
-          v-model="queryParams.bwDjbh"
-          placeholder="请输入百旺开票单据编号"
-          clearable
-          @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="电子发票pdf地址" prop="bwDzfpPdfUrl">
-        <el-input
-          v-model="queryParams.bwDzfpPdfUrl"
-          placeholder="请输入电子发票pdf地址"
-          clearable
-          @keyup.enter="handleQuery"
-        />
+        <el-date-picker
+            v-model="queryParams.summaryMonth"
+            type="month"
+            placeholder="选择月"
+            clearable
+            format="YYYY.MM"
+            value-format="YYYY.MM"
+          @change="handleQuery">
+        </el-date-picker>
       </el-form-item>
-      <el-form-item label="电子发票ofd地址" prop="bwDzfpOfdUrl">
+      <el-form-item label="供应商名称" prop="deptName">
         <el-input
-          v-model="queryParams.bwDzfpOfdUrl"
-          placeholder="请输入电子发票ofd地址"
+          v-model="queryParams.deptName"
+          placeholder="请输入供应商名称"
           clearable
           @keyup.enter="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="电子发票xml地址" prop="bwDzfpXmlUrl">
-        <el-input
-          v-model="queryParams.bwDzfpXmlUrl"
-          placeholder="请输入电子发票xml地址"
-          clearable
-          @keyup.enter="handleQuery"
-        />
+      <el-form-item label="账单状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择">
+          <el-option
+              v-for="item in monthly_report_status"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value">
+          </el-option>
+        </el-select>
       </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@@ -80,35 +37,35 @@
     </el-form>
 
     <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-          type="primary"
-          plain
-          icon="Plus"
-          @click="handleAdd"
-          v-hasPermi="['system:monthSummary:add']"
-        >新增</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="success"
-          plain
-          icon="Edit"
-          :disabled="single"
-          @click="handleUpdate"
-          v-hasPermi="['system:monthSummary:edit']"
-        >修改</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="danger"
-          plain
-          icon="Delete"
-          :disabled="multiple"
-          @click="handleDelete"
-          v-hasPermi="['system:monthSummary:remove']"
-        >删除</el-button>
-      </el-col>
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="primary"-->
+<!--          plain-->
+<!--          icon="Plus"-->
+<!--          @click="handleAdd"-->
+<!--          v-hasPermi="['system:monthSummary:add']"-->
+<!--        >新增</el-button>-->
+<!--      </el-col>-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="success"-->
+<!--          plain-->
+<!--          icon="Edit"-->
+<!--          :disabled="single"-->
+<!--          @click="handleUpdate"-->
+<!--          v-hasPermi="['system:monthSummary:edit']"-->
+<!--        >修改</el-button>-->
+<!--      </el-col>-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="danger"-->
+<!--          plain-->
+<!--          icon="Delete"-->
+<!--          :disabled="multiple"-->
+<!--          @click="handleDelete"-->
+<!--          v-hasPermi="['system:monthSummary:remove']"-->
+<!--        >删除</el-button>-->
+<!--      </el-col>-->
       <el-col :span="1.5">
         <el-button
           type="warning"
@@ -121,26 +78,34 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="monthSummaryList" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="月度汇总id" align="center" prop="summaryId" />
-      <el-table-column label="汇总月份" align="center" prop="summaryMonth" />
+    <el-table v-loading="loading" :data="monthSummaryList">
+<!--      <el-table-column type="selection" width="55" align="center" />-->
+      <el-table-column label="月度汇总id" align="center" prop="summaryId" width="90" />
+      <el-table-column label="汇总月份" align="center" >
+        <template #default="scope">
+          <div class="fontBlue" @click="detailClick(scope.row)">{{scope.row.summaryMonth}}</div>
+        </template>
+      </el-table-column>
       <el-table-column label="应付金额" align="center" prop="payableAmount" />
       <el-table-column label="交易笔数" align="center" prop="transactionCount" />
-      <el-table-column label="账单状态 1.待对账 2.已对账 3.待开票 4.已开票" align="center" prop="status" />
-      <el-table-column label="备注" align="center" prop="remark" />
-      <el-table-column label="部门ID" align="center" prop="deptId" />
+      <el-table-column label="账单状态" align="center" prop="status" >
+        <template #default="scope">
+          <span>{{formatterOptions(monthly_report_status,scope.row.status)}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="供应商" align="center" prop="deptName" />
       <el-table-column label="用户id" align="center" prop="userId" />
       <el-table-column label="百旺开票单据编号" align="center" prop="bwDjbh" />
       <el-table-column label="电子发票pdf地址" align="center" prop="bwDzfpPdfUrl" />
       <el-table-column label="电子发票ofd地址" align="center" prop="bwDzfpOfdUrl" />
       <el-table-column label="电子发票xml地址" align="center" prop="bwDzfpXmlUrl" />
-      <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:monthSummary:edit']">修改</el-button>
-          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:monthSummary:remove']">删除</el-button>
-        </template>
-      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remark" />
+<!--      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="160">-->
+<!--        <template #default="scope">-->
+<!--          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:monthSummary:edit']">修改</el-button>-->
+<!--          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:monthSummary:remove']">删除</el-button>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
     </el-table>
     
     <pagination
@@ -152,10 +117,16 @@
     />
 
     <!-- 添加或修改财务月度汇总对话框 -->
-    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
-      <el-form ref="monthSummaryRef" :model="form" :rules="rules" label-width="80px">
+    <el-dialog :title="title" v-model="open" width="70%" append-to-body>
+      <el-form ref="monthSummaryRef" :model="form" :rules="rules" :inline="true" label-width="160px">
         <el-form-item label="汇总月份" prop="summaryMonth">
-          <el-input v-model="form.summaryMonth" placeholder="请输入汇总月份" />
+          <el-date-picker
+              v-model="form.summaryMonth"
+              type="month"
+              placeholder="选择月"
+              clearable
+              value-format="yyyy-MM">
+          </el-date-picker>
         </el-form-item>
         <el-form-item label="应付金额" prop="payableAmount">
           <el-input v-model="form.payableAmount" placeholder="请输入应付金额" />
@@ -163,13 +134,17 @@
         <el-form-item label="交易笔数" prop="transactionCount">
           <el-input v-model="form.transactionCount" placeholder="请输入交易笔数" />
         </el-form-item>
-        <el-form-item label="备注" prop="remark">
-          <el-input v-model="form.remark" placeholder="请输入备注" />
-        </el-form-item>
-        <el-form-item label="删除标志" prop="delFlag">
-          <el-input v-model="form.delFlag" placeholder="请输入删除标志" />
+        <el-form-item label="账单状态" prop="status">
+          <el-select v-model="form.status" placeholder="请选择">
+            <el-option
+                v-for="item in monthly_report_status"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+            </el-option>
+          </el-select>
         </el-form-item>
-        <el-form-item label="部门ID" prop="deptId">
+        <el-form-item label="供应商名称" prop="deptId">
           <el-input v-model="form.deptId" placeholder="请输入部门ID" />
         </el-form-item>
         <el-form-item label="用户id" prop="userId">
@@ -187,6 +162,9 @@
         <el-form-item label="电子发票xml地址" prop="bwDzfpXmlUrl">
           <el-input v-model="form.bwDzfpXmlUrl" placeholder="请输入电子发票xml地址" />
         </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
       </el-form>
       <template #footer>
         <div class="dialog-footer">
@@ -195,13 +173,70 @@
         </div>
       </template>
     </el-dialog>
+
+<!--    查看-->
+    <el-dialog title="查看" v-model="openDetail" width="80%" append-to-body>
+      <el-form :model="queryParamsCost" ref="queryCostRef" :inline="true" v-show="showSearch" label-width="100px">
+        <el-form-item label="运单号" prop="externalWaybillNo">
+          <el-input
+              v-model="queryParamsCost.externalWaybillNo"
+              placeholder="请输入运单号"
+              clearable
+              @keyup.enter="handleQueryCost"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="Search" @click="handleQueryCost">搜索</el-button>
+          <el-button icon="Refresh" @click="resetQueryCost">重置</el-button>
+        </el-form-item>
+      </el-form>
+      <el-table v-loading="loadingCost" :data="monthSummaryListCost">
+        <el-table-column label="序号" align="center" type="index"></el-table-column>
+        <el-table-column label="日期" align="center" prop="signTime" show-overflow-tooltip />
+        <el-table-column label="运单号码" align="center" prop="externalWaybillNo" show-overflow-tooltip />
+        <el-table-column label="寄件地区" align="center" prop="senderCity" />
+        <el-table-column label="到件地区" align="center" prop="receiverCity" />
+        <el-table-column label="计费重量" align="center" prop="goodsWeight" />
+        <el-table-column label="产品类型" align="center"  >
+          <template #default="scope">
+            <span v-if="scope.row.orderType == 1">{{formatterOptions(jd_logistics_product_code,scope.row.productCode)}}</span>
+            <span v-if="scope.row.orderType == 2">{{formatterOptions(sf_logistics_product_code,scope.row.productCode)}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="付款方式" align="center"  >
+          <template #default="scope">
+            <span>月结</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="费用(元)" align="center" prop="rateAmount" />
+        <el-table-column label="经手人" align="center" prop="userName" />
+        <el-table-column label="增值费用" align="center" prop="feeItemName" />
+        <el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip/>
+      </el-table>
+
+      <pagination
+          v-show="totalCost>0"
+          :total="totalCost"
+          v-model:page="queryParamsCost.pageNum"
+          v-model:limit="queryParamsCost.pageSize"
+          @pagination="getCostDetailsList"
+      />
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="openDetail = false">返 回</el-button>
+        </div>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
 <script setup name="MonthSummary">
-import { listMonthSummary, getMonthSummary, delMonthSummary, addMonthSummary, updateMonthSummary } from "@/api/logistics/monthSummary"
+import { listMonthSummary, getMonthSummary, delMonthSummary, addMonthSummary, updateMonthSummary,costDetailsList } from "@/api/logistics/monthSummary"
 
 const { proxy } = getCurrentInstance()
+const { monthly_report_status } = proxy.useDict("monthly_report_status")
+const { jd_logistics_product_code } = proxy.useDict("jd_logistics_product_code")
+const { sf_logistics_product_code } = proxy.useDict("sf_logistics_product_code")
 
 const monthSummaryList = ref([])
 const open = ref(false)
@@ -227,11 +262,34 @@ const data = reactive({
     bwDjbh: null,
     bwDzfpPdfUrl: null,
     bwDzfpOfdUrl: null,
-    bwDzfpXmlUrl: null
+    bwDzfpXmlUrl: null,
   },
+  monthly_report_status:[],
   rules: {
+    payableAmount: [
+      {
+        pattern: /^\d+(\.\d{1,2})?$/,
+        message: "应付金额必须为数字,且最多保留两位小数",
+        trigger: "blur"
+      }
+    ],
+    transactionCount: [
+      {
+        pattern: /^[1-9]\d*$/,
+        message: "交易笔数必须为正整数",
+        trigger: "blur"
+      }
+    ]
   }
 })
+const openDetail = ref(false);
+const loadingCost = ref(false);
+const monthSummaryListCost = ref([]);
+const totalCost = ref(0);
+const queryParamsCost = ref({
+  pageNum: 1,
+  pageSize: 10,
+})
 
 const { queryParams, form, rules } = toRefs(data)
 
@@ -350,6 +408,39 @@ function handleExport() {
     ...queryParams.value
   }, `monthSummary_${new Date().getTime()}.xlsx`)
 }
+function formatterOptions(options,value){
+  console.log(options,value)
+  const option = options.find(item => item.value === value)
+  return option ? option.label : value
+}
+// 点击月份查看
+function detailClick(row){
+  openDetail.value = true;
+  queryParamsCost.value.summaryMonth = row.summaryMonth;
+  queryParamsCost.value.deptId = row.deptId;
+  getCostDetailsList();
+}
+function getCostDetailsList(row){
+  loadingCost.value = true
 
+  costDetailsList(queryParamsCost.value).then(response => {
+    monthSummaryListCost.value = response.rows
+    totalCost.value = response.total
+    loadingCost.value = false
+  })
+}
+function handleQueryCost(){
+  queryParamsCost.value.pageNum = 1
+  getCostDetailsList()
+}
+function resetQueryCost() {
+  proxy.resetForm("queryCostRef")
+  handleQueryCost()
+}
 getList()
 </script>
+<style scoped>
+.fontBlue{
+  color: #2D71FF;
+}
+</style>

+ 21 - 20
jd-logistics-ui-v3/src/views/logistics/order/personal.vue

@@ -6,44 +6,45 @@
     </div>
 
     <div class="logistics-company-list">
-      <!-- 顺丰物流 -->
-      <div class="company-card" :class="{ 'selected': selectedCompany === 'sf' }" @click="selectCompany('sf')">
+
+      <!-- 京东物流 -->
+      <div class="company-card" :class="{ 'selected': selectedCompany === 'jd' }" @click="selectCompany('jd')">
         <div class="company-header">
-          <div class="company-logo sf-logo">
-            <img src="../../../assets/images/logo-sf.png"/>
+          <div class="company-logo jd-logo">
+            <img src="../../../assets/images/logo-jd.png"/>
           </div>
           <div class="company-name">
-            <h3>顺丰物流</h3>
-            <!--            <el-tag type="success" size="small" class="recommend-tag">推荐</el-tag>-->
+            <h3>京东物流</h3>
           </div>
-          <div class="selection-indicator" v-if="selectedCompany === 'sf'">
-<!--            <el-icon color="#409EFF" size="24">-->
-<!--              <Select />-->
-<!--            </el-icon>-->
+          <div class="selection-indicator" v-if="selectedCompany === 'jd'">
+            <!--            <el-icon color="#409EFF" size="24">-->
+            <!--              <Select />-->
+            <!--            </el-icon>-->
           </div>
         </div>
 
         <div class="company-intro">
-          <span>顺丰物流提供高效、安全、便捷的快递服务,覆盖全国各大城市,支持次日达、隔日达等多种时效选择,是个人寄件的优质选择。</span>
+          <span>京东物流提供快速、可靠的快递服务,依托京东强大的物流网络,覆盖全国各级城市,支持上门取件、快递跟踪等全方位服务,满足个人寄件需求。</span>
         </div>
 
         <div class="company-footer">
-          <el-button type="primary" @click.stop="goToSFWebsite" class="jump-btn">
+          <el-button type="primary" @click.stop="goToJDWebsite" class="jump-btn">
             点击跳转
           </el-button>
         </div>
       </div>
 
-      <!-- 京东物流 -->
-      <div class="company-card" :class="{ 'selected': selectedCompany === 'jd' }" @click="selectCompany('jd')">
+      <!-- 顺丰物流 -->
+      <div class="company-card" :class="{ 'selected': selectedCompany === 'sf' }" @click="selectCompany('sf')">
         <div class="company-header">
-          <div class="company-logo jd-logo">
-            <img src="../../../assets/images/logo-jd.png"/>
+          <div class="company-logo sf-logo">
+            <img src="../../../assets/images/logo-sf.png"/>
           </div>
           <div class="company-name">
-            <h3>京东物流</h3>
+            <h3>顺丰物流</h3>
+            <!--            <el-tag type="success" size="small" class="recommend-tag">推荐</el-tag>-->
           </div>
-          <div class="selection-indicator" v-if="selectedCompany === 'jd'">
+          <div class="selection-indicator" v-if="selectedCompany === 'sf'">
 <!--            <el-icon color="#409EFF" size="24">-->
 <!--              <Select />-->
 <!--            </el-icon>-->
@@ -51,11 +52,11 @@
         </div>
 
         <div class="company-intro">
-          <span>京东物流提供快速、可靠的快递服务,依托京东强大的物流网络,覆盖全国各级城市,支持上门取件、快递跟踪等全方位服务,满足个人寄件需求。</span>
+          <span>顺丰物流提供高效、安全、便捷的快递服务,覆盖全国各大城市,支持次日达、隔日达等多种时效选择,是个人寄件的优质选择。</span>
         </div>
 
         <div class="company-footer">
-          <el-button type="primary" @click.stop="goToJDWebsite" class="jump-btn">
+          <el-button type="primary" @click.stop="goToSFWebsite" class="jump-btn">
             点击跳转
           </el-button>
         </div>

+ 15 - 0
jd_logistics-app/api/mine.js

@@ -0,0 +1,15 @@
+import request from "@/utils/request.js";
+
+
+
+/**
+ * 月结二维码
+ * 
+ */
+export function getQrcode(data) {
+  return request.get('system/front/qrcode', data);
+}
+
+
+
+

+ 1 - 1
jd_logistics-app/api/order.js

@@ -30,7 +30,7 @@ export function payResult(data) {
  * 
  */
 export function getOrderListApi(data) {
-  return request.get('mini/order/list', data);
+  return request.get('system/front/order/list', data);
 }
 /**
  * 查询订单列表

+ 3 - 0
jd_logistics-app/pages.json

@@ -47,6 +47,9 @@
 			{
 				"navigationBarTitleText" : "到付月结码"
 			}
+		},
+		{
+			"path": "pages/about/index"
 		}
 	],
 	"subPackages": [

+ 10 - 3
jd_logistics-app/pages/mine/settlementCode.vue

@@ -13,7 +13,7 @@
 
 		<!-- 二维码邀请内容 -->
 		<view  class="tab-content">
-			<scroll-view scroll-y class="scroll-view">
+			<!-- <scroll-view scroll-y class="scroll-view"> -->
 				<!-- 店铺信息 -->
 				<view class="store-info">
 					<view class="store-name">月结卡号</view>
@@ -66,7 +66,7 @@
 					</view>
 				</view> -->
 			
-			</scroll-view>
+			<!-- </scroll-view> -->
 		</view>
 
 	</view>
@@ -82,6 +82,7 @@
 		onLoad,
 		onShow
 	} from '@dcloudio/uni-app' // 导入 UniApp 的生命周期
+	import {getQrcode} from '@/api/mine.js'
 
 	// 当前选中的tab
 	const currentTab = ref(0)
@@ -105,7 +106,7 @@
 	onLoad((option) => {
 		tenantId.value = option.tenantId
 		inviteType.value = option.inviteType
-		
+		getCode()
 	})
 
 	onShow(() => {
@@ -117,6 +118,12 @@
 		// 	getShopInfo()
 		// }
 	})
+	
+	// 获取月结码
+	const getCode = async () =>{
+		let res = await getQrcode({orderType:inviteType.value});
+		console.log(res)
+	}
 
 	// 切换Tab
 	const switchTab = (index) => {

+ 25 - 2
jd_logistics-app/pages/order/index.vue

@@ -88,7 +88,7 @@
 	const currentTab = ref(0)
 
 	// 订单数据
-	const ordersList = ref([{},{},{},{},{}])
+	const ordersList = ref([])
 
 
 	// 获取状态类名
@@ -114,6 +114,29 @@
 	})
 
 	onShow(() => {
+		
+		uni.setStorageSync('senderAddress',{
+			id: '20',
+			name: '姓名',
+			phone: '13000000000',
+			address: '编辑一下地址',
+			provinceName: '天津市',
+			cityName: '天津市',
+			countyName: '和平区',
+			isDefault: false
+		})
+		uni.setStorageSync('receiverAddress',{
+			id: '30',
+			name: '姓名',
+			phone: '13000000000',
+			address: '编辑一下地址',
+			provinceName: '天津市',
+			cityName: '天津市',
+			countyName: '和平区',
+			isDefault: false
+		})
+		
+		
 		// 可以在这里初始化数据
 		getOrderList(false)
 	})
@@ -134,7 +157,7 @@
 
 	// 获取收益明细列表
 	const getOrderList = async (isLoadMore = false) => {
-		return
+		
 		if (loadState.value) return
 
 		if (!isLoadMore) {