|
|
@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
|
|
|
import lombok.RequiredArgsConstructor; |
|
|
|
import org.dromara.demo.domain.vo.AllGoatAchieveDataVo; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
import org.dromara.demo.domain.bo.ProjectInfoBo; |
|
|
|
import org.dromara.demo.domain.vo.ProjectInfoVo; |
|
|
@ -16,9 +17,9 @@ import org.dromara.demo.domain.ProjectInfo; |
|
|
|
import org.dromara.demo.mapper.ProjectInfoMapper; |
|
|
|
import org.dromara.demo.service.IProjectInfoService; |
|
|
|
|
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.Collection; |
|
|
|
import java.math.BigDecimal; |
|
|
|
import java.math.RoundingMode; |
|
|
|
import java.util.*; |
|
|
|
|
|
|
|
/** |
|
|
|
* 项目信息Service业务层处理 |
|
|
@ -167,4 +168,69 @@ public class ProjectInfoServiceImpl extends ServiceImpl<ProjectInfoMapper, Proje |
|
|
|
public void addData(List<ProjectInfo> list) { |
|
|
|
this.saveBatch(list); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public List<AllGoatAchieveDataVo> getYearlyInvestmentStats() { |
|
|
|
List<ProjectInfo> list = baseMapper.selectList(); |
|
|
|
|
|
|
|
// 按年份累加:TreeMap 自动按年份升序排序
|
|
|
|
Map<Integer, BigDecimal> planMap = new TreeMap<>(); |
|
|
|
Map<Integer, BigDecimal> actualMap = new TreeMap<>(); |
|
|
|
|
|
|
|
for (ProjectInfo item : list) { |
|
|
|
int year = extractYear(item.getProjectDate()); // 不管是哪年都保留
|
|
|
|
|
|
|
|
BigDecimal plan = parseBigDecimal(item.getPlanInvest()); |
|
|
|
BigDecimal actual = parseBigDecimal(item.getActualInvest()); |
|
|
|
|
|
|
|
planMap.put(year, planMap.getOrDefault(year, BigDecimal.ZERO).add(plan)); |
|
|
|
actualMap.put(year, actualMap.getOrDefault(year, BigDecimal.ZERO).add(actual)); |
|
|
|
} |
|
|
|
|
|
|
|
// 转换为返回结果
|
|
|
|
List<AllGoatAchieveDataVo> result = new ArrayList<>(); |
|
|
|
for (Integer year : planMap.keySet()) { |
|
|
|
BigDecimal plan = planMap.get(year); |
|
|
|
BigDecimal actual = actualMap.get(year); |
|
|
|
|
|
|
|
// 计算完成率(只返回数字)
|
|
|
|
BigDecimal percent = BigDecimal.ZERO; |
|
|
|
if (plan.compareTo(BigDecimal.ZERO) != 0) { |
|
|
|
percent = actual.divide(plan, 2, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)); |
|
|
|
} |
|
|
|
|
|
|
|
result.add(new AllGoatAchieveDataVo( |
|
|
|
year.toString(), |
|
|
|
format(plan), |
|
|
|
format(actual), |
|
|
|
format(percent) |
|
|
|
)); |
|
|
|
} |
|
|
|
|
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
// --------------------- private 辅助方法 ---------------------
|
|
|
|
|
|
|
|
private int extractYear(Date date) { |
|
|
|
if (date == null) return 0; |
|
|
|
Calendar cal = Calendar.getInstance(); |
|
|
|
cal.setTime(date); |
|
|
|
return cal.get(Calendar.YEAR); |
|
|
|
} |
|
|
|
|
|
|
|
private BigDecimal parseBigDecimal(String str) { |
|
|
|
if (str == null || str.trim().isEmpty()) return BigDecimal.ZERO; |
|
|
|
try { |
|
|
|
return new BigDecimal(str.trim()); |
|
|
|
} catch (Exception e) { |
|
|
|
return BigDecimal.ZERO; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private String format(BigDecimal value) { |
|
|
|
return value.setScale(2, RoundingMode.HALF_UP).toPlainString(); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|