From 3e456f3e812ead6a19e80cfbdbf86ae0263d50b9 Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期五, 12 七月 2024 22:39:45 +0800
Subject: [PATCH] 完成7.4迭代内容,通过冒烟测试

---
 finance-system/src/main/java/com/finance/system/service/impl/TbBasicDataServiceImpl.java |  300 ++++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 262 insertions(+), 38 deletions(-)

diff --git a/finance-system/src/main/java/com/finance/system/service/impl/TbBasicDataServiceImpl.java b/finance-system/src/main/java/com/finance/system/service/impl/TbBasicDataServiceImpl.java
index 6c97002..984e34b 100644
--- a/finance-system/src/main/java/com/finance/system/service/impl/TbBasicDataServiceImpl.java
+++ b/finance-system/src/main/java/com/finance/system/service/impl/TbBasicDataServiceImpl.java
@@ -50,6 +50,7 @@
 import com.finance.system.query.ScoreQuery;
 import com.finance.system.service.AsyncService;
 import com.finance.system.service.ISysUserService;
+import com.finance.system.service.TbBasicDataCategoryService;
 import com.finance.system.service.TbBasicDataConfigDetailService;
 import com.finance.system.service.TbBasicDataConfigService;
 import com.finance.system.service.TbBasicDataFieldService;
@@ -60,6 +61,7 @@
 import com.finance.system.service.TbOperLogService;
 import com.finance.system.service.TbScoreService;
 import com.finance.system.utils.FieldBuildUtil;
+import com.finance.system.vo.BasicDataConfigVO;
 import com.finance.system.vo.BasicDataReportingVO;
 import com.finance.system.vo.CurrentFieldsAllVO;
 import com.finance.system.vo.CurrentFieldsDetailVO;
@@ -80,6 +82,7 @@
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
@@ -116,6 +119,7 @@
     private final TbDataScreenScoreService tbDataScreenScoreService;
     private final TbDataScreenConfigService tbDataScreenConfigService;
     private final AsyncService asyncService;
+    private final TbBasicDataCategoryService tbBasicDataCategoryService;
 
     public static void setFieldValues(
             List<FieldsTreeVO> fields, Map<Long, TbBasicDataField> fieldMap) {
@@ -162,6 +166,10 @@
                         Wrappers.<TbBasicData>lambdaQuery()
                                 .eq(TbBasicData::getDeptAreaCode, dept.getAreaCode())
                                 .between(TbBasicData::getReportingTime, quarterStart, quarterEnd));
+        if (Objects.nonNull(basicData)) {
+            vo.setCreateTime(basicData.getCreateTime());
+            vo.setUpdateTime(basicData.getUpdateTime());
+        }
         // 查询需要填写的字段
         List<TbField> list =
                 tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list();
@@ -231,6 +239,8 @@
         if (basicDataOpt.isPresent()) {
             tbBasicData.setId(basicDataOpt.get().getId());
             tbBasicData.setDeptAreaCode(areaCode);
+            tbBasicData.setQuarter(basicDataOpt.get().getQuarter());
+            tbBasicData.setUpdateTime(new Date());
             this.updateById(tbBasicData);
             // 查询该基础数据的动态字端
             List<TbBasicDataField> originFields = tbBasicDataFieldService.lambdaQuery()
@@ -321,12 +331,13 @@
             tbBasicData.setStatus(ReportingStatusEnum.FILLED);
             this.updateById(tbBasicData);
         }
-        if (ReportingStatusEnum.FILLED.equals(tbBasicData.getStatus())) {
+        /*if (ReportingStatusEnum.FILLED.equals(tbBasicData.getStatus())) {
             CompletableFuture.runAsync(() -> {
                 calculateScore(tbBasicData, tbBasicDataFields);
                 calculateScreenScore(tbBasicData, tbBasicDataFields);
             });
-        }
+        }*/
+        asyncService.calculateScoreWithFixedRules(tbBasicData, tbBasicDataFields, fieldList);
     }
 
     private void calculateScreenScore(TbBasicData tbBasicData,
@@ -565,7 +576,7 @@
                         }
                         if (CalculateTypeEnum.PERCENTAGE.equals(
                                 textAndPercentage.getCalculateType())) {
-                            for (Map.Entry<String, String> stringStringEntry : scoreMap.entrySet()) {
+                            for (Entry<String, String> stringStringEntry : scoreMap.entrySet()) {
                                 String[] split = stringStringEntry.getKey().split("_");
                                 double v = Double.parseDouble(
                                         textAndPercentageData.getFieldValue());
@@ -630,7 +641,7 @@
                             vo.setPhoneNumber(item.getPhoneNumber());
                             vo.setPersonInCharge(item.getPersonInCharge());
                         });
-        // 查询动态字段
+       /* // 查询动态字段
         List<TbBasicDataField> basicDataFields =
                 tbBasicDataFieldService
                         .lambdaQuery()
@@ -687,7 +698,44 @@
                             fieldsTreeVO.setCategory(Boolean.FALSE);
                             root.add(fieldsTreeVO);
                         });
-        vo.setFields(root);
+        vo.setFields(root);*/
+        // 查询需要填写的字段
+        List<TbField> list =
+                tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list();
+        List<FieldsTreeVO> roots = new ArrayList<>();
+        FieldsTreeVO fieldsTreeVO = new FieldsTreeVO();
+        fieldsTreeVO.setId(-1L);
+        fieldsTreeVO.setName("转移支付规模");
+        fieldsTreeVO.setCategory(Boolean.FALSE);
+        FieldsTreeVO fieldsTreeVO2 = new FieldsTreeVO();
+        fieldsTreeVO2.setId(-2L);
+        fieldsTreeVO2.setName("当期GDP");
+        fieldsTreeVO2.setCategory(Boolean.FALSE);
+        roots.add(fieldsTreeVO);
+        roots.add(fieldsTreeVO2);
+        if (CollUtils.isNotEmpty(list)) {
+            FieldBuildUtil.buildTreeFromTbFieldList(list, roots);
+            FieldsTreeVO remark = new FieldsTreeVO();
+            remark.setId(-3L);
+            remark.setName("备注");
+            roots.add(remark);
+            vo.setFields(roots);
+        }
+        vo.setStatus(basicData.getStatus());
+        // 查询已填报数据 包含数据缺失和已填报
+        List<TbBasicDataField> basicDataFields =
+                tbBasicDataFieldService
+                        .lambdaQuery()
+                        .eq(TbBasicDataField::getBasicDataId, basicData.getId())
+                        .list();
+
+        if (CollUtils.isNotEmpty(basicDataFields)) {
+            Map<Long, TbBasicDataField> fieldMap =
+                    basicDataFields.stream()
+                            .collect(Collectors.toMap(TbBasicDataField::getFieldId,
+                                    Function.identity()));
+            setFieldValues(vo.getFields(), fieldMap);
+        }
         return R.ok(vo);
     }
 
@@ -1082,6 +1130,9 @@
         String nowQuarter = DateUtils.getNowQuarter();
         this.updateById(basicData);
         // 查询该基础数据的动态字端
+        // 查询需要填写的动态字段
+        List<TbField> fieldList =
+                tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list();
         List<TbBasicDataField> originFields = tbBasicDataFieldService.lambdaQuery()
                 .eq(TbBasicDataField::getBasicDataId, basicData.getId()).list();
         Set<Long> fieldIdList = originFields.stream().map(TbBasicDataField::getFieldId)
@@ -1097,42 +1148,45 @@
         // 保存基础数据动态字段数据
         List<TbBasicDataField> tbBasicDataFields =
                 BeanUtils.copyList(dto.getFields(), TbBasicDataField.class);
-
-        for (TbBasicDataField item : tbBasicDataFields) {
-            TbField tbField = fieldMap.get(item.getFieldId());
-            Integer numMax = tbField.getNumMax();
-            Integer numMin = tbField.getNumMin();
-            Integer textMaxNum = tbField.getTextMaxNum();
-            Integer textMinNum = tbField.getTextMinNum();
-            if (FieldTypeEnum.NUMBER.equals(tbField.getFieldType()) && Objects.nonNull(
-                    numMax) && Objects.nonNull(numMin)) {
-                double fieldValue = Double.parseDouble(item.getFieldValue());
-                if (fieldValue < numMin || fieldValue > numMax) {
-                    throw new ServiceException(
-                            String.format("字段%s的值不在范围%d-%d内", tbField.getFieldName(),
-                                    numMin, numMax));
-                }
-            }
-            if (FieldTypeEnum.TEXT.equals(tbField.getFieldType())
-                    && FieldInputTypeEnum.MANUAL_INPUT.equals(tbField.getTextInputType())
-                    && Objects.nonNull(
-                    textMaxNum) && Objects.nonNull(textMinNum)) {
-                String fieldValue = item.getFieldValue();
-                if (fieldValue.length() < numMin || fieldValue.length() > numMax) {
-                    throw new ServiceException(
-                            String.format("字段%s的值的长度不在范围%d-%d内", tbField.getFieldName(),
-                                    textMinNum, textMaxNum));
-                }
-            }
-        }
-        tbBasicDataFields.forEach(
-                item -> {
-                    item.setBasicDataId(tbBasicData.getId());
+        tbBasicDataFields = tbBasicDataFields.stream().filter(f -> Objects.nonNull(f.getFieldId()))
+                .peek(item -> {
                     TbField tbField = fieldMap.get(item.getFieldId());
                     if (Objects.nonNull(tbField)) {
+                        Integer numMax = tbField.getNumMax();
+                        Integer numMin = tbField.getNumMin();
+                        Integer textMaxNum = tbField.getTextMaxNum();
+                        Integer textMinNum = tbField.getTextMinNum();
+                        if (FieldTypeEnum.NUMBER.equals(tbField.getFieldType()) && Objects.nonNull(
+                                numMax) && Objects.nonNull(numMin)) {
+                            double fieldValue = Double.parseDouble(item.getFieldValue());
+                            if (fieldValue < numMin || fieldValue > numMax) {
+                                throw new ServiceException(
+                                        String.format("字段%s的值不在范围%d-%d内",
+                                                tbField.getFieldName(),
+                                                numMin, numMax));
+                            }
+                        }
+                        if (FieldTypeEnum.TEXT.equals(tbField.getFieldType())
+                                && FieldInputTypeEnum.MANUAL_INPUT.equals(
+                                tbField.getTextInputType())
+                                && Objects.nonNull(
+                                textMaxNum) && Objects.nonNull(textMinNum)) {
+                            String fieldValue = item.getFieldValue();
+                            if (fieldValue.length() < numMin || fieldValue.length() > numMax) {
+                                throw new ServiceException(
+                                        String.format("字段%s的值的长度不在范围%d-%d内",
+                                                tbField.getFieldName(),
+                                                textMinNum, textMaxNum));
+                            }
+                        }
+                        item.setBasicDataId(tbBasicData.getId());
                         item.setFieldName(tbField.getFieldName());
+                        if (StringUtils.isNotBlank(item.getFieldValue())) {
+                            item.setFieldValue(item.getFieldValue().replace(",", ""));
+                        }
                     }
-                });
+
+                }).collect(Collectors.toList());
         // 添加固定字段 转移支付规模、当期GDP
         TbBasicDataField transferPaymentScale = new TbBasicDataField();
         transferPaymentScale.setBasicDataId(tbBasicData.getId());
@@ -1153,12 +1207,182 @@
         tbBasicDataFieldService.remove(
                 Wrappers.<TbBasicDataField>lambdaQuery()
                         .eq(TbBasicDataField::getBasicDataId, tbBasicData.getId()));
+        Optional<TbBasicDataField> any = tbBasicDataFields.stream()
+                .filter(t -> StringUtils.isBlank(t.getFieldValue())).findAny();
+        if (!any.isPresent()) {
+            tbBasicData.setStatus(ReportingStatusEnum.FILLED);
+            this.updateById(tbBasicData);
+        }
         tbBasicDataFieldService.saveBatch(tbBasicDataFields);
-        if (ReportingStatusEnum.FILLED.equals(tbBasicData.getStatus())) {
+        /*if (ReportingStatusEnum.FILLED.equals(tbBasicData.getStatus())) {
             CompletableFuture.runAsync(() -> {
                 calculateScore(tbBasicData, tbBasicDataFields);
                 calculateScreenScore(tbBasicData, tbBasicDataFields);
             });
+        }*/
+        asyncService.calculateScoreWithFixedRules(tbBasicData, tbBasicDataFields, fieldList);
+    }
+
+    @Override
+    public void exportDataV2(List<String> quarterList) throws IOException {
+        {
+            response.setContentType("application/vnd.ms-excel");
+            response.setCharacterEncoding("utf-8");
+            String fileName = "财政运行分析指标评价表";
+            response.setHeader(
+                    "Content-disposition",
+                    "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");
+            List<TbBasicData> tbBasicDataList = this.lambdaQuery()
+                    .in(TbBasicData::getQuarter, quarterList)
+                    .groupBy(TbBasicData::getQuarter).list();
+            // 符合导出条件的基础数据
+            List<TbBasicData> tbBasicDataListAll = this.lambdaQuery()
+                    .in(TbBasicData::getQuarter, quarterList)
+                    .list();
+            Set<Long> basicDataSet = tbBasicDataListAll.stream().map(TbBasicData::getId)
+                    .collect(Collectors.toSet());
+            List<TbScore> scoreList = null;
+            if (CollUtils.isNotEmpty(basicDataSet)) {
+                // 符合导出条件的得分
+                scoreList = tbScoreService.lambdaQuery()
+                        .in(TbScore::getBasicDataId, basicDataSet)
+                        .list();
+            }
+            List<BasicDataConfigVO> configVOList = tbBasicDataConfigService.getFixedRulesConfigList();
+            // 基础数据id列表
+            Set<Long> basicDataIdList = tbBasicDataList.stream().map(TbBasicData::getId)
+                    .collect(Collectors.toSet());
+            // 涉及到的部门编码
+            Set<String> userAreaCodeList = tbBasicDataList.stream()
+                    .map(TbBasicData::getDeptAreaCode)
+                    .collect(Collectors.toSet());
+            // 用户信息map
+            Map<String, SysUser> userMap = sysUserService.lambdaQuery()
+                    .in(SysUser::getAreaCode, userAreaCodeList).list().stream()
+                    .collect(Collectors.toMap(SysUser::getAreaCode, e -> e));
+            // 构建Excel写对象
+            try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
+                    .registerWriteHandler(new CustomCellWriteHandler())
+                    .registerWriteHandler(EasyExcelUtil.getStyleStrategy()).build()) {
+                WriteSheet writeSheet;
+                // 遍历季度基础数据
+                for (String quarter : quarterList) {
+                    List<TbBasicData> currentBasicData = tbBasicDataListAll.stream()
+                            .filter(d -> d.getQuarter().equals(quarter)).collect(
+                                    Collectors.toList());
+                    Set<Long> cbdIdSet = currentBasicData.stream().map(TbBasicData::getId)
+                            .collect(Collectors.toSet());
+
+                    // 表头
+                    List<List<String>> head = headV2(configVOList);
+                    if (CollUtils.isNotEmpty(scoreList)) {
+                        List<List<Object>> dataList = dataListV2(scoreList, currentBasicData,
+                                userMap, head);
+                        // 构建sheet对象
+                        writeSheet = EasyExcel.writerSheet(quarter).head(head).build();
+                        // 写出sheet数据
+                        excelWriter.write(dataList, writeSheet);
+                    }
+                }
+            }
         }
     }
+
+    private List<List<String>> headV2(List<BasicDataConfigVO> configVOList) {
+        List<List<String>> headTitles = Lists.newArrayList();
+        // 固定字段
+        headTitles.add(Lists.newArrayList("财政运行分析指标评价表", "财政运行分析指标评价表",
+                "财政运行分析指标评价表", "财政运行分析指标评价表", "财政运行分析指标评价表",
+                "财政运行分析指标评价表", "财政运行分析指标评价表", "财政运行分析指标评价表",
+                "财政运行分析指标评价表", "财政运行分析指标评价表", "财政运行分析指标评价表",
+                "财政运行分析指标评价表", "财政运行分析指标评价表", "财政运行分析指标评价表",
+                "财政运行分析指标评价表", "财政运行分析指标评价表", "财政运行分析指标评价表",
+                "财政运行分析指标评价表", "财政运行分析指标评价表", "财政运行分析指标评价表",
+                "财政运行分析指标评价表", "财政运行分析指标评价表", "财政运行分析指标评价表",
+                "财政运行分析指标评价表", "财政运行分析指标评价表"));
+        headTitles.add(Lists.newArrayList("地区"));
+        headTitles.add(Lists.newArrayList("级次"));
+        headTitles.add(Lists.newArrayList("得分合计"));
+        headTitles.add(Lists.newArrayList("一级指标", "财政经济形式",
+                "预算管理方面", "预算执行方面", "风险防控方面"));
+        headTitles.add(
+                Lists.newArrayList("分值", "27", "重大财税政策落实情况",
+                        "26", "20", "27"));
+        headTitles.add(Lists.newArrayList("二级指标", "收入占GDP比重",
+                "收入执行率", "收入质量", "重大财税落实情况", "重大财税政策落实情况", "转移支付",
+                "\"三保\"保障情况", "强化预算约束", "库款管理", "预算执行情况", "中央直达资金",
+                "暂付款管理", "债务管理", "日常监督发现问题"));
+        headTitles.add(Lists.newArrayList("分值", "8", "11", "8", "--", "重大财税政策落实情况", "9",
+                "17", "--", "6", "8", "6", "9", "18", "日常监督发现问题"));
+        headTitles.add(
+                Lists.newArrayList("三级指标", "地方一般公共预算收入占GDP的比重",
+                        "地方一般公共预算收入执行进度(地方一般公共预算收入/年初预算或调整预算)",
+                        "政府性基金预算收入执行进度(政府性基金预算收入/年初预算或调整预算)",
+                        "税收收入占地方一般公共预算收入比重", "减税降费落实情况",
+                        "其他重大政策落实情况", "中央转移支付占地方可用财力比重",
+                        "“三保”年初预算保障情况", "“三保”需求占可用财力的比重",
+                        "“三保”支出保障情况", "存量资金盘活", "不得无预算、超预算拨款",
+                        "库款保障水平", "一般公共预算支出执行率", "政府性基金预算支出执行率",
+                        "中央直达资金支付进度", "直达资金规范使用", "违规新增暂付款",
+                        "暂付款累计余额", "暂付款消化", "法定债务率", "隐性债务率", "隐性债务化解",
+                        "日常监督发现问题", "日常监督发现问题"));
+        headTitles.add(
+                Lists.newArrayList("分值", "8", "7", "4", "8", "--", "--", "9", "6", "8", "3", "——",
+                        "--", "6", "5", "3", "3", "3", "3", "3", "3", "9", "9", "--", "--", "--"));
+
+        return headTitles;
+    }
+
+    private List<List<Object>> dataListV2(List<TbScore> scoreList,
+            List<TbBasicData> list,
+            Map<String, SysUser> userMap,
+            List<List<String>> head) {
+        // 所有数据集合
+        List<List<Object>> excellist = new ArrayList<>();
+        // 构建栏号行
+        List<Object> columnNo = Lists.newArrayList("栏号");
+        for (int i = 1; i < head.size(); i++) {
+            columnNo.add(String.valueOf(i));
+        }
+        excellist.add(columnNo);
+        // 动态字段数据行
+        for (TbBasicData tbBasicData : list) {
+            // 转换为map,方便遍历的时候取
+         /*   Map<Long, TbBasicDataField> basicDataFieldMap = tbBasicDataFieldList.stream()
+                    .filter(item -> tbBasicData.getId().equals(item.getBasicDataId()))
+                    .collect(Collectors.toMap(TbBasicDataField::getFieldId, e -> e));
+            SysUser sysUser = userMap.get(tbBasicData.getDeptAreaCode());
+            if (CollUtils.isEmpty(basicDataFieldMap) || Objects.isNull(sysUser)) {
+                continue;
+            }*/
+           /* List<Object> valueList = Lists.newArrayList(sysUser.getAreaName(),
+                    tbBasicData.getQuarter());
+            TbBasicDataField transferPaymentScale = basicDataFieldMap.get(-1L);
+            valueList.add(
+                    Objects.nonNull(transferPaymentScale)
+                            ? transferPaymentScale.getFieldValue()
+                            : "");
+            TbBasicDataField currentGdp = basicDataFieldMap.get(-2L);
+            valueList.add(
+                    Objects.nonNull(currentGdp)
+                            ? currentGdp.getFieldValue()
+                            : "");
+            for (TbField tbField : fieldList) {
+                TbBasicDataField tbBasicDataField = basicDataFieldMap.get(tbField.getId());
+                valueList.add(
+                        Objects.nonNull(tbBasicDataField)
+                                ? tbBasicDataField.getFieldValue()
+                                : "");
+            }
+            excellist.add(valueList);
+            valueList.add(tbBasicData.getRemark());*/
+        }
+        return excellist;
+    }
+
+    @Override
+    public List<FieldAndScoreDataVO> getFieldAndScoreData(String areaCode, String nowQuarter,
+            Integer yearType) {
+        return baseMapper.getFieldAndScoreData(areaCode, nowQuarter, yearType);
+    }
 }

--
Gitblit v1.7.1