Commit 9efe0df4 authored by dengguangman's avatar dengguangman Committed by Administrator

其他

Signed-off-by: Administrator's avatarAdministrator <admin@example.com>
parent 888762d6
package com.dsk.component;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.dsk.common.excel.ExcelUtils;
import com.dsk.common.exception.ServiceException;
import com.dsk.cscec.constant.CbProjectConstants;
import com.dsk.cscec.domain.CbProjectFile;
import com.dsk.cscec.domain.CbProjectOther;
import com.dsk.cscec.domain.bo.CbProjectBaseBo;
import com.dsk.cscec.service.CbProjectFileService;
import com.dsk.cscec.service.CbProjectOtherService;
import com.dsk.system.service.ISysOssService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 其他费用数据解析组件
*
* @Author lcl
* @Data 2024/2/7 17:43
*/
@Slf4j
@Component
public class CbProjectOtherAnalysisComponent {
@Resource
private CbProjectOtherService projectOtherService;
@Resource
private CbProjectFileService projectFileService;
@Resource
private ISysOssService ossService;
@Resource
private TransactionTemplate transactionTemplate;
/**
* 其他费用数据解析
*/
@Async
public void projectOtherDataAnalysis(CbProjectBaseBo bo) throws Exception {
//查询其他费用导入文件
List<CbProjectFile> fileList = projectFileService.list(Wrappers.<CbProjectFile>lambdaQuery()
.eq(CbProjectFile::getProjectId, bo.getProjectId())
.eq(CbProjectFile::getCbType, CbProjectConstants.CB_TYPE_OTHER_PROJECT)
.eq(CbProjectFile::getCbStage, bo.getCbStage())
.in(CbProjectFile::getFileParseStatus, Arrays.asList(1, 3)));
if (ObjectUtils.isEmpty(fileList)) {
return;
}
//文件处理
for (CbProjectFile file : fileList) {
if (file.getDelFlag() == 0) {
//文件下载
InputStream inputStream = ossService.downFileIO(file.getFileOssId());
if (ObjectUtil.isNull(inputStream)) {
file.setFileParseStatus(3);
file.setFailRemark("文件数据不存在");
projectFileService.updateById(file);
break;
}
//解析数据
List<CbProjectOther> importList = new ExcelUtils<>(CbProjectOther.class).importExcelAllSheet(inputStream, 1);
if (importList.isEmpty()) {
file.setFileParseStatus(3);
file.setFailRemark("表格中不存在待导入数据!");
projectFileService.updateById(file);
break;
}
List<CbProjectOther> projectOtherList = importList.stream().parallel()
.peek(item -> {
item.setProjectId(bo.getProjectId());
item.setCbStage(bo.getCbStage());
item.setCbProjectFileId(file.getId());
}).collect(Collectors.toList());
if (projectOtherList.isEmpty()) {
throw new ServiceException("表格中不存在有效数据数据!");
}
transactionTemplate.execute(status -> {
try {
//分批次插入
if (projectOtherList.size() > 1000) {
int index = 0;
int sum = projectOtherList.size();
while (index < sum) {
List<CbProjectOther> divideList = projectOtherList.subList(index, Math.max((index + 1) * 1000, sum));
boolean b = projectOtherService.saveBatch(divideList);
if (!b) {
throw new ServiceException("数据插入失败!");
}
index += 1000;
}
} else {
boolean b = projectOtherService.saveBatch(projectOtherList);
if (!b) {
throw new ServiceException("数据插入失败!");
}
}
file.setFileParseStatus(2);
boolean b = projectFileService.updateById(file);
if (!b) {
throw new ServiceException("文件状态更新失败!");
}
} catch (Exception e) {
status.setRollbackOnly();
file.setFileParseStatus(3);
file.setFailRemark(e.getMessage());
projectFileService.updateById(file);
}
return Boolean.TRUE;
});
} else {
projectOtherService.remove(Wrappers.<CbProjectOther>lambdaQuery().eq(CbProjectOther::getCbProjectFileId, file.getId()));
projectFileService.removeById(file);
}
}
}
}
......@@ -7,7 +7,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.dsk.common.annotation.Log;
import com.dsk.common.core.domain.R;
import com.dsk.common.enums.BusinessType;
import com.dsk.component.CbProjectOtherAnalysisComponent;
import com.dsk.cscec.domain.CbProjectExpenseSummary;
import com.dsk.cscec.domain.bo.CbProjectBaseBo;
import com.dsk.cscec.domain.bo.CbProjectOtherBo;
......@@ -41,12 +40,9 @@ public class CbProjectOtherController {
@Resource
private CbProjectExpenseSummaryService cbProjectExpenseSummaryService;
@Resource
private CbProjectOtherAnalysisComponent otherAnalysisComponent;
@GetMapping(value = "/projectOther/dataAnalysis")
public R<List<CbProjectExpenseSummary>> projectOtherDataAnalysis(CbProjectBaseBo baseBo) throws Exception{
otherAnalysisComponent.projectOtherDataAnalysis(baseBo);
projectOtherService.projectOtherDataAnalysis(baseBo);
return R.ok();
}
......
......@@ -113,4 +113,9 @@ public class CbProjectOtherImportVo {
* 处理后序号
*/
private String dealWithNumber;
/**
* 项目成本文件id
*/
private Long cbProjectFileId;
}
......@@ -36,15 +36,16 @@ public class CbProjectExpenseSummaryImportListener extends AnalysisEventListener
@Override
public void invoke(CbProjectExpenseSummaryImportVo importVo, AnalysisContext context) {
Integer rowIndex = context.readRowHolder().getRowIndex();
if (StrUtil.isEmpty(importVo.getExpenseName())) {
failureNum++;
failureMsg.append("<br/>" + rowIndex + "行 解析失败:清单内容不能为空");
}
String number = importVo.getNumber();
if (StrUtil.isEmpty(number)) {
failureNum++;
failureMsg.append("<br/>" + rowIndex + "行 解析失败:序号不能为空");
}
// if (StrUtil.isEmpty(importVo.getExpenseName())) {
// failureNum++;
// failureMsg.append("<br/>" + rowIndex + "行 解析失败:清单内容不能为空");
// }
// String number = importVo.getNumber();
// if (StrUtil.isEmpty(number)) {
// failureNum++;
// failureMsg.append("<br/>" + rowIndex + "行 解析失败:序号不能为空");
// }
dataList.add(importVo);
}
@Override
......
......@@ -24,31 +24,32 @@ import java.util.regex.Pattern;
public class CbProjectOtherImportListener extends AnalysisEventListener<CbProjectOtherImportVo> implements ExcelListener<CbProjectOtherImportVo> {
private final Long projectId;
private final Integer cbStage;
private final Long fileId;
private List<CbProjectOtherImportVo> dataList = new ArrayList<>();
private int successNum = 0;
private int failureNum = 0;
private final StringBuilder successMsg = new StringBuilder();
private final StringBuilder failureMsg = new StringBuilder();
public CbProjectOtherImportListener(Long projectId, Integer cbStage) {
this.cbStage = cbStage;
public CbProjectOtherImportListener(Long projectId, Long fileId) {
this.fileId = fileId;
this.projectId = projectId;
}
@Override
public void invoke(CbProjectOtherImportVo importVo, AnalysisContext context) {
Integer rowIndex = context.readRowHolder().getRowIndex();
if (StrUtil.isEmpty(importVo.getItemContent())) {
failureNum++;
failureMsg.append("<br/>" + rowIndex + "行 解析失败:清单内容不能为空");
}
// if (StrUtil.isEmpty(importVo.getItemContent())) {
// failureNum++;
// failureMsg.append("<br/>" + rowIndex + "行 解析失败:清单内容不能为空");
// }
String number = importVo.getNumber();
if (StrUtil.isEmpty(number)) {
failureNum++;
failureMsg.append("<br/>" + rowIndex + "行 解析失败:序号不能为空");
}
importVo.setCbProjectFileId(fileId);
Boolean numberMatch = false;
String regex = "[\\((]*[一|二|三|四|五|六|七|八|九|十]+[\\))]*";
Pattern pattern = Pattern.compile("^\\d+(\\.\\d+)*$");
......
......@@ -2,6 +2,7 @@ package com.dsk.cscec.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.cscec.domain.CbProjectOther;
import com.dsk.cscec.domain.bo.CbProjectBaseBo;
import com.dsk.cscec.domain.bo.CbProjectOtherBo;
import com.dsk.cscec.domain.vo.CbProjectOtherVo;
import org.springframework.web.multipart.MultipartFile;
......@@ -22,5 +23,7 @@ public interface CbProjectOtherService extends IService<CbProjectOther> {
List<Map<String, Object>> listByLevel(Long projectId, int i);
List<CbProjectOtherVo> selectDataList(CbProjectOtherBo projectOtherBo);
void projectOtherDataAnalysis(CbProjectBaseBo baseBo) throws Exception;
}
......@@ -12,7 +12,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsk.common.excel.ExcelResult;
import com.dsk.common.excel.ExcelUtils;
import com.dsk.common.utils.poi.ExcelUtil;
import com.dsk.cscec.constant.CbProjectConstants;
import com.dsk.cscec.domain.*;
......@@ -65,7 +64,7 @@ public class CbProjectOtherServiceImpl extends ServiceImpl<CbProjectOtherMapper,
CbProjectRecord byId = cbProjectRecordService.getById(projectId);
Assert.notNull(byId, "项目信息不能为空");
Integer cbStage = byId.getCbStage();
CbProjectOtherImportListener importListener = new CbProjectOtherImportListener(projectId, cbStage);
CbProjectOtherImportListener importListener = new CbProjectOtherImportListener(projectId, 0L);
EasyExcel.read(file.getInputStream(), CbProjectOtherImportVo.class, importListener).sheet().doRead();
ExcelResult<CbProjectOtherImportVo> result = importListener.getExcelResult();
String analysis = result.getAnalysis();
......@@ -83,6 +82,7 @@ public class CbProjectOtherServiceImpl extends ServiceImpl<CbProjectOtherMapper,
rootProjectOther.setParentId(0L);
rootProjectOther.setProjectId(projectId);
rootProjectOther.setCbStage(cbStage);
rootProjectOther.setCbProjectFileId(0L);
LambdaQueryWrapper<CbProjectOther> tWrapper = Wrappers.lambdaQuery(rootProjectOther);
CbProjectOther rootOther = this.getOne(tWrapper);
......@@ -156,6 +156,7 @@ public class CbProjectOtherServiceImpl extends ServiceImpl<CbProjectOtherMapper,
*@date: 2024/2/23 18:03
*/
@Async
@Override
public void projectOtherDataAnalysis(CbProjectBaseBo baseBo) throws Exception {
// 项目Id
Long projectId = baseBo.getProjectId();
......@@ -165,9 +166,9 @@ public class CbProjectOtherServiceImpl extends ServiceImpl<CbProjectOtherMapper,
// 查询其他费用导入文件
List<CbProjectFile> projectFileList = projectFileService.list(Wrappers.<CbProjectFile>lambdaQuery()
.eq(CbProjectFile::getProjectId, baseBo.getProjectId())
.eq(CbProjectFile::getCbType, CbProjectConstants.CB_TYPE_OTHER_PROJECT)
.eq(CbProjectFile::getCbType, CbProjectConstants.CB_TYPE_SCENE_EXPENSE)
.eq(CbProjectFile::getCbStage, baseBo.getCbStage())
.in(CbProjectFile::getFileParseStatus, Arrays.asList(1, 3)));
.in(CbProjectFile::getFileParseStatus, Arrays.asList(0)));
if (ObjectUtils.isEmpty(projectFileList)) {
return;
}
......@@ -183,24 +184,18 @@ public class CbProjectOtherServiceImpl extends ServiceImpl<CbProjectOtherMapper,
break;
}
//解析数据
List<CbProjectOther> importList = new ExcelUtils<>(CbProjectOther.class).importExcelAllSheet(inputStream, 1);
if (importList.isEmpty()) {
file.setFileParseStatus(3);
file.setFailRemark("表格中不存在待导入数据!");
projectFileService.updateById(file);
break;
}
// 文件名称
String name = file.getFileName();
name = FileNameUtil.getPrefix(name);
// 文件Id
Long fileId = file.getId();
if ("其他费".equals(name)) {
totalDataAnalysis(inputStream, name, file, projectId, cbStage);
break;
}
name = FileNameUtil.getPrefix(name);
//解析数据
ExcelResult<CbProjectOtherImportVo> importVoExcelResult =
ExcelUtil.importExcel(inputStream, CbProjectOtherImportVo.class,new CbProjectOtherImportListener(projectId, cbStage));
ExcelUtil.importExcel(inputStream, CbProjectOtherImportVo.class,new CbProjectOtherImportListener(projectId, fileId));
log.info(importVoExcelResult.getAnalysis());
List<CbProjectOtherImportVo> importVoList = importVoExcelResult.getList();
if (CollectionUtil.isEmpty(importVoList)) {
......@@ -217,6 +212,7 @@ public class CbProjectOtherServiceImpl extends ServiceImpl<CbProjectOtherMapper,
rootProjectOther.setParentId(0L);
rootProjectOther.setProjectId(projectId);
rootProjectOther.setCbStage(cbStage);
rootProjectOther.setCbProjectFileId(0L);
LambdaQueryWrapper<CbProjectOther> tWrapper = Wrappers.lambdaQuery(rootProjectOther);
CbProjectOther rootOther = this.getOne(tWrapper);
......@@ -282,6 +278,7 @@ public class CbProjectOtherServiceImpl extends ServiceImpl<CbProjectOtherMapper,
BeanUtil.copyProperties(importVo, projectExpenseSummary);
projectExpenseSummary.setProjectId(projectId);
projectExpenseSummary.setCbStage(cbStage);
projectExpenseSummary.setDataType(1);
projectExpenseSummaryService.save(projectExpenseSummary);
}
}
......
......@@ -22,6 +22,7 @@ import com.dsk.cscec.domain.vo.CbProjectRecordSearchVo;
import com.dsk.cscec.mapper.CbProjectFileMapper;
import com.dsk.cscec.mapper.CbProjectRecordMapper;
import com.dsk.cscec.service.CbProjectExpenseSummaryService;
import com.dsk.cscec.service.CbProjectOtherService;
import com.dsk.cscec.service.CbProjectRecordService;
import com.dsk.cscec.service.CbSummaryService;
import org.springframework.stereotype.Service;
......@@ -51,6 +52,8 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
private CbSummaryService cbSummaryService;
@Resource
private CbProjectExpenseSummaryService projectExpenseSummaryService;
@Resource
private CbProjectOtherService projectOtherService;
/**
* 新增项目
......@@ -128,6 +131,7 @@ public class CbProjectRecordServiceImpl extends ServiceImpl<CbProjectRecordMappe
dataAnalysisComponent.quantitySummaryDataAnalysis(projectBaseBo);
//措施项目
//其他项目
projectOtherService.projectOtherDataAnalysis(projectBaseBo);
//现场经费
projectExpenseSummaryService.parseSceneExpenseData(projectId,cbStage,username);
//成本汇总
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment