无关风月
5 天以前 9ec0ecb6e1a81f1ce55935b9ba7fbda6c3a8810a
员工导入
14个文件已修改
1个文件已添加
549 ■■■■ 已修改文件
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetHouseInspectionItemController.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaNotifationUserController.java 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaNotificationController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java 209 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/importExcel/EmployeeImportExcel.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaNotificationMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/OaNotification.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/OaNotificationUser.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/NotificationListQuery.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/OaNotificationService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaNotificationServiceImpl.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/NotificationVO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationPurchaseItemMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationsMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/OaNotificationMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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();
    }
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);
    }
}
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);
    }
}
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();
                }
            }
        }
    }
ruoyi-system/src/main/java/com/ruoyi/system/importExcel/EmployeeImportExcel.java
New file
@@ -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;
}
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);
}
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 = "更新人")
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;
}
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;
}
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);
}
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;
    }
}
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;
}
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>
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>
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>