Przeglądaj źródła

项目新增与分页

qianxb 1 rok temu
rodzic
commit
7fa7346517
27 zmienionych plików z 1251 dodań i 20 usunięć
  1. 54 9
      src/main/java/org/springblade/modules/project/controller/ProjectInfoController.java
  2. 15 0
      src/main/java/org/springblade/modules/project/mapper/ProjectInfoMapper.java
  3. 50 0
      src/main/java/org/springblade/modules/project/mapper/ProjectInfoMapper.xml
  4. 39 0
      src/main/java/org/springblade/modules/project/mapper/ProjectInvestPlanMapper.java
  5. 5 0
      src/main/java/org/springblade/modules/project/mapper/ProjectInvestPlanMapper.xml
  6. 39 0
      src/main/java/org/springblade/modules/project/mapper/ProjectPlanProgressMapper.java
  7. 5 0
      src/main/java/org/springblade/modules/project/mapper/ProjectPlanProgressMapper.xml
  8. 15 1
      src/main/java/org/springblade/modules/project/pojo/dto/ProjectInfoDTO.java
  9. 42 0
      src/main/java/org/springblade/modules/project/pojo/dto/ProjectInfoPageDTO.java
  10. 17 0
      src/main/java/org/springblade/modules/project/pojo/entity/ProjectInfo.java
  11. 152 0
      src/main/java/org/springblade/modules/project/pojo/entity/ProjectInvestPlan.java
  12. 55 0
      src/main/java/org/springblade/modules/project/pojo/entity/ProjectPlanProgress.java
  13. 33 0
      src/main/java/org/springblade/modules/project/pojo/vo/ProjectAndPlanDetailVO.java
  14. 24 0
      src/main/java/org/springblade/modules/project/pojo/vo/ProjectInfoDetailVO.java
  15. 45 1
      src/main/java/org/springblade/modules/project/pojo/vo/ProjectInfoVO.java
  16. 89 0
      src/main/java/org/springblade/modules/project/pojo/vo/ProjectInvestPlanVO.java
  17. 35 0
      src/main/java/org/springblade/modules/project/pojo/vo/ProjectPlanProgressVO.java
  18. 20 1
      src/main/java/org/springblade/modules/project/service/IProjectInfoService.java
  19. 15 0
      src/main/java/org/springblade/modules/project/service/IProjectInvestPlanService.java
  20. 14 0
      src/main/java/org/springblade/modules/project/service/IProjectPlanProgressService.java
  21. 327 1
      src/main/java/org/springblade/modules/project/service/impl/ProjectInfoServiceImpl.java
  22. 28 0
      src/main/java/org/springblade/modules/project/service/impl/ProjectInvestPlanServiceImpl.java
  23. 41 0
      src/main/java/org/springblade/modules/project/service/impl/ProjectPlanProgressServiceImpl.java
  24. 38 0
      src/main/java/org/springblade/modules/project/utils/ObjectUtils.java
  25. 47 0
      src/main/java/org/springblade/modules/project/utils/SnowFlakeUtil.java
  26. 1 1
      src/main/java/org/springblade/modules/system/pojo/dto/DictBizDTO.java
  27. 6 6
      src/main/java/org/springblade/modules/system/service/impl/DictBizServiceImpl.java

+ 54 - 9
src/main/java/org/springblade/modules/project/controller/ProjectInfoController.java

@@ -1,17 +1,20 @@
 package org.springblade.modules.project.controller;
 
-import com.baomidou.mybatisplus.annotation.TableName;
-import io.swagger.v3.oas.annotations.media.Schema;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
 import org.springblade.core.boot.ctrl.BladeController;
-import org.springblade.core.launch.constant.AppConstant;
-import org.springblade.core.mp.base.BaseEntity;
 import org.springblade.core.tenant.annotation.NonDS;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springblade.core.tool.api.R;
+import org.springblade.modules.project.pojo.dto.ProjectInfoDTO;
+import org.springblade.modules.project.pojo.dto.ProjectInfoPageDTO;
+import org.springblade.modules.project.pojo.vo.ProjectAndPlanDetailVO;
+import org.springblade.modules.project.pojo.vo.ProjectInfoDetailVO;
+import org.springblade.modules.project.pojo.vo.ProjectInfoVO;
+import org.springblade.modules.project.service.IProjectInfoService;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * @Param
@@ -21,8 +24,50 @@ import org.springframework.web.bind.annotation.RestController;
 @NonDS
 @RestController
 @AllArgsConstructor
-@RequestMapping(  "/project")
+@RequestMapping(  "/blade-attach/project")
 @Tag(name = "项目信息接口", description = "项目信息接口")
 public class ProjectInfoController extends BladeController {
+    private final IProjectInfoService projectInfoService;
+
+    @PostMapping("/add")
+    @ApiOperationSupport(order = 1)
+    @Operation(summary = "新增项目", description = "新增项目,传入项目信息和每一年的计划数组")
+    public R add(@RequestBody ProjectInfoDTO dto) {
+        projectInfoService.add(dto);
+        return R.success("新增成功");
+    }
+
+    @PostMapping("/page")
+    @ApiOperationSupport(order = 2)
+    @Operation(summary = "分页", description = "分页查询项目")
+    public R<IPage<ProjectInfoVO>> page(@RequestBody ProjectInfoPageDTO dto) {
+        IPage<ProjectInfoVO> page =  projectInfoService.page2(dto);
+        return R.data(page);
+    }
+
+    @GetMapping("/detail")
+    @ApiOperationSupport(order = 3)
+    @Operation(summary = "项目详情", description = "项目详情,传入项目id")
+    public R<ProjectInfoDetailVO> detail(Long id) {
+        ProjectInfoDetailVO vo =  projectInfoService.detail(id);
+        return R.data(vo);
+    }
+
+    @PostMapping("/update")
+    @ApiOperationSupport(order = 4)
+    @Operation(summary = "修改项目", description = "修改项目,传入项目信息和每一年的计划数组")
+    public R update(@RequestBody ProjectInfoDTO dto) {
+        projectInfoService.update2(dto);
+        return R.success("修改成功");
+    }
+
+    @GetMapping("/project-and-plan-detail")
+    @ApiOperationSupport(order = 5)
+    @Operation(summary = "项目与计划详情", description = "项目与计划详情,传入项目id")
+    public R<ProjectAndPlanDetailVO> detail2(Long id) {
+        ProjectAndPlanDetailVO vo =  projectInfoService.detail2(id);
+        return R.data(vo);
+    }
+
 
 }

+ 15 - 0
src/main/java/org/springblade/modules/project/mapper/ProjectInfoMapper.java

@@ -26,9 +26,15 @@
 package org.springblade.modules.project.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.modules.project.pojo.dto.ProjectInfoPageDTO;
 import org.springblade.modules.project.pojo.entity.ProjectInfo;
+import org.springblade.modules.project.pojo.vo.*;
 import org.springblade.modules.system.pojo.entity.ApiScope;
 
+import java.util.List;
+
 /**
  *  Mapper 接口
  *
@@ -36,4 +42,13 @@ import org.springblade.modules.system.pojo.entity.ApiScope;
  */
 public interface ProjectInfoMapper extends BaseMapper<ProjectInfo> {
 
+    ProjectInfoDetailVO detail(@Param("id") Long id);
+
+    ProjectAndPlanDetailVO detail2(Long id);
+
+    List<ProjectInvestPlanVO> getAllPlanByProjectId(@Param("id") Long id);
+
+    List<ProjectPlanProgressVO> getAllProgressByProjectId(@Param("id") Long id);
+
+    IPage<ProjectInfoVO> page(IPage<ProjectInfoVO> page,@Param("dto") ProjectInfoPageDTO dto);
 }

+ 50 - 0
src/main/java/org/springblade/modules/project/mapper/ProjectInfoMapper.xml

@@ -2,4 +2,54 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.springblade.modules.project.mapper.ProjectInfoMapper">
 
+    <select id="detail" resultType="org.springblade.modules.project.pojo.vo.ProjectInfoDetailVO">
+        select * from d_project_info where id = #{id}
+    </select>
+    <select id="detail2" resultType="org.springblade.modules.project.pojo.vo.ProjectAndPlanDetailVO">
+        select *,
+               (select dict_value from blade_dict_biz where code = 'projectStage' and dict_key = dpi.project_stage and is_deleted = 0) as projectStageName,
+               (select dict_value from blade_dict_biz where code = 'projectType' and dict_key = dpi.project_type and is_deleted = 0) as projectTypeName
+        from d_project_info dpi where id = #{id}
+    </select>
+    <select id="getAllPlanByProjectId"
+            resultType="org.springblade.modules.project.pojo.vo.ProjectInvestPlanVO">
+        select * from d_project_invest_plan
+        where project_id = #{id} and is_deleted = 0
+        order by  plan_year
+    </select>
+    <select id="getAllProgressByProjectId"
+            resultType="org.springblade.modules.project.pojo.vo.ProjectPlanProgressVO">
+        select * from d_project_plan_progress
+        where project_id = #{id} and is_deleted = 0
+    </select>
+    <select id="page" resultType="org.springblade.modules.project.pojo.vo.ProjectInfoVO">
+        select *,
+               if (build_scale_unit = 1,concat(build_scale,'(公里)'),build_scale) as buildScaleName,
+               if (is_focus_project = 1,'是','否') as isFocusProjectName,
+               if (is_pilot_plan = 1,'是','否') as isPilotPlanName,
+               (select sum(year_unfinished_invest) from d_project_invest_plan where is_deleted = 0 and project_id = dpi.id) as finishedInvestMoney,
+               (select sum(plan_ratio) from d_project_plan_progress where is_deleted = 0 and project_id = dpi.id) as Progress,
+               (select sum(fill_field) from d_project_plan_progress where is_deleted = 0 and project_id = dpi.id) as finishedFill,
+               (select count(1) from d_project_invest_plan where is_deleted = 0 and is_plan = 1 and project_id = dpi.id) as hasPlanYearTotal,
+               (select dict_value from blade_dict_biz where code = 'projectStage' and dict_key = dpi.project_stage and is_deleted = 0) as projectStageName,
+               (select dict_value from blade_dict_biz where code = 'projectType' and dict_key = dpi.project_type and is_deleted = 0) as projectTypeName
+        from d_project_info dpi where is_deleted = 0
+        <if test="dto.projectStage != null">
+            and project_stage = #{dto.projectStage}
+        </if>
+        <if test="dto.projectType != null">
+            and project_type = #{dto.projectType}
+        </if>
+        <if test="dto.searchValue != null and dto.searchValue != ''">
+            and name like concat('%', #{dto.searchValue}),'%')
+        </if>
+        <if test="dto.startYear != null">
+            and start_year &gt;= #{dto.startYear}
+        </if>
+        <if test="dto.endYear != null ">
+            and end_year &lt;= #{dto.endYear}
+        </if>
+
+    </select>
+
 </mapper>

+ 39 - 0
src/main/java/org/springblade/modules/project/mapper/ProjectInvestPlanMapper.java

@@ -0,0 +1,39 @@
+/**
+ * BladeX Commercial License Agreement
+ * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
+ * <p>
+ * Use of this software is governed by the Commercial License Agreement
+ * obtained after purchasing a license from BladeX.
+ * <p>
+ * 1. This software is for development use only under a valid license
+ * from BladeX.
+ * <p>
+ * 2. Redistribution of this software's source code to any third party
+ * without a commercial license is strictly prohibited.
+ * <p>
+ * 3. Licensees may copyright their own code but cannot use segments
+ * from this software for such purposes. Copyright of this software
+ * remains with BladeX.
+ * <p>
+ * Using this software signifies agreement to this License, and the software
+ * must not be used for illegal purposes.
+ * <p>
+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
+ * not liable for any claims arising from secondary or illegal development.
+ * <p>
+ * Author: Chill Zhuang (bladejava@qq.com)
+ */
+package org.springblade.modules.project.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.modules.project.pojo.entity.ProjectInfo;
+import org.springblade.modules.project.pojo.entity.ProjectInvestPlan;
+
+/**
+ *  Mapper 接口
+ *
+ * @author BladeX
+ */
+public interface ProjectInvestPlanMapper extends BaseMapper<ProjectInvestPlan> {
+
+}

+ 5 - 0
src/main/java/org/springblade/modules/project/mapper/ProjectInvestPlanMapper.xml

@@ -0,0 +1,5 @@
+<?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="org.springblade.modules.project.mapper.ProjectInvestPlanMapper">
+
+</mapper>

+ 39 - 0
src/main/java/org/springblade/modules/project/mapper/ProjectPlanProgressMapper.java

@@ -0,0 +1,39 @@
+/**
+ * BladeX Commercial License Agreement
+ * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
+ * <p>
+ * Use of this software is governed by the Commercial License Agreement
+ * obtained after purchasing a license from BladeX.
+ * <p>
+ * 1. This software is for development use only under a valid license
+ * from BladeX.
+ * <p>
+ * 2. Redistribution of this software's source code to any third party
+ * without a commercial license is strictly prohibited.
+ * <p>
+ * 3. Licensees may copyright their own code but cannot use segments
+ * from this software for such purposes. Copyright of this software
+ * remains with BladeX.
+ * <p>
+ * Using this software signifies agreement to this License, and the software
+ * must not be used for illegal purposes.
+ * <p>
+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
+ * not liable for any claims arising from secondary or illegal development.
+ * <p>
+ * Author: Chill Zhuang (bladejava@qq.com)
+ */
+package org.springblade.modules.project.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.modules.project.pojo.entity.ProjectInvestPlan;
+import org.springblade.modules.project.pojo.entity.ProjectPlanProgress;
+
+/**
+ *  Mapper 接口
+ *
+ * @author BladeX
+ */
+public interface ProjectPlanProgressMapper extends BaseMapper<ProjectPlanProgress> {
+
+}

+ 5 - 0
src/main/java/org/springblade/modules/project/mapper/ProjectPlanProgressMapper.xml

@@ -0,0 +1,5 @@
+<?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="org.springblade.modules.project.mapper.ProjectPlanProgressMapper">
+
+</mapper>

+ 15 - 1
src/main/java/org/springblade/modules/project/pojo/dto/ProjectInfoDTO.java

@@ -1,9 +1,23 @@
 package org.springblade.modules.project.pojo.dto;
 
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.modules.project.pojo.entity.ProjectInfo;
+import org.springblade.modules.project.pojo.entity.ProjectInvestPlan;
+
+import java.util.List;
+
 /**
  * @Param
  * @Author wangwl
  * @Date 2024/4/8 11:45
  **/
-public class ProjectInfoDTO {
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Schema(description = "项目新增保存DTO")
+public class ProjectInfoDTO extends ProjectInfo {
+
+    @Schema(description = "每年计划集合")
+    private List<ProjectInvestPlan> list;
 }

+ 42 - 0
src/main/java/org/springblade/modules/project/pojo/dto/ProjectInfoPageDTO.java

@@ -0,0 +1,42 @@
+package org.springblade.modules.project.pojo.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.support.Query;
+import org.springblade.modules.project.pojo.entity.ProjectInfo;
+import org.springblade.modules.project.pojo.entity.ProjectInvestPlan;
+
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2024/4/8 11:45
+ **/
+@Data
+@Schema(description = "项目分页DTO")
+public class ProjectInfoPageDTO {
+
+    @Schema(description = "当前页")
+    private Integer current;
+
+    @Schema(description = "每页的数量")
+    private Integer size;
+
+    @Schema(description = "开工年")
+    private Integer startYear;
+
+    @Schema(description = "完工年")
+    private Integer endYear;
+
+    @Schema(description = "搜索值")
+    private String searchValue;
+
+    @Schema(description = "项目阶段")
+    private Integer projectStage;
+
+    @Schema(description = "项目类型")
+    private Integer projectType;
+
+}

+ 17 - 0
src/main/java/org/springblade/modules/project/pojo/entity/ProjectInfo.java

@@ -6,6 +6,8 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.core.mp.base.BaseEntity;
 
+import java.math.BigDecimal;
+
 /**
  * @Param
  * @Author wangwl
@@ -24,6 +26,9 @@ public class ProjectInfo extends BaseEntity {
     @Schema(description = "建设规模")
     private String buildScale;
 
+    @Schema(description = "建设规模单位1公里2空")
+    private Integer buildScaleUnit;
+
     @Schema(description = "项目阶段")
     private Integer projectStage;
 
@@ -44,4 +49,16 @@ public class ProjectInfo extends BaseEntity {
 
     @Schema(description = "责任单位")
     private String dutyUnit;
+
+    @Schema(description = "总投资")
+    private BigDecimal allInvestMoney;
+
+    @Schema(description = "十四五计划投资")
+    private BigDecimal fourteenFiveInvest;
+
+    @Schema(description = "是否重点项目")
+    private Integer isFocusProject;
+
+    @Schema(description = "是否试点任务")
+    private Integer isPilotPlan;
 }

+ 152 - 0
src/main/java/org/springblade/modules/project/pojo/entity/ProjectInvestPlan.java

@@ -0,0 +1,152 @@
+package org.springblade.modules.project.pojo.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.math.BigDecimal;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2024/4/8 13:54
+ **/
+@Data
+@TableName("d_project_invest_plan")
+@EqualsAndHashCode(callSuper = true)
+@Schema(description = "项目投资与计划表")
+public class ProjectInvestPlan extends BaseEntity {
+
+    @Schema(description = "项目id")
+    private Long projectId;
+
+    @Schema(description = "计划年份")
+    private Integer planYear;
+
+    @Schema(description = "全年投资")
+    private BigDecimal yearlyInvest;
+
+    @Schema(description = "全年目标")
+    private String yearlyTarget;
+
+    @Schema(description = "是否有计划")
+    private Integer isPlan;
+
+    @Schema(description = "是否填写计划")
+    private Integer isFillPlan;
+
+    @Schema(description = "一季度投资")
+    private BigDecimal oneInvest;
+
+    @Schema(description = "一季度已投资")
+    private BigDecimal oneInvestFinish;
+
+    @Schema(description = "一季度投资比例")
+    private BigDecimal oneInvestRatio;
+
+    @Schema(description = "一季度投资是否填完")
+    private Integer isOneInvestFinish;
+
+    @Schema(description = "二季度投资")
+    private BigDecimal twoInvest;
+
+    @Schema(description = "二季度已投资")
+    private BigDecimal twoInvestFinish;
+
+    @Schema(description = "二季度投资比例")
+    private BigDecimal twoInvestRatio;
+
+    @Schema(description = "二季度累计投资比例")
+    private BigDecimal twoAggregateRatio;
+
+    @Schema(description = "二季度投资是否填完")
+    private Integer isTwoInvestFinish;
+
+    @Schema(description = "三季度投资")
+    private BigDecimal threeInvest;
+
+    @Schema(description = "三季度已投资")
+    private BigDecimal threeInvestFinish;
+
+    @Schema(description = "三季度投资比例")
+    private BigDecimal threeInvestRatio;
+
+    @Schema(description = "三季度累计投资比例")
+    private BigDecimal threeAggregateRatio;
+
+    @Schema(description = "三季度投资是否填完")
+    private Integer isThreeInvestFinish;
+
+    @Schema(description = "四季度投资")
+    private BigDecimal fourInvest;
+
+    @Schema(description = "四季度已投资")
+    private BigDecimal fourInvestFinish;
+
+    @Schema(description = "四季度投资比例")
+    private BigDecimal fourInvestRatio;
+
+    @Schema(description = "四季度累计投资比例")
+    private BigDecimal fourAggregateRatio;
+
+    @Schema(description = "四季度投资是否填完")
+    private Integer isFourInvestFinish;
+
+    @Schema(description = "一季度计划")
+    private String onePlan;
+
+    @Schema(description = "一季度计划完成比例")
+    private BigDecimal onePlanRatio;
+
+    @Schema(description = "一季度计划是否填完")
+    private Integer isOnePlanFinish;
+
+    @Schema(description = "二季度计划")
+    private String twoPlan;
+
+    @Schema(description = "二季度计划完成比例")
+    private BigDecimal twoPlanRatio;
+
+    @Schema(description = "二季度计划是否填完")
+    private Integer isTwoPlanFinish;
+
+    @Schema(description = "三季度计划")
+    private String threePlan;
+
+    @Schema(description = "三季度计划完成比例")
+    private BigDecimal threePlanRatio;
+
+    @Schema(description = "三季度计划是否填完")
+    private Integer isThreePlanFinish;
+
+    @Schema(description = "四季度计划")
+    private String fourPlan;
+
+    @Schema(description = "四季度计划完成比例")
+    private BigDecimal fourPlanRatio;
+
+    @Schema(description = "四季度计划是否填完")
+    private Integer isFourPlanFinish;
+
+    @Schema(description = "该年累计完成投资")
+    private BigDecimal yearFinishInvest;
+
+    @Schema(description = "该年累计未完成投资")
+    private BigDecimal yearUnfinishedInvest;
+
+    @Schema(description = "存在问题")
+    private String questionable;
+
+    @Schema(description = "工作建议")
+    private String workAdvise;
+
+    @Schema(description = "填报单位")
+    private String writeUnit;
+
+    @Schema(description = "联系人")
+    private String linkman;
+
+
+}

+ 55 - 0
src/main/java/org/springblade/modules/project/pojo/entity/ProjectPlanProgress.java

@@ -0,0 +1,55 @@
+package org.springblade.modules.project.pojo.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.math.BigDecimal;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2024/4/8 11:28
+ **/
+
+@Data
+@TableName("d_project_plan_progress")
+@EqualsAndHashCode(callSuper = true)
+@Schema(description = "项目投资与计划完成情况表")
+public class ProjectPlanProgress extends BaseEntity {
+
+    @Schema(description = "项目id")
+    private Long projectId;
+
+    @Schema(description = "项目投资与计划表id")
+    private Long investPlanId;
+
+    @Schema(description = "计划年份")
+    private Integer planYear;
+
+    @Schema(description = "计划季度")
+    private Integer planQuarter;
+
+    @Schema(description = "计划月份")
+    private Integer planMonth;
+
+    @Schema(description = "投资完成")
+    private BigDecimal investMoney;
+
+    @Schema(description = "累计投资完成")
+    private BigDecimal investMoneyAll;
+
+    @Schema(description = "工作进展情况")
+    private String workProgress;
+
+    @Schema(description = "累计进展情况")
+    private String workProgressAll;
+
+    @Schema(description = "进度百分比")
+    private BigDecimal planRatio;
+
+    @Schema(description = "填充字段数")
+    private Integer fillField;
+}

+ 33 - 0
src/main/java/org/springblade/modules/project/pojo/vo/ProjectAndPlanDetailVO.java

@@ -0,0 +1,33 @@
+package org.springblade.modules.project.pojo.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.modules.project.pojo.entity.ProjectInfo;
+import org.springblade.modules.project.pojo.entity.ProjectInvestPlan;
+
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2024/4/8 11:45
+ **/
+@Data
+@Schema(description = "项目详情和计划详情")
+@EqualsAndHashCode(callSuper = true)
+public class ProjectAndPlanDetailVO extends ProjectInfo {
+
+    @Schema(description = "项目阶段名称")
+    private String projectStageName;
+
+    @Schema(description = "项目类型名称")
+    private String projectTypeName;
+
+    @Schema(description = "建设规模名称")
+    private String buildScaleName;
+
+    @Schema(description = "年计划和每月详情")
+    private List<ProjectInvestPlanVO> list;
+
+}

+ 24 - 0
src/main/java/org/springblade/modules/project/pojo/vo/ProjectInfoDetailVO.java

@@ -0,0 +1,24 @@
+package org.springblade.modules.project.pojo.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.modules.project.pojo.entity.ProjectInfo;
+import org.springblade.modules.project.pojo.entity.ProjectInvestPlan;
+
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2024/4/8 11:45
+ **/
+@Data
+@Schema(description = "项目详情")
+@EqualsAndHashCode(callSuper = true)
+public class ProjectInfoDetailVO extends ProjectInfo {
+
+    @Schema(description = "每年计划集合")
+    private List<ProjectInvestPlan> list;
+
+}

+ 45 - 1
src/main/java/org/springblade/modules/project/pojo/vo/ProjectInfoVO.java

@@ -1,9 +1,53 @@
 package org.springblade.modules.project.pojo.vo;
 
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.modules.project.pojo.entity.ProjectInfo;
+
+import java.math.BigDecimal;
+
 /**
  * @Param
  * @Author wangwl
  * @Date 2024/4/8 11:45
  **/
-public class ProjectInfoVO {
+@Data
+@Schema(description = "项目分页")
+@EqualsAndHashCode(callSuper = true)
+public class ProjectInfoVO extends ProjectInfo {
+
+    @Schema(description = "项目阶段名称")
+    private String projectStageName;
+
+    @Schema(description = "项目类型名称")
+    private String projectTypeName;
+
+    @Schema(description = "建设规模名称")
+    private String buildScaleName;
+
+    @Schema(description = "是否重点项目名称")
+    private String isFocusProjectName;
+
+    @Schema(description = "是否试点任务名称")
+    private String isPilotPlanName;
+
+    @Schema(description = "完成投资金额")
+    private BigDecimal finishedInvestMoney;
+
+    @Schema(description = "项目进展")
+    private BigDecimal Progress;
+
+    @Schema(description = "项目进展比例")
+    private BigDecimal progressRatio;
+
+    @Schema(description = "完成情况填写")
+    private BigDecimal finishedFill;
+
+    @Schema(description = "完成情况填写比例")
+    private BigDecimal finishedFillRatio;
+
+    @Schema(description = "项目已经设置计划的年个数")
+    private Integer hasPlanYearTotal;
+
 }

+ 89 - 0
src/main/java/org/springblade/modules/project/pojo/vo/ProjectInvestPlanVO.java

@@ -0,0 +1,89 @@
+package org.springblade.modules.project.pojo.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.modules.project.pojo.entity.ProjectInvestPlan;
+import org.springblade.modules.project.pojo.entity.ProjectPlanProgress;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2024/4/8 11:45
+ **/
+@Data
+@Schema(description = "年计划和每月详情")
+public class ProjectInvestPlanVO{
+    @Schema(description = "年计划id")
+    private Long id;
+
+    @Schema(description = "项目id")
+    private Long projectId;
+
+    @Schema(description = "计划年份")
+    private Integer planYear;
+
+    @Schema(description = "全年投资")
+    private BigDecimal yearlyInvest;
+
+    @Schema(description = "全年目标")
+    private String yearlyTarget;
+
+    @Schema(description = "是否有计划")
+    private Integer isPlan;
+
+    @Schema(description = "是否填写计划")
+    private Integer isFillPlan;
+
+    @Schema(description = "一季度投资")
+    private BigDecimal oneInvest;
+
+    @Schema(description = "二季度投资")
+    private BigDecimal twoInvest;
+
+    @Schema(description = "三季度投资")
+    private BigDecimal threeInvest;
+
+    @Schema(description = "四季度投资")
+    private BigDecimal fourInvest;
+
+    @Schema(description = "一季度计划")
+    private String onePlan;
+
+    @Schema(description = "二季度计划")
+    private String twoPlan;
+
+    @Schema(description = "三季度计划")
+    private String threePlan;
+
+    @Schema(description = "四季度计划")
+    private String fourPlan;
+
+    @Schema(description = "该年累计完成投资")
+    private BigDecimal yearFinishInvest;
+
+    @Schema(description = "该年累计未完成投资")
+    private BigDecimal yearUnfinishedInvest;
+
+    @Schema(description = "存在问题")
+    private String questionable;
+
+    @Schema(description = "工作建议")
+    private String workAdvise;
+
+    @Schema(description = "填报单位")
+    private String writeUnit;
+
+    @Schema(description = "联系人")
+    private String linkman;
+
+    @Schema(description = "是否可以填写0否1是")
+    private Integer isCanFill;
+
+    @Schema(description = "每月详情")
+    private List<ProjectPlanProgressVO> list;
+
+}

+ 35 - 0
src/main/java/org/springblade/modules/project/pojo/vo/ProjectPlanProgressVO.java

@@ -0,0 +1,35 @@
+package org.springblade.modules.project.pojo.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.modules.project.pojo.entity.ProjectInvestPlan;
+import org.springblade.modules.project.pojo.entity.ProjectPlanProgress;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2024/4/8 11:45
+ **/
+@Data
+@Schema(description = "每月详情")
+@EqualsAndHashCode(callSuper = true)
+public class ProjectPlanProgressVO extends ProjectPlanProgress {
+
+    @Schema(description = "计划季度名称")
+    private String planQuarterName;
+
+    @Schema(description = "计划月份名称")
+    private String planMonthName;
+
+    @Schema(description = "计划完成投资")
+    private BigDecimal PlanInvestMoney;
+
+    @Schema(description = "工作计划")
+    private String workPlan;
+
+
+}

+ 20 - 1
src/main/java/org/springblade/modules/project/service/IProjectInfoService.java

@@ -1,9 +1,28 @@
 package org.springblade.modules.project.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.core.mp.base.BaseService;
+import org.springblade.modules.project.pojo.dto.ProjectInfoDTO;
+import org.springblade.modules.project.pojo.dto.ProjectInfoPageDTO;
+import org.springblade.modules.project.pojo.entity.ProjectInfo;
+import org.springblade.modules.project.pojo.vo.ProjectAndPlanDetailVO;
+import org.springblade.modules.project.pojo.vo.ProjectInfoDetailVO;
+import org.springblade.modules.project.pojo.vo.ProjectInfoVO;
+
 /**
  * @Param
  * @Author wangwl
  * @Date 2024/4/8 11:59
  **/
-public interface IProjectInfoService {
+public interface IProjectInfoService extends BaseService<ProjectInfo> {
+    void add(ProjectInfoDTO dto);
+
+    IPage<ProjectInfoVO> page2(ProjectInfoPageDTO dto);
+
+    ProjectInfoDetailVO detail(Long id);
+
+    void update2(ProjectInfoDTO dto);
+
+    ProjectAndPlanDetailVO detail2(Long id);
 }

+ 15 - 0
src/main/java/org/springblade/modules/project/service/IProjectInvestPlanService.java

@@ -0,0 +1,15 @@
+package org.springblade.modules.project.service;
+
+import org.springblade.core.mp.base.BaseService;
+import org.springblade.modules.project.pojo.dto.ProjectInfoDTO;
+import org.springblade.modules.project.pojo.entity.ProjectInfo;
+import org.springblade.modules.project.pojo.entity.ProjectInvestPlan;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2024/4/8 11:59
+ **/
+public interface IProjectInvestPlanService extends BaseService<ProjectInvestPlan> {
+
+}

+ 14 - 0
src/main/java/org/springblade/modules/project/service/IProjectPlanProgressService.java

@@ -0,0 +1,14 @@
+package org.springblade.modules.project.service;
+
+import org.springblade.core.mp.base.BaseService;
+import org.springblade.modules.project.pojo.entity.ProjectInvestPlan;
+import org.springblade.modules.project.pojo.entity.ProjectPlanProgress;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2024/4/8 11:59
+ **/
+public interface IProjectPlanProgressService extends BaseService<ProjectPlanProgress> {
+
+}

+ 327 - 1
src/main/java/org/springblade/modules/project/service/impl/ProjectInfoServiceImpl.java

@@ -1,9 +1,335 @@
 package org.springblade.modules.project.service.impl;
 
+import cn.hutool.core.map.MapWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.modules.project.mapper.ProjectInfoMapper;
+import org.springblade.modules.project.pojo.dto.ProjectInfoDTO;
+import org.springblade.modules.project.pojo.dto.ProjectInfoPageDTO;
+import org.springblade.modules.project.pojo.entity.ProjectInfo;
+import org.springblade.modules.project.pojo.entity.ProjectInvestPlan;
+import org.springblade.modules.project.pojo.entity.ProjectPlanProgress;
+import org.springblade.modules.project.pojo.vo.*;
+import org.springblade.modules.project.service.IProjectInfoService;
+import org.springblade.modules.project.service.IProjectInvestPlanService;
+import org.springblade.modules.project.service.IProjectPlanProgressService;
+import org.springblade.modules.project.utils.ObjectUtils;
+import org.springblade.modules.project.utils.SnowFlakeUtil;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 /**
  * @Param
  * @Author wangwl
  * @Date 2024/4/8 12:01
  **/
-public class ProjectInfoServiceImpl {
+@Service
+@AllArgsConstructor
+public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, ProjectInfo> implements IProjectInfoService {
+
+    private final IProjectInvestPlanService investPlanService;
+
+    private final IProjectPlanProgressService planProgressService;
+
+    @Override
+    @Transactional
+    public void add(ProjectInfoDTO dto) {
+        //校验是否已经存在相同的项目名称
+        List<ProjectInfo> infos = this.list(new LambdaQueryWrapper<ProjectInfo>()
+                .eq(ProjectInfo::getName, dto.getName()));
+        if (infos.size() > 0){
+            throw new ServiceException("新增失败:项目名称已经存在");
+        }
+        //保存项目信息
+        ProjectInfo info = new ProjectInfo();
+        BeanUtils.copyProperties(dto,info);
+        info.setId(SnowFlakeUtil.getId());
+        this.save(info);
+        //保存计划信息
+        List<ProjectInvestPlan> list = dto.getList();
+        if (list == null || list.size() == 0){
+            return;
+        }
+        BigDecimal projectAll = BigDecimal.ZERO;
+        for (ProjectInvestPlan plan : list) {
+            Integer year = plan.getPlanYear();
+            plan.setPlanYear(null);
+            if (ObjectUtils.isAllFieldsNull(plan)){
+                plan.setIsPlan(0);
+            }else {
+                plan.setIsPlan(1);
+            }
+            plan.setPlanYear(year);
+            plan.setProjectId(info.getId());
+            //校验全年计划投资
+            BigDecimal all = BigDecimal.ZERO;
+            if (plan.getOneInvest() != null){
+                all = all.add(plan.getOneInvest());
+            }
+            if (plan.getOneInvest() != null){
+                all = all.add(plan.getTwoInvest());
+            }
+            if (plan.getOneInvest() != null){
+                all = all.add(plan.getThreeInvest());
+            }
+            if (plan.getOneInvest() != null){
+                all = all.add(plan.getFourInvest());
+            }
+            if ((plan.getYearlyInvest() == null && !all.equals(BigDecimal.ZERO)) || (plan.getYearlyInvest() != null && !all.equals(plan.getYearlyInvest()))){
+                throw new ServiceException(plan.getPlanYear()+"年全年计划投资与每季度总和不对");
+            }
+            projectAll.add(all);
+        }
+        if ((info.getAllInvestMoney() == null && !projectAll.equals(BigDecimal.ZERO) || (info.getAllInvestMoney() != null && !info.getAllInvestMoney().equals(projectAll)) )){
+            throw new ServiceException("所有年计划投资之和不等于总投资,请修改后重新保存");
+        }
+        investPlanService.saveBatch(list);
+    }
+
+    @Override
+    public IPage<ProjectInfoVO> page2(ProjectInfoPageDTO dto) {
+        IPage<ProjectInfoVO> page = new Page<>(dto.getCurrent(),dto.getSize());
+        IPage<ProjectInfoVO> iPage = baseMapper.page(page, dto);
+        List<ProjectInfoVO> records = iPage.getRecords();
+        if (records != null && records.size() != 0){
+            for (ProjectInfoVO vo : records) {
+                Integer total = vo.getHasPlanYearTotal();
+                if (total == 0){
+                    continue;
+                }
+                BigDecimal totalMonth = new BigDecimal(total).multiply(new BigDecimal("1200"));
+                BigDecimal totalField = new BigDecimal(total).multiply(new BigDecimal("4800"));
+                //项目进展比例
+                if (vo.getProgress() != null){
+                    vo.setProgressRatio(vo.getProgress().divide(totalMonth,2, RoundingMode.UP));
+                }
+                //完成情况填写比例
+                if (vo.getFinishedFill() != null && !vo.getFinishedFill().equals(BigDecimal.ZERO)){
+                    vo.setFinishedFillRatio(vo.getFinishedFill().divide(totalField,2, RoundingMode.UP));
+                }
+            }
+        }
+        return iPage;
+    }
+
+    @Override
+    public ProjectInfoDetailVO detail(Long id) {
+        //获取项目详情
+        ProjectInfoDetailVO vo = baseMapper.detail(id);
+        //获取计划详情
+        List<ProjectInvestPlan> planList = investPlanService.list(new LambdaQueryWrapper<ProjectInvestPlan>()
+                .eq(ProjectInvestPlan::getProjectId, id)
+                .orderByAsc(ProjectInvestPlan::getPlanYear));
+        vo.setList(planList);
+        return vo;
+    }
+
+    @Override
+    @Transactional
+    public void update2(ProjectInfoDTO dto) {
+        ProjectInfo oldInfo = this.getById(dto.getId());
+        if (oldInfo.getStartYear() != null){
+            if (oldInfo.getStartYear() != dto.getStartYear() || oldInfo.getEndYear() != dto.getEndYear()){
+                throw new ServiceException("不能修改年份");
+            }
+        }
+        //修改项目信息
+        ProjectInfo info = new ProjectInfo();
+        BeanUtils.copyProperties(dto,info);
+        info.setId(SnowFlakeUtil.getId());
+        this.updateById(info);
+        //修改计划信息,先校验年份是否改变
+        List<ProjectInvestPlan> list = dto.getList();
+        if (list == null || list.size() == 0){
+            return;
+        }
+        for (ProjectInvestPlan plan : list) {
+            //校验全年计划投资
+            BigDecimal all = BigDecimal.ZERO;
+            if (plan.getOneInvest() != null){
+                all = all.add(plan.getOneInvest());
+            }
+            if (plan.getOneInvest() != null){
+                all = all.add(plan.getTwoInvest());
+            }
+            if (plan.getOneInvest() != null){
+                all = all.add(plan.getThreeInvest());
+            }
+            if (plan.getOneInvest() != null){
+                all = all.add(plan.getFourInvest());
+            }
+            if ((plan.getYearlyInvest() == null && !all.equals(BigDecimal.ZERO)) || (plan.getYearlyInvest() != null && !all.equals(plan.getYearlyInvest()))){
+                throw new ServiceException(plan.getPlanYear()+"年全年计划投资与每季度总和不对");
+            }
+            if (plan.getYearlyInvest() != null || StringUtils.isNotBlank(plan.getYearlyTarget()) || StringUtils.isNotBlank(plan.getOnePlan())
+                || StringUtils.isNotBlank(plan.getTwoPlan()) || StringUtils.isNotBlank(plan.getThreePlan()) || StringUtils.isNotBlank(plan.getFourPlan())){
+                plan.setIsPlan(1);
+            }else {
+                plan.setIsPlan(0);
+            }
+
+            //如果已经有完成情况,则更新每个月投资情况
+            if (plan.getIsFillPlan() == 1){
+                BigDecimal invest = BigDecimal.ZERO;
+                BigDecimal investFinish = BigDecimal.ZERO;
+                //校验一月已有投资,则不能删除或改为0
+                if (plan.getOneInvest() != null){
+                    invest = invest.add(plan.getOneInvest());
+                }
+                if (plan.getOneInvestFinish() != null){
+                    investFinish = investFinish.add(plan.getOneInvestFinish());
+                }
+                if (plan.getOneInvestFinish() != null && (plan.getOneInvest() == null || plan.getOneInvest().equals(BigDecimal.ZERO))){
+                    throw new ServiceException(plan.getPlanYear()+"年一月已有投资金额,不能修改为0");
+                }
+                if (plan.getIsOnePlanFinish() == 1){
+                    plan.setOneInvestRatio(plan.getOneInvestFinish().divide(plan.getOneInvestFinish(),4, RoundingMode.DOWN).multiply(new BigDecimal(100)).setScale(2));
+                }
+
+                //校验二月已有投资,则不能删除或改为0
+                if (plan.getTwoInvest() != null){
+                    invest = invest.add(plan.getTwoInvest());
+                }
+                if (plan.getTwoInvestFinish() != null){
+                    investFinish = investFinish.add(plan.getTwoInvestFinish());
+                }
+                if (plan.getTwoInvestFinish() != null && (plan.getTwoInvest() == null || plan.getTwoInvest().equals(BigDecimal.ZERO))){
+                    throw new ServiceException(plan.getPlanYear()+"年一月已有投资金额,不能修改为0");
+                }
+                if (plan.getIsTwoPlanFinish() == 1){
+                    plan.setTwoInvestRatio(plan.getTwoInvestFinish().divide(plan.getTwoInvestFinish(),4, RoundingMode.DOWN).multiply(new BigDecimal(100)).setScale(2));
+                    plan.setTwoAggregateRatio(investFinish.divide(invest,4, RoundingMode.DOWN).multiply(new BigDecimal(100)).setScale(2));
+                }
+
+                //校验三月已有投资,则不能删除或改为0
+                if (plan.getThreeInvestFinish() != null && (plan.getThreeInvest() == null || plan.getThreeInvest().equals(BigDecimal.ZERO))){
+                    throw new ServiceException(plan.getPlanYear()+"年一月已有投资金额,不能修改为0");
+                }
+                if (plan.getIsThreePlanFinish() == 1){
+                    plan.setThreeInvestRatio(plan.getThreeInvestFinish().divide(plan.getThreeInvestFinish(),4, RoundingMode.DOWN).multiply(new BigDecimal(100)).setScale(2));
+                    plan.setThreeAggregateRatio(investFinish.divide(invest,4, RoundingMode.DOWN).multiply(new BigDecimal(100)).setScale(2));
+                }
+
+                //校验四月已有投资,则不能删除或改为0
+                if (plan.getFourInvestFinish() != null && (plan.getFourInvest() == null || plan.getFourInvest().equals(BigDecimal.ZERO))){
+                    throw new ServiceException(plan.getPlanYear()+"年一月已有投资金额,不能修改为0");
+                }
+                if (plan.getIsFourPlanFinish() == 1){
+                    plan.setFourInvestRatio(plan.getFourInvestFinish().divide(plan.getFourInvestFinish(),4, RoundingMode.DOWN).multiply(new BigDecimal(100)).setScale(2));
+                    plan.setFourAggregateRatio(investFinish.divide(invest,4, RoundingMode.DOWN).multiply(new BigDecimal(100)).setScale(2));
+                }
+            }
+        }
+        investPlanService.updateBatchById(list);
+
+    }
+
+    @Override
+    public ProjectAndPlanDetailVO detail2(Long id) {
+        //项目详情
+        ProjectAndPlanDetailVO vo = baseMapper.detail2(id);
+        if (vo.getBuildScaleUnit() == 1){
+            vo.setBuildScaleName(vo.getBuildScale()+"(公里)");
+        }else {
+            vo.setBuildScaleName(vo.getBuildScale());
+        }
+        //获取所有-有计划的年
+        List<ProjectInvestPlanVO> planList = baseMapper.getAllPlanByProjectId(id);
+        if (planList.size() == 0){
+            return vo;
+        }
+        //获取所有填写的完成情况
+        List<ProjectPlanProgressVO> list = baseMapper.getAllProgressByProjectId(id);
+
+        Boolean isPlanDetail = false;
+        Map<Long, List<ProjectPlanProgressVO>> listMap = new HashMap<>();
+        if (list.size() != 0){
+            isPlanDetail = true;
+            listMap = list.stream().collect(Collectors.groupingBy(ProjectPlanProgressVO::getInvestPlanId));
+        }
+        String[] monthNames = {"","1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"};
+        //循环年,设置完成情况
+        for (ProjectInvestPlanVO planVO : planList) {
+            //校验是否允许填写,未设置计划和超过今年的不允许填写
+            if (planVO.getIsPlan() == 0 || planVO.getPlanYear() > LocalDate.now().getYear()){
+                planVO.setIsCanFill(0);
+                continue;
+            }
+            planVO.setIsCanFill(1);
+            //如果没有填写过完成情况,则创建构建完成情况信息
+            List<ProjectPlanProgressVO> progresses = new ArrayList<>();
+            if (planVO.getIsFillPlan() == 0){
+                for (int i = 1; i <= 12; i++) {
+                    ProjectPlanProgressVO progress = new ProjectPlanProgressVO();
+                    progress.setProjectId(id);
+                    progress.setInvestPlanId(planVO.getId());
+                    progress.setPlanYear(planVO.getPlanYear());
+                    progress.setPlanMonth(i);
+                    progress.setPlanMonthName(monthNames[i]);
+                    if (i <= 3){
+                        progress.setPlanQuarter(1);
+                        progress.setPlanQuarterName("一季度");
+                        progress.setPlanInvestMoney(planVO.getOneInvest());
+                        progress.setWorkPlan(planVO.getOnePlan());
+                    }else if (i <= 6){
+                        progress.setPlanQuarter(2);
+                        progress.setPlanQuarterName("二季度");
+                        progress.setPlanInvestMoney(planVO.getTwoInvest());
+                        progress.setWorkPlan(planVO.getTwoPlan());
+                    }else if (i <= 9){
+                        progress.setPlanQuarter(3);
+                        progress.setPlanQuarterName("三季度");
+                        progress.setPlanInvestMoney(planVO.getThreeInvest());
+                        progress.setWorkPlan(planVO.getThreePlan());
+                    }else {
+                        progress.setPlanQuarter(4);
+                        progress.setPlanQuarterName("四季度");
+                        progress.setPlanInvestMoney(planVO.getFourInvest());
+                        progress.setWorkPlan(planVO.getFourPlan());
+                    }
+                    progresses.add(progress);
+                }
+            }else {
+                List<ProjectPlanProgressVO> vos = listMap.get(planVO.getId());
+                if (isPlanDetail || vos == null || vos.size() == 0){
+                    throw new ServiceException("数据错误,请联系管理员");
+                }
+                for (ProjectPlanProgressVO progress : vos) {
+                    Integer i = progress.getPlanMonth();
+                    if (i <= 3){
+                        progress.setPlanInvestMoney(planVO.getOneInvest());
+                        progress.setWorkPlan(planVO.getOnePlan());
+                    }else if (i <= 6){
+                        progress.setPlanInvestMoney(planVO.getTwoInvest());
+                        progress.setWorkPlan(planVO.getTwoPlan());
+                    }else if (i <= 9){
+                        progress.setPlanInvestMoney(planVO.getThreeInvest());
+                        progress.setWorkPlan(planVO.getThreePlan());
+                    }else {
+                        progress.setPlanInvestMoney(planVO.getFourInvest());
+                        progress.setWorkPlan(planVO.getFourPlan());
+                    }
+                }
+                progresses = vos;
+            }
+            planVO.setList(progresses);
+        }
+        vo.setList(planList);
+        return vo;
+    }
 }

+ 28 - 0
src/main/java/org/springblade/modules/project/service/impl/ProjectInvestPlanServiceImpl.java

@@ -0,0 +1,28 @@
+package org.springblade.modules.project.service.impl;
+
+import lombok.AllArgsConstructor;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.modules.project.mapper.ProjectInfoMapper;
+import org.springblade.modules.project.mapper.ProjectInvestPlanMapper;
+import org.springblade.modules.project.pojo.dto.ProjectInfoDTO;
+import org.springblade.modules.project.pojo.entity.ProjectInfo;
+import org.springblade.modules.project.pojo.entity.ProjectInvestPlan;
+import org.springblade.modules.project.service.IProjectInfoService;
+import org.springblade.modules.project.service.IProjectInvestPlanService;
+import org.springblade.modules.project.utils.ObjectUtils;
+import org.springblade.modules.project.utils.SnowFlakeUtil;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2024/4/8 12:01
+ **/
+@Service
+@AllArgsConstructor
+public class ProjectInvestPlanServiceImpl extends BaseServiceImpl<ProjectInvestPlanMapper, ProjectInvestPlan> implements IProjectInvestPlanService {
+}

+ 41 - 0
src/main/java/org/springblade/modules/project/service/impl/ProjectPlanProgressServiceImpl.java

@@ -0,0 +1,41 @@
+package org.springblade.modules.project.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.modules.project.mapper.ProjectInfoMapper;
+import org.springblade.modules.project.mapper.ProjectPlanProgressMapper;
+import org.springblade.modules.project.pojo.dto.ProjectInfoDTO;
+import org.springblade.modules.project.pojo.dto.ProjectInfoPageDTO;
+import org.springblade.modules.project.pojo.entity.ProjectInfo;
+import org.springblade.modules.project.pojo.entity.ProjectInvestPlan;
+import org.springblade.modules.project.pojo.entity.ProjectPlanProgress;
+import org.springblade.modules.project.pojo.vo.ProjectAndPlanDetailVO;
+import org.springblade.modules.project.pojo.vo.ProjectInfoDetailVO;
+import org.springblade.modules.project.pojo.vo.ProjectInfoVO;
+import org.springblade.modules.project.service.IProjectInfoService;
+import org.springblade.modules.project.service.IProjectInvestPlanService;
+import org.springblade.modules.project.service.IProjectPlanProgressService;
+import org.springblade.modules.project.utils.ObjectUtils;
+import org.springblade.modules.project.utils.SnowFlakeUtil;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2024/4/8 12:01
+ **/
+@Service
+@AllArgsConstructor
+public class ProjectPlanProgressServiceImpl extends BaseServiceImpl<ProjectPlanProgressMapper, ProjectPlanProgress> implements IProjectPlanProgressService {
+
+}

+ 38 - 0
src/main/java/org/springblade/modules/project/utils/ObjectUtils.java

@@ -0,0 +1,38 @@
+package org.springblade.modules.project.utils;
+
+import java.lang.reflect.Field;
+
+public class ObjectUtils {
+
+    /**
+     * 判断指定对象的所有字段是否都为null。
+     *
+     * @param obj 需要检查的对象
+     * @return 如果所有字段都为null,则返回true;否则返回false
+     */
+    public static boolean isAllFieldsNull(Object obj) {
+        if (obj == null) {
+            throw new IllegalArgumentException("The input object cannot be null");
+        }
+
+        Class<?> clazz = obj.getClass();
+        Field[] fields = clazz.getDeclaredFields();
+
+        for (Field field : fields) {
+            field.setAccessible(true); // 允许访问私有字段
+
+            try {
+                Object fieldValue = field.get(obj);
+                if (fieldValue != null) {
+                    // 只要发现有一个非null字段,就立即返回false
+                    return false;
+                }
+            } catch (IllegalAccessException e) {
+                throw new RuntimeException("Failed to access field: " + field.getName(), e);
+            }
+        }
+
+        // 所有字段都检查完毕且均为null,返回true
+        return true;
+    }
+}

+ 47 - 0
src/main/java/org/springblade/modules/project/utils/SnowFlakeUtil.java

@@ -0,0 +1,47 @@
+package org.springblade.modules.project.utils;
+
+import cn.hutool.core.lang.Snowflake;
+import cn.hutool.core.util.IdUtil;
+
+public class SnowFlakeUtil {
+    private long machineId;
+    private long dataCenterId;
+
+
+    public SnowFlakeUtil(long machineId, long dataCenterId) {
+        this.machineId = machineId;
+        this.dataCenterId = dataCenterId;
+    }
+
+    /**
+     * 成员类,SnowFlakeUtil的实例对象的保存域
+     */
+    private static class IdGenHolder {
+        private static final SnowFlakeUtil instance = new SnowFlakeUtil();
+    }
+
+    /**
+     * 外部调用获取SnowFlakeUtil的实例对象,确保不可变
+     */
+    public static SnowFlakeUtil get() {
+        return IdGenHolder.instance;
+    }
+
+    /**
+     * 初始化构造,无参构造有参函数,默认节点都是0
+     */
+    public SnowFlakeUtil() {
+        this(0L, 0L);
+    }
+
+    private Snowflake snowflake = IdUtil.createSnowflake(machineId, dataCenterId);
+
+    public synchronized long id() {
+        return snowflake.nextId();
+    }
+
+    public static Long getId() {
+        return SnowFlakeUtil.get().id();
+    }
+
+}

+ 1 - 1
src/main/java/org/springblade/modules/system/pojo/dto/DictBizDTO.java

@@ -15,7 +15,7 @@ import java.util.List;
 public class DictBizDTO {
 
     @Schema(description = "1项目阶段2项目类型3要点分工")
-    private Integer type;
+    private String type;
 
     @Schema(description = "字典集合")
     private List<String> list;

+ 6 - 6
src/main/java/org/springblade/modules/system/service/impl/DictBizServiceImpl.java

@@ -29,6 +29,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
 import org.springblade.common.cache.DictBizCache;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.core.cache.utils.CacheUtil;
@@ -130,14 +131,13 @@ public class DictBizServiceImpl extends ServiceImpl<DictBizMapper, DictBiz> impl
 
 	@Override
 	public void saveDict(DictBizDTO dto) {
-		Integer type = dto.getType();
-		if (type == null){
+		String type = dto.getType();
+		if (StringUtils.isBlank(type)){
 			throw new ServiceException("请传入类型");
 		}
-		//获取字典名称,直接清空对应字典数据
-		String dictName = type == 1 ? "projectStage" :  (type == 2 ? "projectType" : "workFocusStage");
+		//直接清空对应字典数据
 		this.remove(new LambdaQueryWrapper<DictBiz>()
-			.eq(DictBiz::getDictKey,dictName));
+			.eq(DictBiz::getCode,type));
 		//如果数组没有值,则直接跳过
 		List<String> list = dto.getList();
 		if (list == null || list.size() == 0){
@@ -148,7 +148,7 @@ public class DictBizServiceImpl extends ServiceImpl<DictBizMapper, DictBiz> impl
 		for (String s : list) {
 			DictBiz biz = new DictBiz();
 			biz.setParentId(1L);
-			biz.setCode(dictName);
+			biz.setCode(type);
 			biz.setDictKey(i+"");
 			biz.setDictValue(s);
 			biz.setSort(i++);