diff --git a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/service/IEfcodeVirtualUnitService.java b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/service/IEfcodeVirtualUnitService.java
index c825a467..48a18764 100644
--- a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/service/IEfcodeVirtualUnitService.java
+++ b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/service/IEfcodeVirtualUnitService.java
@@ -162,6 +162,16 @@ public interface IEfcodeVirtualUnitService {
*/
void updateUser(UnitUserBo bo);
+ /**
+ * 重置执法人员密码
+ *
+ * 使用与登录校验一致的 MD5(loginName + password + salt) 方式加密
+ *
+ * @param userId 用户ID
+ * @param password 新密码明文
+ */
+ void resetUserPwd(Long userId, String password);
+
/**
* 根据 sys_dept_id 查找对应的虚拟单位 vir_id
*
diff --git a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeVirtualUnitServiceImpl.java b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeVirtualUnitServiceImpl.java
index b7fbf81e..d0134c24 100644
--- a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeVirtualUnitServiceImpl.java
+++ b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeVirtualUnitServiceImpl.java
@@ -435,6 +435,37 @@ public class EfcodeVirtualUnitServiceImpl implements IEfcodeVirtualUnitService {
sysUserMapper.update(null, uw);
}
+ /**
+ * 重置执法人员密码
+ *
+ * 使用与登录校验一致的 MD5(loginName + password + salt) 方式加密,
+ * 确保重置后用户可正常登录(登录校验见 PasswordService.matches)。
+ */
+ @Override
+ public void resetUserPwd(Long userId, String password) {
+ if (userId == null) {
+ throw new ServiceException("用户ID不能为空");
+ }
+ if (StringUtils.isBlank(password)) {
+ throw new ServiceException("新密码不能为空");
+ }
+ SysUser user = sysUserMapper.selectById(userId);
+ if (user == null) {
+ throw new ServiceException("用户不存在");
+ }
+ // salt 为空时生成新的 salt,保证与登录校验方式一致
+ String salt = user.getSalt();
+ LambdaUpdateWrapper uw = Wrappers.lambdaUpdate()
+ .eq(SysUser::getUserId, userId);
+ if (StringUtils.isBlank(salt)) {
+ salt = cn.hutool.core.util.RandomUtil.randomString("0123456789abcdef", 6);
+ uw.set(SysUser::getSalt, salt);
+ }
+ uw.set(SysUser::getPassword, DigestUtil.md5Hex(user.getLoginName() + password + salt));
+ sysUserMapper.update(null, uw);
+ }
+
+
/**
* 根据 sys_dept_id 查找对应的虚拟单位 vir_id
*/
diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/EfcodeVirtualUnitController.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/EfcodeVirtualUnitController.java
index 03d9d648..848e56a5 100644
--- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/EfcodeVirtualUnitController.java
+++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/EfcodeVirtualUnitController.java
@@ -22,11 +22,13 @@ import com.zdxt.enforcementcode.domain.vo.UnitUserVo;
import com.zdxt.enforcementcode.domain.vo.VirtualUnitDeptTreeVo;
import com.zdxt.enforcementcode.domain.bo.EfcodeVirtualUnitBo;
import com.zdxt.enforcementcode.domain.bo.UnitUserBo;
+import com.zdxt.enforcementcode.domain.bo.UnitUserResetPwdBo;
import com.zdxt.enforcementcode.domain.bo.RefUserBo;
import com.zdxt.enforcementcode.domain.bo.RefUserRemarkBo;
import com.zdxt.enforcementcode.service.IEfcodeVirtualUnitService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.encrypt.annotation.ApiEncrypt;
/**
* 虚拟单位树
@@ -226,6 +228,20 @@ public class EfcodeVirtualUnitController extends BaseController {
return R.ok();
}
+ /**
+ * 重置执法人员密码
+ *
+ * 请求体加密传输(与登录一致),密码存储使用 MD5(loginName + password + salt)。
+ */
+ @ApiEncrypt
+ @Log(title = "执法人员", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping("/user/resetPwd")
+ public R resetUserPwd(@Validated @RequestBody UnitUserResetPwdBo bo) {
+ efcodeVirtualUnitService.resetUserPwd(bo.getUserId(), bo.getPassword());
+ return R.ok();
+ }
+
/**
* 删除执法人员
*/
diff --git a/zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/virtualUnit/index.ts b/zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/virtualUnit/index.ts
index f8389a95..d7dda817 100644
--- a/zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/virtualUnit/index.ts
+++ b/zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/virtualUnit/index.ts
@@ -128,6 +128,21 @@ export const deleteUnitUser = (userIds: (number | string)[]) => {
});
};
+/**
+ * 重置执法人员密码(加密传输,与登录一致)
+ */
+export const resetUnitUserPwd = (userId: number | string, password: string) => {
+ return request({
+ url: '/enforcementcode/virtualUnit/user/resetPwd',
+ method: 'put',
+ headers: {
+ isEncrypt: true,
+ repeatSubmit: false
+ },
+ data: { userId, password }
+ });
+};
+
/**
* 查询虚拟单位引用的人员列表(分页)
*/
diff --git a/zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/virtualUnit/unitUserManager.vue b/zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/virtualUnit/unitUserManager.vue
index 65d070b8..ba09f6b9 100644
--- a/zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/virtualUnit/unitUserManager.vue
+++ b/zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/virtualUnit/unitUserManager.vue
@@ -2,8 +2,8 @@
import { ref, computed, onMounted, watch, reactive, nextTick } from 'vue';
import { Search, Edit } from '@element-plus/icons-vue';
import { ElMessage, ElMessageBox } from 'element-plus';
-import { getBusinessTreeList, getUnitUsers, addUnitUser, updateUnitUser, deleteUnitUser, getReferencedUsers, addReferencedUsers, deleteReferencedUsers, updateReferencedUserRemark } from '@/api/efcode/virtualUnit';
-import { getAuthRole, updateAuthRole, resetUserPwd } from '@/api/system/user';
+import { getBusinessTreeList, getUnitUsers, addUnitUser, updateUnitUser, deleteUnitUser, resetUnitUserPwd, getReferencedUsers, addReferencedUsers, deleteReferencedUsers, updateReferencedUserRemark } from '@/api/efcode/virtualUnit';
+import { getAuthRole, updateAuthRole } from '@/api/system/user';
import type { VirtualUnitVo, UnitUserVo } from '@/api/efcode/virtualUnit/types';
import type { RoleVO } from '@/api/system/role/types';
@@ -631,7 +631,7 @@ const handleResetPwd = (row: UnitUserVo) => {
const submitResetPwd = async () => {
const valid = await resetPwdFormRef.value?.validate().catch(() => false);
if (!valid) return;
- await resetUserPwd(currentResetUser.value.userId, resetPwdForm.newPassword);
+ await resetUnitUserPwd(currentResetUser.value.userId, resetPwdForm.newPassword);
ElMessage.success('密码重置成功');
resetPwdDialogVisible.value = false;
};