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