diff --git a/core/src/main/java/com/dite/znpt/config/Schedule.java b/core/src/main/java/com/dite/znpt/config/Schedule.java index 8d5d41d..6b3c65a 100644 --- a/core/src/main/java/com/dite/znpt/config/Schedule.java +++ b/core/src/main/java/com/dite/znpt/config/Schedule.java @@ -7,6 +7,7 @@ import com.dite.znpt.domain.vo.PartResp; import com.dite.znpt.enums.FilePathEnum; import com.dite.znpt.service.ImageService; import com.dite.znpt.service.PartService; +import com.dite.znpt.service.job.AutoExpirationJobService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; @@ -26,6 +27,7 @@ public class Schedule { private final ImageService imageService; private final PartService partService; private final ExtUtilConfig extUtilConfig; + private final AutoExpirationJobService autoExpirationJobService; /** * 功能描述:图像预处理,持续运行 @@ -47,7 +49,7 @@ public class Schedule { List successList = new ArrayList<>(); for (ImageEntity image : list) { 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 outputDir = FilePathEnum.IMAGE.getFileAbsolutePathPrefix() .concat("已调整") @@ -67,4 +69,16 @@ public class Schedule { } imageService.updateBatchById(successList); } + + /** + * 功能描述:自动到期检测,每天凌晨2点执行 + * + * @author System + * @date 2025/1/1 + **/ + @Scheduled(cron = "0 0 2 * * ?") + public void autoExpirationCheck() { + log.info("开始执行自动到期检测定时任务..."); + autoExpirationJobService.executeAutoExpirationJob(); + } } diff --git a/core/src/main/java/com/dite/znpt/config/SwaggerConfig.java b/core/src/main/java/com/dite/znpt/config/SwaggerConfig.java index 5f30e05..d8a0536 100644 --- a/core/src/main/java/com/dite/znpt/config/SwaggerConfig.java +++ b/core/src/main/java/com/dite/znpt/config/SwaggerConfig.java @@ -38,7 +38,6 @@ public class SwaggerConfig { .enable(true)//开启Swagger文档 .select() .apis(RequestHandlerSelectors.basePackage("com.dite")) - .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) .paths(PathSelectors.any()) .build() .globalRequestParameters(parameters); diff --git a/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java b/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java index c09ff82..718f7ff 100644 --- a/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java +++ b/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java @@ -2,10 +2,14 @@ package com.dite.znpt.config; import cn.hutool.core.collection.ListUtil; import com.dite.znpt.enums.FilePathEnum; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; @@ -28,6 +32,14 @@ public class WebMvcConfig implements WebMvcConfigurer { } } + /** + * 配置HTTP消息转换器,确保UTF-8编码 + */ + @Override + public void configureMessageConverters(List> converters) { + converters.add(new StringHttpMessageConverter(StandardCharsets.UTF_8)); + } + // @Override // public void addInterceptors(InterceptorRegistry registry) { // // 注册 Sa-Token 拦截器,定义详细认证规则 diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index 842c55e..8e6398a 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -79,4 +79,10 @@ public class Message implements Serializable { public static final String EQUIPMENT_USE_RECORD_STATUS_ERROR = "设备使用记录状态不合法"; public static final String EQUIPMENT_IS_USED = "设备已被使用"; public static final String EQUIPMENT_IS_RETURN = "设备已归还"; + public static final String DAILY_REPORT_EXISTS = "当日已提交日报"; + public static final String BIDDING_INFO_ID_IS_NOT_EXIST = "招标信息id不存在"; + public static final String TENDER_INFO_ID_IS_NOT_EXIST = "投标信息id不存在"; + public static final String TENDER_INFO_IS_EXIST = "招标[{}]已存中投信息存在"; + public static final String OUTBID_INFO_ID_IS_NOT_EXIST = "中标信息id不存在"; + public static final String OUTBID_INFO_IS_EXIST = "招标[{}]已存中标信息存在"; } diff --git a/core/src/main/java/com/dite/znpt/converts/Converts.java b/core/src/main/java/com/dite/znpt/converts/Converts.java index bdfaf36..ea0dd55 100644 --- a/core/src/main/java/com/dite/znpt/converts/Converts.java +++ b/core/src/main/java/com/dite/znpt/converts/Converts.java @@ -126,5 +126,9 @@ public interface Converts { EquipmentEntity toEquipmentUseRecordEntity(EquipmentReq req); EquipmentUseRecordEntity toEquipmentUseRecordEntity(EquipmentUseRecordReq req); + BiddingInfoEntity toBiddingInfoReq (BiddingInfoReq req); + List toBiddingInfoReq (List req); + TenderInfoEntity toTenderInfoEntity (TenderInfoReq req); + OutbidInfoEntity toOutbidInfoEntity (OutbidInfoReq req); } diff --git a/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java b/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java index 0eb68a1..094855a 100644 --- a/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java @@ -1,20 +1,16 @@ package com.dite.znpt.domain; import com.alibaba.excel.annotation.ExcelIgnore; -import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; -import io.swagger.annotations.ApiParam; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; import java.io.Serial; import java.io.Serializable; import java.time.LocalDateTime; -import java.util.List; /** * @description: 统一定义顶层Entity实体审计 基类 @@ -41,11 +37,6 @@ public class AuditableEntity implements Serializable { @ApiModelProperty(value = "修改人id", hidden = true) private LocalDateTime updateTime; - @ExcelIgnore - @ApiModelProperty(value = "id集合", example = "[]", notes = "id集合") - @TableField(exist = false) - private List idList; - @ExcelIgnore @ApiModelProperty(value = "当前页", example = "1", notes = "0") @TableField(exist = false) diff --git a/core/src/main/java/com/dite/znpt/domain/dto/RegulationConfirmDTO.java b/core/src/main/java/com/dite/znpt/domain/dto/RegulationConfirmDTO.java new file mode 100644 index 0000000..63b99e1 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/dto/RegulationConfirmDTO.java @@ -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 +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/dto/RegulationTypeRequest.java b/core/src/main/java/com/dite/znpt/domain/dto/RegulationTypeRequest.java new file mode 100644 index 0000000..0c99771 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/dto/RegulationTypeRequest.java @@ -0,0 +1,27 @@ +package com.dite.znpt.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author wangna + * @date 2025/07/29 + * @Description: 制度类型请求DTO + */ +@Data +@ApiModel(value = "RegulationTypeRequest", description = "制度类型请求") +public class RegulationTypeRequest { + + @ApiModelProperty("类型名称") + private String typeName; + + @ApiModelProperty("排序顺序") + private Integer sortOrder; + + @ApiModelProperty("是否启用") + private String isEnabled; + + @ApiModelProperty("备注") + private String remark; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java index 5e1fb8c..ad09e56 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java @@ -43,6 +43,10 @@ public class AttachInfoEntity extends AuditableEntity implements Serializable { @TableField("business_type") private String businessType; + @ApiModelProperty("文件名") + @TableField("file_name") + private String fileName; + @ApiModelProperty("文件类型") @TableField("file_type") private String fileType; diff --git a/core/src/main/java/com/dite/znpt/domain/entity/AutoExpirationConfigEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/AutoExpirationConfigEntity.java new file mode 100644 index 0000000..7d9f608 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/AutoExpirationConfigEntity.java @@ -0,0 +1,84 @@ +package com.dite.znpt.domain.entity; + +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; + +/** + * @author System + * @date 2025/1/1 + * @description 自动到期检测配置实体 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("auto_expiration_config") +@ApiModel(value="AutoExpirationConfigEntity对象", description="自动到期检测配置") +public class AutoExpirationConfigEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ApiModelProperty("配置ID") + @TableId(value = "config_id", type = IdType.ASSIGN_UUID) + private String configId; + + @ApiModelProperty("表名") + @TableField("table_name") + private String tableName; + + @ApiModelProperty("表描述") + @TableField("table_desc") + private String tableDesc; + + @ApiModelProperty("主键字段") + @TableField("primary_key_field") + private String primaryKeyField; + + @ApiModelProperty("到期时间字段") + @TableField("expire_date_field") + private String expireDateField; + + @ApiModelProperty("关联用户字段") + @TableField("user_id_field") + private String userIdField; + + @ApiModelProperty("用户姓名字段") + @TableField("user_name_field") + private String userNameField; + + @ApiModelProperty("业务名称字段") + @TableField("business_name_field") + private String businessNameField; + + @ApiModelProperty("提前提醒天数") + @TableField("remind_days") + private Integer remindDays; + + @ApiModelProperty("是否启用(0-禁用,1-启用)") + @TableField("enabled") + private String enabled; + + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + @ApiModelProperty("删除标志(0代表存在,1代表删除)") + @TableField("del_flag") + private String delFlag; + + /** + * 保存前处理 + */ + public void preSave() { + // 可以在这里添加保存前的逻辑处理 + } +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/BiddingInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/BiddingInfoEntity.java new file mode 100644 index 0000000..349ebbd --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/BiddingInfoEntity.java @@ -0,0 +1,63 @@ +package com.dite.znpt.domain.entity; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.IdType; +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.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author Bear.G + * @date 2025/7/28/周一 15:42 + * @description + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("bidding_info") +@ApiModel(value="BiddingInfoEntity对象", description="招标信息表") +public class BiddingInfoEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = -2451841606051749490L; + + @ApiModelProperty("招标信息id") + @TableId(type = IdType.ASSIGN_UUID) + private String biddingInfoId; + + @ApiModelProperty("招标项目") + private String biddingProject; + + @ApiModelProperty("招标公司") + private String biddingCompany; + + @ApiModelProperty("招标金额") + private BigDecimal biddingAmount; + + @ApiModelProperty("招标截止时间") + private String biddingDeadline; + + @ApiModelProperty("招标信息录入时间") + private LocalDateTime infoEntryTime; + + @ApiModelProperty("招标信息来源") + private String source; + + @ApiModelProperty("招标信息来源网址") + private String sourceWebsite; + + @ApiModelProperty("招标文件id") + private String biddingFileId; + + @ApiModelProperty("状态:0-待报名,1-已报名") + private String status; + +} diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ContractEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ContractEntity.java index 3f1627d..e33d747 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ContractEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ContractEntity.java @@ -1,17 +1,20 @@ package com.dite.znpt.domain.entity; -import java.math.BigDecimal; -import java.util.Date; -import java.io.Serial; -import java.io.Serializable; - -import com.baomidou.mybatisplus.annotation.*; +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 com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; /** * @author huise23 @@ -82,6 +85,11 @@ public class ContractEntity extends AuditableEntity implements Serializable { @TableField("payment_date") private Date paymentDate; + @ExcelProperty("履约时间期限") + @ApiModelProperty("履约时间期限") + @TableField("performance_deadline") + private Date performanceDeadline; + @ExcelProperty("付款地址/交付地址") @ApiModelProperty("付款地址/交付地址") @TableField("payment_address") @@ -106,5 +114,10 @@ public class ContractEntity extends AuditableEntity implements Serializable { @ApiModelProperty("合同状态") @TableField("contract_status") private String contractStatus; + + @ExcelProperty("合同内容") + @ApiModelProperty("合同内容") + @TableField("contract_text") + private String contractText; } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ExpirationResultEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ExpirationResultEntity.java new file mode 100644 index 0000000..fb2fc23 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/ExpirationResultEntity.java @@ -0,0 +1,85 @@ +package com.dite.znpt.domain.entity; + +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 System + * @date 2025/1/1 + * @description 到期检测结果实体 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("expiration_result") +@ApiModel(value="ExpirationResultEntity对象", description="到期检测结果") +public class ExpirationResultEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ApiModelProperty("结果ID") + @TableId(value = "result_id", type = IdType.ASSIGN_UUID) + private String resultId; + + @ApiModelProperty("配置ID") + @TableField("config_id") + private String configId; + + @ApiModelProperty("表名") + @TableField("table_name") + private String tableName; + + @ApiModelProperty("业务ID") + @TableField("business_id") + private String businessId; + + @ApiModelProperty("业务名称") + @TableField("business_name") + private String businessName; + + @ApiModelProperty("关联用户ID") + @TableField("user_id") + private String userId; + + @ApiModelProperty("关联用户姓名") + @TableField("user_name") + private String userName; + + @ApiModelProperty("到期日期") + @TableField("expire_date") + private LocalDate expireDate; + + @ApiModelProperty("剩余天数") + @TableField("remaining_days") + private Integer remainingDays; + + @ApiModelProperty("状态(0-正常,1-即将到期,2-已到期)") + @TableField("status") + private String status; + + @ApiModelProperty("检测时间") + @TableField("check_time") + private java.time.LocalDateTime checkTime; + + @ApiModelProperty("删除标志(0代表存在,1代表删除)") + @TableField("del_flag") + private String delFlag; + + /** + * 保存前处理 + */ + public void preSave() { + // 可以在这里添加保存前的逻辑处理 + } +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java new file mode 100644 index 0000000..61230b8 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java @@ -0,0 +1,57 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +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.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author Bear.G + * @date 2025/7/28/周一 15:44 + * @description + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("outbid_info") +@ApiModel(value="OutbidInfoEntity对象", description="中标通知信息表") +public class OutbidInfoEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 6941283868242292970L; + + @ApiModelProperty("中标通知信息id") + @TableId(type = IdType.ASSIGN_UUID) + private String outbidInfoId; + + @ApiModelProperty("招标信息id") + private String biddingInfoId; + + @ApiModelProperty("中标金额,单位元,精确到分") + private BigDecimal outbidAmount; + + @ApiModelProperty("工期,单位天") + private Integer duration; + + @ApiModelProperty("中标通知日期") + private LocalDateTime outbidNotifyDate; + + @ApiModelProperty("中标通知文件") + private String outbidNoticeFileId; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("删除标志(0代表存在 1代表删除)") + @TableLogic(value = "0", delval = "1") + private String delFlag; +} diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectDailyReportEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectDailyReportEntity.java new file mode 100644 index 0000000..f995b26 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectDailyReportEntity.java @@ -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; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java index 69340af..943620b 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java @@ -1,18 +1,19 @@ package com.dite.znpt.domain.entity; -import java.io.Serializable; -import java.time.LocalDate; -import java.time.LocalDateTime; - -import com.baomidou.mybatisplus.annotation.*; +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 com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; 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.LocalDate; /** * @author huise23 @@ -100,24 +101,31 @@ public class ProjectEntity extends AuditableEntity implements Serializable { @TableField("turbine_model") private String turbineModel; - @ApiModelProperty("施工人员id") + // 人员管理已迁移到 project_member 表 + // 以下字段保留用于向后兼容,但建议使用 ProjectMemberService 进行人员管理 + @ApiModelProperty("施工人员id(已废弃,请使用ProjectMemberService)") @TableField("constructor_ids") + @Deprecated private String constructorIds; - @ApiModelProperty("安全员id") + @ApiModelProperty("安全员id(已废弃,请使用ProjectMemberService)") @TableField("auditor_id") + @Deprecated private String auditorId; - @ApiModelProperty("质量员id") + @ApiModelProperty("质量员id(已废弃,请使用ProjectMemberService)") @TableField("quality_officer_id") + @Deprecated private String qualityOfficerId; - @ApiModelProperty("项目经理id") + @ApiModelProperty("项目经理id(已废弃,请使用ProjectMemberService)") @TableField("project_manager_id") + @Deprecated private String projectManagerId; - @ApiModelProperty("施工组长id") + @ApiModelProperty("施工组长id(已废弃,请使用ProjectMemberService)") @TableField("construct_team_leader_id") + @Deprecated private String constructTeamLeaderId; @ApiModelProperty("技术方案图片,多个用逗号隔开") @@ -168,7 +176,7 @@ public class ProjectEntity extends AuditableEntity implements Serializable { @ApiModelProperty(value = "开始时间") private LocalDate startDate; - +// 施工人员,安全经理,项目经理,商务,财务,高级管理员,项目远程顾问外部协作者,质量经理、现场经理及工作组长。 @ApiModelProperty(value = "结束时间") private LocalDate endDate; diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectMemberEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectMemberEntity.java new file mode 100644 index 0000000..d3cc17a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectMemberEntity.java @@ -0,0 +1,99 @@ +package com.dite.znpt.domain.entity; + +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 wangna + * @date 2025/08/05 + * @Description: 项目人员关联表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("project_member") +@ApiModel(value="ProjectMemberEntity对象", description="项目人员关联表") +public class ProjectMemberEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ApiModelProperty("关联ID") + @TableId(value = "member_id", type = IdType.ASSIGN_UUID) + private String memberId; + + @ApiModelProperty("项目ID") + @TableField("project_id") + private String projectId; + + @ApiModelProperty("机组ID(可选,关联到具体机组)") + @TableField("turbine_id") + private String turbineId; + + @ApiModelProperty("任务组ID(可选,关联到具体任务组)") + @TableField("task_group_id") + private String taskGroupId; + + @ApiModelProperty("任务ID(可选,关联到具体任务)") + @TableField("task_id") + private String taskId; + + @ApiModelProperty("用户ID") + @TableField("user_id") + private String userId; + + @ApiModelProperty("项目角色类型:PROJECT_MANAGER-项目经理,SAFETY_OFFICER-安全员,QUALITY_OFFICER-质量员,CONSTRUCTOR-施工人员,TEAM_LEADER-施工组长") + @TableField("role_type") + private String roleType; + + @ApiModelProperty("具体岗位代码(如:GROUND_SERVICE-地勤,DRIVER-司机,ASCENDING-登高等)") + @TableField("job_code") + private String jobCode; + + @ApiModelProperty("岗位描述") + @TableField("job_desc") + private String jobDesc; + + @ApiModelProperty("加入时间") + @TableField("join_date") + private LocalDate joinDate; + + @ApiModelProperty("离开时间") + @TableField("leave_date") + private LocalDate leaveDate; + + @ApiModelProperty("状态:ACTIVE-在职,INACTIVE-离职,SUSPENDED-暂停") + @TableField("status") + private String status; + + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + // 非数据库字段,用于显示 + @TableField(exist = false) + @ApiModelProperty("用户姓名") + private String userName; + + @TableField(exist = false) + @ApiModelProperty("用户账号") + private String userAccount; + + @TableField(exist = false) + @ApiModelProperty("角色类型描述") + private String roleTypeDesc; + + @TableField(exist = false) + @ApiModelProperty("岗位代码描述") + private String jobCodeDesc; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/RegulationConfirmationEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/RegulationConfirmationEntity.java new file mode 100644 index 0000000..aad8e25 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/RegulationConfirmationEntity.java @@ -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; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/RegulationDraftEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/RegulationDraftEntity.java new file mode 100644 index 0000000..aaf7805 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/RegulationDraftEntity.java @@ -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; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java new file mode 100644 index 0000000..6dd36f1 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java @@ -0,0 +1,103 @@ +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 type; + + @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; + + @TableField(exist = false) + @ApiModelProperty("制度类型") + private String regulationType; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/RegulationProposalEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/RegulationProposalEntity.java new file mode 100644 index 0000000..bbf8c25 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/RegulationProposalEntity.java @@ -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; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/RegulationTypeEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/RegulationTypeEntity.java new file mode 100644 index 0000000..eb8154c --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/RegulationTypeEntity.java @@ -0,0 +1,59 @@ +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; + +/** + * @author wangna + * @date 2025/07/29 + * @Description: 制度类型实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("regulation_type") +@ApiModel(value="RegulationTypeEntity对象", description="制度类型") +public class RegulationTypeEntity extends AuditableEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @ExcelProperty("类型ID") + @ApiModelProperty("类型ID") + @TableId(value = "type_id", type = IdType.ASSIGN_UUID) + private String typeId; + + @ExcelProperty("类型名称") + @ApiModelProperty("类型名称") + @TableField("type_name") + private String typeName; + + @ExcelProperty("是否启用") + @ApiModelProperty("是否启用(1-启用,0-禁用)") + @TableField("is_enabled") + private String isEnabled; + + @ExcelProperty("排序顺序") + @ApiModelProperty("排序顺序") + @TableField("sort_order") + private Integer sortOrder; + + @ExcelProperty("备注") + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + @ExcelProperty("删除标志(0代表存在,1代表删除)") + @ApiModelProperty("删除标志(0代表存在,1代表删除)") + @TableField("del_flag") + private String delFlag; + + @TableField(exist = false) + @ApiModelProperty("创建人姓名") + private String createrName; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TenderInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TenderInfoEntity.java new file mode 100644 index 0000000..29ad3e4 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/TenderInfoEntity.java @@ -0,0 +1,63 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.Api; +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.math.BigDecimal; + +/** + * @author Bear.G + * @date 2025/7/28/周一 15:47 + * @description + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tender_info") +@ApiModel(value="TenderInfoEntity对象", description="投标信息表") +public class TenderInfoEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = -5677009089047831619L; + + @ApiModelProperty("投标信息id") + @TableId(type = IdType.ASSIGN_UUID) + private String tenderInfoId; + + @ApiModelProperty("招标信息id") + private String biddingInfoId; + + @ApiModelProperty("投标金额") + private BigDecimal tenderAmount; + + @ApiModelProperty("项目地址") + private String projectAddress; + + @ApiModelProperty("项目类型") + private String projectType; + + @ApiModelProperty("项目描述") + private String projectDescription; + + @ApiModelProperty("投标负责人") + private String tenderManager; + + @ApiModelProperty("投标负责人手机号") + private String tenderManagerPhone; + + @ApiModelProperty("投标文件") + private String tenderFileId; + + @ApiModelProperty("删除标志(0代表存在 1代表删除)") + @TableLogic(value = "0", delval = "1") + private String delFlag; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java index 11d8200..be5ce0d 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java @@ -24,6 +24,9 @@ public class AttachInfoReq implements Serializable { @ApiModelProperty("自定义路径") private String userDefinedPath; + @ApiModelProperty("文件名称") + private String fileName; + @ApiModelProperty("文件类型") private String fileType; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoResp.java index 027fea6..b56a7f7 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoResp.java @@ -32,6 +32,9 @@ public class AttachInfoResp implements Serializable { @ApiModelProperty("附件路径") private String attachPath; + @ApiModelProperty("文件名称") + private String fileName; + @ApiModelProperty("文件类型") private String fileType; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java new file mode 100644 index 0000000..54e5aef --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java @@ -0,0 +1,69 @@ +package com.dite.znpt.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:18 + * @description + */ +@Data +@ApiModel("招标信息请求实体") +public class BiddingInfoReq implements Serializable { + @Serial + private static final long serialVersionUID = 6967025339487392364L; + @ColumnWidth(40) + @ExcelProperty(index = 0, value = "招标项目") + @ApiModelProperty("招标项目") + @Size(max = 50, message = "招标项目不能超过50个字符") + private String biddingProject; + + @ColumnWidth(40) + @ExcelProperty(index = 1, value = "招标公司") + @ApiModelProperty("招标公司") + @Size(max = 50, message = "招标公司不能超过50个字符") + private String biddingCompany; + + @ColumnWidth(20) + @ExcelProperty(index = 2, value = "招标金额\n(单位元,精确到分)") + @ApiModelProperty("招标金额") + private BigDecimal biddingAmount; + + @ColumnWidth(30) + @ExcelProperty(index = 3, value = "招标截止时间\n(yyyy-MM-dd HH:mm:ss)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("招标截止时间") + private LocalDateTime biddingDeadline; + + @ColumnWidth(30) + @ExcelProperty(index = 4, value = "信息录入时间\n(yyyy-MM-dd HH:mm:ss)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("信息录入时间") + private LocalDateTime infoEntryTime; + + @ColumnWidth(20) + @ExcelProperty(index = 5, value = "信息来源") + @ApiModelProperty("信息来源") + @NotBlank(message = "信息来源不能为空") + @Size(max = 50, message = "信息来源不能超过50个字符") + private String source; + + @ColumnWidth(60) + @ExcelProperty(index = 6, value = "信息来源网址") + @ApiModelProperty("信息来源网址") + @NotBlank(message = "信息来源网址不能为空") + @Size(max = 100, message = "信息来源网址不能超过100个字符") + private String sourceWebsite; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java new file mode 100644 index 0000000..64a1797 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java @@ -0,0 +1,31 @@ +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; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:17 + * @description + */ +@Data +@ApiModel("招标信息响应实体") +public class BiddingInfoResp extends BiddingInfoReq implements Serializable { + @Serial + private static final long serialVersionUID = 2750666223381829115L; + + @ApiModelProperty("招标信息id") + private String biddingInfoId; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("招标文件地址") + private String attachPath; + + +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ContractListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ContractListReq.java index 9eb3e7a..fa58191 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ContractListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ContractListReq.java @@ -1,14 +1,14 @@ package com.dite.znpt.domain.vo; -import java.math.BigDecimal; -import java.util.Date; -import java.io.Serial; -import java.io.Serializable; - import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + /** * @author huise23 * @date 2025/07/21 21:13 @@ -57,6 +57,9 @@ public class ContractListReq implements Serializable { @ApiModelProperty("付款日期/交付日期") private Date paymentDate; + @ApiModelProperty("履约时间期限") + private Date performanceDeadline; + @ApiModelProperty("付款地址/交付地址") private String paymentAddress; @@ -72,5 +75,8 @@ public class ContractListReq implements Serializable { @ApiModelProperty("合同状态") private String contractStatus; + @ApiModelProperty("合同内容") + private String contractText; + } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ContractReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ContractReq.java index ace5f90..e6030cb 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ContractReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ContractReq.java @@ -1,21 +1,14 @@ package com.dite.znpt.domain.vo; -import java.math.BigDecimal; -import java.util.Date; -import java.io.Serial; -import java.io.Serializable; - -import com.baomidou.mybatisplus.annotation.*; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -import com.alibaba.excel.annotation.ExcelProperty; -import com.dite.znpt.util.ValidationGroup; -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.math.BigDecimal; +import java.util.Date; /** * @author huise23 * @date 2025/07/21 21:13 @@ -62,6 +55,9 @@ public class ContractReq implements Serializable { @ApiModelProperty("付款日期/交付日期") private Date paymentDate; + @ApiModelProperty("履约时间期限") + private Date performanceDeadline; + @ApiModelProperty("付款地址/交付地址") private String paymentAddress; @@ -76,5 +72,8 @@ public class ContractReq implements Serializable { @ApiModelProperty("合同状态") private String contractStatus; + + @ApiModelProperty("合同内容") + private String contractText; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java index 1809ea2..95d3a4d 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java @@ -27,6 +27,9 @@ public class ImageListReq implements Serializable { @ApiModelProperty("部件id") private String partId; + @ApiModelProperty("项目id") + private String projectId; + @ApiModelProperty("图像类型") private String[] imageTypes; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java index cadbfbf..72cc8ce 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java @@ -106,4 +106,8 @@ public class ImageListResp implements Serializable { @ApiModelProperty("项目id") private String projectId; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("上传时间") + private LocalDateTime createTime; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java index 3b628f1..e5600d7 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java @@ -1,11 +1,13 @@ package com.dite.znpt.domain.vo; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serial; import java.io.Serializable; +import java.time.LocalDateTime; import java.util.List; /** @@ -60,4 +62,8 @@ public class ImageResp implements Serializable { @ApiModelProperty("项目id") private String projectId; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("上传时间") + private LocalDateTime createTime; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java new file mode 100644 index 0000000..16386fa --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java @@ -0,0 +1,45 @@ +package com.dite.znpt.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author Bear.G + * @date 2025/7/28/周一 17:05 + * @description + */ +@Data +@ApiModel("中标信息请求实体") +public class OutbidInfoReq implements Serializable { + @Serial + private static final long serialVersionUID = -1781661335173747275L; + + @ApiModelProperty("中标信息ID") + @NotBlank(message = "中标信息ID不能为空") + private String biddingInfoId; + + @ApiModelProperty("中标金额") + private BigDecimal outbidAmount; + + @ApiModelProperty("工期") + private Integer duration; + + @ApiModelProperty("中标通知日期") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime outbidNotifyDate; + + @ApiModelProperty("中标通知文件") + private String outbidNoticeFileId; + + @ApiModelProperty("状态:0-已通知,1-已签约") + private String status; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java new file mode 100644 index 0000000..bfac3a3 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java @@ -0,0 +1,35 @@ +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; + +/** + * @author Bear.G + * @date 2025/7/28/周一 17:36 + * @description + */ +@Data +@ApiModel("中标信息响应实体") +public class OutbidInfoResp extends OutbidInfoReq implements Serializable { + @Serial + private static final long serialVersionUID = -718886028432322862L; + + @ApiModelProperty("中标信息ID") + private String outbidInfoId; + + @ApiModelProperty("招标项目") + private String biddingProject; + + @ApiModelProperty("招标公司") + private String biddingCompany; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("中标通知文件地址") + private String attachPath; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportListReq.java new file mode 100644 index 0000000..17aff44 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportListReq.java @@ -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; + +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportReq.java new file mode 100644 index 0000000..53b2aad --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportReq.java @@ -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; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportResp.java new file mode 100644 index 0000000..c41bdff --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportResp.java @@ -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; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectDetailResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDetailResp.java new file mode 100644 index 0000000..2266301 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDetailResp.java @@ -0,0 +1,180 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDate; +import java.util.List; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目详情响应VO + */ +@Data +@ApiModel(value="ProjectDetailResp对象", description="项目详情响应") +public class ProjectDetailResp { + + @ApiModelProperty("项目ID") + private String projectId; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("项目封面") + private String coverUrl; + + @ApiModelProperty("风场名称") + private String farmName; + + @ApiModelProperty("风场地址") + private String farmAddress; + + @ApiModelProperty("委托单位") + private String client; + + @ApiModelProperty("委托单位联系人") + private String clientContact; + + @ApiModelProperty("委托单位联系电话") + private String clientPhone; + + @ApiModelProperty("检查单位") + private String inspectionUnit; + + @ApiModelProperty("检查单位联系人") + private String inspectionContact; + + @ApiModelProperty("检查单位联系电话") + private String inspectionPhone; + + @ApiModelProperty("项目规模") + private String scale; + + @ApiModelProperty("总工期(天数)") + private Integer duration; + + @ApiModelProperty("风机型号") + private String turbineModel; + + @ApiModelProperty("项目状态") + private Integer status; + + @ApiModelProperty("项目状态描述") + private String statusLabel; + + @ApiModelProperty("开始时间") + private LocalDate startDate; + + @ApiModelProperty("结束时间") + private LocalDate endDate; + + @ApiModelProperty("创建时间") + private String createTime; + + @ApiModelProperty("更新时间") + private String updateTime; + + // 项目人员信息(从新关联表获取) + @ApiModelProperty("项目人员列表") + private List projectMembers; + + // 项目机组信息 + @ApiModelProperty("项目机组列表") + private List turbines; + + // 项目任务信息 + @ApiModelProperty("项目任务列表") + private List tasks; + + // 项目预算信息 + @ApiModelProperty("项目预算列表") + private List budgets; + + // 项目日报信息 + @ApiModelProperty("项目日报列表") + private List dailyReports; + + @Data + @ApiModel(value="TurbineInfo对象", description="机组信息") + public static class TurbineInfo { + @ApiModelProperty("机组ID") + private String turbineId; + + @ApiModelProperty("机组名称") + private String turbineName; + + @ApiModelProperty("机组编码") + private String turbineCode; + + @ApiModelProperty("机组状态") + private Integer status; + + @ApiModelProperty("机组状态描述") + private String statusLabel; + } + + @Data + @ApiModel(value="TaskInfo对象", description="任务信息") + public static class TaskInfo { + @ApiModelProperty("任务ID") + private String taskId; + + @ApiModelProperty("任务名称") + private String taskName; + + @ApiModelProperty("任务状态") + private Integer status; + + @ApiModelProperty("任务状态描述") + private String statusLabel; + + @ApiModelProperty("计划开始时间") + private LocalDate planStartDate; + + @ApiModelProperty("计划结束时间") + private LocalDate planEndDate; + + @ApiModelProperty("实际开始时间") + private LocalDate actualStartDate; + + @ApiModelProperty("实际结束时间") + private LocalDate actualEndDate; + } + + @Data + @ApiModel(value="BudgetInfo对象", description="预算信息") + public static class BudgetInfo { + @ApiModelProperty("预算ID") + private String budgetId; + + @ApiModelProperty("预算名称") + private String budgetName; + + @ApiModelProperty("预算类型") + private String budgetType; + + @ApiModelProperty("预算金额(万元)") + private Double budgetAmount; + + @ApiModelProperty("预算说明") + private String budgetDesc; + } + + @Data + @ApiModel(value="DailyReportInfo对象", description="日报信息") + public static class DailyReportInfo { + @ApiModelProperty("日报ID") + private String reportId; + + @ApiModelProperty("日报日期") + private LocalDate reportDate; + + @ApiModelProperty("日报提交人") + private String submitUserName; + + @ApiModelProperty("创建时间") + private String createTime; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectKanbanDataResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectKanbanDataResp.java new file mode 100644 index 0000000..f80c696 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectKanbanDataResp.java @@ -0,0 +1,107 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDate; +import java.util.List; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目看板数据响应VO + */ +@Data +@ApiModel(value="ProjectKanbanDataResp对象", description="项目看板数据响应") +public class ProjectKanbanDataResp { + + @ApiModelProperty("待施工项目列表") + private List pendingProjects; + + @ApiModelProperty("施工中项目列表") + private List inProgressProjects; + + @ApiModelProperty("已完工项目列表") + private List completedProjects; + + @ApiModelProperty("已审核项目列表") + private List auditedProjects; + + @ApiModelProperty("已验收项目列表") + private List acceptedProjects; + + @Data + @ApiModel(value="ProjectKanbanItem对象", description="项目看板项目项") + public static class ProjectKanbanItem { + + @ApiModelProperty("项目ID") + private String projectId; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("项目封面") + private String coverUrl; + + @ApiModelProperty("风场名称") + private String farmName; + + @ApiModelProperty("风场地址") + private String farmAddress; + + @ApiModelProperty("项目规模") + private String scale; + + @ApiModelProperty("总工期(天数)") + private Integer duration; + + @ApiModelProperty("风机型号") + private String turbineModel; + + @ApiModelProperty("项目状态") + private Integer status; + + @ApiModelProperty("项目状态描述") + private String statusLabel; + + @ApiModelProperty("开始时间") + private LocalDate startDate; + + @ApiModelProperty("结束时间") + private LocalDate endDate; + + @ApiModelProperty("项目经理") + private String projectManagerName; + + @ApiModelProperty("安全员") + private String safetyOfficerName; + + @ApiModelProperty("质量员") + private String qualityOfficerName; + + @ApiModelProperty("施工组长") + private String constructionTeamLeaderName; + + @ApiModelProperty("施工人员") + private String constructorNames; + + @ApiModelProperty("机组数量") + private Long turbineCount; + + @ApiModelProperty("任务数量") + private Long taskCount; + + @ApiModelProperty("已完成任务数量") + private Long completedTaskCount; + + @ApiModelProperty("项目进度百分比") + private Integer progressPercentage; + + @ApiModelProperty("创建时间") + private String createTime; + + @ApiModelProperty("更新时间") + private String updateTime; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectKanbanStatsResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectKanbanStatsResp.java new file mode 100644 index 0000000..fe2f6f0 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectKanbanStatsResp.java @@ -0,0 +1,81 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目看板统计数据响应VO + */ +@Data +@ApiModel(value="ProjectKanbanStatsResp对象", description="项目看板统计数据响应") +public class ProjectKanbanStatsResp { + + @ApiModelProperty("总项目数") + private Long totalProjectsCount; + + @ApiModelProperty("待施工项目数") + private Long pendingProjectCount; + + @ApiModelProperty("施工中项目数") + private Long inProgressProjectCount; + + @ApiModelProperty("已完工项目数") + private Long completedProjectCount; + + @ApiModelProperty("已审核项目数") + private Long auditedProjectCount; + + @ApiModelProperty("已验收项目数") + private Long acceptedProjectCount; + + @ApiModelProperty("总机组数") + private Long totalTurbineCount; + + @ApiModelProperty("待施工机组数") + private Long pendingTurbineCount; + + @ApiModelProperty("施工中机组数") + private Long inProgressTurbineCount; + + @ApiModelProperty("已完工机组数") + private Long completedTurbineCount; + + @ApiModelProperty("已审核机组数") + private Long auditedTurbineCount; + + @ApiModelProperty("已验收机组数") + private Long acceptedTurbineCount; + + @ApiModelProperty("总任务数") + private Long totalTaskCount; + + @ApiModelProperty("未开始任务数") + private Long pendingTaskCount; + + @ApiModelProperty("进行中任务数") + private Long inProgressTaskCount; + + @ApiModelProperty("已完成任务数") + private Long completedTaskCount; + + @ApiModelProperty("总人员数") + private Long totalMemberCount; + + @ApiModelProperty("项目经理数") + private Long projectManagerCount; + + @ApiModelProperty("安全员数") + private Long safetyOfficerCount; + + @ApiModelProperty("质量员数") + private Long qualityOfficerCount; + + @ApiModelProperty("施工人员数") + private Long constructorCount; + + @ApiModelProperty("施工组长数") + private Long teamLeaderCount; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberListReq.java new file mode 100644 index 0000000..92eda45 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberListReq.java @@ -0,0 +1,45 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目人员查询请求VO + */ +@Data +@ApiModel(value="ProjectMemberListReq对象", description="项目人员查询请求") +public class ProjectMemberListReq { + + @ApiModelProperty("项目ID") + private String projectId; + + @ApiModelProperty("机组ID") + private String turbineId; + + @ApiModelProperty("任务组ID") + private String taskGroupId; + + @ApiModelProperty("任务ID") + private String taskId; + + @ApiModelProperty("用户ID") + private String userId; + + @ApiModelProperty("角色类型") + private String roleType; + + @ApiModelProperty("岗位代码") + private String jobCode; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("用户姓名(模糊查询)") + private String userName; + + @ApiModelProperty("用户账号(模糊查询)") + private String userAccount; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberReq.java new file mode 100644 index 0000000..d2ffb17 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberReq.java @@ -0,0 +1,62 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.time.LocalDate; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目人员请求VO + */ +@Data +@ApiModel(value="ProjectMemberReq对象", description="项目人员请求") +public class ProjectMemberReq { + + @ApiModelProperty("关联ID(更新时必填)") + private String memberId; + + @NotBlank(message = "项目ID不能为空") + @ApiModelProperty("项目ID") + private String projectId; + + @ApiModelProperty("机组ID(可选)") + private String turbineId; + + @ApiModelProperty("任务组ID(可选)") + private String taskGroupId; + + @ApiModelProperty("任务ID(可选)") + private String taskId; + + @NotBlank(message = "用户ID不能为空") + @ApiModelProperty("用户ID") + private String userId; + + @NotBlank(message = "角色类型不能为空") + @ApiModelProperty("角色类型") + private String roleType; + + @ApiModelProperty("岗位代码") + private String jobCode; + + @ApiModelProperty("岗位描述") + private String jobDesc; + + @NotNull(message = "加入时间不能为空") + @ApiModelProperty("加入时间") + private LocalDate joinDate; + + @ApiModelProperty("离开时间") + private LocalDate leaveDate; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("备注") + private String remark; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberResp.java new file mode 100644 index 0000000..a633545 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberResp.java @@ -0,0 +1,83 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDate; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目人员响应VO + */ +@Data +@ApiModel(value="ProjectMemberResp对象", description="项目人员响应") +public class ProjectMemberResp { + + @ApiModelProperty("关联ID") + private String memberId; + + @ApiModelProperty("项目ID") + private String projectId; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("机组ID") + private String turbineId; + + @ApiModelProperty("机组名称") + private String turbineName; + + @ApiModelProperty("任务组ID") + private String taskGroupId; + + @ApiModelProperty("任务组名称") + private String taskGroupName; + + @ApiModelProperty("任务ID") + private String taskId; + + @ApiModelProperty("任务名称") + private String taskName; + + @ApiModelProperty("用户ID") + private String userId; + + @ApiModelProperty("用户姓名") + private String userName; + + @ApiModelProperty("用户账号") + private String userAccount; + + @ApiModelProperty("用户头像") + private String userAvatar; + + @ApiModelProperty("角色类型") + private String roleType; + + @ApiModelProperty("角色类型描述") + private String roleTypeDesc; + + @ApiModelProperty("岗位代码") + private String jobCode; + + @ApiModelProperty("岗位代码描述") + private String jobCodeDesc; + + @ApiModelProperty("岗位描述") + private String jobDesc; + + @ApiModelProperty("加入时间") + private LocalDate joinDate; + + @ApiModelProperty("离开时间") + private LocalDate leaveDate; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("备注") + private String remark; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoReq.java new file mode 100644 index 0000000..30f7f53 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoReq.java @@ -0,0 +1,53 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:23 + * @description + */ +@Data +@ApiModel("投标信息请求实体") +public class TenderInfoReq implements Serializable { + @Serial + private static final long serialVersionUID = -5653933337345116548L; + + @ApiModelProperty("招标信息id") + @NotBlank(message = "招标信息id不能为空") + private String biddingInfoId; + + @ApiModelProperty("投标金额") + private BigDecimal tenderAmount; + + @ApiModelProperty("项目地址") + @Size(max = 500, message = "项目地址不能超过500个字符") + private String projectAddress; + + @ApiModelProperty("项目类型,枚举:ProjectTypeEnum") + private String projectType; + + @ApiModelProperty("招标负责人") + @Size(min = 32, max = 32, message = "招标负责人长度必须为32个字符") + private String tenderManager; + + @Size(min = 11, max = 11, message = "招标负责人联系方式长度必须为11个字符") + @ApiModelProperty("招标负责人联系方式") + private String tenderManagerPhone; + + @ApiModelProperty("投标文件") + private String tenderFileId; + + @Size(max = 500, message = "项目描述不能超过500个字符") + @ApiModelProperty("项目描述") + private String projectDescription; + +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java new file mode 100644 index 0000000..97e8028 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java @@ -0,0 +1,45 @@ +package com.dite.znpt.domain.vo; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:50 + * @description + */ + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:49 + * @description + */ +@Data +@ApiModel("投标信息响应实体") +public class TenderInfoResp extends TenderInfoReq implements Serializable { + @Serial + private static final long serialVersionUID = -8445413467535624096L; + + @ApiModelProperty("投标标信息ID") + private String tenderInfoId; + + @ApiModelProperty("招标项目") + private String biddingProject; + + @ApiModelProperty("招标公司") + private String biddingCompany; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("投标文件地址") + private String attachPath; + + @ApiModelProperty("投标负责人姓名") + private String tenderManagerName; + +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/UserResp.java b/core/src/main/java/com/dite/znpt/domain/vo/UserResp.java index db10ead..d461435 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/UserResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/UserResp.java @@ -19,7 +19,7 @@ public class UserResp extends UserReq implements Serializable{ @Serial private static final long serialVersionUID = -2831232930040845716L; - @ApiModelProperty("用户名") + @ApiModelProperty("用户id") private String userId; @ApiModelProperty("所属部门") @@ -39,6 +39,8 @@ public class UserResp extends UserReq implements Serializable{ @ApiModelProperty("在职状态描述") private String userStatusLabel; + @ApiModelProperty("用户姓名") + private String userName; diff --git a/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java index 4e008b3..1be8f4b 100644 --- a/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java @@ -19,6 +19,10 @@ public enum AttachBusinessTypeEnum { DEFECT_MARK_PIC("defect_mark_pic", "缺陷标注图片"), REPORT("report", "报告"), PROJECT_BUDGE("project_budge", "预算文件"), + PROJECT_DAILY_REPORT("project_daily_report", "项目日报文件"), + BIDDING_INFO("bidding_info", "招标信息"), + TENDER_INFO("tender_info", "投标信息"), + OUTBID_INFO("outbid_info", "中标信息"), ; private final String code; private final String desc; diff --git a/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java b/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java index 3c522a7..46760f8 100644 --- a/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java @@ -55,4 +55,23 @@ public enum FilePathEnum { 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; + } } diff --git a/core/src/main/java/com/dite/znpt/enums/ProjectJobCodeEnum.java b/core/src/main/java/com/dite/znpt/enums/ProjectJobCodeEnum.java new file mode 100644 index 0000000..fd50316 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/ProjectJobCodeEnum.java @@ -0,0 +1,72 @@ +package com.dite.znpt.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目岗位代码枚举 + */ +@Getter +@AllArgsConstructor +public enum ProjectJobCodeEnum { + + // 地勤相关岗位 + GROUND_SERVICE("GROUND_SERVICE", "地勤"), + GROUND_SERVICE_LEADER("GROUND_SERVICE_LEADER", "地勤组长"), + + // 司机相关岗位 + DRIVER("DRIVER", "司机"), + DRIVER_LEADER("DRIVER_LEADER", "司机组长"), + + // 登高相关岗位 + ASCENDING("ASCENDING", "登高"), + ASCENDING_LEADER("ASCENDING_LEADER", "登高组长"), + + // 防雷相关岗位 + ANTI_THUNDER("ANTI_THUNDER", "防雷"), + ANTI_THUNDER_LEADER("ANTI_THUNDER_LEADER", "防雷组长"), + + // 外部工作相关岗位 + OUT_WORK("OUT_WORK", "外部工作"), + OUT_WORK_LEADER("OUT_WORK_LEADER", "外部工作组长"), + + // 管理岗位 + PROJECT_MANAGER("PROJECT_MANAGER", "项目经理"), + SAFETY_MANAGER("SAFETY_MANAGER", "安全经理"), + QUALITY_MANAGER("QUALITY_MANAGER", "质量经理"), + SITE_MANAGER("SITE_MANAGER", "现场经理"), + + // 其他岗位 + TECHNICIAN("TECHNICIAN", "技术员"), + SUPERVISOR("SUPERVISOR", "监理"), + COORDINATOR("COORDINATOR", "协调员"); + + private final String code; + private final String desc; + + /** + * 根据代码获取描述 + */ + public static String getDescByCode(String code) { + for (ProjectJobCodeEnum jobCode : values()) { + if (jobCode.getCode().equals(code)) { + return jobCode.getDesc(); + } + } + return ""; + } + + /** + * 根据代码获取枚举 + */ + public static ProjectJobCodeEnum getByCode(String code) { + for (ProjectJobCodeEnum jobCode : values()) { + if (jobCode.getCode().equals(code)) { + return jobCode; + } + } + return null; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/enums/ProjectRoleTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/ProjectRoleTypeEnum.java new file mode 100644 index 0000000..a750a4c --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/ProjectRoleTypeEnum.java @@ -0,0 +1,53 @@ +package com.dite.znpt.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目角色类型枚举 + */ +@Getter +@AllArgsConstructor +public enum ProjectRoleTypeEnum { + + PROJECT_MANAGER("PROJECT_MANAGER", "项目经理"), + SAFETY_OFFICER("SAFETY_OFFICER", "安全员"), + QUALITY_OFFICER("QUALITY_OFFICER", "质量员"), + CONSTRUCTOR("CONSTRUCTOR", "施工人员"), + TEAM_LEADER("TEAM_LEADER", "施工组长"), + SENIOR_PROJECT_MANAGER("SENIOR_PROJECT_MANAGER", "大项目经理"), + REMOTE_ADVISOR("REMOTE_ADVISOR", "项目远程顾问"), + EXTERNAL_COLLABORATOR("EXTERNAL_COLLABORATOR", "外部协作者"), + FINANCIAL_MANAGER("FINANCIAL_MANAGER", "财务经理"), + BUSINESS_MANAGER("BUSINESS_MANAGER", "商务经理"), + SITE_MANAGER("SITE_MANAGER", "现场经理"); + + private final String code; + private final String desc; + + /** + * 根据代码获取描述 + */ + public static String getDescByCode(String code) { + for (ProjectRoleTypeEnum roleType : values()) { + if (roleType.getCode().equals(code)) { + return roleType.getDesc(); + } + } + return ""; + } + + /** + * 根据代码获取枚举 + */ + public static ProjectRoleTypeEnum getByCode(String code) { + for (ProjectRoleTypeEnum roleType : values()) { + if (roleType.getCode().equals(code)) { + return roleType; + } + } + return null; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/enums/ProjectTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/ProjectTypeEnum.java new file mode 100644 index 0000000..c5e19b4 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/ProjectTypeEnum.java @@ -0,0 +1,49 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:35 + * @description + */ +@Getter +@AllArgsConstructor +public enum ProjectTypeEnum { + BLADE_CHECK("blade_check", "风电叶片检查"), + OPERATION("operation", "风电运维"), + INSTALL("install", "风电安装"), + OTHER("other", "其他"); + + private final String code; + private final String desc; + + public static ProjectTypeEnum getByCode(String code){ + for (ProjectTypeEnum e : ProjectTypeEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static String getDescByCode(String code){ + ProjectTypeEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List listAll(){ + List list = new ArrayList<>(ProjectTypeEnum.values().length); + for (ProjectTypeEnum e : ProjectTypeEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(String.valueOf(e.code), e.desc); + list.add(jsonObject); + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/mapper/AutoExpirationConfigMapper.java b/core/src/main/java/com/dite/znpt/mapper/AutoExpirationConfigMapper.java new file mode 100644 index 0000000..5ea8531 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/AutoExpirationConfigMapper.java @@ -0,0 +1,14 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.AutoExpirationConfigEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author System + * @date 2025/1/1 + * @description 自动到期检测配置Mapper + */ +@Mapper +public interface AutoExpirationConfigMapper extends BaseMapper { +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/BiddingInfoMapper.java b/core/src/main/java/com/dite/znpt/mapper/BiddingInfoMapper.java new file mode 100644 index 0000000..58e377f --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/BiddingInfoMapper.java @@ -0,0 +1,18 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.BiddingInfoEntity; +import com.dite.znpt.domain.vo.BiddingInfoResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:06 + * @description + */ +public interface BiddingInfoMapper extends BaseMapper { + + List listBiddingInfoResp(@Param("projectName") String projectName); +} diff --git a/core/src/main/java/com/dite/znpt/mapper/ExpirationResultMapper.java b/core/src/main/java/com/dite/znpt/mapper/ExpirationResultMapper.java new file mode 100644 index 0000000..b6d3991 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/ExpirationResultMapper.java @@ -0,0 +1,14 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.ExpirationResultEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author System + * @date 2025/1/1 + * @description 到期检测结果Mapper + */ +@Mapper +public interface ExpirationResultMapper extends BaseMapper { +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/OutbidInfoMapper.java b/core/src/main/java/com/dite/znpt/mapper/OutbidInfoMapper.java new file mode 100644 index 0000000..4c51729 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/OutbidInfoMapper.java @@ -0,0 +1,19 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.OutbidInfoEntity; +import com.dite.znpt.domain.vo.OutbidInfoResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:11 + * @description + */ +public interface OutbidInfoMapper extends BaseMapper { + List listOutbidInfoResp(@Param("projectName") String projectName); + + OutbidInfoResp getOutbidInfoResp(@Param("outbidInfoId") String outbidInfoId); +} diff --git a/core/src/main/java/com/dite/znpt/mapper/ProjectDailyReportMapper.java b/core/src/main/java/com/dite/znpt/mapper/ProjectDailyReportMapper.java new file mode 100644 index 0000000..be32858 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/ProjectDailyReportMapper.java @@ -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 { + List queryBySelective(ProjectDailyReportListReq projectDailyReportReq); +} + diff --git a/core/src/main/java/com/dite/znpt/mapper/ProjectMemberMapper.java b/core/src/main/java/com/dite/znpt/mapper/ProjectMemberMapper.java new file mode 100644 index 0000000..d514e90 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/ProjectMemberMapper.java @@ -0,0 +1,54 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.ProjectMemberEntity; +import com.dite.znpt.domain.vo.ProjectMemberListReq; +import com.dite.znpt.domain.vo.ProjectMemberResp; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目人员关联表Mapper接口 + */ +@Mapper +public interface ProjectMemberMapper extends BaseMapper { + + /** + * 根据条件查询项目人员列表 + */ + List queryBySelective(ProjectMemberListReq req); + + /** + * 根据项目ID查询项目人员列表 + */ + List queryByProjectId(@Param("projectId") String projectId); + + /** + * 根据机组ID查询机组人员列表 + */ + List queryByTurbineId(@Param("turbineId") String turbineId); + + /** + * 根据任务组ID查询任务组人员列表 + */ + List queryByTaskGroupId(@Param("taskGroupId") String taskGroupId); + + /** + * 根据任务ID查询任务人员列表 + */ + List queryByTaskId(@Param("taskId") String taskId); + + /** + * 根据用户ID查询用户参与的项目列表 + */ + List queryByUserId(@Param("userId") String userId); + + /** + * 根据项目ID和角色类型查询人员列表 + */ + List queryByProjectIdAndRoleType(@Param("projectId") String projectId, @Param("roleType") String roleType); +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/RegulationConfirmationMapper.java b/core/src/main/java/com/dite/znpt/mapper/RegulationConfirmationMapper.java new file mode 100644 index 0000000..ac6846c --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/RegulationConfirmationMapper.java @@ -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 { +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/RegulationMapper.java b/core/src/main/java/com/dite/znpt/mapper/RegulationMapper.java new file mode 100644 index 0000000..d8c7506 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/RegulationMapper.java @@ -0,0 +1,35 @@ +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 { + + /** + * 分页查询制度列表(包含创建人姓名) + * @param page 分页参数 + * @param status 状态 + * @param type 类型 + * @param title 提案标题 + * @param proposer 提案人 + * @param confirmStatus 确认状态 + * @param userId 当前用户ID + * @return 分页结果 + */ + Page selectRegulationListWithCreator(Page page, + @Param("status") String status, + @Param("type") String type, + @Param("title") String title, + @Param("proposer") String proposer, + @Param("confirmStatus") String confirmStatus, + @Param("userId") String userId); +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/RegulationTypeMapper.java b/core/src/main/java/com/dite/znpt/mapper/RegulationTypeMapper.java new file mode 100644 index 0000000..801d72e --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/RegulationTypeMapper.java @@ -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 { + + /** + * 分页查询制度类型列表(包含创建人姓名) + * @param page 分页参数 + * @param typeName 类型名称 + * @param status 是否启用(1-启用,0-禁用) + * @param remark 备注 + * @return 分页结果 + */ + Page selectRegulationTypeListWithCreator(Page page, + @Param("typeName") String typeName, + @Param("status") String status, + @Param("remark") String remark); +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/TenderInfoMapper.java b/core/src/main/java/com/dite/znpt/mapper/TenderInfoMapper.java new file mode 100644 index 0000000..a3f004c --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/TenderInfoMapper.java @@ -0,0 +1,20 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.TenderInfoEntity; +import com.dite.znpt.domain.vo.TenderInfoResp; +import org.apache.ibatis.annotations.Param; +import org.springframework.web.bind.annotation.PathVariable; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:08 + * @description + */ +public interface TenderInfoMapper extends BaseMapper { + List listTenderInfoResp(@Param("projectName") String projectName); + + TenderInfoResp getTenderInfoResp(@Param("tenderInfoId") String tenderInfoId); +} diff --git a/core/src/main/java/com/dite/znpt/service/AttachInfoService.java b/core/src/main/java/com/dite/znpt/service/AttachInfoService.java index 3c4987f..d8cdeb6 100644 --- a/core/src/main/java/com/dite/znpt/service/AttachInfoService.java +++ b/core/src/main/java/com/dite/znpt/service/AttachInfoService.java @@ -23,7 +23,7 @@ public interface AttachInfoService extends IService { * @author huise23 * @date 2025/04/11 23:17 **/ - List listByBusinessIds(List businessIds, String businessType); + List listByBusinessIds(List businessIds, AttachBusinessTypeEnum businessType); /** * 功能描述:新增附件信息 diff --git a/core/src/main/java/com/dite/znpt/service/AutoExpirationService.java b/core/src/main/java/com/dite/znpt/service/AutoExpirationService.java new file mode 100644 index 0000000..35d2b76 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/AutoExpirationService.java @@ -0,0 +1,61 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.AutoExpirationConfigEntity; +import com.dite.znpt.domain.entity.ExpirationResultEntity; + +import java.util.List; +import java.util.Map; + +/** + * @author System + * @date 2025/1/1 + * @description 自动到期检测服务接口 + */ +public interface AutoExpirationService extends IService { + + /** + * 执行自动到期检测 + */ + void executeAutoExpirationCheck(); + + /** + * 获取到期检测结果 + * @param status 状态筛选 + * @return 检测结果列表 + */ + List getExpirationResults(String status); + + /** + * 获取统计信息 + * @return 统计信息 + */ + Map getStatistics(); + + /** + * 手动检测指定表 + * @param tableName 表名 + */ + void checkTableExpiration(String tableName); + + /** + * 检查表是否已配置到期检测 + * @param tableName 表名 + * @return 配置信息,如果未配置返回null + */ + AutoExpirationConfigEntity getTableConfig(String tableName); + + /** + * 批量检查多个表的配置状态 + * @param tableNames 表名列表 + * @return 配置状态映射 + */ + Map getTablesConfigStatus(List tableNames); + + /** + * 智能配置表检测 + * @param tableName 表名 + * @return 配置结果 + */ + AutoExpirationConfigEntity autoConfigureTable(String tableName); +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java b/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java new file mode 100644 index 0000000..b4d67d0 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java @@ -0,0 +1,26 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.entity.BiddingInfoEntity; +import com.dite.znpt.domain.vo.BiddingInfoReq; +import com.dite.znpt.domain.vo.BiddingInfoResp; +import org.springframework.validation.BindingResult; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:06 + * @description + */ +public interface BiddingInfoService extends IService { + + List page(String projectName); + List list(String projectName); + void save(BiddingInfoReq req); + void update(String biddingInfoId, BiddingInfoReq req); + void uploadBiddingInfoFile(String biddingInfoId, String biddingFileId); + void apply(String biddingInfoId); + Result importData(List dataList, BindingResult bindingResult); +} diff --git a/core/src/main/java/com/dite/znpt/service/ImageService.java b/core/src/main/java/com/dite/znpt/service/ImageService.java index 4bab57b..1e2bb9e 100644 --- a/core/src/main/java/com/dite/znpt/service/ImageService.java +++ b/core/src/main/java/com/dite/znpt/service/ImageService.java @@ -25,7 +25,7 @@ public interface ImageService extends IService { List batchUploadDefectImage(String partId, String imageSource, ImageCollectReq collectReq, MultipartFile[] files); - List uploadProjectBatch(String projectId, String imageSource, MultipartFile[] files); + List uploadProjectBatch(String projectId, String imageSource, ImageCollectReq collectReq, MultipartFile[] files); List batchUploadCommonImage(String imageSource, ImageWorkReq imageWorkReq, MultipartFile[] file) throws IOException; diff --git a/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java b/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java new file mode 100644 index 0000000..0325149 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java @@ -0,0 +1,25 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.OutbidInfoEntity; +import com.dite.znpt.domain.vo.OutbidInfoReq; +import com.dite.znpt.domain.vo.OutbidInfoResp; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:11 + * @description + */ +public interface OutbidInfoService extends IService { + + List page(String projectName); + List list(String projectName); + OutbidInfoResp detail(String outbidInfoId); + void save(OutbidInfoReq req); + void update(String outbidInfoId, OutbidInfoReq req); + void deleteById(String outbidInfoId); + void downLoadOutbidNoticeFile(String outbidFileId, HttpServletResponse response) throws Exception; +} diff --git a/core/src/main/java/com/dite/znpt/service/ProjectDailyReportService.java b/core/src/main/java/com/dite/znpt/service/ProjectDailyReportService.java new file mode 100644 index 0000000..e11a964 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/ProjectDailyReportService.java @@ -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 { + + /** + * 功能描述:查询项目日报信息列表 + * + * @param projectDailyReportReq 项目日报信息 + * @return {@link List }<{@link ProjectDailyReportResp }> + * @author huise23 + * @date 2025/07/27 19:51 + **/ + List 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); +} + diff --git a/core/src/main/java/com/dite/znpt/service/ProjectMemberService.java b/core/src/main/java/com/dite/znpt/service/ProjectMemberService.java new file mode 100644 index 0000000..9004093 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/ProjectMemberService.java @@ -0,0 +1,107 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.ProjectMemberEntity; +import com.dite.znpt.domain.vo.*; + +import java.util.List; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目人员关联表服务接口 + */ +public interface ProjectMemberService extends IService { + + /** + * 查询项目人员列表 + */ + List selectList(ProjectMemberListReq req); + + /** + * 根据项目ID查询项目人员列表 + */ + List selectByProjectId(String projectId); + + /** + * 根据机组ID查询机组人员列表 + */ + List selectByTurbineId(String turbineId); + + /** + * 根据任务组ID查询任务组人员列表 + */ + List selectByTaskGroupId(String taskGroupId); + + /** + * 根据任务ID查询任务人员列表 + */ + List selectByTaskId(String taskId); + + /** + * 根据用户ID查询用户参与的项目列表 + */ + List selectByUserId(String userId); + + /** + * 根据项目ID和角色类型查询人员列表 + */ + List selectByProjectIdAndRoleType(String projectId, String roleType); + + /** + * 新增项目人员 + */ + void saveData(ProjectMemberReq req); + + /** + * 更新项目人员 + */ + void updateData(ProjectMemberReq req); + + /** + * 删除项目人员 + */ + void deleteById(String memberId); + + /** + * 批量添加项目人员 + */ + void batchAddMembers(List reqList); + + /** + * 根据项目ID删除所有项目人员 + */ + void deleteByProjectId(String projectId); + + /** + * 根据机组ID删除所有机组人员 + */ + void deleteByTurbineId(String turbineId); + + /** + * 根据任务组ID删除所有任务组人员 + */ + void deleteByTaskGroupId(String taskGroupId); + + /** + * 根据任务ID删除所有任务人员 + */ + void deleteByTaskId(String taskId); + + // ========================== 项目看板相关方法 ========================== + + /** + * 获取项目看板统计数据 + */ + ProjectKanbanStatsResp getProjectKanbanStats(); + + /** + * 获取项目看板数据 + */ + ProjectKanbanDataResp getProjectKanbanData(); + + /** + * 获取项目详情 + */ + ProjectDetailResp getProjectDetail(String projectId); +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/RegulationConfirmationService.java b/core/src/main/java/com/dite/znpt/service/RegulationConfirmationService.java new file mode 100644 index 0000000..f92847b --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/RegulationConfirmationService.java @@ -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 { + // 继承自IService的方法已经足够使用 + // 包括:save, update, remove, list, page, lambdaQuery等 +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/RegulationService.java b/core/src/main/java/com/dite/znpt/service/RegulationService.java new file mode 100644 index 0000000..25652f9 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/RegulationService.java @@ -0,0 +1,68 @@ +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 { + + /** + * 获取制度列表 + * @param page 页码 + * @param pageSize 页大小 + * @param status 状态 + * @param type 类型 + * @param title 提案标题 + * @param proposer 提案人 + * @param confirmStatus 确认状态 + * @return 结果 + */ + Result getRegulationList(Integer page, Integer pageSize, String status, String type, String title, String proposer, String confirmStatus); + + /** + * 创建制度提案 + * @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); +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/RegulationTypeService.java b/core/src/main/java/com/dite/znpt/service/RegulationTypeService.java new file mode 100644 index 0000000..e221f60 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/RegulationTypeService.java @@ -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 { + + /** + * 获取制度类型列表 + * @param page 页码 + * @param size 页大小 + * @param typeName 类型名称 + * @param status 是否启用(1-启用,0-禁用) + * @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); +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/RoleMenuService.java b/core/src/main/java/com/dite/znpt/service/RoleMenuService.java index f7f150b..aa837f5 100644 --- a/core/src/main/java/com/dite/znpt/service/RoleMenuService.java +++ b/core/src/main/java/com/dite/znpt/service/RoleMenuService.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.RoleMenuEntity; import com.dite.znpt.domain.vo.RoleMenuReq; -import java.util.List; /** * @author Bear.G @@ -12,6 +11,5 @@ import java.util.List; * @description */ public interface RoleMenuService extends IService { - void bindRoleMenu(RoleMenuReq req); } diff --git a/core/src/main/java/com/dite/znpt/service/TenderInfoService.java b/core/src/main/java/com/dite/znpt/service/TenderInfoService.java new file mode 100644 index 0000000..a767f49 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/TenderInfoService.java @@ -0,0 +1,23 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.TenderInfoEntity; +import com.dite.znpt.domain.vo.TenderInfoReq; +import com.dite.znpt.domain.vo.TenderInfoResp; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:09 + * @description + */ +public interface TenderInfoService extends IService { + List page(String projectName); + List list(String projectName); + TenderInfoResp detail(String tenderInfoId); + void save(TenderInfoReq req); + void update(String tenderInfoId, TenderInfoReq req); + void deleteById(String tenderInfoId); + +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java index 93c77dd..7236292 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java @@ -30,6 +30,7 @@ import java.net.URLEncoder; import java.rmi.ServerException; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; /** @@ -51,9 +52,9 @@ public class AttachInfoServiceImpl extends ServiceImpl listByBusinessIds(List businessIds, String businessType) { + public List listByBusinessIds(List businessIds, AttachBusinessTypeEnum businessType) { return lambdaQuery().in(AttachInfoEntity::getBusinessId, businessIds) - .eq(StrUtil.isNotEmpty(businessType), AttachInfoEntity::getBusinessType, businessType) + .eq(Objects.nonNull(businessType), AttachInfoEntity::getBusinessType, businessType.getCode()) .list(); } @@ -81,9 +82,11 @@ public class AttachInfoServiceImpl extends ServiceImpl batchUpload(String imageId, MultipartFile[] files) { ImageEntity image = imageMapper.selectById(imageId); if(null == image){ @@ -120,7 +122,7 @@ public class AudioFileInfoServiceImpl extends ServiceImpl implements AutoExpirationService { + + @Autowired + private ExpirationResultMapper expirationResultMapper; + + @Autowired + private JdbcTemplate jdbcTemplate; + + @Override + public void executeAutoExpirationCheck() { + log.info("开始执行自动到期检测..."); + + // 获取所有启用的配置 + List configs = lambdaQuery() + .eq(AutoExpirationConfigEntity::getEnabled, "1") + .eq(AutoExpirationConfigEntity::getDelFlag, "0") + .list(); + + if (CollUtil.isEmpty(configs)) { + log.info("没有找到启用的到期检测配置"); + return; + } + + // 清空之前的检测结果 + expirationResultMapper.delete(null); + + // 逐个检测每个配置的表 + for (AutoExpirationConfigEntity config : configs) { + try { + checkTableExpiration(config); + } catch (Exception e) { + log.error("检测表 {} 时发生错误: {}", config.getTableName(), e.getMessage(), e); + } + } + + log.info("自动到期检测完成,共检测 {} 个表", configs.size()); + } + + @Override + public List getExpirationResults(String status) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ExpirationResultEntity::getDelFlag, "0"); + + if (StrUtil.isNotBlank(status)) { + wrapper.eq(ExpirationResultEntity::getStatus, status); + } + + wrapper.orderByDesc(ExpirationResultEntity::getExpireDate); + + return expirationResultMapper.selectList(wrapper); + } + + @Override + public Map getStatistics() { + Map statistics = new HashMap<>(); + + // 统计各状态的数量 + List allResults = expirationResultMapper.selectList(null); + + long normalCount = allResults.stream() + .filter(r -> "0".equals(r.getStatus())) + .count(); + long expiringCount = allResults.stream() + .filter(r -> "1".equals(r.getStatus())) + .count(); + long expiredCount = allResults.stream() + .filter(r -> "2".equals(r.getStatus())) + .count(); + + statistics.put("total", allResults.size()); + statistics.put("normal", normalCount); + statistics.put("expiring", expiringCount); + statistics.put("expired", expiredCount); + + return statistics; + } + + @Override + public void checkTableExpiration(String tableName) { + AutoExpirationConfigEntity config = lambdaQuery() + .eq(AutoExpirationConfigEntity::getTableName, tableName) + .eq(AutoExpirationConfigEntity::getEnabled, "1") + .one(); + + if (config == null) { + throw new RuntimeException("未找到表 " + tableName + " 的配置信息"); + } + + checkTableExpiration(config); + } + + /** + * 检测指定配置的表 + */ + private void checkTableExpiration(AutoExpirationConfigEntity config) { + log.info("开始检测表: {}", config.getTableName()); + + // 构建查询SQL + String sql = buildQuerySql(config); + + try { + List> results = jdbcTemplate.queryForList(sql); + + for (Map row : results) { + processExpirationResult(config, row); + } + + log.info("表 {} 检测完成,共处理 {} 条记录", config.getTableName(), results.size()); + + } catch (Exception e) { + log.error("检测表 {} 时发生错误: {}", config.getTableName(), e.getMessage(), e); + } + } + + /** + * 构建查询SQL + */ + private String buildQuerySql(AutoExpirationConfigEntity config) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT "); + sql.append(config.getPrimaryKeyField()).append(" as business_id, "); + sql.append(config.getExpireDateField()).append(" as expire_date "); + + if (StrUtil.isNotBlank(config.getUserIdField())) { + sql.append(", ").append(config.getUserIdField()).append(" as user_id "); + } + if (StrUtil.isNotBlank(config.getUserNameField())) { + sql.append(", ").append(config.getUserNameField()).append(" as user_name "); + } + if (StrUtil.isNotBlank(config.getBusinessNameField())) { + sql.append(", ").append(config.getBusinessNameField()).append(" as business_name "); + } + + sql.append(" FROM ").append(config.getTableName()); + sql.append(" WHERE ").append(config.getExpireDateField()).append(" IS NOT NULL"); + + return sql.toString(); + } + + /** + * 处理到期检测结果 + */ + private void processExpirationResult(AutoExpirationConfigEntity config, Map row) { + try { + ExpirationResultEntity result = new ExpirationResultEntity(); + result.preSave(); + + result.setConfigId(config.getConfigId()); + result.setTableName(config.getTableName()); + result.setBusinessId(String.valueOf(row.get("business_id"))); + result.setBusinessName(String.valueOf(row.get("business_name"))); + result.setUserId(String.valueOf(row.get("user_id"))); + result.setUserName(String.valueOf(row.get("user_name"))); + + // 处理到期日期 + Object expireDateObj = row.get("expire_date"); + if (expireDateObj != null) { + LocalDate expireDate = parseDate(expireDateObj); + result.setExpireDate(expireDate); + + // 计算剩余天数和状态 + LocalDate today = LocalDate.now(); + long remainingDays = ChronoUnit.DAYS.between(today, expireDate); + result.setRemainingDays((int) remainingDays); + + // 设置状态 + if (remainingDays < 0) { + result.setStatus("2"); // 已到期 + } else if (remainingDays <= config.getRemindDays()) { + result.setStatus("1"); // 即将到期 + } else { + result.setStatus("0"); // 正常 + } + } + + result.setCheckTime(LocalDateTime.now()); + result.setDelFlag("0"); + + expirationResultMapper.insert(result); + + } catch (Exception e) { + log.error("处理检测结果时发生错误: {}", e.getMessage(), e); + } + } + + /** + * 解析日期 + */ + private LocalDate parseDate(Object dateObj) { + if (dateObj instanceof LocalDate) { + return (LocalDate) dateObj; + } else if (dateObj instanceof java.sql.Date) { + return ((java.sql.Date) dateObj).toLocalDate(); + } else if (dateObj instanceof java.util.Date) { + // 使用 DateUtil.toLocalDateTime 然后转换为 LocalDate + return DateUtil.toLocalDateTime((java.util.Date) dateObj).toLocalDate(); + } else { + return LocalDate.parse(dateObj.toString()); + } + } + + @Override + public AutoExpirationConfigEntity getTableConfig(String tableName) { + return lambdaQuery() + .eq(AutoExpirationConfigEntity::getTableName, tableName) + .eq(AutoExpirationConfigEntity::getEnabled, "1") + .eq(AutoExpirationConfigEntity::getDelFlag, "0") + .one(); + } + + @Override + public Map getTablesConfigStatus(List tableNames) { + Map statusMap = new HashMap<>(); + + if (CollUtil.isEmpty(tableNames)) { + return statusMap; + } + + // 查询所有已配置的表 + List configs = lambdaQuery() + .in(AutoExpirationConfigEntity::getTableName, tableNames) + .eq(AutoExpirationConfigEntity::getEnabled, "1") + .eq(AutoExpirationConfigEntity::getDelFlag, "0") + .list(); + + // 构建已配置的表名集合 + Set configuredTables = configs.stream() + .map(AutoExpirationConfigEntity::getTableName) + .collect(Collectors.toSet()); + + // 为每个表设置配置状态 + for (String tableName : tableNames) { + statusMap.put(tableName, configuredTables.contains(tableName)); + } + + return statusMap; + } + + @Override + public AutoExpirationConfigEntity autoConfigureTable(String tableName) { + // 检查是否已配置 + AutoExpirationConfigEntity existingConfig = getTableConfig(tableName); + if (existingConfig != null) { + log.info("表 {} 已存在配置", tableName); + return existingConfig; + } + + // 根据表名生成默认配置 + AutoExpirationConfigEntity config = generateDefaultConfig(tableName); + + try { + config.preSave(); + save(config); + log.info("为表 {} 自动创建配置", tableName); + return config; + } catch (Exception e) { + log.error("自动配置表 {} 失败: {}", tableName, e.getMessage(), e); + throw new RuntimeException("自动配置失败: " + e.getMessage()); + } + } + + /** + * 根据表名生成默认配置 + */ + private AutoExpirationConfigEntity generateDefaultConfig(String tableName) { + AutoExpirationConfigEntity config = new AutoExpirationConfigEntity(); + config.setConfigId("config-" + System.currentTimeMillis()); + config.setTableName(tableName); + config.setEnabled("1"); + config.setDelFlag("0"); + config.setRemindDays(30); + config.setRemark("自动配置的到期检测"); + + // 根据表名设置默认字段 + switch (tableName) { + case "certification": + config.setTableDesc("证书到期检测"); + config.setPrimaryKeyField("certification_id"); + config.setExpireDateField("validity_date_end"); + config.setUserIdField("user_id"); + config.setBusinessNameField("certification_name"); + break; + case "insurance_info": + config.setTableDesc("保险到期检测"); + config.setPrimaryKeyField("insurance_id"); + config.setExpireDateField("expire_date"); + config.setUserIdField("user_id"); + config.setBusinessNameField("insurance_name"); + break; + case "regulation": + config.setTableDesc("规章制度到期检测"); + config.setPrimaryKeyField("regulation_id"); + config.setExpireDateField("expire_date"); + config.setUserIdField("create_by"); + config.setBusinessNameField("regulation_name"); + break; + default: + // 通用配置 + config.setTableDesc(tableName + "到期检测"); + config.setPrimaryKeyField("id"); + config.setExpireDateField("expire_date"); + config.setUserIdField("user_id"); + config.setBusinessNameField("name"); + break; + } + + return config; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/impl/BiddingInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/BiddingInfoServiceImpl.java new file mode 100644 index 0000000..52e974b --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/BiddingInfoServiceImpl.java @@ -0,0 +1,112 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.entity.AttachInfoEntity; +import com.dite.znpt.domain.entity.BiddingInfoEntity; +import com.dite.znpt.domain.vo.BiddingInfoReq; +import com.dite.znpt.domain.vo.BiddingInfoResp; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.BiddingInfoMapper; +import com.dite.znpt.service.AttachInfoService; +import com.dite.znpt.service.BiddingInfoService; +import com.dite.znpt.util.PageUtil; +import com.pig4cloud.plugin.excel.vo.ErrorMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.BindingResult; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:07 + * @description + */ +@Service +public class BiddingInfoServiceImpl extends ServiceImpl implements BiddingInfoService { + + @Resource + private AttachInfoService attachInfoService; + @Override + public List page(String projectName) { + PageUtil.startPage(); + return this.list(projectName); + } + + @Override + public List list(String projectName) { + return this.baseMapper.listBiddingInfoResp(projectName); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void save(BiddingInfoReq req) { + BiddingInfoEntity entity = Converts.INSTANCE.toBiddingInfoReq(req); + this.save(entity); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void update(String biddingInfoId, BiddingInfoReq req) { + BiddingInfoEntity biddingInfo = this.getById(biddingInfoId); + if(null ==biddingInfo){ + throw new ServiceException(Message.BIDDING_INFO_ID_IS_NOT_EXIST); + } + BiddingInfoEntity entity = Converts.INSTANCE.toBiddingInfoReq(req); + entity.setBiddingInfoId(biddingInfoId); + this.updateById(entity); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void uploadBiddingInfoFile(String biddingInfoId, String biddingFileId) { + BiddingInfoEntity entity = this.getById(biddingInfoId); + if(null ==entity){ + throw new ServiceException(Message.BIDDING_INFO_ID_IS_NOT_EXIST); + } + AttachInfoEntity attachInfo = attachInfoService.getById(biddingFileId); + if(null == attachInfo || !Constants.DEL_FLAG_0.equals(attachInfo.getDelFlag())){ + throw new ServiceException(Message.ATTACH_INFO_IS_NOT_EXIST); + } + entity.setBiddingFileId(biddingFileId); + this.updateById(entity); + + attachInfo.setBusinessId(biddingInfoId); + attachInfoService.updateById(attachInfo); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void apply(String biddingInfoId) { + BiddingInfoEntity entity = this.getById(biddingInfoId); + if(null ==entity){ + throw new ServiceException(Message.BIDDING_INFO_ID_IS_NOT_EXIST); + } + entity.setStatus("1"); + this.updateById(entity); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public Result importData(List dataList, BindingResult bindingResult) { + List sourceWebsites = dataList.stream().map(BiddingInfoReq::getSourceWebsite).distinct().toList(); + if(sourceWebsites.size() != dataList.size()){ + return Result.error(Constants.SERVICE_EXCEPTION, "导入失败,存在重复数据"); + } + List existSourceWebsites = this.list().stream().map(BiddingInfoEntity::getSourceWebsite).toList(); + if(CollUtil.containsAny(existSourceWebsites, sourceWebsites)){ + return Result.error(Constants.SERVICE_EXCEPTION, "导入失败,存在重复数据"); + } + this.saveBatch(Converts.INSTANCE.toBiddingInfoReq(dataList)); + return Result.okM("导入"+ dataList.size()+"条数据"); + } +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java index f20ee9f..33b0407 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java @@ -198,7 +198,7 @@ public class DefectServiceImpl extends ServiceImpl i } image.setImageType(ImageTypeEnum.DEFECT.getCode()); 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()); // 写入attach同层级文件夹下 String attachPath = FilePathEnum.ATTACH.getUrlPath() + StrUtil.removePrefix(image.getImagePath(), pathEnum.getUrlPath()); diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java index 1aac248..0c6496f 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java @@ -8,8 +8,8 @@ import com.dite.znpt.converts.Converts; import com.dite.znpt.domain.entity.ImageCollectEntity; import com.dite.znpt.domain.entity.ImageEntity; 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.ImageSourceEnum; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.ImageCollectMapper; import com.dite.znpt.service.ImageCollectService; @@ -20,9 +20,10 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.io.File; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; /** * @Author: gaoxiong @@ -49,21 +50,21 @@ public class ImageCollectServiceImpl extends ServiceImpl imageList = Converts.INSTANCE.toImageEntity(req.getImageList()); - 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); + Map imageMap = req.getImageList().stream().collect(Collectors.toMap(ImageReq::getImageId, Function.identity(), (a,b) -> b)); + List imageList = imageService.listByIds(imageMap.keySet()); imageList.forEach(image -> { image.setPartId(partId); image.setCollectId(imageCollect.getCollectId()); image.setImageType(req.getImageType()); image.setImageTypeLabel(req.getImageTypeLabel()); - String path = permPathPrefix + image.getImageName(); - String fileAbsolutePath = FilePathEnum.IMAGE_TEMP.getFileAbsolutePath(image.getImagePath()); - File file = FileUtil.file(fileAbsolutePath); - if (file.exists()) { - FileUtil.copy(file, FileUtil.file(path), true); - image.setImagePath(FilePathEnum.IMAGE.getFileDownPath(path)); - FileUtil.del(file); + if (FilePathEnum.getFilePathEnum(image.getImagePath()).equals(FilePathEnum.IMAGE_TEMP)) { + String newImagePath = image.getImagePath().replace(FilePathEnum.IMAGE_TEMP.getUrlPath(), FilePathEnum.IMAGE.getUrlPath()); + String oldFileAbsolutePath = FilePathEnum.IMAGE_TEMP.getFileAbsolutePath(image.getImagePath()); + File oldFile = FileUtil.file(oldFileAbsolutePath); + if (oldFile.exists()) { + FileUtil.move(oldFile, FileUtil.file(newImagePath), true); + image.setImagePath(newImagePath); + } } }); imageService.saveOrUpdateBatch(imageList); diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index 347f678..c997492 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -64,6 +64,7 @@ public class ImageServiceImpl extends ServiceImpl impl private PartService partService; @Autowired private AudioFileInfoService audioFileInfoService; + @Autowired private ProjectService projectService; @Autowired private UserService userService; @@ -140,10 +141,13 @@ public class ImageServiceImpl extends ServiceImpl impl if (StrUtil.isEmpty(imageSource) || Objects.isNull(ImageSourceEnum.getByCode(imageSource))) { throw new ServiceException(Message.IMAGE_SOURCE_IS_NOT_EXIST); } - PartResp partResp = partService.detail(partId); if(null == files || files.length == 0){ throw new ServiceException(Message.IMAGE_IS_EMPTY); } + PartResp partResp = partService.detail(partId); + if (Objects.isNull(partResp)) { + throw new ServiceException(Message.PART_ID_IS_NOT_EXIST); + } List list = new ArrayList<>(files.length); File temCategory = new File(FilePathEnum.IMAGE_TEMP.getFileAbsolutePathPrefix()); if (!temCategory.exists()) { @@ -160,7 +164,7 @@ public class ImageServiceImpl extends ServiceImpl impl if (!file.isEmpty()) { try { String path = temPathPrefix + file.getOriginalFilename(); - FileUtil.writeBytes(file.getBytes(),path); + FileUtil.writeFromStream(file.getInputStream(),path); String fileDownPath = FilePathEnum.IMAGE_TEMP.getFileDownPath(path); ImageReq imageReq = imageRespBuilder(path, fileDownPath); imageReq.setImageId(IdUtil.simpleUUID()); @@ -184,7 +188,7 @@ public class ImageServiceImpl extends ServiceImpl impl @SneakyThrows @Override - public List uploadProjectBatch(String projectId, String imageSource, MultipartFile[] files) { + public List uploadProjectBatch(String projectId, String imageSource, ImageCollectReq collectReq, MultipartFile[] files) { if (Objects.isNull(projectService.getById(projectId))) { throw new ServiceException(Message.PROJECT_ID_IS_NOT_EXIST); } @@ -201,13 +205,13 @@ public class ImageServiceImpl extends ServiceImpl impl List list = new ArrayList<>(files.length); List imageList = new ArrayList<>(); - ImageCollectEntity imageCollect = new ImageCollectEntity(); + ImageCollectEntity imageCollect = Optional.ofNullable(BeanUtil.copyProperties(collectReq, ImageCollectEntity.class)).orElse(new ImageCollectEntity()); imageCollect.setCollectId(IdUtil.simpleUUID()); imageCollect.setCollectorId(StpUtil.getLoginIdAsString()); imageCollect.setCollectorName(userService.getById(StpUtil.getLoginIdAsString()).getName()); for (MultipartFile multipartFile : files) { String absolutePath = path_prefix + multipartFile.getOriginalFilename(); - FileUtil.writeBytes(multipartFile.getBytes(),absolutePath); + FileUtil.writeFromStream(multipartFile.getInputStream(),absolutePath); String fileDownPath = FilePathEnum.IMAGE.getFileDownPath(absolutePath); ImageEntity imageEntity = new ImageEntity(); try { @@ -296,7 +300,7 @@ public class ImageServiceImpl extends ServiceImpl impl if(CollUtil.isEmpty(imageList)){ 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(FilePathEnum.IMAGE.getFileAbsolutePath(image.getPreImagePath())); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/OutbidInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/OutbidInfoServiceImpl.java new file mode 100644 index 0000000..ffee7fa --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/OutbidInfoServiceImpl.java @@ -0,0 +1,125 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.entity.AttachInfoEntity; +import com.dite.znpt.domain.entity.OutbidInfoEntity; +import com.dite.znpt.domain.vo.OutbidInfoReq; +import com.dite.znpt.domain.vo.OutbidInfoResp; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.OutbidInfoMapper; +import com.dite.znpt.service.AttachInfoService; +import com.dite.znpt.service.BiddingInfoService; +import com.dite.znpt.service.OutbidInfoService; +import com.dite.znpt.util.PageUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:12 + * @description + */ +@Service +public class OutbidInfoServiceImpl extends ServiceImpl implements OutbidInfoService { + + @Resource + private BiddingInfoService biddingInfoService; + + @Resource + private AttachInfoService attachInfoService; + + @Override + public List page(String projectName) { + PageUtil.startPage(); + return this.list(projectName); + } + + @Override + public List list(String projectName) { + return this.baseMapper.listOutbidInfoResp(projectName); + } + + @Override + public OutbidInfoResp detail(String outbidInfoId) { + return this.baseMapper.getOutbidInfoResp(outbidInfoId); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void save(OutbidInfoReq req) { + OutbidInfoEntity entity = Converts.INSTANCE.toOutbidInfoEntity(req); + if(!listByBiddingInfoId(req.getBiddingInfoId()).isEmpty()){ + throw new ServiceException(StrUtil.format(Message.OUTBID_INFO_IS_EXIST, req.getBiddingInfoId())); + } + this.save(entity); + if(StrUtil.isNotBlank(req.getOutbidNoticeFileId())){ + AttachInfoEntity attachInfo = attachInfoService.getById(req.getOutbidNoticeFileId()); + if(null == attachInfo || !Constants.DEL_FLAG_0.equals(attachInfo.getDelFlag())){ + throw new ServiceException(Message.ATTACH_INFO_IS_NOT_EXIST); + } + attachInfo.setBusinessId(entity.getOutbidInfoId()); + attachInfoService.updateById(attachInfo); + } + } + + private List listByBiddingInfoId(String biddingInfoId){ + return this.list(Wrappers.lambdaQuery().eq(OutbidInfoEntity::getBiddingInfoId, biddingInfoId)); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void update(String outbidInfoId, OutbidInfoReq req) { + OutbidInfoEntity outbidInfo = this.getById(outbidInfoId); + if(null == outbidInfo){ + throw new ServiceException(Message.OUTBID_INFO_ID_IS_NOT_EXIST); + } + if(!outbidInfo.getBiddingInfoId().equals(req.getBiddingInfoId())){ + if(!listByBiddingInfoId(req.getBiddingInfoId()).isEmpty()){ + throw new ServiceException(StrUtil.format(Message.OUTBID_INFO_IS_EXIST, req.getBiddingInfoId())); + } + } + OutbidInfoEntity entity = Converts.INSTANCE.toOutbidInfoEntity(req); + entity.setOutbidInfoId(outbidInfoId); + this.updateById(entity); + if(StrUtil.isNotBlank(req.getOutbidNoticeFileId())){ + AttachInfoEntity attachInfo = attachInfoService.getById(req.getOutbidNoticeFileId()); + if(null == attachInfo || !Constants.DEL_FLAG_0.equals(attachInfo.getDelFlag())){ + throw new ServiceException(Message.ATTACH_INFO_IS_NOT_EXIST); + } + attachInfo.setBusinessId(outbidInfoId); + attachInfoService.updateById(attachInfo); + }else { + if(StrUtil.isNotBlank(outbidInfo.getOutbidNoticeFileId())){ + attachInfoService.deleteByAttachInfoId(outbidInfo.getOutbidNoticeFileId()); + } + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteById(String outbidInfoId) { + OutbidInfoEntity outbidInfo = this.getById(outbidInfoId); + if(null == outbidInfo){ + throw new ServiceException(Message.OUTBID_INFO_ID_IS_NOT_EXIST); + } + this.removeById(outbidInfoId); + if(StrUtil.isNotBlank(outbidInfo.getOutbidNoticeFileId())){ + attachInfoService.deleteByAttachInfoId(outbidInfo.getOutbidNoticeFileId()); + } + } + + @Override + public void downLoadOutbidNoticeFile(String outbidNoticeFileId, HttpServletResponse response) throws Exception { + attachInfoService.download(outbidNoticeFileId, response); + } + +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java index 43e9b92..4f6ef6a 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java @@ -99,7 +99,7 @@ public class PartServiceImpl extends ServiceImpl impleme if(StrUtil.isNotEmpty(turbine.getProjectId())){ ProjectEntity project = projectService.getById(turbine.getProjectId()); if(null != project){ - resp.setProjectId(resp.getProjectId()); + resp.setProjectId(project.getProjectId()); resp.setProjectName(project.getProjectName()); } } diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectDailyReportServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectDailyReportServiceImpl.java new file mode 100644 index 0000000..f04dfca --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectDailyReportServiceImpl.java @@ -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 implements ProjectDailyReportService { + + private final AttachInfoService attachInfoService; + + /** + * 功能描述:查询项目日报信息列表 + * + * @param projectDailyReportReq 项目日报信息信息 + * @return {@link List }<{@link ProjectDailyReportResp }> + * @author huise23 + * @date 2025/07/27 19:51 + **/ + @Override + public List selectList(ProjectDailyReportListReq projectDailyReportReq) { + PageUtil.startPage(); + List respList= this.baseMapper.queryBySelective(projectDailyReportReq); + if (CollUtil.isNotEmpty(respList)) { + List reportIds = respList.stream().map(ProjectDailyReportResp::getReportId).toList(); + Map 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 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 list = selectList(req); + if (CollUtil.isNotEmpty(list)){ + return CollUtil.getFirst(list); + } + return null; + } + +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java new file mode 100644 index 0000000..8c51d1d --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java @@ -0,0 +1,413 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Message; +import com.dite.znpt.domain.entity.*; +import com.dite.znpt.domain.vo.*; +import com.dite.znpt.enums.ProjectJobCodeEnum; +import com.dite.znpt.enums.ProjectRoleTypeEnum; +import com.dite.znpt.enums.ProjectStatusEnum; +import com.dite.znpt.enums.ProjectTaskStateEnum; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.ProjectMemberMapper; +import com.dite.znpt.service.*; +import com.dite.znpt.util.PageUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目人员关联表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class ProjectMemberServiceImpl extends ServiceImpl implements ProjectMemberService { + + private final UserService userService; + + // 添加其他服务依赖 + private final ProjectService projectService; + private final TurbineService turbineService; + private final ProjectTaskService projectTaskService; + private final ProjectBudgetInfoService projectBudgetInfoService; + private final ProjectDailyReportService projectDailyReportService; + + @Override + public List selectList(ProjectMemberListReq req) { + PageUtil.startPage(); + List list = this.baseMapper.queryBySelective(req); + enrichMemberInfo(list); + return list; + } + + @Override + public List selectByProjectId(String projectId) { + List list = this.baseMapper.queryByProjectId(projectId); + enrichMemberInfo(list); + return list; + } + + @Override + public List selectByTurbineId(String turbineId) { + List list = this.baseMapper.queryByTurbineId(turbineId); + enrichMemberInfo(list); + return list; + } + + @Override + public List selectByTaskGroupId(String taskGroupId) { + List list = this.baseMapper.queryByTaskGroupId(taskGroupId); + enrichMemberInfo(list); + return list; + } + + @Override + public List selectByTaskId(String taskId) { + List list = this.baseMapper.queryByTaskId(taskId); + enrichMemberInfo(list); + return list; + } + + @Override + public List selectByUserId(String userId) { + List list = this.baseMapper.queryByUserId(userId); + enrichMemberInfo(list); + return list; + } + + @Override + public List selectByProjectIdAndRoleType(String projectId, String roleType) { + List list = this.baseMapper.queryByProjectIdAndRoleType(projectId, roleType); + enrichMemberInfo(list); + return list; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveData(ProjectMemberReq req) { + // 验证用户是否存在 + UserEntity user = userService.getById(req.getUserId()); + if (user == null) { + throw new ServiceException(Message.USER_ID_NOT_EXIST_OR_ILLEGAL); + } + + // 检查是否已存在相同的关联 + boolean exists = lambdaQuery() + .eq(ProjectMemberEntity::getProjectId, req.getProjectId()) + .eq(ProjectMemberEntity::getUserId, req.getUserId()) + .eq(StrUtil.isNotEmpty(req.getTurbineId()), ProjectMemberEntity::getTurbineId, req.getTurbineId()) + .eq(StrUtil.isNotEmpty(req.getTaskGroupId()), ProjectMemberEntity::getTaskGroupId, req.getTaskGroupId()) + .eq(StrUtil.isNotEmpty(req.getTaskId()), ProjectMemberEntity::getTaskId, req.getTaskId()) + .eq(ProjectMemberEntity::getRoleType, req.getRoleType()) + .exists(); + + if (exists) { + throw new ServiceException("该用户在此项目中已存在相同角色"); + } + + ProjectMemberEntity entity = BeanUtil.copyProperties(req, ProjectMemberEntity.class); + if (StrUtil.isEmpty(entity.getStatus())) { + entity.setStatus("ACTIVE"); + } + save(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateData(ProjectMemberReq req) { + if (StrUtil.isEmpty(req.getMemberId())) { + throw new ServiceException("关联ID不能为空"); + } + + ProjectMemberEntity entity = getById(req.getMemberId()); + if (entity == null) { + throw new ServiceException(Message.PROJECT_ID_IS_NOT_EXIST); + } + + BeanUtil.copyProperties(req, entity); + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteById(String memberId) { + removeById(memberId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void batchAddMembers(List reqList) { + if (CollUtil.isEmpty(reqList)) { + return; + } + + for (ProjectMemberReq req : reqList) { + saveData(req); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByProjectId(String projectId) { + lambdaUpdate() + .eq(ProjectMemberEntity::getProjectId, projectId) + .remove(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByTurbineId(String turbineId) { + lambdaUpdate() + .eq(ProjectMemberEntity::getTurbineId, turbineId) + .remove(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByTaskGroupId(String taskGroupId) { + lambdaUpdate() + .eq(ProjectMemberEntity::getTaskGroupId, taskGroupId) + .remove(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByTaskId(String taskId) { + lambdaUpdate() + .eq(ProjectMemberEntity::getTaskId, taskId) + .remove(); + } + + /** + * 丰富成员信息(用户信息、角色描述、岗位描述) + */ + private void enrichMemberInfo(List list) { + if (CollUtil.isEmpty(list)) { + return; + } + + // 获取所有用户ID + List userIds = list.stream() + .map(ProjectMemberResp::getUserId) + .distinct() + .collect(Collectors.toList()); + + // 查询用户信息 + Map userMap = userService.listByIds(userIds) + .stream() + .collect(Collectors.toMap(UserEntity::getUserId, Function.identity())); + + // 填充用户信息和描述 + list.forEach(member -> { + // 填充用户信息 + UserEntity user = userMap.get(member.getUserId()); + if (user != null) { + member.setUserName(user.getName()); + member.setUserAccount(user.getAccount()); + member.setUserAvatar(user.getAvatar()); + } + + // 填充角色类型描述 + member.setRoleTypeDesc(ProjectRoleTypeEnum.getDescByCode(member.getRoleType())); + + // 填充岗位代码描述 + if (StrUtil.isNotEmpty(member.getJobCode())) { + member.setJobCodeDesc(ProjectJobCodeEnum.getDescByCode(member.getJobCode())); + } + }); + } + + // ========================== 项目看板相关方法实现 ========================== + + @Override + public ProjectKanbanStatsResp getProjectKanbanStats() { + ProjectKanbanStatsResp resp = new ProjectKanbanStatsResp(); + + // 统计项目数量 + resp.setTotalProjectsCount(projectService.count()); + resp.setPendingProjectCount(projectService.lambdaQuery().eq(ProjectEntity::getStatus, 0).count()); + resp.setInProgressProjectCount(projectService.lambdaQuery().eq(ProjectEntity::getStatus, 1).count()); + resp.setCompletedProjectCount(projectService.lambdaQuery().eq(ProjectEntity::getStatus, 2).count()); + resp.setAuditedProjectCount(projectService.lambdaQuery().eq(ProjectEntity::getStatus, 3).count()); + resp.setAcceptedProjectCount(projectService.lambdaQuery().eq(ProjectEntity::getStatus, 4).count()); + + // 统计机组数量 + resp.setTotalTurbineCount(turbineService.count()); + resp.setPendingTurbineCount(turbineService.lambdaQuery().eq(TurbineEntity::getStatus, 0).count()); + resp.setInProgressTurbineCount(turbineService.lambdaQuery().eq(TurbineEntity::getStatus, 1).count()); + resp.setCompletedTurbineCount(turbineService.lambdaQuery().eq(TurbineEntity::getStatus, 2).count()); + resp.setAuditedTurbineCount(turbineService.lambdaQuery().eq(TurbineEntity::getStatus, 3).count()); + resp.setAcceptedTurbineCount(turbineService.lambdaQuery().eq(TurbineEntity::getStatus, 4).count()); + + // 统计任务数量 + resp.setTotalTaskCount(projectTaskService.count()); + resp.setPendingTaskCount(projectTaskService.lambdaQuery().eq(ProjectTaskEntity::getStatus, 0).count()); + resp.setInProgressTaskCount(projectTaskService.lambdaQuery().eq(ProjectTaskEntity::getStatus, 1).count()); + resp.setCompletedTaskCount(projectTaskService.lambdaQuery().eq(ProjectTaskEntity::getStatus, 2).count()); + + // 统计人员数量 + resp.setTotalMemberCount(this.count()); + resp.setProjectManagerCount(this.lambdaQuery().eq(ProjectMemberEntity::getRoleType, "PROJECT_MANAGER").count()); + resp.setSafetyOfficerCount(this.lambdaQuery().eq(ProjectMemberEntity::getRoleType, "SAFETY_OFFICER").count()); + resp.setQualityOfficerCount(this.lambdaQuery().eq(ProjectMemberEntity::getRoleType, "QUALITY_OFFICER").count()); + resp.setConstructorCount(this.lambdaQuery().eq(ProjectMemberEntity::getRoleType, "CONSTRUCTOR").count()); + resp.setTeamLeaderCount(this.lambdaQuery().eq(ProjectMemberEntity::getRoleType, "TEAM_LEADER").count()); + + return resp; + } + + @Override + public ProjectKanbanDataResp getProjectKanbanData() { + ProjectKanbanDataResp resp = new ProjectKanbanDataResp(); + + // 获取各状态的项目列表 + resp.setPendingProjects(getProjectKanbanItems(0)); + resp.setInProgressProjects(getProjectKanbanItems(1)); + resp.setCompletedProjects(getProjectKanbanItems(2)); + resp.setAuditedProjects(getProjectKanbanItems(3)); + resp.setAcceptedProjects(getProjectKanbanItems(4)); + + return resp; + } + + @Override + public ProjectDetailResp getProjectDetail(String projectId) { + // 获取项目基本信息 + ProjectEntity project = projectService.getById(projectId); + if (project == null) { + throw new ServiceException(Message.PROJECT_ID_IS_NOT_EXIST); + } + + ProjectDetailResp resp = new ProjectDetailResp(); + BeanUtil.copyProperties(project, resp); + resp.setStatusLabel(ProjectStatusEnum.getDescByCode(resp.getStatus())); + + // 获取项目人员信息 + resp.setProjectMembers(selectByProjectId(projectId)); + + // 获取项目机组信息 + List turbines = turbineService.lambdaQuery() + .eq(TurbineEntity::getProjectId, projectId) + .list(); + resp.setTurbines(turbines.stream().map(turbine -> { + ProjectDetailResp.TurbineInfo info = new ProjectDetailResp.TurbineInfo(); + BeanUtil.copyProperties(turbine, info); + info.setStatusLabel(ProjectStatusEnum.getDescByCode(info.getStatus())); + return info; + }).collect(Collectors.toList())); + + // 获取项目任务信息 + List tasks = projectTaskService.lambdaQuery() + .eq(ProjectTaskEntity::getProjectId, projectId) + .list(); + resp.setTasks(tasks.stream().map(task -> { + ProjectDetailResp.TaskInfo info = new ProjectDetailResp.TaskInfo(); + BeanUtil.copyProperties(task, info); + info.setStatusLabel(ProjectTaskStateEnum.getDescByCode(info.getStatus())); + return info; + }).collect(Collectors.toList())); + + // 获取项目预算信息 + List budgets = projectBudgetInfoService.lambdaQuery() + .eq(ProjectBudgetInfoEntity::getProjectId, projectId) + .list(); + resp.setBudgets(budgets.stream().map(budget -> { + ProjectDetailResp.BudgetInfo info = new ProjectDetailResp.BudgetInfo(); + BeanUtil.copyProperties(budget, info); + return info; + }).collect(Collectors.toList())); + + // 获取项目日报信息 + List dailyReports = projectDailyReportService.lambdaQuery() + .eq(ProjectDailyReportEntity::getProjectId, projectId) + .orderByDesc(ProjectDailyReportEntity::getReportDate) + .last("LIMIT 10") + .list(); + resp.setDailyReports(dailyReports.stream().map(report -> { + ProjectDetailResp.DailyReportInfo info = new ProjectDetailResp.DailyReportInfo(); + BeanUtil.copyProperties(report, info); + // 获取提交人姓名 + UserEntity user = userService.getById(report.getSubmitUser()); + info.setSubmitUserName(user != null ? user.getName() : ""); + return info; + }).collect(Collectors.toList())); + + return resp; + } + + /** + * 获取项目看板项目项列表 + */ + private List getProjectKanbanItems(Integer status) { + List projects = projectService.lambdaQuery() + .eq(ProjectEntity::getStatus, status) + .orderByDesc(ProjectEntity::getCreateTime) + .list(); + + return projects.stream().map(project -> { + ProjectKanbanDataResp.ProjectKanbanItem item = new ProjectKanbanDataResp.ProjectKanbanItem(); + BeanUtil.copyProperties(project, item); + item.setStatusLabel(ProjectStatusEnum.getDescByCode(item.getStatus())); + + // 获取项目人员信息 + List members = selectByProjectId(project.getProjectId()); + + // 按角色类型分组,并去重用户名 + Map memberNames = members.stream() + .collect(Collectors.groupingBy( + ProjectMemberResp::getRoleType, + Collectors.mapping( + ProjectMemberResp::getUserName, + Collectors.collectingAndThen( + Collectors.toSet(), // 使用Set去重 + set -> String.join(",", set) + ) + ) + )); + + item.setProjectManagerName(memberNames.get("PROJECT_MANAGER")); + item.setSafetyOfficerName(memberNames.get("SAFETY_OFFICER")); + item.setQualityOfficerName(memberNames.get("QUALITY_OFFICER")); + item.setConstructionTeamLeaderName(memberNames.get("TEAM_LEADER")); + item.setConstructorNames(memberNames.get("CONSTRUCTOR")); + + // 统计机组数量 + Long turbineCount = turbineService.lambdaQuery() + .eq(TurbineEntity::getProjectId, project.getProjectId()) + .count(); + item.setTurbineCount(turbineCount); + + // 统计任务数量 + Long taskCount = projectTaskService.lambdaQuery() + .eq(ProjectTaskEntity::getProjectId, project.getProjectId()) + .count(); + item.setTaskCount(taskCount); + + // 统计已完成任务数量 + Long completedTaskCount = projectTaskService.lambdaQuery() + .eq(ProjectTaskEntity::getProjectId, project.getProjectId()) + .eq(ProjectTaskEntity::getStatus, 2) + .count(); + item.setCompletedTaskCount(completedTaskCount); + + // 计算项目进度百分比 + if (taskCount > 0) { + item.setProgressPercentage((int) (completedTaskCount * 100 / taskCount)); + } else { + item.setProgressPercentage(0); + } + + return item; + }).collect(Collectors.toList()); + } +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java index faf5a4a..c7b3038 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java @@ -5,20 +5,20 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; 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.UserEntity; import com.dite.znpt.domain.vo.ProjectListReq; import com.dite.znpt.domain.vo.ProjectListResp; import com.dite.znpt.domain.vo.ProjectReq; import com.dite.znpt.domain.vo.ProjectResp; import com.dite.znpt.enums.ProjectStatusEnum; 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 org.springframework.stereotype.Service; -import lombok.RequiredArgsConstructor; +import com.dite.znpt.service.ProjectService; +import com.dite.znpt.service.UserService; import com.dite.znpt.util.PageUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; @@ -59,6 +59,7 @@ public class ProjectServiceImpl extends ServiceImpl list= this.baseMapper.queryBySelective(req); list.forEach(resp -> { resp.setStatusLabel(ProjectStatusEnum.getDescByCode(resp.getStatus())); +// 判断人员类型 }); return list; } diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java index 16939d8..1bc85e5 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java @@ -20,7 +20,6 @@ import com.dite.znpt.mapper.ProjectTaskGroupMapper; import com.dite.znpt.mapper.ProjectTaskMapper; import com.dite.znpt.service.AttachInfoService; import com.dite.znpt.service.ProjectTaskService; -import com.dite.znpt.util.PageUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -55,7 +54,7 @@ public class ProjectTaskServiceImpl extends ServiceImpl projectTaskList = this.baseMapper.queryBySelective(projectTaskReq); Map> attachMap; 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)); } else { attachMap = new HashMap<>(); diff --git a/core/src/main/java/com/dite/znpt/service/impl/RegulationConfirmationServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/RegulationConfirmationServiceImpl.java new file mode 100644 index 0000000..c153e8f --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/RegulationConfirmationServiceImpl.java @@ -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 implements RegulationConfirmationService { + // 继承自ServiceImpl的方法已经足够使用 + // 包括:save, update, remove, list, page, lambdaQuery等 +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java new file mode 100644 index 0000000..1781248 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java @@ -0,0 +1,275 @@ +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 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 wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(RegulationEntity::getStatus, "APPROVED"); + wrapper.le(RegulationEntity::getUpdateTime, tenDaysAgo); + wrapper.eq(RegulationEntity::getDelFlag, "0"); + + java.util.List 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, String confirmStatus) { + try { + Page pageParam = new Page<>(page, pageSize); + String userId = StpUtil.getLoginIdAsString(); + + // 使用关联查询获取创建人姓名和确认状态 + Page result = this.baseMapper.selectRegulationListWithCreator(pageParam, status, type, title, proposer, confirmStatus, userId); + + 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()); + } + } + + // 设置制度类型名称 + if (regulation.getType() != null && !regulation.getType().isEmpty()) { + regulation.setRegulationType(regulation.getType()); + } + + 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()); + } + } +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/impl/RegulationTypeServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/RegulationTypeServiceImpl.java new file mode 100644 index 0000000..2641a04 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/RegulationTypeServiceImpl.java @@ -0,0 +1,125 @@ +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.beans.factory.annotation.Autowired; +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 implements RegulationTypeService { + + @Autowired + private RegulationMapper regulationMapper; + + @Override + @Transactional(readOnly = true) + public Result getRegulationTypes(Integer page, Integer size, String typeName, String status, String remark) { + try { + Page pageParam = new Page<>(page, size); + + // 使用连表查询获取创建人姓名 + Page 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() + .eq(RegulationEntity::getType, 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()); + } + } +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/impl/TenderInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/TenderInfoServiceImpl.java new file mode 100644 index 0000000..ae91c6a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/TenderInfoServiceImpl.java @@ -0,0 +1,135 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.entity.AttachInfoEntity; +import com.dite.znpt.domain.entity.OutbidInfoEntity; +import com.dite.znpt.domain.entity.TenderInfoEntity; +import com.dite.znpt.domain.entity.UserEntity; +import com.dite.znpt.domain.vo.TenderInfoReq; +import com.dite.znpt.domain.vo.TenderInfoResp; +import com.dite.znpt.enums.AttachBusinessTypeEnum; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.TenderInfoMapper; +import com.dite.znpt.service.AttachInfoService; +import com.dite.znpt.service.TenderInfoService; +import com.dite.znpt.service.UserService; +import com.dite.znpt.util.PageUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:09 + * @description + */ +@Service +public class TenderInfoServiceImpl extends ServiceImpl implements TenderInfoService { + + @Resource + private UserService userService; + + @Resource + private AttachInfoService attachInfoService; + + @Override + public List page(String projectName) { + PageUtil.startPage(); + return this.list(projectName); + } + + @Override + public List list(String projectName) { + return this.baseMapper.listTenderInfoResp(projectName); + } + + @Override + public TenderInfoResp detail(String tenderInfoId) { + return this.baseMapper.getTenderInfoResp(tenderInfoId); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void save(TenderInfoReq req) { + TenderInfoEntity entity = Converts.INSTANCE.toTenderInfoEntity(req); + if(StrUtil.isNotBlank(req.getTenderManager())){ + UserEntity user = userService.getById(req.getTenderManager()); + if(null == user || !Constants.DEL_FLAG_0.equals(user.getDelFlag())){ + throw new ServiceException(Message.USER_ID_NOT_EXIST); + } + } + if(!listByBiddingInfoId(req.getBiddingInfoId()).isEmpty()){ + throw new ServiceException(StrUtil.format(Message.TENDER_INFO_IS_EXIST,req.getBiddingInfoId())); + } + this.save(entity); + if(StrUtil.isNotBlank(req.getTenderFileId())){ + AttachInfoEntity attachInfo = attachInfoService.getById(req.getTenderFileId()); + if(null == attachInfo || !Constants.DEL_FLAG_0.equals(attachInfo.getDelFlag())){ + throw new ServiceException(Message.ATTACH_INFO_IS_NOT_EXIST); + } + attachInfo.setBusinessId(entity.getTenderInfoId()); + attachInfoService.updateById(attachInfo); + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void update(String tenderInfoId, TenderInfoReq req) { + TenderInfoEntity tenderInfo = this.getById(tenderInfoId); + if(null == tenderInfo){ + throw new ServiceException(Message.TENDER_INFO_ID_IS_NOT_EXIST); + } + if(!tenderInfo.getBiddingInfoId().equals(req.getBiddingInfoId())){ + if(!listByBiddingInfoId(req.getBiddingInfoId()).isEmpty()){ + throw new ServiceException(StrUtil.format(Message.TENDER_INFO_IS_EXIST,req.getBiddingInfoId())); + } + } + if(StrUtil.isNotBlank(req.getTenderFileId())){ + AttachInfoEntity attachInfo = attachInfoService.getById(req.getTenderFileId()); + if(null == attachInfo || !Constants.DEL_FLAG_0.equals(attachInfo.getDelFlag())){ + throw new ServiceException(Message.ATTACH_INFO_IS_NOT_EXIST); + } + attachInfo.setBusinessId(tenderInfoId); + attachInfoService.updateById(attachInfo); + }else{ + if(StrUtil.isNotBlank(tenderInfo.getTenderFileId())){ + attachInfoService.deleteByAttachInfoId(tenderInfo.getTenderFileId()); + } + } + TenderInfoEntity entity = Converts.INSTANCE.toTenderInfoEntity(req); + if(StrUtil.isNotBlank(req.getTenderManager())){ + UserEntity user = userService.getById(req.getTenderManager()); + if(null == user || !Constants.DEL_FLAG_0.equals(user.getDelFlag())){ + throw new ServiceException(Message.USER_ID_NOT_EXIST); + } + } + entity.setTenderInfoId(tenderInfoId); + this.updateById(entity); + + } + + private List listByBiddingInfoId(String biddingInfoId){ + return this.list(Wrappers.lambdaQuery().eq(TenderInfoEntity::getBiddingInfoId, biddingInfoId)); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteById(String tenderInfoId) { + TenderInfoEntity tenderInfo = this.getById(tenderInfoId); + if(null ==tenderInfo){ + throw new ServiceException(Message.TENDER_INFO_ID_IS_NOT_EXIST); + } + this.removeById(tenderInfoId); + if(StrUtil.isNotBlank(tenderInfo.getTenderFileId())){ + attachInfoService.deleteByAttachInfoId(tenderInfo.getTenderFileId()); + } + } + +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java index eee4f69..d3516d1 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java @@ -88,9 +88,9 @@ public class UserServiceImpl extends ServiceImpl impleme @Override public List list(UserListReq req) { return this.baseMapper.queryBySelective(req).stream().map(resp -> { - resp.setUserTypeLabel(UserTypeEnum.getDescByCode(resp.getUserType())); - resp.setUserStatusLabel(UserStatusEnum.getDescByCode(resp.getUserStatus())); - return resp; + resp.setUserTypeLabel(UserTypeEnum.getDescByCode(resp.getUserType())); + resp.setUserStatusLabel(UserStatusEnum.getDescByCode(resp.getUserStatus())); + return resp; }).collect(Collectors.toList()); } @@ -107,6 +107,7 @@ public class UserServiceImpl extends ServiceImpl impleme UserEntity entity = this.getById(userId); UserResp userResp= Converts.INSTANCE.toUserResp(entity); if(StrUtil.isNotBlank(userResp.getDeptId())){ + userResp.setName(entity.getName()); userResp.setDeptName(deptService.getById(userResp.getDeptId()).getDeptName()); } userResp.setUserTypeLabel(UserTypeEnum.getDescByCode(userResp.getUserType())); diff --git a/core/src/main/java/com/dite/znpt/service/job/AutoExpirationJobService.java b/core/src/main/java/com/dite/znpt/service/job/AutoExpirationJobService.java new file mode 100644 index 0000000..dba4ee1 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/job/AutoExpirationJobService.java @@ -0,0 +1,14 @@ +package com.dite.znpt.service.job; + +/** + * @author System + * @date 2025/1/1 + * @description 自动到期检测定时任务服务接口 + */ +public interface AutoExpirationJobService { + + /** + * 执行自动到期检测任务 + */ + void executeAutoExpirationJob(); +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/job/impl/AutoExpirationJobServiceImpl.java b/core/src/main/java/com/dite/znpt/service/job/impl/AutoExpirationJobServiceImpl.java new file mode 100644 index 0000000..a0bd57b --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/job/impl/AutoExpirationJobServiceImpl.java @@ -0,0 +1,31 @@ +package com.dite.znpt.service.job.impl; + +import com.dite.znpt.service.AutoExpirationService; +import com.dite.znpt.service.job.AutoExpirationJobService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author System + * @date 2025/1/1 + * @description 自动到期检测定时任务服务实现类 + */ +@Slf4j +@Service +public class AutoExpirationJobServiceImpl implements AutoExpirationJobService { + + @Autowired + private AutoExpirationService autoExpirationService; + + @Override + public void executeAutoExpirationJob() { + log.info("开始执行自动到期检测定时任务..."); + try { + autoExpirationService.executeAutoExpirationCheck(); + log.info("自动到期检测定时任务执行完成"); + } catch (Exception e) { + log.error("自动到期检测定时任务执行失败: {}", e.getMessage(), e); + } + } +} \ No newline at end of file diff --git a/core/src/main/resources/mapper/BiddingInfoMapper.xml b/core/src/main/resources/mapper/BiddingInfoMapper.xml new file mode 100644 index 0000000..fc9e1a6 --- /dev/null +++ b/core/src/main/resources/mapper/BiddingInfoMapper.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/core/src/main/resources/mapper/ContractMapper.xml b/core/src/main/resources/mapper/ContractMapper.xml index 182e078..c2a698d 100644 --- a/core/src/main/resources/mapper/ContractMapper.xml +++ b/core/src/main/resources/mapper/ContractMapper.xml @@ -53,6 +53,9 @@ and a.payment_date = #{paymentDate} + + and a.performance_deadline = #{performanceDeadline} + and a.payment_address like concat ('%', #{paymentAddress}, '%') @@ -68,6 +71,9 @@ and a.contract_status like concat ('%', #{contractStatus}, '%') + + and a.contract_text like concat ('%', #{contractText}, '%') + diff --git a/core/src/main/resources/mapper/ImageMapper.xml b/core/src/main/resources/mapper/ImageMapper.xml index f072bb6..450f26a 100644 --- a/core/src/main/resources/mapper/ImageMapper.xml +++ b/core/src/main/resources/mapper/ImageMapper.xml @@ -6,7 +6,7 @@ i.image_id, i.image_name, i.part_id, p.part_name, i.image_resolution, i.focal_distance, i.shooting_time, i.camera_manufacturer, i.camera_model, i.GPS, ic.weather, ic.humidness, CONCAT(ic.temperature_min, '℃', '~',temperature_max, '℃') AS temperature, ic.wind_level, ic.shooting_method, ic.shooting_distance,ic.collector_name, i.image_type, i.image_path, ic.image_source, i.review_state, i.image_type_label, - i.pre_image_path, i.project_id, i.pre_treatment + i.pre_image_path, i.project_id, i.pre_treatment, i.create_time, i.create_by FROM image i LEFT JOIN image_collect ic ON i.collect_id = ic.collect_id LEFT JOIN part p ON i.part_id = p.part_id @@ -20,6 +20,9 @@ AND p.part_id = #{partId} + + AND i.project_id = #{projectId} + AND i.image_type in #{imageType} @@ -27,6 +30,7 @@ and i.review_state = #{reviewState} + order by i.create_time desc @@ -75,7 +79,7 @@ i.focal_distance35, i.x_resolution, i.y_resolution, i.resolution_units, i.shooting_time, i.camera_manufacturer, i.camera_model, i.latitude, i.latitude, i.altitude, ic.collect_id, ic.weather, CONCAT(ic.temperature_min, '℃', '~',temperature_max, '℃') AS temperature, ic.wind_level, ic.shooting_method, ic.shooting_distance, ic.collector_name, ic.image_source, i.review_state, i.image_type, i.image_type_label, - i.pre_treatment, i.project_id + i.pre_treatment, i.project_id, i.create_time FROM image i LEFT JOIN image_collect ic ON i.collect_id = ic.collect_id WHERE i.image_id = #{imageId} diff --git a/core/src/main/resources/mapper/OutbidInfoMapper.xml b/core/src/main/resources/mapper/OutbidInfoMapper.xml new file mode 100644 index 0000000..d58a51d --- /dev/null +++ b/core/src/main/resources/mapper/OutbidInfoMapper.xml @@ -0,0 +1,24 @@ + + + + + + + \ No newline at end of file diff --git a/core/src/main/resources/mapper/ProjectDailyReportMapper.xml b/core/src/main/resources/mapper/ProjectDailyReportMapper.xml new file mode 100644 index 0000000..3102523 --- /dev/null +++ b/core/src/main/resources/mapper/ProjectDailyReportMapper.xml @@ -0,0 +1,30 @@ + + + + + + a.report_id, a.project_id, a.report_date, a.submit_user, + a.update_by, a.create_time, a.create_by, a.update_time + + + + + diff --git a/core/src/main/resources/mapper/ProjectMapper.xml b/core/src/main/resources/mapper/ProjectMapper.xml index 636db3f..5f9a8e5 100644 --- a/core/src/main/resources/mapper/ProjectMapper.xml +++ b/core/src/main/resources/mapper/ProjectMapper.xml @@ -2,23 +2,27 @@ diff --git a/core/src/main/resources/mapper/ProjectMemberMapper.xml b/core/src/main/resources/mapper/ProjectMemberMapper.xml new file mode 100644 index 0000000..f8925d6 --- /dev/null +++ b/core/src/main/resources/mapper/ProjectMemberMapper.xml @@ -0,0 +1,314 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/src/main/resources/mapper/RegulationMapper.xml b/core/src/main/resources/mapper/RegulationMapper.xml new file mode 100644 index 0000000..c70a410 --- /dev/null +++ b/core/src/main/resources/mapper/RegulationMapper.xml @@ -0,0 +1,49 @@ + + + + + + + + \ No newline at end of file diff --git a/core/src/main/resources/mapper/RegulationTypeMapper.xml b/core/src/main/resources/mapper/RegulationTypeMapper.xml new file mode 100644 index 0000000..53211ec --- /dev/null +++ b/core/src/main/resources/mapper/RegulationTypeMapper.xml @@ -0,0 +1,32 @@ + + + + + + rt.type_id, rt.type_name, rt.is_enabled, rt.sort_order, rt.remark, rt.del_flag, + rt.create_by, rt.create_time, rt.update_by, rt.update_time + + + + + \ No newline at end of file diff --git a/core/src/main/resources/mapper/TenderInfoMapper.xml b/core/src/main/resources/mapper/TenderInfoMapper.xml new file mode 100644 index 0000000..98b8a89 --- /dev/null +++ b/core/src/main/resources/mapper/TenderInfoMapper.xml @@ -0,0 +1,28 @@ + + + + + + + \ No newline at end of file diff --git a/doc/auto_expiration_readme.md b/doc/auto_expiration_readme.md new file mode 100644 index 0000000..c3a0041 --- /dev/null +++ b/doc/auto_expiration_readme.md @@ -0,0 +1,138 @@ +# 自动到期检测功能使用说明 + +## 功能概述 + +自动到期检测功能是一个智能的到期时间监控系统,能够自动检测数据库中各种表格的到期时间字段,并提供到期提醒功能。 + +## 主要特性 + +1. **自动检测**: 系统会自动扫描配置的表格,检测其中的到期时间字段 +2. **灵活配置**: 可以配置任意表格的到期检测规则 +3. **智能提醒**: 支持提前提醒天数配置 +4. **状态管理**: 自动计算剩余天数并设置状态(正常/即将到期/已到期) +5. **定时执行**: 每天凌晨2点自动执行检测任务 + +## 数据库表结构 + +### 1. 自动到期检测配置表 (auto_expiration_config) + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| config_id | varchar(64) | 配置ID | +| table_name | varchar(100) | 表名 | +| table_desc | varchar(200) | 表描述 | +| primary_key_field | varchar(100) | 主键字段 | +| expire_date_field | varchar(100) | 到期时间字段 | +| user_id_field | varchar(100) | 关联用户字段 | +| user_name_field | varchar(100) | 用户姓名字段 | +| business_name_field | varchar(100) | 业务名称字段 | +| remind_days | int | 提前提醒天数 | +| enabled | varchar(1) | 是否启用(0-禁用,1-启用) | + +### 2. 到期检测结果表 (expiration_result) + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| result_id | varchar(64) | 结果ID | +| table_name | varchar(100) | 表名 | +| business_id | varchar(64) | 业务ID | +| business_name | varchar(200) | 业务名称 | +| user_id | varchar(64) | 关联用户ID | +| user_name | varchar(100) | 关联用户姓名 | +| expire_date | date | 到期日期 | +| remaining_days | int | 剩余天数 | +| status | varchar(1) | 状态(0-正常,1-即将到期,2-已到期) | + +## API接口 + +### 1. 手动执行到期检测 +``` +POST /auto-expiration/execute +``` + +### 2. 获取到期检测结果 +``` +GET /auto-expiration/results?status=1 +``` +参数说明: +- status: 状态筛选(0-正常,1-即将到期,2-已到期) + +### 3. 获取统计信息 +``` +GET /auto-expiration/statistics +``` + +### 4. 检测指定表 +``` +POST /auto-expiration/check-table/{tableName} +``` + +### 5. 保存配置 +``` +POST /auto-expiration/config +``` + +### 6. 获取所有配置 +``` +GET /auto-expiration/configs +``` + +### 7. 删除配置 +``` +DELETE /auto-expiration/config/{configId} +``` + +## 配置示例 + +### 人员资质证书检测配置 +```json +{ + "tableName": "certification", + "tableDesc": "人员资质证书", + "primaryKeyField": "certification_id", + "expireDateField": "validity_date_end", + "userIdField": "user_id", + "businessNameField": "certification_name", + "remindDays": 30, + "enabled": "1" +} +``` + +### 人员保险检测配置 +```json +{ + "tableName": "insurance_info", + "tableDesc": "人员保险", + "primaryKeyField": "insurance_info_id", + "expireDateField": "expire_date", + "userIdField": "user_id", + "userNameField": "name", + "businessNameField": "insurance_type_name", + "remindDays": 30, + "enabled": "1" +} +``` + +## 使用步骤 + +1. **创建数据库表**: 执行 `auto_expiration_tables.sql` 创建必要的表结构 +2. **配置检测规则**: 通过API或直接插入数据配置需要检测的表格 +3. **启动定时任务**: 系统会自动在每天凌晨2点执行检测 +4. **查看检测结果**: 通过API接口查看检测结果和统计信息 + +## 扩展说明 + +系统支持检测任意表格的到期时间字段,只需要在配置表中添加相应的配置即可。支持的字段类型包括: +- LocalDate +- LocalDateTime +- Date +- Timestamp + +系统会自动识别并处理这些日期类型。 + +## 注意事项 + +1. 确保配置的字段名在目标表中存在 +2. 到期时间字段不能为空 +3. 建议为检测结果表添加适当的索引以提高查询性能 +4. 可以根据业务需要调整提前提醒天数 \ No newline at end of file diff --git a/doc/auto_expiration_tables.sql b/doc/auto_expiration_tables.sql new file mode 100644 index 0000000..793373c --- /dev/null +++ b/doc/auto_expiration_tables.sql @@ -0,0 +1,51 @@ +-- 自动到期检测配置表 +CREATE TABLE `auto_expiration_config` ( + `config_id` varchar(64) NOT NULL COMMENT '配置ID', + `table_name` varchar(100) NOT NULL COMMENT '表名', + `table_desc` varchar(200) DEFAULT NULL COMMENT '表描述', + `primary_key_field` varchar(100) NOT NULL COMMENT '主键字段', + `expire_date_field` varchar(100) NOT NULL COMMENT '到期时间字段', + `user_id_field` varchar(100) DEFAULT NULL COMMENT '关联用户字段', + `user_name_field` varchar(100) DEFAULT NULL COMMENT '用户姓名字段', + `business_name_field` varchar(100) DEFAULT NULL COMMENT '业务名称字段', + `remind_days` int(11) DEFAULT 30 COMMENT '提前提醒天数', + `enabled` varchar(1) DEFAULT '1' COMMENT '是否启用(0-禁用,1-启用)', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `create_by` varchar(64) DEFAULT NULL COMMENT '创建人', + `update_by` varchar(64) DEFAULT NULL COMMENT '更新人', + `del_flag` varchar(1) DEFAULT '0' COMMENT '删除标志(0代表存在,1代表删除)', + PRIMARY KEY (`config_id`), + UNIQUE KEY `uk_table_name` (`table_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='自动到期检测配置表'; + +-- 到期检测结果表 +CREATE TABLE `expiration_result` ( + `result_id` varchar(64) NOT NULL COMMENT '结果ID', + `config_id` varchar(64) DEFAULT NULL COMMENT '配置ID', + `table_name` varchar(100) NOT NULL COMMENT '表名', + `business_id` varchar(64) NOT NULL COMMENT '业务ID', + `business_name` varchar(200) DEFAULT NULL COMMENT '业务名称', + `user_id` varchar(64) DEFAULT NULL COMMENT '关联用户ID', + `user_name` varchar(100) DEFAULT NULL COMMENT '关联用户姓名', + `expire_date` date NOT NULL COMMENT '到期日期', + `remaining_days` int(11) DEFAULT NULL COMMENT '剩余天数', + `status` varchar(1) DEFAULT '0' COMMENT '状态(0-正常,1-即将到期,2-已到期)', + `check_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '检测时间', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `create_by` varchar(64) DEFAULT NULL COMMENT '创建人', + `update_by` varchar(64) DEFAULT NULL COMMENT '更新人', + `del_flag` varchar(1) DEFAULT '0' COMMENT '删除标志(0代表存在,1代表删除)', + PRIMARY KEY (`result_id`), + KEY `idx_table_name` (`table_name`), + KEY `idx_status` (`status`), + KEY `idx_expire_date` (`expire_date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='到期检测结果表'; + +-- 插入示例配置数据 +INSERT INTO `auto_expiration_config` (`config_id`, `table_name`, `table_desc`, `primary_key_field`, `expire_date_field`, `user_id_field`, `user_name_field`, `business_name_field`, `remind_days`, `enabled`, `remark`) VALUES +('1', 'certification', '人员资质证书', 'certification_id', 'validity_date_end', 'user_id', NULL, 'certification_name', 30, '1', '人员资质证书到期检测'), +('2', 'insurance_info', '人员保险', 'insurance_info_id', 'expire_date', 'user_id', 'name', 'insurance_type_name', 30, '1', '人员保险到期检测'), +('3', 'regulation', '制度管理', 'regulation_id', 'expire_time', NULL, NULL, 'regulation_name', 30, '1', '制度到期检测'); \ No newline at end of file diff --git a/doc/project_member_extended_data.sql b/doc/project_member_extended_data.sql new file mode 100644 index 0000000..e11968c --- /dev/null +++ b/doc/project_member_extended_data.sql @@ -0,0 +1,107 @@ +-- ============================================= +-- 项目人员表扩展测试数据 +-- 使用多个真实用户ID和项目ID,使用UUID()生成member_id +-- @author AI Assistant +-- @date 2025/01/27 +-- ============================================= + +-- 清空现有数据(可选) +-- DELETE FROM project_member WHERE project_id IN ('0b71a1259c49918c6595c9720ad1db5d', '7f321271c13483aa31cb743d604603a5', '8e0da59bd0c640b5b65dccd72606ea39', '96e0debf78187300f144d7f3450a2477', 'bbd28ed8627d6bd9fd8fa7476af6242a', 'd446d998d7c40005bf9af53ac264ef6e', 'd6c5b8408a42a8390297751756ecff23', 'eb64015cf2d0b40574c1d6f476876822', 'fb7e3b731ee496cec46ca1db64117676'); + +-- 插入项目人员测试数据 +INSERT INTO project_member ( + member_id, + project_id, + user_id, + role_type, + job_code, + job_desc, + join_date, + status, + remark +) VALUES +-- 项目1: 0b71a1259c49918c6595c9720ad1db5d +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '0ab4a72af4184a1614d4c25a5bb65ece', 'PROJECT_MANAGER', 'PROJECT_MANAGER', '项目经理', '2025-01-15', 'ACTIVE', '项目总负责人'), +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '0bc98a66761915e31fbf86e468d6ba20', 'SAFETY_OFFICER', 'SAFETY_MANAGER', '安全经理', '2025-01-15', 'ACTIVE', '负责项目安全管理'), +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '149c94f937a7d36cda70a81f343d090a', 'QUALITY_OFFICER', 'QUALITY_MANAGER', '质量经理', '2025-01-15', 'ACTIVE', '负责项目质量管理'), +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '15129b4764ced7900ef5d51c20cefa35', 'TEAM_LEADER', 'SITE_MANAGER', '现场经理', '2025-01-15', 'ACTIVE', '负责现场施工管理'), +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '1632433c2073532a074b0079cca5eb18', 'CONSTRUCTOR', 'GROUND_SERVICE', '地勤人员', '2025-01-15', 'ACTIVE', '负责地面施工工作'), +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '1995a0da943d188506548bd42a2ee39d', 'CONSTRUCTOR', 'DRIVER', '司机', '2025-01-15', 'ACTIVE', '负责设备运输和人员接送'), +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '1b2641edb4c9a8f14658edaa8e6a36e3', 'CONSTRUCTOR', 'ASCENDING', '登高人员', '2025-01-15', 'ACTIVE', '负责高空作业'), +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '1d476bc4de6d71f6a43497d943adec9c', 'CONSTRUCTOR', 'ANTI_THUNDER', '防雷人员', '2025-01-15', 'ACTIVE', '负责防雷设施安装'), + +-- 项目2: 7f321271c13483aa31cb743d604603a5 +(UUID(), '7f321271c13483aa31cb743d604603a5', '1dae46a6ecbc2408c8b137187fc13d06', 'PROJECT_MANAGER', 'PROJECT_MANAGER', '项目经理', '2025-01-16', 'ACTIVE', '项目总负责人'), +(UUID(), '7f321271c13483aa31cb743d604603a5', '1f319a6f25b65ebd50711707e5e08d1a', 'SAFETY_OFFICER', 'SAFETY_MANAGER', '安全经理', '2025-01-16', 'ACTIVE', '负责项目安全管理'), +(UUID(), '7f321271c13483aa31cb743d604603a5', '22ff9d065f3ad826f5e22ba18a20248c', 'QUALITY_OFFICER', 'QUALITY_MANAGER', '质量经理', '2025-01-16', 'ACTIVE', '负责项目质量管理'), +(UUID(), '7f321271c13483aa31cb743d604603a5', '2fd0581e10f4c4f70e5148de3d61bc06', 'TEAM_LEADER', 'SITE_MANAGER', '现场经理', '2025-01-16', 'ACTIVE', '负责现场施工管理'), +(UUID(), '7f321271c13483aa31cb743d604603a5', '3042cb085eb41721faa8f4d985921424', 'CONSTRUCTOR', 'GROUND_SERVICE', '地勤人员', '2025-01-16', 'ACTIVE', '负责地面施工工作'), +(UUID(), '7f321271c13483aa31cb743d604603a5', '3169163eb58fff961955179fbdc22507', 'CONSTRUCTOR', 'DRIVER', '司机', '2025-01-16', 'ACTIVE', '负责设备运输和人员接送'), + +-- 项目3: 8e0da59bd0c640b5b65dccd72606ea39 +(UUID(), '8e0da59bd0c640b5b65dccd72606ea39', '324afaf4e89213b6f5fcf1fa57663940', 'PROJECT_MANAGER', 'PROJECT_MANAGER', '项目经理', '2025-01-17', 'ACTIVE', '项目总负责人'), +(UUID(), '8e0da59bd0c640b5b65dccd72606ea39', '375f87a103e5bcad6e6a402177044891', 'SAFETY_OFFICER', 'SAFETY_MANAGER', '安全经理', '2025-01-17', 'ACTIVE', '负责项目安全管理'), +(UUID(), '8e0da59bd0c640b5b65dccd72606ea39', '3b5f2db9bac776be536d893f726deeba', 'QUALITY_OFFICER', 'QUALITY_MANAGER', '质量经理', '2025-01-17', 'ACTIVE', '负责项目质量管理'), +(UUID(), '8e0da59bd0c640b5b65dccd72606ea39', '44d335410542c5fd4989780dd11dca66', 'TEAM_LEADER', 'SITE_MANAGER', '现场经理', '2025-01-17', 'ACTIVE', '负责现场施工管理'), +(UUID(), '8e0da59bd0c640b5b65dccd72606ea39', '4e171ce81c18183bc8f06da8bd47a3d8', 'CONSTRUCTOR', 'GROUND_SERVICE', '地勤人员', '2025-01-17', 'ACTIVE', '负责地面施工工作'), + +-- 项目4: 96e0debf78187300f144d7f3450a2477 +(UUID(), '96e0debf78187300f144d7f3450a2477', '0ab4a72af4184a1614d4c25a5bb65ece', 'PROJECT_MANAGER', 'PROJECT_MANAGER', '项目经理', '2025-01-18', 'ACTIVE', '项目总负责人'), +(UUID(), '96e0debf78187300f144d7f3450a2477', '0bc98a66761915e31fbf86e468d6ba20', 'SAFETY_OFFICER', 'SAFETY_MANAGER', '安全经理', '2025-01-18', 'ACTIVE', '负责项目安全管理'), +(UUID(), '96e0debf78187300f144d7f3450a2477', '149c94f937a7d36cda70a81f343d090a', 'QUALITY_OFFICER', 'QUALITY_MANAGER', '质量经理', '2025-01-18', 'ACTIVE', '负责项目质量管理'), +(UUID(), '96e0debf78187300f144d7f3450a2477', '15129b4764ced7900ef5d51c20cefa35', 'CONSTRUCTOR', 'ASCENDING', '登高人员', '2025-01-18', 'ACTIVE', '负责高空作业'), +(UUID(), '96e0debf78187300f144d7f3450a2477', '1632433c2073532a074b0079cca5eb18', 'CONSTRUCTOR', 'ANTI_THUNDER', '防雷人员', '2025-01-18', 'ACTIVE', '负责防雷设施安装'), + +-- 项目5: bbd28ed8627d6bd9fd8fa7476af6242a +(UUID(), 'bbd28ed8627d6bd9fd8fa7476af6242a', '1995a0da943d188506548bd42a2ee39d', 'PROJECT_MANAGER', 'PROJECT_MANAGER', '项目经理', '2025-01-19', 'ACTIVE', '项目总负责人'), +(UUID(), 'bbd28ed8627d6bd9fd8fa7476af6242a', '1b2641edb4c9a8f14658edaa8e6a36e3', 'SAFETY_OFFICER', 'SAFETY_MANAGER', '安全经理', '2025-01-19', 'ACTIVE', '负责项目安全管理'), +(UUID(), 'bbd28ed8627d6bd9fd8fa7476af6242a', '1d476bc4de6d71f6a43497d943adec9c', 'QUALITY_OFFICER', 'QUALITY_MANAGER', '质量经理', '2025-01-19', 'ACTIVE', '负责项目质量管理'), +(UUID(), 'bbd28ed8627d6bd9fd8fa7476af6242a', '1dae46a6ecbc2408c8b137187fc13d06', 'TEAM_LEADER', 'SITE_MANAGER', '现场经理', '2025-01-19', 'ACTIVE', '负责现场施工管理'), +(UUID(), 'bbd28ed8627d6bd9fd8fa7476af6242a', '1f319a6f25b65ebd50711707e5e08d1a', 'CONSTRUCTOR', 'GROUND_SERVICE', '地勤人员', '2025-01-19', 'ACTIVE', '负责地面施工工作'), + +-- 项目6: d446d998d7c40005bf9af53ac264ef6e +(UUID(), 'd446d998d7c40005bf9af53ac264ef6e', '22ff9d065f3ad826f5e22ba18a20248c', 'PROJECT_MANAGER', 'PROJECT_MANAGER', '项目经理', '2025-01-20', 'ACTIVE', '项目总负责人'), +(UUID(), 'd446d998d7c40005bf9af53ac264ef6e', '2fd0581e10f4c4f70e5148de3d61bc06', 'SAFETY_OFFICER', 'SAFETY_MANAGER', '安全经理', '2025-01-20', 'ACTIVE', '负责项目安全管理'), +(UUID(), 'd446d998d7c40005bf9af53ac264ef6e', '3042cb085eb41721faa8f4d985921424', 'QUALITY_OFFICER', 'QUALITY_MANAGER', '质量经理', '2025-01-20', 'ACTIVE', '负责项目质量管理'), +(UUID(), 'd446d998d7c40005bf9af53ac264ef6e', '3169163eb58fff961955179fbdc22507', 'CONSTRUCTOR', 'DRIVER', '司机', '2025-01-20', 'ACTIVE', '负责设备运输和人员接送'), + +-- 项目7: d6c5b8408a42a8390297751756ecff23 +(UUID(), 'd6c5b8408a42a8390297751756ecff23', '324afaf4e89213b6f5fcf1fa57663940', 'PROJECT_MANAGER', 'PROJECT_MANAGER', '项目经理', '2025-01-21', 'ACTIVE', '项目总负责人'), +(UUID(), 'd6c5b8408a42a8390297751756ecff23', '375f87a103e5bcad6e6a402177044891', 'SAFETY_OFFICER', 'SAFETY_MANAGER', '安全经理', '2025-01-21', 'ACTIVE', '负责项目安全管理'), +(UUID(), 'd6c5b8408a42a8390297751756ecff23', '3b5f2db9bac776be536d893f726deeba', 'CONSTRUCTOR', 'ASCENDING', '登高人员', '2025-01-21', 'ACTIVE', '负责高空作业'), +(UUID(), 'd6c5b8408a42a8390297751756ecff23', '44d335410542c5fd4989780dd11dca66', 'CONSTRUCTOR', 'ANTI_THUNDER', '防雷人员', '2025-01-21', 'ACTIVE', '负责防雷设施安装'), + +-- 项目8: eb64015cf2d0b40574c1d6f476876822 +(UUID(), 'eb64015cf2d0b40574c1d6f476876822', '4e171ce81c18183bc8f06da8bd47a3d8', 'PROJECT_MANAGER', 'PROJECT_MANAGER', '项目经理', '2025-01-22', 'ACTIVE', '项目总负责人'), +(UUID(), 'eb64015cf2d0b40574c1d6f476876822', '0ab4a72af4184a1614d4c25a5bb65ece', 'SAFETY_OFFICER', 'SAFETY_MANAGER', '安全经理', '2025-01-22', 'ACTIVE', '负责项目安全管理'), +(UUID(), 'eb64015cf2d0b40574c1d6f476876822', '0bc98a66761915e31fbf86e468d6ba20', 'QUALITY_OFFICER', 'QUALITY_MANAGER', '质量经理', '2025-01-22', 'ACTIVE', '负责项目质量管理'), +(UUID(), 'eb64015cf2d0b40574c1d6f476876822', '149c94f937a7d36cda70a81f343d090a', 'TEAM_LEADER', 'SITE_MANAGER', '现场经理', '2025-01-22', 'ACTIVE', '负责现场施工管理'), + +-- 项目9: fb7e3b731ee496cec46ca1db64117676 +(UUID(), 'fb7e3b731ee496cec46ca1db64117676', '15129b4764ced7900ef5d51c20cefa35', 'PROJECT_MANAGER', 'PROJECT_MANAGER', '项目经理', '2025-01-23', 'ACTIVE', '项目总负责人'), +(UUID(), 'fb7e3b731ee496cec46ca1db64117676', '1632433c2073532a074b0079cca5eb18', 'SAFETY_OFFICER', 'SAFETY_MANAGER', '安全经理', '2025-01-23', 'ACTIVE', '负责项目安全管理'), +(UUID(), 'fb7e3b731ee496cec46ca1db64117676', '1995a0da943d188506548bd42a2ee39d', 'QUALITY_OFFICER', 'QUALITY_MANAGER', '质量经理', '2025-01-23', 'ACTIVE', '负责项目质量管理'), +(UUID(), 'fb7e3b731ee496cec46ca1db64117676', '1b2641edb4c9a8f14658edaa8e6a36e3', 'CONSTRUCTOR', 'GROUND_SERVICE', '地勤人员', '2025-01-23', 'ACTIVE', '负责地面施工工作'), +(UUID(), 'fb7e3b731ee496cec46ca1db64117676', '1d476bc4de6d71f6a43497d943adec9c', 'CONSTRUCTOR', 'DRIVER', '司机', '2025-01-23', 'ACTIVE', '负责设备运输和人员接送'); + +-- ============================================= +-- 查询示例 +-- ============================================= + +-- 查询所有项目的在职人员 +-- SELECT * FROM project_member WHERE status = 'ACTIVE'; + +-- 查询特定项目的所有人员 +-- SELECT * FROM project_member WHERE project_id = '0b71a1259c49918c6595c9720ad1db5d' AND status = 'ACTIVE'; + +-- 查询所有项目经理 +-- SELECT * FROM project_member WHERE role_type = 'PROJECT_MANAGER' AND status = 'ACTIVE'; + +-- 按项目统计人员数量 +-- SELECT project_id, COUNT(*) as member_count FROM project_member WHERE status = 'ACTIVE' GROUP BY project_id; + +-- 按角色类型统计人员数量 +-- SELECT role_type, COUNT(*) as count FROM project_member WHERE status = 'ACTIVE' GROUP BY role_type; + +-- 查询特定用户参与的所有项目 +-- SELECT DISTINCT project_id FROM project_member WHERE user_id = '0ab4a72af4184a1614d4c25a5bb65ece' AND status = 'ACTIVE'; \ No newline at end of file diff --git a/doc/project_member_tables.sql b/doc/project_member_tables.sql new file mode 100644 index 0000000..b30097e --- /dev/null +++ b/doc/project_member_tables.sql @@ -0,0 +1,137 @@ +-- ============================================= +-- 项目人员关联表 +-- 用于管理项目、机组、任务组、任务的人员关系 +-- @author wangna +-- @date 2025/08/05 +-- ============================================= + +-- 项目人员关联表 +CREATE TABLE `project_member` ( + `member_id` varchar(64) NOT NULL COMMENT '关联ID', + `project_id` varchar(64) NOT NULL COMMENT '项目ID', + `turbine_id` varchar(64) DEFAULT NULL COMMENT '机组ID(可选,关联到具体机组)', + `task_group_id` varchar(64) DEFAULT NULL COMMENT '任务组ID(可选,关联到具体任务组)', + `task_id` varchar(64) DEFAULT NULL COMMENT '任务ID(可选,关联到具体任务)', + `user_id` varchar(64) NOT NULL COMMENT '用户ID', + `role_type` varchar(50) NOT NULL COMMENT '项目角色类型', + `job_code` varchar(50) DEFAULT NULL COMMENT '具体岗位代码', + `job_desc` varchar(500) DEFAULT NULL COMMENT '岗位描述', + `join_date` date NOT NULL COMMENT '加入时间', + `leave_date` date DEFAULT NULL COMMENT '离开时间', + `status` varchar(20) DEFAULT 'ACTIVE' COMMENT '状态:ACTIVE-在职,INACTIVE-离职,SUSPENDED-暂停', + `remark` varchar(500) DEFAULT NULL 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 '更新时间', + PRIMARY KEY (`member_id`), + KEY `idx_project_id` (`project_id`), + KEY `idx_turbine_id` (`turbine_id`), + KEY `idx_task_group_id` (`task_group_id`), + KEY `idx_task_id` (`task_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_role_type` (`role_type`), + KEY `idx_status` (`status`), + UNIQUE KEY `uk_project_user_role` (`project_id`, `user_id`, `role_type`, `turbine_id`, `task_group_id`, `task_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目人员关联表'; + +-- 添加复合索引以提高查询性能 +CREATE INDEX `idx_project_member_composite` ON `project_member` (`project_id`, `status`, `role_type`); +CREATE INDEX `idx_project_member_user_status` ON `project_member` (`user_id`, `status`); +CREATE INDEX `idx_project_member_turbine_status` ON `project_member` (`turbine_id`, `status`); +CREATE INDEX `idx_project_member_task_status` ON `project_member` (`task_id`, `status`); + +-- ============================================= +-- 数据迁移脚本(可选) +-- 将现有项目的人员数据迁移到新表 +-- ============================================= + +-- 迁移项目经理数据 +INSERT INTO project_member (member_id, project_id, user_id, role_type, job_code, join_date, status, create_time) +SELECT + UUID() as member_id, + project_id, + project_manager_id as user_id, + 'PROJECT_MANAGER' as role_type, + 'PROJECT_MANAGER' as job_code, + create_time as join_date, + 'ACTIVE' as status, + create_time +FROM project +WHERE project_manager_id IS NOT NULL AND project_manager_id != ''; + +-- 迁移安全员数据 +INSERT INTO project_member (member_id, project_id, user_id, role_type, job_code, join_date, status, create_time) +SELECT + UUID() as member_id, + project_id, + auditor_id as user_id, + 'SAFETY_OFFICER' as role_type, + 'SAFETY_MANAGER' as job_code, + create_time as join_date, + 'ACTIVE' as status, + create_time +FROM project +WHERE auditor_id IS NOT NULL AND auditor_id != ''; + +-- 迁移质量员数据 +INSERT INTO project_member (member_id, project_id, user_id, role_type, job_code, join_date, status, create_time) +SELECT + UUID() as member_id, + project_id, + quality_officer_id as user_id, + 'QUALITY_OFFICER' as role_type, + 'QUALITY_MANAGER' as job_code, + create_time as join_date, + 'ACTIVE' as status, + create_time +FROM project +WHERE quality_officer_id IS NOT NULL AND quality_officer_id != ''; + +-- 迁移施工组长数据 +INSERT INTO project_member (member_id, project_id, user_id, role_type, job_code, join_date, status, create_time) +SELECT + UUID() as member_id, + project_id, + construct_team_leader_id as user_id, + 'TEAM_LEADER' as role_type, + 'TEAM_LEADER' as job_code, + create_time as join_date, + 'ACTIVE' as status, + create_time +FROM project +WHERE construct_team_leader_id IS NOT NULL AND construct_team_leader_id != ''; + +-- 迁移施工人员数据(需要处理逗号分隔的多个ID) +-- 注意:这个脚本需要根据实际情况调整,因为constructor_ids是逗号分隔的字符串 +-- 建议在应用层处理这个迁移逻辑 + +-- ============================================= +-- 示例数据插入 +-- ============================================= + +-- 插入示例项目人员数据 +INSERT INTO project_member (member_id, project_id, user_id, role_type, job_code, job_desc, join_date, status, remark) VALUES +('pm001', 'project001', 'user001', 'PROJECT_MANAGER', 'PROJECT_MANAGER', '项目经理', '2025-01-01', 'ACTIVE', '项目负责人'), +('pm002', 'project001', 'user002', 'SAFETY_OFFICER', 'SAFETY_MANAGER', '安全经理', '2025-01-01', 'ACTIVE', '负责项目安全'), +('pm003', 'project001', 'user003', 'QUALITY_OFFICER', 'QUALITY_MANAGER', '质量经理', '2025-01-01', 'ACTIVE', '负责项目质量'), +('pm004', 'project001', 'user004', 'CONSTRUCTOR', 'GROUND_SERVICE', '地勤人员', '2025-01-01', 'ACTIVE', '地勤工作'), +('pm005', 'project001', 'user005', 'CONSTRUCTOR', 'DRIVER', '司机', '2025-01-01', 'ACTIVE', '负责运输'), +('pm006', 'project001', 'user006', 'CONSTRUCTOR', 'ASCENDING', '登高人员', '2025-01-01', 'ACTIVE', '高空作业'); + +-- ============================================= +-- 查询示例 +-- ============================================= + +-- 查询项目所有人员 +-- SELECT * FROM project_member WHERE project_id = 'project001' AND status = 'ACTIVE'; + +-- 查询项目的项目经理 +-- SELECT * FROM project_member WHERE project_id = 'project001' AND role_type = 'PROJECT_MANAGER' AND status = 'ACTIVE'; + +-- 查询用户参与的所有项目 +-- SELECT DISTINCT project_id FROM project_member WHERE user_id = 'user001' AND status = 'ACTIVE'; + +-- 查询机组人员 +-- SELECT * FROM project_member WHERE turbine_id = 'turbine001' AND status = 'ACTIVE'; +CREATE INDEX `idx_project_member_task_status` ON `project_member` (`task_id`, `status`); \ No newline at end of file diff --git a/doc/project_member_test_data.sql b/doc/project_member_test_data.sql new file mode 100644 index 0000000..92fa0fb --- /dev/null +++ b/doc/project_member_test_data.sql @@ -0,0 +1,53 @@ +-- ============================================= +-- 项目人员表测试数据 +-- 基于项目ID: 0b71a1259c49918c6595c9720ad1db5d +-- 使用真实用户ID,使用UUID()生成member_id +-- @author AI Assistant +-- @date 2025/01/27 +-- ============================================= + +-- 清空现有数据(可选) +-- DELETE FROM project_member WHERE project_id = '0b71a1259c49918c6595c9720ad1db5d'; + +-- 插入项目人员测试数据 +INSERT INTO project_member ( + member_id, + project_id, + user_id, + role_type, + job_code, + job_desc, + join_date, + status, + remark +) VALUES +-- 项目经理 +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '008ecfac153be83890c42f9fed0a48cd', 'PROJECT_MANAGER', 'PROJECT_MANAGER', '项目经理', '2025-01-15', 'ACTIVE', '项目总负责人'), + +-- 安全员 +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '014d6fd83182ac03d05967e16748ab80', 'SAFETY_OFFICER', 'SAFETY_MANAGER', '安全经理', '2025-01-15', 'ACTIVE', '负责项目安全管理'), + +-- 质量员 +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '0465342288d0637398b64ca73da76090', 'QUALITY_OFFICER', 'QUALITY_MANAGER', '质量经理', '2025-01-15', 'ACTIVE', '负责项目质量管理'), + +-- 施工组长 +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '008ecfac153be83890c42f9fed0a48cd', 'TEAM_LEADER', 'SITE_MANAGER', '现场经理', '2025-01-15', 'ACTIVE', '负责现场施工管理'), + +-- 地勤人员 +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '014d6fd83182ac03d05967e16748ab80', 'CONSTRUCTOR', 'GROUND_SERVICE', '地勤人员', '2025-01-15', 'ACTIVE', '负责地面施工工作'), + +-- 司机 +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '0465342288d0637398b64ca73da76090', 'CONSTRUCTOR', 'DRIVER', '司机', '2025-01-15', 'ACTIVE', '负责设备运输和人员接送'); + +-- ============================================= +-- 查询示例 +-- ============================================= + +-- 查询项目所有在职人员 +-- SELECT * FROM project_member WHERE project_id = '0b71a1259c49918c6595c9720ad1db5d' AND status = 'ACTIVE'; + +-- 查询项目的项目经理 +-- SELECT * FROM project_member WHERE project_id = '0b71a1259c49918c6595c9720ad1db5d' AND role_type = 'PROJECT_MANAGER' AND status = 'ACTIVE'; + +-- 按角色类型统计人员数量 +-- SELECT role_type, COUNT(*) as count FROM project_member WHERE project_id = '0b71a1259c49918c6595c9720ad1db5d' AND status = 'ACTIVE' GROUP BY role_type; \ No newline at end of file diff --git a/doc/regulation_api_test.md b/doc/regulation_api_test.md new file mode 100644 index 0000000..b1f1261 --- /dev/null +++ b/doc/regulation_api_test.md @@ -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(弃权) \ No newline at end of file diff --git a/doc/regulation_module_readme.md b/doc/regulation_module_readme.md new file mode 100644 index 0000000..496356f --- /dev/null +++ b/doc/regulation_module_readme.md @@ -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. **报表系统**: 集成报表系统,支持更丰富的统计报表 \ No newline at end of file diff --git a/doc/regulation_tables.sql b/doc/regulation_tables.sql new file mode 100644 index 0000000..1bf02f5 --- /dev/null +++ b/doc/regulation_tables.sql @@ -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='制度确认'; \ No newline at end of file diff --git a/doc/regulation_test_data.sql b/doc/regulation_test_data.sql new file mode 100644 index 0000000..ad9567e --- /dev/null +++ b/doc/regulation_test_data.sql @@ -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'); \ No newline at end of file diff --git a/pom.xml b/pom.xml index 4716368..0bff2ab 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ core - + sip web flowable diff --git a/web/src/main/java/com/dite/znpt/web/controller/AutoExpirationController.java b/web/src/main/java/com/dite/znpt/web/controller/AutoExpirationController.java new file mode 100644 index 0000000..9b27a29 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/AutoExpirationController.java @@ -0,0 +1,178 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.entity.AutoExpirationConfigEntity; +import com.dite.znpt.domain.entity.ExpirationResultEntity; +import com.dite.znpt.service.AutoExpirationService; +import com.dite.znpt.service.job.AutoExpirationJobService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * @author wangna + * @date 2025/08/05 + * @description 自动到期检测控制器 + */ +@Slf4j +@RestController +@RequestMapping("/auto-expiration") +@Api(tags = "自动到期检测") +public class AutoExpirationController { + + @Autowired + private AutoExpirationService autoExpirationService; + + @Autowired + private AutoExpirationJobService autoExpirationJobService; + + @PostMapping("/execute") + @ApiOperation("手动执行到期检测") + public Result executeExpirationCheck() { + try { + autoExpirationService.executeAutoExpirationCheck(); + return Result.okM("到期检测执行成功"); + } catch (Exception e) { + log.error("执行到期检测失败: {}", e.getMessage(), e); + return Result.error("执行到期检测失败: " + e.getMessage()); + } + } + + @GetMapping("/results") + @ApiOperation("获取到期检测结果") + public Result> getExpirationResults( + @ApiParam("状态筛选:0-正常,1-即将到期,2-已到期") @RequestParam(required = false) String status) { + try { + List results = autoExpirationService.getExpirationResults(status); + return Result.ok(results); + } catch (Exception e) { + log.error("获取到期检测结果失败: {}", e.getMessage(), e); + return Result.error("获取到期检测结果失败: " + e.getMessage()); + } + } + + @GetMapping("/statistics") + @ApiOperation("获取统计信息") + public Result> getStatistics() { + try { + Map statistics = autoExpirationService.getStatistics(); + return Result.ok(statistics); + } catch (Exception e) { + log.error("获取统计信息失败: {}", e.getMessage(), e); + return Result.error("获取统计信息失败: " + e.getMessage()); + } + } + + @PostMapping("/check-table/{tableName}") + @ApiOperation("检测指定表") + public Result checkTableExpiration(@PathVariable String tableName) { + try { + autoExpirationService.checkTableExpiration(tableName); + return Result.okM("表 " + tableName + " 检测完成"); + } catch (Exception e) { + log.error("检测表 {} 失败: {}", tableName, e.getMessage(), e); + return Result.error("检测表失败: " + e.getMessage()); + } + } + + @PostMapping("/config") + @ApiOperation("保存配置") + public Result saveConfig(@RequestBody AutoExpirationConfigEntity config) { + try { + // 检查是否已存在相同表的配置 + AutoExpirationConfigEntity existingConfig = autoExpirationService.lambdaQuery() + .eq(AutoExpirationConfigEntity::getTableName, config.getTableName()) + .eq(AutoExpirationConfigEntity::getDelFlag, "0") + .one(); + + if (existingConfig != null) { + // 如果存在,更新配置 + config.setConfigId(existingConfig.getConfigId()); + config.setCreateTime(existingConfig.getCreateTime()); + config.setCreateBy(existingConfig.getCreateBy()); + log.info("更新已存在的配置: {}", config.getTableName()); + } else { + // 如果不存在,生成新的配置ID + config.setConfigId("config-" + System.currentTimeMillis()); + log.info("创建新配置: {}", config.getTableName()); + } + + config.preSave(); + autoExpirationService.saveOrUpdate(config); + return Result.ok(config); + } catch (Exception e) { + log.error("保存配置失败: {}", e.getMessage(), e); + return Result.error("保存配置失败: " + e.getMessage()); + } + } + + @GetMapping("/configs") + @ApiOperation("获取所有配置") + public Result> getConfigs() { + try { + List configs = autoExpirationService.list(); + return Result.ok(configs); + } catch (Exception e) { + log.error("获取配置失败: {}", e.getMessage(), e); + return Result.error("获取配置失败: " + e.getMessage()); + } + } + + @DeleteMapping("/config/{configId}") + @ApiOperation("删除配置") + public Result deleteConfig(@PathVariable String configId) { + try { + autoExpirationService.removeById(configId); + return Result.okM("配置删除成功"); + } catch (Exception e) { + log.error("删除配置失败: {}", e.getMessage(), e); + return Result.error("删除配置失败: " + e.getMessage()); + } + } + + @GetMapping("/check-table/{tableName}") + @ApiOperation("检查表是否已配置到期检测") + public Result checkTableConfig(@PathVariable String tableName) { + try { + AutoExpirationConfigEntity config = autoExpirationService.getTableConfig(tableName); + if (config != null) { + return Result.ok(config); + } else { + return Result.ok(null); + } + } catch (Exception e) { + log.error("检查表配置失败: {}", e.getMessage(), e); + return Result.error("检查表配置失败: " + e.getMessage()); + } + } + + @PostMapping("/check-tables") + @ApiOperation("批量检查多个表的配置状态") + public Result> checkTablesConfig(@RequestBody List tableNames) { + try { + Map statusMap = autoExpirationService.getTablesConfigStatus(tableNames); + return Result.ok(statusMap); + } catch (Exception e) { + log.error("批量检查表配置失败: {}", e.getMessage(), e); + return Result.error("批量检查表配置失败: " + e.getMessage()); + } + } + + @PostMapping("/auto-config/{tableName}") + @ApiOperation("智能配置表检测") + public Result autoConfigureTable(@PathVariable String tableName) { + try { + AutoExpirationConfigEntity config = autoExpirationService.autoConfigureTable(tableName); + return Result.ok(config); + } catch (Exception e) { + log.error("智能配置表失败: {}", e.getMessage(), e); + return Result.error("智能配置表失败: " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/BiddingInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/BiddingInfoController.java new file mode 100644 index 0000000..4445c13 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/BiddingInfoController.java @@ -0,0 +1,85 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.BiddingInfoReq; +import com.dite.znpt.domain.vo.BiddingInfoResp; +import com.dite.znpt.service.BiddingInfoService; +import com.pig4cloud.plugin.excel.annotation.RequestExcel; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:07 + * @description + */ +@Api(tags = "招标信息") +@RestController +@RequestMapping("/bidding-info") +public class BiddingInfoController { + + @Resource + private BiddingInfoService biddingInfoService; + + @ApiOperation(value = "分页查询招标信息列表", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(String projectName) { + return PageResult.ok(biddingInfoService.page(projectName)); + } + + @ApiOperation(value = "查询招标信息列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(String projectName) { + return Result.ok(biddingInfoService.list(projectName)); + } + + @ApiOperation(value = "新增招标信息", httpMethod = "POST") + @PostMapping + public Result add(@Validated @RequestBody BiddingInfoReq req){ + biddingInfoService.save(req); + return Result.ok(); + } + + @ApiOperation(value = "编辑招标消息",httpMethod = "POST") + @PutMapping("/{biddingInfoId}") + public Result edit(@PathVariable String biddingInfoId, @Validated @RequestBody BiddingInfoReq req){ + biddingInfoService.update(biddingInfoId, req); + return Result.ok(); + } + + @ApiOperation(value = "上传招标文件",httpMethod = "PUT", notes = "上传附件调用新增附件信息接口:/attach-info/biddingInfo,userDefinedPath = {biddingInfoId}") + @PutMapping("/{biddingInfoId}/upload-bidding-info_file/{biddingFileId}") + public Result uploadBiddingInfoFile(@PathVariable String biddingInfoId, @PathVariable String biddingFileId){ + biddingInfoService.uploadBiddingInfoFile(biddingInfoId, biddingFileId); + return Result.ok(); + } + @ApiOperation(value = "报名", httpMethod = "PUT") + @PutMapping("/apply/{biddingInfoId}") + public Result apply(@PathVariable String biddingInfoId){ + biddingInfoService.apply(biddingInfoId); + return Result.ok(); + } + + + @ApiOperation(value = "下载导入模板", httpMethod = "GET") + @GetMapping("/download-template") + @ResponseExcel(name = "招标信息导入模板") + public List downloadTemplate() { + return List.of(new BiddingInfoReq()); + } + + @ApiOperation(value = "导入招标信息", httpMethod = "POST") + @PostMapping("/import") + public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { + return biddingInfoService.importData(dataList, bindingResult); + } + +} diff --git a/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java b/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java index b3318b5..238e447 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java @@ -65,4 +65,5 @@ public class EquipmentController { equipmentService.deleteById(equipmentId); return Result.ok(); } + } diff --git a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java index 518b177..5a147d1 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java @@ -57,15 +57,20 @@ public class ImageController { @ApiOperation(value = "手动批量上传文件夹图像到项目", httpMethod = "POST") @PostMapping("/{projectId}/{imageSource}/upload-batch") - public Result> uploadProjectBatch(@PathVariable String projectId, @PathVariable String imageSource, @RequestParam("files") MultipartFile[] files) { - return Result.ok(imageService.uploadProjectBatch(projectId, imageSource, files)); + public Result> uploadProjectBatch(@PathVariable String projectId, @PathVariable String imageSource, ImageCollectReq collectReq, @RequestParam("files") MultipartFile[] files) { + return Result.ok(imageService.uploadProjectBatch(projectId, imageSource, collectReq, files)); + } + + @ApiOperation(value = "手动批量上传文件夹图像到项目(单张)", httpMethod = "POST") + @PostMapping("/{projectId}/{imageSource}/upload") + public Result uploadProject(@PathVariable String projectId, @PathVariable String imageSource, ImageCollectReq collectReq, @RequestParam("file") MultipartFile file) { + return Result.ok(imageService.uploadProjectBatch(projectId, imageSource, collectReq, new MultipartFile[]{file}).get(0)); } @ApiOperation(value = "上传图像", httpMethod = "POST") @PostMapping("/{imageSource}/upload/{partId}") public Result uploadOutWork(@PathVariable String imageSource, @PathVariable String partId, ImageCollectReq collectReq, @RequestParam("file") MultipartFile file) { - MultipartFile[] files = {file}; - return Result.ok(imageService.batchUploadDefectImage(partId, imageSource, collectReq, files).get(0)); + return Result.ok(imageService.batchUploadDefectImage(partId, imageSource, collectReq, new MultipartFile[]{file}).get(0)); } @ApiOperation(value = "设置信息", httpMethod = "POST") diff --git a/web/src/main/java/com/dite/znpt/web/controller/OutbidInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/OutbidInfoController.java new file mode 100644 index 0000000..a73fe02 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/OutbidInfoController.java @@ -0,0 +1,72 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.OutbidInfoReq; +import com.dite.znpt.domain.vo.OutbidInfoResp; +import com.dite.znpt.service.OutbidInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:13 + * @description + */ +@Api(tags = "中标信息") +@RestController +@RequestMapping("/outbid-info") +public class OutbidInfoController { + @Resource + private OutbidInfoService outbidInfoService; + + @ApiOperation(value = "分页查询中标通知信息列表", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(String projectName){ + return PageResult.ok(outbidInfoService.page(projectName)); + } + + @ApiOperation(value = "查询中标通知信息列表", httpMethod = "GET") + @GetMapping("/list") + public Result list(String projectName){ + return Result.ok(outbidInfoService.list(projectName)); + } + + @ApiOperation(value = "根据中标通知信息Id获取详细信息", httpMethod = "GET") + @GetMapping("/detail/{outbidInfoId}") + public Result detail(@PathVariable String outbidInfoId){ + return Result.ok(outbidInfoService.detail(outbidInfoId)); + } + + @ApiOperation(value = "新增中标通知信息", httpMethod = "POST", notes = "上传附件调用新增附件信息接口:/attach-info/outbidInfo,userDefinedPath = {outbidInfoId}") + @PostMapping + public Result add(@RequestBody OutbidInfoReq req){ + outbidInfoService.save(req); + return Result.ok(); + } + + @ApiOperation(value = "根据中标通知信息Id更新信息", httpMethod = "PUT", notes = "上传附件调用新增附件信息接口:/attach-info/outbidInfo,userDefinedPath = {outbidInfoId}") + @PutMapping("/{outbidInfoId}") + public Result update(@PathVariable String outbidInfoId, @RequestBody OutbidInfoReq req){ + outbidInfoService.update(outbidInfoId, req); + return Result.ok(); + } + + @ApiOperation(value = "根据中标通知信息Id删除信息", httpMethod = "DELETE") + @DeleteMapping("/{outbidInfoId}") + public Result delete(@PathVariable String outbidInfoId){ + outbidInfoService.deleteById(outbidInfoId); + return Result.ok(); + } + + @ApiOperation(value = "下载中标通知信息文件", httpMethod = "POST") + @PostMapping("/download-outbid-info-file/{outbidNoticeFileId}") + public Result downLoadOutbidNoticeFile(@PathVariable String outbidNoticeFileId, HttpServletResponse response) throws Exception { + outbidInfoService.downLoadOutbidNoticeFile(outbidNoticeFileId, response); + return Result.ok(); + } +} diff --git a/web/src/main/java/com/dite/znpt/web/controller/ProjectDailyReportController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectDailyReportController.java new file mode 100644 index 0000000..b49bf8f --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/ProjectDailyReportController.java @@ -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 list(ProjectDailyReportListReq projectDailyReportReq) { + return PageResult.ok(projectDailyReportService.selectList(projectDailyReportReq)); + } + + @ApiOperation(value = "根据项目日报信息Id获取详细信息", httpMethod = "GET") + @GetMapping("/{reportId}") + public Result getInfo(@PathVariable String reportId) { + return Result.ok(projectDailyReportService.selectById(reportId)); + } + + @ApiOperation(value = "获取登录人当日日报", httpMethod = "GET") + @GetMapping("/my-today/{projectId}") + public Result myToday(@PathVariable String projectId) { + return Result.ok(projectDailyReportService.myToday(projectId)); + } + + @ApiOperation(value = "新增项目日报信息", httpMethod = "POST") + @PostMapping + public Result add(@Validated @RequestBody ProjectDailyReportReq projectDailyReportReq) { + projectDailyReportService.saveData(projectDailyReportReq); + return Result.ok(); + } + + @ApiOperation(value = "修改项目日报信息", httpMethod = "PUT") + @PutMapping + public Result edit(@Validated @RequestBody ProjectDailyReportReq projectDailyReportReq) { + projectDailyReportService.updateData(projectDailyReportReq); + return Result.ok(); + } + + @ApiOperation(value = "删除项目日报信息", httpMethod = "DELETE") + @DeleteMapping("/{reportId}") + public Result remove(@PathVariable String reportId) { + projectDailyReportService.deleteById(reportId); + return Result.ok(); + } +} + diff --git a/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java new file mode 100644 index 0000000..85d786a --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java @@ -0,0 +1,153 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.ProjectMemberListReq; +import com.dite.znpt.domain.vo.ProjectMemberReq; +import com.dite.znpt.domain.vo.ProjectMemberResp; +import com.dite.znpt.domain.vo.ProjectKanbanStatsResp; +import com.dite.znpt.domain.vo.ProjectKanbanDataResp; +import com.dite.znpt.domain.vo.ProjectDetailResp; +import com.dite.znpt.service.ProjectMemberService; +import com.dite.znpt.util.PageUtil; +import com.dite.znpt.util.ValidationGroup; +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; +import java.util.List; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目人员管理Controller + */ +@Api(tags = "项目人员管理") +@RestController +@RequestMapping("/project-member") +public class ProjectMemberController { + + @Resource + private ProjectMemberService projectMemberService; + + @ApiOperation(value = "查询项目人员列表", httpMethod = "GET") + @GetMapping("/list") + public PageResult list(ProjectMemberListReq req) { + PageUtil.startPage(); + return PageResult.ok(projectMemberService.selectList(req)); + } + + @ApiOperation(value = "根据项目ID查询项目人员", httpMethod = "GET") + @GetMapping("/project/{projectId}") + public Result> getByProjectId(@PathVariable String projectId) { + return Result.ok(projectMemberService.selectByProjectId(projectId)); + } + + @ApiOperation(value = "根据机组ID查询机组人员", httpMethod = "GET") + @GetMapping("/turbine/{turbineId}") + public Result> getByTurbineId(@PathVariable String turbineId) { + return Result.ok(projectMemberService.selectByTurbineId(turbineId)); + } + + @ApiOperation(value = "根据任务组ID查询任务组人员", httpMethod = "GET") + @GetMapping("/task-group/{taskGroupId}") + public Result> getByTaskGroupId(@PathVariable String taskGroupId) { + return Result.ok(projectMemberService.selectByTaskGroupId(taskGroupId)); + } + + @ApiOperation(value = "根据任务ID查询任务人员", httpMethod = "GET") + @GetMapping("/task/{taskId}") + public Result> getByTaskId(@PathVariable String taskId) { + return Result.ok(projectMemberService.selectByTaskId(taskId)); + } + + @ApiOperation(value = "根据用户ID查询用户参与的项目", httpMethod = "GET") + @GetMapping("/user/{userId}") + public Result> getByUserId(@PathVariable String userId) { + return Result.ok(projectMemberService.selectByUserId(userId)); + } + + @ApiOperation(value = "根据项目ID和角色类型查询人员", httpMethod = "GET") + @GetMapping("/project/{projectId}/role/{roleType}") + public Result> getByProjectIdAndRoleType(@PathVariable String projectId, @PathVariable String roleType) { + return Result.ok(projectMemberService.selectByProjectIdAndRoleType(projectId, roleType)); + } + + @ApiOperation(value = "新增项目人员", httpMethod = "POST") + @PostMapping + public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody ProjectMemberReq req) { + projectMemberService.saveData(req); + return Result.ok(); + } + + @ApiOperation(value = "修改项目人员", httpMethod = "PUT") + @PutMapping + public Result edit(@Validated(ValidationGroup.Update.class) @RequestBody ProjectMemberReq req) { + projectMemberService.updateData(req); + return Result.ok(); + } + + @ApiOperation(value = "删除项目人员", httpMethod = "DELETE") + @DeleteMapping("/{memberId}") + public Result remove(@PathVariable String memberId) { + projectMemberService.deleteById(memberId); + return Result.ok(); + } + + @ApiOperation(value = "批量添加项目人员", httpMethod = "POST") + @PostMapping("/batch") + public Result batchAdd(@RequestBody List reqList) { + projectMemberService.batchAddMembers(reqList); + return Result.ok(); + } + + @ApiOperation(value = "根据项目ID删除所有项目人员", httpMethod = "DELETE") + @DeleteMapping("/project/{projectId}") + public Result removeByProjectId(@PathVariable String projectId) { + projectMemberService.deleteByProjectId(projectId); + return Result.ok(); + } + + @ApiOperation(value = "根据机组ID删除所有机组人员", httpMethod = "DELETE") + @DeleteMapping("/turbine/{turbineId}") + public Result removeByTurbineId(@PathVariable String turbineId) { + projectMemberService.deleteByTurbineId(turbineId); + return Result.ok(); + } + + @ApiOperation(value = "根据任务组ID删除所有任务组人员", httpMethod = "DELETE") + @DeleteMapping("/task-group/{taskGroupId}") + public Result removeByTaskGroupId(@PathVariable String taskGroupId) { + projectMemberService.deleteByTaskGroupId(taskGroupId); + return Result.ok(); + } + + @ApiOperation(value = "根据任务ID删除所有任务人员", httpMethod = "DELETE") + @DeleteMapping("/task/{taskId}") + public Result removeByTaskId(@PathVariable String taskId) { + projectMemberService.deleteByTaskId(taskId); + return Result.ok(); + } + + // ========================== 项目看板相关接口 ========================== + + @ApiOperation(value = "获取项目看板统计数据", httpMethod = "GET") + @GetMapping("/kanban/stats") + public Result getProjectKanbanStats() { + return Result.ok(projectMemberService.getProjectKanbanStats()); + } + + @ApiOperation(value = "获取项目看板数据", httpMethod = "GET") + @GetMapping("/kanban/data") + public Result getProjectKanbanData() { + return Result.ok(projectMemberService.getProjectKanbanData()); + } + + @ApiOperation(value = "获取项目详情", httpMethod = "GET") + @GetMapping("/project/{projectId}/detail") + public Result getProjectDetail(@PathVariable String projectId) { + return Result.ok(projectMemberService.getProjectDetail(projectId)); + } +} \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/ProjectTaskController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectTaskController.java index b2cd6b3..dd59781 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ProjectTaskController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ProjectTaskController.java @@ -5,7 +5,6 @@ import cn.dev33.satoken.stp.StpUtil; import com.dite.znpt.constant.Constants; import com.dite.znpt.domain.PageResult; import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.entity.ProjectTaskEntity; import com.dite.znpt.domain.vo.*; import com.dite.znpt.service.ProjectTaskService; import com.dite.znpt.util.PageUtil; @@ -102,8 +101,7 @@ public class ProjectTaskController { @ApiOperation(value = "查询我的任务", httpMethod = "GET") @GetMapping("/my") - public Result> my() { - ProjectTaskListReq req = new ProjectTaskListReq(); + public Result> my(ProjectTaskListReq req) { req.setUserId(StpUtil.getLoginIdAsString()); return Result.ok(projectTaskService.selectList(req)); } diff --git a/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java b/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java new file mode 100644 index 0000000..19e770b --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java @@ -0,0 +1,78 @@ +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, + @RequestParam(required = false) String confirmStatus) { + return regulationService.getRegulationList(page, size, status, type, title, proposer, confirmStatus); + } + + @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); + } + +} \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/RegulationTypeController.java b/web/src/main/java/com/dite/znpt/web/controller/RegulationTypeController.java new file mode 100644 index 0000000..b83cd26 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/RegulationTypeController.java @@ -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); + } +} \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/TenderInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/TenderInfoController.java new file mode 100644 index 0000000..3dd5d58 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/TenderInfoController.java @@ -0,0 +1,69 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.BiddingInfoResp; +import com.dite.znpt.domain.vo.TenderInfoReq; +import com.dite.znpt.domain.vo.TenderInfoResp; +import com.dite.znpt.service.TenderInfoService; +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; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:10 + * @description + */ +@Api(tags = "投标信息") +@RestController +@RequestMapping("/tender-info") +public class TenderInfoController { + + @Resource + private TenderInfoService tenderInfoService; + + @ApiOperation(value = "分页查询投标信息列表", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(String projectName){ + return PageResult.ok(tenderInfoService.page(projectName)); + } + + @ApiOperation(value = "查询投标信息列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(String projectName){ + return Result.ok(tenderInfoService.list(projectName)); + } + + @ApiOperation(value = "根据投标信息Id获取详细信息", httpMethod = "GET") + @GetMapping("/detail/{tenderInfoId}") + public Result detail(@PathVariable String tenderInfoId){ + return Result.ok(tenderInfoService.detail(tenderInfoId)); + } + + @ApiOperation(value = "新增投标信息", httpMethod = "POST") + @PostMapping + public Result add(@Validated @RequestBody TenderInfoReq req) { + tenderInfoService.save(req); + return Result.ok(); + } + + @ApiOperation(value = "修改投标信息", httpMethod = "PUT", notes = "上传附件调用新增附件信息接口:/attach-info/tenderInfo,userDefinedPath = {tenderInfoId}") + @PutMapping("/{tenderInfoId}") + public Result edit(@PathVariable String tenderInfoId, @Validated @RequestBody TenderInfoReq req) { + tenderInfoService.update(tenderInfoId, req); + return Result.ok(); + } + + @ApiOperation(value = "删除投标信息", httpMethod = "DELETE", notes = "上传附件调用新增附件信息接口:/attach-info/tenderInfo,userDefinedPath = {tenderInfoId}") + @DeleteMapping("/{tenderInfoId}") + public Result delete(@PathVariable String tenderInfoId) { + tenderInfoService.deleteById(tenderInfoId); + return Result.ok(); + } + +} diff --git a/web/src/main/java/com/dite/znpt/web/controller/VideoController.java b/web/src/main/java/com/dite/znpt/web/controller/VideoController.java index e69de29..2eef147 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/VideoController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/VideoController.java @@ -0,0 +1,188 @@ +package com.dite.znpt.web.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.monitor.constant.IotRespMessage; +import com.dite.znpt.monitor.constant.dict.DeviceStatus; +import com.dite.znpt.monitor.constant.dict.SipTransferMode; +import com.dite.znpt.monitor.constant.dict.StreamTransferMode; +import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; +import com.dite.znpt.monitor.domain.req.MonitorConfigAddReq; +import com.dite.znpt.monitor.domain.resp.DeviceVideoResp; +import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelEditReq; +import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelListResp; +import com.dite.znpt.monitor.domain.vo.video.DeviceVideoEditReq; +import com.dite.znpt.monitor.domain.vo.video.DeviceVideoListResp; +import com.dite.znpt.monitor.media.zlm.config.StreamMediaServerConfig; +import com.dite.znpt.monitor.service.DeviceVideoChannelService; +import com.dite.znpt.monitor.service.DeviceVideoService; +import com.dite.znpt.monitor.service.IpConfigService; +import com.dite.znpt.monitor.sip.config.SipConfig; +import com.dite.znpt.monitor.sip.transmit.cmd.ISipDeviceCommander; +import com.dite.znpt.monitor.utils.DictUtils; +import com.dite.znpt.util.PageUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.List; + +/** + * @Author: huise23 + * @Date: 2022/8/8 10:39 + * @Description: + */ +@Api(tags = "视频管理") +@RestController +@RequestMapping("/monitoring/video") +public class VideoController { + + @Resource + private SipConfig sipConfig; + + @Resource + private StreamMediaServerConfig streamMediaServerConfigService; + + @Resource + private DeviceVideoService deviceVideoService; + + @Resource + private IpConfigService ipConfigService; + + @Resource + private DeviceVideoChannelService deviceVideoChannelService; + + @Resource + private ISipDeviceCommander sipDeviceCommander; + + @ApiOperation(value = "获取信令服务器配置信息", notes = "iot:video:sip:view", httpMethod = "GET") + @GetMapping("/sipServerConfig") + public Result getSipServerConfig(){ + return Result.ok(BeanUtil.copyProperties(sipConfig, SipConfig.class)); + } + + @ApiOperation(value = "获取流媒体服务配置信息", notes = "iot:video:media:view", httpMethod = "GET") + @GetMapping("/streamMediaServerConfig") + public Result getStreamMediaServerConfig(){ + return Result.ok(BeanUtil.copyProperties(streamMediaServerConfigService, StreamMediaServerConfig.class)); + } + + @ApiOperation(value = "查询监控IP配置列表", notes = "iot:config:list", httpMethod = "GET") + @GetMapping("/config/list") + public Result> configList(){ + PageUtil.startPage(); + return Result.ok(ipConfigService.configList()); + } + + @ApiOperation(value = "配置监控IP列表,每次全量传ip列表", notes = "iot:config:add", httpMethod = "POST") + @PostMapping("/config/add") + public Result configAdd(@RequestBody MonitorConfigAddReq req){ + ipConfigService.configAdd(req); + return Result.ok(); + } + + @ApiOperation(value = "分页查询视频设备列表", notes = "iot:video:list", httpMethod = "GET") + @GetMapping("/device/page") + public PageResult pageDevice( + @RequestParam(value = "status", required = false) String status, + @RequestParam(value = "keyword", required = false) String keyword, + @RequestParam(value = "hostAddress", required = false) String hostAddress){ + PageUtil.startPage(); + return deviceVideoService.selectDeviceVideoList(status, keyword,hostAddress); + } + + @ApiOperation(value = "查看视频设备数量", notes = "iot:video:list", httpMethod = "GET") + @GetMapping("/device/count") + public Result countDevice(){ + return Result.ok(deviceVideoService.countDeviceVideoNum()); + } + + @ApiOperation(value = "查看视频设备详情", notes = "iot:video:view", httpMethod = "GET") + @GetMapping("/device/{videoId}") + public Result viewDevice(@PathVariable("videoId") Long videoId){ + final DeviceVideoEntity entity = deviceVideoService.getById(videoId); + final DeviceVideoResp resp = BeanUtil.copyProperties(entity, DeviceVideoResp.class); + resp.setStatusLabel(DictUtils.getDictLabel(DeviceStatus.class, resp.getStatus())); + resp.setStreamModeLabel(DictUtils.getDictLabel(StreamTransferMode.class, resp.getStreamMode())); + resp.setTransportLabel(DictUtils.getDictLabel(SipTransferMode.class, resp.getTransport())); + return Result.ok(resp); + } + + @ApiOperation(value = "编辑视频设备", notes = "iot:video:edit", httpMethod = "PUT") + @PutMapping("/device/{videoId}") + public Result editDevice(@PathVariable("videoId") Long videoId, @RequestBody DeviceVideoEditReq req){ + deviceVideoService.editDeviceVideo(videoId, req); + return Result.ok(); + } + + @ApiOperation(value = "更新视频设备", notes = "iot:video:sync", httpMethod = "PUT") + @PutMapping("/device/sync/{videoId}") + public Result syncDevice(@PathVariable("videoId") Long videoId){ + DeviceVideoEntity entity = deviceVideoService.getById(videoId); + if(DeviceStatus.ONLINE.getValue().equals(entity.getStatus())){ + sipDeviceCommander.queryCatalog(entity); + return Result.ok(); + }else { + return Result.error(IotRespMessage.DEVICE_VIDEO_CANNOT_SYNC); + } + } + + @ApiOperation(value = "删除视频设备", notes = "iot:video:delete", httpMethod = "DELETE") + @DeleteMapping("/device/{videoId}") + public Result deleteDevice(@PathVariable("videoId") Long videoId){ + return deviceVideoService.removeByVideoId(videoId); + } + + @ApiOperation(value = "分页查询视频通道列表", notes = "iot:video:channel:list", httpMethod = "GET") + @GetMapping("/channel/page/{videoId}") + public PageResult pageChannel(@PathVariable("videoId") Long videoId, @RequestParam(value = "keyword", required = false) String keyword){ + return deviceVideoChannelService.selectDeviceVideoChannel(videoId, keyword); + } + + @ApiOperation(value = "分页查询所有视频通道列表", notes = "iot:video:channel:list", httpMethod = "GET") + @GetMapping("/channel/page") + public PageResult pageAllChannel(@RequestParam(value = "keyword", required = false) String keyword){ + return deviceVideoChannelService.selectAllDeviceVideoChannel(keyword); + } + + @ApiOperation(value = "查看视频通道", notes = "iot:video:channel:view", httpMethod = "GET") + @GetMapping("/channel/{channelCode}") + public Result viewChannel(@PathVariable("channelCode") String channelCode){ + return Result.ok(deviceVideoChannelService.getDeviceVideoChannelDetail(channelCode)); + } + + @ApiOperation(value = "编辑视频通道", notes = "iot:video:channel:edit", httpMethod = "PUT") + @PutMapping("/channel/{channelId}") + public Result editChannel(@PathVariable("channelId") Long channelId, @RequestBody DeviceVideoChannelEditReq req){ + deviceVideoChannelService.editDeviceVideoChannel(channelId, req); + return Result.ok(); + } + + @ApiOperation(value = "删除视频通道", notes = "iot:video:channel:delete", httpMethod = "DELETE") + @DeleteMapping("/channel/{channelId}") + public Result deleteChannel(@PathVariable("channelId") Long channelId){ + return deviceVideoChannelService.removeByChannelIds(Arrays.asList(channelId)); + } + + @ApiOperation(value = "播放直播视频", notes = "iot:video:play", httpMethod = "GET") + @GetMapping("/play/live/{channelCode}") + public Result play(@PathVariable("channelCode") String channelCode){ + return Result.ok(deviceVideoChannelService.play(channelCode)); + } + + @ApiOperation(value = "查询视频设备是否在线", notes = "iot:video:isOnline", httpMethod = "GET") + @GetMapping("/channel/isOnline/{channelCode}") + public Result isOnline(@PathVariable("channelCode") String channelCode){ + return Result.ok(deviceVideoChannelService.isOnline(channelCode)); + } + + @ApiOperation(value = "停止播放直播", notes = "iot:video:stop", httpMethod = "GET") + @GetMapping("/stop/live/{channelCode}") + public Result stop(@PathVariable("channelCode") String channelCode){ + deviceVideoChannelService.stop(channelCode); + return Result.ok(); + } +} diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index cba9a5f..748a800 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -3,6 +3,12 @@ server: # 服务器的HTTP端口,默认为8080 port: 8888 + address : 0.0.0.0 # 监听所有网络接口 + servlet: + encoding: + enabled: true + charset: UTF-8 + force: true # 数据源配置 spring: @@ -121,39 +127,39 @@ sa-token: # 是否输出操作日志 is-log: true -sip-config: - name: 信令服务 - ip: 127.0.0.1 - port: 1074 - charset: gb2312 - domain: 3402000000 - id: 34020000002000000001 - password: 123456 - mediaType: mp4 - -zlm-config: - # 流媒体名称 - mediaName: 媒体服务 - # 流媒体服务商 - mediaService: ZLMdia - # 公网ip - publicHost: - # 接口ip - apiHost: 127.0.0.1 - # 接口端口 - apiPort: 8080 - # 密钥 - secretKey: 6Q76ivvVOQDsnnfOSKbtVzcYpbgy4n1G - # 流id前缀 - streamPrefix: - # rtp ip - rtpHost: 127.0.0.1 - # rtp 端口 - rtpPort: 8080 - # 动态端口起始值 - dynamicPortStart: 30150 - # 动态端口结束值 - dynamicPortEnd: 30185 +#sip-config: +# name: 信令服务 +# ip: 127.0.0.1 +# port: 1074 +# charset: gb2312 +# domain: 3402000000 +# id: 34020000002000000001 +# password: 123456 +# mediaType: mp4 +# +#zlm-config: +# # 流媒体名称 +# mediaName: 媒体服务 +# # 流媒体服务商 +# mediaService: ZLMdia +# # 公网ip +# publicHost: +# # 接口ip +# apiHost: 127.0.0.1 +# # 接口端口 +# apiPort: 8080 +# # 密钥 +# secretKey: 6Q76ivvVOQDsnnfOSKbtVzcYpbgy4n1G +# # 流id前缀 +# streamPrefix: +# # rtp ip +# rtpHost: 127.0.0.1 +# # rtp 端口 +# rtpPort: 8080 +# # 动态端口起始值 +# dynamicPortStart: 30150 +# # 动态端口结束值 +# dynamicPortEnd: 30185 upload: # 此处仅定义总的父路径,细节定义到 FilePathEnum diff --git a/web/src/main/resources/application.yml b/web/src/main/resources/application.yml index 694c057..7adbb7d 100644 --- a/web/src/main/resources/application.yml +++ b/web/src/main/resources/application.yml @@ -22,6 +22,7 @@ spring: allow-circular-references: true allow-bean-definition-overriding: true + # flowable相关表 flowable: # true 会对数据库中所有表进行更新操作。如果表不存在,则自动创建(建议开发时使用) diff --git a/web/src/main/resources/logback.xml b/web/src/main/resources/logback.xml index 5f99223..c99788b 100644 --- a/web/src/main/resources/logback.xml +++ b/web/src/main/resources/logback.xml @@ -7,7 +7,7 @@ - + ${log.pattern} @@ -24,7 +24,7 @@ 10mb 200mb - + ${log.pattern} @@ -48,7 +48,7 @@ 10mb 300mb - + ${log.pattern} @@ -72,7 +72,7 @@ 10mb 500mb - + ${log.pattern}