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