From efb2fdfee06ea8da62b707be13c382e3b211dbfc Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Wed, 5 Mar 2025 11:31:52 +0800 Subject: [PATCH 1/6] =?UTF-8?q?feat(bpm):=20=E4=BC=98=E5=8C=96=E6=8A=A5?= =?UTF-8?q?=E9=94=80=E5=8D=95=E6=9F=A5=E8=AF=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在查询条件中增加报销审核通过的状态过滤 - 通过添加 result = 2 的条件,仅显示审核通过的报销单 --- .../src/main/resources/mapper/oa/BpmOAExpensesMapper.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/oa/BpmOAExpensesMapper.xml b/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/oa/BpmOAExpensesMapper.xml index 1fa05326..a5d27191 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/oa/BpmOAExpensesMapper.xml +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/oa/BpmOAExpensesMapper.xml @@ -35,6 +35,7 @@ WHERE a.deleted = 0 AND b.deleted = 0 + AND b.result = 2 AND b.user_id = #{pageReqVO.userId} From d83dca6b87d092e391b3075d76537ef168f6a1fb Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Thu, 6 Mar 2025 12:52:23 +0800 Subject: [PATCH 2/6] =?UTF-8?q?feat(system):=20=E6=B7=BB=E5=8A=A0=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E5=AE=9E=E4=BE=8B=E5=AF=BC=E5=87=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 LogExportExcelVO 和 LogExportVO 类用于日志导出 - 在 LogInstanceController 中添加 exportLogInstanceExcel 方法处理导出请求 - 在 LogInstanceService 接口中添加 getLogInstanceExport 方法 - 在 LogInstanceServiceImpl 中实现 getLogInstanceExport 方法,用于获取日志导出列表 - 优化 BpmOAImprestController 中的代码结构 --- .../admin/oa/BpmOAImprestController.java | 14 ++-- .../admin/worklog/LogInstanceController.java | 10 +-- .../vo/loginstance/LogExportExcelVO.java | 33 ++++++++++ .../worklog/vo/loginstance/LogExportVO.java | 15 +++++ .../service/worklog/LogInstanceService.java | 7 ++ .../worklog/LogInstanceServiceImpl.java | 65 ++++++++++++++++++- 6 files changed, 132 insertions(+), 12 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogExportExcelVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogExportVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOAImprestController.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOAImprestController.java index 35f4d254..2ccdea3b 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOAImprestController.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOAImprestController.java @@ -58,12 +58,14 @@ public class BpmOAImprestController { BpmOAImprestDO imprest = imprestService.getImprest(id); BpmOAImprestRespVO respVO = BpmOAImprestConvert.INSTANCE.convert(imprest); if (respVO != null) { - // 获取收款账号信息 - BankRespDTO bankRespDTO = bankApi.getBank(respVO.getBankId()).getCheckedData(); - if (bankRespDTO != null) { - respVO.setBankName(bankRespDTO.getBankName()); - respVO.setNickname(bankRespDTO.getNickname()); - respVO.setBankNo(bankRespDTO.getBankNo()); + if (respVO.getBankId() != null) { + // 获取收款账号信息 + BankRespDTO bankRespDTO = bankApi.getBank(respVO.getBankId()).getCheckedData(); + if (bankRespDTO != null) { + respVO.setBankName(bankRespDTO.getBankName()); + respVO.setNickname(bankRespDTO.getNickname()); + respVO.setBankNo(bankRespDTO.getBankNo()); + } } // 获取公司信息 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java index 7fb6816f..087946e3 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java @@ -306,12 +306,12 @@ public class LogInstanceController { @Operation(summary = "导出日志实例 Excel") @PreAuthorize("@ss.hasPermission('system:log-instance:export')") @OperateLog(type = EXPORT) - public void exportLogInstanceExcel(@Valid LogInstancePageReqVO pageReqVO, + public void exportLogInstanceExcel(@Valid LogExportVO reqVO, HttpServletResponse response) throws IOException { - pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = logInstanceService.getLogInstancePage(pageReqVO, null).getRecords(); + + List list = logInstanceService.getLogInstanceExport(reqVO); // 导出 Excel - ExcelUtils.write(response, "日志实例的拓展.xls", "数据", LogInstanceRespVO.class, - BeanUtils.toBean(list, LogInstanceRespVO.class)); + ExcelUtils.write(response, "日志实例的拓展.xls", "数据", LogExportExcelVO.class, + list); } } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogExportExcelVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogExportExcelVO.java new file mode 100644 index 00000000..87a0d907 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogExportExcelVO.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance; + +import cn.iocoder.yudao.framework.common.validation.IdCard; +import cn.iocoder.yudao.framework.common.validation.Mobile; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * 日志Excel 导出 VO + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题 +public class LogExportExcelVO { + + @ExcelProperty("用户名称") + private String nickname; + + @ExcelProperty("日期") + private String time; + + @ExcelProperty("标题") + private String title; + + @ExcelProperty("内容") + private String content; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogExportVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogExportVO.java new file mode 100644 index 00000000..606aaa50 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogExportVO.java @@ -0,0 +1,15 @@ +package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 日志实例导出 Response VO") +@Data +public class LogExportVO { + + @Schema(description = "日志模版编号") + private Long formId; + + @Schema(description = "时间范围") + private String[] time; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java index e81b7d9e..169fb170 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceService.java @@ -92,4 +92,11 @@ public interface LogInstanceService { * @return */ LogInstanceNextOrUpVO getNextOrUp(LogInstancePageReqVO dto, Long id, Integer pagingType); + + /** + * 获取日志导出列表 + * @param reqVO 请求参数 + * @return 日志列表 + */ + List getLogInstanceExport(LogExportVO reqVO); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java index c641c2fc..ca16217d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java @@ -1,11 +1,13 @@ package cn.iocoder.yudao.module.system.service.worklog; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.json.JSONObject; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptRespVO; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.*; import cn.iocoder.yudao.module.system.convert.worklog.LogInstanceConvert; @@ -286,7 +288,7 @@ public class LogInstanceServiceImpl implements LogInstanceService { item.setAvatar(userDO.getAvatar()); } - //设置日志内部分 + //设置日志内部分an LogFormDO logFormDO = formMap.get(item.getFormId()); List fields = logFormDO.getFields(); StringBuilder workLogContent = new StringBuilder(); @@ -445,6 +447,67 @@ public class LogInstanceServiceImpl implements LogInstanceService { return vo; } + @Override + public List getLogInstanceExport(LogExportVO reqVO) { + List list = logInstanceMapper.selectList(new LambdaQueryWrapperX() + .eqIfPresent(LogInstanceDO::getFormId, reqVO.getFormId()) + .betweenIfPresent(LogInstanceDO::getTime, reqVO.getTime())); + + List result = new ArrayList<>(); + if (CollUtil.isNotEmpty(list)) { + + //模版ids过滤 + Set workFormIds = list.stream().map(LogInstanceDO::getFormId).collect(Collectors.toSet()); + + // 查询模版列表 + List formList = logFormService.getFormList(workFormIds); + Map formMap = formList.stream().collect(Collectors.toMap(LogFormDO::getId, item -> item)); + + //查询用户信息列表 + Set userIds = list.stream().map(LogInstanceDO::getStartUserId).collect(Collectors.toSet()); + Map userMap = adminUserService.getUserMap(userIds); + + //遍历 + for (LogInstanceDO item : list) { + LogExportExcelVO logExportExcelVO = new LogExportExcelVO(); + + // 设置时间 + logExportExcelVO.setTime(item.getTime()); + + //设置发起人用户名称和头像 + AdminUserDO userDO = userMap.get(item.getStartUserId()); + if (userDO != null) { + logExportExcelVO.setNickname(userDO.getNickname()); + } + + //设置日志内部分an + LogFormDO logFormDO = formMap.get(item.getFormId()); + List fields = logFormDO.getFields(); + if (!item.getFormVariables().isEmpty()) { + JSONObject workLogContentJson = new JSONObject(item.getFormVariables()); + for (String fieldItem : fields) { + JSONObject fieldJson = new JSONObject(fieldItem); + if ("upload".equals(fieldJson.getStr("type"))) { + continue; + } + String fieldStr = fieldJson.getStr("field"); + String title = fieldJson.getStr("title"); + if (fieldStr == null || title == null) { + continue; + } + String field = workLogContentJson.getStr(fieldStr); + logExportExcelVO.setTitle(title); + logExportExcelVO.setContent(field); + + result.add(logExportExcelVO); + } + } + } + } + + return result; + } + @Override public List getNeedWriteLogInstanceByTimeRange(Long fromId, List time, Long userId) { return logInstanceMapper.selectList(new LambdaQueryWrapper() From cdb4d79822868d7a3527419005795b53fcada12e Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Sun, 9 Mar 2025 10:27:12 +0800 Subject: [PATCH 3/6] =?UTF-8?q?refactor(system):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E5=AE=9E=E4=BE=8B=E5=AF=BC=E5=87=BA=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 使用 EasyExcel 替代 ExcelUtils 写入 Excel 文件 - 添加单元格合并功能 - 优化表格样式,包括列宽自适应、居中对齐等 -增加部门编号筛选条件 - 调整日志数据查询逻辑,提高效率 --- .../admin/worklog/LogInstanceController.java | 82 +++++++++++++++++-- .../vo/loginstance/LogExportExcelVO.java | 2 - .../worklog/vo/loginstance/LogExportVO.java | 3 + .../worklog/LogInstanceServiceImpl.java | 26 +++--- 4 files changed, 91 insertions(+), 22 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java index 087946e3..846537a0 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/LogInstanceController.java @@ -2,10 +2,8 @@ package cn.iocoder.yudao.module.system.controller.admin.worklog; import cn.hutool.core.collection.CollectionUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptRespVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserRespVO; @@ -21,10 +19,20 @@ import cn.iocoder.yudao.module.system.service.user.AdminUserService; import cn.iocoder.yudao.module.system.service.worklog.LogInstanceService; import cn.iocoder.yudao.module.system.service.worklog.LogReadService; import cn.iocoder.yudao.module.system.service.worklog.LogUseService; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.converters.longconverter.LongStringConverter; +import com.alibaba.excel.support.ExcelTypeEnum; +import com.alibaba.excel.write.builder.ExcelWriterBuilder; +import com.alibaba.excel.write.merge.OnceAbsoluteMergeStrategy; +import com.alibaba.excel.write.metadata.style.WriteCellStyle; +import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; +import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.VerticalAlignment; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -33,10 +41,9 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.*; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @@ -310,8 +317,65 @@ public class LogInstanceController { HttpServletResponse response) throws IOException { List list = logInstanceService.getLogInstanceExport(reqVO); - // 导出 Excel - ExcelUtils.write(response, "日志实例的拓展.xls", "数据", LogExportExcelVO.class, - list); + + + // 输出excel + ExcelWriterBuilder writer = EasyExcel.write(response.getOutputStream(), LogExportExcelVO.class); + + List strategies = getMergeStrategy(list); + strategies.forEach(writer::registerWriteHandler); + + writer.autoCloseStream(false); // 不要自动关闭,交给 Servlet 自己处理 + writer.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()); // 基于 column 长度,自动适配。最大 255 宽度 + writer.registerWriteHandler(new HorizontalCellStyleStrategy(getHeadStyle(), getContentStyle())); + writer.registerConverter(new LongStringConverter()); // 避免 Long 类型丢失精度 + writer.excelType(ExcelTypeEnum.XLS); + writer.sheet("数据").doWrite(list); + + // 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了 + response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("日志实例的拓展.xls", StandardCharsets.UTF_8.name())); + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + + +// // 导出 Excel +// ExcelUtils.write(response, "日志实例的拓展.xls", "数据", LogExportExcelVO.class, +// list); + } + + public static List getMergeStrategy(List dataList) { + List strategies = new ArrayList<>(); + List mergeCols = Arrays.asList(0, 1); // 需要合并的列索引 + + // 遍历数据,生成合并区间 + for (int i = 0; i < dataList.size(); i++) { + if (i > 0 && dataList.get(i).getNickname().equals(dataList.get(i - 1).getNickname()) && dataList.get(i).getTime().equals(dataList.get(i - 1).getTime())) { + continue; + } + int startRow = i + 1; + while (i < dataList.size() - 1 && dataList.get(i).getNickname().equals(dataList.get(i + 1).getNickname()) && dataList.get(i).getTime().equals(dataList.get(i + 1).getTime())) { + i++; + } + for (int col : mergeCols) { + strategies.add(new OnceAbsoluteMergeStrategy(startRow, i + 1, col, col)); + } + } + return strategies; + } + + // 表头样式(居中) + public static WriteCellStyle getHeadStyle() { + WriteCellStyle headStyle = new WriteCellStyle(); + headStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); + headStyle.setVerticalAlignment(VerticalAlignment.CENTER); + return headStyle; + } + + // 内容样式(居中) + public static WriteCellStyle getContentStyle() { + WriteCellStyle contentStyle = new WriteCellStyle(); + contentStyle.setWrapped(true); // 启用自动换行 + contentStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); + contentStyle.setVerticalAlignment(VerticalAlignment.CENTER); + return contentStyle; } } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogExportExcelVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogExportExcelVO.java index 87a0d907..63b8d07b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogExportExcelVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogExportExcelVO.java @@ -1,7 +1,5 @@ package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance; -import cn.iocoder.yudao.framework.common.validation.IdCard; -import cn.iocoder.yudao.framework.common.validation.Mobile; import com.alibaba.excel.annotation.ExcelProperty; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogExportVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogExportVO.java index 606aaa50..36e393e4 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogExportVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/worklog/vo/loginstance/LogExportVO.java @@ -7,6 +7,9 @@ import lombok.Data; @Data public class LogExportVO { + @Schema(description = "部门编号") + private Long companyDeptId; + @Schema(description = "日志模版编号") private Long formId; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java index ca16217d..f944ff26 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java @@ -142,7 +142,8 @@ public class LogInstanceServiceImpl implements LogInstanceService { List respDTOS = logInstanceMapper.selectRaedUser(userId, adminUserDO.getDeptId()); //特殊情况, 日志发起人为研发部时 手动添加查看者 - if (adminUserDO.getDeptId() == 128L && adminUserDO.getId() != 126L) { + List deptIds = convertList(deptService.getChildDept(128L), DeptDO::getId); + if (deptIds.contains(adminUserDO.getDeptId()) && adminUserDO.getId() != 126L) { LogReadUserRespDTO dto = new LogReadUserRespDTO(); dto.setUserId(126L); @@ -450,6 +451,7 @@ public class LogInstanceServiceImpl implements LogInstanceService { @Override public List getLogInstanceExport(LogExportVO reqVO) { List list = logInstanceMapper.selectList(new LambdaQueryWrapperX() + .eqIfPresent(LogInstanceDO::getDeptId, reqVO.getCompanyDeptId()) .eqIfPresent(LogInstanceDO::getFormId, reqVO.getFormId()) .betweenIfPresent(LogInstanceDO::getTime, reqVO.getTime())); @@ -469,16 +471,6 @@ public class LogInstanceServiceImpl implements LogInstanceService { //遍历 for (LogInstanceDO item : list) { - LogExportExcelVO logExportExcelVO = new LogExportExcelVO(); - - // 设置时间 - logExportExcelVO.setTime(item.getTime()); - - //设置发起人用户名称和头像 - AdminUserDO userDO = userMap.get(item.getStartUserId()); - if (userDO != null) { - logExportExcelVO.setNickname(userDO.getNickname()); - } //设置日志内部分an LogFormDO logFormDO = formMap.get(item.getFormId()); @@ -496,6 +488,18 @@ public class LogInstanceServiceImpl implements LogInstanceService { continue; } String field = workLogContentJson.getStr(fieldStr); + + LogExportExcelVO logExportExcelVO = new LogExportExcelVO(); + + // 设置时间 + logExportExcelVO.setTime(item.getTime()); + + //设置发起人用户名称和头像 + AdminUserDO userDO = userMap.get(item.getStartUserId()); + if (userDO != null) { + logExportExcelVO.setNickname(userDO.getNickname()); + } + logExportExcelVO.setTitle(title); logExportExcelVO.setContent(field); From 57838d91ddc8908e6e5388e13f35ad4fca67b71e Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Mon, 10 Mar 2025 21:10:19 +0800 Subject: [PATCH 4/6] =?UTF-8?q?refactor(system):=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E9=83=A8=E9=97=A8=E6=97=B6=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=97=A5=E5=BF=97=E4=BD=BF=E7=94=A8=E4=BA=BA?= =?UTF-8?q?=E9=83=A8=E9=97=A8-=20=E5=9C=A8=20AdminUserServiceImpl=20?= =?UTF-8?q?=E4=B8=AD=E6=B7=BB=E5=8A=A0=E6=9B=B4=E6=96=B0=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E4=BA=BA=E9=83=A8=E9=97=A8=E7=9A=84=E9=80=BB?= =?UTF-8?q?=E8=BE=91-=20=E5=9C=A8=20LogUseService=20=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E4=B8=AD=E6=96=B0=E5=A2=9E=20updateUseDeptId=20=E6=96=B9?= =?UTF-8?q?=E6=B3=95=20-=20=E5=9C=A8=20LogUseServiceImpl=20=E4=B8=AD?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=20updateUseDeptId=20=E6=96=B9=E6=B3=95=20-?= =?UTF-8?q?=20=E4=BC=98=E5=8C=96=20LogInstanceServiceImpl=20=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E6=97=A5=E5=BF=97=E5=AE=9E=E4=BE=8B=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=EF=BC=8C=E6=94=AF=E6=8C=81=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=89=80=E6=9C=89=E4=B8=8B=E7=BA=A7=E9=83=A8=E9=97=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/system/service/user/AdminUserServiceImpl.java | 9 +++++++++ .../system/service/worklog/LogInstanceServiceImpl.java | 5 ++++- .../system/service/worklog/LogRuleServiceImpl.java | 2 +- .../module/system/service/worklog/LogUseService.java | 7 +++++++ .../module/system/service/worklog/LogUseServiceImpl.java | 9 +++++++++ 5 files changed, 30 insertions(+), 2 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java index 401a3a3b..12ab4cab 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java @@ -41,6 +41,7 @@ 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.permission.PermissionService; import cn.iocoder.yudao.module.system.service.tenant.TenantService; +import cn.iocoder.yudao.module.system.service.worklog.LogUseService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.google.common.annotations.VisibleForTesting; @@ -100,6 +101,9 @@ public class AdminUserServiceImpl implements AdminUserService { @Resource private FileApi fileApi; + @Resource + private LogUseService logUseService; + @Override @Transactional(rollbackFor = Exception.class) public void updateUserOpenId(Long id, String openId) { @@ -155,9 +159,14 @@ public class AdminUserServiceImpl implements AdminUserService { userMapper.updateById(updateObj); // 更新岗位 updateUserPost(updateReqVO, updateObj); + + // 更新日志使用人信息 + logUseService.updateUseDeptId(updateObj.getId(), updateObj.getDeptId()); + } private void updateUserPost(UserSaveReqVO reqVO, AdminUserDO updateObj) { + Long userId = reqVO.getId(); Set dbPostIds = convertSet(userPostMapper.selectListByUserId(userId), UserPostDO::getPostId); // 计算新增和删除的岗位编号 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java index f944ff26..be03eb1b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogInstanceServiceImpl.java @@ -450,8 +450,11 @@ public class LogInstanceServiceImpl implements LogInstanceService { @Override public List getLogInstanceExport(LogExportVO reqVO) { + // 获取所有部门及下级部门信息 + List deptDOS = deptService.getChildDept(reqVO.getCompanyDeptId()); + List list = logInstanceMapper.selectList(new LambdaQueryWrapperX() - .eqIfPresent(LogInstanceDO::getDeptId, reqVO.getCompanyDeptId()) + .inIfPresent(LogInstanceDO::getDeptId, convertList(deptDOS, DeptDO::getId)) .eqIfPresent(LogInstanceDO::getFormId, reqVO.getFormId()) .betweenIfPresent(LogInstanceDO::getTime, reqVO.getTime())); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java index e5584227..d83830e1 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogRuleServiceImpl.java @@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogFormMapper; import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogRuleMapper; import cn.iocoder.yudao.module.system.service.worklog.dto.LogUseSaveReqDTO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -132,5 +133,4 @@ public class LogRuleServiceImpl implements LogRuleService { return logRuleMapper.selectOne(new LambdaQueryWrapper() .eq(LogRuleDO::getFormId, formId)); } - } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseService.java index 93cd3f6f..05babbbc 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseService.java @@ -74,4 +74,11 @@ public interface LogUseService { * @return 模版列表 */ List getFormIdList(List deptIds); + + /** + * 更新日志规则使用部门id + * @param userId 用户编号 + * @param deptId 部门编号 + */ + void updateUseDeptId(Long userId, Long deptId); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseServiceImpl.java index 54fb5216..11eb9d60 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/worklog/LogUseServiceImpl.java @@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogUseDO; import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogUseMapper; import cn.iocoder.yudao.module.system.service.worklog.dto.LogUseSaveReqDTO; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -106,4 +107,12 @@ public class LogUseServiceImpl implements LogUseService { List logUseDOS = logUseMapper.selectList(LogUseDO::getUseUserDept, deptIds); return logUseDOS.stream().map(LogUseDO::getFormId).distinct().collect(Collectors.toList()); } + + @Override + public void updateUseDeptId(Long userId, Long deptId) { + + logUseMapper.update(null, new LambdaUpdateWrapper() + .set(LogUseDO::getUseUserDept, deptId) + .eq(LogUseDO::getUseUserId, userId)); + } } \ No newline at end of file From 2ffd3ffadb90cf73c158d546fe9e71ebf1c3f500 Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Mon, 10 Mar 2025 21:10:37 +0800 Subject: [PATCH 5/6] =?UTF-8?q?fix(smartfactory):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=91=98=E5=B7=A5=E7=BB=9F=E8=AE=A1=E6=80=A7=E5=88=AB=E7=A9=BA?= =?UTF-8?q?=E6=8C=87=E9=92=88=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在计算男性和女性员工总数时,增加了对性别字段的非空检查 - 避免在性别字段为 null 时发生空指针异常,提高代码健壮性 --- .../module/smartfactory/service/staff/StaffServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/staff/StaffServiceImpl.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/staff/StaffServiceImpl.java index 8356df13..5a8caf68 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/staff/StaffServiceImpl.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/staff/StaffServiceImpl.java @@ -116,8 +116,8 @@ public class StaffServiceImpl implements StaffService { }); vo.setTotal(dos.size()); - vo.setMaleTotal((int) dos.stream().filter(a -> a.getSex() == 0).count()); - vo.setFemaleTotal((int) dos.stream().filter(a -> a.getSex() == 1).count()); + vo.setMaleTotal((int) dos.stream().filter(a -> a.getSex() != null && a.getSex() == 0).count()); + vo.setFemaleTotal((int) dos.stream().filter(a -> a.getSex() != null && a.getSex() == 1).count()); vo.setStaffInfos(dos); return vo; } From e401eef546e0b7960ac4e6fa89a7f71d08fdfe36 Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Mon, 10 Mar 2025 21:11:01 +0800 Subject: [PATCH 6/6] =?UTF-8?q?perf(bpm):=20=E4=BC=98=E5=8C=96=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=20CC=20=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3=E6=80=A7?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在处理流程 CC 列表时,增加了对结果列表的非空判断 - 只有在列表非空的情况下,才进行部门和用户组信息的查询和设置 - 这样可以减少不必要的 API调用,提高接口性能 --- .../definition/BpmProcessCcController.java | 43 +++++++++++-------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessCcController.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessCcController.java index 6d33ed2f..50ca4dd5 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessCcController.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessCcController.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.bpm.controller.admin.definition; +import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; @@ -85,27 +86,31 @@ public class BpmProcessCcController { PageResult pageResult = processCcService.getProcessCcPage(pageReqVO); PageResult respVOPageResult = BeanUtils.toBean(pageResult, BpmProcessCcRespVO.class); - // 获取公司部门Map - Map deptMap = convertMap(deptApi.getCompanyDept().getCheckedData(), DeptRespDTO::getId); - // 获取列表中所有用户组详情 - List groupDOS = groupService.getUserGroupList( - respVOPageResult.getList().stream() - .flatMap(item -> item.getUserGroupId().stream()) - .collect(Collectors.toSet())); - // 转换Map - Map groupNameMap = convertMap(groupDOS, BpmUserGroupDO::getId, BpmUserGroupDO::getName); + if (CollUtil.isNotEmpty(respVOPageResult.getList())) { - respVOPageResult.getList().forEach(data -> { + // 获取公司部门Map + Map deptMap = convertMap(deptApi.getCompanyDept().getCheckedData(), DeptRespDTO::getId); + // 获取列表中所有用户组详情 + List groupDOS = groupService.getUserGroupList( + respVOPageResult.getList().stream() + .flatMap(item -> item.getUserGroupId().stream()) + .collect(Collectors.toSet())); + // 转换Map + Map groupNameMap = convertMap(groupDOS, BpmUserGroupDO::getId, BpmUserGroupDO::getName); + + respVOPageResult.getList().forEach(data -> { + + // 设置用户组名称 + data.setGroupName(data.getUserGroupId().stream() + .map(groupNameMap::get) + .collect(Collectors.joining("、"))); + // 设置公司名称 + data.setCompanyName(data.getCompanyDeptId().stream() + .map(item -> deptMap.get(item) != null ? deptMap.get(item).getName() : "") + .collect(Collectors.joining("、"))); + }); + } - // 设置用户组名称 - data.setGroupName(data.getUserGroupId().stream() - .map(groupNameMap::get) - .collect(Collectors.joining("、"))); - // 设置公司名称 - data.setCompanyName(data.getCompanyDeptId().stream() - .map(item -> deptMap.get(item) != null ? deptMap.get(item).getName() : "") - .collect(Collectors.joining("、"))); - }); return success(respVOPageResult); } } \ No newline at end of file