Bladeren bron

Merge branch 'dev' of http://219.151.181.73:3000/zhuwei/bladex

lvy 3 maanden geleden
bovenliggende
commit
9d1c3c26ac

+ 4 - 4
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/ChangeTokenFormController.java

@@ -60,8 +60,8 @@ public class ChangeTokenFormController extends BladeController {
 	@ApiImplicitParams(value = {
 			@ApiImplicitParam(name = "contractId", value = "合同id", required = true)
 	})
-	public R buildZeroChange(Long contractId) {
-		changeTokenFormService.buildZeroChange(contractId);
+	public R buildZeroChange(Long contractId,Long nodeId) {
+		changeTokenFormService.buildZeroChange(contractId,nodeId);
 		return R.success("生成成功");
 	}
 
@@ -177,7 +177,7 @@ public class ChangeTokenFormController extends BladeController {
 		IPage<ChangeTokenPageVO> pages = changeTokenFormService.page2(contractId,query);
 		return R.data(pages);
 	}
-	
+
 	/**
 	 * 删除 变更令表
 	 */
@@ -217,5 +217,5 @@ public class ChangeTokenFormController extends BladeController {
 		return R.success("撤销成功");
 	}
 
-	
+
 }

+ 1 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormMapper.java

@@ -33,7 +33,7 @@ import java.util.List;
 public interface ChangeTokenFormMapper extends BaseMapper<ChangeTokenForm> {
 
 
-    List<ContractInventoryForm> getAllForm(@Param("contractId") Long contractId);
+    List<ContractInventoryForm> getAllForm(@Param("contractId") Long contractId,@Param("nodeId")Long nodeId);
 
     List<ZeroChangeVO> getZeroChange(@Param("contractId") Long contractId,@Param("nodeId") Long nodeId);
 

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

@@ -83,8 +83,16 @@
                        where ifm.contract_id = #{contractId} and ifm.is_deleted = 0 and ifm.contract_form_id = cif.id),0) as changeTotal
         from s_contract_inventory_form cif
         where id in
-        (select contract_form_id from s_inventory_form_meter
-                where contract_id = #{contractId} and is_deleted = 0 group by contract_form_id)
+              (SELECT contract_form_id
+               FROM s_inventory_form_meter
+               WHERE contract_id = #{contractId}
+                 and is_deleted = 0
+                 and contract_meter_id in (SELECT id
+                                           FROM s_meter_tree_contract mtc
+                                           WHERE contract_id = #{contractId}
+                                             and is_deleted = 0
+                                             and (mtc.id = #{nodeId} or FIND_IN_SET(#{nodeId}, ancestor) > 0))
+               GROUP BY contract_form_id)
     </select>
     <select id="getZeroChange" resultType="org.springblade.meter.vo.ZeroChangeVO">
         select id,form_number,form_name,current_price,contract_total,contract_money,

+ 1 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/service/IChangeTokenFormService.java

@@ -38,7 +38,7 @@ public interface IChangeTokenFormService extends BaseService<ChangeTokenForm> {
     /**
      * 一键生成零号变更
      */
-    void buildZeroChange(Long contractId);
+    void buildZeroChange(Long contractId,Long nodeId);
 
     /**
      * 获取零号变更

+ 2 - 2
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenFormServiceImpl.java

@@ -90,9 +90,9 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
      * 一键生成零号变更  统计每个清单节点当前分解量,设置进清单的划分数量
      */
     @Override
-    public void buildZeroChange(Long contractId) {
+    public void buildZeroChange(Long contractId,Long nodeId) {
         //联表查询清单表和中间表
-        List<ContractInventoryForm> list = baseMapper.getAllForm(contractId);
+        List<ContractInventoryForm> list = baseMapper.getAllForm(contractId,nodeId);
         if (list.size() == 0){
             throw new ServiceException("生成失败,当前合同段还没有清单");
         }

+ 16 - 17
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MiddleMeterApplyServiceImpl.java

@@ -255,14 +255,17 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
              //保存清单
             List<InventoryFormApply> formApplies = formList.stream().map(l -> {
                 //校验数据
-                if (l.getIsBuildThanContract() == 1){
-                    if (info.getIsOverMeter() == 0 || l.getIsCreateDivide() == 0){
-                        throw new ServiceException("施工图数量未大于合同数量,保存失败");
-                    }
-                }else {
-                    if (l.getAllMeterTotal().compareTo(l.getChangeTotal()) == 1 && info.getIsOverMeter() == 0){
-                        throw new ServiceException("计量量超出施工图数量,保存失败");
-                    }
+//                if (l.getIsBuildThanContract() == 1){
+//                    if (info.getIsOverMeter() == 0 || l.getIsCreateDivide() == 0){
+//                        throw new ServiceException("施工图数量大于合同数量,保存失败");
+//                    }
+//                }else {
+//                    if (l.getAllMeterTotal().compareTo(l.getChangeTotal()) == 1 && info.getIsOverMeter() == 0){
+//                        throw new ServiceException("计量量超出施工图数量,保存失败");
+//                    }
+//                }
+                if(l.getAllMeterTotal().compareTo(l.getContractChangeAllTotal())>0){
+                    throw new ServiceException(l.getFormName()+"的累计计量量已超过清单数量,请申请变更流程");
                 }
                 InventoryFormApply formApply = new InventoryFormApply();
                 formApply.setBusinessDate(dto.getBusinessDate());
@@ -457,14 +460,8 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
             //保存清单
             List<InventoryFormApply> formApplies = formList.stream().map(l -> {
                 //校验数据
-                if (l.getIsBuildThanContract() == 1){
-                    if (info.getIsOverMeter() == 0 || l.getIsCreateDivide() == 0){
-                        throw new ServiceException("施工图数量未大于合同数量,保存失败");
-                    }
-                }else {
-                    if (l.getAllMeterTotal().compareTo(l.getChangeTotal()) == 1 && info.getIsOverMeter() == 0){
-                        throw new ServiceException("计量量超出施工图数量,保存失败");
-                    }
+                if(l.getAllMeterTotal().compareTo(l.getContractChangeAllTotal())>0){
+                    throw new ServiceException(l.getFormName()+"的累计计量量已超过清单数量,请申请变更流程");
                 }
                 InventoryFormApply formApply = new InventoryFormApply();
                 formApply.setBusinessDate(dto.getBusinessDate());
@@ -672,7 +669,9 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
         //计算分解数量是否超过合同数量
         for (MeterInventoryVO form : formList) {
             //设置施工图数量是否大于合同数量
-            form.setOtherPayRatio(form.getOtherMeterTotal().divide(form.getCurrentBuildChangeTotal(), 4, RoundingMode.DOWN).multiply(new BigDecimal(100)).setScale(2));
+            if(form.getCurrentBuildChangeTotal()!=null&&form.getCurrentBuildChangeTotal().compareTo(BigDecimal.ZERO)!=0){
+                form.setOtherPayRatio(form.getOtherMeterTotal().divide(form.getCurrentBuildChangeTotal(), 4, RoundingMode.DOWN).multiply(new BigDecimal(100)).setScale(2));
+            }
             form.setIsBuildThanContract(form.getChangeTotal().compareTo(form.getContractChangeAllTotal()) == 1?1:0);
         }
         vo.setFormList(formList);

+ 16 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/controller/WbsTreeController.java

@@ -18,6 +18,7 @@ import org.springblade.manager.entity.ContractRelationJlyz;
 import org.springblade.manager.vo.PrivateTreeVO2;
 import org.springblade.manager.vo.WbsTreeContractLazyVO;
 import org.springblade.system.user.service.IUserService;
+import org.springblade.system.user.util.ComplexStringComparator;
 import org.springblade.system.user.vo.InformationQueryVO1;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
@@ -25,6 +26,8 @@ import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 
 @RestController
@@ -89,6 +92,19 @@ public class WbsTreeController extends BladeController {
         } else {
             vos = iUserService.lazyQueryContractWbsTree(parentId, contractId, contractIdRelation, tableOwner,description);
             if (vos != null && ObjectUtil.isNotEmpty(dataInfoId)) {
+
+                // 修改比较器链,处理空值情况
+                Comparator<WbsTreeContractLazyVO> safeComparator = Comparator
+                        .comparing(WbsTreeContractLazyVO::getSort, Comparator.nullsFirst(Comparator.naturalOrder()))
+                        .thenComparing(new ComplexStringComparator<>(obj ->
+                                obj.getTitle() != null ? obj.getTitle() : ""))
+                        .thenComparing(Comparator.comparing(
+                                WbsTreeContractLazyVO::getCreateTime,
+                                Comparator.nullsLast(Comparator.reverseOrder()))
+                        );
+                //对结果进行排序
+                vos.sort(safeComparator);
+
                 if (("2").equals(classifyType) && ObjectUtil.isNotEmpty(contractIdRelation)) {
                     JSONArray array = JSONArray.parseArray(JSON.toJSONString(vos));
                     redisTemplate.opsForValue().set("blade-manager::contract:wbstree:" + dataInfoId, JSON.toJSON(array).toString());

+ 6 - 6
blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

@@ -726,7 +726,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                     String sql = "SELECT is_custom,p_key_id,contract_id," +
                             "(SELECT is_reference_number FROM m_contract_info WHERE id="+contractId+") AS isReferenceNumber,"+
                             "(SELECT id FROM u_contract_tree_drawings WHERE process_id = p_key_id AND is_deleted = 0 limit 1) AS drawingsId," +
-                            "id,parent_id,node_type,type,wbs_type,is_buss_show as isBussShow,is_concrete,major_data_type,class_name,unit_name,node_class,unit_num,excellent_num,is_classifition,digitize_time,partition_code,old_id,contract_id_relation,is_concealed_works_node,wbs_id," +
+                            "id,parent_id,node_type,type,wbs_type,is_buss_show as isBussShow,is_concrete,major_data_type,class_name,unit_name,node_class,unit_num,excellent_num,is_classifition,digitize_time,partition_code,old_id,contract_id_relation,is_concealed_works_node,wbs_id,sort,create_time," +
                             "CASE (SELECT count(1) FROM u_tree_contract_first AS tcf WHERE tcf.is_deleted = 0 AND tcf.wbs_node_id = a.p_key_id) " +
                             "WHEN 0 THEN 'false' ELSE 'true' END AS isFirst,IFNULL(if(length(trim(full_name))>0,full_name,node_name),node_name) AS title," +
                             "(SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_wbs_tree_contract b WHERE b.parent_id = a.id AND b.type = 1" +
@@ -734,8 +734,8 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                             "(SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_wbs_tree_contract b WHERE b.parent_id = a.id AND b.type = 1" +
                             " AND b.status = 1 AND b.contract_id = " + contractId + " AND b.is_deleted = 0 AND is_custom = 1 ) AS isCustomChild " +
                             "FROM m_wbs_tree_contract a WHERE a.node_type != 111 AND a.type = 1 AND a.status = 1  And  a.is_deleted = 0 " +
-                            "AND parent_id = " + (StringUtils.isNotEmpty(id) ? id : 0) + " AND contract_id = " + contractId + " " +
-                            "ORDER BY a.sort,title,a.create_time";
+                            "AND parent_id = " + (StringUtils.isNotEmpty(id) ? id : 0) + " AND contract_id = " + contractId;
+//                            " ORDER BY a.sort,title,a.create_time";
 
                     List<WbsTreeContractLazyVO> lazyNodes = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
                     //资料填报 不返回已隐藏的节点
@@ -864,7 +864,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                             String sql = "SELECT is_custom,p_key_id,contract_id," +
                                     "(SELECT is_reference_number FROM m_contract_info WHERE id="+contractId+") AS isReferenceNumber,"+
                                     "(SELECT id FROM u_contract_tree_drawings WHERE process_id = p_key_id AND is_deleted = 0 limit 1) AS drawingsId," +
-                                    "id,parent_id,node_type,type,wbs_type,is_concrete,major_data_type,class_name,unit_name,node_class,unit_num,excellent_num,is_classifition,digitize_time,partition_code,old_id,contract_id_relation,is_concealed_works_node,wbs_id," +
+                                    "id,parent_id,node_type,type,wbs_type,is_concrete,major_data_type,class_name,unit_name,node_class,unit_num,excellent_num,is_classifition,digitize_time,partition_code,old_id,contract_id_relation,is_concealed_works_node,wbs_id,sort,create_time," +
                                     "CASE (SELECT count(1) FROM u_tree_contract_first AS tcf WHERE tcf.is_deleted = 0 AND tcf.wbs_node_id = a.p_key_id) " +
                                     "WHEN 0 THEN 'false' ELSE 'true' END AS isFirst,IFNULL(if(length(trim(full_name))>0,full_name,node_name),node_name) AS title," +
                                     "(SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_wbs_tree_contract b WHERE b.parent_id = a.id AND b.type = 1" +
@@ -872,8 +872,8 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                                     "(SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_wbs_tree_contract b WHERE b.parent_id = a.id AND b.type = 1" +
                                     " AND b.status = 1 AND b.contract_id = " + sgContractId + " AND b.is_deleted = 0 AND is_custom = 1) AS isCustomChild " +
                                     "FROM m_wbs_tree_contract a WHERE a.node_type != 111 AND a.type = 1 AND a.status = 1 AND a.is_deleted = 0 " +
-                                    "AND parent_id = " + (StringUtils.isNotEmpty(id) ? id : 0) + " AND contract_id = " + sgContractId + " " +
-                                    "ORDER BY a.sort,title,a.create_time";
+                                    "AND parent_id = " + (StringUtils.isNotEmpty(id) ? id : 0) + " AND contract_id = " + sgContractId;
+//                                    " ORDER BY a.sort,title,a.create_time";
                             List<WbsTreeContractLazyVO> lazyNodes = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
                             if (lazyNodes.size() > 0) {
                                 List<WbsTreeContractLazyVO> nodesAll = this.getNodeAll(sgContractId);

+ 78 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/util/ComplexStringComparator.java

@@ -0,0 +1,78 @@
+package org.springblade.system.user.util;
+
+import org.apache.poi.ss.formula.functions.T;
+import org.springblade.manager.vo.WbsTreeContractLazyVO;
+
+import java.util.*;
+import java.util.function.Function;
+import java.util.regex.*;
+
+public class ComplexStringComparator<T> implements Comparator<T> {
+    private final Function<T, String> fieldExtractor;
+
+    public ComplexStringComparator(Function<T, String> fieldExtractor) {
+        this.fieldExtractor = fieldExtractor;
+    }
+
+    @Override
+    public int compare(T o1, T o2) {
+        String s1 = fieldExtractor.apply(o1);
+        String s2 = fieldExtractor.apply(o2);
+        return compareComplexStrings(s1, s2);
+    }
+
+    // 复杂字符串比较核心算法
+    private int compareComplexStrings(String s1, String s2) {
+        List<Object> parts1 = splitString(s1);
+        List<Object> parts2 = splitString(s2);
+
+        int minLength = Math.min(parts1.size(), parts2.size());
+        for (int i = 0; i < minLength; i++) {
+            Object p1 = parts1.get(i);
+            Object p2 = parts2.get(i);
+
+            if (p1 instanceof Integer && p2 instanceof Integer) {
+                int cmp = ((Integer) p1).compareTo((Integer) p2);
+                if (cmp != 0) return cmp;
+            } else {
+                int cmp = p1.toString().compareTo(p2.toString());
+                if (cmp != 0) return cmp;
+            }
+        }
+        return Integer.compare(parts1.size(), parts2.size());
+    }
+
+    // 字符串拆分工具方法(字母与数字分离)
+    private List<Object> splitString(String s) {
+        List<Object> parts = new ArrayList<>();
+        StringBuilder buffer = new StringBuilder();
+        int numFlag = -1; // 0:字母 1:数字
+
+        for (char c : s.toCharArray()) {
+            if (Character.isDigit(c)) {
+                if (numFlag == 0) {
+                    parts.add(buffer.toString());
+                    buffer.setLength(0);
+                }
+                numFlag = 1;
+                buffer.append(c);
+            } else {
+                if (numFlag == 1) {
+                    parts.add(Integer.parseInt(buffer.toString()));
+                    buffer.setLength(0);
+                }
+                numFlag = 0;
+                buffer.append(c);
+            }
+        }
+
+        if (buffer.length() > 0) {
+            if (numFlag == 1) {
+                parts.add(Integer.parseInt(buffer.toString()));
+            } else {
+                parts.add(buffer.toString());
+            }
+        }
+        return parts;
+    }
+}