From 07c83c163675e24252de05d029cef2eab046e583 Mon Sep 17 00:00:00 2001 From: mitao <2763622819@qq.com> Date: 星期二, 09 七月 2024 19:32:40 +0800 Subject: [PATCH] 完成基础数据导入 --- finance-admin/src/main/java/com/finance/web/controller/api/TbBasicDataConfigController.java | 9 finance-system/src/main/java/com/finance/system/listener/HistoryDataListener.java | 177 ++++++- finance-admin-dept/src/main/java/com/finance/FinanceAdminDeptApplication.java | 29 + finance-admin/src/main/java/com/finance/web/controller/api/TbBasicDataCategoryController.java | 9 finance-system/src/main/java/com/finance/system/service/TbBasicDataConfigService.java | 3 finance-system/src/main/java/com/finance/system/vo/BasicDataConfigVO.java | 18 finance-system/src/main/java/com/finance/system/service/AsyncService.java | 20 finance-common/src/main/java/com/finance/common/config/AsyncThreadPoolConfig.java | 32 + finance-common/src/main/java/com/finance/common/enums/IndicatorItemEnum.java | 47 ++ finance-admin/src/main/java/com/finance/web/controller/api/HistoryDataController.java | 3 finance-system/src/main/java/com/finance/system/service/impl/AsyncServiceImpl.java | 394 +++++++++++++++++ finance-admin/src/main/java/com/finance/web/controller/api/TbFieldCategoryController.java | 33 + finance-system/src/main/java/com/finance/system/service/impl/TbBasicDataServiceImpl.java | 53 +- finance-system/src/main/java/com/finance/system/domain/TbBasicDataField.java | 27 finance-system/src/main/java/com/finance/system/listener/BasicDataListener.java | 285 ++++++----- finance-common/src/main/java/com/finance/common/enums/BasicDataFieldEnum.java | 130 +++++ finance-system/src/main/java/com/finance/system/service/impl/TbFieldServiceImpl.java | 1 finance-admin/src/test/java/com/finance/FinanceManageApplicationTest.java | 42 + finance-system/src/main/java/com/finance/system/service/impl/TbBasicDataConfigServiceImpl.java | 39 + finance-system/src/main/java/com/finance/system/dto/BasicDataFieldDTO.java | 9 finance-admin/src/main/java/com/finance/web/controller/api/TbFieldController.java | 12 21 files changed, 1,148 insertions(+), 224 deletions(-) diff --git a/finance-admin-dept/src/main/java/com/finance/FinanceAdminDeptApplication.java b/finance-admin-dept/src/main/java/com/finance/FinanceAdminDeptApplication.java index afa6c6a..d2fe96b 100644 --- a/finance-admin-dept/src/main/java/com/finance/FinanceAdminDeptApplication.java +++ b/finance-admin-dept/src/main/java/com/finance/FinanceAdminDeptApplication.java @@ -1,8 +1,11 @@ package com.finance; +import com.finance.system.service.AsyncService; import java.net.InetAddress; import java.net.UnknownHostException; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -20,9 +23,12 @@ * @author ruoyi */ @Slf4j -@EnableScheduling//开启定时任务 +@EnableScheduling// 开启定时任务 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) public class FinanceAdminDeptApplication { + + @Autowired + private AsyncService asyncService; public static void main(String[] args) throws UnknownHostException { ConfigurableApplicationContext application = SpringApplication.run( @@ -31,10 +37,10 @@ log.info("\n----------------------------------------------------------\n\t" + "应用 '{}' 运行成功! 访问连接:\n\t" + "Swagger文档: \t\thttp://{}:{}/doc.html\n" + - "----------------------------------------------------------" , - env.getProperty("spring.application.name" , "后台"), + "----------------------------------------------------------", + env.getProperty("spring.application.name", "后台"), InetAddress.getLocalHost().getHostAddress(), - env.getProperty("server.port" , "8081")); + env.getProperty("server.port", "8081")); } /** @@ -45,7 +51,7 @@ @Bean @ConditionalOnMissingBean(name = "restTemplate") public RestTemplate wxRestTemplate() { - //复杂构造函数的使用 + // 复杂构造函数的使用 SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); // 设置超时 requestFactory.setConnectTimeout(6000); @@ -55,4 +61,17 @@ return restTemplate; } + @Bean + public ApplicationRunner applicationRunner() { + return applicationArguments -> { + long startTime = System.currentTimeMillis(); + System.out.println(Thread.currentThread().getName() + ":开始调用异步业务"); + asyncService.asyncTask(); + long endTime = System.currentTimeMillis(); + System.out.println( + Thread.currentThread().getName() + ":调用异步业务结束,耗时:" + (endTime + - startTime)); + }; + } + } diff --git a/finance-admin/src/main/java/com/finance/web/controller/api/HistoryDataController.java b/finance-admin/src/main/java/com/finance/web/controller/api/HistoryDataController.java index b725348..31ed6df 100644 --- a/finance-admin/src/main/java/com/finance/web/controller/api/HistoryDataController.java +++ b/finance-admin/src/main/java/com/finance/web/controller/api/HistoryDataController.java @@ -6,7 +6,6 @@ import com.finance.common.basic.PageDTO; import com.finance.common.core.domain.R; import com.finance.common.enums.BusinessType; -import com.finance.common.enums.ReportingStatusEnum; import com.finance.common.exception.ServiceException; import com.finance.system.domain.TbBasicData; import com.finance.system.dto.update.BasicDataUpdDTO; @@ -74,7 +73,7 @@ Page<TbBasicData> page = tbBasicDataService .lambdaQuery() - .eq(TbBasicData::getStatus, ReportingStatusEnum.FILLED) + // .eq(TbBasicData::getStatus, ReportingStatusEnum.FILLED) .between(flag, TbBasicData::getReportingTime, startTime, endTime) .groupBy(TbBasicData::getQuarter) .orderByDesc(TbBasicData::getReportingTime) diff --git a/finance-admin/src/main/java/com/finance/web/controller/api/TbBasicDataCategoryController.java b/finance-admin/src/main/java/com/finance/web/controller/api/TbBasicDataCategoryController.java index a64a456..df60f62 100644 --- a/finance-admin/src/main/java/com/finance/web/controller/api/TbBasicDataCategoryController.java +++ b/finance-admin/src/main/java/com/finance/web/controller/api/TbBasicDataCategoryController.java @@ -72,6 +72,9 @@ @PostMapping("/edit") @ApiOperation("编辑") public R<Void> add(@RequestBody @Validated BasicDataCategoryUpdateDTO dto) { + if (dto.getId() <= 17) { + throw new ServiceException("该基础数据分类不能修改"); + } try { tbBasicDataCategoryService.update(dto); } catch (Exception e) { @@ -93,6 +96,9 @@ @DeleteMapping("/delete") @ApiOperation("删除") public R<Void> delete(@RequestParam(value = "id") Long id) { + if (id <= 17) { + throw new ServiceException("该基础数据分类不能删除"); + } try { tbBasicDataCategoryService.removeById(id); } catch (Exception e) { @@ -137,6 +143,9 @@ @PostMapping("/show-hide") @ApiOperation("隐藏显示操作") public R<Void> showHide(@RequestBody ShowHideDTO dto) { + if (dto.getId() <= 17) { + throw new ServiceException("该基础数据分类不能隐藏"); + } try { tbBasicDataCategoryService.showHide(dto); } catch (Exception e) { diff --git a/finance-admin/src/main/java/com/finance/web/controller/api/TbBasicDataConfigController.java b/finance-admin/src/main/java/com/finance/web/controller/api/TbBasicDataConfigController.java index 300bbf1..6f601ca 100644 --- a/finance-admin/src/main/java/com/finance/web/controller/api/TbBasicDataConfigController.java +++ b/finance-admin/src/main/java/com/finance/web/controller/api/TbBasicDataConfigController.java @@ -142,6 +142,9 @@ @PostMapping("/edit") @ApiOperation("编辑") public R<Void> edit(@RequestBody @Validated BasicDataConfigUpdateDTO dto) { + if (dto.getId() <= 24) { + return R.fail("该基础数据配置不可操作"); + } try { tbBasicDataConfigService.edit(dto); } catch (Exception e) { @@ -184,6 +187,9 @@ @DeleteMapping("/delete") @ApiOperation("删除") public R<Void> delete(Long id) { + if (id <= 24) { + return R.fail("该基础数据配置不可操作"); + } try { tbBasicDataConfigService.delete(id); } catch (Exception e) { @@ -205,6 +211,9 @@ @PostMapping("show-hide") @ApiOperation("隐藏显示操作") public R<Void> showHide(@RequestBody ShowHideDTO dto) { + if (dto.getId() <= 24) { + return R.fail("该基础数据配置不可操作"); + } try { tbBasicDataConfigService.showHide(dto); } catch (Exception e) { diff --git a/finance-admin/src/main/java/com/finance/web/controller/api/TbFieldCategoryController.java b/finance-admin/src/main/java/com/finance/web/controller/api/TbFieldCategoryController.java index 32a267c..64fd111 100644 --- a/finance-admin/src/main/java/com/finance/web/controller/api/TbFieldCategoryController.java +++ b/finance-admin/src/main/java/com/finance/web/controller/api/TbFieldCategoryController.java @@ -16,7 +16,14 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; /** * <p> @@ -37,6 +44,7 @@ /** * 添加 + * * @param dto 字段分类数据传输对象 * @return R */ @@ -57,6 +65,7 @@ /** * 根据id获取字段分类详情 + * * @param id 字段分类id * @return R */ @@ -77,6 +86,7 @@ /** * 分页条件查询 + * * @param query 部门条件查询对象 * @return PageVO<FieldCategoryDetailVO> */ @@ -96,12 +106,16 @@ /** * 隐藏显示操作 + * * @param dto 显示隐藏操作数据传输对象 * @return R */ @PostMapping("/show-hide") @ApiOperation("隐藏显示操作") public R<Void> showHide(@RequestBody ShowHideDTO dto) { + if (dto.getId() < 50) { + throw new ServiceException("固定字段分类,不能操作!"); + } try { tbFieldCategoryService.showHide(dto); } catch (Exception e) { @@ -116,14 +130,19 @@ /** * 删除分类子节点 + * * @param id id * @return R */ @DeleteMapping("/delete-children") @ApiOperation("编辑页面删除子字段分类") - public R<Object> deleteChildren(@RequestParam(value = "id") Long id){ + public R<Object> deleteChildren(@RequestParam(value = "id") Long id) { + if (id < 50) { + throw new ServiceException("固定字段分类,不能操作!"); + } try { tbFieldCategoryService.deleteChildren(id); + } catch (Exception e) { if (e instanceof ServiceException) { return R.fail(e.getMessage()); @@ -136,12 +155,16 @@ /** * 删除分类 + * * @param id id * @return R */ @DeleteMapping("/delete") @ApiOperation("列表页面删除分类") - public R<Void> delete(@RequestParam(value = "id") Long id){ + public R<Void> delete(@RequestParam(value = "id") Long id) { + if (id < 50) { + throw new ServiceException("固定字段分类,不能操作"); + } try { tbFieldCategoryService.delete(id); } catch (Exception e) { @@ -156,12 +179,16 @@ /** * 编辑分类 + * * @param dto 字段分类更新数据传输对象 * @return R */ @PutMapping("/edit") @ApiOperation("编辑") public R<Object> edit(@RequestBody FieldCategoryUpdateDTO dto) { + if (dto.getId() < 50) { + throw new ServiceException("固定字段分类,不能操作"); + } try { tbFieldCategoryService.edit(dto); } catch (Exception e) { diff --git a/finance-admin/src/main/java/com/finance/web/controller/api/TbFieldController.java b/finance-admin/src/main/java/com/finance/web/controller/api/TbFieldController.java index d935ca4..30d0199 100644 --- a/finance-admin/src/main/java/com/finance/web/controller/api/TbFieldController.java +++ b/finance-admin/src/main/java/com/finance/web/controller/api/TbFieldController.java @@ -90,6 +90,9 @@ @GetMapping("/influenced-data") @ApiOperation("隐藏字段,获取同步隐藏的基础数据") public R<String> influencedData(@RequestParam Long id) { + if (id <= 88) { + throw new ServiceException("固定字段,不能操作"); + } try { return R.ok(tbFieldService.influencedData(id)); } catch (Exception e) { @@ -110,6 +113,9 @@ @PostMapping("/show-hide") @ApiOperation("隐藏显示操作") public R<Void> showHide(@RequestBody ShowHideDTO dto) { + if (dto.getId() <= 88) { + throw new ServiceException("固定字段,不能操作"); + } try { tbFieldService.showHide(dto); } catch (Exception e) { @@ -131,6 +137,9 @@ @PostMapping("/edit") @ApiOperation("编辑字段") public R<Void> editField(@RequestBody @Validated FieldUpdateDTO dto) { + if (dto.getId() <= 88) { + throw new ServiceException("固定字段,不能操作"); + } try { tbFieldService.editField(dto); } catch (Exception e) { @@ -193,6 +202,9 @@ @DeleteMapping("/delete") @ApiOperation("删除") public R<Void> delete(@RequestParam Long id) { + if (id <= 88) { + throw new ServiceException("固定字段,不能操作"); + } try { tbFieldService.removeById(id); } catch (Exception e) { diff --git a/finance-admin/src/test/java/com/finance/FinanceManageApplicationTest.java b/finance-admin/src/test/java/com/finance/FinanceManageApplicationTest.java index 872f302..f8f920a 100644 --- a/finance-admin/src/test/java/com/finance/FinanceManageApplicationTest.java +++ b/finance-admin/src/test/java/com/finance/FinanceManageApplicationTest.java @@ -3,7 +3,17 @@ import static com.finance.web.controller.service.DepartmentRanking.DATA_ONE_SCORE_RANKING_KEY; import static com.finance.web.controller.service.DepartmentRanking.TOTAL_SCORE_RANKING_KEY; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.finance.common.enums.ShowStatusEnum; +import com.finance.system.domain.TbBasicData; +import com.finance.system.domain.TbBasicDataField; +import com.finance.system.domain.TbField; +import com.finance.system.mapper.TbBasicDataFieldMapper; +import com.finance.system.mapper.TbBasicDataMapper; +import com.finance.system.service.AsyncService; +import com.finance.system.service.TbFieldService; import com.finance.web.controller.service.DepartmentRanking; +import java.util.List; import javax.annotation.Resource; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @@ -17,16 +27,24 @@ @Resource private DepartmentRanking departmentRanking; + @Resource + private AsyncService asyncService; + @Resource + private TbBasicDataMapper basicDataMapper; + @Resource + private TbBasicDataFieldMapper basicDataFieldMapper; + @Resource + private TbFieldService tbFieldService; @Test public void test() { - departmentRanking.addToScoreRanking(TOTAL_SCORE_RANKING_KEY, "area1" , 50); - departmentRanking.addToScoreRanking(TOTAL_SCORE_RANKING_KEY, "area2" , 50); - departmentRanking.addToScoreRanking(TOTAL_SCORE_RANKING_KEY, "area3" , 50); + departmentRanking.addToScoreRanking(TOTAL_SCORE_RANKING_KEY, "area1", 50); + departmentRanking.addToScoreRanking(TOTAL_SCORE_RANKING_KEY, "area2", 50); + departmentRanking.addToScoreRanking(TOTAL_SCORE_RANKING_KEY, "area3", 50); - departmentRanking.addToScoreRanking(DATA_ONE_SCORE_RANKING_KEY, "area1" , 50); - departmentRanking.addToScoreRanking(DATA_ONE_SCORE_RANKING_KEY, "area2" , 80); - departmentRanking.addToScoreRanking(DATA_ONE_SCORE_RANKING_KEY, "area3" , 90); + departmentRanking.addToScoreRanking(DATA_ONE_SCORE_RANKING_KEY, "area1", 50); + departmentRanking.addToScoreRanking(DATA_ONE_SCORE_RANKING_KEY, "area2", 80); + departmentRanking.addToScoreRanking(DATA_ONE_SCORE_RANKING_KEY, "area3", 90); Long score1Rank1 = departmentRanking.getScoreRankByAreaCode(TOTAL_SCORE_RANKING_KEY, "area1"); @@ -58,5 +76,17 @@ System.out.println("Area2 not found in the ranking."); } } + + @Test + public void test2() { + TbBasicData one = basicDataMapper.selectOne( + Wrappers.lambdaQuery(TbBasicData.class).eq(TbBasicData::getId, "1")); + List<TbBasicDataField> list = basicDataFieldMapper.selectList( + Wrappers.lambdaQuery(TbBasicDataField.class) + .eq(TbBasicDataField::getBasicDataId, one.getId())); + List<TbField> fieldList = + tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list(); + asyncService.calculateScoreWithFixedRules(one, list, fieldList); + } } diff --git a/finance-common/src/main/java/com/finance/common/config/AsyncThreadPoolConfig.java b/finance-common/src/main/java/com/finance/common/config/AsyncThreadPoolConfig.java new file mode 100644 index 0000000..13b694f --- /dev/null +++ b/finance-common/src/main/java/com/finance/common/config/AsyncThreadPoolConfig.java @@ -0,0 +1,32 @@ +package com.finance.common.config; + +import java.util.concurrent.ThreadPoolExecutor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.AsyncTaskExecutor; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +@EnableAsync +@Configuration +public class AsyncThreadPoolConfig { + + private static final int MAX_POOL_SIZE = 50; + private static final int CORE_POOL_SIZE = 20; + private static final int TASK_NUM = 200; + private static final int ACTIVE_TIME = 60; + + @Bean("asyncTaskExecutor") + public AsyncTaskExecutor asyncTaskExecutor() { + ThreadPoolTaskExecutor asyncTaskExecutor = new ThreadPoolTaskExecutor(); + asyncTaskExecutor.setMaxPoolSize(MAX_POOL_SIZE); + asyncTaskExecutor.setCorePoolSize(CORE_POOL_SIZE); + asyncTaskExecutor.setQueueCapacity(TASK_NUM); + asyncTaskExecutor.setKeepAliveSeconds(ACTIVE_TIME); + asyncTaskExecutor.setThreadNamePrefix("async-task-thread-pool-"); + asyncTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + asyncTaskExecutor.initialize(); + return asyncTaskExecutor; + } + +} diff --git a/finance-common/src/main/java/com/finance/common/enums/BasicDataFieldEnum.java b/finance-common/src/main/java/com/finance/common/enums/BasicDataFieldEnum.java new file mode 100644 index 0000000..6407504 --- /dev/null +++ b/finance-common/src/main/java/com/finance/common/enums/BasicDataFieldEnum.java @@ -0,0 +1,130 @@ +package com.finance.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum BasicDataFieldEnum { + BASIC_DATA_FIELD1(1L, "(一)一般公共预算-一般公共预算收入-预算数"), + BASIC_DATA_FIELD2(2L, "(一)一般公共预算-一般公共预算收入-当期执行数-完成数"), + BASIC_DATA_FIELD3(3L, + "(一)一般公共预算-一般公共预算收入-当期执行数-其中:税收收入"), + BASIC_DATA_FIELD4(4L, "(一)一般公共预算-一般公共预算收入-上年同期执行数-完成数"), + BASIC_DATA_FIELD5(5L, "(一)一般公共预算-一般公共预算收入-上年同期执行数-其中:税收收入"), + BASIC_DATA_FIELD6(6L, "(一)一般公共预算-上级补助收入-预算数"), + BASIC_DATA_FIELD7(7L, "(一)一般公共预算-上级补助收入-执行数"), + BASIC_DATA_FIELD8(8L, "(一)一般公共预算-调入资金-预算数"), + BASIC_DATA_FIELD9(9L, "(一)一般公共预算-调入资金-预算数"), + BASIC_DATA_FIELD10(10L, "(一)一般公共预算-动用预算稳定调节基金-预算数"), + BASIC_DATA_FIELD11(11L, "(一)一般公共预算-动用预算稳定调节基金-执行数"), + BASIC_DATA_FIELD12(12L, + "(一)一般公共预算-综合财力 (本级收入+上级补助-上解+下级上解收入-补助下级支出)-预算数"), + BASIC_DATA_FIELD13(13L, + "(一)一般公共预算-综合财力 (本级收入+上级补助-上解+下级上解收入-补助下级支出)-执行数"), + BASIC_DATA_FIELD14(14L, "(一)一般公共预算-一般公共预算支出-预算数"), + BASIC_DATA_FIELD15(15L, "(一)一般公共预算-一般公共预算支出-当期执行数"), + BASIC_DATA_FIELD16(16L, "(一)一般公共预算-一般公共预算支出-上年同期执行数"), + BASIC_DATA_FIELD17(17L, "(二)政府性基金预算-政府性基金预算收入-预算数"), + BASIC_DATA_FIELD18(18L, "(二)政府性基金预算-政府性基金预算收入-当期执行数"), + BASIC_DATA_FIELD19(19L, "(二)政府性基金预算-政府性基金预算收入-上年同期执行数"), + BASIC_DATA_FIELD20(20L, + "(二)政府性基金预算-可用财力 (本级收入+上级补助-上解+下级上解收入-补助下级支出)-预算数"), + BASIC_DATA_FIELD21(21L, + "(二)政府性基金预算-可用财力 (本级收入+上级补助-上解+下级上解收入-补助下级支出)-执行数"), + BASIC_DATA_FIELD22(22L, "(二)政府性基金预算-政府性基金预算支出-预算数"), + BASIC_DATA_FIELD23(23L, "(二)政府性基金预算-政府性基金预算支出-当期执行数"), + BASIC_DATA_FIELD24(24L, "(二)政府性基金预算-政府性基金预算支出-上年同期执行数"), + BASIC_DATA_FIELD25(25L, "(二)政府性基金预算-调出资金-预算数"), + BASIC_DATA_FIELD26(26L, "(二)政府性基金预算-调出资金-执行数"), + BASIC_DATA_FIELD27(27L, "(三)库款保障情况-期初库款余额"), + BASIC_DATA_FIELD28(28L, "(三)库款保障情况-本期库款流入"), + BASIC_DATA_FIELD29(29L, "(三)库款保障情况-本期库款流出"), + BASIC_DATA_FIELD30(30L, "(三)库款保障情况-期末库款余额-余额"), + BASIC_DATA_FIELD31(31L, "(三)库款保障情况-期末库款余额-其中:-一般账户余额"), + BASIC_DATA_FIELD32(32L, "(三)库款保障情况-期末库款余额-其中:-工资账户余额"), + BASIC_DATA_FIELD33(33L, "(三)库款保障情况-期末库款余额-其中:-基本民生账户余额"), + BASIC_DATA_FIELD34(34L, "(三)库款保障情况-期末库款余额-其中:-直达资金账户余额"), + BASIC_DATA_FIELD35(35L, "(三)库款保障情况-库款保障水平-当前季度数据"), + BASIC_DATA_FIELD36(36L, "(三)库款保障情况-库款保障水平-第一月数据"), + BASIC_DATA_FIELD37(37L, "(三)库款保障情况-库款保障水平-第二月数据"), + BASIC_DATA_FIELD38(38L, "(三)库款保障情况-库款保障水平-第三月数据"), + BASIC_DATA_FIELD39(39L, + "(四)“三保”保障情况-国家标准“三保”支出(按照财预便[2021]164号的范围和标准填列)-合计-需求数"), + BASIC_DATA_FIELD40(40L, + "(四)“三保”保障情况-国家标准“三保”支出(按照财预便[2021]164号的范围和标准填列)-保基本民生-需求数"), + BASIC_DATA_FIELD41(41L, + "(四)“三保”保障情况-国家标准“三保”支出(按照财预便[2021]164号的范围和标准填列)-保工资-需求数"), + BASIC_DATA_FIELD42(42L, + "(四)“三保”保障情况-国家标准“三保”支出(按照财预便[2021]164号的范围和标准填列)-保运转-需求数"), + BASIC_DATA_FIELD43(43L, + "(四)“三保”保障情况-地方标准“三保”支出(以地方实际结构填列,含国标)-合计-需求数"), + BASIC_DATA_FIELD44(44L, + "(四)“三保”保障情况-地方标准“三保”支出(以地方实际结构填列,含国标)-合计-预算数"), + BASIC_DATA_FIELD45(45L, + "(四)“三保”保障情况-地方标准“三保”支出(以地方实际结构填列,含国标)-合计-执行数"), + BASIC_DATA_FIELD46(46L, + "(四)“三保”保障情况-地方标准“三保”支出(以地方实际结构填列,含国标)-保基本民生-需求数"), + BASIC_DATA_FIELD47(47L, + "(四)“三保”保障情况-地方标准“三保”支出(以地方实际结构填列,含国标)-保基本民生-预算数"), + BASIC_DATA_FIELD48(48L, + "(四)“三保”保障情况-地方标准“三保”支出(以地方实际结构填列,含国标)-保基本民生-执行数"), + BASIC_DATA_FIELD49(49L, + "(四)“三保”保障情况-地方标准“三保”支出(以地方实际结构填列,含国标)-保工资-需求数"), + BASIC_DATA_FIELD50(50L, + "(四)“三保”保障情况-地方标准“三保”支出(以地方实际结构填列,含国标)-保工资-预算数"), + BASIC_DATA_FIELD51(51L, + "(四)“三保”保障情况-地方标准“三保”支出(以地方实际结构填列,含国标)-保工资-执行数"), + BASIC_DATA_FIELD52(52L, + "(四)“三保”保障情况-地方标准“三保”支出(以地方实际结构填列,含国标)-保运转-需求数"), + BASIC_DATA_FIELD53(53L, + "(四)“三保”保障情况-地方标准“三保”支出(以地方实际结构填列,含国标)-保运转-预算数"), + BASIC_DATA_FIELD54(54L, + "(四)“三保”保障情况-地方标准“三保”支出(以地方实际结构填列,含国标)-保运转-执行数"), + BASIC_DATA_FIELD55(55L, "(五)暂付款情况-截至上年底暂付性款项余额-金额"), + BASIC_DATA_FIELD56(56L, "(五)暂付款情况-截至上年底暂付性款项余额-其中:2018年底前形成的暂付款"), + BASIC_DATA_FIELD57(57L, "(五)暂付款情况-当年新增暂付性款项金额"), + BASIC_DATA_FIELD58(58L, "(五)暂付款情况-当年消化情况-当年拟消化金额"), + BASIC_DATA_FIELD59(59L, "(五)暂付款情况-当年消化情况-金额"), + BASIC_DATA_FIELD60(60L, "(五)暂付款情况-当年消化情况-其中:已消化2018年底存量暂付款"), + BASIC_DATA_FIELD61(61L, "(五)暂付款情况-累计暂付性款项余额"), + BASIC_DATA_FIELD62(62L, "(六)存量资金情况-结转结余-总额"), + BASIC_DATA_FIELD63(63L, "(六)存量资金情况-结转结余-其中:-一般公共预算结转结余"), + BASIC_DATA_FIELD64(64L, "(六)存量资金情况-结转结余-其中:-政府性基金预算结转结余"), + BASIC_DATA_FIELD65(65L, "(六)存量资金情况-结转结余-其中:-转移支付结转结余"), + BASIC_DATA_FIELD66(66L, "(六)存量资金情况-结转结余-其中:-预算稳定调节基金"), + BASIC_DATA_FIELD67(67L, "(六)存量资金情况-结转结余-其中:-预算周转金"), + BASIC_DATA_FIELD68(68L, "(六)存量资金情况-结转结余-其中:-财政专户资金"), + BASIC_DATA_FIELD69(69L, "(六)存量资金情况-已收回存量资金-总额"), + BASIC_DATA_FIELD70(70L, "(六)存量资金情况-已收回存量资金-其中:-结余、结转两年以上"), + BASIC_DATA_FIELD71(71L, "(六)存量资金情况-已收回存量资金-其中:-低效资金"), + BASIC_DATA_FIELD72(72L, "(六)存量资金情况-已收回存量资金再安排金额"), + BASIC_DATA_FIELD73(73L, "(七)债务管理情况-法定债务率-债务率"), + BASIC_DATA_FIELD74(74L, "(七)债务管理情况-法定债务率-风险等级"), + BASIC_DATA_FIELD75(75L, "(七)债务管理情况-YZ率-债务率"), + BASIC_DATA_FIELD76(76L, "(七)债务管理情况-YZ率-风险等级"), + BASIC_DATA_FIELD77(77L, "(七)债务管理情况-当年需还本金额-一般债-需求数"), + BASIC_DATA_FIELD78(78L, "(七)债务管理情况-当年需还本金额-一般债-预算数"), + BASIC_DATA_FIELD79(79L, "(七)债务管理情况-当年需还本金额-专项债-需求数"), + BASIC_DATA_FIELD80(80L, "(七)债务管理情况-当年需还本金额-专项债-预算数"), + BASIC_DATA_FIELD81(81L, "(七)债务管理情况-当年需付息金额-一般债-需求数"), + BASIC_DATA_FIELD82(82L, "(七)债务管理情况-当年需付息金额-一般债-预算数"), + BASIC_DATA_FIELD83(83L, "(七)债务管理情况-当年需付息金额-专项债-需求数"), + BASIC_DATA_FIELD84(84L, "(七)债务管理情况-当年需付息金额-专项债-预算数"), + BASIC_DATA_FIELD85(85L, "(七)债务管理情况', '当年已付息金额-一般债"), + BASIC_DATA_FIELD86(86L, "(七)债务管理情况', '当年已付息金额-专项债"), + BASIC_DATA_FIELD87(87L, "(七)债务管理情况', '当年已付息金额-一般债"), + BASIC_DATA_FIELD88(88L, "(七)债务管理情况', '当年已付息金额-专项债"); + + private final Long code; + private final String desc; + + public static BasicDataFieldEnum getEnumByCode(long code) { + for (BasicDataFieldEnum e : BasicDataFieldEnum.values()) { + if (e.code.equals(code)) { + return e; + } + } + return null; + } +} diff --git a/finance-common/src/main/java/com/finance/common/enums/IndicatorItemEnum.java b/finance-common/src/main/java/com/finance/common/enums/IndicatorItemEnum.java new file mode 100644 index 0000000..2533213 --- /dev/null +++ b/finance-common/src/main/java/com/finance/common/enums/IndicatorItemEnum.java @@ -0,0 +1,47 @@ +package com.finance.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum IndicatorItemEnum { + INDICATOR_ITEM1(1, "财政经济形势-收入占GDP比重-地方一般公共预算收入占GDP的比重"), + INDICATOR_ITEM2(2, + "财政经济形势-收入执行率-地方一般公共预算收入执行进度(地方一般公共预算收入/年初预算或调整预算)"), + INDICATOR_ITEM3(3, + "财政经济形势-收入执行率-政府性基金预算收入执行进度(政府性基金预算收入/年初预算或调整预算)"), + INDICATOR_ITEM4(4, "财政经济形势-收入质量-税收收入占地方一般公共预算收入比重"), + INDICATOR_ITEM5(5, "财政经济形势-重大财税政策落实情况-减税降费落实情况"), + INDICATOR_ITEM6(6, "财政经济形势-重大财税政策落实情况-其他重大政策落实情况"), + INDICATOR_ITEM7(7, "预算管理方面-转移支付-中央转移支付占地方可用财力比重"), + INDICATOR_ITEM8(8, "预算管理方面-“三保”保障情况-“三保”年初预算保障情况"), + INDICATOR_ITEM9(9, "预算管理方面-“三保”保障情况-“三保”需求占可用财力的比重"), + INDICATOR_ITEM10(10, "预算管理方面-“三保”保障情况-“三保”支出保障情况"), + INDICATOR_ITEM11(11, "预算管理方面-强化预算约束-存量资金盘活"), + INDICATOR_ITEM12(12, "预算管理方面-强化预算约束-不得无预算、超预算拨款"), + INDICATOR_ITEM13(13, "预算执行方面-库款管理-库款保障水平"), + INDICATOR_ITEM14(14, "预算执行方面-预算执行情况-一般公共预算支出执行率"), + INDICATOR_ITEM15(15, "预算执行方面-预算执行情况-政府性基金预算支出执行率"), + INDICATOR_ITEM16(16, "预算执行方面-中央直达资金-中央直达资金支付进度"), + INDICATOR_ITEM17(17, "预算执行方面-中央直达资金-直达资金规范使用"), + INDICATOR_ITEM18(18, "风险防控方面-暂付款管理-违规新增暂付款"), + INDICATOR_ITEM19(19, "风险防控方面-暂付款管理-暂付款累计余额"), + INDICATOR_ITEM20(20, "风险防控方面-暂付款管理-暂付款消化"), + INDICATOR_ITEM21(21, "风险防控方面-债务管理-法定债务率"), + INDICATOR_ITEM22(22, "风险防控方面-债务管理-隐性债务率"), + INDICATOR_ITEM23(23, "风险防控方面-债务管理-日常监督发现问题"), + INDICATOR_ITEM24(24, "风险防控方面-日常监督发现问题"); + + private final Integer code; + private final String desc; + + public static IndicatorItemEnum getEnumByCode(Integer code) { + for (IndicatorItemEnum e : IndicatorItemEnum.values()) { + if (e.code.equals(code)) { + return e; + } + } + return null; + } +} \ No newline at end of file diff --git a/finance-system/src/main/java/com/finance/system/domain/TbBasicDataField.java b/finance-system/src/main/java/com/finance/system/domain/TbBasicDataField.java index 0ad9915..245b9c1 100644 --- a/finance-system/src/main/java/com/finance/system/domain/TbBasicDataField.java +++ b/finance-system/src/main/java/com/finance/system/domain/TbBasicDataField.java @@ -1,13 +1,16 @@ package com.finance.system.domain; -import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - import java.io.Serializable; import java.util.Date; +import lombok.Data; +import lombok.EqualsAndHashCode; /** * <p> @@ -20,13 +23,13 @@ @Data @EqualsAndHashCode(callSuper = false) @TableName("tb_basic_data_field") -@ApiModel(value="TbBasicDataField对象", description="基础数据非固定字段表") +@ApiModel(value = "TbBasicDataField对象", description = "基础数据非固定字段表") public class TbBasicDataField implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "动态字段id") - @TableId(value = "id",type = IdType.AUTO) + @TableId(value = "id", type = IdType.AUTO) private Long id; @ApiModelProperty(value = "基础数据id") @@ -45,6 +48,18 @@ @TableField("field_value") private String fieldValue; + @ApiModelProperty(value = "第一月数据") + @TableField("first_month_value") + private String firstMonthValue; + + @ApiModelProperty(value = "第二月数据") + @TableField("second_month_value") + private String secondMonthValue; + + @ApiModelProperty(value = "第三月数据") + @TableField("third_month_value") + private String thirdMonthValue; + @ApiModelProperty(value = "创建人") @TableField(value = "create_by", fill = FieldFill.INSERT) private String createBy; diff --git a/finance-system/src/main/java/com/finance/system/dto/BasicDataFieldDTO.java b/finance-system/src/main/java/com/finance/system/dto/BasicDataFieldDTO.java index 624231e..38f7c35 100644 --- a/finance-system/src/main/java/com/finance/system/dto/BasicDataFieldDTO.java +++ b/finance-system/src/main/java/com/finance/system/dto/BasicDataFieldDTO.java @@ -17,4 +17,13 @@ @ApiModelProperty(value = "字段值") private String fieldValue; + + @ApiModelProperty(value = "第一月数据") + private String firstMonthValue; + + @ApiModelProperty(value = "第二月数据") + private String secondMonthValue; + + @ApiModelProperty(value = "第三月数据") + private String thirdMonthValue; } diff --git a/finance-system/src/main/java/com/finance/system/listener/BasicDataListener.java b/finance-system/src/main/java/com/finance/system/listener/BasicDataListener.java index 1a71082..faba84a 100644 --- a/finance-system/src/main/java/com/finance/system/listener/BasicDataListener.java +++ b/finance-system/src/main/java/com/finance/system/listener/BasicDataListener.java @@ -4,11 +4,7 @@ import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.util.ListUtils; import com.alibaba.fastjson2.JSON; -import com.alibaba.fastjson2.JSONArray; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.finance.common.enums.CalculateTypeEnum; import com.finance.common.enums.DataScreenConfigEnum; import com.finance.common.enums.FieldInputTypeEnum; import com.finance.common.enums.FieldTypeEnum; @@ -17,16 +13,14 @@ import com.finance.common.enums.ValueTypeEnum; import com.finance.common.exception.ServiceException; import com.finance.common.utils.CalculateUtil; -import com.finance.common.utils.CollUtils; import com.finance.common.utils.DateUtils; +import com.finance.common.utils.StringUtils; import com.finance.system.domain.TbBasicData; -import com.finance.system.domain.TbBasicDataConfig; -import com.finance.system.domain.TbBasicDataConfigDetail; import com.finance.system.domain.TbBasicDataField; import com.finance.system.domain.TbDataScreenScore; import com.finance.system.domain.TbField; -import com.finance.system.domain.TbScore; import com.finance.system.dto.CalculateItemDTO; +import com.finance.system.service.AsyncService; import com.finance.system.service.TbBasicDataConfigDetailService; import com.finance.system.service.TbBasicDataConfigService; import com.finance.system.service.TbBasicDataFieldService; @@ -41,9 +35,9 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Objects; import java.util.Optional; -import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; @@ -65,7 +59,9 @@ public TbBasicDataConfigDetailService tbBasicDataConfigDetailService; public TbScoreService tbScoreService; public TbDataScreenScoreService tbDataScreenScoreService; + public String quarter; public TbDataScreenConfigService tbDataScreenConfigService; + public AsyncService asyncService; public BasicDataListener(TbBasicDataService tbBasicDataService, TbFieldService tbFieldService, @@ -73,7 +69,8 @@ TbBasicDataConfigService tbBasicDataConfigService, TbBasicDataConfigDetailService tbBasicDataConfigDetailService, TbScoreService tbScoreService, TbDataScreenScoreService tbDataScreenScoreService, - TbDataScreenConfigService tbDataScreenConfigService) { + String quarter, + TbDataScreenConfigService tbDataScreenConfigService, AsyncService asyncService) { this.tbBasicDataService = tbBasicDataService; this.tbFieldService = tbFieldService; this.areaCode = areaCode; @@ -82,7 +79,9 @@ this.tbBasicDataConfigDetailService = tbBasicDataConfigDetailService; this.tbScoreService = tbScoreService; this.tbDataScreenConfigService = tbDataScreenConfigService; + this.quarter = quarter; this.tbDataScreenScoreService = tbDataScreenScoreService; + this.asyncService = asyncService; } @Override @@ -158,51 +157,50 @@ // 查询需要填写的动态字段 List<TbField> fieldList = tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list(); - - Map<Integer, String> categoryOneMap = cachedDataList.get(0); - Map<Integer, String> categoryTwoMap = cachedDataList.get(1); - Map<Integer, String> categoryThreeMap = cachedDataList.get(2); Map<Integer, String> headMap = cachedDataList.get(3); + int remarkIndex = headMap.size() - 1; + Map<Integer, String> dynamicFieldsMap = getDynamicHeadMap(headMap, remarkIndex); + Map<Integer, String> dynamicCategoryOneMap = getDynamicHeadMap(cachedDataList.get(0), + remarkIndex); + Map<Integer, String> dynamicCategoryTwoMap = getDynamicHeadMap(cachedDataList.get(1), + remarkIndex); + Map<Integer, String> dynamicCategoryThreeMap = getDynamicHeadMap(cachedDataList.get(2), + remarkIndex); Map<Integer, String> dataMap = cachedDataList.get(5); log.info("{}条数据,开始存储数据库!", cachedDataList.size()); log.info("表头:{}", JSON.toJSONString(headMap)); log.info("填写的数据:{}", JSON.toJSONString(dataMap)); log.info("所有数据:{}", JSON.toJSONString(cachedDataList)); - int remarkIndex = headMap.size() - 1; - Map<Integer, String> dynamicFieldsMap = getIntegerStringMap(headMap, remarkIndex); - Map<Integer, String> dynamicCategoryOneMap = getIntegerStringMap(categoryOneMap, - remarkIndex); - Map<Integer, String> dynamicCategoryTwoMap = getIntegerStringMap(categoryTwoMap, - remarkIndex); - Map<Integer, String> dynamicCategoryThreeMap = getIntegerStringMap(categoryThreeMap, - remarkIndex); + List<String> dynamicFields = new ArrayList<>(dynamicFieldsMap.values()); List<String> collect = fieldList.stream().map(TbField::getFieldName) .collect(Collectors.toList()); boolean flag = new ArrayList<>(dynamicFields).containsAll(collect); - if (dynamicFields.size() != collect.size() || !flag) { + if (dynamicFields.size() != fieldList.size() || !flag) { throw new ServiceException("导入失败,请下载最新的导入模板"); } LocalDate now = LocalDate.now(); TbBasicData tbBasicData; - String quarter = dataMap.get(1); Optional<TbBasicData> tbBasicDataOpt = tbBasicDataService.lambdaQuery(). eq(TbBasicData::getQuarter, quarter) .eq(TbBasicData::getDeptAreaCode, areaCode).oneOpt(); tbBasicData = tbBasicDataOpt.orElseGet(TbBasicData::new); - tbBasicData.setQuarter(DateUtils.getNowQuarter()); + tbBasicData.setQuarter(quarter); tbBasicData.setTransferPaymentScale(dataMap.get(2)); tbBasicData.setCurrentGdp(dataMap.get(3)); tbBasicData.setDeptAreaCode(areaCode); tbBasicData.setRemark(dataMap.get(remarkIndex)); - tbBasicData.setStatus(ReportingStatusEnum.MISSING_DATA); tbBasicData.setReportingTime(DateUtils.getQuarterDate(quarter)); + long count = dataMap.entrySet().stream() + .filter(entry -> StringUtils.isBlank(entry.getValue())).count(); + tbBasicData.setStatus( + count > 0 ? ReportingStatusEnum.MISSING_DATA : ReportingStatusEnum.FILLED); tbBasicDataService.saveOrUpdate(tbBasicData); tbBasicDataFieldService.remove(Wrappers.<TbBasicDataField>lambdaQuery() .eq(TbBasicDataField::getBasicDataId, tbBasicData.getId())); List<TbBasicDataField> fields = new ArrayList<>(); - //添加固定字段 转移支付规模、当期GDP + // 添加固定字段 转移支付规模、当期GDP TbBasicDataField transferPaymentScale = new TbBasicDataField(); transferPaymentScale.setBasicDataId(tbBasicData.getId()); transferPaymentScale.setFieldId(-1L); @@ -216,12 +214,37 @@ currentGdp.setFieldName("当期GDP"); currentGdp.setFieldValue(tbBasicData.getCurrentGdp()); fields.add(currentGdp); - //遍历动态字段map - for (Map.Entry<Integer, String> integerStringEntry : dynamicFieldsMap.entrySet()) { + // 遍历动态字段map + for (Entry<Integer, String> entry : dynamicFieldsMap.entrySet()) { + Integer key = entry.getKey(); + String fieldStr = entry.getValue(); + String categoryOne = dynamicCategoryOneMap.get(key); + String categoryTwo = dynamicCategoryTwoMap.get(key); + String categoryThree = dynamicCategoryThreeMap.get(key); + + TbField field = getFieldByFieldName(fieldList, categoryOne, categoryTwo, + categoryThree, fieldStr); + + if (Objects.nonNull(field)) { + String value = dataMap.get(key); + TbBasicDataField tbBasicDataField = new TbBasicDataField(); + tbBasicDataField.setBasicDataId(tbBasicData.getId()); + tbBasicDataField.setFieldId(field.getId()); + tbBasicDataField.setFieldName(field.getFieldName()); + tbBasicDataField.setFieldValue(value); + fields.add(tbBasicDataField); + } + } + + /*for (Entry<Integer, String> integerStringEntry : dynamicFieldsMap.entrySet()) { String categoryOne = dynamicCategoryOneMap.get(integerStringEntry.getKey()); String categoryTwo = dynamicCategoryTwoMap.get(integerStringEntry.getKey()); String categoryThree = dynamicCategoryThreeMap.get(integerStringEntry.getKey()); String fieldStr = integerStringEntry.getValue(); + if (fieldStr.equals("库款保障水平-第一月") || fieldStr.equals("库款保障水平-第二月") + || fieldStr.equals("库款保障水平-第三月")) { + continue; + } boolean res = !fieldStr.equals(categoryTwo); List<TbField> tbField = tbFieldService.lambdaQuery() .eq(TbField::getFieldName, fieldStr) @@ -231,131 +254,123 @@ .eq(!fieldStr.equals(categoryThree) && res, TbField::getLevelThreeCategory, categoryThree) .list(); - if (CollUtils.isNotEmpty(tbField)) { - TbField field = tbField.get(0); - String value = validateFields(integerStringEntry, dataMap, field); + TbField field = getFieldByFieldName(fieldList, categoryOne, + categoryTwo, categoryThree, fieldStr); + // String value = validateFields(integerStringEntry, dataMap, field); + if (Objects.nonNull(field)) { + String value = dataMap.get(integerStringEntry.getKey()); + TbBasicDataField tbBasicDataField = new TbBasicDataField(); tbBasicDataField.setBasicDataId(tbBasicData.getId()); tbBasicDataField.setFieldId(field.getId()); tbBasicDataField.setFieldName(field.getFieldName()); tbBasicDataField.setFieldValue(value); + if (fieldStr.equals("库款保障水平")) { + String firstMonthValue = dataMap.get(integerStringEntry.getKey() + 1); + String secondMonthValue = dataMap.get(integerStringEntry.getKey() + 2); + String thirdMonthValue = dataMap.get(integerStringEntry.getKey() + 3); + tbBasicDataField.setFirstMonthValue(firstMonthValue); + tbBasicDataField.setSecondMonthValue(secondMonthValue); + tbBasicDataField.setThirdMonthValue(thirdMonthValue); + } fields.add(tbBasicDataField); } - } + }*/ tbBasicDataFieldService.saveBatch(fields); - tbBasicData.setStatus(ReportingStatusEnum.FILLED); - tbBasicDataService.updateById(tbBasicData); log.info(String.format("%s导入基础数据成功!", dataMap.get(0))); - CompletableFuture.runAsync(() -> { - calculateScore(tbBasicData, fields); - calculateScreenScore(tbBasicData, fields); - }); + // asyncService.calculateScore(tbBasicData, fields); + asyncService.asyncTask(); + } + /** + * 需要导入的数据 + * + * @return List<Map < Integer, String>> + */ + private List<Map<Integer, String>> getMapList() { + for (int i = 0; i < cachedDataList.size(); i++) { + if (cachedDataList.get(i).get(0).equals("栏号")) { + return cachedDataList.subList(i + 1, cachedDataList.size()); + } + } + return null; + } + + private TbField getFieldByFieldName(List<TbField> fieldList, String categoryOne, + String categoryTwo, + String categoryThree, + String fieldStr) { + TbField field = null; + if (!fieldList.isEmpty()) { + /* + 判断字段有几级分类,如果字段如果fieldStr与categoryTwo不同,说明该字段有二级分类。 + 如果字段如果fieldStr与categoryThree不同,说明该字段有三级分类。 + res = 1 表示只有一级分类 res=2 表示该字段有二级分类,res=3表示该字段有三级分类 + */ + int res = + !fieldStr.equals(categoryTwo) ? (!fieldStr.equals(categoryThree) ? 3 : 2) : 1; + Optional<TbField> fieldOptional = Optional.empty(); + switch (res) { + case 1: + fieldOptional = fieldList.stream() + .filter(item -> item.getFieldName().equals(fieldStr) + && item.getLevelOneCategory().equals(categoryOne) + && item.getStatus() + == ShowStatusEnum.SHOW) + .findFirst(); + if (fieldOptional.isPresent()) { + field = fieldOptional.get(); + field.setFieldName(categoryOne + "-" + field.getFieldName()); + } + break; + case 2: + fieldOptional = fieldList.stream() + .filter(item -> item.getFieldName().equals(fieldStr) + && item.getLevelOneCategory().equals(categoryOne) + && item.getStatus() + == ShowStatusEnum.SHOW) + .filter(item -> item.getLevelTwoCategory().equals(categoryTwo)) + .findFirst(); + if (fieldOptional.isPresent()) { + field = fieldOptional.get(); + field.setFieldName( + categoryOne + "-" + categoryTwo + "-" + field.getFieldName()); + } + break; + case 3: + fieldOptional = fieldList.stream() + .filter(item -> item.getFieldName().equals(fieldStr) + && item.getLevelOneCategory().equals(categoryOne) + && item.getStatus() + == ShowStatusEnum.SHOW) + .filter(item -> item.getLevelTwoCategory().equals(categoryTwo)) + .filter(item -> item.getLevelThreeCategory() + .equals(categoryThree)) + .findFirst(); + if (fieldOptional.isPresent()) { + field = fieldOptional.get(); + field.setFieldName( + categoryOne + "-" + categoryTwo + "-" + categoryThree + "-" + + field.getFieldName()); + } + break; + } + } + return field; + } + + @NotNull - private static Map<Integer, String> getIntegerStringMap(Map<Integer, String> headMap, + private static Map<Integer, String> getDynamicHeadMap(Map<Integer, String> headMap, int remarkIndex) { Map<Integer, String> dynamicFieldsMap = headMap.entrySet().stream() .filter(entry -> !(Lists.newArrayList(0, 1, 2, 3).contains(entry.getKey()) || entry.getKey() == remarkIndex)) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); return dynamicFieldsMap; } - private void calculateScore(TbBasicData tbBasicData, List<TbBasicDataField> fields) { - List<TbScore> scoreList = new ArrayList<>(); - //计算得分 - List<TbBasicDataConfig> list = tbBasicDataConfigService.lambdaQuery() - .eq(TbBasicDataConfig::getStatus, ShowStatusEnum.SHOW).list(); - if (CollectionUtils.isEmpty(list)) { - throw new ServiceException("计算得分失败,平台未配置得分计算规则"); - } - List<TbBasicDataConfig> numCalculates = list.stream() - .filter(item -> CalculateTypeEnum.NUMBER.equals(item.getCalculateType())) - .collect(Collectors.toList()); - List<TbBasicDataConfig> textAndPercentages = list.stream() - .filter(item -> !CalculateTypeEnum.NUMBER.equals(item.getCalculateType())) - .collect(Collectors.toList()); - tbScoreService.remove( - new LambdaQueryWrapper<TbScore>().eq(TbScore::getBasicDataId, tbBasicData.getId())); - Map<Long, TbBasicDataField> basicDataFieldMap = fields.stream() - .collect(Collectors.toMap(TbBasicDataField::getFieldId, e -> e)); - if (CollUtils.isNotEmpty(numCalculates)) { - for (TbBasicDataConfig item : numCalculates) { - String numberCalculateFormula = item.getNumberCalculateFormula(); - List<CalculateItemDTO> calculateItemDTOS = JSONArray.parseArray( - numberCalculateFormula, - CalculateItemDTO.class); - for (CalculateItemDTO dto : calculateItemDTOS) { - if (ValueTypeEnum.FIELD.equals(dto.getValueType())) { - TbBasicDataField tbBasicDataField = basicDataFieldMap.get( - Long.valueOf(dto.getContent())); - if (Objects.nonNull(tbBasicDataField)) { - dto.setContent(tbBasicDataField.getFieldValue()); - } - } - } - String numberCalculateFormulaStr = calculateItemDTOS.stream() - .map(CalculateItemDTO::getContent).collect(Collectors.joining()); - double score = CalculateUtil.calculate(numberCalculateFormulaStr); - if (Objects.nonNull(item.getMaxScore()) && score > item.getMaxScore()) { - score = item.getMaxScore(); - } - TbScore tbScore = new TbScore(); - tbScore.setBasicDataId(tbBasicData.getId()); - tbScore.setScore(score); - tbScore.setBasicDataConfigId(item.getId()); - scoreList.add(tbScore); - } - } - if (CollUtils.isNotEmpty(textAndPercentages)) { - for (TbBasicDataConfig textAndPercentage : textAndPercentages) { - TbScore tbScore = new TbScore(); - List<TbBasicDataConfigDetail> details = tbBasicDataConfigDetailService.lambdaQuery() - .eq(TbBasicDataConfigDetail::getBasicDataConfigId, - textAndPercentage.getId()) - .list(); - Map<String, String> scoreMap = details.stream().collect( - Collectors.toMap(TbBasicDataConfigDetail::getKey, - TbBasicDataConfigDetail::getValue)); - if (CollectionUtils.isNotEmpty(details)) { - TbBasicDataField textAndPercentageData = basicDataFieldMap.get( - Long.valueOf(textAndPercentage.getFieldIdStr())); - if (Objects.nonNull(textAndPercentageData)) { - if (CalculateTypeEnum.TEXT.equals(textAndPercentage.getCalculateType())) { - String score = scoreMap.get(textAndPercentageData.getFieldValue()); - tbScore.setBasicDataId(tbBasicData.getId()); - tbScore.setScore(Double.parseDouble(score)); - tbScore.setBasicDataConfigId(textAndPercentage.getId()); - scoreList.add(tbScore); - } - if (CalculateTypeEnum.PERCENTAGE.equals( - textAndPercentage.getCalculateType())) { - for (Map.Entry<String, String> stringStringEntry : scoreMap.entrySet()) { - String[] split = stringStringEntry.getKey().split("_"); - double v = Double.parseDouble( - textAndPercentageData.getFieldValue()); - double min = Double.parseDouble(split[0]); - double max = Double.parseDouble(split[1]); - if (v >= min && v <= max) { - tbScore.setScore( - Double.parseDouble(stringStringEntry.getValue())); - } - } - //如果都不匹配,得分为0 - if (Objects.isNull(tbScore.getScore())) { - tbScore.setScore(0D); - } - tbScore.setBasicDataId(tbBasicData.getId()); - tbScore.setBasicDataConfigId(textAndPercentage.getId()); - scoreList.add(tbScore); - } - } - } - } - } - tbScoreService.saveBatch(scoreList); - } private void calculateScreenScore(TbBasicData tbBasicData, List<TbBasicDataField> tbBasicDataFields) { diff --git a/finance-system/src/main/java/com/finance/system/listener/HistoryDataListener.java b/finance-system/src/main/java/com/finance/system/listener/HistoryDataListener.java index b5563bd..6fb5348 100644 --- a/finance-system/src/main/java/com/finance/system/listener/HistoryDataListener.java +++ b/finance-system/src/main/java/com/finance/system/listener/HistoryDataListener.java @@ -8,7 +8,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.google.common.collect.Lists; import com.finance.common.core.domain.entity.SysUser; import com.finance.common.enums.CalculateTypeEnum; import com.finance.common.enums.DataScreenConfigEnum; @@ -22,6 +21,7 @@ import com.finance.common.utils.CalculateUtil; import com.finance.common.utils.CollUtils; import com.finance.common.utils.DateUtils; +import com.finance.common.utils.StringUtils; import com.finance.system.domain.TbBasicData; import com.finance.system.domain.TbBasicDataConfig; import com.finance.system.domain.TbBasicDataConfigDetail; @@ -30,6 +30,7 @@ import com.finance.system.domain.TbField; import com.finance.system.domain.TbScore; import com.finance.system.dto.CalculateItemDTO; +import com.finance.system.service.AsyncService; import com.finance.system.service.ISysUserService; import com.finance.system.service.TbBasicDataConfigDetailService; import com.finance.system.service.TbBasicDataConfigService; @@ -40,15 +41,17 @@ import com.finance.system.service.TbFieldService; import com.finance.system.service.TbScoreService; import com.finance.system.vo.DataScreenConfigVO; +import com.google.common.collect.Lists; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Objects; import java.util.Optional; -import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; @Slf4j public class HistoryDataListener extends AnalysisEventListener<Map<Integer, String>> { @@ -67,6 +70,7 @@ public String quarter; public TbDataScreenScoreService tbDataScreenScoreService; public TbDataScreenConfigService tbDataScreenConfigService; + public AsyncService asyncService; private List<Map<Integer, String>> cachedDataList = ListUtils.newArrayListWithExpectedSize( BATCH_COUNT); @@ -77,7 +81,7 @@ TbBasicDataConfigDetailService tbBasicDataConfigDetailService, TbScoreService tbScoreService, ISysUserService sysUserService, String quarter, TbDataScreenScoreService tbDataScreenScoreService, - TbDataScreenConfigService tbDataScreenConfigService) { + TbDataScreenConfigService tbDataScreenConfigService, AsyncService asyncService) { this.tbBasicDataService = tbBasicDataService; this.tbFieldService = tbFieldService; this.tbBasicDataFieldService = tbBasicDataFieldService; @@ -88,6 +92,7 @@ this.quarter = quarter; this.tbDataScreenConfigService = tbDataScreenConfigService; this.tbDataScreenScoreService = tbDataScreenScoreService; + this.asyncService = asyncService; } @Override @@ -128,6 +133,14 @@ List<TbField> fieldList = tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list(); Map<Integer, String> headMap = getHeadMap(); + int remarkIndex = headMap.size() - 1; + Map<Integer, String> dynamicFieldsMap = getDynamicHeadMap(headMap, remarkIndex); + Map<Integer, String> dynamicCategoryOneMap = getDynamicHeadMap(cachedDataList.get(0), + remarkIndex); + Map<Integer, String> dynamicCategoryTwoMap = getDynamicHeadMap(cachedDataList.get(1), + remarkIndex); + Map<Integer, String> dynamicCategoryThreeMap = getDynamicHeadMap(cachedDataList.get(2), + remarkIndex); List<Map<Integer, String>> dataMapList = getMapList(); if (headMap == null || dataMapList == null) { throw new ServiceException("导入失败,请下载最新的导入模板"); @@ -135,31 +148,33 @@ log.info("{}条数据,开始存储数据库!", dataMapList.size()); log.info("表头:{}", JSON.toJSONString(headMap)); log.info("填写的数据:{}", JSON.toJSONString(dataMapList)); + + /* boolean flag = new ArrayList<>(dynamicFields).containsAll(collect); + if (dynamicFields.size() != collect.size() || !flag) { + throw new ServiceException("导入失败,请下载最新的导入模板"); + }*/ + List<String> dynamicFields = new ArrayList<>(dynamicFieldsMap.values()); + List<String> collect = fieldList.stream().map(TbField::getFieldName) + .collect(Collectors.toList()); + boolean flag = new ArrayList<>(dynamicFields).containsAll(collect); + if (dynamicFields.size() != fieldList.size() || !flag) { + throw new ServiceException("导入失败,请下载最新的导入模板"); + } + List<SysUser> departmentList = sysUserService.lambdaQuery() + .eq(SysUser::getUserType, UserTypeEnum.DEPARTMENT).list(); + List<TbBasicData> basicDataList = tbBasicDataService.lambdaQuery(). + eq(TbBasicData::getQuarter, quarter).list(); for (Map<Integer, String> dataMap : dataMapList) { - Optional<SysUser> sysUser = sysUserService.lambdaQuery() - .eq(SysUser::getUserType, UserTypeEnum.DEPARTMENT) - .eq(SysUser::getAreaName, dataMap.get(0)).oneOpt(); + Optional<SysUser> sysUser = departmentList.stream() + .filter(dept -> dept.getAreaName().equals(dataMap.get(0))).findFirst(); if (!sysUser.isPresent()) { throw new ServiceException("该地区不存在,请修改后重新导入!"); } String areaCode = sysUser.get().getAreaCode(); - int remarkIndex = headMap.size() - 1; - Map<Integer, String> dynamicFieldsMap = headMap.entrySet().stream() - .filter(entry -> !(Lists.newArrayList(0, 1, 2, 3).contains(entry.getKey()) - || entry.getKey() == remarkIndex)) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - List<String> dynamicFields = new ArrayList<>(dynamicFieldsMap.values()); - List<String> collect = fieldList.stream().map(TbField::getFieldName) - .collect(Collectors.toList()); - boolean flag = new ArrayList<>(dynamicFields).containsAll(collect); - if (dynamicFields.size() != collect.size() || !flag) { - throw new ServiceException("导入失败,请下载最新的导入模板"); - } LocalDate now = LocalDate.now(); TbBasicData tbBasicData; - Optional<TbBasicData> tbBasicDataOpt = tbBasicDataService.lambdaQuery(). - eq(TbBasicData::getQuarter, quarter) - .eq(TbBasicData::getDeptAreaCode, areaCode).oneOpt(); + Optional<TbBasicData> tbBasicDataOpt = basicDataList.stream() + .filter(basicData -> basicData.getDeptAreaCode().equals(areaCode)).findFirst(); tbBasicData = tbBasicDataOpt.orElseGet(TbBasicData::new); tbBasicData.setQuarter(quarter); tbBasicData.setTransferPaymentScale(dataMap.get(2)); @@ -168,11 +183,15 @@ tbBasicData.setRemark(dataMap.get(remarkIndex)); tbBasicData.setStatus(ReportingStatusEnum.MISSING_DATA); tbBasicData.setReportingTime(DateUtils.getQuarterDate(quarter)); + long count = dataMap.entrySet().stream() + .filter(entry -> StringUtils.isBlank(entry.getValue())).count(); + tbBasicData.setStatus( + count > 0 ? ReportingStatusEnum.MISSING_DATA : ReportingStatusEnum.FILLED); tbBasicDataService.saveOrUpdate(tbBasicData); tbBasicDataFieldService.remove(Wrappers.<TbBasicDataField>lambdaQuery() .eq(TbBasicDataField::getBasicDataId, tbBasicData.getId())); List<TbBasicDataField> fields = new ArrayList<>(); - //添加固定字段 转移支付规模、当期GDP + // 添加固定字段 转移支付规模、当期GDP TbBasicDataField transferPaymentScale = new TbBasicDataField(); transferPaymentScale.setBasicDataId(tbBasicData.getId()); transferPaymentScale.setFieldId(-1L); @@ -186,8 +205,8 @@ currentGdp.setFieldName("当期GDP"); currentGdp.setFieldValue(tbBasicData.getCurrentGdp()); fields.add(currentGdp); - //遍历动态字段map - for (Map.Entry<Integer, String> integerStringEntry : dynamicFieldsMap.entrySet()) { + // 遍历动态字段map + /*for (Map.Entry<Integer, String> integerStringEntry : dynamicFieldsMap.entrySet()) { Optional<TbField> tbField = tbFieldService.lambdaQuery() .eq(TbField::getFieldName, integerStringEntry.getValue()) .eq(TbField::getStatus, ShowStatusEnum.SHOW).oneOpt(); @@ -201,17 +220,101 @@ tbBasicDataField.setFieldValue(value); fields.add(tbBasicDataField); } + }*/ + // 遍历动态字段map + for (Entry<Integer, String> entry : dynamicFieldsMap.entrySet()) { + Integer key = entry.getKey(); + String fieldStr = entry.getValue(); + String categoryOne = dynamicCategoryOneMap.get(key); + String categoryTwo = dynamicCategoryTwoMap.get(key); + String categoryThree = dynamicCategoryThreeMap.get(key); + + TbField field = getFieldByFieldName(fieldList, categoryOne, categoryTwo, + categoryThree, fieldStr); + + if (Objects.nonNull(field)) { + String value = dataMap.get(key); + TbBasicDataField tbBasicDataField = new TbBasicDataField(); + tbBasicDataField.setBasicDataId(tbBasicData.getId()); + tbBasicDataField.setFieldId(field.getId()); + tbBasicDataField.setFieldName(field.getFieldName()); + tbBasicDataField.setFieldValue(value); + fields.add(tbBasicDataField); + } } tbBasicDataFieldService.saveBatch(fields); - tbBasicData.setStatus(ReportingStatusEnum.FILLED); - tbBasicDataService.updateById(tbBasicData); - CompletableFuture.runAsync(() -> { - calculateScore(tbBasicData, fields); - calculateScreenScore(tbBasicData, fields); - }); + // CompletableFuture.runAsync(() -> { + // calculateScore(tbBasicData, fields); + // calculateScreenScore(tbBasicData, fields); + // }); + asyncService.calculateScoreWithFixedRules(tbBasicData, fields, fieldList); } log.info(String.format("%s导入基础数据成功!", JSON.toJSONString(dataMapList))); } + + private TbField getFieldByFieldName(List<TbField> fieldList, String categoryOne, + String categoryTwo, + String categoryThree, + String fieldStr) { + TbField field = null; + if (!fieldList.isEmpty()) { + /* + 判断字段有几级分类,如果字段如果fieldStr与categoryTwo不同,说明该字段有二级分类。 + 如果字段如果fieldStr与categoryThree不同,说明该字段有三级分类。 + res = 1 表示只有一级分类 res=2 表示该字段有二级分类,res=3表示该字段有三级分类 + */ + int res = + !fieldStr.equals(categoryTwo) ? (!fieldStr.equals(categoryThree) ? 3 : 2) : 1; + Optional<TbField> fieldOptional = Optional.empty(); + switch (res) { + case 1: + fieldOptional = fieldList.stream() + .filter(item -> item.getFieldName().equals(fieldStr) + && item.getLevelOneCategory().equals(categoryOne) + && item.getStatus() + == ShowStatusEnum.SHOW) + .findFirst(); + if (fieldOptional.isPresent()) { + field = fieldOptional.get(); + field.setFieldName(categoryOne + "-" + field.getFieldName()); + } + break; + case 2: + fieldOptional = fieldList.stream() + .filter(item -> item.getFieldName().equals(fieldStr) + && item.getLevelOneCategory().equals(categoryOne) + && item.getStatus() + == ShowStatusEnum.SHOW) + .filter(item -> item.getLevelTwoCategory().equals(categoryTwo)) + .findFirst(); + if (fieldOptional.isPresent()) { + field = fieldOptional.get(); + field.setFieldName( + categoryOne + "-" + categoryTwo + "-" + field.getFieldName()); + } + break; + case 3: + fieldOptional = fieldList.stream() + .filter(item -> item.getFieldName().equals(fieldStr) + && item.getLevelOneCategory().equals(categoryOne) + && item.getStatus() + == ShowStatusEnum.SHOW) + .filter(item -> item.getLevelTwoCategory().equals(categoryTwo)) + .filter(item -> item.getLevelThreeCategory() + .equals(categoryThree)) + .findFirst(); + if (fieldOptional.isPresent()) { + field = fieldOptional.get(); + field.setFieldName( + categoryOne + "-" + categoryTwo + "-" + categoryThree + "-" + + field.getFieldName()); + } + break; + } + } + return field; + } + /** * 需要导入的数据 @@ -225,6 +328,16 @@ } } return null; + } + + @NotNull + private static Map<Integer, String> getDynamicHeadMap(Map<Integer, String> headMap, + int remarkIndex) { + Map<Integer, String> dynamicFieldsMap = headMap.entrySet().stream() + .filter(entry -> !(Lists.newArrayList(0, 1, 2, 3).contains(entry.getKey()) + || entry.getKey() == remarkIndex)) + .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); + return dynamicFieldsMap; } /** @@ -293,7 +406,7 @@ */ private void calculateScore(TbBasicData tbBasicData, List<TbBasicDataField> fields) { List<TbScore> scoreList = new ArrayList<>(); - //计算得分 + // 计算得分 List<TbBasicDataConfig> list = tbBasicDataConfigService.lambdaQuery() .eq(TbBasicDataConfig::getStatus, ShowStatusEnum.SHOW).list(); if (CollectionUtils.isEmpty(list)) { @@ -371,7 +484,7 @@ Double.parseDouble(stringStringEntry.getValue())); } } - //如果都不匹配,得分为0 + // 如果都不匹配,得分为0 if (Objects.isNull(tbScore.getScore())) { tbScore.setScore(0D); } diff --git a/finance-system/src/main/java/com/finance/system/service/AsyncService.java b/finance-system/src/main/java/com/finance/system/service/AsyncService.java new file mode 100644 index 0000000..d228152 --- /dev/null +++ b/finance-system/src/main/java/com/finance/system/service/AsyncService.java @@ -0,0 +1,20 @@ +package com.finance.system.service; + +import com.finance.system.domain.TbBasicData; +import com.finance.system.domain.TbBasicDataField; +import com.finance.system.domain.TbField; +import java.util.List; + +/** + * @author mitao + * @date 2024/7/5 + */ +public interface AsyncService { + + void calculateScore(TbBasicData tbBasicData, List<TbBasicDataField> fields); + + void asyncTask(); + + void calculateScoreWithFixedRules(TbBasicData tbBasicData, List<TbBasicDataField> fields, + List<TbField> fieldList); +} diff --git a/finance-system/src/main/java/com/finance/system/service/TbBasicDataConfigService.java b/finance-system/src/main/java/com/finance/system/service/TbBasicDataConfigService.java index 3690ac7..f3d5111 100644 --- a/finance-system/src/main/java/com/finance/system/service/TbBasicDataConfigService.java +++ b/finance-system/src/main/java/com/finance/system/service/TbBasicDataConfigService.java @@ -12,6 +12,7 @@ import com.finance.system.vo.BasicDataConfigDetailVO; import com.finance.system.vo.BasicDataConfigVO; import com.finance.system.vo.ScoreCalculateVO; +import java.util.List; /** * <p> @@ -40,4 +41,6 @@ Page<BasicDataConfigVO> queryPage(Page<BasicDataConfigVO> objectPage, BasicDataConfigQuery query); + + List<BasicDataConfigVO> getFixedRulesConfigList(); } diff --git a/finance-system/src/main/java/com/finance/system/service/impl/AsyncServiceImpl.java b/finance-system/src/main/java/com/finance/system/service/impl/AsyncServiceImpl.java new file mode 100644 index 0000000..46451c7 --- /dev/null +++ b/finance-system/src/main/java/com/finance/system/service/impl/AsyncServiceImpl.java @@ -0,0 +1,394 @@ +package com.finance.system.service.impl; + +import com.alibaba.fastjson2.JSONArray; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.finance.common.enums.BasicDataFieldEnum; +import com.finance.common.enums.CalculateTypeEnum; +import com.finance.common.enums.IndicatorItemEnum; +import com.finance.common.enums.ShowStatusEnum; +import com.finance.common.enums.ValueTypeEnum; +import com.finance.common.exception.ServiceException; +import com.finance.common.utils.CalculateUtil; +import com.finance.common.utils.CollUtils; +import com.finance.common.utils.StringUtils; +import com.finance.system.domain.TbBasicData; +import com.finance.system.domain.TbBasicDataConfig; +import com.finance.system.domain.TbBasicDataConfigDetail; +import com.finance.system.domain.TbBasicDataField; +import com.finance.system.domain.TbField; +import com.finance.system.domain.TbScore; +import com.finance.system.dto.CalculateItemDTO; +import com.finance.system.mapper.TbBasicDataMapper; +import com.finance.system.service.AsyncService; +import com.finance.system.service.TbBasicDataCategoryService; +import com.finance.system.service.TbBasicDataConfigDetailService; +import com.finance.system.service.TbBasicDataConfigService; +import com.finance.system.service.TbBasicDataFieldService; +import com.finance.system.service.TbScoreService; +import com.finance.system.vo.BasicDataConfigVO; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +/** + * @author mitao + * @date 2024/7/5 + */ +@Service +@RequiredArgsConstructor +public class AsyncServiceImpl implements AsyncService { + + private final TbScoreService tbScoreService; + private final TbBasicDataFieldService tbBasicDataFieldService; + private final TbBasicDataConfigService tbBasicDataConfigService; + private final TbBasicDataCategoryService tbBasicDataCategoryService; + private final TbBasicDataConfigDetailService tbBasicDataConfigDetailService; + private final TbBasicDataMapper tbBasicDataMapper; + + @Async + @Override + public void calculateScore(TbBasicData tbBasicData, List<TbBasicDataField> fields) { + List<TbScore> scoreList = new ArrayList<>(); + // 计算得分 + List<TbBasicDataConfig> list = tbBasicDataConfigService.lambdaQuery() + .eq(TbBasicDataConfig::getStatus, ShowStatusEnum.SHOW).list(); + if (CollectionUtils.isEmpty(list)) { + throw new ServiceException("计算得分失败,平台未配置得分计算规则"); + } + List<TbBasicDataConfig> numCalculates = list.stream() + .filter(item -> CalculateTypeEnum.NUMBER.equals(item.getCalculateType())) + .collect(Collectors.toList()); + List<TbBasicDataConfig> textAndPercentages = list.stream() + .filter(item -> !CalculateTypeEnum.NUMBER.equals(item.getCalculateType())) + .collect(Collectors.toList()); + tbScoreService.remove( + new LambdaQueryWrapper<TbScore>().eq(TbScore::getBasicDataId, tbBasicData.getId())); + Map<Long, TbBasicDataField> basicDataFieldMap = fields.stream() + .collect(Collectors.toMap(TbBasicDataField::getFieldId, e -> e)); + if (CollUtils.isNotEmpty(numCalculates)) { + for (TbBasicDataConfig item : numCalculates) { + String numberCalculateFormula = item.getNumberCalculateFormula(); + List<CalculateItemDTO> calculateItemDTOS = JSONArray.parseArray( + numberCalculateFormula, + CalculateItemDTO.class); + for (CalculateItemDTO dto : calculateItemDTOS) { + if (ValueTypeEnum.FIELD.equals(dto.getValueType())) { + TbBasicDataField tbBasicDataField = basicDataFieldMap.get( + Long.valueOf(dto.getContent())); + if (Objects.nonNull(tbBasicDataField)) { + dto.setContent(tbBasicDataField.getFieldValue()); + } + } + } + String numberCalculateFormulaStr = calculateItemDTOS.stream() + .map(CalculateItemDTO::getContent).collect(Collectors.joining()); + double score = CalculateUtil.calculate(numberCalculateFormulaStr); + if (Objects.nonNull(item.getMaxScore()) && score > item.getMaxScore()) { + score = item.getMaxScore(); + } + TbScore tbScore = new TbScore(); + tbScore.setBasicDataId(tbBasicData.getId()); + tbScore.setScore(score); + tbScore.setBasicDataConfigId(item.getId()); + scoreList.add(tbScore); + } + } + if (CollUtils.isNotEmpty(textAndPercentages)) { + for (TbBasicDataConfig textAndPercentage : textAndPercentages) { + TbScore tbScore = new TbScore(); + List<TbBasicDataConfigDetail> details = tbBasicDataConfigDetailService.lambdaQuery() + .eq(TbBasicDataConfigDetail::getBasicDataConfigId, + textAndPercentage.getId()) + .list(); + Map<String, String> scoreMap = details.stream().collect( + Collectors.toMap(TbBasicDataConfigDetail::getKey, + TbBasicDataConfigDetail::getValue)); + if (CollectionUtils.isNotEmpty(details)) { + TbBasicDataField textAndPercentageData = basicDataFieldMap.get( + Long.valueOf(textAndPercentage.getFieldIdStr())); + if (Objects.nonNull(textAndPercentageData)) { + if (CalculateTypeEnum.TEXT.equals(textAndPercentage.getCalculateType())) { + String score = scoreMap.get(textAndPercentageData.getFieldValue()); + tbScore.setBasicDataId(tbBasicData.getId()); + tbScore.setScore(Double.parseDouble(score)); + tbScore.setBasicDataConfigId(textAndPercentage.getId()); + scoreList.add(tbScore); + } + if (CalculateTypeEnum.PERCENTAGE.equals( + textAndPercentage.getCalculateType())) { + for (Entry<String, String> stringStringEntry : scoreMap.entrySet()) { + String[] split = stringStringEntry.getKey().split("_"); + double v = Double.parseDouble( + textAndPercentageData.getFieldValue()); + double min = Double.parseDouble(split[0]); + double max = Double.parseDouble(split[1]); + if (v >= min && v <= max) { + tbScore.setScore( + Double.parseDouble(stringStringEntry.getValue())); + } + } + // 如果都不匹配,得分为0 + if (Objects.isNull(tbScore.getScore())) { + tbScore.setScore(0D); + } + tbScore.setBasicDataId(tbBasicData.getId()); + tbScore.setBasicDataConfigId(textAndPercentage.getId()); + scoreList.add(tbScore); + } + } + } + } + } + tbScoreService.saveBatch(scoreList); + } + + @Async("asyncTaskExecutor") + @Override + public void asyncTask() { + long startTime = System.currentTimeMillis(); + try { + // 模拟耗时 + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + long endTime = System.currentTimeMillis(); + System.out.println(Thread.currentThread().getName() + ":void asyncTask(),耗时:" + (endTime + - startTime)); + } + + @Override + public void calculateScoreWithFixedRules(TbBasicData tbBasicData, + List<TbBasicDataField> fields, List<TbField> fieldList) { + List<BasicDataConfigVO> fixedRulesConfigList = tbBasicDataConfigService.getFixedRulesConfigList(); + // 查询四川省的基础数据 + TbBasicData provinceBasicData = tbBasicDataMapper.selectOne( + Wrappers.lambdaQuery(TbBasicData.class) + .eq(TbBasicData::getDeptAreaCode, "510000") + .eq(TbBasicData::getQuarter, tbBasicData.getQuarter())); + if (Objects.isNull(provinceBasicData)) { + throw new ServiceException("四川省未上传该季度基础数据,请联系管理员"); + } + List<TbBasicDataField> provinceFields = tbBasicDataFieldService.lambdaQuery() + .eq(TbBasicDataField::getBasicDataId, provinceBasicData.getId()).list(); + // 四川省的基础数据字段 + Map<Long, TbBasicDataField> provinceFieldsMap = provinceFields.stream() + .collect(Collectors.toMap(TbBasicDataField::getFieldId, Function.identity())); + // 待计算的基础数据字段 + Map<Long, TbBasicDataField> deptFieldsMap = fields.stream() + .collect(Collectors.toMap(TbBasicDataField::getFieldId, Function.identity())); + List<TbScore> scoreList = new ArrayList<>(); + for (BasicDataConfigVO vo : fixedRulesConfigList) { + double score = 0D; + // 1:财政经济形势-收入占GDP比重-地方一般公共预算收入占GDP的比重; + if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM1.getCode()) { + // 获取所需字段 + TbBasicDataField provinceField = provinceFieldsMap.get( + BasicDataFieldEnum.BASIC_DATA_FIELD2.getCode()); + TbBasicDataField deptField = deptFieldsMap.get( + BasicDataFieldEnum.BASIC_DATA_FIELD2.getCode()); + score = getScore(deptField.getFieldValue(), tbBasicData.getCurrentGdp(), + provinceField.getFieldValue(), provinceBasicData.getCurrentGdp(), vo); + } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM2.getCode()) { + // 2:财政经济形势-收入执行率-地方一般公共预算收入执行进度(地方一般公共预算收入/年初预算或调整预算); + + } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM3.getCode()) { + // 3:财政经济形势-收入执行率-政府性基金预算收入执行进度(政府性基金预算收入/年初预算或调整预算) + } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM4.getCode()) { + // 4:财政经济形势-收入质量-税收收入占地方一般公共预算收入比重 + // 获取所需字段 + TbBasicDataField provinceField = provinceFieldsMap.get( + BasicDataFieldEnum.BASIC_DATA_FIELD3.getCode()); + TbBasicDataField deptField = deptFieldsMap.get( + BasicDataFieldEnum.BASIC_DATA_FIELD3.getCode()); + TbBasicDataField provinceField2 = provinceFieldsMap.get( + BasicDataFieldEnum.BASIC_DATA_FIELD2.getCode()); + TbBasicDataField deptField2 = deptFieldsMap.get( + BasicDataFieldEnum.BASIC_DATA_FIELD2.getCode()); + score = getScore(deptField.getFieldValue(), deptField2.getFieldValue(), + provinceField.getFieldValue(), provinceField2.getFieldValue(), vo); + } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM5.getCode()) { + + } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM6.getCode()) { + + } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM7.getCode()) { + TbField field = getFieldByFieldName(fieldList, "(一)一般公共预算", + "上级补助收入", "", + "执行数"); + + TbField field2 = getFieldByFieldName(fieldList, "(一)一般公共预算", + "综合财力(本级收入+上级补助-上解+下级上解收入-补助下级支出)", "", + "执行数"); + if (Objects.nonNull(field) && Objects.nonNull(field2)) { + TbBasicDataField provinceField = provinceFieldsMap.get(field.getId()); + TbBasicDataField deptField = deptFieldsMap.get(field.getId()); + TbBasicDataField provinceField2 = provinceFieldsMap.get(field2.getId()); + TbBasicDataField deptField2 = deptFieldsMap.get(field2.getId()); + score = getScore(deptField.getFieldValue(), deptField2.getFieldValue(), + provinceField.getFieldValue(), provinceField2.getFieldValue(), vo); + } + } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM8.getCode()) { + TbField field = getFieldByFieldName(fieldList, "(四)“三保”保障情况", + "地方标准“三保”支出(以地方实际结构填列,含国标)", "保基本民生", + "保基本民生"); + + } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM9.getCode()) { + + } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM10.getCode()) { + + } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM11.getCode()) { + + } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM12.getCode()) { + + } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM13.getCode()) { + + } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM14.getCode()) { + + } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM15.getCode()) { + + } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM16.getCode()) { + + } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM17.getCode()) { + + } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM18.getCode()) { + + } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM19.getCode()) { + + } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM20.getCode()) { + + } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM21.getCode()) { + + } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM22.getCode()) { + + } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM23.getCode()) { + + } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM24.getCode()) { + + } + TbScore tbScore = new TbScore(); + tbScore.setScore((double) score); + tbScore.setBasicDataId(tbBasicData.getId()); + tbScore.setBasicDataConfigId(vo.getId()); + scoreList.add(tbScore); + } + } + + /** + * 通用计算公式获取得分 + * + * @param deptDividendValueStr 部门被除数字段值 + * @param deptDivisorValueStr 部门除数字段值 + * @param provinceDividendValueStr 省份被除数字段值 + * @param provinceDivisorValueStr 省份除数字段值 + * @param vo 基础数据配置 + * @return 得分 + */ + private Double getScore(String deptDividendValueStr, String deptDivisorValueStr, + String provinceDividendValueStr, String provinceDivisorValueStr, BasicDataConfigVO vo) { + BigDecimal score = BigDecimal.ZERO; + BigDecimal provinceDividendValue = BigDecimal.valueOf( + Long.parseLong(provinceDividendValueStr)); + BigDecimal provinceDivisorValue = BigDecimal.valueOf( + Long.parseLong(provinceDivisorValueStr)); + BigDecimal deptDividendValue = BigDecimal.valueOf( + Long.parseLong(deptDividendValueStr)); + BigDecimal deptDivisorValue = BigDecimal.valueOf( + Long.parseLong(deptDivisorValueStr)); + // 开始计算 + BigDecimal deptDivided = BigDecimal.ZERO; + + if (deptDivisorValue.compareTo(BigDecimal.ZERO) > 0) { + deptDivided = deptDividendValue.divide(deptDivisorValue, 2, RoundingMode.HALF_UP); + } + BigDecimal provinceDivided = BigDecimal.ZERO; + + if (provinceDivisorValue.compareTo(BigDecimal.ZERO) > 0) { + provinceDivided = provinceDividendValue.divide(provinceDivisorValue, 2, + RoundingMode.HALF_UP); + } + if (deptDivided.compareTo(provinceDivided) < 0) { + score = deptDivided.subtract(provinceDivided) + .multiply(BigDecimal.valueOf(100L)) + .add(BigDecimal.valueOf(vo.getMaxScore())); + score = score.compareTo(BigDecimal.ZERO) >= 0 ? score : BigDecimal.ZERO; + } else { + score = BigDecimal.valueOf(vo.getMaxScore()); + } + return score.doubleValue(); + } + + private TbField getFieldByFieldName(List<TbField> fieldList, String categoryOne, + String categoryTwo, + String categoryThree, + String fieldStr) { + TbField field = null; + if (!fieldList.isEmpty()) { + /* + 判断字段有几级分类,如果字段如果fieldStr与categoryTwo不同,说明该字段有二级分类。 + 如果字段如果fieldStr与categoryThree不同,说明该字段有三级分类。 + res = 1 表示只有一级分类 res=2 表示该字段有二级分类,res=3表示该字段有三级分类 + */ + int res = StringUtils.isNotBlank(categoryThree) ? 3 + : StringUtils.isNotBlank(categoryTwo) ? 2 : 1; + Optional<TbField> fieldOptional = Optional.empty(); + switch (res) { + case 1: + fieldOptional = fieldList.stream() + .filter(item -> item.getFieldName().equals(fieldStr) + && item.getLevelOneCategory().equals(categoryOne) + && item.getStatus() + == ShowStatusEnum.SHOW) + .findFirst(); + if (fieldOptional.isPresent()) { + field = fieldOptional.get(); + field.setFieldName(categoryOne + "-" + field.getFieldName()); + } + break; + case 2: + fieldOptional = fieldList.stream() + .filter(item -> item.getFieldName().equals(fieldStr) + && item.getLevelOneCategory().equals(categoryOne) + && item.getStatus() + == ShowStatusEnum.SHOW) + .filter(item -> item.getLevelTwoCategory().equals(categoryTwo)) + .findFirst(); + if (fieldOptional.isPresent()) { + field = fieldOptional.get(); + field.setFieldName( + categoryOne + "-" + categoryTwo + "-" + field.getFieldName()); + } + break; + case 3: + fieldOptional = fieldList.stream() + .filter(item -> item.getFieldName().equals(fieldStr) + && item.getLevelOneCategory().equals(categoryOne) + && item.getStatus() + == ShowStatusEnum.SHOW) + .filter(item -> item.getLevelTwoCategory().equals(categoryTwo)) + .filter(item -> item.getLevelThreeCategory() + .equals(categoryThree)) + .findFirst(); + if (fieldOptional.isPresent()) { + field = fieldOptional.get(); + field.setFieldName( + categoryOne + "-" + categoryTwo + "-" + categoryThree + "-" + + field.getFieldName()); + } + break; + } + } + return field; + } +} diff --git a/finance-system/src/main/java/com/finance/system/service/impl/TbBasicDataConfigServiceImpl.java b/finance-system/src/main/java/com/finance/system/service/impl/TbBasicDataConfigServiceImpl.java index 45d60b4..8d7d98d 100644 --- a/finance-system/src/main/java/com/finance/system/service/impl/TbBasicDataConfigServiceImpl.java +++ b/finance-system/src/main/java/com/finance/system/service/impl/TbBasicDataConfigServiceImpl.java @@ -15,6 +15,7 @@ import com.finance.common.utils.Checker; import com.finance.common.utils.CollUtils; import com.finance.common.utils.StringUtils; +import com.finance.system.domain.TbBasicDataCategory; import com.finance.system.domain.TbBasicDataConfig; import com.finance.system.domain.TbBasicDataConfigDetail; import com.finance.system.domain.TbField; @@ -36,7 +37,9 @@ import com.finance.system.vo.ScoreCalculateVO; import java.util.Arrays; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.function.Function; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -133,11 +136,11 @@ if (result) { throw new ServiceException("计算表达式有误,请修改"); } - //参数校验 + // 参数校验 String numberCalculateFormulaStr = calculateItemList.stream() .map(CalculateItemDTO::getContent) .collect(Collectors.joining()); - //校验表达式是否正确 + // 校验表达式是否正确 try { CalculateUtil.calculate(numberCalculateFormulaStr); } catch (Exception e) { @@ -156,7 +159,7 @@ @Transactional(rollbackFor = Exception.class) public void edit(BasicDataConfigUpdateDTO dto) { TbBasicDataConfig tbBasicDataConfig = BeanUtils.copyBean(dto, TbBasicDataConfig.class); - //参数校验 + // 参数校验 CalculateTypeEnum calculateType = tbBasicDataConfig.getCalculateType(); List<CalculateDTO> dtoList = dto.getDtoList(); if (CalculateTypeEnum.NUMBER.equals(calculateType)) { @@ -169,7 +172,7 @@ if (CollUtils.isEmpty(dtoList)) { throw new ServiceException("计算公式不能为空"); } - //删除原来的配置信息,重新添加新的 + // 删除原来的配置信息,重新添加新的 tbBasicDataConfigDetailService.lambdaUpdate() .eq(TbBasicDataConfigDetail::getBasicDataConfigId, tbBasicDataConfig.getId()) .remove(); @@ -231,7 +234,7 @@ throw new ServiceException("非法参数"); } if (ShowStatusEnum.SHOW.equals(dto.getStatus())) { - //查询改配置所使用字段状态 + // 查询改配置所使用字段状态 String fieldIdStr = config.getFieldIdStr(); String[] split = fieldIdStr.split(","); List<TbField> list = fieldMapper.selectList( @@ -259,4 +262,30 @@ BasicDataConfigQuery query) { return baseMapper.queryPage(page, query); } + + @Override + public List<BasicDataConfigVO> getFixedRulesConfigList() { + List<TbBasicDataConfig> configList = this.lambdaQuery() + .le(TbBasicDataConfig::getId, 24).list(); + Map<Long, TbBasicDataCategory> configCategoryMap = tbBasicDataCategoryService.list() + .stream() + .collect(Collectors.toMap(TbBasicDataCategory::getId, + Function.identity())); + List<BasicDataConfigVO> configVOList = BeanUtils.copyList(configList, + BasicDataConfigVO.class); + configVOList = configVOList.stream().map(c -> { + TbBasicDataCategory tbBasicDataCategory2 = configCategoryMap.get( + c.getBasicDataCategoryId()); + if (Objects.nonNull(tbBasicDataCategory2)) { + c.setBasicDataCategory(tbBasicDataCategory2.getBasicDataCategoryName()); + TbBasicDataCategory tbBasicDataCategory1 = configCategoryMap.get( + tbBasicDataCategory2.getParentId()); + if (Objects.nonNull(tbBasicDataCategory1)) { + c.setBasicDataCategoryOne(tbBasicDataCategory1.getBasicDataCategoryName()); + } + } + return c; + }).collect(Collectors.toList()); + return configVOList; + } } 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 66e852c..6c97002 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 @@ -48,6 +48,7 @@ import com.finance.system.query.CurrentFieldsQuery; import com.finance.system.query.ScoreCalculateQuery; import com.finance.system.query.ScoreQuery; +import com.finance.system.service.AsyncService; import com.finance.system.service.ISysUserService; import com.finance.system.service.TbBasicDataConfigDetailService; import com.finance.system.service.TbBasicDataConfigService; @@ -114,7 +115,7 @@ private final TbOperLogService tbOperLogService; private final TbDataScreenScoreService tbDataScreenScoreService; private final TbDataScreenConfigService tbDataScreenConfigService; - + private final AsyncService asyncService; public static void setFieldValues( List<FieldsTreeVO> fields, Map<Long, TbBasicDataField> fieldMap) { @@ -231,7 +232,7 @@ tbBasicData.setId(basicDataOpt.get().getId()); tbBasicData.setDeptAreaCode(areaCode); this.updateById(tbBasicData); - //查询该基础数据的动态字端 + // 查询该基础数据的动态字端 List<TbBasicDataField> originFields = tbBasicDataFieldService.lambdaQuery() .eq(TbBasicDataField::getBasicDataId, tbBasicData.getId()).list(); CompletableFuture.runAsync( @@ -468,12 +469,13 @@ LocalDate quarterStartLocalDate = instant.atZone(ZoneId.systemDefault()).toLocalDate(); LocalDate fifteenDaysLimit = quarterStartLocalDate.plusDays(14); LocalDate now = LocalDate.now(); - //TODO + // TODO /* if (now.isBefore(quarterStartLocalDate) || now.isAfter(fifteenDaysLimit)) { throw new ServiceException("请于季度初1-15号上传季度数据。"); }*/ LoginUser loginUser = SecurityUtils.getLoginUser(); String areaCode = loginUser.getUser().getAreaCode(); + String nowQuarter = DateUtils.getNowQuarter(); EasyExcel.read( file.getInputStream(), new BasicDataListener( @@ -483,7 +485,9 @@ tbBasicDataFieldService, tbBasicDataConfigService, tbBasicDataConfigDetailService, - tbScoreService, tbDataScreenScoreService, tbDataScreenConfigService)) + tbScoreService, tbDataScreenScoreService, nowQuarter, + tbDataScreenConfigService, + asyncService)) .sheet() .headRowNumber(0) .doRead(); @@ -880,7 +884,7 @@ @Override @Transactional(rollbackFor = Exception.class) public void importData(MultipartFile file, String quarter) throws IOException { - //校验季度 + // 校验季度 Date quarterDate = DateUtils.getQuarterDate(quarter); Map<String, Date> quarterMap = DateUtils.getQuarterDate(new Date()); @@ -900,8 +904,9 @@ tbBasicDataConfigService, tbBasicDataConfigDetailService, tbScoreService, sysUserService, quarter, tbDataScreenScoreService, - tbDataScreenConfigService)) + tbDataScreenConfigService, asyncService)) .sheet() + .headRowNumber(0) .doRead(); } @@ -913,49 +918,49 @@ response.setHeader( "Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx"); - //季度数据,用于反查字段 + // 季度数据,用于反查字段 List<TbBasicData> tbBasicDataList = this.lambdaQuery() .in(TbBasicData::getQuarter, quarterList) .eq(TbBasicData::getStatus, ReportingStatusEnum.FILLED) .groupBy(TbBasicData::getQuarter).list(); - //符合导出条件的基础数据 + // 符合导出条件的基础数据 List<TbBasicData> tbBasicDataListAll = this.lambdaQuery() .in(TbBasicData::getQuarter, quarterList) .eq(TbBasicData::getStatus, ReportingStatusEnum.FILLED) .list(); - //基础数据id列表 + // 基础数据id列表 Set<Long> basicDataIdList = tbBasicDataListAll.stream().map(TbBasicData::getId) .collect(Collectors.toSet()); - //涉及到的部门编码 + // 涉及到的部门编码 Set<String> userAreaCodeList = tbBasicDataListAll.stream().map(TbBasicData::getDeptAreaCode) .collect(Collectors.toSet()); - //用户信息map + // 用户信息map Map<String, SysUser> userMap = sysUserService.lambdaQuery() .in(SysUser::getAreaCode, userAreaCodeList).list().stream() .collect(Collectors.toMap(SysUser::getAreaCode, e -> e)); - //基础数据对应的字段值列表 + // 基础数据对应的字段值列表 List<TbBasicDataField> tbBasicDataFieldList = tbBasicDataFieldService.lambdaQuery() .in(TbBasicDataField::getBasicDataId, basicDataIdList) .list(); - //构建Excel写对象 + // 构建Excel写对象 try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()) .registerWriteHandler(new CustomCellWriteHandler()) .registerWriteHandler(EasyExcelUtil.getStyleStrategy()).build()) { WriteSheet writeSheet; - //遍历季度基础数据 + // 遍历季度基础数据 for (TbBasicData tbBasicData : tbBasicDataList) { - //该季度的动态字段id列表 + // 该季度的动态字段id列表 Set<Long> fieldIdList = tbBasicDataFieldList.stream() .filter(item -> tbBasicData.getId().equals(item.getBasicDataId())) .map(TbBasicDataField::getFieldId) .collect(Collectors.toSet()); - //字段列表 + // 字段列表 List<TbField> fieldList = tbFieldService.lambdaQuery() .in(TbField::getId, fieldIdList) .list(); - //表头 + // 表头 List<List<String>> head = head(fieldList); - //过滤基础数据为遍历元素的季度 + // 过滤基础数据为遍历元素的季度 List<TbBasicData> list = tbBasicDataListAll.stream() .filter(item -> tbBasicData.getQuarter().equals(item.getQuarter())) .collect(Collectors.toList()); @@ -973,17 +978,17 @@ private List<List<Object>> dataList(List<TbField> fieldList, List<TbBasicData> list, List<TbBasicDataField> tbBasicDataFieldList, 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,方便遍历的时候取 Map<Long, TbBasicDataField> basicDataFieldMap = tbBasicDataFieldList.stream() .filter(item -> tbBasicData.getId().equals(item.getBasicDataId())) .collect(Collectors.toMap(TbBasicDataField::getFieldId, e -> e)); @@ -1069,14 +1074,14 @@ if (Objects.isNull(dto)) { return; } - //查询基础数据 + // 查询基础数据 TbBasicData basicData = this.getById(dto.getId()); if (Objects.isNull(basicData)) { throw new ServiceException("非法参数"); } String nowQuarter = DateUtils.getNowQuarter(); this.updateById(basicData); - //查询该基础数据的动态字端 + // 查询该基础数据的动态字端 List<TbBasicDataField> originFields = tbBasicDataFieldService.lambdaQuery() .eq(TbBasicDataField::getBasicDataId, basicData.getId()).list(); Set<Long> fieldIdList = originFields.stream().map(TbBasicDataField::getFieldId) diff --git a/finance-system/src/main/java/com/finance/system/service/impl/TbFieldServiceImpl.java b/finance-system/src/main/java/com/finance/system/service/impl/TbFieldServiceImpl.java index 2019f26..5938b04 100644 --- a/finance-system/src/main/java/com/finance/system/service/impl/TbFieldServiceImpl.java +++ b/finance-system/src/main/java/com/finance/system/service/impl/TbFieldServiceImpl.java @@ -322,7 +322,6 @@ .collect(Collectors.toList()); Map<Integer, String[]> selectedMap = new HashMap<>(); if (CollUtils.isNotEmpty(collect)) { - selectedMap = new HashMap<>(); for (TbField tbField : collect) { int outerListIndex = getOuterListIndex(head, tbField.getFieldName()); String[] selectStr = tbField.getTextContent().split(","); diff --git a/finance-system/src/main/java/com/finance/system/vo/BasicDataConfigVO.java b/finance-system/src/main/java/com/finance/system/vo/BasicDataConfigVO.java index 0750b53..6816122 100644 --- a/finance-system/src/main/java/com/finance/system/vo/BasicDataConfigVO.java +++ b/finance-system/src/main/java/com/finance/system/vo/BasicDataConfigVO.java @@ -4,16 +4,15 @@ import com.finance.common.enums.ShowStatusEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - import java.io.Serializable; +import lombok.Data; /** * @author mitao * @date 2024/3/18 */ @Data -@ApiModel(value="基础数据视图对象") +@ApiModel(value = "基础数据视图对象") public class BasicDataConfigVO implements Serializable { private static final long serialVersionUID = -1181996283443136774L; @@ -21,10 +20,16 @@ @ApiModelProperty(value = "基础数据配置id") private Long id; - @ApiModelProperty(value = "类型名称") + @ApiModelProperty(value = "类型名称(三级指标)") private String typeName; - @ApiModelProperty(value = "基础数据所属分类") + @ApiModelProperty(value = "基础数据分类id") + private Long basicDataCategoryId; + + @ApiModelProperty(value = "基础数据所属分类(一级指标)") + private String basicDataCategoryOne; + + @ApiModelProperty(value = "基础数据所属分类(二级指标)") private String basicDataCategory; @ApiModelProperty(value = "计算类型(数字计算 文本统计 百分比统计)") @@ -32,4 +37,7 @@ @ApiModelProperty(value = "隐藏状态") private ShowStatusEnum status; + + @ApiModelProperty(value = "最大分值") + private Double maxScore; } -- Gitblit v1.7.1