Compare commits
No commits in common. "9c8cff069c595a02d99f24d4ae0a3931e49d5292" and "258806b499187bd356dc12ff694fc05b169b88b3" have entirely different histories.
9c8cff069c
...
258806b499
2327
ceshi/test.sql
2327
ceshi/test.sql
File diff suppressed because it is too large
Load Diff
|
@ -47,7 +47,7 @@ public class Schedule {
|
||||||
List<ImageEntity> successList = new ArrayList<>();
|
List<ImageEntity> successList = new ArrayList<>();
|
||||||
for (ImageEntity image : list) {
|
for (ImageEntity image : list) {
|
||||||
PartResp partResp = partRespMap.get(image.getPartId());
|
PartResp partResp = partRespMap.get(image.getPartId());
|
||||||
FilePathEnum pathEnum = image.getImagePath().contains("temp") ? FilePathEnum.IMAGE_TEMP : FilePathEnum.IMAGE;
|
FilePathEnum pathEnum = FilePathEnum.getFilePathEnum(image.getImagePath());
|
||||||
String inputFile = pathEnum.getFileAbsolutePath(image.getImagePath());
|
String inputFile = pathEnum.getFileAbsolutePath(image.getImagePath());
|
||||||
String outputDir = FilePathEnum.IMAGE.getFileAbsolutePathPrefix()
|
String outputDir = FilePathEnum.IMAGE.getFileAbsolutePathPrefix()
|
||||||
.concat("已调整")
|
.concat("已调整")
|
||||||
|
|
|
@ -38,7 +38,6 @@ public class SwaggerConfig {
|
||||||
.enable(true)//开启Swagger文档
|
.enable(true)//开启Swagger文档
|
||||||
.select()
|
.select()
|
||||||
.apis(RequestHandlerSelectors.basePackage("com.dite"))
|
.apis(RequestHandlerSelectors.basePackage("com.dite"))
|
||||||
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
|
|
||||||
.paths(PathSelectors.any())
|
.paths(PathSelectors.any())
|
||||||
.build()
|
.build()
|
||||||
.globalRequestParameters(parameters);
|
.globalRequestParameters(parameters);
|
||||||
|
|
|
@ -79,4 +79,5 @@ public class Message implements Serializable {
|
||||||
public static final String EQUIPMENT_USE_RECORD_STATUS_ERROR = "设备使用记录状态不合法";
|
public static final String EQUIPMENT_USE_RECORD_STATUS_ERROR = "设备使用记录状态不合法";
|
||||||
public static final String EQUIPMENT_IS_USED = "设备已被使用";
|
public static final String EQUIPMENT_IS_USED = "设备已被使用";
|
||||||
public static final String EQUIPMENT_IS_RETURN = "设备已归还";
|
public static final String EQUIPMENT_IS_RETURN = "设备已归还";
|
||||||
|
public static final String DAILY_REPORT_EXISTS = "当日已提交日报";
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,20 +1,16 @@
|
||||||
package com.dite.znpt.domain;
|
package com.dite.znpt.domain;
|
||||||
|
|
||||||
import com.alibaba.excel.annotation.ExcelIgnore;
|
import com.alibaba.excel.annotation.ExcelIgnore;
|
||||||
import com.baomidou.mybatisplus.annotation.FieldFill;
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableField;
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import io.swagger.annotations.ApiParam;
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import lombok.experimental.SuperBuilder;
|
|
||||||
|
|
||||||
import java.io.Serial;
|
import java.io.Serial;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description: 统一定义顶层Entity实体审计 基类
|
* @description: 统一定义顶层Entity实体审计 基类
|
||||||
|
@ -41,11 +37,6 @@ public class AuditableEntity implements Serializable {
|
||||||
@ApiModelProperty(value = "修改人id", hidden = true)
|
@ApiModelProperty(value = "修改人id", hidden = true)
|
||||||
private LocalDateTime updateTime;
|
private LocalDateTime updateTime;
|
||||||
|
|
||||||
@ExcelIgnore
|
|
||||||
@ApiModelProperty(value = "id集合", example = "[]", notes = "id集合")
|
|
||||||
@TableField(exist = false)
|
|
||||||
private List<String> idList;
|
|
||||||
|
|
||||||
@ExcelIgnore
|
@ExcelIgnore
|
||||||
@ApiModelProperty(value = "当前页", example = "1", notes = "0")
|
@ApiModelProperty(value = "当前页", example = "1", notes = "0")
|
||||||
@TableField(exist = false)
|
@TableField(exist = false)
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
package com.dite.znpt.domain.dto;
|
|
||||||
|
|
||||||
import io.swagger.annotations.ApiModel;
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@AllArgsConstructor
|
|
||||||
@NoArgsConstructor
|
|
||||||
@ApiModel("接受文件夹参数")
|
|
||||||
public class FolderDto {
|
|
||||||
private String name = "tom";
|
|
||||||
private Long parentId = 0L;
|
|
||||||
}
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
package com.dite.znpt.domain.dto;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 制度确认DTO
|
||||||
|
* @author wangna
|
||||||
|
* @date 2025/07/29
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class RegulationConfirmDTO {
|
||||||
|
|
||||||
|
private Boolean agreeTerms = true; // 是否同意条款,默认为true
|
||||||
|
}
|
|
@ -1,38 +0,0 @@
|
||||||
package com.dite.znpt.domain.entity;
|
|
||||||
|
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
|
||||||
import io.swagger.annotations.ApiModel;
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.EqualsAndHashCode;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@EqualsAndHashCode(callSuper = false)
|
|
||||||
@TableName("business_data_part")
|
|
||||||
@ApiModel(value="商务资料文件夹对象")
|
|
||||||
@AllArgsConstructor
|
|
||||||
@NoArgsConstructor
|
|
||||||
public class BusinessDataEntity {
|
|
||||||
|
|
||||||
// 主键
|
|
||||||
private Long folderId = null;
|
|
||||||
// 文件夹名称
|
|
||||||
private String folderName = null;
|
|
||||||
// 父级文件夹
|
|
||||||
private Long parentId = null;
|
|
||||||
// 创建人
|
|
||||||
private Long creatorId = null;
|
|
||||||
// 创建时间
|
|
||||||
private LocalDateTime createTime = null;
|
|
||||||
// 更新时间
|
|
||||||
private LocalDateTime updateTime = null;
|
|
||||||
// 是否删除
|
|
||||||
private Boolean isDeleted = false;
|
|
||||||
// 文件夹路径
|
|
||||||
private String folderPath = null;
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
package com.dite.znpt.domain.entity;
|
|
||||||
|
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
|
||||||
import io.swagger.annotations.ApiModel;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.EqualsAndHashCode;
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@EqualsAndHashCode(callSuper = false)
|
|
||||||
@TableName("business_data_part_file")
|
|
||||||
@ApiModel(value="商务资料对象")
|
|
||||||
|
|
||||||
public class BusinessDataFileEntity {
|
|
||||||
|
|
||||||
//文件id
|
|
||||||
private Long fileId = null;
|
|
||||||
//文件夹id
|
|
||||||
private Long folderId = null;
|
|
||||||
//文件名
|
|
||||||
private String fileName = null;
|
|
||||||
//文件路径
|
|
||||||
private String filePath = null;
|
|
||||||
//文件类型
|
|
||||||
private String fileType = "unknown";
|
|
||||||
//文件大小
|
|
||||||
private Long fileSize = null;
|
|
||||||
//上传时间
|
|
||||||
private Date uploadTime = null;
|
|
||||||
//上传人id
|
|
||||||
private Long uploaderId = null;
|
|
||||||
//是否删除
|
|
||||||
private Boolean isDeleted = false;
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
package com.dite.znpt.domain.entity;
|
||||||
|
|
||||||
|
import com.alibaba.excel.annotation.ExcelProperty;
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import com.dite.znpt.domain.AuditableEntity;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author huise23
|
||||||
|
* @date 2025/07/27 19:51
|
||||||
|
* @Description: 项目日报信息表实体类
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
@TableName("project_daily_report")
|
||||||
|
@ApiModel(value="ProjectDailyReportEntity对象", description="项目日报信息表")
|
||||||
|
public class ProjectDailyReportEntity extends AuditableEntity implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = -88597301057742621L;
|
||||||
|
|
||||||
|
@ExcelProperty("主键")
|
||||||
|
@ApiModelProperty("主键")
|
||||||
|
@TableId(value = "report_id", type = IdType.ASSIGN_ID)
|
||||||
|
private String reportId;
|
||||||
|
|
||||||
|
@ExcelProperty("项目id")
|
||||||
|
@ApiModelProperty("项目id")
|
||||||
|
@TableField("project_id")
|
||||||
|
private String projectId;
|
||||||
|
|
||||||
|
@ExcelProperty("日报日期")
|
||||||
|
@ApiModelProperty("日报日期")
|
||||||
|
@TableField("report_date")
|
||||||
|
private LocalDate reportDate;
|
||||||
|
|
||||||
|
@ExcelProperty("日报提交人")
|
||||||
|
@ApiModelProperty("日报提交人")
|
||||||
|
@TableField("submit_user")
|
||||||
|
private String submitUser;
|
||||||
|
}
|
||||||
|
|
|
@ -1,18 +1,19 @@
|
||||||
package com.dite.znpt.domain.entity;
|
package com.dite.znpt.domain.entity;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import com.alibaba.excel.annotation.ExcelProperty;
|
||||||
import java.time.LocalDate;
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
import java.time.LocalDateTime;
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.*;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.dite.znpt.domain.AuditableEntity;
|
import com.dite.znpt.domain.AuditableEntity;
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import io.swagger.annotations.ApiModel;
|
import io.swagger.annotations.ApiModel;
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import com.alibaba.excel.annotation.ExcelProperty;
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author huise23
|
* @author huise23
|
||||||
|
@ -158,7 +159,7 @@ public class ProjectEntity extends AuditableEntity implements Serializable {
|
||||||
|
|
||||||
@ApiModelProperty(value = "开始时间")
|
@ApiModelProperty(value = "开始时间")
|
||||||
private LocalDate startDate;
|
private LocalDate startDate;
|
||||||
|
// 施工人员,安全经理,项目经理,商务,财务,高级管理员,项目远程顾问外部协作者,质量经理、现场经理及工作组长。
|
||||||
@ApiModelProperty(value = "结束时间")
|
@ApiModelProperty(value = "结束时间")
|
||||||
private LocalDate endDate;
|
private LocalDate endDate;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
package com.dite.znpt.domain.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.*;
|
||||||
|
import com.dite.znpt.domain.AuditableEntity;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import com.alibaba.excel.annotation.ExcelProperty;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author wangna
|
||||||
|
* @date 2025/07/28
|
||||||
|
* @Description: 制度确认实体类
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
@TableName("regulation_confirmation")
|
||||||
|
@ApiModel(value="RegulationConfirmationEntity对象", description="制度确认")
|
||||||
|
public class RegulationConfirmationEntity implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@ExcelProperty("确认ID")
|
||||||
|
@ApiModelProperty("确认ID")
|
||||||
|
@TableId(value = "confirmation_id", type = IdType.ASSIGN_UUID)
|
||||||
|
private String confirmationId;
|
||||||
|
|
||||||
|
@ExcelProperty("制度ID")
|
||||||
|
@ApiModelProperty("制度ID")
|
||||||
|
@TableField("regulation_id")
|
||||||
|
private String regulationId;
|
||||||
|
|
||||||
|
@ExcelProperty("确认人ID")
|
||||||
|
@ApiModelProperty("确认人ID")
|
||||||
|
@TableField("confirmer_id")
|
||||||
|
private String confirmerId;
|
||||||
|
|
||||||
|
@ExcelProperty("确认人姓名")
|
||||||
|
@ApiModelProperty("确认人姓名")
|
||||||
|
@TableField("confirmer_name")
|
||||||
|
private String confirmerName;
|
||||||
|
|
||||||
|
@ExcelProperty("确认人部门")
|
||||||
|
@ApiModelProperty("确认人部门")
|
||||||
|
@TableField("confirmer_dept")
|
||||||
|
private String confirmerDept;
|
||||||
|
|
||||||
|
@ExcelProperty("确认状态")
|
||||||
|
@ApiModelProperty("确认状态:CONFIRMED-已确认")
|
||||||
|
@TableField("status")
|
||||||
|
private String status;
|
||||||
|
|
||||||
|
@ExcelProperty("确认时间")
|
||||||
|
@ApiModelProperty("确认时间")
|
||||||
|
@TableField("confirm_time")
|
||||||
|
private LocalDateTime confirmTime;
|
||||||
|
|
||||||
|
@ExcelProperty("删除标志(0代表存在,1代表删除)")
|
||||||
|
@ApiModelProperty("删除标志(0代表存在,1代表删除)")
|
||||||
|
@TableField("del_flag")
|
||||||
|
private String delFlag;
|
||||||
|
}
|
|
@ -0,0 +1,106 @@
|
||||||
|
package com.dite.znpt.domain.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.*;
|
||||||
|
import com.dite.znpt.domain.AuditableEntity;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import com.alibaba.excel.annotation.ExcelProperty;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author wangna
|
||||||
|
* @date 2025/07/28
|
||||||
|
* @Description: 制度草案实体类
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
@TableName("regulation_draft")
|
||||||
|
@ApiModel(value="RegulationDraftEntity对象", description="制度草案")
|
||||||
|
public class RegulationDraftEntity extends AuditableEntity implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@ExcelProperty("草案ID")
|
||||||
|
@ApiModelProperty("草案ID")
|
||||||
|
@TableId(value = "draft_id", type = IdType.ASSIGN_UUID)
|
||||||
|
private String draftId;
|
||||||
|
|
||||||
|
@ExcelProperty("制度标题")
|
||||||
|
@ApiModelProperty("制度标题")
|
||||||
|
@TableField("title")
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
@ExcelProperty("制度内容")
|
||||||
|
@ApiModelProperty("制度内容")
|
||||||
|
@TableField("content")
|
||||||
|
private String content;
|
||||||
|
|
||||||
|
@ExcelProperty("制度类型")
|
||||||
|
@ApiModelProperty("制度类型")
|
||||||
|
@TableField("regulation_type")
|
||||||
|
private String regulationType;
|
||||||
|
|
||||||
|
@ExcelProperty("草案状态")
|
||||||
|
@ApiModelProperty("草案状态:DRAFT-草稿,REVIEWING-审核中,APPROVED-已通过,REJECTED-已拒绝")
|
||||||
|
@TableField("status")
|
||||||
|
private String status;
|
||||||
|
|
||||||
|
@ExcelProperty("创建人ID")
|
||||||
|
@ApiModelProperty("创建人ID")
|
||||||
|
@TableField("creator_id")
|
||||||
|
private String creatorId;
|
||||||
|
|
||||||
|
@ExcelProperty("创建人姓名")
|
||||||
|
@ApiModelProperty("创建人姓名")
|
||||||
|
@TableField("creator_name")
|
||||||
|
private String creatorName;
|
||||||
|
|
||||||
|
@ExcelProperty("审核人ID")
|
||||||
|
@ApiModelProperty("审核人ID")
|
||||||
|
@TableField("reviewer_id")
|
||||||
|
private String reviewerId;
|
||||||
|
|
||||||
|
@ExcelProperty("审核人姓名")
|
||||||
|
@ApiModelProperty("审核人姓名")
|
||||||
|
@TableField("reviewer_name")
|
||||||
|
private String reviewerName;
|
||||||
|
|
||||||
|
@ExcelProperty("审核时间")
|
||||||
|
@ApiModelProperty("审核时间")
|
||||||
|
@TableField("review_time")
|
||||||
|
private LocalDateTime reviewTime;
|
||||||
|
|
||||||
|
@ExcelProperty("审核意见")
|
||||||
|
@ApiModelProperty("审核意见")
|
||||||
|
@TableField("review_comment")
|
||||||
|
private String reviewComment;
|
||||||
|
|
||||||
|
@ExcelProperty("适用范围")
|
||||||
|
@ApiModelProperty("适用范围")
|
||||||
|
@TableField("scope")
|
||||||
|
private String scope;
|
||||||
|
|
||||||
|
@ExcelProperty("制度级别")
|
||||||
|
@ApiModelProperty("制度级别:HIGH-高级,MEDIUM-中级,LOW-低级")
|
||||||
|
@TableField("level")
|
||||||
|
private String level;
|
||||||
|
|
||||||
|
@ExcelProperty("版本号")
|
||||||
|
@ApiModelProperty("版本号")
|
||||||
|
@TableField("version")
|
||||||
|
private String version;
|
||||||
|
|
||||||
|
@ExcelProperty("备注")
|
||||||
|
@ApiModelProperty("备注")
|
||||||
|
@TableField("remark")
|
||||||
|
private String remark;
|
||||||
|
|
||||||
|
@ExcelProperty("删除标志(0代表存在,1代表删除)")
|
||||||
|
@ApiModelProperty("删除标志(0代表存在,1代表删除)")
|
||||||
|
@TableField("del_flag")
|
||||||
|
private String delFlag;
|
||||||
|
}
|
|
@ -0,0 +1,99 @@
|
||||||
|
package com.dite.znpt.domain.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.*;
|
||||||
|
import com.dite.znpt.domain.AuditableEntity;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import com.alibaba.excel.annotation.ExcelProperty;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author wangna
|
||||||
|
* @date 2025/07/28
|
||||||
|
* @Description: 制度规范仓库实体类
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
@TableName("regulation")
|
||||||
|
@ApiModel(value="RegulationEntity对象", description="制度规范仓库")
|
||||||
|
public class RegulationEntity extends AuditableEntity implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@ExcelProperty("制度ID")
|
||||||
|
@ApiModelProperty("制度ID")
|
||||||
|
@TableId(value = "regulation_id", type = IdType.ASSIGN_UUID)
|
||||||
|
private String regulationId;
|
||||||
|
|
||||||
|
@ExcelProperty("制度标题")
|
||||||
|
@ApiModelProperty("制度标题")
|
||||||
|
@TableField("title")
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
@ExcelProperty("制度内容")
|
||||||
|
@ApiModelProperty("制度内容")
|
||||||
|
@TableField("content")
|
||||||
|
private String content;
|
||||||
|
|
||||||
|
@ExcelProperty("制度类型")
|
||||||
|
@ApiModelProperty("制度类型")
|
||||||
|
@TableField("regulation_type")
|
||||||
|
private String regulationType;
|
||||||
|
|
||||||
|
@ExcelProperty("制度状态")
|
||||||
|
@ApiModelProperty("制度状态:DRAFT-草案,APPROVED-已公示,PUBLISHED-已发布,ARCHIVED-已归档")
|
||||||
|
@TableField("status")
|
||||||
|
private String status;
|
||||||
|
|
||||||
|
@ExcelProperty("发布时间")
|
||||||
|
@ApiModelProperty("发布时间")
|
||||||
|
@TableField("publish_time")
|
||||||
|
private LocalDateTime publishTime;
|
||||||
|
|
||||||
|
@ExcelProperty("生效时间")
|
||||||
|
@ApiModelProperty("生效时间")
|
||||||
|
@TableField("effective_time")
|
||||||
|
private LocalDateTime effectiveTime;
|
||||||
|
|
||||||
|
@ExcelProperty("失效时间")
|
||||||
|
@ApiModelProperty("失效时间")
|
||||||
|
@TableField("expire_time")
|
||||||
|
private LocalDateTime expireTime;
|
||||||
|
|
||||||
|
@ExcelProperty("适用范围")
|
||||||
|
@ApiModelProperty("适用范围")
|
||||||
|
@TableField("scope")
|
||||||
|
private String scope;
|
||||||
|
|
||||||
|
@ExcelProperty("制度级别")
|
||||||
|
@ApiModelProperty("制度级别:HIGH-高级,MEDIUM-中级,LOW-低级")
|
||||||
|
@TableField("level")
|
||||||
|
private String level;
|
||||||
|
|
||||||
|
@ExcelProperty("版本号")
|
||||||
|
@ApiModelProperty("版本号")
|
||||||
|
@TableField("version")
|
||||||
|
private String version;
|
||||||
|
|
||||||
|
@ExcelProperty("备注")
|
||||||
|
@ApiModelProperty("备注")
|
||||||
|
@TableField("remark")
|
||||||
|
private String remark;
|
||||||
|
|
||||||
|
@ExcelProperty("删除标志(0代表存在,1代表删除)")
|
||||||
|
@ApiModelProperty("删除标志(0代表存在,1代表删除)")
|
||||||
|
@TableField("del_flag")
|
||||||
|
private String delFlag;
|
||||||
|
|
||||||
|
@TableField(exist = false)
|
||||||
|
@ApiModelProperty("当前用户确认状态:pending-待确认,confirmed-已确认")
|
||||||
|
private String confirmStatus;
|
||||||
|
|
||||||
|
@TableField(exist = false)
|
||||||
|
@ApiModelProperty("创建人姓名")
|
||||||
|
private String createByName;
|
||||||
|
}
|
|
@ -0,0 +1,156 @@
|
||||||
|
package com.dite.znpt.domain.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.*;
|
||||||
|
import com.dite.znpt.domain.AuditableEntity;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import com.alibaba.excel.annotation.ExcelProperty;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author wangna
|
||||||
|
* @date 2025/07/28
|
||||||
|
* @Description: 制度提案实体类
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
@TableName("regulation_proposal")
|
||||||
|
@ApiModel(value="RegulationProposalEntity对象", description="制度提案")
|
||||||
|
public class RegulationProposalEntity extends AuditableEntity implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@ExcelProperty("提案ID")
|
||||||
|
@ApiModelProperty("提案ID")
|
||||||
|
@TableId(value = "proposal_id", type = IdType.ASSIGN_UUID)
|
||||||
|
private String proposalId;
|
||||||
|
|
||||||
|
@ExcelProperty("提案标题")
|
||||||
|
@ApiModelProperty("提案标题")
|
||||||
|
@TableField("title")
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
@ExcelProperty("提案内容")
|
||||||
|
@ApiModelProperty("提案内容")
|
||||||
|
@TableField("content")
|
||||||
|
private String content;
|
||||||
|
|
||||||
|
@ExcelProperty("提案类型")
|
||||||
|
@ApiModelProperty("提案类型")
|
||||||
|
@TableField("proposal_type")
|
||||||
|
private String proposalType;
|
||||||
|
|
||||||
|
@ExcelProperty("提案状态")
|
||||||
|
@ApiModelProperty("提案状态:SUBMITTED-已提交,DISCUSSING-讨论中,APPROVED-已通过,REJECTED-已拒绝,CONVERTED-已转为草案")
|
||||||
|
@TableField("status")
|
||||||
|
private String status;
|
||||||
|
|
||||||
|
@ExcelProperty("提案人ID")
|
||||||
|
@ApiModelProperty("提案人ID")
|
||||||
|
@TableField("proposer_id")
|
||||||
|
private String proposerId;
|
||||||
|
|
||||||
|
@ExcelProperty("提案人姓名")
|
||||||
|
@ApiModelProperty("提案人姓名")
|
||||||
|
@TableField("proposer_name")
|
||||||
|
private String proposerName;
|
||||||
|
|
||||||
|
@ExcelProperty("提案人部门")
|
||||||
|
@ApiModelProperty("提案人部门")
|
||||||
|
@TableField("proposer_dept")
|
||||||
|
private String proposerDept;
|
||||||
|
|
||||||
|
@ExcelProperty("讨论组ID")
|
||||||
|
@ApiModelProperty("讨论组ID")
|
||||||
|
@TableField("discussion_group_id")
|
||||||
|
private String discussionGroupId;
|
||||||
|
|
||||||
|
@ExcelProperty("讨论组名称")
|
||||||
|
@ApiModelProperty("讨论组名称")
|
||||||
|
@TableField("discussion_group_name")
|
||||||
|
private String discussionGroupName;
|
||||||
|
|
||||||
|
@ExcelProperty("讨论开始时间")
|
||||||
|
@ApiModelProperty("讨论开始时间")
|
||||||
|
@TableField("discussion_start_time")
|
||||||
|
private LocalDateTime discussionStartTime;
|
||||||
|
|
||||||
|
@ExcelProperty("讨论结束时间")
|
||||||
|
@ApiModelProperty("讨论结束时间")
|
||||||
|
@TableField("discussion_end_time")
|
||||||
|
private LocalDateTime discussionEndTime;
|
||||||
|
|
||||||
|
@ExcelProperty("讨论状态")
|
||||||
|
@ApiModelProperty("讨论状态:NOT_STARTED-未开始,DISCUSSING-讨论中,FINISHED-已结束")
|
||||||
|
@TableField("discussion_status")
|
||||||
|
private String discussionStatus;
|
||||||
|
|
||||||
|
@ExcelProperty("支持人数")
|
||||||
|
@ApiModelProperty("支持人数")
|
||||||
|
@TableField("support_count")
|
||||||
|
private Integer supportCount;
|
||||||
|
|
||||||
|
@ExcelProperty("反对人数")
|
||||||
|
@ApiModelProperty("反对人数")
|
||||||
|
@TableField("oppose_count")
|
||||||
|
private Integer opposeCount;
|
||||||
|
|
||||||
|
@ExcelProperty("总参与人数")
|
||||||
|
@ApiModelProperty("总参与人数")
|
||||||
|
@TableField("total_participants")
|
||||||
|
private Integer totalParticipants;
|
||||||
|
|
||||||
|
@ExcelProperty("审核人ID")
|
||||||
|
@ApiModelProperty("审核人ID")
|
||||||
|
@TableField("reviewer_id")
|
||||||
|
private String reviewerId;
|
||||||
|
|
||||||
|
@ExcelProperty("审核人姓名")
|
||||||
|
@ApiModelProperty("审核人姓名")
|
||||||
|
@TableField("reviewer_name")
|
||||||
|
private String reviewerName;
|
||||||
|
|
||||||
|
@ExcelProperty("审核时间")
|
||||||
|
@ApiModelProperty("审核时间")
|
||||||
|
@TableField("review_time")
|
||||||
|
private LocalDateTime reviewTime;
|
||||||
|
|
||||||
|
@ExcelProperty("审核意见")
|
||||||
|
@ApiModelProperty("审核意见")
|
||||||
|
@TableField("review_comment")
|
||||||
|
private String reviewComment;
|
||||||
|
|
||||||
|
@ExcelProperty("转为草案ID")
|
||||||
|
@ApiModelProperty("转为草案ID")
|
||||||
|
@TableField("converted_draft_id")
|
||||||
|
private String convertedDraftId;
|
||||||
|
|
||||||
|
@ExcelProperty("适用范围")
|
||||||
|
@ApiModelProperty("适用范围")
|
||||||
|
@TableField("scope")
|
||||||
|
private String scope;
|
||||||
|
|
||||||
|
@ExcelProperty("制度级别")
|
||||||
|
@ApiModelProperty("制度级别:HIGH-高级,MEDIUM-中级,LOW-低级")
|
||||||
|
@TableField("level")
|
||||||
|
private String level;
|
||||||
|
|
||||||
|
@ExcelProperty("紧急程度")
|
||||||
|
@ApiModelProperty("紧急程度:HIGH-高,MEDIUM-中,LOW-低")
|
||||||
|
@TableField("urgency_level")
|
||||||
|
private String urgencyLevel;
|
||||||
|
|
||||||
|
@ExcelProperty("备注")
|
||||||
|
@ApiModelProperty("备注")
|
||||||
|
@TableField("remark")
|
||||||
|
private String remark;
|
||||||
|
|
||||||
|
@ExcelProperty("删除标志(0代表存在,1代表删除)")
|
||||||
|
@ApiModelProperty("删除标志(0代表存在,1代表删除)")
|
||||||
|
@TableField("del_flag")
|
||||||
|
private String delFlag;
|
||||||
|
}
|
|
@ -1,16 +0,0 @@
|
||||||
package com.dite.znpt.domain.page;
|
|
||||||
|
|
||||||
import io.swagger.annotations.ApiOperation;
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@NoArgsConstructor
|
|
||||||
@AllArgsConstructor
|
|
||||||
public class PageBean {
|
|
||||||
private Long total;
|
|
||||||
private List<?> rows;
|
|
||||||
}
|
|
|
@ -27,6 +27,9 @@ public class ImageListReq implements Serializable {
|
||||||
@ApiModelProperty("部件id")
|
@ApiModelProperty("部件id")
|
||||||
private String partId;
|
private String partId;
|
||||||
|
|
||||||
|
@ApiModelProperty("项目id")
|
||||||
|
private String projectId;
|
||||||
|
|
||||||
@ApiModelProperty("图像类型")
|
@ApiModelProperty("图像类型")
|
||||||
private String[] imageTypes;
|
private String[] imageTypes;
|
||||||
|
|
||||||
|
|
|
@ -1,38 +0,0 @@
|
||||||
package com.dite.znpt.domain.vo;
|
|
||||||
|
|
||||||
import com.alibaba.excel.annotation.ExcelProperty;
|
|
||||||
import io.swagger.annotations.ApiModel;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.EqualsAndHashCode;
|
|
||||||
|
|
||||||
import java.io.Serial;
|
|
||||||
import java.io.Serializable;
|
|
||||||
/**
|
|
||||||
* @author huise23
|
|
||||||
* @date 2025/07/17 21:58
|
|
||||||
* @Description: 项目预算信息表导入请求类
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@EqualsAndHashCode(callSuper = false)
|
|
||||||
@ApiModel(value="ProjectBudgetInfo导入请求对象", description="项目预算信息表")
|
|
||||||
public class ProjectBudgetInfoImportReq implements Serializable {
|
|
||||||
|
|
||||||
@Serial
|
|
||||||
private static final long serialVersionUID = 580212651388155611L;
|
|
||||||
|
|
||||||
|
|
||||||
@ExcelProperty(value = "项目名称")
|
|
||||||
private String projectName;
|
|
||||||
|
|
||||||
@ExcelProperty(value = "预算名称")
|
|
||||||
private String budgetName;
|
|
||||||
|
|
||||||
@ExcelProperty(value = "预算类型")
|
|
||||||
private String budgetType;
|
|
||||||
|
|
||||||
@ExcelProperty(value = "预算金额(万元)")
|
|
||||||
private Double budgetAmount;
|
|
||||||
|
|
||||||
@ExcelProperty(value = "预算说明")
|
|
||||||
private String budgetDesc;
|
|
||||||
}
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
package com.dite.znpt.domain.vo;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author huise23
|
||||||
|
* @date 2025/07/27 19:51
|
||||||
|
* @Description: 项目日报信息请求实体
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ApiModel("项目日报信息列表请求实体")
|
||||||
|
public class ProjectDailyReportListReq implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 913060537944500760L;
|
||||||
|
|
||||||
|
@ApiModelProperty("查询关键字")
|
||||||
|
private String keyword;
|
||||||
|
|
||||||
|
@ApiModelProperty("项目日报信息Id")
|
||||||
|
private String reportId;
|
||||||
|
|
||||||
|
@ApiModelProperty("项目id")
|
||||||
|
private String projectId;
|
||||||
|
|
||||||
|
@ApiModelProperty("日报日期")
|
||||||
|
private LocalDate reportDate;
|
||||||
|
|
||||||
|
@ApiModelProperty("日报提交人")
|
||||||
|
private String submitUser;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
package com.dite.znpt.domain.vo;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotBlank;
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
import javax.validation.constraints.Size;
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
/**
|
||||||
|
* @author huise23
|
||||||
|
* @date 2025/07/27 19:51
|
||||||
|
* @Description: 项目日报信息表请求类
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
@ApiModel(value="ProjectDailyReport请求对象", description="项目日报信息表")
|
||||||
|
public class ProjectDailyReportReq implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = -35936236241363317L;
|
||||||
|
|
||||||
|
@ApiModelProperty("主键")
|
||||||
|
private String reportId;
|
||||||
|
|
||||||
|
@NotNull(message = "项目id不能为空")
|
||||||
|
@ApiModelProperty("项目id")
|
||||||
|
private String projectId;
|
||||||
|
|
||||||
|
@NotNull(message = "日报日期不能为空")
|
||||||
|
@ApiModelProperty("日报日期")
|
||||||
|
private LocalDate reportDate;
|
||||||
|
|
||||||
|
@NotBlank(message = "日报提交人不能为空")
|
||||||
|
@Size(max = 32, message = "日报提交人长度不能超过32字符")
|
||||||
|
@ApiModelProperty("日报提交人")
|
||||||
|
private String submitUser;
|
||||||
|
|
||||||
|
@NotBlank(message = "日报附件id不能为空")
|
||||||
|
@ApiModelProperty("日报附件id")
|
||||||
|
private String reportAttachId;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
package com.dite.znpt.domain.vo;
|
||||||
|
|
||||||
|
import com.dite.znpt.domain.entity.AttachInfoEntity;
|
||||||
|
import com.dite.znpt.domain.entity.ProjectDailyReportEntity;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author huise23
|
||||||
|
* @date 2025/07/27 19:51
|
||||||
|
* @Description: 项目日报信息响应实体
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ApiModel("项目日报信息响应实体")
|
||||||
|
public class ProjectDailyReportResp extends ProjectDailyReportEntity {
|
||||||
|
|
||||||
|
@ApiModelProperty("日报附件")
|
||||||
|
private AttachInfoEntity reportAttach;
|
||||||
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ public class UserResp extends UserReq implements Serializable{
|
||||||
@Serial
|
@Serial
|
||||||
private static final long serialVersionUID = -2831232930040845716L;
|
private static final long serialVersionUID = -2831232930040845716L;
|
||||||
|
|
||||||
@ApiModelProperty("用户名")
|
@ApiModelProperty("用户id")
|
||||||
private String userId;
|
private String userId;
|
||||||
|
|
||||||
@ApiModelProperty("所属部门")
|
@ApiModelProperty("所属部门")
|
||||||
|
@ -39,6 +39,8 @@ public class UserResp extends UserReq implements Serializable{
|
||||||
|
|
||||||
@ApiModelProperty("在职状态描述")
|
@ApiModelProperty("在职状态描述")
|
||||||
private String userStatusLabel;
|
private String userStatusLabel;
|
||||||
|
@ApiModelProperty("用户姓名")
|
||||||
|
private String userName;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@ public enum AttachBusinessTypeEnum {
|
||||||
DEFECT_MARK_PIC("defect_mark_pic", "缺陷标注图片"),
|
DEFECT_MARK_PIC("defect_mark_pic", "缺陷标注图片"),
|
||||||
REPORT("report", "报告"),
|
REPORT("report", "报告"),
|
||||||
PROJECT_BUDGE("project_budge", "预算文件"),
|
PROJECT_BUDGE("project_budge", "预算文件"),
|
||||||
|
PROJECT_DAILY_REPORT("project_daily_report", "项目日报文件"),
|
||||||
;
|
;
|
||||||
private final String code;
|
private final String code;
|
||||||
private final String desc;
|
private final String desc;
|
||||||
|
|
|
@ -55,4 +55,23 @@ public enum FilePathEnum {
|
||||||
return StrUtil.replace(urlPath.concat(relativePath), FileUtil.FILE_SEPARATOR, StrUtil.SLASH);
|
return StrUtil.replace(urlPath.concat(relativePath), FileUtil.FILE_SEPARATOR, StrUtil.SLASH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 功能描述:根据文件路径前缀获取文件路径ENUM
|
||||||
|
*
|
||||||
|
* @param fileDownPath 文件路径
|
||||||
|
* @return {@link FilePathEnum }
|
||||||
|
* @author cuizhibin
|
||||||
|
* @date 2025/07/27 16:00
|
||||||
|
**/
|
||||||
|
public static FilePathEnum getFilePathEnum(String fileDownPath) {
|
||||||
|
if (StrUtil.startWith(fileDownPath, FilePathEnum.IMAGE_TEMP.getUrlPath())) {
|
||||||
|
return FilePathEnum.IMAGE_TEMP;
|
||||||
|
}
|
||||||
|
for (FilePathEnum pathEnum : FilePathEnum.values()) {
|
||||||
|
if (StrUtil.startWith(fileDownPath, FilePathEnum.IMAGE_TEMP.getUrlPath())) {
|
||||||
|
return pathEnum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FilePathEnum.ATTACH;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
package com.dite.znpt.mapper;
|
|
||||||
|
|
||||||
import com.dite.znpt.domain.entity.BusinessDataFileEntity;
|
|
||||||
import com.dite.znpt.domain.entity.BusinessDataEntity;
|
|
||||||
import io.swagger.annotations.ApiModel;
|
|
||||||
import io.swagger.annotations.ApiOperation;
|
|
||||||
import org.apache.ibatis.annotations.Param;
|
|
||||||
import org.apache.ibatis.annotations.Select;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@ApiOperation("商务资料文件对象")
|
|
||||||
public interface BusinessDataFileMapper {
|
|
||||||
public List<BusinessDataFileEntity> List( @Param("folderId") Long folderId,String fileName);
|
|
||||||
void delete(@Param("fileId") Long fileId,@Param("folderId") Long folderId);
|
|
||||||
|
|
||||||
void add(BusinessDataFileEntity businessDataFileEntity);
|
|
||||||
|
|
||||||
String getPath(Long fileId);
|
|
||||||
}
|
|
|
@ -1,29 +0,0 @@
|
||||||
package com.dite.znpt.mapper;
|
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.injector.methods.SelectList;
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
|
||||||
import com.dite.znpt.domain.entity.BusinessDataEntity;
|
|
||||||
import io.swagger.annotations.ApiOperation;
|
|
||||||
import org.apache.ibatis.annotations.Param;
|
|
||||||
import org.apache.ibatis.annotations.Select;
|
|
||||||
import com.dite.znpt.domain.entity.BusinessDataEntity;
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ApiOperation("商务资料文件夹对象")
|
|
||||||
public interface BusinessDataMapper {
|
|
||||||
public String getPath(Long parentId);
|
|
||||||
|
|
||||||
public List<BusinessDataEntity> List();
|
|
||||||
|
|
||||||
void insert(BusinessDataEntity businessDataEntity);
|
|
||||||
|
|
||||||
void delete(Long folderId);
|
|
||||||
|
|
||||||
void reName(BusinessDataEntity businessDataEntity);
|
|
||||||
}
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
package com.dite.znpt.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.dite.znpt.domain.entity.ProjectDailyReportEntity;
|
||||||
|
import com.dite.znpt.domain.vo.ProjectDailyReportListReq;
|
||||||
|
import com.dite.znpt.domain.vo.ProjectDailyReportResp;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author huise23
|
||||||
|
* @date 2025/07/27 19:51
|
||||||
|
* @Description: 项目日报信息表数据库访问层
|
||||||
|
*/
|
||||||
|
public interface ProjectDailyReportMapper extends BaseMapper<ProjectDailyReportEntity> {
|
||||||
|
List<ProjectDailyReportResp> queryBySelective(ProjectDailyReportListReq projectDailyReportReq);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
package com.dite.znpt.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.dite.znpt.domain.entity.RegulationConfirmationEntity;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author wangna
|
||||||
|
* @date 2025/07/28
|
||||||
|
* @Description: 制度确认Mapper接口
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface RegulationConfirmationMapper extends BaseMapper<RegulationConfirmationEntity> {
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
package com.dite.znpt.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.dite.znpt.domain.entity.RegulationEntity;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author wangna
|
||||||
|
* @date 2025/07/28
|
||||||
|
* @Description: 制度规范仓库Mapper接口
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface RegulationMapper extends BaseMapper<RegulationEntity> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页查询制度列表(包含创建人姓名)
|
||||||
|
* @param page 分页参数
|
||||||
|
* @param status 状态
|
||||||
|
* @param type 类型
|
||||||
|
* @param title 提案标题
|
||||||
|
* @param proposer 提案人
|
||||||
|
* @return 分页结果
|
||||||
|
*/
|
||||||
|
Page<RegulationEntity> selectRegulationListWithCreator(Page<RegulationEntity> page,
|
||||||
|
@Param("status") String status,
|
||||||
|
@Param("type") String type,
|
||||||
|
@Param("title") String title,
|
||||||
|
@Param("proposer") String proposer);
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package com.dite.znpt.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.dite.znpt.domain.entity.RegulationTypeEntity;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 制度类型Mapper接口
|
||||||
|
* @author wangna
|
||||||
|
* @date 2025/07/29
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface RegulationTypeMapper extends BaseMapper<RegulationTypeEntity> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页查询制度类型列表(包含创建人姓名)
|
||||||
|
* @param page 分页参数
|
||||||
|
* @param typeName 类型名称
|
||||||
|
* @param status 状态
|
||||||
|
* @param remark 备注
|
||||||
|
* @return 分页结果
|
||||||
|
*/
|
||||||
|
Page<RegulationTypeEntity> selectRegulationTypeListWithCreator(Page<RegulationTypeEntity> page,
|
||||||
|
@Param("typeName") String typeName,
|
||||||
|
@Param("status") String status,
|
||||||
|
@Param("remark") String remark);
|
||||||
|
}
|
|
@ -23,7 +23,7 @@ public interface AttachInfoService extends IService<AttachInfoEntity> {
|
||||||
* @author huise23
|
* @author huise23
|
||||||
* @date 2025/04/11 23:17
|
* @date 2025/04/11 23:17
|
||||||
**/
|
**/
|
||||||
List<AttachInfoEntity> listByBusinessIds(List<String> businessIds, String businessType);
|
List<AttachInfoEntity> listByBusinessIds(List<String> businessIds, AttachBusinessTypeEnum businessType);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 功能描述:新增附件信息
|
* 功能描述:新增附件信息
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
package com.dite.znpt.service;
|
|
||||||
|
|
||||||
import com.dite.znpt.domain.Result;
|
|
||||||
import com.dite.znpt.domain.entity.BusinessDataFileEntity;
|
|
||||||
import com.dite.znpt.domain.page.PageBean;
|
|
||||||
import io.swagger.annotations.ApiOperation;
|
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@ApiOperation("商务资料文件service")
|
|
||||||
|
|
||||||
public interface BusinessDataFileService {
|
|
||||||
|
|
||||||
PageBean pageSelect(Integer page, Integer pageSize, Long folderId);
|
|
||||||
|
|
||||||
Result delete(@RequestParam(value = "fileId", required = false) Long fileId,@RequestParam(value = "foldelId", required = false) Long folderId);
|
|
||||||
|
|
||||||
void add(BusinessDataFileEntity businessDataFileEntity);
|
|
||||||
|
|
||||||
String getPath(Long fileId);
|
|
||||||
}
|
|
|
@ -1,19 +0,0 @@
|
||||||
package com.dite.znpt.service;
|
|
||||||
|
|
||||||
import com.dite.znpt.domain.Result;
|
|
||||||
import com.dite.znpt.domain.page.PageBean;
|
|
||||||
import io.swagger.annotations.ApiOperation;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
import com.dite.znpt.domain.entity.BusinessDataEntity;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@ApiOperation("商务资料文件夹service")
|
|
||||||
public interface BusinessDataService {
|
|
||||||
|
|
||||||
PageBean pageSelect(Integer page, Integer pageSize);
|
|
||||||
Result createFolder(String folderName, Long parentId);
|
|
||||||
String getPath(Long parentId);
|
|
||||||
Result delete(Long folderId);
|
|
||||||
Result reName(Long folderId, String newName);
|
|
||||||
}
|
|
|
@ -0,0 +1,74 @@
|
||||||
|
package com.dite.znpt.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import com.dite.znpt.domain.entity.ProjectDailyReportEntity;
|
||||||
|
import com.dite.znpt.domain.vo.ProjectDailyReportListReq;
|
||||||
|
import com.dite.znpt.domain.vo.ProjectDailyReportReq;
|
||||||
|
import com.dite.znpt.domain.vo.ProjectDailyReportResp;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author huise23
|
||||||
|
* @date 2025/07/27 19:51
|
||||||
|
* @Description: 项目日报信息表服务接口
|
||||||
|
*/
|
||||||
|
public interface ProjectDailyReportService extends IService<ProjectDailyReportEntity> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 功能描述:查询项目日报信息列表
|
||||||
|
*
|
||||||
|
* @param projectDailyReportReq 项目日报信息
|
||||||
|
* @return {@link List }<{@link ProjectDailyReportResp }>
|
||||||
|
* @author huise23
|
||||||
|
* @date 2025/07/27 19:51
|
||||||
|
**/
|
||||||
|
List<ProjectDailyReportResp> selectList(ProjectDailyReportListReq projectDailyReportReq);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 功能描述:查询单条项目日报信息
|
||||||
|
*
|
||||||
|
* @param reportId 项目日报信息Id
|
||||||
|
* @return {@link ProjectDailyReportResp }
|
||||||
|
* @author huise23
|
||||||
|
* @date 2025/07/27 19:51
|
||||||
|
**/
|
||||||
|
ProjectDailyReportResp selectById(String reportId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 功能描述:新增项目日报信息
|
||||||
|
*
|
||||||
|
* @param projectDailyReportReq 项目日报信息
|
||||||
|
* @author huise23
|
||||||
|
* @date 2025/07/27 19:51
|
||||||
|
**/
|
||||||
|
void saveData(ProjectDailyReportReq projectDailyReportReq);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 功能描述:更新项目日报信息
|
||||||
|
*
|
||||||
|
* @param projectDailyReportReq 项目日报信息
|
||||||
|
* @author huise23
|
||||||
|
* @date 2025/07/27 19:51
|
||||||
|
**/
|
||||||
|
void updateData(ProjectDailyReportReq projectDailyReportReq);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 功能描述:删除项目日报信息
|
||||||
|
*
|
||||||
|
* @param reportId 项目日报信息Id
|
||||||
|
* @author huise23
|
||||||
|
* @date 2025/07/27 19:51
|
||||||
|
**/
|
||||||
|
void deleteById(String reportId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 功能描述:我今天
|
||||||
|
*
|
||||||
|
* @return {@link ProjectDailyReportResp }
|
||||||
|
* @author cuizhibin
|
||||||
|
* @date 2025/07/27 19:53
|
||||||
|
**/
|
||||||
|
ProjectDailyReportResp myToday(String projectId);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
package com.dite.znpt.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import com.dite.znpt.domain.entity.RegulationConfirmationEntity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author wangna
|
||||||
|
* @date 2025/07/28
|
||||||
|
* @Description: 制度确认Service接口
|
||||||
|
*/
|
||||||
|
public interface RegulationConfirmationService extends IService<RegulationConfirmationEntity> {
|
||||||
|
// 继承自IService的方法已经足够使用
|
||||||
|
// 包括:save, update, remove, list, page, lambdaQuery等
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
package com.dite.znpt.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import com.dite.znpt.domain.entity.RegulationEntity;
|
||||||
|
import com.dite.znpt.domain.Result;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author wangna
|
||||||
|
* @date 2025/07/29
|
||||||
|
* @Description: 制度规范仓库Service接口
|
||||||
|
*/
|
||||||
|
public interface RegulationService extends IService<RegulationEntity> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取制度列表
|
||||||
|
* @param page 页码
|
||||||
|
* @param pageSize 页大小
|
||||||
|
* @param status 状态
|
||||||
|
* @param type 类型
|
||||||
|
* @param title 提案标题
|
||||||
|
* @param proposer 提案人
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
Result getRegulationList(Integer page, Integer pageSize, String status, String type, String title, String proposer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建制度提案
|
||||||
|
* @param regulation 制度信息
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
Result createRegulationProposal(RegulationEntity regulation);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新制度提案
|
||||||
|
* @param regulation 制度信息
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
Result updateRegulationProposal(RegulationEntity regulation);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除制度提案
|
||||||
|
* @param regulationId 制度ID
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
Result deleteRegulationProposal(String regulationId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取制度详情
|
||||||
|
* @param regulationId 制度ID
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
Result getRegulationDetail(String regulationId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 确认制度知晓
|
||||||
|
* @param regulationId 制度ID
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
Result confirmRegulation(String regulationId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 公示制度
|
||||||
|
* @param regulationId 制度ID
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
Result approveRegulation(String regulationId);
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
package com.dite.znpt.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import com.dite.znpt.domain.entity.RegulationTypeEntity;
|
||||||
|
import com.dite.znpt.domain.Result;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 制度类型Service接口
|
||||||
|
* @author wangna
|
||||||
|
* @date 2025/07/29
|
||||||
|
*/
|
||||||
|
public interface RegulationTypeService extends IService<RegulationTypeEntity> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取制度类型列表
|
||||||
|
* @param page 页码
|
||||||
|
* @param size 页大小
|
||||||
|
* @param typeName 类型名称
|
||||||
|
* @param status 状态
|
||||||
|
* @param remark 备注
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
Result getRegulationTypes(Integer page, Integer size, String typeName, String status, String remark);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建制度类型
|
||||||
|
* @param regulationType 制度类型信息
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
Result createRegulationType(RegulationTypeEntity regulationType);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新制度类型
|
||||||
|
* @param regulationType 制度类型信息
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
Result updateRegulationType(RegulationTypeEntity regulationType);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除制度类型
|
||||||
|
* @param typeId 类型ID
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
Result deleteRegulationType(String typeId);
|
||||||
|
}
|
|
@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
import com.dite.znpt.domain.entity.RoleMenuEntity;
|
import com.dite.znpt.domain.entity.RoleMenuEntity;
|
||||||
import com.dite.znpt.domain.vo.RoleMenuReq;
|
import com.dite.znpt.domain.vo.RoleMenuReq;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Bear.G
|
* @author Bear.G
|
||||||
|
@ -12,6 +11,5 @@ import java.util.List;
|
||||||
* @description
|
* @description
|
||||||
*/
|
*/
|
||||||
public interface RoleMenuService extends IService<RoleMenuEntity> {
|
public interface RoleMenuService extends IService<RoleMenuEntity> {
|
||||||
|
|
||||||
void bindRoleMenu(RoleMenuReq req);
|
void bindRoleMenu(RoleMenuReq req);
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,7 @@ import java.net.URLEncoder;
|
||||||
import java.rmi.ServerException;
|
import java.rmi.ServerException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -51,9 +52,9 @@ public class AttachInfoServiceImpl extends ServiceImpl<FileInfoMapper, AttachInf
|
||||||
* @date 2025/04/11 23:17
|
* @date 2025/04/11 23:17
|
||||||
**/
|
**/
|
||||||
@Override
|
@Override
|
||||||
public List<AttachInfoEntity> listByBusinessIds(List<String> businessIds, String businessType) {
|
public List<AttachInfoEntity> listByBusinessIds(List<String> businessIds, AttachBusinessTypeEnum businessType) {
|
||||||
return lambdaQuery().in(AttachInfoEntity::getBusinessId, businessIds)
|
return lambdaQuery().in(AttachInfoEntity::getBusinessId, businessIds)
|
||||||
.eq(StrUtil.isNotEmpty(businessType), AttachInfoEntity::getBusinessType, businessType)
|
.eq(Objects.nonNull(businessType), AttachInfoEntity::getBusinessType, businessType.getCode())
|
||||||
.list();
|
.list();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,95 +0,0 @@
|
||||||
package com.dite.znpt.service.impl;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
import com.dite.znpt.domain.Result;
|
|
||||||
import com.dite.znpt.domain.entity.BusinessDataEntity;
|
|
||||||
import com.dite.znpt.domain.entity.BusinessDataFileEntity;
|
|
||||||
import com.dite.znpt.domain.page.PageBean;
|
|
||||||
import com.dite.znpt.mapper.BusinessDataFileMapper;
|
|
||||||
import com.dite.znpt.service.BusinessDataFileService;
|
|
||||||
import com.github.pagehelper.Page;
|
|
||||||
import com.github.pagehelper.PageHelper;
|
|
||||||
import io.swagger.annotations.ApiOperation;
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import org.apache.ibatis.annotations.Param;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static jodd.io.FileUtil.deleteFile;
|
|
||||||
import static org.apache.tomcat.util.http.fileupload.FileUtils.deleteDirectory;
|
|
||||||
|
|
||||||
@AllArgsConstructor
|
|
||||||
@Service
|
|
||||||
@ApiOperation("商务资料文件service实现类")
|
|
||||||
public class BusinessDataFileServiceImpl implements BusinessDataFileService {
|
|
||||||
@Resource
|
|
||||||
private BusinessDataFileMapper businessDataFileMapper;
|
|
||||||
|
|
||||||
|
|
||||||
@ApiOperation("分页查询文件")
|
|
||||||
public PageBean pageSelect(Integer page, Integer pageSize, Long folderId) {
|
|
||||||
PageHelper.startPage(page, pageSize);
|
|
||||||
List<BusinessDataFileEntity> list = businessDataFileMapper.List(folderId ,"");
|
|
||||||
Page<BusinessDataFileEntity> p= (Page<BusinessDataFileEntity>) list;
|
|
||||||
PageBean pageBean = new PageBean(p.getTotal(),p.getResult());
|
|
||||||
return pageBean;
|
|
||||||
}
|
|
||||||
@ApiOperation("删除文件")
|
|
||||||
public Result delete(Long fileId, Long folderId) {
|
|
||||||
//删除数据库数据
|
|
||||||
if (folderId != null){
|
|
||||||
businessDataFileMapper.delete(null,folderId);
|
|
||||||
System.out.println("888888888走对了");
|
|
||||||
|
|
||||||
return Result.okM("删除,走对了,成功");
|
|
||||||
}
|
|
||||||
|
|
||||||
//删除文件
|
|
||||||
String sPath = businessDataFileMapper.getPath(fileId);
|
|
||||||
|
|
||||||
businessDataFileMapper.delete(fileId,null);
|
|
||||||
|
|
||||||
boolean flag = false;
|
|
||||||
File file = new File(sPath);
|
|
||||||
// 判断目录或文件是否存在
|
|
||||||
if (!file.exists()) { // 不存在返回 false
|
|
||||||
return Result.error("文件不存在");
|
|
||||||
} else {
|
|
||||||
// 判断是否为文件
|
|
||||||
if (file.isFile()) { // 为文件时调用删除文件方法
|
|
||||||
try {
|
|
||||||
deleteFile(file);
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
return Result.okM("删除成功");
|
|
||||||
} else { // 为目录时调用删除目录方法
|
|
||||||
try {
|
|
||||||
deleteDirectory(file);
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
return Result.okM("删除成功");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@ApiOperation("增加文件")
|
|
||||||
public void add(BusinessDataFileEntity businessDataFileEntity) {
|
|
||||||
businessDataFileMapper.add(businessDataFileEntity);
|
|
||||||
}
|
|
||||||
|
|
||||||
@ApiOperation("获取文件路径")
|
|
||||||
public String getPath(Long fileId) {
|
|
||||||
System.out.println(fileId+" 77777777777impl777777777777777");
|
|
||||||
return businessDataFileMapper.getPath(fileId);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,207 +0,0 @@
|
||||||
package com.dite.znpt.service.impl;
|
|
||||||
|
|
||||||
import cn.dev33.satoken.stp.StpUtil;
|
|
||||||
import com.dite.znpt.domain.Result;
|
|
||||||
import com.dite.znpt.domain.page.PageBean;
|
|
||||||
import com.dite.znpt.mapper.BusinessDataFileMapper;
|
|
||||||
import com.dite.znpt.mapper.BusinessDataMapper;
|
|
||||||
import com.dite.znpt.service.BusinessDataFileService;
|
|
||||||
import com.dite.znpt.service.BusinessDataService;
|
|
||||||
import com.dite.znpt.domain.entity.BusinessDataEntity;
|
|
||||||
import com.github.pagehelper.Page;
|
|
||||||
import com.github.pagehelper.PageHelper;
|
|
||||||
import io.swagger.annotations.ApiOperation;
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
import org.apache.ibatis.jdbc.Null;
|
|
||||||
import org.apache.xmlbeans.impl.xb.xsdschema.Public;
|
|
||||||
import org.aspectj.bridge.IMessage;
|
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
import java.io.File;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.nio.file.Paths;
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 商务资料文件夹实现类
|
|
||||||
*/
|
|
||||||
@Service
|
|
||||||
@ApiOperation("商务资料文件夹service实现类")
|
|
||||||
@AllArgsConstructor
|
|
||||||
@NoArgsConstructor
|
|
||||||
public class BusinessDataServiceImpl implements BusinessDataService {
|
|
||||||
@Resource
|
|
||||||
private BusinessDataMapper businessDataMapper;
|
|
||||||
@Resource
|
|
||||||
private BusinessDataFileService businessDataFileService;
|
|
||||||
|
|
||||||
// 从配置文件中读取基础路径(默认值:D:/upload/businessData)
|
|
||||||
// ,新建文件夹的时候,如果没指定父文件夹Id,就用这个
|
|
||||||
@Value("${file.upload.businessDataPath:D:/upload/businessData}")
|
|
||||||
private String businessDataPath;
|
|
||||||
|
|
||||||
@ApiOperation(value = "分页查询")
|
|
||||||
@Override
|
|
||||||
public PageBean pageSelect(Integer page, Integer pageSize) {
|
|
||||||
// 分页查询,pageHelper.startPage()方法会返回一个Page对象,该对象包含了分页信息,如总记录数和当前页数据
|
|
||||||
PageHelper.startPage(page, pageSize);
|
|
||||||
// 查询所有数据
|
|
||||||
List<BusinessDataEntity> businessDataEntityList = businessDataMapper.List();
|
|
||||||
// 返回分页结果
|
|
||||||
Page<BusinessDataEntity> p = (Page<BusinessDataEntity>) businessDataEntityList;
|
|
||||||
// 返回分页结果
|
|
||||||
PageBean pageBean = new PageBean(p.getTotal(), p.getResult());
|
|
||||||
|
|
||||||
return pageBean;
|
|
||||||
}
|
|
||||||
|
|
||||||
@ApiOperation(value = "创建文件夹")
|
|
||||||
@Override
|
|
||||||
public Result createFolder(String folderName, Long parentId) {
|
|
||||||
//获取ID
|
|
||||||
Long loginIdAsLong = 888L;
|
|
||||||
// loginIdAsLong = StpUtil.getLoginIdAsLong();
|
|
||||||
//
|
|
||||||
// 文件夹名称不能为空
|
|
||||||
//TODO: 添加文件夹名称校验,后续最好更规范些,写个工具类专门校验,用正则表达式
|
|
||||||
if (folderName == null || folderName.trim().isEmpty()) {
|
|
||||||
return Result.error("文件夹名称不能为空");
|
|
||||||
}
|
|
||||||
if (folderName.length() > 50) {
|
|
||||||
return Result.error("文件夹名称过长");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 文件夹名称前置一个/
|
|
||||||
String folderName1 = "/" + folderName;
|
|
||||||
// 目标文件夹
|
|
||||||
File targetDir=Paths.get(businessDataPath, folderName1).toFile();
|
|
||||||
if(parentId != 0L){
|
|
||||||
// 获取父文件夹路径
|
|
||||||
targetDir = Paths.get(businessDataMapper.getPath(parentId), folderName1).toFile();
|
|
||||||
}
|
|
||||||
// 创建文件夹和新增文件夹路径
|
|
||||||
if (!targetDir.exists()) {
|
|
||||||
// 创建文件夹
|
|
||||||
boolean created = targetDir.mkdirs();
|
|
||||||
if (!created) {
|
|
||||||
throw new RuntimeException("文件夹创建失败: " + targetDir.getAbsolutePath());
|
|
||||||
}
|
|
||||||
//上面是新增文件夹功能,但没有往数据库插入文件夹相关数据,所以下面新增
|
|
||||||
// 创建BusinessDataEntity对象并设置属性
|
|
||||||
BusinessDataEntity businessDataEntity = new BusinessDataEntity(
|
|
||||||
null,
|
|
||||||
folderName,
|
|
||||||
parentId,
|
|
||||||
loginIdAsLong,
|
|
||||||
LocalDateTime.now(),
|
|
||||||
LocalDateTime.now(),
|
|
||||||
false,
|
|
||||||
targetDir.getAbsolutePath()
|
|
||||||
);
|
|
||||||
// 插入到数据库
|
|
||||||
businessDataMapper.insert(businessDataEntity);
|
|
||||||
return Result.okM( "文件夹创建成功");
|
|
||||||
} else {
|
|
||||||
return Result.error("文件夹已存在: ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@ApiOperation("获取文件夹路径")
|
|
||||||
public String getPath(Long parentId) {
|
|
||||||
return businessDataMapper.getPath(parentId);
|
|
||||||
}
|
|
||||||
|
|
||||||
// @ApiOperation("删除文件夹")
|
|
||||||
// @Override
|
|
||||||
// public Result delete(Long folderId) {
|
|
||||||
// // 获取文件夹路径
|
|
||||||
// String folderPath = businessDataMapper.getPath(folderId);
|
|
||||||
//
|
|
||||||
// // 创建File对象并删除文件夹
|
|
||||||
// File folder = new File(folderPath);
|
|
||||||
// if (folder.exists()) {
|
|
||||||
// boolean deleted = folder.delete();
|
|
||||||
// if (!deleted) {
|
|
||||||
// // throw new RuntimeException("文件夹删除失败: " + folderPath);
|
|
||||||
// // TODO: 以后可以用全局异常处理器捕获,或者用try catch捕获
|
|
||||||
// return Result.error("文件夹删除失败: " + folderPath);
|
|
||||||
// }
|
|
||||||
// //删除数据库中文件夹的数据
|
|
||||||
// businessDataMapper.delete(folderId);
|
|
||||||
// //删除文件夹下文件的数据
|
|
||||||
// businessDataFileService.delete(folderId);
|
|
||||||
// return Result.okM("删除成功");
|
|
||||||
// } else {
|
|
||||||
// // throw new RuntimeException("文件夹不存在: " + folderPath);
|
|
||||||
// return Result.error("文件夹不存在: " + folderPath);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
@ApiOperation("删除文件夹")
|
|
||||||
@Override
|
|
||||||
public Result delete(Long folderId) {
|
|
||||||
// 获取文件夹路径
|
|
||||||
String folderPath = businessDataMapper.getPath(folderId);
|
|
||||||
|
|
||||||
// 创建Path对象并删除文件夹
|
|
||||||
Path folder = Paths.get(folderPath);
|
|
||||||
if (Files.exists(folder)) {
|
|
||||||
try {
|
|
||||||
// 使用Files.walk获取所有文件和目录,按深度排序后删除
|
|
||||||
java.util.stream.Stream<Path> filePaths = Files.walk(folder);
|
|
||||||
filePaths.sorted(Comparator.reverseOrder())
|
|
||||||
.map(Path::toFile)
|
|
||||||
.forEach(File::delete);
|
|
||||||
filePaths.close();
|
|
||||||
|
|
||||||
//删除数据库中文件夹的数据
|
|
||||||
businessDataMapper.delete(folderId);
|
|
||||||
//删除文件夹下文件的数据
|
|
||||||
businessDataFileService.delete(null , folderId);
|
|
||||||
return Result.okM("删除成功");
|
|
||||||
} catch (Exception e) {
|
|
||||||
return Result.okM("删除成功");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return Result.error("文件夹不存在: " + folderPath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ApiOperation("重命名文件夹")
|
|
||||||
@Override
|
|
||||||
public Result reName(Long folderId, String newName) {
|
|
||||||
// 获取文件夹路径
|
|
||||||
String folderPath = businessDataMapper.getPath(folderId);
|
|
||||||
String newPath = folderPath.substring(0, folderPath.lastIndexOf('\\'))+"\\" + newName;
|
|
||||||
System.out.printf("7777777"+newPath);
|
|
||||||
//
|
|
||||||
// //想命名的原文件的路径
|
|
||||||
// File file = new File("f:/a/a.xlsx");
|
|
||||||
// //将原文件更改为f:\a\b.xlsx,其中路径是必要的。注意
|
|
||||||
// file.renameTo(new File("f:/a/b.xlsx"));
|
|
||||||
//想命名的原文件夹的路径
|
|
||||||
File file1 = new File(folderPath);
|
|
||||||
//将原文件夹更改为A,其中路径是必要的。注意
|
|
||||||
file1.renameTo(new File(newPath));
|
|
||||||
LocalDateTime now = LocalDateTime.now();
|
|
||||||
|
|
||||||
BusinessDataEntity businessDataEntity = new BusinessDataEntity(
|
|
||||||
folderId,
|
|
||||||
newName,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
now,
|
|
||||||
null,
|
|
||||||
newPath
|
|
||||||
);
|
|
||||||
System.out.println(businessDataEntity);
|
|
||||||
businessDataMapper.reName(businessDataEntity);
|
|
||||||
return Result.okM("重命名成功");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -198,7 +198,7 @@ public class DefectServiceImpl extends ServiceImpl<DefectMapper, DefectEntity> i
|
||||||
}
|
}
|
||||||
image.setImageType(ImageTypeEnum.DEFECT.getCode());
|
image.setImageType(ImageTypeEnum.DEFECT.getCode());
|
||||||
imageService.updateById(image);
|
imageService.updateById(image);
|
||||||
FilePathEnum pathEnum = image.getImagePath().contains("temp") ? FilePathEnum.IMAGE_TEMP : FilePathEnum.IMAGE;
|
FilePathEnum pathEnum = FilePathEnum.getFilePathEnum(image.getImagePath());
|
||||||
String inputPath = pathEnum.getFileAbsolutePath(image.getImagePath());
|
String inputPath = pathEnum.getFileAbsolutePath(image.getImagePath());
|
||||||
// 写入attach同层级文件夹下
|
// 写入attach同层级文件夹下
|
||||||
String attachPath = FilePathEnum.ATTACH.getUrlPath() + StrUtil.removePrefix(image.getImagePath(), pathEnum.getUrlPath());
|
String attachPath = FilePathEnum.ATTACH.getUrlPath() + StrUtil.removePrefix(image.getImagePath(), pathEnum.getUrlPath());
|
||||||
|
|
|
@ -8,8 +8,8 @@ import com.dite.znpt.converts.Converts;
|
||||||
import com.dite.znpt.domain.entity.ImageCollectEntity;
|
import com.dite.znpt.domain.entity.ImageCollectEntity;
|
||||||
import com.dite.znpt.domain.entity.ImageEntity;
|
import com.dite.znpt.domain.entity.ImageEntity;
|
||||||
import com.dite.znpt.domain.vo.ImageCollectReq;
|
import com.dite.znpt.domain.vo.ImageCollectReq;
|
||||||
|
import com.dite.znpt.domain.vo.ImageReq;
|
||||||
import com.dite.znpt.enums.FilePathEnum;
|
import com.dite.znpt.enums.FilePathEnum;
|
||||||
import com.dite.znpt.enums.ImageSourceEnum;
|
|
||||||
import com.dite.znpt.exception.ServiceException;
|
import com.dite.znpt.exception.ServiceException;
|
||||||
import com.dite.znpt.mapper.ImageCollectMapper;
|
import com.dite.znpt.mapper.ImageCollectMapper;
|
||||||
import com.dite.znpt.service.ImageCollectService;
|
import com.dite.znpt.service.ImageCollectService;
|
||||||
|
@ -20,9 +20,10 @@ import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.time.LocalDate;
|
|
||||||
import java.time.format.DateTimeFormatter;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author: gaoxiong
|
* @Author: gaoxiong
|
||||||
|
@ -49,21 +50,21 @@ public class ImageCollectServiceImpl extends ServiceImpl<ImageCollectMapper, Ima
|
||||||
}
|
}
|
||||||
ImageCollectEntity imageCollect = Converts.INSTANCE.toImageCollectEntity(req);
|
ImageCollectEntity imageCollect = Converts.INSTANCE.toImageCollectEntity(req);
|
||||||
this.save(imageCollect);
|
this.save(imageCollect);
|
||||||
String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
Map<String, ImageReq> imageMap = req.getImageList().stream().collect(Collectors.toMap(ImageReq::getImageId, Function.identity(), (a,b) -> b));
|
||||||
List<ImageEntity> imageList = Converts.INSTANCE.toImageEntity(req.getImageList());
|
List<ImageEntity> imageList = imageService.listByIds(imageMap.keySet());
|
||||||
String permPathPrefix = FilePathEnum.IMAGE.getFileAbsolutePathPrefix().concat(ImageSourceEnum.COLLECT.getCode()).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR).concat(dateStr).concat(FileUtil.FILE_SEPARATOR);
|
|
||||||
imageList.forEach(image -> {
|
imageList.forEach(image -> {
|
||||||
image.setPartId(partId);
|
image.setPartId(partId);
|
||||||
image.setCollectId(imageCollect.getCollectId());
|
image.setCollectId(imageCollect.getCollectId());
|
||||||
image.setImageType(req.getImageType());
|
image.setImageType(req.getImageType());
|
||||||
image.setImageTypeLabel(req.getImageTypeLabel());
|
image.setImageTypeLabel(req.getImageTypeLabel());
|
||||||
String path = permPathPrefix + image.getImageName();
|
if (FilePathEnum.getFilePathEnum(image.getImagePath()).equals(FilePathEnum.IMAGE_TEMP)) {
|
||||||
String fileAbsolutePath = FilePathEnum.IMAGE_TEMP.getFileAbsolutePath(image.getImagePath());
|
String newImagePath = image.getImagePath().replace(FilePathEnum.IMAGE_TEMP.getUrlPath(), FilePathEnum.IMAGE.getUrlPath());
|
||||||
File file = FileUtil.file(fileAbsolutePath);
|
String oldFileAbsolutePath = FilePathEnum.IMAGE_TEMP.getFileAbsolutePath(image.getImagePath());
|
||||||
if (file.exists()) {
|
File oldFile = FileUtil.file(oldFileAbsolutePath);
|
||||||
FileUtil.copy(file, FileUtil.file(path), true);
|
if (oldFile.exists()) {
|
||||||
image.setImagePath(FilePathEnum.IMAGE.getFileDownPath(path));
|
FileUtil.move(oldFile, FileUtil.file(newImagePath), true);
|
||||||
FileUtil.del(file);
|
image.setImagePath(newImagePath);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
imageService.saveOrUpdateBatch(imageList);
|
imageService.saveOrUpdateBatch(imageList);
|
||||||
|
|
|
@ -64,6 +64,7 @@ public class ImageServiceImpl extends ServiceImpl<ImageMapper, ImageEntity> impl
|
||||||
private PartService partService;
|
private PartService partService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private AudioFileInfoService audioFileInfoService;
|
private AudioFileInfoService audioFileInfoService;
|
||||||
|
@Autowired
|
||||||
private ProjectService projectService;
|
private ProjectService projectService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private UserService userService;
|
private UserService userService;
|
||||||
|
@ -296,7 +297,7 @@ public class ImageServiceImpl extends ServiceImpl<ImageMapper, ImageEntity> impl
|
||||||
if(CollUtil.isEmpty(imageList)){
|
if(CollUtil.isEmpty(imageList)){
|
||||||
imageCollectService.removeById(image.getCollectId());
|
imageCollectService.removeById(image.getCollectId());
|
||||||
}
|
}
|
||||||
FilePathEnum pathEnum = image.getImagePath().contains("temp") ? FilePathEnum.IMAGE_TEMP : FilePathEnum.IMAGE;
|
FilePathEnum pathEnum = FilePathEnum.getFilePathEnum(image.getImagePath());
|
||||||
FileUtil.del(pathEnum.getFileAbsolutePath(image.getImagePath()));
|
FileUtil.del(pathEnum.getFileAbsolutePath(image.getImagePath()));
|
||||||
FileUtil.del(FilePathEnum.IMAGE.getFileAbsolutePath(image.getPreImagePath()));
|
FileUtil.del(FilePathEnum.IMAGE.getFileAbsolutePath(image.getPreImagePath()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,138 @@
|
||||||
|
package com.dite.znpt.service.impl;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.collection.ListUtil;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.dite.znpt.constant.Message;
|
||||||
|
import com.dite.znpt.domain.entity.AttachInfoEntity;
|
||||||
|
import com.dite.znpt.domain.entity.ProjectDailyReportEntity;
|
||||||
|
import com.dite.znpt.domain.vo.ProjectDailyReportListReq;
|
||||||
|
import com.dite.znpt.domain.vo.ProjectDailyReportReq;
|
||||||
|
import com.dite.znpt.domain.vo.ProjectDailyReportResp;
|
||||||
|
import com.dite.znpt.enums.AttachBusinessTypeEnum;
|
||||||
|
import com.dite.znpt.exception.ServiceException;
|
||||||
|
import com.dite.znpt.mapper.ProjectDailyReportMapper;
|
||||||
|
import com.dite.znpt.service.AttachInfoService;
|
||||||
|
import com.dite.znpt.service.ProjectDailyReportService;
|
||||||
|
import com.dite.znpt.util.PageUtil;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author huise23
|
||||||
|
* @date 2025/07/27 19:51
|
||||||
|
* @Description: 项目日报信息表服务实现类
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class ProjectDailyReportServiceImpl extends ServiceImpl<ProjectDailyReportMapper, ProjectDailyReportEntity> implements ProjectDailyReportService {
|
||||||
|
|
||||||
|
private final AttachInfoService attachInfoService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 功能描述:查询项目日报信息列表
|
||||||
|
*
|
||||||
|
* @param projectDailyReportReq 项目日报信息信息
|
||||||
|
* @return {@link List }<{@link ProjectDailyReportResp }>
|
||||||
|
* @author huise23
|
||||||
|
* @date 2025/07/27 19:51
|
||||||
|
**/
|
||||||
|
@Override
|
||||||
|
public List<ProjectDailyReportResp> selectList(ProjectDailyReportListReq projectDailyReportReq) {
|
||||||
|
PageUtil.startPage();
|
||||||
|
List<ProjectDailyReportResp> respList= this.baseMapper.queryBySelective(projectDailyReportReq);
|
||||||
|
if (CollUtil.isNotEmpty(respList)) {
|
||||||
|
List<String> reportIds = respList.stream().map(ProjectDailyReportResp::getReportId).toList();
|
||||||
|
Map<String, AttachInfoEntity> attachMap = attachInfoService.listByBusinessIds(reportIds, AttachBusinessTypeEnum.PROJECT_DAILY_REPORT)
|
||||||
|
.stream().collect(Collectors.toMap(AttachInfoEntity::getBusinessId, Function.identity()));
|
||||||
|
respList.forEach(resp -> {
|
||||||
|
resp.setReportAttach(attachMap.get(resp.getReportId()));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return respList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 功能描述:查询单条项目日报信息
|
||||||
|
*
|
||||||
|
* @param reportId 项目日报信息Id
|
||||||
|
* @return {@link ProjectDailyReportResp }
|
||||||
|
* @author huise23
|
||||||
|
* @date 2025/07/27 19:51
|
||||||
|
**/
|
||||||
|
@Override
|
||||||
|
public ProjectDailyReportResp selectById(String reportId) {
|
||||||
|
ProjectDailyReportListReq projectDailyReportReq = new ProjectDailyReportListReq();
|
||||||
|
projectDailyReportReq.setReportId(reportId);
|
||||||
|
|
||||||
|
List<ProjectDailyReportResp> list = selectList(projectDailyReportReq);
|
||||||
|
return CollUtil.isNotEmpty(list) ? CollUtil.getFirst(list) : new ProjectDailyReportResp();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 功能描述:新增项目日报信息
|
||||||
|
*
|
||||||
|
* @param projectDailyReportReq 项目日报信息
|
||||||
|
* @author huise23
|
||||||
|
* @date 2025/07/27 19:51
|
||||||
|
**/
|
||||||
|
@Override
|
||||||
|
public void saveData(ProjectDailyReportReq projectDailyReportReq) {
|
||||||
|
ProjectDailyReportResp myToday = myToday(projectDailyReportReq.getProjectId());
|
||||||
|
if (Objects.nonNull(myToday)) {
|
||||||
|
throw new ServiceException(Message.DAILY_REPORT_EXISTS);
|
||||||
|
}
|
||||||
|
ProjectDailyReportEntity entity = BeanUtil.copyProperties(projectDailyReportReq, ProjectDailyReportEntity.class);
|
||||||
|
save(entity);
|
||||||
|
attachInfoService.updateBusinessIdByAttachIds(entity.getReportId(), ListUtil.of(projectDailyReportReq.getReportAttachId()), AttachBusinessTypeEnum.PROJECT_DAILY_REPORT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 功能描述:更新项目日报信息
|
||||||
|
*
|
||||||
|
* @param projectDailyReportReq 项目日报信息
|
||||||
|
* @author huise23
|
||||||
|
* @date 2025/07/27 19:51
|
||||||
|
**/
|
||||||
|
@Override
|
||||||
|
public void updateData(ProjectDailyReportReq projectDailyReportReq) {
|
||||||
|
ProjectDailyReportEntity entity = BeanUtil.copyProperties(projectDailyReportReq, ProjectDailyReportEntity.class);
|
||||||
|
updateById(entity);
|
||||||
|
attachInfoService.updateBusinessIdByAttachIds(entity.getReportId(), ListUtil.of(projectDailyReportReq.getReportAttachId()), AttachBusinessTypeEnum.PROJECT_DAILY_REPORT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 功能描述:删除项目日报信息
|
||||||
|
*
|
||||||
|
* @param reportId 项目日报信息Id
|
||||||
|
* @author huise23
|
||||||
|
* @date 2025/07/27 19:51
|
||||||
|
**/
|
||||||
|
@Override
|
||||||
|
public void deleteById(String reportId) {
|
||||||
|
removeById(reportId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ProjectDailyReportResp myToday(String projectId) {
|
||||||
|
ProjectDailyReportListReq req = new ProjectDailyReportListReq();
|
||||||
|
req.setProjectId(projectId);
|
||||||
|
req.setSubmitUser(StpUtil.getLoginIdAsString());
|
||||||
|
req.setReportDate(LocalDate.now());
|
||||||
|
List<ProjectDailyReportResp> list = selectList(req);
|
||||||
|
if (CollUtil.isNotEmpty(list)){
|
||||||
|
return CollUtil.getFirst(list);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -5,20 +5,20 @@ import cn.hutool.core.util.StrUtil;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import com.dite.znpt.constant.Message;
|
import com.dite.znpt.constant.Message;
|
||||||
import com.dite.znpt.converts.Converts;
|
import com.dite.znpt.converts.Converts;
|
||||||
import com.dite.znpt.domain.entity.UserEntity;
|
|
||||||
import com.dite.znpt.domain.entity.ProjectEntity;
|
import com.dite.znpt.domain.entity.ProjectEntity;
|
||||||
|
import com.dite.znpt.domain.entity.UserEntity;
|
||||||
import com.dite.znpt.domain.vo.ProjectListReq;
|
import com.dite.znpt.domain.vo.ProjectListReq;
|
||||||
import com.dite.znpt.domain.vo.ProjectListResp;
|
import com.dite.znpt.domain.vo.ProjectListResp;
|
||||||
import com.dite.znpt.domain.vo.ProjectReq;
|
import com.dite.znpt.domain.vo.ProjectReq;
|
||||||
import com.dite.znpt.domain.vo.ProjectResp;
|
import com.dite.znpt.domain.vo.ProjectResp;
|
||||||
import com.dite.znpt.enums.ProjectStatusEnum;
|
import com.dite.znpt.enums.ProjectStatusEnum;
|
||||||
import com.dite.znpt.exception.ServiceException;
|
import com.dite.znpt.exception.ServiceException;
|
||||||
import com.dite.znpt.service.UserService;
|
|
||||||
import com.dite.znpt.service.ProjectService;
|
|
||||||
import com.dite.znpt.mapper.ProjectMapper;
|
import com.dite.znpt.mapper.ProjectMapper;
|
||||||
import org.springframework.stereotype.Service;
|
import com.dite.znpt.service.ProjectService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import com.dite.znpt.service.UserService;
|
||||||
import com.dite.znpt.util.PageUtil;
|
import com.dite.znpt.util.PageUtil;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
@ -59,6 +59,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, ProjectEntity
|
||||||
List<ProjectListResp> list= this.baseMapper.queryBySelective(req);
|
List<ProjectListResp> list= this.baseMapper.queryBySelective(req);
|
||||||
list.forEach(resp -> {
|
list.forEach(resp -> {
|
||||||
resp.setStatusLabel(ProjectStatusEnum.getDescByCode(resp.getStatus()));
|
resp.setStatusLabel(ProjectStatusEnum.getDescByCode(resp.getStatus()));
|
||||||
|
// 判断人员类型
|
||||||
});
|
});
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,6 @@ import com.dite.znpt.mapper.ProjectTaskGroupMapper;
|
||||||
import com.dite.znpt.mapper.ProjectTaskMapper;
|
import com.dite.znpt.mapper.ProjectTaskMapper;
|
||||||
import com.dite.znpt.service.AttachInfoService;
|
import com.dite.znpt.service.AttachInfoService;
|
||||||
import com.dite.znpt.service.ProjectTaskService;
|
import com.dite.znpt.service.ProjectTaskService;
|
||||||
import com.dite.znpt.util.PageUtil;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
@ -55,7 +54,7 @@ public class ProjectTaskServiceImpl extends ServiceImpl<ProjectTaskMapper, Proje
|
||||||
List<ProjectTaskResp> projectTaskList = this.baseMapper.queryBySelective(projectTaskReq);
|
List<ProjectTaskResp> projectTaskList = this.baseMapper.queryBySelective(projectTaskReq);
|
||||||
Map<String, List<AttachInfoEntity>> attachMap;
|
Map<String, List<AttachInfoEntity>> attachMap;
|
||||||
if (!BooleanUtil.isTrue(projectTaskReq.getIsExport())) {
|
if (!BooleanUtil.isTrue(projectTaskReq.getIsExport())) {
|
||||||
attachMap = attachInfoService.listByBusinessIds(projectTaskList.stream().map(ProjectTaskResp::getTaskId).collect(Collectors.toList()), null)
|
attachMap = attachInfoService.listByBusinessIds(projectTaskList.stream().map(ProjectTaskResp::getTaskId).collect(Collectors.toList()), AttachBusinessTypeEnum.PROJECT_TASK)
|
||||||
.stream().collect(Collectors.groupingBy(AttachInfoEntity::getBusinessId));
|
.stream().collect(Collectors.groupingBy(AttachInfoEntity::getBusinessId));
|
||||||
} else {
|
} else {
|
||||||
attachMap = new HashMap<>();
|
attachMap = new HashMap<>();
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
package com.dite.znpt.service.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.dite.znpt.domain.entity.RegulationConfirmationEntity;
|
||||||
|
import com.dite.znpt.mapper.RegulationConfirmationMapper;
|
||||||
|
import com.dite.znpt.service.RegulationConfirmationService;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author wangna
|
||||||
|
* @date 2025/07/28
|
||||||
|
* @Description: 制度确认服务实现类
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class RegulationConfirmationServiceImpl extends ServiceImpl<RegulationConfirmationMapper, RegulationConfirmationEntity> implements RegulationConfirmationService {
|
||||||
|
// 继承自ServiceImpl的方法已经足够使用
|
||||||
|
// 包括:save, update, remove, list, page, lambdaQuery等
|
||||||
|
}
|
|
@ -0,0 +1,285 @@
|
||||||
|
package com.dite.znpt.service.impl;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.dite.znpt.domain.Result;
|
||||||
|
import com.dite.znpt.domain.entity.RegulationEntity;
|
||||||
|
import com.dite.znpt.domain.entity.RegulationConfirmationEntity;
|
||||||
|
import com.dite.znpt.domain.vo.UserResp;
|
||||||
|
import com.dite.znpt.mapper.RegulationMapper;
|
||||||
|
import com.dite.znpt.service.RegulationService;
|
||||||
|
import com.dite.znpt.service.RegulationConfirmationService;
|
||||||
|
import com.dite.znpt.service.UserService;
|
||||||
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author wangna
|
||||||
|
* @date 2025/07/29
|
||||||
|
* @Description: 制度规范仓库Service实现类
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class RegulationServiceImpl extends ServiceImpl<RegulationMapper, RegulationEntity> implements RegulationService {
|
||||||
|
|
||||||
|
private final RegulationConfirmationService regulationConfirmationService;
|
||||||
|
private final UserService userService;
|
||||||
|
|
||||||
|
public RegulationServiceImpl(RegulationConfirmationService regulationConfirmationService, UserService userService) {
|
||||||
|
this.regulationConfirmationService = regulationConfirmationService;
|
||||||
|
this.userService = userService;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 每天凌晨1点自动将公示期(10天)已到的已公示制度变为已发布
|
||||||
|
*/
|
||||||
|
@Scheduled(cron = "0 0 1 * * ?")
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void autoPublishApprovedRegulations() {
|
||||||
|
LocalDateTime tenDaysAgo = LocalDateTime.now().minusDays(10);
|
||||||
|
|
||||||
|
// 查询需要自动发布的制度(状态为APPROVED且更新时间超过10天)
|
||||||
|
LambdaQueryWrapper<RegulationEntity> wrapper = new LambdaQueryWrapper<>();
|
||||||
|
wrapper.eq(RegulationEntity::getStatus, "APPROVED");
|
||||||
|
wrapper.le(RegulationEntity::getUpdateTime, tenDaysAgo);
|
||||||
|
wrapper.eq(RegulationEntity::getDelFlag, "0");
|
||||||
|
|
||||||
|
java.util.List<RegulationEntity> approvedRegulations = this.list(wrapper);
|
||||||
|
|
||||||
|
for (RegulationEntity regulation : approvedRegulations) {
|
||||||
|
// 更新制度状态和发布信息
|
||||||
|
regulation.setStatus("PUBLISHED");
|
||||||
|
regulation.setPublishTime(LocalDateTime.now());
|
||||||
|
regulation.setEffectiveTime(LocalDateTime.now()); // 设置生效时间为当前时间
|
||||||
|
regulation.setUpdateTime(LocalDateTime.now());
|
||||||
|
regulation.setUpdateBy("系统自动发布");
|
||||||
|
|
||||||
|
this.updateById(regulation);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!approvedRegulations.isEmpty()) {
|
||||||
|
System.out.println("自动发布完成,共发布 " + approvedRegulations.size() + " 个制度");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(readOnly = true)
|
||||||
|
public Result getRegulationList(Integer page, Integer pageSize, String status, String type, String title, String proposer) {
|
||||||
|
try {
|
||||||
|
Page<RegulationEntity> pageParam = new Page<>(page, pageSize);
|
||||||
|
|
||||||
|
// 使用关联查询获取创建人姓名
|
||||||
|
Page<RegulationEntity> result = this.baseMapper.selectRegulationListWithCreator(pageParam, status, type, title, proposer);
|
||||||
|
|
||||||
|
// 如果是获取已发布的制度,需要添加确认状态
|
||||||
|
if (status != null && "PUBLISHED".equals(status)) {
|
||||||
|
String userId = StpUtil.getLoginIdAsString();
|
||||||
|
java.util.List<String> confirmedIds = regulationConfirmationService.lambdaQuery()
|
||||||
|
.eq(RegulationConfirmationEntity::getConfirmerId, userId)
|
||||||
|
.eq(RegulationConfirmationEntity::getStatus, "CONFIRMED")
|
||||||
|
.eq(RegulationConfirmationEntity::getDelFlag, "0")
|
||||||
|
.list()
|
||||||
|
.stream()
|
||||||
|
.map(RegulationConfirmationEntity::getRegulationId)
|
||||||
|
.toList();
|
||||||
|
for (RegulationEntity reg : result.getRecords()) {
|
||||||
|
reg.setConfirmStatus(confirmedIds.contains(reg.getRegulationId()) ? "confirmed" : "pending");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Result.ok(result);
|
||||||
|
} catch (Exception e) {
|
||||||
|
return Result.error("获取制度列表失败:" + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public Result createRegulationProposal(RegulationEntity regulation) {
|
||||||
|
try {
|
||||||
|
regulation.setRegulationId(java.util.UUID.randomUUID().toString());
|
||||||
|
regulation.setStatus("DRAFT");
|
||||||
|
regulation.setCreateTime(LocalDateTime.now());
|
||||||
|
|
||||||
|
String userId = StpUtil.getLoginIdAsString();
|
||||||
|
regulation.setCreateBy(userId);
|
||||||
|
regulation.setUpdateTime(LocalDateTime.now());
|
||||||
|
regulation.setUpdateBy(userId);
|
||||||
|
regulation.setDelFlag("0");
|
||||||
|
|
||||||
|
this.save(regulation);
|
||||||
|
return Result.okM("制度提案创建成功");
|
||||||
|
} catch (Exception e) {
|
||||||
|
return Result.error("制度提案创建失败:" + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public Result updateRegulationProposal(RegulationEntity regulation) {
|
||||||
|
try {
|
||||||
|
RegulationEntity existing = this.getById(regulation.getRegulationId());
|
||||||
|
if (existing == null) {
|
||||||
|
return Result.error("制度提案不存在");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 只能更新DRAFT状态的提案
|
||||||
|
if (!"DRAFT".equals(existing.getStatus())) {
|
||||||
|
return Result.error("只能更新草稿状态的制度提案");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 只能由创建人更新
|
||||||
|
if (!existing.getCreateBy().equals(StpUtil.getLoginIdAsString())) {
|
||||||
|
return Result.error("只能更新自己创建的制度提案");
|
||||||
|
}
|
||||||
|
|
||||||
|
String userId = StpUtil.getLoginIdAsString();
|
||||||
|
|
||||||
|
regulation.setUpdateTime(LocalDateTime.now());
|
||||||
|
regulation.setUpdateBy(userId);
|
||||||
|
regulation.setStatus("DRAFT"); // 确保状态保持为DRAFT
|
||||||
|
|
||||||
|
this.updateById(regulation);
|
||||||
|
return Result.okM("制度提案更新成功");
|
||||||
|
} catch (Exception e) {
|
||||||
|
return Result.error("制度提案更新失败:" + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public Result deleteRegulationProposal(String regulationId) {
|
||||||
|
try {
|
||||||
|
RegulationEntity regulation = this.getById(regulationId);
|
||||||
|
if (regulation == null) {
|
||||||
|
return Result.error("制度提案不存在");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 只能删除DRAFT状态的提案
|
||||||
|
if (!"DRAFT".equals(regulation.getStatus())) {
|
||||||
|
return Result.error("只能删除草稿状态的制度提案");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 只能由创建人删除
|
||||||
|
if (!regulation.getCreateBy().equals(StpUtil.getLoginIdAsString())) {
|
||||||
|
return Result.error("只能删除自己创建的制度提案");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 软删除
|
||||||
|
regulation.setDelFlag("1");
|
||||||
|
regulation.setUpdateTime(LocalDateTime.now());
|
||||||
|
regulation.setUpdateBy(StpUtil.getLoginIdAsString());
|
||||||
|
|
||||||
|
this.updateById(regulation);
|
||||||
|
return Result.okM("制度提案删除成功");
|
||||||
|
} catch (Exception e) {
|
||||||
|
return Result.error("制度提案删除失败:" + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(readOnly = true)
|
||||||
|
public Result getRegulationDetail(String regulationId) {
|
||||||
|
try {
|
||||||
|
RegulationEntity regulation = this.getById(regulationId);
|
||||||
|
if (regulation == null) {
|
||||||
|
return Result.error("制度不存在");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取创建人姓名
|
||||||
|
if (regulation.getCreateBy() != null && !regulation.getCreateBy().isEmpty()) {
|
||||||
|
try {
|
||||||
|
UserResp user = userService.detail(regulation.getCreateBy());
|
||||||
|
if (user != null) {
|
||||||
|
regulation.setCreateByName(user.getName());
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 如果查询失败,使用用户ID作为备选
|
||||||
|
regulation.setCreateByName(regulation.getCreateBy());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Result.ok(regulation);
|
||||||
|
} catch (Exception e) {
|
||||||
|
return Result.error("获取制度详情失败:" + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public Result confirmRegulation(String regulationId) {
|
||||||
|
try {
|
||||||
|
RegulationEntity regulation = this.getById(regulationId);
|
||||||
|
if (regulation == null) {
|
||||||
|
return Result.error("制度不存在");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查是否已经确认过
|
||||||
|
RegulationConfirmationEntity existingConfirmation = regulationConfirmationService.lambdaQuery()
|
||||||
|
.eq(RegulationConfirmationEntity::getRegulationId, regulationId)
|
||||||
|
.eq(RegulationConfirmationEntity::getConfirmerId, StpUtil.getLoginIdAsString())
|
||||||
|
.eq(RegulationConfirmationEntity::getDelFlag, "0")
|
||||||
|
.one();
|
||||||
|
|
||||||
|
if (existingConfirmation != null) {
|
||||||
|
return Result.error("您已经确认过该制度");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建确认记录
|
||||||
|
RegulationConfirmationEntity confirmation = new RegulationConfirmationEntity();
|
||||||
|
confirmation.setConfirmationId(java.util.UUID.randomUUID().toString());
|
||||||
|
confirmation.setRegulationId(regulationId);
|
||||||
|
confirmation.setConfirmerId(StpUtil.getLoginIdAsString());
|
||||||
|
|
||||||
|
UserResp user = userService.detail(StpUtil.getLoginIdAsString());
|
||||||
|
if (user != null) {
|
||||||
|
confirmation.setConfirmerName(user.getName());
|
||||||
|
confirmation.setConfirmerDept(user.getDeptName());
|
||||||
|
}
|
||||||
|
|
||||||
|
confirmation.setStatus("CONFIRMED");
|
||||||
|
confirmation.setConfirmTime(LocalDateTime.now());
|
||||||
|
confirmation.setDelFlag("0");
|
||||||
|
|
||||||
|
regulationConfirmationService.save(confirmation);
|
||||||
|
return Result.okM("制度确认成功");
|
||||||
|
} catch (Exception e) {
|
||||||
|
return Result.error("制度确认失败:" + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public Result approveRegulation(String regulationId) {
|
||||||
|
try {
|
||||||
|
RegulationEntity regulation = this.getById(regulationId);
|
||||||
|
if (regulation == null) {
|
||||||
|
return Result.error("制度不存在");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查制度状态,只有DRAFT状态的制度才能公示
|
||||||
|
if (!"DRAFT".equals(regulation.getStatus())) {
|
||||||
|
return Result.error("只能公示草稿状态的制度");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查权限,只有创建人才能公示
|
||||||
|
if (!regulation.getCreateBy().equals(StpUtil.getLoginIdAsString())) {
|
||||||
|
return Result.error("只能公示自己创建的制度");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新制度状态为已公示
|
||||||
|
regulation.setStatus("APPROVED");
|
||||||
|
regulation.setUpdateTime(LocalDateTime.now());
|
||||||
|
regulation.setUpdateBy(StpUtil.getLoginIdAsString());
|
||||||
|
|
||||||
|
this.updateById(regulation);
|
||||||
|
return Result.okM("制度公示成功");
|
||||||
|
} catch (Exception e) {
|
||||||
|
return Result.error("制度公示失败:" + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,127 @@
|
||||||
|
package com.dite.znpt.service.impl;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.dite.znpt.domain.Result;
|
||||||
|
import com.dite.znpt.domain.entity.RegulationEntity;
|
||||||
|
import com.dite.znpt.domain.entity.RegulationTypeEntity;
|
||||||
|
import com.dite.znpt.mapper.RegulationMapper;
|
||||||
|
import com.dite.znpt.mapper.RegulationTypeMapper;
|
||||||
|
import com.dite.znpt.service.RegulationTypeService;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 制度类型Service实现类
|
||||||
|
* @author wangna
|
||||||
|
* @date 2025/07/29
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class RegulationTypeServiceImpl extends ServiceImpl<RegulationTypeMapper, RegulationTypeEntity> implements RegulationTypeService {
|
||||||
|
|
||||||
|
private final RegulationMapper regulationMapper;
|
||||||
|
|
||||||
|
public RegulationTypeServiceImpl(RegulationMapper regulationMapper) {
|
||||||
|
this.regulationMapper = regulationMapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(readOnly = true)
|
||||||
|
public Result getRegulationTypes(Integer page, Integer size, String typeName, String status, String remark) {
|
||||||
|
try {
|
||||||
|
Page<RegulationTypeEntity> pageParam = new Page<>(page, size);
|
||||||
|
|
||||||
|
// 使用连表查询获取创建人姓名
|
||||||
|
Page<RegulationTypeEntity> result = this.baseMapper.selectRegulationTypeListWithCreator(pageParam, typeName, status, remark);
|
||||||
|
|
||||||
|
return Result.ok(result);
|
||||||
|
} catch (Exception e) {
|
||||||
|
return Result.error("获取制度类型列表失败:" + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public Result createRegulationType(RegulationTypeEntity regulationType) {
|
||||||
|
try {
|
||||||
|
regulationType.setTypeId(java.util.UUID.randomUUID().toString());
|
||||||
|
regulationType.setCreateTime(LocalDateTime.now());
|
||||||
|
String userId = StpUtil.getLoginIdAsString();
|
||||||
|
regulationType.setCreateBy(userId);
|
||||||
|
regulationType.setUpdateTime(LocalDateTime.now());
|
||||||
|
regulationType.setUpdateBy(userId);
|
||||||
|
regulationType.setDelFlag("0");
|
||||||
|
|
||||||
|
// 如果没有设置排序顺序,设置为当前最大值+1
|
||||||
|
if (regulationType.getSortOrder() == null) {
|
||||||
|
Integer maxSortOrder = this.lambdaQuery()
|
||||||
|
.eq(RegulationTypeEntity::getDelFlag, "0")
|
||||||
|
.orderByDesc(RegulationTypeEntity::getSortOrder)
|
||||||
|
.last("LIMIT 1")
|
||||||
|
.oneOpt()
|
||||||
|
.map(RegulationTypeEntity::getSortOrder)
|
||||||
|
.orElse(0);
|
||||||
|
regulationType.setSortOrder(maxSortOrder + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.save(regulationType);
|
||||||
|
return Result.okM("制度类型创建成功");
|
||||||
|
} catch (Exception e) {
|
||||||
|
return Result.error("制度类型创建失败:" + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public Result updateRegulationType(RegulationTypeEntity regulationType) {
|
||||||
|
try {
|
||||||
|
RegulationTypeEntity existing = this.getById(regulationType.getTypeId());
|
||||||
|
if (existing == null) {
|
||||||
|
return Result.error("制度类型不存在");
|
||||||
|
}
|
||||||
|
|
||||||
|
regulationType.setUpdateTime(LocalDateTime.now());
|
||||||
|
regulationType.setUpdateBy(cn.dev33.satoken.stp.StpUtil.getLoginIdAsString());
|
||||||
|
|
||||||
|
this.updateById(regulationType);
|
||||||
|
return Result.okM("制度类型更新成功");
|
||||||
|
} catch (Exception e) {
|
||||||
|
return Result.error("制度类型更新失败:" + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public Result deleteRegulationType(String typeId) {
|
||||||
|
try {
|
||||||
|
RegulationTypeEntity regulationType = this.getById(typeId);
|
||||||
|
if (regulationType == null) {
|
||||||
|
return Result.error("制度类型不存在");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查是否有制度使用此类型
|
||||||
|
String typeName = regulationType.getTypeName();
|
||||||
|
|
||||||
|
// 检查制度表中是否有使用此类型的记录(包括所有状态)
|
||||||
|
long regulationCount = regulationMapper.selectCount(
|
||||||
|
new LambdaQueryWrapper<RegulationEntity>()
|
||||||
|
.eq(RegulationEntity::getRegulationType, typeName)
|
||||||
|
.eq(RegulationEntity::getDelFlag, "0")
|
||||||
|
);
|
||||||
|
// 如果有制度使用此类型,则不允许删除
|
||||||
|
if (regulationCount > 0) {
|
||||||
|
return Result.error("该制度类型正在被使用,无法删除。请先删除或修改使用该类型的制度。");
|
||||||
|
}
|
||||||
|
|
||||||
|
regulationType.setDelFlag("1");
|
||||||
|
this.updateById(regulationType);
|
||||||
|
return Result.okM("制度类型删除成功");
|
||||||
|
} catch (Exception e) {
|
||||||
|
return Result.error("制度类型删除失败:" + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -107,6 +107,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, UserEntity> impleme
|
||||||
UserEntity entity = this.getById(userId);
|
UserEntity entity = this.getById(userId);
|
||||||
UserResp userResp= Converts.INSTANCE.toUserResp(entity);
|
UserResp userResp= Converts.INSTANCE.toUserResp(entity);
|
||||||
if(StrUtil.isNotBlank(userResp.getDeptId())){
|
if(StrUtil.isNotBlank(userResp.getDeptId())){
|
||||||
|
userResp.setUserName(entity.getName());
|
||||||
userResp.setDeptName(deptService.getById(userResp.getDeptId()).getDeptName());
|
userResp.setDeptName(deptService.getById(userResp.getDeptId()).getDeptName());
|
||||||
}
|
}
|
||||||
userResp.setUserTypeLabel(UserTypeEnum.getDescByCode(userResp.getUserType()));
|
userResp.setUserTypeLabel(UserTypeEnum.getDescByCode(userResp.getUserType()));
|
||||||
|
@ -252,4 +253,6 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, UserEntity> impleme
|
||||||
entity.setDelFlag(Constants.DEL_FLAG_1);
|
entity.setDelFlag(Constants.DEL_FLAG_1);
|
||||||
this.updateById(entity);
|
this.updateById(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
<?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="com.dite.znpt.mapper.BusinessDataFileMapper">
|
|
||||||
<select id="List" resultType="com.dite.znpt.domain.entity.BusinessDataFileEntity">
|
|
||||||
select * from business_data_part_file
|
|
||||||
<where>
|
|
||||||
<if test="param1 != null">
|
|
||||||
and folder_id = #{param1}
|
|
||||||
</if>
|
|
||||||
<if test="param2 != null and param2 != ''">
|
|
||||||
and file_name = #{param2}
|
|
||||||
</if>
|
|
||||||
</where>
|
|
||||||
</select>
|
|
||||||
<delete id="delete" parameterType="com.dite.znpt.domain.entity.BusinessDataFileEntity" >
|
|
||||||
delete from business_data_part_file
|
|
||||||
<where>
|
|
||||||
<if test="fileId != null">
|
|
||||||
and file_id = #{fileId}
|
|
||||||
</if>
|
|
||||||
<if test="folderId != null ">
|
|
||||||
and folder_id = #{folderId}
|
|
||||||
</if>
|
|
||||||
|
|
||||||
</where>
|
|
||||||
|
|
||||||
</delete>
|
|
||||||
<insert id="add" parameterType="com.dite.znpt.domain.entity.BusinessDataFileEntity">
|
|
||||||
insert into business_data_part_file (file_id, folder_id, file_name, file_path, file_type, file_size, upload_time, uploader_id, is_deleted)
|
|
||||||
values (#{fileId}, #{folderId}, #{fileName}, #{filePath}, #{fileType}, #{fileSize}, #{uploadTime}, #{uploaderId}, #{isDeleted})
|
|
||||||
</insert>
|
|
||||||
<select id="getPath" parameterType="java.lang.Long" resultType="java.lang.String">
|
|
||||||
select file_path from business_data_part_file
|
|
||||||
<where>
|
|
||||||
<if test="fileId != null">
|
|
||||||
and file_id = #{param1}
|
|
||||||
</if>
|
|
||||||
</where>
|
|
||||||
</select>
|
|
||||||
</mapper>
|
|
||||||
|
|
|
@ -1,47 +0,0 @@
|
||||||
<?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="com.dite.znpt.mapper.BusinessDataMapper">
|
|
||||||
<insert id="insert" parameterType="com.dite.znpt.domain.entity.BusinessDataEntity">
|
|
||||||
insert into business_data_part
|
|
||||||
<trim prefix="(" suffix=")" suffixOverrides=",">
|
|
||||||
<if test="folderName != null">folder_name,</if>
|
|
||||||
<if test="parentId != null">parent_id,</if>
|
|
||||||
<if test="creatorId != null">creator_id,</if>
|
|
||||||
<if test="createTime != null">create_time,</if>
|
|
||||||
<if test="updateTime != null">update_time,</if>
|
|
||||||
<if test="isDeleted != null">is_deleted,</if>
|
|
||||||
<if test="folderPath != null">folder_path,</if>
|
|
||||||
</trim>
|
|
||||||
<trim prefix="values (" suffix=")" suffixOverrides=",">
|
|
||||||
<if test="folderName != null">#{folderName},</if>
|
|
||||||
<if test="parentId != null">#{parentId},</if>
|
|
||||||
<if test="creatorId != null">#{creatorId},</if>
|
|
||||||
<if test="createTime != null">#{createTime},</if>
|
|
||||||
<if test="updateTime != null">#{updateTime},</if>
|
|
||||||
<if test="isDeleted != null">#{isDeleted},</if>
|
|
||||||
<if test="folderPath != null">#{folderPath},</if>
|
|
||||||
</trim>
|
|
||||||
</insert>
|
|
||||||
|
|
||||||
<select id="List" resultType="com.dite.znpt.domain.entity.BusinessDataEntity">
|
|
||||||
select * from business_data_part
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<select id="getPath" resultType="java.lang.String">
|
|
||||||
select folder_path from business_data_part where folder_id = #{parentId}
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<delete id="delete">
|
|
||||||
delete from business_data_part where folder_id = #{folderId}
|
|
||||||
</delete>
|
|
||||||
<update id="reName">
|
|
||||||
update business_data_part
|
|
||||||
<set>
|
|
||||||
<if test="folderName != null">folder_name = #{folderName},</if>
|
|
||||||
<if test="updateTime != null">update_time = #{updateTime},</if>
|
|
||||||
<if test="folderPath != null">folder_path = #{folderPath},</if>
|
|
||||||
</set>
|
|
||||||
where folder_id = #{folderId}
|
|
||||||
</update>
|
|
||||||
</mapper>
|
|
||||||
|
|
|
@ -20,6 +20,9 @@
|
||||||
<if test="partId != null and partId != ''">
|
<if test="partId != null and partId != ''">
|
||||||
AND p.part_id = #{partId}
|
AND p.part_id = #{partId}
|
||||||
</if>
|
</if>
|
||||||
|
<if test="projectId != null and projectId != ''">
|
||||||
|
AND i.project_id = #{projectId}
|
||||||
|
</if>
|
||||||
<if test="imageTypes != null and imageTypes.length > 0">
|
<if test="imageTypes != null and imageTypes.length > 0">
|
||||||
AND i.image_type in <foreach collection="imageTypes" item="imageType" open="(" close=")" separator=",">#{imageType}</foreach>
|
AND i.image_type in <foreach collection="imageTypes" item="imageType" open="(" close=")" separator=",">#{imageType}</foreach>
|
||||||
</if>
|
</if>
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
<?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="com.dite.znpt.mapper.ProjectDailyReportMapper">
|
||||||
|
|
||||||
|
<sql id="Base_Column_List">
|
||||||
|
a.report_id, a.project_id, a.report_date, a.submit_user,
|
||||||
|
a.update_by, a.create_time, a.create_by, a.update_time
|
||||||
|
</sql>
|
||||||
|
|
||||||
|
<select id="queryBySelective" resultType="com.dite.znpt.domain.vo.ProjectDailyReportResp">
|
||||||
|
select
|
||||||
|
<include refid="Base_Column_List"/>
|
||||||
|
from project_daily_report a
|
||||||
|
<where>
|
||||||
|
<if test="reportId != null and reportId != ''">
|
||||||
|
and a.report_id like concat ('%', #{reportId}, '%')
|
||||||
|
</if>
|
||||||
|
<if test="projectId != null and projectId != ''">
|
||||||
|
and a.project_id like concat ('%', #{projectId}, '%')
|
||||||
|
</if>
|
||||||
|
<if test="reportDate != null">
|
||||||
|
and a.report_date = #{reportDate}
|
||||||
|
</if>
|
||||||
|
<if test="submitUser != null and submitUser != ''">
|
||||||
|
and a.submit_user like concat ('%', #{submitUser}, '%')
|
||||||
|
</if>
|
||||||
|
</where>
|
||||||
|
</select>
|
||||||
|
</mapper>
|
||||||
|
|
|
@ -2,23 +2,27 @@
|
||||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
<mapper namespace="com.dite.znpt.mapper.ProjectMapper">
|
<mapper namespace="com.dite.znpt.mapper.ProjectMapper">
|
||||||
<select id="queryBySelective" resultType="com.dite.znpt.domain.vo.ProjectListResp">
|
<select id="queryBySelective" resultType="com.dite.znpt.domain.vo.ProjectListResp">
|
||||||
with taskProgress as (
|
with taskProgress as (SELECT count(1) task_count,
|
||||||
SELECT
|
sum(status = 0) taskPendingCount,
|
||||||
count(1) task_count,
|
sum(status = 1) task_progress_count,
|
||||||
sum(status=0) taskPendingCount,
|
sum(status = 2) task_complete_count,
|
||||||
sum(status=1) task_progress_count,
|
project_id
|
||||||
sum(status=2) task_complete_count,
|
FROM project_task
|
||||||
project_id
|
group by project_id),
|
||||||
FROM project_task
|
constructor as (
|
||||||
group by project_id
|
select project_id, GROUP_CONCAT(DISTINCT con.name) AS constructor_name
|
||||||
|
FROM project prj
|
||||||
|
LEFT JOIN user con ON FIND_IN_SET(con.user_id,prj.constructor_ids) > 0 AND con.del_flag = '0'
|
||||||
|
GROUP BY prj.project_id
|
||||||
)
|
)
|
||||||
SELECT
|
SELECT
|
||||||
prj.project_id, prj.project_name, prj.farm_name, prj.status, prj.cover_url, prj.farm_address, prj.client, prj.client_contact, prj.client_phone, prj.inspection_unit,
|
prj.project_id, prj.project_name, prj.farm_name, prj.status, prj.cover_url, prj.farm_address, prj.client, prj.client_contact, prj.client_phone, prj.inspection_unit,
|
||||||
prj.inspection_contact, prj.inspection_phone, prj.scale, prj.turbine_model, prj.project_manager_id, pm.name AS project_manager_name, prj.constructor_ids,
|
prj.inspection_contact, prj.inspection_phone, prj.scale, prj.turbine_model, prj.project_manager_id, pm.name AS project_manager_name, prj.constructor_ids,
|
||||||
GROUP_CONCAT(DISTINCT con.name) AS constructor_name, prj.start_date, prj.end_date, tp.taskPendingCount, tp.task_progress_count, tp.task_complete_count, tp.task_count
|
prj.start_date, prj.end_date, con.constructor_name, tp.taskPendingCount, tp.task_progress_count, tp.task_complete_count, tp.task_count, prj.auditor_id,
|
||||||
|
prj.construct_team_leader_id, prj.quality_officer_id
|
||||||
FROM project prj
|
FROM project prj
|
||||||
LEFT JOIN user pm ON pm.user_id = prj.project_manager_id
|
LEFT JOIN user pm ON pm.user_id = prj.project_manager_id
|
||||||
LEFT JOIN user con ON FIND_IN_SET(con.user_id,prj.constructor_ids) > 0 AND con.del_flag = '0'
|
LEFT JOIN constructor con on prj.project_id = con.project_id
|
||||||
left join taskProgress tp on prj.project_id = tp.project_id
|
left join taskProgress tp on prj.project_id = tp.project_id
|
||||||
<where>
|
<where>
|
||||||
<if test="projectName != null and projectName != ''">
|
<if test="projectName != null and projectName != ''">
|
||||||
|
@ -48,9 +52,6 @@
|
||||||
or prj.constructor_ids like concat('%', #{userId},'%'))
|
or prj.constructor_ids like concat('%', #{userId},'%'))
|
||||||
</if>
|
</if>
|
||||||
</where>
|
</where>
|
||||||
GROUP BY prj.project_id, prj.project_name, prj.farm_name, prj.status, prj.cover_url, prj.farm_address, prj.client, prj.client_contact, prj.client_phone, prj.inspection_unit,
|
|
||||||
prj.inspection_contact, prj.inspection_phone, prj.scale, prj.turbine_model, prj.project_manager_id, pm.name, prj.constructor_ids,
|
|
||||||
prj.start_date, prj.end_date, tp.taskPendingCount, tp.task_progress_count, tp.task_complete_count, tp.task_count
|
|
||||||
</select>
|
</select>
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,459 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>AES加密解密工具</title>
|
||||||
|
<script src="https://cdn.tailwindcss.com"></script>
|
||||||
|
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css" rel="stylesheet">
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
|
||||||
|
<script>
|
||||||
|
tailwind.config = {
|
||||||
|
theme: {
|
||||||
|
extend: {
|
||||||
|
colors: {
|
||||||
|
primary: '#3b82f6',
|
||||||
|
secondary: '#10b981',
|
||||||
|
accent: '#6366f1',
|
||||||
|
dark: '#1e293b',
|
||||||
|
light: '#f8fafc'
|
||||||
|
},
|
||||||
|
fontFamily: {
|
||||||
|
inter: ['Inter', 'system-ui', 'sans-serif'],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style type="text/tailwindcss">
|
||||||
|
@layer utilities {
|
||||||
|
.content-auto {
|
||||||
|
content-visibility: auto;
|
||||||
|
}
|
||||||
|
.text-shadow {
|
||||||
|
text-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
||||||
|
}
|
||||||
|
.card-shadow {
|
||||||
|
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
|
||||||
|
}
|
||||||
|
.transition-custom {
|
||||||
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body class="font-inter bg-gradient-to-br from-light to-blue-50 min-h-screen">
|
||||||
|
<div class="container mx-auto px-4 py-8 max-w-5xl">
|
||||||
|
<!-- 标题区域 -->
|
||||||
|
<header class="mb-12 text-center">
|
||||||
|
<h1 class="text-[clamp(2rem,5vw,3.5rem)] font-bold text-dark mb-3 text-shadow">
|
||||||
|
<i class="fa-solid fa-lock text-primary mr-3"></i>AES加密解密工具
|
||||||
|
</h1>
|
||||||
|
<p class="text-gray-600 text-lg max-w-2xl mx-auto">
|
||||||
|
使用先进的AES加密算法保护您的数据安全,支持多种加密模式和密钥长度
|
||||||
|
</p>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<!-- 主内容区 -->
|
||||||
|
<main class="grid grid-cols-1 lg:grid-cols-2 gap-8">
|
||||||
|
<!-- 加密区域 -->
|
||||||
|
<section class="bg-white rounded-2xl p-6 card-shadow transition-custom hover:shadow-xl">
|
||||||
|
<h2 class="text-2xl font-bold text-dark mb-6 flex items-center">
|
||||||
|
<i class="fa-solid fa-shield-lock text-primary mr-2"></i>加密
|
||||||
|
</h2>
|
||||||
|
<div class="space-y-4">
|
||||||
|
<div>
|
||||||
|
<label for="plaintext" class="block text-sm font-medium text-gray-700 mb-1">明文</label>
|
||||||
|
<textarea id="plaintext" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:ring-2 focus:ring-primary/50 focus:border-primary transition-custom resize-none" rows="4" placeholder="请输入要加密的文本..."></textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label for="encrypt-key" class="block text-sm font-medium text-gray-700 mb-1">密钥</label>
|
||||||
|
<div class="relative">
|
||||||
|
<input type="text" id="encrypt-key" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:ring-2 focus:ring-primary/50 focus:border-primary transition-custom" placeholder="请输入16/24/32字节密钥..." value="1234567890123456">
|
||||||
|
<button type="button" id="generate-key" class="absolute right-2 top-1/2 -translate-y-1/2 text-primary hover:text-primary/80 transition-custom">
|
||||||
|
<i class="fa-solid fa-refresh"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label class="block text-sm font-medium text-gray-700 mb-1">加密选项</label>
|
||||||
|
<div class="grid grid-cols-2 gap-4">
|
||||||
|
<div>
|
||||||
|
<label for="encrypt-mode" class="block text-xs text-gray-500 mb-1">加密模式</label>
|
||||||
|
<select id="encrypt-mode" class="w-full px-3 py-2 rounded-lg border border-gray-300 focus:ring-2 focus:ring-primary/50 focus:border-primary transition-custom">
|
||||||
|
<option value="ECB">ECB</option>
|
||||||
|
<option value="CBC">CBC</option>
|
||||||
|
<option value="CFB">CFB</option>
|
||||||
|
<option value="OFB">OFB</option>
|
||||||
|
<option value="CTR">CTR</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="encrypt-padding" class="block text-xs text-gray-500 mb-1">填充方式</label>
|
||||||
|
<select id="encrypt-padding" class="w-full px-3 py-2 rounded-lg border border-gray-300 focus:ring-2 focus:ring-primary/50 focus:border-primary transition-custom">
|
||||||
|
<option value="Pkcs7">PKCS#7</option>
|
||||||
|
<option value="Iso97971">ISO 9797-1</option>
|
||||||
|
<option value="AnsiX923">ANSI X.923</option>
|
||||||
|
<option value="Iso10126">ISO 10126</option>
|
||||||
|
<option value="ZeroPadding">Zero Padding</option>
|
||||||
|
<option value="NoPadding">No Padding</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="iv-container" class="hidden">
|
||||||
|
<label for="encrypt-iv" class="block text-sm font-medium text-gray-700 mb-1">初始化向量(IV)</label>
|
||||||
|
<input type="text" id="encrypt-iv" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:ring-2 focus:ring-primary/50 focus:border-primary transition-custom" placeholder="请输入16字节初始化向量...">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button id="encrypt-btn" class="w-full bg-primary hover:bg-primary/90 text-white font-medium py-3 px-4 rounded-lg transition-custom transform hover:scale-[1.02] flex items-center justify-center">
|
||||||
|
<i class="fa-solid fa-lock mr-2"></i>加密
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- 解密区域 -->
|
||||||
|
<section class="bg-white rounded-2xl p-6 card-shadow transition-custom hover:shadow-xl">
|
||||||
|
<h2 class="text-2xl font-bold text-dark mb-6 flex items-center">
|
||||||
|
<i class="fa-solid fa-unlock text-secondary mr-2"></i>解密
|
||||||
|
</h2>
|
||||||
|
<div class="space-y-4">
|
||||||
|
<div>
|
||||||
|
<label for="ciphertext" class="block text-sm font-medium text-gray-700 mb-1">密文</label>
|
||||||
|
<textarea id="ciphertext" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:ring-2 focus:ring-secondary/50 focus:border-secondary transition-custom resize-none" rows="4" placeholder="请输入要解密的文本..."></textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label for="decrypt-key" class="block text-sm font-medium text-gray-700 mb-1">密钥</label>
|
||||||
|
<input type="text" id="decrypt-key" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:ring-2 focus:ring-secondary/50 focus:border-secondary transition-custom" placeholder="请输入16/24/32字节密钥..." value="1234567890123456">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label class="block text-sm font-medium text-gray-700 mb-1">解密选项</label>
|
||||||
|
<div class="grid grid-cols-2 gap-4">
|
||||||
|
<div>
|
||||||
|
<label for="decrypt-mode" class="block text-xs text-gray-500 mb-1">解密模式</label>
|
||||||
|
<select id="decrypt-mode" class="w-full px-3 py-2 rounded-lg border border-gray-300 focus:ring-2 focus:ring-secondary/50 focus:border-secondary transition-custom">
|
||||||
|
<option value="ECB">ECB</option>
|
||||||
|
<option value="CBC">CBC</option>
|
||||||
|
<option value="CFB">CFB</option>
|
||||||
|
<option value="OFB">OFB</option>
|
||||||
|
<option value="CTR">CTR</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="decrypt-padding" class="block text-xs text-gray-500 mb-1">填充方式</label>
|
||||||
|
<select id="decrypt-padding" class="w-full px-3 py-2 rounded-lg border border-gray-300 focus:ring-2 focus:ring-secondary/50 focus:border-secondary transition-custom">
|
||||||
|
<option value="Pkcs7">PKCS#7</option>
|
||||||
|
<option value="Iso97971">ISO 9797-1</option>
|
||||||
|
<option value="AnsiX923">ANSI X.923</option>
|
||||||
|
<option value="Iso10126">ISO 10126</option>
|
||||||
|
<option value="ZeroPadding">Zero Padding</option>
|
||||||
|
<option value="NoPadding">No Padding</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="decrypt-iv-container" class="hidden">
|
||||||
|
<label for="decrypt-iv" class="block text-sm font-medium text-gray-700 mb-1">初始化向量(IV)</label>
|
||||||
|
<input type="text" id="decrypt-iv" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:ring-2 focus:ring-secondary/50 focus:border-secondary transition-custom" placeholder="请输入16字节初始化向量...">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button id="decrypt-btn" class="w-full bg-secondary hover:bg-secondary/90 text-white font-medium py-3 px-4 rounded-lg transition-custom transform hover:scale-[1.02] flex items-center justify-center">
|
||||||
|
<i class="fa-solid fa-unlock mr-2"></i>解密
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<!-- 结果展示区 -->
|
||||||
|
<section class="mt-8 bg-white rounded-2xl p-6 card-shadow">
|
||||||
|
<h2 class="text-2xl font-bold text-dark mb-4 flex items-center">
|
||||||
|
<i class="fa-solid fa-file-text text-accent mr-2"></i>结果
|
||||||
|
</h2>
|
||||||
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||||
|
<div>
|
||||||
|
<label class="block text-sm font-medium text-gray-700 mb-1">加密结果</label>
|
||||||
|
<div class="relative">
|
||||||
|
<textarea id="encrypt-result" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:ring-2 focus:ring-accent/50 focus:border-accent transition-custom resize-none" rows="4" readonly placeholder="加密结果将显示在这里..."></textarea>
|
||||||
|
<button id="copy-encrypt" class="absolute right-2 top-2 text-gray-500 hover:text-accent transition-custom">
|
||||||
|
<i class="fa-solid fa-copy"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label class="block text-sm font-medium text-gray-700 mb-1">解密结果</label>
|
||||||
|
<div class="relative">
|
||||||
|
<textarea id="decrypt-result" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:ring-2 focus:ring-accent/50 focus:border-accent transition-custom resize-none" rows="4" readonly placeholder="解密结果将显示在这里..."></textarea>
|
||||||
|
<button id="copy-decrypt" class="absolute right-2 top-2 text-gray-500 hover:text-accent transition-custom">
|
||||||
|
<i class="fa-solid fa-copy"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- 信息提示区 -->
|
||||||
|
<div id="notification" class="fixed bottom-4 right-4 bg-dark text-white px-6 py-3 rounded-lg shadow-lg transform translate-y-20 opacity-0 transition-all duration-300 flex items-center">
|
||||||
|
<i id="notification-icon" class="fa-solid fa-info-circle mr-2"></i>
|
||||||
|
<span id="notification-message">操作成功</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// 加密函数
|
||||||
|
function encrypt() {
|
||||||
|
const plaintext = document.getElementById('plaintext').value.trim();
|
||||||
|
const key = document.getElementById('encrypt-key').value.trim();
|
||||||
|
const mode = document.getElementById('encrypt-mode').value;
|
||||||
|
const padding = document.getElementById('encrypt-padding').value;
|
||||||
|
const iv = document.getElementById('encrypt-iv').value.trim();
|
||||||
|
|
||||||
|
if (!plaintext) {
|
||||||
|
showNotification('请输入明文', 'error');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!key) {
|
||||||
|
showNotification('请输入密钥', 'error');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 获取加密模式
|
||||||
|
const modeObj = getModeObject(mode);
|
||||||
|
|
||||||
|
// 获取填充方式
|
||||||
|
const paddingObj = getPaddingObject(padding);
|
||||||
|
|
||||||
|
// 准备加密参数
|
||||||
|
const keyUtf8 = CryptoJS.enc.Utf8.parse(key);
|
||||||
|
let encrypted;
|
||||||
|
|
||||||
|
// 根据模式是否需要IV
|
||||||
|
if (mode === 'ECB') {
|
||||||
|
encrypted = CryptoJS.AES.encrypt(plaintext, keyUtf8, {
|
||||||
|
mode: modeObj,
|
||||||
|
padding: paddingObj
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
if (!iv) {
|
||||||
|
showNotification('使用该模式需要输入初始化向量(IV)', 'error');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ivUtf8 = CryptoJS.enc.Utf8.parse(iv);
|
||||||
|
encrypted = CryptoJS.AES.encrypt(plaintext, keyUtf8, {
|
||||||
|
iv: ivUtf8,
|
||||||
|
mode: modeObj,
|
||||||
|
padding: paddingObj
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 显示加密结果
|
||||||
|
const encryptedResult = encrypted.toString();
|
||||||
|
document.getElementById('encrypt-result').value = encryptedResult;
|
||||||
|
document.getElementById('ciphertext').value = encryptedResult;
|
||||||
|
|
||||||
|
showNotification('加密成功', 'success');
|
||||||
|
} catch (error) {
|
||||||
|
console.error('加密错误:', error);
|
||||||
|
showNotification('加密失败: ' + error.message, 'error');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解密函数
|
||||||
|
function decrypt() {
|
||||||
|
const ciphertext = document.getElementById('ciphertext').value.trim();
|
||||||
|
const key = document.getElementById('decrypt-key').value.trim();
|
||||||
|
const mode = document.getElementById('decrypt-mode').value;
|
||||||
|
const padding = document.getElementById('decrypt-padding').value;
|
||||||
|
const iv = document.getElementById('decrypt-iv').value.trim();
|
||||||
|
|
||||||
|
if (!ciphertext) {
|
||||||
|
showNotification('请输入密文', 'error');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!key) {
|
||||||
|
showNotification('请输入密钥', 'error');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 获取解密模式
|
||||||
|
const modeObj = getModeObject(mode);
|
||||||
|
|
||||||
|
// 获取填充方式
|
||||||
|
const paddingObj = getPaddingObject(padding);
|
||||||
|
|
||||||
|
// 准备解密参数
|
||||||
|
const keyUtf8 = CryptoJS.enc.Utf8.parse(key);
|
||||||
|
|
||||||
|
// 根据模式是否需要IV
|
||||||
|
let decrypted;
|
||||||
|
if (mode === 'ECB') {
|
||||||
|
decrypted = CryptoJS.AES.decrypt(ciphertext, keyUtf8, {
|
||||||
|
mode: modeObj,
|
||||||
|
padding: paddingObj
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
if (!iv) {
|
||||||
|
showNotification('使用该模式需要输入初始化向量(IV)', 'error');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ivUtf8 = CryptoJS.enc.Utf8.parse(iv);
|
||||||
|
decrypted = CryptoJS.AES.decrypt(ciphertext, keyUtf8, {
|
||||||
|
iv: ivUtf8,
|
||||||
|
mode: modeObj,
|
||||||
|
padding: paddingObj
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 显示解密结果
|
||||||
|
const decryptedResult = decrypted.toString(CryptoJS.enc.Utf8);
|
||||||
|
document.getElementById('decrypt-result').value = decryptedResult;
|
||||||
|
|
||||||
|
showNotification('解密成功', 'success');
|
||||||
|
} catch (error) {
|
||||||
|
console.error('解密错误:', error);
|
||||||
|
showNotification('解密失败: ' + error.message, 'error');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据名称获取加密/解密模式对象
|
||||||
|
function getModeObject(modeName) {
|
||||||
|
switch (modeName) {
|
||||||
|
case 'ECB': return CryptoJS.mode.ECB;
|
||||||
|
case 'CBC': return CryptoJS.mode.CBC;
|
||||||
|
case 'CFB': return CryptoJS.mode.CFB;
|
||||||
|
case 'OFB': return CryptoJS.mode.OFB;
|
||||||
|
case 'CTR': return CryptoJS.mode.CTR;
|
||||||
|
default: return CryptoJS.mode.ECB;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据名称获取填充方式对象
|
||||||
|
function getPaddingObject(paddingName) {
|
||||||
|
switch (paddingName) {
|
||||||
|
case 'Pkcs7': return CryptoJS.pad.Pkcs7;
|
||||||
|
case 'Iso97971': return CryptoJS.pad.Iso97971;
|
||||||
|
case 'AnsiX923': return CryptoJS.pad.AnsiX923;
|
||||||
|
case 'Iso10126': return CryptoJS.pad.Iso10126;
|
||||||
|
case 'ZeroPadding': return CryptoJS.pad.ZeroPadding;
|
||||||
|
case 'NoPadding': return CryptoJS.pad.NoPadding;
|
||||||
|
default: return CryptoJS.pad.Pkcs7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生成随机密钥
|
||||||
|
function generateRandomKey(length = 16) {
|
||||||
|
const charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
||||||
|
let key = "";
|
||||||
|
for (let i = 0; i < length; i++) {
|
||||||
|
key += charset.charAt(Math.floor(Math.random() * charset.length));
|
||||||
|
}
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 显示通知
|
||||||
|
function showNotification(message, type = 'info') {
|
||||||
|
const notification = document.getElementById('notification');
|
||||||
|
const notificationIcon = document.getElementById('notification-icon');
|
||||||
|
const notificationMessage = document.getElementById('notification-message');
|
||||||
|
|
||||||
|
// 设置通知类型
|
||||||
|
notification.className = 'fixed bottom-4 right-4 px-6 py-3 rounded-lg shadow-lg transform translate-y-20 opacity-0 transition-all duration-300 flex items-center';
|
||||||
|
|
||||||
|
if (type === 'success') {
|
||||||
|
notification.classList.add('bg-green-500', 'text-white');
|
||||||
|
notificationIcon.className = 'fa-solid fa-check-circle mr-2';
|
||||||
|
} else if (type === 'error') {
|
||||||
|
notification.classList.add('bg-red-500', 'text-white');
|
||||||
|
notificationIcon.className = 'fa-solid fa-exclamation-circle mr-2';
|
||||||
|
} else {
|
||||||
|
notification.classList.add('bg-dark', 'text-white');
|
||||||
|
notificationIcon.className = 'fa-solid fa-info-circle mr-2';
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置通知消息
|
||||||
|
notificationMessage.textContent = message;
|
||||||
|
|
||||||
|
// 显示通知
|
||||||
|
setTimeout(() => {
|
||||||
|
notification.classList.remove('translate-y-20', 'opacity-0');
|
||||||
|
}, 10);
|
||||||
|
|
||||||
|
// 3秒后隐藏通知
|
||||||
|
setTimeout(() => {
|
||||||
|
notification.classList.add('translate-y-20', 'opacity-0');
|
||||||
|
}, 3000);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 复制到剪贴板
|
||||||
|
function copyToClipboard(elementId) {
|
||||||
|
const element = document.getElementById(elementId);
|
||||||
|
element.select();
|
||||||
|
document.execCommand('copy');
|
||||||
|
showNotification('已复制到剪贴板', 'success');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 模式变更事件处理
|
||||||
|
function handleModeChange() {
|
||||||
|
const encryptMode = document.getElementById('encrypt-mode').value;
|
||||||
|
const decryptMode = document.getElementById('decrypt-mode').value;
|
||||||
|
|
||||||
|
// 显示或隐藏加密IV输入框
|
||||||
|
const encryptIvContainer = document.getElementById('iv-container');
|
||||||
|
if (encryptMode === 'ECB') {
|
||||||
|
encryptIvContainer.classList.add('hidden');
|
||||||
|
} else {
|
||||||
|
encryptIvContainer.classList.remove('hidden');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 显示或隐藏解密IV输入框
|
||||||
|
const decryptIvContainer = document.getElementById('decrypt-iv-container');
|
||||||
|
if (decryptMode === 'ECB') {
|
||||||
|
decryptIvContainer.classList.add('hidden');
|
||||||
|
} else {
|
||||||
|
decryptIvContainer.classList.remove('hidden');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生成随机密钥
|
||||||
|
document.getElementById('generate-key').addEventListener('click', () => {
|
||||||
|
document.getElementById('encrypt-key').value = generateRandomKey(16);
|
||||||
|
document.getElementById('decrypt-key').value = document.getElementById('encrypt-key').value;
|
||||||
|
showNotification('已生成随机密钥', 'success');
|
||||||
|
});
|
||||||
|
|
||||||
|
// 加密按钮点击事件
|
||||||
|
document.getElementById('encrypt-btn').addEventListener('click', encrypt);
|
||||||
|
|
||||||
|
// 解密按钮点击事件
|
||||||
|
document.getElementById('decrypt-btn').addEventListener('click', decrypt);
|
||||||
|
|
||||||
|
// 复制加密结果
|
||||||
|
document.getElementById('copy-encrypt').addEventListener('click', () => copyToClipboard('encrypt-result'));
|
||||||
|
|
||||||
|
// 复制解密结果
|
||||||
|
document.getElementById('copy-decrypt').addEventListener('click', () => copyToClipboard('decrypt-result'));
|
||||||
|
|
||||||
|
// 模式变更事件
|
||||||
|
document.getElementById('encrypt-mode').addEventListener('change', handleModeChange);
|
||||||
|
document.getElementById('decrypt-mode').addEventListener('change', handleModeChange);
|
||||||
|
|
||||||
|
// 初始化
|
||||||
|
handleModeChange();
|
||||||
|
|
||||||
|
// 添加示例数据
|
||||||
|
document.getElementById('plaintext').value = '这是一个使用AES加密的示例文本,您可以替换为自己的内容。';
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
|
@ -0,0 +1,323 @@
|
||||||
|
# 制度模块API测试文档
|
||||||
|
|
||||||
|
## 1. 获取制度列表 (流程管理页面)
|
||||||
|
|
||||||
|
### 请求信息
|
||||||
|
- **URL**: `GET /api/regulation?page=1&size=10`
|
||||||
|
- **Method**: GET
|
||||||
|
|
||||||
|
### 请求参数
|
||||||
|
- `page`: 页码,从1开始(必填)
|
||||||
|
- `size`: 每页数量(必填)
|
||||||
|
|
||||||
|
### 响应格式
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": 200,
|
||||||
|
"data": {
|
||||||
|
"records": [
|
||||||
|
{
|
||||||
|
"regulationId": "reg001",
|
||||||
|
"title": "员工考勤管理制度优化提案",
|
||||||
|
"content": "建议优化考勤管理制度,增加弹性工作时间,提高员工工作积极性...",
|
||||||
|
"regulationType": "人事制度",
|
||||||
|
"status": "VOTING",
|
||||||
|
"createBy": "张三",
|
||||||
|
"publishTime": "2024-01-01T12:00:00",
|
||||||
|
"effectiveTime": "2024-01-01T12:00:00",
|
||||||
|
"expireTime": "2024-01-08T12:00:00",
|
||||||
|
"scope": "全体员工",
|
||||||
|
"level": "MEDIUM",
|
||||||
|
"version": "1.0",
|
||||||
|
"remark": "需要与人事部门协调实施",
|
||||||
|
"createBy": "admin",
|
||||||
|
"updateBy": "admin",
|
||||||
|
"createTime": "2024-01-01 10:00:00",
|
||||||
|
"updateTime": "2024-01-01 12:00:00",
|
||||||
|
"page": 1,
|
||||||
|
"pageSize": 10,
|
||||||
|
"delFlag": "0",
|
||||||
|
"voteFor": 15,
|
||||||
|
"voteAgainst": 3,
|
||||||
|
"voteAbstain": 2
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"total": 4,
|
||||||
|
"size": 10,
|
||||||
|
"current": 1,
|
||||||
|
"pages": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2. 创建制度提案
|
||||||
|
|
||||||
|
### 请求信息
|
||||||
|
- **URL**: `POST /api/regulation/proposal`
|
||||||
|
- **Content-Type**: `application/json`
|
||||||
|
|
||||||
|
### 请求参数
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"title": "员工考勤管理制度优化提案",
|
||||||
|
"content": "建议优化考勤管理制度,增加弹性工作时间...",
|
||||||
|
"regulationType": "人事制度",
|
||||||
|
"scope": "全体员工",
|
||||||
|
"level": "MEDIUM",
|
||||||
|
"remark": "需要与人事部门协调实施"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 响应格式
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": 200,
|
||||||
|
"data": {
|
||||||
|
"regulationId": "reg005",
|
||||||
|
"title": "员工考勤管理制度优化提案",
|
||||||
|
"content": "建议优化考勤管理制度,增加弹性工作时间...",
|
||||||
|
"regulationType": "人事制度",
|
||||||
|
"status": "DRAFT",
|
||||||
|
"createBy": "当前用户",
|
||||||
|
"publishTime": "2024-01-25T10:30:00",
|
||||||
|
"effectiveTime": "2024-01-25T10:30:00",
|
||||||
|
"expireTime": "2025-01-25T10:30:00",
|
||||||
|
"scope": "全体员工",
|
||||||
|
"level": "MEDIUM",
|
||||||
|
"version": "1.0",
|
||||||
|
"remark": "需要与人事部门协调实施",
|
||||||
|
"createBy": "admin",
|
||||||
|
"updateBy": "admin",
|
||||||
|
"createTime": "2024-01-25 10:30:00",
|
||||||
|
"updateTime": "2024-01-25 10:30:00",
|
||||||
|
"page": 1,
|
||||||
|
"pageSize": 10,
|
||||||
|
"delFlag": "0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. 更新制度提案
|
||||||
|
|
||||||
|
### 请求信息
|
||||||
|
- **URL**: `PUT /api/regulation/proposal/{regulationId}`
|
||||||
|
- **Content-Type**: `application/json`
|
||||||
|
|
||||||
|
### 请求参数
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"title": "员工考勤管理制度优化提案",
|
||||||
|
"content": "建议优化考勤管理制度,增加弹性工作时间...",
|
||||||
|
"regulationType": "人事制度",
|
||||||
|
"scope": "全体员工",
|
||||||
|
"level": "MEDIUM",
|
||||||
|
"remark": "需要与人事部门协调实施"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 响应格式
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": 200,
|
||||||
|
"message": "制度提案更新成功"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4. 删除制度提案
|
||||||
|
|
||||||
|
### 请求信息
|
||||||
|
- **URL**: `DELETE /api/regulation/proposal/{regulationId}`
|
||||||
|
- **Method**: DELETE
|
||||||
|
|
||||||
|
### 响应格式
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": 200,
|
||||||
|
"data": {
|
||||||
|
"success": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5. 获取制度详情
|
||||||
|
|
||||||
|
### 请求信息
|
||||||
|
- **URL**: `GET /api/regulation/{regulationId}`
|
||||||
|
- **Method**: GET
|
||||||
|
|
||||||
|
### 响应格式
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": 200,
|
||||||
|
"data": {
|
||||||
|
"regulationId": "reg001",
|
||||||
|
"title": "员工考勤管理制度优化提案",
|
||||||
|
"content": "建议优化考勤管理制度,增加弹性工作时间...",
|
||||||
|
"regulationType": "人事制度",
|
||||||
|
"status": "VOTING",
|
||||||
|
"createBy": "张三",
|
||||||
|
"publishTime": "2024-01-01T12:00:00",
|
||||||
|
"effectiveTime": "2024-01-01T12:00:00",
|
||||||
|
"expireTime": "2024-01-08T12:00:00",
|
||||||
|
"scope": "全体员工",
|
||||||
|
"level": "MEDIUM",
|
||||||
|
"version": "1.0",
|
||||||
|
"remark": "需要与人事部门协调实施",
|
||||||
|
"createBy": "admin",
|
||||||
|
"updateBy": "admin",
|
||||||
|
"createTime": "2024-01-01 10:00:00",
|
||||||
|
"updateTime": "2024-01-01 12:00:00",
|
||||||
|
"page": 1,
|
||||||
|
"pageSize": 10,
|
||||||
|
"delFlag": "0",
|
||||||
|
"voteFor": 15,
|
||||||
|
"voteAgainst": 3,
|
||||||
|
"voteAbstain": 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6. 提交投票
|
||||||
|
|
||||||
|
### 请求信息
|
||||||
|
- **URL**: `POST /api/regulation/{regulationId}/vote`
|
||||||
|
- **Content-Type**: `application/json`
|
||||||
|
|
||||||
|
### 请求参数
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"voteType": "FOR", // FOR: 赞成, AGAINST: 反对, ABSTAIN: 弃权
|
||||||
|
"reason": "这个提案很有建设性" // 可选
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 响应格式
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": 200,
|
||||||
|
"data": {
|
||||||
|
"success": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 7. 获取投票结果
|
||||||
|
|
||||||
|
### 请求信息
|
||||||
|
- **URL**: `GET /api/regulation/{regulationId}/vote-result`
|
||||||
|
- **Method**: GET
|
||||||
|
|
||||||
|
### 响应格式
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": 200,
|
||||||
|
"data": {
|
||||||
|
"regulationId": "reg001",
|
||||||
|
"voteFor": 15,
|
||||||
|
"voteAgainst": 3,
|
||||||
|
"voteAbstain": 2,
|
||||||
|
"totalVotes": 20,
|
||||||
|
"approvalRate": 0.75
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 8. 发布制度
|
||||||
|
|
||||||
|
### 请求信息
|
||||||
|
- **URL**: `POST /api/regulation/{regulationId}/publish`
|
||||||
|
- **Method**: POST
|
||||||
|
|
||||||
|
### 响应格式
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": 200,
|
||||||
|
"message": "制度发布成功"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 9. 获取已发布制度列表
|
||||||
|
|
||||||
|
### 请求信息
|
||||||
|
- **URL**: `GET /api/regulation/published?page=1&size=10`
|
||||||
|
- **Method**: GET
|
||||||
|
|
||||||
|
### 请求参数
|
||||||
|
- `page`: 页码(默认1)
|
||||||
|
- `size`: 页大小(默认10)
|
||||||
|
|
||||||
|
### 响应格式
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": 200,
|
||||||
|
"data": {
|
||||||
|
"records": [
|
||||||
|
{
|
||||||
|
"regulationId": "reg001",
|
||||||
|
"title": "员工考勤管理制度",
|
||||||
|
"content": "规范员工考勤管理...",
|
||||||
|
"status": "PUBLISHED",
|
||||||
|
"publishTime": "2024-01-01T12:00:00",
|
||||||
|
"confirmStatus": "pending"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"total": 1,
|
||||||
|
"size": 10,
|
||||||
|
"current": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 10. 确认制度知晓
|
||||||
|
|
||||||
|
### 请求信息
|
||||||
|
- **URL**: `POST /api/regulation/{regulationId}/confirm`
|
||||||
|
- **Content-Type**: `application/json`
|
||||||
|
|
||||||
|
### 请求参数
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"confirmComment": "已阅读并同意遵守该制度"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 响应格式
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": 200,
|
||||||
|
"message": "制度确认成功"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 11. 批量确认制度
|
||||||
|
|
||||||
|
### 请求信息
|
||||||
|
- **URL**: `POST /api/regulation/confirm-all`
|
||||||
|
- **Method**: POST
|
||||||
|
|
||||||
|
### 响应格式
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": 200,
|
||||||
|
"data": {
|
||||||
|
"success": true,
|
||||||
|
"confirmedCount": 5
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 测试步骤
|
||||||
|
|
||||||
|
1. **执行建表语句**: 运行 `regulation_tables.sql`
|
||||||
|
2. **插入测试数据**: 运行 `regulation_test_data.sql`
|
||||||
|
3. **启动应用**: 确保后端服务正常运行
|
||||||
|
4. **测试接口**: 使用Postman或其他工具测试上述接口
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
1. 所有接口都需要用户登录认证
|
||||||
|
2. ID字段使用UUID自动生成,无需手动设置
|
||||||
|
3. 创建时间和更新时间会自动设置
|
||||||
|
4. 创建人和更新人会从当前登录用户获取
|
||||||
|
5. 制度状态包括:DRAFT(草稿)、VOTING(投票中)、PUBLISHED(已发布)、ARCHIVED(已归档)
|
||||||
|
6. 投票类型:FOR(赞成)、AGAINST(反对)、ABSTAIN(弃权)
|
|
@ -0,0 +1,221 @@
|
||||||
|
# 制度模块说明文档
|
||||||
|
|
||||||
|
## 概述
|
||||||
|
|
||||||
|
制度模块是一个完整的企业制度管理系统,包含制度规范仓库、制度草案、个人制度提案等功能,支持投票、发布等完整的制度管理流程。
|
||||||
|
|
||||||
|
## 功能模块
|
||||||
|
|
||||||
|
### 1. 制度规范仓库 (RegulationEntity)
|
||||||
|
|
||||||
|
**功能描述:** 存储正式发布的制度,支持全员知晓承诺的确认
|
||||||
|
|
||||||
|
**主要功能:**
|
||||||
|
- 制度发布管理
|
||||||
|
- 制度版本控制
|
||||||
|
- 制度状态管理(草案、已发布、已归档)
|
||||||
|
- 制度生效时间管理
|
||||||
|
- 制度适用范围管理
|
||||||
|
|
||||||
|
**核心字段:**
|
||||||
|
- `regulation_id`: 制度ID
|
||||||
|
- `title`: 制度标题
|
||||||
|
- `content`: 制度内容
|
||||||
|
- `status`: 制度状态
|
||||||
|
- `publisher_id`: 发布人ID
|
||||||
|
- `publish_time`: 发布时间
|
||||||
|
- `effective_time`: 生效时间
|
||||||
|
- `expire_time`: 失效时间
|
||||||
|
|
||||||
|
### 2. 制度草案 (RegulationDraftEntity)
|
||||||
|
|
||||||
|
**功能描述:** 制度草案管理,包含投票、发布过程
|
||||||
|
|
||||||
|
**主要功能:**
|
||||||
|
- 草案创建和编辑
|
||||||
|
- 审核流程管理
|
||||||
|
- 投票系统
|
||||||
|
- 投票结果统计
|
||||||
|
- 草案状态跟踪
|
||||||
|
|
||||||
|
**核心字段:**
|
||||||
|
- `draft_id`: 草案ID
|
||||||
|
- `status`: 草案状态(草稿、审核中、已通过、已拒绝)
|
||||||
|
- `vote_status`: 投票状态
|
||||||
|
- `approve_votes`: 赞成票数
|
||||||
|
- `reject_votes`: 反对票数
|
||||||
|
- `pass_threshold`: 通过阈值
|
||||||
|
|
||||||
|
### 3. 制度提案 (RegulationProposalEntity)
|
||||||
|
|
||||||
|
**功能描述:** 个人制度提案,支持审核和转为草案
|
||||||
|
|
||||||
|
**主要功能:**
|
||||||
|
- 提案提交
|
||||||
|
- 提案审核
|
||||||
|
- 提案转为草案
|
||||||
|
|
||||||
|
**核心字段:**
|
||||||
|
- `proposal_id`: 提案ID
|
||||||
|
- `proposer_id`: 提案人ID
|
||||||
|
- `status`: 提案状态
|
||||||
|
- `reviewer_id`: 审核人ID
|
||||||
|
- `converted_draft_id`: 转为草案ID
|
||||||
|
|
||||||
|
### 4. 制度投票 (RegulationVoteEntity)
|
||||||
|
|
||||||
|
**功能描述:** 投票系统,支持对草案和提案进行投票
|
||||||
|
|
||||||
|
**主要功能:**
|
||||||
|
- 投票记录管理
|
||||||
|
- 投票选项(赞成、反对、弃权)
|
||||||
|
- 投票统计
|
||||||
|
- 防重复投票
|
||||||
|
|
||||||
|
**核心字段:**
|
||||||
|
- `vote_id`: 投票ID
|
||||||
|
- `related_id`: 关联ID(草案或提案)
|
||||||
|
- `related_type`: 关联类型
|
||||||
|
- `vote_option`: 投票选项
|
||||||
|
- `voter_id`: 投票人ID
|
||||||
|
|
||||||
|
### 5. 制度确认 (RegulationConfirmationEntity)
|
||||||
|
|
||||||
|
**功能描述:** 全员知晓承诺的确认系统
|
||||||
|
|
||||||
|
**主要功能:**
|
||||||
|
- 确认任务创建
|
||||||
|
- 确认状态管理
|
||||||
|
- 确认统计
|
||||||
|
- 阅读时长记录
|
||||||
|
|
||||||
|
**核心字段:**
|
||||||
|
- `confirmation_id`: 确认ID
|
||||||
|
- `regulation_id`: 制度ID
|
||||||
|
- `confirmer_id`: 确认人ID
|
||||||
|
- `status`: 确认状态
|
||||||
|
- `read_duration`: 阅读时长
|
||||||
|
|
||||||
|
## 业务流程
|
||||||
|
|
||||||
|
### 制度发布流程
|
||||||
|
|
||||||
|
1. **提案阶段**
|
||||||
|
- 个人提交制度提案
|
||||||
|
- 进行小组讨论
|
||||||
|
- 讨论结果统计
|
||||||
|
|
||||||
|
2. **草案阶段**
|
||||||
|
- 提案转为草案
|
||||||
|
- 草案审核
|
||||||
|
- 投票表决
|
||||||
|
- 投票结果统计
|
||||||
|
|
||||||
|
3. **发布阶段**
|
||||||
|
- 通过投票的草案转为正式制度
|
||||||
|
- 制度发布
|
||||||
|
- 全员确认
|
||||||
|
|
||||||
|
### 投票流程
|
||||||
|
|
||||||
|
1. **开始投票**
|
||||||
|
- 设置投票时间
|
||||||
|
- 设置通过阈值
|
||||||
|
- 通知相关人员
|
||||||
|
|
||||||
|
2. **投票进行**
|
||||||
|
- 用户参与投票
|
||||||
|
- 实时统计投票结果
|
||||||
|
- 防重复投票
|
||||||
|
|
||||||
|
3. **投票结束**
|
||||||
|
- 统计最终结果
|
||||||
|
- 判断是否通过
|
||||||
|
- 更新相关状态
|
||||||
|
|
||||||
|
### 确认流程
|
||||||
|
|
||||||
|
1. **创建确认任务**
|
||||||
|
- 批量创建确认任务
|
||||||
|
- 通知相关人员
|
||||||
|
|
||||||
|
2. **确认进行**
|
||||||
|
- 用户阅读制度
|
||||||
|
- 确认知晓
|
||||||
|
- 记录阅读时长
|
||||||
|
|
||||||
|
3. **确认统计**
|
||||||
|
- 统计确认情况
|
||||||
|
- 生成确认报告
|
||||||
|
|
||||||
|
## 技术实现
|
||||||
|
|
||||||
|
### 数据库设计
|
||||||
|
|
||||||
|
- 采用MyBatis Plus框架
|
||||||
|
- 支持软删除
|
||||||
|
- 包含审计字段(创建人、创建时间、更新人、更新时间)
|
||||||
|
- 合理的索引设计
|
||||||
|
|
||||||
|
### 服务层设计
|
||||||
|
|
||||||
|
- 采用Service接口 + 实现类的设计模式
|
||||||
|
- 支持事务管理
|
||||||
|
- 统一的异常处理
|
||||||
|
- 统一的返回结果格式
|
||||||
|
|
||||||
|
### 核心特性
|
||||||
|
|
||||||
|
- **防重复操作**: 投票和确认都支持防重复机制
|
||||||
|
- **状态管理**: 完整的状态流转管理
|
||||||
|
- **统计功能**: 支持各种统计和报表功能
|
||||||
|
- **扩展性**: 模块化设计,易于扩展
|
||||||
|
|
||||||
|
## 使用说明
|
||||||
|
|
||||||
|
### 1. 数据库初始化
|
||||||
|
|
||||||
|
执行 `doc/regulation_tables.sql` 创建相关数据表。
|
||||||
|
|
||||||
|
### 2. 服务调用示例
|
||||||
|
|
||||||
|
```java
|
||||||
|
// 发布制度
|
||||||
|
RegulationEntity regulation = new RegulationEntity();
|
||||||
|
regulation.setTitle("员工手册");
|
||||||
|
regulation.setContent("员工手册内容...");
|
||||||
|
regulationService.publishRegulation(regulation);
|
||||||
|
|
||||||
|
// 创建草案
|
||||||
|
RegulationDraftEntity draft = new RegulationDraftEntity();
|
||||||
|
draft.setTitle("新制度草案");
|
||||||
|
draftService.createDraft(draft);
|
||||||
|
|
||||||
|
// 提交提案
|
||||||
|
RegulationProposalEntity proposal = new RegulationProposalEntity();
|
||||||
|
proposal.setTitle("制度改进提案");
|
||||||
|
proposalService.submitProposal(proposal);
|
||||||
|
|
||||||
|
// 投票
|
||||||
|
RegulationVoteEntity vote = new RegulationVoteEntity();
|
||||||
|
vote.setVoteOption("APPROVE");
|
||||||
|
voteService.vote(vote);
|
||||||
|
|
||||||
|
// 确认制度
|
||||||
|
RegulationConfirmationEntity confirmation = new RegulationConfirmationEntity();
|
||||||
|
confirmationService.confirmRegulation(confirmation);
|
||||||
|
```
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
1. **数据一致性**: 所有操作都支持事务管理,确保数据一致性
|
||||||
|
2. **权限控制**: 需要配合权限系统使用,控制用户操作权限
|
||||||
|
3. **性能优化**: 大数据量时需要考虑分页和索引优化
|
||||||
|
4. **日志记录**: 重要操作需要记录操作日志
|
||||||
|
|
||||||
|
## 扩展建议
|
||||||
|
|
||||||
|
1. **消息通知**: 集成消息系统,支持邮件、短信通知
|
||||||
|
2. **工作流**: 集成工作流引擎,支持更复杂的审批流程
|
||||||
|
3. **文档管理**: 集成文档管理系统,支持附件上传
|
||||||
|
4. **报表系统**: 集成报表系统,支持更丰富的统计报表
|
|
@ -0,0 +1,145 @@
|
||||||
|
-- 制度模块数据库表创建脚本
|
||||||
|
-- @author wangna
|
||||||
|
-- @date 2025/07/28
|
||||||
|
|
||||||
|
-- 制度类型表
|
||||||
|
CREATE TABLE `regulation_type` (
|
||||||
|
`type_id` varchar(64) NOT NULL COMMENT '类型ID',
|
||||||
|
`type_name` varchar(100) NOT NULL COMMENT '类型名称',
|
||||||
|
`sort_order` int DEFAULT 0 COMMENT '排序顺序',
|
||||||
|
`is_enabled` char(1) DEFAULT '1' COMMENT '是否启用(1-启用,0-禁用)',
|
||||||
|
`remark` text COMMENT '备注',
|
||||||
|
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
|
||||||
|
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
|
||||||
|
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在,1代表删除)',
|
||||||
|
PRIMARY KEY (`type_id`),
|
||||||
|
UNIQUE KEY `uk_type_name` (`type_name`),
|
||||||
|
KEY `idx_sort_order` (`sort_order`),
|
||||||
|
KEY `idx_is_enabled` (`is_enabled`),
|
||||||
|
KEY `idx_create_time` (`create_time`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='制度类型';
|
||||||
|
|
||||||
|
-- 插入制度类型测试数据
|
||||||
|
INSERT INTO `regulation_type` (`type_id`, `type_name`, `sort_order`, `is_enabled`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES
|
||||||
|
('type_001', '人事制度', 1, '1', '人力资源管理相关制度', 'admin', '2024-01-01 10:00:00', 'admin', '2024-01-01 10:00:00', '0'),
|
||||||
|
('type_002', '财务制度', 2, '1', '财务管理相关制度', 'admin', '2024-01-01 10:00:00', 'admin', '2024-01-01 10:00:00', '0'),
|
||||||
|
('type_003', '安全制度', 3, '1', '安全管理相关制度', 'admin', '2024-01-01 10:00:00', 'admin', '2024-01-01 10:00:00', '0'),
|
||||||
|
('type_004', '设备制度', 4, '1', '设备管理相关制度', 'admin', '2024-01-01 10:00:00', 'admin', '2024-01-01 10:00:00', '0'),
|
||||||
|
('type_005', '行政制度', 5, '1', '行政管理相关制度', 'admin', '2024-01-01 10:00:00', 'admin', '2024-01-01 10:00:00', '0');
|
||||||
|
|
||||||
|
-- 制度规范仓库表
|
||||||
|
CREATE TABLE `regulation` (
|
||||||
|
`regulation_id` varchar(64) NOT NULL COMMENT '制度ID',
|
||||||
|
`title` varchar(255) NOT NULL COMMENT '制度标题',
|
||||||
|
`content` text COMMENT '制度内容',
|
||||||
|
`regulation_type` varchar(50) DEFAULT NULL COMMENT '制度类型',
|
||||||
|
`status` varchar(20) DEFAULT 'DRAFT' COMMENT '制度状态:DRAFT-草案,PUBLISHED-已发布,ARCHIVED-已归档',
|
||||||
|
`publisher_id` varchar(64) DEFAULT NULL COMMENT '发布人ID',
|
||||||
|
`publisher_name` varchar(100) DEFAULT NULL COMMENT '发布人姓名',
|
||||||
|
`publish_time` datetime DEFAULT NULL COMMENT '发布时间',
|
||||||
|
`effective_time` datetime DEFAULT NULL COMMENT '生效时间',
|
||||||
|
`expire_time` datetime DEFAULT NULL COMMENT '失效时间',
|
||||||
|
`scope` varchar(255) DEFAULT NULL COMMENT '适用范围',
|
||||||
|
`level` varchar(20) DEFAULT 'MEDIUM' COMMENT '制度级别:HIGH-高级,MEDIUM-中级,LOW-低级',
|
||||||
|
`version` varchar(20) DEFAULT '1.0' COMMENT '版本号',
|
||||||
|
`remark` text COMMENT '备注',
|
||||||
|
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
|
||||||
|
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
|
||||||
|
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在,1代表删除)',
|
||||||
|
PRIMARY KEY (`regulation_id`),
|
||||||
|
KEY `idx_status` (`status`),
|
||||||
|
KEY `idx_type` (`regulation_type`),
|
||||||
|
KEY `idx_publisher` (`publisher_id`),
|
||||||
|
KEY `idx_create_time` (`create_time`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='制度规范仓库';
|
||||||
|
|
||||||
|
-- 制度草案表
|
||||||
|
CREATE TABLE `regulation_draft` (
|
||||||
|
`draft_id` varchar(64) NOT NULL COMMENT '草案ID',
|
||||||
|
`title` varchar(255) NOT NULL COMMENT '制度标题',
|
||||||
|
`content` text COMMENT '制度内容',
|
||||||
|
`regulation_type` varchar(50) DEFAULT NULL COMMENT '制度类型',
|
||||||
|
`status` varchar(20) DEFAULT 'DRAFT' COMMENT '草案状态:DRAFT-草稿,REVIEWING-审核中,APPROVED-已通过,REJECTED-已拒绝',
|
||||||
|
`creator_id` varchar(64) DEFAULT NULL COMMENT '创建人ID',
|
||||||
|
`creator_name` varchar(100) DEFAULT NULL COMMENT '创建人姓名',
|
||||||
|
`reviewer_id` varchar(64) DEFAULT NULL COMMENT '审核人ID',
|
||||||
|
`reviewer_name` varchar(100) DEFAULT NULL COMMENT '审核人姓名',
|
||||||
|
`review_time` datetime DEFAULT NULL COMMENT '审核时间',
|
||||||
|
`review_comment` text COMMENT '审核意见',
|
||||||
|
`scope` varchar(255) DEFAULT NULL COMMENT '适用范围',
|
||||||
|
`level` varchar(20) DEFAULT 'MEDIUM' COMMENT '制度级别:HIGH-高级,MEDIUM-中级,LOW-低级',
|
||||||
|
`version` varchar(20) DEFAULT '1.0' COMMENT '版本号',
|
||||||
|
`remark` text COMMENT '备注',
|
||||||
|
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
|
||||||
|
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
|
||||||
|
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在,1代表删除)',
|
||||||
|
PRIMARY KEY (`draft_id`),
|
||||||
|
KEY `idx_status` (`status`),
|
||||||
|
KEY `idx_creator` (`creator_id`),
|
||||||
|
KEY `idx_reviewer` (`reviewer_id`),
|
||||||
|
KEY `idx_create_time` (`create_time`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='制度草案';
|
||||||
|
|
||||||
|
-- 制度提案表
|
||||||
|
CREATE TABLE `regulation_proposal` (
|
||||||
|
`proposal_id` varchar(64) NOT NULL COMMENT '提案ID',
|
||||||
|
`title` varchar(255) NOT NULL COMMENT '提案标题',
|
||||||
|
`content` text COMMENT '提案内容',
|
||||||
|
`proposal_type` varchar(50) DEFAULT NULL COMMENT '提案类型',
|
||||||
|
`status` varchar(20) DEFAULT 'SUBMITTED' COMMENT '提案状态:SUBMITTED-已提交,DISCUSSING-讨论中,APPROVED-已通过,REJECTED-已拒绝,CONVERTED-已转为草案',
|
||||||
|
`proposer_id` varchar(64) DEFAULT NULL COMMENT '提案人ID',
|
||||||
|
`proposer_name` varchar(100) DEFAULT NULL COMMENT '提案人姓名',
|
||||||
|
`proposer_dept` varchar(100) DEFAULT NULL COMMENT '提案人部门',
|
||||||
|
`discussion_group_id` varchar(64) DEFAULT NULL COMMENT '讨论组ID',
|
||||||
|
`discussion_group_name` varchar(100) DEFAULT NULL COMMENT '讨论组名称',
|
||||||
|
`discussion_start_time` datetime DEFAULT NULL COMMENT '讨论开始时间',
|
||||||
|
`discussion_end_time` datetime DEFAULT NULL COMMENT '讨论结束时间',
|
||||||
|
`discussion_status` varchar(20) DEFAULT 'NOT_STARTED' COMMENT '讨论状态:NOT_STARTED-未开始,DISCUSSING-讨论中,FINISHED-已结束',
|
||||||
|
`support_count` int DEFAULT 0 COMMENT '支持人数',
|
||||||
|
`oppose_count` int DEFAULT 0 COMMENT '反对人数',
|
||||||
|
`total_participants` int DEFAULT 0 COMMENT '总参与人数',
|
||||||
|
`reviewer_id` varchar(64) DEFAULT NULL COMMENT '审核人ID',
|
||||||
|
`reviewer_name` varchar(100) DEFAULT NULL COMMENT '审核人姓名',
|
||||||
|
`review_time` datetime DEFAULT NULL COMMENT '审核时间',
|
||||||
|
`review_comment` text COMMENT '审核意见',
|
||||||
|
`converted_draft_id` varchar(64) DEFAULT NULL COMMENT '转为草案ID',
|
||||||
|
`scope` varchar(255) DEFAULT NULL COMMENT '适用范围',
|
||||||
|
`level` varchar(20) DEFAULT 'MEDIUM' COMMENT '制度级别:HIGH-高级,MEDIUM-中级,LOW-低级',
|
||||||
|
`urgency_level` varchar(20) DEFAULT 'MEDIUM' COMMENT '紧急程度:HIGH-高,MEDIUM-中,LOW-低',
|
||||||
|
`remark` text COMMENT '备注',
|
||||||
|
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
|
||||||
|
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
|
||||||
|
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在,1代表删除)',
|
||||||
|
PRIMARY KEY (`proposal_id`),
|
||||||
|
KEY `idx_status` (`status`),
|
||||||
|
KEY `idx_proposer` (`proposer_id`),
|
||||||
|
KEY `idx_reviewer` (`reviewer_id`),
|
||||||
|
KEY `idx_discussion_status` (`discussion_status`),
|
||||||
|
KEY `idx_create_time` (`create_time`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='制度提案';
|
||||||
|
|
||||||
|
-- 制度确认表
|
||||||
|
CREATE TABLE `regulation_confirmation` (
|
||||||
|
`confirmation_id` varchar(64) NOT NULL COMMENT '确认ID',
|
||||||
|
`regulation_id` varchar(64) NOT NULL COMMENT '制度ID',
|
||||||
|
`confirmer_id` varchar(64) NOT NULL COMMENT '确认人ID',
|
||||||
|
`confirmer_name` varchar(100) DEFAULT NULL COMMENT '确认人姓名',
|
||||||
|
`confirmer_dept` varchar(100) DEFAULT NULL COMMENT '确认人部门',
|
||||||
|
`status` varchar(20) DEFAULT 'CONFIRMED' COMMENT '确认状态:CONFIRMED-已确认',
|
||||||
|
`confirm_time` datetime DEFAULT NULL COMMENT '确认时间',
|
||||||
|
`del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在,1代表删除)',
|
||||||
|
PRIMARY KEY (`confirmation_id`),
|
||||||
|
UNIQUE KEY `uk_confirmer_regulation` (`confirmer_id`, `regulation_id`),
|
||||||
|
KEY `idx_regulation` (`regulation_id`),
|
||||||
|
KEY `idx_confirmer` (`confirmer_id`),
|
||||||
|
KEY `idx_status` (`status`),
|
||||||
|
KEY `idx_confirm_time` (`confirm_time`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='制度确认';
|
|
@ -0,0 +1,35 @@
|
||||||
|
-- 制度模块测试数据
|
||||||
|
-- @author wangna
|
||||||
|
-- @date 2025/07/29
|
||||||
|
|
||||||
|
-- 插入测试用户数据(如果不存在)
|
||||||
|
INSERT INTO `sys_user` (`user_id`, `username`, `nickname`, `email`, `phonenumber`, `sex`, `avatar`, `password`, `status`, `login_ip`, `login_date`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`, `del_flag`) VALUES
|
||||||
|
('1', 'admin', '管理员', 'admin@example.com', '13800138000', '0', '', '$2a$10$7JB720yubVSOfvVWdBYoOeymFwJ9WxqHhqjqKqKqKqKqKqKqKqKqK', '0', '127.0.0.1', '2024-01-01 00:00:00', 'admin', '2024-01-01 00:00:00', 'admin', '2024-01-01 00:00:00', '管理员', '0'),
|
||||||
|
('2', 'user1', '张三', 'zhangsan@example.com', '13800138001', '0', '', '$2a$10$7JB720yubVSOfvVWdBYoOeymFwJ9WxqHhqjqKqKqKqKqKqKqKqKqK', '0', '127.0.0.1', '2024-01-01 00:00:00', 'admin', '2024-01-01 00:00:00', 'admin', '2024-01-01 00:00:00', '普通用户', '0'),
|
||||||
|
('3', 'user2', '李四', 'lisi@example.com', '13800138002', '0', '', '$2a$10$7JB720yubVSOfvVWdBYoOeymFwJ9WxqHhqjqKqKqKqKqKqKqKqKqK', '0', '127.0.0.1', '2024-01-01 00:00:00', 'admin', '2024-01-01 00:00:00', 'admin', '2024-01-01 00:00:00', '普通用户', '0'),
|
||||||
|
('4', 'user3', '王五', 'wangwu@example.com', '13800138003', '0', '', '$2a$10$7JB720yubVSOfvVWdBYoOeymFwJ9WxqHhqjqKqKqKqKqKqKqKqKqK', '0', '127.0.0.1', '2024-01-01 00:00:00', 'admin', '2024-01-01 00:00:00', 'admin', '2024-01-01 00:00:00', '普通用户', '0')
|
||||||
|
ON DUPLICATE KEY UPDATE `update_time` = NOW();
|
||||||
|
|
||||||
|
-- 插入测试制度数据(符合前端API格式)
|
||||||
|
INSERT INTO `regulation` (`regulation_id`, `title`, `content`, `regulation_type`, `status`, `publisher_id`, `publisher_name`, `publish_time`, `effective_time`, `expire_time`, `scope`, `level`, `version`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`, `del_flag`) VALUES
|
||||||
|
('reg001', '员工考勤管理制度优化提案', '建议优化考勤管理制度,增加弹性工作时间,提高员工工作积极性...', '人事制度', 'VOTING', '2', '张三', '2024-01-01 12:00:00', '2024-01-01 12:00:00', '2024-01-08 12:00:00', '全体员工', 'MEDIUM', '1.0', 'admin', '2024-01-01 10:00:00', 'admin', '2024-01-01 12:00:00', '需要与人事部门协调实施', '0'),
|
||||||
|
('reg002', '财务报销流程简化提案', '建议简化财务报销流程,提高工作效率,减少审批环节...', '财务制度', 'PUBLISHED', '3', '李四', '2024-01-15 14:30:00', '2024-01-15 14:30:00', '2024-12-31 23:59:59', '财务部门及相关员工', 'HIGH', '1.0', 'admin', '2024-01-15 14:00:00', 'admin', '2024-01-15 14:30:00', '已获得财务部门支持', '0'),
|
||||||
|
('reg003', '技术管理制度', '为规范技术管理流程,提高技术管理水平,特制定本制度...', '技术制度', 'DRAFT', '2', '张三', NULL, NULL, NULL, '技术部门', 'MEDIUM', '1.0', 'admin', '2024-01-25 16:00:00', 'admin', '2024-01-25 16:00:00', '技术管理制度草案', '0'),
|
||||||
|
('reg004', '项目管理制度', '为规范项目管理流程,提高项目执行效率,特制定本制度...', '项目制度', 'ARCHIVED', '1', '管理员', '2024-01-10 11:00:00', '2024-01-11 00:00:00', '2024-12-31 23:59:59', '项目部门', 'MEDIUM', '1.0', 'admin', '2024-01-10 10:00:00', 'admin', '2024-01-10 11:00:00', '项目管理规范', '0'),
|
||||||
|
('reg005', '远程办公管理制度', '随着远程办公的普及,需要制定相应的管理制度来规范远程办公行为...', '人事制度', 'DRAFT', '2', '张三', NULL, NULL, NULL, '全体员工', 'HIGH', '1.0', 'admin', '2024-01-27 10:00:00', 'admin', '2024-01-27 10:00:00', '远程办公管理提案', '0'),
|
||||||
|
('reg006', '数据安全管理制度', '为保护公司数据安全,防止数据泄露,需要制定数据安全管理制度...', '安全制度', 'PENDING', '2', '张三', NULL, NULL, NULL, '全体员工', 'HIGH', '1.0', 'admin', '2024-01-28 09:00:00', 'admin', '2024-01-28 09:00:00', '数据安全管理提案', '0');
|
||||||
|
|
||||||
|
-- 插入制度草案数据
|
||||||
|
INSERT INTO `regulation_draft` (`draft_id`, `regulation_id`, `title`, `content`, `draft_type`, `status`, `creator_id`, `creator_name`, `reviewer_id`, `reviewer_name`, `vote_status`, `vote_start_time`, `vote_end_time`, `approval_status`, `approval_time`, `approval_comment`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`, `del_flag`) VALUES
|
||||||
|
('draft_001', 'reg003', '技术管理制度', '为规范技术管理流程,提高技术管理水平,特制定本制度...', '技术制度', 'DRAFT', '2', '张三', '1', '管理员', 'PENDING', NULL, NULL, 'PENDING', NULL, NULL, 'admin', '2024-01-25 16:00:00', 'admin', '2024-01-25 16:00:00', '技术管理制度草案', '0'),
|
||||||
|
('draft_002', 'reg005', '远程办公管理制度', '随着远程办公的普及,需要制定相应的管理制度来规范远程办公行为...', '人事制度', 'REVIEWING', '2', '张三', '1', '管理员', 'VOTING', '2024-01-26 09:00:00', '2024-01-28 18:00:00', 'PENDING', NULL, NULL, 'admin', '2024-01-26 08:00:00', 'admin', '2024-01-26 09:00:00', '远程办公管理制度草案', '0');
|
||||||
|
|
||||||
|
-- 插入制度提案数据
|
||||||
|
INSERT INTO `regulation_proposal` (`proposal_id`, `regulation_id`, `title`, `description`, `proposal_type`, `status`, `proposer_id`, `proposer_name`, `proposer_dept`, `reviewer_id`, `reviewer_name`, `review_status`, `review_time`, `review_comment`, `priority`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`, `del_flag`) VALUES
|
||||||
|
('proposal_001', 'reg001', '员工考勤管理制度优化提案', '建议优化考勤管理制度,增加弹性工作时间,提高员工工作积极性...', '人事制度', 'APPROVED', '2', '张三', '技术部', '1', '管理员', 'APPROVED', '2024-01-27 14:00:00', '同意提案,可以开始制定制度', 'HIGH', 'admin', '2024-01-27 10:00:00', 'admin', '2024-01-27 14:00:00', '员工考勤管理提案', '0'),
|
||||||
|
('proposal_002', 'reg006', '数据安全管理制度', '为保护公司数据安全,防止数据泄露,需要制定数据安全管理制度...', '安全制度', 'PENDING', '2', '张三', '技术部', '1', '管理员', 'PENDING', NULL, NULL, 'HIGH', 'admin', '2024-01-28 09:00:00', 'admin', '2024-01-28 09:00:00', '数据安全管理提案', '0');
|
||||||
|
|
||||||
|
-- 插入制度确认数据
|
||||||
|
INSERT INTO `regulation_confirmation` (`confirmation_id`, `regulation_id`, `confirmer_id`, `confirmer_name`, `confirmer_dept`, `status`, `confirm_time`, `confirm_comment`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`, `del_flag`) VALUES
|
||||||
|
('confirm_001', 'reg002', '2', '张三', '技术部', 'CONFIRMED', '2024-01-16 10:00:00', '已阅读并确认知晓', 'admin', '2024-01-16 10:00:00', 'admin', '2024-01-16 10:00:00', '财务报销制度确认', '0'),
|
||||||
|
('confirm_002', 'reg002', '3', '李四', '财务部', 'CONFIRMED', '2024-01-21 15:00:00', '已阅读并确认知晓', 'admin', '2024-01-21 15:00:00', 'admin', '2024-01-21 15:00:00', '财务报销制度确认', '0');
|
|
@ -1,58 +0,0 @@
|
||||||
package com.dite.znpt.web.controller;
|
|
||||||
|
|
||||||
import com.dite.znpt.domain.Result;
|
|
||||||
import com.dite.znpt.domain.dto.FolderDto;
|
|
||||||
import com.dite.znpt.domain.page.PageBean;
|
|
||||||
import com.dite.znpt.service.BusinessDataService;
|
|
||||||
import io.swagger.annotations.Api;
|
|
||||||
import io.swagger.annotations.ApiOperation;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.apache.ibatis.annotations.Param;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @Description: 商务资料管理,文件夹层
|
|
||||||
* 虽然文件夹本质也是文件,但我们页面上很多地方,光查文件信息,根据文件夹ID
|
|
||||||
* 获取文件列表,如果文件夹和文件都放一张表,不好区分,接口也不好区分,这样分开写方便
|
|
||||||
*/
|
|
||||||
@Api(tags = "文件夹接口")
|
|
||||||
@RestController
|
|
||||||
@Slf4j
|
|
||||||
@RequestMapping("/businessData/folder")
|
|
||||||
@ApiOperation("商务资料管理,文件夹contrller层")
|
|
||||||
public class BusinessDataController {
|
|
||||||
@Resource
|
|
||||||
private BusinessDataService businessDataService;
|
|
||||||
|
|
||||||
@ApiOperation(value = "分页查询文件夹", httpMethod = "GET")
|
|
||||||
@GetMapping("/list")
|
|
||||||
public Result pageSelect(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer pageSize){
|
|
||||||
|
|
||||||
PageBean pageBean = businessDataService.pageSelect(page, pageSize);
|
|
||||||
|
|
||||||
return Result.ok(pageBean);
|
|
||||||
}
|
|
||||||
|
|
||||||
@ApiOperation(value = "增加文件夹", httpMethod = "POST")
|
|
||||||
@PostMapping("/creatFolder")
|
|
||||||
public Result createFolder(@RequestBody FolderDto folderDto) {
|
|
||||||
return businessDataService.createFolder(folderDto.getName(), folderDto.getParentId());
|
|
||||||
}
|
|
||||||
|
|
||||||
@ApiOperation(value = "删除文件夹", httpMethod = "DELETE")
|
|
||||||
@DeleteMapping("/delete")
|
|
||||||
public Result delete(@RequestParam Long folderId) {
|
|
||||||
|
|
||||||
return businessDataService.delete(folderId);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@ApiOperation(value = "重命名文件夹", httpMethod = "PUT")
|
|
||||||
@PutMapping("/rename")
|
|
||||||
public Result Rename(@RequestParam Long folderId, @RequestParam String newName) {
|
|
||||||
|
|
||||||
return businessDataService.reName(folderId, newName);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,137 +0,0 @@
|
||||||
package com.dite.znpt.web.controller;
|
|
||||||
|
|
||||||
import com.dite.znpt.domain.Result;
|
|
||||||
import com.dite.znpt.domain.entity.BusinessDataFileEntity;
|
|
||||||
import com.dite.znpt.domain.page.PageBean;
|
|
||||||
import com.dite.znpt.mapper.BusinessDataFileMapper;
|
|
||||||
import com.dite.znpt.mapper.BusinessDataMapper;
|
|
||||||
import com.dite.znpt.service.BusinessDataFileService;
|
|
||||||
import com.dite.znpt.service.BusinessDataService;
|
|
||||||
import io.swagger.annotations.Api;
|
|
||||||
import io.swagger.annotations.ApiOperation;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
import java.io.*;
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
import com.dite.znpt.domain.entity.BusinessDataFileEntity;
|
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @Description: 商务资料管理,文件夹层
|
|
||||||
*/
|
|
||||||
|
|
||||||
@Api(tags = "文件接口")
|
|
||||||
@RestController
|
|
||||||
@Slf4j
|
|
||||||
@RequestMapping("/businessData/file")
|
|
||||||
@ApiOperation("商务资料管理,文件层")
|
|
||||||
public class BusinessDataFileController {
|
|
||||||
@Resource
|
|
||||||
private BusinessDataFileService businessDataFileService;
|
|
||||||
@Resource
|
|
||||||
private BusinessDataService businessDataService;
|
|
||||||
@Resource
|
|
||||||
private BusinessDataFileMapper businessDataFileMapper;
|
|
||||||
|
|
||||||
@ApiOperation(value = "分页查询文件", httpMethod = "GET")
|
|
||||||
@GetMapping("/list")
|
|
||||||
public Result pageSelect(@RequestParam(defaultValue = "1") Integer page,
|
|
||||||
@RequestParam(defaultValue = "10") Integer pageSize,
|
|
||||||
@RequestParam(defaultValue = "0") Long folderId) {
|
|
||||||
PageBean pageBean = businessDataFileService.pageSelect(page, pageSize, folderId);
|
|
||||||
return Result.ok(pageBean);
|
|
||||||
}
|
|
||||||
|
|
||||||
@ApiOperation(value = "增加文件")
|
|
||||||
@PostMapping("/add")
|
|
||||||
public Result add(@RequestParam("file") MultipartFile file,
|
|
||||||
@RequestParam Long folderId) {
|
|
||||||
System.out.println(file+" 77777777777777777777777777"+folderId);
|
|
||||||
|
|
||||||
if (file.isEmpty()) {
|
|
||||||
return Result.error("上传文件为空");
|
|
||||||
}
|
|
||||||
//TODO 以后可以优化,就算文件名一样,加个(1),(2)这种
|
|
||||||
|
|
||||||
try {
|
|
||||||
byte[] bytes = file.getBytes();
|
|
||||||
String uploadDir = businessDataService.getPath(folderId);
|
|
||||||
|
|
||||||
File uploadedFile = new File(uploadDir + "\\" + file.getOriginalFilename());
|
|
||||||
if(uploadedFile.exists()){
|
|
||||||
return Result.error("文件已存在");
|
|
||||||
}
|
|
||||||
file.transferTo(uploadedFile);
|
|
||||||
|
|
||||||
//保存文件信息到数据
|
|
||||||
BusinessDataFileEntity fileEntity = new BusinessDataFileEntity();
|
|
||||||
fileEntity.setFolderId(folderId);
|
|
||||||
fileEntity.setFileName(file.getOriginalFilename());
|
|
||||||
fileEntity.setFilePath(uploadDir+"\\"+file.getOriginalFilename());
|
|
||||||
fileEntity.setFileType(file.getContentType());
|
|
||||||
fileEntity.setFileSize(file.getSize());
|
|
||||||
fileEntity.setUploadTime(new Date() );
|
|
||||||
fileEntity.setUploaderId(0L);
|
|
||||||
System.out.println(uploadDir+"\\"+file.getOriginalFilename());
|
|
||||||
businessDataFileService.add(fileEntity);
|
|
||||||
|
|
||||||
return Result.okM("上传成功");
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return Result.error("上传失败");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@ApiOperation(value = "删除文件")
|
|
||||||
@DeleteMapping("/delete")
|
|
||||||
public Result delete(@RequestParam Long fileId) {
|
|
||||||
businessDataFileService.delete(fileId,null);
|
|
||||||
return Result.okM("删除成功");
|
|
||||||
}
|
|
||||||
@ApiOperation(value = "下载文件")
|
|
||||||
@GetMapping("/download")
|
|
||||||
public void download(@RequestParam("fileId") Long fileId , HttpServletResponse response) {
|
|
||||||
String path = businessDataFileService.getPath(fileId);
|
|
||||||
try {
|
|
||||||
// path是指想要下载的文件的路径
|
|
||||||
File file = new File(path);
|
|
||||||
log.info(file.getPath());
|
|
||||||
// 获取文件名
|
|
||||||
String filename = file.getName();
|
|
||||||
// 获取文件后缀名
|
|
||||||
String ext = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();
|
|
||||||
log.info("文件后缀名:" + ext);
|
|
||||||
|
|
||||||
// 将文件写入输入流
|
|
||||||
FileInputStream fileInputStream = new FileInputStream(file);
|
|
||||||
InputStream fis = new BufferedInputStream(fileInputStream);
|
|
||||||
byte[] buffer = new byte[fis.available()];
|
|
||||||
fis.read(buffer);
|
|
||||||
fis.close();
|
|
||||||
|
|
||||||
// 清空response
|
|
||||||
response.reset();
|
|
||||||
// 设置response的Header
|
|
||||||
response.setCharacterEncoding("UTF-8");
|
|
||||||
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
|
|
||||||
// 告知浏览器文件的大小
|
|
||||||
response.addHeader("Content-Length", "" + file.length());
|
|
||||||
OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
|
|
||||||
response.setContentType("application/octet-stream");
|
|
||||||
outputStream.write(buffer);
|
|
||||||
outputStream.flush();
|
|
||||||
} catch (IOException ex) {
|
|
||||||
ex.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
package com.dite.znpt.web.controller;
|
||||||
|
|
||||||
|
import com.dite.znpt.domain.PageResult;
|
||||||
|
import com.dite.znpt.domain.Result;
|
||||||
|
import com.dite.znpt.domain.vo.ProjectDailyReportListReq;
|
||||||
|
import com.dite.znpt.domain.vo.ProjectDailyReportReq;
|
||||||
|
import com.dite.znpt.domain.vo.ProjectDailyReportResp;
|
||||||
|
import com.dite.znpt.service.ProjectDailyReportService;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author huise23
|
||||||
|
* @date 2025/07/27 19:51
|
||||||
|
*/
|
||||||
|
@Api(tags = "项目日报信息")
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/project-daily-report")
|
||||||
|
public class ProjectDailyReportController {
|
||||||
|
@Resource
|
||||||
|
private ProjectDailyReportService projectDailyReportService;
|
||||||
|
|
||||||
|
@ApiOperation(value = "获取项目日报信息列表", httpMethod = "GET")
|
||||||
|
@GetMapping("/list")
|
||||||
|
public PageResult<ProjectDailyReportResp> list(ProjectDailyReportListReq projectDailyReportReq) {
|
||||||
|
return PageResult.ok(projectDailyReportService.selectList(projectDailyReportReq));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "根据项目日报信息Id获取详细信息", httpMethod = "GET")
|
||||||
|
@GetMapping("/{reportId}")
|
||||||
|
public Result<ProjectDailyReportResp> getInfo(@PathVariable String reportId) {
|
||||||
|
return Result.ok(projectDailyReportService.selectById(reportId));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "获取登录人当日日报", httpMethod = "GET")
|
||||||
|
@GetMapping("/my-today/{projectId}")
|
||||||
|
public Result<ProjectDailyReportResp> myToday(@PathVariable String projectId) {
|
||||||
|
return Result.ok(projectDailyReportService.myToday(projectId));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "新增项目日报信息", httpMethod = "POST")
|
||||||
|
@PostMapping
|
||||||
|
public Result<Object> add(@Validated @RequestBody ProjectDailyReportReq projectDailyReportReq) {
|
||||||
|
projectDailyReportService.saveData(projectDailyReportReq);
|
||||||
|
return Result.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "修改项目日报信息", httpMethod = "PUT")
|
||||||
|
@PutMapping
|
||||||
|
public Result<Object> edit(@Validated @RequestBody ProjectDailyReportReq projectDailyReportReq) {
|
||||||
|
projectDailyReportService.updateData(projectDailyReportReq);
|
||||||
|
return Result.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "删除项目日报信息", httpMethod = "DELETE")
|
||||||
|
@DeleteMapping("/{reportId}")
|
||||||
|
public Result<Object> remove(@PathVariable String reportId) {
|
||||||
|
projectDailyReportService.deleteById(reportId);
|
||||||
|
return Result.ok();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -5,7 +5,6 @@ import cn.dev33.satoken.stp.StpUtil;
|
||||||
import com.dite.znpt.constant.Constants;
|
import com.dite.znpt.constant.Constants;
|
||||||
import com.dite.znpt.domain.PageResult;
|
import com.dite.znpt.domain.PageResult;
|
||||||
import com.dite.znpt.domain.Result;
|
import com.dite.znpt.domain.Result;
|
||||||
import com.dite.znpt.domain.entity.ProjectTaskEntity;
|
|
||||||
import com.dite.znpt.domain.vo.*;
|
import com.dite.znpt.domain.vo.*;
|
||||||
import com.dite.znpt.service.ProjectTaskService;
|
import com.dite.znpt.service.ProjectTaskService;
|
||||||
import com.dite.znpt.util.PageUtil;
|
import com.dite.znpt.util.PageUtil;
|
||||||
|
@ -102,8 +101,7 @@ public class ProjectTaskController {
|
||||||
|
|
||||||
@ApiOperation(value = "查询我的任务", httpMethod = "GET")
|
@ApiOperation(value = "查询我的任务", httpMethod = "GET")
|
||||||
@GetMapping("/my")
|
@GetMapping("/my")
|
||||||
public Result<List<ProjectTaskResp>> my() {
|
public Result<List<ProjectTaskResp>> my(ProjectTaskListReq req) {
|
||||||
ProjectTaskListReq req = new ProjectTaskListReq();
|
|
||||||
req.setUserId(StpUtil.getLoginIdAsString());
|
req.setUserId(StpUtil.getLoginIdAsString());
|
||||||
return Result.ok(projectTaskService.selectList(req));
|
return Result.ok(projectTaskService.selectList(req));
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,77 @@
|
||||||
|
package com.dite.znpt.web.controller;
|
||||||
|
|
||||||
|
import com.dite.znpt.domain.Result;
|
||||||
|
import com.dite.znpt.domain.entity.RegulationEntity;
|
||||||
|
import com.dite.znpt.service.RegulationService;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author wangna
|
||||||
|
* @date 2025/07/29
|
||||||
|
* @Description: 制度规范仓库Controller
|
||||||
|
*/
|
||||||
|
@Api(tags = "制度管理")
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/regulation")
|
||||||
|
public class RegulationController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RegulationService regulationService;
|
||||||
|
|
||||||
|
@ApiOperation(value = "获取制度列表", httpMethod = "GET")
|
||||||
|
@GetMapping
|
||||||
|
public Result getRegulationList(@RequestParam(defaultValue = "1") int page,
|
||||||
|
@RequestParam(defaultValue = "10") int size,
|
||||||
|
@RequestParam(required = false) String status,
|
||||||
|
@RequestParam(required = false) String type,
|
||||||
|
@RequestParam(required = false) String title,
|
||||||
|
@RequestParam(required = false) String proposer) {
|
||||||
|
return regulationService.getRegulationList(page, size, status, type, title, proposer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "创建制度提案", httpMethod = "POST")
|
||||||
|
@PostMapping("/proposal")
|
||||||
|
public Result createRegulationProposal(@RequestBody RegulationEntity regulation) {
|
||||||
|
return regulationService.createRegulationProposal(regulation);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "更新制度提案", httpMethod = "PUT")
|
||||||
|
@PutMapping("/proposal/{regulationId}")
|
||||||
|
public Result updateRegulationProposal(@PathVariable String regulationId, @RequestBody RegulationEntity regulation) {
|
||||||
|
regulation.setRegulationId(regulationId);
|
||||||
|
return regulationService.updateRegulationProposal(regulation);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "删除制度提案", httpMethod = "DELETE")
|
||||||
|
@DeleteMapping("/proposal/{regulationId}")
|
||||||
|
public Result deleteRegulationProposal(@PathVariable String regulationId) {
|
||||||
|
return regulationService.deleteRegulationProposal(regulationId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "获取制度详情", httpMethod = "GET")
|
||||||
|
@GetMapping("/{regulationId}")
|
||||||
|
public Result getRegulationDetail(@PathVariable String regulationId) {
|
||||||
|
return regulationService.getRegulationDetail(regulationId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "确认制度知晓", httpMethod = "POST")
|
||||||
|
@PostMapping("/{regulationId}/confirm")
|
||||||
|
public Result confirmRegulation(@PathVariable String regulationId) {
|
||||||
|
return regulationService.confirmRegulation(regulationId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 点击确认公示后原本的制度草案就会进入十天公示期
|
||||||
|
* @param regulationId
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@ApiOperation(value = "公示制度", httpMethod = "POST")
|
||||||
|
@PostMapping("/{regulationId}/approve")
|
||||||
|
public Result approveRegulation(@PathVariable String regulationId) {
|
||||||
|
return regulationService.approveRegulation(regulationId);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
package com.dite.znpt.web.controller;
|
||||||
|
|
||||||
|
import com.dite.znpt.domain.Result;
|
||||||
|
import com.dite.znpt.domain.entity.RegulationTypeEntity;
|
||||||
|
import com.dite.znpt.service.RegulationTypeService;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 制度类型Controller
|
||||||
|
* @author wangna
|
||||||
|
* @date 2025/07/29
|
||||||
|
*/
|
||||||
|
@Api(tags = "制度类型管理")
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/regulation/types")
|
||||||
|
public class RegulationTypeController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RegulationTypeService regulationTypeService;
|
||||||
|
|
||||||
|
@ApiOperation(value = "获取制度类型列表", httpMethod = "GET")
|
||||||
|
@GetMapping
|
||||||
|
public Result getRegulationTypes(@RequestParam(defaultValue = "1") int page,
|
||||||
|
@RequestParam(defaultValue = "10") int size,
|
||||||
|
@RequestParam(required = false) String typeName,
|
||||||
|
@RequestParam(required = false) String status,
|
||||||
|
@RequestParam(required = false) String remark) {
|
||||||
|
return regulationTypeService.getRegulationTypes(page, size, typeName, status, remark);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "创建制度类型", httpMethod = "POST")
|
||||||
|
@PostMapping
|
||||||
|
public Result createRegulationType(@RequestBody RegulationTypeEntity regulationType) {
|
||||||
|
return regulationTypeService.createRegulationType(regulationType);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "更新制度类型", httpMethod = "PUT")
|
||||||
|
@PutMapping("/{typeId}")
|
||||||
|
public Result updateRegulationType(@PathVariable String typeId, @RequestBody RegulationTypeEntity regulationType) {
|
||||||
|
regulationType.setTypeId(typeId);
|
||||||
|
return regulationTypeService.updateRegulationType(regulationType);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "删除制度类型", httpMethod = "DELETE")
|
||||||
|
@DeleteMapping("/{typeId}")
|
||||||
|
public Result deleteRegulationType(@PathVariable String typeId) {
|
||||||
|
return regulationTypeService.deleteRegulationType(typeId);
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,7 +2,7 @@
|
||||||
server:
|
server:
|
||||||
# 服务器的HTTP端口,默认为8080
|
# 服务器的HTTP端口,默认为8080
|
||||||
port: 8888
|
port: 8888
|
||||||
address: 0.0.0.0
|
address : 0.0.0.0 # 监听所有网络接口
|
||||||
|
|
||||||
# 数据源配置
|
# 数据源配置
|
||||||
spring:
|
spring:
|
||||||
|
@ -100,39 +100,39 @@ sa-token:
|
||||||
# 是否输出操作日志
|
# 是否输出操作日志
|
||||||
is-log: true
|
is-log: true
|
||||||
|
|
||||||
sip-config:
|
#sip-config:
|
||||||
name: 信令服务
|
# name: 信令服务
|
||||||
ip: 127.0.0.1
|
# ip: 127.0.0.1
|
||||||
port: 1074
|
# port: 1074
|
||||||
charset: gb2312
|
# charset: gb2312
|
||||||
domain: 3402000000
|
# domain: 3402000000
|
||||||
id: 34020000002000000001
|
# id: 34020000002000000001
|
||||||
password: 123456
|
# password: 123456
|
||||||
mediaType: mp4
|
# mediaType: mp4
|
||||||
|
#
|
||||||
zlm-config:
|
#zlm-config:
|
||||||
# 流媒体名称
|
# # 流媒体名称
|
||||||
mediaName: 媒体服务
|
# mediaName: 媒体服务
|
||||||
# 流媒体服务商
|
# # 流媒体服务商
|
||||||
mediaService: ZLMdia
|
# mediaService: ZLMdia
|
||||||
# 公网ip
|
# # 公网ip
|
||||||
publicHost:
|
# publicHost:
|
||||||
# 接口ip
|
# # 接口ip
|
||||||
apiHost: 127.0.0.1
|
# apiHost: 127.0.0.1
|
||||||
# 接口端口
|
# # 接口端口
|
||||||
apiPort: 8080
|
# apiPort: 8080
|
||||||
# 密钥
|
# # 密钥
|
||||||
secretKey: 6Q76ivvVOQDsnnfOSKbtVzcYpbgy4n1G
|
# secretKey: 6Q76ivvVOQDsnnfOSKbtVzcYpbgy4n1G
|
||||||
# 流id前缀
|
# # 流id前缀
|
||||||
streamPrefix:
|
# streamPrefix:
|
||||||
# rtp ip
|
# # rtp ip
|
||||||
rtpHost: 127.0.0.1
|
# rtpHost: 127.0.0.1
|
||||||
# rtp 端口
|
# # rtp 端口
|
||||||
rtpPort: 8080
|
# rtpPort: 8080
|
||||||
# 动态端口起始值
|
# # 动态端口起始值
|
||||||
dynamicPortStart: 30150
|
# dynamicPortStart: 30150
|
||||||
# 动态端口结束值
|
# # 动态端口结束值
|
||||||
dynamicPortEnd: 30185
|
# dynamicPortEnd: 30185
|
||||||
|
|
||||||
upload:
|
upload:
|
||||||
# 此处仅定义总的父路径,细节定义到 FilePathEnum
|
# 此处仅定义总的父路径,细节定义到 FilePathEnum
|
||||||
|
@ -149,7 +149,3 @@ util:
|
||||||
imagePreTreatmentPath: d:\
|
imagePreTreatmentPath: d:\
|
||||||
reportGeneratorPath: D:\blade_report_generator.exe
|
reportGeneratorPath: D:\blade_report_generator.exe
|
||||||
reportGeneratorTemplatePath: D:\muban
|
reportGeneratorTemplatePath: D:\muban
|
||||||
|
|
||||||
file:
|
|
||||||
upload:
|
|
||||||
businessDataPath: D:/upload/businessData
|
|
||||||
|
|
Loading…
Reference in New Issue