Commit 888762d6 authored by dengguangman's avatar dengguangman Committed by Administrator

其他

Signed-off-by: Administrator's avatarAdministrator <admin@example.com>
parent d3f05146
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);
}
}
}
}
package com.dsk.cscec.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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;
import com.dsk.cscec.domain.vo.CbProjectOtherVo;
import com.dsk.cscec.service.CbProjectExpenseSummaryService;
import com.dsk.cscec.service.CbProjectOtherService;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @ClassName CbProjectOtherController
* @Description 其他费用相关控制器
* @Author Dgm
* @Date 2024/2/8 10:55
* @Version 1.0.0
*/
@RestController
@RequestMapping("cb/projectOther")
public class CbProjectOtherController {
@Resource
private CbProjectOtherService projectOtherService;
@Resource
private CbProjectExpenseSummaryService cbProjectExpenseSummaryService;
@Resource
private CbProjectOtherAnalysisComponent otherAnalysisComponent;
@GetMapping(value = "/projectOther/dataAnalysis")
public R<List<CbProjectExpenseSummary>> projectOtherDataAnalysis(CbProjectBaseBo baseBo) throws Exception{
otherAnalysisComponent.projectOtherDataAnalysis(baseBo);
return R.ok();
}
/***
* @Description: 其他费用-汇总
* @Param:
* @return: com.dsk.common.core.domain.R<java.util.List<com.dsk.cscec.domain.vo.CbProjectOtherVo>>
* @Author: Dgm
* @date: 2024/2/8 14:08
*/
@SaIgnore
@GetMapping(value = "/statistics/{projectId}")
public R<List<CbProjectExpenseSummary>> statistics(@PathVariable Long projectId) {
CbProjectExpenseSummary expenseSummary = new CbProjectExpenseSummary();
expenseSummary.setProjectId(projectId);
expenseSummary.setDataType(2);
QueryWrapper<CbProjectExpenseSummary> queryWrapper = Wrappers.query(expenseSummary);
queryWrapper.select("id","expense_name as expenseName","expense_value as expenseValue");
queryWrapper.orderByAsc("id");
List<CbProjectExpenseSummary> expenseSummaryList = this.cbProjectExpenseSummaryService.list(queryWrapper);
if (ObjectUtil.isEmpty(expenseSummaryList)) {
expenseSummaryList = new ArrayList<>();
}
return R.ok(expenseSummaryList);
}
/***
* @Description: 其他费用一级大类
* @Param:
* @return: com.dsk.common.core.domain.R<java.util.List<com.dsk.cscec.domain.vo.CbProjectOtherVo>>
* @Author: Dgm
* @date: 2024/2/8 14:08
*/
@SaIgnore
@GetMapping(value = "/type/{projectId}")
public R<List<Map<String, Object>>> dictType(@PathVariable Long projectId) {
List<Map<String, Object>> data = projectOtherService.listByLevel(projectId,0);
if (ObjectUtil.isNull(data)) {
data = new ArrayList<>();
}
return R.ok(data);
}
/***
* @Description: 其他费用列表
* @Param:
* @return: com.dsk.common.core.domain.R<java.util.List<com.dsk.cscec.domain.vo.CbProjectOtherVo>>
* @Author: Dgm
* @date: 2024/2/8 14:08
*/
@SaIgnore
@GetMapping("/list")
public R<List<CbProjectOtherVo>> list(CbProjectOtherBo projectOtherBo) {
List<CbProjectOtherVo> data= projectOtherService.selectDataList(projectOtherBo);
if (ObjectUtil.isNull(data)) {
data = new ArrayList<>();
}
return R.ok(data);
}
/***
* @Description: 其他费用-导入数据
* @param file 导入文件
* @param projectId 项目id
* @return: com.dsk.common.core.domain.R<java.util.List<com.dsk.cscec.domain.vo.CbProjectOtherVo>>
* @Author: Dgm
* @date: 2024/2/8 14:08
*/
@Log(title = "其他费用相关项导入", businessType = BusinessType.IMPORT)
@PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<Void> importData(@RequestPart("file") MultipartFile file, Long projectId) throws Exception {
projectOtherService.importExcelData(file,projectId);
return R.ok();
}
}
package com.dsk.cscec.domain;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* @ClassName CbProjectOtherVo
* @Description 项目其他项目费用
* @Author Dgm
* @Date 2024/2/8 10:39
* @Version 1.0.0
*/
@Data
public class CbProjectOther implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
private Long id;
/**
* 成本阶段( 0:标前成本、1:标后成本、2:转固成本)
*/
private Integer cbStage;
/**
* 项目ID
*/
private Long projectId;
/**
* 父项id
*/
private Long parentId;
/**
* 序号
*/
private String number;
/**
* 处理后序号
*/
private String dealWithNumber;
/**
* 清单内容
*/
private String itemContent;
/**
* 工作内容、做法/规格型号/施工现场配置说明
*/
private String workContent;
/**
* 单位
*/
private String unit;
/**
* 工程量
*/
private BigDecimal engineeringQuantity;
/**
* 不含税单价
*/
private String unitPriceExcludingTax;
/**
* 不含税合价
*/
private String totalPriceExcludeTax;
/**
* 税率(%)
*/
private String taxRate;
/**
* 含税合价
*/
private String totalPriceIncludingTax;
/**
* 税金(元)
*/
private String taxAmount;
/**
* 成本科目
*/
private String costSubject;
/**
* 税金类型
*/
private String taxType;
/**
* 数据类型(1:履约担保、保函手续费、市场营销奖励费、2:创优费:3:其他:4:保险保函:5:水电费:6:现场其他直接费:7:技术质量管理:8:工程保险类:10:报批报建、竣工验收类
*/
private String dataType;
/**
* 备注
*/
private String remarks;
/**
* 修改人
*/
private String updateBy;
/**
* 创建人
*/
private String createBy;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
/**
* 项目成本文件id
*/
private Long cbProjectFileId;
}
package com.dsk.cscec.domain.bo;
import lombok.Data;
@Data
public class CbProjectOtherBo {
/**
* 费用项Id
*/
private Long parentId;
/**
* 年月
*/
private String month;
/**
* 项目id
*/
private Long projectId;
/**
* 成本阶段( 0:标前成本、1:标后成本、2:转固成本)
*/
private Integer cbStage;
}
\ No newline at end of file
package com.dsk.cscec.domain.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* @ClassName CbProjectOtherVo
* @Description 项目其他项目费用
* @Author Dgm
* @Date 2024/2/8 10:39
* @Version 1.0.0
*/
@Data
public class CbProjectOtherImportVo {
/**
* 序号
*/
@ExcelProperty(value = "序号")
private String number;
/**
* 清单内容
*/
@ExcelProperty(value = "清单内容")
private String itemContent;
/**
* 工作内容、做法/规格型号/施工现场配置说明
*/
@ExcelProperty(value = "工作内容")
private String workContent;
/**
* 单位
*/
@ExcelProperty(value = "单位")
private String unit;
/**
* 工程量
*/
@ExcelProperty(value = "工程量")
private BigDecimal engineeringQuantity;
/**
* 不含税单价
*/
@ExcelProperty(value = "不含税单价")
private String unitPriceExcludingTax;
/**
* 不含税合价
*/
@ExcelProperty(value = "不含税合价")
private String totalPriceExcludeTax;
/**
* 税率(%)
*/
@ExcelProperty(value = "税率(%)")
private String taxRate;
/**
* 含税合价
*/
@ExcelProperty(value = "含税合价")
private String totalPriceIncludingTax;
/**
* 税金(元)
*/
@ExcelProperty(value = "税金(元)")
private String taxAmount;
/**
* 成本科目
*/
@ExcelProperty(value = "成本科目")
private String costSubject;
/**
* 税金类型
*/
@ExcelProperty(value = "税金类型")
private String taxType;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remarks;
/**
* 数据类型(1:履约担保、保函手续费、市场营销奖励费、2:创优费:3:其他:4:保险保函:5:水电费:6:现场其他直接费:7:技术质量管理:8:工程保险类:10:报批报建、竣工验收类
*/
private String dataType;
/**
* 主键id
*/
private Long id;
/**
* 成本阶段( 0:标前成本、1:标后成本、2:转固成本)
*/
private Integer cbStage;
/**
* 项目ID
*/
private Long projectId;
/**
* 父项id
*/
private Long parentId;
/**
* 处理后序号
*/
private String dealWithNumber;
}
package com.dsk.cscec.domain.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* @ClassName CbProjectOtherVo
* @Description 项目其他项目费用
* @Author Dgm
* @Date 2024/2/8 10:39
* @Version 1.0.0
*/
@Data
public class CbProjectOtherVo {
/**
* 主键id
*/
private Long id;
/**
* 成本阶段( 0:标前成本、1:标后成本、2:转固成本)
*/
private Integer cbStage;
/**
* 项目ID
*/
private Long projectId;
/**
* 父项id
*/
private Long parentId;
/**
* 序号
*/
private String number;
/**
* 处理后序号
*/
private String dealWithNumber;
/**
* 清单内容
*/
private String itemContent;
/**
* 工作内容、做法/规格型号/施工现场配置说明
*/
private String workContent;
/**
* 单位
*/
private String unit;
/**
* 工程量
*/
private BigDecimal engineeringQuantity;
/**
* 不含税单价
*/
private String unitPriceExcludingTax;
/**
* 不含税合价
*/
private String totalPriceExcludeTax;
/**
* 税率(%)
*/
private String taxRate;
/**
* 含税合价
*/
private String totalPriceIncludingTax;
/**
* 税金(元)
*/
private String taxAmount;
/**
* 成本科目
*/
private String costSubject;
/**
* 税金类型
*/
private String taxType;
/**
* 数据类型(1:履约担保、保函手续费、市场营销奖励费、2:创优费:3:其他:4:保险保函:5:水电费:6:现场其他直接费:7:技术质量管理:8:工程保险类:10:报批报建、竣工验收类
*/
private String dataType;
/**
* 备注
*/
private String remarks;
/**
* 修改人
*/
private String updateBy;
/**
* 创建人
*/
private String createBy;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
}
package com.dsk.cscec.listener;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.dsk.common.excel.ExcelListener;
import com.dsk.common.excel.ExcelResult;
import com.dsk.common.exception.ServiceException;
import com.dsk.cscec.domain.vo.CbProjectExpenseSummaryImportVo;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
/**
* 其他项目自定义导入
*
* @author Lion Li
*/
@Slf4j
public class CbProjectExpenseSummaryImportListener extends AnalysisEventListener<CbProjectExpenseSummaryImportVo> implements ExcelListener<CbProjectExpenseSummaryImportVo> {
private final Long projectId;
private final Integer cbStage;
private List<CbProjectExpenseSummaryImportVo> dataList = new ArrayList<>();
private int successNum = 0;
private int failureNum = 0;
private final StringBuilder successMsg = new StringBuilder();
private final StringBuilder failureMsg = new StringBuilder();
public CbProjectExpenseSummaryImportListener(Long projectId, Integer cbStage) {
this.cbStage = cbStage;
this.projectId = projectId;
}
@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 + "行 解析失败:序号不能为空");
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}
@Override
public ExcelResult<CbProjectExpenseSummaryImportVo> getExcelResult() {
return new ExcelResult<CbProjectExpenseSummaryImportVo>() {
@Override
public String getAnalysis() {
if (failureNum > 0) {
failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
throw new ServiceException(failureMsg.toString());
} else {
successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
}
return successMsg.toString();
}
@Override
public List<CbProjectExpenseSummaryImportVo> getList() {
return dataList;
}
@Override
public List<String> getErrorList() {
return null;
}
};
}
}
package com.dsk.cscec.listener;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.dsk.common.excel.ExcelListener;
import com.dsk.common.excel.ExcelResult;
import com.dsk.common.exception.ServiceException;
import com.dsk.cscec.domain.vo.CbProjectOtherImportVo;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
/**
* 其他项目自定义导入
*
* @author Lion Li
*/
@Slf4j
public class CbProjectOtherImportListener extends AnalysisEventListener<CbProjectOtherImportVo> implements ExcelListener<CbProjectOtherImportVo> {
private final Long projectId;
private final Integer cbStage;
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;
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 + "行 解析失败:清单内容不能为空");
}
String number = importVo.getNumber();
if (StrUtil.isEmpty(number)) {
failureNum++;
failureMsg.append("<br/>" + rowIndex + "行 解析失败:序号不能为空");
}
Boolean numberMatch = false;
String regex = "[\\((]*[一|二|三|四|五|六|七|八|九|十]+[\\))]*";
Pattern pattern = Pattern.compile("^\\d+(\\.\\d+)*$");
Pattern pattern3 = Pattern.compile("^([1-9][0-9]*|0)$");
if (ReUtil.isMatch(regex, number) || ReUtil.isMatch(pattern, number)||ReUtil.isMatch(pattern3, number)) {
numberMatch = true;
} else {
failureNum++;
failureMsg.append("<br/>" + rowIndex + "行 解析失败:序号格式错误");
}
if(numberMatch){
if (ReUtil.isMatch(regex, number)){
String replace = number.replaceAll("[\\\\((]|[\\\\))]", "");
int no = Convert.chineseToNumber(replace);
importVo.setDealWithNumber(String.valueOf(no));
}else{
importVo.setDealWithNumber(importVo.getNumber());
}
dataList.add(importVo);
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}
@Override
public ExcelResult<CbProjectOtherImportVo> getExcelResult() {
return new ExcelResult<CbProjectOtherImportVo>() {
@Override
public String getAnalysis() {
if (failureNum > 0) {
failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
throw new ServiceException(failureMsg.toString());
} else {
successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
}
return successMsg.toString();
}
@Override
public List<CbProjectOtherImportVo> getList() {
return dataList;
}
@Override
public List<String> getErrorList() {
return null;
}
};
}
}
package com.dsk.cscec.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dsk.cscec.domain.CbProjectOther;
import com.dsk.cscec.domain.bo.CbProjectOtherBo;
import com.dsk.cscec.domain.vo.CbProjectOtherVo;
import java.util.List;
public interface CbProjectOtherMapper extends BaseMapper<CbProjectOther> {
List<CbProjectOtherVo> selectListByProjectAndStage(CbProjectOtherBo projectOtherBo);
}
\ No newline at end of file
package com.dsk.cscec.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.cscec.domain.CbProjectOther;
import com.dsk.cscec.domain.bo.CbProjectOtherBo;
import com.dsk.cscec.domain.vo.CbProjectOtherVo;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.Map;
/**
* 成本-工料汇总基本表(CbQuantitySummary)表服务接口
*
* @author lcl
* @since 2024-02-05 11:06:56
*/
public interface CbProjectOtherService extends IService<CbProjectOther> {
void importExcelData(MultipartFile file, Long projectId);
List<Map<String, Object>> listByLevel(Long projectId, int i);
List<CbProjectOtherVo> selectDataList(CbProjectOtherBo projectOtherBo);
}
package com.dsk.cscec.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReUtil;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.*;
import com.dsk.cscec.domain.bo.CbProjectBaseBo;
import com.dsk.cscec.domain.bo.CbProjectOtherBo;
import com.dsk.cscec.domain.vo.CbProjectExpenseSummaryImportVo;
import com.dsk.cscec.domain.vo.CbProjectOtherImportVo;
import com.dsk.cscec.domain.vo.CbProjectOtherVo;
import com.dsk.cscec.listener.CbProjectExpenseSummaryImportListener;
import com.dsk.cscec.listener.CbProjectOtherImportListener;
import com.dsk.cscec.mapper.CbProjectOtherMapper;
import com.dsk.cscec.service.*;
import com.dsk.system.service.ISysOssService;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.InputStream;
import java.util.*;
import java.util.regex.Pattern;
@Slf4j
@Service
public class CbProjectOtherServiceImpl extends ServiceImpl<CbProjectOtherMapper, CbProjectOther> implements CbProjectOtherService {
private final String firstPattern = "[\\((]*[一|二|三|四|五|六|七|八|九|十]+[\\))]*";
private final Pattern secondPattern = Pattern.compile("^\\d+(\\.\\d+)*$");
private final Pattern pattern3 = Pattern.compile("^([1-9][0-9]*|0)$");
@Resource
private CbProjectRecordService cbProjectRecordService;
@Resource
private CbProjectFileService projectFileService;
@Resource
private ISysOssService ossService;
@Resource
private CbProjectExpenseSummaryService projectExpenseSummaryService;
@SneakyThrows
@Override
public void importExcelData(MultipartFile file, Long projectId) {
String name = file.getOriginalFilename();
name = FileNameUtil.getPrefix(name);
CbProjectRecord byId = cbProjectRecordService.getById(projectId);
Assert.notNull(byId, "项目信息不能为空");
Integer cbStage = byId.getCbStage();
CbProjectOtherImportListener importListener = new CbProjectOtherImportListener(projectId, cbStage);
EasyExcel.read(file.getInputStream(), CbProjectOtherImportVo.class, importListener).sheet().doRead();
ExcelResult<CbProjectOtherImportVo> result = importListener.getExcelResult();
String analysis = result.getAnalysis();
List<CbProjectOtherImportVo> list = result.getList();
if (CollectionUtil.isEmpty(list)) {
//解析失败
log.debug(">>>>解析失败" + list.size());
//todo 解析失败更新文件备注
return;
}
log.debug(">>>>" + list.size());
CbProjectOther rootProjectOther = new CbProjectOther();
rootProjectOther.setItemContent(name);
rootProjectOther.setParentId(0L);
rootProjectOther.setProjectId(projectId);
rootProjectOther.setCbStage(cbStage);
LambdaQueryWrapper<CbProjectOther> tWrapper = Wrappers.lambdaQuery(rootProjectOther);
CbProjectOther rootOther = this.getOne(tWrapper);
if (ObjectUtil.isEmpty(rootOther)) {
this.save(rootProjectOther);
rootProjectOther.setDealWithNumber(String.valueOf(rootProjectOther.getId()));
this.updateById(rootProjectOther);
}
Long rootMeasuresId = rootProjectOther.getId();
if (CollectionUtil.isNotEmpty(list)) {
for (CbProjectOtherImportVo importVo : list) {
String number = importVo.getNumber();
CbProjectOther cbProjectOther = new CbProjectOther();
//保存一级节点
if (ReUtil.isMatch(firstPattern, number) || ReUtil.isMatch(pattern3, number)) {
BeanUtil.copyProperties(importVo, cbProjectOther);
cbProjectOther.setParentId(rootMeasuresId);
// cbProjectOther.setLevel(1);
} else if (ReUtil.isMatch(secondPattern, number)) {
BeanUtil.copyProperties(importVo, cbProjectOther);
// 根据no查询父级节点
CbProjectOther parentCbCostMeasure = getCbProjectOther(rootMeasuresId, number, projectId, cbStage);
String[] split = number.split("\\.");
// cbProjectOther.setLevel(split.length);
cbProjectOther.setParentId(parentCbCostMeasure.getId());
}
String newNo = String.valueOf(rootMeasuresId).concat(".").concat(cbProjectOther.getDealWithNumber());
cbProjectOther.setDealWithNumber(newNo);
cbProjectOther.setProjectId(projectId);
cbProjectOther.setCbStage(cbStage);
this.save(cbProjectOther);
}
}
}
@Override
public List<Map<String, Object>> listByLevel(Long projectId, int i) {
CbProjectRecord byId = cbProjectRecordService.getById(projectId);
Assert.notNull(byId, "项目信息不能为空");
CbProjectOther projectOther = new CbProjectOther();
projectOther.setParentId(0L);
projectOther.setProjectId(projectId);
projectOther.setCbStage(byId.getCbStage());
QueryWrapper<CbProjectOther> tWrapper = Wrappers.query(projectOther);
tWrapper.select("id","item_content as itemContent");
tWrapper.orderByAsc("id");
List<Map<String, Object>> mapList = this.listMaps(tWrapper);
return mapList;
}
@Override
public List<CbProjectOtherVo> selectDataList(CbProjectOtherBo projectOtherBo) {
List<CbProjectOtherVo> dataList = new ArrayList<>();
Assert.notNull(projectOtherBo.getProjectId(), "项目ID不能为空");
CbProjectRecord byId = cbProjectRecordService.getById(projectOtherBo.getProjectId());
Assert.notNull(byId, "项目信息不能为空");
projectOtherBo.setCbStage(byId.getCbStage());
dataList = baseMapper.selectListByProjectAndStage(projectOtherBo);
return dataList;
}
/***
*@Description: 其他费用数据解析
*@Param:
*@return: void
*@Author: Dgm
*@date: 2024/2/23 18:03
*/
@Async
public void projectOtherDataAnalysis(CbProjectBaseBo baseBo) throws Exception {
// 项目Id
Long projectId = baseBo.getProjectId();
// 成本阶段(0:标前成本 1:标后成本 2:转固成本)
Integer cbStage = baseBo.getCbStage();
Assert.notNull(projectId, "项目信息不能为空");
// 查询其他费用导入文件
List<CbProjectFile> projectFileList = projectFileService.list(Wrappers.<CbProjectFile>lambdaQuery()
.eq(CbProjectFile::getProjectId, baseBo.getProjectId())
.eq(CbProjectFile::getCbType, CbProjectConstants.CB_TYPE_OTHER_PROJECT)
.eq(CbProjectFile::getCbStage, baseBo.getCbStage())
.in(CbProjectFile::getFileParseStatus, Arrays.asList(1, 3)));
if (ObjectUtils.isEmpty(projectFileList)) {
return;
}
//文件处理
for (CbProjectFile file : projectFileList) {
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;
}
// 文件名称
String name = file.getFileName();
if ("其他费".equals(name)) {
totalDataAnalysis(inputStream, name, file, projectId, cbStage);
}
name = FileNameUtil.getPrefix(name);
//解析数据
ExcelResult<CbProjectOtherImportVo> importVoExcelResult =
ExcelUtil.importExcel(inputStream, CbProjectOtherImportVo.class,new CbProjectOtherImportListener(projectId, cbStage));
log.info(importVoExcelResult.getAnalysis());
List<CbProjectOtherImportVo> importVoList = importVoExcelResult.getList();
if (CollectionUtil.isEmpty(importVoList)) {
//解析失败
log.debug(">>>>解析失败" + importVoList.size());
file.setFileParseStatus(3);
file.setFailRemark("表格中不存在待导入数据!");
projectFileService.updateById(file);
break;
}
log.debug(">>>>" + importVoList.size());
CbProjectOther rootProjectOther = new CbProjectOther();
rootProjectOther.setItemContent(name);
rootProjectOther.setParentId(0L);
rootProjectOther.setProjectId(projectId);
rootProjectOther.setCbStage(cbStage);
LambdaQueryWrapper<CbProjectOther> tWrapper = Wrappers.lambdaQuery(rootProjectOther);
CbProjectOther rootOther = this.getOne(tWrapper);
if (ObjectUtil.isEmpty(rootOther)) {
this.save(rootProjectOther);
rootProjectOther.setDealWithNumber(String.valueOf(rootProjectOther.getId()));
this.updateById(rootProjectOther);
}
Long rootMeasuresId = rootProjectOther.getId();
if (CollectionUtil.isNotEmpty(importVoList)) {
for (CbProjectOtherImportVo importVo : importVoList) {
String number = importVo.getNumber();
CbProjectOther cbProjectOther = new CbProjectOther();
//保存一级节点
if (ReUtil.isMatch(firstPattern, number) || ReUtil.isMatch(pattern3, number)) {
BeanUtil.copyProperties(importVo, cbProjectOther);
cbProjectOther.setParentId(rootMeasuresId);
} else if (ReUtil.isMatch(secondPattern, number)) {
BeanUtil.copyProperties(importVo, cbProjectOther);
// 根据no查询父级节点
CbProjectOther parentCbCostMeasure = getCbProjectOther(rootMeasuresId, number, projectId, cbStage);
String[] split = number.split("\\.");
cbProjectOther.setParentId(parentCbCostMeasure.getId());
}
String newNo = String.valueOf(rootMeasuresId).concat(".").concat(cbProjectOther.getDealWithNumber());
cbProjectOther.setDealWithNumber(newNo);
cbProjectOther.setProjectId(projectId);
cbProjectOther.setCbStage(cbStage);
this.save(cbProjectOther);
}
}
}
}
}
/***
*@Description: 解析其他费用总和
*@Param:
*@return: void
*@Author: Dgm
*@date: 2024/2/23 18:03
*/
public void totalDataAnalysis(InputStream inputStream, String name, CbProjectFile file, Long projectId, Integer cbStage) throws Exception {
//解析数据
ExcelResult<CbProjectExpenseSummaryImportVo> importVoExcelResult =
ExcelUtil.importExcel(inputStream, CbProjectExpenseSummaryImportVo.class,new CbProjectExpenseSummaryImportListener(projectId, cbStage));
log.info(importVoExcelResult.getAnalysis());
List<CbProjectExpenseSummaryImportVo> importVoList = importVoExcelResult.getList();
if (CollectionUtil.isEmpty(importVoList)) {
//解析失败
log.debug(">>>>解析失败" + importVoList.size());
file.setFileParseStatus(3);
file.setFailRemark("表格中不存在待导入数据!");
projectFileService.updateById(file);
}
log.debug(">>>>" + importVoList.size());
if (CollectionUtil.isNotEmpty(importVoList)) {
for (CbProjectExpenseSummaryImportVo importVo : importVoList) {
CbProjectExpenseSummary projectExpenseSummary = new CbProjectExpenseSummary();
BeanUtil.copyProperties(importVo, projectExpenseSummary);
projectExpenseSummary.setProjectId(projectId);
projectExpenseSummary.setCbStage(cbStage);
projectExpenseSummaryService.save(projectExpenseSummary);
}
}
}
/**
* 根据当前序号、项目id、成本阶段查询父级信息
*
* @param number
* @param projectId
* @param cbStage
* @return
*/
public CbProjectOther getCbProjectOther(Long rootMeasuresId, String number, Long projectId, Integer cbStage) {
String parentNo = number.substring(0, number.lastIndexOf('.'));
parentNo = String.valueOf(rootMeasuresId).concat(".").concat(parentNo);
CbProjectOther projectOther = new CbProjectOther();
projectOther.setDealWithNumber(parentNo);
projectOther.setProjectId(projectId);
projectOther.setCbStage(cbStage);
LambdaQueryWrapper<CbProjectOther> tWrapper = Wrappers.lambdaQuery(projectOther);
CbProjectOther other = this.getOne(tWrapper);
return other;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dsk.cscec.mapper.CbProjectOtherMapper">
<select id="selectListByProjectAndStage" resultType="com.dsk.cscec.domain.vo.CbProjectOtherVo">
SELECT t.* FROM cb_project_other t WHERE t.project_id=#{projectId} AND t.cb_stage=#{cbStage} AND t.parent_id=#{parentId} ORDER BY id ASC
</select>
</mapper>
\ No newline at end of file
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