From 441eb455e1e8a9283cd569c132b14ba8da4c54a6 Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期六, 11 十月 2025 17:49:47 +0800
Subject: [PATCH] 导出,短信,模板消息

---
 ruoyi-system/src/main/java/com/ruoyi/system/export/TSysAppUserExport.java                                                       |   40 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCrmClinicServiceImpl.java                                             |   72 ++
 ruoyi-system/src/main/java/com/ruoyi/system/service/TCrmBranchService.java                                                      |   11 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TCrmClinicService.java                                                      |   18 
 ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/wxTemplateAppLiveResult/WxOfficeTemplateAppLiveResultRequest.java |   10 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysProductIntroductionServiceImpl.java                                |    3 
 ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml                                                                 |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/TCrmClinicVO.java                                                                |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysAppUserServiceImpl.java                                            |   80 +++
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java                                              |   55 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/TSysAppUserService.java                                                     |   27 +
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TCrmBranchMapper.java                                                        |    9 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysActivityServiceImpl.java                                           |    3 
 ruoyi-system/src/main/resources/mapper/system/TCrmClinicMapper.xml                                                              |  119 ++++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java                                                           |   40 +
 ruoyi-system/src/main/resources/mapper/system/TSysMessageTemplateMapper.xml                                                     |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java                                                        |    2 
 ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java                                                             |    2 
 ruoyi-system/src/main/resources/mapper/system/TSysAppUserMapper.xml                                                             |   70 +++
 ruoyi-system/src/main/resources/mapper/system/TSysLiveMapper.xml                                                                |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/listener/PublishTopicLiveInfoEventListener.java                                     |   13 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCrmClinicController.java                                                |  127 +++++
 ruoyi-system/src/main/java/com/ruoyi/system/query/TCrmClinicQuery.java                                                          |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/tools/WxAppletTools.java                                                   |    2 
 ruoyi-system/src/main/resources/mapper/system/TSysActivityMapper.xml                                                            |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/export/TCrmClinicAuditExport.java                                                   |   31 +
 ruoyi-system/src/main/java/com/ruoyi/system/export/TSysAppUserClinicExport.java                                                 |   33 +
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/tool/MsgUtils.java                                                          |   75 +++
 ruoyi-system/src/main/java/com/ruoyi/system/export/TCrmBranchExport.java                                                        |   42 +
 ruoyi-system/src/main/java/com/ruoyi/system/export/TSysAppUserListExport.java                                                   |   30 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCrmBranchController.java                                                |   45 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysEducationalInfoServiceImpl.java                                    |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/model/TCrmClinic.java                                                               |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java                                                |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/model/TSysMessageTemplate.java                                                      |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/pojo/OfficeUserEncrypteData.java                                           |   19 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCrmBranchServiceImpl.java                                             |   46 ++
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TCrmClinicMapper.java                                                        |   17 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysLiveServiceImpl.java                                               |    2 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysAppUserController.java                                               |  156 ++++++
 ruoyi-system/src/main/resources/mapper/system/TCrmBranchMapper.xml                                                              |   27 +
 ruoyi-system/src/main/java/com/ruoyi/system/export/TCrmClinicListExport.java                                                    |   37 +
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysAppUserMapper.java                                                       |   25 +
 43 files changed, 1,271 insertions(+), 59 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCrmBranchController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCrmBranchController.java
index 80277fc..89fa023 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCrmBranchController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCrmBranchController.java
@@ -1,6 +1,8 @@
 package com.ruoyi.web.controller.api;
 
 
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.common.annotation.Log;
@@ -8,20 +10,31 @@
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.WebUtils;
 import com.ruoyi.framework.web.service.TokenService;
 import com.ruoyi.system.dto.TCrmBranchDTO;
+import com.ruoyi.system.export.TCrmBranchExport;
+import com.ruoyi.system.export.TSysAppUserClinicExport;
+import com.ruoyi.system.export.TSysAppUserExport;
 import com.ruoyi.system.model.*;
 import com.ruoyi.system.query.TCrmBranchQuery;
+import com.ruoyi.system.query.TSysAppUserQuery;
 import com.ruoyi.system.service.*;
 import com.ruoyi.system.vo.TCrmBranchVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -235,6 +248,36 @@
         crmChangePointsService.save(changePoints);
         return R.ok();
     }
-    
+
+    @Log(title = "crm分公司管理信息-分公司管理信息导出", businessType = BusinessType.EXPORT)
+    @ApiOperation(value = "分公司管理信息导出")
+    @PostMapping("/exportList")
+    public void exportList(@RequestBody TCrmBranchQuery query){
+        List<TCrmBranchExport> crmBranchExports = crmBranchService.exportList(query);
+        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TCrmBranchExport.class, crmBranchExports);
+        HttpServletResponse response = WebUtils.response();
+        assert response != null;
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        ServletOutputStream outputStream = null;
+        try {
+            String fileName = URLEncoder.encode("分公司管理信息.xls", "utf-8");
+            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
+            response.setHeader("Pragma", "no-cache");
+            response.setHeader("Cache-Control", "no-cache");
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                outputStream.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
 }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCrmClinicController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCrmClinicController.java
index bd56489..dd4de42 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCrmClinicController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCrmClinicController.java
@@ -1,6 +1,8 @@
 package com.ruoyi.web.controller.api;
 
 
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.common.annotation.Log;
@@ -8,22 +10,38 @@
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.WebUtils;
 import com.ruoyi.framework.web.service.TokenService;
 import com.ruoyi.system.dto.TCrmClinicAuditDTO;
 import com.ruoyi.system.dto.TCrmClinicDTO;
+import com.ruoyi.system.export.TCrmChangePointsBranchExport;
+import com.ruoyi.system.export.TCrmClinicAuditExport;
+import com.ruoyi.system.export.TCrmClinicListExport;
 import com.ruoyi.system.model.*;
+import com.ruoyi.system.query.TCrmChangePointsQuery;
 import com.ruoyi.system.query.TCrmClinicQuery;
 import com.ruoyi.system.service.*;
 import com.ruoyi.system.vo.TCrmClinicVO;
+import com.ruoyi.system.vo.TSysAppUserVO;
+import com.ruoyi.web.controller.tool.MsgUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.time.LocalDateTime;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
@@ -48,8 +66,10 @@
     private final ISysUserService sysUserService;
     private final TCrmDeviceService crmDeviceService;
     private final TokenService tokenService;
+    private final MsgUtils msgUtils;
+    private final TSysMessageTemplateService sysMessageTemplateService;
     @Autowired
-    public TCrmClinicController(TCrmClinicService crmClinicService, TCrmSupplierService crmSupplierService, TCrmBranchService crmBranchService, TCrmWarehouseService crmWarehouseService, TCrmSalespersonService crmSalespersonService, ISysUserService sysUserService, TCrmDeviceService crmDeviceService, TokenService tokenService) {
+    public TCrmClinicController(TCrmClinicService crmClinicService, TCrmSupplierService crmSupplierService, TCrmBranchService crmBranchService, TCrmWarehouseService crmWarehouseService, TCrmSalespersonService crmSalespersonService, ISysUserService sysUserService, TCrmDeviceService crmDeviceService, TokenService tokenService, MsgUtils msgUtils, TSysMessageTemplateService sysMessageTemplateService) {
         this.crmClinicService = crmClinicService;
         this.crmSupplierService = crmSupplierService;
         this.crmBranchService = crmBranchService;
@@ -58,6 +78,8 @@
         this.sysUserService = sysUserService;
         this.crmDeviceService = crmDeviceService;
         this.tokenService = tokenService;
+        this.msgUtils = msgUtils;
+        this.sysMessageTemplateService = sysMessageTemplateService;
     }
 
     /**
@@ -247,6 +269,107 @@
         }
         return R.ok();
     }
-    
+
+    @Log(title = "crm诊所管理信息-诊所管理导出", businessType = BusinessType.EXPORT)
+    @ApiOperation(value = "诊所管理导出")
+    @PostMapping("/exportList")
+    public void exportList(@RequestBody TCrmClinicQuery query){
+        List<TCrmClinicListExport> crmClinicListExports = crmClinicService.exportList(query);
+        for (TCrmClinicListExport crmClinicListExport : crmClinicListExports) {
+            if(Objects.nonNull(crmClinicListExport.getLowProcurementMoney())){
+                crmClinicListExport.setLowProcurementMoneyStr("¥"+crmClinicListExport.getLowProcurementMoney());
+            }
+            if(Objects.nonNull(crmClinicListExport.getMonthPurchaseAmount())){
+                crmClinicListExport.setMonthPurchaseAmountStr("¥"+crmClinicListExport.getMonthPurchaseAmount());
+            }
+        }
+        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TCrmClinicListExport.class, crmClinicListExports);
+        HttpServletResponse response = WebUtils.response();
+        assert response != null;
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        ServletOutputStream outputStream = null;
+        try {
+            String fileName = URLEncoder.encode("诊所管理.xls", "utf-8");
+            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
+            response.setHeader("Pragma", "no-cache");
+            response.setHeader("Cache-Control", "no-cache");
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                outputStream.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+    @Log(title = "crm诊所管理信息-诊所审核导出", businessType = BusinessType.EXPORT)
+    @ApiOperation(value = "诊所审核导出")
+    @PostMapping("/exportAudit")
+    public void exportAudit(@RequestBody TCrmClinicQuery query){
+        List<TCrmClinicAuditExport> crmClinicAuditExports = crmClinicService.exportAudit(query);
+        for (TCrmClinicAuditExport crmClinicAuditExport : crmClinicAuditExports) {
+            if(Objects.nonNull(crmClinicAuditExport.getLowProcurementMoney())){
+                crmClinicAuditExport.setLowProcurementMoneyStr("¥"+crmClinicAuditExport.getLowProcurementMoney());
+            }
+        }
+        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TCrmClinicAuditExport.class, crmClinicAuditExports);
+        HttpServletResponse response = WebUtils.response();
+        assert response != null;
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        ServletOutputStream outputStream = null;
+        try {
+            String fileName = URLEncoder.encode("诊所审核.xls", "utf-8");
+            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
+            response.setHeader("Pragma", "no-cache");
+            response.setHeader("Cache-Control", "no-cache");
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                outputStream.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * 业绩短信提醒
+     */
+    @ApiOperation(value = "crm诊所管理信息-业绩短信提醒", notes = "clinicId:诊所id,performanceStatus:业绩状态 1=未达成 2=已达成")
+    @GetMapping(value = "/medicationReminder")
+    public R<String> medicationReminder(@RequestParam(value = "clinicId") String clinicId,
+                                        @RequestParam(value = "performanceStatus") Integer performanceStatus) {
+        TCrmClinic crmClinic = crmClinicService.getById(clinicId);
+        if(StringUtils.isNotBlank(crmClinic.getPhone())){
+            Integer performanceCount = crmClinic.getPerformanceCount();
+            if(performanceStatus == 1){
+                performanceCount = performanceCount+1;
+            }
+            TCrmSalesperson crmSalesperson = crmSalespersonService.getById(crmClinic.getSalespersonId());
+            TSysMessageTemplate messageTemplate = sysMessageTemplateService.getOne(Wrappers.lambdaQuery(TSysMessageTemplate.class)
+                    .eq(TSysMessageTemplate::getTemplateType, 2));
+            // 发送短信
+            try {
+                Map<String,String> params = new HashMap<>();
+                params.put("name",crmSalesperson.getSalespersonName());
+                params.put("num",performanceCount.toString());
+                msgUtils.sendMsg(crmClinic.getPhone(),params, messageTemplate.getTemplateCode());
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+        return R.ok();
+    }
+
 }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysAppUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysAppUserController.java
index 7dcd5a9..7bae892 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysAppUserController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysAppUserController.java
@@ -1,33 +1,47 @@
 package com.ruoyi.web.controller.api;
 
 
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.WebUtils;
+import com.ruoyi.system.export.TCrmClinicAuditExport;
+import com.ruoyi.system.export.TSysAppUserClinicExport;
+import com.ruoyi.system.export.TSysAppUserExport;
+import com.ruoyi.system.export.TSysAppUserListExport;
 import com.ruoyi.system.model.TSysAppUser;
 import com.ruoyi.system.model.TSysChronicDisease;
 import com.ruoyi.system.model.TSysInspection;
+import com.ruoyi.system.model.TSysMessageTemplate;
+import com.ruoyi.system.query.TCrmClinicQuery;
 import com.ruoyi.system.query.TSysAppUserQuery;
-import com.ruoyi.system.service.TSysAppUserService;
-import com.ruoyi.system.service.TSysChronicDiseaseService;
-import com.ruoyi.system.service.TSysInspectionService;
-import com.ruoyi.system.service.TSysOrderService;
+import com.ruoyi.system.service.*;
 import com.ruoyi.system.vo.TSysAppUserVO;
 import com.ruoyi.system.vo.TSysOrderVO;
+import com.ruoyi.web.controller.tool.MsgUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.temporal.ChronoUnit;
-import java.util.Arrays;
-import java.util.List;
+import java.util.*;
 
 /**
  * <p>
@@ -46,12 +60,16 @@
     private final TSysInspectionService sysInspectionService;
     private final TSysOrderService sysOrderService;
     private final TSysChronicDiseaseService sysChronicDiseaseService;
+    private final MsgUtils msgUtils;
+    private final TSysMessageTemplateService sysMessageTemplateService;
     @Autowired
-    public TSysAppUserController(TSysAppUserService sysAppUserService, TSysInspectionService sysInspectionService, TSysOrderService sysOrderService, TSysChronicDiseaseService sysChronicDiseaseService) {
+    public TSysAppUserController(TSysAppUserService sysAppUserService, TSysInspectionService sysInspectionService, TSysOrderService sysOrderService, TSysChronicDiseaseService sysChronicDiseaseService, MsgUtils msgUtils, TSysMessageTemplateService sysMessageTemplateService) {
         this.sysAppUserService = sysAppUserService;
         this.sysInspectionService = sysInspectionService;
         this.sysOrderService = sysOrderService;
         this.sysChronicDiseaseService = sysChronicDiseaseService;
+        this.msgUtils = msgUtils;
+        this.sysMessageTemplateService = sysMessageTemplateService;
     }
 
     /**
@@ -70,6 +88,30 @@
     @PostMapping(value = "/pageChronicDiseaseUserList")
     public R<PageInfo<TSysAppUserVO>> pageChronicDiseaseUserList(@RequestBody TSysAppUserQuery query) {
         return R.ok(sysAppUserService.pageChronicDiseaseUserList(query));
+    }
+
+
+    /**
+     * 用药提醒
+     */
+    @ApiOperation(value = "慢性病患者-用药提醒", notes = "userId:患者用户id,templateId:短信模板id")
+    @GetMapping(value = "/medicationReminder")
+    public R<String> medicationReminder(@RequestParam(value = "userId") String userId,
+                                                         @RequestParam(value = "templateId") String templateId) {
+        TSysAppUser sysAppUser = sysAppUserService.getById(userId);
+        if(StringUtils.isNotBlank(sysAppUser.getPhone())){
+            sysAppUser.setLastReminderTime(LocalDateTime.now());
+            sysAppUserService.updateById(sysAppUser);
+            TSysMessageTemplate messageTemplate = sysMessageTemplateService.getById(templateId);
+            // 发送短信
+            try {
+                Map<String,String> params = new HashMap<>();
+                msgUtils.sendMsg(sysAppUser.getPhone(),params, messageTemplate.getTemplateCode());
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+        return R.ok();
     }
 
     /**
@@ -197,5 +239,105 @@
         return R.ok();
     }
 
+    @Log(title = "用户管理信息-慢性病患者导出-平台", businessType = BusinessType.EXPORT)
+    @ApiOperation(value = "慢性病患者导出-平台")
+    @PostMapping("/exportList")
+    public void exportList(@RequestBody TSysAppUserQuery query){
+        List<TSysAppUserListExport> sysAppUserListExports = sysAppUserService.exportList(query);
+        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TSysAppUserListExport.class, sysAppUserListExports);
+        HttpServletResponse response = WebUtils.response();
+        assert response != null;
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        ServletOutputStream outputStream = null;
+        try {
+            String fileName = URLEncoder.encode("慢性病患者.xls", "utf-8");
+            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
+            response.setHeader("Pragma", "no-cache");
+            response.setHeader("Cache-Control", "no-cache");
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                outputStream.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+    @Log(title = "用户管理信息-慢性病患者导出-诊所", businessType = BusinessType.EXPORT)
+    @ApiOperation(value = "慢性病患者导出-诊所")
+    @PostMapping("/exportListClinic")
+    public void exportListClinic(@RequestBody TSysAppUserQuery query){
+        List<TSysAppUserClinicExport> sysAppUserClinicExports = sysAppUserService.exportListClinic(query);
+        for (TSysAppUserClinicExport sysAppUserClinicExport : sysAppUserClinicExports) {
+            String lastReminderTime = sysAppUserClinicExport.getLastReminderTime();
+            lastReminderTime = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(lastReminderTime);
+            sysAppUserClinicExport.setLastReminderTime(lastReminderTime);
+        }
+        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TSysAppUserClinicExport.class, sysAppUserClinicExports);
+        HttpServletResponse response = WebUtils.response();
+        assert response != null;
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        ServletOutputStream outputStream = null;
+        try {
+            String fileName = URLEncoder.encode("慢性病患者.xls", "utf-8");
+            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
+            response.setHeader("Pragma", "no-cache");
+            response.setHeader("Cache-Control", "no-cache");
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                outputStream.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    @Log(title = "用户管理信息-用户管理信息导出", businessType = BusinessType.EXPORT)
+    @ApiOperation(value = "用户管理信息导出")
+    @PostMapping("/exportListAppUser")
+    public void exportListAppUser(@RequestBody TSysAppUserQuery query){
+        List<TSysAppUserExport> sysAppUserExports = sysAppUserService.exportListAppUser(query);
+        for (TSysAppUserExport sysAppUserExport : sysAppUserExports) {
+            String lastInspectionTime = sysAppUserExport.getLastInspectionTime();
+            lastInspectionTime = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(lastInspectionTime);
+            sysAppUserExport.setLastInspectionTime(lastInspectionTime);
+            sysAppUserExport.setCreateTimeStr(sysAppUserExport.getCreateTime().toLocalDate().toString());
+        }
+        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TSysAppUserClinicExport.class, sysAppUserExports);
+        HttpServletResponse response = WebUtils.response();
+        assert response != null;
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        ServletOutputStream outputStream = null;
+        try {
+            String fileName = URLEncoder.encode("用户管理信息.xls", "utf-8");
+            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
+            response.setHeader("Pragma", "no-cache");
+            response.setHeader("Cache-Control", "no-cache");
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                outputStream.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
 }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java
index 49621b3..5609584 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java
@@ -1,17 +1,29 @@
 package com.ruoyi.web.controller.task;
 
 import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.utils.http.HttpUtils;
+import com.ruoyi.system.model.TCrmClinic;
+import com.ruoyi.system.model.TErpProcurement;
+import com.ruoyi.system.service.TCrmClinicService;
+import com.ruoyi.system.service.TErpProcurementService;
 import com.ruoyi.system.utils.util.AIUtil;
+import com.ruoyi.system.vo.TCrmClinicVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * @author xiaochen
@@ -24,6 +36,10 @@
     private RedisCache redisCache;
     @Autowired
     private AIUtil aiUtil;
+    @Autowired
+    private TCrmClinicService crmClinicService;
+    @Autowired
+    private TErpProcurementService erpProcurementService;
 
     @Scheduled(fixedRate = 86460000)
 //    @Scheduled(cron = "10 0 0 * * ?")
@@ -44,5 +60,29 @@
         }
     }
 
+    @Scheduled(cron = "10 0 0 * * ?")
+    public void monthUpdateClinicPerformance() {
+        try {
+            // 判断哪些诊所本月没有业绩达标
+            List<TCrmClinic> clinics = crmClinicService.list();
+            List<TErpProcurement> procurements = erpProcurementService.list(Wrappers.lambdaQuery(TErpProcurement.class)
+                    .in(TErpProcurement::getStatus, Arrays.asList(3,4,5))
+                    .likeRight(TErpProcurement::getCreateTime, LocalDate.now()));
+            for (TCrmClinic clinic : clinics) {
+                List<TErpProcurement> procurementList = procurements.stream().filter(procurement -> procurement.getClinicId().equals(clinic.getId())).collect(Collectors.toList());
+                if(!CollectionUtils.isEmpty(procurementList)){
+                    BigDecimal monthPurchaseAmount = procurementList.stream().map(TErpProcurement::getPayMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    // 未达标
+                    if(monthPurchaseAmount.compareTo(clinic.getLowProcurementMoney())<0){
+                        clinic.setPerformanceCount(clinic.getPerformanceCount()+1);
+                    }
+                }
+            }
+            crmClinicService.updateBatchById(clinics);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
 
 }
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
index 08215dd..10a2f75 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -1,9 +1,6 @@
 package com.ruoyi.web.controller.system;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -16,15 +13,17 @@
 import com.ruoyi.common.redis.service.RedisService;
 import com.ruoyi.framework.web.service.TokenService;
 import com.ruoyi.system.model.TSysAppUser;
-import com.ruoyi.system.service.ISysRoleService;
-import com.ruoyi.system.service.TSysAppUserService;
+import com.ruoyi.system.model.TSysMessageTemplate;
+import com.ruoyi.system.service.*;
 import com.ruoyi.system.utils.wx.body.resp.Code2SessionRespBody;
 import com.ruoyi.system.utils.wx.body.resq.Code2SessionResqBody;
 import com.ruoyi.system.utils.wx.model.WeixinProperties;
 import com.ruoyi.system.utils.wx.pojo.AppletUserDecodeData;
 import com.ruoyi.system.utils.wx.pojo.AppletUserEncrypteData;
+import com.ruoyi.system.utils.wx.pojo.OfficeUserEncrypteData;
 import com.ruoyi.system.utils.wx.tools.WxAppletTools;
 import com.ruoyi.system.utils.wx.tools.WxUtils;
+import com.ruoyi.web.controller.tool.MsgUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -41,7 +40,6 @@
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.framework.web.service.SysLoginService;
 import com.ruoyi.framework.web.service.SysPermissionService;
-import com.ruoyi.system.service.ISysMenuService;
 import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.Resource;
@@ -74,10 +72,16 @@
     private WeixinProperties wxConfig;
     @Autowired
     private RestTemplate wxRestTemplate;
-    @Resource
+    @Autowired
+    private MsgUtils msgUtils;
+    @Autowired
+    private TSysMessageTemplateService sysMessageTemplateService;
+    @Autowired
     private RedisService redisService;
-    @Resource
+    @Autowired
     private TSysAppUserService sysAppUserService;
+    @Autowired
+    private ISysUserService sysUserService;
     /**
      * 账号密码登录
      * 
@@ -152,6 +156,33 @@
         return R.ok(tokenInfos);
     }
 
+    @ApiOperation(value = "通过code获得openid",tags = {"微信服务号、公众号登录"})
+    @PostMapping("/openIdByCode")
+    public R<Map<String, Object>> openIdByCode(@RequestBody OfficeUserEncrypteData data) {
+        log.info("<<<<<<<<换取openid开始<<<<<<<<:{}", data.getCode());
+        WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig, redisService);
+        Code2SessionRespBody body = appletTools.getOpenIdByJscode2session(new Code2SessionResqBody().build(data.getCode()));
+        String openid = body.getOpenid();
+        String phone = data.getPhone();
+        if(StringUtils.isEmpty(phone)){
+            return R.fail("请输入手机号");
+        }
+        TSysAppUser sysAppUser = sysAppUserService.getOne(Wrappers.lambdaQuery(TSysAppUser.class)
+                        .eq(TSysAppUser::getPhone, phone));
+        if(Objects.nonNull(sysAppUser)){
+            sysAppUser.setOfficeOpenId(openid);
+            sysAppUserService.updateById(sysAppUser);
+        }
+        // 获取诊所信息
+        SysUser sysUser = sysUserService.selectByPhone(phone);
+        if(Objects.nonNull(sysUser) && (sysUser.getRoleType() == 5 || sysUser.getRoleType() == 3)){
+            // 诊所
+            sysUser.setOpenId(openid);
+            sysUserService.updateUserInfo(sysUser);
+        }
+        return R.ok();
+    }
+
     /**
      * 账号密码登录
      *
@@ -185,7 +216,11 @@
             String code = String.valueOf((int) (Math.random() * 1000000));
             redisCache.setCacheObject(phone, code,5*60,TimeUnit.SECONDS);
             try {
-//                smsUtil.sendSms(phone, "2369926", new String[]{code});
+                TSysMessageTemplate messageTemplate = sysMessageTemplateService.getOne(Wrappers.lambdaQuery(TSysMessageTemplate.class)
+                        .eq(TSysMessageTemplate::getTemplateType, 1));
+                Map<String,String> params = new HashMap<>();
+                params.put("code", code);
+                msgUtils.sendMsg(phone, params, messageTemplate.getTemplateCode());
             } catch (Exception e) {
                 throw new RuntimeException(e);
             }
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/tool/MsgUtils.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/tool/MsgUtils.java
new file mode 100644
index 0000000..21965ba
--- /dev/null
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/tool/MsgUtils.java
@@ -0,0 +1,75 @@
+package com.ruoyi.web.controller.tool;
+
+import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
+import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
+import com.aliyun.tea.TeaException;
+import com.aliyun.teaopenapi.models.Config;
+import com.aliyun.teautil.models.RuntimeOptions;
+import com.ruoyi.system.model.TSysMessageConfig;
+import com.ruoyi.system.service.TSysMessageConfigService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Map;
+
+@Component
+@Slf4j
+public class MsgUtils {
+
+    @Autowired
+    private TSysMessageConfigService messageConfigService;
+
+    /**
+     * 使用AK&SK初始化账号Client
+     * @param accessKeyId
+     * @param accessKeySecret
+     * @return Client
+     * @throws Exception
+     */
+    public static com.aliyun.dysmsapi20170525.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
+        Config config = new Config()
+                // 您的 AccessKey ID
+                .setAccessKeyId(accessKeyId)
+                // 您的 AccessKey Secret
+                .setAccessKeySecret(accessKeySecret);
+        // 访问的域名
+        config.endpoint = "dysmsapi.aliyuncs.com";
+        return new com.aliyun.dysmsapi20170525.Client(config);
+    }
+
+    public void sendMsg(String phone, Map<String,String> params, String templateCode) throws Exception {
+        TSysMessageConfig sysMessageConfig = messageConfigService.getById(1);
+        com.aliyun.dysmsapi20170525.Client client = MsgUtils.createClient(sysMessageConfig.getAccessKeyId(),sysMessageConfig.getAccessKeySecret());
+        SendSmsRequest sendSmsRequest = new SendSmsRequest()
+                .setSignName(sysMessageConfig.getSignName())
+                .setTemplateCode(templateCode)
+                .setPhoneNumbers(phone);
+        if(!CollectionUtils.isEmpty(params)){
+            StringBuilder builder = new StringBuilder();
+            params.forEach((key,value)->{
+                builder.append("\""+key+"\":\""+value+"\"");
+                builder.append(",");
+            });
+            builder.deleteCharAt(builder.length()-1);
+            sendSmsRequest.setTemplateParam("{"+builder.toString()+"}");
+        }
+        RuntimeOptions runtime = new RuntimeOptions();
+        try {
+            // 复制代码运行请自行打印 API 的返回值
+            SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, runtime);
+            log.info("短信发送成功:{},{}",sendSmsResponse.getBody().getMessage(),sendSmsResponse.getStatusCode());
+        } catch (TeaException error) {
+            // 如有需要,请打印 error
+            com.aliyun.teautil.Common.assertAsString(error.message);
+            log.info("短信发送失败:{}",error.message);
+        } catch (Exception _error) {
+            TeaException error = new TeaException(_error.getMessage(), _error);
+            // 如有需要,请打印 error
+            com.aliyun.teautil.Common.assertAsString(error.message);
+            log.info("短信发送失败:{}",error.message);
+        }
+    }
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java
index 168cac4..9f58e47 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java
@@ -206,5 +206,5 @@
     /**
      * 模板消息发送地址
      */
-    public static final String OFFICIAL_ACCOUNT_TEMPLATE_URL = "https://api.weixin.qq.com/cgi-bin/message/template/subscribe?access_token=ACCESS_TOKEN";
+    public static final String OFFICIAL_ACCOUNT_TEMPLATE_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/export/TCrmBranchExport.java b/ruoyi-system/src/main/java/com/ruoyi/system/export/TCrmBranchExport.java
new file mode 100644
index 0000000..1adbe35
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/export/TCrmBranchExport.java
@@ -0,0 +1,42 @@
+package com.ruoyi.system.export;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelCollection;
+import com.ruoyi.system.model.TCrmBranchSalary;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@ApiModel(value = "crm分公司管理导出TCrmBranchExport")
+public class TCrmBranchExport implements Serializable {
+
+    @Excel(name = "分公司名称", width = 20,needMerge = true)
+    private String branchName;
+
+    @Excel(name = "负责人姓名", width = 20,needMerge = true)
+    private String userName;
+
+    @Excel(name = "联系电话", width = 20,needMerge = true)
+    private String phone;
+
+    @Excel(name = "剩余积分数", width = 20,needMerge = true)
+    private Integer userPoints;
+
+    @Excel(name = "管辖区域", width = 20,needMerge = true)
+    private String areaNames;
+
+    @Excel(name = "获取1积分所需采购金额", width = 20,needMerge = true)
+    private BigDecimal pointsCommission;
+
+    @Excel(name = "分佣比例", width = 20,needMerge = true)
+    private BigDecimal moneyCommission;
+
+    @ExcelCollection(name = "职位薪资")
+    private List<TCrmBranchSalary> crmBranchSalaries;
+    private String id;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/export/TCrmClinicAuditExport.java b/ruoyi-system/src/main/java/com/ruoyi/system/export/TCrmClinicAuditExport.java
new file mode 100644
index 0000000..f6d6bdb
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/export/TCrmClinicAuditExport.java
@@ -0,0 +1,31 @@
+package com.ruoyi.system.export;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@ApiModel(value = "诊所审核导出TCrmClinicAuditExport")
+public class TCrmClinicAuditExport implements Serializable {
+
+    private String id;
+    @Excel(name = "诊所名称",width = 20)
+    private String clinicName;
+    @Excel(name = "负责人姓名",width = 20)
+    private String personChargeName;
+    @Excel(name = "联系电话",width = 20)
+    private String phone;
+    @Excel(name = "所属分公司",width = 20)
+    private String branchName;
+    @Excel(name = "负责业务员",width = 20)
+    private String salespersonName;
+    @Excel(name = "每月最低采购金额",width = 20)
+    private String lowProcurementMoneyStr;
+    private String lowProcurementMoney;
+    @Excel(name = "状态",width = 20,replace = {"待审核_1","已拒绝_2","使用中_3","冻结_4"})
+    private Integer status;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/export/TCrmClinicListExport.java b/ruoyi-system/src/main/java/com/ruoyi/system/export/TCrmClinicListExport.java
new file mode 100644
index 0000000..09aa5e7
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/export/TCrmClinicListExport.java
@@ -0,0 +1,37 @@
+package com.ruoyi.system.export;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value = "诊所审核导出TCrmClinicAuditExport")
+public class TCrmClinicListExport implements Serializable {
+    private String id;
+    @Excel(name = "诊所名称",width = 20)
+    private String clinicName;
+    @Excel(name = "负责人姓名",width = 20)
+    private String personChargeName;
+    @Excel(name = "联系电话",width = 20)
+    private String phone;
+    @Excel(name = "所属分公司",width = 20)
+    private String branchName;
+    @Excel(name = "负责业务员",width = 20)
+    private String salespersonName;
+    @Excel(name = "剩余积分",width = 20)
+    private Integer userPoints;
+    @Excel(name = "每月最低采购金额",width = 20)
+    private String lowProcurementMoneyStr;
+    private BigDecimal lowProcurementMoney;
+    @Excel(name = "当月采购金额",width = 20)
+    private String monthPurchaseAmountStr;
+    private BigDecimal monthPurchaseAmount;
+    @Excel(name = "业绩状态",width = 20,replace = {"未达成_1","已达成_2"})
+    private Integer performanceStatus;
+    @Excel(name = "状态",width = 20,replace = {"待审核_1","已拒绝_2","使用中_3","冻结_4"})
+    private Integer status;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/export/TSysAppUserClinicExport.java b/ruoyi-system/src/main/java/com/ruoyi/system/export/TSysAppUserClinicExport.java
new file mode 100644
index 0000000..06370ec
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/export/TSysAppUserClinicExport.java
@@ -0,0 +1,33 @@
+package com.ruoyi.system.export;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel(value = "慢性病患者管理列表导出诊所TSysAppUserClinicExport")
+public class TSysAppUserClinicExport implements Serializable {
+    @Excel(name = "用户姓名", width = 20)
+    private String nickName;
+
+    @Excel(name = "联系电话", width = 20)
+    private String phone;
+
+    @Excel(name = "性别 1=男 2=女", width = 20,replace = {"男_1","女_2"})
+    private Integer sex;
+
+    @Excel(name = "年龄", width = 20)
+    private Long age;
+
+    @Excel(name = "慢性病名称拼接", width = 20)
+    private String sysChronicDiseaseNames;
+
+    @Excel(name = "上次短信提醒时间", width = 20)
+    private String lastReminderTime;
+    private String chronicDiseaseId;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/export/TSysAppUserExport.java b/ruoyi-system/src/main/java/com/ruoyi/system/export/TSysAppUserExport.java
new file mode 100644
index 0000000..f8f4d71
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/export/TSysAppUserExport.java
@@ -0,0 +1,40 @@
+package com.ruoyi.system.export;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@ApiModel(value = "慢性病患者管理列表导出诊所TSysAppUserClinicExport")
+public class TSysAppUserExport implements Serializable {
+    @Excel(name = "用户姓名", width = 20)
+    private String nickName;
+
+    @Excel(name = "联系电话", width = 20)
+    private String phone;
+
+    @Excel(name = "性别 1=男 2=女", width = 20,replace = {"男_1","女_2"})
+    private Integer sex;
+
+    @Excel(name = "年龄", width = 20)
+    private Long age;
+
+    @Excel(name = "是否慢性病患者", width = 20,replace = {"是_1","否_0"})
+    private Integer isInspection;
+
+    @Excel(name = "慢性病名称拼接", width = 20)
+    private String sysChronicDiseaseNames;
+
+    @Excel(name = "最近检测时间", width = 20)
+    private String lastInspectionTime;
+    @Excel(name = "注册时间", width = 20)
+    private String createTimeStr;
+    private LocalDateTime createTime;
+    private String chronicDiseaseId;
+    private LocalDateTime birthTime;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/export/TSysAppUserListExport.java b/ruoyi-system/src/main/java/com/ruoyi/system/export/TSysAppUserListExport.java
new file mode 100644
index 0000000..a04dd70
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/export/TSysAppUserListExport.java
@@ -0,0 +1,30 @@
+package com.ruoyi.system.export;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel(value = "慢性病患者管理列表导出平台TSysAppUserListExport")
+public class TSysAppUserListExport implements Serializable {
+    @Excel(name = "用户姓名", width = 20)
+    private String nickName;
+
+    @Excel(name = "联系电话", width = 20)
+    private String phone;
+
+    @Excel(name = "性别 1=男 2=女", width = 20,replace = {"男_1","女_2"})
+    private Integer sex;
+
+    @Excel(name = "年龄", width = 20)
+    private Long age;
+
+    @Excel(name = "慢性病名称拼接", width = 20)
+    private String sysChronicDiseaseNames;
+    private String chronicDiseaseId;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/listener/PublishTopicLiveInfoEventListener.java b/ruoyi-system/src/main/java/com/ruoyi/system/listener/PublishTopicLiveInfoEventListener.java
index 1b8cdd9..fc626c0 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/listener/PublishTopicLiveInfoEventListener.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/listener/PublishTopicLiveInfoEventListener.java
@@ -2,6 +2,7 @@
 
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.listener.event.PublishTopicLiveInfoEvent;
 import com.ruoyi.system.model.TCrmClinic;
 import com.ruoyi.system.model.TCrmSalesperson;
@@ -67,7 +68,9 @@
                     List<Long> userIds = clinicList.stream().map(TCrmClinic::getUserId).collect(Collectors.toList());
                     List<SysUser> sysUserList = sysUserService.selectUserListByIds(userIds);
                     for (SysUser user : sysUserList) {
-                        templateMessageSendUtil.wxOfficeTemplateAppLiveRequest(user.getOpenId(),liveTitle,liveStartTime);
+                        if(StringUtils.isNotEmpty(user.getOpenId())){
+                            templateMessageSendUtil.wxOfficeTemplateAppLiveRequest(user.getOpenId(),liveTitle,liveStartTime);
+                        }
                     }
                 }
             }
@@ -75,7 +78,9 @@
                 // 用户
                 List<TSysAppUser> sysAppUsers = sysAppUserService.list();
                 for (TSysAppUser sysAppUser : sysAppUsers) {
-                    templateMessageSendUtil.wxOfficeTemplateAppLiveRequest(sysAppUser.getOfficeOpenId(),liveTitle,liveStartTime);
+                    if(StringUtils.isNotEmpty(sysAppUser.getOfficeOpenId())){
+                        templateMessageSendUtil.wxOfficeTemplateAppLiveRequest(sysAppUser.getOfficeOpenId(),liveTitle,liveStartTime);
+                    }
                 }
             }
             if(pushType.contains("3")){
@@ -85,7 +90,9 @@
                     List<Long> userIds = crmSalespeopleList.stream().map(TCrmSalesperson::getUserId).collect(Collectors.toList());
                     List<SysUser> sysUserList = sysUserService.selectUserListByIds(userIds);
                     for (SysUser user : sysUserList) {
-                        templateMessageSendUtil.wxOfficeTemplateAppLiveRequest(user.getOpenId(),liveTitle,liveStartTime);
+                        if(StringUtils.isNotEmpty(user.getOpenId())){
+                            templateMessageSendUtil.wxOfficeTemplateAppLiveRequest(user.getOpenId(),liveTitle,liveStartTime);
+                        }
                     }
                 }
             }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TCrmBranchMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TCrmBranchMapper.java
index 547fe78..6f915ab 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TCrmBranchMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TCrmBranchMapper.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.system.export.TCrmBranchExport;
 import com.ruoyi.system.model.TCrmBranch;
 import com.ruoyi.system.query.TCrmBranchQuery;
 import com.ruoyi.system.vo.TCrmBranchVO;
@@ -26,4 +27,12 @@
      * @return
      */
     List<TCrmBranchVO> pageList(@Param("query") TCrmBranchQuery query, @Param("pageInfo")PageInfo<TCrmBranchVO> pageInfo);
+
+    /**
+     * 导出列表
+     *
+     * @param query 查询参数
+     * @return
+     */
+    List<TCrmBranchExport> exportList(@Param("query")TCrmBranchQuery query);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TCrmClinicMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TCrmClinicMapper.java
index 594e072..c99a881 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TCrmClinicMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TCrmClinicMapper.java
@@ -2,6 +2,8 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.system.export.TCrmClinicAuditExport;
+import com.ruoyi.system.export.TCrmClinicListExport;
 import com.ruoyi.system.model.TCrmClinic;
 import com.ruoyi.system.query.TCrmClinicQuery;
 import com.ruoyi.system.vo.TCrmClinicVO;
@@ -34,4 +36,19 @@
      */
     List<TCrmClinicVO> pageAuditList(@Param("query") TCrmClinicQuery query, @Param("pageInfo")PageInfo<TCrmClinicVO> pageInfo);
 
+    /**
+     * 审核导出
+     * @param query
+     * @return
+     */
+    List<TCrmClinicAuditExport> exportAudit(@Param("query")TCrmClinicQuery query);
+
+    /**
+     * 列表导出
+     * @param query
+     * @return
+     * @author xiaochen
+     * @date 2025/8/20 10:09
+     */
+    List<TCrmClinicListExport> exportList(@Param("query")TCrmClinicQuery query);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysAppUserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysAppUserMapper.java
index 1b924a5..e4ba32c 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysAppUserMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysAppUserMapper.java
@@ -2,7 +2,11 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.system.export.TSysAppUserClinicExport;
+import com.ruoyi.system.export.TSysAppUserExport;
+import com.ruoyi.system.export.TSysAppUserListExport;
 import com.ruoyi.system.model.TSysAppUser;
+import com.ruoyi.system.query.TCrmClinicQuery;
 import com.ruoyi.system.query.TSysAppUserQuery;
 import com.ruoyi.system.vo.TSysAppUserVO;
 import org.apache.ibatis.annotations.Param;
@@ -34,4 +38,25 @@
      * @return
      */
     List<TSysAppUserVO> pageChronicDiseaseUserList(@Param("query")TSysAppUserQuery query, @Param("pageInfo")PageInfo<TSysAppUserVO> pageInfo);
+
+    /**
+     * 导出列表
+     * @param query
+     * @return
+     */
+    List<TSysAppUserListExport> exportList(@Param("query")TSysAppUserQuery query);
+
+    /**
+     * 导出列表
+     * @param query
+     * @return
+     */
+    List<TSysAppUserClinicExport> exportListClinic(@Param("query")TSysAppUserQuery query);
+
+    /**
+     * 导出列表
+     * @param query
+     * @return
+     */
+    List<TSysAppUserExport> exportListAppUser(@Param("query")TSysAppUserQuery query);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TCrmClinic.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TCrmClinic.java
index df10803..643ae12 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/TCrmClinic.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TCrmClinic.java
@@ -81,4 +81,8 @@
     @TableField("audit_remark")
     private String auditRemark;
 
+    @ApiModelProperty(value = "业绩未达标次数")
+    @TableField("performance_count")
+    private Integer performanceCount;
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TSysMessageTemplate.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TSysMessageTemplate.java
index efddfcd..3e85c2c 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/TSysMessageTemplate.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TSysMessageTemplate.java
@@ -41,4 +41,8 @@
     @TableField("template_content")
     private String templateContent;
 
+    @ApiModelProperty(value = "类型 1=验证码 2=业绩提醒 3=用药提醒")
+    @TableField("template_type")
+    private Integer templateType;
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/TCrmClinicQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/TCrmClinicQuery.java
index c3eaab6..78b19ff 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/query/TCrmClinicQuery.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/TCrmClinicQuery.java
@@ -4,6 +4,9 @@
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.joda.time.LocalDateTime;
+
+import java.time.LocalDate;
 
 @Data
 @ApiModel(value = "crm诊所管理查询参数TCrmClinicQuery")
@@ -24,7 +27,7 @@
     @ApiModelProperty(value = "业务员id")
     private String salespersonId;
 
-    @ApiModelProperty(value = "业绩状态 1=已达成 2=未达成")
+    @ApiModelProperty(value = "业绩状态 1=未达成 2=已达成")
     private Integer performanceStatus;
 
     @ApiModelProperty(value = "状态 1=待审核 2=已拒绝 3=使用中 4=冻结")
@@ -34,5 +37,7 @@
     private Long userId;
     @ApiModelProperty(value = "前端忽略")
     private Integer roleType;
+    @ApiModelProperty(value = "前端忽略")
+    private LocalDate createTime;
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
index d5eecd4..3b8c231 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
@@ -266,4 +266,6 @@
     void updateUserStatusByUserIds(List<Long> userIds, String status);
 
     List<SysUser> selectUserListByIds(List<Long> userIds);
+
+    int updateUserInfo(SysUser sysUser);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TCrmBranchService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TCrmBranchService.java
index 56dca70..e499585 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TCrmBranchService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TCrmBranchService.java
@@ -4,10 +4,14 @@
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.system.dto.TCrmBranchDTO;
+import com.ruoyi.system.export.TCrmBranchExport;
 import com.ruoyi.system.model.TCrmBranch;
 import com.ruoyi.system.model.TCrmDevice;
 import com.ruoyi.system.query.TCrmBranchQuery;
+import com.ruoyi.system.query.TSysAppUserQuery;
 import com.ruoyi.system.vo.TCrmBranchVO;
+
+import java.util.List;
 
 /**
  * <p>
@@ -45,4 +49,11 @@
      * @return
      */
     R<Boolean> updateBranch(TCrmBranchDTO dto);
+
+    /**
+     * 导出
+     * @param query
+     * @return
+     */
+    List<TCrmBranchExport> exportList(TCrmBranchQuery query);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TCrmClinicService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TCrmClinicService.java
index cd06ddc..a4a5fb3 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TCrmClinicService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TCrmClinicService.java
@@ -4,9 +4,13 @@
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.system.dto.TCrmClinicDTO;
+import com.ruoyi.system.export.TCrmClinicAuditExport;
+import com.ruoyi.system.export.TCrmClinicListExport;
 import com.ruoyi.system.model.TCrmClinic;
 import com.ruoyi.system.query.TCrmClinicQuery;
 import com.ruoyi.system.vo.TCrmClinicVO;
+
+import java.util.List;
 
 /**
  * <p>
@@ -44,4 +48,18 @@
      * @return
      */
     R<Boolean> updateClinic(TCrmClinicDTO dto);
+
+    /**
+     * 获取crm诊所管理审核列表
+     * @param query
+     * @return
+     */
+    List<TCrmClinicAuditExport> exportAudit(TCrmClinicQuery query);
+
+    /**
+     * 获取crm诊所管理列表导出
+     * @param query
+     * @return
+     */
+    List<TCrmClinicListExport> exportList(TCrmClinicQuery query);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TSysAppUserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TSysAppUserService.java
index 83dce4b..2fa554b 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TSysAppUserService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TSysAppUserService.java
@@ -2,9 +2,15 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.system.export.TSysAppUserClinicExport;
+import com.ruoyi.system.export.TSysAppUserExport;
+import com.ruoyi.system.export.TSysAppUserListExport;
 import com.ruoyi.system.model.TSysAppUser;
+import com.ruoyi.system.query.TCrmClinicQuery;
 import com.ruoyi.system.query.TSysAppUserQuery;
 import com.ruoyi.system.vo.TSysAppUserVO;
+
+import java.util.List;
 
 /**
  * <p>
@@ -36,4 +42,25 @@
      * @return
      */
     PageInfo<TSysAppUserVO> pageChronicDiseaseUserList(TSysAppUserQuery query);
+
+    /**
+     * 患者导出平台
+     * @param query
+     * @return
+     */
+    List<TSysAppUserListExport> exportList(TSysAppUserQuery query);
+
+    /**
+     * 患者导出诊所
+     * @param query
+     * @return
+     */
+    List<TSysAppUserClinicExport> exportListClinic(TSysAppUserQuery query);
+
+    /**
+     * 患者导出APP
+     * @param query
+     * @return
+     */
+    List<TSysAppUserExport> exportListAppUser(TSysAppUserQuery query);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
index 547decd..35894d3 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -674,6 +674,11 @@
         return userMapper.selectUserListByIds(userIds);
     }
 
+    @Override
+    public int updateUserInfo(SysUser sysUser) {
+        return userMapper.updateUser(sysUser);
+    }
+
 //    @Override
 //    public UserInfoVo userInfo(Long userId) {
 //        return userMapper.userInfo(userId);
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCrmBranchServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCrmBranchServiceImpl.java
index 703cb8e..88c8b78 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCrmBranchServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCrmBranchServiceImpl.java
@@ -8,12 +8,14 @@
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.dto.TCrmBranchDTO;
+import com.ruoyi.system.export.TCrmBranchExport;
 import com.ruoyi.system.mapper.SysUserMapper;
 import com.ruoyi.system.mapper.TCrmBranchMapper;
 import com.ruoyi.system.model.TCrmBranch;
 import com.ruoyi.system.model.TCrmBranchArea;
 import com.ruoyi.system.model.TCrmBranchSalary;
 import com.ruoyi.system.query.TCrmBranchQuery;
+import com.ruoyi.system.query.TSysAppUserQuery;
 import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.system.service.TCrmBranchAreaService;
 import com.ruoyi.system.service.TCrmBranchSalaryService;
@@ -190,4 +192,48 @@
 //        }
         return R.ok();
     }
+
+    @Override
+    public List<TCrmBranchExport> exportList(TCrmBranchQuery query) {
+        List<TCrmBranchArea> crmBranchAreas = new ArrayList<>();
+        if(StringUtils.isNotEmpty(query.getCityCode())){
+            crmBranchAreas = crmBranchAreaService.list(Wrappers.lambdaQuery(TCrmBranchArea.class)
+                    .eq(TCrmBranchArea::getCityCode, query.getCityCode()));
+        }
+
+        if(StringUtils.isNotEmpty(query.getProvinceCode())){
+            crmBranchAreas = crmBranchAreaService.list(Wrappers.lambdaQuery(TCrmBranchArea.class)
+                    .eq(TCrmBranchArea::getProvinceCode, query.getProvinceCode()));
+        }
+        if(!CollectionUtils.isEmpty(crmBranchAreas)){
+            List<String> branchIds = crmBranchAreas.stream().map(TCrmBranchArea::getBranchId).collect(Collectors.toList());
+            query.setBranchIds(branchIds);
+        }else {
+            return new ArrayList<>();
+        }
+        List<TCrmBranchExport> list = this.baseMapper.exportList(query);
+        if(CollectionUtils.isEmpty(list)){
+            return list;
+        }
+        List<String> branchIds = list.stream().map(TCrmBranchExport::getId).collect(Collectors.toList());
+        List<TCrmBranchArea> crmBranchAreaList = crmBranchAreaService.list(Wrappers.lambdaQuery(TCrmBranchArea.class)
+                .in(TCrmBranchArea::getBranchId, branchIds));
+        // 查询职位薪资
+        List<TCrmBranchSalary> crmBranchSalaries = crmBranchSalaryService.list(Wrappers.lambdaQuery(TCrmBranchSalary.class)
+                .in(TCrmBranchSalary::getBranchId, branchIds));
+        for (TCrmBranchExport crmBranchExport : list) {
+            List<TCrmBranchArea> tCrmBranchAreas = crmBranchAreaList.stream().filter(t -> t.getBranchId().equals(crmBranchExport.getId())).collect(Collectors.toList());
+            StringBuilder stringBuilder = new StringBuilder();
+            for (TCrmBranchArea tCrmBranchArea : tCrmBranchAreas) {
+                stringBuilder.append(tCrmBranchArea.getProvinceName()).append("-").append(tCrmBranchArea.getCityName()).append(",");
+            }
+            // 去除','
+            stringBuilder.deleteCharAt(stringBuilder.length()-1);
+            crmBranchExport.setAreaNames(stringBuilder.toString());
+            // 职位薪资
+            List<TCrmBranchSalary> crmBranchSalariesList = crmBranchSalaries.stream().filter(t -> t.getBranchId().equals(crmBranchExport.getId())).collect(Collectors.toList());
+            crmBranchExport.setCrmBranchSalaries(crmBranchSalariesList);
+        }
+        return list;
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCrmClinicServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCrmClinicServiceImpl.java
index be11fba..973635f 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCrmClinicServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCrmClinicServiceImpl.java
@@ -1,5 +1,6 @@
 package com.ruoyi.system.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.core.domain.R;
@@ -7,18 +8,27 @@
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.dto.TCrmClinicDTO;
+import com.ruoyi.system.export.TCrmClinicAuditExport;
+import com.ruoyi.system.export.TCrmClinicListExport;
 import com.ruoyi.system.mapper.TCrmClinicMapper;
 import com.ruoyi.system.model.TCrmClinic;
+import com.ruoyi.system.model.TErpProcurement;
 import com.ruoyi.system.query.TCrmClinicQuery;
 import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.system.service.TCrmClinicService;
+import com.ruoyi.system.service.TErpProcurementService;
 import com.ruoyi.system.vo.TCrmClinicVO;
 import com.ruoyi.system.vo.TCrmSupplierVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -33,23 +43,40 @@
 
     @Autowired
     private ISysUserService sysUserService;
+    @Autowired
+    private TErpProcurementService erpProcurementService;
 
     @Override
     public PageInfo<TCrmClinicVO> pageList(TCrmClinicQuery query) {
-
-        // TODO 业绩状态查询处理
-
+        query.setCreateTime(LocalDate.now());
         PageInfo<TCrmClinicVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
         List<TCrmClinicVO> list = this.baseMapper.pageList(query,pageInfo);
+        if(CollectionUtils.isEmpty(list)){
+            return pageInfo;
+        }
+
+        List<String> clinicIds = list.stream().map(TCrmClinicVO::getId).collect(Collectors.toList());
+        List<TErpProcurement> procurements = erpProcurementService.list(Wrappers.lambdaQuery(TErpProcurement.class)
+                .in(TErpProcurement::getClinicId, clinicIds)
+                .in(TErpProcurement::getStatus, Arrays.asList(3,4,5))
+                .likeRight(TErpProcurement::getCreateTime, LocalDate.now()));
+        for (TCrmClinicVO tCrmClinicVO : list) {
+            List<TErpProcurement> procurementList = procurements.stream().filter(procurement -> procurement.getClinicId().equals(tCrmClinicVO.getId())).collect(Collectors.toList());
+            if(!CollectionUtils.isEmpty(procurementList)){
+                tCrmClinicVO.setMonthPurchaseAmount(procurementList.stream().map(TErpProcurement::getPayMoney).reduce(BigDecimal.ZERO, BigDecimal::add));
+            }
+
+            if(Objects.nonNull(tCrmClinicVO.getMonthPurchaseAmount()) && tCrmClinicVO.getMonthPurchaseAmount().compareTo(tCrmClinicVO.getLowProcurementMoney())>0){
+                tCrmClinicVO.setPerformanceStatus(2);
+            }
+
+        }
         pageInfo.setRecords(list);
         return pageInfo;
     }
 
     @Override
     public PageInfo<TCrmClinicVO> pageAuditList(TCrmClinicQuery query) {
-
-        // TODO 业绩状态查询处理
-
         PageInfo<TCrmClinicVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
         List<TCrmClinicVO> list = this.baseMapper.pageAuditList(query,pageInfo);
         pageInfo.setRecords(list);
@@ -101,4 +128,37 @@
         }
         return R.ok();
     }
+
+    @Override
+    public List<TCrmClinicAuditExport> exportAudit(TCrmClinicQuery query) {
+        List<TCrmClinicAuditExport> list = this.baseMapper.exportAudit(query);
+        return list;
+    }
+
+    @Override
+    public List<TCrmClinicListExport> exportList(TCrmClinicQuery query) {
+        query.setCreateTime(LocalDate.now());
+        List<TCrmClinicListExport> list = this.baseMapper.exportList(query);
+        if(CollectionUtils.isEmpty(list)){
+            return list;
+        }
+
+        List<String> clinicIds = list.stream().map(TCrmClinicListExport::getId).collect(Collectors.toList());
+        List<TErpProcurement> procurements = erpProcurementService.list(Wrappers.lambdaQuery(TErpProcurement.class)
+                .in(TErpProcurement::getClinicId, clinicIds)
+                .in(TErpProcurement::getStatus, Arrays.asList(3,4,5))
+                .likeRight(TErpProcurement::getCreateTime, LocalDate.now()));
+        for (TCrmClinicListExport crmClinicListExport : list) {
+            List<TErpProcurement> procurementList = procurements.stream().filter(procurement -> procurement.getClinicId().equals(crmClinicListExport.getId())).collect(Collectors.toList());
+            if(!CollectionUtils.isEmpty(procurementList)){
+                crmClinicListExport.setMonthPurchaseAmount(procurementList.stream().map(TErpProcurement::getPayMoney).reduce(BigDecimal.ZERO, BigDecimal::add));
+            }
+
+            if(Objects.nonNull(crmClinicListExport.getMonthPurchaseAmount()) && crmClinicListExport.getMonthPurchaseAmount().compareTo(crmClinicListExport.getLowProcurementMoney())>0){
+                crmClinicListExport.setPerformanceStatus(2);
+            }
+
+        }
+        return list;
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysActivityServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysActivityServiceImpl.java
index 17b0a55..b817626 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysActivityServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysActivityServiceImpl.java
@@ -16,6 +16,7 @@
 import org.springframework.util.CollectionUtils;
 
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
 
 /**
@@ -37,7 +38,7 @@
         if (CollectionUtils.isEmpty(list)){
             return pageInfo;
         }
-        if(query.getRoleType() == 5){
+        if(Objects.nonNull(query.getRoleType()) && query.getRoleType() == 5){
             Long userId = query.getUserId();
             for (TSysActivityVO sysActivityVO : list) {
                 Set<Long> cacheSet = redisCache.getCacheSet(Constants.SYS_ACTIVITY_CLICK_COUNT + sysActivityVO.getId());
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysAppUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysAppUserServiceImpl.java
index 4d9be97..b957e81 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysAppUserServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysAppUserServiceImpl.java
@@ -4,12 +4,16 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.export.TSysAppUserClinicExport;
+import com.ruoyi.system.export.TSysAppUserExport;
+import com.ruoyi.system.export.TSysAppUserListExport;
 import com.ruoyi.system.mapper.TSysAppUserMapper;
 import com.ruoyi.system.mapper.TSysChronicDiseaseMapper;
 import com.ruoyi.system.model.TSysAppUser;
 import com.ruoyi.system.model.TSysActivity;
 import com.ruoyi.system.model.TSysAppUser;
 import com.ruoyi.system.model.TSysChronicDisease;
+import com.ruoyi.system.query.TCrmClinicQuery;
 import com.ruoyi.system.query.TSysAppUserQuery;
 import com.ruoyi.system.service.TSysAppUserService;
 import com.ruoyi.system.vo.TSysAppUserVO;
@@ -48,6 +52,11 @@
             if(tSysAppUserVO.getBirthTime() != null){
                 long age = ChronoUnit.YEARS.between(tSysAppUserVO.getBirthTime(), LocalDateTime.now());
                 tSysAppUserVO.setAge(age);
+            }
+            if(StringUtils.isNotEmpty(tSysAppUserVO.getChronicDiseaseId())){
+                tSysAppUserVO.setIsInspection(1);
+            }else {
+                tSysAppUserVO.setIsInspection(0);
             }
         });
         pageInfo.setRecords(list);
@@ -92,4 +101,75 @@
         pageInfo.setRecords(list);
         return pageInfo;
     }
+
+    @Override
+    public List<TSysAppUserListExport> exportList(TSysAppUserQuery query) {
+        List<TSysAppUserListExport> list = this.baseMapper.exportList(query);
+        if(CollectionUtils.isEmpty(list)){
+            return list;
+        }
+        List<TSysChronicDisease> sysChronicDiseaseList = sysChronicDiseaseMapper.selectList(Wrappers.lambdaQuery(TSysChronicDisease.class));
+        for (TSysAppUserListExport sysAppUserListExport : list) {
+            String chronicDiseaseId = sysAppUserListExport.getChronicDiseaseId();
+            String[] split = chronicDiseaseId.split(",");
+            StringBuilder stringBuilder = new StringBuilder();
+            for (String diseaseId : split) {
+                List<TSysChronicDisease> chronicDiseaseList = sysChronicDiseaseList.stream().filter(disease -> disease.getId().equals(diseaseId)).collect(Collectors.toList());
+                // 最后一位不拼接逗号
+                if(diseaseId.equals(split[split.length-1])){
+                    stringBuilder.append(chronicDiseaseList.get(0).getChronicName());
+                }else{
+                    stringBuilder.append(chronicDiseaseList.get(0).getChronicName()).append(",");
+                }
+            }
+            sysAppUserListExport.setSysChronicDiseaseNames(stringBuilder.toString());
+        }
+        return list;
+    }
+
+    @Override
+    public List<TSysAppUserClinicExport> exportListClinic(TSysAppUserQuery query) {
+        List<TSysAppUserClinicExport> list = this.baseMapper.exportListClinic(query);
+        if(CollectionUtils.isEmpty(list)){
+            return list;
+        }
+        List<TSysChronicDisease> sysChronicDiseaseList = sysChronicDiseaseMapper.selectList(Wrappers.lambdaQuery(TSysChronicDisease.class));
+        for (TSysAppUserClinicExport sysAppUserClinicExport : list) {
+            String chronicDiseaseId = sysAppUserClinicExport.getChronicDiseaseId();
+            String[] split = chronicDiseaseId.split(",");
+            StringBuilder stringBuilder = new StringBuilder();
+            for (String diseaseId : split) {
+                List<TSysChronicDisease> chronicDiseaseList = sysChronicDiseaseList.stream().filter(disease -> disease.getId().equals(diseaseId)).collect(Collectors.toList());
+                // 最后一位不拼接逗号
+                if(diseaseId.equals(split[split.length-1])){
+                    stringBuilder.append(chronicDiseaseList.get(0).getChronicName());
+                }else{
+                    stringBuilder.append(chronicDiseaseList.get(0).getChronicName()).append(",");
+                }
+            }
+            sysAppUserClinicExport.setSysChronicDiseaseNames(stringBuilder.toString());
+        }
+        return list;
+    }
+
+    @Override
+    public List<TSysAppUserExport> exportListAppUser(TSysAppUserQuery query) {
+        List<TSysAppUserExport> list = this.baseMapper.exportListAppUser(query);
+        if(CollectionUtils.isEmpty(list)){
+            return list;
+        }
+        // 年龄计算
+        list.forEach(tSysAppUserVO -> {
+            if(tSysAppUserVO.getBirthTime() != null){
+                long age = ChronoUnit.YEARS.between(tSysAppUserVO.getBirthTime(), LocalDateTime.now());
+                tSysAppUserVO.setAge(age);
+            }
+            if(StringUtils.isNotEmpty(tSysAppUserVO.getChronicDiseaseId())){
+                tSysAppUserVO.setIsInspection(1);
+            }else {
+                tSysAppUserVO.setIsInspection(0);
+            }
+        });
+        return list;
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysEducationalInfoServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysEducationalInfoServiceImpl.java
index daade89..abaf8fa 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysEducationalInfoServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysEducationalInfoServiceImpl.java
@@ -16,6 +16,7 @@
 import org.springframework.util.CollectionUtils;
 
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
 
 /**
@@ -37,7 +38,7 @@
         if (CollectionUtils.isEmpty(list)){
             return pageInfo;
         }
-        if(query.getRoleType() == 5){
+        if(Objects.nonNull(query.getRoleType()) && query.getRoleType() == 5){
             Long userId = query.getUserId();
             for (TSysEducationalInfoVO sysEducationalInfoVO : list) {
                 Set<Long> cacheSet = redisCache.getCacheSet(Constants.SYS_EDUCATION_CLICK_COUNT + sysEducationalInfoVO.getId());
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysLiveServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysLiveServiceImpl.java
index 3b15301..c775106 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysLiveServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysLiveServiceImpl.java
@@ -81,7 +81,7 @@
 //            boolean memberInSet = redisCache.isMemberInSet(Constants.LIVE_APPOINTMENT_PUSH + sysLive.getId(), query.getAppUserId());
 //            sysLive.setAppointmentStatus(memberInSet ? 2 : 1);
 
-            if(query.getRoleType() == 5){
+            if(Objects.nonNull(query.getRoleType()) && query.getRoleType() == 5){
                 Long userId = query.getUserId();
                 Set<Long> cacheSet = redisCache.getCacheSet(Constants.SYS_ACTIVITY_CLICK_COUNT + sysLive.getId());
                 if(cacheSet.contains(userId)){
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysProductIntroductionServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysProductIntroductionServiceImpl.java
index 7c69cb3..f5461df 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysProductIntroductionServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysProductIntroductionServiceImpl.java
@@ -15,6 +15,7 @@
 import org.springframework.util.CollectionUtils;
 
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
 
 /**
@@ -38,7 +39,7 @@
         if (CollectionUtils.isEmpty(list)){
             return pageInfo;
         }
-        if(query.getRoleType() == 5){
+        if(Objects.nonNull(query.getRoleType()) && query.getRoleType() == 5){
             Long userId = query.getUserId();
             for (TSysProductIntroductionVO tSysProductIntroduction : list) {
                 Set<Long> cacheSet = redisCache.getCacheSet(Constants.SYS_PRODUCT_CLICK_COUNT + tSysProductIntroduction.getId());
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/pojo/OfficeUserEncrypteData.java b/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/pojo/OfficeUserEncrypteData.java
new file mode 100644
index 0000000..f13a0e7
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/pojo/OfficeUserEncrypteData.java
@@ -0,0 +1,19 @@
+package com.ruoyi.system.utils.wx.pojo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author xiaochen
+ * @ClassName AppletUserDecodeData
+ * @Description
+ * 小程序加密数据体
+ *
+ */
+@Data
+public class OfficeUserEncrypteData implements Serializable {
+    private String code;
+    private String phone;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/wxTemplateAppLiveResult/WxOfficeTemplateAppLiveResultRequest.java b/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/wxTemplateAppLiveResult/WxOfficeTemplateAppLiveResultRequest.java
index d890571..f0b5fe3 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/wxTemplateAppLiveResult/WxOfficeTemplateAppLiveResultRequest.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/wxTemplateAppLiveResult/WxOfficeTemplateAppLiveResultRequest.java
@@ -14,11 +14,11 @@
     @ApiModelProperty(value = "消息模板id")
     private String template_id;
 
-    @ApiModelProperty(value = "订阅场景值")
-    private String scene = "1000";
-
-    @ApiModelProperty(value = "订阅通知")
-    private String title = "课程预约结果通知";
+//    @ApiModelProperty(value = "订阅场景值")
+//    private String scene = "1000";
+//
+//    @ApiModelProperty(value = "订阅通知")
+//    private String title = "课程预约结果通知";
 
     @ApiModelProperty(value = "消息模板data数据")
     private WxOfficeTemplateAppLiveResultRequestData data;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/tools/WxAppletTools.java b/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/tools/WxAppletTools.java
index 8877ce5..1a4a76c 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/tools/WxAppletTools.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/tools/WxAppletTools.java
@@ -119,7 +119,7 @@
     }
 
     /**
-     * 微信公众号获取openId
+     * 微信公众号/服务号获取openId
      * @param resqBody
      * @return
      */
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TCrmClinicVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TCrmClinicVO.java
index 88432f5..f93aba5 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TCrmClinicVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TCrmClinicVO.java
@@ -23,7 +23,10 @@
     @ApiModelProperty(value = "当月采购金额")
     private BigDecimal monthPurchaseAmount;
 
+    @ApiModelProperty(value = "剩余积分")
+    private Integer userPoints;
+
     @ApiModelProperty(value = "业绩状态 1=未达成 2=已达成")
-    private Integer performanceStatus;
+    private Integer performanceStatus = 1;
 
 }
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
index 454dcb3..5ed8d6f 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -336,11 +336,7 @@
  			<if test="loginDate != null">login_date = #{loginDate},</if>
  			<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
  			<if test="remark != null">remark = #{remark},</if>
-			<if test="ifBlack != null">ifBlack = #{ifBlack},</if>
-			<if test="districtId != null">districtId = #{districtId},</if>
-			<if test="disableRemark != null">disable_remark = #{disableRemark},</if>
-			<if test="operatingTime != null">operating_time = #{operatingTime},</if>
-			<if test="operatingPerson != null">operating_person = #{operatingPerson},</if>
+			<if test="openId != null">open_id = #{openId},</if>
  			update_time = sysdate()
  		</set>
  		where user_id = #{userId}
diff --git a/ruoyi-system/src/main/resources/mapper/system/TCrmBranchMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TCrmBranchMapper.xml
index 6184c2e..7f8547d 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TCrmBranchMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TCrmBranchMapper.xml
@@ -51,5 +51,32 @@
         </where>
         ORDER BY create_time DESC
     </select>
+    <select id="exportList" resultType="com.ruoyi.system.export.TCrmBranchExport">
+        select id, user_id, branch_name, user_name, phone, money_commission, points_commission,
+        user_points, status, create_time, update_time, create_by, update_by, disabled
+        from t_crm_branch
+        <where>
+            <if test="query.branchName != null and query.branchName != ''">
+                and branch_name like concat('%',#{query.branchName},'%')
+            </if>
+            <if test="query.userName != null and query.userName != ''">
+                and user_name like concat('%',#{query.userName},'%')
+            </if>
+            <if test="query.phone != null and query.phone != ''">
+                and phone like concat('%',#{query.phone},'%')
+            </if>
+            <if test="query.status != null">
+                and status = #{query.status}
+            </if>
+            <if test="query.branchIds != null and query.branchIds.size()>0">
+                and id in
+                <foreach item="item" collection="query.branchIds" separator="," open="(" close=")" index="">
+                    #{item}
+                </foreach>
+            </if>
+            AND disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+        </where>
+        ORDER BY create_time DESC
+    </select>
 
 </mapper>
diff --git a/ruoyi-system/src/main/resources/mapper/system/TCrmClinicMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TCrmClinicMapper.xml
index d106520..127ccde 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TCrmClinicMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TCrmClinicMapper.xml
@@ -17,6 +17,7 @@
         <result column="qualification_picture" property="qualificationPicture" />
         <result column="status" property="status" />
         <result column="audit_remark" property="auditRemark" />
+        <result column="performance_count" property="performanceCount" />
         <result column="create_time" property="createTime" />
         <result column="update_time" property="updateTime" />
         <result column="create_by" property="createBy" />
@@ -27,13 +28,13 @@
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
         id, branch_id, salesperson_id, warehouse_id,user_id, clinic_name, person_charge_name, phone, low_procurement_money,
-          clinic_address, qualification_picture, status,audit_remark, create_time, update_time, create_by, update_by, disabled
+          clinic_address, qualification_picture, status,audit_remark,performance_count, create_time, update_time, create_by, update_by, disabled
     </sql>
     <select id="pageList" resultType="com.ruoyi.system.vo.TCrmClinicVO">
         SELECT
         tcc.id, tcc.branch_id, tcc.salesperson_id, tcc.warehouse_id,tcc.user_id, tcc.clinic_name, tcc.person_charge_name,
         tcc.phone, tcc.low_procurement_money, tcc.clinic_address, tcc.qualification_picture, tcc.status,tcc.audit_remark,
-        tcc.create_time, tcc.update_time, tcc.create_by, tcc.update_by, tcc.disabled,
+        tcc.create_time, tcc.update_time, tcc.create_by, tcc.update_by, tcc.disabled,tcc.performance_count,
         tcb.branch_name, tcs.salesperson_name, tcw.warehouse_name
         from t_crm_clinic tcc
         left join t_crm_branch tcb on tcc.branch_id = tcb.id
@@ -55,9 +56,22 @@
             <if test="query.salespersonId != null and query.salespersonId != ''">
                 and tcc.salesperson_id = #{query.salespersonId}
             </if>
-<!--            <if test="query.performanceStatus != null">-->
-<!--                and tcc.salesperson_id = #{query.performanceStatus}-->
-<!--            </if>-->
+            <if test="query.performanceStatus != null and query.performanceStatus == 1">
+                and tcc.low_procurement_money &lt; (SELECT IFNULL(SUM(pay_money),0) FROM
+                t_erp_procurement
+                WHERE clinic_id = tcc.id AND status in (3,4,5)
+                AND create_time LIKE concat(#{query.createTime},'%')
+                AND disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+                )
+            </if>
+            <if test="query.performanceStatus != null and query.performanceStatus == 2">
+                and tcc.low_procurement_money &gt;= (SELECT IFNULL(SUM(pay_money),0) FROM
+                t_erp_procurement
+                WHERE clinic_id = tcc.id AND status in (3,4,5)
+                AND create_time LIKE concat(#{query.createTime},'%')
+                AND disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+                )
+            </if>
             <if test="query.status != null">
                 and tcc.status = #{query.status}
             </if>
@@ -76,7 +90,7 @@
         SELECT
         tcc.id, tcc.branch_id, tcc.salesperson_id, tcc.warehouse_id,tcc.user_id, tcc.clinic_name, tcc.person_charge_name,
         tcc.phone, tcc.low_procurement_money, tcc.clinic_address, tcc.qualification_picture, tcc.status,tcc.audit_remark,
-        tcc.create_time, tcc.update_time, tcc.create_by, tcc.update_by, tcc.disabled,
+        tcc.create_time, tcc.update_time, tcc.create_by, tcc.update_by, tcc.disabled,tcc.performance_count,
         tcb.branch_name, tcs.salesperson_name, tcw.warehouse_name
         from t_crm_clinic tcc
         left join t_crm_branch tcb on tcc.branch_id = tcb.id
@@ -98,9 +112,6 @@
             <if test="query.salespersonId != null and query.salespersonId != ''">
                 and tcc.salesperson_id = #{query.salespersonId}
             </if>
-<!--            <if test="query.performanceStatus != null">-->
-<!--                and tcc.salesperson_id = #{query.performanceStatus}-->
-<!--            </if>-->
             <if test="query.status != null">
                 and tcc.status = #{query.status}
             </if>
@@ -109,5 +120,95 @@
         </where>
         ORDER BY tcc.create_time DESC
     </select>
+    <select id="exportAudit" resultType="com.ruoyi.system.export.TCrmClinicAuditExport">
+        SELECT
+        tcc.id, tcc.branch_id, tcc.salesperson_id, tcc.warehouse_id,tcc.user_id, tcc.clinic_name, tcc.person_charge_name,
+        tcc.phone, tcc.low_procurement_money, tcc.clinic_address, tcc.qualification_picture, tcc.status,tcc.audit_remark,
+        tcc.create_time, tcc.update_time, tcc.create_by, tcc.update_by, tcc.disabled,tcc.performance_count,
+        tcb.branch_name, tcs.salesperson_name, tcw.warehouse_name
+        from t_crm_clinic tcc
+        left join t_crm_branch tcb on tcc.branch_id = tcb.id
+        left join t_crm_salesperson tcs on tcc.salesperson_id = tcs.id
+        left join t_crm_warehouse tcw on tcc.warehouse_id = tcw.id
+        <where>
+            <if test="query.clinicName != null and query.clinicName != ''">
+                and tcc.clinic_name like concat('%',#{query.clinicName},'%')
+            </if>
+            <if test="query.personChargeName != null and query.personChargeName != ''">
+                and tcc.person_charge_name like concat('%',#{query.personChargeName},'%')
+            </if>
+            <if test="query.phone != null and query.phone != ''">
+                and tcc.phone like concat('%',#{query.phone},'%')
+            </if>
+            <if test="query.branchId != null and query.branchId != ''">
+                and tcc.branch_id = #{query.branchId}
+            </if>
+            <if test="query.salespersonId != null and query.salespersonId != ''">
+                and tcc.salesperson_id = #{query.salespersonId}
+            </if>
+            <if test="query.status != null">
+                and tcc.status = #{query.status}
+            </if>
+            and tcc.status in (1,2)
+            AND tcc.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+        </where>
+        ORDER BY tcc.create_time DESC
+    </select>
+    <select id="exportList" resultType="com.ruoyi.system.export.TCrmClinicListExport">
+        SELECT
+        tcc.id, tcc.branch_id, tcc.salesperson_id, tcc.warehouse_id,tcc.user_id, tcc.clinic_name, tcc.person_charge_name,
+        tcc.phone, tcc.low_procurement_money, tcc.clinic_address, tcc.qualification_picture, tcc.status,tcc.audit_remark,
+        tcc.create_time, tcc.update_time, tcc.create_by, tcc.update_by, tcc.disabled,tcc.performance_count,
+        tcb.branch_name, tcs.salesperson_name, tcw.warehouse_name
+        from t_crm_clinic tcc
+        left join t_crm_branch tcb on tcc.branch_id = tcb.id
+        left join t_crm_salesperson tcs on tcc.salesperson_id = tcs.id
+        left join t_crm_warehouse tcw on tcc.warehouse_id = tcw.id
+        <where>
+            <if test="query.clinicName != null and query.clinicName != ''">
+                and tcc.clinic_name like concat('%',#{query.clinicName},'%')
+            </if>
+            <if test="query.personChargeName != null and query.personChargeName != ''">
+                and tcc.person_charge_name like concat('%',#{query.personChargeName},'%')
+            </if>
+            <if test="query.phone != null and query.phone != ''">
+                and tcc.phone like concat('%',#{query.phone},'%')
+            </if>
+            <if test="query.branchId != null and query.branchId != ''">
+                and tcc.branch_id = #{query.branchId}
+            </if>
+            <if test="query.salespersonId != null and query.salespersonId != ''">
+                and tcc.salesperson_id = #{query.salespersonId}
+            </if>
+            <if test="query.performanceStatus != null and query.performanceStatus == 1">
+                and tcc.low_procurement_money &lt; (SELECT IFNULL(SUM(pay_money),0) FROM
+                t_erp_procurement
+                WHERE clinic_id = tcc.id AND status in (3,4,5)
+                AND create_time LIKE concat(#{query.createTime},'%')
+                AND disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+                )
+            </if>
+            <if test="query.performanceStatus != null and query.performanceStatus == 2">
+                and tcc.low_procurement_money &gt;= (SELECT IFNULL(SUM(pay_money),0) FROM
+                t_erp_procurement
+                WHERE clinic_id = tcc.id AND status in (3,4,5)
+                AND create_time LIKE concat(#{query.createTime},'%')
+                AND disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+                )
+            </if>
+            <if test="query.status != null">
+                and tcc.status = #{query.status}
+            </if>
+            <if test="query.branchId != null and query.userId == 2">
+                and tcc.branch_id = #{query.branchId}
+            </if>
+            <if test="query.salespersonId != null and query.userId == 3">
+                and tcc.salesperson_id = #{query.salespersonId}
+            </if>
+            and tcc.status in (3,4)
+            AND tcc.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+        </where>
+        ORDER BY tcc.create_time DESC
+    </select>
 
 </mapper>
diff --git a/ruoyi-system/src/main/resources/mapper/system/TSysActivityMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TSysActivityMapper.xml
index f8a0e57..b2bcf80 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TSysActivityMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TSysActivityMapper.xml
@@ -38,7 +38,7 @@
             <if test="query.status != null">
                 AND status = #{query.status}
             </if>
-            <if test="roleType != null and query.roleType == 5">
+            <if test="query.roleType != null and query.roleType == 5">
                 AND show_type in (2,3)
             </if>
             AND disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
diff --git a/ruoyi-system/src/main/resources/mapper/system/TSysAppUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TSysAppUserMapper.xml
index 5c3c9f3..4628b35 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TSysAppUserMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TSysAppUserMapper.xml
@@ -59,6 +59,7 @@
                tsau.chronic_disease_id,tsau.status,tsau.last_reminder_time, tsau.create_time, tsau.update_time, tsau.create_by,
                tsau.update_by, tsau.disabled
         from t_sys_app_user tsau
+        left join (select id,app_user_id, max(check_time) as lastInspectionTime from t_sys_inspection limit 1) tsi on tsi.app_user_id = tsau.id
         <where>
             <if test="query.phone != null and query.phone != ''">
                 and tsau.phone = #{query.phone}
@@ -74,5 +75,74 @@
         </where>
         ORDER BY tsau.create_time DESC
     </select>
+    <select id="exportList" resultType="com.ruoyi.system.export.TSysAppUserListExport">
+        select tsau.id, tsau.nick_name, tsau.phone, tsau.birth_time, tsau.sex, tsau.open_id,tsau.office_open_id,
+        tsau.chronic_disease_id,tsau.status,tsau.last_reminder_time, tsau.create_time, tsau.update_time, tsau.create_by,
+        tsau.update_by, tsau.disabled
+        from t_sys_app_user tsau
+        <where>
+            <if test="query.phone != null and query.phone != ''">
+                and tsau.phone = #{query.phone}
+            </if>
+            <if test="query.nickName != null and query.nickName != ''">
+                and tsau.nick_name like concat('%',#{query.nickName},'%')
+            </if>
+            <if test="query.inspectionId != null and query.inspectionId != ''">
+                and FIND_IN_SET(#{query.inspectionId},tsau.chronic_disease_id)
+            </if>
+            AND tsau.chronic_disease_id IS NOT NULL
+            AND tsau.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+        </where>
+        ORDER BY tsau.create_time DESC
+    </select>
+    <select id="exportListClinic" resultType="com.ruoyi.system.export.TSysAppUserClinicExport">
+        select tsau.id, tsau.nick_name, tsau.phone, tsau.birth_time, tsau.sex, tsau.open_id,tsau.office_open_id,
+        tsau.chronic_disease_id,tsau.status,tsau.last_reminder_time, tsau.create_time, tsau.update_time, tsau.create_by,
+        tsau.update_by, tsau.disabled
+        from t_sys_app_user tsau
+        <where>
+            <if test="query.phone != null and query.phone != ''">
+                and tsau.phone = #{query.phone}
+            </if>
+            <if test="query.nickName != null and query.nickName != ''">
+                and tsau.nick_name like concat('%',#{query.nickName},'%')
+            </if>
+            <if test="query.inspectionId != null and query.inspectionId != ''">
+                and FIND_IN_SET(#{query.inspectionId},tsau.chronic_disease_id)
+            </if>
+            AND tsau.chronic_disease_id IS NOT NULL
+            AND tsau.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+        </where>
+        ORDER BY tsau.create_time DESC
+    </select>
+    <select id="exportListAppUser" resultType="com.ruoyi.system.export.TSysAppUserExport">
+        select tsau.id, tsau.nick_name, tsau.phone, tsau.birth_time, tsau.sex, tsau.open_id,tsau.office_open_id,
+        tsau.chronic_disease_id,tsau.status,tsau.last_reminder_time, tsau.create_time, tsau.update_time, tsau.create_by,
+        tsau.update_by, tsau.disabled, tsi.lastInspectionTime
+        from t_sys_app_user tsau
+        left join (select id,app_user_id, max(check_time) as lastInspectionTime from t_sys_inspection limit 1) tsi on tsi.app_user_id = tsau.id
+        <where>
+            <if test="query.phone != null and query.phone != ''">
+                and tsau.phone = #{query.phone}
+            </if>
+            <if test="query.nickName != null and query.nickName != ''">
+                and tsau.nick_name like concat('%',#{query.nickName},'%')
+            </if>
+            <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
+                and tsau.id in (select app_user_id from t_sys_inspection where check_time between #{query.startTime} and #{query.endTime})
+            </if>
+            <if test="query.isInspection != null and query.isInspection == 1">
+                and tsau.chronic_disease_id IS NOT NULL
+            </if>
+            <if test="query.isInspection != null and query.isInspection == 0">
+                and tsau.chronic_disease_id IS NULL
+            </if>
+            <if test="query.status != null">
+                and tsau.status = #{query.status}
+            </if>
+            AND tsau.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+        </where>
+        ORDER BY tsau.create_time DESC
+    </select>
 
 </mapper>
diff --git a/ruoyi-system/src/main/resources/mapper/system/TSysLiveMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TSysLiveMapper.xml
index 0fb1ec0..7b905a4 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TSysLiveMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TSysLiveMapper.xml
@@ -29,7 +29,7 @@
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
         id, live_title, live_cover, live_introduction, start_time,end_time, expected_duration, live_way, live_mode,live_url,
-          live_lecturer, live_type, password, live_detail, push_type,click_count, create_time, update_time, create_by, update_by, disabled
+          live_lecturer, live_type, live_detail, push_type,click_count, create_time, update_time, create_by, update_by, disabled
     </sql>
     <select id="pageList" resultType="com.ruoyi.system.vo.TSysLiveVO">
         SELECT
diff --git a/ruoyi-system/src/main/resources/mapper/system/TSysMessageTemplateMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TSysMessageTemplateMapper.xml
index a55c7a0..8cfee2a 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TSysMessageTemplateMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TSysMessageTemplateMapper.xml
@@ -8,6 +8,7 @@
         <result column="template_name" property="templateName" />
         <result column="template_code" property="templateCode" />
         <result column="template_content" property="templateContent" />
+        <result column="template_type" property="templateType" />
         <result column="create_time" property="createTime" />
         <result column="update_time" property="updateTime" />
         <result column="create_by" property="createBy" />
@@ -17,7 +18,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, template_name, template_code, template_content, create_time, update_time, create_by, update_by, disabled
+        id, template_name, template_code, template_content,template_type, create_time, update_time, create_by, update_by, disabled
     </sql>
     <select id="pageList" resultType="com.ruoyi.system.model.TSysMessageTemplate">
         SELECT
@@ -27,6 +28,7 @@
             <if test="query.templateName != null and query.templateName != ''">
                 AND template_name LIKE concat('%',#{query.templateName},'%')
             </if>
+            AND template_type = 3
             AND disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
         </where>
         ORDER BY create_time DESC

--
Gitblit v1.7.1