Parcourir la source

fit:资料归纳基础代码

zzw il y a 1 mois
Parent
commit
ed86b54863
26 fichiers modifiés avec 1248 ajouts et 127 suppressions
  1. 2 1
      assistMg/src/main/java/com/hotent/constant/TaskStatusConstant.java
  2. 26 0
      assistMg/src/main/java/com/hotent/enterpriseDeclare/controller/CostAuditReviewController.java
  3. 57 0
      assistMg/src/main/java/com/hotent/enterpriseDeclare/controller/material/CostProjectTaskMaterialDetailController.java
  4. 128 0
      assistMg/src/main/java/com/hotent/enterpriseDeclare/controller/material/CostProjectTaskMaterialSummaryController.java
  5. 1 1
      assistMg/src/main/java/com/hotent/enterpriseDeclare/req/CostTaskPageReq.java
  6. 3 0
      assistMg/src/main/java/com/hotent/enterpriseDeclare/req/CostTaskReviewPageReq.java
  7. 16 1
      assistMg/src/main/java/com/hotent/project/controller/CostProjectConclusionController.java
  8. 4 8
      assistMg/src/main/java/com/hotent/project/controller/CostProjectDeliberateController.java
  9. 18 0
      assistMg/src/main/java/com/hotent/project/dao/CostProjectTaskMaterialDetailDao.java
  10. 18 0
      assistMg/src/main/java/com/hotent/project/dao/CostProjectTaskMaterialSummaryDao.java
  11. 5 0
      assistMg/src/main/java/com/hotent/project/manager/CostProjectConclusionManager.java
  12. 2 0
      assistMg/src/main/java/com/hotent/project/manager/CostProjectTaskManager.java
  13. 28 0
      assistMg/src/main/java/com/hotent/project/manager/CostProjectTaskMaterialDetailManager.java
  14. 56 0
      assistMg/src/main/java/com/hotent/project/manager/CostProjectTaskMaterialSummaryManager.java
  15. 10 5
      assistMg/src/main/java/com/hotent/project/manager/impl/CostProjectApprovalManagerImpl.java
  16. 12 0
      assistMg/src/main/java/com/hotent/project/manager/impl/CostProjectConclusionManagerImpl.java
  17. 2 5
      assistMg/src/main/java/com/hotent/project/manager/impl/CostProjectDeliberateManagerImpl.java
  18. 280 72
      assistMg/src/main/java/com/hotent/project/manager/impl/CostProjectTaskManagerImpl.java
  19. 46 0
      assistMg/src/main/java/com/hotent/project/manager/impl/CostProjectTaskMaterialDetailManagerImpl.java
  20. 255 0
      assistMg/src/main/java/com/hotent/project/manager/impl/CostProjectTaskMaterialSummaryManagerImpl.java
  21. 37 16
      assistMg/src/main/java/com/hotent/project/model/CostProjectConclusion.java
  22. 43 18
      assistMg/src/main/java/com/hotent/project/model/CostProjectDeliberate.java
  23. 5 0
      assistMg/src/main/java/com/hotent/project/model/CostProjectTask.java
  24. 111 0
      assistMg/src/main/java/com/hotent/project/model/CostProjectTaskMaterialDetail.java
  25. 80 0
      assistMg/src/main/java/com/hotent/project/model/CostProjectTaskMaterialSummary.java
  26. 3 0
      assistMg/src/main/java/com/hotent/project/req/CostProjectBasePageReq.java

+ 2 - 1
assistMg/src/main/java/com/hotent/constant/TaskStatusConstant.java

@@ -14,7 +14,8 @@ public enum TaskStatusConstant {
     FEEDBACKED("260", "已反馈", 3),
     SUSPENDED("300", "中止", 3),
     COMPLETED("400", "办结", 4),
-    NOT_PASSED("500", "不通过", 5);
+    NOT_PASSED("500", "不通过", 5),
+    BCCL("600", "补充材料", 6);
 
 
     private String statusCode;

+ 26 - 0
assistMg/src/main/java/com/hotent/enterpriseDeclare/controller/CostAuditReviewController.java

@@ -63,6 +63,32 @@ public class CostAuditReviewController {
         return CommonResult.<IPage<CostProjectTask>>ok().value(pageResult);
     }
 
+    /**
+     * 分页查询办结监审任务列表
+     *
+     * @param req 分页查询请求参数
+     * @return 分页查询办结监审任务列表
+     */
+    @PostMapping(value = "/completedPageList")
+    @ApiOperation(value = "分页查询办结监审任务列表", httpMethod = "POST", notes = "分页查询办结监审任务列表")
+    public CommonResult<IPage<CostProjectTask>> completedPageList(@RequestBody CostTaskReviewPageReq req) {
+        req.setCurrentNode(NodeConstant.guidang.getNodeKey());
+        IPage<CostProjectTask> pageResult = costProjectTaskManager.pageListForReviewTask(req);
+        return CommonResult.<IPage<CostProjectTask>>ok().value(pageResult);
+    }
+
+    /**
+     * 分页查询档案管理任务列表
+     *
+     * @param req 分页查询请求参数
+     * @return 档案管理任务分页列表
+     */
+    @PostMapping(value = "/archivePageList")
+    @ApiOperation(value = "分页查询档案管理任务列表", httpMethod = "POST", notes = "分页查询档案管理任务列表(只查询主任务,不查询子任务)")
+    public CommonResult<IPage<CostProjectTask>> archivePageList(@RequestBody CostTaskReviewPageReq req) {
+        IPage<CostProjectTask> pageResult = costProjectTaskManager.pageListForArchive(req);
+        return CommonResult.<IPage<CostProjectTask>>ok().value(pageResult);
+    }
 
 
     @PostMapping(value = "/getProcessBtn")

+ 57 - 0
assistMg/src/main/java/com/hotent/enterpriseDeclare/controller/material/CostProjectTaskMaterialDetailController.java

@@ -0,0 +1,57 @@
+package com.hotent.enterpriseDeclare.controller.material;
+
+import com.hotent.base.annotation.ApiGroup;
+import com.hotent.base.constants.ApiGroupConsts;
+import com.hotent.base.controller.BaseController;
+import com.hotent.base.model.CommonResult;
+import com.hotent.base.util.StringUtil;
+import com.hotent.project.manager.CostProjectTaskMaterialDetailManager;
+import com.hotent.project.model.CostProjectTaskMaterialDetail;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 资料归纳明细表 前端控制器
+ *
+ * @company 山西清众科技股份有限公司
+ * @author 超级管理员
+ * @since 2025-01-27
+ */
+@RestController
+@RequestMapping("/api/materialSummary/detail/v1/")
+@Api(tags = "资料归纳明细表")
+@ApiGroup(group = {ApiGroupConsts.GROUP_COST})
+public class CostProjectTaskMaterialDetailController extends BaseController<CostProjectTaskMaterialDetailManager, CostProjectTaskMaterialDetail> {
+
+    /**
+     * 根据id获取明细详情
+     * @param id 明细ID
+     * @return 明细详情
+     */
+    @GetMapping(value = "/getDetail")
+    @ApiOperation(value = "根据id获取明细详情", httpMethod = "GET", notes = "根据id获取明细详情")
+    public CommonResult<CostProjectTaskMaterialDetail> getDetail(
+            @ApiParam(name = "id", value = "明细ID", required = true)
+            @RequestParam(required = true) String id) {
+        return CommonResult.<CostProjectTaskMaterialDetail>ok().value(baseService.getDetail(id));
+    }
+
+    /**
+     * 删除明细
+     * @param id 明细ID
+     * @return
+     */
+    @DeleteMapping(value = "/delete")
+    @ApiOperation(value = "删除明细", httpMethod = "DELETE", notes = "删除明细(逻辑删除)")
+    @Transactional
+    public CommonResult<String> delete(
+            @ApiParam(name = "id", value = "明细ID", required = true)
+            @RequestParam(required = true) String id) {
+        baseService.deleteById(id);
+        return CommonResult.<String>ok().message("删除明细成功");
+    }
+}
+

+ 128 - 0
assistMg/src/main/java/com/hotent/enterpriseDeclare/controller/material/CostProjectTaskMaterialSummaryController.java

@@ -0,0 +1,128 @@
+package com.hotent.enterpriseDeclare.controller.material;
+
+import com.hotent.base.annotation.ApiGroup;
+import com.hotent.base.constants.ApiGroupConsts;
+import com.hotent.base.controller.BaseController;
+import com.hotent.base.model.CommonResult;
+import com.hotent.base.util.StringUtil;
+import com.hotent.project.manager.CostProjectTaskMaterialDetailManager;
+import com.hotent.project.manager.CostProjectTaskMaterialSummaryManager;
+import com.hotent.project.model.CostProjectTaskMaterialSummary;
+import com.hotent.project.req.MaterialSummarySortReq;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 资料归纳主表 前端控制器
+ *
+ * @company 山西清众科技股份有限公司
+ * @author 超级管理员
+ * @since 2025-01-27
+ */
+@RestController
+@RequestMapping("/api/materialSummary/v1/")
+@Api(tags = "资料归纳主表")
+@ApiGroup(group = {ApiGroupConsts.GROUP_COST})
+public class CostProjectTaskMaterialSummaryController extends BaseController<CostProjectTaskMaterialSummaryManager, CostProjectTaskMaterialSummary> {
+
+    @Autowired
+    private CostProjectTaskMaterialDetailManager costProjectTaskMaterialDetailManager;
+
+    /**
+     * 根据taskId获取资料归纳列表
+     * @param taskId 任务ID
+     * @return 资料归纳列表(包含明细)
+     */
+    @GetMapping(value = "/listByTaskId")
+    @ApiOperation(value = "根据taskId获取资料归纳列表", httpMethod = "GET", notes = "根据taskId获取资料归纳列表(包含明细)")
+    public CommonResult<List<CostProjectTaskMaterialSummary>> listByTaskId(
+            @ApiParam(name = "taskId", value = "任务ID", required = true)
+            @RequestParam(required = true) String taskId) {
+        return CommonResult.<List<CostProjectTaskMaterialSummary>>ok().value(baseService.listByTaskId(taskId));
+    }
+
+    /**
+     * 根据id获取资料归纳详情
+     * @param id 主表ID
+     * @return 资料归纳详情(包含明细)
+     */
+    @GetMapping(value = "/getDetail")
+    @ApiOperation(value = "根据id获取资料归纳详情", httpMethod = "GET", notes = "根据id获取资料归纳详情(包含明细)")
+    public CommonResult<CostProjectTaskMaterialSummary> getDetail(
+            @ApiParam(name = "id", value = "主表ID", required = true)
+            @RequestParam(required = true) String id) {
+        return CommonResult.<CostProjectTaskMaterialSummary>ok().value(baseService.getDetail(id));
+    }
+
+    /**
+     * 新增、更新资料归纳主表
+     * @param summary 资料归纳主表
+     * @return
+     */
+    @PostMapping(value = "/save")
+    @ApiOperation(value = "新增、更新资料归纳主表", httpMethod = "POST", notes = "新增、更新资料归纳主表")
+    @Transactional
+    public CommonResult<String> save(
+            @ApiParam(name = "summary", value = "资料归纳主表", required = true)
+            @RequestBody CostProjectTaskMaterialSummary summary) {
+        String msg = StringUtil.isEmpty(summary.getId()) ? "添加资料归纳成功" : "更新资料归纳成功";
+        baseService.createOrUpdate(summary);
+        return CommonResult.<String>ok().message(msg);
+    }
+
+    /**
+     * 批量保存资料归纳(主表+明细)
+     * @param summary 资料归纳主表(包含detailList)
+     * @return
+     */
+    @PostMapping(value = "/saveWithDetails")
+    @ApiOperation(value = "批量保存资料归纳(主表+明细)", httpMethod = "POST", notes = "批量保存资料归纳(主表+明细)")
+    @Transactional
+    public CommonResult<String> saveWithDetails(
+            @ApiParam(name = "summary", value = "资料归纳主表(包含detailList)", required = true)
+            @RequestBody CostProjectTaskMaterialSummary summary) {
+        String msg = StringUtil.isEmpty(summary.getId()) ? "保存资料归纳成功" : "更新资料归纳成功";
+        baseService.saveWithDetails(summary);
+        return CommonResult.<String>ok().message(msg);
+    }
+
+    /**
+     * 删除资料归纳(级联删除明细)
+     * @param id 主表ID
+     * @return
+     */
+    @DeleteMapping(value = "/delete")
+    @ApiOperation(value = "删除资料归纳", httpMethod = "DELETE", notes = "删除资料归纳(级联删除明细)")
+    @Transactional
+    public CommonResult<String> delete(
+            @ApiParam(name = "id", value = "主表ID", required = true)
+            @RequestParam(required = true) String id) {
+        baseService.deleteById(id);
+        return CommonResult.<String>ok().message("删除资料归纳成功");
+    }
+
+    /**
+     * 资料排序
+     * @param req 排序请求
+     * @return
+     */
+    @PostMapping(value = "/sort")
+    @ApiOperation(value = "资料排序", httpMethod = "POST", notes = "资料排序(上移/下移)")
+    @Transactional
+    public CommonResult<String> sort(
+            @ApiParam(name = "req", value = "排序请求", required = true)
+            @RequestBody MaterialSummarySortReq req) {
+        if (StringUtil.isEmpty(req.getId()) || StringUtil.isEmpty(req.getDirection())) {
+            return CommonResult.<String>error().message("ID和排序方向不能为空");
+        }
+        baseService.sort(req.getId(), req.getDirection());
+        return CommonResult.<String>ok().message("排序成功");
+    }
+}
+

+ 1 - 1
assistMg/src/main/java/com/hotent/enterpriseDeclare/req/CostTaskPageReq.java

@@ -13,7 +13,7 @@ public class CostTaskPageReq {
 
     private String processNodeKey;
 
-    @ApiModelProperty(value = "按钮操作key:1-补充材料、2-中止、3-退回上一步、4-退回、5-归档")
+    @ApiModelProperty(value = "按钮操作key:1-补充材料、2-中止、3-退回上一步、4-退回、5-归档、6-退回上一步、7-扭转下一步")
     private String key;
 
     @ApiModelProperty(value = "发送方式 1站内消息 2短信通知 “,”分割")

+ 3 - 0
assistMg/src/main/java/com/hotent/enterpriseDeclare/req/CostTaskReviewPageReq.java

@@ -20,5 +20,8 @@ public class CostTaskReviewPageReq extends PageReq {
     
     @ApiModelProperty(value = "当前节点")
     private String currentNode;
+    
+    @ApiModelProperty(value = "是否归档 0否1是")
+    private String isGd;
 }
 

+ 16 - 1
assistMg/src/main/java/com/hotent/project/controller/CostProjectConclusionController.java

@@ -1,8 +1,12 @@
 package com.hotent.project.controller;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.hotent.base.annotation.ApiGroup;
 import com.hotent.base.constants.ApiGroupConsts;
+import com.hotent.project.model.CostProjectDeliberate;
+import com.hotent.project.req.CostProjectBasePageReq;
 import io.swagger.annotations.Api;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -35,7 +39,7 @@ public class CostProjectConclusionController extends BaseController<CostProjectC
 	 * 根据id获取监审项目结论表数据详情
 	 * @param projectId 项目id
 	 * @return
-	 * @throws Exception 
+	 * @throws Exception
 	 * ModelAndView
 	 */
 	@GetMapping(value="/getDetail")
@@ -44,4 +48,15 @@ public class CostProjectConclusionController extends BaseController<CostProjectC
 		return CommonResult.<CostProjectConclusion>ok().value(baseService.getDetail(projectId));
 	}
 
+	@GetMapping(value="/getByTaskId")
+	@ApiOperation(value="根据项目id获取监审项目结论表数据详情",httpMethod = "GET",notes = "根据项目id获取监审项目结论表数据详情")
+	public CommonResult<CostProjectConclusion> getByTaskId(@ApiParam(name="taskId",value="taskId", required = true)@RequestParam(required=true) String taskId) throws Exception{
+		CostProjectConclusion conclusion = baseService.getOne(
+				new LambdaQueryWrapper<CostProjectConclusion>()
+						.eq(CostProjectConclusion::getTaskId, taskId)
+		);
+		return CommonResult.<CostProjectConclusion>ok().value(conclusion);
+	}
+
+
 }

+ 4 - 8
assistMg/src/main/java/com/hotent/project/controller/CostProjectDeliberateController.java

@@ -1,12 +1,10 @@
 package com.hotent.project.controller;
 
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.hotent.base.annotation.ApiGroup;
 import com.hotent.base.constants.ApiGroupConsts;
-import com.hotent.common.CrudService;
-import com.hotent.project.model.CostProjectMaterial;
 import com.hotent.project.req.CostProjectBasePageReq;
-import com.hotent.resp.PageResp;
 import io.swagger.annotations.Api;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -35,9 +33,6 @@ import com.hotent.project.manager.CostProjectDeliberateManager;
 @ApiGroup(group = {ApiGroupConsts.GROUP_COST})
 public class CostProjectDeliberateController extends BaseController<CostProjectDeliberateManager, CostProjectDeliberate> {
 
-	// 创建通用服务实例
-	private final CrudService crudService = new CrudService();
-
 	/**
 	 * 根据id获取监审项目集体审议表数据详情
 	 * @param id
@@ -57,8 +52,9 @@ public class CostProjectDeliberateController extends BaseController<CostProjectD
 	 */
 	@PostMapping(value="/pageList")
 	@ApiOperation(value="分页查询pageList",httpMethod = "POST",notes = "分页查询pageList")
-	public CommonResult<PageResp<CostProjectDeliberate>> pageList(@RequestBody CostProjectBasePageReq req) {
-		return CommonResult.<PageResp<CostProjectDeliberate>>ok().value(crudService.pageQuery(req, baseService::pageList));
+	public CommonResult<IPage<CostProjectDeliberate>> pageList(@RequestBody CostProjectBasePageReq req) {
+		IPage<CostProjectDeliberate> pageResult = baseService.pageList(req);
+		return CommonResult.<IPage<CostProjectDeliberate>>ok().value(pageResult);
 	}
 
 }

+ 18 - 0
assistMg/src/main/java/com/hotent/project/dao/CostProjectTaskMaterialDetailDao.java

@@ -0,0 +1,18 @@
+package com.hotent.project.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hotent.project.model.CostProjectTaskMaterialDetail;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 资料归纳明细表 数据访问层
+ *
+ * @company 山西清众科技股份有限公司
+ * @author 超级管理员
+ * @since 2025-01-27
+ */
+@Mapper
+public interface CostProjectTaskMaterialDetailDao extends BaseMapper<CostProjectTaskMaterialDetail> {
+
+}
+

+ 18 - 0
assistMg/src/main/java/com/hotent/project/dao/CostProjectTaskMaterialSummaryDao.java

@@ -0,0 +1,18 @@
+package com.hotent.project.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hotent.project.model.CostProjectTaskMaterialSummary;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 资料归纳主表 数据访问层
+ *
+ * @company 山西清众科技股份有限公司
+ * @author 超级管理员
+ * @since 2025-01-27
+ */
+@Mapper
+public interface CostProjectTaskMaterialSummaryDao extends BaseMapper<CostProjectTaskMaterialSummary> {
+
+}
+

+ 5 - 0
assistMg/src/main/java/com/hotent/project/manager/CostProjectConclusionManager.java

@@ -1,7 +1,10 @@
 package com.hotent.project.manager;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.hotent.project.model.CostProjectConclusion;
 import com.hotent.base.manager.BaseManager;
+import com.hotent.project.model.CostProjectDeliberate;
+import com.hotent.project.req.CostProjectBasePageReq;
 
 /**
  * 监审项目结论表 服务类
@@ -23,4 +26,6 @@ public interface CostProjectConclusionManager extends BaseManager<CostProjectCon
 	 * @return
 	 */
 	void createOrUpdate(CostProjectConclusion costProjectConclusion);
+
+	IPage<CostProjectConclusion> pageList(CostProjectBasePageReq req);
 }

+ 2 - 0
assistMg/src/main/java/com/hotent/project/manager/CostProjectTaskManager.java

@@ -24,6 +24,8 @@ public interface CostProjectTaskManager extends BaseManager<CostProjectTask> {
 
 	IPage<CostProjectTask> pageListForReviewTask(CostTaskReviewPageReq req);
 
+	IPage<CostProjectTask> pageListForArchive(CostTaskReviewPageReq req);
+
 	void createOrUpdate(CostProjectTask costProjectTask);
 
 	String saveTask(CostTaskPageReq costTaskPageReq);

+ 28 - 0
assistMg/src/main/java/com/hotent/project/manager/CostProjectTaskMaterialDetailManager.java

@@ -0,0 +1,28 @@
+package com.hotent.project.manager;
+
+import com.hotent.project.model.CostProjectTaskMaterialDetail;
+import com.hotent.base.manager.BaseManager;
+
+/**
+ * 资料归纳明细表 服务类
+ *
+ * @company 山西清众科技股份有限公司
+ * @author 超级管理员
+ * @since 2025-01-27
+ */
+public interface CostProjectTaskMaterialDetailManager extends BaseManager<CostProjectTaskMaterialDetail> {
+
+    /**
+     * 根据id查询明细详情
+     * @param id 明细ID
+     * @return 明细详情
+     */
+    CostProjectTaskMaterialDetail getDetail(String id);
+
+    /**
+     * 删除明细(逻辑删除)
+     * @param id 明细ID
+     */
+    void deleteById(String id);
+}
+

+ 56 - 0
assistMg/src/main/java/com/hotent/project/manager/CostProjectTaskMaterialSummaryManager.java

@@ -0,0 +1,56 @@
+package com.hotent.project.manager;
+
+import com.hotent.project.model.CostProjectTaskMaterialSummary;
+import com.hotent.base.manager.BaseManager;
+
+import java.util.List;
+
+/**
+ * 资料归纳主表 服务类
+ *
+ * @company 山西清众科技股份有限公司
+ * @author 超级管理员
+ * @since 2025-01-27
+ */
+public interface CostProjectTaskMaterialSummaryManager extends BaseManager<CostProjectTaskMaterialSummary> {
+
+    /**
+     * 根据taskId查询资料归纳列表(包含明细)
+     * @param taskId 任务ID
+     * @return 资料归纳列表
+     */
+    List<CostProjectTaskMaterialSummary> listByTaskId(String taskId);
+
+    /**
+     * 根据id查询资料归纳详情(包含明细)
+     * @param id 主表ID
+     * @return 资料归纳详情
+     */
+    CostProjectTaskMaterialSummary getDetail(String id);
+
+    /**
+     * 新建、更新资料归纳主表
+     * @param summary 资料归纳主表
+     */
+    void createOrUpdate(CostProjectTaskMaterialSummary summary);
+
+    /**
+     * 批量保存资料归纳(主表+明细)
+     * @param summary 资料归纳主表(包含detailList)
+     */
+    void saveWithDetails(CostProjectTaskMaterialSummary summary);
+
+    /**
+     * 删除资料归纳(级联删除明细)
+     * @param id 主表ID
+     */
+    void deleteById(String id);
+
+    /**
+     * 资料排序
+     * @param id 主表ID
+     * @param direction 排序方向:up-上移,down-下移
+     */
+    void sort(String id, String direction);
+}
+

+ 10 - 5
assistMg/src/main/java/com/hotent/project/manager/impl/CostProjectApprovalManagerImpl.java

@@ -228,7 +228,7 @@ public class CostProjectApprovalManagerImpl extends BaseManagerImpl<CostProjectA
         if (ObjectUtil.isNotEmpty(costProjectApproval.getOrgId())) {
             detailResp.setOrgName(orgManager.get(costProjectApproval.getOrgId()).getName());
         }
-        
+
         // 反查负责人名称
         if (ObjectUtil.isNotEmpty(costProjectApproval.getLeaderId())) {
             try {
@@ -240,7 +240,7 @@ public class CostProjectApprovalManagerImpl extends BaseManagerImpl<CostProjectA
                 // 记录异常但不影响主流程
             }
         }
-        
+
         // 反查项目组成员名称
         if (ObjectUtil.isNotEmpty(costProjectApproval.getProjectMembers())) {
             try {
@@ -265,12 +265,14 @@ public class CostProjectApprovalManagerImpl extends BaseManagerImpl<CostProjectA
                 // 记录异常但不影响主流程
             }
         }
-        
+
         CostProjectTaskProccess taskProccess = costProjectTaskProccessManager.getOne(
                 new QueryWrapper<CostProjectTaskProccess>().eq("project_id", costProjectApproval.getProjectId())
         );
-        detailResp.setPlannedAuditStartDate(taskProccess!=null?taskProccess.getPlannedAuditStartDate():null);
-        detailResp.setPlannedAuditEndDate(taskProccess!=null?taskProccess.getPlannedAuditEndDate():null);
+        if (taskProccess !=null ) {
+            detailResp.setPlannedAuditStartDate(taskProccess.getPlannedAuditStartDate());
+            detailResp.setPlannedAuditEndDate(taskProccess.getPlannedAuditEndDate());
+        }
         return detailResp;
 
     }
@@ -533,6 +535,9 @@ public class CostProjectApprovalManagerImpl extends BaseManagerImpl<CostProjectA
                         .eq(AuditedUnit::getAccount, currentUser.getUserId())
                         .eq(AuditedUnit::getIsDeleted, "0")
         );
+        if (unit == null){
+            return new Page<>();
+        }
 
         // 构建查询条件
         LambdaQueryWrapper<CostProjectApproval> queryWrapper = new LambdaQueryWrapper<>();

+ 12 - 0
assistMg/src/main/java/com/hotent/project/manager/impl/CostProjectConclusionManagerImpl.java

@@ -2,10 +2,14 @@ package com.hotent.project.manager.impl;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.hotent.project.model.CostProjectConclusion;
 import com.hotent.project.dao.CostProjectConclusionDao;
 import com.hotent.project.manager.CostProjectConclusionManager;
 import com.hotent.base.manager.impl.BaseManagerImpl;
+import com.hotent.project.model.CostProjectDeliberate;
+import com.hotent.project.req.CostProjectBasePageReq;
 import com.hotent.uc.exception.BaseException;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -40,4 +44,12 @@ public class CostProjectConclusionManagerImpl extends BaseManagerImpl<CostProjec
 		//新建或更新
 		this.saveOrUpdate(costProjectConclusion);
 	}
+
+    @Override
+    public IPage<CostProjectConclusion> pageList(CostProjectBasePageReq req) {
+		LambdaQueryWrapper<CostProjectConclusion> qw=new LambdaQueryWrapper<>();
+		qw.eq(CostProjectConclusion::getTaskId,req.getTaskId());
+		IPage<CostProjectConclusion> page=new Page<>(req.getPageNum(), req.getPageSize());
+		return this.page(page,qw);
+    }
 }

+ 2 - 5
assistMg/src/main/java/com/hotent/project/manager/impl/CostProjectDeliberateManagerImpl.java

@@ -32,7 +32,7 @@ public class CostProjectDeliberateManagerImpl extends BaseManagerImpl<CostProjec
 	@Override
 	public CostProjectDeliberate getDetail(String id) {
     	CostProjectDeliberate costProjectDeliberate = this.get(id);
-    	
+
 
 		return costProjectDeliberate;
 	}
@@ -45,11 +45,8 @@ public class CostProjectDeliberateManagerImpl extends BaseManagerImpl<CostProjec
 
 	@Override
 	public IPage<CostProjectDeliberate> pageList(CostProjectBasePageReq req) {
-		if(ObjectUtil.isEmpty(req.getProjectId())){
-			throw new BaseException("项目id不能为空");
-		}
 		LambdaQueryWrapper<CostProjectDeliberate> qw=new LambdaQueryWrapper<>();
-		qw.eq(CostProjectDeliberate::getProjectId,req.getProjectId());
+		qw.eq(CostProjectDeliberate::getTaskId,req.getTaskId());
 		IPage<CostProjectDeliberate> page=new Page<>(req.getPageNum(), req.getPageSize());
 		return this.page(page,qw);
 

+ 280 - 72
assistMg/src/main/java/com/hotent/project/manager/impl/CostProjectTaskManagerImpl.java

@@ -113,11 +113,18 @@ public class CostProjectTaskManagerImpl extends BaseManagerImpl<CostProjectTaskD
         if (StringUtil.isNotEmpty(req.getProjectName())) {
             queryWrapper.like(CostProjectTask::getProjectName, req.getProjectName());
         }
+        if (StringUtil.isNotEmpty(req.getAuditedUnitName())) {
+            queryWrapper.like(CostProjectTask::getAuditedUnitName, req.getAuditedUnitName());
+        }
         if (StringUtil.isNotEmpty(req.getStatus())) {
             queryWrapper.eq(CostProjectTask::getStatus, req.getStatus());
         }
         if (StringUtil.isNotEmpty(req.getCurrentNode())) {
+            // 如果指定了节点,按节点查询
             queryWrapper.eq(CostProjectTask::getCurrentNode, req.getCurrentNode());
+        } else {
+            // 如果没有指定节点,默认排除归档节点(待审核列表)
+            queryWrapper.ne(CostProjectTask::getCurrentNode, NodeConstant.guidang.getNodeKey());
         }
 
         // 按创建时间倒序排列
@@ -147,13 +154,84 @@ public class CostProjectTaskManagerImpl extends BaseManagerImpl<CostProjectTaskD
     }
 
     @Override
-    @Transactional
-    public void createOrUpdate(CostProjectTask costProjectTask) {
-        //新建或更新
-        this.saveOrUpdate(costProjectTask);
+    public IPage<CostProjectTask> pageListForArchive(CostTaskReviewPageReq req) {
+        // 获取当前用户
+        IUser currentUser = ContextUtil.getCurrentUser();
+        String currentUserId = currentUser.getUserId();
+
+        // 1. 先查询当前用户有权限的立项(负责人或项目组成员)
+        LambdaQueryWrapper<CostProjectApproval> approvalQueryWrapper = new LambdaQueryWrapper<>();
+        approvalQueryWrapper.eq(CostProjectApproval::getIsDeleted, "0");
+        approvalQueryWrapper.and(wrapper -> wrapper
+                .eq(CostProjectApproval::getLeaderId, currentUserId)
+                .or(projectMembersWrapper -> {
+                    projectMembersWrapper.like(CostProjectApproval::getProjectMembers, currentUserId);
+                })
+        );
+
+        List<CostProjectApproval> accessibleApprovals = costProjectApprovalManager.list(approvalQueryWrapper);
+
+        // 如果没有权限的立项,返回空结果
+        if (accessibleApprovals.isEmpty()) {
+            return new Page<>(req.getPageNum(), req.getPageSize());
+        }
+
+        // 提取有权限的立项ID列表
+        List<String> accessibleProjectIds = accessibleApprovals.stream()
+                .map(CostProjectApproval::getProjectId)
+                .distinct()
+                .collect(java.util.stream.Collectors.toList());
+
+        // 2. 构建任务查询条件
+        LambdaQueryWrapper<CostProjectTask> queryWrapper = new LambdaQueryWrapper<>();
+
+        // 查询未删除的记录
+        queryWrapper.eq(CostProjectTask::getIsDeleted, "0");
+
+        // 查询主任务(pid为0)
+        queryWrapper.eq(CostProjectTask::getPid, "0");
+
+        // 只查询当前用户有权限的立项对应的任务
+        queryWrapper.in(CostProjectTask::getProjectId, accessibleProjectIds);
+
+        // 根据请求参数添加查询条件
+        if (StringUtil.isNotEmpty(req.getProjectName())) {
+            queryWrapper.like(CostProjectTask::getProjectName, req.getProjectName());
+        }
+        if (StringUtil.isNotEmpty(req.getAuditedUnitName())) {
+            queryWrapper.like(CostProjectTask::getAuditedUnitName, req.getAuditedUnitName());
+        }
+        if (StringUtil.isNotEmpty(req.getStatus())) {
+            queryWrapper.eq(CostProjectTask::getStatus, req.getStatus());
+        }
+        // 根据是否归档字段过滤
+        if (StringUtil.isNotEmpty(req.getIsGd())) {
+            queryWrapper.eq(CostProjectTask::getIsGd, req.getIsGd());
+        }
+
+        // 按创建时间倒序排列
+        queryWrapper.orderByDesc(CostProjectTask::getCreateTime);
+
+        // 创建分页对象并执行查询
+        Page<CostProjectTask> page = new Page<>(req.getPageNum(), req.getPageSize());
+        IPage<CostProjectTask> result = costProjectTaskManager.page(page, queryWrapper);
+
+        // 只填充节点名称,不查询子任务
+        for (CostProjectTask rootTask : result.getRecords()) {
+            rootTask.setCurrentNodeName(NodeConstant.getNodeValueByKey(rootTask.getCurrentNode()));
+        }
+
+        return result;
     }
 
-    @Override
+	@Override
+	@Transactional
+	public void createOrUpdate(CostProjectTask costProjectTask) {
+		//新建或更新
+		this.saveOrUpdate(costProjectTask);
+	}
+
+	@Override
     @Transactional
     public String saveTask(CostTaskPageReq costTaskPageReq) {
         // 1.校验内容是否填写完毕!todo
@@ -187,9 +265,9 @@ public class CostProjectTaskManagerImpl extends BaseManagerImpl<CostProjectTaskD
 
         return "意见反馈完成";
 
-    }
+	}
 
-    @Override
+	@Override
     public String doProcessBtn(CostTaskPageReq req) {
 
         CostProjectTask task = costProjectTaskManager.getById(req.getTaskId());
@@ -211,6 +289,14 @@ public class CostProjectTaskManagerImpl extends BaseManagerImpl<CostProjectTaskD
                 // 退回
                 resultMessage = returnToSubmit(task,req);
                 break;
+            case "6":
+                // 退回上一步
+                resultMessage = backPreToSubmit(task,req);
+                break;
+            case "7":
+                // 扭转下一步
+                resultMessage = toNextSubmit(task,req);
+                break;
             default:
                 return "未知的操作类型";
         }
@@ -218,30 +304,75 @@ public class CostProjectTaskManagerImpl extends BaseManagerImpl<CostProjectTaskD
     }
 
     /**
-     * 通过,只修改状态,节点变化需要等待所有子任务完成。
+     * 通过,填写原因 修改状态
      */
     private String completeTask(CostProjectTask task) {
+        CostProjectTask nTask = costProjectTaskManager.getById(task.getId());
         NodeConstant nextNode = NodeConstant.getNextNode(task.getCurrentNode());
-        if (nextNode == null){
-            return "当前节点无法通过";
+        if (nTask == null){
+            return "任务不存在";
         }
-        // 将当前任务置为办结
-        String nextNodeStatus = nextNode.getNodeKey();
-        task.setStatus(TaskStatusConstant.COMPLETED.getStatusCode());
-        task.setCurrentNode(nextNodeStatus);
-        costProjectTaskManager.updateById(task);
+        if (!nTask.getPid().equals("0") ) {
+            // 将当前任务置为办结
+            String nextNodeStatus = nextNode.getNodeKey();
+            task.setStatus(TaskStatusConstant.COMPLETED.getStatusCode());
+            task.setCurrentNode(nextNodeStatus);
+            costProjectTaskManager.updateById(task);
+            // 如果所有子任务都办结,则将父子任务都扭转
+            List<CostProjectTask> children = costProjectTaskManager.list(
+                    new LambdaQueryWrapper<CostProjectTask>()
+                            .eq(CostProjectTask::getPid, nTask.getPid())
+            );
+            boolean b = children.stream().allMatch(child ->
+                    child.getStatus().equals(TaskStatusConstant.COMPLETED.getStatusCode()));
+            if(b){
+                CostProjectTask pNtask = costProjectTaskManager.getById(nTask.getPid());
+                pNtask.setStatus(TaskStatusConstant.AUDITING.getStatusCode());
+                pNtask.setCurrentNode(nextNodeStatus);
+                costProjectTaskManager.updateById(pNtask);
+                String  status = "";
+                switch (pNtask.getCurrentNode()){
+                    case "yjfk":
+                        status = TaskStatusConstant.WAIT_FEEDBACK.getStatusCode();
+                        break;
+                    case "jtsy":
+                        status = TaskStatusConstant.COMPLETED.getStatusCode();
+                        break;
+                    default:
+                        status = TaskStatusConstant.AUDITING.getStatusCode();
+                        break;
+                }
+                for (CostProjectTask child : children) {
+                    child.setStatus(status);
+                    child.setCurrentNode(nextNodeStatus);
+                    costProjectTaskManager.updateById(child);
+                }
+            }
+            // 如果下一个节点是"意见告知",生成空的初步意见数据
+            if (NodeConstant.yjfk.getNodeKey().equals(nextNodeStatus)) {
+                // 检查是否已存在初步意见
+                CostProjectTaskPreliminaryOpinion existingOpinion = preliminaryOpinionManager.getByTaskId(task.getId());
+                if (existingOpinion == null) {
+                    CostProjectTaskPreliminaryOpinion preliminaryOpinion = new CostProjectTaskPreliminaryOpinion();
+                    preliminaryOpinion.setTaskId(task.getId());
+                    preliminaryOpinion.setStatus("draft");
+                    preliminaryOpinion.setIsDeleted(BaseConstant.NORMAL_STATUS);
+                    preliminaryOpinionManager.createOrUpdate(preliminaryOpinion);
+                }
+            }
 
-        // 如果下一个节点是"意见告知",生成空的初步意见数据
-        if (NodeConstant.yjfk.getNodeKey().equals(nextNodeStatus)) {
-            // 检查是否已存在初步意见
-            CostProjectTaskPreliminaryOpinion existingOpinion = preliminaryOpinionManager.getByTaskId(task.getId());
-            if (existingOpinion == null) {
-                CostProjectTaskPreliminaryOpinion preliminaryOpinion = new CostProjectTaskPreliminaryOpinion();
-                preliminaryOpinion.setTaskId(task.getId());
-                preliminaryOpinion.setStatus("draft");
-                preliminaryOpinion.setIsDeleted(BaseConstant.NORMAL_STATUS);
-                preliminaryOpinionManager.createOrUpdate(preliminaryOpinion);
+        }else{
+            List<CostProjectTask> children = costProjectTaskManager.list(
+                    new LambdaQueryWrapper<CostProjectTask>()
+                            .eq(CostProjectTask::getPid, nTask.getId())
+            );
+            boolean b = children.stream().allMatch(child ->
+                    child.getStatus().equals(TaskStatusConstant.COMPLETED.getStatusCode()));
+            if (!b) {
+                throw new RuntimeException("子任务未全部办结,主任务无法办结");
             }
+            task.setStatus(TaskStatusConstant.COMPLETED.getStatusCode());
+            costProjectTaskManager.updateById(task);
         }
 
         // 发送通知
@@ -255,74 +386,123 @@ public class CostProjectTaskManagerImpl extends BaseManagerImpl<CostProjectTaskD
         String sendTarget = task.getCreateBy() == null ? "" : task.getCreateBy();
         costNoticeManager.sendNotice(task.getProjectId(), "1", title, content, enterpriseId, noticeSource, sendTarget);
 
+        return title;
+    }
 
-        // 检查同一父任务下是否所有子任务均已办结;若是,父任务节点流转
-        List<CostProjectTask> siblingTasks = costProjectTaskManager.list(
-                new LambdaQueryWrapper<CostProjectTask>()
-                        .eq(CostProjectTask::getPid, task.getPid())
-                        .eq(CostProjectTask::getIsDeleted, "0")
-        );
-
-        boolean allSiblingsCompleted = siblingTasks.stream()
-                .allMatch(s -> TaskStatusConstant.COMPLETED.getStatusCode().equals(s.getStatus()));
-
-        if (allSiblingsCompleted) {
-            CostProjectTask parentTask = costProjectTaskManager.getById(task.getPid());
-            if (parentTask != null) {
-                // 将父任务流转到下一步 重置所有子任务状态 意见反馈为待反馈 其它为审核中
-                parentTask.setCurrentNode(nextNodeStatus);
-                costProjectTaskManager.updateById(parentTask);
-                List<CostProjectTask> children = costProjectTaskManager.list(
-                        new LambdaQueryWrapper<CostProjectTask>()
-                                .eq(CostProjectTask::getPid, parentTask.getId())
-                                .eq(CostProjectTask::getIsDeleted, "0")
-                );
-                boolean c = nextNodeStatus.equals(NodeConstant.yjfk.getNodeKey());
-                for (CostProjectTask child : children) {
-                    child.setStatus(c?TaskStatusConstant.WAIT_FEEDBACK.getStatusCode():TaskStatusConstant.AUDITING.getStatusCode());
-                    costProjectTaskManager.updateById(child);
-                }
-            }
+    /**
+     * 退回,填写原因 修改状态
+     */
+    private String returnToSubmit(CostProjectTask task,CostTaskPageReq req) {
+        switch (req.getProcessNodeKey()){
+            case "sdsh":
+                throw new RuntimeException("当前节点无法退回");
+            default:
+                // 通知内容组装
+                String title = NodeConstant.getNodeValueByKey(task.getCurrentNode())+"退回";
+                String enterpriseId = task.getAuditedUnitId() == null ? "" : task.getAuditedUnitId();
+                String noticeSource = "系统";
+                String sendTarget = task.getCreateBy() == null ? "" : task.getCreateBy();
+                costNoticeManager.sendNotice(task.getProjectId(), "1", title, req.getContent(), enterpriseId, noticeSource, sendTarget);
+
+                // 更新任务的当前节点和状态
+                task.setStatus(TaskStatusConstant.NOT_PASSED.getStatusCode());
+                costProjectTaskManager.updateById(task);
+
+                return title;
         }
 
-        return title;
     }
 
     /**
-     * 退回,填写退回原因 修改状态
+     * 中止,填写原因 修改状态
      */
-    private String returnToSubmit(CostProjectTask task,CostTaskPageReq req) {
+    private String suspendTask(CostProjectTask task,CostTaskPageReq req) {
+
+        // 更新任务状态为中止/恢复
+        String status = req.getStatus()==null ? TaskStatusConstant.SUSPENDED.getStatusCode() :TaskStatusConstant.AUDITING.getStatusCode();
+        task.setStatus(status);
+        costProjectTaskManager.updateById(task);
 
         // 通知内容组装
-        String title = NodeConstant.getNodeValueByKey(task.getCurrentNode())+"退回";
+        String title = NodeConstant.getNodeValueByKey(task.getCurrentNode())+TaskStatusConstant.getStatusNameByCode(status);
         String enterpriseId = task.getAuditedUnitId() == null ? "" : task.getAuditedUnitId();
         String noticeSource = "系统";
         String sendTarget = task.getCreateBy() == null ? "" : task.getCreateBy();
         costNoticeManager.sendNotice(task.getProjectId(), "1", title, req.getContent(), enterpriseId, noticeSource, sendTarget);
 
-        // 更新任务的当前节点和状态
-        task.setStatus(TaskStatusConstant.NOT_PASSED.getStatusCode());
+        return title;
+    }
+
+    /**
+     * 补充材料,发送通知+修改任务状态
+     */
+    private String supplementMaterial(CostProjectTask task, CostTaskPageReq req) {
+
+        // 更新任务状态为
+        task.setStatus(TaskStatusConstant.BCCL.getStatusCode());
         costProjectTaskManager.updateById(task);
 
+        // 通知内容组装
+        String title = NodeConstant.getNodeValueByKey(task.getCurrentNode())+TaskStatusConstant.BCCL.getStatusName();
+        String enterpriseId = task.getAuditedUnitId() == null ? "" : task.getAuditedUnitId();
+        String noticeSource = "系统";
+        String sendTarget = task.getCreateBy() == null ? "" : task.getCreateBy();
+        costNoticeManager.sendNotice(task.getProjectId(), "1", title, req.getContent(), enterpriseId, noticeSource, sendTarget);
+
         return title;
     }
 
     /**
-     * 中止,填写中止原因 修改状态
+     * 退回上一步,填写原因 修改状态和节点
      */
-    private String suspendTask(CostProjectTask task,CostTaskPageReq req) {
-        NodeConstant nextNode = NodeConstant.getNextNode(task.getCurrentNode());
-        if (nextNode == null){
-            return "当前节点无法通过";
+    private String backPreToSubmit(CostProjectTask task,CostTaskPageReq req) {
+        CostProjectTask nTask = costProjectTaskManager.getById(task.getId());
+        if (nTask == null || !nTask.getPid().equals("0") ){
+            throw new RuntimeException("当前节点无法退回");
         }
 
-        // 更新任务状态为中止/恢复
-        String status = req.getStatus()==null ? TaskStatusConstant.SUSPENDED.getStatusCode() :TaskStatusConstant.AUDITING.getStatusCode();
-        task.setStatus(status);
-        costProjectTaskManager.updateById(task);
+        // 获取退回后的上一节点
+        NodeConstant prevNode = NodeConstant.getPrevNode(nTask.getCurrentNode());
+        if (prevNode == null) {
+            throw new RuntimeException("当前节点已是第一步,无法退回");
+        }
+        String prevNodeStatus = prevNode.getNodeKey();
+
+        // 主任务退回上一步
+        nTask.setStatus(TaskStatusConstant.AUDITING.getStatusCode());
+        nTask.setCurrentNode(prevNodeStatus);
+        costProjectTaskManager.updateById(nTask);
+
+        // 子任务都要退回,并根据退回后的节点设置正确的状态
+        List<CostProjectTask> children = costProjectTaskManager.list(
+                new LambdaQueryWrapper<CostProjectTask>()
+                        .eq(CostProjectTask::getPid, nTask.getId())
+                        .eq(CostProjectTask::getIsDeleted, "0")
+        );
+
+        // 根据退回后的节点,设置子任务状态(参考completeTask的逻辑)
+        String childStatus = "";
+        switch (prevNodeStatus) {
+            case "yjfk":
+                childStatus = TaskStatusConstant.WAIT_FEEDBACK.getStatusCode();
+                break;
+            case "cjbg":
+            case "jtsy":
+                childStatus = TaskStatusConstant.COMPLETED.getStatusCode();
+                break;
+            default:
+                childStatus = TaskStatusConstant.AUDITING.getStatusCode();
+                break;
+        }
+
+        for (CostProjectTask child : children) {
+            child.setStatus(childStatus);
+            child.setCurrentNode(prevNodeStatus);
+            costProjectTaskManager.updateById(child);
+        }
 
         // 通知内容组装
-        String title = NodeConstant.getNodeValueByKey(task.getCurrentNode())+TaskStatusConstant.getStatusNameByCode(status);
+        String title = NodeConstant.getNodeValueByKey(prevNodeStatus)+"退回上一步";
         String enterpriseId = task.getAuditedUnitId() == null ? "" : task.getAuditedUnitId();
         String noticeSource = "系统";
         String sendTarget = task.getCreateBy() == null ? "" : task.getCreateBy();
@@ -332,17 +512,45 @@ public class CostProjectTaskManagerImpl extends BaseManagerImpl<CostProjectTaskD
     }
 
     /**
-     * 补充材料,仅发送通知,不修改任务状态或节点
+     * 扭转下一步,填写原因 修改状态和节点
      */
-    private String supplementMaterial(CostProjectTask task, CostTaskPageReq req) {
+    private String toNextSubmit(CostProjectTask task,CostTaskPageReq req) {
+        CostProjectTask nTask = costProjectTaskManager.getById(task.getId());
+        if (nTask == null || !nTask.getPid().equals("0")){
+            throw new RuntimeException("当前节点无法扭转");
+        }
+        if (!task.getStatus().equals(TaskStatusConstant.COMPLETED.getStatusCode())){
+            throw new RuntimeException("请办结任务后,在进行扭转下一步");
+        }
+        // 子任务都办结才可以扭转
+        List<CostProjectTask> children = costProjectTaskManager.list(
+                new LambdaQueryWrapper<CostProjectTask>()
+                        .eq(CostProjectTask::getPid, nTask.getId())
+        );
+        boolean b = children.stream().allMatch(
+                child -> child.getStatus().equals(TaskStatusConstant.COMPLETED.getStatusCode()));
+        if (!b){
+            throw new RuntimeException("子任务未全部办结,主任务无法扭转");
+        }
+        // 主任务扭转下一步
+        String nextNodeKey = NodeConstant.getNextNode(nTask.getCurrentNode()).getNodeKey();
+        nTask.setStatus(TaskStatusConstant.AUDITING.getStatusCode());
+        nTask.setCurrentNode(nextNodeKey);
+        costProjectTaskManager.updateById(nTask);
+        for (CostProjectTask child : children) {
+            child.setCurrentNode(nextNodeKey);
+            costProjectTaskManager.updateById(child);
+        }
         // 通知内容组装
-        String title = "补充材料通知";
+        String title = NodeConstant.getNodeValueByKey(task.getCurrentNode())+"扭转至下一步";
         String enterpriseId = task.getAuditedUnitId() == null ? "" : task.getAuditedUnitId();
         String noticeSource = "系统";
         String sendTarget = task.getCreateBy() == null ? "" : task.getCreateBy();
         costNoticeManager.sendNotice(task.getProjectId(), "1", title, req.getContent(), enterpriseId, noticeSource, sendTarget);
 
-        return "补充材料通知已发送";
+        return title;
     }
 
+
+
 }

+ 46 - 0
assistMg/src/main/java/com/hotent/project/manager/impl/CostProjectTaskMaterialDetailManagerImpl.java

@@ -0,0 +1,46 @@
+package com.hotent.project.manager.impl;
+
+import com.hotent.base.manager.impl.BaseManagerImpl;
+import com.hotent.base.util.StringUtil;
+import com.hotent.project.dao.CostProjectTaskMaterialDetailDao;
+import com.hotent.project.manager.CostProjectTaskMaterialDetailManager;
+import com.hotent.project.model.CostProjectTaskMaterialDetail;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 资料归纳明细表 服务实现类
+ *
+ * @company 山西清众科技股份有限公司
+ * @author 超级管理员
+ * @since 2025-01-27
+ */
+@Service
+public class CostProjectTaskMaterialDetailManagerImpl extends BaseManagerImpl<CostProjectTaskMaterialDetailDao, CostProjectTaskMaterialDetail> implements CostProjectTaskMaterialDetailManager {
+
+    @Override
+    public CostProjectTaskMaterialDetail getDetail(String id) {
+        if (StringUtil.isEmpty(id)) {
+            return null;
+        }
+
+        CostProjectTaskMaterialDetail detail = this.getById(id);
+        if (detail == null) {
+            return null;
+        }
+
+        return detail;
+    }
+
+    @Override
+    @Transactional
+    public void deleteById(String id) {
+        if (StringUtil.isEmpty(id)) {
+            return;
+        }
+
+        // 物理删除
+        this.removeById(id);
+    }
+}
+

+ 255 - 0
assistMg/src/main/java/com/hotent/project/manager/impl/CostProjectTaskMaterialSummaryManagerImpl.java

@@ -0,0 +1,255 @@
+package com.hotent.project.manager.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.hotent.base.manager.impl.BaseManagerImpl;
+import com.hotent.base.util.StringUtil;
+import com.hotent.project.dao.CostProjectTaskMaterialSummaryDao;
+import com.hotent.project.manager.CostProjectTaskMaterialDetailManager;
+import com.hotent.project.manager.CostProjectTaskMaterialSummaryManager;
+import com.hotent.project.model.CostProjectTaskMaterialDetail;
+import com.hotent.project.model.CostProjectTaskMaterialSummary;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 资料归纳主表 服务实现类
+ *
+ * @company 山西清众科技股份有限公司
+ * @author 超级管理员
+ * @since 2025-01-27
+ */
+@Service
+public class CostProjectTaskMaterialSummaryManagerImpl extends BaseManagerImpl<CostProjectTaskMaterialSummaryDao, CostProjectTaskMaterialSummary> implements CostProjectTaskMaterialSummaryManager {
+
+    @Autowired
+    private CostProjectTaskMaterialDetailManager costProjectTaskMaterialDetailManager;
+
+    @Override
+    public List<CostProjectTaskMaterialSummary> listByTaskId(String taskId) {
+        if (StringUtil.isEmpty(taskId)) {
+            return java.util.Collections.emptyList();
+        }
+
+        // 查询主表列表
+        LambdaQueryWrapper<CostProjectTaskMaterialSummary> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(CostProjectTaskMaterialSummary::getTaskId, taskId)
+                .orderByAsc(CostProjectTaskMaterialSummary::getMaterialOrderNum);
+
+        List<CostProjectTaskMaterialSummary> summaryList = this.list(queryWrapper);
+
+        // 填充明细列表
+        fillDetailList(summaryList);
+
+        return summaryList;
+    }
+
+    @Override
+    public CostProjectTaskMaterialSummary getDetail(String id) {
+        if (StringUtil.isEmpty(id)) {
+            return null;
+        }
+
+        CostProjectTaskMaterialSummary summary = this.getById(id);
+        if (summary == null) {
+            return null;
+        }
+
+        // 填充明细列表
+        fillDetailList(java.util.Collections.singletonList(summary));
+
+        return summary;
+    }
+
+    /**
+     * 填充明细列表
+     */
+    private void fillDetailList(List<CostProjectTaskMaterialSummary> summaryList) {
+        if (summaryList == null || summaryList.isEmpty()) {
+            return;
+        }
+
+        List<String> masterIds = summaryList.stream()
+                .map(CostProjectTaskMaterialSummary::getId)
+                .collect(Collectors.toList());
+
+        // 批量查询明细
+        LambdaQueryWrapper<CostProjectTaskMaterialDetail> detailQueryWrapper = new LambdaQueryWrapper<>();
+        detailQueryWrapper.in(CostProjectTaskMaterialDetail::getMasterId, masterIds)
+                .orderByAsc(CostProjectTaskMaterialDetail::getOrderNum);
+
+        List<CostProjectTaskMaterialDetail> allDetails = costProjectTaskMaterialDetailManager.list(detailQueryWrapper);
+
+        // 按masterId分组
+        java.util.Map<String, List<CostProjectTaskMaterialDetail>> detailMap = allDetails.stream()
+                .collect(Collectors.groupingBy(CostProjectTaskMaterialDetail::getMasterId));
+
+        // 设置到对应的主表
+        for (CostProjectTaskMaterialSummary summary : summaryList) {
+            List<CostProjectTaskMaterialDetail> detailList = detailMap.getOrDefault(summary.getId(), java.util.Collections.emptyList());
+            summary.setDetailList(detailList);
+        }
+    }
+
+    @Override
+    @Transactional
+    public void createOrUpdate(CostProjectTaskMaterialSummary summary) {
+        if (summary == null) {
+            return;
+        }
+
+        this.saveOrUpdate(summary);
+    }
+
+    @Override
+    @Transactional
+    public void saveWithDetails(CostProjectTaskMaterialSummary summary) {
+        if (summary == null) {
+            return;
+        }
+
+        // 1. 保存或更新主表
+        boolean isNew = StringUtil.isEmpty(summary.getId());
+        this.saveOrUpdate(summary);
+
+        String masterId = summary.getId();
+
+        // 2. 如果不是新增,需要处理明细的删除(前端未传入的明细需要删除)
+        java.util.Set<String> incomingDetailIds = new java.util.HashSet<>();
+        if (summary.getDetailList() != null && !summary.getDetailList().isEmpty()) {
+            summary.getDetailList().stream()
+                    .filter(d -> StringUtil.isNotEmpty(d.getId()))
+                    .forEach(d -> incomingDetailIds.add(d.getId()));
+        }
+
+        // 查询数据库中已存在的明细
+        if (!isNew && !incomingDetailIds.isEmpty()) {
+            LambdaQueryWrapper<CostProjectTaskMaterialDetail> existingQueryWrapper = new LambdaQueryWrapper<>();
+            existingQueryWrapper.eq(CostProjectTaskMaterialDetail::getMasterId, masterId);
+            List<CostProjectTaskMaterialDetail> existingDetails = costProjectTaskMaterialDetailManager.list(existingQueryWrapper);
+
+            // 物理删除不在传入列表中的明细
+            for (CostProjectTaskMaterialDetail existing : existingDetails) {
+                if (!incomingDetailIds.contains(existing.getId())) {
+                    costProjectTaskMaterialDetailManager.removeById(existing.getId());
+                }
+            }
+        } else if (!isNew && (summary.getDetailList() == null || summary.getDetailList().isEmpty())) {
+            // 如果传入的明细列表为空,物理删除所有明细
+            LambdaQueryWrapper<CostProjectTaskMaterialDetail> deleteQueryWrapper = new LambdaQueryWrapper<>();
+            deleteQueryWrapper.eq(CostProjectTaskMaterialDetail::getMasterId, masterId);
+            List<CostProjectTaskMaterialDetail> allDetails = costProjectTaskMaterialDetailManager.list(deleteQueryWrapper);
+            List<String> detailIds = allDetails.stream()
+                    .map(CostProjectTaskMaterialDetail::getId)
+                    .collect(Collectors.toList());
+            if (!detailIds.isEmpty()) {
+                costProjectTaskMaterialDetailManager.removeByIds(detailIds);
+            }
+        }
+
+        // 3. 保存或更新明细列表
+        if (summary.getDetailList() != null && !summary.getDetailList().isEmpty()) {
+            for (CostProjectTaskMaterialDetail detail : summary.getDetailList()) {
+                detail.setMasterId(masterId);
+                detail.setTaskId(summary.getTaskId());
+
+                // 如果明细没有id且没有orderNum,设置orderNum(如果是新增)
+                if (StringUtil.isEmpty(detail.getId()) && detail.getOrderNum() == null) {
+                    // 查询当前主表下最大的orderNum
+                    LambdaQueryWrapper<CostProjectTaskMaterialDetail> queryWrapper = new LambdaQueryWrapper<>();
+                    queryWrapper.eq(CostProjectTaskMaterialDetail::getMasterId, masterId)
+                            .orderByDesc(CostProjectTaskMaterialDetail::getOrderNum)
+                            .last("LIMIT 1");
+                    CostProjectTaskMaterialDetail lastDetail = costProjectTaskMaterialDetailManager.getOne(queryWrapper);
+                    int nextOrderNum = lastDetail != null && lastDetail.getOrderNum() != null ? lastDetail.getOrderNum() + 1 : 1;
+                    detail.setOrderNum(nextOrderNum);
+                } else if (detail.getOrderNum() == null) {
+                    // 如果更新时orderNum为空,设置为1
+                    detail.setOrderNum(1);
+                }
+
+                costProjectTaskMaterialDetailManager.saveOrUpdate(detail);
+            }
+        }
+    }
+
+    @Override
+    @Transactional
+    public void deleteById(String id) {
+        if (StringUtil.isEmpty(id)) {
+            return;
+        }
+
+        // 1. 物理删除所有明细
+        LambdaQueryWrapper<CostProjectTaskMaterialDetail> detailQueryWrapper = new LambdaQueryWrapper<>();
+        detailQueryWrapper.eq(CostProjectTaskMaterialDetail::getMasterId, id);
+        List<CostProjectTaskMaterialDetail> detailList = costProjectTaskMaterialDetailManager.list(detailQueryWrapper);
+        List<String> detailIds = detailList.stream()
+                .map(CostProjectTaskMaterialDetail::getId)
+                .collect(Collectors.toList());
+        if (!detailIds.isEmpty()) {
+            costProjectTaskMaterialDetailManager.removeByIds(detailIds);
+        }
+
+        // 2. 物理删除主表
+        this.removeById(id);
+    }
+
+    @Override
+    @Transactional
+    public void sort(String id, String direction) {
+        if (StringUtil.isEmpty(id) || StringUtil.isEmpty(direction)) {
+            return;
+        }
+
+        CostProjectTaskMaterialSummary current = this.getById(id);
+        if (current == null) {
+            return;
+        }
+
+        String taskId = current.getTaskId();
+        Integer currentOrderNum = current.getMaterialOrderNum() != null ? current.getMaterialOrderNum() : 0;
+
+        // 查询同任务下的其他记录
+        LambdaQueryWrapper<CostProjectTaskMaterialSummary> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(CostProjectTaskMaterialSummary::getTaskId, taskId)
+                .ne(CostProjectTaskMaterialSummary::getId, id)
+                .orderByAsc(CostProjectTaskMaterialSummary::getMaterialOrderNum);
+
+        List<CostProjectTaskMaterialSummary> otherList = this.list(queryWrapper);
+
+        if ("down".equals(direction)) {
+            // 下移:找到比当前orderNum大的最小orderNum的记录,交换
+            CostProjectTaskMaterialSummary next = otherList.stream()
+                    .filter(s -> s.getMaterialOrderNum() != null && s.getMaterialOrderNum() > currentOrderNum)
+                    .min(java.util.Comparator.comparing(CostProjectTaskMaterialSummary::getMaterialOrderNum))
+                    .orElse(null);
+
+            if (next != null) {
+                Integer temp = current.getMaterialOrderNum();
+                current.setMaterialOrderNum(next.getMaterialOrderNum());
+                next.setMaterialOrderNum(temp);
+                this.updateById(current);
+                this.updateById(next);
+            }
+        } else if ("up".equals(direction)) {
+            // 上移:找到比当前orderNum小的最大orderNum的记录,交换
+            CostProjectTaskMaterialSummary prev = otherList.stream()
+                    .filter(s -> s.getMaterialOrderNum() != null && s.getMaterialOrderNum() < currentOrderNum)
+                    .max(java.util.Comparator.comparing(CostProjectTaskMaterialSummary::getMaterialOrderNum))
+                    .orElse(null);
+
+            if (prev != null) {
+                Integer temp = current.getMaterialOrderNum();
+                current.setMaterialOrderNum(prev.getMaterialOrderNum());
+                prev.setMaterialOrderNum(temp);
+                this.updateById(current);
+                this.updateById(prev);
+            }
+        }
+    }
+}
+

+ 37 - 16
assistMg/src/main/java/com/hotent/project/model/CostProjectConclusion.java

@@ -25,82 +25,103 @@ public class CostProjectConclusion extends BaseModel<CostProjectConclusion> {
     @TableId(value = "id", type = IdType.ASSIGN_ID)
     @JsonProperty("id")
     private String id;
-    
+
     @ApiModelProperty(value = "关联监审项目ID")
     @TableField("project_id")
     @JsonProperty("projectId")
     private String projectId;
-    
+
+    @ApiModelProperty(value = "主任务ID")
+    @TableField("task_id")
+    @JsonProperty("taskId")
+    private String taskId;
+
     @ApiModelProperty(value = "定价成本构成")
     @TableField("pricing_cost_structure")
     @JsonProperty("pricingCostStructure")
     private String pricingCostStructure;
-    
+
     @ApiModelProperty(value = "审核的内容和方法")
     @TableField("audit_content_method")
     @JsonProperty("auditContentMethod")
     private String auditContentMethod;
-    
+
     @ApiModelProperty(value = "成本费用项目核销(减)情况及理由")
     @TableField("cost_deduction_reason")
     @JsonProperty("costDeductionReason")
     private String costDeductionReason;
-    
+
     @ApiModelProperty(value = "成本监审结论")
     @TableField("cost_audit_conclusion")
     @JsonProperty("costAuditConclusion")
     private String costAuditConclusion;
-    
+
     @ApiModelProperty(value = "其他需要说明的事项")
     @TableField("other_explanations")
     @JsonProperty("otherExplanations")
     private String otherExplanations;
-    
+
     @ApiModelProperty(value = "违约情况说明")
     @TableField("default_conditions")
     @JsonProperty("defaultConditions")
     private String defaultConditions;
-    
+
     @ApiModelProperty(value = "结论状态: draft-草稿, pending_review-待审核, approved-已审核, completed-已完成")
     @TableField("conclusion_status")
     @JsonProperty("conclusionStatus")
     private String conclusionStatus;
-    
+
     @ApiModelProperty(value = "工作流步骤: conclusion-出具结论")
     @TableField("workflow_step")
     @JsonProperty("workflowStep")
     private String workflowStep;
-    
+
     @ApiModelProperty(value = "状态:1正常 0已删除")
     @TableField("status")
     @JsonProperty("status")
     private Boolean status;
-    
+
     @ApiModelProperty(value = "逻辑删除:0正常 1已删除")
     @TableField("is_deleted")
     @JsonProperty("isDeleted")
     private Boolean isDeleted;
-    
+
     @ApiModelProperty(value = "创建时间")
     @TableField("create_time")
     @JsonProperty("createTime")
     private LocalDateTime createTime;
-    
+
     @ApiModelProperty(value = "创建人")
     @TableField("create_by")
     @JsonProperty("createBy")
     private String createBy;
-    
+
     @ApiModelProperty(value = "更新时间")
     @TableField("update_time")
     @JsonProperty("updateTime")
     private LocalDateTime updateTime;
-    
+
     @ApiModelProperty(value = "更新人")
     @TableField("update_by")
     @JsonProperty("updateBy")
     private String updateBy;
-    
+
+
+    public String getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(String taskId) {
+        this.taskId = taskId;
+    }
+
+    public Boolean getDeleted() {
+        return isDeleted;
+    }
+
+    public void setDeleted(Boolean deleted) {
+        isDeleted = deleted;
+    }
 
     public String getId() {
         return id;

+ 43 - 18
assistMg/src/main/java/com/hotent/project/model/CostProjectDeliberate.java

@@ -2,6 +2,7 @@ package com.hotent.project.model;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.hotent.base.entity.BaseModel;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import java.time.LocalDateTime;
@@ -25,92 +26,116 @@ public class CostProjectDeliberate extends BaseModel<CostProjectDeliberate> {
     @TableId(value = "id", type = IdType.ASSIGN_ID)
     @JsonProperty("id")
     private String id;
-    
+
     @ApiModelProperty(value = "关联监审项目ID")
     @TableField("project_id")
     @JsonProperty("projectId")
     private String projectId;
-    
+
+
+    @ApiModelProperty(value = "主任务ID")
+    @TableField("task_id")
+    @JsonProperty("taskId")
+    private String taskId;
+
     @ApiModelProperty(value = "审议形式")
     @TableField("deliberation_form")
     @JsonProperty("deliberationForm")
     private String deliberationForm;
-    
+
     @ApiModelProperty(value = "审议时间 开始")
     @TableField("begin_time")
     @JsonProperty("beginTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm",timezone="GMT+8")
     private LocalDateTime beginTime;
-    
+
     @ApiModelProperty(value = "审议时间 结束")
     @TableField("end_time")
     @JsonProperty("endTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm",timezone="GMT+8")
     private LocalDateTime endTime;
-    
+
     @ApiModelProperty(value = "地点")
     @TableField("location")
     @JsonProperty("location")
     private String location;
-    
+
     @ApiModelProperty(value = "主持人")
     @TableField("host_person")
     @JsonProperty("hostPerson")
     private String hostPerson;
-    
+
     @ApiModelProperty(value = "记录人员")
     @TableField("record_person")
     @JsonProperty("recordPerson")
     private String recordPerson;
-    
+
     @ApiModelProperty(value = "参加人员")
     @TableField("participants")
     @JsonProperty("participants")
     private String participants;
-    
+
     @ApiModelProperty(value = "监审单位id")
     @TableField("enterprise_id")
     @JsonProperty("enterpriseId")
     private String enterpriseId;
-    
+
     @ApiModelProperty(value = "审议情况")
     @TableField("deliberation_content")
     @JsonProperty("deliberationContent")
     private String deliberationContent;
-    
+
     @ApiModelProperty(value = "审议结论意见")
     @TableField("conclusion_opinion")
     @JsonProperty("conclusionOpinion")
     private String conclusionOpinion;
-    
+
     @ApiModelProperty(value = "附件ID集合(多个附件用逗号分隔)")
     @TableField("attachment_ids")
     @JsonProperty("attachmentIds")
     private String attachmentIds;
-    
+
     @ApiModelProperty(value = "逻辑删除:0正常 1已删除")
     @TableField("is_deleted")
     @JsonProperty("isDeleted")
     private Boolean isDeleted;
-    
+
     @ApiModelProperty(value = "创建时间")
     @TableField("create_time")
     @JsonProperty("createTime")
     private LocalDateTime createTime;
-    
+
     @ApiModelProperty(value = "创建人")
     @TableField("create_by")
     @JsonProperty("createBy")
     private String createBy;
-    
+
     @ApiModelProperty(value = "更新时间")
     @TableField("update_time")
     @JsonProperty("updateTime")
     private LocalDateTime updateTime;
-    
+
     @ApiModelProperty(value = "更新人")
     @TableField("update_by")
     @JsonProperty("updateBy")
     private String updateBy;
-    
+
+
+    public String getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(String taskId) {
+        this.taskId = taskId;
+    }
+
+    public Boolean getDeleted() {
+        return isDeleted;
+    }
+
+    public void setDeleted(Boolean deleted) {
+        isDeleted = deleted;
+    }
 
     public String getId() {
         return id;

+ 5 - 0
assistMg/src/main/java/com/hotent/project/model/CostProjectTask.java

@@ -129,4 +129,9 @@ public class CostProjectTask extends BaseModel<CostProjectTask> {
     @JsonProperty("childTasks")
     private List<CostProjectTask> childTasks;
 
+    @ApiModelProperty(value = "是否归档")
+    @TableField("is_gd")
+    @JsonProperty("isGd")
+    private String isGd;
+
 }

+ 111 - 0
assistMg/src/main/java/com/hotent/project/model/CostProjectTaskMaterialDetail.java

@@ -0,0 +1,111 @@
+package com.hotent.project.model;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.hotent.base.entity.BaseModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 资料归纳明细表
+ *
+ * @company 山西清众科技股份有限公司
+ * @author 超级管理员
+ * @since 2025-01-27
+ */
+@ApiModel(value="CostProjectTaskMaterialDetail对象", description="资料归纳明细表")
+@Data
+public class CostProjectTaskMaterialDetail extends BaseModel<CostProjectTaskMaterialDetail> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    @JsonProperty("id")
+    private String id;
+
+    @ApiModelProperty(value = "主表ID")
+    @TableField("master_id")
+    @JsonProperty("masterId")
+    private String masterId;
+
+    @ApiModelProperty(value = "任务ID")
+    @TableField("task_id")
+    @JsonProperty("taskId")
+    private String taskId;
+
+    @ApiModelProperty(value = "文书名称")
+    @TableField("document_name")
+    @JsonProperty("documentName")
+    private String documentName;
+
+    @ApiModelProperty(value = "文号")
+    @TableField("document_number")
+    @JsonProperty("documentNumber")
+    private String documentNumber;
+
+    @ApiModelProperty(value = "被监审单位")
+    @TableField("audited_unit_name")
+    @JsonProperty("auditedUnitName")
+    private String auditedUnitName;
+
+    @ApiModelProperty(value = "生成(上传)时间")
+    @TableField("generate_time")
+    @JsonProperty("generateTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm",timezone="GMT+8")
+    private LocalDateTime generateTime;
+
+    @ApiModelProperty(value = "文件来源")
+    @TableField("file_source")
+    @JsonProperty("fileSource")
+    private String fileSource;
+
+    @ApiModelProperty(value = "资料页数")
+    @TableField("page_count")
+    @JsonProperty("pageCount")
+    private Integer pageCount;
+
+    @ApiModelProperty(value = "附件ID")
+    @TableField("attachment_id")
+    @JsonProperty("attachmentId")
+    private String attachmentId;
+
+    @ApiModelProperty(value = "序号")
+    @TableField("order_num")
+    @JsonProperty("orderNum")
+    private Integer orderNum;
+
+    @ApiModelProperty(value = "逻辑删除:0正常 1删除")
+    @TableField("is_deleted")
+    @JsonProperty("isDeleted")
+    private String isDeleted;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "create_time", fill = FieldFill.INSERT)
+    @JsonProperty("createTime")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "创建人")
+    @TableField(value = "create_by", fill = FieldFill.INSERT)
+    @JsonProperty("createBy")
+    private String createBy;
+
+    @ApiModelProperty(value = "更新时间")
+    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
+    @JsonProperty("updateTime")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "更新人")
+    @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
+    @JsonProperty("updateBy")
+    private String updateBy;
+
+}
+

+ 80 - 0
assistMg/src/main/java/com/hotent/project/model/CostProjectTaskMaterialSummary.java

@@ -0,0 +1,80 @@
+package com.hotent.project.model;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.hotent.base.entity.BaseModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 资料归纳主表
+ *
+ * @company 山西清众科技股份有限公司
+ * @author 超级管理员
+ * @since 2025-01-27
+ */
+@ApiModel(value="CostProjectTaskMaterialSummary对象", description="资料归纳主表")
+@Data
+public class CostProjectTaskMaterialSummary extends BaseModel<CostProjectTaskMaterialSummary> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    @JsonProperty("id")
+    private String id;
+
+    @ApiModelProperty(value = "任务ID")
+    @TableField("task_id")
+    @JsonProperty("taskId")
+    private String taskId;
+
+    @ApiModelProperty(value = "资料名称")
+    @TableField("material_name")
+    @JsonProperty("materialName")
+    private String materialName;
+
+    @ApiModelProperty(value = "资料序号")
+    @TableField("material_order_num")
+    @JsonProperty("materialOrderNum")
+    private Integer materialOrderNum;
+
+    @ApiModelProperty(value = "逻辑删除:0正常 1删除")
+    @TableField("is_deleted")
+    @JsonProperty("isDeleted")
+    private String isDeleted;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "create_time", fill = FieldFill.INSERT)
+    @JsonProperty("createTime")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "创建人")
+    @TableField(value = "create_by", fill = FieldFill.INSERT)
+    @JsonProperty("createBy")
+    private String createBy;
+
+    @ApiModelProperty(value = "更新时间")
+    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
+    @JsonProperty("updateTime")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "更新人")
+    @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
+    @JsonProperty("updateBy")
+    private String updateBy;
+
+    @ApiModelProperty(value = "明细列表")
+    @TableField(exist = false)
+    @JsonProperty("detailList")
+    private List<CostProjectTaskMaterialDetail> detailList;
+
+}
+

+ 3 - 0
assistMg/src/main/java/com/hotent/project/req/CostProjectBasePageReq.java

@@ -15,4 +15,7 @@ public class CostProjectBasePageReq extends PageReq {
     @ApiModelProperty(value = "项目ID",required = true)
     private String projectId;
 
+    @ApiModelProperty(value = "主任务ID",required = true)
+    private String taskId;
+
 }