diff --git a/core/pom.xml b/core/pom.xml
index a5536ed..b90f9ba 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -78,19 +78,6 @@
3.0.3
-
-
- com.baomidou
- mybatis-plus-generator
- 3.5.11
-
-
-
- org.apache.velocity
- velocity-engine-core
- 2.3
-
-
com.alibaba
@@ -103,12 +90,6 @@
spring-jdbc
-
-
- org.freemarker
- freemarker
-
-
org.springframework
spring-tx
@@ -137,7 +118,7 @@
org.redisson
redisson
- 3.16.0
+ 3.22.0
@@ -149,7 +130,7 @@
com.drewnoakes
metadata-extractor
- 2.15.0
+ 2.18.0
@@ -168,12 +149,6 @@
1.3.0-91
compile
-
- javax.sip
- jain-sip-ri
- 1.3.0-91
- compile
-
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 c12a266..9ac0cda 100644
--- a/core/src/main/java/com/dite/znpt/constant/Message.java
+++ b/core/src/main/java/com/dite/znpt/constant/Message.java
@@ -39,4 +39,9 @@ public class Message implements Serializable {
public static final String CERTIFICATION_TYPE_ILLEGAL = "证书类型不合法";
public static final String CERTIFICATION_CODE_EXIST = "证书编码已存在";
public static final String CERTIFICATION_ID_NOT_EXIST = "证书id不存在";
+ public static final String TASK_ID_GROUP_ID_ALL_EMPTY = "任务id和任务组id不可同时为空";
+ public static final String TASK_STATUS_NOT_PENDING = "任务状态不是未开始";
+ public static final String TASK_STATUS_NOT_IN_PROGRESS = "任务状态不是进行中";
+ public static final String TASK_IN_CYCLE = "父级任务存在循环依赖:";
+ public static final String TASK_GROUP_ID_NOT_EXIST = "任务组id不存在";
}
diff --git a/core/src/main/java/com/dite/znpt/domain/Result.java b/core/src/main/java/com/dite/znpt/domain/Result.java
index f893e22..9228b34 100644
--- a/core/src/main/java/com/dite/znpt/domain/Result.java
+++ b/core/src/main/java/com/dite/znpt/domain/Result.java
@@ -70,7 +70,11 @@ public class Result implements Serializable {
}
public static Result error(String code, String msg) {
- return new Result(HttpStatus.INTERNAL_SERVER_ERROR, null, Integer.parseInt(code), msg);
+ return error(code, msg, null);
+ }
+
+ public static Result error(String code, String msg, T data) {
+ return new Result(HttpStatus.INTERNAL_SERVER_ERROR, data, Integer.parseInt(code), msg);
}
}
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
new file mode 100644
index 0000000..38abca2
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java
@@ -0,0 +1,46 @@
+package com.dite.znpt.domain.entity;
+
+import java.time.LocalDateTime;
+import java.io.Serial;
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.dite.znpt.domain.AuditableEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+/**
+ * @author huise23
+ * @date 2025/06/27 10:10
+ * @Description: 附件信息表实体类
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+@TableName("attach_info")
+@ApiModel(value="AttachInfoEntity对象", description="附件信息表")
+public class AttachInfoEntity extends AuditableEntity implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = -70522903124405433L;
+
+ @ApiModelProperty("附件id")
+ @TableId(value = "attach_id", type = IdType.ASSIGN_ID)
+ private String attachId;
+
+ @ApiModelProperty("业务id")
+ @TableField("business_id")
+ private String businessId;
+
+ @ApiModelProperty("附件路径")
+ @TableField("attach_path")
+ private String attachPath;
+
+ @ApiModelProperty("业务类型,字典attach_business_type")
+ @TableField("business_type")
+ private String businessType;
+}
+
diff --git a/core/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java
deleted file mode 100644
index fb1aa27..0000000
--- a/core/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.dite.znpt.domain.entity;
-
-import java.io.Serializable;
-
-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;
-
-/**
- * @author huise23
- * @date 2025/04/11 23:17
- * @Description: 文件信息表实体类
- */
-@Data
-@EqualsAndHashCode(callSuper = false)
-@TableName("file_info")
-@ApiModel(value="FileInfoEntity对象", description="文件信息表")
-public class FileInfoEntity extends AuditableEntity implements Serializable {
-
- private static final long serialVersionUID = -14287111699285655L;
-
- @ExcelProperty("文件id")
- @ApiModelProperty("文件id")
- @TableId(value = "file_id", type = IdType.ASSIGN_UUID)
- private Long fileId;
-
- @ExcelProperty("业务id")
- @ApiModelProperty("业务id")
- @TableField("business_id")
- private String businessId;
-
- @ExcelProperty("minio相对路径")
- @ApiModelProperty("minio相对路径")
- @TableField("minio_path")
- private String minioPath;
-
- @ExcelProperty("业务类型,字典file_business_type")
- @ApiModelProperty("业务类型,字典file_business_type")
- @TableField("business_type")
- private String businessType;
-}
-
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 b92e0bf..df8ec34 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,9 +1,12 @@
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.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;
@@ -105,23 +108,28 @@ public class ProjectEntity extends AuditableEntity implements Serializable {
@ApiModelProperty("技术方案图片,多个用逗号隔开")
@JsonIgnore
@TableField("technical_image")
+ @Deprecated
private String technicalImage;
@ApiModelProperty("技术方案内容")
@TableField("technical_content")
+ @Deprecated
private String technicalContent;
@ApiModelProperty("安全措施图片,多个用逗号隔开")
@JsonIgnore
@TableField("safety_image")
+ @Deprecated
private String safetyImage;
@ApiModelProperty("安全措施内容")
@TableField("safety_content")
+ @Deprecated
private String safetyContent;
@ApiModelProperty("交底内容")
@TableField("disclose_content")
+ @Deprecated
private String discloseContent;
@ApiModelProperty("状态:0待施工,1施工中,2已完工,3已审核,4已验收")
@@ -130,14 +138,23 @@ public class ProjectEntity extends AuditableEntity implements Serializable {
@ApiModelProperty("项目工作类型 可能有多项,逗号分隔")
@TableField("work_type")
+ @Deprecated
private String workType;
@ApiModelProperty("项目工作岗位 可能有多项,json对象保存")
@TableField("job")
+ @Deprecated
private String job;
@ApiModelProperty(value = "项目安全风险点", example = "1", notes = "项目安全风险点 可能有多项,逗号分隔")
@TableField("safety_risk_point")
+ @Deprecated
private String safetyRiskPoint;
+
+ @ApiModelProperty(value = "开始时间")
+ private LocalDate startDate;
+
+ @ApiModelProperty(value = "结束时间")
+ private LocalDate endDate;
}
diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectTaskEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectTaskEntity.java
new file mode 100644
index 0000000..3c3560d
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectTaskEntity.java
@@ -0,0 +1,85 @@
+package com.dite.znpt.domain.entity;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.io.Serial;
+import java.io.Serializable;
+
+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;
+
+/**
+ * @author huise23
+ * @date 2025/06/25 21:48
+ * @Description: 项目任务信息表实体类
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("project_task")
+@ApiModel(value="ProjectTaskEntity对象", description="项目任务信息表")
+public class ProjectTaskEntity extends AuditableEntity implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 445818156838153502L;
+
+ @ApiModelProperty("任务id")
+ @TableId(value = "task_id", type = IdType.ASSIGN_ID)
+ private String taskId;
+
+ @ApiModelProperty("上级任务id")
+ @TableField("parent_task_id")
+ private String parentTaskId;
+
+ @ApiModelProperty("任务组id")
+ @TableField("task_group_id")
+ private String taskGroupId;
+
+ @ApiModelProperty("项目任务名称")
+ @TableField("task_name")
+ private String taskName;
+
+ @ApiModelProperty("项目任务编号")
+ @TableField("task_code")
+ private String taskCode;
+
+ @ApiModelProperty("任务负责人id")
+ @TableField("main_user_id")
+ private String mainUserId;
+
+ @ApiModelProperty("任务参与人id,逗号分隔")
+ @TableField("user_ids")
+ private String userIds;
+
+ @ApiModelProperty("计划开始时间")
+ @TableField("plan_start_date")
+ private LocalDate planStartDate;
+
+ @ApiModelProperty("计划结束时间")
+ @TableField("plan_end_date")
+ private LocalDate planEndDate;
+
+ @ApiModelProperty("实际开始时间")
+ @TableField("actual_start_date")
+ private LocalDate actualStartDate;
+
+ @ApiModelProperty("实际结束时间")
+ @TableField("actual_end_date")
+ private LocalDate actualEndDate;
+
+ @ApiModelProperty("任务状态,0未开始,1进行中,2已结束")
+ @TableField("status")
+ private Integer status;
+
+ @ApiModelProperty("是否逾期,默认未逾期")
+ @TableField("overdue_status")
+ private Integer overdueStatus;
+
+ @ApiModelProperty("备注")
+ @TableField("remark")
+ private String remark;
+}
+
diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectTaskGroupEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectTaskGroupEntity.java
new file mode 100644
index 0000000..15f38a0
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectTaskGroupEntity.java
@@ -0,0 +1,37 @@
+package com.dite.znpt.domain.entity;
+
+import java.time.LocalDateTime;
+import java.io.Serial;
+import java.io.Serializable;
+
+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;
+
+/**
+ * @author huise23
+ * @date 2025/06/24 17:06
+ * @Description: 项目任务组信息表实体类
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("project_task_group")
+@ApiModel(value="ProjectTaskGroupEntity对象", description="项目任务组信息表")
+public class ProjectTaskGroupEntity extends AuditableEntity implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = -86904406809616523L;
+
+ @ApiModelProperty("id")
+ @TableId(value = "group_id", type = IdType.ASSIGN_ID)
+ private String groupId;
+
+ @ApiModelProperty("项目任务组名")
+ @TableField("group_name")
+ private String groupName;
+}
+
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
new file mode 100644
index 0000000..026d7e0
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java
@@ -0,0 +1,36 @@
+package com.dite.znpt.domain.vo;
+
+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 huise23
+ * @date 2025/06/25 21:59
+ * @Description: 附件信息表请求类
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="AttachInfo请求对象", description="附件信息表")
+public class AttachInfoReq implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = -59837569061686176L;
+
+ @ApiModelProperty("附件id")
+ private Long attachId;
+
+ @ApiModelProperty("业务id")
+ private String businessId;
+
+ @ApiModelProperty("请求路径")
+ private String attachPath;
+
+ @ApiModelProperty("业务类型,字典attach_business_type")
+ private String businessType;
+}
+
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/FileInfoListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/FileInfoListReq.java
deleted file mode 100644
index eef330e..0000000
--- a/core/src/main/java/com/dite/znpt/domain/vo/FileInfoListReq.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.dite.znpt.domain.vo;
-
-import java.io.Serializable;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-/**
- * @author huise23
- * @date 2025/04/11 23:17
- * @Description: 文件信息请求实体
- */
-@Data
-@ApiModel("文件信息列表请求实体")
-public class FileInfoListReq implements Serializable {
-
- private static final long serialVersionUID = 574018420246881535L;
-
- @ApiModelProperty("查询关键字")
- private String keyword;
-
- @ApiModelProperty("文件信息Id")
- private Long fileId;
-
- @ApiModelProperty("业务id")
- private String businessId;
-
- @ApiModelProperty("minio相对路径")
- private String minioPath;
-
- @ApiModelProperty("业务类型,字典file_business_type")
- private String businessType;
-
-}
-
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/FileInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/FileInfoResp.java
deleted file mode 100644
index b01b426..0000000
--- a/core/src/main/java/com/dite/znpt/domain/vo/FileInfoResp.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.dite.znpt.domain.vo;
-
-import io.swagger.annotations.ApiModel;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import com.dite.znpt.domain.entity.FileInfoEntity;
-
-/**
- * @author huise23
- * @date 2025/04/11 23:17
- * @Description: 文件信息响应实体
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ApiModel("文件信息响应实体")
-public class FileInfoResp extends FileInfoEntity {
-}
-
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java
index 46ad94b..42f55e5 100644
--- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java
@@ -35,13 +35,11 @@ public class ProjectListReq implements Serializable {
@ApiModelProperty("项目状态,枚举:ProjectStatusEnum")
private String status;
- @JsonFormat(pattern = "yyyy-MM-dd")
- @ApiModelProperty("创建日期-起")
- private String createDateBegin;
+ @ApiModelProperty("项目开始日期")
+ private LocalDate startDate;
- @JsonFormat(pattern = "yyyy-MM-dd")
- @ApiModelProperty("创建日期-讫")
- private String createDateEnd;
+ @ApiModelProperty("项目结束日期")
+ private LocalDate endDate;
}
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java
index d311d2d..d2db815 100644
--- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java
@@ -11,6 +11,7 @@ import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
+import java.time.LocalDate;
import java.time.LocalDateTime;
/**
@@ -81,8 +82,9 @@ public class ProjectListResp implements Serializable {
@ApiModelProperty("施工人员")
private String constructorName;
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
- @ApiModelProperty("创建时间")
- private LocalDateTime createTime;
+ @ApiModelProperty(value = "开始时间")
+ private LocalDate startDate;
+ @ApiModelProperty(value = "结束时间")
+ private LocalDate endDate;
}
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java
index 161c6c5..b36e673 100644
--- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java
@@ -1,5 +1,6 @@
package com.dite.znpt.domain.vo;
+import com.alibaba.excel.annotation.ExcelProperty;
import com.dite.znpt.util.ValidationGroup;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -9,6 +10,7 @@ import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.io.Serial;
import java.io.Serializable;
+import java.time.LocalDate;
/**
* @Author: gaoxiong
@@ -22,6 +24,10 @@ public class ProjectReq implements Serializable {
@Serial
private static final long serialVersionUID = 740685592879189406L;
+ @NotBlank(groups = {ValidationGroup.Update.class}, message = "项目id不能为空")
+ @ApiModelProperty("项目id")
+ private String projectId;
+
@NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "项目名称不能为空")
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 50, message = "项目名称长度不能超过50字符")
@ApiModelProperty("项目名称")
@@ -88,30 +94,12 @@ public class ProjectReq implements Serializable {
@ApiModelProperty("施工组长id")
private String constructionTeamLeaderId;
- @ApiModelProperty(value = "技术方案图片", notes = "多项英文逗号隔开")
- private String technicalImage;
-
- @ApiModelProperty("技术方案内容")
- private String technicalContent;
-
- @ApiModelProperty(value = "安全措施图片", notes = "多项英文逗号隔开")
- private String safetyImage;
-
- @ApiModelProperty("安全措施内容")
- private String safetyContent;
-
- @ApiModelProperty("交底内容")
- private String discloseContent;
-
@ApiModelProperty("状态:0待施工,1施工中,2已完工,3已审核,4已验收")
private int status;
- @ApiModelProperty(value = "项目工作类型", notes = "多项英文逗号隔开")
- private String workType;
+ @ApiModelProperty(value = "开始时间")
+ private LocalDate startDate;
- @ApiModelProperty(value = "项目工作岗位", notes = "多项英文逗号隔开,json对象保存")
- private String job;
-
- @ApiModelProperty(value = "项目安全风险点", notes = "多项英文逗号隔开")
- private String safetyRiskPoint;
+ @ApiModelProperty(value = "结束时间")
+ private LocalDate endDate;
}
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java
index 4d438cf..826a0f5 100644
--- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java
@@ -13,6 +13,7 @@ import com.dite.znpt.domain.entity.ProjectEntity;
import java.io.Serial;
import java.io.Serializable;
+import java.time.LocalDate;
/**
* @author huise23
@@ -26,10 +27,6 @@ public class ProjectResp extends ProjectReq implements Serializable {
@Serial
private static final long serialVersionUID = -1883901559600186726L;
- @ExcelProperty("项目id")
- @ApiModelProperty("项目id")
- private String projectId;
-
@ApiModelProperty("施工人员")
private String constructorName;
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupListReq.java
new file mode 100644
index 0000000..26d9076
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupListReq.java
@@ -0,0 +1,33 @@
+package com.dite.znpt.domain.vo;
+
+import java.time.LocalDateTime;
+import java.io.Serial;
+import java.io.Serializable;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author huise23
+ * @date 2025/06/24 17:06
+ * @Description: 项目任务组信息请求实体
+ */
+@Data
+@ApiModel("项目任务组信息列表请求实体")
+public class ProjectTaskGroupListReq implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = -99072074587210624L;
+
+ @ApiModelProperty("项目任务组信息Id")
+ private String groupId;
+
+ @ApiModelProperty("项目任务组名")
+ private String groupName;
+
+ @ApiModelProperty("任务名称/负责人")
+ private String keyword;
+
+}
+
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupReq.java
new file mode 100644
index 0000000..6d91415
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupReq.java
@@ -0,0 +1,38 @@
+package com.dite.znpt.domain.vo;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.dite.znpt.util.ValidationGroup;
+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.Size;
+
+/**
+ * @author huise23
+ * @date 2025/06/25 17:18
+ * @Description: 项目任务组信息表请求类
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("project_task_group")
+@ApiModel(value="ProjectTaskGroup请求对象", description="项目任务组信息表")
+public class ProjectTaskGroupReq implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = -57817993612481804L;
+
+ @ApiModelProperty("id")
+ private String groupId;
+
+ @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "项目任务组名不能为空")
+ @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 100, message = "项目任务组名长度不能超过100字符")
+ @ApiModelProperty("项目任务组名")
+ private String groupName;
+}
+
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupResp.java
new file mode 100644
index 0000000..14027da
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupResp.java
@@ -0,0 +1,25 @@
+package com.dite.znpt.domain.vo;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.dite.znpt.domain.entity.ProjectTaskGroupEntity;
+
+/**
+ * @author huise23
+ * @date 2025/06/24 16:44
+ * @Description: 项目任务组信息响应实体
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("项目任务组信息响应实体")
+public class ProjectTaskGroupResp extends ProjectTaskGroupEntity {
+
+ @ApiModelProperty("任务列表")
+ private List taskList;
+}
+
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskImportReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskImportReq.java
new file mode 100644
index 0000000..c2b6103
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskImportReq.java
@@ -0,0 +1,71 @@
+package com.dite.znpt.domain.vo;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+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;
+/**
+ * @author huise23
+ * @date 2025/06/27 14:21
+ * @Description: 项目任务信息表导入请求类
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="ProjectTask导入请求对象", description="项目任务信息表")
+public class ProjectTaskImportReq implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = -86440098932860558L;
+
+
+ @ExcelProperty(value = "上级任务名称")
+ private String parentTaskName;
+
+ @ExcelProperty(value = "任务组名称(不能为空,长度32以内)")
+ private String taskGroupName;
+
+ @ExcelProperty(value = "项目任务名称(不能为空,长度100以内)")
+ private String taskName;
+
+ @ExcelProperty(value = "项目任务编号(不能为空,长度100以内)")
+ private String taskCode;
+
+ @ExcelProperty(value = "任务负责人名称(不能为空,长度100以内)")
+ private String mainUserName;
+
+ @ExcelProperty(value = "任务参与人名称,逗号分隔")
+ private String userName;
+
+ @ExcelProperty(value = "计划开始时间(不能为空)")
+ private LocalDate planStartDate;
+
+ @ExcelProperty(value = "计划结束时间(不能为空)")
+ private LocalDate planEndDate;
+
+ @ExcelProperty(value = "实际开始时间")
+ private LocalDate actualStartDate;
+
+ @ExcelProperty(value = "实际结束时间")
+ private LocalDate actualEndDate;
+
+ @ExcelProperty(value = "任务状态,0未开始,1进行中,2已结束")
+ private Integer status;
+
+ @ExcelProperty(value = "是否逾期,默认未逾期")
+ private Integer overdueStatus;
+
+ @ExcelProperty(value = "备注")
+ private String remark;
+}
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskListReq.java
new file mode 100644
index 0000000..ecca3b6
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskListReq.java
@@ -0,0 +1,69 @@
+package com.dite.znpt.domain.vo;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.io.Serial;
+import java.io.Serializable;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author huise23
+ * @date 2025/06/25 17:31
+ * @Description: 项目任务信息请求实体
+ */
+@Data
+@ApiModel("项目任务信息列表请求实体")
+public class ProjectTaskListReq implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 971346092554199471L;
+
+ @ApiModelProperty("查询关键字")
+ private String keyword;
+
+ @ApiModelProperty("项目任务信息Id")
+ private String taskId;
+
+ @ApiModelProperty("任务组id")
+ private String taskGroupId;
+
+ @ApiModelProperty("项目任务名称")
+ private String taskName;
+
+ @ApiModelProperty("项目任务编号")
+ private String taskCode;
+
+ @ApiModelProperty("任务负责人id")
+ private String mainUserId;
+
+ @ApiModelProperty("任务参与人id,逗号分隔")
+ private String userIds;
+
+ @ApiModelProperty("计划开始时间")
+ private LocalDate planStartDate;
+
+ @ApiModelProperty("计划结束时间")
+ private LocalDate planEndDate;
+
+ @ApiModelProperty("实际开始时间")
+ private LocalDate actualStartDate;
+
+ @ApiModelProperty("实际结束时间")
+ private LocalDate actualEndDate;
+
+ @ApiModelProperty("任务状态,0未开始,1进行中,2已结束")
+ private Integer status;
+
+ @ApiModelProperty("是否逾期,默认未逾期")
+ private Integer overdueStatus;
+
+ @ApiModelProperty("任务名称/负责人名称")
+ private String taskNameOrMainUser;
+
+ @ApiModelProperty(value = "导出?", hidden = true)
+ private Boolean isExport;
+}
+
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskReq.java
new file mode 100644
index 0000000..14d6b97
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskReq.java
@@ -0,0 +1,84 @@
+package com.dite.znpt.domain.vo;
+
+import com.dite.znpt.util.ValidationGroup;
+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;
+import java.util.List;
+/**
+ * @author huise23
+ * @date 2025/06/25 21:48
+ * @Description: 项目任务信息表请求类
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="ProjectTask请求对象", description="项目任务信息表")
+public class ProjectTaskReq implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 899180318567127648L;
+
+ @ApiModelProperty("任务id")
+ private String taskId;
+
+ @ApiModelProperty("上级任务id")
+ private String parentTaskId;
+
+ @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "任务组id不能为空")
+ @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 32, message = "任务组id长度不能超过32字符")
+ @ApiModelProperty("任务组id")
+ private String taskGroupId;
+
+ @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "项目任务名称不能为空")
+ @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 100, message = "项目任务名称长度不能超过100字符")
+ @ApiModelProperty("项目任务名称")
+ private String taskName;
+
+ @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "项目任务编号不能为空")
+ @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 100, message = "项目任务编号长度不能超过100字符")
+ @ApiModelProperty("项目任务编号")
+ private String taskCode;
+
+ @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "任务负责人id不能为空")
+ @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 100, message = "任务负责人id长度不能超过100字符")
+ @ApiModelProperty("任务负责人id")
+ private String mainUserId;
+
+ @ApiModelProperty("任务参与人id,逗号分隔")
+ private String userIds;
+
+ @NotNull(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "计划开始时间不能为空")
+ @ApiModelProperty("计划开始时间")
+ private LocalDate planStartDate;
+
+ @NotNull(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "计划结束时间不能为空")
+ @ApiModelProperty("计划结束时间")
+ private LocalDate planEndDate;
+
+ @ApiModelProperty("实际开始时间")
+ private LocalDate actualStartDate;
+
+ @ApiModelProperty("实际结束时间")
+ private LocalDate actualEndDate;
+
+ @ApiModelProperty("任务状态,0未开始,1进行中,2已结束")
+ private Integer status;
+
+ @ApiModelProperty("是否逾期,默认未逾期")
+ private Integer overdueStatus;
+
+ @ApiModelProperty("附件列表")
+ private List attachFileIds;
+
+ @ApiModelProperty("备注")
+ private String remark;
+}
+
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskResp.java
new file mode 100644
index 0000000..605b3c6
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskResp.java
@@ -0,0 +1,27 @@
+package com.dite.znpt.domain.vo;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+
+import com.dite.znpt.domain.entity.AttachInfoEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.dite.znpt.domain.entity.ProjectTaskEntity;
+
+/**
+ * @author huise23
+ * @date 2025/06/25 21:48
+ * @Description: 项目任务信息响应实体
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("项目任务信息响应实体")
+public class ProjectTaskResp extends ProjectTaskEntity {
+
+ @ApiModelProperty("附件列表")
+ private List attachList;
+}
+
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskStartReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskStartReq.java
new file mode 100644
index 0000000..8642ffb
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskStartReq.java
@@ -0,0 +1,37 @@
+package com.dite.znpt.domain.vo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.dite.znpt.util.ValidationGroup;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import java.io.Serial;
+import java.io.Serializable;
+import java.time.LocalDate;
+
+/**
+ * @author huise23
+ * @date 2025/06/25 17:31
+ * @Description: 项目任务信息表请求类
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="ProjectTask开始/结束任务请求对象", description="项目任务信息表")
+public class ProjectTaskStartReq implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 862660085007390976L;
+
+ @ApiModelProperty("任务id")
+ private String taskId;
+
+ @ApiModelProperty("任务组id")
+ private String taskGroupId;
+}
+
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 6b7e3f7..894351e 100644
--- a/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java
+++ b/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java
@@ -14,6 +14,7 @@ public enum FilePathEnum {
IMAGE_TEMP("/static/image/temp/", "image-temp"),
VIDEO("/static/video/", "video"),
AUDIO("/static/audio/", "audio"),
+ ATTACH("/static/attach/", "attach"),
;
@Getter
diff --git a/core/src/main/java/com/dite/znpt/enums/ProjectTaskStateEnum.java b/core/src/main/java/com/dite/znpt/enums/ProjectTaskStateEnum.java
new file mode 100644
index 0000000..5ccebb9
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/enums/ProjectTaskStateEnum.java
@@ -0,0 +1,48 @@
+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: gaoxiong
+ * @Date: 2025/4/29 21:32
+ * @Description:
+ */
+@Getter
+@AllArgsConstructor
+public enum ProjectTaskStateEnum {
+ PENDING(0, "未开始"),
+ IN_PROGRESS(1, "进行中"),
+ COMPLETED(2, "已完工");
+
+ private final int code;
+ private final String desc;
+
+ public static ProjectTaskStateEnum getByCode(int code){
+ for (ProjectTaskStateEnum e : ProjectTaskStateEnum.values() ) {
+ if(e.code == code){
+ return e;
+ }
+ }
+ return null;
+ }
+
+ public static String getDescByCode(int code){
+ ProjectTaskStateEnum e = getByCode(code);
+ return null == e ? null : e.desc;
+ }
+
+ public static List listAll(){
+ List list = new ArrayList<>(ProjectTaskStateEnum.values().length);
+ for (ProjectTaskStateEnum e : ProjectTaskStateEnum.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/FileInfoMapper.java b/core/src/main/java/com/dite/znpt/mapper/FileInfoMapper.java
index a286ad5..11947b7 100644
--- a/core/src/main/java/com/dite/znpt/mapper/FileInfoMapper.java
+++ b/core/src/main/java/com/dite/znpt/mapper/FileInfoMapper.java
@@ -1,19 +1,13 @@
package com.dite.znpt.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.dite.znpt.domain.entity.FileInfoEntity;
-import com.dite.znpt.domain.vo.FileInfoListReq;
-import com.dite.znpt.domain.vo.FileInfoResp;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
+import com.dite.znpt.domain.entity.AttachInfoEntity;
/**
* @author huise23
* @date 2025/04/11 23:17
- * @Description: 文件信息表数据库访问层
+ * @Description: 附件信息表数据库访问层
*/
-public interface FileInfoMapper extends BaseMapper {
- List queryBySelective(FileInfoListReq fileInfoReq);
+public interface FileInfoMapper extends BaseMapper {
}
diff --git a/core/src/main/java/com/dite/znpt/mapper/ProjectTaskGroupMapper.java b/core/src/main/java/com/dite/znpt/mapper/ProjectTaskGroupMapper.java
new file mode 100644
index 0000000..21b78e0
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/mapper/ProjectTaskGroupMapper.java
@@ -0,0 +1,19 @@
+package com.dite.znpt.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dite.znpt.domain.entity.ProjectTaskGroupEntity;
+import com.dite.znpt.domain.vo.ProjectTaskGroupListReq;
+import com.dite.znpt.domain.vo.ProjectTaskGroupResp;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author huise23
+ * @date 2025/06/24 16:44
+ * @Description: 项目任务组信息表数据库访问层
+ */
+public interface ProjectTaskGroupMapper extends BaseMapper {
+ List queryBySelective(ProjectTaskGroupListReq projectTaskGroupReq);
+}
+
diff --git a/core/src/main/java/com/dite/znpt/mapper/ProjectTaskMapper.java b/core/src/main/java/com/dite/znpt/mapper/ProjectTaskMapper.java
new file mode 100644
index 0000000..afb1d09
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/mapper/ProjectTaskMapper.java
@@ -0,0 +1,21 @@
+package com.dite.znpt.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dite.znpt.domain.entity.ProjectTaskEntity;
+import com.dite.znpt.domain.vo.ProjectTaskListReq;
+import com.dite.znpt.domain.vo.ProjectTaskResp;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author huise23
+ * @date 2025/06/24 16:44
+ * @Description: 项目任务信息表数据库访问层
+ */
+public interface ProjectTaskMapper extends BaseMapper {
+ List queryBySelective(ProjectTaskListReq projectTaskReq);
+
+ List listAllParents(String taskId);
+}
+
diff --git a/core/src/main/java/com/dite/znpt/service/AttachInfoService.java b/core/src/main/java/com/dite/znpt/service/AttachInfoService.java
new file mode 100644
index 0000000..c24dd80
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/service/AttachInfoService.java
@@ -0,0 +1,50 @@
+package com.dite.znpt.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.dite.znpt.domain.entity.AttachInfoEntity;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * @author huise23
+ * @date 2025/04/11 23:17
+ * @Description: 附件信息表服务接口
+ */
+public interface AttachInfoService extends IService {
+
+ /**
+ * 功能描述:查询附件信息列表
+ *
+ * @return {@link List }<{@link AttachInfoEntity }>
+ * @author huise23
+ * @date 2025/04/11 23:17
+ **/
+ List listByBusinessIds(List businessIds, String businessType);
+
+ /**
+ * 功能描述:新增附件信息
+ *
+ * @param businessType 业务类型
+ * @author huise23
+ * @date 2025/04/11 23:17
+ **/
+ List saveData(String businessType, MultipartFile[] files);
+
+ /**
+ * 功能描述:删除附件信息
+ *
+ * @author huise23
+ * @date 2025/04/11 23:17
+ **/
+ void deleteByBusinessIds(List businessIds, String businessType);
+
+ /**
+ * 功能描述:更新附件关联的业务id
+ *
+ * @author huise23
+ * @date 2025/04/11 23:17
+ **/
+ void updateBusinessIdByAttachIds(String businessId, List attachIds);
+}
+
diff --git a/core/src/main/java/com/dite/znpt/service/FileInfoService.java b/core/src/main/java/com/dite/znpt/service/FileInfoService.java
deleted file mode 100644
index 469bc27..0000000
--- a/core/src/main/java/com/dite/znpt/service/FileInfoService.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package com.dite.znpt.service;
-
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.dite.znpt.domain.entity.FileInfoEntity;
-import com.dite.znpt.domain.vo.FileInfoListReq;
-import com.dite.znpt.domain.vo.FileInfoResp;
-
-import java.util.List;
-
-/**
- * @author huise23
- * @date 2025/04/11 23:17
- * @Description: 文件信息表服务接口
- */
-public interface FileInfoService extends IService {
-
- /**
- * 功能描述:查询文件信息列表
- *
- * @param fileInfoReq 文件信息
- * @return {@link List }<{@link FileInfoEntity }>
- * @author huise23
- * @date 2025/04/11 23:17
- **/
- List selectList(FileInfoListReq fileInfoReq);
-
- /**
- * 功能描述:查询单条文件信息
- *
- * @param fileId 文件信息Id
- * @return {@link FileInfoResp }
- * @author huise23
- * @date 2025/04/11 23:17
- **/
- FileInfoResp selectById(Long fileId);
-
- /**
- * 功能描述:新增文件信息
- *
- * @param fileInfo 文件信息
- * @author huise23
- * @date 2025/04/11 23:17
- **/
- void saveData(FileInfoEntity fileInfo);
-
- /**
- * 功能描述:更新文件信息
- *
- * @param fileInfo 文件信息
- * @author huise23
- * @date 2025/04/11 23:17
- **/
- void updateData(FileInfoEntity fileInfo);
-
- /**
- * 功能描述:删除文件信息
- *
- * @param fileId 文件信息Id
- * @author huise23
- * @date 2025/04/11 23:17
- **/
- void deleteById(Long fileId);
-}
-
diff --git a/core/src/main/java/com/dite/znpt/service/ProjectTaskGroupService.java b/core/src/main/java/com/dite/znpt/service/ProjectTaskGroupService.java
new file mode 100644
index 0000000..dd7bd2d
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/service/ProjectTaskGroupService.java
@@ -0,0 +1,55 @@
+package com.dite.znpt.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.dite.znpt.domain.entity.ProjectTaskGroupEntity;
+import com.dite.znpt.domain.vo.ProjectTaskGroupListReq;
+import com.dite.znpt.domain.vo.ProjectTaskGroupResp;
+import com.dite.znpt.domain.vo.ProjectTaskGroupReq;
+
+import java.util.List;
+
+/**
+ * @author huise23
+ * @date 2025/06/25 17:21
+ * @Description: 项目任务组信息表服务接口
+ */
+public interface ProjectTaskGroupService extends IService {
+
+ /**
+ * 功能描述:查询项目任务组信息列表
+ *
+ * @param projectTaskGroupReq 项目任务组信息
+ * @return {@link List }<{@link ProjectTaskGroupResp }>
+ * @author huise23
+ * @date 2025/06/25 17:21
+ **/
+ List selectList(ProjectTaskGroupListReq projectTaskGroupReq);
+
+ /**
+ * 功能描述:新增项目任务组信息
+ *
+ * @param projectTaskGroupReq 项目任务组信息
+ * @author huise23
+ * @date 2025/06/25 17:21
+ **/
+ void saveData(ProjectTaskGroupReq projectTaskGroupReq);
+
+ /**
+ * 功能描述:更新项目任务组信息
+ *
+ * @param projectTaskGroupReq 项目任务组信息
+ * @author huise23
+ * @date 2025/06/25 17:21
+ **/
+ void updateData(ProjectTaskGroupReq projectTaskGroupReq);
+
+ /**
+ * 功能描述:删除项目任务组信息
+ *
+ * @param groupId 项目任务组信息Id
+ * @author huise23
+ * @date 2025/06/25 17:21
+ **/
+ void deleteById(String groupId);
+}
+
diff --git a/core/src/main/java/com/dite/znpt/service/ProjectTaskService.java b/core/src/main/java/com/dite/znpt/service/ProjectTaskService.java
new file mode 100644
index 0000000..a142201
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/service/ProjectTaskService.java
@@ -0,0 +1,93 @@
+package com.dite.znpt.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.dite.znpt.domain.entity.ProjectTaskEntity;
+import com.dite.znpt.domain.vo.ProjectTaskListReq;
+import com.dite.znpt.domain.vo.ProjectTaskResp;
+import com.dite.znpt.domain.vo.ProjectTaskReq;
+import com.dite.znpt.domain.vo.ProjectTaskStartReq;
+
+import java.util.List;
+
+/**
+ * @author huise23
+ * @date 2025/06/25 17:21
+ * @Description: 项目任务信息表服务接口
+ */
+public interface ProjectTaskService extends IService {
+
+ /**
+ * 功能描述:查询项目任务信息列表
+ *
+ * @param projectTaskReq 项目任务信息
+ * @return {@link List }<{@link ProjectTaskResp }>
+ * @author huise23
+ * @date 2025/06/25 17:21
+ **/
+ List selectList(ProjectTaskListReq projectTaskReq);
+
+ /**
+ * 功能描述:查询单条项目任务信息
+ *
+ * @param taskId 项目任务信息Id
+ * @return {@link ProjectTaskResp }
+ * @author huise23
+ * @date 2025/06/25 17:21
+ **/
+ ProjectTaskResp selectById(String taskId);
+
+ /**
+ * 功能描述:新增项目任务信息
+ *
+ * @param projectTaskReq 项目任务信息
+ * @author huise23
+ * @date 2025/06/25 17:21
+ **/
+ void saveData(ProjectTaskReq projectTaskReq);
+
+ /**
+ * 功能描述:更新项目任务信息
+ *
+ * @param projectTaskReq 项目任务信息
+ * @author huise23
+ * @date 2025/06/25 17:21
+ **/
+ void updateData(ProjectTaskReq projectTaskReq);
+
+ /**
+ * 功能描述:删除项目任务信息
+ *
+ * @param taskId 项目任务信息Id
+ * @author huise23
+ * @date 2025/06/25 17:21
+ **/
+ void deleteById(String taskId);
+
+ /**
+ * 功能描述:删除项目任务信息
+ *
+ * @param groupId 项目任务组信息Id
+ * @author huise23
+ * @date 2025/06/25 17:21
+ **/
+ void deleteByGroupId(String groupId);
+
+ /**
+ * 功能描述:开始任务/任务组开始任务
+ *
+ * @param taskStartReq 任务启动请求类
+ * @author cuizhibin
+ * @date 2025/06/25 21:16
+ **/
+ void startTask(ProjectTaskStartReq taskStartReq);
+
+ /**
+ * 功能描述:结束任务/任务组结束任务
+ *
+ * @param taskStartReq 任务启动请求类
+ * @author cuizhibin
+ * @date 2025/06/25 21:16
+ **/
+ void endTask(ProjectTaskStartReq taskStartReq);
+}
+
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
new file mode 100644
index 0000000..9b1db77
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java
@@ -0,0 +1,105 @@
+package com.dite.znpt.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dite.znpt.domain.entity.AttachInfoEntity;
+import com.dite.znpt.enums.FilePathEnum;
+import com.dite.znpt.service.AttachInfoService;
+import com.dite.znpt.mapper.FileInfoMapper;
+import org.springframework.stereotype.Service;
+import lombok.RequiredArgsConstructor;
+import com.dite.znpt.util.PageUtil;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author huise23
+ * @date 2025/04/11 23:17
+ * @Description: 附件信息表服务实现类
+ */
+@Service
+@RequiredArgsConstructor
+public class AttachInfoServiceImpl extends ServiceImpl implements AttachInfoService {
+
+ /**
+ * 功能描述:查询附件信息列表
+ *
+ * @param businessIds 业务ids
+ * @param businessType 业务类型
+ * @return {@link List }<{@link AttachInfoEntity }>
+ * @author huise23
+ * @date 2025/04/11 23:17
+ **/
+ @Override
+ public List listByBusinessIds(List businessIds, String businessType) {
+ return lambdaQuery().in(AttachInfoEntity::getBusinessId, businessIds)
+ .eq(StrUtil.isNotEmpty(businessType), AttachInfoEntity::getBusinessType, businessType)
+ .list();
+ }
+
+ /**
+ * 功能描述:保存数据
+ *
+ * @param businessType 业务类型
+ * @return {@link AttachInfoEntity }
+ * @author cuizhibin
+ * @date 2025/06/26 08:53
+ **/
+ @Override
+ public List saveData(String businessType, MultipartFile[] files) {
+ String temPathPrefix = FilePathEnum.ATTACH.getFileAbsolutePath().concat(DateUtil.today()).concat(FileUtil.FILE_SEPARATOR);
+ if (!FileUtil.exist(temPathPrefix)) {
+ FileUtil.mkdir(temPathPrefix);
+ }
+ List list = new ArrayList<>();
+ for (MultipartFile file : files) {
+ if (!file.isEmpty()) {
+ try {
+ String path = temPathPrefix + file.getOriginalFilename();
+ FileUtil.writeBytes(file.getBytes(),path);
+ list.add(AttachInfoEntity.builder().businessType(businessType).attachPath(path).build());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ baseMapper.insert(list);
+ return list.stream().map(AttachInfoEntity::getAttachId).collect(Collectors.toList());
+ }
+
+ /**
+ * 功能描述:删除附件信息
+ *
+ * @param businessIds 业务id
+ * @param businessType 业务类型
+ * @author huise23
+ * @date 2025/04/11 23:17
+ **/
+ @Override
+ public void deleteByBusinessIds(List businessIds, String businessType) {
+ lambdaUpdate().in(AttachInfoEntity::getBusinessId, businessIds)
+ .eq(StrUtil.isNotEmpty(businessType), AttachInfoEntity::getBusinessType, businessType).remove();
+ }
+
+ /**
+ * 功能描述:更新附件关联的业务id
+ *
+ * @param businessId
+ * @param attachIds
+ * @author huise23
+ * @date 2025/04/11 23:17
+ */
+ @Override
+ public void updateBusinessIdByAttachIds(String businessId, List attachIds) {
+ if (CollUtil.isEmpty(attachIds)) {
+ return;
+ }
+ lambdaUpdate().in(AttachInfoEntity::getAttachId, attachIds).set(AttachInfoEntity::getBusinessId, businessId).update();
+ }
+}
diff --git a/core/src/main/java/com/dite/znpt/service/impl/FileInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/FileInfoServiceImpl.java
deleted file mode 100644
index 975b43f..0000000
--- a/core/src/main/java/com/dite/znpt/service/impl/FileInfoServiceImpl.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package com.dite.znpt.service.impl;
-
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.dite.znpt.domain.entity.FileInfoEntity;
-import com.dite.znpt.domain.vo.FileInfoListReq;
-import com.dite.znpt.domain.vo.FileInfoResp;
-import com.dite.znpt.service.FileInfoService;
-import com.dite.znpt.mapper.FileInfoMapper;
-import org.springframework.stereotype.Service;
-import cn.hutool.core.collection.CollUtil;
-import lombok.RequiredArgsConstructor;
-import com.dite.znpt.util.PageUtil;
-
-import java.util.List;
-
-/**
- * @author huise23
- * @date 2025/04/11 23:17
- * @Description: 文件信息表服务实现类
- */
-@Service
-@RequiredArgsConstructor
-public class FileInfoServiceImpl extends ServiceImpl implements FileInfoService {
-
- /**
- * 功能描述:查询文件信息列表
- *
- * @param fileInfoReq 文件信息信息
- * @return {@link List }<{@link FileInfoResp }>
- * @author huise23
- * @date 2025/04/11 23:17
- **/
- @Override
- public List selectList(FileInfoListReq fileInfoReq) {
- PageUtil.startPage();
- List fileInfoList= this.baseMapper.queryBySelective(fileInfoReq);
- fileInfoList.forEach(resp -> {
-
- });
- return fileInfoList;
- }
-
- /**
- * 功能描述:查询单条文件信息
- *
- * @param fileId 文件信息Id
- * @return {@link FileInfoResp }
- * @author huise23
- * @date 2025/04/11 23:17
- **/
- @Override
- public FileInfoResp selectById(Long fileId) {
- FileInfoListReq fileInfoReq = new FileInfoListReq();
- fileInfoReq.setFileId(fileId);
-
- List list = selectList(fileInfoReq);
- return CollUtil.isNotEmpty(list) ? CollUtil.getFirst(list) : new FileInfoResp();
- }
-
- /**
- * 功能描述:新增文件信息
- *
- * @param fileInfo 文件信息
- * @author huise23
- * @date 2025/04/11 23:17
- **/
- @Override
- public void saveData(FileInfoEntity fileInfo) {
-// todo 校验
- save(fileInfo);
- }
-
- /**
- * 功能描述:更新文件信息
- *
- * @param fileInfo 文件信息
- * @author huise23
- * @date 2025/04/11 23:17
- **/
- @Override
- public void updateData(FileInfoEntity fileInfo) {
-// todo 校验
- updateById(fileInfo);
- }
-
- /**
- * 功能描述:删除文件信息
- *
- * @param fileId 文件信息Id
- * @author huise23
- * @date 2025/04/11 23:17
- **/
- @Override
- public void deleteById(Long fileId) {
-// todo 校验
- removeById(fileId);
- }
-
-}
diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskGroupServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskGroupServiceImpl.java
new file mode 100644
index 0000000..516a9e3
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskGroupServiceImpl.java
@@ -0,0 +1,95 @@
+package com.dite.znpt.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dite.znpt.domain.entity.ProjectTaskGroupEntity;
+import com.dite.znpt.domain.vo.*;
+import com.dite.znpt.service.ProjectTaskGroupService;
+import com.dite.znpt.mapper.ProjectTaskGroupMapper;
+import com.dite.znpt.service.ProjectTaskService;
+import org.springframework.stereotype.Service;
+import cn.hutool.core.collection.CollUtil;
+import lombok.RequiredArgsConstructor;
+import com.dite.znpt.util.PageUtil;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @author huise23
+ * @date 2025/06/25 17:21
+ * @Description: 项目任务组信息表服务实现类
+ */
+@Service
+@RequiredArgsConstructor
+public class ProjectTaskGroupServiceImpl extends ServiceImpl implements ProjectTaskGroupService {
+
+ private final ProjectTaskService projectTaskService;
+
+ /**
+ * 功能描述:查询项目任务组信息列表
+ *
+ * @param projectTaskGroupReq 项目任务组信息信息
+ * @return {@link List }<{@link ProjectTaskGroupResp }>
+ * @author huise23
+ * @date 2025/06/25 17:21
+ **/
+ @Override
+ public List selectList(ProjectTaskGroupListReq projectTaskGroupReq) {
+ PageUtil.startPage();
+ List projectTaskGroupList= this.baseMapper.queryBySelective(projectTaskGroupReq);
+ ProjectTaskListReq listReq = new ProjectTaskListReq();
+ listReq.setTaskNameOrMainUser(projectTaskGroupReq.getKeyword());
+ Map> taskMap = projectTaskService.selectList(listReq).stream().collect(Collectors.groupingBy(ProjectTaskResp::getTaskGroupId));
+ projectTaskGroupList.forEach(resp -> {
+ resp.setTaskList(taskMap.get(resp.getGroupId()));
+ });
+ return projectTaskGroupList;
+ }
+
+ /**
+ * 功能描述:新增项目任务组信息
+ *
+ * @param projectTaskGroupReq 项目任务组信息
+ * @author huise23
+ * @date 2025/06/25 17:21
+ **/
+ @Override
+ public void saveData(ProjectTaskGroupReq projectTaskGroupReq) {
+// todo 校验
+ ProjectTaskGroupEntity entity = BeanUtil.copyProperties(projectTaskGroupReq, ProjectTaskGroupEntity.class);
+ save(entity);
+ }
+
+ /**
+ * 功能描述:更新项目任务组信息
+ *
+ * @param projectTaskGroupReq 项目任务组信息
+ * @author huise23
+ * @date 2025/06/25 17:21
+ **/
+ @Override
+ public void updateData(ProjectTaskGroupReq projectTaskGroupReq) {
+// todo 校验
+ ProjectTaskGroupEntity entity = BeanUtil.copyProperties(projectTaskGroupReq, ProjectTaskGroupEntity.class);
+ updateById(entity);
+ }
+
+ /**
+ * 功能描述:删除项目任务组信息
+ *
+ * @param groupId 项目任务组信息Id
+ * @author huise23
+ * @date 2025/06/25 17:21
+ **/
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void deleteById(String groupId) {
+// todo 校验
+ removeById(groupId);
+ projectTaskService.deleteByGroupId(groupId);
+ }
+
+}
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
new file mode 100644
index 0000000..b5c31a9
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java
@@ -0,0 +1,265 @@
+package com.dite.znpt.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.text.StrBuilder;
+import cn.hutool.core.util.BooleanUtil;
+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.AttachInfoEntity;
+import com.dite.znpt.domain.entity.ProjectTaskEntity;
+import com.dite.znpt.domain.vo.ProjectTaskListReq;
+import com.dite.znpt.domain.vo.ProjectTaskResp;
+import com.dite.znpt.domain.vo.ProjectTaskReq;
+import com.dite.znpt.domain.vo.ProjectTaskStartReq;
+import com.dite.znpt.enums.ProjectTaskStateEnum;
+import com.dite.znpt.exception.ServiceException;
+import com.dite.znpt.mapper.ProjectTaskGroupMapper;
+import com.dite.znpt.service.AttachInfoService;
+import com.dite.znpt.service.ProjectTaskService;
+import com.dite.znpt.mapper.ProjectTaskMapper;
+import org.springframework.stereotype.Service;
+import cn.hutool.core.collection.CollUtil;
+import lombok.RequiredArgsConstructor;
+import com.dite.znpt.util.PageUtil;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDate;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * @author huise23
+ * @date 2025/06/25 17:21
+ * @Description: 项目任务信息表服务实现类
+ */
+@Service
+@RequiredArgsConstructor
+public class ProjectTaskServiceImpl extends ServiceImpl implements ProjectTaskService {
+
+ private final AttachInfoService attachInfoService;
+ private final ProjectTaskGroupMapper projectTaskGroupMapper;
+
+ /**
+ * 功能描述:查询项目任务信息列表
+ *
+ * @param projectTaskReq 项目任务信息信息
+ * @return {@link List }<{@link ProjectTaskResp }>
+ * @author huise23
+ * @date 2025/06/25 17:21
+ **/
+ @Override
+ public List selectList(ProjectTaskListReq projectTaskReq) {
+ PageUtil.startPage();
+ List projectTaskList = this.baseMapper.queryBySelective(projectTaskReq);
+ Map> attachMap;
+ if (!BooleanUtil.isTrue(projectTaskReq.getIsExport())) {
+ attachMap = attachInfoService.listByBusinessIds(projectTaskList.stream().map(ProjectTaskResp::getTaskId).collect(Collectors.toList()), null)
+ .stream().collect(Collectors.groupingBy(AttachInfoEntity::getBusinessId));
+ } else {
+ attachMap = new HashMap<>();
+ }
+ projectTaskList.forEach(resp -> {
+ resp.setAttachList(attachMap.get(resp.getTaskId()));
+ });
+ return projectTaskList;
+ }
+
+ /**
+ * 功能描述:查询单条项目任务信息
+ *
+ * @param taskId 项目任务信息Id
+ * @return {@link ProjectTaskResp }
+ * @author huise23
+ * @date 2025/06/25 17:21
+ **/
+ @Override
+ public ProjectTaskResp selectById(String taskId) {
+ ProjectTaskListReq projectTaskReq = new ProjectTaskListReq();
+ projectTaskReq.setTaskId(taskId);
+
+ List list = selectList(projectTaskReq);
+ return list.isEmpty() ? CollUtil.getFirst(list) : new ProjectTaskResp();
+ }
+
+ /**
+ * 功能描述:新增项目任务信息
+ *
+ * @param projectTaskReq 项目任务信息
+ * @author huise23
+ * @date 2025/06/25 17:21
+ **/
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void saveData(ProjectTaskReq projectTaskReq) {
+ ProjectTaskEntity entity = BeanUtil.copyProperties(projectTaskReq, ProjectTaskEntity.class);
+ checkTask(projectTaskReq);
+ save(entity);
+ attachInfoService.updateBusinessIdByAttachIds(entity.getTaskId(), projectTaskReq.getAttachFileIds());
+ }
+
+ /**
+ * 功能描述:更新项目任务信息
+ *
+ * @param projectTaskReq 项目任务信息
+ * @author huise23
+ * @date 2025/06/25 17:21
+ **/
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void updateData(ProjectTaskReq projectTaskReq) {
+ ProjectTaskEntity entity = BeanUtil.copyProperties(projectTaskReq, ProjectTaskEntity.class);
+ checkTask(projectTaskReq);
+ updateById(entity);
+ attachInfoService.updateBusinessIdByAttachIds(projectTaskReq.getTaskId(), projectTaskReq.getAttachFileIds());
+ }
+
+ /**
+ * 功能描述:检查任务
+ *
+ * @param taskReq 任务请求类
+ * @author cuizhibin
+ * @date 2025/06/27 10:53
+ **/
+ private void checkTask(ProjectTaskReq taskReq) {
+ if (Objects.isNull(projectTaskGroupMapper.selectById(taskReq.getTaskGroupId()))) {
+ throw new ServiceException(Message.TASK_GROUP_ID_NOT_EXIST);
+ }
+ if (StrUtil.isEmpty(taskReq.getParentTaskId())) {
+ return;
+ }
+ Map taskMap = baseMapper.listAllParents(taskReq.getParentTaskId()).stream().collect(Collectors.toMap(ProjectTaskEntity::getTaskId, Function.identity()));
+// 判断是否有循环父级
+ if (StrUtil.isNotEmpty(taskReq.getTaskId())) {
+ if (taskMap.containsKey(taskReq.getTaskId())) {
+ String parentTaskId = taskReq.getParentTaskId();
+ List strList = ListUtil.toList(taskReq.getTaskName());
+ do {
+ ProjectTaskEntity task = taskMap.get(parentTaskId);
+ parentTaskId = task.getParentTaskId();
+ if (StrUtil.isEmpty(parentTaskId)) {
+ break;
+ }
+ strList.add(task.getTaskName());
+ } while (StrUtil.isNotEmpty(parentTaskId));
+ throw new ServiceException(Message.TASK_IN_CYCLE + CollUtil.join(strList, "--"));
+ }
+ }
+// 更新父级任务的计划起始/结束时间
+ String parentTaskId = taskReq.getParentTaskId();
+ LocalDate planStartDate = taskReq.getPlanStartDate();
+ LocalDate planEndDate = taskReq.getPlanEndDate();
+ Set updateTaskSet = new HashSet<>();
+ do {
+ ProjectTaskEntity task = taskMap.get(parentTaskId);
+ parentTaskId = task.getParentTaskId();
+ if (task.getPlanStartDate().isAfter(planStartDate)) {
+ task.setPlanStartDate(planStartDate);
+ updateTaskSet.add(task);
+ } else {
+ planStartDate = task.getPlanStartDate();
+ }
+ if (task.getPlanEndDate().isBefore(planEndDate)) {
+ task.setPlanEndDate(planEndDate);
+ updateTaskSet.add(task);
+ } else {
+ planEndDate = task.getPlanEndDate();
+ }
+ } while (StrUtil.isNotEmpty(parentTaskId));
+ baseMapper.updateById(updateTaskSet);
+ }
+
+ /**
+ * 功能描述:删除项目任务信息
+ *
+ * @param taskId 项目任务信息Id
+ * @author huise23
+ * @date 2025/06/25 17:21
+ **/
+ @Override
+ public void deleteById(String taskId) {
+ removeById(taskId);
+ }
+
+ /**
+ * 功能描述:删除项目任务信息
+ *
+ * @param groupId 项目任务组信息Id
+ * @author huise23
+ * @date 2025/06/25 17:21
+ **/
+ @Override
+ public void deleteByGroupId(String groupId) {
+ lambdaUpdate().eq(ProjectTaskEntity::getTaskGroupId, groupId).remove();
+ }
+
+ /**
+ * 功能描述:开始任务/任务组开始任务
+ *
+ * @param taskStartReq 任务启动请求类
+ * @author cuizhibin
+ * @date 2025/06/25 21:16
+ **/
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void startTask(ProjectTaskStartReq taskStartReq) {
+ if (StrUtil.isBlank(taskStartReq.getTaskId()) && StrUtil.isBlank(taskStartReq.getTaskGroupId())) {
+ throw new ServiceException(Message.TASK_ID_GROUP_ID_ALL_EMPTY);
+ }
+ List list;
+ if (StrUtil.isNotBlank(taskStartReq.getTaskGroupId())) {
+ list = lambdaQuery().eq(ProjectTaskEntity::getTaskGroupId, taskStartReq.getTaskGroupId())
+ .eq(ProjectTaskEntity::getStatus, ProjectTaskStateEnum.PENDING.getCode())
+ .list();
+ if (CollUtil.isEmpty(list)) {
+ return;
+ }
+ } else {
+ list = List.of(getById(taskStartReq.getTaskId()));
+ if (!list.get(0).getStatus().equals(ProjectTaskStateEnum.PENDING.getCode())) {
+ throw new ServiceException(Message.TASK_STATUS_NOT_PENDING);
+ }
+ }
+ list.forEach(entity -> {
+ entity.setStatus(ProjectTaskStateEnum.IN_PROGRESS.getCode());
+ entity.setActualStartDate(LocalDate.now());
+ });
+ baseMapper.updateById(list);
+ }
+
+ /**
+ * 功能描述:结束任务/任务组结束任务
+ *
+ * @param taskStartReq 任务启动请求类
+ * @author cuizhibin
+ * @date 2025/06/25 21:16
+ **/
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void endTask(ProjectTaskStartReq taskStartReq) {
+ if (StrUtil.isBlank(taskStartReq.getTaskId()) && StrUtil.isBlank(taskStartReq.getTaskGroupId())) {
+ throw new ServiceException(Message.TASK_ID_GROUP_ID_ALL_EMPTY);
+ }
+ List list;
+ if (StrUtil.isNotBlank(taskStartReq.getTaskGroupId())) {
+ list = lambdaQuery().eq(ProjectTaskEntity::getTaskGroupId, taskStartReq.getTaskGroupId())
+ .eq(ProjectTaskEntity::getStatus, ProjectTaskStateEnum.IN_PROGRESS.getCode())
+ .list();
+ if (CollUtil.isEmpty(list)) {
+ return;
+ }
+ } else {
+ list = List.of(getById(taskStartReq.getTaskId()));
+ if (!list.get(0).getStatus().equals(ProjectTaskStateEnum.IN_PROGRESS.getCode())) {
+ throw new ServiceException(Message.TASK_STATUS_NOT_IN_PROGRESS);
+ }
+ }
+ list.forEach(entity -> {
+ entity.setStatus(ProjectTaskStateEnum.COMPLETED.getCode());
+ entity.setActualStartDate(LocalDate.now());
+ });
+ baseMapper.updateById(list);
+ }
+}
diff --git a/core/src/main/resources/mapper/FileInfoMapper.xml b/core/src/main/resources/mapper/FileInfoMapper.xml
deleted file mode 100644
index 64585d3..0000000
--- a/core/src/main/resources/mapper/FileInfoMapper.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
- a.file_id, a.business_id, a.minio_path, a.business_type
-
-
-
-
-
diff --git a/core/src/main/resources/mapper/ProjectMapper.xml b/core/src/main/resources/mapper/ProjectMapper.xml
index 20c1dbb..181fd5a 100644
--- a/core/src/main/resources/mapper/ProjectMapper.xml
+++ b/core/src/main/resources/mapper/ProjectMapper.xml
@@ -5,7 +5,7 @@
SELECT
prj.project_id, prj.project_name, prj.farm_name, prj.status, prj.cover_url, prj.farm_address, prj.client, prj.client_contact, prj.client_phone, prj.inspection_unit,
prj.inspection_contact, prj.inspection_phone, prj.scale, prj.turbine_model, prj.project_manager_id, pm.name AS project_manager_name, prj.constructor_ids,
- GROUP_CONCAT(DISTINCT con.name) AS constructor_name, prj.create_time
+ GROUP_CONCAT(DISTINCT con.name) AS constructor_name, prj.start_date, prj.end_date
FROM project prj
LEFT JOIN user pm ON pm.user_id = prj.project_manager_id
LEFT JOIN user con ON FIND_IN_SET(con.user_id,prj.constructor_ids) > 0 AND con.del_flag = '0'
@@ -25,13 +25,16 @@
AND prj.status = #{status}
-
- AND prj.create_time BETWEEN #{createDateBegin} AND #{createDateEnd}
+
+ and prj.start_date >= #{startDate}
+
+
+ and prj.end_date <= #{endDate}
GROUP BY prj.project_id, prj.project_name, prj.farm_name, prj.status, prj.cover_url, prj.farm_address, prj.client, prj.client_contact, prj.client_phone, prj.inspection_unit,
prj.inspection_contact, prj.inspection_phone, prj.scale, prj.turbine_model, prj.project_manager_id, pm.name, prj.constructor_ids,
- prj.create_time
+ prj.start_date, prj.end_date
diff --git a/core/src/main/resources/mapper/ProjectTaskGroupMapper.xml b/core/src/main/resources/mapper/ProjectTaskGroupMapper.xml
new file mode 100644
index 0000000..e47a1b9
--- /dev/null
+++ b/core/src/main/resources/mapper/ProjectTaskGroupMapper.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+ a.group_id, a.group_name, a.update_by, a.create_time,
+ a.create_by, a.update_time
+
+
+
+
+
diff --git a/core/src/main/resources/mapper/ProjectTaskMapper.xml b/core/src/main/resources/mapper/ProjectTaskMapper.xml
new file mode 100644
index 0000000..a53848b
--- /dev/null
+++ b/core/src/main/resources/mapper/ProjectTaskMapper.xml
@@ -0,0 +1,77 @@
+
+
+
+
+
+ a.task_id, a.task_group_id, a.task_name, a.task_code,
+ a.main_user_id, a.user_ids, a.plan_start_date, a.plan_end_date,
+ a.actual_start_date, a.actual_end_date, a.status, a.overdue_status,
+ a.update_by, a.create_time, a.create_by, a.update_time
+
+
+
+
+
+
+
diff --git a/pom.xml b/pom.xml
index 0f34b69..fc41a56 100644
--- a/pom.xml
+++ b/pom.xml
@@ -31,7 +31,7 @@
cn.hutool
hutool-all
- 5.8.22
+ 5.8.24
diff --git a/web/src/main/java/com/dite/znpt/web/controller/AttachInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/AttachInfoController.java
new file mode 100644
index 0000000..bf01aa2
--- /dev/null
+++ b/web/src/main/java/com/dite/znpt/web/controller/AttachInfoController.java
@@ -0,0 +1,37 @@
+package com.dite.znpt.web.controller;
+
+import com.dite.znpt.service.AttachInfoService;
+import com.dite.znpt.domain.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author huise23
+ * @date 2025/04/11 23:17
+ */
+@Api(tags = "附件信息")
+@RestController
+@RequestMapping("/attach-info")
+public class AttachInfoController {
+ @Resource
+ private AttachInfoService attachInfoService;
+
+ @ApiOperation(value = "新增附件信息", httpMethod = "POST")
+ @PostMapping
+ public Result add(@RequestParam("businessType") String businessType, @RequestParam("file") MultipartFile file) {
+ return Result.ok(attachInfoService.saveData(businessType, new MultipartFile[]{file}).get(0));
+ }
+
+ @ApiOperation(value = "批量新增附件信息", httpMethod = "POST")
+ @PostMapping("/batch")
+ public Result> add(@RequestParam("businessType") String businessType, @RequestParam("files") MultipartFile[] files) {
+ return Result.ok(attachInfoService.saveData(businessType, files));
+ }
+
+}
+
diff --git a/web/src/main/java/com/dite/znpt/web/controller/FileInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/FileInfoController.java
deleted file mode 100644
index 68666a5..0000000
--- a/web/src/main/java/com/dite/znpt/web/controller/FileInfoController.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package com.dite.znpt.web.controller;
-
-
-import com.dite.znpt.constant.Constants;
-import com.dite.znpt.domain.vo.FileInfoListReq;
-import com.dite.znpt.domain.vo.FileInfoResp;
-import com.dite.znpt.domain.entity.FileInfoEntity;
-import com.dite.znpt.service.FileInfoService;
-import com.dite.znpt.domain.Result;
-import com.dite.znpt.domain.PageResult;
-import com.pig4cloud.plugin.excel.annotation.RequestExcel;
-import com.pig4cloud.plugin.excel.annotation.ResponseExcel;
-import com.pig4cloud.plugin.excel.vo.ErrorMessage;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.validation.BindingResult;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-import java.util.List;
-
-/**
- * @author huise23
- * @date 2025/04/11 23:17
- */
-@Api(tags = "文件信息")
-@RestController
-@RequestMapping("/file-info")
-public class FileInfoController {
- @Resource
- private FileInfoService fileInfoService;
-
- @ApiOperation(value = "获取文件信息列表", httpMethod = "GET")
- @GetMapping("/list")
- public PageResult list(FileInfoListReq fileInfoReq) {
- return PageResult.ok(fileInfoService.selectList(fileInfoReq));
- }
-
- @ApiOperation(value = "根据文件信息Id获取详细信息", httpMethod = "GET")
- @GetMapping("/{fileId}")
- public Result getInfo(@PathVariable Long fileId) {
- return Result.ok(fileInfoService.selectById(fileId));
- }
-
- @ApiOperation(value = "新增文件信息", httpMethod = "POST")
- @PostMapping
- public Result