From bc92b16b8522d53182abd6c1eabfb53cc5d8ee1a Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Sun, 7 Dec 2025 16:47:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=9C=A8=E7=BC=96=EF=BC=8C=E9=9D=9E?= =?UTF-8?q?=E5=9C=A8=E7=BC=96=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/constant/UserStaffingTypeEnum.java | 5 +++ .../pjcloud/admin/api/vo/UserExcelFaceVo.java | 7 ++++ .../bsd/pjcloud/admin/api/vo/UserExcelVO.java | 2 + .../service/impl/SysUserServiceImpl.java | 38 +++++++++++++----- .../src/main/resources/file/user.xlsx | Bin 8923 -> 9169 bytes 5 files changed, 42 insertions(+), 10 deletions(-) diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/UserStaffingTypeEnum.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/UserStaffingTypeEnum.java index e6d63f96a..91fd95cef 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/UserStaffingTypeEnum.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/UserStaffingTypeEnum.java @@ -23,4 +23,9 @@ public enum UserStaffingTypeEnum { return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().orElse(null); } + public static UserStaffingTypeEnum valueOfByDescription(String description) { + if (ObjectUtil.isEmpty(description)) return null; + return Arrays.stream(values()).filter(v -> ObjectUtil.equals(description, v.getDescription())).findFirst().orElse(null); + } + } diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserExcelFaceVo.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserExcelFaceVo.java index 56b9695fa..582f6d08f 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserExcelFaceVo.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserExcelFaceVo.java @@ -48,4 +48,11 @@ public class UserExcelFaceVo { */ @ExcelProperty("用户性别") private String sex; + + /** + * 编制 + */ + @ExcelProperty("编制") + private String staffingType; + } diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserExcelVO.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserExcelVO.java index 5482af766..f3d5b49b7 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserExcelVO.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserExcelVO.java @@ -98,6 +98,8 @@ public class UserExcelVO implements Serializable { @ExcelProperty("编制") private String staffingType; + private String staffingTypeParse; + /** * 锁定标记 */ diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java index f59a91e46..e8ef7b1f0 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java @@ -49,32 +49,23 @@ import com.bsd.pjcloud.admin.service.*; import com.bsd.pjcloud.admin.utils.excel.ExcelTool; import com.bsd.pjcloud.admin.utils.flow.FlowUtil; import com.bsd.pjcloud.admin.utils.flow.dto.UserApplyFlowDto; -import com.bsd.pjcloud.admin.utils.flow.dto.UserFaceApplyFlowDto; import com.bsd.pjcloud.common.audit.annotation.Audit; import com.bsd.pjcloud.common.core.constant.CacheConstants; import com.bsd.pjcloud.common.core.constant.CommonConstants; import com.bsd.pjcloud.common.core.constant.CommonRoleConstant; -import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; import com.bsd.pjcloud.common.core.exception.ErrorCodes; import com.bsd.pjcloud.common.core.util.CollectionUtils; import com.bsd.pjcloud.common.core.util.MsgUtils; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.resolver.ParamResolver; -import com.bsd.pjcloud.common.data.tenant.TenantContextHolder; import com.bsd.pjcloud.common.excel.vo.ErrorMessage; import com.bsd.pjcloud.common.security.service.PjcloudUser; import com.bsd.pjcloud.common.security.util.SecurityUtils; import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum; import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; import com.bsd.pjcloud.flow.task.dto.TaskDto; -import com.bsd.pjcloud.wallet.api.dto.recharge.excel.WalletRechargeExcelDto; -import com.bsd.pjcloud.wallet.api.entity.mch.MchManageEntity; -import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; import com.bsd.pjcloud.wallet.api.feign.RemoteWalletService; -import com.bsd.pjcloud.wallet.api.utils.WalletDataUtil; -import com.bsd.pjcloud.wallet.api.vo.MchManageVo; -import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeApplyVo; import cn.hutool.extra.spring.SpringUtil; import lombok.AllArgsConstructor; @@ -85,7 +76,6 @@ import org.springframework.beans.BeanUtils; import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CacheEvict; -import org.springframework.cache.annotation.Caching; import org.springframework.context.annotation.Lazy; import org.springframework.mock.web.MockMultipartFile; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @@ -533,6 +523,18 @@ public class SysUserServiceImpl extends ServiceImpl impl List postNameList = StrUtil.split(excel.getPostNameList(), StrUtil.COMMA); List postCollList = postList.stream().filter(post -> postNameList.stream().anyMatch(name -> post.getPostName().equals(name))).collect(Collectors.toList()); + // 判断输入的编制是否合法 + if (ObjectUtil.isEmpty(excel.getStaffingType())) { + errorMsg.add(MsgUtils.getMessage("编制不存在", excel.getStaffingType())); + } else { + UserStaffingTypeEnum staffingTypeEnum = UserStaffingTypeEnum.valueOfByDescription(excel.getStaffingType()); + if (ObjectUtil.isEmpty(staffingTypeEnum)) { + errorMsg.add(MsgUtils.getMessage("编制选择错误,请选择`在编`和`非在编`", excel.getStaffingType())); + } else { + excel.setStaffingTypeParse(staffingTypeEnum.getType()); + } + } + if (postCollList.size() != postNameList.size()) { errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_POST_POSTNAME_INEXISTENCE, excel.getPostNameList())); } @@ -627,7 +629,21 @@ public class SysUserServiceImpl extends ServiceImpl impl } } + // 判断输入的编制是否合法 + String staffingType = null; + if (ObjectUtil.isEmpty(v.getStaffingType())) { + errorMsg.add("请选择编制"); + } else { + UserStaffingTypeEnum staffingTypeEnum = UserStaffingTypeEnum.valueOfByDescription(v.getStaffingType()); + if (ObjectUtil.isEmpty(staffingTypeEnum)) { + errorMsg.add("编制选择错误,请选择<在编>和<非在编>"); + } else { + staffingType = staffingTypeEnum.getType(); + } + } + if (CollUtil.isEmpty(errorMsg)) { + v.setStaffingType(staffingType); insertExcelUser(v, deptId, roleIds, face); } else { errorMessageList.add(new ErrorMessage(v.getLineNum(), errorMsg)); @@ -655,6 +671,7 @@ public class SysUserServiceImpl extends ServiceImpl impl userDTO.setName(excel.getName()); userDTO.setEmail(excel.getEmail()); userDTO.setLockFlag(excel.getLockFlag()); + userDTO.setStaffingType(excel.getStaffingTypeParse()); // 批量导入初始密码为手机号 userDTO.setPasswordModifyTime(LocalDateTime.now()); userDTO.setPassword(userDTO.getPhone()); @@ -678,6 +695,7 @@ public class SysUserServiceImpl extends ServiceImpl impl userDTO.setNickname(excel.getName().replaceAll("\\s+", "")); userDTO.setPhone(excel.getMobile().replaceAll("\\s+", "")); userDTO.setDeptId(deptId); + userDTO.setStaffingType(excel.getStaffingType()); // 批量导入初始密码为手机号 userDTO.setPasswordModifyTime(LocalDateTime.now()); userDTO.setPassword(userDTO.getPhone().replaceAll("\\s+", "")); diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/file/user.xlsx b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/file/user.xlsx index bb557ba597388091dc88d146ce3385f819b936df..d86950f6a50ddf3fb7430b00bd9647b39b56eef6 100644 GIT binary patch delta 5504 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 eS@dL>6C05JpR�LH`>=JFJY27aPI!*YZD);koMo