From 0b7e2752b6f1e87084b837043291c890cca780a8 Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期三, 15 十月 2025 19:11:48 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/OaNotificationService.java                 |    1 
 ruoyi-system/src/main/java/com/ruoyi/system/query/NotificationListQuery.java                   |    2 
 ruoyi-system/src/main/resources/mapper/system/OaNotificationMapper.xml                         |   17 +
 ruoyi-system/src/main/java/com/ruoyi/system/model/OaNotificationUser.java                      |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/importExcel/EmployeeImportExcel.java               |   99 +++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationVO.java                      |    6 
 ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationPurchaseItemMapper.xml      |    2 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaNotificationController.java           |    6 
 ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationsMapper.xml                 |    1 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaNotifationUserController.java         |  124 ++++++++++++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetHouseInspectionItemController.java |   42 ++-
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaNotificationMapper.java                   |    2 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java               |  209 +++++++++++++++++---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaNotificationServiceImpl.java        |   32 +++
 ruoyi-system/src/main/java/com/ruoyi/system/model/OaNotification.java                          |    3 
 15 files changed, 492 insertions(+), 57 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetHouseInspectionItemController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetHouseInspectionItemController.java
index 9b641d3..58bd53f 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetHouseInspectionItemController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetHouseInspectionItemController.java
@@ -269,6 +269,7 @@
                 e.printStackTrace();
             }
         }
+
     }
 
     @Log(title = "房屋巡检导入", businessType = BusinessType.INSERT)
@@ -345,6 +346,7 @@
             assetHouseInspectionDetail.setRemark(assetHouseInspectionImport.getHouseCloseStatus());
             if (assetHouseInspectionImport.getHouseCloseStatus().equals("正常")){
                 assetHouseInspectionDetail.setInspectionResult(true);
+                assetHouseInspectionRecord.setHouseCloseStatus("正常");
             }else{
                 assetHouseInspectionDetail.setInspectionResult(false);
             }
@@ -352,14 +354,13 @@
             String waterStatus1 = assetHouseInspectionImport.getWaterStatus1();
             String waterStatus2 = assetHouseInspectionImport.getWaterStatus2();
             String waterStatus3 = assetHouseInspectionImport.getWaterStatus3();
-            assetHouseInspectionRecord.setWaterElectronicGasCloseStatus("正常");
+
             AssetHouseInspectionDetail assetHouseInspectionDetailWatter1 = new AssetHouseInspectionDetail();
             assetHouseInspectionDetailWatter1.setInspectionItemId(3);
             assetHouseInspectionDetailWatter1.setItemName("水电气表关闭情况");
             assetHouseInspectionDetailWatter1.setSubItemId(4);
             assetHouseInspectionDetailWatter1.setSubItemName("水表关闭情况");
             assetHouseInspectionDetailWatter1.setRemark(assetHouseInspectionImport.getWaterStatus1());
-            assetHouseInspectionDetails.add(assetHouseInspectionDetailWatter1);
 
             AssetHouseInspectionDetail assetHouseInspectionDetailWatter2 = new AssetHouseInspectionDetail();
             assetHouseInspectionDetailWatter2.setInspectionItemId(3);
@@ -367,7 +368,6 @@
             assetHouseInspectionDetailWatter2.setSubItemId(5);
             assetHouseInspectionDetailWatter2.setSubItemName("气表关闭情况");
             assetHouseInspectionDetailWatter2.setRemark(assetHouseInspectionImport.getWaterStatus2());
-            assetHouseInspectionDetails.add(assetHouseInspectionDetailWatter2);
 
             AssetHouseInspectionDetail assetHouseInspectionDetailWatter3 = new AssetHouseInspectionDetail();
             assetHouseInspectionDetailWatter3.setInspectionItemId(3);
@@ -375,10 +375,11 @@
             assetHouseInspectionDetailWatter3.setSubItemId(6);
             assetHouseInspectionDetailWatter3.setSubItemName("电表关闭情况");
             assetHouseInspectionDetailWatter3.setRemark(assetHouseInspectionImport.getWaterStatus3());
-            assetHouseInspectionDetails.add(assetHouseInspectionDetailWatter3);
             if (waterStatus1.equals("正常")&&waterStatus2.equals("正常")&&waterStatus3.equals("正常")){
+                assetHouseInspectionDetailWatter1.setInspectionResult(true);
                 assetHouseInspectionDetailWatter2.setInspectionResult(true);
                 assetHouseInspectionDetailWatter3.setInspectionResult(true);
+                assetHouseInspectionRecord.setWaterElectronicGasCloseStatus("正常");
             }else{
                     StringBuilder stringBuilder = new StringBuilder();
                     if (!waterStatus1.equals("正常")){
@@ -404,6 +405,10 @@
                     }
                     assetHouseInspectionRecord.setInnerStatus(stringBuilder.toString());
             }
+            assetHouseInspectionDetails.add(assetHouseInspectionDetailWatter1);
+            assetHouseInspectionDetails.add(assetHouseInspectionDetailWatter2);
+            assetHouseInspectionDetails.add(assetHouseInspectionDetailWatter3);
+
             String innerStatus1 = assetHouseInspectionImport.getInnerStatus1();
             String innerStatus2 = assetHouseInspectionImport.getInnerStatus2();
             String innerStatus3 = assetHouseInspectionImport.getInnerStatus3();
@@ -414,7 +419,6 @@
             assetHouseInspectionDetailInner1.setSubItemId(8);
             assetHouseInspectionDetailInner1.setSubItemName("墙壁漏水情况");
             assetHouseInspectionDetailInner1.setRemark(assetHouseInspectionImport.getWaterStatus1());
-            assetHouseInspectionDetails.add(assetHouseInspectionDetailInner1);
 
             AssetHouseInspectionDetail assetHouseInspectionDetailInner2 = new AssetHouseInspectionDetail();
             assetHouseInspectionDetailInner2.setInspectionItemId(7);
@@ -422,7 +426,6 @@
             assetHouseInspectionDetailInner2.setSubItemId(9);
             assetHouseInspectionDetailInner2.setSubItemName("设备损坏情况");
             assetHouseInspectionDetailInner2.setRemark(assetHouseInspectionImport.getWaterStatus2());
-            assetHouseInspectionDetails.add(assetHouseInspectionDetailInner2);
 
             AssetHouseInspectionDetail assetHouseInspectionDetailInner3 = new AssetHouseInspectionDetail();
             assetHouseInspectionDetailInner3.setInspectionItemId(7);
@@ -430,7 +433,6 @@
             assetHouseInspectionDetailInner3.setSubItemId(10);
             assetHouseInspectionDetailInner3.setSubItemName("墙壁掉灰情况");
             assetHouseInspectionDetailInner3.setRemark(assetHouseInspectionImport.getWaterStatus3());
-            assetHouseInspectionDetails.add(assetHouseInspectionDetailInner3);
 
             AssetHouseInspectionDetail assetHouseInspectionDetailInner4 = new AssetHouseInspectionDetail();
             assetHouseInspectionDetailInner4.setInspectionItemId(7);
@@ -438,9 +440,13 @@
             assetHouseInspectionDetailInner4.setSubItemId(11);
             assetHouseInspectionDetailInner4.setSubItemName("地瓷砖开裂情况");
             assetHouseInspectionDetailInner4.setRemark(assetHouseInspectionImport.getWaterStatus3());
-            assetHouseInspectionDetails.add(assetHouseInspectionDetailInner4);
             if (innerStatus1.equals("正常")&&innerStatus2.equals("正常")&&innerStatus3.equals("正常")&&innerStatus4.equals("正常")){
                 assetHouseInspectionRecord.setInnerStatus("正常");
+                assetHouseInspectionDetailInner4.setInspectionResult(true);
+                assetHouseInspectionDetailInner3.setInspectionResult(true);
+                assetHouseInspectionDetailInner2.setInspectionResult(true);
+                assetHouseInspectionDetailInner1.setInspectionResult(true);
+
             }else{
                 StringBuilder stringBuilder = new StringBuilder();
                 if (!innerStatus1.equals("正常")){
@@ -451,27 +457,32 @@
                 }
                 if (!innerStatus2.equals("正常")){
                     stringBuilder.append(innerStatus2).append("|");
-                    assetHouseInspectionDetailInner1.setInspectionResult(false);
+                    assetHouseInspectionDetailInner2.setInspectionResult(false);
                 }else{
-                    assetHouseInspectionDetailInner1.setInspectionResult(true);
+                    assetHouseInspectionDetailInner2.setInspectionResult(true);
                 }
                 if (!innerStatus3.equals("正常")){
                     stringBuilder.append(innerStatus3).append("|");
-                    assetHouseInspectionDetailInner1.setInspectionResult(false);
+                    assetHouseInspectionDetailInner3.setInspectionResult(false);
                 }else{
-                    assetHouseInspectionDetailInner1.setInspectionResult(true);
+                    assetHouseInspectionDetailInner3.setInspectionResult(true);
                 }
                 if (!innerStatus4.equals("正常")){
                     stringBuilder.append(innerStatus4).append("|");
-                    assetHouseInspectionDetailInner1.setInspectionResult(false);
+                    assetHouseInspectionDetailInner4.setInspectionResult(false);
                 }else{
-                    assetHouseInspectionDetailInner1.setInspectionResult(true);
+                    assetHouseInspectionDetailInner4.setInspectionResult(true);
                 }
                 if (stringBuilder.length()>0){
                     stringBuilder.deleteCharAt(stringBuilder.length()-1);
                 }
                 assetHouseInspectionRecord.setInnerStatus(stringBuilder.toString());
             }
+            assetHouseInspectionDetails.add(assetHouseInspectionDetailInner4);
+            assetHouseInspectionDetails.add(assetHouseInspectionDetailInner3);
+            assetHouseInspectionDetails.add(assetHouseInspectionDetailInner2);
+            assetHouseInspectionDetails.add(assetHouseInspectionDetailInner1);
+
             assetHouseInspectionRecord.setRemarks(assetHouseInspectionImport.getRemark());
             assetHouseInspectionRecordService.save(assetHouseInspectionRecord);
             assetHouseInspectionDetails.add(assetHouseInspectionDetail);
@@ -481,6 +492,9 @@
             assetHouseInspectionDetailService.saveBatch(assetHouseInspectionDetails);
 
         }
+        if(!result.isEmpty()){
+            return R.fail(result.toString());
+        }
         return R.ok();
     }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaNotifationUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaNotifationUserController.java
index 6437622..e33b0f2 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaNotifationUserController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaNotifationUserController.java
@@ -1,8 +1,36 @@
 package com.ruoyi.web.controller.api;
 
 
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.entity.TDept;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.system.model.OaNotification;
+import com.ruoyi.system.model.OaNotificationUser;
+import com.ruoyi.system.query.NotificationListQuery;
+import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.system.service.OaNotifationUserService;
+import com.ruoyi.system.service.OaNotificationService;
+import com.ruoyi.system.service.TDeptService;
+import com.ruoyi.system.vo.system.NotificationDeptUserDetailVO;
+import com.ruoyi.system.vo.system.NotificationDetailVO;
+import com.ruoyi.system.vo.system.NotificationUserDetailVO;
+import com.ruoyi.system.vo.system.NotificationVO;
+import io.swagger.annotations.ApiOperation;
+import jdk.nashorn.internal.parser.Token;
+import org.springframework.beans.BeanUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -15,6 +43,98 @@
 @RestController
 @RequestMapping("/oa-notifation-user")
 public class OaNotifationUserController {
+    @Resource
+    private OaNotificationService oaNotificationService;
+    @Resource
+    private OaNotifationUserService oaNotifationUserService;
+    @Resource
+    private TDeptService deptService;
+    @Resource
+    private ISysUserService sysUserService;
+    @Resource
+    private TokenService tokenService;
 
+    /**
+     * 获取部门树列表
+     */
+    @ApiOperation("消息通知分页列表")
+    @PostMapping("/pageList")
+    public R<PageInfo<NotificationVO>> pageListUser(@RequestBody NotificationListQuery query) {
+        Long userId = tokenService.getLoginUser().getUserId();
+        query.setUserId(userId);
+        return R.ok(oaNotificationService.pageListUser(query));
+    }
+
+
+    @ApiOperation(value = "消息通知详情")
+    @GetMapping(value = "/detail")
+    public R<NotificationDetailVO> detail(String id) {
+        NotificationDetailVO notificationDetailVO = new NotificationDetailVO();
+        OaNotification oaNotification = oaNotificationService.getById(id);
+        BeanUtils.copyProperties(oaNotification, notificationDetailVO);
+//        StringBuilder deptName = new StringBuilder();
+//        List<TDept> tDepts = deptService.list();
+//        List<SysUser> sysUsers = sysUserService.selectAllList();
+//        List<OaNotificationUser> notifationUsers = oaNotifationUserService.lambdaQuery().eq(OaNotificationUser::getNotificationId, id)
+//                .list();
+//        Map<Integer, String> deptMap = tDepts.stream().collect(Collectors.toMap(TDept::getId, TDept::getDeptName));
+//        Map<Long, SysUser> userMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, e->e));
+//        if (oaNotification.getType()){
+//            for (String deptId : oaNotification.getDeptIds().split(",")) {
+//                String orDefault = deptMap.getOrDefault(Integer.parseInt(deptId), "");
+//                deptName.append(orDefault).append(",");
+//            }
+//            if (deptName.length() > 0){
+//                notificationDetailVO.setDeptName(deptName.substring(0,deptName.length()-1));
+//            }else {
+//                notificationDetailVO.setDeptName("");
+//            }
+//            List<NotificationDeptUserDetailVO> notificationUserVOS = new ArrayList<>();
+//            List<Long> userIds = notifationUsers.stream().map(e -> e.getUserId().longValue()).collect(Collectors.toList());
+//            if (!userIds.isEmpty()){
+//                Map<String, List<SysUser>> deptUserList = sysUsers.stream().filter(e -> userIds.contains(e.getUserId()))
+//                        .collect(Collectors.groupingBy(SysUser::getDeptId));
+//                // 遍历这个map
+//                for (Map.Entry<String, List<SysUser>> entry : deptUserList.entrySet()) {
+//                    List<SysUser> users = entry.getValue();
+//                    String deptId = entry.getKey();
+//                    NotificationDeptUserDetailVO notificationDeptUserDetailVO = new NotificationDeptUserDetailVO();
+//                    notificationDeptUserDetailVO.setDeptName(deptMap.getOrDefault(Integer.parseInt(deptId), ""));
+//                    notificationDeptUserDetailVO.setUsers(users);
+//                    // 查询部门下的员工数是否和users一致
+//                    long count = sysUsers.stream().filter(e -> e.getDeptId().equals(deptId)).count();
+//                    if (count==users.size()){
+//                        notificationDeptUserDetailVO.setIsAll(true);
+//                    }else{
+//                        notificationDeptUserDetailVO.setIsAll(false);
+//                    }
+//                    notificationUserVOS.add(notificationDeptUserDetailVO);
+//                }
+//            }
+//            notificationDetailVO.setNotificationDeptUserDetailVOList(notificationUserVOS);
+//
+//        }else{
+//
+//            notificationDetailVO.setDeptName("全部人员");
+//        }
+//        List<NotificationUserDetailVO> notificationUserDetailVOS = new ArrayList<>();
+
+//        for (OaNotificationUser notifationUser : notifationUsers) {
+//            NotificationUserDetailVO notificationUserDetailVO = new NotificationUserDetailVO();
+//            BeanUtils.copyProperties(notifationUser, notificationUserDetailVO);
+//            SysUser sysUser = userMap.get(notifationUser.getUserId().longValue());
+//            if (sysUser==null){
+//                continue;
+//            }
+//            notificationUserDetailVO.setDeptName(deptMap.getOrDefault(Integer.parseInt(sysUser.getDeptId()), ""));
+//            notificationUserDetailVO.setNickName(sysUser.getNickName());
+//            notificationUserDetailVO.setPhonenumber(sysUser.getPhonenumber());
+//            notificationUserDetailVO.setPosition(sysUser.getPosition());
+//            notificationUserDetailVOS.add(notificationUserDetailVO);
+//        }
+
+//        notificationDetailVO.setNotificationUserDetailVOS(notificationUserDetailVOS);
+        return R.ok(notificationDetailVO);
+    }
 }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaNotificationController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaNotificationController.java
index 74b8fe2..5b77a38 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaNotificationController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaNotificationController.java
@@ -19,6 +19,7 @@
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -51,7 +52,8 @@
      */
     @ApiOperation("消息通知分页列表")
     @PostMapping("/pageList")
-    public R<PageInfo<NotificationVO>> pageList(@RequestBody NotificationListQuery query) {
+    public R<PageInfo<NotificationVO>> pageList(@RequestBody NotificationListQuery query
+    ) {
         return R.ok(oaNotificationService.pageList(query));
     }
 
@@ -164,7 +166,7 @@
         }
 
         notificationDetailVO.setNotificationUserDetailVOS(notificationUserDetailVOS);
-        return R.ok();
+        return R.ok(notificationDetailVO);
     }
 }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
index 5fa85d2..454d29b 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
@@ -13,6 +13,7 @@
 import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.core.domain.entity.SysRole;
 import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.entity.TDept;
 import com.ruoyi.common.core.exception.ServiceException;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.utils.SecurityUtils;
@@ -20,12 +21,11 @@
 import com.ruoyi.common.utils.WebUtils;
 import com.ruoyi.framework.web.service.TokenService;
 import com.ruoyi.system.dto.SysUserUpdateStatusDTO;
-import com.ruoyi.system.importExcel.TSysUserImportExcel;
+import com.ruoyi.system.importExcel.EmployeeImportExcel;
 import com.ruoyi.system.query.SysUserQuery;
 import com.ruoyi.system.service.*;
 import com.ruoyi.system.vo.system.SysUserVO;
 import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.apache.poi.ss.usermodel.Workbook;
@@ -38,12 +38,13 @@
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
-import javax.annotation.Resource;
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URLEncoder;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -65,6 +66,8 @@
 
     @Autowired
     private ISysDeptService deptService;
+    @Autowired
+    private TDeptService tDeptService;
     @Autowired
     private TokenService tokenService;
 
@@ -185,59 +188,189 @@
     @ApiOperation(value = "员工导入")
     @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
     @PostMapping("/importUser")
-    public R<String> importUser(@RequestPart("file") MultipartFile file) {
-        List<SysRole> sysRoles = roleService.selectRoleAll();
+    public R<Object> importUser(@RequestPart("file") MultipartFile file) {
         ImportParams params = new ImportParams();
-//        params.setTitleRows(1); // 标题行数
-        params.setHeadRows(1); //表头行数
+        params.setHeadRows(1); // 表头行数
         InputStream inputStream = null;
-//        List<CustomerImportFailedData> failedData = new ArrayList<>();
-        List<TSysUserImportExcel> locationExcelList;
+        List<EmployeeImportExcel> employeeExcelList;
+        
         try {
             inputStream = file.getInputStream();
-            locationExcelList = ExcelImportUtil.importExcel(inputStream,
-                    TSysUserImportExcel.class, params);
+            employeeExcelList = ExcelImportUtil.importExcel(inputStream,
+                    EmployeeImportExcel.class, params);
         } catch (Exception e) {
             e.printStackTrace();
-            throw new ServiceException("员工导入失败!");
+            throw new ServiceException("员工导入失败: " + e.getMessage());
         } finally {
-            try {
-                inputStream.close();
-            } catch (IOException e) {
-                throw new ServiceException(e.getMessage());
+            if (inputStream != null) {
+                try {
+                    inputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
             }
         }
-        if (CollectionUtils.isEmpty(locationExcelList)) {
+        
+        if (CollectionUtils.isEmpty(employeeExcelList)) {
             throw new ServiceException("员工数据为空!");
+        }
+        
+        int successCount = 0;
+        int failCount = 0;
+        List<String> errorMessages = new ArrayList<>();
+        
+        for (EmployeeImportExcel employeeExcel : employeeExcelList) {
+            try {
+                // 数据验证
 
+
+                // 数据验证
+                if (StringUtils.isEmpty(employeeExcel.getNickName())) {
+                    errorMessages.add("第" + (successCount + failCount + 1) + "行:姓名为空");
+                    failCount++;
+                    continue;
+                }
+                
+                if (StringUtils.isEmpty(employeeExcel.getPhoneNumber())) {
+                    errorMessages.add("第" + (successCount + failCount + 1) + "行:联系电话为空");
+                    failCount++;
+                    continue;
+                }
+                
+                // 转换并保存用户
+                SysUser sysUser = convertToSysUser(employeeExcel);
+                if (StringUtils.isEmpty(employeeExcel.getDepartment())) {
+                    errorMessages.add("第" + (successCount + failCount + 1) + "行:所在股室为空");
+                    failCount++;
+                    continue;
+                }
+
+                TDept dept = tDeptService.lambdaQuery().eq(TDept::getDeptName, employeeExcel.getDepartment())
+                        .last("limit 1").one();
+                if (dept == null){
+                    errorMessages.add("第" + (successCount + failCount + 1) + "行:所在股室不存在");
+                    failCount++;
+                    continue;
+                }
+                sysUser.setDeptId(dept.getId().toString());
+                userService.insertUser(sysUser);
+                successCount++;
+                
+            } catch (Exception e) {
+                errorMessages.add("第" + (successCount + failCount + 1) + "行:" + e.getMessage());
+                failCount++;
+                e.printStackTrace();
+            }
         }
+        
         JSONObject result = new JSONObject();
-        List<SysUser> sysUsers = new ArrayList<>();
-        for (TSysUserImportExcel locationExcel : locationExcelList) {
-            System.err.println(locationExcel);
-            SysUser sysUser = new SysUser();
-            sysUser.setStatus("0");
-            sysUser.setDelFlag("0");
-            sysUser.setCreateBy(getUsername());
-            userService.insertUser(sysUser);
+        result.put("successCount", successCount);
+        result.put("failCount", failCount);
+        result.put("totalCount", successCount + failCount);
+        if (!errorMessages.isEmpty()) {
+            result.put("errorMessages", errorMessages);
+            return R.fail(result.get("errorMessages"));
         }
-        if (!result.isEmpty()) {
-            return R.ok(result.toString());
+        
+        return R.ok("导入完成", result.toString());
+    }
+
+    /**
+     * 解析日期字符串为Date对象
+     * @param dateStr 日期字符串,格式如:2022.09
+     * @return Date对象
+     */
+    private Date parseDate(String dateStr) {
+        if (StringUtils.isEmpty(dateStr)) {
+            return null;
         }
-        return R.ok();
+        try {
+            // 支持 YYYY.MM 格式
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
+            return sdf.parse(dateStr);
+        } catch (ParseException e) {
+            try {
+                // 支持 YYYY-MM 格式
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+                return sdf.parse(dateStr);
+            } catch (ParseException ex) {
+                try {
+                    // 支持 YYYY-MM-DD 格式
+                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                    return sdf.parse(dateStr);
+                } catch (ParseException exc) {
+                    return null;
+                }
+            }
+        }
+    }
+
+    /**
+     * 将EmployeeImportExcel转换为SysUser
+     * @param employeeExcel 员工导入Excel数据
+     * @return SysUser对象
+     */
+    private SysUser convertToSysUser(EmployeeImportExcel employeeExcel) {
+        SysUser sysUser = new SysUser();
+        sysUser.setPassword(SecurityUtils.encryptPassword("123456"));
+
+        // 基本信息
+        sysUser.setNickName(employeeExcel.getNickName());
+        sysUser.setUserName(employeeExcel.getPhoneNumber());
+        sysUser.setPhonenumber(employeeExcel.getPhoneNumber());
+        // 性别转换
+        if ("男".equals(employeeExcel.getSex())) {
+            sysUser.setSex("0");
+        } else if ("女".equals(employeeExcel.getSex())) {
+            sysUser.setSex("1");
+        } else {
+            sysUser.setSex("0");
+        }
+        
+        // 身份证
+        sysUser.setIdCard(employeeExcel.getIdCard());
+        
+        // 政治面貌
+        sysUser.setPoliticalOutlook(employeeExcel.getPoliticalOutlook());
+
+        // 时间字段
+        sysUser.setParticipationTime(parseDate(employeeExcel.getParticipationTime()));
+        sysUser.setCompanyTime(parseDate(employeeExcel.getCompanyTime()));
+        sysUser.setPositionTime(parseDate(employeeExcel.getPositionTime()));
+        // 学历信息
+        sysUser.setFirstDegree(employeeExcel.getFirstDegree());
+        sysUser.setFirstCollege(employeeExcel.getFirstCollege());
+        sysUser.setFirstMajor(employeeExcel.getFirstMajor());
+        sysUser.setHighestDegree(employeeExcel.getHighestDegree());
+        sysUser.setHighestCollege(employeeExcel.getHighestCollege());
+        sysUser.setHighestMajor(employeeExcel.getHighestMajor());
+        
+        // 职务和部门
+        sysUser.setPosition(employeeExcel.getPosition());
+        sysUser.setOrganization(employeeExcel.getOrganization());
+        
+        // 系统字段
+        sysUser.setStatus("0"); // 正常状态
+        sysUser.setDelFlag("0"); // 未删除
+        sysUser.setCreateBy(getUsername());
+        
+        return sysUser;
     }
 
     @ApiOperation(value = "员工导入模板下载")
     @GetMapping("/importDownload")
     public void importDownload() {
-        List<TSysUserImportExcel> locationImportExcels = new ArrayList<>();
-        TSysUserImportExcel tLocationImportExcel = new TSysUserImportExcel();
-        locationImportExcels.add(tLocationImportExcel);
-        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TSysUserImportExcel.class, locationImportExcels);
+        List<EmployeeImportExcel> employeeImportExcels = new ArrayList<>();
+        EmployeeImportExcel employeeImportExcel = new EmployeeImportExcel();
+        employeeImportExcels.add(employeeImportExcel);
+        ExportParams exportParams = new ExportParams();
+        exportParams.setTitle("员工信息导入模板");
+        exportParams.setSheetName("员工信息");
+        Workbook workbook = ExcelExportUtil.exportExcel(exportParams, EmployeeImportExcel.class, employeeImportExcels);
         HttpServletResponse response = WebUtils.response();
         ServletOutputStream outputStream = null;
         try {
-            String fileName = URLEncoder.encode("员工导入模板.xls", "utf-8");
+            String fileName = URLEncoder.encode("员工信息导入模板.xls", "utf-8");
             response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
             response.setHeader("content-Type", "application/vnd.ms-excel");
             response.setHeader("Pragma", "no-cache");
@@ -248,10 +381,12 @@
             e.printStackTrace();
             System.out.println("员工导入模板下载失败!");
         } finally {
-            try {
-                outputStream.close();
-            } catch (IOException e) {
-                e.printStackTrace();
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
             }
         }
     }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/importExcel/EmployeeImportExcel.java b/ruoyi-system/src/main/java/com/ruoyi/system/importExcel/EmployeeImportExcel.java
new file mode 100644
index 0000000..7bc3127
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/importExcel/EmployeeImportExcel.java
@@ -0,0 +1,99 @@
+package com.ruoyi.system.importExcel;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel(value = "员工导入Excel")
+public class EmployeeImportExcel implements Serializable {
+
+    @Excel(name = "姓名", width = 20)
+    @ApiModelProperty(value = "姓名")
+    private String nickName;
+
+    @Excel(name = "性别", width = 10)
+    @ApiModelProperty(value = "性别")
+    private String sex;
+
+    @Excel(name = "身份证号码", width = 25)
+    @ApiModelProperty(value = "身份证号码")
+    private String idCard;
+
+    @Excel(name = "年龄", width = 10)
+    @ApiModelProperty(value = "年龄")
+    private Integer age;
+
+    @Excel(name = "政治面貌", width = 15)
+    @ApiModelProperty(value = "政治面貌")
+    private String politicalOutlook;
+
+    @Excel(name = "参工时间", width = 15)
+    @ApiModelProperty(value = "参工时间")
+    private String participationTime;
+
+    @Excel(name = "进入公司时间", width = 15)
+    @ApiModelProperty(value = "进入公司时间")
+    private String companyTime;
+
+    // 第一学历
+    @Excel(name = "第一学历-学历", width = 15)
+    @ApiModelProperty(value = "第一学历")
+    private String firstDegree;
+
+    @Excel(name = "第一学历-学院", width = 25)
+    @ApiModelProperty(value = "第一学历学院")
+    private String firstCollege;
+
+    @Excel(name = "第一学历-专业", width = 25)
+    @ApiModelProperty(value = "第一学历专业")
+    private String firstMajor;
+
+    // 最高学历
+    @Excel(name = "最高学历-学历", width = 15)
+    @ApiModelProperty(value = "最高学历")
+    private String highestDegree;
+
+    @Excel(name = "最高学历-学院", width = 25)
+    @ApiModelProperty(value = "最高学历学院")
+    private String highestCollege;
+
+    @Excel(name = "最高学历-专业", width = 25)
+    @ApiModelProperty(value = "最高学历专业")
+    private String highestMajor;
+
+    @Excel(name = "所在股室", width = 20)
+    @ApiModelProperty(value = "所在股室")
+    private String department;
+
+    @Excel(name = "职务", width = 25)
+    @ApiModelProperty(value = "职务")
+    private String position;
+
+    @Excel(name = "任职时间", width = 15)
+    @ApiModelProperty(value = "任职时间")
+    private String positionTime;
+
+    @Excel(name = "电话号码", width = 15)
+    @ApiModelProperty(value = "电话号码")
+    private String phoneNumber;
+
+    @Excel(name = "编制", width = 15)
+    @ApiModelProperty(value = "编制")
+    private String organization;
+
+
+
+    // 部门名称(系统字段)
+    @Excel(name = "部门名称", width = 20)
+    @ApiModelProperty(value = "部门名称")
+    private String deptName;
+
+    // 角色名称(系统字段)
+    @Excel(name = "角色名称", width = 20)
+    @ApiModelProperty(value = "角色名称")
+    private String roleName;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaNotificationMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaNotificationMapper.java
index d50c11c..90ff3b5 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaNotificationMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaNotificationMapper.java
@@ -21,4 +21,6 @@
 
     List<NotificationVO> pageList(@Param("query")NotificationListQuery query, @Param("pageInfo")PageInfo<NotificationVO> pageInfo);
 
+    List<NotificationVO> pageListUser(@Param("query")NotificationListQuery query, @Param("pageInfo")PageInfo<NotificationVO> pageInfo);
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/OaNotification.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/OaNotification.java
index 692d2a9..085f1fd 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/OaNotification.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/OaNotification.java
@@ -5,6 +5,7 @@
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -47,6 +48,7 @@
 
     @ApiModelProperty(value = "创建时间")
     @TableField("create_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime createTime;
 
     @ApiModelProperty(value = "创建人")
@@ -55,6 +57,7 @@
 
     @ApiModelProperty(value = "更新时间")
     @TableField("update_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime updateTime;
 
     @ApiModelProperty(value = "更新人")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/OaNotificationUser.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/OaNotificationUser.java
index 689d4af..9c3b3f4 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/OaNotificationUser.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/OaNotificationUser.java
@@ -4,12 +4,14 @@
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.io.Serializable;
+import java.time.LocalDateTime;
 
 /**
  * <p>
@@ -42,6 +44,5 @@
     @ApiModelProperty(value = "阅读状态 0-未读,1-已读")
     @TableField("read_status")
     private Boolean readStatus;
-
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/NotificationListQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/NotificationListQuery.java
index 948f083..eb9e637 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/query/NotificationListQuery.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/NotificationListQuery.java
@@ -17,4 +17,6 @@
     private String deptName;
     @ApiModelProperty(value = "部门ids 前端忽略")
     private List<Integer> deptIds;
+    @ApiModelProperty(value = "当前登陆人id 前端忽略")
+    private Long userId;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaNotificationService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaNotificationService.java
index 30e62a8..777e874 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaNotificationService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaNotificationService.java
@@ -18,4 +18,5 @@
 
     PageInfo<NotificationVO> pageList(NotificationListQuery query);
 
+    PageInfo<NotificationVO> pageListUser(NotificationListQuery query);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaNotificationServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaNotificationServiceImpl.java
index 8887cd7..0ca76f9 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaNotificationServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaNotificationServiceImpl.java
@@ -62,4 +62,36 @@
         pageInfo.setRecords(list);
         return pageInfo;
     }
+
+    @Override
+    public PageInfo<NotificationVO> pageListUser(NotificationListQuery query) {
+        List<TDept> tDepts = deptMapper.selectList(null);
+        Map<Integer, String> deptMap = tDepts.stream().collect(Collectors.toMap(TDept::getId, TDept::getDeptName));
+        if (StringUtils.hasLength(query.getDeptName())){
+            List<Integer> deptIds = deptMapper.selectList(new LambdaQueryWrapper<TDept>().like(TDept::getDeptName, query.getDeptName()))
+                    .stream().map(TDept::getId).collect(Collectors.toList());
+            if (deptIds.isEmpty()){
+                return new PageInfo<>();
+            }
+            query.setDeptIds(deptIds);
+        }
+        PageInfo<NotificationVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
+        List<NotificationVO> list = this.baseMapper.pageListUser(query,pageInfo);
+        for (NotificationVO notificationVO : list) {
+            StringBuilder deptName = new StringBuilder();
+            if (notificationVO.getType()){
+                for (String deptId : notificationVO.getDeptIds().split(",")) {
+                    String orDefault = deptMap.getOrDefault(Integer.parseInt(deptId), "");
+                    deptName.append(orDefault).append(",");
+                }
+                notificationVO.setDeptName(deptName.substring(0,deptName.length()-1));
+            }else{
+                notificationVO.setDeptName("全部人员");
+
+            }
+
+        }
+        pageInfo.setRecords(list);
+        return pageInfo;
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationVO.java
index 6fa1952..9fb6c10 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationVO.java
@@ -1,10 +1,14 @@
 package com.ruoyi.system.vo.system;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ruoyi.system.model.OaApproval;
 import com.ruoyi.system.model.OaNotification;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+
+import java.time.LocalDateTime;
 
 @Data
 @ApiModel(value = "消息通知分页返回VO")
@@ -12,5 +16,7 @@
 
     @ApiModelProperty(value = "通知部门")
     private String deptName;
+    @ApiModelProperty(value = "阅读状态 0-未读,1-已读")
+    private Boolean readStatus;
 
 }
diff --git a/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationPurchaseItemMapper.xml b/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationPurchaseItemMapper.xml
index 2594ff7..45744a9 100644
--- a/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationPurchaseItemMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationPurchaseItemMapper.xml
@@ -24,7 +24,7 @@
         from oa_approval_application_purchase_item t1
                  left join asset_type t2 on t2.id = t1.asset_type_id
         where t1.approval_application_id = #{query.approvalApplicationId}
-
+        order by t1.id desc
     </select>
 
 </mapper>
diff --git a/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationsMapper.xml b/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationsMapper.xml
index 768b50d..0bacb04 100644
--- a/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationsMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationsMapper.xml
@@ -33,6 +33,7 @@
         <if test="query.userId != null ">
             and applicant_user_id like concat('%',#{query.userId},'%')
         </if>
+        order by approval_time desc
     </select>
 
 </mapper>
diff --git a/ruoyi-system/src/main/resources/mapper/system/OaNotificationMapper.xml b/ruoyi-system/src/main/resources/mapper/system/OaNotificationMapper.xml
index 3caab6c..538d0f5 100644
--- a/ruoyi-system/src/main/resources/mapper/system/OaNotificationMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/OaNotificationMapper.xml
@@ -35,5 +35,22 @@
         AND disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
         order by  create_time desc
     </select>
+    <select id="pageListUser" resultType="com.ruoyi.system.vo.system.NotificationVO">
+        select t1.read_status as readStatus,t1.notification_id notificationId,t2.* from oa_notification t2
+        where 1=1
+        <if test="query.title != null and query.title != ''">
+            and t2.title like concat('%',#{query.title},'%')
+        </if>
+        <if test="deptIds != null and deptIds.size() > 0">
+            AND (
+            <foreach collection="deptIds" item="deptId" separator=" OR ">
+                FIND_IN_SET(#{deptId}, t2.dept_ids)
+            </foreach>
+            )
+        </if>
+          and t1.user_id = #{query.userId}
+        AND t2.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+        order by  t1.id desc
+    </select>
 
 </mapper>

--
Gitblit v1.7.1