From 0c569ab4b38d972213eeaf7e8965f33f8ec650fd Mon Sep 17 00:00:00 2001
From: luodangjia <luodangjia>
Date: 星期二, 05 十一月 2024 11:19:19 +0800
Subject: [PATCH] 11.5

---
 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/mapper/TFranchiseeBalanceChangeMapper.java            |   16 
 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/OrderReasinDto.java                                |    4 
 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/InfoDto.java                                       |   15 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChangeDispatchController.java              |    9 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java                 |    6 
 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/entity/Franchisee.java                                |    5 
 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/service/impl/TFranchiseeBalanceChangeServiceImpl.java |   21 +
 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/MD5AndKL.java                                   |  112 +++++
 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/entity/TFranchiseeBalanceChange.java                  |   91 ++++
 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/FranchiseeController.java                  |  434 ++++++++++++++++++++
 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/config/WeChatConfig.java                              |  121 +++++
 ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/controller/OssController.java                       |  136 +++++-
 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/SiteController.java                        |    4 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java                       |    7 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java                    |    1 
 ruoyi-service/ruoyi-order/src/main/resources/mapper/order/ChangeDispatchMapper.xml                            |    8 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java                      |    4 
 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/RencentBalance.java                                |   14 
 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/OrderController.java                       |   18 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ExchangeDispatchFallbackFactory.java      |    5 
 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/MoneyRecentQuery.java                              |   25 +
 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/ChangeDispatchController.java              |    4 
 ruoyi-service/ruoyi-admin/pom.xml                                                                             |    6 
 ruoyi-service/ruoyi-admin/src/main/resources/template/加盟商余额记录.xlsx                                            |    0 
 ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/controller/OrderController.java                     |    4 
 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/WeChatUtil.java                                 |  128 ++++++
 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/WechatPaySignature.java                         |   36 +
 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/service/TFranchiseeBalanceChangeService.java          |   16 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ExchangeDispatchClient.java           |    2 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/request/ChangeDispatchRequest.java                    |    1 
 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/entity/Site.java                                      |    3 
 31 files changed, 1,212 insertions(+), 44 deletions(-)

diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ExchangeDispatchFallbackFactory.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ExchangeDispatchFallbackFactory.java
index e658148..beeafe0 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ExchangeDispatchFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ExchangeDispatchFallbackFactory.java
@@ -61,6 +61,11 @@
             public R<Boolean> refuseChangeDispatch(String id) {
                 return R.fail(cause.getMessage());
             }
+
+            @Override
+            public void changeReason(String id, String reason) {
+
+            }
         };
     }
 }
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java
index 9357c4f..93eac04 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java
@@ -12,6 +12,7 @@
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -247,6 +248,11 @@
             }
 
             @Override
+            public R<Boolean> updateArrivalTime(String orderId, Date arriveTime) {
+                return null;
+            }
+
+            @Override
             public R<Boolean> changeOrderState(String orderId, Integer state) {
                 return R.fail(cause.getMessage());
             }
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ExchangeDispatchClient.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ExchangeDispatchClient.java
index d490f87..9903e4e 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ExchangeDispatchClient.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ExchangeDispatchClient.java
@@ -108,4 +108,6 @@
     @GetMapping(value = "changeDispatch/refuseChangeDispatch")
     R<Boolean> refuseChangeDispatch(@RequestParam("id") String id);
 
+    @GetMapping(value = "changeDispatch/changeReason")
+    void changeReason(@RequestParam("id")String id,@RequestParam("reason") String reason);
 }
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java
index 79d6e53..80529b7 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java
@@ -17,6 +17,7 @@
 import org.springframework.web.bind.annotation.RequestParam;
 
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -425,5 +426,6 @@
     R<String> oldData(@RequestParam("index") Integer index,
                       @RequestParam("pageNum") Integer pageNum,
                       @RequestParam("pageSize") Integer pageSize);
-
+    @GetMapping(value = "/order/updateArrivalTime")
+    R<Boolean> updateArrivalTime(@RequestParam("orderId")String orderId,@RequestParam("arriveTime")Date arriveTime);
 }
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java
index 22df5c7..64bfb59 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java
@@ -146,6 +146,7 @@
      * 订单记录excel模板名称
      */
     public static final String EXCEL_ORDER_FILE_NAME = "订单记录";
+    public static final String EXCEL_ORDER_FILE_NAME1 = "加盟商余额记录";
 
     /**
      * 用户编号生成前缀
diff --git a/ruoyi-service/ruoyi-admin/pom.xml b/ruoyi-service/ruoyi-admin/pom.xml
index cc03a02..321619a 100644
--- a/ruoyi-service/ruoyi-admin/pom.xml
+++ b/ruoyi-service/ruoyi-admin/pom.xml
@@ -19,6 +19,12 @@
 
     <dependencies>
         <dependency>
+            <groupId>com.github.wechatpay-apiv3</groupId>
+            <artifactId>wechatpay-java</artifactId>
+            <version>0.2.12</version>
+        </dependency>
+
+        <dependency>
             <groupId>org.openeuler</groupId>
             <artifactId>bgmprovider</artifactId>
             <version>1.0.4</version>
diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/config/WeChatConfig.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/config/WeChatConfig.java
new file mode 100644
index 0000000..4511cd9
--- /dev/null
+++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/config/WeChatConfig.java
@@ -0,0 +1,121 @@
+package com.ruoyi.admin.config;
+
+import javax.annotation.PostConstruct;
+
+import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner;
+import com.wechat.pay.java.service.refund.RefundService;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+
+import com.wechat.pay.java.core.Config;
+import com.wechat.pay.java.core.RSAAutoCertificateConfig;
+import com.wechat.pay.java.core.notification.NotificationConfig;
+import com.wechat.pay.java.core.notification.NotificationParser;
+import com.wechat.pay.java.service.payments.h5.H5Service;
+import com.wechat.pay.java.service.payments.jsapi.JsapiService;
+import com.wechat.pay.java.service.payments.nativepay.NativePayService;
+
+import lombok.Getter;
+
+import java.security.PrivateKey;
+
+/**
+ * @desc: 微信config
+ * @author: shy
+ * @date: 2024/4/9 10:06
+ */
+@Configuration
+@Getter
+public class WeChatConfig {
+
+    /**
+     * 商户号
+     */
+    @Value("${wx.mchId}")
+    public String merchantId;
+    /**
+     * 商户API私钥路径
+     */
+    @Value("${wx.privateKeyPath}")
+    public String privateKeyPath;
+    /**
+     * 商户证书序列号
+     */
+    @Value("${wx.merchantSerialNumber}")
+    public String merchantSerialNumber;
+    /**
+     * 商户APIV3密钥
+     */
+    @Value("${wx.apiV3Key}")
+    public String apiV3Key;
+    /**
+     * AppId
+     */
+    @Value("${wx.appId}")
+    public String appId;
+
+    private Config config;
+
+    @Getter
+    private PrivateKey privateKey;
+
+
+    @PostConstruct
+    public void initConfig() {
+        // 使用自动更新平台证书的RSA配置
+        // 一个商户号只能初始化一个配置,否则会因为重复的下载任务报错
+        config = new RSAAutoCertificateConfig.Builder()
+                .merchantId(merchantId)
+                .privateKeyFromPath(privateKeyPath)
+                .merchantSerialNumber(merchantSerialNumber)
+                .apiV3Key(apiV3Key)
+                .build();
+    }
+
+    @Primary
+    @Bean()
+    public H5Service h5Service() {
+        return new H5Service.Builder()
+                .config(config)
+                .build();
+    }
+
+    @Primary
+    @Bean()
+    public JsapiService jsapiService() {
+        return new JsapiService.Builder()
+                .config(config)
+                .build();
+    }
+
+    @Primary
+    @Bean()
+    public NativePayService nativePayService() {
+        return new NativePayService.Builder()
+                .config(config)
+                .build();
+    }
+    @Primary
+    @Bean()
+    public RefundService refundService() {
+        return new RefundService.Builder()
+                .config(config)
+                .build();
+    }
+
+    @Primary
+    @Bean
+    public NotificationParser notificationParser() {
+        return new NotificationParser((NotificationConfig) config);
+    }
+
+    @Primary
+    @Bean
+    public PrivateKeySigner privateKeySigner() {
+        return new PrivateKeySigner(merchantSerialNumber, privateKey);
+    }
+
+
+}
diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/ChangeDispatchController.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/ChangeDispatchController.java
index b22606c..2ac7dbb 100644
--- a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/ChangeDispatchController.java
+++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/ChangeDispatchController.java
@@ -60,10 +60,11 @@
             @ApiImplicitParam(value = "师傅名称", name = "workerName", dataType = "String"),
             @ApiImplicitParam(value = "订单编号", name = "orderNumber", dataType = "String"),
             @ApiImplicitParam(value = "下单用户名称", name = "userName", dataType = "String"),
+            @ApiImplicitParam(value = "地址", name = "reservationAddress", dataType = "String"),
             @ApiImplicitParam(value = "页码", name = "pageNum", dataType = "Integer", required = true),
             @ApiImplicitParam(value = "每页条数", name = "pageSize", dataType = "Integer", required = true)
     })
-    public R<Page<ChangeDispatch>> queryPageList(String workerName, String orderNumber, String userName,
+    public R<Page<ChangeDispatch>> queryPageList(String workerName, String orderNumber, String userName,String reservationAddress,
                                                  @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum,
                                                  @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
         LoginUser loginUser = tokenService.getLoginUser();
@@ -75,6 +76,7 @@
         changeDispatchRequest.setWorkerName(workerName);
         changeDispatchRequest.setOrderNumber(orderNumber);
         changeDispatchRequest.setUserName(userName);
+        changeDispatchRequest.setReservationAddress(reservationAddress);
         changeDispatchRequest.setPageNum(pageNum);
         changeDispatchRequest.setPageSize(pageSize);
         changeDispatchRequest.setCityList(cityList);
diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/FranchiseeController.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/FranchiseeController.java
index 3699e94..0405a71 100644
--- a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/FranchiseeController.java
+++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/FranchiseeController.java
@@ -1,29 +1,69 @@
 package com.ruoyi.admin.controller;
 
 
+import cn.hutool.http.HttpException;
+import com.alibaba.excel.EasyExcelFactory;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.builder.ExcelWriterBuilder;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alipay.api.AlipayApiException;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.admin.config.WeChatConfig;
 import com.ruoyi.admin.entity.*;
 import com.ruoyi.admin.service.*;
+import com.ruoyi.admin.utils.MD5AndKL;
+import com.ruoyi.admin.utils.WeChatUtil;
+import com.ruoyi.admin.vo.InfoDto;
+import com.ruoyi.admin.vo.MoneyRecentQuery;
+import com.ruoyi.admin.vo.RencentBalance;
 import com.ruoyi.common.core.constant.Constants;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.exception.GlobalException;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.security.annotation.RequiresPermissions;
+import com.ruoyi.common.security.service.TokenService;
+import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner;
+import com.wechat.pay.contrib.apache.httpclient.util.PemUtil;
+import com.wechat.pay.java.core.exception.MalformedMessageException;
+import com.wechat.pay.java.core.exception.ServiceException;
+import com.wechat.pay.java.core.notification.NotificationParser;
+import com.wechat.pay.java.service.partnerpayments.app.model.Transaction;
+import com.wechat.pay.java.service.payments.jsapi.model.Amount;
+import com.wechat.pay.java.service.payments.jsapi.JsapiService;
+import com.wechat.pay.java.service.payments.jsapi.model.Payer;
+import com. wechat. pay. java. service. payments. jsapi. model. PrepayRequest;
+import com.wechat.pay.java.service.payments.jsapi.model.PrepayResponse;
+import com.wechat.pay.java.service.payments.nativepay.NativePayService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import lombok.Getter;
+import org.apache.commons.codec.CharEncoding;
+import org.apache.poi.util.IOUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.security.PrivateKey;
+import java.security.SecureRandom;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
 
 /**
  * <p>
@@ -50,6 +90,338 @@
     private MasterWorkerService masterWorkerService;
     @Resource
     private SiteService siteService;
+
+    @Resource
+    private JsapiService jsapiService;
+
+    @Resource
+    private WeChatConfig weChatConfig;
+
+    @Resource
+    private PrivateKeySigner privateKeySigner;
+
+    @Resource
+    private TFranchiseeBalanceChangeService balanceChangeService;
+
+    private static final String SYMBOLS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+    private static final Random RANDOM = new SecureRandom();
+
+
+    @ApiOperation(value = "加盟商列表余额", tags = {"后台2.0-加盟商列表余额"})
+    @PostMapping(value = "/recent/money")
+    public R<RencentBalance> recentmoney() {
+        BigDecimal balance = new BigDecimal(0);
+        List<Franchisee> list = franchiseeService.lambdaQuery().list();
+        for (Franchisee franchisee : list) {
+            balance = balance.add(franchisee.getBalance());
+        }
+
+        //充值的金额
+        BigDecimal balance1 = new BigDecimal(0);
+        List<TFranchiseeBalanceChange> list1 = balanceChangeService.lambdaQuery().eq(TFranchiseeBalanceChange::getType, 1).list();
+        for (TFranchiseeBalanceChange franchiseeBalanceChange : list1) {
+            balance1 = balance1.add(franchiseeBalanceChange.getAmount());
+        }
+        //扣除的金额
+        BigDecimal balance2 = new BigDecimal(0);
+        List<TFranchiseeBalanceChange> list2 = balanceChangeService.lambdaQuery().eq(TFranchiseeBalanceChange::getType, 2).list();
+        for (TFranchiseeBalanceChange franchiseeBalanceChange : list1) {
+            balance2 = balance2.add(franchiseeBalanceChange.getAmount());
+        }
+
+        RencentBalance balance3 = new RencentBalance();
+        balance3.setBalance1(balance);
+        balance3.setBalance2(balance1);
+        balance3.setBalance3(balance2);
+
+        return R.ok(balance3);
+    }
+
+    @ApiOperation(value = "扣款记录及充值记录", tags = {"后台2.0-统一充值扣款列表","师傅段2.0-统一充值扣款列表"})
+    @PostMapping(value = "/recent/money/list")
+    public R<Page<TFranchiseeBalanceChange>> recentmoneylist(@RequestBody MoneyRecentQuery moneyRecentQuery) {
+        Page<TFranchiseeBalanceChange> page = balanceChangeService.lambdaQuery().eq(moneyRecentQuery.getType() != null, TFranchiseeBalanceChange::getType, moneyRecentQuery.getType())
+                .eq(moneyRecentQuery.getFranchId() != null, TFranchiseeBalanceChange::getFranchiseeId, moneyRecentQuery.getFranchId())
+                .eq(moneyRecentQuery.getFranchName() != null && !"".equals(moneyRecentQuery.getFranchName()), TFranchiseeBalanceChange::getFranchiseeName, moneyRecentQuery.getFranchName())
+                .ge(moneyRecentQuery.getDate1() != null, TFranchiseeBalanceChange::getCreateTime, moneyRecentQuery.getDate1())
+                .le(moneyRecentQuery.getDate2() != null, TFranchiseeBalanceChange::getCreateTime, moneyRecentQuery.getDate2())
+                .page(Page.of(moneyRecentQuery.getPageNum(), moneyRecentQuery.getPageSize()));
+
+
+        for (TFranchiseeBalanceChange record : page.getRecords()) {
+            Franchisee franchisee = franchiseeService.getById(record.getFranchiseeId());
+            String siteIds = franchisee.getSiteIds();
+            String cityCode = franchisee.getCityCode();
+            List<Region> list = regionService.lambdaQuery().in(Region::getCode, cityCode.split(",")).list();
+            List<Site> list1 = siteService.lambdaQuery().in(Site::getId, siteIds.split(",")).list();
+            record.setList(list);
+            record.setList1(list1);
+            record.setFranchiseeName(franchisee.getName());
+        }
+        return R.ok(page);
+    }
+
+    @ApiOperation(value = "导出", tags = {"后台2.0-统一充值扣款列表"})
+    @PostMapping(value = "/recent/money/list/export")
+    public R<Page<TFranchiseeBalanceChange>> export(@RequestBody MoneyRecentQuery moneyRecentQuery, HttpServletResponse response) {
+        List<TFranchiseeBalanceChange> page = balanceChangeService.lambdaQuery().eq(moneyRecentQuery.getType() != null, TFranchiseeBalanceChange::getType, moneyRecentQuery.getType())
+                .eq(moneyRecentQuery.getFranchId() != null, TFranchiseeBalanceChange::getFranchiseeId, moneyRecentQuery.getFranchId())
+                .eq(moneyRecentQuery.getFranchName() != null && !"".equals(moneyRecentQuery.getFranchName()), TFranchiseeBalanceChange::getFranchiseeName, moneyRecentQuery.getFranchName())
+                .ge(moneyRecentQuery.getDate1() != null, TFranchiseeBalanceChange::getCreateTime, moneyRecentQuery.getDate1())
+                .le(moneyRecentQuery.getDate2() != null, TFranchiseeBalanceChange::getCreateTime, moneyRecentQuery.getDate2())
+                .list();
+
+        try {
+            response.setCharacterEncoding(Constants.UTF8);
+            response.setContentType("application/vnd.ms-excel");
+            response.setHeader("Access-Control-Expose-Headers", "Content-disposition");
+            response.setHeader("Content-Disposition", "attachment;filename=" +
+                    URLEncoder.encode(Constants.EXCEL_ORDER_FILE_NAME, CharEncoding.UTF_8) + ".xlsx");
+        } catch (UnsupportedEncodingException e) {
+            return R.fail("excel导出失败!");
+        }
+        try {
+            // excel模板封装
+            ExcelWriterBuilder excelWriterBuilder = EasyExcelFactory.write(response.getOutputStream());
+            InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream("template/" + Constants.EXCEL_ORDER_FILE_NAME1 + ".xlsx");
+            // 自动释放资源
+            try (ExcelWriter excelWriter = excelWriterBuilder.withTemplate(stream).build()) {
+                WriteSheet writeSheet = EasyExcelFactory.writerSheet().build();
+                excelWriter.fill(page, writeSheet);
+                excelWriter.finish();
+            } catch (Exception e) {
+                return R.fail("excel导出失败!");
+            }
+        } catch (IOException e) {
+            return R.fail("excel导出失败!");
+        }
+        return R.ok();
+    }
+
+
+    @ApiOperation(value = "扣余额", tags = {"后台2.0-加盟商列表余额"})
+    @PostMapping(value = "/recent/money/consume")
+    public R<Page<TFranchiseeBalanceChange>> consume(@RequestBody TFranchiseeBalanceChange franchiseeBalanceChange) {
+        Franchisee byId = franchiseeService.getById(franchiseeBalanceChange.getFranchiseeId());
+        franchiseeBalanceChange.setFranchiseeName(byId.getName());
+        balanceChangeService.save(franchiseeBalanceChange);
+        byId.setBalance(byId.getBalance().subtract(franchiseeBalanceChange.getAmount()));
+        franchiseeService.updateById(byId);
+        return R.ok();
+    }
+
+    @Getter
+    private PrivateKey privateKey;
+
+    @ApiOperation(value = "js支付", tags = {"2.0-支付"})
+    @GetMapping(value = "/js/wxPay")
+    public R jsPay(@RequestParam String openId,@RequestParam BigDecimal money,@RequestParam Integer userId) {
+        SysUser byId1 = sysUserService.getById(userId);
+        this.privateKey = PemUtil.loadPrivateKey(getPrivateKeyStream());
+        this.privateKeySigner = new PrivateKeySigner(weChatConfig.merchantSerialNumber, privateKey);
+
+        String code = generateTradeNumber();
+        int i = money.multiply(BigDecimal.valueOf(100)).intValue();
+        Franchisee byId = franchiseeService.getById(byId1.getFranchiseeId());
+
+
+        PrepayRequest prepayRequest = new PrepayRequest();
+        prepayRequest.setAppid(weChatConfig.appId);
+        prepayRequest.setMchid(weChatConfig.merchantId);
+        prepayRequest.setDescription("加盟商充值");
+        prepayRequest.setOutTradeNo(code);
+        prepayRequest.setNotifyUrl("http://www.zhipingwang.com.cn:9090/admin/franchisee/callBack");
+        Amount amount = new Amount();
+        amount.setTotal(i);
+        prepayRequest.setAmount(amount);
+        Payer payer = new Payer();
+        payer.setOpenid(openId);
+        prepayRequest.setPayer(payer);
+        PrepayResponse prepay = jsapiService.prepay(prepayRequest);
+        String timeStamp = String.valueOf(System.currentTimeMillis() / 1000);
+        String packageStr = "prepay_id=" + prepay.getPrepayId();
+
+        String prepay_id = prepay.getPrepayId();
+        //重新进行签名后返回给前端
+        Map<String, Object> map2 = new HashMap<>();
+        map2.put("appid", weChatConfig.getAppId());
+        map2.put("noncestr", code);
+        map2.put("package", "Sign=WXPay");
+        map2.put("partnerid", weChatConfig.getMerchantId());
+        map2.put("prepayid", prepay_id);
+        map2.put("timestamp", timeStamp);
+//        String s1 = this.weixinSignature(map2);
+        String signStr = Stream.of(weChatConfig.getAppId(), timeStamp, code, packageStr).collect(Collectors.joining("\n", "", "\n"));
+        String packageSign = privateKeySigner.sign(signStr.getBytes(StandardCharsets.UTF_8)).getSign();
+        
+        map2.put("sign", packageSign);
+        System.err.println(map2);
+
+
+        TFranchiseeBalanceChange tFranchiseeBalanceChange = new TFranchiseeBalanceChange();
+        tFranchiseeBalanceChange.setAmount(money);
+        tFranchiseeBalanceChange.setIs_pay(0);
+        tFranchiseeBalanceChange.setFranchiseeName(byId.getName());
+        tFranchiseeBalanceChange.setFranchiseeId(String.valueOf(byId.getId()));
+        tFranchiseeBalanceChange.setType(2);
+        tFranchiseeBalanceChange.setCode(code);
+        balanceChangeService.save(tFranchiseeBalanceChange);
+
+        return R.ok(map2);
+
+    }
+
+    public InputStream getPrivateKeyStream() {
+        // 需要证书释放
+        byte[] certData;
+//        InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(this.privateKeyPath);
+        InputStream certStream = null;
+        try {
+            certStream = new FileInputStream(weChatConfig.privateKeyPath);
+            certData = IOUtils.toByteArray(certStream);
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw new RuntimeException("私钥文件未找到");
+        }finally {
+            if(null != certStream){
+                try {
+                    certStream.close();
+                } catch (IOException e) {
+                }
+            }
+        }
+        return new ByteArrayInputStream(certData);
+    }
+    @Resource
+    private TokenService tokenService;
+    @Resource
+    private NativePayService nativePayService;
+
+    @ApiOperation(value = "扫码支付",tags = {"后台2.0-加盟商列表余额"})
+    @PostMapping(value = "/code/buy")
+    public R buy(@RequestParam BigDecimal money) throws AlipayApiException {
+        Long userid = tokenService.getLoginUser().getUserid();
+        SysUser byId1 = sysUserService.getById(userid);
+        Franchisee byId = franchiseeService.getById(byId1.getFranchiseeId());
+        String code = generateTradeNumber();
+        int i = money.multiply(BigDecimal.valueOf(100)).intValue();
+        com.wechat.pay.java.service.payments.nativepay.model.PrepayRequest prepayRequest = new com.wechat.pay.java.service.payments.nativepay.model.PrepayRequest();
+            prepayRequest.setAppid(weChatConfig.appId);
+            prepayRequest.setMchid(weChatConfig.merchantId);
+            prepayRequest.setOutTradeNo(code);
+            prepayRequest.setDescription("购买资料");
+            prepayRequest.setNotifyUrl("http://www.zhipingwang.com.cn:9090/admin/franchisee/callBack");
+            com.wechat.pay.java.service.payments.nativepay.model.Amount amount = new com.wechat.pay.java.service.payments.nativepay.model.Amount();
+            amount.setTotal(i);
+            prepayRequest.setAmount(amount);
+            // 调用下单方法,得到应答
+            com.wechat.pay.java.service.partnerpayments.app.model.PrepayResponse response;
+            try {
+                com.wechat.pay.java.service.payments.nativepay.model.PrepayResponse prepay = nativePayService.prepay(prepayRequest);
+                //预支付成功,创建预支付订单
+                TFranchiseeBalanceChange tFranchiseeBalanceChange = new TFranchiseeBalanceChange();
+                tFranchiseeBalanceChange.setAmount(money);
+                tFranchiseeBalanceChange.setIs_pay(0);
+                tFranchiseeBalanceChange.setFranchiseeName(byId.getName());
+                tFranchiseeBalanceChange.setFranchiseeId(String.valueOf(userid));
+                tFranchiseeBalanceChange.setType(2);
+                tFranchiseeBalanceChange.setCode(code);
+                balanceChangeService.save(tFranchiseeBalanceChange);
+                return R.ok(prepay.getCodeUrl());
+            } catch (HttpException e) { // 发送HTTP请求失败
+//                log.error("发送HTTP请求失败: {}", e.getHttpRequest());
+            } catch (ServiceException e) { // 服务返回状态小于200或大于等于300,例如500
+//                log.error("服务返回状态异常: {}", e.getResponseBody());
+            } catch (MalformedMessageException e) { // 服务返回成功,返回体类型不合法,或者解析返回体失败
+//                log.error("返回体类型不合法: {}", e.getMessage());
+            } catch (Exception e) {
+//                log.error("预下单异常: {}", e.getMessage());
+            }
+            return null;
+
+    }
+    @Resource
+    private NotificationParser notificationParser;
+
+    @ApiOperation(value = "支付回调",tags = {"微信支付回调"})
+    @RequestMapping (value = "/callBack")
+    @Transactional
+    public R payNotify(HttpServletRequest request) throws Exception{
+        System.err.println("======回调开始");
+        Transaction transaction;
+        transaction = notificationParser.parse(WeChatUtil.handleNodifyRequestParam(request), Transaction.class);
+        if (transaction.getTradeState() == Transaction.TradeStateEnum.SUCCESS) {
+            //将记录变为已支付
+            TFranchiseeBalanceChange one = balanceChangeService.lambdaQuery().eq(TFranchiseeBalanceChange::getCode, transaction.getOutTradeNo()).one();
+            if (one.getIs_pay()==0) {
+                //将加盟商的余额增加
+                Franchisee byId = franchiseeService.getById(one.getFranchiseeId());
+                byId.setBalance(byId.getBalance().add(one.getAmount()));
+                franchiseeService.updateById(byId);
+                one.setIs_pay(1);
+                balanceChangeService.updateById(one);
+
+            }
+
+        }
+        return R.ok(null,"SUCCESS");
+    }
+
+    public static String generateTradeNumber() {
+        // 定义订单号前缀
+        // 当前年月日
+        LocalDateTime now = LocalDateTime.now();
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+        String currentTimeStr =now.format(formatter);
+        // 获取当前时间戳
+        long timestamp = System.currentTimeMillis();
+        // 构造订单号
+        return currentTimeStr + timestamp;
+    }
+
+
+
+    private String weixinSignature(Map<String, Object> map){
+        try {
+            Set<Map.Entry<String, Object>> entries = map.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()).toString().compareTo(o2.getKey());
+                }
+            });
+            // 构造签名键值对的格式
+            StringBuilder sb = new StringBuilder();
+            for (Map.Entry<String, Object> 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=" + "TA2npSNWmS0GcB0tFFRWA94rm1M0iSFs");
+            String sign = MD5AndKL.MD5Encode(sb.toString(), "UTF-8").toUpperCase(); //注:MD5签名方式
+            return sign;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+
+
+
+    public static String generateNonceStr() {
+        char[] nonceChars = new char[32];
+        for (int index = 0; index < nonceChars.length; ++index) {
+            nonceChars[index] = SYMBOLS.charAt(RANDOM.nextInt(SYMBOLS.length()));
+        }
+        return new String(nonceChars);
+    }
 
     /**
      * 加盟商信息分页列表
@@ -103,8 +475,13 @@
             @ApiImplicitParam(value = "加盟商信息id", name = "id", dataType = "Integer", required = true)
     })
     public R<Franchisee> detail(@RequestParam("id") Integer id) {
-        return R.ok(franchiseeService.lambdaQuery()
-                .eq(Franchisee::getId, id).eq(Franchisee::getIsDelete, 0).one());
+        Franchisee one = franchiseeService.lambdaQuery()
+                .eq(Franchisee::getId, id).eq(Franchisee::getIsDelete, 0).one();
+        List<Site> list = siteService.lambdaQuery().in(Site::getId, one.getSiteIds().split(",")).list();
+        //用 , 拼接
+        one.setSiteStr(list.stream().map(Site::getSiteName).collect(Collectors.joining(",")));
+
+        return R.ok(one);
     }
 
     /**
@@ -121,6 +498,53 @@
         return R.ok(Arrays.stream(franchisee.getCityCode().split(",")).collect(Collectors.toList()));
     }
 
+
+    @ApiOperation(value = "主页信息", tags = {"2.0师傅端"})
+    @GetMapping(value = "/info")
+    public R<InfoDto> info() {
+        Long userid = tokenService.getLoginUser().getUserid();
+        SysUser byId = sysUserService.getById(userid);
+        Franchisee franchisee = franchiseeService.lambdaQuery()
+                .eq(Franchisee::getId, byId.getFranchiseeId()).eq(Franchisee::getIsDelete, 0).one();
+        String siteIds = franchisee.getSiteIds();
+        String cityCode = franchisee.getCityCode();
+        List<Region> list = regionService.lambdaQuery().in(Region::getCode, cityCode.split(",")).list();
+        List<Site> list1 = siteService.lambdaQuery().in(Site::getId, siteIds.split(",")).list();
+        InfoDto infoDto = new InfoDto();
+        infoDto.setList(list);
+        infoDto.setList1(list1);
+        infoDto.setFranchisee(franchisee);
+        return R.ok(infoDto);
+    }
+
+    @ApiOperation(value = "主页信息", tags = {"2.0师傅端"})
+    @GetMapping(value = "/info1")
+    public R<InfoDto> info1(Integer id) {
+
+        Franchisee franchisee = franchiseeService.lambdaQuery()
+                .eq(Franchisee::getId, id).eq(Franchisee::getIsDelete, 0).one();
+        String siteIds = franchisee.getSiteIds();
+        String cityCode = franchisee.getCityCode();
+        List<Region> list = regionService.lambdaQuery().in(Region::getCode, cityCode.split(",")).list();
+        List<Site> list1 = siteService.lambdaQuery().in(Site::getId, siteIds.split(",")).list();
+        InfoDto infoDto = new InfoDto();
+        infoDto.setList(list);
+        infoDto.setList1(list1);
+        infoDto.setFranchisee(franchisee);
+        return R.ok(infoDto);
+    }
+
+    @ApiOperation(value = "当前余额", tags = {"后台2.0-加盟商列表余额"})
+    @GetMapping(value = "/rencentBalance")
+    public R<Franchisee> rencentBalance() {
+        Long userid = tokenService.getLoginUser().getUserid();
+        SysUser byId = sysUserService.getById(userid);
+        Franchisee franchisee = franchiseeService.lambdaQuery()
+                .eq(Franchisee::getId, byId.getFranchiseeId()).eq(Franchisee::getIsDelete, 0).one();
+
+        return R.ok(franchisee);
+    }
+
     @GetMapping(value = "/getWorkPic")
     public R<String> getWorkPic(@RequestParam("id") Integer id) {
         MasterWorker byId = masterWorkerService.getById(id);
diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/OrderController.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/OrderController.java
index 3597c00..491bab0 100644
--- a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/OrderController.java
+++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/OrderController.java
@@ -404,12 +404,7 @@
     @RequiresPermissions("order_reassignment")
     @ApiOperation(value = "订单列表-订单派单/改派", tags = {"后台-订单管理"})
     @PostMapping(value = "/reassignment")
-    @ApiImplicitParams({
-            @ApiImplicitParam(value = "操作类型(1:订单派单;2:订单改派)", name = "type", dataType = "Integer", required = true),
-            @ApiImplicitParam(value = "订单id", name = "orderId", dataType = "Integer", required = true),
-            @ApiImplicitParam(value = "服务人员id", name = "workerId", dataType = "Integer", required = true),
-            @ApiImplicitParam(value = "改派原因", name = "applyReason", dataType = "String")
-    })
+
     @Transactional(rollbackFor = Exception.class)
     public R<String> reassignment(@RequestBody OrderReasinDto orderReasinDto) {
 //        String[] split = orderIds.split(",");
@@ -426,11 +421,22 @@
         if (Constants.TWO.equals(orderId.getType())) {
             if (order.getState().equals(Constants.SIX) || order.getState().equals(Constants.THREE)) {
                 orderClient.updateState(order.getId(), Constants.ONE);
+
+                //如果是待改派,将上门时间设置为最新的,并且更新再投原因
+                if (order.getState().equals(Constants.SIX)){
+                    dispatchClient.changeReason(order.getId(), orderReasinDto.getReason());
+                    orderClient.updateArrivalTime(order.getId(),orderReasinDto.getArriveTime());
+                }
+
             }
             // 订单状态为 待完工时,需要更改状态 待上门且清空师傅到达预约点时间
             if (order.getState().equals(Constants.TWO)) {
                 orderClient.updateStateAndArrivalTime(orderId.getOrderId(), Constants.ONE);
             }
+
+
+
+
             // 生成改派信息
 //            ChangeDispatch changeDispatch = new ChangeDispatch();
 //            changeDispatch.setWorkerId(item.getServerId());
diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/SiteController.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/SiteController.java
index df4c149..6c02005 100644
--- a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/SiteController.java
+++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/SiteController.java
@@ -55,7 +55,7 @@
     public R<IPage<Site>> queryPageList(@RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum,
                                         @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
         return R.ok(siteService.lambdaQuery().orderByDesc(Site::getCreateTime)
-                .eq(Site::getIsDelete, 0)
+                .eq(Site::getIsDelete, 0).orderByDesc(Site::getSort)
                 .page(Page.of(pageNum, pageSize)));
     }
 
@@ -85,7 +85,7 @@
 
 
         return R.ok(siteService.lambdaQuery().orderByDesc(Site::getCreateTime).in(siteIds.length>0, Site::getId, siteIds).like(siteName!=null&&siteName!="", Site::getSiteName, siteName)
-                .eq(Site::getIsDelete, 0)
+                .eq(Site::getIsDelete, 0).orderByDesc(Site::getSort)
                 .list());
     }
 
diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/entity/Franchisee.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/entity/Franchisee.java
index eaa3e3a..4b0799b 100644
--- a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/entity/Franchisee.java
+++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/entity/Franchisee.java
@@ -9,9 +9,11 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Getter;
 import lombok.Setter;
+import org.apache.poi.hpsf.Decimal;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
 
 /**
  * <p>
@@ -89,6 +91,9 @@
     @ApiModelProperty("管辖城市二维数组")
     @TableField("site_ids")
     private String siteIds;
+    @ApiModelProperty("余额")
+    @TableField("balance")
+    private BigDecimal balance;
     @TableField(exist = false)
     private String siteStr;
 }
diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/entity/Site.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/entity/Site.java
index 7baf3d0..b635d90 100644
--- a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/entity/Site.java
+++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/entity/Site.java
@@ -26,6 +26,9 @@
 
     @TableId(value = "id",type = IdType.AUTO)
     private Integer id;
+    @ApiModelProperty("排序")
+    @TableField("sort")
+    private Integer sort;
 
     @ApiModelProperty("站点名称")
     @TableField("site_name")
diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/entity/TFranchiseeBalanceChange.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/entity/TFranchiseeBalanceChange.java
new file mode 100644
index 0000000..9580345
--- /dev/null
+++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/entity/TFranchiseeBalanceChange.java
@@ -0,0 +1,91 @@
+package com.ruoyi.admin.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("t_franchisee_balance_change")
+@ApiModel(value="TFranchiseeBalanceChange对象", description="")
+public class TFranchiseeBalanceChange implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "扣除金额")
+    @TableField("amount")
+    private BigDecimal amount;
+
+    @TableField("region_name")
+    private String regionName;
+
+    @TableField("region_id")
+    private Integer regionId;
+
+    @TableField("createBy")
+    private String createBy;
+
+    @TableField("pics")
+    private String pics;
+
+    @TableField("site_id")
+    private Integer siteId;
+    @TableField("is_pay")
+    private Integer is_pay;
+    @TableField("franchisee_name")
+    private String franchiseeName;
+
+    @TableField("franchisee_id")
+    private String franchiseeId;
+    @TableField("code")
+    private String code;
+
+    @TableField("remark")
+    private String remark;
+
+    @TableField("updateBy")
+    private String updateBy;
+
+    @TableField("createTime")
+    private LocalDateTime createTime;
+
+    @TableField("updateTime")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "1扣款2充值")
+    @TableField("type")
+    private Integer type;
+
+    @ApiModelProperty(value = "是否删除 0未删除;1已删除")
+    @TableField("is_delete")
+    @TableLogic
+    private Integer isDelete;
+    @TableField(exist = false)
+    private String payStr = "微信支付";
+    @TableField(exist = false)
+    private List<Region> list;
+    @TableField(exist = false)
+    private List<Site> list1;
+    @TableField(exist = false)
+    private List<Site> franchiseName;
+
+
+}
diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/mapper/TFranchiseeBalanceChangeMapper.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/mapper/TFranchiseeBalanceChangeMapper.java
new file mode 100644
index 0000000..de2c7ce
--- /dev/null
+++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/mapper/TFranchiseeBalanceChangeMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.admin.entity.TFranchiseeBalanceChange;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-02
+ */
+public interface TFranchiseeBalanceChangeMapper extends BaseMapper<TFranchiseeBalanceChange> {
+
+}
diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/service/TFranchiseeBalanceChangeService.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/service/TFranchiseeBalanceChangeService.java
new file mode 100644
index 0000000..1aa9ea7
--- /dev/null
+++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/service/TFranchiseeBalanceChangeService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.admin.entity.TFranchiseeBalanceChange;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-02
+ */
+public interface TFranchiseeBalanceChangeService extends IService<TFranchiseeBalanceChange> {
+
+}
diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/service/impl/TFranchiseeBalanceChangeServiceImpl.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/service/impl/TFranchiseeBalanceChangeServiceImpl.java
new file mode 100644
index 0000000..3d2d855
--- /dev/null
+++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/service/impl/TFranchiseeBalanceChangeServiceImpl.java
@@ -0,0 +1,21 @@
+package com.ruoyi.admin.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import com.ruoyi.admin.entity.TFranchiseeBalanceChange;
+import com.ruoyi.admin.mapper.TFranchiseeBalanceChangeMapper;
+import com.ruoyi.admin.service.TFranchiseeBalanceChangeService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-02
+ */
+@Service
+public class TFranchiseeBalanceChangeServiceImpl extends ServiceImpl<TFranchiseeBalanceChangeMapper, TFranchiseeBalanceChange> implements TFranchiseeBalanceChangeService {
+
+}
diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/MD5AndKL.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/MD5AndKL.java
new file mode 100644
index 0000000..4914196
--- /dev/null
+++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/MD5AndKL.java
@@ -0,0 +1,112 @@
+package com.ruoyi.admin.utils;
+
+import java.security.MessageDigest;
+
+public class MD5AndKL {
+	
+	/**
+	 * MD5加码。32位
+	 * 
+	 * @param inStr
+	 * @return
+	 */
+	public static String MD5(String inStr) {
+		MessageDigest md5 = null;
+		try {
+			md5 = MessageDigest.getInstance("MD5");
+		} catch (Exception e) {
+			throw new RuntimeException(e.toString());
+		}
+		byte[] md5Bytes = md5.digest(inStr.getBytes());
+		StringBuffer hexValue = new StringBuffer();
+		for (int i = 0; i < md5Bytes.length; i++) {
+			int val = ((int) md5Bytes[i]) & 0xff;
+			if (val < 16) {
+				hexValue.append("0");
+			}
+			hexValue.append(Integer.toHexString(val));
+		}
+		return hexValue.toString();
+	}
+
+	/**
+	 * 可逆的加密算法
+	 * 
+	 * @param inStr
+	 * @return
+	 */
+	public static String KL(String inStr) {
+		char[] a = inStr.toCharArray();
+		for (int i = 0; i < a.length; i++) {
+			a[i] = (char) (a[i] ^ 't');
+		}
+		String s = new String(a);
+		return s;
+	}
+
+	/**
+	 * 加密后解密
+	 * 
+	 * @param inStr
+	 * @return
+	 */
+	public static String JM(String inStr) {
+		char[] a = inStr.toCharArray();
+		for (int i = 0; i < a.length; i++) {
+			a[i] = (char) (a[i] ^ 't');
+		}
+		String k = new String(a);
+		return k;
+	}
+
+
+
+	private static String byteArrayToHexString(byte b[]) {
+		StringBuffer resultSb = new StringBuffer();
+		for (int i = 0; i < b.length; i++)
+			resultSb.append(byteToHexString(b[i]));
+
+		return resultSb.toString();
+	}
+
+	private static String byteToHexString(byte b) {
+		int n = b;
+		if (n < 0)
+			n += 256;
+		int d1 = n / 16;
+		int d2 = n % 16;
+		return hexDigits[d1] + hexDigits[d2];
+	}
+
+	public static String MD5Encode(String origin, String charsetname) {
+		String resultString = null;
+		try {
+			resultString = new String(origin);
+			MessageDigest md = MessageDigest.getInstance("MD5");
+			if (charsetname == null || "".equals(charsetname)){
+				resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
+			}else{
+				resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));
+			}
+		} catch (Exception exception) {
+			exception.printStackTrace();
+		}
+		return resultString;
+	}
+
+	private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",
+			"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
+
+	public static void main(String args[]) {
+
+		System.out.println("MD5后再加密:" + KL(MD5("123456")));
+		System.out.println(MD5("123456"));
+		// System.out.println("加密:" + KL(MD5("123456")));
+		// s = KL(s);
+		// System.out.println("解密:" + KL("81dc9bdb52d04dc20036dbd8313ed055"));
+		// System.out.println("解密:" + JM(KL(s)));
+		// System.out.println("解密为MD5后的:" + KL(KL(MD5(s))));
+		// System.out.println(JM("5d62957bb57d3e49dcf48a0df064be4c"));
+		// System.out.println(MD5AndKL.KL(MD5AndKL.MD5("admin"+"87654321")));
+	}
+}
diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/WeChatUtil.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/WeChatUtil.java
new file mode 100644
index 0000000..781c9fe
--- /dev/null
+++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/WeChatUtil.java
@@ -0,0 +1,128 @@
+package com.ruoyi.admin.utils;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.security.PrivateKey;
+import java.security.SecureRandom;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Random;
+
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+
+import com.wechat.pay.java.core.cipher.RSASigner;
+import com.wechat.pay.java.core.cipher.SignatureResult;
+import com.wechat.pay.java.core.notification.RequestParam;
+import com.wechat.pay.java.core.util.NonceUtil;
+import com.wechat.pay.java.core.util.PemUtil;
+
+/**
+ * @desc: 微信工具类
+ * @author: shy
+ * @date: 2024/4/8 16:10
+ */
+public class WeChatUtil {
+
+    private static final String SYMBOLS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+    private static final Random RANDOM = new SecureRandom();
+
+    /**
+     * 生成订单号
+     *
+     * @param
+     * @return String
+     * @author shy
+     * @date 2024/4/8 16:15
+     */
+    public static String generateTradeNumber() {
+        // 定义订单号前缀
+        // 当前年月日
+        LocalDateTime now = LocalDateTime.now();
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+        String currentTimeStr =now.format(formatter);
+        // 获取当前时间戳
+        long timestamp = System.currentTimeMillis();
+        // 构造订单号
+        return currentTimeStr + timestamp;
+    }
+
+    /**
+     * 获取随机字符串 Nonce Str
+     *
+     * @param
+     * @return String
+     * @author shy
+     * @date 2024/4/16 17:07
+     */
+    public static String generateNonceStr() {
+        return NonceUtil.createNonce(32);
+    }
+
+    /**
+     * 获取当前时间戳,单位秒
+     * @param
+     * @return long
+     * @author shy
+     * @date 2024/4/16 17:10
+     */
+    public static long getCurrentTimestamp() {
+        return System.currentTimeMillis() / 1000;
+    }
+
+    public static String getSign(String signatureStr, String privateKeyPath, String merchantSerialNumber) {
+        PrivateKey privateKey = PemUtil.loadPrivateKeyFromPath(privateKeyPath);
+        RSASigner rsaSigner = new RSASigner(merchantSerialNumber, privateKey);
+        SignatureResult signatureResult = rsaSigner.sign(signatureStr);
+        return signatureResult.getSign();
+    }
+
+
+    /**
+     * 构造 RequestParam
+     *
+     * @param request
+     * @return RequestParam
+     * @author shy
+     * @date 2024/4/9 11:16
+     */
+    public static RequestParam handleNodifyRequestParam(HttpServletRequest request) throws IOException {
+        // 请求头Wechatpay-Signature
+        String signature = request.getHeader("Wechatpay-Signature");
+        // 请求头Wechatpay-nonce
+        String nonce = request.getHeader("Wechatpay-Nonce");
+        // 请求头Wechatpay-Timestamp
+        String timestamp = request.getHeader("Wechatpay-Timestamp");
+        // 微信支付证书序列号
+        String serial = request.getHeader("Wechatpay-Serial");
+        // 签名方式
+        String signType = request.getHeader("Wechatpay-Signature-Type");
+        // 构造 RequestParam
+        return new RequestParam.Builder().serialNumber(serial).nonce(nonce).signature(signature).timestamp(timestamp).signType(signType).body(getRequestBody(request)).build();
+
+    }
+
+    public static String getRequestBody(HttpServletRequest request) throws IOException {
+        ServletInputStream stream;
+        BufferedReader reader = null;
+        StringBuilder sb = new StringBuilder();
+        try {
+            stream = request.getInputStream();
+            // 获取响应
+            reader = new BufferedReader(new InputStreamReader(stream));
+            String line;
+            while ((line = reader.readLine()) != null) {
+                sb.append(line);
+            }
+        } catch (IOException e) {
+            throw new IOException("读取返回支付接口数据流出现异常!");
+        } finally {
+            if (reader != null) {
+                reader.close();
+            }
+        }
+        return sb.toString();
+    }
+}
diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/WechatPaySignature.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/WechatPaySignature.java
new file mode 100644
index 0000000..799e8df
--- /dev/null
+++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/WechatPaySignature.java
@@ -0,0 +1,36 @@
+package com.ruoyi.admin.utils;
+
+import org.apache.commons.codec.digest.DigestUtils;
+
+import java.util.Map;
+import java.util.TreeMap;
+ 
+public class WechatPaySignature {
+ 
+    // 模拟的签名生成函数,实际应用中应使用微信提供的签名算法
+    public static String generateSignature(Map<String, String> parameters, String apiKey) {
+        // 这里应该使用微信官方提供的签名算法来生成sign
+        // 示例仅为说明,实际中不要直接如此使用
+        StringBuilder toSign = new StringBuilder();
+        for (Map.Entry<String, String> entry : parameters.entrySet()) {
+            toSign.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
+        }
+        toSign.append("key=").append(apiKey);
+        // 对字符串进行MD5或其他加密
+        return DigestUtils.md5Hex(toSign.toString()).toUpperCase();
+    }
+ 
+    public static void main(String[] args) {
+        Map<String, String> params = new TreeMap<>();
+        params.put("appId", "wx98563d0ec9cf21c8");
+        params.put("timeStamp", "1392689076");
+        params.put("nonceStr", "e614eka7e99d027403216e8dfa37ddc2");
+        params.put("package", "prepay_id=wx01181404626776e879e6764f2760370000");
+        params.put("signType", "MD5");
+ 
+        String apiKey = "TA2npSNWmS0GcB0tFFRWA94rm1M0iSFs"; // 你的API密钥
+        String paySign = generateSignature(params, apiKey);
+ 
+        System.out.println("paySign: " + paySign);
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/InfoDto.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/InfoDto.java
new file mode 100644
index 0000000..e2517a2
--- /dev/null
+++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/InfoDto.java
@@ -0,0 +1,15 @@
+package com.ruoyi.admin.vo;
+
+import com.ruoyi.admin.entity.Franchisee;
+import com.ruoyi.admin.entity.Region;
+import com.ruoyi.admin.entity.Site;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class InfoDto {
+    Franchisee franchisee;
+    List<Region> list ;
+    List<Site> list1 ;
+}
diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/MoneyRecentQuery.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/MoneyRecentQuery.java
new file mode 100644
index 0000000..cf32302
--- /dev/null
+++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/MoneyRecentQuery.java
@@ -0,0 +1,25 @@
+package com.ruoyi.admin.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class MoneyRecentQuery {
+    @ApiModelProperty("加盟商id")
+    private Integer franchId;
+    @ApiModelProperty("加盟商名字,查询用")
+    private Integer franchName;
+    @ApiModelProperty("1扣款2充值")
+    private Integer type;
+    @ApiModelProperty("扣款时间1")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime date1;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty("扣款时间2")
+    private LocalDateTime date2;
+    private Integer pageNum;
+    private Integer pageSize;
+}
diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/OrderReasinDto.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/OrderReasinDto.java
index bc3a23d..0ba7f0b 100644
--- a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/OrderReasinDto.java
+++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/OrderReasinDto.java
@@ -2,9 +2,11 @@
 
 import lombok.Data;
 
+import java.util.Date;
 import java.util.List;
 @Data
 public class OrderReasinDto {
     Integer workerId;
     List<ReassinDto> reassinDtos;
-}
+    String reason;
+     Date arriveTime;}
diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/RencentBalance.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/RencentBalance.java
new file mode 100644
index 0000000..c00b7d0
--- /dev/null
+++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/RencentBalance.java
@@ -0,0 +1,14 @@
+package com.ruoyi.admin.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.apache.poi.hpsf.Decimal;
+
+import java.math.BigDecimal;
+
+@Data
+public class RencentBalance {
+    private BigDecimal balance1;
+    private BigDecimal balance2;
+    private BigDecimal balance3;
+}
diff --git "a/ruoyi-service/ruoyi-admin/src/main/resources/template/\345\212\240\347\233\237\345\225\206\344\275\231\351\242\235\350\256\260\345\275\225.xlsx" "b/ruoyi-service/ruoyi-admin/src/main/resources/template/\345\212\240\347\233\237\345\225\206\344\275\231\351\242\235\350\256\260\345\275\225.xlsx"
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ "b/ruoyi-service/ruoyi-admin/src/main/resources/template/\345\212\240\347\233\237\345\225\206\344\275\231\351\242\235\350\256\260\345\275\225.xlsx"
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChangeDispatchController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChangeDispatchController.java
index 796742e..dbadcf7 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChangeDispatchController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChangeDispatchController.java
@@ -3,6 +3,7 @@
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.constant.Constants;
+import com.ruoyi.common.core.domain.BaseEntity;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.exception.GlobalException;
 import com.ruoyi.common.security.annotation.RequiresPermissions;
@@ -195,6 +196,14 @@
         return R.ok(update && orderService.updateById(order));
     }
 
+    @GetMapping(value = "/changeReason")
+    public void changeReason(@RequestParam("id")String id,@RequestParam("reason") String reason) {
+        ChangeDispatch one = changeDispatchService.lambdaQuery().eq(ChangeDispatch::getOrderId, id).orderByDesc(BaseEntity::getCreateTime).last("limit 1").one();
+        one.setState(1);
+        one.setApplyReason(reason);
+        changeDispatchService.updateById(one);
+    }
+
     /**
      * 根据id批量删除订单改派
      *
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java
index 4269671..8469bf1 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java
@@ -516,6 +516,13 @@
         return R.ok(!list.isEmpty());
     }
 
+    @GetMapping(value = "/updateArrivalTime")
+    public R<Boolean> updateArrivalTime(@RequestParam("orderId")String orderId,@RequestParam("arriveTime")Date arriveTime) {
+        Order byId = orderService.getById(orderId);
+        byId.setArriveTime(arriveTime);
+        return R.ok();
+    }
+
     /**
      * 回收订单统计
      *
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/request/ChangeDispatchRequest.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/request/ChangeDispatchRequest.java
index 8747412..477a8d7 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/request/ChangeDispatchRequest.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/request/ChangeDispatchRequest.java
@@ -15,6 +15,7 @@
     private String workerName;
 
     private String orderNumber;
+    private String reservationAddress;
 
     private String userName;
 
diff --git a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/ChangeDispatchMapper.xml b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/ChangeDispatchMapper.xml
index 5abf932..167c122 100644
--- a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/ChangeDispatchMapper.xml
+++ b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/ChangeDispatchMapper.xml
@@ -19,10 +19,13 @@
         <result column="user_id" property="userId"/>
         <result column="user_name" property="userName"/>
         <result column="orderTime" property="orderTime"/>
+        <result column="reservation_name" property="reservationName"/>
+        <result column="reservation_phone" property="reservationPhone"/>
+        <result column="reservation_address" property="reservationAddress"/>
     </resultMap>
 
     <select id="queryPageList" resultMap="BaseResultMap">
-        select c.*, o.createTime as orderTime,o.type as type
+        select c.*, o.createTime as orderTime,o.type as type,o.reservation_name,o.reservation_phone,o.reservation_address
         from sys_change_dispatch c
                  left join t_order o on c.order_id = o.id
         <where>
@@ -36,6 +39,9 @@
             <if test="data.userName != null and data.userName != ''">
                 and c.user_name like concat('%', #{data.userName}, '%')
             </if>
+            <if test="data.reservationAddress != null and data.reservationAddress != ''">
+                and o.reservationAddress like concat('%', #{data.reservationAddress}, '%')
+            </if>
             <if test="data.cityList != null and data.cityList.size() != 0">
                 and o.city_code in
                 <foreach collection="data.cityList" item="city" open="(" separator="," close=")">
diff --git a/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/controller/OrderController.java b/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/controller/OrderController.java
index c5874ab..e93913d 100644
--- a/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/controller/OrderController.java
+++ b/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/controller/OrderController.java
@@ -390,7 +390,7 @@
         String nowStr = now.format(formatter);
 
 
-        redisService.setCacheObject("MARK:"+workerId+":"+nowStr,longitude + "," + latitude);
+        redisService.setCacheObject("MARK:"+workerId+":"+nowStr,longitude + "," + latitude, 10L, TimeUnit.MINUTES);
 
         String cacheObject = redisService.getCacheObject("MARK:" + workerId + ":" + formattedTime);
         if (cacheObject!=null){
@@ -430,7 +430,7 @@
             System.err.println("-----当前距离"+distance);
             //如果超出一定范围,存入Mark文件
             if (distance<50){
-                redisService.setCacheObject("TIME:"+workerId,LocalDateTime.now());
+                redisService.setCacheObject("TIME:"+workerId,LocalDateTime.now(), 10L, TimeUnit.MINUTES);
                 marker(longitude,latitude);
             }
             }
diff --git a/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/controller/OssController.java b/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/controller/OssController.java
index b3592ba..7ce8ac6 100644
--- a/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/controller/OssController.java
+++ b/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/controller/OssController.java
@@ -12,7 +12,9 @@
 import io.swagger.annotations.ApiOperation;
 import lombok.Synchronized;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -30,6 +32,7 @@
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.Date;
+import java.util.concurrent.CompletableFuture;
 
 
 /**
@@ -71,42 +74,125 @@
         return R.ok(tencentCosUtil.upLoadFile(file));
     }
 
+//    @PostMapping(value = "/pic", produces = "application/json;charset=UTF-8")
+//    @ApiOperation(value = "文件上传加水印", tags = "师傅端-文件上传")
+//    @ApiImplicitParams({
+//            @ApiImplicitParam(value = "文件", name = "file", dataType = "MultipartFile", required = true)
+//    })
+//    public R<String> pic(@RequestParam("file") MultipartFile file,String longitude,
+//                         String latitude) {
+////        Result<String> address = GaoDeMapUtil.getAddress(longitude, latitude);
+//////            return R.fail();
+////
+////        // 获取当前时间
+////
+////        LocalDateTime date = LocalDateTime.now();
+////
+////        // 设置日期格式
+////
+////        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+////
+////        // 通过format调用转换的方法
+////
+////        String dateWatermark =  formatter.format(date);
+//////        System.err.println("==========="+LocalDateTime.now());
+////        log.error("==========="+LocalDateTime.now());
+////
+////        MultipartFile watermarkFile = FileImageWatermarkUtils.markWithContent(file,dateWatermark,address.getDatas());
+//////        System.err.println("==========="+LocalDateTime.now());
+////        log.error("==========="+LocalDateTime.now());
+////
+////
+////        String url = tencentCosUtil.upLoadFile(watermarkFile);
+//////        String url = tencentCosUtil.upLoadFile(file);
+////        log.error("==========="+LocalDateTime.now());
+////        return R.ok(url);
+//
+//
+//        // 参数校验
+//        if (file == null || file.isEmpty()) {
+//            return R.fail("文件不能为空");
+//        }
+//        if (longitude == null || longitude.isEmpty() || latitude == null || latitude.isEmpty()) {
+//            return R.fail("经纬度参数不能为空");
+//        }
+//
+//        try {
+//            // 获取地址信息
+//            Result<String> addressResult = GaoDeMapUtil.getAddress(longitude, latitude);
+//            if (addressResult == null || addressResult.getDatas() == null) {
+//                return R.fail("无法获取地址信息");
+//            }
+//
+//            // 获取当前时间
+//            LocalDateTime date = LocalDateTime.now();
+//            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+//            String dateWatermark = formatter.format(date);
+//            log.info("===========" + dateWatermark);
+//
+//            // 给图片加水印
+//            MultipartFile watermarkFile = FileImageWatermarkUtils.markWithContent(file, dateWatermark, addressResult.getDatas());
+//            log.info("水印添加成功");
+//
+//            // 上传到腾讯云COS
+//            String url = tencentCosUtil.upLoadFile(watermarkFile);
+//            log.info("文件上传成功,URL: " + url);
+//
+//            return R.ok(url);
+//        } catch (Exception e) {
+//            log.error("文件上传加水印失败: ", e);
+//            return R.fail("文件上传加水印失败: " + e.getMessage());
+//        }
+//    }
+
+    @Autowired
+    private ThreadPoolTaskExecutor taskExecutor;
     @PostMapping(value = "/pic", produces = "application/json;charset=UTF-8")
     @ApiOperation(value = "文件上传加水印", tags = "师傅端-文件上传")
     @ApiImplicitParams({
             @ApiImplicitParam(value = "文件", name = "file", dataType = "MultipartFile", required = true)
     })
-    @Synchronized
-    public R<String> pic(@RequestParam("file") MultipartFile file,String longitude,String address,
-                         String latitude) {
-//        Result<String> address = GaoDeMapUtil.getAddress(longitude, latitude);
-//            return R.fail();
+    public CompletableFuture<R<String>> pic(@RequestParam("file") MultipartFile file, String longitude, String latitude) {
+        // 参数校验
+        if (file == null || file.isEmpty()) {
+            return CompletableFuture.completedFuture(R.fail("文件不能为空"));
+        }
+        if (longitude == null || longitude.isEmpty() || latitude == null || latitude.isEmpty()) {
+            return CompletableFuture.completedFuture(R.fail("经纬度参数不能为空"));
+        }
 
-        // 获取当前时间
+        return CompletableFuture.supplyAsync(() -> {
+            try {
+                // 获取地址信息
+                Result<String> addressResult = GaoDeMapUtil.getAddress(longitude, latitude);
+                if (addressResult == null || addressResult.getDatas() == null) {
+                    return R.fail("无法获取地址信息");
+                }
 
-        LocalDateTime date = LocalDateTime.now();
+                // 获取当前时间
+                LocalDateTime date = LocalDateTime.now();
+                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+                String dateWatermark = formatter.format(date);
+                log.info("===========" + dateWatermark);
 
-        // 设置日期格式
+                // 给图片加水印
+                MultipartFile watermarkFile = FileImageWatermarkUtils.markWithContent(file, dateWatermark, addressResult.getDatas());
+                log.info("水印添加成功");
 
-        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+                // 上传到腾讯云COS
+                String url = tencentCosUtil.upLoadFile(watermarkFile);
+                log.info("文件上传成功,URL: " + url);
 
-        // 通过format调用转换的方法
-
-        String dateWatermark =  formatter.format(date);
-//        System.err.println("==========="+LocalDateTime.now());
-        log.error("==========="+LocalDateTime.now());
-
-        MultipartFile watermarkFile = FileImageWatermarkUtils.markWithContent(file,dateWatermark,address);
-//        System.err.println("==========="+LocalDateTime.now());
-        log.error("==========="+LocalDateTime.now());
-
-
-        String url = tencentCosUtil.upLoadFile(watermarkFile);
-//        String url = tencentCosUtil.upLoadFile(file);
-        log.error("==========="+LocalDateTime.now());
-        return R.ok(url);
-
+                return R.ok(url);
+            } catch (Exception e) {
+                log.error("文件上传加水印失败: ", e);
+                return R.fail("文件上传加水印失败: " + e.getMessage());
+            }
+        }, taskExecutor);
     }
 
 
+
+
+
 }

--
Gitblit v1.7.1