From 789b5b823440d174a198a35fd033ca975cb54f4a Mon Sep 17 00:00:00 2001 From: mitao <2763622819@qq.com> Date: 星期三, 27 三月 2024 19:23:13 +0800 Subject: [PATCH] 部门端基础数据导入、得分计算接口 --- ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java | 210 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 208 insertions(+), 2 deletions(-) diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java index b522be8..d755803 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java @@ -1,10 +1,42 @@ package com.ruoyi.system.service.impl; +import com.alibaba.excel.EasyExcel; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.ruoyi.system.domain.TbBasicData; +import com.google.common.collect.Lists; +import com.ruoyi.common.basic.PageDTO; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.enums.ReportingStatusEnum; +import com.ruoyi.common.enums.ShowStatusEnum; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.BeanUtils; +import com.ruoyi.common.utils.CollUtils; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.NumberDisplaceChineseUtil; +import com.ruoyi.system.domain.*; +import com.ruoyi.system.dto.BasicDataDTO; +import com.ruoyi.system.listener.BasicDataListener; import com.ruoyi.system.mapper.TbBasicDataMapper; -import com.ruoyi.system.service.TbBasicDataService; +import com.ruoyi.system.query.ScoreQuery; +import com.ruoyi.system.service.*; +import com.ruoyi.system.vo.BasicDataReportingVO; +import com.ruoyi.system.vo.FieldReportingVO; +import com.ruoyi.system.vo.ScoreVO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.net.URLEncoder; +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; /** * <p> @@ -14,7 +46,181 @@ * @author mitao * @since 2024-03-13 */ +@Slf4j @Service +@RequiredArgsConstructor public class TbBasicDataServiceImpl extends ServiceImpl<TbBasicDataMapper, TbBasicData> implements TbBasicDataService { + private final TbDeptService tbDeptService; + private final HttpServletResponse response; + private final TbFieldService tbFieldService; + private final TbBasicDataFieldService tbBasicDataFieldService; + private final TbBasicDataConfigService tbBasicDataConfigService; + private final TbBasicDataConfigDetailService tbBasicDataConfigDetailService; + private final TbScoreService scoreService; + @Override + public R<BasicDataReportingVO> getBasicFields(String deptAreaCode) throws Exception { + BasicDataReportingVO vo = new BasicDataReportingVO(); + //校验区划代码 + TbDept dept = tbDeptService.getOne(Wrappers.<TbDept>lambdaQuery().eq(TbDept::getAreaCode, deptAreaCode)); + if (Objects.isNull(dept)) { + throw new ServiceException(String.format("区划代码%s不存在", deptAreaCode)); + } + Date date = new Date(); + //当前所在季度 + int quarterOfYear = DateUtils.getQuarterOfYear(date); + String quarterOfYearStr = NumberDisplaceChineseUtil.numberToChinese(quarterOfYear); + Map<String, Date> quarterDate = DateUtils.getQuarterDate(date); + //当前季度开始 + Date quarterStart = quarterDate.get("first"); + //当前季度结束 + Date quarterEnd = quarterDate.get("last"); + //判断当前时间是否在季度初1-15号 + Instant instant = quarterStart.toInstant(); + LocalDate quarterStartLocalDate = instant.atZone(ZoneId.systemDefault()).toLocalDate(); + LocalDate fifteenDaysLimit = quarterStartLocalDate.plusDays(15); + LocalDate now = LocalDate.now(); + vo.setQuarter(String.format("%s年%s季度",now.getYear(),quarterOfYearStr)); + vo.setStatus(ReportingStatusEnum.UNFILLED); + //如果当前时间不在规定范围内:季度初1-15号 + if (now.isBefore(quarterStartLocalDate) || now.isAfter(fifteenDaysLimit)) { + return R.ok(vo,"请于季度初1-15号上传季度数据。"); + } + //查询是否有当前季度的填报记录 + TbBasicData basicData = this.getOne(Wrappers.<TbBasicData>lambdaQuery() + .eq(TbBasicData::getDeptAreaCode, dept.getAreaCode()) + .between(TbBasicData::getCreateTime, quarterStart,quarterEnd)); + //查询需要填写的字段 + List<TbField> list = tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list(); + if (CollUtils.isNotEmpty(list)) { + List<FieldReportingVO> fieldReportingVOS = BeanUtils.copyList(list, FieldReportingVO.class); + vo.setFields(fieldReportingVOS); + } + if (Objects.isNull(basicData)) { + vo.setQuarter(String.format("%s年%s季度",now.getYear(),quarterOfYearStr)); + vo.setStatus(ReportingStatusEnum.UNFILLED); + return R.ok(vo); + }else { + vo.setStatus(basicData.getStatus()); + //查询已填报数据 包含数据缺失和已填报 + List<TbBasicDataField> basicDataFields = tbBasicDataFieldService.lambdaQuery() + .eq(TbBasicDataField::getBasicDataId, basicData.getId()).list(); + if (CollUtils.isNotEmpty(basicDataFields)) { + Map<Integer, TbBasicDataField> fieldMap = basicDataFields.stream() + .collect(Collectors.toMap(TbBasicDataField::getFieldId, Function.identity())); + vo.getFields().forEach(item -> { + TbBasicDataField tbBasicDataField = fieldMap.get(item.getId()); + if (Objects.nonNull(tbBasicDataField)) { + item.setValue(tbBasicDataField.getFieldValue()); + } + }); + return R.ok(vo); + } + } + return R.ok(vo); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveBasicData(BasicDataDTO dto) { + //TODO + //LoginUser loginUser = SecurityUtils.getLoginUser(); + //数据校验 + if (Objects.isNull(dto) || CollUtils.isEmpty(dto.getFields())) { + return; + } + + TbBasicData tbBasicData = BeanUtils.copyBean(dto, TbBasicData.class); + this.saveOrUpdate(tbBasicData); + //保存基础数据动态字段数据 + List<TbBasicDataField> tbBasicDataFields = BeanUtils.copyList(dto.getFields(), TbBasicDataField.class); + tbBasicDataFields.forEach(item -> item.setBasicDataId(tbBasicData.getId())); + //将该基础数据的动态字段数据全部删除 + tbBasicDataFieldService.remove(null); + tbBasicDataFieldService.saveBatch(tbBasicDataFields); + } + + @Override + public void downloadImportTemplate() throws Exception { + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding("utf-8"); + String fileName = "地方财政运行及“三保”情况统计表"; + // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 + response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx"); + //查询需要填写的动态字段 + List<TbField> list = tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list(); + // 这里需要设置不关闭流 + EasyExcel.write(response.getOutputStream()).head(head(list)) + .autoCloseStream(Boolean.FALSE).sheet("模板") + .doWrite(dataList(list)); + } + + private List<List<Object>> dataList(List<TbField> list) throws Exception { + //TODO + //LoginUser loginUser = SecurityUtils.getLoginUser(); + TbDept dept = tbDeptService.getById(44); + //当前所在季度 + int quarterOfYear = DateUtils.getQuarterOfYear(new Date()); + String quarterOfYearStr = NumberDisplaceChineseUtil.numberToChinese(quarterOfYear); + List<List<Object>> excellist = new ArrayList<List<Object>>(); + List<List<String>> head = head(list); + List<Object> columnNo = Lists.newArrayList("栏号"); + for (int i = 1; i < head.size(); i++) { + columnNo.add(String.valueOf(i)); + } + excellist.add(columnNo); + excellist.add(Lists.newArrayList(dept.getAreaName(), String.format("%s季度",quarterOfYearStr))); + return excellist; + } + + private List<List<String>> head(List<TbField> list) { + List<List<String>> headTitles = Lists.newArrayList(); + //固定字段 + headTitles.add(Lists.newArrayList("地区")); + headTitles.add(Lists.newArrayList("填报季度")); + headTitles.add(Lists.newArrayList("转移支付规模")); + headTitles.add(Lists.newArrayList("当期GDP")); + list.forEach(item ->{ + headTitles.add(Lists.newArrayList(item.getLevelOneCategory(), item.getLevelTwoCategory(), item.getLevelThreeCategory(), item.getFieldName())); + }); + headTitles.add(Lists.newArrayList("备注")); + return headTitles; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void importBasicData(MultipartFile file) throws Exception { + //TODO + //LoginUser loginUser = SecurityUtils.getLoginUser(); + TbDept dept = tbDeptService.getById(44); + //查询需要填写的动态字段 + List<TbField> fieldList = tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list(); + EasyExcel.read(file.getInputStream(), new BasicDataListener(this,fieldList, + tbFieldService,dept,tbBasicDataFieldService,tbBasicDataConfigService, + tbBasicDataConfigDetailService,scoreService)).sheet().doRead(); + } + + @Override + public PageDTO<ScoreVO> pageScore(ScoreQuery query) { + Page<ScoreVO> page = new Page<>(query.getPageNum(), query.getPageSize()); + //todo 获取当前登录部门 + //校验区划代码 + TbDept dept = tbDeptService.getById(44); + Map<String, Date> quarterDate = DateUtils.getQuarterDate(new Date()); + //当前季度开始 + Date quarterStart = quarterDate.get("first"); + //当前季度结束 + Date quarterEnd = quarterDate.get("last"); + //查询是否有当前季度的填报记录 + TbBasicData basicData = this.getOne(Wrappers.<TbBasicData>lambdaQuery() + .eq(TbBasicData::getDeptAreaCode, dept.getAreaCode()) + .between(TbBasicData::getCreateTime, quarterStart,quarterEnd)); + if (Objects.isNull(basicData)) { + return PageDTO.empty(page); + } + query.setBasicDataId(basicData.getId()); + //查询对应的基础数据配置 + List<ScoreVO> vos = scoreService.pageScore(query,page); + return PageDTO.of(page, vos); + } } -- Gitblit v1.7.1