mitao
2024-07-12 3e456f3e812ead6a19e80cfbdbf86ae0263d50b9
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);
    }
}