瀏覽代碼

开发后台变更商户管理状态接口

jinshihui 2 天之前
父節點
當前提交
d4c51fc2f3

+ 22 - 1
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/MaTechnicianController.java

@@ -195,7 +195,7 @@ public class MaTechnicianController extends BaseController {
             updateWrapper.eq(MaTechnician::getTePhone, thirdPartyLoginsVo.getPhone());
             // 对密码进行加密
             String encryptedPassword = passwordEncoder.encode(thirdPartyLoginsVo.getPassWord());
-            updateWrapper.set(MaTechnician::getTePassword, encryptedPassword);
+            //updateWrapper.set(MaTechnician::getTePassword, encryptedPassword);
             maTechnicianService.update(updateWrapper);
             // 重置密码成功删除验证码
             redisTemplate.delete(PHONE_THREEUSERPARTCLIENT_CODE_KEY + thirdPartyLoginsVo.getPhone());
@@ -536,6 +536,27 @@ public class MaTechnicianController extends BaseController {
         }
     }
 
+    /**
+     * 后台变更商户管理状态
+     *
+     * @param id  商户ID
+     * @param dto 状态变更参数
+     * @return R<Void> 结果
+     */
+    @ApiOperation("后台变更商户管理状态")
+    @PreAuthorize("@ss.hasPermi('technician:technician:edit')")
+    @Log(title = "商户状态管理", businessType = BusinessType.UPDATE)
+    @PutMapping("/merchant/{id}/status")
+    public R<Void> changeMerchantStatus(@PathVariable("id") Integer id, @Valid @RequestBody MaTechnicianStatusChangeDTO dto) {
+        try {
+            LoginUser loginUser = getLoginUser();
+            return toR(maTechnicianService.changeMerchantStatus(id, dto, loginUser));
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+    }
+
     /**
      * 后台上传商户合同文件
      *

+ 8 - 12
nightFragrance-massage/src/main/java/com/ylx/massage/domain/MaTechnician.java

@@ -43,24 +43,14 @@ public class MaTechnician extends BaseEntity {
     @TableField("te_nick_name")
     private String teNickName;
 
-    /**
-     * 微信小程序登录会话密钥
-     */
-    @TableField("c_session_key")
-    @ApiModelProperty("微信小程序登录会话密钥")
-    private String cSessionKey;
-    /**
-     * 密码
-     */
-    @Excel(name = "密码")
-    @TableField("te_pass_word")
-    private String tePassword;
+
     /**
      * 用户的openId
      */
     @TableField("c_openid")
     @ApiModelProperty("用户的openId")
     private String cOpenid;
+
     /**
      * 性别(0女1男)
      */
@@ -209,6 +199,12 @@ public class MaTechnician extends BaseEntity {
     @Excel(name = "商户管理状态: 0-正常, 1-限制接单, 2-冻结, 3-注销")
     private Integer merchantStatus;
 
+    /**
+     * 商户管理状态变更原因
+     */
+    @TableField("reason_change")
+    private String reasonChange;
+
     /**
      * 商户接单状态(0:休息中 1:在线接单)
      */

+ 24 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/MaTechnicianStatusChangeDTO.java

@@ -0,0 +1,24 @@
+package com.ylx.massage.domain.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+/**
+ * 商户状态管理变更参数
+ */
+@Data
+public class MaTechnicianStatusChangeDTO {
+
+    @ApiModelProperty(value = "商户管理状态:0-正常,1-限制接单,2-冻结,3-注销", required = true)
+    @NotNull(message = "商户状态不能为空")
+    private Integer merchantStatus;
+
+    @ApiModelProperty(value = "变更原因", required = true)
+    @NotBlank(message = "变更原因不能为空")
+    @Size(max = 500, message = "变更原因长度不能超过500个字符")
+    private String reasonChange;
+}

+ 10 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/mapper/MaTechnicianMapper.java

@@ -149,6 +149,16 @@ public interface MaTechnicianMapper extends BaseMapper<MaTechnician> {
         return updateById(maTechnician);
     }
 
+    /**
+     * 根据商户ID更新商户管理状态和变更原因。
+     *
+     * @param maTechnician 商户状态变更信息
+     * @return 影响行数
+     */
+    default int updateMerchantStatusById(MaTechnician maTechnician) {
+        return updateById(maTechnician);
+    }
+
     /**
      * 根据商户ID更新合同文件。
      *

+ 10 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/IMaTechnicianService.java

@@ -84,6 +84,16 @@ public interface IMaTechnicianService extends IService<MaTechnician> {
      */
     public int updateMerchant(Integer id, MaTechnicianMerchantAddDTO dto, LoginUser loginUser);
 
+    /**
+     * 后台变更商户管理状态
+     *
+     * @param id        商户ID
+     * @param dto       状态变更参数
+     * @param loginUser 当前登录用户
+     * @return 结果
+     */
+    int changeMerchantStatus(Integer id, MaTechnicianStatusChangeDTO dto, LoginUser loginUser);
+
     /**
      * 后台上传商户合同文件
      *

+ 47 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MaTechnicianServiceImpl.java

@@ -1199,6 +1199,53 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
         return rows;
     }
 
+    /**
+     * 后台变更商户管理状态。
+     *
+     * @param id        商户ID
+     * @param dto       状态变更参数
+     * @param loginUser 当前登录用户
+     * @return int 结果
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int changeMerchantStatus(Integer id, MaTechnicianStatusChangeDTO dto, LoginUser loginUser) {
+        if (id == null) {
+            throw new ServiceException("商户ID不能为空");
+        }
+        if (dto == null) {
+            throw new ServiceException("状态管理参数不能为空");
+        }
+        checkEnumValue(dto.getMerchantStatus(), "商户状态", 0, 1, 2, 3);
+        String reasonChange = dto.getReasonChange() == null ? "" : dto.getReasonChange().trim();
+        if (StringUtils.isBlank(reasonChange)) {
+            throw new ServiceException("变更原因不能为空");
+        }
+        if (reasonChange.length() > AUDIT_REMARK_MAX_LENGTH) {
+            throw new ServiceException("变更原因长度不能超过" + AUDIT_REMARK_MAX_LENGTH + "个字符");
+        }
+
+        MaTechnician existsMerchant = maTechnicianMapper.selectMerchantById(id);
+        if (existsMerchant == null || !NOT_DELETED.equals(existsMerchant.getIsDelete())) {
+            throw new ServiceException("商户不存在或已删除");
+        }
+
+        MaTechnician maTechnician = new MaTechnician();
+        maTechnician.setId(id);
+        maTechnician.setMerchantStatus(dto.getMerchantStatus());
+        maTechnician.setReasonChange(reasonChange);
+        if (loginUser != null && loginUser.getUser() != null) {
+            maTechnician.setUpdateBy(loginUser.getUser().getUserName());
+        }
+        maTechnician.setUpdateTime(DateUtils.getNowDate());
+
+        int rows = maTechnicianMapper.updateMerchantStatusById(maTechnician);
+        if (rows <= 0) {
+            throw new ServiceException("商户状态变更失败");
+        }
+        return rows;
+    }
+
     /**
      * 后台上传商户合同文件
      *

+ 110 - 0
nightFragrance-massage/src/test/java/com/ylx/massage/service/impl/MaTechnicianServiceImplTest.java

@@ -0,0 +1,110 @@
+package com.ylx.massage.service.impl;
+
+import com.ylx.common.exception.ServiceException;
+import com.ylx.massage.domain.MaTechnician;
+import com.ylx.massage.domain.dto.MaTechnicianStatusChangeDTO;
+import com.ylx.massage.mapper.MaTechnicianMapper;
+import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
+import org.springframework.test.util.ReflectionTestUtils;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+public class MaTechnicianServiceImplTest {
+
+    @Test
+    public void changeMerchantStatusUpdatesMerchantStatusAndReason() {
+        MaTechnicianMapper mapper = mock(MaTechnicianMapper.class);
+        MaTechnician existsMerchant = buildMerchant(9, 0);
+        when(mapper.selectMerchantById(9)).thenReturn(existsMerchant);
+        when(mapper.updateMerchantStatusById(any(MaTechnician.class))).thenReturn(1);
+        MaTechnicianServiceImpl service = buildService(mapper);
+        MaTechnicianStatusChangeDTO dto = buildDto(2, "risk review");
+
+        int rows = service.changeMerchantStatus(9, dto, null);
+
+        assertEquals(1, rows);
+        ArgumentCaptor<MaTechnician> captor = ArgumentCaptor.forClass(MaTechnician.class);
+        verify(mapper).updateMerchantStatusById(captor.capture());
+        MaTechnician update = captor.getValue();
+        assertEquals(9, update.getId());
+        assertEquals(2, update.getMerchantStatus());
+        assertEquals("risk review", update.getReasonChange());
+        assertNotNull(update.getUpdateTime());
+    }
+
+    @Test
+    public void changeMerchantStatusRejectsInvalidStatus() {
+        MaTechnicianMapper mapper = mock(MaTechnicianMapper.class);
+        MaTechnicianServiceImpl service = buildService(mapper);
+        MaTechnicianStatusChangeDTO dto = buildDto(4, "bad status");
+
+        assertThrows(ServiceException.class, () -> service.changeMerchantStatus(9, dto, null));
+
+        verify(mapper, never()).selectMerchantById(any(Integer.class));
+        verify(mapper, never()).updateMerchantStatusById(any(MaTechnician.class));
+    }
+
+    @Test
+    public void changeMerchantStatusRejectsEmptyReason() {
+        MaTechnicianMapper mapper = mock(MaTechnicianMapper.class);
+        MaTechnicianServiceImpl service = buildService(mapper);
+        MaTechnicianStatusChangeDTO dto = buildDto(1, " ");
+
+        assertThrows(ServiceException.class, () -> service.changeMerchantStatus(9, dto, null));
+
+        verify(mapper, never()).selectMerchantById(any(Integer.class));
+        verify(mapper, never()).updateMerchantStatusById(any(MaTechnician.class));
+    }
+
+    @Test
+    public void changeMerchantStatusRejectsMissingMerchant() {
+        MaTechnicianMapper mapper = mock(MaTechnicianMapper.class);
+        when(mapper.selectMerchantById(9)).thenReturn(null);
+        MaTechnicianServiceImpl service = buildService(mapper);
+        MaTechnicianStatusChangeDTO dto = buildDto(1, "limit order");
+
+        assertThrows(ServiceException.class, () -> service.changeMerchantStatus(9, dto, null));
+
+        verify(mapper, never()).updateMerchantStatusById(any(MaTechnician.class));
+    }
+
+    @Test
+    public void changeMerchantStatusRejectsDeletedMerchant() {
+        MaTechnicianMapper mapper = mock(MaTechnicianMapper.class);
+        when(mapper.selectMerchantById(9)).thenReturn(buildMerchant(9, 1));
+        MaTechnicianServiceImpl service = buildService(mapper);
+        MaTechnicianStatusChangeDTO dto = buildDto(1, "limit order");
+
+        assertThrows(ServiceException.class, () -> service.changeMerchantStatus(9, dto, null));
+
+        verify(mapper, never()).updateMerchantStatusById(any(MaTechnician.class));
+    }
+
+    private MaTechnicianServiceImpl buildService(MaTechnicianMapper mapper) {
+        MaTechnicianServiceImpl service = new MaTechnicianServiceImpl();
+        ReflectionTestUtils.setField(service, "maTechnicianMapper", mapper);
+        return service;
+    }
+
+    private MaTechnicianStatusChangeDTO buildDto(Integer merchantStatus, String reasonChange) {
+        MaTechnicianStatusChangeDTO dto = new MaTechnicianStatusChangeDTO();
+        dto.setMerchantStatus(merchantStatus);
+        dto.setReasonChange(reasonChange);
+        return dto;
+    }
+
+    private MaTechnician buildMerchant(Integer id, Integer isDelete) {
+        MaTechnician merchant = new MaTechnician();
+        merchant.setId(id);
+        merchant.setIsDelete(isDelete);
+        return merchant;
+    }
+}