From 408bab8b1c0c10514b8395cff92e47751e4dcdcd Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期六, 07 三月 2026 11:28:28 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_New' into dev_New

---
 src/main/java/com/ruoyi/purchase/pojo/PurchaseReturnOrders.java                    |   10 +
 src/main/java/com/ruoyi/projectManagement/mapper/PlanNodeMapper.java               |   18 ++
 src/main/java/com/ruoyi/purchase/vo/PurchaseReturnOrderVo.java                     |   17 +
 doc/20260306_create_purchase_return_orders.sql                                     |    4 
 src/main/java/com/ruoyi/purchase/mapper/PurchaseReturnOrdersMapper.java            |    6 
 src/main/java/com/ruoyi/projectManagement/vo/PlanVo.java                           |   10 +
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseReturnOrdersServiceImpl.java |   11 +
 src/main/java/com/ruoyi/projectManagement/pojo/Plan.java                           |    8 
 src/main/java/com/ruoyi/purchase/service/PurchaseReturnOrdersService.java          |    6 
 src/main/java/com/ruoyi/projectManagement/service/PlanService.java                 |   11 +
 src/main/java/com/ruoyi/projectManagement/vo/PlanNodeVo.java                       |   35 +++
 src/main/java/com/ruoyi/purchase/dto/PurchaseReturnOrderDto.java                   |   10 +
 src/main/java/com/ruoyi/projectManagement/vo/SavePlanVo.java                       |    6 
 src/main/java/com/ruoyi/projectManagement/pojo/PlanNode.java                       |  104 +++++++++++
 src/main/java/com/ruoyi/projectManagement/vo/SavePlanNodeVo.java                   |   41 ++++
 src/main/java/com/ruoyi/purchase/controller/PurchaseReturnOrdersController.java    |   33 +++
 src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml                  |   17 +
 src/main/java/com/ruoyi/basic/service/CustomerFollowUpFileService.java             |    3 
 src/main/resources/mapper/projectManagement/PlanNodeMapper.xml                     |   31 +++
 src/main/resources/mapper/projectManagement/PlanMapper.xml                         |   15 
 src/main/java/com/ruoyi/projectManagement/controller/PlanController.java           |   49 +++++
 src/main/java/com/ruoyi/projectManagement/service/impl/PlanServiceImpl.java        |   92 ++++++++-
 22 files changed, 505 insertions(+), 32 deletions(-)

diff --git a/doc/20260306_craete_purchase_return_orders.sql b/doc/20260306_create_purchase_return_orders.sql
similarity index 87%
rename from doc/20260306_craete_purchase_return_orders.sql
rename to doc/20260306_create_purchase_return_orders.sql
index 6e31d78..84c700b 100644
--- a/doc/20260306_craete_purchase_return_orders.sql
+++ b/doc/20260306_create_purchase_return_orders.sql
@@ -12,9 +12,13 @@
     prepared_user_id   bigint  not null default 0 comment '鍒跺崟浜篿d',
     return_user_id     bigint  not null default 0 comment '閫�鏂欎汉id',
     purchase_ledger_id bigint  not null default 0 comment '閲囪喘璁㈠崟id',
+    total_discount_amount decimal(10, 2) null comment '鏁村崟鎶樻墸棰�',
+    total_discount_rate   decimal(10, 2) null comment '鏁村崟鎶樻墸鐜�',
+    total_amount decimal(10,2) null comment '鎴愪氦閲戦',
     remark             text null comment '澶囨敞',
     create_time        datetime null comment '褰曞叆鏃堕棿',
     update_time        datetime null comment '鏇存柊鏃堕棿',
+    index              idx_supplier_id (supplier_id),
     index              idx_purchase_ledger_id (purchase_ledger_id),
     index              idx_project_id (project_id)
 );
diff --git a/src/main/java/com/ruoyi/basic/service/CustomerFollowUpFileService.java b/src/main/java/com/ruoyi/basic/service/CustomerFollowUpFileService.java
index 66e5e2c..968ddba 100644
--- a/src/main/java/com/ruoyi/basic/service/CustomerFollowUpFileService.java
+++ b/src/main/java/com/ruoyi/basic/service/CustomerFollowUpFileService.java
@@ -4,6 +4,7 @@
 import com.ruoyi.basic.pojo.CustomerFollowUpFile;
 import com.ruoyi.common.vo.SimpleFileVo;
 
+import javax.annotation.Nullable;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Null;
 import java.util.List;
@@ -29,7 +30,7 @@
      * @param <T>
      */
     <T> void fillAttachment(
-           @Null List<T> list,
+           @Nullable List<T> list,
            @NotNull Function<T, String> getAttachmentIds,
            @NotNull BiConsumer<T, List<SimpleFileVo>> setAttachmentList
     );
diff --git a/src/main/java/com/ruoyi/projectManagement/controller/PlanController.java b/src/main/java/com/ruoyi/projectManagement/controller/PlanController.java
new file mode 100644
index 0000000..f3a4745
--- /dev/null
+++ b/src/main/java/com/ruoyi/projectManagement/controller/PlanController.java
@@ -0,0 +1,49 @@
+package com.ruoyi.projectManagement.controller;
+
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.projectManagement.service.PlanService;
+import com.ruoyi.projectManagement.vo.SavePlanNodeVo;
+import com.ruoyi.projectManagement.vo.SavePlanVo;
+import com.ruoyi.projectManagement.vo.SearchPlanVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * @author buhuazhen
+ * @date 2026/3/7
+ * @email 3038525872@qq.com
+ */
+@RestController
+@RequestMapping("/projectManagement/plan")
+@Api(value = "PlanController", tags = "椤圭洰绠$悊璁″垝琛�(椤圭洰绠$悊绫诲瀷)")
+@RequiredArgsConstructor
+public class PlanController {
+
+    private final PlanService planService;
+
+    @PostMapping("/save")
+    @ApiOperation("淇濆瓨")
+    public AjaxResult save(@RequestBody @Valid SavePlanVo savePlanVo) {
+        planService.savePlan(savePlanVo);
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/delete/{id}")
+    @ApiOperation("鍒犻櫎")
+    public AjaxResult delete(@PathVariable Long id) {
+        planService.deletePlan(id);
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/listPage")
+    @ApiOperation("鍒嗛〉鍒楄〃")
+    public AjaxResult listPage(@RequestBody SearchPlanVo searchPlanVo) {
+        return AjaxResult.success(planService.searchPlan(searchPlanVo));
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/projectManagement/mapper/PlanNodeMapper.java b/src/main/java/com/ruoyi/projectManagement/mapper/PlanNodeMapper.java
new file mode 100644
index 0000000..1d8f323
--- /dev/null
+++ b/src/main/java/com/ruoyi/projectManagement/mapper/PlanNodeMapper.java
@@ -0,0 +1,18 @@
+package com.ruoyi.projectManagement.mapper;
+
+import com.ruoyi.projectManagement.pojo.PlanNode;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author buhuazhen
+* @description 閽堝琛ㄣ�恜roject_management_plan_node(璁″垝鑺傜偣)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @createDate 2026-03-06 17:05:38
+* @Entity generator.domain.ProjectManagementPlanNode
+*/
+public interface PlanNodeMapper extends BaseMapper<PlanNode> {
+
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/projectManagement/pojo/Plan.java b/src/main/java/com/ruoyi/projectManagement/pojo/Plan.java
index 3fa3a98..ea62dde 100644
--- a/src/main/java/com/ruoyi/projectManagement/pojo/Plan.java
+++ b/src/main/java/com/ruoyi/projectManagement/pojo/Plan.java
@@ -36,9 +36,9 @@
     /**
      * 璁″垝鎻忚堪
      */
-    @TableField(value = "describe")
+    @TableField(value = "description")
     @ApiModelProperty(value="璁″垝鎻忚堪")
-    private String describe;
+    private String description;
 
     /**
      * 闄勪欢 ,杩涜鍒嗗壊
@@ -73,12 +73,12 @@
      */
     @TableField(value = "create_user",fill = FieldFill.INSERT)
     @ApiModelProperty(value="鍒涘缓浜�")
-    private String createUser;
+    private Integer createUser;
 
     /**
      * 
      */
     @TableField(value = "update_user",fill = FieldFill.INSERT_UPDATE)
     @ApiModelProperty(value="鏇存柊浜�")
-    private String updateUser;
+    private Integer updateUser;
 }
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/projectManagement/pojo/PlanNode.java b/src/main/java/com/ruoyi/projectManagement/pojo/PlanNode.java
new file mode 100644
index 0000000..eddaf90
--- /dev/null
+++ b/src/main/java/com/ruoyi/projectManagement/pojo/PlanNode.java
@@ -0,0 +1,104 @@
+package com.ruoyi.projectManagement.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 璁″垝鑺傜偣
+ * @TableName project_management_plan_node
+ */
+@TableName(value ="project_management_plan_node")
+@Data
+public class PlanNode implements Serializable {
+    /**
+     * 
+     */
+    @TableId(type = IdType.AUTO)
+    @TableField(value = "id")
+    private Long id;
+
+    /**
+     * 瀵瑰簲id
+     */
+    @TableField(value = "project_management_plan_id")
+    private Long projectManagementPlanId;
+
+    /**
+     * 鎺掑簭
+     */
+    @TableField(value = "sort")
+    private Integer sort;
+
+    /**
+     * 闃舵鍚嶇О
+     */
+    @TableField(value = "name")
+    private String name;
+
+    /**
+     * 璐熻矗浠籌D
+     */
+    @TableField(value = "leader_id")
+    private Long leaderId;
+
+    /**
+     * 璐熻矗浠诲悕绉�
+     */
+    @TableField(value = "leader_name")
+    private String leaderName;
+
+    /**
+     * 棰勮宸ユ湡(澶�)
+     */
+    @TableField(value = "estimated_duration")
+    private Integer estimatedDuration;
+
+    /**
+     * 宸ヤ环
+     */
+    @TableField(value = "hourly_rate")
+    private String hourlyRate;
+
+    /**
+     * 浣滀笟鍐呭
+     */
+    @TableField(value = "work_content")
+    private String workContent;
+
+    /**
+     * 
+     */
+    @TableField(value = "is_delete")
+    private Integer isDelete;
+
+    /**
+     * 
+     */
+    @TableField(value = "create_time",fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    /**
+     * 
+     */
+    @TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    /**
+     * 
+     */
+    @TableField(value = "create_user",fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    /**
+     * 
+     */
+    @TableField(value = "update_user",fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/projectManagement/service/PlanService.java b/src/main/java/com/ruoyi/projectManagement/service/PlanService.java
index 7eab7d8..de2d38a 100644
--- a/src/main/java/com/ruoyi/projectManagement/service/PlanService.java
+++ b/src/main/java/com/ruoyi/projectManagement/service/PlanService.java
@@ -4,10 +4,13 @@
 import com.ruoyi.projectManagement.pojo.Plan;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.projectManagement.vo.PlanVo;
+import com.ruoyi.projectManagement.vo.SavePlanNodeVo;
 import com.ruoyi.projectManagement.vo.SavePlanVo;
 import com.ruoyi.projectManagement.vo.SearchPlanVo;
 
+import javax.annotation.Nullable;
 import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Null;
 import java.util.List;
 
 /**
@@ -24,11 +27,19 @@
     void savePlan(@NotNull SavePlanVo savePlanVo);
 
     /**
+     * 淇濆瓨璁″垝鑺傜偣
+     * @param planId
+     * @param savePlanNodeVos
+     */
+    void savePlanNode(@NotNull Long planId,@Nullable List<SavePlanNodeVo> savePlanNodeVos);
+
+    /**
      * 鍒犻櫎椤圭洰绠$悊璁″垝
      * @param id
      */
     void deletePlan(@NotNull Long id);
 
+    void deletePlanNode(@Nullable List<Long> ids);
 
     IPage<PlanVo> searchPlan(@NotNull SearchPlanVo searchPlanVo);
 }
diff --git a/src/main/java/com/ruoyi/projectManagement/service/impl/PlanServiceImpl.java b/src/main/java/com/ruoyi/projectManagement/service/impl/PlanServiceImpl.java
index 4262f89..6856bb6 100644
--- a/src/main/java/com/ruoyi/projectManagement/service/impl/PlanServiceImpl.java
+++ b/src/main/java/com/ruoyi/projectManagement/service/impl/PlanServiceImpl.java
@@ -1,21 +1,32 @@
 package com.ruoyi.projectManagement.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.ruoyi.basic.service.CustomerFollowUpFileService;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.projectManagement.mapper.PlanMapper;
+import com.ruoyi.projectManagement.mapper.PlanNodeMapper;
 import com.ruoyi.projectManagement.pojo.Plan;
+import com.ruoyi.projectManagement.pojo.PlanNode;
 import com.ruoyi.projectManagement.service.PlanService;
-import com.ruoyi.projectManagement.vo.PlanVo;
-import com.ruoyi.projectManagement.vo.SavePlanVo;
-import com.ruoyi.projectManagement.vo.SearchPlanVo;
+import com.ruoyi.projectManagement.vo.*;
 import lombok.RequiredArgsConstructor;
+import org.jetbrains.annotations.Nullable;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.Collections;
+import java.util.List;
+import java.util.Map;
 import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 /**
  * @author buhuazhen
@@ -31,6 +42,12 @@
 
     private final CustomerFollowUpFileService customerFollowUpFileService;
 
+    private final PlanNodeMapper planNodeMapper;
+
+    @Lazy
+    @Autowired
+    private PlanService planService;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void savePlan(SavePlanVo savePlanVo) {
@@ -38,18 +55,55 @@
         // 闄勪欢澶勭悊 , 鎷兼帴
         String attachments = String.join(",", Optional.ofNullable(savePlanVo.getAttachmentIds()).orElse(Collections.emptyList()));
         plan.setAttachment(attachments);
-
-
         if (savePlanVo.getId() == null) {
             planMapper.insert(plan);
         } else {
             planMapper.updateById(plan);
         }
-
-        // todo@ 鑺傜偣淇濆瓨
-
-
+        planService.savePlanNode(plan.getId(), savePlanVo.getSavePlanNodeList());
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void savePlanNode(Long planId, @Nullable List<SavePlanNodeVo> savePlanNodeVos) {
+        Assert.notNull(planId, () -> new ServiceException("璁″垝ID涓嶈兘涓虹┖"));
+        if (CollUtil.isEmpty(savePlanNodeVos)) {
+            return;
+        }
+
+        // 鍒犻櫎澶氫綑鑺傜偣
+        List<PlanNode> needDeleteNode = planNodeMapper.selectList(new LambdaQueryWrapper<PlanNode>()
+                .select(PlanNode::getId)
+                .eq(PlanNode::getProjectManagementPlanId, planId)
+                .ne(PlanNode::getId, savePlanNodeVos.get(0).getId())
+                .notIn(PlanNode::getId, savePlanNodeVos.stream().map(SavePlanNodeVo::getId).collect(Collectors.toList())));
+        deletePlanNode(needDeleteNode.stream().map(PlanNode::getId).collect(Collectors.toList()));
+
+        List<PlanNode> planNodes = BeanUtil.copyToList(savePlanNodeVos, PlanNode.class);
+        // 璁剧疆鎺掑簭绱㈠紩
+        IntStream.range(0, savePlanNodeVos.size()).forEach(i -> {
+            planNodes.get(i).setSort(i);
+            planNodes.get(i).setProjectManagementPlanId(planId);
+            if (planNodes.get(i).getId() == null) {
+                planNodeMapper.insert(planNodes.get(i));
+            } else {
+                planNodeMapper.updateById(planNodes.get(i));
+            }
+        });
+    }
+
+    private List<PlanNode> getPlanNodeByPlanId(Long planId) {
+        return planNodeMapper.selectList(new LambdaQueryWrapper<PlanNode>()
+                .eq(PlanNode::getIsDelete, 0)
+                .eq(PlanNode::getProjectManagementPlanId, planId));
+    }
+
+    private List<PlanNode> getPlanNodeByPlanIds(List<Long> planIds) {
+        return planNodeMapper.selectList(new LambdaQueryWrapper<PlanNode>()
+                .eq(PlanNode::getIsDelete, 0)
+                .in(PlanNode::getProjectManagementPlanId, planIds));
+    }
+
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -58,9 +112,18 @@
                 new LambdaUpdateWrapper<Plan>()
                         .eq(Plan::getId, id)
                         .set(Plan::getIsDelete, 1));
-        // todo@ 瀵瑰簲鑺傜偣鍏ㄩ儴鍒犻櫎
+        planService.deletePlanNode(getPlanNodeByPlanId(id).stream().map(PlanNode::getId).collect(Collectors.toList()));
+    }
 
-
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deletePlanNode(List<Long> ids) {
+        if (CollUtil.isNotEmpty(ids)) {
+            planNodeMapper.update(null,
+                    new LambdaUpdateWrapper<PlanNode>()
+                            .in(PlanNode::getId, ids)
+                            .set(PlanNode::getIsDelete, 1));
+        }
     }
 
     @Override
@@ -69,8 +132,11 @@
         IPage<PlanVo> resultPage = planIPage.convert(plan -> BeanUtil.copyProperties(plan, PlanVo.class));
         // 鏂囦欢鑾峰彇
         customerFollowUpFileService.fillAttachment(resultPage.getRecords(), PlanVo::getAttachment, PlanVo::setAttachmentList);
-        // todo@ node 鑺傜偣鑾峰彇
-
+        Map<Long, List<PlanNodeVo>> collect = getPlanNodeByPlanIds(resultPage.getRecords().stream().map(PlanVo::getId).collect(Collectors.toList()))
+                .stream()
+                .map(it -> BeanUtil.copyProperties(it, PlanNodeVo.class))
+                .collect(Collectors.groupingBy(PlanNodeVo::getProjectManagementPlanId, Collectors.toList()));
+        resultPage.getRecords().forEach(planVo -> planVo.setPlanNodeList(collect.getOrDefault(planVo.getId(), Collections.emptyList())));
         return resultPage;
     }
 
diff --git a/src/main/java/com/ruoyi/projectManagement/vo/PlanNodeVo.java b/src/main/java/com/ruoyi/projectManagement/vo/PlanNodeVo.java
new file mode 100644
index 0000000..6194755
--- /dev/null
+++ b/src/main/java/com/ruoyi/projectManagement/vo/PlanNodeVo.java
@@ -0,0 +1,35 @@
+package com.ruoyi.projectManagement.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @author buhuazhen
+ * @date 2026/3/7
+ * @email 3038525872@qq.com
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PlanNodeVo implements Serializable {
+    private Long id;
+
+    private Long projectManagementPlanId;
+
+    private Integer sort;
+
+    private String name;
+
+    private Long leaderId;
+
+    private String leaderName;
+
+    private Integer estimatedDuration;
+
+    private String hourlyRate;
+
+    private String workContent;
+}
diff --git a/src/main/java/com/ruoyi/projectManagement/vo/PlanVo.java b/src/main/java/com/ruoyi/projectManagement/vo/PlanVo.java
index 9ee78e9..492435e 100644
--- a/src/main/java/com/ruoyi/projectManagement/vo/PlanVo.java
+++ b/src/main/java/com/ruoyi/projectManagement/vo/PlanVo.java
@@ -1,10 +1,12 @@
 package com.ruoyi.projectManagement.vo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.ruoyi.common.vo.SimpleFileVo;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
 import java.time.LocalDateTime;
@@ -25,7 +27,7 @@
 
     private String name;
 
-    private String describe;
+    private String description;
 
     // 闄勪欢
     private List<SimpleFileVo> attachmentList;
@@ -33,8 +35,14 @@
     @JsonIgnore
     private String attachment;
 
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime createTime;
 
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime updateTime;
 
+    private List<PlanNodeVo> planNodeList;
+
 }
diff --git a/src/main/java/com/ruoyi/projectManagement/vo/SavePlanNodeVo.java b/src/main/java/com/ruoyi/projectManagement/vo/SavePlanNodeVo.java
new file mode 100644
index 0000000..3e98742
--- /dev/null
+++ b/src/main/java/com/ruoyi/projectManagement/vo/SavePlanNodeVo.java
@@ -0,0 +1,41 @@
+package com.ruoyi.projectManagement.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @author buhuazhen
+ * @date 2026/3/7
+ * @email 3038525872@qq.com
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class SavePlanNodeVo implements Serializable {
+    private Long id;
+
+    private Long projectManagementPlanId;
+
+    private Integer sort;
+
+    @NotBlank
+    private String name;
+
+    @NotNull
+    private Long leaderId;
+
+    @NotBlank
+    private String leaderName;
+
+    private Integer estimatedDuration;
+
+    private String hourlyRate;
+
+    private String workContent;
+
+}
diff --git a/src/main/java/com/ruoyi/projectManagement/vo/SavePlanVo.java b/src/main/java/com/ruoyi/projectManagement/vo/SavePlanVo.java
index 5c79940..906184b 100644
--- a/src/main/java/com/ruoyi/projectManagement/vo/SavePlanVo.java
+++ b/src/main/java/com/ruoyi/projectManagement/vo/SavePlanVo.java
@@ -4,6 +4,7 @@
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import javax.validation.Valid;
 import javax.validation.constraints.NotBlank;
 import java.io.Serializable;
 import java.util.List;
@@ -22,10 +23,11 @@
     @NotBlank
     private String name;
     @NotBlank
-    private String describe;
+    private String description;
 
     private List<String> attachmentIds;
 
-
+    @Valid
+    private List<SavePlanNodeVo> savePlanNodeList;
 
 }
diff --git a/src/main/java/com/ruoyi/purchase/controller/PurchaseReturnOrdersController.java b/src/main/java/com/ruoyi/purchase/controller/PurchaseReturnOrdersController.java
index 42363af..df60a34 100644
--- a/src/main/java/com/ruoyi/purchase/controller/PurchaseReturnOrdersController.java
+++ b/src/main/java/com/ruoyi/purchase/controller/PurchaseReturnOrdersController.java
@@ -1,7 +1,16 @@
 package com.ruoyi.purchase.controller;
 
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.utils.OrderUtils;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.projectManagement.mapper.RolesMapper;
+import com.ruoyi.purchase.dto.PurchaseReturnOrderDto;
+import com.ruoyi.purchase.mapper.PurchaseReturnOrdersMapper;
+import com.ruoyi.purchase.service.PurchaseReturnOrdersService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * <p>
@@ -14,5 +23,25 @@
 @RestController
 @RequestMapping("/purchaseReturnOrders")
 public class PurchaseReturnOrdersController {
+    @Autowired
+    private PurchaseReturnOrdersService purchaseReturnOrdersService;
 
+    @Autowired
+    private PurchaseReturnOrdersMapper purchaseReturnOrdersMapper;
+
+
+    @GetMapping("/listPage")
+    public AjaxResult listPage(Page page, PurchaseReturnOrderDto purchaseReturnOrderDto) {
+        return AjaxResult.success(purchaseReturnOrdersService.listPage(page, purchaseReturnOrderDto));
+    }
+
+    // 鏂板
+    @Log(title = "閲囪喘閫�璐у崟", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody PurchaseReturnOrderDto purchaseReturnOrderDto) throws Exception {
+        if (purchaseReturnOrderDto.getIsDefaultNo()) {
+            purchaseReturnOrderDto.setNo(OrderUtils.countTodayByCreateTime(purchaseReturnOrdersMapper, "CGTL"));
+        }
+        return AjaxResult.success(purchaseReturnOrdersService.save(purchaseReturnOrderDto));
+    }
 }
diff --git a/src/main/java/com/ruoyi/purchase/dto/PurchaseReturnOrderDto.java b/src/main/java/com/ruoyi/purchase/dto/PurchaseReturnOrderDto.java
new file mode 100644
index 0000000..2de8642
--- /dev/null
+++ b/src/main/java/com/ruoyi/purchase/dto/PurchaseReturnOrderDto.java
@@ -0,0 +1,10 @@
+package com.ruoyi.purchase.dto;
+
+import com.ruoyi.purchase.pojo.PurchaseReturnOrders;
+import lombok.Data;
+
+@Data
+public class PurchaseReturnOrderDto extends PurchaseReturnOrders {
+    // 鏄惁浣跨敤绯荤粺鍗曞彿
+    private Boolean isDefaultNo;
+}
diff --git a/src/main/java/com/ruoyi/purchase/mapper/PurchaseReturnOrdersMapper.java b/src/main/java/com/ruoyi/purchase/mapper/PurchaseReturnOrdersMapper.java
index d2c1747..f0e0227 100644
--- a/src/main/java/com/ruoyi/purchase/mapper/PurchaseReturnOrdersMapper.java
+++ b/src/main/java/com/ruoyi/purchase/mapper/PurchaseReturnOrdersMapper.java
@@ -1,8 +1,12 @@
 package com.ruoyi.purchase.mapper;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.purchase.pojo.PurchaseReturnOrders;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.purchase.vo.PurchaseReturnOrderVo;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -14,5 +18,5 @@
  */
 @Mapper
 public interface PurchaseReturnOrdersMapper extends BaseMapper<PurchaseReturnOrders> {
-
+    IPage<PurchaseReturnOrderVo> listPage(Page page, @Param("params") PurchaseReturnOrders purchaseReturnOrder);
 }
diff --git a/src/main/java/com/ruoyi/purchase/pojo/PurchaseReturnOrders.java b/src/main/java/com/ruoyi/purchase/pojo/PurchaseReturnOrders.java
index c2004c3..821347d 100644
--- a/src/main/java/com/ruoyi/purchase/pojo/PurchaseReturnOrders.java
+++ b/src/main/java/com/ruoyi/purchase/pojo/PurchaseReturnOrders.java
@@ -6,6 +6,7 @@
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -61,6 +62,15 @@
     @ApiModelProperty("澶囨敞")
     private String remark;
 
+    @ApiModelProperty("'鏁村崟鎶樻墸棰�'")
+    private BigDecimal totalDiscountAmount;
+
+    @ApiModelProperty("'鏁村崟鎶樻墸鐜�'")
+    private BigDecimal totalDiscountRate;
+
+    @ApiModelProperty("'鎴愪氦閲戦'")
+    private BigDecimal totalAmount;
+
     @ApiModelProperty("褰曞叆鏃堕棿")
     @TableField(fill = FieldFill.INSERT)
     private LocalDateTime createTime;
diff --git a/src/main/java/com/ruoyi/purchase/service/PurchaseReturnOrdersService.java b/src/main/java/com/ruoyi/purchase/service/PurchaseReturnOrdersService.java
index 6f165e1..74a451f 100644
--- a/src/main/java/com/ruoyi/purchase/service/PurchaseReturnOrdersService.java
+++ b/src/main/java/com/ruoyi/purchase/service/PurchaseReturnOrdersService.java
@@ -1,7 +1,11 @@
 package com.ruoyi.purchase.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.purchase.dto.PurchaseReturnOrderDto;
 import com.ruoyi.purchase.pojo.PurchaseReturnOrders;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.purchase.vo.PurchaseReturnOrderVo;
 
 /**
  * <p>
@@ -12,5 +16,5 @@
  * @since 2026-03-06 11:44:38
  */
 public interface PurchaseReturnOrdersService extends IService<PurchaseReturnOrders> {
-
+    IPage<PurchaseReturnOrderVo> listPage(Page page, PurchaseReturnOrderDto purchaseReturnOrderDto);
 }
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseReturnOrdersServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseReturnOrdersServiceImpl.java
index f052d45..c084a68 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseReturnOrdersServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseReturnOrdersServiceImpl.java
@@ -1,9 +1,14 @@
 package com.ruoyi.purchase.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.purchase.dto.PurchaseReturnOrderDto;
 import com.ruoyi.purchase.pojo.PurchaseReturnOrders;
 import com.ruoyi.purchase.mapper.PurchaseReturnOrdersMapper;
 import com.ruoyi.purchase.service.PurchaseReturnOrdersService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.purchase.vo.PurchaseReturnOrderVo;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 /**
@@ -16,5 +21,11 @@
  */
 @Service
 public class PurchaseReturnOrdersServiceImpl extends ServiceImpl<PurchaseReturnOrdersMapper, PurchaseReturnOrders> implements PurchaseReturnOrdersService {
+    @Autowired
+    private PurchaseReturnOrdersMapper purchaseReturnOrdersMapper;
 
+    @Override
+    public IPage<PurchaseReturnOrderVo> listPage(Page page, PurchaseReturnOrderDto purchaseReturnOrderDto) {
+        return purchaseReturnOrdersMapper.listPage(page, purchaseReturnOrderDto);
+    }
 }
diff --git a/src/main/java/com/ruoyi/purchase/vo/PurchaseReturnOrderVo.java b/src/main/java/com/ruoyi/purchase/vo/PurchaseReturnOrderVo.java
new file mode 100644
index 0000000..8e19f8c
--- /dev/null
+++ b/src/main/java/com/ruoyi/purchase/vo/PurchaseReturnOrderVo.java
@@ -0,0 +1,17 @@
+package com.ruoyi.purchase.vo;
+
+import com.ruoyi.purchase.pojo.PurchaseReturnOrders;
+
+public class PurchaseReturnOrderVo extends PurchaseReturnOrders {
+    //渚涘簲鍟嗗悕绉�
+    private String supplierName;
+
+    // 閲囪喘鍚堝悓鍙�
+    private String purchaseContractNumber;
+
+    //閫�鏂欎汉濮撳悕
+    private String returnUserName;
+
+     //鍒跺崟浜哄鍚�
+    private String createUserName;
+}
diff --git a/src/main/resources/mapper/projectManagement/PlanMapper.xml b/src/main/resources/mapper/projectManagement/PlanMapper.xml
index 3578358..de652e7 100644
--- a/src/main/resources/mapper/projectManagement/PlanMapper.xml
+++ b/src/main/resources/mapper/projectManagement/PlanMapper.xml
@@ -7,17 +7,17 @@
     <resultMap id="BaseResultMap" type="com.ruoyi.projectManagement.pojo.Plan">
             <id property="id" column="id" jdbcType="BIGINT"/>
             <result property="name" column="name" jdbcType="VARCHAR"/>
-            <result property="describe" column="describe" jdbcType="VARCHAR"/>
+            <result property="description" column="description" jdbcType="VARCHAR"/>
             <result property="attachment" column="attachment" jdbcType="VARCHAR"/>
-            <result property="is_delete" column="is_delete" jdbcType="INTEGER"/>
-            <result property="create_time" column="create_time" jdbcType="TIMESTAMP"/>
-            <result property="update_time" column="update_time" jdbcType="TIMESTAMP"/>
-            <result property="create_user" column="create_user" jdbcType="VARCHAR"/>
-            <result property="update_user" column="update_user" jdbcType="VARCHAR"/>
+            <result property="isDelete" column="is_delete" jdbcType="INTEGER"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="createUser" column="create_user" jdbcType="VARCHAR"/>
+            <result property="updateUser" column="update_user" jdbcType="VARCHAR"/>
     </resultMap>
 
     <sql id="Base_Column_List">
-        id,name,describe,
+        id,name,description,
         attachment,is_delete,create_time,
         update_time,create_user,update_user
     </sql>
@@ -25,6 +25,7 @@
     <select id="selectPlanPage" resultMap="BaseResultMap">
         select t1.*
         from project_management_plan as t1
+            where t1.is_delete = 0
         order by t1.create_time desc
     </select>
 </mapper>
diff --git a/src/main/resources/mapper/projectManagement/PlanNodeMapper.xml b/src/main/resources/mapper/projectManagement/PlanNodeMapper.xml
new file mode 100644
index 0000000..b6b9ddf
--- /dev/null
+++ b/src/main/resources/mapper/projectManagement/PlanNodeMapper.xml
@@ -0,0 +1,31 @@
+<?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.projectManagement.mapper.PlanNodeMapper">
+
+    <resultMap id="BaseResultMap" type="com.ruoyi.projectManagement.pojo.PlanNode">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="projectManagementPlanId" column="project_management_plan_id" jdbcType="BIGINT"/>
+            <result property="sort" column="sort" jdbcType="INTEGER"/>
+            <result property="name" column="name" jdbcType="VARCHAR"/>
+            <result property="leaderId" column="leader_id" jdbcType="BIGINT"/>
+            <result property="leaderName" column="leader_name" jdbcType="VARCHAR"/>
+            <result property="estimatedDuration" column="estimated_duration" jdbcType="INTEGER"/>
+            <result property="hourlyRate" column="hourly_rate" jdbcType="VARCHAR"/>
+            <result property="workContent" column="work_content" jdbcType="VARCHAR"/>
+            <result property="isDelete" column="is_delete" jdbcType="INTEGER"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="createUser" column="create_user" jdbcType="VARCHAR"/>
+            <result property="updateUser" column="update_user" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,project_management_plan_id,sort,
+        name,leader_id,leader_name,
+        estimated_duration,hourly_rate,work_content,
+        is_delete,create_time,update_time,
+        create_user,update_user
+    </sql>
+</mapper>
diff --git a/src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml b/src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml
index 8d23060..8976a3a 100644
--- a/src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml
+++ b/src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml
@@ -19,4 +19,21 @@
         <result column="update_time" property="updateTime" />
     </resultMap>
 
+    <select id="listPage" resultType="com.ruoyi.purchase.vo.PurchaseReturnOrderVo">
+        SELECT
+        pro.*,
+        sm.supplier_name as supplierName,
+        pl.purchase_contract_number as purchaseContractNumber,
+        su.user_name as returnUserName,
+        su1.user_name as createUserName
+        FROM purchase_return_orders pro
+        LEFT JOIN supplier_manage sm ON pro.supplier_id = sm.id
+        LEFT JOIN purchase_ledger pl ON pl.id = pro.purchase_ledger_id
+        LEFT JOIN sys_user su ON su.user_id = pro.return_user_id
+        LEFT JOIN sys_user su1 ON su1.user_id = pro.prepared_user_id
+        where 1=1
+        <if test="params.no != null and params.no != '' ">
+            AND pro.no LIKE CONCAT('%',#{params.no},'%')
+        </if>
+    </select>
 </mapper>

--
Gitblit v1.9.3