Merge branch 'dev' into frx

This commit is contained in:
furongxin 2024-04-13 13:34:27 +08:00
commit 40a568cd4e
27 changed files with 881 additions and 15 deletions

View File

@ -171,6 +171,11 @@ public interface ErrorCodeConstants {
// ========== 站内信发送 1-002-028-000 ==========
ErrorCode NOTIFY_SEND_TEMPLATE_PARAM_MISS = new ErrorCode(1_002_028_000, "模板参数({})缺失");
ErrorCode FORM_NOT_EXISTS = new ErrorCode(1_009_010_000, "动态表单不存在");
ErrorCode FORM_FIELD_REPEAT = new ErrorCode(1_009_010_001, "表单项({}) 和 ({}) 使用了相同的字段名({})");
ErrorCode LOG_INSTANCE_NOT_EXISTS = new ErrorCode(1_009_010_002, "日志实例的拓展不存在");
ErrorCode LOG_RULE_NOT_EXISTS = new ErrorCode(1_009_010_003, "日志规则不存在");
// ========== 站内信发送 1-003-001-000 ==========
ErrorCode SCHEDULING_NOT_EXISTS = new ErrorCode(1_003_001_000, "排班制考勤设置不存在");
ErrorCode PUNCH_RECORD_NOT_EXISTS = new ErrorCode(1_003_002_000, "用户打卡记录不存在");
@ -178,11 +183,6 @@ public interface ErrorCodeConstants {
ErrorCode GROUP_SHIFT_NOT_EXISTS = new ErrorCode(1_003_004_000, "考勤组班次不存在");
ErrorCode GROUP_NOT_EXISTS = new ErrorCode(1_003_005_000, "考勤组不存在");
ErrorCode FIXED_NOT_EXISTS = new ErrorCode(1_003_006_000, "固定班制考勤设置");
ErrorCode FORM_NOT_EXISTS = new ErrorCode(1_009_010_000, "动态表单不存在");
ErrorCode FORM_FIELD_REPEAT = new ErrorCode(1_009_010_001, "表单项({}) 和 ({}) 使用了相同的字段名({})");
ErrorCode LOG_INSTANCE_NOT_EXISTS = new ErrorCode(1_009_010_002, "日志实例的拓展不存在");
ErrorCode LOG_RULE_NOT_EXISTS = new ErrorCode(1_009_010_003, "日志规则不存在");
ErrorCode LOG_RULE_NOT_FIND = new ErrorCode(1_009_010_004, "该模板没配置规则");

View File

@ -1,7 +1,6 @@
package cn.iocoder.yudao.module.system.controller.admin.auth;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
@ -27,7 +26,6 @@ import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

View File

@ -0,0 +1,43 @@
package cn.iocoder.yudao.module.system.controller.admin.worklog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.system.controller.admin.worklog.dto.statistics.WorkLogStatisticsModelDTO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.form.LogFormUpdateReqVO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.WorkLogStatisticsModelVO;
import cn.iocoder.yudao.module.system.service.worklog.WorkLogStatisticsService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 工作日志统计")
@RestController
@RequestMapping("/system/worklog/statistics")
@Validated
public class WorkLogStatisticsController {
@Resource
private WorkLogStatisticsService workLogStatisticsService;
@GetMapping("/myManageModel")
@Operation(summary = "获取我管理的模版")
public CommonResult<List<WorkLogStatisticsModelVO>> myManageModel(@ModelAttribute WorkLogStatisticsModelDTO dto) {
return success(workLogStatisticsService.myManageModel(dto));
}
// @PutMapping("/update")
// @Operation(summary = "更新动态表单")
// @PreAuthorize("@ss.hasPermission('worklog:form:update')")
// public CommonResult<Boolean> updateForm(@Valid @RequestBody LogFormUpdateReqVO updateReqVO) {
// formService.updateForm(updateReqVO);
// return success(true);
// }
}

View File

@ -0,0 +1,29 @@
package cn.iocoder.yudao.module.system.controller.admin.worklog.dto.statistics;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* 动态表单 Base VO提供给添加修改详细的子 VO 使用
* 如果子 VO 存在差异的字段请不要添加到这里影响 Swagger 文档生成
*/
@Data
public class WorkLogStatisticsModelDTO {
@Schema(description = "表单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
@NotNull(message = "表单名称不能为空")
private String name;
@Schema(description = "日志绑定规则编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "1")
private String ruleId;
@Schema(description = "表单状态-参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "表单状态不能为空")
private Integer status;
@Schema(description = "备注", example = "我是备注")
private String remark;
}

View File

@ -0,0 +1,14 @@
package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogFormDO;
import lombok.Data;
/**
* 动态表单 Base VO提供给添加修改详细的子 VO 使用
* 如果子 VO 存在差异的字段请不要添加到这里影响 Swagger 文档生成
*/
@Data
public class WorkLogStatisticsModelVO extends LogFormDO {
}

View File

@ -0,0 +1,50 @@
package cn.iocoder.yudao.module.system.controller.app.comment;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.system.controller.app.comment.dto.CommentDTO;
import cn.iocoder.yudao.module.system.controller.app.comment.vo.CommentPageListVO;
import cn.iocoder.yudao.module.system.controller.app.comment.vo.CommentTypeCountVO;
import cn.iocoder.yudao.module.system.controller.app.comment.vo.WorkLogCommentSaveReqVO;
import cn.iocoder.yudao.module.system.service.comment.WorkLogCommentService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 工作日志评论")
@RestController
@RequestMapping("/system/work-log-comment")
@Validated
public class WorkLogCommentController {
@Autowired
private WorkLogCommentService workLogCommentService;
@Operation(summary = "用户工作日志评论-分页查询评论列表")
@GetMapping(value = "/queryCommentPageList")
public CommonResult<IPage<CommentPageListVO>> queryCommentPageList(CommentDTO dto,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
Page<CommentPageListVO> page = new Page<>(pageNo, pageSize);
IPage<CommentPageListVO> pageList = workLogCommentService.queryCommentPageList(page, dto);
return success(pageList);
}
@PostMapping("/create")
@Operation(summary = "创建工作日志评论")
public CommonResult<Long> createWorkLogComment(@RequestBody WorkLogCommentSaveReqVO createReqVO) {
return success(workLogCommentService.createWorkLogComment(createReqVO));
}
@GetMapping("/queryCommentTypeCount")
@Operation(summary = "获取评论类型数量")
public CommonResult<CommentTypeCountVO> queryCommentTypeCount() {
return success(workLogCommentService.queryCommentTypeCount());
}
}

View File

@ -0,0 +1,23 @@
package cn.iocoder.yudao.module.system.controller.app.comment.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class CommentDTO {
@Schema(description = "工作日志id")
@JsonSerialize(using = ToStringSerializer.class)
private Long workLogId;
@Schema(description = "评论类型0|评论1|回评")
private Integer type;
@Schema(description = "是否需要显示日志内容 0否 1是 默认否")
private Integer isShowWorkLogContent;
@Schema(description = "是否查看自己的评论记录 0否 1是")
private Integer checkMyselfFlag;
@Schema(description = "用户id")
private Long userId;
}

View File

@ -0,0 +1,53 @@
package cn.iocoder.yudao.module.system.controller.app.comment.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
@Data
public class CommentPageListVO {
@JsonSerialize(using = ToStringSerializer.class)
@Schema(description = "id")
private Long id;
@Schema(description = "工作日志ID")
@JsonSerialize(using = ToStringSerializer.class)
private Long workLogId;
@Schema(description = "评论用户ID")
@JsonSerialize(using = ToStringSerializer.class)
private Long userId;
@Schema(description = "评论用户头像")
private String avatar;
@Schema(description = "评论用户名称")
private String userName;
@Schema(description = "被评论用户ID")
@JsonSerialize(using = ToStringSerializer.class)
private Long commentUserId;
@Schema(description = "被评论用户头像")
private String commentAvatar;
@Schema(description = "被评论用户名称")
private String commentUserName;
@Schema(description = "评论内容")
private String comment;
@Schema(description = "评论类型0|评论1|回评)")
private Integer type;
@Schema(description = "被回评内容")
private String replyComment;
@Schema(description = "工作日志内容(部分)")
private String workLogContent;
@Schema(description = "工作日志名称")
private String workLogName;
@Schema(description = "工作日志模版id")
private Long workFormId;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Schema(description = "创建日期")
private String createTime;
}

View File

@ -0,0 +1,16 @@
package cn.iocoder.yudao.module.system.controller.app.comment.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class CommentTypeCountVO {
@Schema(description = "全部数量")
private Integer allNum;
@Schema(description = "评论数量")
private Integer commentNum;
@Schema(description = "回复数量")
private Integer replyNum;
}

View File

@ -0,0 +1,43 @@
package cn.iocoder.yudao.module.system.controller.app.comment.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 工作日志评论分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class WorkLogCommentPageReqVO extends PageParam {
@Schema(description = "动态ID", example = "26393")
private Long workLogId;
@Schema(description = "评论ID回复评论的ID", example = "25541")
private Long commentId;
@Schema(description = "评论用户ID", example = "17082")
private Long userId;
@Schema(description = "被评论用户ID", example = "22388")
private Long commentUserId;
@Schema(description = "评论内容")
private String comment;
@Schema(description = "评论类型0|评论1|回评)", example = "1")
private Boolean type;
@Schema(description = "楼栋标识")
private String buildingCode;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@ -0,0 +1,52 @@
package cn.iocoder.yudao.module.system.controller.app.comment.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 工作日志评论 Response VO")
@Data
@ExcelIgnoreUnannotated
public class WorkLogCommentRespVO {
@Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "21304")
@ExcelProperty("id")
private Long id;
@Schema(description = "动态ID", example = "26393")
@ExcelProperty("动态ID")
private Long workLogId;
@Schema(description = "评论ID回复评论的ID", example = "25541")
@ExcelProperty("评论ID回复评论的ID")
private Long commentId;
@Schema(description = "评论用户ID", example = "17082")
@ExcelProperty("评论用户ID")
private Long userId;
@Schema(description = "被评论用户ID", example = "22388")
@ExcelProperty("被评论用户ID")
private Long commentUserId;
@Schema(description = "评论内容")
@ExcelProperty("评论内容")
private String comment;
@Schema(description = "评论类型0|评论1|回评)", example = "1")
@ExcelProperty("评论类型0|评论1|回评)")
private Boolean type;
@Schema(description = "楼栋标识")
@ExcelProperty("楼栋标识")
private String buildingCode;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@ -0,0 +1,28 @@
package cn.iocoder.yudao.module.system.controller.app.comment.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
import java.util.*;
@Schema(description = "管理后台 - 工作日志评论新增/修改 Request VO")
@Data
public class WorkLogCommentSaveReqVO {
@Schema(description = "工作日志ID", example = "26393")
private Long workLogId;
@Schema(description = "评论ID回复评论的ID", example = "25541")
private Long commentId;
@Schema(description = "被评论用户ID", example = "22388")
private Long commentUserId;
@Schema(description = "评论内容")
private String comment;
@Schema(description = "评论类型0|评论1|回评)", example = "1")
private Boolean type;
}

View File

@ -0,0 +1,59 @@
package cn.iocoder.yudao.module.system.dal.dataobject.comment;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
/**
* 工作日志评论 DO
*
* @author 艾楷
*/
@TableName("work_log_comment")
@KeySequence("work_log_comment_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WorkLogCommentDO extends BaseDO {
/**
* id
*/
@TableId
private Long id;
/**
* 工作日志ID
*/
private Long workLogId;
/**
* 评论ID回复评论的ID
*/
private Long commentId;
/**
* 评论用户ID
*/
private Long userId;
/**
* 被评论用户ID
*/
private Long commentUserId;
/**
* 评论内容
*/
private String comment;
/**
* 评论类型0|评论1|回评
*/
private Boolean type;
/**
* 楼栋标识
*/
private String buildingCode;
}

View File

@ -0,0 +1,44 @@
package cn.iocoder.yudao.module.system.dal.mysql.comment;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.system.controller.app.comment.dto.CommentDTO;
import cn.iocoder.yudao.module.system.dal.dataobject.comment.WorkLogCommentDO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.system.controller.app.comment.vo.*;
import org.apache.ibatis.annotations.Param;
/**
* 工作日志评论 Mapper
*
* @author 艾楷
*/
@Mapper
public interface WorkLogCommentMapper extends BaseMapperX<WorkLogCommentDO> {
default PageResult<WorkLogCommentDO> selectPage(WorkLogCommentPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<WorkLogCommentDO>()
.eqIfPresent(WorkLogCommentDO::getWorkLogId, reqVO.getWorkLogId())
.eqIfPresent(WorkLogCommentDO::getCommentId, reqVO.getCommentId())
.eqIfPresent(WorkLogCommentDO::getUserId, reqVO.getUserId())
.eqIfPresent(WorkLogCommentDO::getCommentUserId, reqVO.getCommentUserId())
.eqIfPresent(WorkLogCommentDO::getComment, reqVO.getComment())
.eqIfPresent(WorkLogCommentDO::getType, reqVO.getType())
.eqIfPresent(WorkLogCommentDO::getBuildingCode, reqVO.getBuildingCode())
.betweenIfPresent(WorkLogCommentDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(WorkLogCommentDO::getId));
}
/**
*
* @param page
* @param dto
* @return
*/
IPage<CommentPageListVO> queryCommentPageList(@Param("page") Page<CommentPageListVO> page, @Param("dto") CommentDTO dto);
}

View File

@ -4,9 +4,12 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.form.LogFormPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.WorkLogStatisticsModelVO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogFormDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface LogFormMapper extends BaseMapperX<LogFormDO> {

View File

@ -1,16 +1,22 @@
package cn.iocoder.yudao.module.system.dal.mysql.worklog;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogUseDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* 日志模板使用者 Mapper
*
* @author 符溶馨
* @author 艾楷
*/
@Mapper
public interface LogUseMapper extends BaseMapperX<LogUseDO> {
/**
* 通过数据权限获取日志模版ids
*
* @return
*/
List<Long> getFormIdsByDataPermission();
}

View File

@ -1,16 +1,31 @@
package cn.iocoder.yudao.module.system.job.demo;
import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.context.XxlJobContext;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.concurrent.atomic.AtomicInteger;
@Component
@Slf4j
public class DemoJob {
@XxlJob("demoJob")
@TenantJob
public void execute() {
System.out.println("美滋滋");
private final AtomicInteger counts = new AtomicInteger();
@XxlJob("testJob")
//@TenantJob --- 这个注解 会将租户列表拉出来 完了后逐个租户执行 定时任务需要注意
public ReturnT<String> execute() throws Exception {
//获取参数
XxlJobContext xxlJobContext = XxlJobContext.getXxlJobContext();
String jobParam = xxlJobContext.getJobParam();
System.out.println(jobParam);
// 打印日志
log.info("[execute][定时第 ({}) 次执行]", counts.incrementAndGet());
// 返回执行成功
return ReturnT.SUCCESS;
}
}

View File

@ -0,0 +1,73 @@
package cn.iocoder.yudao.module.system.service.comment;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.app.comment.dto.CommentDTO;
import cn.iocoder.yudao.module.system.controller.app.comment.vo.CommentPageListVO;
import cn.iocoder.yudao.module.system.controller.app.comment.vo.CommentTypeCountVO;
import cn.iocoder.yudao.module.system.controller.app.comment.vo.WorkLogCommentPageReqVO;
import cn.iocoder.yudao.module.system.controller.app.comment.vo.WorkLogCommentSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.comment.WorkLogCommentDO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import javax.validation.Valid;
/**
* 工作日志评论 Service 接口
*
* @author 艾楷
*/
public interface WorkLogCommentService {
/**
* 创建工作日志评论
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createWorkLogComment(@Valid WorkLogCommentSaveReqVO createReqVO);
/**
* 更新工作日志评论
*
* @param updateReqVO 更新信息
*/
void updateWorkLogComment(@Valid WorkLogCommentSaveReqVO updateReqVO);
/**
* 删除工作日志评论
*
* @param id 编号
*/
void deleteWorkLogComment(Long id);
/**
* 获得工作日志评论
*
* @param id 编号
* @return 工作日志评论
*/
WorkLogCommentDO getWorkLogComment(Long id);
/**
* 获得工作日志评论分页
*
* @param pageReqVO 分页查询
* @return 工作日志评论分页
*/
PageResult<WorkLogCommentDO> getWorkLogCommentPage(WorkLogCommentPageReqVO pageReqVO);
/**
* @param page
* @param dto
* @return
*/
IPage<CommentPageListVO> queryCommentPageList(Page<CommentPageListVO> page, CommentDTO dto);
/**
* 获取评论类型数量
*
* @return
*/
CommentTypeCountVO queryCommentTypeCount();
}

View File

@ -0,0 +1,134 @@
package cn.iocoder.yudao.module.system.service.comment;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
import cn.iocoder.yudao.module.system.controller.app.comment.dto.CommentDTO;
import cn.iocoder.yudao.module.system.controller.app.comment.vo.CommentPageListVO;
import cn.iocoder.yudao.module.system.controller.app.comment.vo.CommentTypeCountVO;
import cn.iocoder.yudao.module.system.controller.app.comment.vo.WorkLogCommentPageReqVO;
import cn.iocoder.yudao.module.system.controller.app.comment.vo.WorkLogCommentSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.comment.WorkLogCommentDO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogFormDO;
import cn.iocoder.yudao.module.system.dal.mysql.comment.WorkLogCommentMapper;
import cn.iocoder.yudao.module.system.service.worklog.LogFormService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 工作日志评论 Service 实现类
*
* @author 艾楷
*/
@Service
@Validated
public class WorkLogCommentServiceImpl implements WorkLogCommentService {
@Resource
private WorkLogCommentMapper workLogCommentMapper;
@Resource
private LogFormService logFormService;
@Override
public Long createWorkLogComment(WorkLogCommentSaveReqVO createReqVO) {
// 插入
WorkLogCommentDO workLogComment = BeanUtils.toBean(createReqVO, WorkLogCommentDO.class);
Long userId = WebFrameworkUtils.getLoginUserId();
workLogComment.setUserId(userId);
workLogCommentMapper.insert(workLogComment);
// 返回
return workLogComment.getId();
}
@Override
public void updateWorkLogComment(WorkLogCommentSaveReqVO updateReqVO) {
// 校验存在
// validateWorkLogCommentExists(updateReqVO.getId());
// 更新
WorkLogCommentDO updateObj = BeanUtils.toBean(updateReqVO, WorkLogCommentDO.class);
workLogCommentMapper.updateById(updateObj);
}
@Override
public void deleteWorkLogComment(Long id) {
// 校验存在
// validateWorkLogCommentExists(id);
// 删除
workLogCommentMapper.deleteById(id);
}
// private void validateWorkLogCommentExists(Long id) {
// if (workLogCommentMapper.selectById(id) == null) {
// throw exception(WORK_LOG_COMMENT_NOT_EXISTS);
// }
// }
@Override
public WorkLogCommentDO getWorkLogComment(Long id) {
return workLogCommentMapper.selectById(id);
}
@Override
public PageResult<WorkLogCommentDO> getWorkLogCommentPage(WorkLogCommentPageReqVO pageReqVO) {
return workLogCommentMapper.selectPage(pageReqVO);
}
@Override
public IPage<CommentPageListVO> queryCommentPageList(Page<CommentPageListVO> page, CommentDTO dto) {
if (dto.getCheckMyselfFlag() == 1) {
Long userId = WebFrameworkUtils.getLoginUserId();
dto.setUserId(userId);
}
IPage<CommentPageListVO> pageList = workLogCommentMapper.queryCommentPageList(page, dto);
List<CommentPageListVO> records = pageList.getRecords();
if (dto.getIsShowWorkLogContent() != null && dto.getIsShowWorkLogContent() == 1 && !records.isEmpty()) {
//模版ids过滤
List<Long> workFormIds = records.stream().map(CommentPageListVO::getWorkFormId).collect(Collectors.toList());
// 查询模版列表
List<LogFormDO> formList = logFormService.getFormList(workFormIds);
Map<Long, LogFormDO> formMap = formList.stream().collect(Collectors.toMap(LogFormDO::getId, item -> item));
pageList.getRecords().forEach(item -> {
LogFormDO logFormDO = formMap.get(item.getWorkFormId());
List<String> fields = logFormDO.getFields();
StringBuilder workLogContent = new StringBuilder();
if (StrUtil.isNotEmpty(item.getWorkLogContent())) {
JSONObject workLogContentJson = new JSONObject(item.getWorkLogContent());
for (String fieldItem : fields) {
JSONObject fieldJson = new JSONObject(fieldItem);
String fieldStr = fieldJson.getStr("field");
String title = fieldJson.getStr("title");
String field = workLogContentJson.getStr(fieldStr);
workLogContent.append(title).append(":").append(field);
}
}
item.setWorkLogContent(workLogContent.toString());
});
}
return pageList;
}
@Override
public CommentTypeCountVO queryCommentTypeCount() {
Long userId = WebFrameworkUtils.getLoginUserId();
CommentTypeCountVO vo = new CommentTypeCountVO();
Integer commentNum = Math.toIntExact(workLogCommentMapper.selectCount(new LambdaQueryWrapper<WorkLogCommentDO>()
.eq(WorkLogCommentDO::getUserId, userId)));
Integer replyNum = Math.toIntExact(workLogCommentMapper.selectCount(new LambdaQueryWrapper<WorkLogCommentDO>()
.eq(WorkLogCommentDO::getCommentUserId, userId)));
vo.setCommentNum(commentNum);
vo.setReplyNum(replyNum);
vo.setAllNum(commentNum + replyNum);
return vo;
}
}

View File

@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.rule.LogRuleSa
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogRuleDO;
import javax.validation.Valid;
import java.util.List;
/**
* 日志规则 Service 接口
@ -52,4 +53,11 @@ public interface LogRuleService {
*/
PageResult<LogRuleDO> getLogRulePage(LogRulePageReqVO pageReqVO);
/**
* 通过规则ids获取规则
*
* @param ruleIds
* @return
*/
List<LogRuleDO> getLogRuleByIds(List<Long> ruleIds);
}

View File

@ -10,6 +10,7 @@ import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.LOG_RULE_NOT_EXISTS;
@ -67,4 +68,10 @@ public class LogRuleServiceImpl implements LogRuleService {
public PageResult<LogRuleDO> getLogRulePage(LogRulePageReqVO pageReqVO) {
return logRuleMapper.selectPage(pageReqVO);
}
@Override
public List<LogRuleDO> getLogRuleByIds(List<Long> ruleIds) {
return logRuleMapper.selectBatchIds(ruleIds);
}
}

View File

@ -0,0 +1,17 @@
package cn.iocoder.yudao.module.system.service.worklog;
import cn.iocoder.yudao.module.system.controller.admin.worklog.dto.statistics.WorkLogStatisticsModelDTO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.WorkLogStatisticsModelVO;
import java.util.List;
public interface WorkLogStatisticsService {
/**
* 我管理的工作日志统计模版
*
* @param dto
* @return
*/
List<WorkLogStatisticsModelVO> myManageModel(WorkLogStatisticsModelDTO dto);
}

View File

@ -0,0 +1,62 @@
package cn.iocoder.yudao.module.system.service.worklog;
import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.module.system.controller.admin.worklog.dto.statistics.WorkLogStatisticsModelDTO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statistics.WorkLogStatisticsModelVO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogFormDO;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogRuleDO;
import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogFormMapper;
import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogUseMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* 工作日志统计 Service 实现类
*
* @author 艾楷
*/
@Service
@Validated
public class WorkLogStatisticsServiceImpl implements WorkLogStatisticsService {
@Resource
private LogFormMapper logFormMapper;
@Resource
private LogRuleService logRuleService;
@Resource
private LogUseMapper logUseMapper;
@Override
public List<WorkLogStatisticsModelVO> myManageModel(WorkLogStatisticsModelDTO dto) {
//获取模版ids - 当前登录用户的数据权限 查看日志模板使用者表
// TODO: 2024/4/12 这里要测试下 数据权限问题
List<Long> formIds = logUseMapper.getFormIdsByDataPermission();
if (!formIds.isEmpty()) {
return Collections.emptyList();
}
List<LogFormDO> formList = logFormMapper.selectList(new LambdaQueryWrapper<LogFormDO>()
.in(LogFormDO::getId, formIds)
.eq(LogFormDO::getStatus, 1)
.isNotNull(LogFormDO::getRuleId)
);
List<Long> ruleIds = formList.stream().map(LogFormDO::getRuleId).collect(Collectors.toList());
List<LogRuleDO> logRuleDOS = new ArrayList<>();
Map<Long, LogRuleDO> ruleMap = new HashMap<>();
if (CollectionUtil.isNotEmpty(ruleIds)) {
logRuleDOS = logRuleService.getLogRuleByIds(ruleIds);
ruleMap = logRuleDOS.stream().collect(Collectors.toMap(LogRuleDO::getId, v -> v));
}
for (LogFormDO logFormDO : formList) {
LogRuleDO logRuleDO = ruleMap.get(logFormDO.getRuleId());
//统计谁
}
return null;
}
}

View File

@ -81,7 +81,13 @@ xxl:
enabled: false # 是否开启调度中心,默认为 true 开启
admin:
addresses: http://127.0.0.1:9090/xxl-job-admin # 调度中心部署跟地址
executor:
appname: ${spring.application.name} # 执行器 AppName
ip: # 执行器IP [选填]默认为空表示自动获取IP多网卡时可手动设置指定IP该IP不会绑定Host仅作为通讯实用地址信息用于 "执行器注册" 和 "调度中心请求并触发任务"
port: 6666 # ### 执行器端口号 [选填]小于等于0则自动获取默认端口为9999单机部署多个执行器时注意要配置不同执行器端口
logpath: ${user.home}/logs/xxl-job/${spring.application.name} # 执行器运行日志文件存储磁盘路径 # 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
#accessToken: default_token
logretentiondays: 30 # 执行器日志文件保存天数 [选填] 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
--- #################### 服务保障相关配置 ####################
# Lock4j 配置项

View File

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.system.dal.mysql.comment.WorkLogCommentMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
<select id="queryCommentPageList"
resultType="cn.iocoder.yudao.module.system.controller.app.comment.vo.CommentPageListVO">
SELECT a.id,
a.work_log_id AS workLogId,
a.user_id AS userId,
c.avatar AS avatar,
c.nickname AS userName,
a.comment_user_id AS commentUserId,
d.avatar AS commentAvatar,
d.nickname AS commentUserName,
a.COMMENT AS COMMENT,
a.type AS type,
e.COMMENT AS replyComment,
<if test="dto.isShowWorkLogContent != null and dto.isShowWorkLogContent == 1">
b.name as workLogName,
b.form_variables AS workLogContent,
b.form_id as workFormId,
</if>
a.create_time AS createTime
FROM work_log_comment AS a
<if test="dto.isShowWorkLogContent != null and dto.isShowWorkLogContent == 1">
LEFT JOIN work_log_instance_ext AS b ON a.work_log_id = b.id
</if>
LEFT JOIN system_users AS c ON a.user_id = c.id
LEFT JOIN system_users AS d ON a.comment_user_id = d.id
LEFT JOIN work_log_comment AS e ON a.comment_id = e.id
<where>
<if test="dto.workLogId != null">
and a.work_log_id = #{dto.workLogId}
</if>
<if test="dto.type != null">
and a.type = #{dto.type}
</if>
<if test="dto.userId != null">
and (a.user_id = #{dto.userId} or a.comment_user_id = #{dto.userId})
</if>
</where>
ORDER BY a.create_time DESC
</select>
</mapper>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.system.dal.mysql.worklog.LogFormMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.system.dal.mysql.worklog.LogUseMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
<select id="getFormIdsByDataPermission" resultType="java.lang.Long">
select
DISTINCT form_id
from work_log_use
</select>
</mapper>