Kaynağa Gözat

合同计量单元导入模板3

qianxb 11 ay önce
ebeveyn
işleme
a9dc7735c0

+ 3 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/InventoryFormMeterVO2.java

@@ -37,4 +37,7 @@ public class InventoryFormMeterVO2 extends InventoryFormMeter {
 	@ApiModelProperty(value = "是否被计量0是1否")
 	private Integer isMeter;
 
+	@ApiModelProperty(value = "是否原生0是1否")
+	private Integer isProto;
+
 }

+ 2 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterImport3VO.java

@@ -57,6 +57,8 @@ public class MeterImport3VO implements INode<MeterImport3VO> {
     private Integer nodeType;
     private String remarks;
     private String contractPicture;
+    private String changePicture;
+
 
     @ApiModelProperty(value = "项目id")
     private Long projectId;

+ 2 - 2
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/InventoryFormMeterMapper.xml

@@ -22,12 +22,12 @@
     <insert id="batchInsert" parameterType="java.util.List">
         INSERT INTO s_inventory_form_meter (id,
         project_id,contract_id,contract_form_id,contract_meter_id,build_picture_total,
-        change_build_picture_total,build_picture_money,change_build_picture_money,create_user,update_user,create_dept)
+        change_build_picture_total,build_picture_money,change_build_picture_money)
         VALUES
         <foreach collection="list" item="item" separator=",">
             (#{item.id}, #{item.projectId},#{item.contractId}, #{item.contractFormId},#{item.contractMeterId},
             #{item.buildPictureTotal},#{item.changeBuildPictureTotal},#{item.buildPictureMoney},
-            #{item.changeBuildPictureMoney},#{item.createUser},#{item.updateUser},#{item.createDept})
+            #{item.changeBuildPictureMoney})
         </foreach>
     </insert>
 

+ 6 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MeterTreeContractMapper.java

@@ -51,4 +51,10 @@ public interface MeterTreeContractMapper extends BaseMapper<MeterTreeContract> {
     List<MeterImport3VO> getALLNodeByContractId(@Param("contractId") Long contractId);
 
     List<InventoryFormMeterVO2> getAllFormMeter(@Param("contractId") Long contractId);
+
+    void batchSaveMeter(@Param("list") List<MeterImport3VO> voList);
+
+    void batchUpdateMeter(@Param("list") List<MeterTreeContract> voList);
+
+    void updateBatchForm(@Param("list") List<InventoryFormMeterVO> resultFormListUpdate2);
 }

+ 33 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MeterTreeContractMapper.xml

@@ -1,6 +1,15 @@
 <?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="org.springblade.meter.mapper.MeterTreeContractMapper">
+    <insert id="batchSaveMeter">
+        INSERT INTO s_meter_tree_contract (id, parent_id, ancestor, node_name, node_type, project_id, contract_id,remarks,contract_picture,change_picture)
+        VALUES
+        <foreach collection="list" item="item" separator="," >
+            (#{item.id},#{item.parentId},#{item.ancestor},#{item.nodeName},#{item.nodeType},#{item.projectId},#{item.contractId},#{item.remarks},#{item.contractPicture},#{item.changePicture})
+        </foreach>
+        ;
+
+    </insert>
     <update id="batchUpdateById">
         <foreach item="item" collection="list" separator=";">
             UPDATE s_meter_tree_contract
@@ -34,6 +43,29 @@
     <update id="updateMiddleMeter">
         update s_middle_meter_apply set calculate_formula = #{dto.calculateFormula} where contract_id = #{dto.contractId} and contract_unit_id = #{dto.id}
     </update>
+    <update id="batchUpdateMeter">
+        <foreach item="item" collection="list" separator=";">
+            UPDATE s_meter_tree_contract
+            <set>
+                remarks = #{item.remarks},
+                contract_picture = #{item.contractPicture},
+                change_picture = #{item.changePicture}
+            </set>
+            where id = #{item.id}
+        </foreach>
+    </update>
+    <update id="updateBatchForm">
+        <foreach item="item" collection="list" separator=";">
+            UPDATE s_inventory_form_meter
+            <set>
+                build_picture_total = #{item.buildPictureTotal},
+                change_build_picture_total = #{item.changeBuildPictureTotal},
+                build_picture_money = #{item.buildPictureMoney},
+                change_build_picture_money = #{item.changeBuildPictureMoney}
+            </set>
+            where id = #{item.id}
+        </foreach>
+    </update>
 
     <select id="getAllChildNodeMoney" resultType="org.springblade.meter.entity.MeterTreeContract">
         select ifnull(sum(build_picture_money),0) as build_picture_money,
@@ -105,7 +137,7 @@
         from s_meter_tree_contract where contract_id = #{contractId} and is_deleted = 0
     </select>
     <select id="getAllFormMeter" resultType="org.springblade.meter.vo.InventoryFormMeterVO2">
-        select *,
+        select *,1 as isProto,
                if((select count(1) from s_inventory_form_apply ifa where ifa.contract_id = #{contractId} and ifa.is_deleted = 0
                     and ifa.contract_meter_id = ifm.contract_meter_id and ifa.contract_form_id = ifm.contract_form_id) = 0,0,1) as isMeter
         from s_inventory_form_meter ifm

+ 96 - 46
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MeterTreeContractServiceImpl.java

@@ -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());
         }