|
@@ -3,6 +3,9 @@ package org.springblade.meter.service.impl;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import lombok.AllArgsConstructor;
|
|
|
import org.apache.commons.lang.StringUtils;
|
|
|
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
|
|
+import org.apache.poi.ss.usermodel.*;
|
|
|
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
|
|
import org.springblade.common.utils.SnowFlakeUtil;
|
|
|
import org.springblade.core.log.exception.ServiceException;
|
|
|
import org.springblade.core.mp.base.BaseServiceImpl;
|
|
@@ -11,21 +14,29 @@ import org.springblade.core.tool.utils.BeanUtil;
|
|
|
import org.springblade.core.tool.utils.ObjectUtil;
|
|
|
import org.springblade.meter.dto.MeterTreeContractSaveBatchDTO;
|
|
|
import org.springblade.meter.dto.MeterTreeContractSaveDTO;
|
|
|
+import org.springblade.meter.entity.ContractInventoryForm;
|
|
|
import org.springblade.meter.entity.InventoryFormMeter;
|
|
|
import org.springblade.meter.entity.MeterTreeContract;
|
|
|
import org.springblade.meter.entity.MeterTreeProject;
|
|
|
+import org.springblade.meter.mapper.InventoryFormMeterMapper;
|
|
|
import org.springblade.meter.mapper.MeterTreeContractMapper;
|
|
|
import org.springblade.meter.mapper.MeterTreeProjectMapper;
|
|
|
import org.springblade.meter.service.MeterTreeContractService;
|
|
|
import org.springblade.meter.vo.ChangeNodeVO;
|
|
|
import org.springblade.meter.vo.MeterTreeContractVO;
|
|
|
+import org.springblade.system.entity.Dict;
|
|
|
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
|
|
|
import org.springframework.jdbc.core.JdbcTemplate;
|
|
|
import org.springframework.scheduling.annotation.Async;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.InputStream;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.util.*;
|
|
|
+import java.util.function.Function;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@Service
|
|
@@ -34,6 +45,7 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
|
|
|
|
|
|
private final JdbcTemplate jdbcTemplate;
|
|
|
private final MeterTreeProjectMapper meterTreeProjectMapper;
|
|
|
+ private final InventoryFormMeterMapper inventoryFormMeterMapper;
|
|
|
|
|
|
@Override
|
|
|
public Integer selectMaxSort(Long parentId) {
|
|
@@ -510,24 +522,26 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
|
|
|
|
|
|
/**
|
|
|
* 获取所有子节点金额
|
|
|
+ *
|
|
|
* @param vo
|
|
|
*/
|
|
|
@Override
|
|
|
public void getAllChildNodeMoney(MeterTreeContractVO vo) {
|
|
|
- MeterTreeContract m = baseMapper.getAllChildNodeMoney(vo.getContractId(),vo.getId());
|
|
|
+ MeterTreeContract m = baseMapper.getAllChildNodeMoney(vo.getContractId(), vo.getId());
|
|
|
vo.setBuildPictureMoney(m.getBuildPictureMoney());
|
|
|
vo.setChangeMoney(m.getChangeMoney());
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 异步重新计算节点金额,和修改施工图号
|
|
|
+ *
|
|
|
* @param vos
|
|
|
*/
|
|
|
@Override
|
|
|
// @Async
|
|
|
public void asyncCalculateNodeMoney(List<ChangeNodeVO> vos) {
|
|
|
for (ChangeNodeVO vo : vos) {
|
|
|
- if (StringUtils.isBlank(vo.getContractPicture())){
|
|
|
+ if (StringUtils.isBlank(vo.getContractPicture())) {
|
|
|
vo.setContractPicture("");
|
|
|
}
|
|
|
}
|
|
@@ -540,16 +554,170 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
|
|
|
.collect(Collectors.groupingBy(l -> l.getContractMeterId(),
|
|
|
Collectors.mapping(InventoryFormMeter::getChangeBuildPictureMoney,
|
|
|
Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
|
|
|
- list.stream().forEach(l->{
|
|
|
+ list.stream().forEach(l -> {
|
|
|
String picture = map.get(l.getId());
|
|
|
- l.setContractPicture(StringUtils.isBlank(picture)?"":picture);
|
|
|
+ l.setContractPicture(StringUtils.isBlank(picture) ? "" : picture);
|
|
|
//统计节点下所有分解的表单的总金额
|
|
|
- l.setChangeMoney(decimalMap.get(l.getId())==null?BigDecimal.ZERO:decimalMap.get(l.getId()));
|
|
|
+ l.setChangeMoney(decimalMap.get(l.getId()) == null ? BigDecimal.ZERO : decimalMap.get(l.getId()));
|
|
|
});
|
|
|
//拼接SQL修改合同图号和重新计算的金额
|
|
|
baseMapper.batchUpdateById(list);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public boolean contractTreeNodeImport(String id, MultipartFile file) {
|
|
|
+ MeterTreeContract meterTreeContract = baseMapper.selectById(id);
|
|
|
+ if (meterTreeContract.getAncestor().split(",").length > 3) {
|
|
|
+ throw new ServiceException("只能从前三层节点开始导入,操作失败");
|
|
|
+ }
|
|
|
+ List<MeterTreeContract> rootNodesImport = new ArrayList<>();
|
|
|
+ if (meterTreeContract.getParentId().equals(0L) && meterTreeContract.getAncestor().equals("0")) {
|
|
|
+ /*根节点导入,获取下一层级节点*/
|
|
|
+ rootNodesImport = baseMapper.selectList(Wrappers.<MeterTreeContract>lambdaQuery().eq(MeterTreeContract::getParentId, id).isNotNull(MeterTreeContract::getNodeCode));
|
|
|
+ } else {
|
|
|
+ /*非根节点导入,获取当前节点*/
|
|
|
+ if (ObjectUtil.isEmpty(meterTreeContract.getNodeCode())) {
|
|
|
+ throw new ServiceException("当前选择导入的节点编号为空,操作失败");
|
|
|
+ }
|
|
|
+ rootNodesImport.add(meterTreeContract);
|
|
|
+ }
|
|
|
+
|
|
|
+ List<MeterTreeContract> resultNodeList = new ArrayList<>();
|
|
|
+ List<InventoryFormMeter> resultFormList = new ArrayList<>();
|
|
|
+ List<Map<String, String>> parseExcelFileToList = this.parseExcelFile(file);
|
|
|
+ Map<String, String> meterStakeTypeMaps = jdbcTemplate.query("SELECT dict_key,dict_value FROM blade_dict WHERE is_deleted = 0 AND code = 'meter_stake_type'", new BeanPropertyRowMapper<>(Dict.class)).stream().collect(Collectors.toMap(Dict::getDictValue, Dict::getDictKey));
|
|
|
+ Map<String, ContractInventoryForm> contractInventoryFormMaps = jdbcTemplate.query("SELECT id,change_price,form_number FROM s_contract_inventory_form WHERE is_deleted = 0 AND contract_id = " + meterTreeContract.getContractId(), new BeanPropertyRowMapper<>(ContractInventoryForm.class)).stream().collect(Collectors.toMap(ContractInventoryForm::getFormNumber, Function.identity()));
|
|
|
+ Map<String, List<Map<String, String>>> rootCodeMaps = parseExcelFileToList.stream()
|
|
|
+ .collect(Collectors.groupingBy(
|
|
|
+ map -> map.get("工程编号"),
|
|
|
+ LinkedHashMap::new,
|
|
|
+ Collectors.toList()
|
|
|
+ ));
|
|
|
+ for (MeterTreeContract treeContract : rootNodesImport) {
|
|
|
+ List<Map<String, String>> projectCodeGroup = rootCodeMaps.getOrDefault(treeContract.getNodeCode(), null);
|
|
|
+ if (ObjectUtil.isNotEmpty(projectCodeGroup)) {
|
|
|
+ Map<String, List<Map<String, String>>> nodeCodeGroup = projectCodeGroup.stream()
|
|
|
+ .collect(Collectors.groupingBy(
|
|
|
+ map -> map.get("节点编号"),
|
|
|
+ LinkedHashMap::new,
|
|
|
+ Collectors.toList()
|
|
|
+ ));
|
|
|
+ int sort = 1;
|
|
|
+ for (Map.Entry<String, List<Map<String, String>>> listEntry : nodeCodeGroup.entrySet()) {
|
|
|
+ String nodeCode = listEntry.getKey();
|
|
|
+ List<Map<String, String>> rows = listEntry.getValue().stream()
|
|
|
+ .sorted(Comparator.comparing(map -> {
|
|
|
+ String formCode = map.get("清单编号");
|
|
|
+ return formCode == null ? "" : formCode;
|
|
|
+ })).collect(Collectors.toList());
|
|
|
+ long nullFormCodeCount = rows.stream()
|
|
|
+ .filter(map -> ObjectUtil.isEmpty(map.get("清单编号")))
|
|
|
+ .count();
|
|
|
+ if (nullFormCodeCount > 1) {
|
|
|
+ throw new RuntimeException("节点编号【" + nodeCode + "】存在多条清单编号为空的数据,请确认是否只有一条");
|
|
|
+ }
|
|
|
+
|
|
|
+ MeterTreeContract obj = new MeterTreeContract();
|
|
|
+ Long nodeId = SnowFlakeUtil.getId();
|
|
|
+ BigDecimal money = BigDecimal.ZERO;
|
|
|
+ BigDecimal moneyChange = BigDecimal.ZERO;
|
|
|
+
|
|
|
+ for (Map<String, String> map : rows) {
|
|
|
+ String currCode = map.get("节点编号");
|
|
|
+ if (currCode.equals(nodeCode)) {
|
|
|
+ String formCode = map.get("清单编号");
|
|
|
+ String nodeName = map.get("工程名称");
|
|
|
+ String buildPictureTotal = map.get("施工图数量");
|
|
|
+ String stakeType = map.get("桩号类型");
|
|
|
+ String startStake = map.get("起始桩号");
|
|
|
+ String endStake = map.get("结束桩号");
|
|
|
+ String contractPicture = map.get("合同图号");
|
|
|
+ String remarks = map.get("备注");
|
|
|
+
|
|
|
+ //节点
|
|
|
+ if (ObjectUtil.isEmpty(formCode)) {
|
|
|
+ obj.setId(nodeId);
|
|
|
+ obj.setParentId(treeContract.getId());
|
|
|
+ obj.setAncestor(treeContract.getAncestor() + "," + obj.getParentId());
|
|
|
+ obj.setNodeName(nodeName);
|
|
|
+ obj.setNodeCode(currCode);
|
|
|
+ obj.setUpdateStatus(0);
|
|
|
+ obj.setSort(sort);
|
|
|
+ if (ObjectUtil.isNotEmpty(stakeType)) {
|
|
|
+ String upperCase = stakeType.toUpperCase();
|
|
|
+ String key = meterStakeTypeMaps.getOrDefault(upperCase, null);
|
|
|
+ if (key != null) {
|
|
|
+ obj.setStakeType(Integer.parseInt(key));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ obj.setStartStake(startStake);
|
|
|
+ obj.setEndStake(endStake);
|
|
|
+ obj.setContractPicture(contractPicture);
|
|
|
+ obj.setRemarks(remarks);
|
|
|
+
|
|
|
+ obj.setTemplateId(treeContract.getTemplateId());
|
|
|
+ obj.setProjectId(treeContract.getProjectId());
|
|
|
+ obj.setContractId(treeContract.getContractId());
|
|
|
+
|
|
|
+ obj.setDataSourceType(4); //导入
|
|
|
+
|
|
|
+ } else {
|
|
|
+ //清单
|
|
|
+ ContractInventoryForm contractInventoryForm = contractInventoryFormMaps.getOrDefault(formCode, null);
|
|
|
+ if (contractInventoryForm != null) {
|
|
|
+ InventoryFormMeter objForm = new InventoryFormMeter();
|
|
|
+ objForm.setId(SnowFlakeUtil.getId());
|
|
|
+ objForm.setProjectId(treeContract.getProjectId());
|
|
|
+ objForm.setContractId(treeContract.getContractId());
|
|
|
+
|
|
|
+ if (ObjectUtil.isNotEmpty(SecureUtil.getUser())) {
|
|
|
+ objForm.setCreateUser(SecureUtil.getUserId());
|
|
|
+ objForm.setUpdateUser(SecureUtil.getUserId());
|
|
|
+ if (SecureUtil.getDeptId().contains(",")) {
|
|
|
+ objForm.setCreateDept(Long.parseLong(SecureUtil.getDeptId().split(",")[0]));
|
|
|
+ } else {
|
|
|
+ objForm.setCreateDept(Long.parseLong(SecureUtil.getDeptId()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ objForm.setContractMeterId(nodeId);
|
|
|
+ objForm.setContractFormId(contractInventoryForm.getId());
|
|
|
+
|
|
|
+ objForm.setBuildPictureTotal(this.parseString(buildPictureTotal));
|
|
|
+ objForm.setChangeBuildPictureTotal(objForm.getBuildPictureTotal());
|
|
|
+ objForm.setBuildPictureMoney(objForm.getBuildPictureTotal().multiply(contractInventoryForm.getChangePrice())); //数量*变更后单价
|
|
|
+ objForm.setChangeBuildPictureMoney(objForm.getBuildPictureMoney());
|
|
|
+
|
|
|
+ /*计量单元节点金额相关累加*/
|
|
|
+ money = money.add(objForm.getBuildPictureMoney());
|
|
|
+ moneyChange = moneyChange.add(objForm.getChangeBuildPictureMoney());
|
|
|
+
|
|
|
+ resultFormList.add(objForm);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ obj.setBuildPictureMoney(money);
|
|
|
+ obj.setChangeMoney(moneyChange);
|
|
|
+ resultNodeList.add(obj);
|
|
|
+ sort++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (resultNodeList.size() > 0) {
|
|
|
+ this.saveBatch(resultNodeList, 1000);
|
|
|
+ if (resultFormList.size() > 0) {
|
|
|
+ inventoryFormMeterMapper.batchInsert(resultFormList);
|
|
|
+ /*for (InventoryFormMeter inventoryFormMeter : resultFormList) {
|
|
|
+ inventoryFormMeterMapper.insert(inventoryFormMeter);
|
|
|
+ }*/
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 获取对应的父级的ancestor字段
|
|
|
*
|
|
@@ -638,4 +806,51 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ private List<Map<String, String>> parseExcelFile(MultipartFile file) {
|
|
|
+ List<Map<String, String>> result = new ArrayList<>();
|
|
|
+ try (InputStream inputStream = file.getInputStream()) {
|
|
|
+ Workbook workbook;
|
|
|
+ if (Objects.requireNonNull(file.getOriginalFilename()).toLowerCase().endsWith(".xls")) {
|
|
|
+ workbook = new HSSFWorkbook(inputStream);
|
|
|
+ } else if (file.getOriginalFilename().toLowerCase().endsWith(".xlsx")) {
|
|
|
+ workbook = new XSSFWorkbook(inputStream);
|
|
|
+ } else {
|
|
|
+ throw new ServiceException("Unsupported Excel file format");
|
|
|
+ }
|
|
|
+ Sheet sheet = workbook.getSheetAt(0);
|
|
|
+ Row headerRow = sheet.getRow(0);
|
|
|
+ int columnCount = headerRow.getLastCellNum();
|
|
|
+ Iterator<Row> rowIterator = sheet.iterator();
|
|
|
+ rowIterator.next();
|
|
|
+ while (rowIterator.hasNext()) {
|
|
|
+ Row currentRow = rowIterator.next();
|
|
|
+ Map<String, String> rowMap = new LinkedHashMap<>();
|
|
|
+ for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) {
|
|
|
+ Cell currentCell = currentRow.getCell(columnIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
|
|
|
+ currentCell.setCellType(CellType.STRING);
|
|
|
+ String headerValue = headerRow.getCell(columnIndex).getStringCellValue();
|
|
|
+ String cellValue = currentCell.getStringCellValue();
|
|
|
+ rowMap.put(headerValue, cellValue);
|
|
|
+ }
|
|
|
+ result.add(rowMap);
|
|
|
+ }
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ throw new ServiceException("excel解析失败,errorMsg:" + e.getMessage());
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private BigDecimal parseString(String value) {
|
|
|
+ if (value == null || value.trim().isEmpty()) {
|
|
|
+ return BigDecimal.ZERO;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ return new BigDecimal(value.trim());
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return BigDecimal.ZERO;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|