From 51e4fb4bd7cb6d0e8bb890b35097ccc71f847847 Mon Sep 17 00:00:00 2001
From: maven <2163098428@qq.com>
Date: 星期五, 26 九月 2025 09:11:28 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/main/java/com/ruoyi/oA/controller/OaProjectController.java                           |   76 ++++
 src/main/java/com/ruoyi/oA/controller/OaProjectPhaseController.java                      |   41 ++
 src/main/java/com/ruoyi/oA/service/OaProjectPhaseService.java                            |   21 +
 src/main/java/com/ruoyi/oA/service/impl/OaProjectServiceImpl.java                        |   69 ++++
 src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseTaskServiceImpl.java               |   33 ++
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java                |    5 
 src/main/resources/mapper/oA/OaProjectPhaseMapper.xml                                    |   27 +
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java |    3 
 src/main/java/com/ruoyi/oA/pojo/OaProject.java                                           |  107 ++++++
 src/main/java/com/ruoyi/oA/service/OaProjectPhaseTaskService.java                        |   17 +
 src/main/java/com/ruoyi/oA/mapper/OaProjectMapper.java                                   |   27 +
 src/main/resources/mapper/oA/OaProjectMapper.xml                                         |   32 ++
 src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseTaskMapper.java                          |   18 +
 src/main/java/com/ruoyi/oA/pojo/OaProjectPhase.java                                      |   92 +++++
 src/main/java/com/ruoyi/oA/pojo/OaProjectPhaseTask.java                                  |  117 +++++++
 src/main/java/com/ruoyi/oA/controller/OaProjectPhaseTaskController.java                  |   41 ++
 src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseMapper.java                              |   18 +
 src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseServiceImpl.java                   |   62 +++
 src/main/java/com/ruoyi/oA/dto/OaProjectDto.java                                         |   26 +
 src/main/resources/mapper/oA/OaProjectPhaseTaskMapper.xml                                |   34 ++
 src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml                  |    1 
 src/main/java/com/ruoyi/oA/service/OaProjectService.java                                 |   24 +
 src/main/java/com/ruoyi/oA/dto/OaProjectPhaseDto.java                                    |   12 
 23 files changed, 902 insertions(+), 1 deletions(-)

diff --git a/src/main/java/com/ruoyi/oA/controller/OaProjectController.java b/src/main/java/com/ruoyi/oA/controller/OaProjectController.java
new file mode 100644
index 0000000..8862fb5
--- /dev/null
+++ b/src/main/java/com/ruoyi/oA/controller/OaProjectController.java
@@ -0,0 +1,76 @@
+package com.ruoyi.oA.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.measuringinstrumentledger.pojo.MeasuringInstrumentLedger;
+import com.ruoyi.oA.dto.OaProjectDto;
+import com.ruoyi.oA.pojo.OaProject;
+import com.ruoyi.oA.service.OaProjectService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+import java.util.List;
+
+@Api(tags = "oA椤圭洰绠$悊")
+@RestController
+@RequestMapping("/oA/project")
+public class OaProjectController {
+    @Autowired
+    private OaProjectService oaProjectService;
+
+    @ApiOperation("鑾峰彇椤圭洰鍒楄〃")
+    @GetMapping("/listPage")
+    public AjaxResult listPage(Page page, OaProjectDto oaProjectDto) {
+        IPage<OaProjectDto> listPage = oaProjectService.listPage(page, oaProjectDto);
+        return AjaxResult.success(listPage);
+    }
+    @ApiOperation("鑾峰彇椤圭洰鍒楄〃璇︽儏")
+    @GetMapping("/getList")
+    public AjaxResult getList(Page page, OaProjectDto oaProjectDto) {
+        IPage<OaProjectDto> listPage = oaProjectService.listPage(page, oaProjectDto);
+        HashMap<Object, Object> Map = new HashMap<>();
+        listPage.getRecords().forEach(item -> {
+            Map.put(item.getProjectId(), item);
+        });
+        return AjaxResult.success(Map);
+    }
+    @ApiOperation("澧炴坊椤圭洰")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody OaProject oaProject) {
+        boolean save = oaProjectService.save(oaProject);
+        return AjaxResult.success(save);
+    }
+    @ApiOperation("鍒犻櫎椤圭洰")
+    @DeleteMapping("/delete/{id}")
+    public AjaxResult delete(@PathVariable Long id) {
+        boolean remove = oaProjectService.deleteById(id);
+        return AjaxResult.success(remove);
+    }
+    @ApiOperation("鏇存柊椤圭洰")
+    @PostMapping("/update")
+    public AjaxResult update(@RequestBody OaProject oaProject) {
+        boolean update = oaProjectService.updateById(oaProject);
+        return AjaxResult.success(update);
+    }
+//    @ApiOperation("鏍规嵁ID鑾峰彇椤圭洰璇︽儏")
+//    @GetMapping("/getById")
+//    public AjaxResult getById(Long id) {
+//        OaProject oaProject = oaProjectService.getById(id);
+//        return AjaxResult.success(oaProject);
+//    }
+    @ApiOperation("瀵煎嚭鎵�閫夐」鐩�")
+    @PostMapping("/export/{ids}")
+    public void export(HttpServletResponse response,@PathVariable("ids") List<Long> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            throw new IllegalArgumentException("瀵煎嚭椤圭洰鍒楄〃涓嶈兘涓虹┖");
+        }
+        oaProjectService.export(response, ids);
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/oA/controller/OaProjectPhaseController.java b/src/main/java/com/ruoyi/oA/controller/OaProjectPhaseController.java
new file mode 100644
index 0000000..d857f52
--- /dev/null
+++ b/src/main/java/com/ruoyi/oA/controller/OaProjectPhaseController.java
@@ -0,0 +1,41 @@
+package com.ruoyi.oA.controller;
+
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.oA.pojo.OaProjectPhase;
+import com.ruoyi.oA.service.OaProjectPhaseService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@Api(tags = "oA椤圭洰闃舵绠$悊")
+@RestController
+@RequestMapping("/oA/projectPhase")
+public class OaProjectPhaseController {
+    @Autowired
+    private OaProjectPhaseService oaProjectPhaseService;
+
+    @ApiOperation("鏂板椤圭洰闃舵")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody OaProjectPhase oaProjectPhase) {
+        return AjaxResult.success(oaProjectPhaseService.save(oaProjectPhase));
+    }
+
+    @ApiOperation("鍒犻櫎椤圭洰闃舵")
+    @DeleteMapping("/delete/{phaseId}")
+    public AjaxResult delete(@PathVariable Integer phaseId) {
+        return AjaxResult.success(oaProjectPhaseService.deleteById(phaseId));
+    }
+
+    @ApiOperation("鏇存柊椤圭洰闃舵")
+    @PostMapping("/update")
+    public AjaxResult update(@RequestBody OaProjectPhase oaProjectPhase) {
+        return AjaxResult.success(oaProjectPhaseService.updateById(oaProjectPhase));
+    }
+
+    @ApiOperation("鏍规嵁椤圭洰id鏌ヨ椤圭洰闃舵鍒楄〃")
+    @GetMapping("/listByProjectId/{projectId}")
+    public AjaxResult listByProjectId(@PathVariable Integer projectId) {
+        return AjaxResult.success(oaProjectPhaseService.listByProjectId(projectId));
+    }
+}
diff --git a/src/main/java/com/ruoyi/oA/controller/OaProjectPhaseTaskController.java b/src/main/java/com/ruoyi/oA/controller/OaProjectPhaseTaskController.java
new file mode 100644
index 0000000..c0f7fc1
--- /dev/null
+++ b/src/main/java/com/ruoyi/oA/controller/OaProjectPhaseTaskController.java
@@ -0,0 +1,41 @@
+package com.ruoyi.oA.controller;
+
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.oA.pojo.OaProjectPhaseTask;
+import com.ruoyi.oA.service.OaProjectPhaseTaskService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@Api(tags = "oA椤圭洰闃舵浠诲姟绠$悊")
+@RestController
+@RequestMapping("/oA/projectPhaseTask")
+public class OaProjectPhaseTaskController {
+    @Autowired
+    private OaProjectPhaseTaskService oaProjectPhaseTaskService;
+
+    @ApiOperation("鏂板椤圭洰闃舵浠诲姟")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody OaProjectPhaseTask oaProjectPhaseTask) {
+        return AjaxResult.success(oaProjectPhaseTaskService.save(oaProjectPhaseTask));
+    }
+
+    @ApiOperation("鏍规嵁椤圭洰闃舵id鏌ヨ椤圭洰闃舵浠诲姟鍒楄〃")
+    @GetMapping("/listByPhaseId/{phaseId}")
+    public AjaxResult listByPhaseId(@PathVariable Integer phaseId) {
+        return AjaxResult.success(oaProjectPhaseTaskService.listByPhaseId(phaseId));
+    }
+
+    @ApiOperation("鍒犻櫎椤圭洰闃舵浠诲姟")
+    @DeleteMapping("/delete/{taskId}")
+    public AjaxResult delete(@PathVariable Integer taskId) {
+        return AjaxResult.success(oaProjectPhaseTaskService.removeById(taskId));
+    }
+
+    @ApiOperation("鏇存柊椤圭洰闃舵浠诲姟")
+    @PostMapping("/update")
+    public AjaxResult update(@RequestBody OaProjectPhaseTask oaProjectPhaseTask) {
+        return AjaxResult.success(oaProjectPhaseTaskService.updateById(oaProjectPhaseTask));
+    }
+}
diff --git a/src/main/java/com/ruoyi/oA/dto/OaProjectDto.java b/src/main/java/com/ruoyi/oA/dto/OaProjectDto.java
new file mode 100644
index 0000000..0f90faf
--- /dev/null
+++ b/src/main/java/com/ruoyi/oA/dto/OaProjectDto.java
@@ -0,0 +1,26 @@
+package com.ruoyi.oA.dto;
+
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import com.ruoyi.oA.pojo.OaProject;
+import com.ruoyi.oA.pojo.OaProjectPhase;
+import com.ruoyi.oA.pojo.OaProjectPhaseTask;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class OaProjectDto extends OaProject {
+    /**
+     * 璐熻矗浜哄悕绉�
+     */
+    @Excel(name = "璐熻矗浜哄悕绉�")
+    private String managerName;
+    /**
+     * 椤圭洰闃舵鍒楄〃
+     */
+    private List<OaProjectPhaseDto> oaProjectPhasesDto;
+//    /**
+//     * 椤圭洰闃舵浠诲姟鍒楄〃
+//     */
+//    private List<OaProjectPhaseTask> oaProjectPhaseTasks;
+}
diff --git a/src/main/java/com/ruoyi/oA/dto/OaProjectPhaseDto.java b/src/main/java/com/ruoyi/oA/dto/OaProjectPhaseDto.java
new file mode 100644
index 0000000..4ef163e
--- /dev/null
+++ b/src/main/java/com/ruoyi/oA/dto/OaProjectPhaseDto.java
@@ -0,0 +1,12 @@
+package com.ruoyi.oA.dto;
+
+import com.ruoyi.oA.pojo.OaProjectPhase;
+import com.ruoyi.oA.pojo.OaProjectPhaseTask;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class OaProjectPhaseDto extends OaProjectPhase {
+    private List<OaProjectPhaseTask> oaProjectPhaseTasks;
+}
diff --git a/src/main/java/com/ruoyi/oA/mapper/OaProjectMapper.java b/src/main/java/com/ruoyi/oA/mapper/OaProjectMapper.java
new file mode 100644
index 0000000..2114cef
--- /dev/null
+++ b/src/main/java/com/ruoyi/oA/mapper/OaProjectMapper.java
@@ -0,0 +1,27 @@
+package com.ruoyi.oA.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.oA.dto.OaProjectDto;
+import com.ruoyi.oA.pojo.OaProject;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+* @author ywx
+* @description 閽堝琛ㄣ�恛a_project(OA绯荤粺-椤圭洰浠诲姟鍗忓悓-椤圭洰琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @createDate 2025-09-24 09:18:46
+* @Entity com.ruoyi.oA.pojo.OaProject
+*/
+public interface OaProjectMapper extends BaseMapper<OaProject> {
+
+    IPage<OaProjectDto> listPage(Page page,@Param("req") OaProjectDto oaProjectDto);
+
+    List<OaProjectDto> selectByIds(List<Long> ids);
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseMapper.java b/src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseMapper.java
new file mode 100644
index 0000000..41f6ab0
--- /dev/null
+++ b/src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseMapper.java
@@ -0,0 +1,18 @@
+package com.ruoyi.oA.mapper;
+
+import com.ruoyi.oA.pojo.OaProjectPhase;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author ywx
+* @description 閽堝琛ㄣ�恛a_project_phase(OA绯荤粺-椤圭洰闃舵琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @createDate 2025-09-24 09:18:46
+* @Entity com.ruoyi.oA.pojo.OaProjectPhase
+*/
+public interface OaProjectPhaseMapper extends BaseMapper<OaProjectPhase> {
+
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseTaskMapper.java b/src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseTaskMapper.java
new file mode 100644
index 0000000..b357c76
--- /dev/null
+++ b/src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseTaskMapper.java
@@ -0,0 +1,18 @@
+package com.ruoyi.oA.mapper;
+
+import com.ruoyi.oA.pojo.OaProjectPhaseTask;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author ywx
+* @description 閽堝琛ㄣ�恛a_project_phase_task(OA绯荤粺-椤圭洰闃舵-浠诲姟琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @createDate 2025-09-24 09:18:46
+* @Entity com.ruoyi.oA.pojo.OaProjectPhaseTask
+*/
+public interface OaProjectPhaseTaskMapper extends BaseMapper<OaProjectPhaseTask> {
+
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/oA/pojo/OaProject.java b/src/main/java/com/ruoyi/oA/pojo/OaProject.java
new file mode 100644
index 0000000..376f58f
--- /dev/null
+++ b/src/main/java/com/ruoyi/oA/pojo/OaProject.java
@@ -0,0 +1,107 @@
+package com.ruoyi.oA.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * OA绯荤粺-椤圭洰浠诲姟鍗忓悓-椤圭洰琛�
+ * @TableName oa_project
+ */
+@TableName(value ="oa_project")
+@Data
+public class OaProject implements Serializable {
+    /**
+     * 
+     */
+    @TableId(type = IdType.AUTO)
+    private Integer projectId;
+
+    /**
+     * 椤圭洰鍚嶇О
+     */
+    @Excel(name = "椤圭洰鍚嶇О")
+    private String projectName;
+
+    /**
+     * 椤圭洰鎻忚堪
+     */
+    @Excel(name = "椤圭洰鎻忚堪")
+    private String description;
+
+    /**
+     * 寮�濮嬫椂闂�
+     */
+    @Excel(name = "寮�濮嬫椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate startDate;
+
+    /**
+     * 缁撴潫鏃堕棿
+     */
+    @Excel(name = "缁撴潫鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate endDate;
+
+    /**
+     * 鐘舵��
+     */
+    @Excel(name = "鐘舵��")
+    private String status;
+
+    /**
+     * 瀹屾垚搴�
+     */
+    @Excel(name = "瀹屾垚搴�")
+    private Integer completionRate;
+
+    /**
+     * 璐熻矗浜篿d
+     */
+    private Long managerId;
+
+    /**
+     * 鍒涘缓鐢ㄦ埛
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    /**
+     * 淇敼鐢ㄦ埛
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+    /**
+     * 绉熸埛ID
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/oA/pojo/OaProjectPhase.java b/src/main/java/com/ruoyi/oA/pojo/OaProjectPhase.java
new file mode 100644
index 0000000..04326ed
--- /dev/null
+++ b/src/main/java/com/ruoyi/oA/pojo/OaProjectPhase.java
@@ -0,0 +1,92 @@
+package com.ruoyi.oA.pojo;
+
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * OA绯荤粺-椤圭洰闃舵琛�
+ * @TableName oa_project_phase
+ */
+@TableName(value ="oa_project_phase")
+@Data
+public class OaProjectPhase implements Serializable {
+    /**
+     * 
+     */
+    @TableId(type = IdType.AUTO)
+    private Integer phaseId;
+
+    /**
+     * 椤圭洰闃舵鍚嶇О
+     */
+    private String phaseName;
+
+    /**
+     * oa_project琛╥d
+     */
+    private Integer oaProjectId;
+
+    /**
+     * 寮�濮嬫椂闂�
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate startDate;
+
+    /**
+     * 缁撴潫鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate endDate;
+
+    /**
+     * 鐘舵��
+     */
+    private String status;
+
+    /**
+     * 鍒涘缓鐢ㄦ埛
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    /**
+     * 淇敼鐢ㄦ埛
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+    /**
+     * 绉熸埛ID
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/oA/pojo/OaProjectPhaseTask.java b/src/main/java/com/ruoyi/oA/pojo/OaProjectPhaseTask.java
new file mode 100644
index 0000000..8241ce5
--- /dev/null
+++ b/src/main/java/com/ruoyi/oA/pojo/OaProjectPhaseTask.java
@@ -0,0 +1,117 @@
+package com.ruoyi.oA.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * OA绯荤粺-椤圭洰闃舵-浠诲姟琛�
+ * @TableName oa_project_phase_task
+ */
+@TableName(value ="oa_project_phase_task")
+@Data
+public class OaProjectPhaseTask implements Serializable {
+    /**
+     * 
+     */
+    @TableId(type = IdType.AUTO)
+    private Integer taskId;
+
+    /**
+     * 椤圭洰闃舵浠诲姟鍚嶇О
+     */
+    private String taskName;
+
+    /**
+     * oa_project_phase琛╥d
+     */
+    private Integer phaseId;
+
+    /**
+     * 寮�濮嬫椂闂�
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate startDate;
+
+    /**
+     * 缁撴潫鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate endDate;
+
+    /**
+     * 鐩爣浠诲姟瀹屾垚鏃ユ湡
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate targetDate;
+
+    /**
+     * 鐩爣鍊�
+     */
+    private Integer targetValue;
+
+    /**
+     * 褰撳墠鍊�
+     */
+    private Integer currentValue;
+
+    /**
+     * 鍗曚綅
+     */
+    private String unit;
+
+    /**
+     * 鐘舵��
+     */
+    private String status;
+
+    /**
+     * 瀹屾垚搴�
+     */
+    private Integer completionRate;
+
+    /**
+     * 鍒涘缓鐢ㄦ埛
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    /**
+     * 淇敼鐢ㄦ埛
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+    /**
+     * 绉熸埛ID
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/oA/service/OaProjectPhaseService.java b/src/main/java/com/ruoyi/oA/service/OaProjectPhaseService.java
new file mode 100644
index 0000000..7914080
--- /dev/null
+++ b/src/main/java/com/ruoyi/oA/service/OaProjectPhaseService.java
@@ -0,0 +1,21 @@
+package com.ruoyi.oA.service;
+
+import com.ruoyi.oA.dto.OaProjectPhaseDto;
+import com.ruoyi.oA.pojo.OaProjectPhase;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import java.util.List;
+
+/**
+* @author ywx
+* @description 閽堝琛ㄣ�恛a_project_phase(OA绯荤粺-椤圭洰闃舵琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice
+* @createDate 2025-09-24 09:18:46
+*/
+public interface OaProjectPhaseService extends IService<OaProjectPhase> {
+
+    List<OaProjectPhaseDto> listByProjectId(Integer oaProjectId);
+
+    boolean deleteById(Integer phaseId);
+}
diff --git a/src/main/java/com/ruoyi/oA/service/OaProjectPhaseTaskService.java b/src/main/java/com/ruoyi/oA/service/OaProjectPhaseTaskService.java
new file mode 100644
index 0000000..225d12e
--- /dev/null
+++ b/src/main/java/com/ruoyi/oA/service/OaProjectPhaseTaskService.java
@@ -0,0 +1,17 @@
+package com.ruoyi.oA.service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.oA.pojo.OaProjectPhaseTask;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+* @author ywx
+* @description 閽堝琛ㄣ�恛a_project_phase_task(OA绯荤粺-椤圭洰闃舵-浠诲姟琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice
+* @createDate 2025-09-24 09:18:46
+*/
+public interface OaProjectPhaseTaskService extends IService<OaProjectPhaseTask> {
+
+    List<OaProjectPhaseTask> listByPhaseId(Integer phaseId);
+}
diff --git a/src/main/java/com/ruoyi/oA/service/OaProjectService.java b/src/main/java/com/ruoyi/oA/service/OaProjectService.java
new file mode 100644
index 0000000..32ba593
--- /dev/null
+++ b/src/main/java/com/ruoyi/oA/service/OaProjectService.java
@@ -0,0 +1,24 @@
+package com.ruoyi.oA.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.oA.dto.OaProjectDto;
+import com.ruoyi.oA.pojo.OaProject;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+* @author ywx
+* @description 閽堝琛ㄣ�恛a_project(OA绯荤粺-椤圭洰浠诲姟鍗忓悓-椤圭洰琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice
+* @createDate 2025-09-24 09:18:46
+*/
+public interface OaProjectService extends IService<OaProject> {
+
+    IPage<OaProjectDto> listPage(Page page, OaProjectDto oaProjectDto);
+
+    void export(HttpServletResponse response, List<Long> ids);
+
+    boolean deleteById(Long id);
+}
diff --git a/src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseServiceImpl.java b/src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseServiceImpl.java
new file mode 100644
index 0000000..b462f36
--- /dev/null
+++ b/src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseServiceImpl.java
@@ -0,0 +1,62 @@
+package com.ruoyi.oA.service.impl;
+
+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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.bean.BeanUtils;
+import com.ruoyi.oA.dto.OaProjectPhaseDto;
+import com.ruoyi.oA.pojo.OaProjectPhase;
+import com.ruoyi.oA.pojo.OaProjectPhaseTask;
+import com.ruoyi.oA.service.OaProjectPhaseService;
+import com.ruoyi.oA.mapper.OaProjectPhaseMapper;
+import com.ruoyi.oA.service.OaProjectPhaseTaskService;
+import lombok.val;
+import org.hibernate.validator.constraints.br.TituloEleitoral;
+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;
+
+/**
+* @author ywx
+* @description 閽堝琛ㄣ�恛a_project_phase(OA绯荤粺-椤圭洰闃舵琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+* @createDate 2025-09-24 09:18:46
+*/
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class OaProjectPhaseServiceImpl extends ServiceImpl<OaProjectPhaseMapper, OaProjectPhase>
+    implements OaProjectPhaseService{
+    @Autowired
+    private OaProjectPhaseMapper oaProjectPhaseMapper;
+    @Autowired
+    private OaProjectPhaseTaskService oaProjectPhaseTaskService;
+
+    @Override
+    public List<OaProjectPhaseDto> listByProjectId(Integer oaProjectId) {
+        List<OaProjectPhase> oaProjectPhases = oaProjectPhaseMapper.selectList(new LambdaQueryWrapper<OaProjectPhase>()
+                .eq(OaProjectPhase::getOaProjectId, oaProjectId));
+        List<OaProjectPhaseDto> collect = oaProjectPhases.stream().map(oaProjectPhase -> {
+            OaProjectPhaseDto oaProjectPhaseDto = new OaProjectPhaseDto();
+            BeanUtils.copyProperties(oaProjectPhase, oaProjectPhaseDto);
+//            List<OaProjectPhaseTask> oaProjectPhaseTasks = oaProjectPhaseTaskService.listByPhaseId(oaProjectPhaseDto.getPhaseId());
+            oaProjectPhaseDto.setOaProjectPhaseTasks(oaProjectPhaseTaskService.listByPhaseId(oaProjectPhaseDto.getPhaseId()));
+            return oaProjectPhaseDto;
+        }).collect(Collectors.toList());
+        return collect;
+    }
+
+    @Override
+    public boolean deleteById(Integer phaseId) {
+        // 鍏堝垹闄ら」鐩樁娈典笅鐨勪换鍔�
+        oaProjectPhaseTaskService.remove(new LambdaQueryWrapper<OaProjectPhaseTask>()
+                .eq(OaProjectPhaseTask::getPhaseId, phaseId));
+        return oaProjectPhaseMapper.deleteById(phaseId) > 0;
+    }
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseTaskServiceImpl.java b/src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseTaskServiceImpl.java
new file mode 100644
index 0000000..625e8d8
--- /dev/null
+++ b/src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseTaskServiceImpl.java
@@ -0,0 +1,33 @@
+package com.ruoyi.oA.service.impl;
+
+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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.oA.pojo.OaProjectPhaseTask;
+import com.ruoyi.oA.service.OaProjectPhaseTaskService;
+import com.ruoyi.oA.mapper.OaProjectPhaseTaskMapper;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+* @author ywx
+* @description 閽堝琛ㄣ�恛a_project_phase_task(OA绯荤粺-椤圭洰闃舵-浠诲姟琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+* @createDate 2025-09-24 09:18:46
+*/
+@Service
+public class OaProjectPhaseTaskServiceImpl extends ServiceImpl<OaProjectPhaseTaskMapper, OaProjectPhaseTask>
+    implements OaProjectPhaseTaskService{
+
+
+    @Override
+    public List<OaProjectPhaseTask> listByPhaseId(Integer phaseId) {
+        return baseMapper.selectList(new LambdaQueryWrapper<OaProjectPhaseTask>()
+                .eq(OaProjectPhaseTask::getPhaseId, phaseId));
+    }
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/oA/service/impl/OaProjectServiceImpl.java b/src/main/java/com/ruoyi/oA/service/impl/OaProjectServiceImpl.java
new file mode 100644
index 0000000..149c04f
--- /dev/null
+++ b/src/main/java/com/ruoyi/oA/service/impl/OaProjectServiceImpl.java
@@ -0,0 +1,69 @@
+package com.ruoyi.oA.service.impl;
+
+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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.measuringinstrumentledger.pojo.MeasuringInstrumentLedgerRecord;
+import com.ruoyi.oA.dto.OaProjectDto;
+import com.ruoyi.oA.pojo.OaProject;
+import com.ruoyi.oA.pojo.OaProjectPhase;
+import com.ruoyi.oA.service.OaProjectPhaseService;
+import com.ruoyi.oA.service.OaProjectService;
+import com.ruoyi.oA.mapper.OaProjectMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+* @author ywx
+* @description 閽堝琛ㄣ�恛a_project(OA绯荤粺-椤圭洰浠诲姟鍗忓悓-椤圭洰琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+* @createDate 2025-09-24 09:18:45
+*/
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class OaProjectServiceImpl extends ServiceImpl<OaProjectMapper, OaProject>
+    implements OaProjectService{
+    @Autowired
+    private OaProjectMapper oaProjectMapper;
+    @Autowired
+    private OaProjectPhaseService oaProjectPhaseService;
+
+    @Override
+    public IPage<OaProjectDto> listPage(Page page, OaProjectDto oaProjectDto) {
+        IPage<OaProjectDto> iPage = oaProjectMapper.listPage(page, oaProjectDto);
+        // 椤圭洰闃舵鍒楄〃
+        for (OaProjectDto projectDto : iPage.getRecords()) {
+            projectDto.setOaProjectPhasesDto(oaProjectPhaseService.listByProjectId(projectDto.getProjectId()));
+        }
+        return iPage;
+    }
+
+    @Override
+    public void export(HttpServletResponse response, List<Long> ids) {
+        List<OaProjectDto> list = oaProjectMapper.selectByIds(ids);
+        ExcelUtil<OaProjectDto> util = new ExcelUtil<OaProjectDto>(OaProjectDto.class);
+        util.exportExcel(response, list , "椤圭洰鏁版嵁");
+    }
+
+    @Override
+    public boolean deleteById(Long id) {
+        // 鍏堝垹闄ら」鐩笅鐨勯樁娈�
+        List<OaProjectPhase> oaProjectPhases = oaProjectPhaseService.list(new LambdaQueryWrapper<OaProjectPhase>()
+                .eq(OaProjectPhase::getOaProjectId, id));
+        if (!oaProjectPhases.isEmpty()) {
+            oaProjectPhases.forEach(oaProjectPhase -> {
+                oaProjectPhaseService.deleteById(oaProjectPhase.getPhaseId());
+            });
+        }
+        return oaProjectMapper.deleteById(id) > 0;
+    }
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java
index f2e214e..5d4810d 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java
@@ -43,6 +43,11 @@
      */
     @Excel(name = "寰呭嚭搴撴暟閲�")
     private BigDecimal inboundNum0;
+    /**
+     * 鍑哄簱鏁伴噺
+     */
+    @Excel(name = "鍑哄簱鏁伴噺")
+    private BigDecimal totalInboundNum;
 
     /**
      * 鏈�浣庡簱瀛樻暟閲�
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
index 1e237f0..358f20b 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -431,7 +431,8 @@
             BigDecimal totalInboundNum = collect1.stream()
                     .map(ProcurementRecordOut::getInboundNum)
                     .reduce(BigDecimal.ZERO, BigDecimal::add);
-
+            // 鍑哄簱鏁伴噺 = 鎬绘暟閲� - 寰呭嚭搴撴暟閲�
+            dto.setTotalInboundNum(totalInboundNum);
             // 寰呭嚭搴撴暟閲� = 鎬绘暟閲� - 宸插嚭搴撴暟閲�
             dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
         }
diff --git a/src/main/resources/mapper/oA/OaProjectMapper.xml b/src/main/resources/mapper/oA/OaProjectMapper.xml
new file mode 100644
index 0000000..c245a39
--- /dev/null
+++ b/src/main/resources/mapper/oA/OaProjectMapper.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.oA.mapper.OaProjectMapper">
+
+
+    <select id="listPage" resultType="com.ruoyi.oA.dto.OaProjectDto">
+        select op.*,su.nick_name as managerName from oa_project op
+        LEFT JOIN sys_user su ON op.manager_id=su.user_id
+        <where>
+        1=1
+            <if test="req.projectName != null and req.projectName != ''">
+                and op.project_name like concat('%',#{req.projectName},'%')
+            </if>
+            <if test="req.managerName != null and req.managerName != ''">
+                and su.nick_name like concat('%',#{req.managerName},'%')
+            </if>
+            <if test="req.status != null and req.status != ''">
+                and op.status = #{req.status}
+            </if>
+        </where>
+    </select>
+    <select id="selectByIds" resultType="com.ruoyi.oA.dto.OaProjectDto">
+        select op.*,su.nick_name as managerName from oa_project op
+        LEFT JOIN sys_user su ON op.manager_id=su.user_id
+        where op.project_id in
+        <foreach collection="ids" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </select>
+</mapper>
diff --git a/src/main/resources/mapper/oA/OaProjectPhaseMapper.xml b/src/main/resources/mapper/oA/OaProjectPhaseMapper.xml
new file mode 100644
index 0000000..2f52fe9
--- /dev/null
+++ b/src/main/resources/mapper/oA/OaProjectPhaseMapper.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.oA.mapper.OaProjectPhaseMapper">
+
+    <resultMap id="BaseResultMap" type="com.ruoyi.oA.pojo.OaProjectPhase">
+            <id property="phaseId" column="phase_id" jdbcType="INTEGER"/>
+            <result property="phaseName" column="phase_name" jdbcType="VARCHAR"/>
+            <result property="oaProjectId" column="oa_project_id" jdbcType="INTEGER"/>
+            <result property="startDate" column="start_date" jdbcType="TIMESTAMP"/>
+            <result property="endDate" column="end_date" jdbcType="TIMESTAMP"/>
+            <result property="status" column="status" jdbcType="VARCHAR"/>
+            <result property="createUser" column="create_user" jdbcType="BIGINT"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateUser" column="update_user" jdbcType="BIGINT"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="tenantId" column="tenant_id" jdbcType="BIGINT"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        phase_id,phase_name,oa_project_id,
+        start_date,end_date,status,
+        create_user,create_time,update_user,
+        update_time,tenant_id
+    </sql>
+</mapper>
diff --git a/src/main/resources/mapper/oA/OaProjectPhaseTaskMapper.xml b/src/main/resources/mapper/oA/OaProjectPhaseTaskMapper.xml
new file mode 100644
index 0000000..cc029d9
--- /dev/null
+++ b/src/main/resources/mapper/oA/OaProjectPhaseTaskMapper.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.oA.mapper.OaProjectPhaseTaskMapper">
+
+    <resultMap id="BaseResultMap" type="com.ruoyi.oA.pojo.OaProjectPhaseTask">
+            <id property="taskId" column="task_id" jdbcType="INTEGER"/>
+            <result property="taskName" column="task_name" jdbcType="VARCHAR"/>
+            <result property="phaseId" column="phase_id" jdbcType="INTEGER"/>
+            <result property="startDate" column="start_date" jdbcType="TIMESTAMP"/>
+            <result property="endDate" column="end_date" jdbcType="TIMESTAMP"/>
+            <result property="targetDate" column="target_date" jdbcType="TIMESTAMP"/>
+            <result property="targetValue" column="target_value" jdbcType="INTEGER"/>
+            <result property="currentValue" column="current_value" jdbcType="INTEGER"/>
+            <result property="unit" column="unit" jdbcType="VARCHAR"/>
+            <result property="status" column="status" jdbcType="VARCHAR"/>
+            <result property="completionRate" column="completion_rate" jdbcType="INTEGER"/>
+            <result property="createUser" column="create_user" jdbcType="BIGINT"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateUser" column="update_user" jdbcType="BIGINT"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="tenantId" column="tenant_id" jdbcType="BIGINT"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        task_id,task_name,phase_id,
+        start_date,end_date,target_date,
+        target_value,current_value,unit,
+        status,completion_rate,create_user,
+        create_time,update_user,update_time,
+        tenant_id
+    </sql>
+</mapper>
diff --git a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
index e367bc8..26f13a8 100644
--- a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
+++ b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
@@ -98,6 +98,7 @@
         t1.inbound_batches,
         t1.inbound_num,
         t1.inbound_num as inboundNum0,
+        t1.inbound_num as totalInboundNum,
         t1.create_time,
         t1.update_time,
         t1.create_by

--
Gitblit v1.9.3