Эх сурвалжийг харах

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

lvy 1 долоо хоног өмнө
parent
commit
efa30bee85
15 өөрчлөгдсөн 450 нэмэгдсэн , 175 устгасан
  1. 17 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/HideProcess.java
  2. 12 3
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/MaterialProgressVO.java
  3. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskSignInfoVO.java
  4. 73 15
      blade-service/blade-business/src/main/java/org/springblade/business/controller/MaterialProgressController.java
  5. 21 6
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVDataServiceImpl.java
  6. 5 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  7. 0 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  8. 29 36
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  9. 151 17
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  10. 9 3
      blade-service/blade-meter/src/main/java/org/springblade/meter/config/RedissonConfig.java
  11. 48 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/APIController.java
  12. 27 88
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java
  13. 0 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/utils/FileUtils.java
  14. 44 0
      blade-service/blade-user/pom.xml
  15. 11 3
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

+ 17 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/HideProcess.java

@@ -0,0 +1,17 @@
+package org.springblade.business.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@TableName("m_hide_process")
+public class HideProcess implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+    private Long contractId;
+    private Integer classifyType;
+    private Integer hideType;
+}

+ 12 - 3
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/MaterialProgressVO.java

@@ -1,6 +1,7 @@
 package org.springblade.business.vo;
 
 import io.swagger.annotations.ApiModelProperty;
+import io.swagger.models.auth.In;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -22,8 +23,8 @@ public class MaterialProgressVO {
     @ApiModelProperty("WBS进度")
     private List<TreeMaterialProgress> treeMaterialProgressList = new ArrayList<>();
 
-    public void setProcessMaterialList(String title, Integer amount, Long successAmount) {
-        this.processMaterialList.add(new ProcessMaterial(title, amount, successAmount));
+    public void setProcessMaterialList(String title, Integer amount, Long successAmount, Integer isHide,Integer hideType) {
+        this.processMaterialList.add(new ProcessMaterial(title, amount, successAmount,isHide,hideType));
     }
 
     public void setProcessMaterialStatusList(String title, Integer submitAmount, Integer awaitAmount, Integer approvalAmount) {
@@ -175,6 +176,8 @@ public class MaterialProgressVO {
         private Integer awaitAmount;
         @ApiModelProperty("已审批数量")
         private Integer approvalAmount;
+        @ApiModelProperty("是否隐藏 0显示1隐藏")
+        private Integer isHide;
 
         public ProcessMaterialStatus(String title, Integer submitAmount, Integer awaitAmount, Integer approvalAmount) {
             this.title = title;
@@ -195,8 +198,12 @@ public class MaterialProgressVO {
         private Long successAmount;
         @ApiModelProperty("完成率")
         private BigDecimal ratio;
+        @ApiModelProperty("是否隐藏 0显示1隐藏")
+        private Integer isHide;
+        @ApiModelProperty("1开工报告 2工序资料 3评定资料 4中间交工")
+        private Integer hideType;
 
-        public ProcessMaterial(String title, Integer amount, Long successAmount) {
+        public ProcessMaterial(String title, Integer amount, Long successAmount,Integer isHide,Integer hideType) {
             this.title = title;
             this.amount = amount;
             this.successAmount = successAmount;
@@ -206,6 +213,8 @@ public class MaterialProgressVO {
             } else {
                 this.ratio = new BigDecimal("0");
             }
+            this.isHide = isHide;
+            this.hideType = hideType;
         }
 
     }

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskSignInfoVO.java

@@ -1,5 +1,6 @@
 package org.springblade.business.vo;
 
+import com.alibaba.fastjson.JSONArray;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -92,4 +93,6 @@ public class TaskSignInfoVO {
     @ApiModelProperty("是否可以签章:0-表示可以,否则就不行")
     private Integer isSignature;
 
+    @ApiModelProperty("电签分页逻辑数据")
+    private JSONArray pagePdfUrl;
 }

+ 73 - 15
blade-service/blade-business/src/main/java/org/springblade/business/controller/MaterialProgressController.java

@@ -22,11 +22,13 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
+import org.springblade.business.entity.HideProcess;
 import org.springblade.business.entity.InformationQuery;
 import org.springblade.business.service.IImageClassificationFileService;
 import org.springblade.business.service.IInformationQueryService;
 import org.springblade.business.vo.MaterialProgressVO;
 import org.springblade.business.vo.QueryProcessDataVO;
+import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
@@ -39,12 +41,10 @@ import org.springblade.manager.feign.WbsTreeContractClient;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
 import org.springblade.system.entity.Menu;
 import org.springblade.system.entity.RoleMenu;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -72,8 +72,10 @@ public class MaterialProgressController extends BladeController {
     private final IImageClassificationFileService imageClassificationFileService;
 
     private final ContractClient contractClient;
+
     private final JdbcTemplate jdbcTemplate;
 
+
     /**
      * 资料进度
      */
@@ -298,7 +300,7 @@ public class MaterialProgressController extends BladeController {
                 }
                 if (countList.size() > 0) {
                     //设置参数
-                    this.setTaskParameter(reVO, countList, classifyType);
+                    this.setTaskParameter(reVO, countList, classifyType,contractId);
                     filtetDataByRole(contract, reVO,2);
                     return R.data(reVO);
                 }
@@ -307,7 +309,7 @@ public class MaterialProgressController extends BladeController {
             //找到可填写的
             List<WbsTreeContract> submitNodeList = this.wbsTreeContractClient.queryContractSubmitWbsTreeByContractId(contractId);
             if (submitNodeList != null && submitNodeList.size() > 0) {
-                this.setTaskParameter(reVO, submitNodeList, classifyType);
+                this.setTaskParameter(reVO, submitNodeList, classifyType,contractId);
                 filtetDataByRole(contract, reVO,2);
                 return R.data(reVO);
             }
@@ -405,7 +407,7 @@ public class MaterialProgressController extends BladeController {
         }*/
     }
 
-    private void setTaskParameter(MaterialProgressVO reVO, List<WbsTreeContract> submitNodeList, String classifyType) {
+    private void setTaskParameter(MaterialProgressVO reVO, List<WbsTreeContract> submitNodeList, String classifyType,String contractId) {
         classifyType = StringUtils.isEmpty(classifyType) ? "1" : classifyType;
 
         //汇总四个填报类型的总数
@@ -433,7 +435,6 @@ public class MaterialProgressController extends BladeController {
         if (completion.size() > 0) {
             completionSubmitList = this.informationQueryService.list(Wrappers.<InformationQuery>lambdaQuery().in(InformationQuery::getWbsId, completion).eq(InformationQuery::getClassify, classifyType));
         }
-
         //处理工序资料
         if (processSubmitList != null && processSubmitList.size() > 0) {
             this.setParameter("工序资料", reVO, processSubmitList);
@@ -461,6 +462,27 @@ public class MaterialProgressController extends BladeController {
         } else {
             reVO.setProcessMaterialStatusList("中间交工", 0, 0, 0);
         }
+
+        String sql="select * from m_hide_process where contract_id= "+contractId+" and classify_type= "+classifyType;
+        List<HideProcess> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(HideProcess.class));
+        String hideTypes="";
+        if(!list.isEmpty()){
+            hideTypes= list.stream().map(HideProcess::getHideType).map(String::valueOf).collect(Collectors.joining(","));
+        }
+        for (MaterialProgressVO.ProcessMaterialStatus status : reVO.getProcessMaterialStatusList()) {
+            if("开工报告".equals(status.getTitle())){
+                status.setIsHide(hideTypes.contains("1")?1:0);
+            }
+            if("工序资料".equals(status.getTitle())){
+                status.setIsHide(hideTypes.contains("2")?1:0);
+            }
+            if ("评定资料".equals(status.getTitle())){
+                status.setIsHide(hideTypes.contains("3")?1:0);
+            }
+            if ("中间交工".equals(status.getTitle())){
+                status.setIsHide(hideTypes.contains("4")?1:0);
+            }
+        }
     }
 
     /**
@@ -490,7 +512,7 @@ public class MaterialProgressController extends BladeController {
                 }
                 if (countList.size() > 0) {
                     //设置参数
-                    this.setParameter(countList, reVO, classifyType);
+                    this.setParameter(countList, reVO, classifyType,contractId);
                 }
                 filtetDataByRole(contract, reVO,1);
                 return R.data(reVO);
@@ -501,7 +523,7 @@ public class MaterialProgressController extends BladeController {
             List<WbsTreeContract> submitNodeList = this.wbsTreeContractClient.queryContractSubmitWbsTreeByContractId(contractId);
             if (submitNodeList != null && submitNodeList.size() > 0) {
                 //设置参数
-                this.setParameter(submitNodeList, reVO, classifyType);
+                this.setParameter(submitNodeList, reVO, classifyType,contractId);
                 filtetDataByRole(contract, reVO,1);
                 return R.data(reVO);
             }
@@ -513,7 +535,7 @@ public class MaterialProgressController extends BladeController {
     /**
      * 设置参数
      */
-    private void setParameter(List<WbsTreeContract> submitNodeList, MaterialProgressVO reVO, String classifyType) {
+    private void setParameter(List<WbsTreeContract> submitNodeList, MaterialProgressVO reVO, String classifyType,String contractId) {
         classifyType = StringUtils.isEmpty(classifyType) ? "1" : classifyType;
         //汇总四个填报类型的总数
         List<String> process = new ArrayList<>(), workStartReports = new ArrayList<>(), evaluation = new ArrayList<>(), completion = new ArrayList<>();
@@ -541,11 +563,47 @@ public class MaterialProgressController extends BladeController {
         if (completion.size() > 0) {
             completionAmount = this.informationQueryService.count(Wrappers.<InformationQuery>query().select("distinct wbs_id").in("wbs_id", completion).eq("classify", classifyType));
         }
+        String sql="select * from m_hide_process where contract_id= "+contractId+" and classify_type= "+classifyType;
+        List<HideProcess> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(HideProcess.class));
+        String hideTypes="";
+        if(!list.isEmpty()){
+            hideTypes= list.stream().map(HideProcess::getHideType).map(String::valueOf).collect(Collectors.joining(","));
+        }
+        reVO.setProcessMaterialList("开工报告", workStartReports.size(), workStartReportsAmount,hideTypes.contains("1")?1:0,1);
+        reVO.setProcessMaterialList("工序资料", process.size(), processAmount,hideTypes.contains("2")?1:0,2);
+        reVO.setProcessMaterialList("评定资料", evaluation.size(), evaluationAmount,hideTypes.contains("3")?1:0,3);
+        reVO.setProcessMaterialList("中间交工", completion.size(), completionAmount,hideTypes.contains("4")?1:0,4);
+    }
 
-        reVO.setProcessMaterialList("开工报告", workStartReports.size(), workStartReportsAmount);
-        reVO.setProcessMaterialList("工序资料", process.size(), processAmount);
-        reVO.setProcessMaterialList("评定资料", evaluation.size(), evaluationAmount);
-        reVO.setProcessMaterialList("中间交工", completion.size(), completionAmount);
+    /**
+     *
+     * @param contractId
+     * @param classifyType 1施工2监理
+     * @param hideType 1开工报告 2工序资料 3评定资料 4中间交工
+     * @param type 0显示 1隐藏
+     * @return
+     */
+    @GetMapping("/hideProcessMaterial")
+    @ApiOperation(value = "隐藏进度")
+    @ApiOperationSupport(order = 2)
+    public R hideProcessMaterial(Long contractId,Integer classifyType,Integer hideType,Integer type){
+        classifyType = StringUtils.isEmpty(String.valueOf(classifyType)) ? 1 : classifyType;
+        if(type==0){
+            String sql="select * from m_hide_process where contract_id= "+contractId+" and classify_type= "+classifyType+" and hide_type= "+hideType;
+            List<HideProcess> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(HideProcess.class));
+            if(!list.isEmpty()){
+                String delete="delete from m_hide_process where id="+list.get(0).getId();
+                jdbcTemplate.execute(delete);
+            }
+        }else {
+            String sql="select * from m_hide_process where contract_id= "+contractId+" and classify_type= "+classifyType+" and hide_type= "+hideType;
+            List<HideProcess> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(HideProcess.class));
+            if(list.isEmpty()){
+                String insertSql="insert into m_hide_process(id,contract_id,classify_type,hide_type) values("+ SnowFlakeUtil.getId()+","+contractId+","+classifyType+","+hideType+")";
+                jdbcTemplate.execute(insertSql);
+            }
+        }
+        return R.success("操作成功");
     }
 
     /**

+ 21 - 6
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVDataServiceImpl.java

@@ -5,6 +5,9 @@ import cfca.paperless.base.util.Base64;
 import cn.hutool.core.io.file.FileReader;
 
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.AllArgsConstructor;
@@ -340,6 +343,10 @@ public class EVDataServiceImpl implements EVDataService {
                 } else if (taskApp.getApprovalType() == 3) { // 日志
                     updateSql = "update u_contract_log set e_visa_pdf_url='" + taskApp.getLastFilePdfUrl() + "',status='" + taskApp.getSigType() + "',update_time=SYSDATE() where id='" + taskApp.getFormDataId() + "' ";
                 } else if (taskApp.getApprovalType() == 5) { //中期计量支付证书
+                    // 获取s_interim_pay_certificate 的原始数据
+                    //taskApp.getPagePdfUrl()
+
+
                     updateSql = "update s_interim_pay_certificate set approve_status=" + taskApp.getSigType() + ",update_time=SYSDATE(), raw_url='" + taskApp.getLastFilePdfUrl() + "' where contract_period_id = " + taskApp.getFormDataId();
                 } else if (taskApp.getApprovalType() == 6 || taskApp.getApprovalType() == 7) {
                     updateSql = "update s_material_start_statement set approve_status=" + taskApp.getSigType() + ",update_time=SYSDATE(), raw_url='" + taskApp.getLastFilePdfUrl() + "' where meter_period_id = " + taskApp.getFormDataId();
@@ -456,18 +463,26 @@ public class EVDataServiceImpl implements EVDataService {
                 //中间计量用逗号拼接pagePdfUrl
                 String pageUrl = map.get("page_pdf_url")+"";
                 if(StringUtils.isNotEmpty(pageUrl) && pageUrl.length()>=20 ) {
-                    pdfUrl = pageUrl.replaceAll(" ", "");
-                }else{
-                    pdfUrl=map.get("raw_url") + "";
+                    JSONArray jsonArray = JSONArray.parseArray(pageUrl);
+                    JSONArray jsonData = new JSONArray();
+                    for(int i=0;i<jsonArray.size();i++){
+                        JSONObject jsonObject = jsonArray.getJSONObject(i);
+                        String state = jsonObject.getString("state");
+                        String url = jsonObject.getString("url");
+                        if(state.equals("0") && taskApp.getSigType()==1){  //这个签字
+                            taskApp.setSignPdfUrl(url);
+                        }
+                        if(state.equals("1") && taskApp.getSigType()==2){  //签章
+                            taskApp.setSignPdfUrl(url);
+                        }
+                    }
+                    taskApp.setPagePdfUrl(jsonData);
                 }
-                pdfUrl=map.get("raw_url") + "";
-                taskApp.setSignPdfUrl(pdfUrl);
             } else if (taskApp.getApprovalType() == 6 || taskApp.getApprovalType() == 7) {
                 map = this.jdbcTemplate.queryForMap("select * from  s_material_start_statement where is_deleted=0 and meter_period_id = " + taskApp.getFormDataId());
                 taskApp.setSignPdfUrl(map.get("raw_url") + "");
             }
 
-
             // 验证数据
             taskApp.setContractId(map.get("contract_id") + "");
             taskApp.setProjectId(map.get("project_id") + "");

+ 5 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -483,6 +483,11 @@ public class ExcelTabController extends BladeController {
         ExcelTab excelTab = new ExcelTab();
         if (wbsExclTabParmVO.getId() != null) {// 修改
             excelTab = excelTabService.getById(wbsExclTabParmVO.getId());
+            if(excelTab.getTabId()!=null){
+                if(!excelTab.getName().equals(wbsExclTabParmVO.getNodeName())){
+                    throw new ServiceException("当前清表已存在元素表,不允许修改");
+                }
+            }
             excelTab.setName(wbsExclTabParmVO.getNodeName());
             excelTab.setTabType(wbsExclTabParmVO.getTabType());
         } else { // 新增

+ 0 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -1601,9 +1601,6 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         for (String key : dataMap2.keySet()) {
             String[] split = key.split("_");
             String value = dataMap2.get(key);
-            //去掉占位符坐标数据
-            List<String> collect = Arrays.stream(value.split("☆")).filter(f -> !f.contains("/!@#$%^")).collect(Collectors.toList());
-            value = StringUtils.join(collect,"☆");
 
             if (split.length > 1 && Integer.parseInt(split[1]) > 80) {
                 // 大于80则保留在扩展字段中

+ 29 - 36
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -191,7 +191,6 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             option(tec);
             /*评定表*/
             assessmentForm(tec);
-
         }
         return this;
     }
@@ -746,12 +745,19 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     if (parent == null) {
                         return;
                     }
-                    List<Map<String, Object>> tableNamePkIdsMaps = this.jdbcTemplate.queryForList(
-                            "select c.init_table_name tableName,c.p_key_id pkId,c.html_url url,c.p_id from" +
-                                    " (select id from m_wbs_tree_contract where contract_id=" + currentNode.getContractId() + " and is_deleted=0 and node_type=6 and tree_code like '" + parent.getTreeCode() + "%' ORDER BY sort) k" +
-                                    " join m_wbs_tree_contract c on c.parent_id = k.id " +
-                                    "where  c.contract_id=" + currentNode.getContractId() + " and c.is_deleted=0 "
-                    );
+
+                    // 原来业务逻辑
+                   String queryAllTabs =  "select c.init_table_name tableName,c.p_key_id pkId,c.html_url url,c.p_id,type from" +
+                            " (select p_key_id from m_wbs_tree_contract where contract_id=" + currentNode.getContractId() + " and is_deleted=0 and node_type=6 and tree_code like '" + parent.getTreeCode() + "%' ORDER BY sort) k" +
+                            " join m_wbs_tree_contract c on c.p_id = k.p_key_id " +
+                            "where  c.contract_id=" + currentNode.getContractId() + " and c.is_deleted=0 " ;
+                    List<Map<String, Object>> tableNamePkIdsMaps = this.jdbcTemplate.queryForList(queryAllTabs);
+
+                 ///   String contSql = "SELECT init_table_name tableName,p_key_id pkId,html_url url,p_id,type from m_wbs_tree_contract where is_deleted=0 and node_type=6 and ancestors_p_id like '%"+parent.getPId()+"%' and contract_id ="+parent.getContractId()+"  ORDER BY sort ,full_name,create_time ";
+                  //  List<Map<String, Object>> allTable = this.jdbcTemplate.queryForList(queryAllTabs);
+                    // 对查询的表单进行排序 优先以树节点,表单名称,数字,顺序
+                 //   List<Map<String, Object>> conNode= getAllChildNodesWithStreamByMaps(parent.getPId()+"",allTable);
+                  //  List<Map<String, Object>> tableNamePkIdsMaps = conNode.stream().filter(e->(e.get("type")+"").equals("2")).collect(Collectors.toList());
                     if (Func.isNotEmpty(tableNamePkIdsMaps)) {
                         // removeList.clear();
                         missingList.forEach(miss -> {
@@ -1334,9 +1340,6 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             checkTable = op.get().getInitTableName();
         }
         for (FormData fd : tec.formDataList) {
-            if(fd.getCode().equals("m_20220929100217_1575304930258845696:key_10")){
-                System.out.println("111");
-            }
             if (fd.verify()) {
                 if(fd.getAddPages()!=0){
                     System.out.println("");
@@ -1602,8 +1605,8 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                     }
                                     if (local.size() > 0) {
                                         List<Object> values = FormulaUtils.slice(local, f);
-                                        //设置特殊展位符
-                                        values = values.stream().map(s -> StringUtils.isEmpty(s) ? "/!@#$%^" : s).collect(Collectors.toList());
+                                        //设置特殊占位符 //FC.converge 不需要执行 下面的一行代码
+                                      //  values = values.stream().map(s -> StringUtils.isEmpty(s) ? "/!@#$%^" : s).collect(Collectors.toList());
                                         FormulaUtils.write(fd, values, !fd.getTableName().equals(checkTable));
                                     }
                                 } else {
@@ -7036,34 +7039,24 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         return R.fail("无数据");
     }
 
+    // 获取所有子节点
+    public List<Map<String, Object>> getAllChildNodesWithStreamByMaps(String parentId, List<Map<String, Object>> allNodes) {
+        List<Map<String, Object>> children = new ArrayList<>();
 
-    // 批量加载+内存计算
-/*    public List<WbsTreeContractLazyVO> getAllChildNodesWithStream(Long parentId, List<WbsTreeContractLazyVO> allNodes) {
-
-        // 2. 构建内存索引
-        Map<Long, WbsTreeContractLazyVO> nodeMap = allNodes.stream()
-                .collect(Collectors.toMap(WbsTreeContractLazyVO::getPKeyId, Function.identity()));
+        // 筛选直接子节点
+        List<Map<String, Object>> directChildren = allNodes.stream()
+                .filter(node -> parentId.equals(node.get("p_id")+""))
+                .collect(Collectors.toList());
 
-        Map<Long, List<WbsTreeContractLazyVO>> childrenMap = allNodes.stream()
-                .filter(node -> node.getPId() != null)
-                .collect(Collectors.groupingBy(WbsTreeContractLazyVO::getPId));
+        // 递归处理每个子节点
+        for (Map<String, Object> child : directChildren) {
+            children.add(child);
+            children.addAll(getAllChildNodesWithStreamByMaps(child.get("pkId")+"", allNodes));
+        }
 
-        // 3. 递归查找子节点
-        List<WbsTreeContractLazyVO> result = new ArrayList<>();
-        Deque<Long> stack = new ArrayDeque<>();
-        stack.push(Func.toLong(parentId));
+        return children;
+    }
 
-        while (!stack.isEmpty()) {
-            Long currentId = stack.pop();
-            WbsTreeContractLazyVO node = nodeMap.get(currentId);
-            if (node != null) {
-                result.add(node);
-                childrenMap.getOrDefault(currentId, Collections.emptyList())
-                        .forEach(child -> stack.push(child.getPKeyId()));
-            }
-        }
-        return result;
-    }*/
     // 获取所有子节点
     public List<WbsTreeContractLazyVO> getAllChildNodesWithStream(String parentId, List<WbsTreeContractLazyVO> allNodes) {
         List<WbsTreeContractLazyVO> children = new ArrayList<>();

+ 151 - 17
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -4762,13 +4762,30 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
 
         // 按单位工程分组
         Map<Long, List<WbsTreeContract>> unitProjectMap = list.stream()
-                .filter(item -> item.getNodeType() == 18) // 单位工程
+                .filter(item -> item.getNodeType() == 18)
+                .sorted(Comparator.comparing((WbsTreeContract unit) -> {
+                            // 先按父节点的sort排序
+                            if (unit.getPId() != null) {
+                                // 查找父节点
+                                Optional<WbsTreeContract> parent = list.stream()
+                                        .filter(p -> p.getPKeyId().equals(unit.getPId()))
+                                        .findFirst();
+                                if (parent.isPresent()) {
+                                    return parent.get().getSort();
+                                }
+                            }
+                            return null; // 如果没有父节点,返回null
+                        }, Comparator.nullsLast(Comparator.naturalOrder()))
+                        .thenComparing(WbsTreeContract::getSort,
+                                Comparator.nullsLast(Comparator.naturalOrder()))) // 再按自身的sort排序
                 .collect(Collectors.toMap(
                         WbsTreeContract::getPKeyId,
                         unit -> list.stream()
                                 .filter(item -> item.getAncestorsPId() != null &&
                                         item.getAncestorsPId().contains(unit.getPKeyId().toString()))
-                                .collect(Collectors.toList())
+                                .collect(Collectors.toList()),
+                        (existing, replacement) -> existing,
+                        LinkedHashMap::new
                 ));
 
         // 为每个单位工程创建sheet
@@ -4792,6 +4809,13 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             String validSheetName = WorkbookUtil.createSafeSheetName(safeUnitName);
 
             // 创建sheet并设置名称
+            //Sheet sheet = workbook.createSheet(validSheetName);
+            String baseSheetName = validSheetName;
+            int counter = 1;
+            while (workbook.getSheet(validSheetName) != null) {
+                validSheetName = baseSheetName + "(" + counter + ")";
+                counter++;
+            }
             Sheet sheet = workbook.createSheet(validSheetName);
 
             // 创建表头(两行)- 使用模板sheet
@@ -5367,17 +5391,17 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         // 1. 先找子分项工程 (节点类型5)
         leafNodes = projects.stream()
                 .filter(item -> item.getNodeType() == 5)
+                .sorted(Comparator.comparing(WbsTreeContract::getSort,
+                        Comparator.nullsLast(Comparator.naturalOrder())))
                 .collect(Collectors.toList());
-
-        if (!leafNodes.isEmpty()) {
-            sortLeafNodes(leafNodes);
-        }
         ancestorIds= leafNodes.stream()
                 .map(WbsTreeContract::getAncestorsPId)
                 .filter(Objects::nonNull)
+                .filter(ancestors -> !ancestors.equals("null"))
                 .flatMap(ancestors -> Arrays.stream(ancestors.split(",")))
                 .map(String::trim)
                 .filter(id -> !id.isEmpty())
+                .filter(id -> !id.equals("null"))
                 .map(Long::parseLong)
                 .collect(Collectors.toSet());
 
@@ -5385,6 +5409,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         Set<Long> finalAncestorIds = ancestorIds;
         List<WbsTreeContract> items=projects.stream()
                 .filter(item -> item.getNodeType() == 4 && !finalAncestorIds.contains(item.getPKeyId()))
+                .sorted(Comparator.comparing(WbsTreeContract::getSort,
+                        Comparator.nullsLast(Comparator.naturalOrder())))
                 .collect(Collectors.toList());
         if(!items.isEmpty()&&items.size()>0){
             leafNodes.addAll(items);
@@ -5392,9 +5418,11 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         ancestorIds = leafNodes.stream()
                 .map(WbsTreeContract::getAncestorsPId)
                 .filter(Objects::nonNull)
+                .filter(ancestors -> !ancestors.equals("null"))
                 .flatMap(ancestors -> Arrays.stream(ancestors.split(",")))
                 .map(String::trim)
                 .filter(id -> !id.isEmpty())
+                .filter(id -> !id.equals("null"))
                 .map(Long::parseLong)
                 .collect(Collectors.toSet());
 
@@ -5402,6 +5430,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         Set<Long> finalAncestorIds1 = ancestorIds;
         List<WbsTreeContract> subDivisional = projects.stream()
                 .filter(item -> item.getNodeType() == 3&& !finalAncestorIds1.contains(item.getPKeyId()))
+                .sorted(Comparator.comparing(WbsTreeContract::getSort,
+                        Comparator.nullsLast(Comparator.naturalOrder())))
                 .collect(Collectors.toList());
         if(!subDivisional.isEmpty()&&subDivisional.size()>0){
             leafNodes.addAll(subDivisional);
@@ -5409,15 +5439,19 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         ancestorIds = leafNodes.stream()
                 .map(WbsTreeContract::getAncestorsPId)
                 .filter(Objects::nonNull)
+                .filter(ancestors -> !ancestors.equals("null"))
                 .flatMap(ancestors -> Arrays.stream(ancestors.split(",")))
                 .map(String::trim)
                 .filter(id -> !id.isEmpty())
+                .filter(id -> !id.equals("null"))
                 .map(Long::parseLong)
                 .collect(Collectors.toSet());
         Set<Long> finalAncestorIds2 = ancestorIds;
         // 4. 如果没有子分部,找分部工程 (节点类型2)
         List<WbsTreeContract> divisional = projects.stream()
                 .filter(item -> item.getNodeType() == 2&& !finalAncestorIds2.contains(item.getPKeyId()))
+                .sorted(Comparator.comparing(WbsTreeContract::getSort,
+                        Comparator.nullsLast(Comparator.naturalOrder())))
                 .collect(Collectors.toList());
         if(!divisional.isEmpty()&&divisional.size()>0){
             leafNodes.addAll(divisional);
@@ -5425,9 +5459,11 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         ancestorIds = leafNodes.stream()
                 .map(WbsTreeContract::getAncestorsPId)
                 .filter(Objects::nonNull)
+                .filter(ancestors -> !ancestors.equals("null"))
                 .flatMap(ancestors -> Arrays.stream(ancestors.split(",")))
                 .map(String::trim)
                 .filter(id -> !id.isEmpty())
+                .filter(id -> !id.equals("null"))
                 .map(Long::parseLong)
                 .collect(Collectors.toSet());
         Set<Long> finalAncestorIds3 = ancestorIds;
@@ -5435,28 +5471,126 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         // 5. 最后找单位工程 (节点类型18)
         List<WbsTreeContract> unit = projects.stream()
                 .filter(item -> item.getNodeType() == 18&&!finalAncestorIds3.contains(item.getPKeyId()))
+                .sorted(Comparator.comparing(WbsTreeContract::getSort,
+                        Comparator.nullsLast(Comparator.naturalOrder())))
                 .collect(Collectors.toList());
         if(!unit.isEmpty()&&unit.size()>0){
             leafNodes.addAll(unit);
         }
-        return sortLeafNodes(leafNodes);
+        return sortLeafNodes(leafNodes,projects);
     }
 
     // 排序方法:先按pId排序,pId相同则按sort排序(null值排在最后)
-    private List<WbsTreeContract> sortLeafNodes(List<WbsTreeContract> nodes) {
+    // 排序方法:按照层级顺序排序(分部 -> 子分部 -> 分项 -> 子分项)
+    private List<WbsTreeContract> sortLeafNodes(List<WbsTreeContract> nodes, List<WbsTreeContract> projects) {
         return nodes.stream()
-                .sorted(Comparator
-                        .comparing(WbsTreeContract::getPId)
-                        .thenComparing(
-                                Comparator.comparing(
-                                        WbsTreeContract::getSort,
-                                        Comparator.nullsLast(Comparator.naturalOrder())
-                                )
-                        )
-                )
+                .sorted((node1, node2) -> {
+                    // 解析祖级节点ID
+                    List<Long> ancestors1 = parseAncestors(node1.getAncestorsPId());
+                    List<Long> ancestors2 = parseAncestors(node2.getAncestorsPId());
+
+                    // 按照层级顺序比较
+                    int result;
+
+                    // 1. 先比较分部工程(nodeType=2)的sort
+                    result = compareByNodeType(ancestors1, ancestors2, projects, 2);
+                    if (result != 0) return result;
+
+                    // 2. 再比较子分部工程(nodeType=3)的sort
+                    result = compareByNodeType(ancestors1, ancestors2, projects, 3);
+                    if (result != 0) return result;
+
+                    // 3. 再比较分项工程(nodeType=4)的sort
+                    result = compareByNodeType(ancestors1, ancestors2, projects, 4);
+                    if (result != 0) return result;
+
+                    // 4. 最后比较子分项工程(nodeType=5)的sort
+                    result = compareByNodeType(ancestors1, ancestors2, projects, 5);
+                    if (result != 0) return result;
+
+                    // 5. 如果所有层级sort都相同,按当前节点sort排序
+                    return compareSortValue(node1.getSort(), node2.getSort());
+                })
                 .collect(Collectors.toList());
     }
 
+    /**
+     * 解析祖级节点ID
+     */
+    private List<Long> parseAncestors(String ancestorsPId) {
+        if (ancestorsPId == null || ancestorsPId.equals("null")) {
+            return new ArrayList<>();
+        }
+
+        return Arrays.stream(ancestorsPId.split(","))
+                .map(String::trim)
+                .filter(id -> !id.isEmpty() && !id.equals("null"))
+                .map(Long::parseLong)
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * 按照指定节点类型比较sort值
+     */
+    private int compareByNodeType(List<Long> ancestors1, List<Long> ancestors2,
+                                  List<WbsTreeContract> projects, int nodeType) {
+        // 从祖级节点中查找指定类型的节点
+        WbsTreeContract node1 = findNodeByTypeInAncestors(ancestors1, projects, nodeType);
+        WbsTreeContract node2 = findNodeByTypeInAncestors(ancestors2, projects, nodeType);
+
+        // 获取sort值进行比较
+        Integer sort1 = node1 != null ? node1.getSort() : null;
+        Integer sort2 = node2 != null ? node2.getSort() : null;
+
+        return compareSortValue(sort1, sort2);
+    }
+
+    /**
+     * 在祖级节点中查找指定类型的节点
+     */
+    private WbsTreeContract findNodeByTypeInAncestors(List<Long> ancestors,
+                                                      List<WbsTreeContract> projects, int nodeType) {
+        if (ancestors.isEmpty()) {
+            return null;
+        }
+
+        // 在祖级节点中查找指定类型的节点
+        for (Long ancestorId : ancestors) {
+            WbsTreeContract node = findNodeByIdAndType(projects, ancestorId, nodeType);
+            if (node != null) {
+                return node;
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * 根据ID和类型查找节点
+     */
+    private WbsTreeContract findNodeByIdAndType(List<WbsTreeContract> list, Long id, int nodeType) {
+        return list.stream()
+                .filter(item -> item.getPKeyId().equals(id) && item.getNodeType() == nodeType)
+                .findFirst()
+                .orElse(null);
+    }
+
+    /**
+     * 比较sort值(处理null值情况)
+     */
+    private int compareSortValue(Integer sort1, Integer sort2) {
+        if (sort1 == null && sort2 == null) {
+            return 0;
+        }
+        if (sort1 == null) {
+            return 1; // null值排在后面
+        }
+        if (sort2 == null) {
+            return -1; // null值排在后面
+        }
+        return sort1.compareTo(sort2);
+    }
+
     // 根据叶子节点类型填充工程数据
     private void fillEngineeringDataByLeafType(Row row, List<WbsTreeContract> projects, List<Long> ancestorIds,
                                                Map<Integer, List<CellRangeAddress>> mergeMap, int rowNum,

+ 9 - 3
blade-service/blade-meter/src/main/java/org/springblade/meter/config/RedissonConfig.java

@@ -3,6 +3,7 @@ package org.springblade.meter.config;
 import org.redisson.Redisson;
 import org.redisson.api.RedissonClient;
 import org.redisson.config.Config;
+import org.springblade.common.utils.SystemUtils;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
@@ -11,9 +12,14 @@ public class RedissonConfig {
     @Bean
     public RedissonClient redissonClient() {
         Config config = new Config();
-        config.useSingleServer()
-                .setAddress("redis://127.0.0.1:6378")
-                .setPassword("123456");
+        if(SystemUtils.isLinux()){
+            config.useSingleServer()
+                    .setAddress("redis://127.0.0.1:6378")
+                    .setPassword("123456");
+        }else {
+            config.useSingleServer()
+                    .setAddress("redis://127.0.0.1:6379");
+        }
         return Redisson.create(config);
     }
 }

+ 48 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/APIController.java

@@ -13,6 +13,7 @@ import org.springblade.business.entity.Task;
 import org.springblade.business.entity.TaskParallel;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
@@ -28,6 +29,7 @@ import org.springblade.meter.mapper.MeterApproveOpinionMapper;
 import org.springblade.meter.mapper.MiddleMeterApplyTaskMapper;
 import org.springblade.meter.mapper.StartPayMeterFormTaskMapper;
 import org.springblade.meter.vo.ApiTaskPageVo;
+import org.springblade.system.entity.Role;
 import org.springblade.system.user.entity.User;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
@@ -66,6 +68,26 @@ public class APIController {
 //        if (ObjectUtil.isEmpty(dto.getProjectId()) || ObjectUtil.isEmpty(dto.getContractId())) {
 //            throw new ServiceException("未获取到当前项目或合同段信息");
 //        }
+        Boolean isYZ=false;
+        BladeUser user = SecureUtil.getUser();
+        String roleId = user.getRoleId();
+        String sqlRole="select * from blade_role where id="+roleId;
+        List<Role> query1 = jdbcTemplate.query(sqlRole, new BeanPropertyRowMapper<>(Role.class));
+        if(!query1.isEmpty()){
+            Role role = query1.get(0);
+            Long parentId = role.getParentId();
+            if(parentId==1537246243393589249L){
+                isYZ=true;
+            }
+        }
+        if (roleId.equals("1537246243393589249")){
+            isYZ=true;
+        }
+        if(!isYZ){
+          if (ObjectUtil.isEmpty(dto.getProjectId()) || ObjectUtil.isEmpty(dto.getContractId())) {
+             throw new ServiceException("未获取到当前项目或合同段信息");
+         }
+        }
         if(dto.getCurrent()==null){
             dto.setCurrent(1);
         }
@@ -94,6 +116,10 @@ public class APIController {
                 ids.add(Long.parseLong(dto.getContractId())); //把本身合同段也加入查询
                 sqlString.append(" AND contract_id in(").append(StringUtils.join(ids, ",")).append(")");
             }
+        }else {
+            if(isYZ){
+                sqlString.append(" AND project_id in ('1750070685257990145','1795277868551389185') ");
+            }
         }
         if (ObjectUtil.isNotEmpty(dto.getStatusValue())) {
             if(dto.getStatusValue() .equals(4) ){//----先查询出所有待审批的 然后根据条件进行过滤出任务已经到当前登陆人的任务为可审批
@@ -135,6 +161,28 @@ public class APIController {
                 params.add(SecureUtil.getUserId());
             }
             sqlString.append(")");
+        }else {
+            if(isYZ){
+                sqlString.append(" AND (");
+                /*如果是待办页面,且 任务状态下拉框 选择的是 待审批或可审批状态 的任务,那么才查询数据*/
+                if (ObjectUtil.isNotEmpty(dto.getStatusValue()) && (dto.getStatusValue().equals(1) || dto.getStatusValue().equals(4))) {
+                    sqlString.append("EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.status = ? AND u_task_parallel.task_user = ?)");
+                    params.add(1);
+                    params.add(SecureUtil.getUserId());
+
+                    /*如果是待办页面,且 任务状态下拉框 选择的不是 待审批状态 的任务,那么直接返回null*/
+                } else if (ObjectUtil.isNotEmpty(dto.getStatusValue()) && !dto.getStatusValue().equals(1)) {
+                    return null;
+
+                    /*如果是待办页面,没选择 任务状态下拉框,那么就默认查询 待审批状态 任务*/
+                } else if (ObjectUtil.isEmpty(dto.getStatusValue())) {
+                    sqlString.append("EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.status = ? AND u_task_parallel.task_user = ?)");
+                    params.add(1);
+                    params.add(SecureUtil.getUserId());
+                    sqlString.append(" AND status = 1");
+                }
+                sqlString.append(")");
+            }
         }
 
         /*总数量*/

+ 27 - 88
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java

@@ -4272,6 +4272,13 @@ public class TaskController extends BladeController {
         /*如果数据没有变化,则各表的PDF可以不用更新*/
         ExecutionTime executionTime = new ExecutionTime();
         List<ReportResult> reportResults;
+
+        // 获取原始数据信息
+        String[] REPORT = new String[]{"s_interim_pay_certificate", "s_material_start_statement", "s_material_start_statement"};
+
+        Map<String, Object> oldData= jdbcTemplate.queryForMap("select * from " + REPORT[report.getType()] + " where id=" + report.getId() + "");
+
+
         //查询出当前项目使用的计量模板是否是万盛计量模板
         boolean judge = false;
         if(ObjectUtil.isNotEmpty(report.getProjectId())){
@@ -4504,9 +4511,7 @@ public class TaskController extends BladeController {
                                 //去掉表格虚线
                                 sheet.setPrintGridlines(false);
                                 //设置 整个工作表为一页
-                                if(rs.getName().indexOf("400")>=0){
-                                    System.out.println("123");
-                                }
+
                                 sheet.setFitToPage(true);
                                 ByteArrayOutputStream out = new ByteArrayOutputStream();
                                 workbook.write(out);
@@ -4571,6 +4576,9 @@ public class TaskController extends BladeController {
 
                                 BladeFile bladeFile = newIOSSClient.uploadFile(rs.getName() + SnowFlakeUtil.getId() + ".pdf", local);
                                 url = bladeFile.getLink();
+                                // 删除原来oss上的pdf
+                                String dataName = local.substring(local.indexOf("/upload"),local.length());
+                                newIOSSClient.removeFile(dataName);
                             } catch (Exception e) {
                                 e.printStackTrace();
                             }
@@ -4595,6 +4603,14 @@ public class TaskController extends BladeController {
                     addSignTaskBatch(report);
                     interimPayCertificateService.taskMeterPdfInfo2("",report.getPeriodId()+"",report.getType());
                 }
+                // 删除以前oss文件上非结构文件
+                if(oldData!=null && Func.isNull(oldData)) {
+                    if (report.getType() == 0) {
+                        System.out.println("1111");
+                    } else {
+                        System.out.println("2222");
+                    }
+                }
             }
         }
         return R.data(fileUrl);
@@ -4947,9 +4963,10 @@ public class TaskController extends BladeController {
 
             //由于之前需求每400 进行分割,现在需求需要根据类型+页码 分页
             if(this.type==0) {
-                JSONArray jsonArray = new JSONArray();
+                jdbcTemplate.execute("delete from s_interim_task where data_id='"+id+"'");
+                String addTaskInfoSql = "";
                 for (Map.Entry<String, String> entry : fileListMap.entrySet()) {
-                    JSONObject jsonObject = new JSONObject();
+                    long newPkId = SnowFlakeUtil.getId();
                     String pdfUrl = entry.getValue();
                     String result = commonFileClient.getPdfNum(pdfUrl);
                     Integer pageNum=0;
@@ -4957,14 +4974,11 @@ public class TaskController extends BladeController {
                         pageNum= Integer.parseInt(result);
                     }
                     if(pageNum<=100){
-                        jsonObject.put("title",entry.getKey());
-                        jsonObject.put("state",0); // 初始化
-                        jsonObject.put("url",pdfUrl); //路径
-                        jsonArray.add(jsonObject);
+                        addTaskInfoSql +="insert into s_interim_task(id,data_id,status,pdf_url,pdf_e_url,name) VALUES("+newPkId+","+this.id+",0,'"+pdfUrl+"','','"+entry.getKey()+"');";
                     }else{
                          Double pdfPageNo = Math.ceil(pageNum / 100.00);
                          for (int i=0;i<pdfPageNo;i++){
-                             jsonObject = new JSONObject();
+                             newPkId = SnowFlakeUtil.getId();
                              Long id = SnowFlakeUtil.getId();
                              String localPdf = FileUtils.getSysLocalFileUrl() + "/pdf/" + id + ".pdf";
                              int pageStart = 0 ;
@@ -4980,17 +4994,13 @@ public class TaskController extends BladeController {
                              if(pdfByPage==0){
                                  BladeFile bladeFile1 = newIOSSClient.uploadFile( SnowFlakeUtil.get() + ".pdf", localPdf);
                                  String pagePdfUrl=bladeFile1.getLink();
-                                 jsonObject.put("title",entry.getKey()+""+(i+1));
-                                 jsonObject.put("state",0); // 初始化
-                                 jsonObject.put("url",pagePdfUrl); //路径
-                                 System.out.println("--"+jsonObject);
-                                 jsonArray.add(jsonObject);
+                                 String titleName = entry.getKey()+""+(i+1);
+                                 addTaskInfoSql +="insert into s_interim_task(id,data_id,status,pdf_url,pdf_e_url,name) VALUES("+newPkId+","+this.id+",0,'"+pagePdfUrl+"','','"+titleName+"');";
                              }
                          }
                     }
                 }
-                jdbcTemplate.update("update s_interim_pay_certificate set page_pdf_url=? where id=?", JSON.toJSONString(jsonArray), this.id);
-                System.out.println("");
+                jdbcTemplate.batchUpdate(addTaskInfoSql);
             }
             return this.pdfUrl;
         }
@@ -5021,77 +5031,6 @@ public class TaskController extends BladeController {
                 return 1;
             }
         }
-            /*if(this.type==0){
-                Map<String,String>pageMap=new HashMap<>();
-                List<String> currentBatch = new ArrayList<>();
-                int currentPageCount = 0;
-
-                for (Map.Entry<String, String> entry : fileListMap.entrySet()) {
-                    String pdfUrl = entry.getValue();
-                    String result = commonFileClient.getPdfNum(pdfUrl);
-                    Integer pageNum=0;
-                    if(StringUtils.isNotEmpty(result)){
-                        pageNum= Integer.parseInt(result);
-                    }
-                    //单份超过400直接加入
-                    if(pageNum>400){
-                        int sort=pageMap.size()+1;
-                        pageMap.put("第"+sort+"份"+pageNum+"页",pdfUrl);
-                        continue;
-                    }
-                    //加起来超过400了就把已经存在了的合并了
-                    if(currentPageCount+pageNum>400){
-                        if (!currentBatch.isEmpty()) {
-                            Long id = SnowFlakeUtil.getId();
-                            String localPdf = FileUtils.getSysLocalFileUrl() + "/pdf/" + id + ".pdf";
-                            FileUtils.mergePdfPublicMethods(currentBatch,localPdf);
-                            BladeFile bladeFile1 = newIOSSClient.uploadFile( SnowFlakeUtil.get() + ".pdf", localPdf);
-                            int sort=pageMap.size()+1;
-                            pageMap.put("第"+sort+"份"+currentPageCount+"页",bladeFile1.getLink());
-                            currentBatch = new ArrayList<>();
-                            currentPageCount = 0;
-                        }
-                    }
-                    // 添加当前PDF到批次
-                    currentBatch.add(pdfUrl);
-                    currentPageCount += pageNum;
-                }
-                // 合并最后一批
-                if (!currentBatch.isEmpty()) {
-                    String pdfUrl=this.pdfUrl;
-                    //如果等于0说明总共没有超过400页,就直接用上面已经合并好了的
-                    if(pageMap.size()!=0){
-                        Long id = SnowFlakeUtil.getId();
-                        String localPdf = FileUtils.getSysLocalFileUrl() + "/pdf/" + id + ".pdf";
-                        FileUtils.mergePdfPublicMethods(currentBatch,localPdf);
-                        BladeFile bladeFile1 = newIOSSClient.uploadFile( SnowFlakeUtil.get() + ".pdf", localPdf);
-                        pdfUrl=bladeFile1.getLink();
-                    }
-                    int sort=pageMap.size()+1;
-                    pageMap.put("第"+sort+"份"+currentPageCount+"页",pdfUrl);
-                }
-                Map<String, String> sortedMap = pageMap.entrySet().stream()
-                    // 提取 "第i份" 中的 i 并转为整数排序
-                    .sorted(Comparator.comparingInt(
-                        entry -> {
-                            String key = entry.getKey();
-                            // 匹配 "第i份" 中的 i
-                            String numStr = key.split("份")[0].replaceAll("[^0-9]", "");
-                            return Integer.parseInt(numStr);
-                        }
-                    ))
-                    // 存入 LinkedHashMap 保持顺序
-                    .collect(Collectors.toMap(
-                        Map.Entry::getKey,
-                        Map.Entry::getValue,
-                        (oldVal, newVal) -> oldVal,
-                        LinkedHashMap::new
-                    ));
-                jdbcTemplate.update("update s_interim_pay_certificate set page_pdf_url=? where id=?", JSON.toJSONString(sortedMap), this.id);
-            }
-            return this.pdfUrl;
-        }*/
-
         public Report(Long id, Integer type) {
             this.id = id;
             this.type = type;

+ 0 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/utils/FileUtils.java

@@ -231,5 +231,4 @@ public class FileUtils {
         }
     }
 
-
 }

+ 44 - 0
blade-service/blade-user/pom.xml

@@ -23,6 +23,20 @@
         <dependency>
             <groupId>org.springblade</groupId>
             <artifactId>blade-starter-excel</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.poi</groupId>
+                    <artifactId>poi</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.poi</groupId>
+                    <artifactId>poi-ooxml</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.poi</groupId>
+                    <artifactId>poi-ooxml-schemas</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <dependency>
             <groupId>org.springblade</groupId>
@@ -55,6 +69,36 @@
             <version>2.9.1.RELEASE</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>io.github.autoffice</groupId>
+            <artifactId>luckysheet-lib</artifactId>
+            <version>1.1.0</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/../../doc/lib/excelLib/luckysheet-lib-1.1.0.jar</systemPath>
+        </dependency>
+
+        <!-- poi -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>5.4.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>5.4.0</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.18.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml-schemas</artifactId>
+            <version>4.1.2</version>
+        </dependency>
+
     </dependencies>
 
     <build>

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

@@ -527,6 +527,14 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
     public void importUser(List<UserExcel> data, Boolean isCovered) {
         data.forEach(userExcel -> {
             User user = Objects.requireNonNull(BeanUtil.copy(userExcel, User.class));
+            if(StringUtil.isEmpty(user.getAccount())){
+                if(StringUtil.isEmpty(user.getPhone())){
+                    throw new ServiceException("手机号不能为空,请填写正确的手机号后,再导入");
+                }
+            }
+            if(StringUtil.isEmpty(user.getAccount())){
+                user.setAccount(user.getPhone());
+            }
             // 设置用户平台
             user.setUserType(String.valueOf(Func.toInt(DictCache.getKey(DictEnum.USER_TYPE, userExcel.getUserTypeName()), 1)));
 
@@ -565,7 +573,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
             // 覆盖数据
             if (isCovered) {
                 // 查询用户是否存在
-                User oldUser = UserCache.getUser(AuthUtil.getTenantId(), userExcel.getAccount());
+                User oldUser = UserCache.getUser(AuthUtil.getTenantId(), user.getAccount());
                 //User oldUser = baseMapper.selectOne(Wrappers.<User>query().lambda().eq(User::getAccount, userExcel.getAccount()).eq(User::getIsDeleted, BladeConstant.DB_NOT_DELETED));
                 if (oldUser != null && oldUser.getId() != null) {
                     user.setId(oldUser.getId());
@@ -574,8 +582,8 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                 }
             }
             // 获取默认密码配置
-            user.setPassword("123456"); //此处不加密,submit里面加密了
-            user.setPlaintextPassword("123456");
+            user.setPassword("user123456"); //此处不加密,submit里面加密了
+            user.setPlaintextPassword("user123456");
             user.setStatus(1);
             user.setIsDeleted(0);
             user.setCode(user.getAccount());