|
@@ -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;
|
|
|
+ }
|
|
|
}
|