From 2485a4875adda2ffd0e8cfccdf749f15fe8d48cb Mon Sep 17 00:00:00 2001
From: huliguo <2023611923@qq.com>
Date: 星期四, 17 七月 2025 08:47:48 +0800
Subject: [PATCH] bug修改

---
 ruoyi-system/src/main/java/com/ruoyi/system/wx/MD5AndKL.java                          |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/OrderService.java                 |   20 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/QuestionServiceImpl.java     |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/ErrorVO.java                      |    9 
 ruoyi-system/src/main/java/com/ruoyi/system/wx/RefundCallbackResult.java              |   38 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/FinanceController.java      |    4 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java     |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/Qichacha.java                      |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java                 |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/pojo/dto/AppUserPageDTO.java              |    2 
 ruoyi-admin/src/main/resources/application.yml                                        |   17 
 ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/OrderDetailVO.java                |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/OrderMapper.java                   |    2 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java   |   35 
 ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/LicencePageVO.java                |    3 
 ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml                       |   15 
 ruoyi-system/src/main/java/com/ruoyi/system/pojo/dto/FinanceFlowsDTO.java             |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/TaxVO.java                        |   57 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SystemConfigController.java |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java                 |    5 
 ruoyi-system/src/main/resources/mapper/system/OrderMapper.xml                         |  178 ++--
 ruoyi-system/src/main/resources/cert/apiclient_cert.pem                               |   25 
 ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml                       |    2 
 ruoyi-system/src/main/resources/cert/apiclient_cert.p12                               |    0 
 ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java                  |    3 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/IndexController.java        |   21 
 ruoyi-system/src/main/resources/mapper/system/QuestionMapper.xml                      |    8 
 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java    |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/OrderPageVO.java                  |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LicenceServiceImpl.java      |    3 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/QuestionController.java     |    4 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java      |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/ChangeVO.java                     |    9 
 ruoyi-system/src/main/java/com/ruoyi/system/service/QuestionService.java              |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AppUserServiceImpl.java      |    7 
 ruoyi-system/pom.xml                                                                  |   10 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/QuestionMapper.java                |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/QuestionPageVO.java               |    2 
 ruoyi-system/src/main/resources/cert/apiclient_key.pem                                |   28 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OrderServiceImpl.java        |  475 +++++++++++-
 ruoyi-system/src/main/java/com/ruoyi/system/wx/XMLUtil.java                           |   52 +
 ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/InvoiceVO.java                    |   64 +
 ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml                   |    9 
 /dev/null                                                                             |   73 -
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java      |    7 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java      |    2 
 ruoyi-system/src/main/resources/mapper/system/AppUserMapper.xml                       |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/wx/HttpUtil.java                          |   99 ++
 ruoyi-system/src/main/java/com/ruoyi/system/wx/WechatPayService.java                  |  726 +++++++++++++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/wx/PayResult.java                         |   16 
 ruoyi-system/src/main/java/com/ruoyi/system/wx/WechatPayConfig.java                   |   27 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java      |   13 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/OrderController.java        |   59 
 53 files changed, 1,864 insertions(+), 315 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/FinanceController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/FinanceController.java
index 3436c14..d9fb40c 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/FinanceController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/FinanceController.java
@@ -36,8 +36,8 @@
     @PostMapping("/top")
     @ApiOperation(value = "财务流水-顶部")
     @PreAuthorize("@ss.hasPermi('finance:flows')")
-    public R<FinanceFlowsTopVO> top(){
-        return R.ok(orderService.financeTop());
+    public R<FinanceFlowsTopVO> top(@RequestBody FinanceFlowsDTO dto){
+        return R.ok(orderService.financeTop(dto));
     }
 
     /**
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/IndexController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/IndexController.java
index a6d35e9..e782110 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/IndexController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/IndexController.java
@@ -19,6 +19,7 @@
 import javax.annotation.Resource;
 import javax.validation.Valid;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.temporal.ChronoUnit;
 
 @Slf4j
@@ -60,21 +61,25 @@
     @ApiOperation(value = "收入统计-折线图")
     @PreAuthorize("@ss.hasPermi('index:manage')")
     public R<IndexLineChartVO> chart(@RequestParam(required = false, defaultValue = "7") Integer days,
-                                     @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd ") LocalDate startDate,
-                                     @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate) {
+                                     @RequestParam(required = false)  @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime,
+                                     @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime) {
         // 处理日期范围
         LocalDate now = LocalDate.now();
-        if (startDate == null || endDate == null) {
-            startDate = now.minusDays(days - 1);
-            endDate = now;
+        LocalDate start;
+        LocalDate end ;
+        if (startTime == null || endTime == null) {
+            start = now.minusDays(days - 1);
+            end = now;
         } else {
             // 验证日期范围不超过30天
-            long daysBetween = ChronoUnit.DAYS.between(startDate, endDate);
+            long daysBetween = ChronoUnit.DAYS.between(startTime, endTime);
+            start=startTime.toLocalDate();
+            end = endTime.toLocalDate();
             if (daysBetween > 30) {
-                endDate = startDate.plusDays(30);
+                endTime = startTime.plusDays(30);
             }
         }
-        return R.ok(orderService.chart(startDate,endDate));
+        return R.ok(orderService.chart(start,end));
     }
 
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/OrderController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/OrderController.java
index 2fc1507..d69021d 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/OrderController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/OrderController.java
@@ -2,8 +2,6 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.ruoyi.common.core.domain.R;
-import com.ruoyi.common.utils.wx.RefundCallbackResult;
-import com.ruoyi.system.pojo.dto.AppUserPageDTO;
 import com.ruoyi.system.pojo.dto.OrderPageDTO;
 import com.ruoyi.system.pojo.vo.*;
 import com.ruoyi.system.service.OrderService;
@@ -14,9 +12,7 @@
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.io.PrintWriter;
+
 
 @Slf4j
 @RestController
@@ -57,41 +53,41 @@
 
 
     /**
-     * todo redis 企业异常信息
+     *  企业异常信息
      */
     @GetMapping("/error/{id}")
     @ApiOperation(value = "查看详情-企业异常信息")
     @PreAuthorize("@ss.hasPermi('order:manage')")
-    public R<ErrorVO> error(@PathVariable("id") String id) {
-        return R.ok(orderService.error(id));
+    public R error(@PathVariable("id") String id) {
+        return orderService.error(id);
     }
     /**
-     * todo redis 企业变更信息
+     *  企业变更信息
      */
     @GetMapping("/change/{id}")
     @ApiOperation(value = "查看详情-企业变更信息")
     @PreAuthorize("@ss.hasPermi('order:manage')")
-    public R<ChangeVO> change(@PathVariable("id") String id) {
-        return R.ok(orderService.change(id));
+    public R change(@PathVariable("id") String id) {
+        return orderService.change(id);
     }
     /**
-     * todo redis 企业纳税信息
+     *  企业纳税信息
      */
     @GetMapping("/tax/{id}")
     @ApiOperation(value = "查看详情-企业纳税信息")
     @PreAuthorize("@ss.hasPermi('order:manage')")
-    public R<TaxVO> tax(@PathVariable("id") String id) {
-        return R.ok(orderService.tax(id));
+    public R tax(@PathVariable("id") String id) {
+        return orderService.tax(id);
     }
 
     /**
-     * todo redis 企业发票信息
+     * 企业发票信息
      */
     @GetMapping("/invoice/{id}")
-    @ApiOperation(value = "查看详情-企业纳税信息")
+    @ApiOperation(value = "查看详情-企业发票信息")
     @PreAuthorize("@ss.hasPermi('order:manage')")
-    public R<InvoiceVO> invoice(@PathVariable("id") String id) {
-        return R.ok(orderService.invoice(id));
+    public R invoice(@PathVariable("id") String id) {
+        return orderService.invoice(id);
     }
     /**
      *  删除
@@ -127,28 +123,21 @@
         return R.ok();
     }
 
+
     /**
-     * 订单取消支付回退
-     *
-     * @param refundCallbackResult
-     * @param response
+     * 平台取消订单支付回退
      * @return
      */
     @ResponseBody
-    @GetMapping("/refundPayMoneyCallback")
-    public void refundPayMoneyCallback(RefundCallbackResult refundCallbackResult, HttpServletResponse response) {
-        R callback = orderService.refundPayMoneyCallback(refundCallbackResult);
+    @PostMapping("/refundPayMoneyCallback")
+    public String refundPayMoneyCallback(@RequestBody(required = false) String xmlData) {
+        System.out.println("平台取消订单:" + xmlData);
+        R callback = orderService.refundPayMoneyCallback(xmlData);
         if (callback.getCode() == 200) {
-            response.setStatus(200);
-            PrintWriter out = null;
-            try {
-                out = response.getWriter();
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            }
-            out.println("success");
-            out.flush();
-            out.close();
+            return "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
+        }else {
+            System.err.println("支付回退错误:"+callback.getMsg());
+            return "<xml><return_code><![CDATA[FAIL]]></return_code></xml>";
         }
     }
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/QuestionController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/QuestionController.java
index e868390..57ddc84 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/QuestionController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/QuestionController.java
@@ -38,8 +38,8 @@
     public R<IPage<QuestionPageVO>> getQuestionPage(
             @RequestParam(value = "pageNum",defaultValue = "1") Integer pageNum,
             @RequestParam(value = "pageSize",defaultValue = "10") Integer pageSize,
-            @RequestParam(value = "name",required = false) String name) {
-        return R.ok(questionService.getQuestionPage(pageNum,pageSize,name));
+            @RequestParam(value = "title",required = false) String title) {
+        return R.ok(questionService.getQuestionPage(pageNum,pageSize,title));
     }
 
     /**
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
index 92ec449..4cbdfd5 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -48,6 +48,8 @@
     @Autowired
     private TokenService tokenService;
 
+
+
     @Autowired
     private ISysConfigService configService;
 
@@ -74,7 +76,7 @@
      * 
      * @return 用户信息
      */
-    @GetMapping("getInfo")
+    @GetMapping("/getInfo")
     public AjaxResult getInfo()
     {
         LoginUser loginUser = SecurityUtils.getLoginUser();
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java
index f6d7bce..0455aae 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java
@@ -1,7 +1,15 @@
 package com.ruoyi.web.controller.system;
 
+import java.awt.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.ruoyi.common.core.domain.entity.SysMenu;
+import com.ruoyi.system.mapper.SysMenuMapper;
 import com.ruoyi.system.pojo.dto.UpdatePwdDTO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -48,6 +56,8 @@
 
     @Autowired
     private TokenService tokenService;
+    @Autowired
+    private SysMenuMapper sysMenuMapper;
 
     /**
      * 个人信息
@@ -61,8 +71,33 @@
         AjaxResult ajax = AjaxResult.success(user);
         ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername()));
         ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername()));
+        ajax.put("permissions" ,getUserPaths(user.getUserId()));
         return ajax;
     }
+    /**
+     * 获取用户拥有的所有path
+     * @param userId 用户ID
+     * @return 用户拥有的所有path列表
+     */
+    public List<String> getUserPaths(Long userId) {
+        List<Long> ids = new ArrayList<>();
+        // 根据用户id查询出menus
+        List<SysMenu> menus = sysMenuMapper.selectMenusByUserId(userId);
+        //将id和父类id取出
+        menus.forEach(menu -> {
+            ids.add(menu.getMenuId());
+           if (null!= menu.getParentId() && menu.getParentId() != 0) {
+               ids.add(menu.getParentId());
+           }
+        });
+
+        if (menus.isEmpty()) {
+            return Collections.emptyList();
+        }
+
+
+        return sysMenuMapper.getPathsByMenuIds(ids);
+    }
 
     /**
      * 修改用户
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
index 4b00660..a1233d6 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
@@ -327,7 +327,7 @@
         // 更新缓存用户权限
         LoginUser loginUser = getLoginUser();
         if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin()) {
-            loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName()));
+            loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getPhonenumber()));
             loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser()));
             tokenService.setLoginUser(loginUser);
         }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
index 500ad3d..c491a36 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
@@ -270,9 +270,9 @@
     @GetMapping("/page/list")
     public R<IPage<SysUserPageListVO>> getSysUserPageList(@RequestParam("pageNum")Integer pageNum,
                                                           @RequestParam("pageSize")Integer pageSize,
-                                                          @RequestParam("nickName")String nickName,
-                                                          @RequestParam("phone")Integer phone,
-                                                          @RequestParam("status")String status) {
+                                                          @RequestParam(value = "nickName",required = false)String nickName,
+                                                          @RequestParam(value = "phone",required = false)Integer phone,
+                                                          @RequestParam(value = "status",required = false)String status) {
         IPage<SysUserPageListVO> page=new Page<>(pageNum,pageSize);
         return R.ok(userService.getSysUserPageList(page,nickName,phone,status));
     }
@@ -310,7 +310,7 @@
     /**
      * 新增
      */
-    @ApiOperation(value = "账号管理-查看详情(回显)", tags = "系统后台-权限管理")
+    @ApiOperation(value = "账号管理-新增", tags = "系统后台-权限管理")
     @PreAuthorize("@ss.hasPermi('permission:account')")
     @Log(title = "账号管理", businessType = BusinessType.INSERT)
     @PostMapping("/add")
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SystemConfigController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SystemConfigController.java
index d7af45d..7ea4d58 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SystemConfigController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SystemConfigController.java
@@ -34,7 +34,7 @@
      * 系统配置-查看
      */
     @GetMapping("/getSystemConfigByType")
-    @ApiOperation(value = "根据类型获取配置内容")
+    @ApiOperation(value = "根据类型获取配置内容(1-启动页 2-客服 3-抽单)")
     public R<SystemConfigVO> getSystemConfigByType(@RequestParam(value = "type") Integer type) {
         return R.ok(systemConfigService.getSystemConfigByType(type));
     }
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 5237ad1..39812b1 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -16,7 +16,7 @@
 # 开发环境配置
 server:
   # 服务器的HTTP端口,默认为8080
-  port: 8081
+  port: 8084
   servlet:
     # 应用的访问路径
     context-path: /
@@ -94,8 +94,8 @@
   header: Authorization
   # 令牌密钥
   secret: abcdefghijklmnopqrstuvwxyz
-  # 令牌有效期(默认30分钟)
-  expireTime: 30
+  # 令牌有效期(默认72000分钟)
+  expireTime: 72000
 
 # MyBatis配置
 mybatis:
@@ -117,7 +117,7 @@
   # 是否开启swagger
   enabled: true
   # 请求前缀
-  pathMapping: /dev-api
+  pathMapping:
 
 # 防止XSS攻击
 xss:
@@ -127,3 +127,12 @@
   excludes: /system/notice
   # 匹配链接
   urlPatterns: /system/*,/monitor/*,/tool/*
+
+wx:
+  appid: wx180c41e1915992e8
+  appletsAppSecret: 8c6cc3410891d3096988b92c154ba5e9
+  mchId: 1720552698
+  key: 5Kb8zX9qR3r4D7Yw3vHnJgLp6sA4cE1M
+  callbackPath: http://221.182.45.100:8084
+  certPath: classpath:cert/apiclient_cert.p12
+  RASPath:
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java
index 7bcc2ea..b729d93 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java
@@ -178,11 +178,12 @@
     }
 
     public static void main(String[] args) {
+        System.out.println("19923261698".substring(5, 11));
         String hash = Md5Utils.hash("123456");
         System.out.println(hash);
         System.out.println(encryptPassword(hash));
 
-        System.out.println(matchesPassword(hash, "$2a$10$VhdvkOtOTUq1NndvwPC36./D9bPVhDJWbt.tVWtGdqW3.sA07Ikx."));
+        System.out.println(matchesPassword(hash, "$2a$10$rk6XzddjDljPCCTghplExe2rgcLCJHVEEOAOuUaHalsIp/FCWObkG"));
     }
 
 }
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/CloseOrderResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/CloseOrderResult.java
deleted file mode 100644
index 1d9b0c6..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/CloseOrderResult.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.ruoyi.common.utils.wx;
-
-import lombok.Data;
-
-@Data
-public class CloseOrderResult {
-	/**
-	 * 商户编号
-	 */
-	private String r1_MerchantNo;
-	/**
-	 * 业务结果 100:成功,101:失败
-	 */
-	private String ra_Status;
-	/**
-	 * 响应码
-	 * 0 系统连接超时
-	 * 4 服务不可用
-	 * 100 关单成功
-	 * 101 失败,详见响应码描述
-	 * 10080000 系统异常
-	 * 10080002 验证签名失败
-	 * 10080003 订单号不正确
-	 * 10080042 交易类型不合法
-	 * 10083001 订单正在处理中
-	 * 10083002 该订单请求多次交易
-	 * 10083003 订单已关闭,无需关单操作
-	 * 10083003 交易成功,无需关单操作
-	 * 10083004 通道系统异常,请用相同参数重新请求
-	 * 10083005 通道其他异常信息
-	 */
-	private String rb_Code;
-	/**
-	 * 响应码描述
-	 */
-	private String rc_CodeMsg;
-	/**
-	 * 签名数据
-	 */
-	private String hmac;
-}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/FrpCodeEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/FrpCodeEnum.java
deleted file mode 100644
index 63d9321..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/FrpCodeEnum.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.ruoyi.common.utils.wx;
-
-public enum FrpCodeEnum {
-	ALIPAY_NATIVE("支付宝扫码(主扫)", "ALIPAY_NATIVE"),
-	ALIPAY_CARD("支付宝刷卡(被扫)", "ALIPAY_CARD"),
-	ALIPAY_H5("支付宝 H5", "ALIPAY_H5"),
-	ALIPAY_FWC("支付宝服务窗", "ALIPAY_FWC"),
-	ALIPAY_SYT("支付宝收银台", "ALIPAY_SYT"),
-	WEIXIN_NATIVE("微信扫码(主扫)", "WEIXIN_NATIVE"),
-	WEIXIN_CARD("微信刷卡(被扫)", "WEIXIN_CARD"),
-	WEIXIN_APP3("微信 APP+支付", "WEIXIN_APP3"),
-	WEIXIN_H5_PLUS("微信 H5 支付", "WEIXIN_H5_PLUS"),
-	WEIXIN_GZH("微信公众号支付", "WEIXIN_GZH"),
-	WEIXIN_XCX("微信小程序支付", "WEIXIN_XCX"),
-	QQ_NATIVE("QQ 扫码(主扫)", "QQ_NATIVE"),
-	QQ_CARD("QQ 刷卡(被扫)", "QQ_CARD"),
-	QQ_APP("QQ APP 支付", "QQ_APP"),
-	QQ_H5("QQH5 支付", "QQ_H5"),
-	QQ_GZH("QQ 公众号支付", "QQ_GZH"),
-	UNIONPAY_NATIVE("银联扫码(主扫)", "UNIONPAY_NATIVE"),
-	UNIONPAY_CARD("银联刷卡(被扫)", "UNIONPAY_CARD"),
-	UNIONPAY_APP("银联 APP 支付", "UNIONPAY_APP"),
-	UNIONPAY_H5("银联 H5", "UNIONPAY_H5"),
-	UNIONPAY_SYT("银联统一收银台", "UNIONPAY_SYT"),
-	UNIONPAY_WXMP("银联云微小程序(无感支付)", "UNIONPAY_WXMP")
-	;
-	
-	private String name;
-	
-	private String code;
-	
-	FrpCodeEnum(String name, String code) {
-		this.name = name;
-		this.code = code;
-	}
-	
-	public String getName() {
-		return name;
-	}
-	
-	public void setName(String name) {
-		this.name = name;
-	}
-	
-	public String getCode() {
-		return code;
-	}
-	
-	public void setCode(String code) {
-		this.code = code;
-	}
-}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/PaymentUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/PaymentUtil.java
deleted file mode 100644
index c33c581..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/PaymentUtil.java
+++ /dev/null
@@ -1,286 +0,0 @@
-package com.ruoyi.common.utils.wx;
-
-import cn.hutool.http.Header;
-import cn.hutool.http.HttpRequest;
-import cn.hutool.http.HttpResponse;
-import cn.hutool.http.HttpUtil;
-import com.alibaba.fastjson2.JSON;
-import com.alibaba.fastjson2.JSONObject;
-import com.ruoyi.common.utils.StringUtils;
-import lombok.extern.slf4j.Slf4j;
-
-import java.util.*;
-
-@Slf4j
-public class PaymentUtil {
-	
-	//todo 商户号配置  微信公众号、微信小程序、微信 APP+/H5、云微小程序支付
-	private static final String appId = "";
-	/**
-	 * 商户密钥
-	 */
-	private static final String key = "";
-	/**
-	 * 商户号
-	 */
-	private static final String merchantNo = "";
-	/**
-	 * 平台-报备商户号
-	 */
-	private static final String sysTradeMerchantNo = "";
-	/**
-	 * 支付回调地址
-	 */
-	private static final String callbackUrl = "";
-	
-	
-	/**
-	 * 支付
-	 * @param orderNo           商户订单号
-	 * @param amount            订单金额
-	 * @param productName       商品名称
-	 * @param productDesc       商品描述
-	 * @param mp                公用回传参数
-	 * @param notifyUrl         服务器异步通知地址
-	 * @param openId            微信 Openid
-	 * @param tradeMerchantNo   报备商户号
-	 * @return
-	 */
-	public static UniPayResult uniPay(String orderNo, Double amount, String productName, String productDesc, String mp, String notifyUrl, String openId, String tradeMerchantNo){
-		String url = "https://trade.joinpay.com/tradeRt/uniPay";
-		HttpRequest post = HttpUtil.createPost(url);
-		post.header(Header.CONTENT_TYPE, "application/x-www-form-urlencoded");
-		JSONObject body = new JSONObject();
-		//版本号
-		body.put("p0_Version", "2.5");
-		//商户编号
-		body.put("p1_MerchantNo", merchantNo);
-		//商户订单号
-		body.put("p2_OrderNo", orderNo);
-		//订单金额
-		body.put("p3_Amount", amount);
-		//交易币种
-		body.put("p4_Cur", "1");
-		//商品名称
-		body.put("p5_ProductName", productName);
-		//商品描述
-		body.put("p6_ProductDesc", productDesc);
-		//公用回传参数
-		body.put("p7_Mp", mp);
-		//服务器异步通知地址
-		body.put("p9_NotifyUrl", callbackUrl + notifyUrl);
-		//交易类型
-		body.put("q1_FrpCode", FrpCodeEnum.WEIXIN_XCX.getCode());
-		//微信 Openid
-		body.put("q5_OpenId", openId);
-		//APPID
-		body.put("q7_AppId", appId);
-		//报备商户号
-		body.put("qa_TradeMerchantNo", StringUtils.isNotEmpty(tradeMerchantNo) ? tradeMerchantNo : sysTradeMerchantNo);
-		String sign = null;
-		try {
-			sign = sign(body);
-		} catch (Exception e) {
-			throw new RuntimeException(e);
-		}
-		body.put("hmac", sign);
-		post.form(body);
-		log.info("支付接口请求参数:" + body);
-		HttpResponse execute = post.execute();
-		log.info("支付接口请求响应:" + execute.body());
-		if(200 != execute.getStatus()){
-			log.error("支付接口异常:" + execute.body());
-			return null;
-		}
-		UniPayResult uniPayResult = JSON.parseObject(execute.body(), UniPayResult.class);
-		return uniPayResult;
-	}
-	
-	
-	/**
-	 * 查询支付订单
-	 * @param orderNo   订单号
-	 * @return
-	 */
-	public static QueryOrderResult queryOrder(String orderNo){
-		String url = "https://trade.joinpay.com/tradeRt/queryOrder";
-		HttpRequest post = HttpUtil.createPost(url);
-		post.header(Header.CONTENT_TYPE, "application/x-www-form-urlencoded");
-		JSONObject body = new JSONObject();
-		//版本号
-		body.put("p0_Version", "2.5");
-		//商户编号
-		body.put("p1_MerchantNo", merchantNo);
-		//商户订单号
-		body.put("p2_OrderNo", orderNo);
-		String sign = null;
-		try {
-			sign = sign(body);
-		} catch (Exception e) {
-			throw new RuntimeException(e);
-		}
-		body.put("hmac", sign);
-		post.form(body);
-		log.info("查询支付接口请求参数:" + body);
-		HttpResponse execute = post.execute();
-		log.info("查询支付接口请求响应:" + execute.body());
-		if(200 != execute.getStatus()){
-			log.error("查询支付接口异常:" + execute.body());
-			return null;
-		}
-		QueryOrderResult uniPayResult = JSON.parseObject(execute.body(), QueryOrderResult.class);
-		return uniPayResult;
-	}
-	
-	
-	/**
-	 * 退款
-	 * @param orderNo           支付订单号
-	 * @param refundOrderNo     退款订单号
-	 * @param refundAmount      退款金额
-	 * @param notifyUrl         异步通知地址
-	 * @return
-	 */
-	public static RefundResult refund(String orderNo, String refundOrderNo, Double refundAmount, String notifyUrl){
-		String url = "https://trade.joinpay.com/tradeRt/refund";
-		HttpRequest post = HttpUtil.createPost(url);
-		post.header(Header.CONTENT_TYPE, "application/x-www-form-urlencoded");
-		JSONObject body = new JSONObject();
-		//版本号
-		body.put("p0_Version", "2.3");
-		//商户编号
-		body.put("p1_MerchantNo", merchantNo);
-		//商户订单号
-		body.put("p2_OrderNo", orderNo);
-		//商户退款订单号
-		body.put("p3_RefundOrderNo", refundOrderNo);
-		//退款金额
-		body.put("p4_RefundAmount", refundAmount);
-		//服务器异步通知地址
-		body.put("p6_NotifyUrl", callbackUrl + notifyUrl);
-		String sign = null;
-		try {
-			sign = sign(body);
-		} catch (Exception e) {
-			throw new RuntimeException(e);
-		}
-		body.put("hmac", sign);
-		post.form(body);
-		log.info("退款接口请求参数:" + body);
-		HttpResponse execute = post.execute();
-		log.info("退款接口请求响应:" + execute.body());
-		if(200 != execute.getStatus()){
-			log.error("退款接口异常:" + execute.body());
-			return null;
-		}
-		RefundResult uniPayResult = JSON.parseObject(execute.body(), RefundResult.class);
-		return uniPayResult;
-	}
-	
-	
-	/**
-	 * 查询退款订单
-	 * @param refundOrderNo 退款订单号
-	 * @return
-	 */
-	public static QueryRefundResult queryRefund(String refundOrderNo){
-		String url = "https://trade.joinpay.com/tradeRt/refund";
-		HttpRequest post = HttpUtil.createPost(url);
-		post.header(Header.CONTENT_TYPE, "application/x-www-form-urlencoded");
-		JSONObject body = new JSONObject();
-		//版本号
-		body.put("p0_Version", "2.3");
-		//商户编号
-		body.put("p1_MerchantNo", merchantNo);
-		//商户退款订单号
-		body.put("p2_RefundOrderNo", refundOrderNo);
-		String sign = null;
-		try {
-			sign = sign(body);
-		} catch (Exception e) {
-			throw new RuntimeException(e);
-		}
-		body.put("hmac", sign);
-		post.form(body);
-		log.info("退款接口请求参数:" + body);
-		HttpResponse execute = post.execute();
-		log.info("退款接口请求响应:" + execute.body());
-		if(200 != execute.getStatus()){
-			log.error("退款接口异常:" + execute.body());
-			return null;
-		}
-		QueryRefundResult uniPayResult = JSON.parseObject(execute.body(), QueryRefundResult.class);
-		return uniPayResult;
-	}
-	
-	
-	/**
-	 * 关闭订单(仅支持微信和支付宝)
-	 * @param orderNo   订单号
-	 * @return
-	 */
-	public static CloseOrderResult closeOrder(String orderNo){
-		String url = "https://www.joinpay.com/trade/closeOrder.action";
-		HttpRequest post = HttpUtil.createPost(url);
-		post.header(Header.CONTENT_TYPE, "application/x-www-form-urlencoded");
-		JSONObject body = new JSONObject();
-		//商户编号
-		body.put("p1_MerchantNo", merchantNo);
-		//商户订单号
-		body.put("p2_OrderNo", orderNo);
-		//交易类型
-		body.put("p3_FrpCode", FrpCodeEnum.WEIXIN_XCX.getCode());
-		String sign = null;
-		try {
-			sign = sign(body);
-		} catch (Exception e) {
-			throw new RuntimeException(e);
-		}
-		body.put("hmac", sign);
-		post.form(body);
-		log.info("关闭订单接口请求参数:" + body);
-		HttpResponse execute = post.execute();
-		log.info("关闭订单接口请求响应:" + execute.body());
-		if(200 != execute.getStatus()){
-			log.error("关闭订单接口异常:" + execute.body());
-			return null;
-		}
-		CloseOrderResult uniPayResult = JSON.parseObject(execute.body(), CloseOrderResult.class);
-		return uniPayResult;
-	}
-	
-	
-	
-	public static String sign(JSONObject body) {
-		Set<Map.Entry<String, Object>> entries = body.entrySet();
-		List<Map.Entry<String, Object>> infoIds = new ArrayList<Map.Entry<String, Object>>(entries);
-		// 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)
-		Collections.sort(infoIds, new Comparator<Map.Entry<String, Object>>() {
-			public int compare(Map.Entry<String, Object> o1, Map.Entry<String, Object> o2) {
-				return (o1.getKey()).compareTo(o2.getKey());
-			}
-		});
-		// 构造签名键值对的格式
-		StringBuilder sb = new StringBuilder();
-		for (Map.Entry<String, Object> item : infoIds) {
-			if (item.getKey() != null || item.getKey() != "") {
-				Object val = item.getValue();
-				if (!(val == "" || val == null)) {
-					sb.append(val);
-				}
-			}
-		}
-		sb.append(key);
-		log.info("待签名串:{}", sb.toString());
-		return MD5AndKL.MD5(sb.toString());
-	}
-	
-	
-	public static void main(String[] args) {
-//		UniPayResult uniPayResult = PaymentUtil.uniPay("852963742", 0.01D, "测试商品", "这是用于对接支付测试的商品描述",
-//				"", "/order/shopping-cart/shoppingCartPaymentCallback", "ooOrs64zHLuInkZ_GF0LpIN9_Rxc", "777168500885852");
-//		PaymentUtil.queryOrder("852963742");
-//		PaymentUtil.closeOrder("852963742");
-		
-	}
-}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/QueryOrderResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/QueryOrderResult.java
deleted file mode 100644
index 5909fae..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/QueryOrderResult.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package com.ruoyi.common.utils.wx;
-
-import lombok.Data;
-
-@Data
-public class QueryOrderResult {
-	/**
-	 * 版本号
-	 */
-	private Double r0_Version;
-	/**
-	 * 商户编号
-	 */
-	private String r1_MerchantNo;
-	/**
-	 * 商户订单号
-	 */
-	private String r2_OrderNo;
-	/**
-	 * 支付金额
-	 */
-	private Double r3_Amount;
-	/**
-	 * 商品名称
-	 */
-	private String r4_ProductName;
-	/**
-	 * 交易流水号
-	 */
-	private String r5_TrxNo;
-	/**
-	 * 银行流水号
-	 */
-	private String r6_BankTrxNo;
-	/**
-	 * 订单手续费
-	 */
-	private Double r7_Fee;
-	/**
-	 * 交易类型
-	 */
-	private String r8_FrpCode;
-	/**
-	 * 订单状态 100:成功,101:失败,102:已创建,105:订单已关闭
-	 */
-	private String ra_Status;
-	/**
-	 * 响应码
-	 */
-	private String rb_Code;
-	/**
-	 * 响应码描述
-	 */
-	private String rc_CodeMsg;
-	/**
-	 * 用户标识
-	 */
-	private String rd_OpenId;
-	/**
-	 * 平台优惠金额
-	 */
-	private Double re_DiscountAmount;
-	/**
-	 * 支付时间
-	 */
-	private String rf_PayTime;
-	/**
-	 * 卡类型
-	 */
-	private String rh_cardType;
-	/**
-	 * 银行编码
-	 */
-	private String rj_BankCode;
-	/**
-	 * 签约 ID
-	 */
-	private String rl_ContractId;
-	/**
-	 * 签名数据
-	 */
-	private String hmac;
-}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/QueryRefundResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/QueryRefundResult.java
deleted file mode 100644
index a6910ad..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/QueryRefundResult.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.ruoyi.common.utils.wx;
-
-import lombok.Data;
-
-@Data
-public class QueryRefundResult {
-	/**
-	 * 版本号
-	 */
-	private Double r0_Version;
-	/**
-	 * 商户编号
-	 */
-	private String r1_MerchantNo;
-	/**
-	 * 商户退款订单号
-	 */
-	private String r2_RefundOrderNo;
-	/**
-	 * 退款金额
-	 */
-	private Double r3_RefundAmount;
-	/**
-	 * 退款流水号
-	 */
-	private String r4_RefundTrxNo;
-	/**
-	 * 退款完成时间
-	 */
-	private String r5_RefundCompleteTime;
-	/**
-	 * 退款渠道
-	 */
-	private String r8_RefundWay;
-	/**
-	 * 退款入账账户
-	 */
-	private String r9_ReceiveAccountNo;
-	/**
-	 * 退款状态
-	 * 100:退款成功
-	 * 101:退款失败
-	 * 102:退款处理中
-	 */
-	private String ra_Status;
-	/**
-	 * 响应码
-	 */
-	private String rb_Code;
-	/**
-	 * 响应码描述
-	 */
-	private String rc_CodeMsg;
-	/**
-	 * 签名数据
-	 */
-	private String hmac;
-}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/RefundCallbackResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/RefundCallbackResult.java
deleted file mode 100644
index 270c7e5..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/RefundCallbackResult.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package com.ruoyi.common.utils.wx;
-
-import lombok.Data;
-
-@Data
-public class RefundCallbackResult {
-	/**
-	 * 版本号
-	 */
-	private Double r0_Version;
-	/**
-	 * 商户编号
-	 */
-	private String r1_MerchantNo;
-	/**
-	 * 商户订单号
-	 */
-	private String r2_OrderNo;
-	/**
-	 * 商户退款订单号
-	 */
-	private String r3_RefundOrderNo;
-	/**
-	 * 退款金额
-	 */
-	private Double r4_RefundAmount;
-	/**
-	 * 商户退款流水号
-	 */
-	private String r5_RefundTrxNo;
-	/**
-	 * 退款完成时间
-	 */
-	private String r6_RefundCompleteTime;
-	/**
-	 * 退款渠道
-	 */
-	private String r7_RefundWay;
-	/**
-	 * 退款入账账户
-	 */
-	private String r8_ReceiveAccountNo;
-	/**
-	 * 退款状态 100:成功;101:失败
-	 */
-	private String ra_Status;
-	/**
-	 * 响应码
-	 */
-	private String rb_Code;
-	/**
-	 * 响应码描述
-	 */
-	private String rc_CodeMsg;
-	/**
-	 * 签名数据
-	 */
-	private String hmac;
-}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/RefundResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/RefundResult.java
deleted file mode 100644
index e1a4e59..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/RefundResult.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.ruoyi.common.utils.wx;
-
-import lombok.Data;
-
-@Data
-public class RefundResult {
-	/**
-	 * 版本号
-	 */
-	private Double r0_Version;
-	/**
-	 * 商户编号
-	 */
-	private String r1_MerchantNo;
-	/**
-	 * 商户订单号
-	 */
-	private String r2_OrderNo;
-	/**
-	 * 商户退款订单号
-	 */
-	private String r3_RefundOrderNo;
-	/**
-	 * 退款金额
-	 */
-	private Double r4_RefundAmount;
-	/**
-	 * 商户退款流水号
-	 */
-	private String r5_RefundTrxNo;
-	/**
-	 * 退款申请状态
-	 * 100:成功,
-	 * 101:失败 。
-	 */
-	private String ra_Status;
-	/**
-	 * 响应码
-	 */
-	private String rb_Code;
-	/**
-	 * 响应码描述
-	 */
-	private String rc_CodeMsg;
-	/**
-	 * 营销退款金额
-	 */
-	private Double rd_MarketRefAmount;
-	/**
-	 * 签名数据
-	 */
-	private String hmac;
-	
-	
-}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/UniPayResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/UniPayResult.java
deleted file mode 100644
index 49fafd4..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/UniPayResult.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package com.ruoyi.common.utils.wx;
-
-import lombok.Data;
-
-@Data
-public class UniPayResult {
-	/**
-	 * 版本号
-	 */
-	private Double r0_Version;
-	/**
-	 * 商户编号
-	 */
-	private String r1_MerchantNo;
-	/**
-	 * 商户订单号
-	 */
-	private String r2_OrderNo;
-	/**
-	 * 支付金额
-	 */
-	private Double r3_Amount;
-	/**
-	 * 币种
-	 */
-	private String r4_Cur;
-	/**
-	 * 公用回传参数
-	 */
-	private String r5_Mp;
-	/**
-	 * 交易类型
-	 */
-	private String r6_FrpCode;
-	/**
-	 * 交易流水号
-	 */
-	private String r7_TrxNo;
-	/**
-	 * 银行商户编码
-	 */
-	private String r8_MerchantBankCode;
-	/**
-	 * 响应码,返回 100 时表示成功
-	 */
-	private String ra_Code;
-	/**
-	 * 响应码描述
-	 */
-	private String rb_CodeMsg;
-	/**
-	 * 1.主扫支付返回二维码地址。
-	 * 2.支付宝 H5,mode1/2/3 参考请求参数q9_TransactionModel 说明。
-	 * 3.微信 H5_PLUS,获取支付信息的 openlink,通过手机端浏览器跳转并唤起微信 APP客户端,直接打开对应的小程序进行支付。
-	 * 3.公众号支付:需要商户参考微信的官方文档 JSAPI 支付接口进行处理,详情请见:https://pay.weixin.qq.com/wiki/doc/api/index.html
-	 * 4.微信小程序支付返回支付信息。
-	 * 5.支付宝收银台返回支付宝收银台跳转链接,通过请求该链接跳转至支付宝。
-	 * 6.微信 app3 支付,返回预支付信息,集成微信 SDK 唤起小程序进行支付。
-	 * 7.支付宝服务窗支付返回银联交易号 trade_no,可用以唤起支付宝 APP,调起支付宝APP 收银台。
-	 * 8.银联 app 或银联统一收银台支付,返回预支付信息用此网址的接口调起支付。https://open.unionpay.com/tjweb/acproduct/list?apiservId=450#nav02
-	 * 9.银联云微小程序返回跳转地址,格式:{“cqpMpAppId”:”云闪付小程序 id”,”cqpMpPath”:”云闪付小程序 path”}
-	 * 10.其他类型支付返回支付信息。
-	 */
-	private String rc_Result;
-	/**
-	 * 二维码图片码
-	 */
-	private String rd_Pic;
-	/**
-	 * 签名数据
-	 */
-	private String hmac;
-}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
index fe16427..0d58f07 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -29,6 +29,8 @@
 import com.ruoyi.system.service.ISysConfigService;
 import com.ruoyi.system.service.ISysUserService;
 
+import java.util.List;
+
 /**
  * 登录校验方法
  * 
diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml
index c095fca..8eda2e6 100644
--- a/ruoyi-system/pom.xml
+++ b/ruoyi-system/pom.xml
@@ -22,6 +22,16 @@
             <groupId>com.ruoyi</groupId>
             <artifactId>ruoyi-common</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk15on</artifactId>
+            <version>1.70</version>
+        </dependency>
+        <dependency>
+            <groupId>dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+            <version>1.6.1</version>
+        </dependency>
 
     </dependencies>
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/Qichacha.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/Qichacha.java
index 048be72..c196e80 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/Qichacha.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/Qichacha.java
@@ -1,9 +1,12 @@
 package com.ruoyi.system.domain;
 
 import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+
+import java.time.LocalDateTime;
 import java.util.Date;
 
 @Data
@@ -21,5 +24,6 @@
 
     @TableField(value = "time")
     @ApiModelProperty(value = "调用时间")
-    private Date time;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime time;
 }
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OrderMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OrderMapper.java
index 0af246b..afe0925 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OrderMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OrderMapper.java
@@ -27,7 +27,7 @@
 
     List<DailyStatistics> getDailyStatistics(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
 
-    FinanceFlowsTopVO financeTop();
+    FinanceFlowsTopVO financeTop(@Param("dto") FinanceFlowsDTO dto);
 
     IPage<FinanceFlowsPageVO> flowsPage(@Param("page") IPage<FinanceFlowsPageVO> page, @Param("dto")FinanceFlowsDTO dto);
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/QuestionMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/QuestionMapper.java
index 47d19f5..696de9d 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/QuestionMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/QuestionMapper.java
@@ -12,5 +12,5 @@
 @Mapper
 public interface QuestionMapper extends BaseMapper<Question> {
 
-    IPage<QuestionPageVO> getQuestionPage(@Param("page")IPage<BannerPageVO> page,@Param("name") String name);
+    IPage<QuestionPageVO> getQuestionPage(@Param("page")IPage<BannerPageVO> page,@Param("title") String title);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java
index 5ae6e43..1f32e8b 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java
@@ -128,4 +128,9 @@
     List<MenuTreeVO> selectMenusByParentId(@Param("menuId")Long menuId);
 
     List<MenuTreeVO> getAllRootMenu();
+
+    List<SysMenu> selectMenusByUserId(@Param("userId")Long userId);
+
+
+    List<String> getPathsByMenuIds(@Param("ids")List<Long> ids);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
index 66137bb..a0c1732 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
@@ -134,7 +134,7 @@
 
     IPage<SysUserPageListVO> getSysUserPageList(@Param("page") IPage<SysUserPageListVO> page, @Param("nickName") String nickName,@Param("phone")  Integer phone, @Param("status") String status);
 
-    R<SysUserVO> getSysUserVO(@Param("userId") Long userId);
+    SysUserVO getSysUserVO(@Param("userId") Long userId);
 
     SysUser selectuserByPhone(@Param("phonenumber") String phonenumber);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/dto/AppUserPageDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/dto/AppUserPageDTO.java
index 550bed8..9d52757 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/dto/AppUserPageDTO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/dto/AppUserPageDTO.java
@@ -15,7 +15,7 @@
     @ApiModelProperty("分页大小")
     private Integer pageSize=10;
     @ApiModelProperty("用户姓名")
-    private String username;
+    private String userName;
     @ApiModelProperty("联系电话")
     private String phone;
     @ApiModelProperty("状态")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/dto/FinanceFlowsDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/dto/FinanceFlowsDTO.java
index 4c06185..f9f7d27 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/dto/FinanceFlowsDTO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/dto/FinanceFlowsDTO.java
@@ -21,8 +21,8 @@
     private String orderNo;
 
 
-    @ApiModelProperty(value = "类型:0-全部 1-收入 2-退款")
-    private Integer type = 0;
+    @ApiModelProperty(value = "类型: 1-收入 2-退款")
+    private Integer type ;
 
 
     @ApiModelProperty(value = "操作时间-开始")
@@ -34,4 +34,7 @@
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime operateTimeEnd;
 
+    @ApiModelProperty(hidden = true)
+    private Integer offset;
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/ChangeVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/ChangeVO.java
index 93607e2..017953e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/ChangeVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/ChangeVO.java
@@ -1,9 +1,18 @@
 package com.ruoyi.system.pojo.vo;
 
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+
+import java.util.List;
 
 @Data
 @ApiModel("企业变更信息")
 public class ChangeVO {
+    @ApiModelProperty("银税互动授权记录")
+    private List<Object> bankAndTaxInteractive;
+    @ApiModelProperty("股东明细")
+    private List<Object> sharesRatioList;
+    @ApiModelProperty("法人/股东变更")
+    private List<Object> legalPersonGdChange;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/ErrorVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/ErrorVO.java
index 820b0d3..0e107a4 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/ErrorVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/ErrorVO.java
@@ -1,10 +1,17 @@
 package com.ruoyi.system.pojo.vo;
 
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
 import lombok.Data;
+
+import java.util.List;
 
 @Data
 @ApiModel("企业异常信息VO")
 public class ErrorVO {
-
+    @ApiModelProperty("数据是否存在(1-存在 0-不存在)")
+    private Integer VerifyResult;
+    @ApiModelProperty("数据信息")
+    private Object Data;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/InvoiceVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/InvoiceVO.java
index 34ed01f..0b8f1a7 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/InvoiceVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/InvoiceVO.java
@@ -1,9 +1,73 @@
 package com.ruoyi.system.pojo.vo;
 
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
 
 @Data
 @ApiModel("企业发票信息")
 public class InvoiceVO {
+
+    @ApiModelProperty("近45日是否有开票记录")
+    private Boolean anyPre45daysFpRcd;
+
+    @ApiModelProperty("近一个月开票金额(元)")
+    private BigDecimal hjjeZc1;
+
+    @ApiModelProperty("近3个月开票环比增长率")
+    private BigDecimal avgMonJshjYxMomRate3;
+
+    @ApiModelProperty("近3个月开票金额(元)")
+    private BigDecimal hjjeZc3;
+
+    @ApiModelProperty("近6个月开票环比增长率")
+    private BigDecimal avgMonJshjYxMomRate6;
+
+    @ApiModelProperty("近6个月开票金额(元)")
+    private BigDecimal hjjeZc6;
+
+    @ApiModelProperty("近12个月开票环比增长率")
+    private BigDecimal avgMonJshjYxMomRate12;
+
+    @ApiModelProperty("近12个月开票金额(元)")
+    private BigDecimal hjjeZc12;
+
+    @ApiModelProperty("近24个月开票金额(元)")
+    private BigDecimal hjjeZc24;
+
+    @ApiModelProperty("近3个月下游客户统计")
+    private Integer downCusCnt3;
+
+    @ApiModelProperty("近12月下游客户数量(家)")
+    private Integer downCusCnt12;
+
+    @ApiModelProperty("近12个月下游开票张数")
+    private Integer kpslQb;
+
+    @ApiModelProperty("近12月作废发票数量占比")
+    private BigDecimal kpslFpRatio;
+
+    @ApiModelProperty("近12月月均开票金额增长率")
+    private BigDecimal avgMonJshjYxYoyRate;
+
+    @ApiModelProperty("近12月红冲发票张数占比")
+    private BigDecimal kpslHpRatio;
+
+    @ApiModelProperty("近12个月红冲金额占比")
+    private BigDecimal hjjeHpRatio;
+
+    @ApiModelProperty("近12个月最大连续未开票间隔天数(销项)")
+    private Integer nokpslYxMaxdayCnt;
+
+
+    //todo 近12个月最长连续断票月数
+    //todo 近12个月断票月数(不含2月份)
+
+    @ApiModelProperty("近三年开票信息报表(元)")
+    private List<Object> f4yPer1mDownFpInfoList;
+
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/LicencePageVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/LicencePageVO.java
index 7773715..903f302 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/LicencePageVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/LicencePageVO.java
@@ -3,8 +3,11 @@
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
+@Data
 public class LicencePageVO {
 
     @ApiModelProperty(value = "主键ID")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/OrderDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/OrderDetailVO.java
index 0a46ed1..ba34683 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/OrderDetailVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/OrderDetailVO.java
@@ -21,7 +21,7 @@
     @ApiModelProperty(value = "公司主键ID")
     private String id;
 
-    @ApiModelProperty(value = "订单状态:1-待交易 2待确认(预订) 3已确认(待支付) 4办理中 5-已完成 6-已下架 ")
+    @ApiModelProperty(value = "订单状态: 2待确认(预订) 3已确认(待支付) 4办理中 5-卖家已完成 6-卖家已完成 7-已下架 ")
     private Integer status;
 
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/OrderPageVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/OrderPageVO.java
index 0012d62..93181c0 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/OrderPageVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/OrderPageVO.java
@@ -43,7 +43,7 @@
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime bookTime;
 
-    @ApiModelProperty(value = "订单状态:1-待交易 2待确认(预订) 3已确认(待支付) 4办理中 5-已完成 6-已下架 ")
+    @ApiModelProperty(value = "订单状态:-1-已取消 1-待交易 2待确认(预订) 3已确认(待支付) 4办理中  6-已完成 7-已下架 ")
     private Integer status;
 
     @ApiModelProperty(value = "完成时间")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/QuestionPageVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/QuestionPageVO.java
index e0e518c..1a8d1fc 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/QuestionPageVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/QuestionPageVO.java
@@ -11,7 +11,7 @@
     @ApiModelProperty("主键ID")
     private Integer id;
     @ApiModelProperty("问题标题")
-    private String name;
+    private String title;
     @ApiModelProperty("排序")
     private Integer orderNum;
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/TaxVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/TaxVO.java
index 53bed86..ff4798f 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/TaxVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/TaxVO.java
@@ -1,9 +1,66 @@
 package com.ruoyi.system.pojo.vo;
 
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
 
 @Data
 @ApiModel("企业纳税信息")
 public class TaxVO {
+
+    @ApiModelProperty("纳税信用等级")
+    private String taxCreditRating;
+
+    @ApiModelProperty("纳税人种类")
+    private String taxpayerType;
+
+    @ApiModelProperty("近12月增税销售额")
+    private BigDecimal vatTaxShouldsaleAmt12;
+
+    @ApiModelProperty("近24月增税销售额")
+    private BigDecimal vatTaxShouldsaleAmt24;
+
+    @ApiModelProperty("近12月纳税总额(元)")
+    private BigDecimal taxAmt12;
+
+    @ApiModelProperty("近24月纳税总额(元)")
+    private BigDecimal taxAmt24;
+
+    @ApiModelProperty("近12月增税应纳额(元)")
+    private BigDecimal vatTaxShouldpay;
+
+    @ApiModelProperty("近3月滞纳金次数")
+    private Integer overdueFineInfoCnt3;
+
+    @ApiModelProperty("近12个月滞纳金金额(元)")
+    private BigDecimal overdueFineInfoAmt12;
+
+    @ApiModelProperty("近12月滞纳金次数")
+    private Integer overdueFineInfoCnt12;
+
+    @ApiModelProperty("近12月0申报月数(月)")
+    private Integer vatTax0dclrMonCnt;
+
+    // todo 近12月0申报月数(月)
+    // todo 当前欠税余额(元)
+    // todo 近12月最长连续0纳税申报月数
+
+    //todo 资产金额(去年年报)
+    //todo 负债率(去年年报)
+    //todo 营业利润额(去年年报)
+    //todo 营业净利率(去年年报)
+
+
+    @ApiModelProperty("滞纳金情况")
+    private List<Object> overdueFineDetailsList;
+
+    @ApiModelProperty("近四年纳税信息完税表")
+    private List<Object> taxPrev4yearsTaxInfoDict;
+
+    @ApiModelProperty("税务处罚")
+    private Object enterprise;
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/OrderService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/OrderService.java
index 2fa893c..ad09472 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/OrderService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/OrderService.java
@@ -3,13 +3,13 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.common.core.domain.R;
-import com.ruoyi.common.utils.wx.RefundCallbackResult;
-import com.ruoyi.system.domain.Agreement;
+
+
 import com.ruoyi.system.domain.Order;
-import com.ruoyi.system.pojo.dto.AddAgreementDTO;
+
 import com.ruoyi.system.pojo.dto.FinanceFlowsDTO;
 import com.ruoyi.system.pojo.dto.OrderPageDTO;
-import com.ruoyi.system.pojo.dto.WithdrawPageDTO;
+
 import com.ruoyi.system.pojo.vo.*;
 
 import java.time.LocalDate;
@@ -23,13 +23,13 @@
 
     BusinessVO business(String id);
 
-    ErrorVO error(String id);
+    R  error(String id);
 
-    ChangeVO change(String id);
+    R change(String id);
 
-    TaxVO tax(String id);
+    R tax(String id);
 
-    InvoiceVO invoice(String id);
+    R invoice(String id);
 
     void delete(String id);
 
@@ -37,13 +37,13 @@
 
     void cancel(String id);
 
-    R refundPayMoneyCallback(RefundCallbackResult refundCallbackResult);
+    R refundPayMoneyCallback(String xmlData);
 
     TodayStatisticsVO today();
 
     IndexLineChartVO chart(LocalDate startDate, LocalDate endDate);
 
-    FinanceFlowsTopVO financeTop();
+    FinanceFlowsTopVO financeTop(FinanceFlowsDTO dto);
 
     IPage<FinanceFlowsPageVO> flowsPage(FinanceFlowsDTO dto);
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/QuestionService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/QuestionService.java
index 442480e..f9f2ba5 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/QuestionService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/QuestionService.java
@@ -15,7 +15,7 @@
 
 
 public interface QuestionService extends IService<Question>  {
-    IPage<QuestionPageVO> getQuestionPage(Integer pageNum, Integer pageSize, String name);
+    IPage<QuestionPageVO> getQuestionPage(Integer pageNum, Integer pageSize, String title);
 
     void add(AddQuestionDTO dto);
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AppUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AppUserServiceImpl.java
index e1f73aa..d3beba4 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AppUserServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AppUserServiceImpl.java
@@ -62,9 +62,12 @@
         //2.2计算订单金额 扣减超时订单金额
         for(BuyerInfoAndOrder order :orders) {
             BigDecimal total = new BigDecimal("0.00");
+            order.setPrice(order.getPrice()==null?BigDecimal.ZERO:order.getPrice());
+            order.setCommissionPrice(order.getCommissionPrice()==null?BigDecimal.ZERO:order.getCommissionPrice());
+            order.setCommissionPlatform(order.getCommissionPlatform()==null?BigDecimal.ZERO:order.getCommissionPlatform());
             total = total.add(order.getPrice()).subtract(order.getCommissionPrice()).subtract(order.getCommissionPlatform());
             System.out.println(total);
-            //扣减超时订单
+            /*//扣减超时订单
             //到期时间 支付时间 + 预计时间 + 新增时间
             LocalDateTime end = order.getPayTime().plusDays(order.getEstimatedDays()).plusDays(order.getAddDay());
             LocalDateTime now = LocalDateTime.now();//计算扣费时间
@@ -78,7 +81,7 @@
             long  days= (seconds + 86399) / 86400;//24小时
             //计算天数差
             BigDecimal dailyAmount = new BigDecimal("100.00");
-            total = total.subtract((dailyAmount.multiply(BigDecimal.valueOf(days))));
+            total = total.subtract((dailyAmount.multiply(BigDecimal.valueOf(days))));*/
             recorded = recorded.add(total);
         }
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LicenceServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LicenceServiceImpl.java
index 2f34ded..b9d5164 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LicenceServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LicenceServiceImpl.java
@@ -27,10 +27,11 @@
     public void add(AddLicenceDTO dto) {
         //判断是否存在
         Licence licence = this.baseMapper.selectOne(new LambdaQueryWrapper<Licence>().eq(Licence::getName, dto.getName()).eq(Licence::getDelFlag, 0));
-        if (null == licence) {
+        if (null != licence) {
             throw new ServiceException("许可证名称重复");
         }
 
+        licence = new Licence();
         BeanUtils.copyProperties(dto, licence);
         String grand = String.join(";", dto.getGrandNameList());//多个以分号相隔
         licence.setGradeName(grand);
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OrderServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OrderServiceImpl.java
index 126b219..74a060b 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OrderServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OrderServiceImpl.java
@@ -1,29 +1,32 @@
 package com.ruoyi.system.service.impl;
 
+import cn.hutool.crypto.SecureUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.http.HttpUtil;
 import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.exception.ServiceException;
-import com.ruoyi.common.utils.wx.PaymentUtil;
-import com.ruoyi.common.utils.wx.RefundCallbackResult;
-import com.ruoyi.common.utils.wx.RefundResult;
 import com.ruoyi.system.domain.*;
 import com.ruoyi.system.mapper.*;
-import com.ruoyi.system.pojo.dto.AddAgreementDTO;
 import com.ruoyi.system.pojo.dto.FinanceFlowsDTO;
 import com.ruoyi.system.pojo.dto.OrderPageDTO;
-import com.ruoyi.system.pojo.dto.WithdrawPageDTO;
 import com.ruoyi.system.pojo.model.DailyStatistics;
-import com.ruoyi.system.pojo.model.DrawSheet;
 import com.ruoyi.system.pojo.vo.*;
-import com.ruoyi.system.service.AgreementService;
 import com.ruoyi.system.service.OrderService;
+import com.ruoyi.system.wx.RefundCallbackResult;
+import com.ruoyi.system.wx.WechatPayService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.provisioning.UserDetailsManager;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -32,9 +35,8 @@
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 @Slf4j
 @Service
@@ -53,12 +55,15 @@
     private ScheduleMapper scheduleMapper;
     @Resource
     private CompanyMapper companyMapper;
-    @Autowired
-    private SystemConfigMapper systemConfigMapper;
+
     @Autowired
     private AppUserMapper appUserMapper;
-    @Autowired
-    private WithdrawMapper withdrawMapper;
+
+    @Resource
+    private RedisCache redisCache;
+    @Resource
+    private QichachaMapper qichachaMapper;
+
 
     @Override
     public IPage<OrderPageVO> getOrderPage(OrderPageDTO dto) {
@@ -77,8 +82,11 @@
         List<PermitVO> permitVOs = new ArrayList<>();
         LocalDateTime now = LocalDateTime.now();
         for (Permit permit : permits) {
-            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-            LocalDateTime expireTime = LocalDateTime.parse(permit.getExpireTime(), formatter);
+            DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            LocalDate expireDate = LocalDate.parse(permit.getExpireTime(), dateFormatter);
+
+            // 如果需要转为 LocalDateTime(添加默认时间)
+            LocalDateTime expireTime = expireDate.atTime(23,59,59); // 默认00:00:00
             if (now.isAfter(expireTime)) {
                 //过滤 未过期的
                 PermitVO permitVO = new PermitVO();
@@ -98,7 +106,7 @@
         }
         vo.setOpeningBankVOList(openingBankVOs);
 
-        if (vo.getStatus() != 4 && vo.getStatus() != 5) {
+        if (vo.getStatus() != 4 && vo.getStatus() != 5&& vo.getStatus() != 6) {
             return vo;
         }
 
@@ -146,6 +154,7 @@
 
     @Override
     public BusinessVO business(String id) {
+        //先查询数据库中的
         Company company = companyMapper.selectById(id);
         if (null == company || company.getIsDelete() != 0) {
             throw new ServiceException("公司不存在");
@@ -153,29 +162,347 @@
         BusinessVO vo = new BusinessVO();
         BeanUtils.copyProperties(company, vo);
         vo.setPlace(company.getCity()+company.getProvince()+company.getArea());
+
+        //todo 再查企业工商信息 覆盖掉之前的
+
+
         return vo;
     }
 
     @Override
-    public ErrorVO error(String id) {
-        return null;
+    public R  error(String id) {
+        ErrorVO errorVO = new ErrorVO();
+        Company company = companyMapper.selectById(id);
+        if (null == company || company.getIsDelete() != 0) {
+            throw new ServiceException("公司不存在");
+        }
+        JSONObject result = getQiChaChaCompanyExceptionCheck(company.getCompanyName());
+        if("200".equals(result.get("Status"))){
+            //查询成功
+            JSONObject data = (JSONObject) result.get("Result");
+            Integer verifyResult = (Integer) data.get("VerifyResult");
+            errorVO.setVerifyResult(verifyResult);
+            if (verifyResult==1){
+                //该企业有异常数据
+                JSONArray list = (JSONArray) data.get("Data");
+                errorVO.setData(list);
+            }
+            return R.ok(errorVO);
+        }else {
+            //查询失败
+            return R.fail(result.get("Message"));
+        }
+
+    }
+
+
+    /**
+     * 经营异常核查
+     * @param companyName
+     * @return
+     * VerifyResult  int	数据是否存在(1-存在,0-不存在)
+     * Data  	List<Object>  数据信息
+     * Data:[{
+     *     AddReason  列入经营异常名录原因
+     *     AddDate	列入日期
+     *     RomoveReason  移出经营异常名录原因(保留字段)
+     *     RemoveDate   移出日期(保留字段)
+     *     DecisionOffice  	作出决定机关
+     *     RemoveDecisionOffice  移出决定机关(保留字段)
+     * }]
+     * Status
+     * Message
+     * OrderNumber
+     */
+    public  JSONObject getQiChaChaBasicDetailsCompany(String companyName){
+        Object cacheObject = redisCache.getCacheObject("qichacha_" +"basic_"+ companyName);
+        if(cacheObject != null){
+            JSONObject jsonObject = JSONObject.parseObject(cacheObject.toString());
+            return jsonObject;
+        }
+        String url = "https://api.qichacha.com/ECIV4/GetBasicDetailsByName?key=642987ca3faf4a7daeac70463ae22695&keyword="+companyName;
+        HttpRequest get = HttpUtil.createGet(url);
+        String timeStr = String.valueOf(System.currentTimeMillis() / 1000);
+        get.header("Token", SecureUtil.md5("642987ca3faf4a7daeac70463ae22695"+timeStr+"AC776F2957291EAE3B4161702E89A9F3").toUpperCase());
+        get.header("Timespan", timeStr);
+        HttpResponse execute = get.execute();
+        String body = execute.body();
+        JSONObject jsonObject = JSONObject.parseObject(body);
+        if("200".equals(jsonObject.get("Status"))){
+            //查询成功
+            String string = jsonObject.toString();
+            redisCache.setCacheObject("qichacha_"+"basic_"+companyName,string,24, TimeUnit.HOURS);
+            //统计调用次数
+            Qichacha qichacha = new Qichacha();
+            qichacha.setTime(LocalDateTime.now());
+            qichacha.setType(1);//企业异常查询
+            qichachaMapper.insert(qichacha);
+
+            return jsonObject;
+        }
+        return jsonObject;
+    }
+
+    /**
+     * 经营异常核查
+     * @param companyName
+     * @return
+     * VerifyResult  int	数据是否存在(1-存在,0-不存在)
+     * Data  	List<Object>  数据信息
+     * Data:[{
+     *     AddReason  列入经营异常名录原因
+     *     AddDate	列入日期
+     *     RomoveReason  移出经营异常名录原因(保留字段)
+     *     RemoveDate   移出日期(保留字段)
+     *     DecisionOffice  	作出决定机关
+     *     RemoveDecisionOffice  移出决定机关(保留字段)
+     * }]
+     * Status
+     * Message
+     * OrderNumber
+     */
+    public  JSONObject getQiChaChaCompanyExceptionCheck(String companyName){
+        Object cacheObject = redisCache.getCacheObject("qichacha_" + companyName);
+        if(cacheObject != null){
+            JSONObject jsonObject = JSONObject.parseObject(cacheObject.toString());
+            return jsonObject;
+        }
+        String url = "https://api.qichacha.com/ExceptionCheck/GetList?key=642987ca3faf4a7daeac70463ae22695&searchKey="+companyName;
+        HttpRequest get = HttpUtil.createGet(url);
+        String timeStr = String.valueOf(System.currentTimeMillis() / 1000);
+        get.header("Token", SecureUtil.md5("642987ca3faf4a7daeac70463ae22695"+timeStr+"AC776F2957291EAE3B4161702E89A9F3").toUpperCase());
+        get.header("Timespan", timeStr);
+        HttpResponse execute = get.execute();
+        String body = execute.body();
+        JSONObject jsonObject = JSONObject.parseObject(body);
+        if("200".equals(jsonObject.get("Status"))){
+            //查询成功
+            String string = jsonObject.toString();
+            redisCache.setCacheObject("qichacha_"+companyName,string,24, TimeUnit.HOURS);
+            //统计调用次数
+            Qichacha qichacha = new Qichacha();
+            qichacha.setTime(LocalDateTime.now());
+            qichacha.setType(2);//企业异常查询
+            qichachaMapper.insert(qichacha);
+
+            return jsonObject;
+        }
+        return jsonObject;
+    }
+    private  JSONObject getReport(String sign){
+        Object cacheObject = redisCache.getCacheObject("shuimu_" + sign);
+        if(cacheObject != null){
+            JSONObject jsonObject = JSONObject.parseObject(cacheObject.toString());
+            return jsonObject;
+        }
+        HttpRequest post = HttpUtil.createPost("https://shuimui.szsmjr.com/index/index/result");
+        HashMap<String, String> stringStringHashMap = new HashMap<>();
+        stringStringHashMap.put("Origin","https://shuimui.szsmjr.com");
+        post.addHeaders(stringStringHashMap);
+        post.body("{\"sn\":\""+sign+"\"}");
+        HttpResponse execute = post.execute();
+        String body = execute.body();
+        JSONObject jsonObject = JSONObject.parseObject(body);
+        if("1001".equals(jsonObject.get("code"))){
+            //查询成功
+            String string = jsonObject.toString();
+            redisCache.setCacheObject("shuimu_"+sign,string,1, TimeUnit.MINUTES);
+            return jsonObject;
+        }
+        return jsonObject;
+    }
+    @Override
+    public R change(String id) {
+//        System.err.println(getReport("ZZD20250508017232394218445"));
+        ChangeVO changeVO = new ChangeVO();
+       /* Company companyInfo = companyMapper.selectById(id);
+        if (null == companyInfo || companyInfo.getIsDelete() != 0) {
+            throw new ServiceException("公司不存在");
+        }*/
+//        JSONObject jsonObject=getReport(companyInfo.getLink().split("=")[1]);
+        JSONObject jsonObject=getReport("ZZD20250508017232394218445");
+        if (!"1001".equals(jsonObject.getString("code"))){
+            return R.fail(jsonObject.get("msg"));
+        }
+        JSONObject data1 = (JSONObject) jsonObject.get("data");
+        JSONObject data2 = (JSONObject) data1.get("data");
+        JSONObject company = (JSONObject) data2.get("company");
+        // 银税互动
+        JSONArray bankAndTaxInteractive = (JSONArray)  company.get("bankAndTaxInteractive");
+        changeVO.setBankAndTaxInteractive(bankAndTaxInteractive);
+        //股东明细
+        JSONArray sharesRatioList = (JSONArray)  company.get("sharesRatioList");
+        changeVO.setSharesRatioList(sharesRatioList);
+        //法人/股东变更
+        JSONArray legalPersonGdChange = (JSONArray) company.get("legalPersonGdChange");
+        changeVO.setLegalPersonGdChange(legalPersonGdChange);
+
+        return R.ok(changeVO);
     }
 
     @Override
-    public ChangeVO change(String id) {
-        return null;
+    public R tax(String id) {
+        TaxVO taxVO = new TaxVO();
+       /* Company companyInfo = companyMapper.selectById(id);
+        if (null == companyInfo || companyInfo.getIsDelete() != 0) {
+            throw new ServiceException("公司不存在");
+        }*/
+//        JSONObject jsonObject=getReport(companyInfo.getLink().split("=")[1]);
+        JSONObject jsonObject=getReport("ZZD20250508017232394218445");
+        if (!"1001".equals(jsonObject.getString("code"))){
+            return R.fail(jsonObject.get("msg"));
+        }
+        JSONObject data1 = (JSONObject) jsonObject.get("data");
+        JSONObject data2 = (JSONObject) data1.get("data");
+        JSONObject taxInfo = (JSONObject) data2.get("taxInfo");
+        //税务处罚
+        JSONObject enterprise = (JSONObject) data2.get("enterprise");
+        taxVO.setEnterprise(enterprise);
+        //滞纳金情况
+        JSONArray overdueFineDetailsList = (JSONArray) taxInfo.get("overdueFineDetailsList");
+        taxVO.setOverdueFineDetailsList(overdueFineDetailsList);
+
+        //近四年纳税信息完税表
+        JSONArray taxPrev4yearsTaxInfoDict = (JSONArray) taxInfo.get("taxPrev4yearsTaxInfoDict");
+        taxVO.setTaxPrev4yearsTaxInfoDict(taxPrev4yearsTaxInfoDict);
+
+        //纳税信用等级
+        String taxCreditRating = (String) taxInfo.get("taxCreditRating");
+        taxVO.setTaxCreditRating(taxCreditRating);
+
+        //纳税人种类
+        String taxpayerType = (String) taxInfo.get("taxpayerType");
+        taxVO.setTaxpayerType(taxpayerType);
+
+        //近12月增税销售额
+        JSONObject taxPrevMnMthsAllTaxDclrPrjInfoDict = (JSONObject) taxInfo.get("taxPrevMnMthsAllTaxDclrPrjInfoDict");
+
+        JSONObject taxPrev12mthsAllTaxDclrPrjInfoDict = (JSONObject) taxPrevMnMthsAllTaxDclrPrjInfoDict.get("taxPrev12mthsAllTaxDclrPrjInfoDict");
+        taxVO.setVatTaxShouldsaleAmt12((BigDecimal) taxPrev12mthsAllTaxDclrPrjInfoDict.get("vatTaxShouldsaleAmt"));
+        //近24月增税销售额
+        JSONObject taxPrev24mthsAllTaxDclrPrjInfoDict = (JSONObject) taxPrevMnMthsAllTaxDclrPrjInfoDict.get("taxPrev24mthsAllTaxDclrPrjInfoDict");
+
+        taxVO.setVatTaxShouldsaleAmt24( (BigDecimal) taxPrev24mthsAllTaxDclrPrjInfoDict.get("vatTaxShouldsaleAmt"));
+        JSONObject taxPrevMnMthsTaxInfoDict = (JSONObject) taxInfo.get("taxPrevMnMthsTaxInfoDict");
+
+        //近12月纳税总额(元)
+        JSONObject taxPrev12mthsTaxInfo = (JSONObject) taxPrevMnMthsTaxInfoDict.get("taxPrev12mthsTaxInfo");
+        taxVO.setTaxAmt12( (BigDecimal) taxPrev12mthsTaxInfo.get("taxAmt"));
+
+        //近24月纳税总额(元)
+        JSONObject taxPrev24mthsTaxInfo = (JSONObject) taxPrevMnMthsTaxInfoDict.get("taxPrev24mthsTaxInfo");
+        taxVO.setTaxAmt24( (BigDecimal) taxPrev24mthsTaxInfo.get("taxAmt"));
+
+        //近12月增税应纳额(元)
+        taxVO.setVatTaxShouldpay( (BigDecimal) taxPrev12mthsAllTaxDclrPrjInfoDict.get("vatTaxShouldpay"));
+
+        //近12个月滞纳金金额(元) 次数
+        JSONObject taxPrevMnMthsOverdueFineInfoDict = (JSONObject) taxInfo.get("taxPrevMnMthsOverdueFineInfoDict");
+        JSONObject taxPrev12mthsOverdueFineInfo = (JSONObject) taxPrevMnMthsOverdueFineInfoDict.get("taxPrev12mthsOverdueFineInfo");
+        taxVO.setOverdueFineInfoAmt12( (BigDecimal) taxPrev12mthsOverdueFineInfo.get("overdueFineInfoAmt"));
+        taxVO.setOverdueFineInfoCnt12( (Integer) taxPrev12mthsOverdueFineInfo.get("overdueFineInfoCnt"));
+
+
+        // 近3个月滞纳金金额(元)
+        JSONObject taxPrev3mthsOverdueFineInfo = (JSONObject) taxPrevMnMthsOverdueFineInfoDict.get("taxPrev3mthsOverdueFineInfo");
+        taxVO.setOverdueFineInfoCnt3( (Integer) taxPrev3mthsOverdueFineInfo.get("overdueFineInfoCnt"));
+
+        //近12月0申报月数(月数)
+        JSONObject taxPrevMnMthsAllTaxDclrInfoDict = (JSONObject) taxInfo.get("taxPrevMnMthsAllTaxDclrInfoDict");
+        JSONObject taxPrev12mthsAllTaxDclrInfoDict = (JSONObject) taxPrevMnMthsAllTaxDclrInfoDict.get("taxPrev12mthsAllTaxDclrInfoDict");
+        taxVO.setVatTax0dclrMonCnt( (Integer) taxPrev12mthsAllTaxDclrInfoDict.get("vatTax0dclrMonCnt"));
+
+        return R.ok(taxVO);
     }
 
     @Override
-    public TaxVO tax(String id) {
-        return null;
+    public R invoice(String id) {
+        InvoiceVO vo = new InvoiceVO();
+       /* Company companyInfo = companyMapper.selectById(id);
+        if (null == companyInfo || companyInfo.getIsDelete() != 0) {
+            throw new ServiceException("公司不存在");
+        }*/
+//        JSONObject jsonObject=getReport(companyInfo.getLink().split("=")[1]);
+        JSONObject jsonObject=getReport("ZZD20250508017232394218445");
+        if (!"1001".equals(jsonObject.getString("code"))){
+            return R.fail(jsonObject.get("msg"));
+        }
+        JSONObject data1 = (JSONObject) jsonObject.get("data");
+        JSONObject data2 = (JSONObject) data1.get("data");
+        JSONObject invoiceInfo = (JSONObject) data2.get("invoiceInfo");
+        //近45日是否有开票记录
+        vo.setAnyPre45daysFpRcd((Boolean) invoiceInfo.get("anyPre45daysFpRcd"));
+
+        //近一个月开票金额(元)
+        JSONArray f4yPer1mDownFpInfoList = (JSONArray) invoiceInfo.get("f4yPer1mDownFpInfoList");
+        JSONObject f4yPer1mDownFpInfo1 = (JSONObject) f4yPer1mDownFpInfoList.get(1);
+        vo.setHjjeZc1( ObjectToBigDecimal(f4yPer1mDownFpInfo1.get("hjjeZc")) );
+
+
+        JSONObject fpPrevMnMthsDownFpInfoList = (JSONObject) invoiceInfo.get("fpPrevMnMthsDownFpInfoList");
+        JSONObject fpPrev3mthsDownFpInfoList = (JSONObject) fpPrevMnMthsDownFpInfoList.get("fpPrev3mthsDownFpInfoList");
+        //近3个月开票环比增长率
+        vo.setAvgMonJshjYxMomRate3( ObjectToBigDecimal(fpPrev3mthsDownFpInfoList.get("avgMonJshjYxMomRate")) );
+        //近3个月开票金额(元)
+        vo.setHjjeZc3( ObjectToBigDecimal( fpPrev3mthsDownFpInfoList.get("hjjeZc") ));
+
+        JSONObject fpPrev6mthsDownFpInfoList = (JSONObject) fpPrevMnMthsDownFpInfoList.get("fpPrev6mthsDownFpInfoList");
+        //近6个月开票环比增长率
+        vo.setAvgMonJshjYxMomRate6( ObjectToBigDecimal(fpPrev6mthsDownFpInfoList.get("avgMonJshjYxMomRate")) );
+        //近6月开票金额(元)
+        vo.setHjjeZc6( ObjectToBigDecimal(fpPrev6mthsDownFpInfoList.get("hjjeZc"))  );
+
+
+        JSONObject fpPrev12mthsDownFpInfoList = (JSONObject) fpPrevMnMthsDownFpInfoList.get("fpPrev12mthsDownFpInfoList");
+        //近12个月开票环比增长率
+        vo.setAvgMonJshjYxMomRate12( ObjectToBigDecimal(fpPrev12mthsDownFpInfoList.get("avgMonJshjYxMomRate")) );
+        //近12月开票金额(元)
+        vo.setHjjeZc12( ObjectToBigDecimal(fpPrev12mthsDownFpInfoList.get("hjjeZc"))  );
+
+        //近24个月开票金额(元)
+        JSONObject fpPrev24mthsDownFpInfoList = (JSONObject) fpPrevMnMthsDownFpInfoList.get("fpPrev24mthsDownFpInfoList");
+        vo.setHjjeZc24( ObjectToBigDecimal(fpPrev24mthsDownFpInfoList.get("hjjeZc") ));
+
+        //近12个月下游客户统计
+        vo.setDownCusCnt3( (Integer) fpPrev3mthsDownFpInfoList.get("downCusCnt"));
+        //近12个月下游客户统计
+        vo.setDownCusCnt12( (Integer) fpPrev12mthsDownFpInfoList.get("downCusCnt"));
+
+        //近12个月下游开票张数
+        vo.setKpslQb( (Integer) fpPrev12mthsDownFpInfoList.get("kpslQb"));
+
+        //近12月作废发票数量占比
+        vo.setKpslFpRatio(ObjectToBigDecimal(fpPrev12mthsDownFpInfoList.get("kpslFpRatio")));
+
+        //近12月月均开票金额增长率
+        vo.setAvgMonJshjYxYoyRate(ObjectToBigDecimal(fpPrev12mthsDownFpInfoList.get("avgMonJshjYxYoyRate")) );
+
+        //近12月红冲发票张数占比
+        vo.setKpslHpRatio(ObjectToBigDecimal(fpPrev12mthsDownFpInfoList.get("kpslHpRatio")));
+
+        //近12个月红冲金额占比
+        vo.setHjjeHpRatio(ObjectToBigDecimal(fpPrev12mthsDownFpInfoList.get("hjjeHpRatio")) );
+
+        //近12个月最大连续未开票间隔天数(销项)
+        vo.setNokpslYxMaxdayCnt((Integer) fpPrev12mthsDownFpInfoList.get("nokpslYxMaxdayCnt"));
+
+        //近三年开票信息报表(元)
+        vo.setF4yPer1mDownFpInfoList(f4yPer1mDownFpInfoList);
+
+        return R.ok(vo);
     }
 
-    @Override
-    public InvoiceVO invoice(String id) {
-        return null;
-    }
+    private BigDecimal ObjectToBigDecimal(Object o) {
+        // 处理不同类型的情况
+        if ( o instanceof BigDecimal) {
+            return (BigDecimal) o;
+        } else if (o instanceof Number) {
+            // 将其他数字类型(如 Integer、Double)转换为 BigDecimal
+            return BigDecimal.valueOf(((Number) o).doubleValue());
 
+        }
+        return BigDecimal.ZERO;
+    }
     @Transactional
     @Override
     public void delete(String id) {
@@ -191,6 +518,7 @@
             //查看订单状态是否为待确认
             Order order = this.baseMapper.selectOne(new LambdaQueryWrapper<Order>()
                     .eq(Order::getCompanyId, company.getId())
+                            .eq(Order::getIsRefund,0)
                     .ne(Order::getStatus,-1));//取消的订单不要
             if (null == order) {
                 throw new ServiceException("订单不存在");
@@ -254,7 +582,7 @@
         if (!company.getStatus().equals(4)){// 4-锁定中
             throw new ServiceException("订单状态错误,不能操作");
         }
-        //查看订单 取消的不要
+        //查看订单
         Order order = this.baseMapper.selectOne(new LambdaQueryWrapper<Order>()
                 .eq(Order::getCompanyId, company.getId())
                 .ne(Order::getStatus,-1));
@@ -262,10 +590,10 @@
             throw new ServiceException("订单不存在");
         }
         //检查状态  3已确认(未付款) 4办理中 5卖家已完成
-        if (!order.getStatus().equals(3)||!order.getStatus().equals(4)||!order.getStatus().equals(5)) {
+        if (!order.getStatus().equals(3)&&!order.getStatus().equals(4)&&!order.getStatus().equals(5)) {
             throw new ServiceException("订单状态错误,不能操作");
         }
-        if (company.getStatus().equals(3)){
+        if (order.getStatus().equals(3)){
             //未付款 直接取消订单
             order.setStatus(-1);
             this.baseMapper.updateById(order);
@@ -275,52 +603,91 @@
             appUserMapper.updateById(user);
             //商品状态修改
             company.setStatus(1);
+            order.setIsRefund(1);
+            order.setRefundTime(LocalDateTime.now());
             companyMapper.updateById(company);
         }else{
             R r = refundPayMoney(order);//退款
             if (200 == r.getCode()) {
-                //退款成功
-                order.setStatus(-1);//订单取消状态
-                order.setIsRefund(1);//退款标志
-                order.setRefundTime(LocalDateTime.now());//退款时间
-                this.updateById(order);
-                //将分佣次数加回
-                User user = appUserMapper.selectById(order.getUserId());
-                user.setInviteNum(user.getInviteNum()+1);
-                appUserMapper.updateById(user);
-                //商品状态修改
-                company.setStatus(1);
-                companyMapper.updateById(company);
+                //退款申请成功
+                log.info("退款申请成功,订单id:{}",order.getId());
             }
         }
     }
 
     @Override
-    public R refundPayMoneyCallback(RefundCallbackResult refundCallbackResult) {
-        String code = refundCallbackResult.getR3_RefundOrderNo().substring(1);
-        log.info("退款回调:{}",code);
-        Order order = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, code));
+    public R refundPayMoneyCallback(String xmlData ) {
+        RefundCallbackResult result = wechatPayService.processRefundCallback(xmlData);
+        if (!result.isSuccess()) {
+            System.out.println("会员退费错误:"+result.getMsg());
+            return R.fail(result.getMsg());
+        }
+        Order order = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, result.getOrderNo()));
         if (null == order || order.getStatus() == -1) {
             return R.ok();
         }
         order.setStatus(-1);
+        order.setIsRefund(1);
+        order.setRefundTime(LocalDateTime.now());
         this.updateById(order);
+        //查找公司
+        Company company = companyMapper.selectById(order.getCompanyId());
+
+        //取消订单
+        order.setStatus(-1);
+        order.setIsRefund(1);
+        order.setRefundTime(LocalDateTime.now());
+        this.baseMapper.updateById(order);
+        //将分佣次数加回
+        User user = appUserMapper.selectById(order.getUserId());
+        User inviter = appUserMapper.selectById(user.getInviteId());
+        if (inviter!=null && inviter.getIsDelete()==0){
+            inviter.setInviteNum(inviter.getInviteNum()+1);
+            appUserMapper.updateById(inviter);
+        }
+
+        //商品状态修改
+        company.setStatus(1);
+        companyMapper.updateById(company);
+
         return R.ok();
     }
     /**
      * 返回订单支付金额
      */
+    @Autowired
+    private WechatPayService wechatPayService;
+    @Transactional
     public R refundPayMoney(Order order) {
         //开始退款
-        BigDecimal paymentAmount = order.getPrice();
         if (BigDecimal.ZERO.compareTo(order.getPrice()) < 0) {//支付的金额是否大于0
             //微信退款
-            RefundResult refund = PaymentUtil.refund(order.getOrderNo(), "R" + order.getOrderNo(), paymentAmount.doubleValue(),
-                    "/system/order/refundPayMoneyCallback");
-            if (!"100".equals(refund.getRa_Status())) {
-                return R.fail(refund.getRc_CodeMsg());//退款失败
+            Map<String,String> map = wechatPayService.refund(order.getOrderNo(), order.getOrderNo(), order.getPrice().toString(), order.getPrice().toString(), "平台取消订单", "/system/order/refundPayMoneyCallback");
+
+            if (!"SUCCESS".equals(map.get("return_code"))) {
+                return R.fail(map.get("return_msg"));//退款失败
             }
         }
+        //查找公司
+        Company company = companyMapper.selectById(order.getCompanyId());
+
+        //取消订单
+        order.setStatus(-1);
+        order.setIsRefund(1);
+        order.setRefundTime(LocalDateTime.now());
+        this.baseMapper.updateById(order);
+        //将分佣次数加回
+        User user = appUserMapper.selectById(order.getUserId());
+        User inviter = appUserMapper.selectById(user.getInviteId());
+        if (inviter!=null && inviter.getIsDelete()==0){
+            inviter.setInviteNum(inviter.getInviteNum()+1);
+            appUserMapper.updateById(inviter);
+        }
+
+        //商品状态修改
+        company.setStatus(1);
+        companyMapper.updateById(company);
+
         return R.ok();
     }
 
@@ -369,14 +736,16 @@
     }
 
     @Override
-    public FinanceFlowsTopVO financeTop() {
-        return this.baseMapper.financeTop();
+    public FinanceFlowsTopVO financeTop(FinanceFlowsDTO dto) {
+        return this.baseMapper.financeTop(dto);
     }
 
     @Override
     public IPage<FinanceFlowsPageVO> flowsPage(FinanceFlowsDTO dto) {
         IPage<FinanceFlowsPageVO> page = new Page<>(dto.getPageNum(), dto.getPageSize());
         Long total  = this.baseMapper.countFlowsPage(dto);
+        //分页处理
+        dto.setOffset((dto.getPageNum()-1)*dto.getPageSize());
         IPage<FinanceFlowsPageVO> financeFlowsPageVOIPage = this.baseMapper.flowsPage(page, dto);
         financeFlowsPageVOIPage.setTotal(total);
         return financeFlowsPageVOIPage;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/QuestionServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/QuestionServiceImpl.java
index d2caa93..62a1800 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/QuestionServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/QuestionServiceImpl.java
@@ -20,9 +20,9 @@
 
 
     @Override
-    public IPage<QuestionPageVO> getQuestionPage(Integer pageNum, Integer pageSize, String name) {
+    public IPage<QuestionPageVO> getQuestionPage(Integer pageNum, Integer pageSize, String title) {
         IPage<BannerPageVO> page=new Page<>(pageNum, pageSize);
-        return this.baseMapper.getQuestionPage(page,name);
+        return this.baseMapper.getQuestionPage(page,title);
     }
 
     @Override
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
index 7ad7bd7..91ce918 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
@@ -480,14 +480,21 @@
         //判断角色名称是否存在
         SysRole sysRole = new SysRole();
         sysRole.setRoleName(dto.getRoleName());
+
         List<SysRole> sysRoles = roleMapper.selectRoleList(sysRole);
         if (sysRoles!=null && !sysRoles.isEmpty()){
-            throw new ServiceException("该角色名称重复");
+            sysRoles.forEach(role -> {
+                if (!role.getRoleId().equals(dto.getRoleId())){
+                    throw new ServiceException("该角色名称重复");
+                }
+            });
         }
-        //删除之前的
+        //删除之前的角色菜单关联
         roleMenuMapper.deleteRoleMenuByRoleId(dto.getRoleId());
+        //修改角色名称
+        roleMapper.updateRole(sysRole);
         //添加角色菜单
-        roleMenuMapper.insert(sysRole.getRoleId(),dto.getMenuIds());
+        roleMenuMapper.insert(dto.getRoleId(),dto.getMenuIds());
     }
 
     @Override
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
index ed505eb..bb440b2 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -1,6 +1,7 @@
 package com.ruoyi.system.service.impl;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -565,7 +566,7 @@
 
     @Override
     public R<SysUserVO> getInfo(Long userId) {
-        return userMapper.getSysUserVO(userId);
+        return R.ok(userMapper.getSysUserVO(userId));
     }
 
     @Override
@@ -591,7 +592,7 @@
         sysUser.setPhonenumber(dto.getPhonenumber());
         sysUser.setNickName(dto.getNickName());
         //后六位为默认密码
-        sysUser.setPassword(SecurityUtils.encryptPassword(Md5Utils.hash(dto.getPhonenumber().substring(6,12))));
+        sysUser.setPassword(SecurityUtils.encryptPassword(Md5Utils.hash(dto.getPhonenumber().substring(5,11))));
         sysUser.setStatus("0");
         sysUser.setDeptId(dto.getDeptId());  //添加用户-部门关系
         userMapper.insertUser(sysUser);
@@ -662,7 +663,7 @@
         if (sysUser==null){
             throw new ServiceException("该用户不存在");
         }
-        sysUser.setPassword(SecurityUtils.encryptPassword(Md5Utils.hash(sysUser.getPassword().substring(6,12))));
+        sysUser.setPassword(SecurityUtils.encryptPassword(Md5Utils.hash(sysUser.getPhonenumber().substring(5,11))));
         userMapper.updateUser(sysUser);
     }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/wx/HttpUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/wx/HttpUtil.java
new file mode 100644
index 0000000..1b121d0
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/wx/HttpUtil.java
@@ -0,0 +1,99 @@
+package com.ruoyi.system.wx;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+
+import javax.net.ssl.*;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.URL;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+/**
+ * HTTP工具类
+ */
+public class HttpUtil {
+
+    /**
+     * 发送POST请求
+     */
+    public static String post(String urlStr, String data) throws Exception {
+        // 设置超时时间(单位:毫秒)
+        int timeout = 5000; // 5秒
+
+        // 发送 POST 请求
+        try (HttpResponse response = HttpRequest.post(urlStr)
+                .body(data, "application/xml") // 设置 XML 请求体
+                .timeout(timeout)
+                .execute()) {
+
+            // 检查 HTTP 状态码
+            if (!response.isOk()) {
+                throw new RuntimeException("HTTP请求失败,状态码: " + response.getStatus()
+                        + ", 响应: " + response.body());
+            }
+            return response.body();
+        }
+    }
+    
+    /**
+     * 发送HTTPS请求
+     */
+    public static String postHttps(String urlStr, String data, String certPath, String certPassword) throws Exception {
+        // 创建SSL上下文
+        SSLContext sslContext = SSLContext.getInstance("SSL");
+        TrustManager[] trustManagers = {new X509TrustManager() {
+            @Override
+            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+            }
+            
+            @Override
+            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+            }
+            
+            @Override
+            public X509Certificate[] getAcceptedIssuers() {
+                return null;
+            }
+        }};
+        sslContext.init(null, trustManagers, new java.security.SecureRandom());
+        
+        // 创建HTTPS连接
+        URL url = new URL(urlStr);
+        HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
+        conn.setSSLSocketFactory(sslContext.getSocketFactory());
+        conn.setHostnameVerifier(new HostnameVerifier() {
+            @Override
+            public boolean verify(String hostname, SSLSession session) {
+                return true;
+            }
+        });
+        
+        conn.setRequestMethod("POST");
+        conn.setDoOutput(true);
+        conn.setDoInput(true);
+        conn.setUseCaches(false);
+        conn.setRequestProperty("Content-Type", "application/xml");
+        conn.setRequestProperty("Connection", "Keep-Alive");
+        conn.setRequestProperty("Charset", "UTF-8");
+        
+        // 发送请求
+        OutputStream os = conn.getOutputStream();
+        os.write(data.getBytes("UTF-8"));
+        os.flush();
+        os.close();
+        
+        // 获取响应
+        StringBuilder result = new StringBuilder();
+        BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
+        String line;
+        while ((line = br.readLine()) != null) {
+            result.append(line);
+        }
+        br.close();
+        
+        return result.toString();
+    }
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/MD5AndKL.java b/ruoyi-system/src/main/java/com/ruoyi/system/wx/MD5AndKL.java
similarity index 98%
rename from ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/MD5AndKL.java
rename to ruoyi-system/src/main/java/com/ruoyi/system/wx/MD5AndKL.java
index dc4eee4..cb4dd72 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/MD5AndKL.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/wx/MD5AndKL.java
@@ -1,4 +1,4 @@
-package com.ruoyi.common.utils.wx;
+package com.ruoyi.system.wx;
 
 import java.security.MessageDigest;
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/wx/PayResult.java b/ruoyi-system/src/main/java/com/ruoyi/system/wx/PayResult.java
new file mode 100644
index 0000000..f9c7fd6
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/wx/PayResult.java
@@ -0,0 +1,16 @@
+package com.ruoyi.system.wx;
+
+import lombok.Data;
+
+/**
+ * 支付结果VO
+ */
+@Data
+public class PayResult {
+    // 订单ID
+    private String orderNumber;
+    // 微信交易ID
+    private String transactionId;
+    // 支付金额
+    private String totalFee;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/wx/RefundCallbackResult.java b/ruoyi-system/src/main/java/com/ruoyi/system/wx/RefundCallbackResult.java
new file mode 100644
index 0000000..f3b7096
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/wx/RefundCallbackResult.java
@@ -0,0 +1,38 @@
+package com.ruoyi.system.wx;
+
+import lombok.Data;
+
+/**
+ * 退款回调结果实体
+ */
+@Data
+public class RefundCallbackResult {
+    private boolean success;        // 处理是否成功
+    private String msg;             // 结果描述
+    private String orderNo;         // 原订单号
+    private String refundNo;        // 退款订单号
+    private String refundId;        // 微信退款ID
+    private String totalFee;        // 原订单金额(分)
+    private String refundFee;       // 退款金额(分)
+    private String refundStatus;    // 退款状态
+
+    // 成功响应
+    public static RefundCallbackResult success() {
+        return success("处理成功");
+    }
+
+    public static RefundCallbackResult success(String msg) {
+        RefundCallbackResult result = new RefundCallbackResult();
+        result.setSuccess(true);
+        result.setMsg(msg);
+        return result;
+    }
+
+    // 失败响应
+    public static RefundCallbackResult fail(String msg) {
+        RefundCallbackResult result = new RefundCallbackResult();
+        result.setSuccess(false);
+        result.setMsg(msg);
+        return result;
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/wx/WechatPayConfig.java b/ruoyi-system/src/main/java/com/ruoyi/system/wx/WechatPayConfig.java
new file mode 100644
index 0000000..a7e700c
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/wx/WechatPayConfig.java
@@ -0,0 +1,27 @@
+package com.ruoyi.system.wx;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * 微信支付配置类
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "wx")
+public class WechatPayConfig {
+    // 小程序APPID
+    private String appId;
+    // 商户号
+    private String mchId;
+    // 商户API密钥
+    private String key;
+    // 支付结果通知地址
+    private String callbackPath;
+    // 证书路径
+    private String certPath;
+    // 商户RAS加密公钥路径
+    private String RASPath;
+    private String wxAppletsAppSecret;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/wx/WechatPayService.java b/ruoyi-system/src/main/java/com/ruoyi/system/wx/WechatPayService.java
new file mode 100644
index 0000000..c6bf171
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/wx/WechatPayService.java
@@ -0,0 +1,726 @@
+package com.ruoyi.system.wx;
+
+
+import com.alibaba.fastjson2.JSON;
+import com.ruoyi.common.core.domain.R;
+
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.dom4j.DocumentException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+import sun.security.util.DerInputStream;
+import sun.security.util.DerValue;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.SecretKeySpec;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import javax.servlet.http.HttpServletRequest;
+import java.io.*;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.net.InetAddress;
+import java.net.URL;
+import java.net.UnknownHostException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.security.*;
+import java.security.spec.RSAPublicKeySpec;
+import java.util.*;
+
+/**
+ * 微信支付服务类
+ */
+@Service
+public class WechatPayService {
+
+    @Autowired
+    private WechatPayConfig wechatPayConfig;
+    private static final String RSA_PUBLIC_KEY_FILENAME = "wechat_rsa_public_key.pem";
+    private static final String CERT_FOLDER = "cert/";
+    /**
+     * 统一下单
+     * @param orderNumber 订单号
+     * @param totalFee 总金额(分)
+     * @param body 商品描述
+     * @param openid 用户openid
+     * @return 预支付订单信息
+     */
+    public R unifiedOrder(String orderId,String orderNumber, String totalFee, String body, String openid, String callbackPath) throws Exception {
+        int i = new BigDecimal(totalFee).multiply(new BigDecimal("100")).intValue();
+        String hostAddress = null;
+        try {
+            hostAddress = InetAddress.getLocalHost().getHostAddress();
+        } catch (UnknownHostException e) {
+            e.printStackTrace();
+        }
+        // 构建请求参数
+        Map<String, String> params = new HashMap<>();
+        params.put("appid", wechatPayConfig.getAppId());
+        params.put("mch_id", wechatPayConfig.getMchId());
+        params.put("nonce_str", generateNonceStr());
+        params.put("body", body);
+        params.put("out_trade_no", orderNumber);
+        params.put("total_fee", String.valueOf(i) );
+        params.put("spbill_create_ip", "221.182.45.100"); // 实际应用中应获取客户端IP
+        params.put("notify_url", wechatPayConfig.getCallbackPath()+callbackPath);
+        params.put("trade_type", "JSAPI");
+        params.put("openid", openid);
+
+        // 生成签名
+        String sign = weixinSignature(params);
+        params.put("sign", sign);
+
+        // 将参数转换为XML
+        String xmlParams = XMLUtil.mapToXml(params).replaceFirst("^<\\?xml.+?\\?>\\s*", "");
+
+        // 发送请求到微信支付统一下单接口
+        String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
+        String result = HttpUtil.post(url, xmlParams);
+
+        // 解析返回结果
+        Map<String, String> resultMap = XMLUtil.xmlToMap(result);
+
+        // 验证签名
+        if (!verifySign(resultMap, wechatPayConfig.getKey())) {
+            return R.fail("微信支付签名验证失败");
+//            throw new Exception("微信支付签名验证失败");
+        }
+        if (!resultMap.get("return_code").equals("SUCCESS")) {
+            return R.fail(resultMap.get("return_msg"));
+        }
+
+        // 构建小程序支付所需参数
+        Map<String, String> payParams = new HashMap<>();
+        payParams.put("appId", wechatPayConfig.getAppId());
+        payParams.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
+        payParams.put("nonceStr", generateNonceStr());
+        payParams.put("package", "prepay_id=" + resultMap.get("prepay_id"));
+        payParams.put("signType", "MD5");
+
+        // 生成支付签名
+        String paySign = weixinSignature(payParams);
+        payParams.put("paySign", paySign);
+
+        //给前端标识
+//        payParams.put("payMethod","1");
+        payParams.put("orderId", orderId);
+        return R.ok(JSON.toJSONString(payParams));
+    }
+    /**
+     * 微信下单的签名算法
+     * @param map
+     * @return
+     */
+    private String weixinSignature(Map<String, String> map){
+        try {
+            Set<Map.Entry<String, String>> entries = map.entrySet();
+            List<Map.Entry<String, String>> infoIds = new ArrayList<Map.Entry<String, String>>(entries);
+            // 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)
+            Collections.sort(infoIds, new Comparator<Map.Entry<String, String>>() {
+                public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
+                    return (o1.getKey()).toString().compareTo(o2.getKey());
+                }
+            });
+            // 构造签名键值对的格式
+            StringBuilder sb = new StringBuilder();
+            for (Map.Entry<String, String> item : infoIds) {
+                if (item.getKey() != null || item.getKey() != "") {
+                    String key = item.getKey();
+                    Object val = item.getValue();
+                    if (!(val == "" || val == null)) {
+                        sb.append(key + "=" + val + "&");
+                    }
+                }
+            }
+            sb.append("key=" + wechatPayConfig.getKey());
+            String sign = MD5AndKL.MD5Encode(sb.toString(), "UTF-8").toUpperCase(); //注:MD5签名方式
+            return sign;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 处理支付结果通知
+     * @param request HTTP请求
+     * @return 处理结果
+     */
+    public PayResult processNotify(HttpServletRequest request) throws Exception {
+        // 读取请求内容
+        BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(), StandardCharsets.UTF_8));
+        String line;
+        StringBuilder xml = new StringBuilder();
+        while ((line = br.readLine()) != null) {
+            xml.append(line);
+        }
+        br.close();
+
+        // 解析XML
+        Map<String, String> resultMap = XMLUtil.xmlToMap(xml.toString());
+
+        // 验证签名
+        if (!verifySign(resultMap, wechatPayConfig.getKey())) {
+            throw new Exception("微信支付签名验证失败");
+        }
+
+        // 验证支付结果
+        if (!"SUCCESS".equals(resultMap.get("return_code")) || !"SUCCESS".equals(resultMap.get("result_code"))) {
+            throw new Exception("微信支付结果异常");
+        }
+
+        // 处理业务逻辑
+        PayResult payResult = new PayResult();
+        payResult.setOrderNumber(resultMap.get("out_trade_no"));
+        payResult.setTransactionId(resultMap.get("transaction_id"));
+        payResult.setTotalFee(resultMap.get("total_fee"));
+
+        return payResult;
+    }
+
+    /**
+     * 生成随机字符串
+     */
+    private String generateNonceStr() {
+        return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32);
+    }
+
+    /**
+     * 微信支付API V2签名算法
+     * @param params 请求参数
+     * @param apiKey 商户API密钥
+     * @return 签名结果
+     */
+    public static String generateSign(Map<String, String> params, String apiKey) throws Exception {
+        // 1. 过滤空值参数
+        Map<String, String> filteredParams = new HashMap<>();
+        for (Map.Entry<String, String> entry : params.entrySet()) {
+            String key = entry.getKey();
+            String value = entry.getValue();
+            // 排除sign字段和空值字段
+            if (!"sign".equals(key) && value != null && !value.isEmpty()) {
+                filteredParams.put(key, value);
+            }
+        }
+
+        // 2. 按照ASCII码排序参数名
+        List<String> keys = new ArrayList<>(filteredParams.keySet());
+        Collections.sort(keys);
+
+        // 3. 构建签名原始字符串
+        StringBuilder sb = new StringBuilder();
+        for (String key : keys) {
+            String value = filteredParams.get(key);
+            sb.append(key).append("=").append(value).append("&");
+        }
+
+        // 4. 添加API密钥
+        sb.append("key=").append(apiKey);
+
+        // 5. MD5加密并转为大写
+        MessageDigest md = MessageDigest.getInstance("MD5");
+        byte[] digest = md.digest(sb.toString().getBytes("UTF-8"));
+
+        // 6. 转换为十六进制字符串
+        StringBuilder sign = new StringBuilder();
+        for (byte b : digest) {
+            sign.append(String.format("%02x", b & 0xff));
+        }
+
+        return sign.toString().toUpperCase();
+    }
+    /**
+     * 验证签名
+     */
+    private boolean verifySign(Map<String, String> params, String key) throws Exception {
+        String sign = params.get("sign");
+        if (StringUtils.isEmpty(sign)) {
+            return false;
+        }
+
+        // 移除sign字段
+        Map<String, String> newParams = new HashMap<>(params);
+        newParams.remove("sign");
+
+        // 生成新签名
+        String newSign = generateSign(newParams, key);
+
+        return sign.equals(newSign);
+    }
+
+    /**
+     * 关闭订单
+     */
+    public Map<String, String> closeOrder(String orderId){
+        // 构建请求参数
+        Map<String, String> params = new HashMap<>();
+        params.put("appid", wechatPayConfig.getAppId());
+        params.put("mch_id", wechatPayConfig.getMchId());
+        params.put("nonce_str", generateNonceStr());
+        params.put("out_trade_no", orderId);
+
+        // 生成签名
+        String sign = weixinSignature(params);
+        params.put("sign", sign);
+
+        // 将参数转换为XML
+        String xmlParams = XMLUtil.mapToXml(params);
+
+        // 发送请求到微信支付关闭订单接口
+        String url = "https://api.mch.weixin.qq.com/pay/closeorder";
+        String result = null;
+        try {
+            result = HttpUtil.post(url, xmlParams);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+        // 解析返回结果
+        try {
+            return XMLUtil.xmlToMap(result);
+        } catch (DocumentException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 查询订单
+     */
+    public Map<String, String> queryOrder(String orderId) throws Exception {
+        // 构建请求参数
+        Map<String, String> params = new HashMap<>();
+        params.put("appid", wechatPayConfig.getAppId());
+        params.put("mch_id", wechatPayConfig.getMchId());
+        params.put("nonce_str", generateNonceStr());
+        params.put("out_trade_no", orderId);
+
+        // 生成签名
+        String sign = generateSign(params, wechatPayConfig.getKey());
+        params.put("sign", sign);
+
+        // 将参数转换为XML
+        String xmlParams = XMLUtil.mapToXml(params);
+
+        // 发送请求到微信支付查询订单接口
+        String url = "https://api.mch.weixin.qq.com/pay/orderquery";
+        String result = HttpUtil.post(url, xmlParams);
+
+        // 解析返回结果
+        return XMLUtil.xmlToMap(result);
+    }
+
+
+    /**
+     * 申请退款 - 使用证书
+     */
+    public Map<String, String>  refund(String orderNo, String refundNo, String totalFee, String refundFee, String refundDesc,String callbackPath) {
+        int i = new BigDecimal(totalFee).multiply(new BigDecimal("100")).intValue();
+        int j = new BigDecimal(refundFee).multiply(new BigDecimal("100")).intValue();
+        try {
+            // 构建请求参数
+            Map<String, String> params = new HashMap<>();
+            params.put("appid", wechatPayConfig.getAppId());
+            params.put("mch_id", wechatPayConfig.getMchId());
+            params.put("nonce_str", UUID.randomUUID().toString().replaceAll("-", ""));
+            params.put("out_trade_no", orderNo);
+            params.put("out_refund_no", refundNo);
+            params.put("total_fee", String.valueOf(i));
+            params.put("refund_fee", String.valueOf(j));
+            params.put("refund_desc", refundDesc);
+            params.put("notify_url", wechatPayConfig.getCallbackPath() + callbackPath); // 退款结果
+
+            // 生成签名
+            String sign = weixinSignature(params);
+            params.put("sign", sign);
+
+            // 转换为XML
+            String xmlParams = XMLUtil.mapToXml(params);
+
+            // 使用证书发送请求
+            String result = postWithCert("https://api.mch.weixin.qq.com/secapi/pay/refund", xmlParams);
+
+            // 解析结果
+            Map<String, String> resultMap = XMLUtil.xmlToMap(result);
+            System.out.println("申请退款结果"+resultMap);
+
+            // 验证签名
+            if (!verifySign(resultMap, wechatPayConfig.getKey())) {
+                resultMap.put("return_code","FAILED");
+                resultMap.put("return_msg","申请退款结果签名验证失败");
+                return resultMap;
+            }
+
+            return resultMap;
+        } catch (Exception e) {
+            Map<String, String> resultMap=new HashMap<>();
+            resultMap.put("return_code","FAILED");
+            resultMap.put("return_msg","申请退款失败");
+            return resultMap;
+        }
+    }
+
+    /**
+     * 使用证书发送请求
+     */
+    private String postWithCert(String url, String xmlData) throws Exception {
+        // 证书类型为PKCS12
+        KeyStore keyStore = KeyStore.getInstance("PKCS12");
+        // 获取证书路径
+        String certPath = wechatPayConfig.getCertPath();
+
+        // 如果是classpath路径,使用ClassLoader加载
+        if (certPath.startsWith("classpath:")) {
+            String path = certPath.substring("classpath:".length());
+            try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream(path)) {
+                if (inputStream == null) {
+                    throw new FileNotFoundException("证书文件不存在: " + path);
+                }
+                keyStore.load(inputStream, wechatPayConfig.getMchId().toCharArray());
+            }
+        } else {
+            // 传统文件路径
+            try (FileInputStream inputStream = new FileInputStream(new File(certPath))) {
+                keyStore.load(inputStream, wechatPayConfig.getMchId().toCharArray());
+            }
+        }
+
+        // 实例化密钥库 & 初始化密钥工厂
+        SSLContext sslContext = SSLContext.getInstance("TLS");
+        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
+        kmf.init(keyStore, wechatPayConfig.getMchId().toCharArray());
+        sslContext.init(kmf.getKeyManagers(), null, new SecureRandom());
+
+        // 创建HttpsURLConnection对象
+        URL httpsUrl = new URL(url);
+        HttpsURLConnection conn = (HttpsURLConnection) httpsUrl.openConnection();
+        conn.setSSLSocketFactory(sslContext.getSocketFactory());
+        conn.setDoOutput(true);
+        conn.setDoInput(true);
+        conn.setUseCaches(false);
+        conn.setRequestMethod("POST");
+        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
+
+        // 发送请求
+        OutputStream outputStream = conn.getOutputStream();
+        outputStream.write(xmlData.getBytes("UTF-8"));
+        outputStream.flush();
+        outputStream.close();
+
+        // 获取响应
+        InputStream inputStream = conn.getInputStream();
+        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
+        StringBuilder result = new StringBuilder();
+        String line;
+        while ((line = bufferedReader.readLine()) != null) {
+            result.append(line);
+        }
+        bufferedReader.close();
+        inputStream.close();
+        conn.disconnect();
+
+        return result.toString();
+    }
+
+    /**
+     * 处理退款回调
+     */
+    public RefundCallbackResult processRefundCallback(String xmlData) {
+        try {
+            // 1. 解析回调XML数据
+            if (StringUtils.isEmpty(xmlData)) {
+                return RefundCallbackResult.fail("回调数据为空");
+            }
+
+            //2.解析参数
+            System.out.println(xmlData);
+            System.out.println("----------------------------------------");
+            Map<String, String> resultMap = XMLUtil.xmlToMap(xmlData);
+            System.out.println(resultMap.get("req_info"));
+            // 3. 检查返回状态
+            String returnCode = resultMap.get("return_code");
+
+            if (!"SUCCESS".equals(returnCode)) {
+                String errMsg = resultMap.get("return_msg");
+                return RefundCallbackResult.fail("通信失败:" + errMsg);
+            }
+
+            //4 使用商户API密钥解密req_info(AES-256-CBC算法)
+            String decryptData = decrypt(resultMap.get("req_info"), wechatPayConfig.getKey());
+            Map<String, String> refundDetail = XMLUtil.xmlToMap(decryptData);
+
+
+            // 4. 提取退款信息
+            String orderNo = refundDetail.get("out_trade_no");        // 原订单号
+            String refundNo = refundDetail.get("out_refund_no");      // 退款订单号
+            String refundId = refundDetail.get("refund_id");          // 微信退款ID
+            System.err.println("退款回调成功,订单号:"+orderNo+",退款号:"+refundNo+",状态:{}"+refundId);
+            RefundCallbackResult refundCallbackResult = RefundCallbackResult.success();
+            refundCallbackResult.setOrderNo(orderNo);
+            refundCallbackResult.setRefundNo(refundId);
+
+            return refundCallbackResult;
+
+        } catch (Exception e) {
+            return RefundCallbackResult.fail("系统异常:" + e.getMessage());
+        }
+    }
+
+    private static String wxDecrypt(String req_info, String key)  throws NoSuchPaddingException, NoSuchAlgorithmException, NoSuchProviderException,
+            InvalidKeyException, BadPaddingException, IllegalBlockSizeException{
+        byte[] decode = Base64.getDecoder().decode(req_info);
+        System.out.println(Arrays.toString(decode));
+        String sign = MD5AndKL.MD5Encode(key, "UTF-8").toLowerCase();
+        System.out.println(sign);
+        if (Security.getProvider("BC") == null){
+            Security.addProvider(new BouncyCastleProvider());
+        }
+        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
+        SecretKeySpec secretKeySpec = new SecretKeySpec(sign.getBytes(), "AES");
+        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
+        return new String(cipher.doFinal(decode));
+    }
+
+    /**
+     * 获取RSA加密公钥
+     */
+    public String getRsaPublicKey() {
+        int maxRetries = 3;
+        for (int retryCount = 0; retryCount < maxRetries; retryCount++) {
+            try {
+                System.out.println("尝试获取RSA公钥,第" + (retryCount + 1) + "次");
+
+                // 构建请求参数
+                Map<String, String> params = new HashMap<>();
+                params.put("mch_id", wechatPayConfig.getMchId());
+                params.put("sign_type", "MD5");
+                params.put("nonce_str", generateNonceStr());
+
+                // 生成签名
+                String sign = weixinSignature(params);
+                params.put("sign", sign);
+
+                // 转换为XML
+                String xmlParams = XMLUtil.mapToXml(params);
+
+                // 打印请求参数
+                System.out.println("请求参数: " + xmlParams);
+
+                // 使用证书发送请求(关键修改:使用postWithCert而非普通HTTP请求)
+                String result = postWithCert("https://fraud.mch.weixin.qq.com/risk/getpublickey", xmlParams);
+
+                // 打印响应结果
+                System.out.println("响应结果: " + result);
+
+                // 解析结果
+                Map<String, String> resultMap = XMLUtil.xmlToMap(result);
+                System.out.println("获取RSA公钥结果: " + resultMap);
+
+                // 检查返回状态
+                if (!"SUCCESS".equals(resultMap.get("return_code"))) {
+                    throw new Exception("RSA公钥获取失败: " + resultMap.get("return_msg"));
+                }
+
+                // 保存公钥到本地文件
+                savePublicKeyToClasspath(resultMap.get("pub_key"));
+
+                return resultMap.get("pub_key");
+            } catch (Exception e) {
+                System.err.println("获取RSA公钥异常: " + e.getMessage() + ", 重试次数: " + (retryCount + 1));
+                e.printStackTrace();
+
+                // 如果是最后一次重试,抛出异常
+                if (retryCount == maxRetries - 1) {
+                    return null;
+                }
+
+                // 重试前等待一段时间
+                try {
+                    Thread.sleep(1000 * (retryCount + 1)); // 指数退避
+                } catch (InterruptedException ie) {
+                    Thread.currentThread().interrupt();
+                    return null;
+                }
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * 保存RSA公钥到文件夹
+     * @param publicKey RSA公钥内容
+     */
+    private static void savePublicKeyToClasspath(String publicKey) throws IOException {
+        // 创建 cert 目录(如果不存在)
+        Path certDir = Paths.get(CERT_FOLDER);
+        if (!Files.exists(certDir)) {
+            Files.createDirectories(certDir); // 自动创建目录
+        }
+
+        // 写入公钥文件(UTF-8 编码)
+        Path keyFile = certDir.resolve(RSA_PUBLIC_KEY_FILENAME);
+        Files.write(keyFile, publicKey.getBytes(StandardCharsets.UTF_8));
+    }
+    /**
+     * 从文件夹加载RSA公钥
+     * @return RSA公钥内容
+     */
+    private static String loadPublicKeyFromClasspath() throws IOException {
+        Path keyFile = Paths.get(CERT_FOLDER + RSA_PUBLIC_KEY_FILENAME);
+        byte[] bytes = Files.readAllBytes(keyFile); // 读取所有字节
+        return new String(bytes, StandardCharsets.UTF_8); // 转为UTF-8字符串
+    }
+
+    /**
+     * 加载公钥 返回PublicKey对象
+     */
+    public static PublicKey loadPublicKey(String pemContent) throws Exception {
+        // 读取PEM文件内容
+//        String pemContent = new String(Files.readAllBytes(Paths.get(CERT_FOLDER + RSA_PUBLIC_KEY_FILENAME)), StandardCharsets.UTF_8);
+
+        // 移除PEM头尾标记
+        String publicKeyPEM = pemContent
+                .replace("-----BEGIN RSA PUBLIC KEY-----", "")
+                .replace("-----END RSA PUBLIC KEY-----", "")
+                .replaceAll("\\s", ""); // 去除换行/空格
+
+        // 解码Base64
+        byte[] encoded = Base64.getDecoder().decode(publicKeyPEM);
+
+        // 手动解析PKCS#1格式
+        DerInputStream derReader = new DerInputStream(encoded);
+        DerValue[] seq = derReader.getSequence(0);
+        BigInteger modulus = seq[0].getBigInteger();
+        BigInteger exponent = seq[1].getBigInteger();
+
+        RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, exponent);
+        return KeyFactory.getInstance("RSA").generatePublic(keySpec);
+    }
+
+    /**
+     * 使用RSA-OAEP加密数据
+     * @param plaintext 待加密的明文
+     * @return Base64编码的密文
+     */
+    public static String encrypt(String plaintext, PublicKey publicKey) throws Exception {
+        Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWITHSHA-1ANDMGF1PADDING");
+        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+
+        byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
+        return Base64.getEncoder().encodeToString(encryptedBytes);
+    }
+
+
+
+    /**
+     * 商户付款到银行卡(优先使用本地保存的公钥)
+     * @param partnerTradeNo 商户订单号
+     * @param bankNo 银行卡号
+     * @param trueName 银行卡真实姓名
+     * @param bankCode 银行编码
+     * @param amount 金额(分)
+     * @param desc 付款说明
+     * @return 付款结果
+     */
+    public Map<String, String> payToBankCard(String partnerTradeNo, String bankNo, String trueName,
+                                             String bankCode, BigDecimal amount, String desc) throws Exception {
+        int i = amount.multiply(new BigDecimal("100")).intValue();
+        // 1. 尝试从本地加载RSA公钥
+        String pubKey = loadPublicKeyFromClasspath();
+
+        // 2. 如果本地没有公钥或公钥无效,则从微信获取新公钥
+        if (pubKey == null || pubKey.isEmpty()) {
+            pubKey = getRsaPublicKey();
+
+        }
+        //公钥对象
+        PublicKey publicKey = loadPublicKey(pubKey);
+
+        // 3. 使用RSA公钥加密银行卡号和真实姓名
+        String encryptedBankNo = encrypt(bankNo, publicKey);
+        String encryptedTrueName = encrypt(trueName, publicKey);
+
+        // 4. 构建请求参数
+        Map<String, String> params = new HashMap<>();
+        params.put("mch_id", wechatPayConfig.getMchId());
+        params.put("partner_trade_no", partnerTradeNo);
+        params.put("enc_bank_no", encryptedBankNo);
+        params.put("enc_true_name", encryptedTrueName);
+        params.put("bank_code", bankCode);
+        params.put("amount", String.valueOf(i));
+        params.put("desc", desc);
+        params.put("nonce_str", generateNonceStr());
+
+        // 生成签名
+        String sign = weixinSignature(params);
+        params.put("sign", sign);
+
+        // 将参数转换为XML
+        String xmlParams = XMLUtil.mapToXml(params);
+
+        // 5. 发送请求到微信支付付款到银行卡接口
+        String url = "https://api.mch.weixin.qq.com/mmpaysptrans/pay_bank";
+        String result = postWithCert(url, xmlParams);
+
+        // 解析返回结果
+        Map<String, String> resultMap = XMLUtil.xmlToMap(result);
+
+        // 验证签名
+        if (!verifySign(resultMap, wechatPayConfig.getKey())) {
+            throw new Exception("付款到银行卡签名验证失败");
+        }
+
+        return resultMap;
+    }
+
+    public static void main(String[] args) throws IOException {
+
+        String info="CjlaS7RVnPn7zzP5ByZDxUN7OrXGp1/DEdO0qahpIqDH/gTNHb/U7VmrVV0S4lXrIa0N8FEREC3CdIeT4XB5P4D0E8TSURu6J/cD01hFu28f0JDRfeips3vSpTgznRGyCfnUBDPYwyrVeP29Wac7WAb3CCcJf7OZWaweOUkaKjaBRa1GzMZcguSZnQJz0cD5Jb4HbTMvM0VAebfCY9aXdfFBIbm+cPYESo3awqwkNTQeT4V+FViw8f8sjkH0TScMgWBiSKmQC837BLD27yIGklqlYkDP2IMeiNw+b12qCAGszfp2vYd3X+HpViXkQQet3PJWYlAm55R+IgvschP7Ub65XzLINfQrJKrQUXiKKO2LwoSRSwZvfDkR8G8E8X59CnU2XvWKeos5Y0q8ckbJb97yI+09nNgMjYyJoVCVjTFgFMDEQ4+e3CpYRhD6V/3RBp+TvBwszldbRav2XEuCXL2kCJyJEAqLPMNyfYBSNF8z1btjyz0+y/xQQcySKlQInZ710FxSE7KwRSBQ92j9nDdlR7UxCrPVCkEd+GrVNSqqnyjNh1J/rPJPHvvGwkPPq72TKiw6ZgaIgIDhy0/lWHTclo4sjYAWuUVfg3CJ8dqkuQwVZ7i0+NiahIl78RtcUph8NR48yUgBkN7WhCcu5wLbg2tu8Qe0SIwHF+RW1x9Yc8akEkNbMd4xzs8lY5MYEU9V16U8RyWJuwPDph3RnmV8HQ+2hfzmjCvPkBwtfR8P5VdK86OIsHfnfQxAcPM2a86tOBBzFXPrLHgd2CRcDKH+MXTw7RSH/bk1PiMUAWF8TQsNDzgUlznJnkjiQxoym/4ZUf4C6072KKQHbp6bgBYkBhJLT2lmjVMNSX5b1SXM9eTQixRfq6MKGw3P8XJnKdofktVv+KtSzWQlW0C8p504NWACiExupF5EII7FG+xCWt7urWUbc4NRI36UFrKToQCLVv6UBCXt/t9iWlvs6SfuZhpCexeMmZWeiIldzRu87U9rXR46Hu7DAL8dZ+0ItsIZYThSIABzZgaLKggXlkjyAcbcPYKO7egrCmDtFhzHuh4uA3VeBylL3/ZLZ4FUedn/8L4e2iAu22Qj46ORlu17W5R8Ez9kubydeAgC9PkWnjptaubPxE0bjPN69tec";
+
+        String key="fD0JzscfMf295SYtRK3MnPRjSCA4Gahr";
+        try {
+            String decrypted = decrypt(info, key);
+            System.out.println("解密结果: " + decrypted);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    public static String decrypt(String encryptedStringA, String merchantKey) throws Exception {
+        // 1. 对加密串A做base64解码,得到加密串B
+        byte[] decode = Base64.getDecoder().decode(encryptedStringA);
+
+        // 2. 对商户key做md5,得到32位小写key*
+        String sign = MD5AndKL.MD5Encode(merchantKey, "UTF-8").toLowerCase();
+
+        // 3. 确保BouncyCastle提供者已添加
+        if (Security.getProvider("BC") == null) {
+            Security.addProvider(new BouncyCastleProvider());
+        }
+
+        // 4. 使用AES-256-ECB解密(PKCS7Padding)
+        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
+
+        // 注意:微信要求使用AES-256,所以密钥应为32字节(256位)
+        // 如果MD5结果是32字节(256位),直接使用
+        byte[] aesKey = sign.getBytes(StandardCharsets.UTF_8);
+
+        SecretKeySpec secretKeySpec = new SecretKeySpec(aesKey, "AES");
+        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
+
+        // 执行解密并指定UTF-8编码
+        byte[] decryptedBytes = cipher.doFinal(decode);
+        return new String(decryptedBytes, StandardCharsets.UTF_8);
+    }
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/wx/XMLUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/wx/XMLUtil.java
new file mode 100644
index 0000000..82e7139
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/wx/XMLUtil.java
@@ -0,0 +1,52 @@
+package com.ruoyi.system.wx;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * XML工具类
+ */
+public class XMLUtil {
+
+    /**
+     * 将Map转换为XML字符串
+     */
+    public static String mapToXml(Map<String, String> params) {
+        Document document = DocumentHelper.createDocument();
+        // 禁用XML声明
+        document.setXMLEncoding(null);  // 关键设置
+
+        Element root = document.addElement("xml");
+        for (Map.Entry<String, String> entry : params.entrySet()) {
+            String key = entry.getKey();
+            String value = entry.getValue() != null ? entry.getValue() : "";
+            root.addElement(key).setText(value);
+        }
+        
+        return document.asXML();
+    }
+    
+    /**
+     * 将XML字符串转换为Map
+     */
+    public static Map<String, String> xmlToMap(String xmlStr) throws DocumentException {
+        Map<String, String> map = new HashMap<>();
+        Document document = DocumentHelper.parseText(xmlStr);
+        Element root = document.getRootElement();
+
+        for (Iterator<?> iterator = root.elementIterator(); iterator.hasNext();) {
+            Element element = (Element) iterator.next();
+            // 关键修改:获取元素内所有内容(包括CDATA)
+            String value = element.getStringValue(); // 自动处理CDATA
+            map.put(element.getName(), value);
+        }
+
+        return map;
+    }
+}
diff --git a/ruoyi-system/src/main/resources/cert/apiclient_cert.p12 b/ruoyi-system/src/main/resources/cert/apiclient_cert.p12
new file mode 100644
index 0000000..2acc9b5
--- /dev/null
+++ b/ruoyi-system/src/main/resources/cert/apiclient_cert.p12
Binary files differ
diff --git a/ruoyi-system/src/main/resources/cert/apiclient_cert.pem b/ruoyi-system/src/main/resources/cert/apiclient_cert.pem
new file mode 100644
index 0000000..56a3461
--- /dev/null
+++ b/ruoyi-system/src/main/resources/cert/apiclient_cert.pem
@@ -0,0 +1,25 @@
+-----BEGIN CERTIFICATE-----
+MIIEJDCCAwygAwIBAgIUPzcz2XhuGAdLsR4fKcRiVtSVTEkwDQYJKoZIhvcNAQEL
+BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
+FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
+Q0EwHhcNMjUwNjIzMDkwNDI4WhcNMzAwNjIyMDkwNDI4WjB+MRMwEQYDVQQDDAox
+NzIwNTUyNjk4MRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xKjAoBgNVBAsM
+IeWbm+W3neS4gOivgeaIkOenkeaKgOaciemZkOWFrOWPuDELMAkGA1UEBhMCQ04x
+ETAPBgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAu5sppa1rG+Xc0XPW78kKw0Bq+oYjuzEfjh3pwurmwrOsqmPaQj4aHXS8M2eW
+nRG6oP4BR3dQnphDRCGTdBoVTHOrNJt3xBJ+iSkbnQLH7aHhymyZxo5bZ7q9LnzZ
+SMqojYJ9CoDeriubrNWR5pXTB02xJsSPXKo4KwrJIgUQJ0bc2EuyngwZ5rJKeetW
+yA7Pw4NZ5X3X0iBXTfhItaW1RLcBegny+K14AneYjpvAqMt3ynV6xQqvl3s0dCDr
+8Bo33ds0vi1dr40gM7HvBaQ2oMXIvVdl4xX1H4OM84JwVOKyG/hTC9PWIznxV+es
+vDKenuBhRJ0I1N/fy7q0aYDiIwIDAQABo4G5MIG2MAkGA1UdEwQCMAAwCwYDVR0P
+BAQDAgP4MIGbBgNVHR8EgZMwgZAwgY2ggYqggYeGgYRodHRwOi8vZXZjYS5pdHJ1
+cy5jb20uY24vcHVibGljL2l0cnVzY3JsP0NBPTFCRDQyMjBFNTBEQkMwNEIwNkFE
+Mzk3NTQ5ODQ2QzAxQzNFOEVCRDImc2c9SEFDQzQ3MUI2NTQyMkUxMkIyN0E5RDMz
+QTg3QUQxQ0RGNTkyNkUxNDAzNzEwDQYJKoZIhvcNAQELBQADggEBAAiJH9rQLYd9
+3OX8FDxGLetiUd8tIS+Y3fjZhxYiGTF6wz6mR5L3RMYqxZcbb2OWFi1dzYQ97lrY
+1spt4+1a5pjeMNlEX9hPUVriWTDN0YhNIvQ2vQ3IbXgWTve0cuwSfc/cyWqhdSCq
+7V7jzVs+LRewXsvUyXgqG3Tshzadhi6CL1njAa3PUcSkzgLHKptaD/3irx/nniLB
+j6ktq7e/0Orj3BJYQueYtA0LZrk3OacnbDiIeHgw6qLGounfSHbuIWSSLUa6ghW9
+JovmWWENapQF7kT6kh+FalMi0au1xpgKnEgRDjuVyXt9PfLWi+2GWKtsy2gLCzq7
+wS2ob3v4ey8=
+-----END CERTIFICATE-----
diff --git a/ruoyi-system/src/main/resources/cert/apiclient_key.pem b/ruoyi-system/src/main/resources/cert/apiclient_key.pem
new file mode 100644
index 0000000..dc74834
--- /dev/null
+++ b/ruoyi-system/src/main/resources/cert/apiclient_key.pem
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC7mymlrWsb5dzR
+c9bvyQrDQGr6hiO7MR+OHenC6ubCs6yqY9pCPhoddLwzZ5adEbqg/gFHd1CemENE
+IZN0GhVMc6s0m3fEEn6JKRudAsftoeHKbJnGjltnur0ufNlIyqiNgn0KgN6uK5us
+1ZHmldMHTbEmxI9cqjgrCskiBRAnRtzYS7KeDBnmskp561bIDs/Dg1nlfdfSIFdN
++Ei1pbVEtwF6CfL4rXgCd5iOm8Coy3fKdXrFCq+XezR0IOvwGjfd2zS+LV2vjSAz
+se8FpDagxci9V2XjFfUfg4zzgnBU4rIb+FML09YjOfFX56y8Mp6e4GFEnQjU39/L
+urRpgOIjAgMBAAECggEBAIn+kd3J97UnmQt/16O9D2ubYJUyQeoZMgrJOf8j5eVl
+YCZdGFgNcgwkp6JwGbsjJVHyRGKbAvQFL8VXpSyLWwtHMbGagbf5mpWtZSBSwVir
+8HeC9oG0iMt98lXVg8YlO2ILj4pATIt0jCfPWGhx4C3JGftYLdONaY9Pea7KZp1c
+IgOsXA84+7V+ndyOTDbXTot6UOjOccwfQ3qUHDtCWmGoauoO0ftCqMa4SxADKiMg
+auQup9wYpApnqvIZuD2TzXUCGjXxmfTYM9pesrq11zWH2u7vJ6fbFLlM+zKgmxkp
+lqIWChDpzMrUjMaAW4ufIN/ekuGMdAyYKGET3pK5F2ECgYEA2zLGzwB6BZ87ponR
+bcULQCQ6dsZt6X+dTSTO6Qopsabcdxtqb5W0iopMSVK18byV6eVZxYIUaHnATIry
+KKpLEM4N0ghjG6e0zv2yGEXfdEnmGAy/HPaRh2osPT9zXA+Kofliv9MUbIb4h+bl
+EtGOsIlp/juUOoBPh3kGAUkvOAsCgYEA2xqKS/LaNnHUR38SHvCJKAJlZxqFFAuf
+AdL2jCo5BKsFAt0BOhx/gdaw7z0uf4oGYs1RxOcF9Cun6IHC+mvM8tKrbyL0Xv3x
+/syEuVpjJtxSctQUVgOq14jqJSsBZpMr8bJhK3sAs7BoPqIFPCoTljtGxL+lb+9o
+VIkQMQvzFUkCgYBC2zDiMD4HevLBr+Vtupzc2m/ujEU349GBlwl48L2YztENjxIe
+qKWhX982ugB+k8uRxH9mC2/YEdKCRhroJlCw9ngmqKI57CPswlpQpvcpy+RfT3v3
+BImMqOiHYdP4r1DUaHEjGulu1Jf3M4iI/dusoqzuexOR6FLZeiNHvx+k0wKBgFD2
+YK4p4hqGO3Pj77VBGt2O7RuJQC2lEa+h3frzSzh/XY2uTtrDVxaKV70/tWPpg+yU
+hCenWprcWuJeuMbCeOwtjq21k+laG0cVGeJIFSVx+oF1/sG9/y4/6I2tc4oMzgs0
+6BUiEaNUh2DFi/usbKpx4vem/aH8LGg4caQ+DygJAoGBAJsZ265oRTC2LshrGVeD
+yXCmTs4DjkK7EXgMrl8OyIymG64XdEUnpnN50dvFYnW2a7jlUhzBcwVAf4/gJ0k4
+gfymOwkk9dsAUEkuiWXNVpUFi1Fdf39ADqeh3kwRpbBnOv3bwJ7h+i8i590TIGNK
+RINSd54kN0iLwgVC5/d+lSv1
+-----END PRIVATE KEY-----
diff --git a/ruoyi-system/src/main/resources/mapper/system/AppUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/AppUserMapper.xml
index b2eb90f..b316e91 100644
--- a/ruoyi-system/src/main/resources/mapper/system/AppUserMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/AppUserMapper.xml
@@ -19,8 +19,9 @@
         left join (select user_id, count(1) as num from tb_order  where  status = 6  group by user_id) buy on tbu.id = buy.user_id
         left join (select c.user_id,count(o.company_id) as num from tb_company c left join tb_order o on c.id=o.company_id and o.status=6  group by c.user_id) sell on tbu.id = sell.user_id
         where tbu.is_delete =0
-        <if test="null != dto.username and dto.username != '' ">
-            and tbu.user_name like concat('%',#{dto.username},'%')
+            and tbu.status != 3
+        <if test="null != dto.userName and dto.userName != '' ">
+            and tbu.user_name like concat('%',#{dto.userName},'%')
         </if>
         <if test="null != dto.phone and dto.phone != '' ">
             and tbu.phone like concat('%',#{dto.phone},'%')
diff --git a/ruoyi-system/src/main/resources/mapper/system/OrderMapper.xml b/ruoyi-system/src/main/resources/mapper/system/OrderMapper.xml
index c1a5b93..0c4e091 100644
--- a/ruoyi-system/src/main/resources/mapper/system/OrderMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/OrderMapper.xml
@@ -7,86 +7,84 @@
         select  COALESCE(SUM(commission_price), 0.00) AS total_commission from tb_order where status in (4,5) and share_user_id =#{id}
     </select>
     <select id="getOrderPage" resultType="com.ruoyi.system.pojo.vo.OrderPageVO">
-        select
-            c.id,
-            o.order_no,
-            publish.user_name as publishName,
-            publish.phone as publishPhone,
-            o.price,
-            book.user_name as bookName,
-            book.phone as bookPhone,
-            c.create_time as createTime,
-            o.create_time as bookTime,
-            o.finish_time as finishTime,
-            -- 状态映射逻辑
+        SELECT
+        c.id,
+        o.order_no,
+        publish.user_name AS publishName,
+        publish.phone AS publishPhone,
+        o.price,
+        book.user_name AS bookName,
+        book.phone AS bookPhone,
+        c.create_time AS createTime,
+        o.create_time AS bookTime,
+        o.finish_time AS finishTime,
+        -- 状态映射逻辑
+        CASE
+        WHEN c.status = -1 THEN -1
+        WHEN c.status = 1 THEN 1
+        WHEN c.status = 2 THEN 7
+        WHEN c.status = 3 THEN 6
+        WHEN c.status = 4 THEN
+        CASE
+        WHEN o.status = 1 THEN 1
+        WHEN o.status = 2 THEN 2
+        WHEN o.status = 3 THEN 3
+        WHEN o.status IN (4, 5) THEN 4
+        WHEN o.status = 6 THEN 6
+        ELSE c.status
+        END
+        ELSE c.status
+        END AS status
+        FROM
+        tb_company c
+        LEFT JOIN tb_order o ON o.company_id = c.id AND o.status != -1
+        LEFT JOIN (SELECT id, user_name, phone FROM tb_user GROUP BY id) publish ON c.user_id = publish.id
+        LEFT JOIN (SELECT id, user_name, phone FROM tb_user GROUP BY id) book ON o.user_id = book.id
+        WHERE
+        c.is_delete = 0
+        <if test="null != dto.orderNo">
+            AND o.order_no LIKE CONCAT('%', #{dto.orderNo}, '%')
+        </if>
+        <if test="null != dto.publishName and '' != dto.publishName">
+            AND publish.user_name LIKE CONCAT('%', #{dto.publishName}, '%')
+        </if>
+        <if test="null != dto.publishPhone and '' != dto.publishPhone">
+            AND publish.phone LIKE CONCAT('%', #{dto.publishPhone}, '%')
+        </if>
+        <if test="null != dto.bookName and '' != dto.bookName">
+            AND book.user_name LIKE CONCAT('%', #{dto.bookName}, '%')
+        </if>
+        <if test="null != dto.bookPhone and '' != dto.bookPhone">
+            AND book.phone LIKE CONCAT('%', #{dto.bookPhone}, '%')
+        </if>
+        <if test="null != dto.createTimeStart and null != dto.createTimeEnd">
+            AND c.create_time BETWEEN #{dto.createTimeStart} AND #{dto.createTimeEnd}
+        </if>
+        <if test="null != dto.bookTimeStart and null != dto.bookTimeEnd">
+            AND o.create_time BETWEEN #{dto.bookTimeStart} AND #{dto.bookTimeEnd}
+        </if>
+        <if test="null != dto.finishTimeStart and null != dto.finishTimeEnd">
+            AND o.finish_time BETWEEN #{dto.finishTimeStart} AND #{dto.finishTimeEnd}
+        </if>
+        <if test="null != dto.status">
+            AND (
+            -- 直接匹配原始状态
+            (c.status IN (1,2,3) AND
             CASE
-                WHEN c.status = 1 THEN 1
-                WHEN c.status = 2 THEN 6
-                WHEN c.status = 3 THEN 5
-                WHEN c.status = 4 THEN
-                    CASE
-                        WHEN o.status = 2 THEN 2
-                        WHEN o.status = 3 THEN 3
-                        WHEN o.status IN (4, 5) THEN 4
-                        ELSE c.status  -- 默认保持原状态(可根据需求调整)
-                        END
-                ELSE c.status  -- 其他状态保持不变
-                END AS status
-        from
-            tb_company c
-        left join tb_order o on c.id = o.company_id and o.status != -1
-        left join (select id,user_name,phone from tb_user group by id) publish on c.user_id = publish.id
-        left join (select id,user_name,phone from tb_user group by id) book on o.user_id = book.id
-        where
-            c.is_delete=0
-
-            <if test="null != dto.orderNo">
-                and o.order_no like concat('%',#{dto.orderNo},'%')
-            </if>
-            <if test="null != dto.publishName and '' != dto.publishName">
-                and publish.user_name like concat('%',#{dto.publishName},'%')
-            </if>
-            <if test="null != dto.publishPhone and '' != dto.publishPhone">
-                and publish.phone like concat('%',#{dto.publishPhone},'%')
-            </if>
-
-            <if test="null != dto.bookName and '' != dto.bookName">
-                and book.user_name like concat('%',#{dto.bookName},'%')
-            </if>
-            <if test="null != dto.bookPhone and '' != dto.bookPhone">
-                and book.phone like concat('%',#{dto.bookPhone},'%')
-            </if>
-
-            <if test="null != dto.createTimeStart and null != dto.createTimeEnd">
-                and c.create_time between #{dto.createTimeStart} and  #{dto.createTimeEnd}
-            </if>
-
-            <if test="null != dto.bookTimeStart and null != dto.bookTimeEnd">
-                and o.create_time between #{dto.bookTimeStart} and  #{dto.bookTimeEnd}
-            </if>
-
-            <if test="null != dto.finishTimeStart and null != dto.finishTimeEnd">
-                and o.finish_time between #{dto.finishTimeStart} and  #{dto.finishTimeEnd}
-            </if>
-
-            <if test="null != dto.status">
-                AND (
-                <!-- 直接匹配原始状态 -->
-                (c.status IN (1,2,3) AND
-                CASE
-                WHEN c.status = 1 THEN 1
-                WHEN c.status = 2 THEN 6
-                WHEN c.status = 3 THEN 5
-                ELSE c.status
-                END = #{dto.status})
-                <!-- 匹配映射后的状态4(c.status=4且o.status=4/5) -->
-                OR (c.status = 4 AND o.status IN (4,5) AND 4 = #{dto.status})
-                <!-- 匹配映射后的状态2(c.status=4且o.status=2) -->
-                OR (c.status = 4 AND o.status = 2 AND 2 = #{dto.status})
-                <!-- 匹配映射后的状态3(c.status=4且o.status=3) -->
-                OR (c.status = 4 AND o.status = 3 AND 3 = #{dto.status})
-                )
-            </if>
+            WHEN c.status = 1 THEN 1
+            WHEN c.status = 2 THEN 6
+            WHEN c.status = 3 THEN 5
+            ELSE c.status
+            END = #{dto.status})
+            -- 匹配映射后的状态4(c.status=4且o.status=4/5)
+            OR (c.status = 4 AND o.status IN (4,5) AND 4 = #{dto.status})
+            -- 匹配映射后的状态2(c.status=4且o.status=2)
+            OR (c.status = 4 AND o.status = 2 AND 2 = #{dto.status})
+            -- 匹配映射后的状态3(c.status=4且o.status=3)
+            OR (c.status = 4 AND o.status = 3 AND 3 = #{dto.status})
+            )
+        order by c.create_time,o.create_time
+        </if>
     </select>
     <select id="getDetailById" resultType="com.ruoyi.system.pojo.vo.OrderDetailVO">
 
@@ -95,8 +93,8 @@
             -- 状态映射逻辑
             CASE
                 WHEN c.status = 1 THEN 1
-                WHEN c.status = 2 THEN 6
-                WHEN c.status = 3 THEN 5
+                WHEN c.status = 2 THEN 7
+                WHEN c.status = 3 THEN 6
                 WHEN c.status = 4 THEN
                     CASE
                         WHEN o.status = 2 THEN 2
@@ -107,6 +105,7 @@
                 ELSE c.status  -- 其他状态保持不变
                 END AS status,
             o.id as orderId,
+
             c.company_name,
             c.establish_time,
             concat(c.city,c.province,c.area) as place,
@@ -144,8 +143,8 @@
                     (
                         CASE
                             WHEN c.status = 1 THEN 1
-                            WHEN c.status = 2 THEN 6
-                            WHEN c.status = 3 THEN 5
+                            WHEN c.status = 2 THEN 7
+                            WHEN c.status = 3 THEN 6
                             WHEN c.status = 4 THEN
                                 CASE
                                     WHEN o.status = 2 THEN 2
@@ -204,6 +203,13 @@
         FROM tb_order
         WHERE status IN (4, 5, 6)
           AND is_refund = 0
+        <if test="null != dto.orderNo and '' != dto.orderNo">
+            and order_no LIKE CONCAT('%', #{dto.orderNo}, '%')
+        </if>
+        <if test="null != dto.operateTimeStart and null != dto.operateTimeEnd">
+            and pay_time between #{dto.operateTimeStart} and #{dto.operateTimeEnd}
+        </if>
+        AND ( #{dto.type} IS NULL  OR 1 = #{dto.type} )
     </select>
     <select id="flowsPage" resultType="com.ruoyi.system.pojo.vo.FinanceFlowsPageVO">
         SELECT
@@ -225,7 +231,7 @@
             <if test="null != dto.operateTimeStart and null != dto.operateTimeEnd">
                 and pay_time between #{dto.operateTimeStart} and #{dto.operateTimeEnd}
             </if>
-        AND ( #{dto.type} IS NULL OR 1 = #{dto.type} )
+        AND ( #{dto.type} IS NULL  OR 1 = #{dto.type} )
         UNION ALL
         SELECT
             order_no,
@@ -243,9 +249,9 @@
         <if test="null != dto.operateTimeStart and null != dto.operateTimeEnd">
             and refund_time between #{dto.operateTimeStart} and #{dto.operateTimeEnd}
         </if>
-        AND ( #{dto.type} IS NULL OR 2 = #{dto.type} )
+        AND ( #{dto.type} IS NULL  OR 2 = #{dto.type} )
         ORDER BY operateTime DESC
-        LIMIT #{dto.pageNum}, #{dto.pageSize};
+        LIMIT #{dto.offset}, #{dto.pageSize};
     </select>
     <select id="countFlowsPage" resultType="java.lang.Long">
         SELECT COUNT(*) FROM (
diff --git a/ruoyi-system/src/main/resources/mapper/system/QuestionMapper.xml b/ruoyi-system/src/main/resources/mapper/system/QuestionMapper.xml
index a403bb8..b0b19cd 100644
--- a/ruoyi-system/src/main/resources/mapper/system/QuestionMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/QuestionMapper.xml
@@ -4,12 +4,12 @@
 
 
     <select id="getQuestionPage" resultType="com.ruoyi.system.pojo.vo.QuestionPageVO">
-        select id,name ,order_num
+        select id,title ,order_num
          from tb_question
          where
-             del_flg=0
-         <if test="null != name and '' != name">
-             and name like concat('%',#{name},'%')
+             del_flag=0
+         <if test="null != title and '' != title">
+             and title like concat('%',#{title},'%')
          </if>
 
     </select>
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml
index 0b2a2d1..b72e412 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml
@@ -142,6 +142,21 @@
 		where
 			sm.parent_id = 0 order by sm.order_num 	asc
 	</select>
+	<select id="selectMenusByUserId" resultType="com.ruoyi.common.core.domain.entity.SysMenu">
+		select
+			m.menu_id, m.parent_id
+		from  sys_user_role ur
+				  left join sys_role_menu rm on ur.role_id = rm.role_id
+				  left join sys_menu m on rm.menu_id =  m.menu_id
+		where
+			ur.user_id=#{userId}
+	</select>
+	<select id="getPathsByMenuIds" resultType="java.lang.String">
+		select path from sys_menu where menu_id in
+		<foreach collection='ids' item='id' open='(' separator=',' close=')'>
+			#{id}
+		</foreach>
+	</select>
 
 	<update id="updateMenu" parameterType="SysMenu">
 		update sys_menu
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml
index 3dc43fc..ae80bf1 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml
@@ -14,9 +14,12 @@
 	</select>
     <select id="selectMenuIdsByRoleIds" resultType="java.lang.Long">
 		select menu_id from sys_role_menu where role_id in
-		<foreach collection="roleList" item="roleId" open="(" separator="," close=")">
-			#{roleId}
-		</foreach>
+		<if test="roleList != null  and !roleList.isEmpty">
+			<foreach collection="roleList" item="roleId" open="(" separator="," close=")">
+				#{roleId}
+			</foreach>
+		</if>
+
 	</select>
 
     <delete id="deleteRoleMenuByRoleId" parameterType="Long">
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
index 8d1b8a7..bcce7c4 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -123,7 +123,7 @@
 	
 	<select id="selectUserByUserName" parameterType="String" resultMap="SysUserResult">
 	    <include refid="selectUserVo"/>
-		where u.user_name = #{userName} and u.del_flag = '0'
+		where u.phonenumber = #{userName}
 	</select>
 	
 	<select id="selectUserById" parameterType="Long" resultMap="SysUserResult">

--
Gitblit v1.7.1