Browse Source

补充资料后恢复用户待审核状态

审核不通过用户通过 setuser 补充资料时,根据 updateUserInfo 标记将审核状态恢复为待审核,并清空旧的审核不通过原因。

补充对应单元测试与规格说明。
qmj 19 hours ago
parent
commit
dc9ada4a9c

+ 9 - 0
ruoyi-admin/src/main/java/com/ruoyi/app/user/InfoUserController.java

@@ -3,6 +3,7 @@ package com.ruoyi.app.user;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.ruoyi.app.utils.DateUtil;
 import com.ruoyi.app.utils.PayPush;
 import com.ruoyi.app.utils.RsaMima;
@@ -728,6 +729,14 @@ public class InfoUserController extends BaseController {
         user.setLongitude(infoUser.getLongitude());
         user.setLatitude(infoUser.getLatitude());
         Boolean org = infoUserService.saveOrUpdate(user);
+        if (org && Boolean.TRUE.equals(infoUser.getUpdateUserInfo())) {
+            LambdaUpdateWrapper<InfoUser> auditUpdateWrapper = new LambdaUpdateWrapper<>();
+            auditUpdateWrapper.eq(InfoUser::getUserId, Long.valueOf(id))
+                    .eq(InfoUser::getAuditStatus, "2")
+                    .set(InfoUser::getAuditStatus, "0")
+                    .set(InfoUser::getAuditRejectReason, null);
+            infoUserService.update(auditUpdateWrapper);
+        }
         if (org) {
             return success();
         } else {

+ 36 - 0
ruoyi-admin/src/test/java/com/ruoyi/app/user/InfoUserControllerTest.java

@@ -3,6 +3,7 @@ package com.ruoyi.app.user;
 import com.baomidou.mybatisplus.core.MybatisConfiguration;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
 import com.ruoyi.common.constant.HttpStatus;
 import com.ruoyi.common.core.domain.AjaxResult;
@@ -52,6 +53,8 @@ class InfoUserControllerTest {
     static void initializeTableMetadata() {
         TableInfoHelper.initTableInfo(
                 new MapperBuilderAssistant(new MybatisConfiguration(), ""), PosOrder.class);
+        TableInfoHelper.initTableInfo(
+                new MapperBuilderAssistant(new MybatisConfiguration(), ""), InfoUser.class);
         originalBeanFactory = (ConfigurableListableBeanFactory)
                 ReflectionTestUtils.getField(SpringUtils.class, "beanFactory");
         DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
@@ -155,6 +158,39 @@ class InfoUserControllerTest {
         assertNull(captor.getValue().getAuditStatus());
     }
 
+    @Test
+    void resubmittedRejectedProfileReturnsToPendingReview() {
+        InfoUser request = new InfoUser();
+        request.setUpdateUserInfo(true);
+        when(infoUserService.saveOrUpdate(any(InfoUser.class))).thenReturn(true);
+
+        controller.setuser(tokenFor(42L), request);
+
+        ArgumentCaptor<LambdaUpdateWrapper> captor =
+                ArgumentCaptor.forClass(LambdaUpdateWrapper.class);
+        verify(infoUserService).update(captor.capture());
+        LambdaUpdateWrapper<?> update = captor.getValue();
+        Collection<Object> parameters = update.getParamNameValuePairs().values();
+        assertTrue(update.getSqlSegment().contains("user_id"));
+        assertTrue(update.getSqlSegment().contains("audit_status"));
+        assertTrue(update.getSqlSet().contains("audit_status"));
+        assertTrue(update.getSqlSet().contains("audit_reject_reason"));
+        assertTrue(parameters.contains(42L));
+        assertTrue(parameters.contains("2"));
+        assertTrue(parameters.contains("0"));
+    }
+
+    @Test
+    void ordinaryProfileUpdateDoesNotChangeReviewState() {
+        InfoUser request = new InfoUser();
+        request.setUpdateUserInfo(false);
+        when(infoUserService.saveOrUpdate(any(InfoUser.class))).thenReturn(true);
+
+        controller.setuser(tokenFor(42L), request);
+
+        verify(infoUserService, never()).update(any(Wrapper.class));
+    }
+
     @Test
     void trimsAndSavesAuditRejectionReason() {
         InfoUser user = new InfoUser();

+ 6 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/InfoUser.java

@@ -242,6 +242,12 @@ public class InfoUser
     @TableField("voip_token")
     private String voIPToken;
 
+    /**
+     * 补充用户信息(商家、骑手调整用户信息)
+     */
+    @TableField(exist = false)
+    private Boolean updateUserInfo;
+
 
     public void setUserId(Long userId)
     {

+ 2 - 0
specs/021-user-audit-rejection/plan.md

@@ -98,6 +98,8 @@ mvn -pl ruoyi-admin -am -Dtest=InfoUserControllerTest -Dsurefire.failIfNoSpecifi
 - update 中使用 `<if test="auditStatus != null">audit_reject_reason = #{auditRejectReason},</if>`,确保审核状态更新为非 `2` 时能写入 `NULL`。
 - `InfoUserController.add/edit` 在调用 Service 前共用状态校验、原因修剪和旧原因清空。
 - `/infouser/user/setuser` 不再复制客户端的 `auditStatus`。
+- `InfoUser.updateUserInfo` 使用 `@TableField(exist = false)`,只作为 `/setuser` 的请求标记,不写入数据库。
+- `/setuser` 保存资料成功后,当 `updateUserInfo=true` 时通过单条条件更新把当前状态 `2` 改为 `0`,同时清空 `audit_reject_reason`;其他状态或标记值不触发审核状态更新。
 - 四个后端资源文件新增 `no.user.audit.reject.reason.required`。
 
 - [ ] **Step 4: 运行定向测试确认 GREEN**

+ 3 - 0
specs/021-user-audit-rejection/spec.md

@@ -36,6 +36,8 @@
 - 当 `auditStatus` 不等于 `"2"` 时,后端主动将 `auditRejectReason` 设为 `null`,不能只依赖前端清理。
 - 用户列表、平台用户详情和 App 用户信息接口沿用现有 `InfoUser` 返回结构,新增返回 `auditRejectReason`。
 - App 资料更新接口 `/infouser/user/setuser` 不接受客户端提交的审核状态,防止用户自行改变审核结果。
+- `/infouser/user/setuser` 接收非持久化标记 `updateUserInfo`;仅当资料保存成功、该标记为 `true` 且数据库当前审核状态为 `2` 时,将审核状态原子更新为 `0` 并清空 `auditRejectReason`。
+- `updateUserInfo` 为 `false`、`null`,或用户当前并非审核不通过时,不改变审核状态。
 - Entity、MyBatis `resultMap`、查询、插入和更新映射全部补齐该字段。
 
 ## 数据库变更
@@ -52,6 +54,7 @@
 4. 将状态改为“待审核”或“审核通过”后,数据库中的旧原因被清空。
 5. `getuserinfo` 等返回用户信息的现有接口包含 `auditRejectReason`。
 6. 本次不修改商家或骑手 App 前端。
+7. 审核不通过的用户携带 `updateUserInfo=true` 成功补充资料后恢复为待审核并清空旧驳回原因;普通资料更新不改变审核状态。
 
 ## 非目标
 

+ 2 - 1
specs/021-user-audit-rejection/tasks.md

@@ -7,4 +7,5 @@
 - [x] T005 在骑手审核页增加审核不通过状态显示、原因输入和条件必填。
 - [x] T006 补齐平台端简中、繁中、英文、越南语文案。
 - [x] T007 在 `updatesql/sql.md` 追加 `TEXT` 字段和审核状态字典迁移 SQL。
-- [ ] T008 最终代码调整后的后端定向测试、模块构建和平台生产构建按用户要求暂不执行。
+- [ ] T008 平台生产构建及完整后端回归按用户要求暂不执行。
+- [x] T009 为 `/setuser` 增加补充资料标记处理:仅将审核不通过状态恢复为待审核并清空旧原因,补齐并通过定向测试。