|
@@ -3,11 +3,13 @@ package org.springblade.meter.service.impl;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.google.common.base.Stopwatch;
|
|
|
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.CommonUtil;
|
|
|
import org.springblade.common.utils.SnowFlakeUtil;
|
|
|
import org.springblade.core.log.exception.ServiceException;
|
|
|
import org.springblade.core.mp.base.BaseServiceImpl;
|
|
@@ -35,6 +37,7 @@ import org.springframework.jdbc.core.BeanPropertyRowMapper;
|
|
|
import org.springframework.jdbc.core.JdbcTemplate;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.util.StopWatch;
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
import java.io.IOException;
|
|
@@ -1855,18 +1858,19 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
|
|
|
.eq(ContractInventoryForm::getContractId, meterTreeContract.getContractId())
|
|
|
.eq(ContractInventoryForm::getIsFormNode, 1));
|
|
|
if (formList.size() == 0){
|
|
|
- throw new ServiceException("导入失败,当前合同段没有合同工程清单");
|
|
|
+ throw new ServiceException("当前合同段没有合同工程清单");
|
|
|
}
|
|
|
//清单转换为编号集合,用于校验是否存在
|
|
|
List<String> numberList = formList.stream().map(l -> l.getFormNumber()).collect(Collectors.toList());
|
|
|
//清单按照编号转换为map,用于设置中间表信息
|
|
|
Map<String, ContractInventoryForm> inventoryFormMap = formList.stream().collect(Collectors.toMap(l -> l.getFormNumber(), l -> l));
|
|
|
+ Map<Long, String> FormMap = formList.stream().collect(Collectors.toMap(l->l.getId(),l -> l.getFormNumber()));
|
|
|
//校验数据,开始桩号和结束桩号必须同时存在,清单编号必须存在数据,有清单编号必须填写分解量
|
|
|
parseExcelFileToList.stream().forEach(l->{
|
|
|
- if ((StringUtils.isBlank(l.get("开始桩号")) && StringUtils.isNotBlank(l.get("结束桩号")))
|
|
|
- || (StringUtils.isNotBlank("开始桩号") && StringUtils.isBlank(l.get("结束桩号")))){
|
|
|
- throw new ServiceException("开始桩号和结束桩号必须同时存在,请修改后重新导入");
|
|
|
- }
|
|
|
+// if ((StringUtils.isBlank(l.get("开始桩号")) && StringUtils.isNotBlank(l.get("结束桩号")))
|
|
|
+// || (StringUtils.isNotBlank("开始桩号") && StringUtils.isBlank(l.get("结束桩号")))){
|
|
|
+// throw new ServiceException("开始桩号和结束桩号必须同时存在,请修改后重新导入");
|
|
|
+// }
|
|
|
if (StringUtils.isNotBlank(l.get("清单编号"))){
|
|
|
if (numberList.indexOf(l.get("清单编号")) == -1){
|
|
|
throw new ServiceException("合同段中不存在清单编号:"+l.get("清单编号")+"请检查后重新导入");
|
|
@@ -1891,15 +1895,17 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
|
|
|
}
|
|
|
/*节点新增*/
|
|
|
List<MeterImport3VO> resultNodeAdd = new LinkedList<>();
|
|
|
- List<MeterTreeContract> resultNodeListAdd = new LinkedList<>();
|
|
|
- /*节点修改*/
|
|
|
+ /*节点修改 1修改图号备注2修改类型 */
|
|
|
List<MeterTreeContract> resultNodeListUpdate = new ArrayList<>();
|
|
|
+ List<MeterTreeContract> resultNodeListUpdate2 = new ArrayList<>();
|
|
|
+ /*节点修改,去除重复*/
|
|
|
+ List<Long> UpdateIds = new ArrayList<>();
|
|
|
/*节点金额修改Ids*/
|
|
|
Set<Long> updateNodeSet = new HashSet<>();
|
|
|
/*清单中间新增*/
|
|
|
List<InventoryFormMeter> resultFormListAdd = new LinkedList<>();
|
|
|
/*清单中间数量修改*/
|
|
|
- List<InventoryFormMeter> resultFormListUpdate = new LinkedList<>();
|
|
|
+ List<InventoryFormMeterVO> resultFormListUpdate = new LinkedList<>();
|
|
|
/*合同清单变更后数量修改*/
|
|
|
List<ContractInventoryForm> InventoryFormListUpdate = new LinkedList<>();
|
|
|
|
|
@@ -1935,6 +1941,8 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
|
|
|
}else {
|
|
|
if (StringUtils.isNotBlank(map.get("开始桩号")) && StringUtils.isNotBlank(map.get("结束桩号"))){
|
|
|
nodeName = map.get("开始桩号") + "~" +map.get("结束桩号");
|
|
|
+ }else if(StringUtils.isNotBlank(map.get("开始桩号")) && StringUtils.isBlank(map.get("结束桩号"))){
|
|
|
+ nodeName = map.get("开始桩号");
|
|
|
}
|
|
|
}
|
|
|
//Excel存在节点名称则执行,不存在则跳过
|
|
@@ -1956,6 +1964,8 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
|
|
|
if (i == 6 && (StringUtils.isNotBlank(map.get("图册")) || StringUtils.isNotBlank(map.get("图号")))){
|
|
|
vo1.setRemarks(map.get("图册"));
|
|
|
vo1.setContractPicture(map.get("图号"));
|
|
|
+ vo1.setChangePicture(vo1.getContractPicture());
|
|
|
+ UpdateIds.add(vo1.getId());
|
|
|
}
|
|
|
childList.add(vo1);
|
|
|
//则新增到上一层的children下
|
|
@@ -1982,6 +1992,8 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
|
|
|
if (i == 6 && (StringUtils.isNotBlank(map.get("图册")) || StringUtils.isNotBlank(map.get("图号")))){
|
|
|
vo1.setRemarks(map.get("图册"));
|
|
|
vo1.setContractPicture(map.get("图号"));
|
|
|
+ vo1.setChangePicture(vo1.getContractPicture());
|
|
|
+ UpdateIds.add(vo1.getId());
|
|
|
}
|
|
|
thisNode.add(vo1);
|
|
|
//设置上一层为当前层
|
|
@@ -1994,7 +2006,8 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
|
|
|
MeterTreeContract tree = new MeterTreeContract();
|
|
|
tree.setId(vo2.getId());
|
|
|
tree.setNodeType(j);
|
|
|
- resultNodeListUpdate.add(tree);
|
|
|
+ resultNodeListUpdate2.add(tree);
|
|
|
+ vo2.setNodeType(j);
|
|
|
}else {
|
|
|
if (vo2.getNodeType() != j){
|
|
|
throw new ServiceException("节点:"+nodeName+"存在于合同中,但类型和当前Excel不匹配");
|
|
@@ -2002,11 +2015,14 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
|
|
|
}
|
|
|
//工序节点涉及到修改备注和图号
|
|
|
if (i == 6 && (StringUtils.isNotBlank(map.get("图册")) || StringUtils.isNotBlank(map.get("图号")))){
|
|
|
- MeterTreeContract tree = new MeterTreeContract();
|
|
|
- tree.setId(vo2.getId());
|
|
|
- tree.setRemarks(map.get("图册"));
|
|
|
- tree.setContractPicture(map.get("图号"));
|
|
|
- resultNodeListUpdate.add(tree);
|
|
|
+ if (UpdateIds.indexOf(vo2.getId()) == -1) {
|
|
|
+ MeterTreeContract tree = new MeterTreeContract();
|
|
|
+ tree.setId(vo2.getId());
|
|
|
+ tree.setRemarks(map.get("图册"));
|
|
|
+ tree.setContractPicture(map.get("图号"));
|
|
|
+ resultNodeListUpdate.add(tree);
|
|
|
+ UpdateIds.add(vo2.getId());
|
|
|
+ }
|
|
|
}
|
|
|
//把当前节点设置为上一层,并且依次重置thisNode和thisMap
|
|
|
lastNode = vo2;
|
|
@@ -2034,10 +2050,11 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
|
|
|
}catch (Exception e){
|
|
|
throw new ServiceException("清单编号:"+map.get("清单编号")+",分解核实量包含字符,请修改后重新导入");
|
|
|
}
|
|
|
- if(lastNode.getIsNew() == 1 || !isLink || meter2 == null){
|
|
|
+ if(isNew || !isLink || meter2 == null){
|
|
|
//上一层节点为新增,直接挂载
|
|
|
//新增中间表数据
|
|
|
InventoryFormMeter meter = new InventoryFormMeter();
|
|
|
+ meter.setId(SnowFlakeUtil.getId());
|
|
|
meter.setProjectId(meterTreeContract.getProjectId());
|
|
|
meter.setContractId(meterTreeContract.getContractId());
|
|
|
meter.setContractMeterId(lastNode.getId());
|
|
@@ -2052,16 +2069,32 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
|
|
|
form2.setFormNumber(form.getFormNumber());
|
|
|
form2.setChangeTotal(total);
|
|
|
InventoryFormListUpdate.add(form2);
|
|
|
+ //新增之后,设置进清单集合
|
|
|
+ meter2 = new InventoryFormMeterVO2();
|
|
|
+ meter2.setId(meter.getId());
|
|
|
+ meter2.setIsMeter(0);
|
|
|
+ meter2.setIsProto(0);
|
|
|
+ meter2.setBuildPictureTotal(total);
|
|
|
+ meter2.setChangeBuildPictureTotal(total);
|
|
|
+ meter2.setBuildPictureMoney(total.multiply(form.getCurrentPrice()));
|
|
|
+ meter2.setChangeBuildPictureMoney(meter.getBuildPictureMoney());
|
|
|
+ meterMap.put(new MeterImport3VO2(lastNode.getId(), form.getId()),meter2);
|
|
|
+ isLink = true;
|
|
|
}else {
|
|
|
//当前节点下存在当前表单,则判断是否被计量过,被计量过则跳过,没被计量过则做增量,没被计量时,施工图金额和变更后施工图金额相等
|
|
|
if (meter2.getIsMeter() == 0){
|
|
|
- InventoryFormMeter meter = new InventoryFormMeter();
|
|
|
+ InventoryFormMeterVO meter = new InventoryFormMeterVO();
|
|
|
+ meter.setStatus(meter2.getIsProto());
|
|
|
+ meter.setFormNumber(form.getFormNumber());
|
|
|
meter.setId(meter2.getId());
|
|
|
+ meter.setContractFormId(meter2.getContractFormId());
|
|
|
+ meter.setContractMeterId(meter2.getContractMeterId());
|
|
|
meter.setBuildPictureTotal(meter2.getBuildPictureTotal().add(total));
|
|
|
meter.setChangeBuildPictureTotal(meter.getBuildPictureTotal());
|
|
|
meter.setBuildPictureMoney(meter.getBuildPictureTotal().multiply(form.getCurrentPrice()));
|
|
|
meter.setChangeBuildPictureMoney(meter.getBuildPictureMoney());
|
|
|
resultFormListUpdate.add(meter);
|
|
|
+ meter2.setBuildPictureTotal(meter2.getBuildPictureTotal().add(total));
|
|
|
//设置清单增量
|
|
|
ContractInventoryForm form2 = new ContractInventoryForm();
|
|
|
form2.setFormNumber(form.getFormNumber());
|
|
@@ -2078,47 +2111,65 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
|
|
|
int updateForm = 0;
|
|
|
//新增节点
|
|
|
if (resultNodeAdd.size() > 0) {
|
|
|
- resultNodeListAdd = resultNodeAdd.stream().map(l->{
|
|
|
- MeterTreeContract contract = new MeterTreeContract();
|
|
|
- BeanUtil.copyProperties(l,contract);
|
|
|
- return contract;
|
|
|
- }).collect(Collectors.toList());
|
|
|
- this.saveBatch(resultNodeListAdd, 1000);
|
|
|
- addNode = resultNodeListAdd.size();
|
|
|
+ List<List<MeterImport3VO>> lists = CommonUtil.splitList(resultNodeAdd, 1000);
|
|
|
+ for (List<MeterImport3VO> voList : lists) {
|
|
|
+ baseMapper.batchSaveMeter(voList);
|
|
|
+ }
|
|
|
+ addNode += resultNodeAdd.size();
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
//修改节点 图号或者备注
|
|
|
if (resultNodeListUpdate.size() > 0){
|
|
|
- this.updateBatchById(resultNodeListUpdate);
|
|
|
+ List<List<MeterTreeContract>> lists = CommonUtil.splitList(resultNodeListUpdate, 1000);
|
|
|
+ for (List<MeterTreeContract> voList : lists) {
|
|
|
+ baseMapper.batchUpdateMeter(voList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //修改节点类型,修改量小
|
|
|
+ if (resultNodeListUpdate2.size() > 0){
|
|
|
+ this.updateBatchById(resultNodeListUpdate2);
|
|
|
}
|
|
|
+
|
|
|
/*清单中间新增*/
|
|
|
if (resultFormListAdd.size() > 0) {
|
|
|
- //校验数据
|
|
|
- try {
|
|
|
- resultFormListAdd.stream().collect(Collectors.toMap(l -> new MeterImport3VO2(l.getContractMeterId(), l.getContractFormId()), l -> l));
|
|
|
- }catch (Exception e){
|
|
|
- throw new ServiceException("导入模板中存在同一个节点下清单重复,请直接合并分解量后再导入");
|
|
|
- }
|
|
|
inventoryFormMeterMapper.batchInsert(resultFormListAdd);
|
|
|
addForm = resultFormListAdd.size();
|
|
|
}
|
|
|
-
|
|
|
+ StringBuilder str = new StringBuilder();
|
|
|
+// StopWatch stopWatch = new StopWatch();
|
|
|
+// stopWatch.start();
|
|
|
+// stopWatch.stop();
|
|
|
/*清单中间数量修改*/
|
|
|
if (resultFormListUpdate.size() > 0) {
|
|
|
- for (InventoryFormMeter inventoryFormMeter : resultFormListUpdate) {
|
|
|
- String sql = "UPDATE s_inventory_form_meter " +
|
|
|
- "SET build_picture_total = ? ," +
|
|
|
- "change_build_picture_total = ? ," +
|
|
|
- "build_picture_money = ? ," +
|
|
|
- "change_build_picture_money = ? WHERE id = ?";
|
|
|
- jdbcTemplate.update(sql,
|
|
|
- inventoryFormMeter.getBuildPictureTotal(),
|
|
|
- inventoryFormMeter.getChangeBuildPictureTotal(),
|
|
|
- inventoryFormMeter.getBuildPictureMoney(),
|
|
|
- inventoryFormMeter.getChangeBuildPictureMoney(),
|
|
|
- inventoryFormMeter.getId());
|
|
|
+ List<InventoryFormMeterVO> resultFormListUpdate2 = new LinkedList<>();
|
|
|
+ //校验数据,导入没有挂载过的重复清单会当值新增一次,修改多次。没有挂载过的重复清单会修改多次。
|
|
|
+ //先提取没有挂载过的重复清单
|
|
|
+ Set<String> formNumbers = resultFormListUpdate.stream().filter(l -> l.getStatus() == 0).map(InventoryFormMeterVO::getFormNumber).collect(Collectors.toSet());
|
|
|
+ //新增的要从修改中删除,假定是直接新增这么多施工图
|
|
|
+ int adds = formNumbers.size();
|
|
|
+ Map<MeterImport3VO2, Long> map = resultFormListUpdate.stream().filter(l -> l.getStatus() == 1).collect(Collectors.groupingBy(l -> new MeterImport3VO2(l.getContractMeterId(), l.getContractFormId()), Collectors.counting()));
|
|
|
+ for (MeterImport3VO2 vo2 : map.keySet()) {
|
|
|
+ if (map.get(vo2) > 1){
|
|
|
+ formNumbers.add(FormMap.get(vo2.getFormId()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ formNumbers = formNumbers.stream().sorted().collect(Collectors.toCollection(LinkedHashSet::new));
|
|
|
+ if (formNumbers.size() > 0) {
|
|
|
+ str.append("重复清单");
|
|
|
+ str.append(String.join(",", formNumbers));
|
|
|
}
|
|
|
- updateForm = resultFormListUpdate.size();
|
|
|
+ //进行聚合,只修改最大值
|
|
|
+ Map<Long, Optional<InventoryFormMeterVO>> collect = resultFormListUpdate.stream().collect(Collectors.groupingBy(InventoryFormMeter::getId, Collectors.maxBy(Comparator.comparing(InventoryFormMeter::getBuildPictureTotal))));
|
|
|
+ resultFormListUpdate2 = collect.values().stream() // 转换为Stream<Optional<InventoryFormMeter>>
|
|
|
+ .filter(Optional::isPresent) // 过滤出非空Optional
|
|
|
+ .map(Optional::get) // 提取Optional中的实际值
|
|
|
+ .collect(Collectors.toList());// 收集到List<InventoryFormMeter>
|
|
|
+ baseMapper.updateBatchForm(resultFormListUpdate2);
|
|
|
+
|
|
|
+ updateForm = (int) (resultFormListUpdate2.size() - resultFormListUpdate2.stream().filter(l->l.getStatus() == 0).count());
|
|
|
}
|
|
|
+
|
|
|
//修改合同工程清单的变更后数量
|
|
|
if (InventoryFormListUpdate.size() > 0) {
|
|
|
Map<String, BigDecimal> map = InventoryFormListUpdate.stream()
|
|
@@ -2127,12 +2178,11 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
|
|
|
baseMapper.batchUpdateFormByNumber(meterTreeContract.getContractId(), map);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
//修改节点金额放最后,等中间表数据保存完成之后,再去统计
|
|
|
if (updateNodeSet.size() > 0){
|
|
|
this.asyncCalculateNodeMoney2(updateNodeSet);
|
|
|
}
|
|
|
- return R.success("成功导入:节点("+addNode+")个,"+"新增清单("+addForm+")条,"+"修改清单("+updateForm+")条.");
|
|
|
+ return R.success("成功导入:节点("+addNode+")个,"+"新增挂载清单("+addForm+")条,"+"修改清单("+updateForm+")条,"+str);
|
|
|
}catch (Exception e){
|
|
|
throw new ServiceException("导入失败:"+e.getMessage());
|
|
|
}
|