From 682f65074598aa834c0391abaca8736f7075c3d8 Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Sat, 28 Feb 2026 15:09:18 +0800 Subject: [PATCH] =?UTF-8?q?feat(hrm):=20=E6=B7=BB=E5=8A=A0=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9E=E4=BE=8B=E8=AF=84=E8=AE=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 HrmFlowComment 实体类定义评论数据结构 - 创建 HrmFlowCommentBo 业务对象用于数据传输 - 实现 HrmFlowCommentController 提供完整的CRUD接口 - 开发 HrmFlowCommentService 业务逻辑处理层 - 配置 HrmFlowCommentMapper 数据访问接口 - 设计 HrmFlowCommentVo 视图对象支持Excel导出 - 在SysUserService中添加用户昵称映射查询方法 - 实现评论列表的分页查询和用户名称转换功能 - 支持评论内容和附件信息的存储与展示 --- .../controller/HrmFlowCommentController.java | 101 +++++++++++++ .../com/ruoyi/hrm/domain/HrmFlowComment.java | 52 +++++++ .../ruoyi/hrm/domain/bo/HrmFlowCommentBo.java | 50 +++++++ .../ruoyi/hrm/domain/vo/HrmFlowCommentVo.java | 59 ++++++++ .../hrm/mapper/HrmFlowCommentMapper.java | 15 ++ .../hrm/service/IHrmFlowCommentService.java | 49 ++++++ .../impl/HrmFlowCommentServiceImpl.java | 141 ++++++++++++++++++ .../resources/mapper/HrmFlowCommentMapper.xml | 21 +++ .../ruoyi/system/service/ISysUserService.java | 4 + .../service/impl/SysUserServiceImpl.java | 31 +++- 10 files changed, 519 insertions(+), 4 deletions(-) create mode 100644 fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmFlowCommentController.java create mode 100644 fad-hrm/src/main/java/com/ruoyi/hrm/domain/HrmFlowComment.java create mode 100644 fad-hrm/src/main/java/com/ruoyi/hrm/domain/bo/HrmFlowCommentBo.java create mode 100644 fad-hrm/src/main/java/com/ruoyi/hrm/domain/vo/HrmFlowCommentVo.java create mode 100644 fad-hrm/src/main/java/com/ruoyi/hrm/mapper/HrmFlowCommentMapper.java create mode 100644 fad-hrm/src/main/java/com/ruoyi/hrm/service/IHrmFlowCommentService.java create mode 100644 fad-hrm/src/main/java/com/ruoyi/hrm/service/impl/HrmFlowCommentServiceImpl.java create mode 100644 fad-hrm/src/main/resources/mapper/HrmFlowCommentMapper.xml diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmFlowCommentController.java b/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmFlowCommentController.java new file mode 100644 index 0000000..bac4829 --- /dev/null +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmFlowCommentController.java @@ -0,0 +1,101 @@ +package com.ruoyi.hrm.controller; + +import java.util.List; +import java.util.Arrays; +import java.util.concurrent.TimeUnit; + +import lombok.RequiredArgsConstructor; +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.*; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import com.ruoyi.common.core.validate.QueryGroup; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.hrm.domain.vo.HrmFlowCommentVo; +import com.ruoyi.hrm.domain.bo.HrmFlowCommentBo; +import com.ruoyi.hrm.service.IHrmFlowCommentService; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 流程实例评论 + * + * @author ruoyi + * @date 2026-02-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/hrm/flowComment") +public class HrmFlowCommentController extends BaseController { + + private final IHrmFlowCommentService iHrmFlowCommentService; + + /** + * 查询流程实例评论列表 + */ + @GetMapping("/list") + public TableDataInfo list(HrmFlowCommentBo bo, PageQuery pageQuery) { + return iHrmFlowCommentService.queryPageList(bo, pageQuery); + } + + /** + * 导出流程实例评论列表 + */ + @Log(title = "流程实例评论", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HrmFlowCommentBo bo, HttpServletResponse response) { + List list = iHrmFlowCommentService.queryList(bo); + ExcelUtil.exportExcel(list, "流程实例评论", HrmFlowCommentVo.class, response); + } + + /** + * 获取流程实例评论详细信息 + * + * @param commentId 主键 + */ + @GetMapping("/{commentId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long commentId) { + return R.ok(iHrmFlowCommentService.queryById(commentId)); + } + + /** + * 新增流程实例评论 + */ + @Log(title = "流程实例评论", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody HrmFlowCommentBo bo) { + return toAjax(iHrmFlowCommentService.insertByBo(bo)); + } + + /** + * 修改流程实例评论 + */ + @Log(title = "流程实例评论", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody HrmFlowCommentBo bo) { + return toAjax(iHrmFlowCommentService.updateByBo(bo)); + } + + /** + * 删除流程实例评论 + * + * @param commentIds 主键串 + */ + @Log(title = "流程实例评论", businessType = BusinessType.DELETE) + @DeleteMapping("/{commentIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] commentIds) { + return toAjax(iHrmFlowCommentService.deleteWithValidByIds(Arrays.asList(commentIds), true)); + } +} diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/domain/HrmFlowComment.java b/fad-hrm/src/main/java/com/ruoyi/hrm/domain/HrmFlowComment.java new file mode 100644 index 0000000..e92c30c --- /dev/null +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/domain/HrmFlowComment.java @@ -0,0 +1,52 @@ +package com.ruoyi.hrm.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 流程实例评论对象 hrm_flow_comment + * + * @author ruoyi + * @date 2026-02-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("hrm_flow_comment") +public class HrmFlowComment extends BaseEntity { + + private static final long serialVersionUID=1L; + + /** + * 评论ID + */ + @TableId(value = "comment_id") + private Long commentId; + /** + * 关联流程实例ID,关联hrm_flow_instance.inst_id + */ + private Long instId; + /** + * 评论内容,使用text类型支持更长的文本 + */ + private String commentContent; + /** + * 附件信息,JSON格式存储,示例:[{"file_name":"文件1.pdf","file_path":"/upload/1.pdf","file_size":1024},{"file_name":"文件2.jpg","file_path":"/upload/2.jpg","file_size":2048}] + */ + private String attachments; + /** + * 删除标识 0正常 2删除 + */ + @TableLogic + private Long delFlag; + /** + * 备注 + */ + private String remark; + +} diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/domain/bo/HrmFlowCommentBo.java b/fad-hrm/src/main/java/com/ruoyi/hrm/domain/bo/HrmFlowCommentBo.java new file mode 100644 index 0000000..3bf2d8c --- /dev/null +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/domain/bo/HrmFlowCommentBo.java @@ -0,0 +1,50 @@ +package com.ruoyi.hrm.domain.bo; + +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.*; + +import java.util.Date; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 流程实例评论业务对象 hrm_flow_comment + * + * @author ruoyi + * @date 2026-02-28 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class HrmFlowCommentBo extends BaseEntity { + + /** + * 评论ID + */ + private Long commentId; + + /** + * 关联流程实例ID,关联hrm_flow_instance.inst_id + */ + private Long instId; + + /** + * 评论内容,使用text类型支持更长的文本 + */ + private String commentContent; + + /** + * 附件信息,JSON格式存储,示例:[{"file_name":"文件1.pdf","file_path":"/upload/1.pdf","file_size":1024},{"file_name":"文件2.jpg","file_path":"/upload/2.jpg","file_size":2048}] + */ + private String attachments; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/domain/vo/HrmFlowCommentVo.java b/fad-hrm/src/main/java/com/ruoyi/hrm/domain/vo/HrmFlowCommentVo.java new file mode 100644 index 0000000..f279543 --- /dev/null +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/domain/vo/HrmFlowCommentVo.java @@ -0,0 +1,59 @@ +package com.ruoyi.hrm.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.ruoyi.common.annotation.ExcelDictFormat; +import com.ruoyi.common.convert.ExcelDictConvert; +import com.ruoyi.common.core.domain.BaseEntity; +import lombok.Data; +import java.util.Date; + + + +/** + * 流程实例评论视图对象 hrm_flow_comment + * + * @author ruoyi + * @date 2026-02-28 + */ +@Data +@ExcelIgnoreUnannotated +public class HrmFlowCommentVo extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 评论ID + */ + @ExcelProperty(value = "评论ID") + private Long commentId; + + /** + * 关联流程实例ID,关联hrm_flow_instance.inst_id + */ + @ExcelProperty(value = "关联流程实例ID,关联hrm_flow_instance.inst_id") + private Long instId; + + /** + * 评论内容,使用text类型支持更长的文本 + */ + @ExcelProperty(value = "评论内容,使用text类型支持更长的文本") + private String commentContent; + + /** + * 附件信息,JSON格式存储,示例:[{"file_name":"文件1.pdf","file_path":"/upload/1.pdf","file_size":1024},{"file_name":"文件2.jpg","file_path":"/upload/2.jpg","file_size":2048}] + */ + @ExcelProperty(value = "附件信息") + private String attachments; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + private String createByName; + private String updateByName; + + +} diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/mapper/HrmFlowCommentMapper.java b/fad-hrm/src/main/java/com/ruoyi/hrm/mapper/HrmFlowCommentMapper.java new file mode 100644 index 0000000..a502b27 --- /dev/null +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/mapper/HrmFlowCommentMapper.java @@ -0,0 +1,15 @@ +package com.ruoyi.hrm.mapper; + +import com.ruoyi.hrm.domain.HrmFlowComment; +import com.ruoyi.hrm.domain.vo.HrmFlowCommentVo; +import com.ruoyi.common.core.mapper.BaseMapperPlus; + +/** + * 流程实例评论Mapper接口 + * + * @author ruoyi + * @date 2026-02-28 + */ +public interface HrmFlowCommentMapper extends BaseMapperPlus { + +} diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/service/IHrmFlowCommentService.java b/fad-hrm/src/main/java/com/ruoyi/hrm/service/IHrmFlowCommentService.java new file mode 100644 index 0000000..f32af55 --- /dev/null +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/service/IHrmFlowCommentService.java @@ -0,0 +1,49 @@ +package com.ruoyi.hrm.service; + +import com.ruoyi.hrm.domain.HrmFlowComment; +import com.ruoyi.hrm.domain.vo.HrmFlowCommentVo; +import com.ruoyi.hrm.domain.bo.HrmFlowCommentBo; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.domain.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 流程实例评论Service接口 + * + * @author ruoyi + * @date 2026-02-28 + */ +public interface IHrmFlowCommentService { + + /** + * 查询流程实例评论 + */ + HrmFlowCommentVo queryById(Long commentId); + + /** + * 查询流程实例评论列表 + */ + TableDataInfo queryPageList(HrmFlowCommentBo bo, PageQuery pageQuery); + + /** + * 查询流程实例评论列表 + */ + List queryList(HrmFlowCommentBo bo); + + /** + * 新增流程实例评论 + */ + Boolean insertByBo(HrmFlowCommentBo bo); + + /** + * 修改流程实例评论 + */ + Boolean updateByBo(HrmFlowCommentBo bo); + + /** + * 校验并批量删除流程实例评论信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/service/impl/HrmFlowCommentServiceImpl.java b/fad-hrm/src/main/java/com/ruoyi/hrm/service/impl/HrmFlowCommentServiceImpl.java new file mode 100644 index 0000000..23ddbab --- /dev/null +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/service/impl/HrmFlowCommentServiceImpl.java @@ -0,0 +1,141 @@ +package com.ruoyi.hrm.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.domain.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.ruoyi.system.service.ISysUserService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import com.ruoyi.hrm.domain.bo.HrmFlowCommentBo; +import com.ruoyi.hrm.domain.vo.HrmFlowCommentVo; +import com.ruoyi.hrm.domain.HrmFlowComment; +import com.ruoyi.hrm.mapper.HrmFlowCommentMapper; +import com.ruoyi.hrm.service.IHrmFlowCommentService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 流程实例评论Service业务层处理 + * + * @author ruoyi + * @date 2026-02-28 + */ +@RequiredArgsConstructor +@Service +public class HrmFlowCommentServiceImpl implements IHrmFlowCommentService { + + private final HrmFlowCommentMapper baseMapper; + + private final ISysUserService userService; + + /** + * 查询流程实例评论 + */ + @Override + public HrmFlowCommentVo queryById(Long commentId){ + return baseMapper.selectVoById(commentId); + } + + /** + * 查询流程实例评论列表 + */ + @Override + public TableDataInfo queryPageList(HrmFlowCommentBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + //此处需要修改对应返回的vo即可 + List records = result.getRecords(); + Set userNames = records.stream() + //如果还有别的地方需要转成nickname只需要在后面拼上即可 v.getUpdateBy(),v.getOpertor() + .flatMap(v -> java.util.stream.Stream.of(v.getCreateBy(), v.getUpdateBy())) + .filter(StringUtils::isNotBlank) + .collect(Collectors.toSet()); + if (!userNames.isEmpty()) { + Map nickMap = userService.selectNickNameMapByUserNames(records.stream() + //如果上面加了注意此处也得加上 + .flatMap(v -> java.util.stream.Stream.of(v.getCreateBy(), v.getUpdateBy())) + .filter(StringUtils::isNotBlank) + .distinct() + .collect(Collectors.toList())); + records.forEach(item -> { + if (StringUtils.isNotBlank(item.getCreateBy())) { + item.setCreateByName(nickMap.getOrDefault(item.getCreateBy(), item.getCreateBy())); + } + if (StringUtils.isNotBlank(item.getUpdateBy())) { + item.setUpdateByName(nickMap.getOrDefault(item.getUpdateBy(), item.getUpdateBy())); + } + //如果上面加了此处加判断即可 + }); + } + return TableDataInfo.build(result); + } + + /** + * 查询流程实例评论列表 + */ + @Override + public List queryList(HrmFlowCommentBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(HrmFlowCommentBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getInstId() != null, HrmFlowComment::getInstId, bo.getInstId()); + lqw.eq(StringUtils.isNotBlank(bo.getCommentContent()), HrmFlowComment::getCommentContent, bo.getCommentContent()); + lqw.eq(StringUtils.isNotBlank(bo.getAttachments()), HrmFlowComment::getAttachments, bo.getAttachments()); + lqw.orderByDesc(HrmFlowComment::getCreateTime); + return lqw; + } + + /** + * 新增流程实例评论 + */ + @Override + public Boolean insertByBo(HrmFlowCommentBo bo) { + HrmFlowComment add = BeanUtil.toBean(bo, HrmFlowComment.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setCommentId(add.getCommentId()); + } + return flag; + } + + /** + * 修改流程实例评论 + */ + @Override + public Boolean updateByBo(HrmFlowCommentBo bo) { + HrmFlowComment update = BeanUtil.toBean(bo, HrmFlowComment.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(HrmFlowComment entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除流程实例评论 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/fad-hrm/src/main/resources/mapper/HrmFlowCommentMapper.xml b/fad-hrm/src/main/resources/mapper/HrmFlowCommentMapper.xml new file mode 100644 index 0000000..a118f20 --- /dev/null +++ b/fad-hrm/src/main/resources/mapper/HrmFlowCommentMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java index 25ca3ac..bfca034 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java @@ -6,6 +6,7 @@ import com.ruoyi.common.core.page.TableDataInfo; import java.util.Date; import java.util.List; +import java.util.Map; /** * 用户 业务层 @@ -241,4 +242,7 @@ public interface ISysUserService { List selectUserList2(); SysUser selectUserByIdIncludingDel(Long userId); + + + Map selectNickNameMapByUserNames(List userNames); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index fc9758d..ec9f87a 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -33,10 +33,8 @@ import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; /** * 用户 业务层处理 @@ -531,4 +529,29 @@ public class SysUserServiceImpl implements ISysUserService, UserService { return baseMapper.selectUserByNickName(nickName); } + @Override + public Map selectNickNameMapByUserNames(List userNames) { + if (CollUtil.isEmpty(userNames)) { + return new HashMap<>(); + } + + // 先查询数据库中存在的用户 + List users = baseMapper.selectList(new LambdaQueryWrapper() + .select(SysUser::getUserName, SysUser::getNickName) + .in(SysUser::getUserName, userNames) + .eq(SysUser::getDelFlag, UserConstants.USER_NORMAL)); + + // 创建一个映射,包含存在的用户昵称 + Map nickMap = users.stream() + .collect(Collectors.toMap(SysUser::getUserName, SysUser::getNickName, (a, b) -> a)); + + // 对于不存在的用户名,将其用户名作为昵称添加到映射中 + for (String userName : userNames) { + if (!nickMap.containsKey(userName)) { + nickMap.put(userName, userName); + } + } + + return nickMap; + } }