From e3a2245265516fef78b4737d6fffc939e7c5e0af Mon Sep 17 00:00:00 2001
From: huliguo <2023611923@qq.com>
Date: 星期四, 03 七月 2025 17:56:07 +0800
Subject: [PATCH] bug修改

---
 pt-errand/src/main/java/com/ruoyi/errand/service/AppUserService.java                   |   16 
 pt-errand/src/main/resources/mapper/FeedbackMapper.xml                                 |    3 
 pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/VipInfoListVO.java              |    4 
 pt-admin/src/main/java/com/ruoyi/web/controller/errand/EvaluationController.java       |    9 
 pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/AddressBookByCommunityIdVO.java |    5 
 pt-errand/src/main/java/com/ruoyi/errand/service/impl/FeedbackServiceImpl.java         |    9 
 pt-errand/src/main/java/com/ruoyi/errand/utils/wx/WechatPayConfig.java                 |   28 
 pt-admin/src/main/java/com/ruoyi/web/controller/errand/BannerController.java           |   13 
 pt-errand/src/main/java/com/ruoyi/errand/utils/WXCore.java                             |    2 
 pt-errand/src/main/resources/mapper/CommunityMapper.xml                                |   20 
 pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AgreementDTO.java              |    2 
 pt-errand/src/main/resources/mapper/CourierMapper.xml                                  |   54 
 pt-errand/src/main/java/com/ruoyi/errand/service/VipOrderService.java                  |    6 
 pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/ConfirmOrderDTO.java           |    2 
 pt-admin/src/main/java/com/ruoyi/web/controller/errand/CommunityController.java        |    4 
 pt-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java          |    9 
 pt-admin/src/main/java/com/ruoyi/web/controller/errand/VipSettingController.java       |   15 
 pt-errand/src/main/resources/cert/apiclient_cert.pem                                   |   25 
 pt-common/src/main/java/com/ruoyi/common/utils/OssConfig.java                          |   25 
 pt-errand/src/main/java/com/ruoyi/errand/object/dto/sys/SetPriceDTO.java               |   17 
 pt-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java              |    2 
 pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/AppUserOrderListVO.java         |   14 
 pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/BirthDayDTO.java               |    4 
 pt-errand/src/main/resources/mapper/EvaluationMapper.xml                               |    1 
 pt-errand/src/main/java/com/ruoyi/errand/domain/AddressBook.java                       |   14 
 pt-errand/src/main/java/com/ruoyi/errand/service/OrderService.java                     |    5 
 pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AddAddressBookDTO.java         |    3 
 pt-errand/src/main/java/com/ruoyi/errand/mapper/CourierMapper.java                     |    2 
 pt-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java         |   39 
 pt-system/src/main/resources/mapper/system/SysMenuMapper.xml                           |   15 
 pt-common/pom.xml                                                                      |    6 
 pt-errand/src/main/java/com/ruoyi/errand/utils/wx/RefundCallbackResult.java            |   38 
 pt-admin/src/main/java/com/ruoyi/web/controller/errand/AddressBookController.java      |    5 
 pt-errand/src/main/java/com/ruoyi/errand/service/ReportService.java                    |    1 
 pt-errand/src/main/java/com/ruoyi/errand/service/impl/ReportServiceImpl.java           |   10 
 pt-errand/src/main/resources/mapper/AddressBookMapper.xml                              |   11 
 pt-system/src/main/java/com/ruoyi/system/object/dto/EditSysRoleDTO.java                |    3 
 pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AddFeedbackDTO.java            |   12 
 pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/AddressBookListVO.java          |   14 
 pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/BannerDetailVo.java             |    5 
 pt-common/src/main/java/com/ruoyi/common/utils/OssService.java                         |   73 +
 pt-errand/src/main/java/com/ruoyi/errand/domain/Agreement.java                         |    2 
 pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AddEvaluationDTO.java          |    3 
 pt-errand/src/main/java/com/ruoyi/errand/domain/AppUser.java                           |    7 
 pt-errand/src/main/java/com/ruoyi/errand/object/vo/login/LoginVO.java                  |    2 
 pt-errand/src/main/resources/cert/apiclient_key.pem                                    |   28 
 pt-errand/src/main/java/com/ruoyi/errand/utils/sms/AliyunSmsService.java               |  142 ++
 pt-errand/src/main/java/com/ruoyi/errand/object/dto/sys/FinanceStatisticsDTO.java      |    3 
 pt-errand/src/main/resources/mapper/VipOrderMapper.xml                                 |   15 
 pt-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java                     |    4 
 pt-errand/src/main/java/com/ruoyi/errand/object/dto/sys/BannerPageDTO.java             |   13 
 pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/AppUserPageListVO.java          |    2 
 pt-errand/src/main/java/com/ruoyi/errand/mapper/VipOrderMapper.java                    |    3 
 pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/SetConfirmOrderDTO.java        |    2 
 pt-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java       |   28 
 pt-admin/src/main/java/com/ruoyi/web/controller/errand/OrderController.java            |   62 
 pt-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java          |    7 
 pt-errand/src/main/resources/mapper/OrderMapper.xml                                    |  137 +-
 pt-errand/src/main/java/com/ruoyi/errand/service/CommunityService.java                 |    2 
 pt-errand/src/main/resources/mapper/AppUserMapper.xml                                  |   16 
 pt-admin/src/main/java/com/ruoyi/web/controller/errand/AgreementController.java        |   93 +
 pt-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java                 |    2 
 pt-errand/src/main/java/com/ruoyi/errand/service/EvaluationService.java                |    4 
 pt-errand/src/main/java/com/ruoyi/errand/service/impl/OrderServiceImpl.java            |  115 +
 pt-admin/src/main/java/com/ruoyi/web/controller/errand/AppUserController.java          |   58 
 pt-errand/src/main/java/com/ruoyi/errand/domain/Phone.java                             |    2 
 pt-errand/src/main/java/com/ruoyi/errand/service/impl/PhoneServiceImpl.java            |    6 
 pt-admin/src/main/java/com/ruoyi/web/controller/errand/PhoneController.java            |   20 
 pt-errand/src/main/java/com/ruoyi/errand/utils/SMSUtil.java                            |    6 
 pt-system/src/main/java/com/ruoyi/system/object/dto/AddDeptDTO.java                    |    8 
 pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/ConfirmOrderVO.java             |    2 
 pt-errand/src/main/java/com/ruoyi/errand/service/impl/AppUserServiceImpl.java          |  247 +++-
 pt-errand/src/main/java/com/ruoyi/errand/service/AddressBookService.java               |    2 
 pt-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java           |   17 
 pt-admin/src/main/java/com/ruoyi/web/controller/errand/CourierController.java          |   14 
 pt-admin/src/main/java/com/ruoyi/web/controller/errand/SystemConfigController.java     |    3 
 pt-errand/src/main/java/com/ruoyi/errand/service/impl/EvaluationServiceImpl.java       |   23 
 pt-errand/src/main/java/com/ruoyi/errand/utils/wx/WechatPayService.java                |  727 +++++++++++++
 pt-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java          |   12 
 pt-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java          |   31 
 pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/OrderPageVO.java                |    6 
 pt-errand/src/main/resources/cert/apiclient_cert.p12                                   |    0 
 pt-errand/src/main/java/com/ruoyi/errand/domain/Report.java                            |   10 
 pt-errand/src/main/java/com/ruoyi/errand/service/impl/CommunityServiceImpl.java        |   65 +
 pt-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java          |   10 
 pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/CourierInfoVO.java              |    2 
 pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/OrderDetailVO.java              |   13 
 pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/FeedbackPageListVO.java         |    2 
 pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/FinanceStatisticsVO.java        |    8 
 pt-errand/src/main/java/com/ruoyi/errand/mapper/CommunityMapper.java                   |    2 
 pt-admin/src/main/resources/application.yml                                            |   31 
 pt-errand/src/main/java/com/ruoyi/errand/object/dto/sys/AgreementContentDTO.java       |   21 
 pt-errand/src/main/java/com/ruoyi/errand/utils/WeChatUtil.java                         |    2 
 pt-errand/src/main/java/com/ruoyi/errand/service/impl/VipOrderServiceImpl.java         |   64 
 pt-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java          |   12 
 pt-errand/src/main/java/com/ruoyi/errand/domain/Order.java                             |    2 
 pt-errand/src/main/java/com/ruoyi/errand/utils/wx/PayResult.java                       |   16 
 pt-admin/src/main/java/com/ruoyi/web/controller/errand/ReportController.java           |   13 
 pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AddReportDTO.java              |    9 
 pt-errand/pom.xml                                                                      |   25 
 pt-errand/src/main/java/com/ruoyi/errand/service/impl/VipSettingServiceImpl.java       |   59 
 pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/CourierSysDetailVO.java         |    7 
 pt-errand/src/main/java/com/ruoyi/errand/service/VipSettingService.java                |    2 
 pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AppletLogin.java               |    5 
 pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/CourierOrderListVO.java         |    3 
 pt-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java                     |    8 
 pt-admin/src/main/java/com/ruoyi/web/controller/errand/VipOrderController.java         |   23 
 pt-errand/src/main/resources/mapper/ReportMapper.xml                                   |   11 
 pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AddRegisterReportDTO.java      |   26 
 pt-errand/src/main/java/com/ruoyi/errand/domain/VipSetting.java                        |    8 
 pt-errand/src/main/java/com/ruoyi/errand/service/FeedbackService.java                  |    3 
 pt-system/src/main/resources/mapper/system/SysUserRoleMapper.xml                       |    3 
 pt-errand/src/main/java/com/ruoyi/errand/service/impl/AddressBookServiceImpl.java      |   69 
 pt-errand/src/main/java/com/ruoyi/errand/utils/wx/XMLUtil.java                         |   52 
 pt-errand/src/main/java/com/ruoyi/errand/utils/wx/HttpUtil.java                        |   99 +
 pt-admin/src/main/java/com/ruoyi/web/controller/errand/FeedbackController.java         |   11 
 pt-errand/src/main/java/com/ruoyi/errand/service/impl/CourierServiceImpl.java          |  112 +
 pt-system/src/main/resources/mapper/system/SysUserMapper.xml                           |   11 
 pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/AppUserInfoVO.java              |   15 
 pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/RegisterDTO.java               |    4 
 120 files changed, 2,747 insertions(+), 512 deletions(-)

diff --git a/pt-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java b/pt-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java
index fc2a774..3257e93 100644
--- a/pt-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java
+++ b/pt-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java
@@ -5,6 +5,7 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import com.ruoyi.common.utils.OssService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
@@ -44,7 +45,7 @@
     /**
      * 通用上传请求(单个)
      */
-    @ApiOperation(value = "文件上传", notes = "文件上传")
+ /*   @ApiOperation(value = "文件上传", notes = "文件上传")
     @PostMapping("/upload")
     public AjaxResult uploadFile(MultipartFile file) throws Exception {
         try {
@@ -62,8 +63,20 @@
         } catch (Exception e) {
             return AjaxResult.error(e.getMessage());
         }
+    }*/
+    @Autowired
+    private OssService ossService;
+    @ApiOperation(value = "文件上传", notes = "文件上传")
+    @PostMapping("/upload")
+    public AjaxResult uploadFile(MultipartFile file) throws Exception {
+        // 指定存储目录,例如images
+        AjaxResult ajax = AjaxResult.success();
+        String directory = "images";
+        String url = ossService.uploadFile(file, directory);
+        ajax.put("url", url);
+//        System.err.println(url);
+        return ajax;
     }
-
     /**
      * 通用上传请求(多个)
      */
diff --git a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/AddressBookController.java b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/AddressBookController.java
index f62bdec..749723a 100644
--- a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/AddressBookController.java
+++ b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/AddressBookController.java
@@ -55,9 +55,8 @@
      */
     @PostMapping("/add")
     @ApiOperation(value = "添加新地址",tags = "app用户端-地址簿")
-    public R<Void> add(@RequestBody AddAddressBookDTO addAddressBookDTO ) {
-        addressBookService.add(addAddressBookDTO);
-        return R.ok();
+    public R<Integer> add(@RequestBody AddAddressBookDTO addAddressBookDTO ) {
+        return R.ok(addressBookService.add(addAddressBookDTO));
     }
     /**
      * 修改地址
diff --git a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/AgreementController.java b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/AgreementController.java
index e643253..4fc9e30 100644
--- a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/AgreementController.java
+++ b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/AgreementController.java
@@ -4,15 +4,23 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.errand.domain.Agreement;
+import com.ruoyi.errand.mapper.AgreementMapper;
 import com.ruoyi.errand.object.dto.app.AgreementDTO;
+import com.ruoyi.errand.object.dto.sys.AgreementContentDTO;
 import com.ruoyi.errand.service.AgreementService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cglib.core.Local;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 @RestController
 @RequestMapping(value = "/app/agreement")
@@ -21,9 +29,11 @@
 
     @Autowired
     private AgreementService agreementService;
+    @Autowired
+    private AgreementMapper agreementMapper;
 
     /**
-     * 协议 类型(1=用户协议,2=隐私协议,3=下单须知,4=注销协议,5=首页介绍,6=快递代拿下单说明,7=商品代买下单说明)
+     * 协议 类型(1=用户协议,2=隐私协议,3=下单须知,4=注销协议,5=首页介绍,6=快递代拿下单说明,7=商品代买下单说明,8=会员协议)
      */
     @GetMapping("/getAgreementByType")
     @ApiOperation(value = "根据类型获取不同协议",tags = "app用户端-协议")
@@ -35,16 +45,83 @@
     @PreAuthorize("@ss.hasPermi('system:agreement:list')")
     @ApiOperation(value = "协议管理-添加", tags = {"管理后台-系统管理"})
     public R<Void> addAgreement(@RequestBody AgreementDTO agreementDTO){
-        //先删除启动页的数据
         Agreement one = agreementService.getOne(new LambdaQueryWrapper<Agreement>().eq(Agreement::getType, agreementDTO.getType()));
-        if (one!=null){
-            agreementService.removeById(one);
-        }
-        Agreement agreement = new Agreement();
-        BeanUtils.copyProperties(agreementDTO,agreement);
-        agreementService.save(agreement);
+        one.setContent(agreementDTO.getContent());
+        agreementService.updateById(one);
         return R.ok();
     }
 
+    @PostMapping("/addAgreement/content")
+    @PreAuthorize("@ss.hasPermi('system:agreement:list')")
+    @ApiOperation(value = "协议管理-内容管理", tags = {"管理后台-系统管理"})
+    public R<Void> addAgreementContent(@RequestBody AgreementContentDTO dto){
+        //修改
+        List<Agreement> agreementList = agreementMapper.selectList(new LambdaQueryWrapper<Agreement>().in(Agreement::getType, Arrays.asList(5, 6, 7)));
+        ArrayList<Integer> types = new ArrayList<>();
+        types.add(5);
+        types.add(6);
+        types.add(7);
+        if (agreementList!=null&& !agreementList.isEmpty()){
+            agreementList.forEach(agreement -> {
+                if (agreement.getType()==5){
+                    agreement.setContent(dto.getContent());
+                    types.remove(agreement.getType());
+                    this.agreementMapper.updateById(agreement);
+                }
+                if (agreement.getType()==6){
+                    agreement.setContent(dto.getTakeContent());
+                    types.remove(agreement.getType());
+                    this.agreementMapper.updateById(agreement);
+                }
+                if (agreement.getType()==7){
+                    agreement.setContent(dto.getBuyContent());
+                    types.remove(agreement.getType());
+                    this.agreementMapper.updateById(agreement);
+                }
+            });
+        }
+       if (!types.isEmpty()){
+           types.forEach(type -> {
+               if (type==5){
+                   Agreement agreement = new Agreement();
+                   agreement.setContent(dto.getContent());
+                   agreement.setType(type);
+                   agreement.setCreateTime(LocalDateTime.now());
+                   this.agreementMapper.insert(agreement);
+               }
+               if (type==6){
+                   Agreement agreement = new Agreement();
+                   agreement.setContent(dto.getTakeContent());
+                   agreement.setType(type);
+                   agreement.setCreateTime(LocalDateTime.now());
+                   this.agreementMapper.insert(agreement);
+               }
+               if (type==7){
+                   Agreement agreement = new Agreement();
+                   agreement.setContent(dto.getBuyContent());
+                   agreement.setType(type);
+                   agreement.setCreateTime(LocalDateTime.now());
+                   this.agreementMapper.insert(agreement);
+               }
+           });
+       }
+       return R.ok();
+    }
+
+    @GetMapping("/getAgreement/content")
+    @PreAuthorize("@ss.hasPermi('system:agreement:list')")
+    @ApiOperation(value = "协议管理-内容管理-查看详情", tags = {"管理后台-系统管理"})
+    public R<AgreementContentDTO> getAgreementContent(){
+        AgreementContentDTO vo = new AgreementContentDTO();
+        List<Agreement> agreementList = agreementMapper.selectList(new LambdaQueryWrapper<Agreement>().in(Agreement::getType, Arrays.asList(5, 6, 7)));
+        if (agreementList!=null&& !agreementList.isEmpty()){
+            agreementList.forEach(agreement -> {
+                if (agreement.getType()==5) vo.setContent(agreement.getContent());
+                if (agreement.getType()==6) vo.setTakeContent(agreement.getContent());
+                if (agreement.getType()==7) vo.setBuyContent(agreement.getContent());
+            });
+        }
+        return R.ok(vo);
+    }
 
 }
\ No newline at end of file
diff --git a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/AppUserController.java b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/AppUserController.java
index 5b82684..1a06885 100644
--- a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/AppUserController.java
+++ b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/AppUserController.java
@@ -95,9 +95,9 @@
      */
     @PostMapping("/register")
     @ApiOperation(value = "注册",tags = "app用户端")
-    public R<Void> register(@RequestBody @Valid RegisterDTO registerDTO) {
-        appUserService.register(registerDTO);
-        return R.ok();
+    public R<LoginVO> register(@RequestBody @Valid RegisterDTO registerDTO) {
+
+        return R.ok( appUserService.register(registerDTO));
     }
     /**
      * 根据小区id(可选择)
@@ -128,6 +128,24 @@
         return R.ok();
     }
     /**
+     * 修改姓名
+     */
+    @PutMapping("/setName")
+    @ApiOperation(value = "修改姓名",tags = "app用户端-个人信息")
+    public R<Void> setName(@RequestParam String name) {
+        appUserService.setName(name);
+        return R.ok();
+    }
+    /**
+     * 修改头像
+     */
+    @PutMapping("/setAvatar")
+    @ApiOperation(value = "修改头像",tags = "app用户端-个人信息")
+    public R<Void> setAvatar(@RequestParam String avatar) {
+        appUserService.setAvatar(avatar);
+        return R.ok();
+    }
+    /**
      * 修改生日
      */
     @PutMapping("/setBirthDay")
@@ -142,8 +160,8 @@
      */
     @DeleteMapping("/delete")
     @ApiOperation(value = "注销账号",tags = "app用户端-个人信息")
-    public R<Void> delete() {
-        appUserService.delete();
+    public R<Void> delete(@RequestHeader("Authorization") String token) {
+        appUserService.delete(token);
         return R.ok();
     }
 
@@ -263,7 +281,7 @@
     @GetMapping("/detail")
     @PreAuthorize("@ss.hasPermi('system:appuser:list')")
     @ApiOperation(value = "用户管理-用户详情", tags = "系统后台-用户管理")
-    public R<AppUserSysDetailVO> detail(@RequestParam("id") Integer id) {
+    public R<AppUserSysDetailVO> detail(@RequestParam("id") String id) {
         return R.ok(appUserService.detail(id));
     }
     /**
@@ -272,7 +290,7 @@
     @PutMapping("/froze")
     @PreAuthorize("@ss.hasPermi('system:appuser:list')")
     @ApiOperation(value = "用户管理-冻结/解冻", tags = "系统后台-用户管理")
-    public R froze(@RequestParam("id") Integer id) {
+    public R froze(@RequestParam("id") String id) {
         appUserService.froze(id);
         return R.ok();
     }
@@ -282,7 +300,7 @@
     @GetMapping("/refund")
     @PreAuthorize("@ss.hasPermi('system:appuser:list')")
     @ApiOperation(value = "用户管理-会员退费", tags = "系统后台-用户管理")
-    public R<Void> refund(@RequestParam("id") Integer id) {
+    public R<Void> refund(@RequestParam("id") String id) {
         appUserService.refund(id);
         return R.ok();
     }
@@ -290,26 +308,18 @@
 
     /**
      * 订单取消支付回退
-     *
-     * @param refundCallbackResult
-     * @param response
      * @return
      */
     @ResponseBody
-    @GetMapping("/refundPayMoneyCallback")
-    public void refundPayMoneyCallback(RefundCallbackResult refundCallbackResult, HttpServletResponse response) {
-        R callback = appUserService.refundPayMoneyCallback(refundCallbackResult);
+    @PostMapping("/refundPayMoneyCallback")
+    public String refundPayMoneyCallback(@RequestBody(required = false) String xmlData) {
+        System.out.println("会员退费:" + xmlData);
+        R callback = appUserService.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/pt-admin/src/main/java/com/ruoyi/web/controller/errand/BannerController.java b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/BannerController.java
index 4faff17..fbdb579 100644
--- a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/BannerController.java
+++ b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/BannerController.java
@@ -5,6 +5,7 @@
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.errand.domain.Banner;
 import com.ruoyi.errand.object.dto.sys.AddBannerDTO;
+import com.ruoyi.errand.object.dto.sys.BannerPageDTO;
 import com.ruoyi.errand.object.dto.sys.OrderPageListDTO;
 import com.ruoyi.errand.object.vo.app.BannerVO;
 import com.ruoyi.errand.object.vo.sys.BannerDetailVo;
@@ -42,14 +43,12 @@
     /**
      * 分页查询
      */
-    @GetMapping("/list")
+    @PostMapping("/list")
     @PreAuthorize("@ss.hasPermi('system:banner:list')")
     @ApiOperation(value = "banner管理-分页查询", tags = {"管理后台-系统管理"})
-    public R<IPage<BannerPageListVO>> pageList(@RequestParam("pageNum") Integer pageNum,
-                                              @RequestParam("pageSize") Integer pageSize,
-                                              @RequestParam("name") String name) {
-        IPage<BannerPageListVO> iPage=new Page<>(pageNum,pageSize);
-        return R.ok(bannerService.pageList(iPage,name));
+    public R<IPage<BannerPageListVO>> pageList(@RequestBody BannerPageDTO dto) {
+        IPage<BannerPageListVO> iPage=new Page<>(dto.getPageNum(),dto.getPageSize());
+        return R.ok(bannerService.pageList(iPage,dto.getName()));
     }
 
     /**
@@ -67,7 +66,7 @@
      */
     @PutMapping("/edit")
     @PreAuthorize("@ss.hasPermi('system:banner:list')")
-    @ApiOperation(value = "banner管理-添加", tags = {"管理后台-系统管理"})
+    @ApiOperation(value = "banner管理-编辑", tags = {"管理后台-系统管理"})
     public R edit(@RequestBody EditBannerDTO editBannerDTO) {
         bannerService.edit(editBannerDTO);
         return R.ok();
diff --git a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/CommunityController.java b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/CommunityController.java
index 82c4e8a..420ee30 100644
--- a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/CommunityController.java
+++ b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/CommunityController.java
@@ -43,8 +43,8 @@
     @GetMapping("/getTotalCommunityList")
     @PreAuthorize("@ss.hasPermi('system:index:statistics')")
     @ApiOperation(value = "获取所有小区列表(开通的小区总数取列表大小吧)",tags = "系统后台-首页")
-    public R<List<CommunityListVO>> getTotalCommunityList() {
-        return communityService.getTotalCommunityList();
+    public R<List<CommunityListVO>> getTotalCommunityList(@RequestParam(value = "name",required = false) String name) {
+        return communityService.getTotalCommunityList(name);
     }
 
     /**
diff --git a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/CourierController.java b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/CourierController.java
index 96336de..8006e60 100644
--- a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/CourierController.java
+++ b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/CourierController.java
@@ -82,7 +82,7 @@
     }
 
     /**
-     * 加载未绑定小区的跑腿员   权限设置
+     * 加载未绑定小区的跑腿员
      */
     @GetMapping("/getAllCourierList")
     @PreAuthorize("@ss.hasPermi('system:appuser:list')")
@@ -92,7 +92,7 @@
     }
 
     /**
-     * 跑腿员管理列表 权限设置
+     * 跑腿员管理列表
      */
     @PostMapping("/list")
     @PreAuthorize("@ss.hasPermi('system:courier:list')")
@@ -101,7 +101,7 @@
         return R.ok(courierService.getCourierPageList(courierPageListDTO));
     }
     /**
-     * 查看详情 权限设置
+     * 查看详情
      */
     @GetMapping("/detail")
     @PreAuthorize("@ss.hasPermi('system:courier:list')")
@@ -110,7 +110,7 @@
         return R.ok(courierService.detail(id));
     }
     /**
-     * 添加 权限设置
+     * 添加
      */
     @PostMapping("/add")
     @PreAuthorize("@ss.hasPermi('system:courier:list')")
@@ -120,7 +120,7 @@
         return R.ok();
     }
     /**
-     * 编辑 权限设置
+     * 编辑
      */
     @PutMapping("/edit")
     @PreAuthorize("@ss.hasPermi('system:courier:list')")
@@ -131,7 +131,7 @@
     }
 
     /**
-     * 删除 权限设置
+     * 删除
      */
     @DeleteMapping("/delete")
     @PreAuthorize("@ss.hasPermi('system:courier:list')")
@@ -141,7 +141,7 @@
         return R.ok();
     }
     /**
-     * 复职/离职 权限设置
+     * 复职/离职
      */
     @PutMapping("/froze")
     @PreAuthorize("@ss.hasPermi('system:courier:list')")
diff --git a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/EvaluationController.java b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/EvaluationController.java
index 2f3118b..8bb3e70 100644
--- a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/EvaluationController.java
+++ b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/EvaluationController.java
@@ -27,9 +27,14 @@
      * 订单评价
      */
     @PostMapping("/add")
-    @ApiOperation(value = "评价订单",tags = "app用户端-订单")
+    @ApiOperation(value = "评价订单",tags = {"app用户端-订单","app跑腿员-订单"})
     public R<Void> add(@RequestBody @Valid AddEvaluationDTO addEvaluationDTO) {
-        evaluationService.add(addEvaluationDTO);
+        if(addEvaluationDTO.getEvaluationId()==null){
+            evaluationService.add(addEvaluationDTO);
+        }else {
+            evaluationService.edit(addEvaluationDTO);
+        }
+
         return R.ok();
     }
 }    
\ No newline at end of file
diff --git a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/FeedbackController.java b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/FeedbackController.java
index 5d2fb8d..35e76f4 100644
--- a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/FeedbackController.java
+++ b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/FeedbackController.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.errand.object.dto.app.AddFeedbackDTO;
 import com.ruoyi.errand.object.dto.sys.FeedbackPageListDTO;
 import com.ruoyi.errand.object.dto.sys.OrderPageListDTO;
 import com.ruoyi.errand.object.vo.sys.FeedbackPageListVO;
@@ -31,8 +32,8 @@
      */
     @PostMapping("/add")
     @ApiOperation(value = "意见反馈",tags = "app用户端-意见反馈")
-    public R<Integer> add(@RequestParam String content) {
-        feedbackService.add(content);
+    public R add(@RequestBody AddFeedbackDTO dto) {
+        feedbackService.add(dto);
         return R.ok();
     }
 
@@ -42,7 +43,7 @@
      */
     @PostMapping("/list")
     @PreAuthorize("@ss.hasPermi('system:feedback:list')")
-    @ApiOperation(value = "反馈管理-分页列表", tags = "系统后台-订单管理")
+    @ApiOperation(value = "反馈管理-分页列表", tags = "系统后台-意见反馈")
     public R<IPage<FeedbackPageListVO>> getFeedbackPageList(@RequestBody @Valid FeedbackPageListDTO feedbackPageListDTO) {
         return R.ok(feedbackService.getFeedbackPageList(feedbackPageListDTO));
     }
@@ -51,7 +52,7 @@
      */
     @DeleteMapping("/delete")
     @PreAuthorize("@ss.hasPermi('system:feedback:list')")
-    @ApiOperation(value = "反馈管理-删除", tags = "系统后台-订单管理")
+    @ApiOperation(value = "反馈管理-删除", tags = "系统后台-意见反馈")
     public R delete(@RequestParam("id")Integer id) {
         feedbackService.delete(id);
         return R.ok();
@@ -62,7 +63,7 @@
      */
     @PutMapping("/dispose")
     @PreAuthorize("@ss.hasPermi('system:feedback:list')")
-    @ApiOperation(value = "反馈管理-处理", tags = "系统后台-订单管理")
+    @ApiOperation(value = "反馈管理-处理", tags = "系统后台-意见反馈")
     public R dispose(@RequestParam("id")Integer id) {
         feedbackService.dispose(id);
         return R.ok();
diff --git a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/OrderController.java b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/OrderController.java
index a158cd8..f6ef27c 100644
--- a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/OrderController.java
+++ b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/OrderController.java
@@ -19,8 +19,11 @@
 import com.ruoyi.errand.object.vo.sys.OrderSysDetailVO;
 import com.ruoyi.errand.object.vo.sys.UserStatsVO;
 import com.ruoyi.errand.service.OrderService;
+import com.ruoyi.errand.service.VipOrderService;
 import com.ruoyi.errand.utils.RefundCallbackResult;
 import com.ruoyi.errand.utils.UniPayCallbackResult;
+import com.ruoyi.errand.utils.wx.PayResult;
+import com.ruoyi.errand.utils.wx.WechatPayService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -29,6 +32,7 @@
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
@@ -44,6 +48,11 @@
 public class OrderController {
     @Autowired
     private OrderService orderService;
+
+    @Autowired
+    private WechatPayService wechatPayService;
+    @Autowired
+    private VipOrderService vipOrderService;
 
     /**
      * 下单
@@ -67,12 +76,18 @@
      * 订单支付回调通知
      */
     @ResponseBody
-    @GetMapping("/orderPaymentCallback")
-    public void orderPaymentCallback(UniPayCallbackResult uniPayCallbackResult, HttpServletResponse response){
-        String jsonString = JSONObject.toJSONString(uniPayCallbackResult);
-        log.info("订单支付回调json:{}", jsonString);
-        R callback = orderService.orderPaymentCallback(uniPayCallbackResult);
-        if(callback.getCode() == 200){
+    @PostMapping("/orderPaymentCallback")
+    public void orderPaymentCallback(HttpServletRequest request, HttpServletResponse response){
+        System.err.println("11111111111");
+        PayResult payResult= null;
+        try {
+            payResult = wechatPayService.processNotify(request);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        System.out.println("1111111111111111111111");
+        R callback = orderService.orderPaymentCallback(payResult);
+        if(callback.getCode() == 200) {
             response.setStatus(200);
             PrintWriter out = null;
             try {
@@ -93,8 +108,8 @@
     @GetMapping("/getAppUserOrderList")
     @ApiOperation(value = "订单列表",tags = "app用户端-订单页面")
     public R<IPage<AppUserOrderListVO>> getAppUserOrderList(
-            @RequestParam(value = "pageNum",defaultValue = "1") Integer pageNum,
-            @RequestParam(value = "pageSize",defaultValue = "10") Integer pageSize,
+            @RequestParam(value = "pageNum",defaultValue = "1",required = false) Integer pageNum,
+            @RequestParam(value = "pageSize",defaultValue = "10",required = false) Integer pageSize,
             @RequestParam(value = "orderStatus",required = false) Integer orderStatus) {
         return R.ok(orderService.getAppUserOrderList(pageNum,pageSize,orderStatus));
     }
@@ -129,26 +144,16 @@
 
     /**
      * 订单取消支付回退
-     *
-     * @param refundCallbackResult
-     * @param response
-     * @return
      */
     @ResponseBody
     @GetMapping("/refundPayMoneyCallback")
-    public void refundPayMoneyCallback(RefundCallbackResult refundCallbackResult, HttpServletResponse response) {
-        R callback = orderService.refundPayMoneyCallback(refundCallbackResult);
+    public String refundPayMoneyCallback( @RequestBody(required = false) String 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>";
         }
     }
     /**
@@ -281,8 +286,13 @@
     @GetMapping("/detail")
     @PreAuthorize("@ss.hasPermi('system:order:list')")
     @ApiOperation(value = "订单管理-订单详情", tags = "系统后台-订单管理")
-    public R<OrderSysDetailVO> detail(@RequestParam("id") Integer id) {
-        return R.ok(orderService.detail(id));
+    public R<OrderSysDetailVO> detail(@RequestParam("id") Integer id,@RequestParam("type") Integer type) {
+        if (type==2){
+            return R.ok(orderService.detail(id));
+        }else {
+            return R.ok(vipOrderService.detail(id));
+        }
+
     }
 
     /**
diff --git a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/PhoneController.java b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/PhoneController.java
index a084bbe..768ca9e 100644
--- a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/PhoneController.java
+++ b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/PhoneController.java
@@ -1,6 +1,8 @@
 package com.ruoyi.web.controller.errand;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.errand.domain.Phone;
 import com.ruoyi.errand.object.vo.app.ConfirmOrderVO;
 import com.ruoyi.errand.service.PhoneService;
 import io.swagger.annotations.Api;
@@ -24,7 +26,7 @@
      * 联系客服
      */
     @GetMapping("/getServletPhone")
-    @ApiOperation(value = "获取客服电话",tags = "app用户端-联系客服")
+    @ApiOperation(value = "获取客服电话",tags = { "app用户端-联系客服" })
     public R<String> getServletPhone() {
         return R.ok(phoneService.getServletPhone());
     }
@@ -39,4 +41,20 @@
         phoneService.saveServicePhone(phone);
         return R.ok();
     }
+
+    /**
+     * 联系客服
+     */
+    @GetMapping("/getSysPhone")
+    @PreAuthorize("@ss.hasPermi('system:feedback:list')")
+    @ApiOperation(value = "获取客服电话",tags = { "管理后台-系统管理" })
+    public R<String> getSysPhone() {
+        Phone one = phoneService.getOne(new LambdaQueryWrapper<Phone>().eq(Phone::getType, 1));
+        if (one != null) {
+            return R.ok(one.getPhone());
+        }else {
+            return R.ok();
+        }
+    }
+
 }    
\ No newline at end of file
diff --git a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/ReportController.java b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/ReportController.java
index 28dbb04..ae94890 100644
--- a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/ReportController.java
+++ b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/ReportController.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.errand.domain.Report;
+import com.ruoyi.errand.object.dto.app.AddRegisterReportDTO;
 import com.ruoyi.errand.object.dto.app.AddReportDTO;
 import com.ruoyi.errand.object.dto.sys.CourierPageListDTO;
 import com.ruoyi.errand.object.dto.sys.ReportPageListDTO;
@@ -40,20 +41,20 @@
     }
 
     /**
-     * 未开通上报列表 权限设置
+     * 未开通上报列表
      */
     @PostMapping("/list")
-    @PreAuthorize("@ss.hasPermi('system:community:list')")
+    @PreAuthorize("@ss.hasPermi('system:report:list')")
     @ApiOperation(value = "未开通上报管理-列表", tags = "系统后台-小区管理")
     public R<IPage<ReportPageListVO>> getReportList(@RequestBody @Valid ReportPageListDTO reportPageListDTO) {
         return R.ok(reportService.getReportList(reportPageListDTO));
     }
 
     /**
-     * 处理  权限设置
+     * 处理
      */
     @PutMapping("/dispose")
-    @PreAuthorize("@ss.hasPermi('system:community:list')")
+    @PreAuthorize("@ss.hasPermi('system:report:list')")
     @ApiOperation(value = "未开通上报管理-处理", tags = "系统后台-小区管理")
     public R<Void> dispose(@RequestParam("id")Integer id) {
         reportService.dispose(id);
@@ -61,10 +62,10 @@
     }
 
     /**
-     * 删除 权限设置
+     * 删除
      */
     @DeleteMapping("/delete")
-    @PreAuthorize("@ss.hasPermi('system:community:list')")
+    @PreAuthorize("@ss.hasPermi('system:report:list')")
     @ApiOperation(value = "未开通上报管理-删除", tags = "系统后台-小区管理")
     public R<Void> delete(@RequestParam("id")Integer id) {
         reportService.delete(id);
diff --git a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/SystemConfigController.java b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/SystemConfigController.java
index 1878cf4..020d436 100644
--- a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/SystemConfigController.java
+++ b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/SystemConfigController.java
@@ -2,6 +2,7 @@
 
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.errand.constant.SystemConfigTypeConstant;
 import com.ruoyi.errand.domain.SystemConfig;
@@ -46,7 +47,7 @@
     @GetMapping("/index/start")
     @ApiOperation(value = "启动页-详情", tags = {"app用户端-启动页","管理后台-启动页配置"})
     public R<StartPageSetDto> indexStart(){
-        SystemConfig one = systemConfigService.lambdaQuery().eq(SystemConfig::getType, SystemConfigTypeConstant.START_PAGE).one();
+        SystemConfig one = systemConfigService.getBaseMapper().selectOne(new LambdaQueryWrapper<SystemConfig>().eq(SystemConfig::getType, SystemConfigTypeConstant.START_PAGE));;
         if (one==null){
             return R.ok();
         }
diff --git a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/VipOrderController.java b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/VipOrderController.java
index 57a502b..73d2c8d 100644
--- a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/VipOrderController.java
+++ b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/VipOrderController.java
@@ -5,12 +5,15 @@
 import com.ruoyi.errand.object.dto.app.VipPaymentDTO;
 import com.ruoyi.errand.service.VipOrderService;
 import com.ruoyi.errand.utils.UniPayCallbackResult;
+import com.ruoyi.errand.utils.wx.PayResult;
+import com.ruoyi.errand.utils.wx.WechatPayService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
@@ -23,6 +26,9 @@
 public class VipOrderController {
     @Autowired
     private VipOrderService vipOrderService;
+
+    @Autowired
+    private WechatPayService wechatPayService;
 
 
     /**
@@ -39,11 +45,18 @@
      * 订单支付回调通知
      */
     @ResponseBody
-    @GetMapping("/orderPaymentCallback")
-    public void orderPaymentCallback(UniPayCallbackResult uniPayCallbackResult, HttpServletResponse response){
-        String jsonString = JSONObject.toJSONString(uniPayCallbackResult);
-        log.info("订单支付回调json:{}", jsonString);
-        R callback = vipOrderService.orderPaymentCallback(uniPayCallbackResult);
+    @PostMapping("/orderPaymentCallback")
+    public void orderPaymentCallback(HttpServletRequest request, HttpServletResponse response){
+        System.err.println("1111111111111");
+        PayResult payResult= null;
+        try {
+            payResult = wechatPayService.processNotify(request);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        System.out.println("1111111111111111111111");
+//        System.out.println(jsonString);
+        R callback = vipOrderService.orderPaymentCallback(payResult);
         if(callback.getCode() == 200){
             response.setStatus(200);
             PrintWriter out = null;
diff --git a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/VipSettingController.java b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/VipSettingController.java
index b94bc82..8389e8b 100644
--- a/pt-admin/src/main/java/com/ruoyi/web/controller/errand/VipSettingController.java
+++ b/pt-admin/src/main/java/com/ruoyi/web/controller/errand/VipSettingController.java
@@ -40,7 +40,7 @@
      */
     @PostMapping("/setPrice")
     @PreAuthorize("@ss.hasPermi('system:vip:list')")
-    @ApiOperation(value = "会员管理-设置价格", tags = "系统后台-订单管理")
+    @ApiOperation(value = "会员管理-设置价格", tags = "系统后台-会员管理")
     public R setPrice(@RequestBody @Valid SetPriceDTO setPriceDTO) {
         vipSettingService.setPrice(setPriceDTO);
         return R.ok();
@@ -49,9 +49,20 @@
     /**
      * 查看详情
      */
+    @PostMapping("/getPrice")
+    @PreAuthorize("@ss.hasPermi('system:vip:list')")
+    @ApiOperation(value = "会员管理-获取会员配置", tags = "系统后台-会员管理")
+    public R<SetPriceDTO> getPrice() {
+
+        return R.ok(vipSettingService.getPrice());
+    }
+
+    /**
+     * 查看详情
+     */
     @GetMapping("/getVipList")
     @PreAuthorize("@ss.hasPermi('system:vip:list')")
-    @ApiOperation(value = "会员管理-列表", tags = "系统后台-订单管理")
+    @ApiOperation(value = "会员管理-列表", tags = "系统后台-会员管理")
     public R<List<VipInfoListVO>> getVipList() {
         return R.ok(vipSettingService.getVipInfoList());
     }
diff --git a/pt-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java b/pt-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java
index d1f5ef1..549d085 100644
--- a/pt-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java
+++ b/pt-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java
@@ -8,6 +8,7 @@
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.errand.object.dto.sys.FinanceStatisticsDTO;
 import com.ruoyi.errand.object.vo.sys.FinanceStatisticsVO;
+import com.ruoyi.system.object.dto.AddDeptDTO;
 import com.ruoyi.system.object.vo.SysDeptPageVO;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiOperation;
@@ -94,9 +95,9 @@
     @PreAuthorize("@ss.hasPermi('system:dept:list')")
     @Log(title = "部门管理", businessType = BusinessType.INSERT)
     @ApiOperation(value = "部门管理-新增部门", tags = "系统后台-权限管理")
-    @GetMapping("/add")
-    public AjaxResult add(@RequestParam("name")String name) {
-        deptService.add(name);
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody AddDeptDTO dto) {
+        deptService.add(dto.getName());
         return success();
     }
 
diff --git a/pt-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/pt-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
index f80da37..c51c455 100644
--- a/pt-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
+++ b/pt-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -1,8 +1,11 @@
 package com.ruoyi.web.controller.system;
 
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
+import com.ruoyi.system.mapper.SysMenuMapper;
 import com.ruoyi.system.object.dto.SetPasswordDTO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -43,6 +46,8 @@
     private SysPermissionService permissionService;
     @Autowired
     private TokenService tokenService;
+    @Autowired
+    private SysMenuMapper sysMenuMapper;
 
     /**
      * 登录方法
@@ -79,20 +84,36 @@
     public AjaxResult getInfo() {
         LoginUser loginUser = SecurityUtils.getLoginUser();
         SysUser user = loginUser.getUser();
-        // 角色集合
-        Set<String> roles = permissionService.getRolePermission(user);
         // 权限集合
-        Set<String> permissions = permissionService.getMenuPermission(user);
-        if (!loginUser.getPermissions().equals(permissions)) {
-            loginUser.setPermissions(permissions);
-            tokenService.refreshToken(loginUser);
-        }
         AjaxResult ajax = AjaxResult.success();
         ajax.put("user", user);
-        ajax.put("roles", roles);
-        ajax.put("permissions", permissions);
+        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/pt-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java b/pt-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java
index fe3f807..684c4d4 100644
--- a/pt-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java
+++ b/pt-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java
@@ -1,6 +1,9 @@
 package com.ruoyi.web.controller.system;
 
 import java.util.Map;
+
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.system.mapper.SysUserMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -37,6 +40,8 @@
 
     @Autowired
     private TokenService tokenService;
+    @Autowired
+    private SysUserMapper sysUserMapper;
 
     /**
      * 个人信息
@@ -81,27 +86,24 @@
      * 重置密码
      */
     @Log(title = "个人信息", businessType = BusinessType.UPDATE)
-    @PutMapping("/updatePwd")
+    @PostMapping("/updatePwd")
     public AjaxResult updatePwd(@RequestBody Map<String, String> params) {
         String oldPassword = params.get("oldPassword");
         String newPassword = params.get("newPassword");
-        LoginUser loginUser = getLoginUser();
-        String userName = loginUser.getUsername();
-        String password = loginUser.getPassword();
-        if (!SecurityUtils.matchesPassword(oldPassword, password)) {
+        String userName = params.get("username");
+        SysUser sysUser = sysUserMapper.selectUserByUserName(userName);
+        if (sysUser.getStatus().equals("1")){
+            throw new ServiceException("该用户已被冻结");
+        }
+        if (!SecurityUtils.matchesPassword(oldPassword, sysUser.getPassword())) {
             return error("修改密码失败,旧密码错误");
         }
-        if (SecurityUtils.matchesPassword(newPassword, password)) {
+        if (SecurityUtils.matchesPassword(newPassword, sysUser.getPassword())) {
             return error("新密码不能与旧密码相同");
         }
         newPassword = SecurityUtils.encryptPassword(newPassword);
-        if (userService.resetUserPwd(userName, newPassword) > 0) {
-            // 更新缓存用户密码
-            loginUser.getUser().setPassword(newPassword);
-            tokenService.setLoginUser(loginUser);
-            return success();
-        }
-        return error("修改密码异常,请联系管理员");
+        userService.resetUserPwd(userName, newPassword);
+        return success();
     }
 
     /**
diff --git a/pt-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java b/pt-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
index bc2e844..d1e6a2c 100644
--- a/pt-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
+++ b/pt-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
@@ -77,7 +77,7 @@
     @ApiOperation(value = "角色管理-分页列表", tags = "系统后台-权限管理")
     public R<IPage<SysRolePageVO>> page(@RequestParam(value = "pageNum",defaultValue = "0")Integer pageNum,
                                         @RequestParam(value = "pageSize",defaultValue="10")Integer pageSize,
-                                        @RequestParam(value = "name",required = false)String name) {
+                                        @RequestParam(value = "roleName",required = false)String name) {
         IPage<SysRolePageVO> iPage = new Page<>(pageNum, pageSize);
         return R.ok(roleService.page(iPage,name));
     }
@@ -142,11 +142,14 @@
     @Log(title = "角色管理", businessType = BusinessType.INSERT)
     @PutMapping("/edit")
     public R<Void> edit(@Valid @RequestBody EditSysRoleDTO dto) {
+        if (dto.getRoleId()==2){
+            return R.fail("超级管理员不能修改");
+        }
         roleService.edit(dto);
         // 更新缓存用户权限
         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);
         }
@@ -213,6 +216,9 @@
     @Log(title = "角色管理", businessType = BusinessType.DELETE)
     @DeleteMapping("/{roleId}")
     public R<Void> remove(@PathVariable Long roleId) {
+        if (roleId==2){
+            return R.fail("超级管理员不能删除");
+        }
         roleService.deleteRoleById(roleId);
         return R.ok();
     }
diff --git a/pt-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/pt-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
index 0364599..2a120b4 100644
--- a/pt-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
+++ b/pt-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
@@ -68,11 +68,11 @@
     @ApiOperation(value = "账号管理-获取账号分页列表", tags = "系统后台-权限管理")
     @PreAuthorize("@ss.hasPermi('system:user:list')")
     @GetMapping("/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) {
+    public R<IPage<SysUserPageListVO>> getSysUserPageList(@RequestParam(value = "pageNum",required = false,defaultValue = "0")Integer pageNum,
+                                                          @RequestParam(value = "pageSize",required = false,defaultValue = "10")Integer pageSize,
+                                                          @RequestParam(value = "nickName",required = false)String nickName,
+                                                          @RequestParam(value = "phonenumber",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));
     }
@@ -117,7 +117,7 @@
     /**
      * 新增用户
      */
-    @ApiOperation(value = "账号管理-查看详情(回显)", tags = "系统后台-权限管理")
+    @ApiOperation(value = "账号管理-新增", tags = "系统后台-权限管理")
     @PreAuthorize("@ss.hasPermi('system:user:list')")
     @Log(title = "用户管理", businessType = BusinessType.INSERT)
     @PostMapping("/add")
diff --git a/pt-admin/src/main/resources/application.yml b/pt-admin/src/main/resources/application.yml
index 0ad182d..3d20b5d 100644
--- a/pt-admin/src/main/resources/application.yml
+++ b/pt-admin/src/main/resources/application.yml
@@ -16,7 +16,7 @@
 # 开发环境配置
 server:
   # 服务器的HTTP端口,默认为8080
-  port: 8084
+  port: 8086
   servlet:
     # 应用的访问路径
     context-path: /
@@ -88,7 +88,13 @@
         # #连接池最大阻塞等待时间(使用负值表示没有限制)
         max-wait: -1ms
         time-between-eviction-runs:
-
+aliyun:
+  oss:
+    endpoint: oss-cn-chengdu.aliyuncs.com
+    access-key-id: LTAI5tRtwxPMw8aohbLLcjjo       # 你的AccessKey ID
+    access-key-secret: NSKeley8OjCsl7AQJnDKxPIh1dIaOu # 你的AccessKey Secret
+    bucket-name: weiersusong                     # 你的存储空间名称
+    domain: weiersusong.oss-cn-chengdu.aliyuncs.com # 访问域名
 # token配置
 token:
   # 令牌自定义标识
@@ -139,9 +145,18 @@
   # 匹配链接
   urlPatterns: /system/*,/monitor/*,/tool/*
 wx:
-  appletsAppid: wxedd7aefdfaf897cf
+  appid: wxedd7aefdfaf897cf
   appletsAppSecret: e1a8dba539294da6b935e8f0f3b09aac
-
+  mchId: 1719862902
+  key: 5Kb8zX9qR2TdF7Yw3vHnJgLp6sA4cE1M
+  callbackPath: http://221.182.45.100:8086
+  certPath: classpath:cert/apiclient_cert.p12
+  RASPath:
+ali:
+  accessKeyId: LTAI5tRtwxPMw8aohbLLcjjo
+  accessKeySecret: NSKeley8OjCsl7AQJnDKxPIh1dIaOu
+  signName: 玮儿科技
+  templateCode: SMS_319401491
   # 不校验白名单
 weapp:
   security:
@@ -202,8 +217,14 @@
       - /app/banner/delete
       - /app/banner/detail
       - /app/phone/saveServicePhone
+      - /app/phone/getSysPhone
       - /app/vipSetting/setPrice
       - /app/vipSetting/getVipList
+      - /app/vipSetting/getPrice
       - /app/feedback/list
       - /app/feedback/delete
-      - /app/feedback/dispose
\ No newline at end of file
+      - /app/feedback/dispose
+      - /app/report/add
+      - /app/agreement/addAgreement/content
+      - /app/agreement/getAgreement/content
+      - /app/user/refundPayMoneyCallback
\ No newline at end of file
diff --git a/pt-common/pom.xml b/pt-common/pom.xml
index 1bd1439..0136848 100644
--- a/pt-common/pom.xml
+++ b/pt-common/pom.xml
@@ -177,7 +177,11 @@
             <artifactId>easypoi-annotation</artifactId>
             <version>4.4.0</version>
         </dependency>
-
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>3.15.1</version>
+        </dependency>
     </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/pt-common/src/main/java/com/ruoyi/common/utils/OssConfig.java b/pt-common/src/main/java/com/ruoyi/common/utils/OssConfig.java
new file mode 100644
index 0000000..5ce5384
--- /dev/null
+++ b/pt-common/src/main/java/com/ruoyi/common/utils/OssConfig.java
@@ -0,0 +1,25 @@
+package com.ruoyi.common.utils;
+
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class OssConfig {
+
+    @Value("${aliyun.oss.endpoint}")
+    private String endpoint;
+
+    @Value("${aliyun.oss.access-key-id}")
+    private String accessKeyId;
+
+    @Value("${aliyun.oss.access-key-secret}")
+    private String accessKeySecret;
+
+    @Bean(destroyMethod = "shutdown")
+    public OSS ossClient() {
+        return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+    }
+}
\ No newline at end of file
diff --git a/pt-common/src/main/java/com/ruoyi/common/utils/OssService.java b/pt-common/src/main/java/com/ruoyi/common/utils/OssService.java
new file mode 100644
index 0000000..e0f5761
--- /dev/null
+++ b/pt-common/src/main/java/com/ruoyi/common/utils/OssService.java
@@ -0,0 +1,73 @@
+package com.ruoyi.common.utils;
+
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.model.PutObjectRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.UUID;
+
+@Service
+public class OssService {
+
+    @Autowired
+    private OSS ossClient;
+
+    @Value("${aliyun.oss.bucket-name}")
+    private String bucketName;
+
+    @Value("${aliyun.oss.domain}")
+    private String domain;
+
+    /**
+     * 上传文件到OSS
+     * @param file 上传的文件
+     * @param directory 存储目录
+     * @return 文件访问URL
+     */
+    public String uploadFile(MultipartFile file, String directory) {
+        if (file == null || file.isEmpty()) {
+            return null;
+        }
+
+        try {
+            // 生成唯一文件名,避免重复
+            String originalFilename = file.getOriginalFilename();
+            String fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));
+            String fileName = UUID.randomUUID().toString() + fileExtension;
+            
+            // 构建完整路径:目录/文件名
+            String objectName = directory + "/" + fileName;
+            
+            // 上传文件
+            ossClient.putObject(new PutObjectRequest(bucketName, objectName, file.getInputStream()));
+            
+            // 返回文件URL
+            return "https://" + domain + "/" + objectName;
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw new RuntimeException("文件上传失败");
+        } finally {
+            // 关闭OSSClient
+//            ossClient.shutdown();
+        }
+    }
+
+    /**
+     * 从OSS删除文件
+     * @param objectName 文件路径
+     */
+    public void deleteFile(String objectName) {
+        try {
+            ossClient.deleteObject(bucketName, objectName);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("文件删除失败");
+        } finally {
+//            ossClient.shutdown();
+        }
+    }
+}
\ No newline at end of file
diff --git a/pt-errand/pom.xml b/pt-errand/pom.xml
index a2b665e..ac2e505 100644
--- a/pt-errand/pom.xml
+++ b/pt-errand/pom.xml
@@ -43,6 +43,31 @@
             <groupId>com.pt</groupId>
             <artifactId>pt-system</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-core</artifactId>
+            <version>4.5.3</version>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
+            <version>2.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-http</artifactId>
+            <version>5.8.25</version>
+        </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>
 </project>
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/domain/AddressBook.java b/pt-errand/src/main/java/com/ruoyi/errand/domain/AddressBook.java
index 259b94b..284b276 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/domain/AddressBook.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/domain/AddressBook.java
@@ -21,7 +21,7 @@
 
     @ApiModelProperty("用户ID")
     @TableField("app_user_id")
-    private Long app_user_id;
+    private Long appUserId;
 
     @ApiModelProperty("收件人姓名")
     @TableField("recipient_name")
@@ -41,19 +41,23 @@
 
     @ApiModelProperty("是否默认地址:0-否,1-是")
     @TableField("is_default")
-    private Integer is_default;
+    private Integer isDefault;
 
     @ApiModelProperty("添加时间")
     @TableField("create_time")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private LocalDateTime create_time;
+    private LocalDateTime createTime;
 
     @ApiModelProperty("更新时间")
     @TableField("update_time")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private LocalDateTime update_time;
+    private LocalDateTime updateTime;
 
     @ApiModelProperty("是否删除:0-否,1-是")
     @TableField("del_flag")
-    private Integer del_flag;
+    private Integer delFlag;
+    @ApiModelProperty("地址扩展字段")
+    @TableField("region_extend")
+    private String regionExtend;
+
 }
\ No newline at end of file
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/domain/Agreement.java b/pt-errand/src/main/java/com/ruoyi/errand/domain/Agreement.java
index e152cc5..0692654 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/domain/Agreement.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/domain/Agreement.java
@@ -29,5 +29,5 @@
     @ApiModelProperty("添加时间")
     @TableField("create_time")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private LocalDateTime create_time;
+    private LocalDateTime createTime;
 }
\ No newline at end of file
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/domain/AppUser.java b/pt-errand/src/main/java/com/ruoyi/errand/domain/AppUser.java
index 6a7e622..a84a5a0 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/domain/AppUser.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/domain/AppUser.java
@@ -10,6 +10,7 @@
 import java.io.Serializable;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.util.Date;
 
 @Data
 @TableName("t_app_user")
@@ -46,7 +47,7 @@
     @ApiModelProperty("生日")
     @TableField("birthday")
     @JsonFormat(pattern = "yyyy-MM-dd")
-    private LocalDate birthday;
+    private Date birthday;
 
     @ApiModelProperty("微信openid")
     @TableField("wx_openid")
@@ -95,4 +96,8 @@
     @TableField("last_login_time")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime lastLoginTime;
+
+    @ApiModelProperty("地址扩展")
+    @TableField("region_extend")
+    private String regionExtend;
 }
\ No newline at end of file
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/domain/Order.java b/pt-errand/src/main/java/com/ruoyi/errand/domain/Order.java
index ac880c0..d4d0bb8 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/domain/Order.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/domain/Order.java
@@ -59,7 +59,7 @@
 
     @ApiModelProperty("货品件数")
     @TableField("num")
-    private Integer num;
+    private String num;
 
     @ApiModelProperty("备注")
     @TableField("remark")
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/domain/Phone.java b/pt-errand/src/main/java/com/ruoyi/errand/domain/Phone.java
index 37569c5..0bac979 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/domain/Phone.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/domain/Phone.java
@@ -23,7 +23,7 @@
 
     @ApiModelProperty("小区id")
     @TableField("community_id")
-    private Integer community_id;
+    private Integer communityId;
 
     @ApiModelProperty("联系电话")
     @TableField("phone")
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/domain/Report.java b/pt-errand/src/main/java/com/ruoyi/errand/domain/Report.java
index 2393491..0f4bdf8 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/domain/Report.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/domain/Report.java
@@ -23,9 +23,13 @@
     @TableField("region_id")
     private Integer regionId;
 
-    @ApiModelProperty("用户ID")
-    @TableField("app_user_id")
-    private Long appUserId;
+    @ApiModelProperty("用户名")
+    @TableField("username")
+    private String username;
+
+    @ApiModelProperty("用户手机号")
+    @TableField("phone")
+    private String phone;
 
     @ApiModelProperty("小区名称")
     @TableField("community_name")
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/domain/VipSetting.java b/pt-errand/src/main/java/com/ruoyi/errand/domain/VipSetting.java
index 81126a1..e68be49 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/domain/VipSetting.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/domain/VipSetting.java
@@ -21,19 +21,19 @@
 
     @ApiModelProperty("会员名称")
     @TableField("vip_name")
-    private String vip_name;
+    private String vipName;
 
     @ApiModelProperty("会员价格")
     @TableField("vip_price")
-    private BigDecimal vip_price;
+    private BigDecimal vipPrice;
 
     @ApiModelProperty("添加时间")
     @TableField("create_time")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private LocalDateTime create_time;
+    private LocalDateTime createTime;
 
     @ApiModelProperty("添加时间")
     @TableField("update_time")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private LocalDateTime update_time;
+    private LocalDateTime updateTime;
 }
\ No newline at end of file
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/mapper/CommunityMapper.java b/pt-errand/src/main/java/com/ruoyi/errand/mapper/CommunityMapper.java
index 60934b5..dd35e51 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/mapper/CommunityMapper.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/mapper/CommunityMapper.java
@@ -18,7 +18,7 @@
 public interface CommunityMapper extends BaseMapper<Community> {
     List<CommunityListVO> selectListByRegionId(@Param("regionId") Integer regionId);
 
-    List<CommunityListVO> getTotalCommunityList();
+    List<CommunityListVO> getTotalCommunityList(@Param("name") String name);
 
     List<AllCommunityListVO> getAllCommunityList(@Param("list")List<Integer> list);
 
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/mapper/CourierMapper.java b/pt-errand/src/main/java/com/ruoyi/errand/mapper/CourierMapper.java
index 861118e..a50a4f8 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/mapper/CourierMapper.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/mapper/CourierMapper.java
@@ -21,7 +21,7 @@
 
     CourierStatisticsVO getDatStatistics(Integer courierId);
 
-    IPage<CourierOrderListVO> getCourierOrderList(@Param("page") IPage<CourierOrderListVO> page, @Param("orderStatus") Integer orderStatus,@Param("courierId")  Integer courierId);
+    IPage<CourierOrderListVO> getCourierOrderList(@Param("page") IPage<CourierOrderListVO> page, @Param("courierId")  Integer courierId ,@Param("orderStatus") Integer orderStatus,@Param("communityId") Integer communityId);
 
     IPage<CourierPageListVO> getCourierPageList(@Param("page") IPage<CourierPageListVO> page, @Param("dto") CourierPageListDTO dto);
 
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/mapper/VipOrderMapper.java b/pt-errand/src/main/java/com/ruoyi/errand/mapper/VipOrderMapper.java
index f626fd4..8f88793 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/mapper/VipOrderMapper.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/mapper/VipOrderMapper.java
@@ -3,10 +3,13 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.errand.domain.UserCancellationLog;
 import com.ruoyi.errand.domain.VipOrder;
+import com.ruoyi.errand.object.vo.sys.OrderSysDetailVO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
 public interface VipOrderMapper extends BaseMapper<VipOrder> {
     List<VipOrder> selectRefundVipOrder(@Param("appUserId") Integer appUserId);
+
+    OrderSysDetailVO detail(@Param("id")Integer id);
 }
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AddAddressBookDTO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AddAddressBookDTO.java
index e763c9e..ba97ff1 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AddAddressBookDTO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AddAddressBookDTO.java
@@ -15,4 +15,7 @@
     private String recipientPhone;
     @ApiModelProperty("详细地址")
     private String addressDetail;
+    @ApiModelProperty("地址扩展字段")
+    private String regionExtend;
+
 }
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AddEvaluationDTO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AddEvaluationDTO.java
index 618f579..be01d2e 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AddEvaluationDTO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AddEvaluationDTO.java
@@ -11,6 +11,9 @@
 @Data
 @ApiModel("评价订单")
 public class AddEvaluationDTO {
+    @ApiModelProperty("评价id,有就修改,没有就是新增")
+    private Integer evaluationId;
+
     @ApiModelProperty("订单id")
     @NotNull(message = "订单id不能为空")
     private Integer orderId;
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AddFeedbackDTO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AddFeedbackDTO.java
new file mode 100644
index 0000000..a189fe6
--- /dev/null
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AddFeedbackDTO.java
@@ -0,0 +1,12 @@
+package com.ruoyi.errand.object.dto.app;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("用户意见反馈")
+public class AddFeedbackDTO {
+    @ApiModelProperty("反馈内容")
+    private String content;
+}
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AddRegisterReportDTO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AddRegisterReportDTO.java
new file mode 100644
index 0000000..83ae85d
--- /dev/null
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AddRegisterReportDTO.java
@@ -0,0 +1,26 @@
+package com.ruoyi.errand.object.dto.app;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel("注册页-上报不存在小区")
+public class AddRegisterReportDTO {
+    @ApiModelProperty("关联省市区的区域id")
+    @NotNull(message = "上报区域不能为空")
+    private Integer region_id;
+    @ApiModelProperty("小区名称")
+    @NotEmpty(message = "小区名称不能为空")
+    private String communityName;
+    @ApiModelProperty("详细地址")
+    @NotEmpty(message = "详细地址不能为空")
+    private String addressDetail;
+    @ApiModelProperty("手机号")
+    @NotEmpty(message = "手机号不能为空")
+    private String phone;
+
+}
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AddReportDTO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AddReportDTO.java
index 5ae3e08..56aa3ed 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AddReportDTO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AddReportDTO.java
@@ -12,12 +12,17 @@
 public class AddReportDTO {
     @ApiModelProperty("关联省市区的区域id")
     @NotNull(message = "上报区域不能为空")
-    private Integer region_id;
+    private Integer regionId;
     @ApiModelProperty("小区名称")
     @NotEmpty(message = "小区名称不能为空")
     private String communityName;
     @ApiModelProperty("详细地址")
     @NotEmpty(message = "详细地址不能为空")
     private String addressDetail;
-
+    @ApiModelProperty("手机号")
+    @NotEmpty(message = "手机号不能为空")
+    private String phone;
+    @ApiModelProperty("用户名")
+    @NotEmpty(message = "用户名不能为空")
+    private String username;
 }
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AgreementDTO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AgreementDTO.java
index 8d4fef3..93317c2 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AgreementDTO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AgreementDTO.java
@@ -8,7 +8,7 @@
 @Data
 @ApiModel("协议DTO")
 public class AgreementDTO {
-    @ApiModelProperty("类型(1=用户协议,2=隐私协议,3=下单须知,4=注销协议,5=首页介绍,6=快递代拿下单说明,7=商品代买下单说明)")
+    @ApiModelProperty("类型(1=用户协议,2=隐私协议,3=下单须知,4=注销协议,5=首页介绍,6=快递代拿下单说明,7=商品代买下单说明,8=会员协议)")
     private Integer type;
 
     @ApiModelProperty("内容")
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AppletLogin.java b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AppletLogin.java
index 22e24bb..6be2a54 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AppletLogin.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/AppletLogin.java
@@ -4,13 +4,18 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import javax.validation.constraints.NotEmpty;
+
 @Data
 @ApiModel("一键登录")
 public class AppletLogin {
 	@ApiModelProperty(value = "微信jscode", required = true)
+	@NotEmpty(message = "微信jscode不能为空")
 	private String jscode;
 	@ApiModelProperty(value = "手机号加密数据", required = true)
+	@NotEmpty(message = "手机号加密数据不能为空")
 	private String encryptedData_phone;
 	@ApiModelProperty(value = "加密算法的初始向量", required = true)
+	@NotEmpty(message = "加密算法的初始向量不能为空")
 	private String iv_phone;
 }
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/BirthDayDTO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/BirthDayDTO.java
index bc11a1c..4ebd380 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/BirthDayDTO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/BirthDayDTO.java
@@ -6,11 +6,13 @@
 import lombok.Data;
 
 import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Date;
 
 @Data
 @ApiModel("生日")
 public class BirthDayDTO {
     @ApiModelProperty("生日")
     @JsonFormat(pattern = "yyyy-MM-dd")
-    private LocalDate birthday;
+    private Date birthday;
 }
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/ConfirmOrderDTO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/ConfirmOrderDTO.java
index 7993430..c511d90 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/ConfirmOrderDTO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/ConfirmOrderDTO.java
@@ -28,7 +28,7 @@
     @NotEmpty(message = "代办事项不能为空")
     private String agencyMatters;
     @ApiModelProperty("货品件数")
-    private Integer num;
+    private String num;
     @ApiModelProperty("备注")
     private String remark;
     @ApiModelProperty("上传图片地址(多张逗号隔开,最多五张)")
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/RegisterDTO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/RegisterDTO.java
index ddfb4d6..40275a8 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/RegisterDTO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/RegisterDTO.java
@@ -10,6 +10,8 @@
 @Data
 @ApiModel("用户注册")
 public class RegisterDTO {
+    @ApiModelProperty("头像")
+    private String avatar;
     @ApiModelProperty("用户名")
     @NotEmpty(message = "用户名不能为空")
     private String username;
@@ -22,4 +24,6 @@
     @ApiModelProperty("手机号")
     @NotEmpty(message = "手机号不能为空")
     private String phone;
+    @ApiModelProperty("地址扩展")
+    private String regionExtend;
 }
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/SetConfirmOrderDTO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/SetConfirmOrderDTO.java
index 54eeea3..384b204 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/SetConfirmOrderDTO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/app/SetConfirmOrderDTO.java
@@ -21,7 +21,7 @@
     @ApiModelProperty("代办事项")
     private String agencyMatters;
     @ApiModelProperty("货品件数")
-    private Integer num;
+    private String num;
     @ApiModelProperty("备注")
     private String remark;
     @ApiModelProperty("上传图片地址(多张逗号隔开,最多五张)")
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/sys/AgreementContentDTO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/sys/AgreementContentDTO.java
new file mode 100644
index 0000000..17881b2
--- /dev/null
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/sys/AgreementContentDTO.java
@@ -0,0 +1,21 @@
+package com.ruoyi.errand.object.dto.sys;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+
+@Data
+@ApiModel("协议DTO")
+public class AgreementContentDTO {
+    @ApiModelProperty("代拿")
+    @NotEmpty(message = "快递代拿下单说明不能为空")
+    private String takeContent;
+    @ApiModelProperty("代买")
+    @NotEmpty(message = "商品代买下单说明不能为空")
+    private String buyContent;
+    @ApiModelProperty("首页介绍")
+    @NotEmpty(message = "首页介绍不能为空")
+    private String content;
+}
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/sys/BannerPageDTO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/sys/BannerPageDTO.java
new file mode 100644
index 0000000..98ee95c
--- /dev/null
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/sys/BannerPageDTO.java
@@ -0,0 +1,13 @@
+package com.ruoyi.errand.object.dto.sys;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class BannerPageDTO {
+    private Integer pageNum;
+    private Integer pageSize;
+    @ApiModelProperty("banner名称")
+    private String name;
+}
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/sys/FinanceStatisticsDTO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/sys/FinanceStatisticsDTO.java
index 9941c44..add9073 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/sys/FinanceStatisticsDTO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/sys/FinanceStatisticsDTO.java
@@ -27,6 +27,9 @@
     @ApiModelProperty("类型 0-全部 1-订单 2-会员充值")
     private Integer type;
 
+    @ApiModelProperty(" 支付方式  0-在线支付 1-会员支付")
+    private Integer payMethod;
+
     @ApiModelProperty("0全部1待确认2进行中3已取消4已完成、已评价6已退费")
     private Integer orderStatus;
 
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/sys/SetPriceDTO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/sys/SetPriceDTO.java
index 1f10a76..dab8d21 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/dto/sys/SetPriceDTO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/dto/sys/SetPriceDTO.java
@@ -11,12 +11,17 @@
 @Data
 @ApiModel("设置会员价格")
 public class SetPriceDTO {
-    @ApiModelProperty("1-4对应会员 1-月卡 2-季卡 3-半年卡 4-年卡")
-    @Max(value = 4,message = "id取值在1-4")
-    @Min(value = 1,message = "id取值在1-4")
-    private Integer id;
 
-    @ApiModelProperty("会员价格")
-    private BigDecimal vip_price;
+    @ApiModelProperty("会员价格-月卡")
+    private BigDecimal vipPriceOne;
+    @ApiModelProperty("会员价格-季卡")
+    private BigDecimal vipPriceTwo;
+    @ApiModelProperty("会员价格-半年卡")
+    private BigDecimal vipPriceThree;
+    @ApiModelProperty("会员价格-年卡")
+    private BigDecimal vipPriceFour;
 
+
+    @ApiModelProperty("会员协议")
+    private String content;
 }
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/AddressBookByCommunityIdVO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/AddressBookByCommunityIdVO.java
index 27e9a8f..8c885a6 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/AddressBookByCommunityIdVO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/AddressBookByCommunityIdVO.java
@@ -24,6 +24,9 @@
     private String addressDetail;
 
     @ApiModelProperty("是否默认地址:0-否,1-是")
-    private Integer is_default;
+    private Integer isDefault;
+
+    @ApiModelProperty("地址扩展字段")
+    private String regionExtend;
 
 }
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/AddressBookListVO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/AddressBookListVO.java
index ebc3f6b..371cc1d 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/AddressBookListVO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/AddressBookListVO.java
@@ -1,6 +1,7 @@
 package com.ruoyi.errand.object.vo.app;
 
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -9,14 +10,19 @@
 @ApiModel("用户地址簿列表")
 public class AddressBookListVO {
 
-    @ApiModelProperty("地址ID")
+    @ApiModelProperty("地址蒲ID")
     private Integer id;
+
+    @ApiModelProperty("关联省市区的区域ID")
+    private Integer regionId;
+    @ApiModelProperty("关联省市区的区域名称")
+    private String regionName;
 
     @ApiModelProperty("关联小区ID")
     private Integer communityId;
 
     @ApiModelProperty("小区名称")
-    private Integer communityName;
+    private String communityName;
 
     @ApiModelProperty("收件人姓名")
     private String recipientName;
@@ -28,6 +34,8 @@
     private String addressDetail;
 
     @ApiModelProperty("是否默认地址:0-否,1-是")
-    private Integer is_default;
+    private Integer isDefault;
+    @ApiModelProperty("地址扩展字段")
+    private String regionExtend;
 
 }
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/AppUserInfoVO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/AppUserInfoVO.java
index a1f8fad..e2ab6a3 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/AppUserInfoVO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/AppUserInfoVO.java
@@ -7,6 +7,7 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 
 @ApiModel("用户个人中心信息")
@@ -27,10 +28,20 @@
     @ApiModelProperty("会员id")
     private Integer vipId;
 
-    @ApiModelProperty("会员id")
-    private Integer vipName;
+    @ApiModelProperty("会员名称")
+    private String vipName;
 
     @ApiModelProperty("会员到期时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime endTime;
+
+    @ApiModelProperty("生日")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime birthday;
+
+    @ApiModelProperty("会员到期时间戳")
+    private Long endTimeStamp;
+
+    @ApiModelProperty("地址扩展")
+    private String regionExtend;
 }
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/AppUserOrderListVO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/AppUserOrderListVO.java
index 873b91a..629e6ad 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/AppUserOrderListVO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/AppUserOrderListVO.java
@@ -15,45 +15,35 @@
 @ApiModel("用户订单列表")
 public class AppUserOrderListVO {
     @ApiModelProperty("订单id")
-    @TableId(type = IdType.AUTO)
     private Integer id;
 
     @ApiModelProperty("详细地址")
-    @TableField("address_detail")
     private String addressDetail;
 
     @ApiModelProperty("收件人姓名")
-    @TableField("recipient_name")
     private String recipientName;
 
     @ApiModelProperty("收件人电话")
-    @TableField("recipient_phone")
     private String recipientPhone;
 
     @ApiModelProperty("1待确认2进行中3已取消4已完成")
-    @TableField("order_status")
     private Integer orderStatus;
 
     @ApiModelProperty("下单时间")
-    @TableField("order_time")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime orderTime;
 
     @ApiModelProperty("评分(0.5-5.0,支持半星")
-    @TableField("rating")
     private BigDecimal rating;
 
     @ApiModelProperty("跑腿id")
-    @TableField("courier_id")
     private Integer courierId;
 
     @ApiModelProperty("跑腿人名称")
-    @TableField("courier_name")
-    private Integer courierName;
+    private String courierName;
 
     @ApiModelProperty("跑腿人手机号")
-    @TableField("courier_phone")
-    private Integer courierPhone;
+    private String courierPhone;
 
 
 
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/ConfirmOrderVO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/ConfirmOrderVO.java
index 7c607b7..9f6b959 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/ConfirmOrderVO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/ConfirmOrderVO.java
@@ -29,7 +29,7 @@
     @ApiModelProperty("代办事项")
     private String agencyMatters;
     @ApiModelProperty("货品件数")
-    private Integer num;
+    private String num;
     @ApiModelProperty("备注")
     private String remark;
     @ApiModelProperty("上传图片地址(多张逗号隔开,最多五张)")
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/CourierInfoVO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/CourierInfoVO.java
index 6d06fcd..8f17412 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/CourierInfoVO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/CourierInfoVO.java
@@ -13,5 +13,5 @@
     @ApiModelProperty("联系电话")
     private String phone;
     @ApiModelProperty("小区名称")
-    private Integer communityName;
+    private String communityName;
 }
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/CourierOrderListVO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/CourierOrderListVO.java
index 684b2ab..de2ef20 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/CourierOrderListVO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/CourierOrderListVO.java
@@ -26,6 +26,9 @@
     @ApiModelProperty("1待确认2进行中3已取消4已完成5已评价")
     private Integer orderStatus;
 
+    /**
+     * 这里实际为下单时间
+     */
     @ApiModelProperty("接单时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime receivingTime;
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/OrderDetailVO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/OrderDetailVO.java
index 0a8b5a0..ed0d373 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/OrderDetailVO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/OrderDetailVO.java
@@ -32,7 +32,7 @@
     private String agencyMatters;
 
     @ApiModelProperty("货品件数")
-    private Integer num;
+    private String num;
 
     @ApiModelProperty("备注")
     private String remark;
@@ -64,13 +64,18 @@
     @ApiModelProperty("跑腿联系电话")
     private String courierPhone;
 
-
+    @ApiModelProperty("评价id")
+    private Integer evaluationId;
 
     @ApiModelProperty("评分(0.5-5.0,支持半星")
-    @TableField("rating")
     private BigDecimal rating;
 
     @ApiModelProperty("评价内容")
-    @TableField("content")
     private String content;
+
+    @ApiModelProperty("跑腿员-评价内容")
+    private String courierRating;
+
+    @ApiModelProperty("跑腿员-评价内容")
+    private String courierContent;
 }
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/OrderPageVO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/OrderPageVO.java
index 60b8c22..234b00d 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/OrderPageVO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/OrderPageVO.java
@@ -35,7 +35,13 @@
     private Integer isFirstOrder;
     @ApiModelProperty("会员到期时间 ")
     private LocalDateTime endTime;
+    @ApiModelProperty("地址名称")
+    private String regionName;
 
+    @ApiModelProperty("地址id")
+    private Integer regionId;
 
+    @ApiModelProperty("地址扩展")
+    private String regionExtend;
 
 }
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/VipInfoListVO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/VipInfoListVO.java
index 444ca1d..ff7007e 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/VipInfoListVO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/app/VipInfoListVO.java
@@ -14,9 +14,9 @@
     private Integer id;
 
     @ApiModelProperty("会员名称")
-    private String vip_name;
+    private String vipName;
 
     @ApiModelProperty("会员价格")
-    private BigDecimal vip_price;
+    private BigDecimal vipPrice;
 
 }
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/login/LoginVO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/login/LoginVO.java
index 18a6d11..f486e88 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/login/LoginVO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/login/LoginVO.java
@@ -13,7 +13,7 @@
     private String token;
     @ApiModelProperty("失效时间(秒)")
     private Long failureTime;
-    @ApiModelProperty("跳转页面(0=首页,1=注册页)")
+    @ApiModelProperty("跳转页面(1=首页,2=注册页)")
     private Integer skipPage;
     @ApiModelProperty("微信解密的手机号")
     private String phone;
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/AppUserPageListVO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/AppUserPageListVO.java
index 21f981a..e927cff 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/AppUserPageListVO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/AppUserPageListVO.java
@@ -13,7 +13,7 @@
 @ApiModel("app用户管理分页(后台)")
 public class AppUserPageListVO {
     @ApiModelProperty("主键")
-    private Long id;
+    private String id;
     @ApiModelProperty("用户")
     private String name;
     @ApiModelProperty("手机号")
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/BannerDetailVo.java b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/BannerDetailVo.java
index 558d28b..4a138c1 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/BannerDetailVo.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/BannerDetailVo.java
@@ -10,14 +10,13 @@
 @Data
 @ApiModel("banner查看详情VO")
 public class BannerDetailVo {
-    @TableId(type = IdType.AUTO)
     @ApiModelProperty("主键")
     private Integer id;
     @ApiModelProperty("名称")
-    @TableField("name")
     private String name;
     @ApiModelProperty("图片地址")
-    @TableField("image_url")
     private String imageUrl;
+    @ApiModelProperty("跳转类型(1=无跳转,2=外部链接)")
+    private Integer jumpType;
 
 }
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/CourierSysDetailVO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/CourierSysDetailVO.java
index 14a8247..a52a300 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/CourierSysDetailVO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/CourierSysDetailVO.java
@@ -31,6 +31,13 @@
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime createTime;
 
+    @ApiModelProperty("正面照地址")
+    private String frontView;
+
+    @ApiModelProperty("背面照地址")
+    private String backView;
+
+
     @ApiModelProperty("当天接单量")
     private Integer today=0;
     @ApiModelProperty("本周接单量")
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/FeedbackPageListVO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/FeedbackPageListVO.java
index ee778a4..a969e22 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/FeedbackPageListVO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/FeedbackPageListVO.java
@@ -23,7 +23,7 @@
     private String content;
     @ApiModelProperty("反馈时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private LocalDateTime create_time;
+    private LocalDateTime createTime;
     @ApiModelProperty("状态:0-未处理,1-已处理")
     private Integer status;
 
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/FinanceStatisticsVO.java b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/FinanceStatisticsVO.java
index 4c3d894..e46dfec 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/FinanceStatisticsVO.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/object/vo/sys/FinanceStatisticsVO.java
@@ -6,6 +6,7 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
 @Data
@@ -13,6 +14,9 @@
 public class FinanceStatisticsVO {
     @ApiModelProperty("订单id")
     private Integer id;
+    @Excel(name = "金额")
+    @ApiModelProperty("金额")
+    private BigDecimal money;
 
     @Excel(name = "下单时间",width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty("下单时间")
@@ -23,6 +27,10 @@
     @ApiModelProperty("类型 1-订单 2-会员充值")
     private Integer type;
 
+    @Excel(name = "支付方式", readConverterExp = " 0-在线支付 1-会员支付")
+    @ApiModelProperty("支付方式  0-在线支付 1-会员支付")
+    private Integer payMethod;
+
     @Excel(name = "订单编号")
     @ApiModelProperty("订单编号")
     private String orderNumber;
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/service/AddressBookService.java b/pt-errand/src/main/java/com/ruoyi/errand/service/AddressBookService.java
index efb0faf..7d2c52a 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/service/AddressBookService.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/service/AddressBookService.java
@@ -16,7 +16,7 @@
 
     void setDefaultAddress(Integer id);
 
-    void add(AddAddressBookDTO addAddressBookDTO);
+    Integer add(AddAddressBookDTO addAddressBookDTO);
 
     void set(UpdateAddressBookDTO updateAddressBookDTO);
 
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/service/AppUserService.java b/pt-errand/src/main/java/com/ruoyi/errand/service/AppUserService.java
index 41bd3f7..ab5484d 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/service/AppUserService.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/service/AppUserService.java
@@ -30,7 +30,7 @@
 
     R<LoginVO> appletLogin( AppletLogin appletLogin);
 
-    void register(RegisterDTO registerDTO);
+    LoginVO register(RegisterDTO registerDTO);
 
     OrderPageVO getOrderPage( Integer communityId);
 
@@ -40,7 +40,7 @@
 
     void setBirthDay(BirthDayDTO birth);
 
-    void delete();
+    void delete(String token);
 
     UserStatsVO getUserStats(LocalDateTime start, LocalDateTime end, String datePattern);
 
@@ -48,11 +48,15 @@
 
     IPage<AppUserPageListVO> getAppUserPageList( AppUserPageListDTO appUserPageListDTO);
 
-    AppUserSysDetailVO detail(Integer id);
+    AppUserSysDetailVO detail(String id);
 
-    void froze(Integer id);
+    void froze(String id);
 
-    void refund(Integer id);
+    void refund(String id);
 
-    R refundPayMoneyCallback(RefundCallbackResult refundCallbackResult);
+    R refundPayMoneyCallback(String xmlData);
+
+    void setName(String name);
+
+    void setAvatar(String avatar);
 }
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/service/CommunityService.java b/pt-errand/src/main/java/com/ruoyi/errand/service/CommunityService.java
index 40b17af..1061aae 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/service/CommunityService.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/service/CommunityService.java
@@ -18,7 +18,7 @@
 public interface CommunityService extends IService<Community> {
     R<List<CommunityListVO>> getCommunity(Integer communityId);
 
-    R<List<CommunityListVO>> getTotalCommunityList();
+    R<List<CommunityListVO>> getTotalCommunityList(String name);
 
     List<AllCommunityListVO> getAllCommunityList();
 
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/service/EvaluationService.java b/pt-errand/src/main/java/com/ruoyi/errand/service/EvaluationService.java
index 90d9528..0fade99 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/service/EvaluationService.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/service/EvaluationService.java
@@ -4,6 +4,10 @@
 import com.ruoyi.errand.domain.Evaluation;
 import com.ruoyi.errand.object.dto.app.AddEvaluationDTO;
 
+import javax.validation.Valid;
+
 public interface EvaluationService extends IService<Evaluation> {
     void add( AddEvaluationDTO addEvaluationDTO);
+
+    void edit( AddEvaluationDTO addEvaluationDTO);
 }
\ No newline at end of file
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/service/FeedbackService.java b/pt-errand/src/main/java/com/ruoyi/errand/service/FeedbackService.java
index 23693ad..cb0e9e6 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/service/FeedbackService.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/service/FeedbackService.java
@@ -3,13 +3,14 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.errand.domain.Feedback;
+import com.ruoyi.errand.object.dto.app.AddFeedbackDTO;
 import com.ruoyi.errand.object.dto.sys.FeedbackPageListDTO;
 import com.ruoyi.errand.object.vo.sys.FeedbackPageListVO;
 
 import javax.validation.Valid;
 
 public interface FeedbackService extends IService<Feedback> {
-    void add(String content);
+    void add(AddFeedbackDTO dto);
 
     IPage<FeedbackPageListVO> getFeedbackPageList(FeedbackPageListDTO feedbackPageListDTO);
 
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/service/OrderService.java b/pt-errand/src/main/java/com/ruoyi/errand/service/OrderService.java
index f9e0894..d78f160 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/service/OrderService.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/service/OrderService.java
@@ -18,6 +18,7 @@
 import com.ruoyi.errand.object.vo.sys.OrderSysDetailVO;
 import com.ruoyi.errand.utils.RefundCallbackResult;
 import com.ruoyi.errand.utils.UniPayCallbackResult;
+import com.ruoyi.errand.utils.wx.PayResult;
 
 import javax.validation.Valid;
 import java.time.LocalDateTime;
@@ -29,7 +30,7 @@
 
     R orderPayment(ConfirmOrderDTO confirmOrderDTO);
 
-    R orderPaymentCallback(UniPayCallbackResult uniPayCallbackResult);
+    R orderPaymentCallback(PayResult payResult);
 
     void closeOrder();
 
@@ -41,7 +42,7 @@
 
     void cancelOrder(Integer id);
 
-    R refundPayMoneyCallback(RefundCallbackResult refundCallbackResult);
+    R refundPayMoneyCallback(String xmlData);
 
     OrderTopInfoVO orderTopInfo(Integer communityId);
 
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/service/ReportService.java b/pt-errand/src/main/java/com/ruoyi/errand/service/ReportService.java
index 7ae402f..02c6216 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/service/ReportService.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/service/ReportService.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.errand.domain.Report;
+import com.ruoyi.errand.object.dto.app.AddRegisterReportDTO;
 import com.ruoyi.errand.object.dto.app.AddReportDTO;
 import com.ruoyi.errand.object.dto.sys.ReportPageListDTO;
 import com.ruoyi.errand.object.vo.sys.ReportPageListVO;
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/service/VipOrderService.java b/pt-errand/src/main/java/com/ruoyi/errand/service/VipOrderService.java
index f5642a1..b297a7a 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/service/VipOrderService.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/service/VipOrderService.java
@@ -4,13 +4,17 @@
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.errand.domain.VipOrder;
 import com.ruoyi.errand.object.dto.app.VipPaymentDTO;
+import com.ruoyi.errand.object.vo.sys.OrderSysDetailVO;
 import com.ruoyi.errand.utils.UniPayCallbackResult;
+import com.ruoyi.errand.utils.wx.PayResult;
 
 
 public interface VipOrderService extends IService<VipOrder> {
     R vipPayment(VipPaymentDTO vipPaymentDTO);
 
-    R orderPaymentCallback(UniPayCallbackResult uniPayCallbackResult);
+    R orderPaymentCallback(PayResult payResult);
 
     void closeOrder();
+
+    OrderSysDetailVO detail(Integer id);
 }
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/service/VipSettingService.java b/pt-errand/src/main/java/com/ruoyi/errand/service/VipSettingService.java
index 515d412..a51b793 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/service/VipSettingService.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/service/VipSettingService.java
@@ -12,4 +12,6 @@
     List<VipInfoListVO> getVipInfoList();
 
     void setPrice( SetPriceDTO setPriceDTO);
+
+    SetPriceDTO getPrice();
 }
\ No newline at end of file
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/AddressBookServiceImpl.java b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/AddressBookServiceImpl.java
index 8e730c5..3816234 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/AddressBookServiceImpl.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/AddressBookServiceImpl.java
@@ -9,8 +9,10 @@
 import com.ruoyi.errand.domain.AddressBook;
 import com.ruoyi.errand.domain.AppUser;
 import com.ruoyi.errand.domain.Community;
+import com.ruoyi.errand.domain.Region;
 import com.ruoyi.errand.mapper.AddressBookMapper;
 import com.ruoyi.errand.mapper.CommunityMapper;
+import com.ruoyi.errand.mapper.RegionMapper;
 import com.ruoyi.errand.object.dto.app.AddAddressBookDTO;
 import com.ruoyi.errand.object.dto.app.UpdateAddressBookDTO;
 import com.ruoyi.errand.object.vo.app.AddressBookByCommunityIdVO;
@@ -27,6 +29,8 @@
 public class AddressBookServiceImpl extends ServiceImpl<AddressBookMapper, AddressBook> implements AddressBookService {
     @Resource
     private CommunityMapper communityMapper;
+    @Resource
+    private RegionMapper regionMapper;
 
     @Override
     public List<AddressBookByCommunityIdVO> addressBookByCommunityId(Integer communityId) {
@@ -42,38 +46,64 @@
     @Override
     public List<AddressBookListVO> addressBookList() {
         AppUser appuser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
-        return this.getBaseMapper().addressBookList(appuser.getId());
+        List<AddressBookListVO> voList = this.getBaseMapper().addressBookList(appuser.getId());
+        voList.forEach(vo->{
+            String regionFullName = getRegionFullName(vo.getRegionId());
+            vo.setRegionName(regionFullName);
+        });
+        return voList;
     }
 
+    /**
+     * 根据区ID查询完整的省市区名称
+     */
+    public String getRegionFullName(Integer districtId) {
+        Region district = regionMapper.selectById(districtId);
+        if (district == null) {
+            return "";
+        }
+
+        Region city = regionMapper.selectById(district.getParentId());
+        if (city == null) {
+            return district.getName();
+        }
+
+        Region province = regionMapper.selectById(city.getParentId());
+        if (province == null) {
+            return city.getName()  + district.getName();
+        }
+
+        return province.getName()  + city.getName()  + district.getName();
+    }
     @Override
     public void setDefaultAddress(Integer id) {
         AppUser appuser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
         //查询这个默认地址
         AddressBook addressBook = this.getById(id);
-        if (null==addressBook||addressBook.getDel_flag().equals(DelFlagConstant.DELETE)) {
+        if (null==addressBook||addressBook.getDelFlag().equals(DelFlagConstant.DELETE)) {
             throw new ServiceException("该地址不存在");
         }
         //查看原本小区内是否有默认地址
         List<AddressBook> addressBooks = this.getBaseMapper().selectList(new LambdaUpdateWrapper<AddressBook>()
                 .eq(AddressBook::getCommunityId, addressBook.getCommunityId())
-                .eq(AddressBook::getApp_user_id, appuser.getId())
-                .eq(AddressBook::getDel_flag, DelFlagConstant.UNDELETE)
-                .eq(AddressBook::getIs_default, IsDefaultConstant.TRUE)
+                .eq(AddressBook::getAppUserId, appuser.getId())
+                .eq(AddressBook::getDelFlag, DelFlagConstant.UNDELETE)
+                .eq(AddressBook::getIsDefault, IsDefaultConstant.TRUE)
         );
         //将原本地址修改掉
         addressBooks.forEach(x->{
-            x.setIs_default(IsDefaultConstant.FALSE);
-            x.setUpdate_time(LocalDateTime.now());
+            x.setIsDefault(IsDefaultConstant.FALSE);
+            x.setUpdateTime(LocalDateTime.now());
             this.getBaseMapper().updateById(x);}
         );
         //将新地址设置为默认地址
-        addressBook.setIs_default(IsDefaultConstant.TRUE);
-        addressBook.setUpdate_time(LocalDateTime.now());
+        addressBook.setIsDefault(IsDefaultConstant.TRUE);
+        addressBook.setUpdateTime(LocalDateTime.now());
         this.getBaseMapper().updateById(addressBook);
     }
 
     @Override
-    public void add(AddAddressBookDTO addAddressBookDTO) {
+    public Integer add(AddAddressBookDTO addAddressBookDTO) {
         AppUser appuser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
         //判断小区是否存在
         Community community = communityMapper.selectById(addAddressBookDTO.getCommunityId());
@@ -82,10 +112,11 @@
         }
         AddressBook addressBook = new AddressBook();
         BeanUtils.copyProperties(addAddressBookDTO,addressBook);
-        addressBook.setIs_default(IsDefaultConstant.FALSE);
-        addressBook.setCreate_time(LocalDateTime.now());
-        addressBook.setApp_user_id(appuser.getId());
+        addressBook.setIsDefault(IsDefaultConstant.FALSE);
+        addressBook.setCreateTime(LocalDateTime.now());
+        addressBook.setAppUserId(appuser.getId());
         this.save(addressBook);
+        return addressBook.getId();
     }
 
     @Override
@@ -98,15 +129,15 @@
         }
         //判断地址是否存在
         AddressBook addressBook = this.getById(updateAddressBookDTO.getId());
-        if (null==addressBook||addressBook.getDel_flag().equals(DelFlagConstant.DELETE)) {
+        if (null==addressBook||addressBook.getDelFlag().equals(DelFlagConstant.DELETE)) {
             throw new ServiceException("地址不存在");
         }
         //判断用户是否同一个
-        if (!appuser.getId().equals(addressBook.getApp_user_id())) {
+        if (!appuser.getId().equals(addressBook.getAppUserId())) {
             throw new ServiceException("该地址不属于您");
         }
         BeanUtils.copyProperties(updateAddressBookDTO,addressBook);
-        addressBook.setUpdate_time(LocalDateTime.now());
+        addressBook.setUpdateTime(LocalDateTime.now());
         this.updateById(addressBook);
 
     }
@@ -116,15 +147,15 @@
         AppUser appuser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
         //查看该地址是否存在
         AddressBook addressBook = this.getById(id);
-        if (null==addressBook||addressBook.getDel_flag().equals(DelFlagConstant.DELETE)) {
+        if (null==addressBook||addressBook.getDelFlag().equals(DelFlagConstant.DELETE)) {
             throw new ServiceException("该地址不存在");
         }
         //判断用户是否同一个
-        if (!appuser.getId().equals(addressBook.getApp_user_id())) {
+        if (!appuser.getId().equals(addressBook.getAppUserId())) {
             throw new ServiceException("该地址不属于您");
         }
 
-        addressBook.setDel_flag(DelFlagConstant.DELETE);
+        addressBook.setDelFlag(DelFlagConstant.DELETE);
         this.updateById(addressBook);
     }
 }
\ No newline at end of file
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/AppUserServiceImpl.java b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/AppUserServiceImpl.java
index c444219..9cd135d 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/AppUserServiceImpl.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/AppUserServiceImpl.java
@@ -4,6 +4,7 @@
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -11,16 +12,10 @@
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.errand.constant.*;
-import com.ruoyi.errand.domain.AppUser;
+import com.ruoyi.errand.domain.*;
 
-import com.ruoyi.errand.domain.Order;
-import com.ruoyi.errand.domain.UserCancellationLog;
-import com.ruoyi.errand.domain.VipOrder;
-import com.ruoyi.errand.mapper.AppUserMapper;
+import com.ruoyi.errand.mapper.*;
 
-import com.ruoyi.errand.mapper.OrderMapper;
-import com.ruoyi.errand.mapper.UserCancellationLogMapper;
-import com.ruoyi.errand.mapper.VipOrderMapper;
 import com.ruoyi.errand.object.dto.app.AppletLogin;
 import com.ruoyi.errand.object.dto.app.BirthDayDTO;
 import com.ruoyi.errand.object.dto.app.MobileLoginDTO;
@@ -35,7 +30,11 @@
 import com.ruoyi.errand.object.vo.sys.OrderPageListVO;
 import com.ruoyi.errand.object.vo.sys.UserStatsVO;
 import com.ruoyi.errand.service.AppUserService;
+import com.ruoyi.errand.service.CommunityCourierService;
 import com.ruoyi.errand.utils.*;
+import com.ruoyi.errand.utils.sms.AliyunSmsService;
+import com.ruoyi.errand.utils.wx.RefundCallbackResult;
+import com.ruoyi.errand.utils.wx.WechatPayService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -43,9 +42,11 @@
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.lang.reflect.Array;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.time.temporal.TemporalUnit;
@@ -68,6 +69,21 @@
     private OrderMapper orderMapper;
     @Autowired
     private VipOrderMapper vipOrderMapper;
+    @Autowired
+    private WechatPayService wechatPayService;
+    @Autowired
+    private AppUserService appUserService;
+    @Autowired
+    private CommunityCourierMapper communityCourierMapper;
+    @Autowired
+    private CommunityCourierService communityCourierService;
+    @Autowired
+    private CourierMapper courierMapper;
+    @Autowired
+    private CommunityMapper communityMapper;
+    @Autowired
+    private TokenBlacklistService blacklistService;
+
 
 
     @Override
@@ -100,7 +116,7 @@
         for (int i = 0; i < 6; i++) {
             code += Double.valueOf(Math.random() * 10).intValue();
         }
-        SMSUtil.sendSms("[\"" + code + "\"]", phone, "8824121211029", "39533d100b2b4aee8ed198aa49fe99dd");
+        AliyunSmsService.sendVerificationCode(phone,code);
         redisService.setCacheObject(phone, code, 300L, TimeUnit.SECONDS);
     }
 
@@ -116,7 +132,7 @@
         AppUser appUser = this.getOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhone, mobileLogin.getPhone())
                 .ne(AppUser::getStatus,AppUserStatusConstant.LOGOUT)
                 .eq(AppUser::getDelFlag,DelFlagConstant.UNDELETE));
-        if (null == appUser) {
+        if (null == appUser || null == appUser.getWxOpenid()) {
             //用户不存在
             //跳转注册页面
             LoginVO loginVo = new LoginVO();
@@ -142,7 +158,7 @@
         loginVO.setToken("app:" + jwt.get("token").toString());
         loginVO.setFailureTime(TimeUnit.MILLISECONDS.toSeconds((long)jwt.get("exp")));
         loginVO.setPhone(appUser.getPhone());
-        loginVO.setSkipPage(appUser.getFirstLogin());
+        loginVO.setSkipPage(1);
         loginVO.setIsCourier(appUser.getCourierId()!=null);
         return R.ok(loginVO);
     }
@@ -166,7 +182,7 @@
         String phone = phoneJson.getString("phoneNumber");
         //查询用户是否存在
         AppUser appUser = this.getOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhone, phone).ne(AppUser::getStatus, AppUserStatusConstant.LOGOUT).eq(AppUser::getDelFlag,DelFlagConstant.UNDELETE));
-        if(null == appUser){
+        if(null == appUser || null == appUser.getWxOpenid()){
             //跳转到注册界面
             LoginVO loginVo = new LoginVO();
             loginVo.setSkipPage(2);
@@ -182,7 +198,7 @@
         }
         //构建token
         Map<String,Object> tokenMap = new HashMap<>();
-        map.put("userId",appUser.getId());
+        tokenMap.put("userId",appUser.getId());
         Map<String, Object> jwt = JwtUtil.createJWT(tokenMap);
 
 
@@ -190,12 +206,13 @@
         loginVO.setToken("app:" + jwt.get("token").toString());
         loginVO.setFailureTime(TimeUnit.MILLISECONDS.toSeconds((long)jwt.get("exp")));
         loginVO.setPhone(appUser.getPhone());
-        loginVO.setSkipPage(appUser.getFirstLogin());
+        loginVO.setSkipPage(1);
+        loginVO.setIsCourier(appUser.getCourierId()!=null);
         return R.ok(loginVO);
     }
 
     @Override
-    public void register(RegisterDTO registerDTO) {
+    public LoginVO register(RegisterDTO registerDTO) {
         //使用jscode获取微信openid
         Map<String, Object> map = weChatUtil.code2Session(registerDTO.getJscode());
         Integer errcode = Integer.valueOf(map.get("errcode").toString());
@@ -203,28 +220,45 @@
             throw new ServiceException(map.get("msg").toString());
         }
         String openid = map.get("openid").toString();
-        AppUser appUser1 = this.getOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getWxOpenid, openid).ne(AppUser::getStatus, AppUserStatusConstant.LOGOUT).eq(AppUser::getDelFlag,DelFlagConstant.UNDELETE));
-        if (null != appUser1) {
-            throw new ServiceException("此微信号已注册,请直接登录!");
-        }
         AppUser appUser2 = this.getOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhone, registerDTO.getPhone()).ne(AppUser::getStatus, AppUserStatusConstant.LOGOUT).eq(AppUser::getDelFlag,DelFlagConstant.UNDELETE));
-        if (null != appUser2) {
+        if (null != appUser2 && appUser2.getWxOpenid() !=null) {
             throw new ServiceException("手机号已注册,请直接登录!");
         }
-        //注册一个
-        AppUser appUser = new AppUser();
-        appUser.setPhone(registerDTO.getPhone());
-        appUser.setDelFlag(DelFlagConstant.UNDELETE);
-        appUser.setStatus(AppUserStatusConstant.NORMAL);
-        appUser.setWxOpenid(openid);
-        appUser.setAvatar(DEFAULT_AVATAR_URL);
-        appUser.setFirstLogin(IsFirstLoginConstant.YES);
-        appUser.setFirstOrder(IsFirstOrder.YES);
-        //注册 修改用户信息
-        appUser.setName(registerDTO.getUsername());
-        appUser.setFirstLogin(IsFirstLoginConstant.NO);
-        appUser.setCommunityId(registerDTO.getCommunityId());
-        this.updateById(appUser);
+
+        if (appUser2 ==null) {
+            appUser2 = new AppUser();
+            //注册一个
+            appUser2.setPhone(registerDTO.getPhone());
+            appUser2.setDelFlag(DelFlagConstant.UNDELETE);
+            appUser2.setStatus(AppUserStatusConstant.NORMAL);
+            appUser2.setWxOpenid(openid);
+            appUser2.setFirstLogin(IsFirstLoginConstant.YES);
+            appUser2.setFirstOrder(IsFirstOrder.YES);
+        }
+        //修改
+        appUser2.setName(registerDTO.getUsername());
+        appUser2.setAvatar(registerDTO.getAvatar()==null?DEFAULT_AVATAR_URL:registerDTO.getAvatar());
+        appUser2.setCommunityId(registerDTO.getCommunityId());
+        appUser2.setWxOpenid(openid);
+        appUser2.setPhone(registerDTO.getPhone());
+        appUser2.setCreateTime(LocalDateTime.now());
+        appUser2.setRegionExtend(registerDTO.getRegionExtend());
+
+
+        this.saveOrUpdate(appUser2);
+
+        //构建token
+        Map<String,Object> tokenMap = new HashMap<>();
+        tokenMap.put("userId",appUser2.getId());
+        Map<String, Object> jwt = JwtUtil.createJWT(tokenMap);
+
+        LoginVO loginVO=new LoginVO();
+        loginVO.setToken("app:" + jwt.get("token").toString());
+        loginVO.setFailureTime(TimeUnit.MILLISECONDS.toSeconds((long)jwt.get("exp")));
+        loginVO.setPhone(appUser2.getPhone());
+        loginVO.setSkipPage(1);
+        loginVO.setIsCourier(appUser2.getCourierId()!=null);
+        return loginVO;
 
     }
 
@@ -232,19 +266,55 @@
     public OrderPageVO getOrderPage(Integer communityId) {
         AppUser appUser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
         //更换绑定的小区
-        if (communityId!=null){
+        if (communityId!=null&& !Objects.equals(appUser.getCommunityId(), communityId)){
             appUser.setCommunityId(communityId);
             this.updateById(appUser);
         }
         List<OrderPageVO> orderPage = this.getBaseMapper().getOrderPage(appUser.getId());
-
+        Community community = communityMapper.selectById(appUser.getCommunityId());
+        String regionFullName = getRegionFullName(community.getRegionId());
+        orderPage.get(0).setRegionName(regionFullName);
+        orderPage.get(0).setRegionId(community.getRegionId());
         return orderPage.get(0);
     }
+    @Autowired
+    private RegionMapper regionMapper;
+    /**
+     * 根据区ID查询完整的省市区名称
+     */
+    public String getRegionFullName(Integer districtId) {
+        Region district = regionMapper.selectById(districtId);
+        if (district == null) {
+            return "";
+        }
 
+        Region city = regionMapper.selectById(district.getParentId());
+        if (city == null) {
+            return district.getName();
+        }
+
+        Region province = regionMapper.selectById(city.getParentId());
+        if (province == null) {
+            return city.getName()  + district.getName();
+        }
+
+        return province.getName()  + city.getName()  + district.getName();
+    }
     @Override
     public AppUserInfoVO getMyInfo() {
         AppUser appUser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
-        return this.getBaseMapper().getMyInfo(appUser.getId());
+        AppUserInfoVO myInfo = this.getBaseMapper().getMyInfo(appUser.getId());
+
+        myInfo.setEndTimeStamp(myInfo.getEndTime() != null ?
+                myInfo.getEndTime().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() :
+                null);
+        if (myInfo.getEndTime() != null) {
+            if(myInfo.getEndTime().isBefore(LocalDateTime.now())){
+                myInfo.setVipId(null);
+            }
+        }
+
+        return myInfo;
     }
 
     @Override
@@ -270,16 +340,44 @@
      * 注销账号
      */
     @Override
-    public void delete() {
+    public void delete(String token) {
         AppUser appuser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
-        appuser.setDelFlag(DelFlagConstant.DELETE);
-        appuser.setStatus(AppUserStatusConstant.LOGOUT);
-        this.updateById(appuser);
+        //跑腿员 订单是否完成
+        if (appuser.getCourierId()!=null){
+            //跑腿员
+            Courier courier = courierMapper.selectById(appuser.getCourierId());
+            if (null != courier && courier.getDelFlag().equals(DelFlagConstant.UNDELETE)) {
+                //查订单是否完成
+                Long count = orderMapper.selectCount(new LambdaUpdateWrapper<Order>().eq(Order::getCourierId, appuser.getCourierId())
+                        .eq(Order::getDelFlag, DelFlagConstant.UNDELETE)
+                        .eq(Order::getOrderStatus, 2));
+                if (count > 0) {
+                    throw new ServiceException("您还有订单未完成,无法注销");
+                }
+            }
+            //与小区关系删除
+            CommunityCourier communityCourier = communityCourierMapper.selectOne(new LambdaQueryWrapper<CommunityCourier>().eq(CommunityCourier::getCourierId, appuser.getCourierId()));
+            if (null != communityCourier) {
+                communityCourierMapper.deleteById(communityCourier.getId());
+            }
+            //跑腿员删除
+            courier.setDelFlag(DelFlagConstant.DELETE);
+            courierMapper.updateById(courier);
+        }
+        UpdateWrapper<AppUser> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.eq("id", appuser.getId())
+                .set("courier_id", null)
+                .set("del_flag", DelFlagConstant.DELETE)
+                        .set("status",AppUserStatusConstant.LOGOUT);
+
+        this.getBaseMapper().update(null, updateWrapper);
+
         UserCancellationLog userCancellationLog=new UserCancellationLog();
         userCancellationLog.setApp_user_id(appuser.getId());
         userCancellationLog.setDel_flag(DelFlagConstant.DELETE);
         userCancellationLog.setCreate_time(LocalDateTime.now());
         userCancellationLogMapper.insert(userCancellationLog);
+        blacklistService.addToBlacklist(token);
     }
 
     @Override
@@ -334,12 +432,15 @@
     }
 
     @Override
-    public AppUserSysDetailVO detail(Integer id) {
+    public AppUserSysDetailVO detail(String id) {
         // 获取本月的开始时间和结束时间
         LocalDate now = LocalDate.now();
         LocalDateTime startOfMonth = now.withDayOfMonth(1).atStartOfDay();
         LocalDateTime endOfMonth = now.withDayOfMonth(now.lengthOfMonth()).atTime(23, 59, 59);
         AppUser appUser = this.getBaseMapper().selectById(id);
+        if (null == appUser || appUser.getDelFlag() == DelFlagConstant.DELETE) {
+            throw new ServiceException("用户不存在");
+        }
         AppUserSysDetailVO vo = new AppUserSysDetailVO();
         BeanUtils.copyProperties(appUser, vo);
         int isVip =0;
@@ -365,7 +466,7 @@
     }
 
     @Override
-    public void froze(Integer id) {
+    public void froze(String id) {
         AppUser appUser = this.getBaseMapper().selectById(id);
         if (appUser==null|| Objects.equals(appUser.getDelFlag(), DelFlagConstant.DELETE)) {
             throw new ServiceException("用户不存在");
@@ -382,13 +483,14 @@
     }
 
     @Override
-    public void refund(Integer id) {
+    public void refund(String id) {
         // 1. 查询用户所有未退费的VIP订单(状态为4-已完成且未删除)
         List<VipOrder> orders = vipOrderMapper.selectList(new LambdaQueryWrapper<VipOrder>()
                 .eq(VipOrder::getAppUserId, id)
                 .eq(VipOrder::getOrderStatus, 4) // 4-已完成
                 .eq(VipOrder::getDelFlag, DelFlagConstant.UNDELETE)     // 0-未删除
                 .isNull(VipOrder::getRefundTime) // 未退款的
+                        .eq(VipOrder::getPayStatus,2)
                 .orderByDesc(VipOrder::getOrderTime));
 
         // 2. 计算每个订单的有效期结束时间
@@ -410,29 +512,55 @@
             //退款
             log.info("开始会员退费,被退款人员id:{},退款订单:{}",vipOrder.getAppUserId(),vipOrder.getId());
             R r = refundPayMoney(vipOrder);//退款
-            if (200 == r.getCode()) {
-                //退款成功取消用户的会员,将用户状态改变
-                AppUser appUser = this.getById(id);
-                appUser.setStartTime(LocalDateTime.now());
-                appUser.setEndTime(LocalDateTime.now());
-                appUser.setVipId(null);
+            if (200 != r.getCode()) {
+                throw new ServiceException("退款失败,msg:"+ r.getMsg()+" 订单id:"+vipOrder.getId());
             }
         });
+        UpdateWrapper<AppUser> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.eq("id", id)
+                .set("vip_id", null)        // 显式设置vip_id为null
+                .set("end_time", LocalDateTime.now());  // 设置结束时间
+        appUserService.update(null, updateWrapper);
     }
 
     @Override
-    public R refundPayMoneyCallback(RefundCallbackResult refundCallbackResult) {
-        String code = refundCallbackResult.getR3_RefundOrderNo().substring(1);
-        VipOrder vipOrder = vipOrderMapper.selectOne(new LambdaQueryWrapper<VipOrder>().eq(VipOrder::getOrderNumber, code));
+    public R refundPayMoneyCallback(String xmlData) {
+        RefundCallbackResult result = wechatPayService.processRefundCallback(xmlData);
+        if (!result.isSuccess()) {
+            System.out.println("会员退费错误:"+result.getMsg());
+            return R.fail(result.getMsg());
+        }
+        VipOrder vipOrder = vipOrderMapper.selectOne(new LambdaQueryWrapper<VipOrder>().eq(VipOrder::getOrderNumber,  result.getOrderNo()));
         if (null == vipOrder || vipOrder.getPayStatus() == 1 || vipOrder.getOrderStatus() == 6) {
             return R.ok();
         }
-        vipOrder.setRefundCode(refundCallbackResult.getR5_RefundTrxNo());
+        vipOrder.setRefundCode(result.getRefundNo());
         vipOrder.setRefundStatus(2);
         vipOrder.setRefundTime(LocalDateTime.now());
         vipOrder.setOrderStatus(6);//已退费
         vipOrderMapper.updateById(vipOrder);
+        //退款成功取消用户的会员,将用户状态改变
+        UpdateWrapper<AppUser> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.eq("id", vipOrder.getAppUserId())
+                .set("vip_id", null)        // 显式设置vip_id为null
+                .set("end_time", LocalDateTime.now());  // 设置结束时间
+
+        appUserService.update(null, updateWrapper);
         return R.ok();
+    }
+
+    @Override
+    public void setName(String name) {
+        AppUser appuser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        appuser.setName(name);
+        this.updateById(appuser);
+    }
+
+    @Override
+    public void setAvatar(String avatar) {
+        AppUser appuser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        appuser.setAvatar(avatar);
+        this.updateById(appuser);
     }
 
     private Map<Long, LocalDateTime> calculateOrderEndTimes(List<VipOrder> orders) {
@@ -484,11 +612,14 @@
         BigDecimal paymentAmount = order.getPaymentAmount();
         if (BigDecimal.ZERO.compareTo(order.getPaymentAmount()) < 0) {//支付的金额是否大于0
             //微信退款
-            RefundResult refund = PaymentUtil.refund(order.getOrderNumber(), "R" + order.getOrderNumber(), paymentAmount.doubleValue(),
-                    "/app/user/refundPayMoneyCallback");
-            if (!"100".equals(refund.getRa_Status())) {
-                return R.fail(refund.getRc_CodeMsg());//退款失败
+            Map<String,String> map = wechatPayService.refund(order.getOrderNumber(), order.getOrderNumber(), order.getPaymentAmount().toString(), order.getPaymentAmount().toString(), "会员退款", "/app/user/refundPayMoneyCallback");
+            if (!"SUCCESS".equals(map.get("return_code"))) {
+                return R.fail(map.get("return_msg"));//退款失败
             }
+            //这里申请成功后先返回,等待微信退款成功再取消用户会员
+            order.setRefundStatus(1);
+            vipOrderMapper.updateById(order);
+            return R.ok();
         }
         return R.ok();
     }
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/CommunityServiceImpl.java b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/CommunityServiceImpl.java
index 2ae8dbb..75ccc9c 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/CommunityServiceImpl.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/CommunityServiceImpl.java
@@ -1,6 +1,7 @@
 package com.ruoyi.errand.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -25,6 +26,7 @@
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
@@ -55,15 +57,18 @@
     }
 
     @Override
-    public R<List<CommunityListVO>> getTotalCommunityList() {
-        List<CommunityListVO> communityListVOS = this.getBaseMapper().getTotalCommunityList();
+    public R<List<CommunityListVO>> getTotalCommunityList(String name) {
+        List<CommunityListVO> communityListVOS = this.getBaseMapper().getTotalCommunityList(name);
         return R.ok(communityListVOS);
     }
 
     @Override
     public List<AllCommunityListVO> getAllCommunityList() {
         List<Integer> list=communityCourierMapper.getAllCommunityList();
-        return this.baseMapper.getAllCommunityList(list);
+
+            return this.baseMapper.getAllCommunityList(list);
+
+
     }
 
     @Override
@@ -73,6 +78,7 @@
         iPage.getRecords().forEach(x->{
             List<Order> orderList = orderMapper.selectList(new LambdaQueryWrapper<Order>()
                     .eq(Order::getCommunityId, x.getId())
+                            .ne(Order::getOrderStatus,3)
                     .eq(Order::getDelFlag, DelFlagConstant.UNDELETE)
                     .eq(Order::getPayStatus,2));
             if (orderList!=null&& !orderList.isEmpty()){
@@ -111,12 +117,15 @@
         //添加小区
         Community community = new Community();
         BeanUtils.copyProperties(addCommunityDTO,community);
+        community.setDelFlag(0);
+        community.setStatus(0);
+        community.setCreateTime(LocalDateTime.now());
         this.save(community);
         if (addCommunityDTO.getServicePhone()!=null){
             //保存客服电话
             Phone phone = new Phone();
             phone.setType(2);
-            phone.setCommunity_id(community.getId());
+            phone.setCommunityId(community.getId());
             phone.setPhone(addCommunityDTO.getServicePhone());
             phoneMapper.insert(phone);
         }
@@ -148,14 +157,14 @@
         //检查客服电话是否更改
         if (editCommunityDTO.getServicePhone()!=null){
             Phone phone = phoneMapper.selectOne(new LambdaQueryWrapper<Phone>()
-                    .eq(Phone::getCommunity_id, editCommunityDTO.getId())
+                    .eq(Phone::getCommunityId, editCommunityDTO.getId())
                     .eq(Phone::getType, 2));
             if (phone==null){
                 //添加
                 //保存客服电话
                 phone = new Phone();
                 phone.setType(2);
-                phone.setCommunity_id(community.getId());
+                phone.setCommunityId(community.getId());
                 phone.setPhone(editCommunityDTO.getServicePhone());
                 phoneMapper.insert(phone);
             }else {
@@ -171,10 +180,10 @@
             throw new ServiceException("跑腿人员不存在");
         }
         //检查跑腿员是否绑定
-        Long count = communityCourierMapper.selectCount(new LambdaQueryWrapper<CommunityCourier>()
+        CommunityCourier one = communityCourierMapper.selectOne(new LambdaQueryWrapper<CommunityCourier>()
                 .eq(CommunityCourier::getCourierId, editCommunityDTO.getCourierId()));
-        if (count>0){
-            throw new ServiceException("跑腿人员已绑定");
+        if (one != null && !Objects.equals(one.getCommunityId(), editCommunityDTO.getId())){
+            throw new ServiceException("跑腿人员已绑定其他小区");
         }
         //检查跑腿员是否更改
         CommunityCourier communityCourier = communityCourierMapper.selectOne(new LambdaQueryWrapper<CommunityCourier>()
@@ -184,12 +193,16 @@
             communityCourier = new CommunityCourier();
             communityCourier.setCommunityId(editCommunityDTO.getId());
             communityCourier.setCourierId(editCommunityDTO.getCourierId());
+            communityCourierMapper.insert(communityCourier);
         }else {
             //修改
             communityCourier.setCourierId(editCommunityDTO.getCourierId());
             communityCourierMapper.updateById(communityCourier);
         }
 
+        //修改小区
+        BeanUtils.copyProperties(editCommunityDTO,community);
+        this.updateById(community);
     }
 
     @Override
@@ -197,6 +210,14 @@
         Community community = this.baseMapper.selectById(id);
         if (community==null|| Objects.equals(community.getDelFlag(), DelFlagConstant.DELETE)){
             throw new ServiceException("未找到该小区");
+        }
+        //查找小区是否有订单未完成
+        //查找小区是否有订单未完成
+        Long count = orderMapper.selectCount(new LambdaUpdateWrapper<Order>().eq(Order::getCommunityId, id)
+                .eq(Order::getDelFlag, DelFlagConstant.UNDELETE)
+                .in(Order::getOrderStatus, Arrays.asList(1,2)));
+        if (count > 0) {
+            throw new ServiceException("该小区还有订单未完成,无法冻结");
         }
         //删除关系
         CommunityCourier communityCourier = communityCourierMapper.selectOne(new LambdaQueryWrapper<CommunityCourier>()
@@ -217,6 +238,16 @@
         if (community==null|| Objects.equals(community.getDelFlag(), DelFlagConstant.DELETE)){
             throw new ServiceException("未找到该小区");
         }
+        if (community.getStatus()==1){
+            //查找小区是否有订单未完成
+            Long count = orderMapper.selectCount(new LambdaUpdateWrapper<Order>().eq(Order::getCommunityId, id)
+                    .eq(Order::getDelFlag, DelFlagConstant.UNDELETE)
+                    .in(Order::getOrderStatus, Arrays.asList(1,2)));
+            if (count > 0) {
+                throw new ServiceException("该小区还有订单未完成,无法冻结");
+            }
+        }
+
         community.setStatus(community.getStatus()==0?1:0);
         community.setUpdateTime(LocalDateTime.now());
         this.baseMapper.updateById(community);
@@ -244,10 +275,24 @@
             }
         }
         //客服电话
-        Phone phone = phoneMapper.selectOne(new LambdaQueryWrapper<Phone>().eq(Phone::getCommunity_id, community.getId()));
+        Phone phone = phoneMapper.selectOne(new LambdaQueryWrapper<Phone>().eq(Phone::getCommunityId, community.getId()));
         if (phone!=null){
             vo.setServicePhone(phone.getPhone());
         }
+        //订单统计
+        List<Order> orderList = orderMapper.selectList(new LambdaQueryWrapper<Order>()
+                .eq(Order::getCommunityId,id)
+                .ne(Order::getOrderStatus,3)
+                .eq(Order::getDelFlag, DelFlagConstant.UNDELETE)
+                .eq(Order::getPayStatus,2));
+        if (orderList!=null&& !orderList.isEmpty()){
+            vo.setTotal(orderList.size());//总订单数
+            LocalDateTime start = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
+            LocalDateTime end = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
+            long today = orderList.stream().filter(order -> order.getOrderTime().isAfter(start.minusNanos(1)))
+                    .filter(order -> order.getOrderTime().isBefore(end.plusNanos(1))).count();
+            vo.setToday((int) today);//今日订单数
+        }
         return vo;
     }
 
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/CourierServiceImpl.java b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/CourierServiceImpl.java
index 09ff25c..c5930db 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/CourierServiceImpl.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/CourierServiceImpl.java
@@ -2,12 +2,16 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 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.exception.ServiceException;
+import com.ruoyi.errand.constant.AppUserStatusConstant;
 import com.ruoyi.errand.constant.DelFlagConstant;
+import com.ruoyi.errand.constant.IsFirstLoginConstant;
+import com.ruoyi.errand.constant.IsFirstOrder;
 import com.ruoyi.errand.domain.*;
 import com.ruoyi.errand.mapper.*;
 import com.ruoyi.errand.object.dto.sys.AddCourierDTO;
@@ -36,6 +40,7 @@
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.temporal.TemporalAdjusters;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
@@ -56,6 +61,10 @@
     private AppUserMapper appUserMapper;
     @Autowired
     private CommunityMapper communityMapper;
+    @Autowired
+    private AppUserService appUserService;
+    @Autowired
+    private CourierMapper courierMapper;
 
 
     @Override
@@ -79,8 +88,15 @@
     @Override
     public IPage<CourierOrderListVO> getCourierOrderList(Integer pageNum, Integer pageSize, Integer orderStatus) {
         AppUser appuser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        if(appuser.getCourierId()==null){
+            throw new ServiceException("您已不是跑腿员");
+        }
         IPage<CourierOrderListVO> page=new Page<>(pageNum, pageSize);
-        return this.baseMapper.getCourierOrderList(page,orderStatus,appuser.getCourierId());
+        CommunityCourier communityCourier = communityCourierMapper.selectOne(new LambdaQueryWrapper<CommunityCourier>().eq(CommunityCourier::getCourierId, appuser.getCourierId()));
+        if (communityCourier==null){
+            throw new ServiceException("您还未绑定需代办的小区");
+        }
+        return this.baseMapper.getCourierOrderList(page,appuser.getCourierId(),orderStatus,communityCourier.getCommunityId());
     }
 
     @Override
@@ -88,6 +104,13 @@
         AppUser appuser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
         if (appuser.getCourierId()==null){
             throw new ServiceException("您还不是跑腿员");
+        }
+        Courier courier = courierMapper.selectById(appuser.getCourierId());
+        if (courier==null || courier.getDelFlag().equals(DelFlagConstant.DELETE)){
+            throw new ServiceException("绑定的跑腿账号已失效");
+        }
+        if (courier.getStatus().equals(0)){
+            throw new ServiceException("跑腿账号已在离职中,不能接单");
         }
         CommunityCourier communityCourier = communityCourierMapper.selectOne(new LambdaQueryWrapper<CommunityCourier>().eq(CommunityCourier::getCourierId, appuser.getCourierId()));
         if(communityCourier==null){
@@ -107,6 +130,7 @@
 
         //修改订单状态
         order.setOrderStatus(2);
+        order.setCourierId(appuser.getCourierId());
         order.setReceivingTime(LocalDateTime.now());
         orderMapper.updateById(order);
 
@@ -161,7 +185,8 @@
             List<Order> orderList = orderMapper.selectList(new LambdaUpdateWrapper<Order>()
                     .eq(Order::getCourierId, x.getId())
                     .eq(Order::getDelFlag,DelFlagConstant.UNDELETE)
-                    .eq(Order::getPayMethod,2));
+                    .notIn(Order::getOrderStatus,Arrays.asList(1,3))
+                    .eq(Order::getPayStatus,2));
             if (orderList!=null&& !orderList.isEmpty()){
                 //当天接单量
                 LocalDateTime todayStart = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
@@ -202,7 +227,8 @@
         List<Order> orderList = orderMapper.selectList(new LambdaUpdateWrapper<Order>()
                 .eq(Order::getCourierId, id)
                 .eq(Order::getDelFlag,DelFlagConstant.UNDELETE)
-                .eq(Order::getPayMethod,2));
+                .notIn(Order::getOrderStatus,Arrays.asList(1,3)) //未接单 取消掉的不要
+                .eq(Order::getPayStatus,2));
         if (orderList!=null&& !orderList.isEmpty()){
             //当天接单量
             LocalDateTime todayStart = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
@@ -238,13 +264,20 @@
 
         return vo;
     }
-
+    private static final String DEFAULT_AVATAR_URL = "http://qijishenghuiyuan.obs.cn-southwest-2.myhuaweicloud.com/admin/aedfbbb41280471f8d9fa7905298b65f.png";
     @Override
     public void add(AddCourierDTO addCourierDTO) {
         AppUser appUser = appUserMapper.selectOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhone, addCourierDTO.getPhone()).
                 eq(AppUser::getDelFlag, DelFlagConstant.UNDELETE));
         if (appUser == null) {
-            throw new ServiceException("请先注册小程序");
+            appUser=new AppUser();
+            appUser.setPhone(addCourierDTO.getPhone());
+            appUser.setDelFlag(DelFlagConstant.UNDELETE);
+            appUser.setStatus(AppUserStatusConstant.NORMAL);
+            appUser.setAvatar(DEFAULT_AVATAR_URL);
+            appUser.setFirstLogin(IsFirstLoginConstant.YES);
+            appUser.setFirstOrder(IsFirstOrder.YES);
+            appUser.setName(addCourierDTO.getPhone());
         }
         //手机号是否存在
         Courier courier = this.getBaseMapper().selectOne(new LambdaQueryWrapper<Courier>().eq(Courier::getPhone, addCourierDTO.getPhone())
@@ -269,6 +302,7 @@
         //保存跑腿人员
         Courier courier1 = new Courier();
         BeanUtils.copyProperties(addCourierDTO, courier1);
+        courier1.setCreateTime(LocalDateTime.now());
         this.save(courier1);
         //绑定小区
         if (addCourierDTO.getCommunityId() != null) {
@@ -277,6 +311,8 @@
             communityCourier.setCourierId(courier1.getId());
             communityCourierMapper.insert(communityCourier);
         }
+        appUser.setCourierId(courier1.getId());
+        appUserService.saveOrUpdate(appUser);
     }
 
     @Override
@@ -288,7 +324,7 @@
         }
         //是否更改了手机号
         if (!courier.getPhone().equals(editCourierDTO.getPhone())) {
-            //更改了手机号
+            /*//更改了手机号
             AppUser appUser = appUserMapper.selectOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhone, editCourierDTO.getPhone()).
                     eq(AppUser::getDelFlag, DelFlagConstant.UNDELETE));
             if (appUser == null) {
@@ -298,18 +334,22 @@
                     .eq(Courier::getDelFlag, DelFlagConstant.UNDELETE));
             if (courier1 != null ) {
                 throw new ServiceException("该手机号的跑腿员已存在");
-            }
+            }*/
+            throw new ServiceException("不能修该手机号");
         }
         //是否更改了小区
         CommunityCourier communityCourier = communityCourierMapper.selectOne(new LambdaQueryWrapper<CommunityCourier>().eq(CommunityCourier::getCourierId, editCourierDTO.getId()));
         if (communityCourier != null) {
             //之前有绑定小区
             if (editCourierDTO.getCommunityId() == null) {
-                //现在没有绑定,之前的要解绑
+                //现在没有绑定 
+                extracted(courier.getId(), "该跑腿员还有订单未完成,无法变更小区");
+                //解绑之前的
                 communityCourierMapper.deleteById(communityCourier.getId());
 
             }else if (!editCourierDTO.getCommunityId().equals(communityCourier.getCommunityId())) {
                 //现在绑定了,不和之前的一样
+                extracted(courier.getId(), "该跑腿员还有订单未完成,无法变更小区");
                 //绑定的小区是否存在
                 Community community = communityMapper.selectById(editCourierDTO.getCommunityId());
                 if (community == null|| Objects.equals(community.getDelFlag(), DelFlagConstant.DELETE)) {
@@ -323,8 +363,29 @@
                 }
                 //修改
                 communityCourier.setCommunityId(editCourierDTO.getCommunityId());
+                communityCourier.setCourierId(editCourierDTO.getId());
                 communityCourier.setUpdateTime(LocalDateTime.now());
                 communityCourierMapper.updateById(communityCourier);
+            }
+        }else {
+            //之前没绑定 现在绑定
+            if (editCourierDTO.getCommunityId() != null) {
+                Community community = communityMapper.selectById(editCourierDTO.getCommunityId());
+                if (community == null|| Objects.equals(community.getDelFlag(), DelFlagConstant.DELETE)) {
+                    throw new ServiceException("绑定的小区不存在");
+                }
+                //绑定的小区是否被别人绑定了
+                CommunityCourier communityCourier1 = communityCourierMapper.selectOne(new LambdaQueryWrapper<CommunityCourier>()
+                        .eq(CommunityCourier::getCommunityId, editCourierDTO.getCommunityId()));
+                if (communityCourier1 != null) {
+                    throw new ServiceException("该小区已被绑定");
+                }
+                //修改
+                communityCourier = new CommunityCourier();
+                communityCourier.setCommunityId(editCourierDTO.getCommunityId());
+                communityCourier.setCourierId(editCourierDTO.getId());
+                communityCourier.setUpdateTime(LocalDateTime.now());
+                communityCourierMapper.insert(communityCourier);
             }
         }
         //修改
@@ -333,11 +394,27 @@
 
     }
 
+    private void extracted(Integer courier, String message) {
+        //判断该小区订单是否完成
+        Long count = orderMapper.selectCount(new LambdaUpdateWrapper<Order>()
+                .eq(Order::getCourierId, courier)
+                .eq(Order::getPayStatus, 2)
+                .eq(Order::getDelFlag, DelFlagConstant.UNDELETE)
+                .eq(Order::getOrderStatus, 2));
+        if (count > 0) {
+            throw new ServiceException(message);
+        }
+    }
+
     @Override
     public void froze(Integer id) {
         Courier  courier= this.getById(id);
         if (courier == null||courier.getDelFlag().equals(DelFlagConstant.DELETE)) {
             throw new ServiceException("该跑腿员不存在");
+        }
+        //如果是离职,判断是否还有订单在进行中
+        if (courier.getStatus().equals(1)){
+            extracted(id, "该跑腿员还有订单未完成,无法离职");
         }
         courier.setStatus(courier.getStatus()==0?1:0);
         courier.setUpdateTime(LocalDateTime.now());
@@ -350,11 +427,24 @@
         if (courier == null||courier.getDelFlag().equals(DelFlagConstant.DELETE)) {
             throw new ServiceException("该跑腿员不存在");
         }
+
+        //判断是否还有订单在进行中
+        extracted(id, "该跑腿员还有订单未完成,无法注销");
+
         //判断跑腿员是否绑定了小区
         CommunityCourier communityCourier = communityCourierMapper.selectOne(new LambdaQueryWrapper<CommunityCourier>().eq(CommunityCourier::getCourierId, id));
         if (communityCourier != null) {
             communityCourierMapper.deleteById(communityCourier.getId());//解绑
         }
+        //判断用户是否存在,删除用户中跑腿员的信息
+        AppUser appUser = appUserMapper.selectOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getCourierId, id).eq(AppUser::getDelFlag, DelFlagConstant.UNDELETE));
+        UpdateWrapper<AppUser> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.eq("id", appUser.getId())
+                .set("courier_id", null);
+
+        appUserMapper.update(null, updateWrapper);
+
+        //删除跑腿员
         courier.setDelFlag(DelFlagConstant.DELETE);
         courier.setUpdateTime(LocalDateTime.now());
         this.updateById(courier);
@@ -370,9 +460,9 @@
 
     private static long countByTimeRange(List<Order> orderList, LocalDateTime start, LocalDateTime end) {
         return orderList.stream()
-                .filter(order -> order.getOrderTime() != null) // 过滤空时间
-                .filter(order -> order.getOrderTime().isAfter(start.minusNanos(1))) // 大于等于 start
-                .filter(order -> order.getOrderTime().isBefore(end.plusNanos(1))) // 小于等于 end
+                .filter(order -> order.getReceivingTime() != null) // 过滤空时间
+                .filter(order -> order.getReceivingTime().isAfter(start.minusNanos(1))) // 大于等于 start
+                .filter(order -> order.getReceivingTime().isBefore(end.plusNanos(1))) // 小于等于 end
                 .count();
     }
 
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/EvaluationServiceImpl.java b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/EvaluationServiceImpl.java
index 5deedf4..5207bb7 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/EvaluationServiceImpl.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/EvaluationServiceImpl.java
@@ -1,5 +1,6 @@
 package com.ruoyi.errand.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.errand.constant.DelFlagConstant;
@@ -10,6 +11,7 @@
 import com.ruoyi.errand.mapper.OrderMapper;
 import com.ruoyi.errand.object.dto.app.AddEvaluationDTO;
 import com.ruoyi.errand.service.EvaluationService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.stereotype.Service;
 
@@ -19,6 +21,7 @@
 @Service
 public class EvaluationServiceImpl extends ServiceImpl<EvaluationMapper, Evaluation> implements EvaluationService {
 
+    @Autowired
     private  OrderMapper orderMapper;
 
     @Override
@@ -47,6 +50,14 @@
         }else {
             throw new ServiceException("评价类型错误");
         }
+        //查看订单是否评价过
+        LambdaQueryWrapper<Evaluation> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(Evaluation::getType, addEvaluationDTO.getType());
+        lambdaQueryWrapper.eq(Evaluation::getOrderId,addEvaluationDTO.getOrderId());
+        Evaluation one = this.getOne(lambdaQueryWrapper);
+        if (one!=null){
+            throw new ServiceException("该订单已评价过,请去修改");
+        }
         Evaluation evaluation = new Evaluation();
         evaluation.setOrderId(addEvaluationDTO.getOrderId());
         evaluation.setType(addEvaluationDTO.getType());
@@ -55,4 +66,16 @@
         evaluation.setCreateTime(LocalDateTime.now());
         this.save(evaluation);
     }
+
+    @Override
+    public void edit(AddEvaluationDTO addEvaluationDTO) {
+        Evaluation evaluation = this.getById(addEvaluationDTO.getEvaluationId());
+        if (evaluation==null){
+            throw new ServiceException("该评价不存在");
+        }
+        evaluation.setRating(addEvaluationDTO.getRating());
+        evaluation.setContent(addEvaluationDTO.getContent());
+        evaluation.setUpdateTime(LocalDateTime.now());
+        this.updateById(evaluation);
+    }
 }
\ No newline at end of file
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/FeedbackServiceImpl.java b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/FeedbackServiceImpl.java
index b78c3e1..0157f30 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/FeedbackServiceImpl.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/FeedbackServiceImpl.java
@@ -12,6 +12,7 @@
 import com.ruoyi.errand.domain.AppUser;
 import com.ruoyi.errand.domain.Feedback;
 import com.ruoyi.errand.mapper.FeedbackMapper;
+import com.ruoyi.errand.object.dto.app.AddFeedbackDTO;
 import com.ruoyi.errand.object.dto.sys.FeedbackPageListDTO;
 import com.ruoyi.errand.object.vo.sys.BannerPageListVO;
 import com.ruoyi.errand.object.vo.sys.FeedbackPageListVO;
@@ -19,18 +20,21 @@
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
+
 @Service
 public class FeedbackServiceImpl extends ServiceImpl<FeedbackMapper, Feedback> implements FeedbackService {
 
     @Override
-    public void add(String content) {
+    public void add(AddFeedbackDTO dto) {
         Feedback feedback = new Feedback();
-        feedback.setContent(content);
+        feedback.setContent(dto.getContent());
         AppUser appuser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
         feedback.setAppUserId(appuser.getId());
         feedback.setName(appuser.getName());
         feedback.setPhone(appuser.getPhone());
         feedback.setStatus(StatusConstant.UN_DISPOSE);
+        feedback.setCreateTime(LocalDateTime.now());
         this.save(feedback);
 
     }
@@ -60,6 +64,7 @@
         feedback.setStatus(StatusConstant.DISPOSE);
         LoginUser loginUser  = (LoginUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
         feedback.setHandlerId(loginUser.getUserId());
+        feedback.setHandleTime(LocalDateTime.now());
         this.updateById(feedback);
     }
 }
\ No newline at end of file
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/OrderServiceImpl.java b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/OrderServiceImpl.java
index a6ebf4c..f5c55a3 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/OrderServiceImpl.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/OrderServiceImpl.java
@@ -33,12 +33,17 @@
 import com.ruoyi.errand.object.vo.sys.UserStatsVO;
 import com.ruoyi.errand.service.OrderService;
 import com.ruoyi.errand.utils.*;
+import com.ruoyi.errand.utils.sms.AliyunSmsService;
+import com.ruoyi.errand.utils.wx.PayResult;
+import com.ruoyi.errand.utils.wx.RefundCallbackResult;
+import com.ruoyi.errand.utils.wx.WechatPayService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
@@ -67,11 +72,16 @@
     @Resource
     private DeliveryWebSocket deliveryWebSocket;
 
+    @Autowired
+    private WechatPayService wechatPayService;
+
     @Override
     public ConfirmOrderVO confirmOrder(ConfirmOrderDTO confirmOrderDTO) {
 
         ConfirmOrderVO confirmOrderVO = new ConfirmOrderVO();
         BeanUtils.copyProperties(confirmOrderDTO, confirmOrderVO);
+
+
 
         //小区是否存在
         Community community = communityMapper.selectById(confirmOrderDTO.getCommodityId());
@@ -83,6 +93,10 @@
         }
         //将地址簿信息查询出来
         AddressBook addressBook = addressBookMapper.selectById(confirmOrderDTO.getAddressBookId());
+        //地址簿是否存在
+        if (addressBook==null||addressBook.getDelFlag().equals(DelFlagConstant.DELETE)){
+            throw new ServiceException("地址簿不存在");
+        }
         confirmOrderVO.setRecipientName(addressBook.getRecipientName());
         confirmOrderVO.setRecipientPhone(addressBook.getRecipientPhone());
         confirmOrderVO.setAddressDetail(addressBook.getAddressDetail());
@@ -101,7 +115,7 @@
         }else if (confirmOrderDTO.getPayMethod()==1){
             confirmOrderVO.setPayMethod(1);
             //会员支付
-            if (appuser.getEndTime().isAfter(LocalDateTime.now())) {
+            if (appuser.getEndTime().isBefore(LocalDateTime.now())) {
                 //过期了
                 throw new ServiceException("支付错误:会员已到期");
             }
@@ -118,6 +132,7 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public R orderPayment(ConfirmOrderDTO confirmOrderDTO) {
         Order order = new Order();
         BeanUtils.copyProperties(confirmOrderDTO, order);
@@ -134,6 +149,10 @@
 
         //将地址簿信息查询出来
         AddressBook addressBook = addressBookMapper.selectById(confirmOrderDTO.getAddressBookId());
+        //地址簿是否存在
+        if (addressBook==null||addressBook.getDelFlag().equals(DelFlagConstant.DELETE)){
+            throw new ServiceException("地址簿不存在");
+        }
         order.setRecipientName(addressBook.getRecipientName());
         order.setRecipientPhone(addressBook.getRecipientPhone());
         order.setAddressDetail(addressBook.getAddressDetail());
@@ -177,18 +196,23 @@
         if ( BigDecimal.ZERO.compareTo(paymentMoney) < 0){
             //调起微信支付
             String agencyMatters = order.getAgencyMatters();
-            UniPayResult uniPayResult = PaymentUtil.uniPay(order.getOrderNumber(), paymentMoney.doubleValue(),  "代办事项",
-                    agencyMatters, "", "/app/order/orderPaymentCallback", appuser.getWxOpenid(), null);
-            if(null == uniPayResult || !"100".equals(uniPayResult.getRa_Code())){
-                return R.fail(null == uniPayResult ? "支付失败" : uniPayResult.getRb_CodeMsg());
+            try {
+                R r = wechatPayService.unifiedOrder(order.getId().toString(), order.getOrderNumber(), paymentMoney.toString(), agencyMatters,appuser.getWxOpenid(),"/app/order/orderPaymentCallback");
+                if (null == r || 200 != r.getCode()){
+                    //支付失败 删除订单
+                    order.setDelFlag(1);
+                    this.updateById(order);
+                    //返回报错信息
+                    return R.fail(null == r ? "支付失败" : r.getMsg());
+                }
+                //将支付数据添加到redis队列中,便于定时任务去校验是否完成支付,没有完成支付支付,15分钟后关闭订单。
+                long second = LocalDateTime.now().plusMinutes(15).toEpochSecond(ZoneOffset.UTC);
+                redisTemplate.opsForZSet().add("OrderPayment", order.getOrderNumber(), second);
+                return r;
+            } catch (Exception e) {
+                throw new RuntimeException(e);
             }
-            String rc_result = uniPayResult.getRc_Result();
-            JSONObject jsonObject = JSON.parseObject(rc_result);
-            jsonObject.put("orderId", order.getId().toString());
-            //将支付数据添加到redis队列中,便于定时任务去校验是否完成支付,没有完成支付支付,15分钟后关闭订单。
-            long second = LocalDateTime.now().plusMinutes(15).toEpochSecond(ZoneOffset.UTC);
-            redisTemplate.opsForZSet().add("OrderPayment", order.getOrderNumber(), second);
-            return R.ok(jsonObject.toJSONString());
+
         }
 
         //会员支付或支付金额为0直接支付成功
@@ -197,11 +221,17 @@
         order.setOrderTime(LocalDateTime.now());//下单时间
         this.updateById(order);
         Map<String,Object> courier= appUserMapper.getCourierByCommunityId(order.getCommunityId());
-        if (courier == null || courier.isEmpty()) {
+        if (courier == null || courier.isEmpty() ||null == courier.get("id")  ) {
             log.warn("未找到社区ID={}对应的骑手", order.getCommunityId());
             return R.ok();
         }
-        //todo 短信通知
+        if (courier.get("status").equals("0")){
+            log.warn("当前社区骑手离职中,骑手id={}", courier.get("courierId"));
+            return R.ok();
+        }
+        Integer courierIdLong = (Integer) courier.get("courierId");
+        order.setCourierId(courierIdLong);
+        this.updateById(order);
         sendSmsNotificationToCourier(courier,order);
         //小程序弹窗通知
         notifyDeliveryPerson((Long) courier.get("id"), order,1);//1=新订单
@@ -222,8 +252,7 @@
                 return;
             }
 //            String content = String.format("您有新的跑腿订单(订单号:%s),请及时处理!", order.getOrderNumber());
-            //todo  调用短信服务API
-//            SMSUtil.sendSms(order.getOrderNumber(),phoneNumber, "", "");
+            AliyunSmsService.sendOrderRemindSms(phoneNumber);
             log.info("已发送短信通知给骑手: {}", phoneNumber);
         } catch (Exception e) {
             log.error("发送短信通知失败", e);
@@ -242,15 +271,15 @@
     }
 
     @Override
-    public R orderPaymentCallback(UniPayCallbackResult uniPayCallbackResult) {
-        Order order = this.getBaseMapper().selectOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, uniPayCallbackResult.getR2_OrderNo()));
+    public R orderPaymentCallback(PayResult payResult) {
+        Order order = this.getBaseMapper().selectOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, payResult.getOrderNumber()));
         if(null == order || order.getPayStatus() == 2){
             return R.ok();
         }
         order.setOrderStatus(1);//待确认
         order.setPayStatus(2);//已支付
         order.setOrderTime(LocalDateTime.now());//下单时间
-        String r7TrxNo = uniPayCallbackResult.getR9_BankTrxNo();
+        String r7TrxNo = payResult.getTransactionId();
         order.setSerialNumber(r7TrxNo);
         this.updateById(order);
 
@@ -259,7 +288,14 @@
             log.warn("未找到社区ID={}对应的骑手", order.getCommunityId());
             return R.ok();
         }
-        //todo 短信通知
+        if (courier.get("status").equals("0")){
+            log.warn("当前社区骑手离职中,骑手id={}", courier.get("courierId"));
+            return R.ok();
+        }
+        Integer courierIdLong = (Integer) courier.get("courierId");
+        order.setCourierId(courierIdLong);
+        this.updateById(order);
+
         sendSmsNotificationToCourier(courier,order);
         //小程序弹窗通知
         notifyDeliveryPerson((Long) courier.get("id"), order,1);//1=新订单
@@ -283,11 +319,11 @@
                     continue;
                 }
                 //开始执行关闭订单操作
-                CloseOrderResult closeOrderResult = PaymentUtil.closeOrder(order.getOrderNumber());
-                if((null == closeOrderResult || !closeOrderResult.getRa_Status().equals("100")) &&
-                        Arrays.asList("0", "4", "101", "10080000", "10080002", "10083004", "10083005").contains(closeOrderResult.getRb_Code())){
+                //开始执行关闭订单操作
+                Map<String, String> map = wechatPayService.closeOrder(order.getOrderNumber());
+                if((null == map || !map.get("return_code").equals("SUCCESS"))){
                     redisTemplate.opsForZSet().add("OrderPayment", order.getOrderNumber(), 0);
-                    log.error("关闭订单失败:{}---->{}", order.getOrderNumber(), JSON.toJSONString(closeOrderResult));
+                    log.error("关闭订单失败:{}---->{}", order.getOrderNumber(), map.get("return_msg"));
                 }
                 redisTemplate.opsForZSet().remove("OrderPayment", order.getOrderNumber());
                 //删除订单
@@ -320,13 +356,13 @@
                 ||!Objects.equals(order.getAppUserId(), appuser.getId())){
             throw new ServiceException("订单id错误");
         }
-        if (order.getOrderStatus()!=1){
+        if (order.getOrderStatus()!=1 && order.getOrderStatus()!=2){
             throw new ServiceException("订单状态错误");
         }
         //判断地址簿id是否存在
         if (setConfirmOrderDTO.getAddressBookId()!=null){
             AddressBook addressBook = addressBookMapper.selectById(setConfirmOrderDTO.getAddressBookId());
-            if (addressBook==null||addressBook.getDel_flag().equals(DelFlagConstant.DELETE)){
+            if (addressBook==null||addressBook.getDelFlag().equals(DelFlagConstant.DELETE)){
                 throw new ServiceException("该地址簿id不存在");
             }
             if (!Objects.equals(addressBook.getCommunityId(), order.getCommunityId())){
@@ -392,13 +428,16 @@
     }
 
     @Override
-    public R refundPayMoneyCallback(RefundCallbackResult refundCallbackResult) {
-        String code = refundCallbackResult.getR3_RefundOrderNo().substring(1);
-        Order order = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, code));
+    public R refundPayMoneyCallback(String xmlData) {
+        RefundCallbackResult result = wechatPayService.processRefundCallback(xmlData);
+        if (!result.isSuccess()) {
+            return R.fail(result.getMsg());
+        }
+        Order order = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, result.getOrderNo()));
         if (null == order || order.getPayStatus() == 1 || order.getOrderStatus() == 6) {
             return R.ok();
         }
-        order.setRefundCode(refundCallbackResult.getR5_RefundTrxNo());
+        order.setRefundCode(result.getRefundNo());
         order.setRefundStatus(2);
         order.setRefundTime(LocalDateTime.now());
         this.updateById(order);
@@ -411,7 +450,7 @@
         OrderTopInfoVO orderTopInfoVO = new OrderTopInfoVO();
         //总金额
         Map<String, Object> total = this.baseMapper.getOrderTopInfoByDate(communityId,null,null);
-        orderTopInfoVO.setTodayOrderNum(Integer.valueOf(String.valueOf(total.get("num"))) );
+        orderTopInfoVO.setTotalOrderNum(Integer.valueOf(String.valueOf(total.get("num"))) );
         orderTopInfoVO.setTotalOrderAmount(new BigDecimal(String.valueOf(total.get("amount"))));
 
         //今日
@@ -467,6 +506,7 @@
     public IPage<FinanceStatisticsVO> financeStatistics(FinanceStatisticsDTO dto) {
         //查询出总的数量
         IPage<FinanceStatisticsVO> page = new Page<>();
+        dto.setPageNum(Math.max(dto.getPageNum() - 1, 0)*dto.getPageSize());
         page.setTotal(this.getBaseMapper().selectPageTotal(dto));
         List<FinanceStatisticsVO> list=this.getBaseMapper().financeStatistics(dto);
         page.setRecords(list);
@@ -584,14 +624,17 @@
      */
     public R refundPayMoney(Order order) {
         //开始退款
-        BigDecimal paymentAmount = order.getPaymentAmount();
         if (BigDecimal.ZERO.compareTo(order.getPaymentAmount()) < 0) {//支付的金额是否大于0
             //微信退款
-            RefundResult refund = PaymentUtil.refund(order.getOrderNumber(), "R" + order.getOrderNumber(), paymentAmount.doubleValue(),
-                    "/app/order/refundPayMoneyCallback");
-            if (!"100".equals(refund.getRa_Status())) {
-                return R.fail(refund.getRc_CodeMsg());//退款失败
+            Map<String,String> map = wechatPayService.refund(order.getOrderNumber(), order.getOrderNumber(), order.getPaymentAmount().toString(), order.getPaymentAmount().toString(), "退款", "/order/refundPayMoneyCallback");
+
+            if (!"SUCCESS".equals(map.get("return_code"))) {
+                return R.fail(map.get("return_msg"));//退款失败
             }
+            //这里申请成功后先返回
+            order.setRefundStatus(1);
+            this.updateById(order);
+            return R.ok();
         }
         return R.ok();
     }
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/PhoneServiceImpl.java b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/PhoneServiceImpl.java
index 5b33142..ab8d0ff 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/PhoneServiceImpl.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/PhoneServiceImpl.java
@@ -24,20 +24,22 @@
         AppUser appuser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
         //查找小区客服
         Phone phone = this.getBaseMapper().selectOne(new LambdaUpdateWrapper<Phone>().eq(Phone::getType, 2)
-                .eq(Phone::getCommunity_id, appuser.getCommunityId()));
+                .eq(Phone::getCommunityId, appuser.getCommunityId()));
         if (phone!=null){
             return phone.getPhone();
         }
         //查找平台客服
         List<Phone> list = this.getBaseMapper().selectList(new LambdaUpdateWrapper<Phone>().eq(Phone::getType, 1));
+        if (list.size()>0){}
         return list.get(0).getPhone();
     }
 
     @Override
     public void saveServicePhone(String phone) {
         Phone phoneEntity = this.getBaseMapper().selectOne(new LambdaUpdateWrapper<Phone>().eq(Phone::getType, 1));
-        if (phoneEntity!=null){
+        if (phoneEntity==null){
             //不存在
+            phoneEntity = new Phone();
             phoneEntity.setType(1);
             phoneEntity.setPhone(phone);
             this.save(phoneEntity);
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/ReportServiceImpl.java b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/ReportServiceImpl.java
index e727f82..d2c09c9 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/ReportServiceImpl.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/ReportServiceImpl.java
@@ -10,6 +10,7 @@
 import com.ruoyi.errand.domain.AppUser;
 import com.ruoyi.errand.domain.Report;
 import com.ruoyi.errand.mapper.ReportMapper;
+import com.ruoyi.errand.object.dto.app.AddRegisterReportDTO;
 import com.ruoyi.errand.object.dto.app.AddReportDTO;
 import com.ruoyi.errand.object.dto.sys.ReportPageListDTO;
 import com.ruoyi.errand.object.vo.sys.CourierPageListVO;
@@ -26,11 +27,14 @@
 
     @Override
     public void add(AddReportDTO addReportDTO) {
-        AppUser appUser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
         Report report = new Report();
-        BeanUtils.copyProperties(addReportDTO,report);
-        report.setAppUserId(appUser.getId());
+        report.setRegionId(addReportDTO.getRegionId());
+        report.setCommunityName(addReportDTO.getCommunityName());
+        report.setAddressDetail(addReportDTO.getAddressDetail());
+        report.setPhone(addReportDTO.getPhone());
+        report.setUsername(addReportDTO.getUsername());
         report.setStatus(StatusConstant.UN_DISPOSE);
+        report.setCreateTime(LocalDateTime.now());
         this.save(report);
     }
 
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/VipOrderServiceImpl.java b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/VipOrderServiceImpl.java
index 849a970..c4ced41 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/VipOrderServiceImpl.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/VipOrderServiceImpl.java
@@ -14,11 +14,14 @@
 import com.ruoyi.errand.mapper.VipOrderMapper;
 import com.ruoyi.errand.mapper.VipSettingMapper;
 import com.ruoyi.errand.object.dto.app.VipPaymentDTO;
+import com.ruoyi.errand.object.vo.sys.OrderSysDetailVO;
 import com.ruoyi.errand.service.VipOrderService;
 import com.ruoyi.errand.utils.CloseOrderResult;
 import com.ruoyi.errand.utils.PaymentUtil;
 import com.ruoyi.errand.utils.UniPayCallbackResult;
 import com.ruoyi.errand.utils.UniPayResult;
+import com.ruoyi.errand.utils.wx.PayResult;
+import com.ruoyi.errand.utils.wx.WechatPayService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.security.core.context.SecurityContextHolder;
@@ -29,10 +32,7 @@
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.ZoneOffset;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 
 @Service
 @Slf4j
@@ -43,6 +43,8 @@
     private RedisTemplate redisTemplate;
     @Resource
     private AppUserMapper appUserMapper;
+    @Resource
+    private WechatPayService wechatPayService;
 
     @Override
     public R vipPayment(VipPaymentDTO vipPaymentDTO) {
@@ -51,8 +53,8 @@
         vipOrder.setAppUserId(appuser.getId());
 
         VipSetting vipSetting = vipSettingMapper.selectById(vipPaymentDTO.getId());
-        vipOrder.setOrderAmount(vipSetting.getVip_price());
-        vipOrder.setPaymentAmount(vipSetting.getVip_price());
+        vipOrder.setOrderAmount(vipSetting.getVipPrice());
+        vipOrder.setPaymentAmount(vipSetting.getVipPrice());
         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
         vipOrder.setOrderNumber("QJS" + getNumber(3) + sdf.format(new Date()));
         vipOrder.setPayStatus(1);
@@ -62,23 +64,28 @@
         BigDecimal paymentMoney = vipOrder.getOrderAmount();
         if ( BigDecimal.ZERO.compareTo(paymentMoney) < 0){
             //调起微信支付
-            String vipName = vipSetting.getVip_name();
-            UniPayResult uniPayResult = PaymentUtil.uniPay(vipOrder.getOrderNumber(), paymentMoney.doubleValue(),  "购买会员",
-                    vipName, "", "/app/vipOrder/orderPaymentCallback", appuser.getWxOpenid(), null);
-            if(null == uniPayResult || !"100".equals(uniPayResult.getRa_Code())){
-                return R.fail(null == uniPayResult ? "支付失败" : uniPayResult.getRb_CodeMsg());
+            String vipName = vipSetting.getVipName();
+            try {
+                R r = wechatPayService.unifiedOrder(vipOrder.getId().toString(), vipOrder.getOrderNumber(), paymentMoney.toString(), "购买"+vipName,appuser.getWxOpenid(),"/app/vipOrder/orderPaymentCallback");
+                if (null == r || 200 != r.getCode()) {
+                    //支付失败 删除订单
+                    vipOrder.setDelFlag(1);
+                    this.updateById(vipOrder);
+                    //返回报错信息
+                    return R.fail(null == r ? "支付失败" : r.getMsg());
+                }
+                //将支付数据添加到redis队列中,便于定时任务去校验是否完成支付,没有完成支付支付,15分钟后关闭订单。
+                long second = LocalDateTime.now().plusMinutes(15).toEpochSecond(ZoneOffset.UTC);
+                redisTemplate.opsForZSet().add("VipOrderPayment", vipOrder.getOrderNumber(), second);
+                return r;
+            } catch (Exception e) {
+                throw new RuntimeException(e);
             }
-            String rc_result = uniPayResult.getRc_Result();
-            JSONObject jsonObject = JSON.parseObject(rc_result);
-            jsonObject.put("orderId", vipOrder.getId().toString());
-            //将支付数据添加到redis队列中,便于定时任务去校验是否完成支付,没有完成支付支付,15分钟后关闭订单。
-            long second = LocalDateTime.now().plusMinutes(15).toEpochSecond(ZoneOffset.UTC);
-            redisTemplate.opsForZSet().add("VipOrderPayment", vipOrder.getOrderNumber(), second);
-            return R.ok(jsonObject.toJSONString());
         }
         //设置vipOrder信息
         vipOrder.setPayStatus(2);//已支付
         vipOrder.setOrderTime(LocalDateTime.now());//下单时间
+        vipOrder.setOrderStatus(4);
         this.updateById(vipOrder);
         //更新用户信息
         Long appUserId = vipOrder.getAppUserId();
@@ -96,16 +103,17 @@
     }
 
     @Override
-    public R orderPaymentCallback(UniPayCallbackResult uniPayCallbackResult) {
-        VipOrder vipOrder = this.getBaseMapper().selectOne(new LambdaQueryWrapper<VipOrder>().eq(VipOrder::getOrderNumber, uniPayCallbackResult.getR2_OrderNo()));
+    public R orderPaymentCallback(PayResult payResult) {
+        VipOrder vipOrder = this.getBaseMapper().selectOne(new LambdaQueryWrapper<VipOrder>().eq(VipOrder::getOrderNumber, payResult.getOrderNumber()));
         if(null == vipOrder || vipOrder.getPayStatus() == 2){
             return R.ok();
         }
         //设置vipOrder信息
         vipOrder.setPayStatus(2);//已支付
         vipOrder.setOrderTime(LocalDateTime.now());//下单时间
-        String r7TrxNo = uniPayCallbackResult.getR9_BankTrxNo();
+        String r7TrxNo = payResult.getTransactionId();
         vipOrder.setSerialNumber(r7TrxNo);
+        vipOrder.setOrderStatus(4);
         this.updateById(vipOrder);
         //更新用户信息
         //检查是否续期的
@@ -120,6 +128,7 @@
         // 根据 vipId 计算会员到期时间
         LocalDateTime endTime = calculateEndTime(appUser.getEndTime(), vipOrder.getVipId());
         appUser.setEndTime(endTime);
+
         appUserMapper.updateById(appUser);
         return R.ok();
     }
@@ -138,11 +147,10 @@
                     continue;
                 }
                 //开始执行关闭订单操作
-                CloseOrderResult closeOrderResult = PaymentUtil.closeOrder(order.getOrderNumber());
-                if((null == closeOrderResult || !closeOrderResult.getRa_Status().equals("100")) &&
-                        Arrays.asList("0", "4", "101", "10080000", "10080002", "10083004", "10083005").contains(closeOrderResult.getRb_Code())){
+                Map<String, String> map = wechatPayService.closeOrder(order.getOrderNumber());
+                if((null == map || !map.get("return_code").equals("SUCCESS"))){
                     redisTemplate.opsForZSet().add("VipOrderPayment", order.getOrderNumber(), 0);
-                    log.error("关闭订单失败:{}---->{}",order.getOrderNumber(), JSON.toJSONString(closeOrderResult));
+                    log.error("关闭订单失败:{}---->{}", order.getOrderNumber(), map.get("return_msg"));
                 }
                 redisTemplate.opsForZSet().remove("VipOrderPayment", order.getOrderNumber());
                 //删除订单
@@ -153,6 +161,12 @@
         }
     }
 
+    @Override
+    public OrderSysDetailVO detail(Integer id) {
+
+        return this.getBaseMapper().detail(id);
+    }
+
 
     private LocalDateTime calculateEndTime(LocalDateTime startTime, Integer vipId) {
         switch (vipId) {
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/VipSettingServiceImpl.java b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/VipSettingServiceImpl.java
index 7aca788..1c31c1f 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/VipSettingServiceImpl.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/VipSettingServiceImpl.java
@@ -1,17 +1,26 @@
 package com.ruoyi.errand.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.errand.domain.Agreement;
 import com.ruoyi.errand.domain.VipSetting;
 import com.ruoyi.errand.mapper.VipSettingMapper;
+import com.ruoyi.errand.object.dto.app.AgreementDTO;
 import com.ruoyi.errand.object.dto.sys.SetPriceDTO;
 import com.ruoyi.errand.object.vo.app.VipInfoListVO;
+import com.ruoyi.errand.service.AgreementService;
 import com.ruoyi.errand.service.VipSettingService;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.util.Arrays;
 import java.util.List;
 
 @Service
 public class VipSettingServiceImpl extends ServiceImpl<VipSettingMapper, VipSetting> implements VipSettingService {
+    @Resource
+    private AgreementService agreementService;
 
     @Override
     public List<VipInfoListVO> getVipInfoList() {
@@ -20,21 +29,45 @@
 
     @Override
     public void setPrice(SetPriceDTO setPriceDTO) {
-        VipSetting byId = this.getById(setPriceDTO.getId());
-        if (byId == null) {
-            byId=new VipSetting();
-            byId.setId(setPriceDTO.getId());
-            if (setPriceDTO.getId()==1) byId.setVip_name("月卡会员");
-            if (setPriceDTO.getId()==2) byId.setVip_name("季卡会员");
-            if (setPriceDTO.getId()==3) byId.setVip_name("半年卡会员");
-            if (setPriceDTO.getId()==4) byId.setVip_name("年卡会员");
-            byId.setVip_price(setPriceDTO.getVip_price());
-            this.save(byId);
-        }else {
-            byId.setVip_price(setPriceDTO.getVip_price());
-            this.updateById(byId);
+        List<VipSetting> vipSettings = this.baseMapper.selectList(new LambdaQueryWrapper<VipSetting>().in(VipSetting::getId, Arrays.asList(1, 2, 3, 4)));
+        vipSettings.forEach(vipSetting -> {
+            if (vipSetting.getId()==1) vipSetting.setVipPrice(setPriceDTO.getVipPriceOne());
+            if (vipSetting.getId()==2) vipSetting.setVipPrice(setPriceDTO.getVipPriceTwo());
+            if (vipSetting.getId()==3) vipSetting.setVipPrice(setPriceDTO.getVipPriceThree());
+            if (vipSetting.getId()==4) vipSetting.setVipPrice(setPriceDTO.getVipPriceFour());
+        });
+        this.updateBatchById(vipSettings);
+
+
+        //设置会员协议
+        Agreement one = agreementService.getOne(new LambdaQueryWrapper<Agreement>().eq(Agreement::getType,8));
+        if (one!=null){
+            agreementService.removeById(one);
         }
 
+        Agreement agreement = new Agreement();
+        agreement.setType(8);
+        agreement.setContent(setPriceDTO.getContent());
+        agreementService.save(agreement);
+    }
+
+    @Override
+    public SetPriceDTO getPrice() {
+        SetPriceDTO setPriceDTO = new SetPriceDTO();
+        List<VipSetting> vipSettings = this.baseMapper.selectList(new LambdaQueryWrapper<VipSetting>().in(VipSetting::getId, Arrays.asList(1, 2, 3, 4)));
+        vipSettings.forEach(vipSetting -> {
+            if (vipSetting.getId()==1) setPriceDTO.setVipPriceOne(vipSetting.getVipPrice());
+            if (vipSetting.getId()==2) setPriceDTO.setVipPriceTwo(vipSetting.getVipPrice());
+            if (vipSetting.getId()==3) setPriceDTO.setVipPriceThree(vipSetting.getVipPrice());
+            if (vipSetting.getId()==4) setPriceDTO.setVipPriceFour(vipSetting.getVipPrice());
+        });
+        //会员协议
+        Agreement one = agreementService.getOne(new LambdaQueryWrapper<Agreement>().eq(Agreement::getType,8));
+        if (one!=null){
+            setPriceDTO.setContent(one.getContent());
+        }
+
+        return setPriceDTO;
     }
 
 }
\ No newline at end of file
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/utils/SMSUtil.java b/pt-errand/src/main/java/com/ruoyi/errand/utils/SMSUtil.java
index 3d8df5c..49bfdae 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/utils/SMSUtil.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/utils/SMSUtil.java
@@ -42,12 +42,12 @@
 		try {
 			//必填,请参考"开发准备"获取如下数据,替换为实际值
 			String url = "https://smsapi.cn-north-4.myhuaweicloud.com:443/sms/batchSendSms/v1"; //APP接入地址+接口访问URI
-			String appKey = ""; //todo APP_Key
-			String appSecret = ""; //APP_Secret
+			String appKey = "wxedd7aefdfaf897cf"; //todo APP_Key
+			String appSecret = "e1a8dba539294da6b935e8f0f3b09aac"; //APP_Secret
 			
 			//条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称
 			//国际/港澳台短信不用关注该参数
-			String signature = "社区代办"; //签名名称
+			String signature = "玮儿科技"; //签名名称
 			
 			//必填,全局号码格式(包含国家码),示例:+8615123456789,多个号码之间用英文逗号分隔
 			String receiver = "+86" + phone; //短信接收人号码
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/utils/WXCore.java b/pt-errand/src/main/java/com/ruoyi/errand/utils/WXCore.java
index ceb0113..6504431 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/utils/WXCore.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/utils/WXCore.java
@@ -7,7 +7,7 @@
 
     private static final String WATERMARK = "watermark";
 
-    @Value("${wx.appletsAppid}")
+    @Value("${wx.appid}")
     private static String appid ;
 
 
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/utils/WeChatUtil.java b/pt-errand/src/main/java/com/ruoyi/errand/utils/WeChatUtil.java
index 8cf2513..6ee2305 100644
--- a/pt-errand/src/main/java/com/ruoyi/errand/utils/WeChatUtil.java
+++ b/pt-errand/src/main/java/com/ruoyi/errand/utils/WeChatUtil.java
@@ -33,7 +33,7 @@
 @Component
 public class WeChatUtil {
 
-    @Value("${wx.appletsAppid}")
+    @Value("${wx.appid}")
     private String wxAppletsAppid;
 
     @Value("${wx.appletsAppSecret}")
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/utils/sms/AliyunSmsService.java b/pt-errand/src/main/java/com/ruoyi/errand/utils/sms/AliyunSmsService.java
new file mode 100644
index 0000000..8acb750
--- /dev/null
+++ b/pt-errand/src/main/java/com/ruoyi/errand/utils/sms/AliyunSmsService.java
@@ -0,0 +1,142 @@
+package com.ruoyi.errand.utils.sms;
+
+import com.aliyuncs.CommonRequest;
+import com.aliyuncs.CommonResponse;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.exceptions.ServerException;
+import com.aliyuncs.http.MethodType;
+import com.aliyuncs.profile.DefaultProfile;
+import org.springframework.stereotype.Service;
+
+
+public class AliyunSmsService {
+
+    // 阿里云短信服务配置
+    private static final String ACCESS_KEY_ID = "LTAI5tRtwxPMw8aohbLLcjjo";
+    private static final String ACCESS_KEY_SECRET = "NSKeley8OjCsl7AQJnDKxPIh1dIaOu";
+    private static final String SIGN_NAME = "玮儿科技";
+    private static final String TEMPLATE_CODE = "SMS_319401491";
+    // 新增跑腿员接单提醒模板 CODE
+    private static final String TEMPLATE_CODE_ORDER = "SMS_489100144";
+    /**
+     * 发送短信验证码
+     * @param phoneNumber 手机号码
+     * @param code 验证码
+     * @return 是否发送成功
+     */
+    public static boolean sendVerificationCode(String phoneNumber, String code) {
+        // 初始化客户端
+        DefaultProfile profile = DefaultProfile.getProfile(
+            "cn-chengdu",
+                ACCESS_KEY_ID,
+                ACCESS_KEY_SECRET
+        );
+        IAcsClient client = new DefaultAcsClient(profile);
+        
+        // 构建请求
+        CommonRequest request = new CommonRequest();
+        request.setSysMethod(MethodType.POST);
+        request.setSysDomain("dysmsapi.aliyuncs.com");
+        request.setSysVersion("2017-05-25");
+        request.setSysAction("SendSms");
+        
+        // 设置请求参数
+        request.putQueryParameter("RegionId", "cn-hangzhou");
+        request.putQueryParameter("PhoneNumbers", phoneNumber);
+        request.putQueryParameter("SignName", SIGN_NAME);
+        request.putQueryParameter("TemplateCode", TEMPLATE_CODE);
+        
+        // 模板参数JSON,根据实际模板调整
+        String templateParam = String.format("{\"code\":\"%s\"}", code);
+        request.putQueryParameter("TemplateParam", templateParam);
+        
+        try {
+            // 发送请求并获取响应
+            CommonResponse response = client.getCommonResponse(request);
+            System.out.println(response.getData());
+            
+            // 解析响应结果
+            return response.getHttpStatus() == 200 && 
+                   response.getData().contains("\"Code\":\"OK\"");
+        } catch (ServerException e) {
+            e.printStackTrace();
+        } catch (ClientException e) {
+            e.printStackTrace();
+        }
+        
+        return false;
+    }
+    
+    /**
+     * 生成随机验证码
+     * @param length 验证码长度
+     * @return 随机验证码
+     */
+    public static String generateVerificationCode(int length) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < length; i++) {
+            sb.append((int)(Math.random() * 10));
+        }
+        return sb.toString();
+    }
+    /**
+     * 发送跑腿员接单提醒短信
+     * @param phoneNumber 跑腿员手机号码
+     * @return 是否发送成功
+     */
+    public static boolean sendOrderRemindSms(String phoneNumber) {
+        // 初始化客户端(复用已有的配置)
+        DefaultProfile profile = DefaultProfile.getProfile(
+                "cn-chengdu",
+                ACCESS_KEY_ID,
+                ACCESS_KEY_SECRET
+        );
+        IAcsClient client = new DefaultAcsClient(profile);
+
+        // 构建请求
+        CommonRequest request = new CommonRequest();
+        request.setSysMethod(MethodType.POST);
+        request.setSysDomain("dysmsapi.aliyuncs.com");
+        request.setSysVersion("2017-05-25");
+        request.setSysAction("SendSms");
+
+        // 设置请求参数
+        request.putQueryParameter("RegionId", "cn-hangzhou");
+        request.putQueryParameter("PhoneNumbers", phoneNumber);
+        request.putQueryParameter("SignName", SIGN_NAME);
+        request.putQueryParameter("TemplateCode", TEMPLATE_CODE_ORDER);
+
+        // 该模板无自定义变量,传空 JSON(根据模板实际情况,若有变量需按格式填充)
+        request.putQueryParameter("TemplateParam", "{}");
+
+        try {
+            // 发送请求并获取响应
+            CommonResponse response = client.getCommonResponse(request);
+            System.out.println(response.getData());
+
+            // 解析响应结果
+            return response.getHttpStatus() == 200 &&
+                    response.getData().contains("\"Code\":\"OK\"");
+        } catch (ServerException e) {
+            e.printStackTrace();
+        } catch (ClientException e) {
+            e.printStackTrace();
+        }
+
+        return false;
+    }
+
+
+    public static void main(String[] args) {
+      /*  String phoneNumber = "19923261698";
+        boolean result = sendVerificationCode(phoneNumber,"123123");
+        System.out.println("短信发送结果:" + result);*/
+        // 测试发送接单提醒
+        String phoneNumberOrder = "19923261698"; // 替换为实际跑腿员手机号
+        boolean resultOrder = sendOrderRemindSms(phoneNumberOrder);
+        System.out.println("接单提醒短信发送结果:" + resultOrder);
+
+    }
+}
\ No newline at end of file
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/utils/wx/HttpUtil.java b/pt-errand/src/main/java/com/ruoyi/errand/utils/wx/HttpUtil.java
new file mode 100644
index 0000000..a16d47f
--- /dev/null
+++ b/pt-errand/src/main/java/com/ruoyi/errand/utils/wx/HttpUtil.java
@@ -0,0 +1,99 @@
+package com.ruoyi.errand.utils.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/pt-errand/src/main/java/com/ruoyi/errand/utils/wx/PayResult.java b/pt-errand/src/main/java/com/ruoyi/errand/utils/wx/PayResult.java
new file mode 100644
index 0000000..125c461
--- /dev/null
+++ b/pt-errand/src/main/java/com/ruoyi/errand/utils/wx/PayResult.java
@@ -0,0 +1,16 @@
+package com.ruoyi.errand.utils.wx;
+
+import lombok.Data;
+
+/**
+ * 支付结果VO
+ */
+@Data
+public class PayResult {
+    // 订单ID
+    private String orderNumber;
+    // 微信交易ID
+    private String transactionId;
+    // 支付金额
+    private String totalFee;
+}
diff --git a/pt-errand/src/main/java/com/ruoyi/errand/utils/wx/RefundCallbackResult.java b/pt-errand/src/main/java/com/ruoyi/errand/utils/wx/RefundCallbackResult.java
new file mode 100644
index 0000000..5df011a
--- /dev/null
+++ b/pt-errand/src/main/java/com/ruoyi/errand/utils/wx/RefundCallbackResult.java
@@ -0,0 +1,38 @@
+package com.ruoyi.errand.utils.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/pt-errand/src/main/java/com/ruoyi/errand/utils/wx/WechatPayConfig.java b/pt-errand/src/main/java/com/ruoyi/errand/utils/wx/WechatPayConfig.java
new file mode 100644
index 0000000..f4df334
--- /dev/null
+++ b/pt-errand/src/main/java/com/ruoyi/errand/utils/wx/WechatPayConfig.java
@@ -0,0 +1,28 @@
+package com.ruoyi.errand.utils.wx;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+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/pt-errand/src/main/java/com/ruoyi/errand/utils/wx/WechatPayService.java b/pt-errand/src/main/java/com/ruoyi/errand/utils/wx/WechatPayService.java
new file mode 100644
index 0000000..0dfc093
--- /dev/null
+++ b/pt-errand/src/main/java/com/ruoyi/errand/utils/wx/WechatPayService.java
@@ -0,0 +1,727 @@
+package com.ruoyi.errand.utils.wx;
+
+
+import com.alibaba.fastjson2.JSON;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.errand.utils.MD5AndKL;
+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/pt-errand/src/main/java/com/ruoyi/errand/utils/wx/XMLUtil.java b/pt-errand/src/main/java/com/ruoyi/errand/utils/wx/XMLUtil.java
new file mode 100644
index 0000000..853be0f
--- /dev/null
+++ b/pt-errand/src/main/java/com/ruoyi/errand/utils/wx/XMLUtil.java
@@ -0,0 +1,52 @@
+package com.ruoyi.errand.utils.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/pt-errand/src/main/resources/cert/apiclient_cert.p12 b/pt-errand/src/main/resources/cert/apiclient_cert.p12
new file mode 100644
index 0000000..de77c9d
--- /dev/null
+++ b/pt-errand/src/main/resources/cert/apiclient_cert.p12
Binary files differ
diff --git a/pt-errand/src/main/resources/cert/apiclient_cert.pem b/pt-errand/src/main/resources/cert/apiclient_cert.pem
new file mode 100644
index 0000000..28eac31
--- /dev/null
+++ b/pt-errand/src/main/resources/cert/apiclient_cert.pem
@@ -0,0 +1,25 @@
+-----BEGIN CERTIFICATE-----
+MIIEITCCAwmgAwIBAgIUPUgZIaX6EgOwzfLoTtFUMq/kxWcwDQYJKoZIhvcNAQEL
+BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
+FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
+Q0EwHhcNMjUwNjE2MDI1MzAyWhcNMzAwNjE1MDI1MzAyWjB7MRMwEQYDVQQDDAox
+NzE5ODYyOTAyMRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xJzAlBgNVBAsM
+HuS6keWNl+eOruWEv+enkeaKgOaciemZkOWFrOWPuDELMAkGA1UEBhMCQ04xETAP
+BgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
+6o6cHFkmgta28WJV9LeAKSuNIdzqtOuJRalZQEEYb4XRVek5ayeibscB0EZxZ3W+
+qKPPnthXNxLRROPmoGfqE/2Nkpvkd/wRwAesr+PuhEjU2MLdhwcXrO3zGARiJUZO
+EF0iEdB4/rCQHJzeFU0DGA4fCOx12VSk133HYY3otsbIBoPQzPmeGkRl1TkbXn0B
+wV+478FcJtp+UdWlbnu1O8Y+wcF7P5WWtk1JTT76injNdUc4E+evqL01z12MnFzR
+f7QMzMuA5WXbe5aW/LlZZn2M7VsCJeke0hwnagbq/Yh9r85dEoFsuYqv9sf75HBM
+thLrfS+aYkmhcbi6B49opQIDAQABo4G5MIG2MAkGA1UdEwQCMAAwCwYDVR0PBAQD
+AgP4MIGbBgNVHR8EgZMwgZAwgY2ggYqggYeGgYRodHRwOi8vZXZjYS5pdHJ1cy5j
+b20uY24vcHVibGljL2l0cnVzY3JsP0NBPTFCRDQyMjBFNTBEQkMwNEIwNkFEMzk3
+NTQ5ODQ2QzAxQzNFOEVCRDImc2c9SEFDQzQ3MUI2NTQyMkUxMkIyN0E5RDMzQTg3
+QUQxQ0RGNTkyNkUxNDAzNzEwDQYJKoZIhvcNAQELBQADggEBAJ30OsPQNRyZtEGU
+z8Exw5xrP+ag3Og5r2n3CYsGldYz5e1nlAsiKBKput+lq3Bn/sbD1h0AFE+lAVOk
+Jq0YdFVbjAiu85/ATdSY5YtCNKTGuEW+gLUWrR/H4SLBHjmBPTVQ6F717V+6KQz4
+Xqx/licZkanRTlYlRYh+/zBnQptI/9KD6Ee6WjeyJXFNFdApXQMsdSYNkOQQ9E1B
+jEUjoNNZWcCGWEsePHIPlC8r8fhZ6Lb2vVotTsxl3wEWqa+StCPd7Bz3/OtRlYxQ
+gA5AMB22CAgcZLvmiQjcwBmc8X69FiXvaC4xai0QneLktoUJI8OEoRpl/Po5RDaM
+nJodWMA=
+-----END CERTIFICATE-----
diff --git a/pt-errand/src/main/resources/cert/apiclient_key.pem b/pt-errand/src/main/resources/cert/apiclient_key.pem
new file mode 100644
index 0000000..f236417
--- /dev/null
+++ b/pt-errand/src/main/resources/cert/apiclient_key.pem
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDqjpwcWSaC1rbx
+YlX0t4ApK40h3Oq064lFqVlAQRhvhdFV6TlrJ6JuxwHQRnFndb6oo8+e2Fc3EtFE
+4+agZ+oT/Y2Sm+R3/BHAB6yv4+6ESNTYwt2HBxes7fMYBGIlRk4QXSIR0Hj+sJAc
+nN4VTQMYDh8I7HXZVKTXfcdhjei2xsgGg9DM+Z4aRGXVORtefQHBX7jvwVwm2n5R
+1aVue7U7xj7BwXs/lZa2TUlNPvqKeM11RzgT56+ovTXPXYycXNF/tAzMy4DlZdt7
+lpb8uVlmfYztWwIl6R7SHCdqBur9iH2vzl0SgWy5iq/2x/vkcEy2Eut9L5piSaFx
+uLoHj2ilAgMBAAECggEAL5Cf47fIcXvtOWIBoFCd8rtcMWPFTM7+1VuUN817kRIH
+824KMMqmy+QbYAsI8DwWX8hoUAP7G7X7LgcxO5IXC9q9HN/0IsjBKLnlsP193uGO
+GC7cEYfEq1LNmy84X+qz5emdARPPlYZkkwjUmGk3mWczr/GTrHDXxMNC7WuDp5yg
+icBweawlSnpT0w2qjg/OdrIA25j9jpfT7DSfd0O8yxkhLvGEgY8i8/MYgpmE6MBF
+qE0SOdw0olTPlyXt7nRat90A3rFrl6VnIYjL8Q3GXtQ83YW9jQtNwkfQYfeX1ZBr
+HvwZHyC1agDFeqq+0meZf05uhlnPObmBNs4+JLKJ+QKBgQD5A5TZAU2W5wclZQKS
+veV2tSEnv1V/qmw3upyJbf3qrvWprNhCFAywjJADLATSGhPAqrvTFuVhiwPnDqB3
+yASMw+Ealsk8ZE6ZTbk1JT9PzpJoAP21OnwS10iC46NRwdGbmS9vKBKBTPxRKOi2
+kvzspgMti/Jg55hKkJj4QcXrSwKBgQDxIzLiLkjYft8g+aRqRlIIl4EIH8gHpG6J
+Fab9VoiTwEkzCJuk54GRxZyExxPflSneDJALvvmgoHNY7KDIdxHcP8c4aOUjFRXl
+KUgba6Zt+n4pjQqazW/X+pC2LHjAswWnbQxDCGi+wna5z8FscAgVnVW0/UqGHWi9
+Y5SzgAsVzwKBgQCoYvibidsK6S0W52hHDKyHilJiS2soinjlcoZ6FGv479jlpSEU
+BfTSyip0Sqbz4Hhs98dNJhV00YmRDH4MobAZ9DdbQI3SDc5ssndEbeyTLhAozkrB
+60uNfhDlmcON/K+eNYcy9nkVAJc61pwPIfRwno5VlWYQi2ubOI6IigmpYwKBgE1j
+l4wBgL2Ckke59utooCFDxlR+JqtVOWhje5FouTJ6DsQDKjiVV/8Zpa7zWUxzSdmK
+vJwYcXL8q6hJYRyVIjVGfsB64bcNqFZAlnS+as53CxB4xIOEFTYCo3jj8ukdS149
+YCcPRtaaAJKHu7L6jY2qTfxlIgrC23+Uuv+Uw3n/AoGBAK3cveuP64WTfXhlHlJn
+v2SJzmIG1Clvcz091+CJRC6i0UL8QjxCadzTtJu5FyRONje8LNSVeG6IdPSHXDQF
+deiGbWmVLEBItOQBTlMcgEsy7kgcWG5FPOjgWjMbtJe1bSI9TtMdlkgFxfInHGYK
+bJbmLc3vMs/ZsZntBX28f0pB
+-----END PRIVATE KEY-----
diff --git a/pt-errand/src/main/resources/mapper/AddressBookMapper.xml b/pt-errand/src/main/resources/mapper/AddressBookMapper.xml
index 9b99b14..0130eb0 100644
--- a/pt-errand/src/main/resources/mapper/AddressBookMapper.xml
+++ b/pt-errand/src/main/resources/mapper/AddressBookMapper.xml
@@ -10,25 +10,28 @@
             recipient_name,
             recipient_phone,
             address_detail,
-            is_default
+            is_default,
+            region_extend
         from
             t_address_book
         where
             del_flag = 0
         and community_id =#{communityId}
         and app_user_id =#{userId}
-        ORDER BY tab.is_default DESC , tab.create_time DESC
+        ORDER BY is_default DESC , create_time DESC
     </select>
 
     <select id="addressBookList" resultType="com.ruoyi.errand.object.vo.app.AddressBookListVO">
         select
             tab.id,
             tab.community_id,
-            tc.communityName,
+            tc.name communityName,
             tab.recipient_name,
             tab.recipient_phone,
             tab.address_detail,
-            tab.is_default
+            tab.is_default,
+            tc.region_id,
+            tab.region_extend
         from
             t_address_book  tab
         inner join
diff --git a/pt-errand/src/main/resources/mapper/AppUserMapper.xml b/pt-errand/src/main/resources/mapper/AppUserMapper.xml
index a963aca..0ad4696 100644
--- a/pt-errand/src/main/resources/mapper/AppUserMapper.xml
+++ b/pt-errand/src/main/resources/mapper/AppUserMapper.xml
@@ -15,7 +15,8 @@
             tau.phone as phone,
             tau.vip_id AS vipId,
             tau.first_order as isFirstOrder,
-            tau.end_time as endTime
+            tau.end_time as endTime,
+            tau.region_extend
         FROM
             t_app_user tau
                 LEFT JOIN
@@ -44,7 +45,9 @@
             tau.sex,
             tau.vip_id,
             tvs.vip_name as vipName,
-            tau.endTime
+            tau.end_time,
+            tau.birthday,
+            tau.region_extend
         from
             t_app_user tau
         left join
@@ -59,7 +62,8 @@
     </select>
 
     <select id="countByCreateTimeBetween" resultType="java.lang.Integer">
-        SELECT COUNT(*) FROM t_app_user WHERE create_time BETWEEN #{start} AND #{end}  and del_flag=0 and status !=3
+        SELECT COUNT(*) FROM t_app_user WHERE create_time BETWEEN #{start} AND #{end}
+--                                           and del_flag=0 and status !=3
     </select>
 
     <select id="countGroupByDate" resultType="java.util.Map">
@@ -90,8 +94,10 @@
     <select id="getCourierByCommunityId" resultType="java.util.Map">
         select
             tau.id as `id`,
+            tc.id as courierId,
             tau.wx_openid as `openid`,
-            tc.phone as `phone`
+            tc.phone as `phone`,
+            tc.status as status
         from
             t_community_courier tcc
         left join t_app_user tau on tcc.courier_id = tau.courier_id
@@ -125,7 +131,7 @@
             and end_time &lt;  CURRENT_TIMESTAMP or end_time is null
         </if>
         <if test="dto.status!=null  ">
-            and status =#{status}
+            and status =#{dto.status}
         </if>
     </select>
 
diff --git a/pt-errand/src/main/resources/mapper/CommunityMapper.xml b/pt-errand/src/main/resources/mapper/CommunityMapper.xml
index 4b9dfda..c86d881 100644
--- a/pt-errand/src/main/resources/mapper/CommunityMapper.xml
+++ b/pt-errand/src/main/resources/mapper/CommunityMapper.xml
@@ -16,6 +16,9 @@
     <select id="getTotalCommunityList" resultType="com.ruoyi.errand.object.vo.app.CommunityListVO">
         select id ,name
         from t_community where del_flag=0
+        <if test="name != null and '' != name">
+            and name like concat('%',#{name},'%')
+        </if>
     </select>
     <select id="getAllCommunityList" resultType="com.ruoyi.errand.object.vo.sys.AllCommunityListVO">
         select
@@ -26,10 +29,14 @@
         where
             del_flag=0
         and
-        id not in
-        <foreach collection="list" item="item" index="index" open="(" close=")" separator=",">
-            #{item}
-        </foreach>
+            status = 0
+        <if test="list!=null and list.size>0">
+            and id not in
+            <foreach collection="list" item="item" index="index" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+
     </select>
     <select id="getCommunityPageList" resultType="com.ruoyi.errand.object.vo.sys.CommunityPageListVO">
         select
@@ -43,9 +50,9 @@
             from    t_community tc
         left join  t_region tr on tc.region_id = tr.id
         left join t_community_courier tcc on tc.id = tcc.community_id
-        left join t_courier tco on tcc.courier_id = toc.id
+        left join t_courier tco on tcc.courier_id = tco.id
         where
-            del_flag=0
+            tc.del_flag=0
         <if test="dto.name !=null  and ''!= dto.name">
             and tc.name like concat('%',#{dto.name},'%')
         </if>
@@ -64,5 +71,6 @@
         <if test="dto.status!=null">
             and tc.status =#{dto.status}
         </if>
+        order by  tc.create_time desc
     </select>
 </mapper>
\ No newline at end of file
diff --git a/pt-errand/src/main/resources/mapper/CourierMapper.xml b/pt-errand/src/main/resources/mapper/CourierMapper.xml
index 64f9e41..5889a31 100644
--- a/pt-errand/src/main/resources/mapper/CourierMapper.xml
+++ b/pt-errand/src/main/resources/mapper/CourierMapper.xml
@@ -9,7 +9,7 @@
             tc.phone as phone,
             tc2.name as communityName
         from t_courier tc
-        left join t_community_courier on tc.id = tcc.courier_id
+        left join t_community_courier tcc on tc.id = tcc.courier_id
         left join t_community tc2 on tcc.community_id = tc2.id
         where
             tc.del_flag=0
@@ -23,6 +23,7 @@
                 AND MONTH(receiving_time) = MONTH(CURDATE()) THEN 1 END) AS `month`
         FROM t_order
         WHERE courier_id = #{courierId}
+          and del_flag = 0
           AND order_status IN (2, 4, 5) -- 进行中、已完成、已评价状态
           AND receiving_time IS NOT NULL;
     </select>
@@ -33,20 +34,35 @@
             o.recipient_name as recipientName,
             o.recipient_phone as recipientPhone,
             o.order_status as orderStatus,
-            o.receiving_time as receivingTime,
+            o.order_time as receivingTime,
             te.rating as rating
         from
             t_order o
-        left join  t_evaluation te on o.id = te.order_id
-            o.courier_id = #{courierId}  -- 替换为实际跑腿ID
-            AND o.del_flag = 0          -- 过滤未删除的订单
-        and o.payStatus = 2            -- 过滤未支付的订单
+        left join  t_evaluation te on o.id = te.order_id and te.type = 0
+        where
+        o.del_flag = 0          -- 过滤未删除的订单
+        and o.pay_status = 2
+        and o.order_status != 3-- 过滤未支付的订单
+        <choose>
+            <!-- 当状态=1时,按社区ID查询 -->
+            <when test="orderStatus == 1">
+                AND o.community_id = #{communityId}
+            </when>
+            <!-- 当状态为全部时,按社区ID或者跑腿员id查询 -->
+            <when test="orderStatus == null or orderStatus == 1">
+                AND ((o.community_id = #{communityId} and order_status = 1) or o.courier_id = #{courierId})
+            </when>
+            <!-- 其他状态按快递员ID查询 -->
+            <otherwise>
+                AND o.courier_id = #{courierId}
+            </otherwise>
+        </choose>
         <if test="orderStatus !=null and orderStatus !=0">
             AND o.order_status = #{orderStatus}  -- 订单状态筛选条件
         </if>
         ORDER BY
             CASE WHEN o.order_status = 1 THEN 0 ELSE 1 END,  -- 待确认订单置顶
-    o.order_time DESC;  -- 其余订单按下单时间倒序
+        o.order_time DESC
     </select>
     <select id="getCourierPageList" resultType="com.ruoyi.errand.object.vo.sys.CourierPageListVO">
         select
@@ -61,7 +77,7 @@
         where
             tc.del_flag=0
         <if test="dto.name !=null and ''!=dto.name">
-            AND tc.name = #{dto.name}
+            AND tc.name like concat ('%',#{dto.name},'%')
         </if>
         <if test="dto.phone !=null and ''!=dto.phone">
             AND tc.phone = #{dto.phone}
@@ -75,10 +91,12 @@
             tc.name as name,
             tc.phone as phone,
             tc.id_card as idCard,
-            tcc.community_id as communityId
+            tcc.community_id as communityId,
             tcm.name as communityName,
-            tc.create_time as createTime
-            tc.status as status
+            tc.create_time as createTime,
+            tc.status as status,
+            tc.front_view as frontView,
+            tc.back_view as backView
         from t_courier tc
                  left join t_community_courier tcc on tc.id = tcc.courier_id
                  left join t_community tcm on tcc.community_id = tcm.id
@@ -92,12 +110,16 @@
         from
             t_courier
         where
-            del_flag=0
-        and
+            del_flag = 0
+          and status = 1
+        <if test="couriers!=null and couriers.size>0">
+            and
             id not in
-        <foreach collection="couriers" item="item" index="index" open="(" close=")" separator=",">
-            #{item}
-        </foreach>
+            <foreach collection="couriers" item="item" index="index" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+
 
     </select>
 </mapper>
\ No newline at end of file
diff --git a/pt-errand/src/main/resources/mapper/EvaluationMapper.xml b/pt-errand/src/main/resources/mapper/EvaluationMapper.xml
index aeb23cb..f0d9d0e 100644
--- a/pt-errand/src/main/resources/mapper/EvaluationMapper.xml
+++ b/pt-errand/src/main/resources/mapper/EvaluationMapper.xml
@@ -11,6 +11,7 @@
         where
             o.courier_id=#{courierId}
         and o.del_flag=0
+        and te.type = 0
         and te.rating=5.0
     </select>
 </mapper>
\ No newline at end of file
diff --git a/pt-errand/src/main/resources/mapper/FeedbackMapper.xml b/pt-errand/src/main/resources/mapper/FeedbackMapper.xml
index 95d4c7b..daae18b 100644
--- a/pt-errand/src/main/resources/mapper/FeedbackMapper.xml
+++ b/pt-errand/src/main/resources/mapper/FeedbackMapper.xml
@@ -16,8 +16,9 @@
         <if test="dto.phone != null and dto.phone !='' ">
             and phone like concat('%',#{dto.phone},'%')
         </if>
-        <if test="dto.status != null  ">
+        <if test="dto.status != null and dto.status != -1 ">
             and status= #{dto.status}
         </if>
+        order by create_time desc
     </select>
 </mapper>
\ No newline at end of file
diff --git a/pt-errand/src/main/resources/mapper/OrderMapper.xml b/pt-errand/src/main/resources/mapper/OrderMapper.xml
index 1bca70e..9a2534c 100644
--- a/pt-errand/src/main/resources/mapper/OrderMapper.xml
+++ b/pt-errand/src/main/resources/mapper/OrderMapper.xml
@@ -11,19 +11,22 @@
             o.recipient_phone,
             o.order_status,
             o.order_time,
-            o.rating,
+            e.rating,
             o.courier_id,
-            c.name,
-            c.phone
+            c.name courierName,
+            c.phone courierPhone
             from t_order o
-            left join t_courier c on o.courier_id = c.id
+            left join t_courier c on c.id = o.courier_id
+            left join t_evaluation e on o.id = e.order_id and e.type =0
             where
                 o.del_flag=0
+              and o.order_status != 3
               and o.pay_status=2
               and o.app_user_id = #{appUserId}
               <if test="orderStatus!=null and orderStatus!=0">
                   and o.order_status = #{orderStatus}
               </if>
+        order by o.order_time desc
     </select>
     <select id="getOrderDetail" resultType="com.ruoyi.errand.object.vo.app.OrderDetailVO">
         select
@@ -43,17 +46,20 @@
             o.order_time as orderTime,
             o.pay_method as payMethod,
             o.payment_amount as paymentAmount,
-            c.courier_name as courierName,
-            c.courier_phone as courierPhone,
+            c.name as courierName,
+            c.phone as courierPhone,
+            e.id as evaluationId,
             e.rating as rating,
-            e.content as content
+            e.content as content,
+            e2.rating as courierRating,
+            e2.content as courierContent
             from t_order o
         left join t_courier c on o.courier_id = c.id
-        left join t_evaluation e on o.id = e.order_id
+        left join t_evaluation e on o.id = e.order_id and e.type = 0
+        left join t_evaluation e2 on o.id = e2.order_id and e2.type = 1
         where
             o.id=#{id}
             and o.del_flag=0
-            and e.type = 0
     </select>
 
     <select id="getOrderTopInfoByDate" resultType="java.util.Map">
@@ -64,10 +70,11 @@
             t_order
         where
             del_flag=0
+          and pay_status = 2
         and
             order_status in (4,5)
         <if test="communityId!=null and communityId!=0">
-            and communityId =#{communityId}
+            and community_id =#{communityId}
         </if>
         <if test="start!=null and end!=null">
             and order_time BETWEEN #{start} AND #{end}
@@ -89,7 +96,10 @@
             COALESCE(SUM(payment_amount), 0.00) AS amount
         FROM t_order
         WHERE order_time BETWEEN #{start} AND #{end}
-          and del_flag=0 and order_status in (4,5)
+          and del_flag=0 and order_status in (4,5)and pay_status = 2
+        <if test="communityId!=null and 0!= communityId">
+            and community_id =#{communityId}
+        </if>
         GROUP BY
             CASE #{datePattern}
                 WHEN 'HH时' THEN DATE_FORMAT(order_time, '%H时')
@@ -140,15 +150,12 @@
                 and tau.phone like concat('%',#{dto.phone},'%')
             </if>
 
-        <if test="dto.orderStatus!=null and 0!=dto.orderStatus and dto.orderStatus !=4">
+        <if test="dto.orderStatus!=null and 0!=dto.orderStatus ">
             and t.order_status = #{dto.orderStatus}
         </if>
-        <if test="dto.orderStatus ==4">
-            and t.order_status in(4,5)
+        <if test="dto.startTime!=null and dto.endTime != null">
+            and t.order_time between #{dto.startTime} and #{dto.endTime}
         </if>
-            <if test="dto.startTime!=null and dto.endTime != null">
-                and t.order_time between #{dto.startTime} and #{dto.endTime}
-            </if>
         ) t
         where
             1=1
@@ -161,8 +168,10 @@
     <select id="financeStatistics" resultType="com.ruoyi.errand.object.vo.sys.FinanceStatisticsVO">
         select * from (
                 SELECT t.id as id,
+                       t.order_amount as money,
                        t.order_time as orderTime,
                        1 as type,
+                        t.pay_method as payMethod,
                        t.order_number as orderNumber,
                        tau.name as appUserName,
                        tau.phone as phone,
@@ -180,41 +189,45 @@
                 <if test="dto.orderStatus!=null and 0!=dto.orderStatus and dto.orderStatus !=4">
                     and t.order_status = #{dto.orderStatus}
                 </if>
-        <if test="dto.orderStatus ==4">
-            and t.order_status in(4,5)
-        </if>
-                <if test="dto.startTime!=null and dto.endTime != null">
-                    and t.order_time between #{dto.startTime} and #{dto.endTime}
-                </if>
-            UNION ALL
-                SELECT t.id as id,
-                t.order_time as orderTime,
-                2 as type,
-                t.order_number as orderNumber,
-                tau.name as appUserName,
-                tau.phone as phone,
-                t.order_status as orderStatus
-                FROM t_vip_order t
-                INNER JOIN t_app_user tau ON t.app_user_id = tau.id
-                WHERE t.del_flag=0
-        and t.pay_status=2
-                <if test="dto.appUserName!=null and  ''!=dto.appUserName">
-                    and tau.name like concat('%',#{dto.appUserName},'%')
-                </if>
-
-                <if test="dto.phone!=null and  ''!=dto.phone">
-                    and tau.phone like concat('%',#{dto.phone},'%')
-                </if>
-
-                <if test="dto.orderStatus!=null and 0!=dto.orderStatus and dto.orderStatus !=4">
-                    and t.order_status = #{dto.orderStatus}
-                </if>
                 <if test="dto.orderStatus ==4">
                     and t.order_status in(4,5)
                 </if>
-
                 <if test="dto.startTime!=null and dto.endTime != null">
                     and t.order_time between #{dto.startTime} and #{dto.endTime}
+                </if>
+                <if test="dto.payMethod!=null">
+                    and t.pay_method = #{dto.payMethod}
+                </if>
+
+                <if test="dto.payMethod==null || dto.payMethod==0">
+                UNION ALL
+                    SELECT t.id as id,
+                       t.order_amount as money,
+                        t.order_time as orderTime,
+                        2 as type,
+                        0 as payMethod,
+                        t.order_number as orderNumber,
+                        tau.name as appUserName,
+                        tau.phone as phone,
+                        t.order_status as orderStatus
+                    FROM t_vip_order t
+                    INNER JOIN t_app_user tau ON t.app_user_id = tau.id
+                    WHERE t.del_flag=0
+                        and t.pay_status=2
+                    <if test="dto.appUserName!=null and  ''!=dto.appUserName">
+                            and tau.name like concat('%',#{dto.appUserName},'%')
+                    </if>
+
+                    <if test="dto.phone!=null and  ''!=dto.phone">
+                            and tau.phone like concat('%',#{dto.phone},'%')
+                    </if>
+
+                    <if test="dto.orderStatus!=null and 0!=dto.orderStatus ">
+                            and t.order_status = #{dto.orderStatus}
+                    </if>
+                    <if test="dto.startTime!=null and dto.endTime != null">
+                        and t.order_time between #{dto.startTime} and #{dto.endTime}
+                    </if>
                 </if>
                 ) t
             where
@@ -266,14 +279,13 @@
             and o.order_time between #{dto.orderStartTime} and #{dto.orderEndTime}
         </if>
         <if test="dto.finishStartTime!=null and dto.finishEndTime != null">
-            and o.finishTime between #{dto.finishStartTime} and #{dto.finishEndTime}
+            and o.finish_time between #{dto.finishStartTime} and #{dto.finishEndTime}
         </if>
-        <if test="dto.orderStatus!=null and 0!=dto.orderStatus and dto.orderStatus !=4">
+        <if test="dto.orderStatus!=null and 0!=dto.orderStatus">
             and o.order_status = #{dto.orderStatus}
         </if>
-        <if test="dto.orderStatus ==4">
-            and o.order_status in(4,5)
-        </if>
+
+        order by o.order_time desc
     </select>
     <select id="detail" resultType="com.ruoyi.errand.object.vo.sys.OrderSysDetailVO">
         select
@@ -303,7 +315,7 @@
         inner join t_app_user tau on o.app_user_id = tau.id
         left join t_courier tc on o.courier_id = tc.id
         left join t_evaluation teu on o.id = teu.order_id and teu.type=0
-        left join t_evaluation tec on o.id = teu.order_id and teu.type=1
+        left join t_evaluation tec on o.id = tec.order_id and tec.type=1
         where
             o.id=#{id}
     </select>
@@ -311,7 +323,9 @@
         select * from (
         SELECT t.id as id,
         t.order_time as orderTime,
+        t.order_amount as money,
         1 as type,
+        t.pay_method as payMethod,
         t.order_number as orderNumber,
         tau.name as appUserName,
         tau.phone as phone,
@@ -335,10 +349,17 @@
         <if test="dto.startTime!=null and dto.endTime != null">
             and t.order_time between #{dto.startTime} and #{dto.endTime}
         </if>
+        <if test="dto.payMethod!=null">
+            and t.pay_method = #{dto.payMethod}
+        </if>
+
+        <if test="dto.payMethod==null || dto.payMethod==0">
         UNION ALL
         SELECT t.id as id,
         t.order_time as orderTime,
+        t.order_amount as money,
         2 as type,
+        0 as payMethod,
         t.order_number as orderNumber,
         tau.name as appUserName,
         tau.phone as phone,
@@ -355,15 +376,14 @@
             and tau.phone like concat('%',#{dto.phone},'%')
         </if>
 
-        <if test="dto.orderStatus!=null and 0!=dto.orderStatus and dto.orderStatus !=4">
+        <if test="dto.orderStatus!=null and 0!=dto.orderStatus ">
             and t.order_status = #{dto.orderStatus}
         </if>
-        <if test="dto.orderStatus ==4">
-            and t.order_status in(4,5)
-        </if>
+
 
         <if test="dto.startTime!=null and dto.endTime != null">
             and t.order_time between #{dto.startTime} and #{dto.endTime}
+        </if>
         </if>
         ) t
         where
@@ -414,7 +434,7 @@
             and o.order_time between #{dto.orderStartTime} and #{dto.orderEndTime}
         </if>
         <if test="dto.finishStartTime!=null and dto.finishEndTime != null">
-            and o.finishTime between #{dto.finishStartTime} and #{dto.finishEndTime}
+            and o.finish_time between #{dto.finishStartTime} and #{dto.finishEndTime}
         </if>
         <if test="dto.orderStatus!=null and 0!=dto.orderStatus and dto.orderStatus !=4">
             and o.order_status = #{dto.orderStatus}
@@ -422,5 +442,6 @@
         <if test="dto.orderStatus ==4">
             and o.order_status in(4,5)
         </if>
+        order by o.order_time desc
     </select>
 </mapper>
\ No newline at end of file
diff --git a/pt-errand/src/main/resources/mapper/ReportMapper.xml b/pt-errand/src/main/resources/mapper/ReportMapper.xml
index 731ee39..109555f 100644
--- a/pt-errand/src/main/resources/mapper/ReportMapper.xml
+++ b/pt-errand/src/main/resources/mapper/ReportMapper.xml
@@ -9,13 +9,12 @@
             tr.community_name as communityName,
             tre.name as regionName,
             tr.address_detail as addressDetail,
-            tau.name as appUserName,
-            tau.phone as appUserPhone,
+            tr.username as appUserName,
+            tr.phone as appUserPhone,
             tr.create_time as createTime,
             tr.status as status
             from
                 t_report tr
-        left join t_app_user tau on tr.app_user_id = tau.id
         left join t_region tre on tr.region_id = tre.id
         where
             tr.del_flag=0
@@ -26,14 +25,14 @@
             and tre.id =#{dto.regionId}
         </if>
         <if test="dto.appUserName!=null and ''!=dto.appUserName">
-            and tau.name like concat('%',#{dto.appUserName},'%')
+            and tr.username like concat('%',#{dto.appUserName},'%')
         </if>
         <if test="dto.appUserPhone!=null and ''!=dto.appUserPhone">
-            and tau.phone like concat('%',#{dto.appUserPhone},'%')
+            and tr.phone like concat('%',#{dto.appUserPhone},'%')
         </if>
         <if test="dto.status!=null">
             and tr.status =#{dto.status}
         </if>
-
+    order by tr.create_time desc
     </select>
 </mapper>
\ No newline at end of file
diff --git a/pt-errand/src/main/resources/mapper/VipOrderMapper.xml b/pt-errand/src/main/resources/mapper/VipOrderMapper.xml
index 90d44c9..18d78d6 100644
--- a/pt-errand/src/main/resources/mapper/VipOrderMapper.xml
+++ b/pt-errand/src/main/resources/mapper/VipOrderMapper.xml
@@ -8,4 +8,19 @@
         from t_vip_order tvo
         left join
     </select>
+    <select id="detail" resultType="com.ruoyi.errand.object.vo.sys.OrderSysDetailVO">
+        select
+            tvo.order_status,
+            tau.name appUserName,
+            tau.phone appUserPhone,
+            tvo.order_number,
+            tvo.order_time,
+            tvo.order_amount paymentAmount
+        from
+                t_vip_order tvo
+        left join
+                t_app_user tau on tvo.app_user_id = tau.id
+        where
+            tvo.id =#{id}
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/pt-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/pt-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
index 11766e3..a4cdee2 100644
--- a/pt-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
+++ b/pt-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
@@ -119,7 +119,7 @@
             .authorizeHttpRequests((requests) -> {
                 permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll());
                 // 对于登录login 注册register 验证码captchaImage 允许匿名访问
-                requests.antMatchers("/login", "/register", "/captchaImage","/screen/data").permitAll()
+                requests.antMatchers("/login", "/register", "/captchaImage","/screen/data","/common/upload","/system/user/profile/updatePwd").permitAll()
                     // 静态资源,可匿名访问
                     .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                     .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**","/swagger-ui/").permitAll()
diff --git a/pt-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java b/pt-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java
index 441f359..08b3bf2 100644
--- a/pt-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java
+++ b/pt-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java
@@ -128,4 +128,8 @@
     List<MenuTreeVO> getAllRootMenu();
 
     List<MenuTreeVO> selectMenusByParentId(@Param("menuId") Long menuId);
+
+    List<SysMenu> selectMenusByUserId(@Param("userId")Long userId);
+
+    List<String> getPathsByMenuIds(@Param("ids")List<Long> ids);
 }
diff --git a/pt-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java b/pt-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
index 6d7742c..5b692bf 100644
--- a/pt-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
+++ b/pt-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
@@ -41,7 +41,7 @@
     public List<SysUser> selectUnallocatedList(SysUser user);
 
     /**
-     * 通过用户名查询用户
+     * 通过手机号询用户
      * 
      * @param userName 用户名
      * @return 用户对象信息
@@ -84,7 +84,7 @@
     /**
      * 重置用户密码
      * 
-     * @param userName 用户名
+     * @param userName 手机号
      * @param password 密码
      * @return 结果
      */
@@ -132,7 +132,9 @@
 
     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);
+
+    List<SysUser> selectUserByDeptId(@Param("deptId")Long deptId);
 }
diff --git a/pt-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java b/pt-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java
index 739ae33..19a57d3 100644
--- a/pt-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java
+++ b/pt-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java
@@ -65,4 +65,6 @@
     void insert(@Param("userId")Long userId, @Param("roleId")Long roleId);
 
     SysRole selectRoleByUserId(@Param("userId")Long userId);
+
+    List<SysUserRole> selectUserIdByRoleId(@Param("roleId")Long roleId);
 }
diff --git a/pt-system/src/main/java/com/ruoyi/system/object/dto/AddDeptDTO.java b/pt-system/src/main/java/com/ruoyi/system/object/dto/AddDeptDTO.java
new file mode 100644
index 0000000..37f3973
--- /dev/null
+++ b/pt-system/src/main/java/com/ruoyi/system/object/dto/AddDeptDTO.java
@@ -0,0 +1,8 @@
+package com.ruoyi.system.object.dto;
+
+import lombok.Data;
+
+@Data
+public class AddDeptDTO {
+    private String name;
+}
diff --git a/pt-system/src/main/java/com/ruoyi/system/object/dto/EditSysRoleDTO.java b/pt-system/src/main/java/com/ruoyi/system/object/dto/EditSysRoleDTO.java
index 5c29339..5d6baa3 100644
--- a/pt-system/src/main/java/com/ruoyi/system/object/dto/EditSysRoleDTO.java
+++ b/pt-system/src/main/java/com/ruoyi/system/object/dto/EditSysRoleDTO.java
@@ -6,10 +6,13 @@
 import lombok.Getter;
 import lombok.Setter;
 
+import javax.validation.constraints.NotNull;
+
 @Getter
 @Setter
 @ApiModel("编辑角色DTO")
 public class EditSysRoleDTO extends AddSysRoleDTO {
     @ApiModelProperty("角色id")
+    @NotNull(message = "角色id不能为空")
     private Long roleId;
 }
diff --git a/pt-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/pt-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java
index 63eaa26..5f2c29e 100644
--- a/pt-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java
+++ b/pt-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java
@@ -7,6 +7,7 @@
 import java.util.stream.Collectors;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ruoyi.system.mapper.SysUserMapper;
 import com.ruoyi.system.object.vo.SysDeptPageVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -38,6 +39,8 @@
 
     @Autowired
     private SysRoleMapper roleMapper;
+    @Autowired
+    private SysUserMapper sysUserMapper;
 
     /**
      * 查询部门管理数据
@@ -294,6 +297,15 @@
     @Override
     public int deleteDeptById(Long deptId)
     {
+        SysDept dept = deptMapper.selectDeptById(deptId);
+        if (dept == null ){
+            throw new ServiceException("该部门不存在");
+        }
+        //判断是否有用户关联部门
+        List<SysUser> sysUsers = sysUserMapper.selectUserByDeptId(deptId);
+        if (sysUsers.size() > 0){
+            throw new ServiceException("有用户绑定该部门,不能删除");
+        }
         return deptMapper.deleteDeptById(deptId);
     }
 
diff --git a/pt-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java b/pt-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
index 660d127..146de7a 100644
--- a/pt-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
+++ b/pt-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
@@ -6,6 +6,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.system.mapper.*;
 import com.ruoyi.system.object.dto.AddSysRoleDTO;
 import com.ruoyi.system.object.dto.EditSysRoleDTO;
 import com.ruoyi.system.object.vo.SysRolePageVO;
@@ -25,10 +26,6 @@
 import com.ruoyi.system.domain.SysRoleDept;
 import com.ruoyi.system.domain.SysRoleMenu;
 import com.ruoyi.system.domain.SysUserRole;
-import com.ruoyi.system.mapper.SysRoleDeptMapper;
-import com.ruoyi.system.mapper.SysRoleMapper;
-import com.ruoyi.system.mapper.SysRoleMenuMapper;
-import com.ruoyi.system.mapper.SysUserRoleMapper;
 import com.ruoyi.system.service.ISysRoleService;
 
 /**
@@ -50,6 +47,10 @@
 
     @Autowired
     private SysRoleDeptMapper roleDeptMapper;
+    @Autowired
+    private SysUserMapper sysUserMapper;
+    @Autowired
+    private SysUserRoleMapper sysUserRoleMapper;
 
     /**
      * 根据条件分页查询角色数据
@@ -350,6 +351,12 @@
     @Transactional
     public int deleteRoleById(Long roleId)
     {
+        //查看角色是否有用户绑定
+        List<SysUserRole> sysUserRoles = sysUserRoleMapper.selectUserIdByRoleId(roleId);
+        if (!sysUserRoles.isEmpty()){
+            throw new ServiceException("有用户绑定该角色,不能删除");
+        }
+
         // 删除角色与菜单关联
         roleMenuMapper.deleteRoleMenuByRoleId(roleId);
         // 删除角色与部门关联
@@ -451,6 +458,8 @@
         LoginUser loginUser = (LoginUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
         sysRole.setCreateBy(loginUser.getUsername());
         sysRole.setCreateTime(DateUtils.getNowDate());
+        sysRole.setRoleSort(1);
+        sysRole.setDelFlag("0");
         roleMapper.insertRole(sysRole);
         //添加角色菜单
         roleMenuMapper.insert(sysRole.getRoleId(),dto.getMenuIds());
@@ -468,12 +477,22 @@
         sysRole.setRoleName(dto.getRoleName());
         List<SysRole> sysRoles = roleMapper.selectRoleList(sysRole);
         if (sysRoles!=null && !sysRoles.isEmpty()){
-            throw new ServiceException("该角色名称重复");
+            sysRoles.forEach(role -> {
+                if (!Objects.equals(role.getRoleId(), dto.getRoleId())){
+                    //id不同
+                    if (role.getRoleName().equals(dto.getRoleName())){
+                        throw new ServiceException("该角色名称重复");
+                    }
+                }
+            });
         }
         //删除之前的
         roleMenuMapper.deleteRoleMenuByRoleId(dto.getRoleId());
         //添加角色菜单
-        roleMenuMapper.insert(sysRole.getRoleId(),dto.getMenuIds());
+        roleMenuMapper.insert(dto.getRoleId(),dto.getMenuIds());
+        //修改角色
+        sysRole1.setRoleName(dto.getRoleName());
+        roleMapper.updateRole(sysRole1);
     }
 
     @Override
diff --git a/pt-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/pt-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
index c19ae56..382b277 100644
--- a/pt-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
+++ b/pt-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -578,7 +578,7 @@
 
     @Override
     public R<SysUserVO> getInfo(Long userId) {
-        return userMapper.getSysUserVO(userId);
+        return R.ok(userMapper.getSysUserVO(userId));
     }
 
     @Override
@@ -604,7 +604,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);
@@ -665,7 +665,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);
     }
 
@@ -673,9 +673,10 @@
     public void changeStatus(Long userId) {
         //检查用户是否存在
         SysUser sysUser = userMapper.selectUserById(userId);
-        if (sysUser==null){
+        if (sysUser==null || sysUser.getDelFlag().equals("2")){
             throw new ServiceException("该用户不存在");
         }
+
         sysUser.setStatus(Objects.equals(sysUser.getStatus(), "1") ?"0":"1");
         userMapper.updateUser(sysUser);
     }
diff --git a/pt-system/src/main/resources/mapper/system/SysMenuMapper.xml b/pt-system/src/main/resources/mapper/system/SysMenuMapper.xml
index c063570..a055e58 100644
--- a/pt-system/src/main/resources/mapper/system/SysMenuMapper.xml
+++ b/pt-system/src/main/resources/mapper/system/SysMenuMapper.xml
@@ -144,6 +144,21 @@
 		select menu_id,menu_name,path,menu_type from sys_menu
 		where parent_id = #{menuId} order by 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/pt-system/src/main/resources/mapper/system/SysUserMapper.xml b/pt-system/src/main/resources/mapper/system/SysUserMapper.xml
index 30f57a4..89af357 100644
--- a/pt-system/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/pt-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -122,12 +122,12 @@
 	
 	<select id="selectUserByUserName" parameterType="String" resultMap="SysUserResult">
 	    <include refid="selectUserVo"/>
-		where u.user_name = #{userName} and u.del_flag = '0'
+		where u.phonenumber = #{userName} and u.del_flag = '0'
 	</select>
 	
 	<select id="selectUserById" parameterType="Long" resultMap="SysUserResult">
 		<include refid="selectUserVo"/>
-		where u.user_id = #{userId}
+		where u.user_id = #{userId} and u.del_flag = '0'
 	</select>
 	
 	<select id="checkUserNameUnique" parameterType="String" resultMap="SysUserResult">
@@ -189,8 +189,11 @@
 	<select id="selectuserByPhone" resultType="com.ruoyi.common.core.domain.entity.SysUser">
 		select * from sys_user where del_flag='0' and phonenumber =#{phonenumber}
 	</select>
+    <select id="selectUserByDeptId" resultType="com.ruoyi.common.core.domain.entity.SysUser">
+		select * from sys_user where del_flag='0' and dept_id = #{deptId}
+	</select>
 
-	<insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
+    <insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
  		insert into sys_user(
  			<if test="userId != null and userId != 0">user_id,</if>
  			<if test="deptId != null and deptId != 0">dept_id,</if>
@@ -251,7 +254,7 @@
 	</update>
 	
 	<update id="resetUserPwd" parameterType="SysUser">
- 		update sys_user set password = #{password} where user_name = #{userName}
+ 		update sys_user set password = #{password} where phonenumber = #{userName}
 	</update>
 	
 	<delete id="deleteUserById" parameterType="Long">
diff --git a/pt-system/src/main/resources/mapper/system/SysUserRoleMapper.xml b/pt-system/src/main/resources/mapper/system/SysUserRoleMapper.xml
index 8fadc85..66b7f60 100644
--- a/pt-system/src/main/resources/mapper/system/SysUserRoleMapper.xml
+++ b/pt-system/src/main/resources/mapper/system/SysUserRoleMapper.xml
@@ -19,6 +19,9 @@
 	<select id="selectRoleByUserId" resultType="com.ruoyi.common.core.domain.entity.SysRole">
 		select * from sys_user_role where user_id=#{userId}
 	</select>
+	<select id="selectUserIdByRoleId" resultType="com.ruoyi.system.domain.SysUserRole">
+		select * from sys_user_role where role_id=#{roleId}
+	</select>
 
 	<delete id="deleteUserRole" parameterType="Long">
  		delete from sys_user_role where user_id in

--
Gitblit v1.7.1