|
@@ -7,6 +7,7 @@ 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.formula.functions.T;
|
|
|
import org.apache.poi.ss.usermodel.*;
|
|
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
|
|
import org.springblade.common.utils.CommonUtil;
|
|
@@ -16,13 +17,11 @@ import org.springblade.core.mp.base.BaseServiceImpl;
|
|
|
import org.springblade.core.secure.utils.AuthUtil;
|
|
|
import org.springblade.core.secure.utils.SecureUtil;
|
|
|
import org.springblade.core.tool.api.R;
|
|
|
+import org.springblade.core.tool.node.INode;
|
|
|
import org.springblade.core.tool.utils.BeanUtil;
|
|
|
import org.springblade.core.tool.utils.Func;
|
|
|
import org.springblade.core.tool.utils.ObjectUtil;
|
|
|
-import org.springblade.meter.dto.LinkMeterTreeAndWbsTreeDTO;
|
|
|
-import org.springblade.meter.dto.MeterTreeContractDTO;
|
|
|
-import org.springblade.meter.dto.MeterTreeContractSaveBatchDTO;
|
|
|
-import org.springblade.meter.dto.MeterTreeContractSaveDTO;
|
|
|
+import org.springblade.meter.dto.*;
|
|
|
import org.springblade.meter.entity.*;
|
|
|
import org.springblade.meter.mapper.ContractInventoryFormMapper;
|
|
|
import org.springblade.meter.mapper.InventoryFormMeterMapper;
|
|
@@ -2394,6 +2393,122 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
|
|
|
return R.success("操作成功,本次删除"+total+"个节点");
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 复制节点,根据选中的节点
|
|
|
+ * @param dto
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public R<String> copyNode(CopyMeterNodeDTO dto) {
|
|
|
+ try {
|
|
|
+
|
|
|
+ //获取当前节点
|
|
|
+ MeterTreeContract rootNode = this.getById(dto.getId());
|
|
|
+ //获取当前节点父节点,用于递归结构
|
|
|
+ CopyMeterNodeVO vo = baseMapper.getParentNode(rootNode.getParentId());
|
|
|
+ if (vo == null) {
|
|
|
+ throw new ServiceException("根节点不能复制");
|
|
|
+ }
|
|
|
+ // 1 获取所有需要复制的节点
|
|
|
+ List<CopyMeterNodeVO2> vo2List = dto.getVo2s();
|
|
|
+ if (vo2List.size() == 0) {
|
|
|
+ throw new ServiceException("请勾选需要复制的节点后再保存");
|
|
|
+ }
|
|
|
+ //先转换为树
|
|
|
+ //再把树转换为集合
|
|
|
+ Long l5 = System.currentTimeMillis();
|
|
|
+ List<CopyMeterNodeVO2> list2 = ForestNodeMerger.merge(vo2List);
|
|
|
+ Long l6 = System.currentTimeMillis();
|
|
|
+ if (list2.size() != 1){
|
|
|
+ throw new ServiceException("节点集合转换树失败");
|
|
|
+ }
|
|
|
+ List<CopyMeterNodeVO2> vo2s = new ArrayList<>();
|
|
|
+ this.getTreeList(list2.get(0),vo2s);
|
|
|
+ System.out.println("转换2次树"+(l6 - l5));
|
|
|
+ Map<Long, CopyMeterNodeVO2> vo2Map = vo2s.stream().collect(Collectors.toMap(l -> l.getId(), l -> l));
|
|
|
+ List<Long> ids = vo2s.stream().map(l -> l.getId()).collect(Collectors.toList());
|
|
|
+ List<CopyMeterNodeVO> vos = baseMapper.getAllNeedCopyNode(ids, rootNode.getContractId());
|
|
|
+ // 2全部重置id(后期根据是否复制表单考虑重置施工图金额)
|
|
|
+ vos.stream().forEach(l -> {
|
|
|
+ CopyMeterNodeVO2 vo2 = vo2Map.get(l.getId());
|
|
|
+ l.setNewId(SnowFlakeUtil.getId());
|
|
|
+ l.setNodeName(vo2.getNodeName());
|
|
|
+ l.setStartStake(vo2.getStartStake());
|
|
|
+ l.setEndStake(vo2.getEndStake());
|
|
|
+ l.setContractPicture(vo2.getContractPicture());
|
|
|
+ });
|
|
|
+ // 3 转换为树
|
|
|
+ Long l1 = System.currentTimeMillis();
|
|
|
+ List<CopyMeterNodeVO> list = ForestNodeMerger.merge(vos);
|
|
|
+ Long l2 = System.currentTimeMillis();
|
|
|
+ System.out.println(l2 - l1);
|
|
|
+ if (list.size() != 1) {
|
|
|
+ throw new ServiceException("获取子节点错误");
|
|
|
+ }
|
|
|
+ // 4 递归为每个节点设置父id与祖级id
|
|
|
+ Long l3 = System.currentTimeMillis();
|
|
|
+ resetParentAndAncestors(list, vo);
|
|
|
+ Long l4 = System.currentTimeMillis();
|
|
|
+ System.out.println(l4 - l3);
|
|
|
+ // 手动转换类型
|
|
|
+ List<MeterTreeContract> contracts = vos.stream().map(l -> {
|
|
|
+ MeterTreeContract meter = new MeterTreeContract();
|
|
|
+ meter.setId(l.getNewId());
|
|
|
+ meter.setParentId(l.getNewParentId());
|
|
|
+ meter.setAncestor(l.getNewAncestors());
|
|
|
+ meter.setNodeName(l.getNodeName());
|
|
|
+ meter.setNodeCode(l.getNodeCode());
|
|
|
+ meter.setNodeType(l.getNodeType());
|
|
|
+ meter.setEngineeringTypeName(l.getEngineeringTypeName());
|
|
|
+ meter.setDataSourceType(5);
|
|
|
+ meter.setUpdateStatus(l.getUpdateStatus());
|
|
|
+ meter.setProjectId(l.getProjectId());
|
|
|
+ meter.setContractId(l.getContractId());
|
|
|
+ meter.setRemarks(l.getRemarks());
|
|
|
+ meter.setTenantId(l.getTenantId());
|
|
|
+ meter.setSort(l.getSort());
|
|
|
+ meter.setShowType(l.getShowType());
|
|
|
+ meter.setStartStake(l.getStartStake());
|
|
|
+ meter.setStakeType(l.getStakeType());
|
|
|
+ meter.setEndStake(l.getEndStake());
|
|
|
+ meter.setContractPicture(l.getContractPicture());
|
|
|
+ meter.setChangePicture(l.getChangePicture());
|
|
|
+ meter.setIsSupplement(l.getIsSupplement());
|
|
|
+ meter.setIsResolveForm(l.getIsResolveForm());
|
|
|
+ meter.setIsLock(l.getIsLock());
|
|
|
+ meter.setUpPayRatio(l.getUpPayRatio());
|
|
|
+ meter.setIsAutoMeter(l.getIsAutoMeter());
|
|
|
+ meter.setIsConcreteNode(l.getIsConcreteNode());
|
|
|
+ meter.setSevenRatio(l.getSevenRatio());
|
|
|
+ meter.setTwentyEightRatio(l.getTwentyEightRatio());
|
|
|
+ meter.setCalculateFormula(l.getCalculateFormula());
|
|
|
+ //节点金额最后通过是否复制清单来考虑设置
|
|
|
+ return meter;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ // 6 保存
|
|
|
+ this.saveBatch(contracts);
|
|
|
+ return R.success("复制成功,本次复制" + contracts.size() + "个节点");
|
|
|
+ }catch (Exception e){
|
|
|
+ throw new ServiceException("复制失败:"+e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<CopyMeterNodeVO2> getCurrentNodeTree(Long id, Long contractId) {
|
|
|
+ //获取当前节点,以及所有子节点
|
|
|
+ List<CopyMeterNodeVO2> vo2s = baseMapper.getCurrentNodeTree(id,contractId);
|
|
|
+ //转为树
|
|
|
+ Long l1 = System.currentTimeMillis();
|
|
|
+ List<CopyMeterNodeVO2> list = ForestNodeMerger.merge(vo2s);
|
|
|
+ Long l2 = System.currentTimeMillis();
|
|
|
+ System.out.println(l2-l1);
|
|
|
+ //如果根节点出现2个,则代表结构错误
|
|
|
+ if (list.size() != 1){
|
|
|
+ throw new ServiceException("获取子节点错误");
|
|
|
+ }
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 通过清单信息和合同计量单元节点,施工图数量,返回组装好的中间表对象
|
|
|
*/
|
|
@@ -2566,4 +2681,32 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ //递归方法,复制节点用
|
|
|
+ private void resetParentAndAncestors(List<CopyMeterNodeVO> list,CopyMeterNodeVO parentId){
|
|
|
+ for (CopyMeterNodeVO vo : list) {
|
|
|
+ vo.setNewParentId(parentId.getNewId());
|
|
|
+ vo.setNewAncestors(parentId.getNewAncestors()+","+parentId.getNewId());
|
|
|
+ if (vo.getChildren() != null){
|
|
|
+ resetParentAndAncestors(vo.getChildren(),vo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void getTreeList(CopyMeterNodeVO2 tree, List<CopyMeterNodeVO2> nodes) {
|
|
|
+ if (tree == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ nodes.add(tree);
|
|
|
+ if (tree.getIsAddChildNode() == 0){
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ List<CopyMeterNodeVO2> children = tree.getChildren();
|
|
|
+ if (children != null) {
|
|
|
+ for (CopyMeterNodeVO2 child : children) {
|
|
|
+ getTreeList(child, nodes);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|