From 68317d44b233f28150336bbf3aa3a32400552437 Mon Sep 17 00:00:00 2001
From: xiaoyi <908147524@qq.com>
Date: 星期一, 02 十一月 2026 11:02:08 +0800
Subject: [PATCH] fix(excel): 导入模板日期改为文本显示,修复显示为 Excel 序列号

---
 yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java |   86 +++++++++++++++++++++++++++++++++++--------
 1 files changed, 70 insertions(+), 16 deletions(-)

diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java
index 9f46412..22491c5 100644
--- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java
+++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java
@@ -26,11 +26,13 @@
 import cn.iocoder.yudao.module.system.dal.mysql.dept.UserPostMapper;
 import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper;
 import cn.iocoder.yudao.module.system.mq.producer.user.AdminUserProducer;
+import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO;
 import cn.iocoder.yudao.module.system.service.dept.DeptService;
 import cn.iocoder.yudao.module.system.service.dept.PostService;
 import cn.iocoder.yudao.module.system.service.oauth2.OAuth2TokenService;
 import cn.iocoder.yudao.module.system.service.permission.PermissionService;
 import cn.iocoder.yudao.module.system.service.tenant.TenantService;
+import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
 import com.google.common.annotations.VisibleForTesting;
 import com.mzt.logapi.context.LogRecordContext;
 import com.mzt.logapi.service.impl.DiffParseFunction;
@@ -55,7 +57,7 @@
 /**
  * 鍚庡彴鐢ㄦ埛 Service 瀹炵幇绫�
  *
- * @author 鑺嬮亾婧愮爜
+ * @author 瓒呯骇绠$悊鍛�
  */
 @Service("adminUserService")
 @Slf4j
@@ -506,6 +508,8 @@
     }
 
     @Override
+    @LogRecord(type = SYSTEM_USER_TYPE, subType = SYSTEM_USER_IMPORT_SUB_TYPE, bizNo = "0",
+            success = SYSTEM_USER_IMPORT_SUCCESS)
     @Transactional(rollbackFor = Exception.class) // 娣诲姞浜嬪姟锛屽紓甯稿垯鍥炴粴鎵�鏈夊鍏�
     public UserImportRespVO importUserList(List<UserImportExcelVO> importUsers, boolean isUpdateSupport) {
         // 1.1 鍙傛暟鏍¢獙
@@ -517,6 +521,12 @@
         if (StrUtil.isEmpty(initPassword)) {
             throw exception(USER_IMPORT_INIT_PASSWORD);
         }
+        // 1.3 棰勫姞杞介儴闂細鍚嶇О -> 閮ㄩ棬锛岀紪鍙� -> 閮ㄩ棬锛屼緵涓ょ鍐欐硶瑙f瀽
+        List<DeptDO> allDepts = deptService.getDeptList(new DeptListReqVO());
+        Map<String, DeptDO> deptByName = new HashMap<>(allDepts.size());
+        for (DeptDO dept : allDepts) {
+            deptByName.put(dept.getName().trim(), dept);
+        }
 
         // 2. 閬嶅巻锛岄�愪釜鍒涘缓 or 鏇存柊
         UserImportRespVO respVO = UserImportRespVO.builder().createUsernames(new ArrayList<>())
@@ -524,44 +534,88 @@
         AtomicInteger index = new AtomicInteger(1);
         importUsers.forEach(importUser -> {
             int currentIndex = index.getAndIncrement();
-            // 2.1.1 鏍¢獙瀛楁鏄惁绗﹀悎瑕佹眰
-            try {
-                ValidationUtils.validate(BeanUtils.toBean(importUser, UserSaveReqVO.class).setPassword(initPassword));
-            } catch (ConstraintViolationException ex) {
-                String key = StrUtil.blankToDefault(importUser.getUsername(), "绗� " + currentIndex + " 琛�");
-                respVO.getFailureUsernames().put(key, ex.getMessage());
+            // 鐢ㄤ簬鎶ラ敊鐨勫畾浣� key锛氫紭鍏堢櫥褰曞悕锛屽惁鍒欍�岀 N 琛屻��
+            String rowKey = StrUtil.blankToDefault(importUser.getUsername(), "绗� " + currentIndex + " 琛�");
+
+            // 2.1 瑙f瀽閮ㄩ棬锛氫紭鍏堟寜鍚嶇О锛屽吋瀹瑰巻鍙叉ā鏉垮~鐨勯儴闂ㄧ紪鍙�
+            DeptDO dept = resolveImportDept(importUser.getDeptName(), deptByName);
+            if (dept == null && StrUtil.isNotBlank(importUser.getDeptName())) {
+                respVO.getFailureUsernames().put(rowKey,
+                        "閮ㄩ棬銆�" + importUser.getDeptName().trim() + "銆嶄笉瀛樺湪锛岃濉啓閮ㄩ棬绠$悊涓殑瀹屾暣閮ㄩ棬鍚嶇О");
                 return;
             }
-            // 2.1.2 鏍¢獙锛屽垽鏂槸鍚︽湁涓嶇鍚堢殑鍘熷洜
+            Long deptId = dept != null ? dept.getId() : null;
+            importUser.setDeptName(dept != null ? dept.getName() : importUser.getDeptName());
+
+            // 2.2 鏍¢獙瀛楁鏄惁绗﹀悎瑕佹眰
             try {
-                validateUserForCreateOrUpdate(null, null, importUser.getMobile(), importUser.getEmail(),
-                        importUser.getDeptId(), null);
+                ValidationUtils.validate(BeanUtils.toBean(importUser, UserSaveReqVO.class)
+                        .setPassword(initPassword).setDeptId(deptId));
+            } catch (ConstraintViolationException ex) {
+                respVO.getFailureUsernames().put(rowKey, ex.getMessage());
+                return;
+            }
+            // 2.3 鏍¢獙涓氬姟绾︽潫锛堟墜鏈哄彿/閭/閮ㄩ棬鏄惁瀛樺湪锛�
+            try {
+                validateUserForCreateOrUpdate(null, null, importUser.getMobile(), importUser.getEmail(), deptId, null);
             } catch (ServiceException ex) {
-                respVO.getFailureUsernames().put(importUser.getUsername(), ex.getMessage());
+                respVO.getFailureUsernames().put(rowKey, ex.getMessage());
                 return;
             }
 
-            // 2.2.1 鍒ゆ柇濡傛灉涓嶅瓨鍦紝鍦ㄨ繘琛屾彃鍏�
+            // 2.4 鍒ゆ柇濡傛灉涓嶅瓨鍦紝鍦ㄨ繘琛屾彃鍏�
             AdminUserDO existUser = userMapper.selectByUsername(importUser.getUsername());
             if (existUser == null) {
-                userMapper.insert(BeanUtils.toBean(importUser, AdminUserDO.class)
-                        .setPassword(encodePassword(initPassword)).setPostIds(new HashSet<>())); // 璁剧疆榛樿瀵嗙爜鍙婄┖宀椾綅缂栧彿鏁扮粍
+                AdminUserDO newUser = BeanUtils.toBean(importUser, AdminUserDO.class);
+                newUser.setDeptId(deptId);
+                newUser.setPassword(encodePassword(initPassword)).setPostIds(new HashSet<>()); // 榛樿瀵嗙爜鍙婄┖宀椾綅
+                userMapper.insert(newUser);
                 respVO.getCreateUsernames().add(importUser.getUsername());
                 return;
             }
-            // 2.2.2 濡傛灉瀛樺湪锛屽垽鏂槸鍚﹀厑璁告洿鏂�
+            // 2.5 濡傛灉瀛樺湪锛屽垽鏂槸鍚﹀厑璁告洿鏂�
             if (!isUpdateSupport) {
-                respVO.getFailureUsernames().put(importUser.getUsername(), USER_USERNAME_EXISTS.getMsg());
+                respVO.getFailureUsernames().put(rowKey, USER_USERNAME_EXISTS.getMsg());
                 return;
             }
             AdminUserDO updateUser = BeanUtils.toBean(importUser, AdminUserDO.class);
             updateUser.setId(existUser.getId());
+            updateUser.setDeptId(deptId);
             userMapper.updateById(updateUser);
             respVO.getUpdateUsernames().add(importUser.getUsername());
         });
+        // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+        OperateLogUtils.putImportSummary(respVO.getCreateUsernames(), respVO.getUpdateUsernames(),
+                respVO.getFailureUsernames());
         return respVO;
     }
 
+    /**
+     * 瑙f瀽瀵煎叆琛岄噷鐨勯儴闂�
+     *
+     * 浼樺厛鎸夐儴闂ㄥ悕绉扮簿纭尮閰嶏紱鑻ュ~鍐欑殑鏄函鏁板瓧锛屽啀鎸夐儴闂ㄧ紪鍙峰尮閰嶏紙鍏煎鍘嗗彶妯℃澘锛夈��
+     *
+     * @param raw       瀵煎叆濉啓鐨勯儴闂ㄦ枃鏈�
+     * @param byName    閮ㄩ棬鍚嶇О -> 閮ㄩ棬
+     * @param byId      閮ㄩ棬缂栧彿 -> 閮ㄩ棬
+     * @return 鍖归厤鍒扮殑閮ㄩ棬锛屾湭濉啓杩斿洖 null锛屽~浜嗕絾鍖归厤涓嶅埌涔熻繑鍥� null
+     */
+    /**
+     * 瑙f瀽瀵煎叆琛岄噷鐨勯儴闂ㄥ悕绉�
+     *
+     * 鍙寜閮ㄩ棬鍚嶇О绮剧‘鍖归厤锛堜笉鍐嶅吋瀹规暟瀛楃紪鍙凤紝閬垮厤浣跨敤鑰呭~閿欏垪瀵艰嚧闈欓粯閿欓厤锛夈��
+     *
+     * @param raw    瀵煎叆濉啓鐨勯儴闂ㄥ悕绉�
+     * @param byName 閮ㄩ棬鍚嶇О -> 閮ㄩ棬
+     * @return 鍖归厤鍒扮殑閮ㄩ棬锛涙湭濉啓鎴栧尮閰嶄笉鍒拌繑鍥� null
+     */
+    private DeptDO resolveImportDept(String raw, Map<String, DeptDO> byName) {
+        if (StrUtil.isBlank(raw)) {
+            return null;
+        }
+        return byName.get(raw.trim());
+    }
+
     @Override
     public List<AdminUserDO> getUserListByStatus(Integer status) {
         return userMapper.selectListByStatus(status);

--
Gitblit v1.9.3