DESKTOP-3Q5PM1M\896986 1 Minggu lalu
induk
melakukan
87988a05f3

+ 1 - 1
complaint-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java

@@ -89,7 +89,7 @@ public class SysProfileController extends BaseController
      * 重置密码
      */
     @Log(title = "个人信息", businessType = BusinessType.UPDATE)
-    @PutMapping("/updatePwd")
+    @PostMapping("/updatePwd")
     public AjaxResult updatePwd(@RequestBody Map<String, String> params)
     {
         String oldPassword = params.get("oldPassword");

+ 3 - 2
complaint-admin/src/main/resources/application-prod.yml

@@ -10,7 +10,7 @@ spring:
         druid:
             # 主库数据源【必须修改:生产数据库地址、账号、密码】
             master:
-                url: jdbc:dm://39.106.85.55:5236
+                url: jdbc:dm://127.0.0.1:5236
                 username: COMPLAINT
                 password: Complaint@123
             # 从库数据源(暂不启用)
@@ -110,9 +110,10 @@ logging:
 wechat:
     appid: wxc0601b88a9fcfd92              # 【必须修改】公众号AppID
     secret: c2c6d55737319fad07b713d4890b503f  # 【必须修改】公众号AppSecret
+    oauth-redirect: "https://zhxy.whjyyun.cn/complaint-h5/"
     # 【演示期临时置空】置空后 authReady=false,前端自动走联调模式(模拟身份 X-Openid),
     # 浏览器/PC 可直接打开 H5,不再跳微信授权页;甲方域名配置完成后填回 https://正式域名/h5/ 即恢复真实授权
-    oauth-redirect: "https://zhxy.whjyyun.cn/complaint-h5/"
+    # oauth-redirect: ''
     session-ttl-minutes: 120
 
 # ==================== 9. 统一通讯平台(消息推送) ====================

+ 5 - 0
complaint-admin/src/main/resources/application.yml

@@ -69,6 +69,11 @@ spring:
     restart:
       # 热部署开关
       enabled: false
+  # 开启隐藏方法过滤器(支持POST请求通过_method参数模拟PUT/DELETE,解决外网WAF拦截PUT/DELETE的问题)
+  mvc:
+    hiddenmethod:
+      filter:
+        enabled: true
   data:
     # redis 配置
     redis:

+ 4 - 1
complaint-workorder/src/main/java/com/complaint/workorder/sync/UnitSyncTask.java

@@ -25,8 +25,11 @@ public class UnitSyncTask
 
     /**
      * 每日 03:00 增量同步
+     *
+     * 【已停用】生产环境暂时关闭自动任务
+     * 如需重新启用,取消 @Scheduled 注解的注释即可
      */
-    @Scheduled(cron = "0 0 3 * * ?")
+    // @Scheduled(cron = "0 0 3 * * ?")
     public void dailySync()
     {
         log.info("机构数据每日增量同步开始");

+ 16 - 16
complaint-workorder/src/main/java/com/complaint/workorder/task/ArchiveTask.java

@@ -18,36 +18,36 @@ import java.util.List;
  */
 @Component
 public class ArchiveTask {
-    
+
     private static final Logger log = LoggerFactory.getLogger(ArchiveTask.class);
-    
+
     @Autowired
     private ComplaintWorkorderMapper workorderMapper;
-    
+
     @Autowired
     private ComplaintArchiveMapper archiveMapper;
-    
+
     /**
      * 每日凌晨 2 点执行归档任务
      */
-    @Scheduled(cron = "0 0 2 * * ?")
+    // @Scheduled(cron = "0 0 2 * * ?")  // 【已停用】生产环境暂时关闭自动任务
     public void autoArchiveOldClosedWorkorders() {
         log.info("========== 开始执行自动归档任务 ========== ");
-        
+
         try {
             // 1. 查找超过 90 天已办结且未归档的工单
             List<String> candidateNos = workorderMapper.selectCandidatesForArchive(90);
-            
+
             if (candidateNos.isEmpty()) {
                 log.info("无符合条件的待归档工单,任务跳过");
                 return;
             }
-            
+
             log.info("发现 {} 条待归档工单", candidateNos.size());
-            
+
             int successCount = 0;
             int failCount = 0;
-            
+
             // 2. 批量归档处理
             for (String complaintNo : candidateNos) {
                 try {
@@ -59,15 +59,15 @@ public class ArchiveTask {
                     failCount++;
                 }
             }
-            
+
             log.info("========== 归档任务完成 ==========");
             log.info("成功:{} | 失败:{}", successCount, failCount);
-            
+
         } catch (Exception e) {
             log.error("归档任务异常", e);
         }
     }
-    
+
     /**
      * 归档单个工单(复制→标记)
      */
@@ -77,7 +77,7 @@ public class ArchiveTask {
         if (oldOrder == null) {
             throw new RuntimeException("工单不存在:" + complaintNo);
         }
-        
+
         // 2. 转换为归档对象(完整字段复制)
         ComplaintArchive archive = new ComplaintArchive();
         archive.setComplaintNo(oldOrder.getComplaintNo());
@@ -102,10 +102,10 @@ public class ArchiveTask {
         archive.setCloseTime(oldOrder.getCloseTime());
         archive.setOriginalSubmitTime(oldOrder.getCreateTime());
         archive.setArchiveTime(new java.util.Date());
-        
+
         // 3. 插入归档表
         archiveMapper.insertArchive(archive);
-        
+
         // 4. 主表标记为已归档
         workorderMapper.markAsArchived(complaintNo, new java.util.Date());
     }

+ 24 - 24
complaint-workorder/src/main/java/com/complaint/workorder/task/WorkorderOverdueCheckTask.java

@@ -27,7 +27,7 @@ import org.springframework.stereotype.Component;
 public class WorkorderOverdueCheckTask
 {
     private static final Logger log = LoggerFactory.getLogger(WorkorderOverdueCheckTask.class);
-    
+
     /** 默认超时天数(工作日) */
     private static final int OVERDUE_DAYS = 5;
 
@@ -53,7 +53,7 @@ public class WorkorderOverdueCheckTask
     /**
      * 每日 09:00 检查超期工单
      */
-    @Scheduled(cron = "0 0 9 * * ?")
+    // @Scheduled(cron = "0 0 9 * * ?")  // 【已停用】生产环境暂时关闭自动任务
     public void checkOverdueWorkorders()
     {
         log.info("开始检查超期工单...");
@@ -62,14 +62,14 @@ public class WorkorderOverdueCheckTask
             ComplaintWorkorder query = new ComplaintWorkorder();
             query.setStatus(1); // 处理中
             List<ComplaintWorkorder> processingOrders = workorderMapper.selectWorkorderList(query);
-            
+
             int overdueCount = 0;
             for (ComplaintWorkorder order : processingOrders) {
                 Date acceptTime = order.getAcceptTime();
                 if (acceptTime == null) {
                     continue;
                 }
-                
+
                 // 计算已受理天数
                 long daysBetween = calculateBusinessDays(acceptTime, new Date());
                 if (daysBetween >= OVERDUE_DAYS) {
@@ -78,13 +78,13 @@ public class WorkorderOverdueCheckTask
                     sendOverdueReminder(order, daysBetween);
                 }
             }
-            
+
             log.info("超期工单检查完成,共发现{}条超期工单", overdueCount);
         } catch (Exception e) {
             log.error("超期工单检查任务异常", e);
         }
     }
-    
+
     /**
      * 发送超期提醒(短信 + 公众号)
      */
@@ -92,16 +92,16 @@ public class WorkorderOverdueCheckTask
     {
         String schoolName = StringUtils.defaultString(order.getSchoolName());
         String complaintNo = order.getComplaintNo();
-        String content = String.format("【校长信箱】学校[%s]有一起投诉工单(编号:%s)已受理%d 天仍未办结,请及时处理", 
+        String content = String.format("【校长信箱】学校[%s]有一起投诉工单(编号:%s)已受理%d 天仍未办结,请及时处理",
                 schoolName, complaintNo, overdueDays);
-        
+
         // 获取该学校的所有启用管理员
         List<ComplaintAdmin> admins = adminMapper.selectAdminListByUnit(order.getUnitUid());
         if (admins == null || admins.isEmpty()) {
             log.warn("学校{}未配置管理员,跳过超期提醒发送", schoolName);
             return;
         }
-        
+
         for (ComplaintAdmin admin : admins) {
             // 构建接收人信息(姓名 | 学工号|部门 ID| 部门名称 | 电话号码)
             String personInfo = buildPersonInfo(admin);
@@ -130,7 +130,7 @@ public class WorkorderOverdueCheckTask
             } catch (Exception e) {
                 log.error("超期提醒短信发送失败 complaintNo={} admin={}", complaintNo, admin.getAdminName(), e);
             }
-            
+
             // 如果有学工号,同时发送公众号消息
             if (StringUtils.isNotBlank(admin.getStaffNo())) {
                 try {
@@ -140,7 +140,7 @@ public class WorkorderOverdueCheckTask
                     String wechatInfo = complaintNo + "|||" + StringUtils.defaultString(schoolName)
                             + "|||" + "工单已超期,请尽快处置";
                     wechatClient.sendWechat(receiveInfo, title, wechatInfo);
-                    
+
                     // 记录公众号推送日志
                     ComplaintMessageLog msgLog = new ComplaintMessageLog();
                     msgLog.setComplaintNo(complaintNo);
@@ -149,35 +149,35 @@ public class WorkorderOverdueCheckTask
                     msgLog.setContent(wechatInfo);
                     msgLog.setResult(1);
                     messageLogMapper.insertComplaintMessageLog(msgLog);
-                    
+
                 } catch (Exception e) {
                     log.error("超期提醒公众号发送失败 complaintNo={} admin={}", complaintNo, admin.getAdminName(), e);
                 }
             }
         }
     }
-    
+
     /**
      * 构建短信接收人信息:姓名 | 学工号|部门 ID| 部门名称 | 电话号码
      */
     private String buildPersonInfo(ComplaintAdmin admin)
     {
-        return StringUtils.defaultString(admin.getAdminName()) + "|" 
-                + StringUtils.defaultString(admin.getStaffNo()) + "||" 
-                + StringUtils.defaultString(admin.getUnitUid()) + "|" 
+        return StringUtils.defaultString(admin.getAdminName()) + "|"
+                + StringUtils.defaultString(admin.getStaffNo()) + "||"
+                + StringUtils.defaultString(admin.getUnitUid()) + "|"
                 + StringUtils.defaultString(admin.getPhone());
     }
-    
+
     /**
      * 构建公众号接收人信息:姓名 | 学工号|部门 ID| 部门名称
      */
     private String buildReceiveInfo(ComplaintAdmin admin)
     {
-        return StringUtils.defaultString(admin.getAdminName()) + "|" 
-                + StringUtils.defaultString(admin.getStaffNo()) + "||" 
+        return StringUtils.defaultString(admin.getAdminName()) + "|"
+                + StringUtils.defaultString(admin.getStaffNo()) + "||"
                 + StringUtils.defaultString(admin.getUnitUid());
     }
-    
+
     /**
      * 计算两个日期之间的工作日数量(简单算法,不考虑法定节假日)
      * @return 工作日数
@@ -186,21 +186,21 @@ public class WorkorderOverdueCheckTask
         if (startDate == null || endDate == null) {
             return 0;
         }
-        
+
         Calendar calStart = Calendar.getInstance();
         calStart.setTime(startDate);
         calStart.set(Calendar.HOUR_OF_DAY, 0);
         calStart.set(Calendar.MINUTE, 0);
         calStart.set(Calendar.SECOND, 0);
         calStart.set(Calendar.MILLISECOND, 0);
-        
+
         Calendar calEnd = Calendar.getInstance();
         calEnd.setTime(endDate);
         calEnd.set(Calendar.HOUR_OF_DAY, 0);
         calEnd.set(Calendar.MINUTE, 0);
         calEnd.set(Calendar.SECOND, 0);
         calEnd.set(Calendar.MILLISECOND, 0);
-        
+
         long businessDays = 0;
         Calendar current = calStart;
         while (!current.after(calEnd)) {
@@ -211,7 +211,7 @@ public class WorkorderOverdueCheckTask
             }
             current.add(Calendar.DAY_OF_MONTH, 1);
         }
-        
+
         return businessDays;
     }
 }

+ 2 - 2
h5-app/src/pages/ComplaintForm.vue

@@ -1,9 +1,9 @@
-<template>
+<template>
   <div class="form-page">
     <van-nav-bar title="投诉填报" left-arrow @click-left="router.back()" />
     <van-form @submit="onSubmit">
       <van-cell-group title="基本信息">
-        <van-field v-model="form.name" label="真实姓名" placeholder="请输入真实姓名" :rules="[{ required: true, message: '请填写姓名' }]" />
+        <van-field v-model="form.name" label="姓名" placeholder="请输入姓名" :rules="[{ required: true, message: '请填写姓名' }]" />
         <van-field v-model="form.phone" label="联系电话" type="tel" maxlength="11" placeholder="请输入手机号"
           :rules="[{ required: true, pattern: /^1\d{10}$/, message: '请输入正确的11位手机号' }]" />
         <van-field label="举报人身份" readonly is-link :model-value="form.identity || '请选择'"

+ 1 - 1
ruoyi-ui/src/api/system/user.js

@@ -95,7 +95,7 @@ export function updateUserPwd(oldPassword, newPassword) {
   }
   return request({
     url: '/system/user/profile/updatePwd',
-    method: 'put',
+    method: 'post',
     data: data
   })
 }

+ 6 - 0
ruoyi-ui/src/utils/request.js

@@ -38,6 +38,12 @@ service.interceptors.request.use(config => {
     config.params = {}
     config.url = url
   }
+  // PUT/DELETE请求转为POST,通过_method参数传递(解决外网WAF拦截PUT/DELETE的问题)
+  if (config.method === 'put' || config.method === 'delete') {
+    const separator = config.url.includes('?') ? '&' : '?'
+    config.url = config.url + separator + '_method=' + config.method.toUpperCase()
+    config.method = 'post'
+  }
   if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
     const requestObj = {
       url: config.url,