qianxb hai 1 ano
pai
achega
3631bfc2e3

+ 25 - 7
src/main/java/org/springblade/modules/project/controller/ProjectInfoController.java

@@ -8,12 +8,11 @@ import lombok.AllArgsConstructor;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.tenant.annotation.NonDS;
 import org.springblade.core.tool.api.R;
+import org.springblade.modules.project.pojo.dto.DataStatDTO;
 import org.springblade.modules.project.pojo.dto.ProjectAndPlanDetailDTO;
 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.pojo.vo.*;
 import org.springblade.modules.project.service.IProjectInfoService;
 import org.springframework.web.bind.annotation.*;
 
@@ -78,13 +77,32 @@ public class ProjectInfoController extends BladeController {
         return R.success("修改成功");
     }
 
-    @GetMapping("/delete")
+    @PostMapping("/delete")
     @ApiOperationSupport(order = 7)
-    @Operation(summary = "项目删除", description = "传入项目id")
-    public R<String> delete(Long id) {
-        projectInfoService.delete(id);
+    @Operation(summary = "项目删除", description = "传入项目id拼接字符串")
+    public R<String> delete(@RequestBody ProjectInfoPageDTO dto) {
+        projectInfoService.delete(dto);
         return R.success("删除成功");
     }
 
+    @GetMapping("/data-project-stat")
+    @ApiOperationSupport(order = 7)
+    @Operation(summary = "数据看板-项目统计", description = "传入搜索条件")
+    public R<DataProjectStatVO> dataProjectStat(DataStatDTO dto) {
+        DataProjectStatVO vo = projectInfoService.dataProjectStat(dto);
+        return R.data(vo);
+    }
+
+    @GetMapping("/data-invest-stat")
+    @ApiOperationSupport(order = 7)
+    @Operation(summary = "数据看板-投资数据", description = "传入搜索条件")
+    public R<DataInvestStatVO> dataInvestStat(DataStatDTO dto) {
+        DataInvestStatVO vo = projectInfoService.dataInvestStat(dto);
+        return R.data(vo);
+    }
+
+
+
+
 
 }

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

@@ -28,6 +28,7 @@ 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.DataStatDTO;
 import org.springblade.modules.project.pojo.dto.ProjectInfoPageDTO;
 import org.springblade.modules.project.pojo.entity.ProjectInfo;
 import org.springblade.modules.project.pojo.vo.*;
@@ -51,4 +52,6 @@ public interface ProjectInfoMapper extends BaseMapper<ProjectInfo> {
     List<ProjectPlanProgressVO> getAllProgressByProjectId(@Param("id") Long id);
 
     IPage<ProjectInfoVO> page(IPage<ProjectInfoVO> page,@Param("dto") ProjectInfoPageDTO dto);
+
+    List<DataProjectStatVO2> dataProjectStat(@Param("dto") DataStatDTO dto);
 }

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

@@ -51,5 +51,16 @@
         </if>
 
     </select>
+    <select id="dataProjectStat" resultType="org.springblade.modules.project.pojo.vo.DataProjectStatVO2">
+        select id
+        from d_project_info dpi
+        where is_deleted = 0 and #{dto.year} between start_year and end_year
+        <if test="dto.projectStage != null ">
+            and project_stage = #{dto.projectStage}
+        </if>
+        <if test="dto.projectType != null ">
+            and project_type = #{dto.projectType}
+        </if>
+    </select>
 
 </mapper>

+ 31 - 0
src/main/java/org/springblade/modules/project/pojo/dto/DataStatDTO.java

@@ -0,0 +1,31 @@
+package org.springblade.modules.project.pojo.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2024/4/10 17:36
+ **/
+@Data
+@Schema(description = "数据看板DTO")
+public class DataStatDTO {
+
+    @Schema(description = "年")
+    private Integer year;
+
+    @Schema(description = "月")
+    private Integer month;
+
+    @Schema(description = "项目进度类型1常规2超进度3滞后")
+    private Integer projectScheduleType;
+
+    @Schema(description = "项目阶段")
+    private Integer projectStage;
+
+    @Schema(description = "项目类型")
+    private Integer projectType;
+}

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

@@ -39,4 +39,8 @@ public class ProjectInfoPageDTO {
     @Schema(description = "项目类型")
     private Integer projectType;
 
+    @Schema(description = "删除使用")
+    private String ids;
+
+
 }

+ 37 - 0
src/main/java/org/springblade/modules/project/pojo/vo/DataInvestStatVO.java

@@ -0,0 +1,37 @@
+package org.springblade.modules.project.pojo.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2024/4/10 17:44
+ **/
+@Data
+@Schema(description = "数据看板-投资统计返回视图")
+public class DataInvestStatVO {
+
+    @Schema(description = "项目总量")
+    private Integer projectTotal;
+
+    @Schema(description = "计划总投资")
+    private BigDecimal planAllMoney;
+
+    @Schema(description = "目前实际完成投资")
+    private BigDecimal currentMoney;
+
+    @Schema(description = "投资完成比例")
+    private BigDecimal investRatio;
+
+    @Schema(description = "常规项目")
+    private Integer total1;
+
+    @Schema(description = "超进度项目")
+    private Integer total2;
+
+    @Schema(description = "滞后项目")
+    private Integer total3;
+}

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

@@ -0,0 +1,33 @@
+package org.springblade.modules.project.pojo.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springblade.modules.project.pojo.entity.ProjectInvestPlan;
+
+import java.math.BigDecimal;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2024/4/10 17:44
+ **/
+@Data
+@Schema(description = "数据看板-投资统计计算用VO")
+public class DataInvestStatVO2 {
+
+    @Schema(description = "项目id")
+    private Long id;
+
+    @Schema(description = "计划总投资")
+    private BigDecimal planAllMoney;
+
+    @Schema(description = "目前实际完成投资")
+    private BigDecimal currentMoney;
+
+    @Schema(description = "项目进度类型")
+    private Integer scheduleType;
+
+    @Schema(description = "当年计划")
+    private ProjectInvestPlan investPlan;
+
+}

+ 37 - 0
src/main/java/org/springblade/modules/project/pojo/vo/DataProjectStatVO.java

@@ -0,0 +1,37 @@
+package org.springblade.modules.project.pojo.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2024/4/10 17:44
+ **/
+@Data
+@Schema(description = "数据看板-项目统计返回视图")
+public class DataProjectStatVO {
+
+    @Schema(description = "项目总量")
+    private Integer projectTotal;
+
+    @Schema(description = "计划总投资")
+    private BigDecimal planAllMoney;
+
+    @Schema(description = "目前实际完成投资")
+    private BigDecimal currentMoney;
+
+    @Schema(description = "投资完成比例")
+    private BigDecimal investRatio;
+
+    @Schema(description = "常规项目")
+    private Integer total1;
+
+    @Schema(description = "超进度项目")
+    private Integer total2;
+
+    @Schema(description = "滞后项目")
+    private Integer total3;
+}

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

@@ -0,0 +1,33 @@
+package org.springblade.modules.project.pojo.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springblade.modules.project.pojo.entity.ProjectInvestPlan;
+
+import java.math.BigDecimal;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2024/4/10 17:44
+ **/
+@Data
+@Schema(description = "数据看板-项目统计计算用VO")
+public class DataProjectStatVO2 {
+
+    @Schema(description = "项目id")
+    private Long id;
+
+    @Schema(description = "计划总投资")
+    private BigDecimal planAllMoney;
+
+    @Schema(description = "目前实际完成投资")
+    private BigDecimal currentMoney;
+
+    @Schema(description = "项目进度类型")
+    private Integer scheduleType;
+
+    @Schema(description = "当年计划")
+    private ProjectInvestPlan investPlan;
+
+}

+ 7 - 4
src/main/java/org/springblade/modules/project/service/IProjectInfoService.java

@@ -3,13 +3,12 @@ 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.DataStatDTO;
 import org.springblade.modules.project.pojo.dto.ProjectAndPlanDetailDTO;
 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;
+import org.springblade.modules.project.pojo.vo.*;
 
 /**
  * @Param
@@ -29,5 +28,9 @@ public interface IProjectInfoService extends BaseService<ProjectInfo> {
 
     void updateFinished(ProjectAndPlanDetailDTO dto);
 
-    void delete(Long id);
+    void delete(ProjectInfoPageDTO dto);
+
+    DataProjectStatVO dataProjectStat(DataStatDTO dto);
+
+    DataInvestStatVO dataInvestStat(DataStatDTO dto);
 }

+ 104 - 10
src/main/java/org/springblade/modules/project/service/impl/ProjectInfoServiceImpl.java

@@ -9,11 +9,9 @@ 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.core.tool.utils.Func;
 import org.springblade.modules.project.mapper.ProjectInfoMapper;
-import org.springblade.modules.project.pojo.dto.ProjectAndPlanDetailDTO;
-import org.springblade.modules.project.pojo.dto.ProjectInfoDTO;
-import org.springblade.modules.project.pojo.dto.ProjectInfoPageDTO;
-import org.springblade.modules.project.pojo.dto.ProjectInvestPlanDTO;
+import org.springblade.modules.project.pojo.dto.*;
 import org.springblade.modules.project.pojo.entity.ProjectInfo;
 import org.springblade.modules.project.pojo.entity.ProjectInvestPlan;
 import org.springblade.modules.project.pojo.entity.ProjectPlanProgress;
@@ -624,11 +622,107 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, P
 
     @Override
     @Transactional
-    public void delete(Long id) {
-        this.removeById(id);
-        investPlanService.remove(new LambdaQueryWrapper<ProjectInvestPlan>()
-                .eq(ProjectInvestPlan::getProjectId,id));
-        planProgressService.remove(new LambdaQueryWrapper<ProjectPlanProgress>()
-                .eq(ProjectPlanProgress::getProjectId,id));
+    public void delete(ProjectInfoPageDTO dto) {
+        String ids = dto.getIds();
+        if (StringUtils.isBlank(ids)){
+            throw new ServiceException("请选择");
+        }
+        List<Long> longs = Func.toLongList(ids);
+        for (Long id : longs) {
+            this.removeById(id);
+            investPlanService.remove(new LambdaQueryWrapper<ProjectInvestPlan>()
+                    .eq(ProjectInvestPlan::getProjectId,id));
+            planProgressService.remove(new LambdaQueryWrapper<ProjectPlanProgress>()
+                    .eq(ProjectPlanProgress::getProjectId,id));
+        }
+    }
+
+    @Override
+    public DataProjectStatVO dataProjectStat(DataStatDTO dto) {
+        Integer year = dto.getYear();
+        if (year == null){
+            throw new ServiceException("请选择年");
+        }
+        DataProjectStatVO vo = new DataProjectStatVO();
+        vo.setProjectTotal(0);
+        vo.setCurrentMoney(BigDecimal.ZERO);
+        vo.setInvestRatio(BigDecimal.ZERO);
+        vo.setPlanAllMoney(BigDecimal.ZERO);
+        vo.setTotal1(0);
+        vo.setTotal2(0);
+        vo.setTotal3(0);
+        List<DataProjectStatVO2> vo2s = baseMapper.dataProjectStat(dto);
+        if (vo2s.size() == 0){
+            return vo;
+        }
+        List<ProjectInvestPlan> planList = investPlanService.list(new LambdaQueryWrapper<ProjectInvestPlan>()
+                .eq(ProjectInvestPlan::getPlanYear, year)
+                .in(ProjectInvestPlan::getProjectId, vo2s.stream().map(l -> l.getId()).collect(Collectors.toList())));
+        if (vo2s.size() != planList.size()){
+            throw new ServiceException("项目数据错误,请联系管理员");
+        }
+        Map<Long, ProjectInvestPlan> planMap = planList.stream().collect(Collectors.toMap(l -> l.getProjectId(), l -> l));
+        int[] quarters = {0,1,1,1,2,2,2,3,3,3,4,4,4};
+        Integer month = dto.getMonth();
+        for (DataProjectStatVO2 vo2 : vo2s) {
+            //获取当年计划
+            ProjectInvestPlan plan = planMap.get(vo2.getId());
+            //判断是否选择过月,选择过月则计划总投资为季度-实际完成投资为当月
+            if (month != null){
+                if (quarters[month] == 1){
+                    vo2.setPlanAllMoney(plan.getOneInvest() == null?BigDecimal.ZERO:plan.getOneInvest());
+                    vo2.setCurrentMoney(plan.getOneInvestFinish() == null?BigDecimal.ZERO:plan.getOneInvestFinish());
+                }else if (quarters[month] == 2){
+                    vo2.setPlanAllMoney(plan.getTwoInvest() == null?BigDecimal.ZERO:plan.getTwoInvest());
+                    vo2.setCurrentMoney(plan.getTwoInvestFinish() == null?BigDecimal.ZERO:plan.getTwoInvestFinish());
+                }else  if (quarters[month] == 3){
+                    vo2.setPlanAllMoney(plan.getThreeInvest() == null?BigDecimal.ZERO:plan.getThreeInvest());
+                    vo2.setCurrentMoney(plan.getThreeInvestFinish() == null?BigDecimal.ZERO:plan.getThreeInvestFinish());
+                }else {
+                    vo2.setPlanAllMoney(plan.getFourInvest() == null?BigDecimal.ZERO:plan.getFourInvest());
+                    vo2.setCurrentMoney(plan.getFourInvestFinish() == null?BigDecimal.ZERO:plan.getFourInvestFinish());
+                }
+            }else {
+                //没有选择过月计划总投资为年-实际完成投资为当年,
+                vo2.setPlanAllMoney(plan.getYearlyInvest() == null?BigDecimal.ZERO:plan.getYearlyInvest());
+                vo2.setCurrentMoney(plan.getYearFinishInvest() == null?BigDecimal.ZERO:plan.getYearFinishInvest());
+            }
+            //判断项目进程类型
+            if (plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 ||
+                    plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 ){
+                vo2.setScheduleType(3);
+            }else if (plan.getOneInvest().equals(plan.getOneInvestFinish()) && plan.getTwoInvest().equals(plan.getTwoInvestFinish()) &&
+                    plan.getThreeInvest().equals(plan.getThreeInvestFinish()) && plan.getFourInvest().equals(plan.getFourInvestFinish()) &&
+                    plan.getOnePlanRatio().compareTo(new BigDecimal(100)) == 0 &&
+                    plan.getTwoPlanRatio().compareTo(new BigDecimal(100)) == 0 &&
+                    plan.getThreePlanRatio().compareTo(new BigDecimal(100)) == 0 &&
+                    plan.getFourPlanRatio().compareTo(new BigDecimal(100)) == 0){
+                vo2.setScheduleType(1);
+            }else {
+                vo2.setScheduleType(2);
+            }
+        }
+        //判断是否选择过项目进度类型,选择过,那么重新把集合赋值为筛选后的
+        Integer scheduleType = dto.getProjectScheduleType();
+        if (scheduleType != null){
+            vo2s = vo2s.stream().filter(l->scheduleType.equals(l.getScheduleType())).collect(Collectors.toList());
+        }
+        vo.setProjectTotal(vo2s.size());
+        vo.setPlanAllMoney(vo2s.stream().map(l->l.getPlanAllMoney()).reduce(BigDecimal.ZERO,BigDecimal::add));
+        vo.setCurrentMoney(vo2s.stream().map(l->l.getCurrentMoney()).reduce(BigDecimal.ZERO,BigDecimal::add));
+        if (vo.getPlanAllMoney().compareTo(BigDecimal.ZERO) == 0){
+            vo.setInvestRatio(vo.getCurrentMoney());
+        }else {
+            vo.setInvestRatio(vo.getCurrentMoney().multiply(new BigDecimal(100)).divide(vo.getPlanAllMoney(),2,RoundingMode.UP));
+        }
+        vo.setTotal1((int) vo2s.stream().filter(l->l.getScheduleType() == 1).count());
+        vo.setTotal2((int) vo2s.stream().filter(l->l.getScheduleType() == 2).count());
+        vo.setTotal3((int) vo2s.stream().filter(l->l.getScheduleType() == 3).count());
+        return vo;
+    }
+
+    @Override
+    public DataInvestStatVO dataInvestStat(DataStatDTO dto) {
+        return null;
     }
 }