Prechádzať zdrojové kódy

Merge branch 'master' of http://47.110.251.215:3000/java_org/bladex

“zhifk” 2 rokov pred
rodič
commit
5711411164
18 zmenil súbory, kde vykonal 392 pridanie a 48 odobranie
  1. 5 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveProjectConfig.java
  2. 6 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchivesAuto.java
  3. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.java
  4. 14 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ContractInfo.java
  5. 6 0
      blade-service/blade-archive/pom.xml
  6. 10 12
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveExaminingReportController.java
  7. 15 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  8. 5 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  9. 3 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveExaminingReportService.java
  10. 4 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java
  11. 10 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveAutoPdfServiceImpl.java
  12. 118 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExaminingReportImpl.java
  13. 1 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveProjectConfigServiceImpl.java
  14. 158 28
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  15. 13 0
      blade-service/blade-archive/src/main/resources/application-dev.yml
  16. 8 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java
  17. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.java
  18. 11 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml

+ 5 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveProjectConfig.java

@@ -33,4 +33,9 @@ public class ArchiveProjectConfig extends BaseEntity {
      */
     private String factorType;
 
+    //是否打页码
+    public boolean isPage() {
+        return  getFactorType().contains("5");
+    }
+
 }

+ 6 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchivesAuto.java

@@ -163,4 +163,10 @@ public class ArchivesAuto extends BaseEntity {
 	private String filingUnit;
 
 	private Integer isLock;  //案卷锁定  0未锁  1已锁定    (已锁定的案卷,自动归档执行不再拆卷重新组卷)
+
+	//是否是影音
+	public boolean isMedia() {
+		return (this.getCarrierType()!= null &&
+				this.getCarrierType().equals("5"));
+	}
 }

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.java

@@ -73,4 +73,7 @@ public interface ArchiveFileClient {
 
     @PostMapping(API_PREFIX + "/getAllArchiveFileSize")
     Long getAllArchiveFileSize(@RequestBody Long projectId);
+
+    @PostMapping(API_PREFIX + "/getListByNodeID")
+    List<ArchiveFile> getListByNodeID(@RequestParam String nodeId,@RequestParam Integer isArchive);
 }

+ 14 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ContractInfo.java

@@ -6,6 +6,7 @@ import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
 import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang.StringUtils;
 import org.springblade.core.mp.base.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -157,4 +158,17 @@ public class ContractInfo extends BaseEntity {
     @ApiModelProperty(value = "是否引用编号 '0'否 '1'是")
     private Integer isReferenceNumber;
 
+
+    public String  archivesUnit() {
+
+        String unit = getContractorUnitName();//建设单位名称
+        if (this.contractType== 1) {
+            unit = getConstructionUnitName();//施工单位名称
+        }else if (this.contractType== 2) {
+            unit = getSupervisionUnitName();//监理单位名称
+        }
+        return unit;
+
+    }
+
 }

+ 6 - 0
blade-service/blade-archive/pom.xml

@@ -23,6 +23,12 @@
     </repositories>
 
     <dependencies>
+        <!--        iText生成中文-->
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itext-asian</artifactId>
+            <version>5.2.0</version>
+        </dependency>
         <!--sqlite-->
         <dependency>
             <groupId>org.xerial</groupId>

+ 10 - 12
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveExaminingReportController.java

@@ -1,6 +1,7 @@
 package org.springblade.archive.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.itextpdf.text.DocumentException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
@@ -8,9 +9,11 @@ import org.springblade.archive.entity.ArchiveExaminingReport;
 import org.springblade.archive.service.IArchiveExaminingReportService;
 import org.springblade.archive.vo.ArchiveExaminingVo;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.resource.feign.NewIOSSClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -32,18 +35,12 @@ import java.util.List;
 @Api(value = "档案检测报告", tags = "档案检测报告")
 public class ArchiveExaminingReportController {
     private final IArchiveExaminingReportService archiveExaminingReportService;
+
+    private final NewIOSSClient iossClient;
     @GetMapping("test")
-    public String test(){
-        ArchiveExaminingReport report = new ArchiveExaminingReport();
-        report.setId(12312312223L);
-        report.setReportName("电子文件四性检测报告");
-        report.setReportPdfUrl("https://bladex-chongqing-info.oss-cn-hangzhou.aliyuncs.com//upload/20230302/35cce8354eac0600e2e614e9b58f48a5.pdf");
-        report.setExaminingTime(LocalDateTime.now());
-        report.setStatus(1);
-        report.setCreateTime(new Date());
-        report.setProjectId(1578599210897772545L);
-        archiveExaminingReportService.save(report);
-        return "666";
+    public String test() throws DocumentException, IOException {
+        BladeFile bladeFile = iossClient.uploadFile("124456sdf", "D:\\develop\\test\\test1.pdf");
+        return bladeFile.getLink();
     }
 
     @GetMapping("/getList")
@@ -52,6 +49,7 @@ public class ArchiveExaminingReportController {
         List<ArchiveExaminingReport> list = archiveExaminingReportService.list(new LambdaQueryWrapper<ArchiveExaminingReport>()
                 .eq(projectId != null, ArchiveExaminingReport::getProjectId, projectId)
                 .eq(ArchiveExaminingReport::getStatus,4)
+                .orderByDesc(ArchiveExaminingReport::getExaminingTime)
                 .last("limit 5"));
         return R.data(list);
     }
@@ -76,7 +74,7 @@ public class ArchiveExaminingReportController {
 
     @GetMapping("/getExamining")
     @ApiOperation(value = "档案四性检测")
-    public R getExamining(ArchiveExaminingVo vo) throws InterruptedException, IOException {
+    public R getExamining(ArchiveExaminingVo vo) throws InterruptedException, IOException, DocumentException {
 
         //如果id为0则为一键检测,不为0则有报告正在进行
         if (vo.getReportId() == 0){

+ 15 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -239,5 +239,19 @@ public class ArchivesAutoController extends BladeController {
 		return R.status(archivesAutoService.updateBatchById(archivesAutos));
 	}
 
-	
+
+	/**
+	 * 自动组卷入口
+	 * @param projectId
+	 * @return
+	 */
+	@PostMapping("/archiveAutoMethod")
+	public R archiveAutoMethod(Long projectId) {
+		archivesAutoService.splitArchvies(projectId);
+		archivesAutoService.archiveAutoMethod(projectId);
+		return R.data("");
+	}
+
+
+
 }

+ 5 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml

@@ -115,10 +115,13 @@
 
     <update id="splitArchvies" >
         /**把未锁定案卷的文件关联去掉*/
-        update u_archive_file set archive_id = null where
+        update u_archive_file
+        set archive_id = null,
+            is_archive=0
+        where
             is_deleted=0 and
             archive_id in(
-                select id u_archives_auto where project_id=#{projectId}
+                select id from u_archives_auto where project_id=#{projectId}
                   and is_auto_file!=1
                   and is_deleted=0
                   and is_lock=0

+ 3 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveExaminingReportService.java

@@ -1,5 +1,6 @@
 package org.springblade.archive.service;
 
+import com.itextpdf.text.DocumentException;
 import org.springblade.archive.entity.ArchiveExaminingReport;
 import org.springblade.archive.vo.ArchiveExaminingVo;
 import org.springblade.core.mp.base.BaseService;
@@ -14,5 +15,6 @@ import java.io.IOException;
 public interface IArchiveExaminingReportService extends BaseService<ArchiveExaminingReport> {
     void pushStatusBySocket(Long userId,Long id) throws IOException, InterruptedException;
 
-    void getExamining(ArchiveExaminingVo vo, Long id) throws InterruptedException;
+    void getExamining(ArchiveExaminingVo vo, Long id) throws InterruptedException, DocumentException, IOException;
+
 }

+ 4 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java

@@ -50,4 +50,8 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 	Map<String,Integer> getAllArchiveByContractType(Long projectId,String type);
 
 	List<Map<String, String>> getAllArchiveAgeByContractType(Long projectId);
+
+	void archiveAutoMethod(Long project);
+
+	void splitArchvies(Long project);
 }

+ 10 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveAutoPdfServiceImpl.java

@@ -243,9 +243,17 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
      * @param waitArchiveFiles
      */
     public void builtFilePageNo(ArchivesAuto archivesAuto,List<ArchiveFile> waitArchiveFiles){
+
+        Long projectId = archivesAuto.getProjectId();
+
+        ArchiveProjectConfig config = archiveProjectConfigService.getByProjectIdOrNew(projectId);
+        //是否打页码
+        if (!config.isPage()) {
+            return;
+        }
+
         //声影的要不要打码
-        if (archivesAuto.getCarrierType()!= null &&
-                archivesAuto.getCarrierType().equals("5")) {
+        if (archivesAuto.isMedia()) {
             return;
         }
 

+ 118 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExaminingReportImpl.java

@@ -1,7 +1,13 @@
 package org.springblade.archive.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.aliyun.oss.OSSClient;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.itextpdf.text.*;
+import com.itextpdf.text.pdf.BaseFont;
+import com.itextpdf.text.pdf.PdfPCell;
+import com.itextpdf.text.pdf.PdfPTable;
+import com.itextpdf.text.pdf.PdfWriter;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
 import org.springblade.archive.entity.ArchiveExaminingReport;
@@ -14,13 +20,19 @@ import org.springblade.archive.vo.ArchiveExaminingSocketVo;
 import org.springblade.archive.vo.ArchiveExaminingVo;
 import org.springblade.common.constant.ArchiveConstant;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.oss.model.BladeFile;
 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.utils.StringUtil;
+import org.springblade.resource.feign.NewIOSSClient;
+import org.springblade.resource.feign.NewISmsClient;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
+import java.io.FileOutputStream;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -33,7 +45,10 @@ import java.util.List;
 @AllArgsConstructor
 public class ArchiveExaminingReportImpl extends BaseServiceImpl<ArchiveExaminingReportMapper, ArchiveExaminingReport> implements IArchiveExaminingReportService {
     private final WebSocketServer webSocketServer;
+
     private final IArchiveExaminingReportDetailService detailService;
+
+    private final NewIOSSClient iossClient;
     /**
      * 推送状态到前端
      * @param id
@@ -67,7 +82,7 @@ public class ArchiveExaminingReportImpl extends BaseServiceImpl<ArchiveExamining
      */
     @Async
     @Override
-    public void getExamining(ArchiveExaminingVo vo, Long id) throws InterruptedException {
+    public void getExamining(ArchiveExaminingVo vo, Long id) throws InterruptedException, DocumentException, IOException {
         ArchiveExaminingReport report = new ArchiveExaminingReport();
         report.setId(id);
         report.setStatus(2);
@@ -158,9 +173,111 @@ public class ArchiveExaminingReportImpl extends BaseServiceImpl<ArchiveExamining
         //生成报告,生成PDF
         report.setStatus(3);
         this.updateById(report);
+        String url = this.generateReportPdf(id);
         Thread.sleep(7000L);
         //完成
+        report.setReportPdfUrl(url);
         report.setStatus(4);
         this.updateById(report);
     }
+
+    /**
+     * 生成检测报告PDF
+     */
+    private String generateReportPdf(Long id) throws DocumentException, IOException {
+        int high = 20;
+        int widthPercentage = 100;
+        String uuid = StringUtil.randomUUID();
+        String localUrl = "/www/wwwroot/Users/hongchuangyanfa/Desktop/archiveExaminingPdf/";
+        //新建一个pdf文档对象,前一个参数是纸张大小,后四个为边距
+        Document document = new Document(PageSize.A4, 5, 5, 30, 30);
+        //建立一个书写器
+        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(localUrl+uuid+".pdf"));
+        document.open();
+        //创建字体
+        BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
+        //字体对象,这里可以创建一个方法
+        Font size14font = new Font(baseFont, 14, Font.BOLD);  //大小为14的正常字体
+        Font size10font = new Font(baseFont, 10, Font.NORMAL); //大小为10的正常字体
+        Font size10font2 = new Font(baseFont, 10, Font.BOLD); //大小为10的正常字体
+        //添加标题
+        //创建第一行表格
+        PdfPTable tableName = new PdfPTable(1);
+        tableName.setWidthPercentage(widthPercentage);  //设置标题长度占纸张比例
+        //给表格赋值
+        tableName.addCell(pdfTableStyle("电子文件四性检测报告", size14font, 50, true, true));
+        //将表格添加到文档对象中
+        document.add(tableName);
+        //依据文献
+        PdfPTable two = new PdfPTable(1);
+        two.setWidthPercentage(widthPercentage);
+        two.addCell(pdfTableStyle("依据文献:\n" +
+                "[1]文书类电子档案检测一般要求:DA/T 70-2018   [2] 电子档案“四性”检测要求及其实现方法[J].浙江档案\n" +
+                "出具系统电子文件归档真实性、完整性、可用性、安全性检测报告",size10font,37,false,false));
+        document.add(two);
+        //表头文字
+        String[] name = new String[]{"检测类别", "检测项目", "统计不合格", "不合格对象"};
+        //创建第二行,并设置第二行中的表格数
+        PdfPTable twoTable = new PdfPTable(name.length);
+        twoTable.setWidthPercentage(widthPercentage);
+        //该数组是每个表格的宽度
+        float[] floats = new float[name.length];
+        floats[0] = 0.1f;
+        floats[1] = 0.7f;
+        floats[2] = 0.1f;
+        floats[3] = 0.1f;
+        //循环将表头数据添加到第二行表格中
+        for (int i = 0; i < name.length; i++) {
+            PdfPCell pdfPCell = pdfTableStyle(name[i], size10font2, high, true, true);
+            pdfPCell.setBackgroundColor(new BaseColor(231,230,230));
+            twoTable.addCell(pdfPCell);
+        }
+        //设置表格的宽度
+        twoTable.setTotalWidth(floats);
+        document.add(twoTable);
+        //表单数据
+        List<ArchiveExaminingReportDetail> list = detailService.list(new LambdaQueryWrapper<ArchiveExaminingReportDetail>()
+                .eq(ArchiveExaminingReportDetail::getReportId, id));
+        //将数据放入表格中
+        for (int i = 0; i < list.size(); i++) {
+            ArchiveExaminingReportDetail detail = list.get(i);
+            PdfPTable dataTable = new PdfPTable(name.length);
+            dataTable.setWidthPercentage(widthPercentage);
+            dataTable.setTotalWidth(floats);
+            //将数组中的数据按照顺序添加
+            dataTable.addCell(pdfTableStyle(detail.getExaminingType(), size10font, high, true, true));
+            dataTable.addCell(pdfTableStyle(detail.getExaminingItem(), size10font, high, false, true));
+            dataTable.addCell(pdfTableStyle(detail.getUnqualifiedCount()+"", size10font, high, true, true));
+            dataTable.addCell(pdfTableStyle(detail.getUnqualifiedObject(), size10font, high, true, true));
+            document.add(dataTable);
+
+        }
+        document.close();
+        writer.close();
+        BladeFile bladeFile = iossClient.uploadFile(uuid+".pdf", localUrl+uuid+".pdf");
+        return bladeFile.getLink();
+    }
+
+
+    /**
+     * 表格的样式
+     * @param content 内容
+     * @param font 字体对象
+     * @param high 表格高度
+     * @Param isAlignCenter 是否水平居中
+     * @Param isAlignMidde  是否垂直居中
+     * @return
+     */
+    static PdfPCell pdfTableStyle(String content, Font font, int high, boolean isAlignCenter, boolean isAlignMidle){
+        PdfPCell pdfPCell  = new PdfPCell(new Phrase(content,font));
+        pdfPCell.setMinimumHeight(high);
+        pdfPCell.setUseAscender(true); // 设置可以居中
+        if (isAlignCenter){
+            pdfPCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); // 设置水平居中
+        }
+        if (isAlignMidle){
+            pdfPCell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); // 设置垂直居中
+        }
+        return pdfPCell;
+    }
 }

+ 1 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveProjectConfigServiceImpl.java

@@ -25,7 +25,7 @@ public class ArchiveProjectConfigServiceImpl extends BaseServiceImpl<ArchiveProj
             config = new ArchiveProjectConfig();
             config.setTenantId(AuthUtil.getTenantId());
             config.setProjectId(projectId);
-            config.setFactorType("1,2,3,4"); // 设置默认值
+            config.setFactorType("1,2,3,4,5"); // 设置默认值
             config.setProjectType(3);
             this.save(config); // 保存到数据库
         }

+ 158 - 28
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -45,6 +45,8 @@ import org.springblade.manager.feign.ContractClient;
 import org.springblade.manager.feign.ProjectClient;
 import org.springblade.manager.feign.WbsInfoClient;
 import org.springblade.manager.vo.ArchiveTreeContractVO2;
+import org.springblade.manager.feign.ContractClient;
+import org.springblade.manager.feign.ProjectClient;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.feign.IDictBizClient;
 import org.springframework.stereotype.Service;
@@ -68,6 +70,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	private ArchiveFileClient archiveFileClient;
 	private ArchiveTreeContractClient archiveTreeContractClient;
 	private ContractClient contractClient;
+	private ProjectClient projectClient;
+
 	private Map<String,Integer> indexMap; //按立卷位区分和生成流水号
 	private IArchiveAutoPdfService archiveAutoPdfService;
 
@@ -210,11 +214,15 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		List<Map<String,String>> list = baseMapper.getAllArchiveAgeByContractType(projectId);
 		return list;
 	}
+	@Override
+	public void splitArchvies(Long projectId){
+		baseMapper.splitArchvies(projectId);
+	}
 
-
+	@Override
 	public void archiveAutoMethod(Long projectId){
 		//步骤一:把项目下未锁定的案卷拆卷。
-		baseMapper.splitArchvies(projectId);
+
 		//步骤二:查询归档树节点。存在未归档文件的节点。
 		List<ArchiveTreeContract> list = archiveTreeContractClient.getHavedFileNodeByProjectID(projectId);
 		//步骤三:遍历归档树节点整理出 默认规则节点,分类并卷节点,单独组卷节点 三个集合。
@@ -235,10 +243,28 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 					break;
 			}
 		}
-		//步骤四:按照单独,分类,默认的顺序执行组卷流程。
-		archiveAutoMethod3(list3);//单独组卷
-		archiveAutoMethod2(list2,projectId);//分类组卷
-		archiveAutoMethod1(list1);//默认组卷
+		//步骤四:按照单独,分类,默认,分盒的顺序执行组卷流程。
+
+		//分盒文件集合
+		Map<Integer,List<ArchiveFile>> boxMap = new HashMap<>();
+
+		archiveAutoMethod3(list3,boxMap);//单独组卷
+		archiveAutoMethod2(list2,projectId,boxMap);//分类组卷
+		archiveAutoMethod1(list1,boxMap);//默认组卷
+		archiveAutoMethodBox(boxMap);//分盒组卷
+	}
+
+	private void addBoxMap(ArchiveFile file,Map<Integer,List<ArchiveFile>> boxMap){
+		Integer boxNumber = file.getBoxNumber();
+		if(boxMap.containsKey(boxNumber)){
+			List<ArchiveFile> boxFiles = boxMap.get(boxNumber);
+			boxFiles.add(file);
+			boxMap.put(boxNumber,boxFiles);
+		}else{
+			List<ArchiveFile> boxFiles = new ArrayList<>();
+			boxFiles.add(file);
+			boxMap.put(boxNumber,boxFiles);
+		}
 	}
 
 
@@ -284,19 +310,39 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		archivesAuto.setContractId(node.getContractId());
 		archivesAuto.setName(archiveName);//案卷题名
 		if(indexMap==null){
-			indexMap=new HashMap<>();
+			indexMap=new HashMap<>(); //监理,施工的按合同段分类从0开始依次设置档号,建设单位的没有合同段 就先按一类依次设置
 		}
-		//TODO 获取立卷单位
+
+		//获取立卷单位
 		String unit="";
+		String treeCode = node.getTreeCode();
+		if(StringUtils.isEmpty(treeCode)){
+			//treeCode为null的是业主的节点
+			List<Long> pids = new ArrayList<>();
+			pids.add(node.getProjectId());
+			List<ContractInfo> contractInfos = contractClient.getContractByIds(pids);
+			for(ContractInfo contract:contractInfos){
+				if(contract.getContractType()==3){
+					unit=contract.archivesUnit();
+				}
+			}
+		}else{
+			//treeCode不为null则是对应合同段
+			ContractInfo contract = contractClient.getContractById(Long.parseLong(treeCode));
+			unit=contract.archivesUnit();
+		}
 		//获取档号
+		if(StringUtils.isEmpty(treeCode)){
+			treeCode="owner";
+		}
 		String fileNumberPrefix=node.getFileNumberPrefix(); //档号前缀在节点设置
 		Integer fileNumberSuffix = null;//档号后缀按立卷单位生成流水号
-		if(indexMap.containsKey(unit)){
-			fileNumberSuffix = indexMap.get(unit);
-			indexMap.put(unit,fileNumberSuffix+1);
+		if(indexMap.containsKey(treeCode)){
+			fileNumberSuffix = indexMap.get(treeCode);
+			indexMap.put(treeCode,fileNumberSuffix+1);
 		}else{
 			fileNumberSuffix=1;
-			indexMap.put(unit,fileNumberSuffix+1);
+			indexMap.put(treeCode,fileNumberSuffix+1);
 		}
 
 		archivesAuto.setFileNumber(fileNumberPrefix+fileNumberSuffix);//档号
@@ -305,8 +351,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		//archivesAuto.setQuantity();//数量/单位
 
 		archivesAuto.setSpecification(node.getSpecification());//案卷规格 从节点规格获取
-		archivesAuto.setStartDate(LocalDateTime.parse(startDate));//文件开始时间
-		archivesAuto.setEndDate(LocalDateTime.parse(endDate));//文件结束时间
+		//archivesAuto.setStartDate(LocalDateTime.parse(startDate));//文件开始时间
+		//archivesAuto.setEndDate(LocalDateTime.parse(endDate));//文件结束时间
 		archivesAuto.setStorageTime(node.getStorageTime());//保管期限  从节点规格获取
 		archivesAuto.setSecretLevel("");//保密级别 没地方设置 暂留
 		//载体类型
@@ -350,8 +396,37 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	}
 
 	private String builtArchiveName(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node,boolean isCrossNode){
-		//TODO 获取案卷题名
-		return "";
+
+		String archiveName="";
+
+		Long projectId = node.getProjectId();
+		ProjectInfo projectInfo = projectClient.getById(String.valueOf(projectId));
+		String projectName = projectInfo.getProjectName();
+		//获取案卷题名
+		//--正常节点
+		if(isCrossNode){
+			archiveName=projectName;
+			//存在跨节点  项目名称+文件对应的所有节点名称
+			Set<String> nodeIdSet = new HashSet<>();
+			for(ArchiveFile file:waitArchiveFiles){
+				String nodeId = file.getNodeId();
+				nodeIdSet.add(nodeId);
+			}
+			for(String nodeId:nodeIdSet){
+				ArchiveTreeContract treeNode = archiveTreeContractClient.getArchiveTreeContractById(Long.parseLong(nodeId));
+				String nodeName = treeNode.getNodeName();
+				archiveName=archiveName+nodeName;
+			}
+
+		}else{
+			//不存在跨节点  项目名称+节点名称
+			archiveName=projectName+node.getNodeName();
+		}
+
+		//TODO wbs节点
+		//不存在跨节点 项目名称+案卷题名规则(在后台归档目录树设置的)+后缀
+		//存在跨节点  获取当前所有节点的父级节点题名规则+所有同层级跨节点并卷的节点名称拼接+后缀
+		return archiveName;
 	}
 	private String builtFilePageNo(ArchivesAuto archivesAuto,List<ArchiveFile> waitArchiveFiles){
 		//TODO 生成文件对应的页码,返回url
@@ -483,11 +558,55 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
 	}
 
+	private void createArchiveBox(List<ArchiveFile> waitArchiveFiles){
+
+		if(waitArchiveFiles.size()==0){
+			return;
+		}
+
+		String nodeId = waitArchiveFiles.get(0).getNodeId();
+
+		ArchiveTreeContract node = archiveTreeContractClient.getArchiveTreeContractById(Long.parseLong(nodeId));
+
+		//获取案卷文件起止时间
+		String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
+		String[] split = archiveStartDateAndEndDate.split(",");
+		String startDate=split[0];
+		String endDate=split[1];
+		int fileN =waitArchiveFiles.size();
+		//获取案卷内文件总页数
+		int pageN=0;
+		for(ArchiveFile file:waitArchiveFiles){
+			pageN=pageN+file.getFilePage();
+		}
+
+
+		//默认组卷存在跨节点组卷  注意案卷归属节点,案卷命名方式
+		//获取案卷题名
+		String archiveName=builtArchiveName(waitArchiveFiles,node,false);//获取案卷题名
+
+		//1.创建新案卷
+		ArchivesAuto archivesAuto = builtArchives(node,pageN,fileN,startDate,endDate,archiveName);
+
+		//2.封面和生成文件页码
+		archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(),archivesAuto,waitArchiveFiles);
+
+		builtFilePageNo(archivesAuto,waitArchiveFiles);
+
+		//3.设置文件所属案卷,组卷状态
+		Long archivesAutoId = archivesAuto.getId();
+		for(ArchiveFile file:waitArchiveFiles){
+			file.setArchiveId(archivesAutoId);//设置文件所属案卷
+			file.setIsArchive(1);
+		}
+		archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
+	}
+
 
 	/**
 	 * 单租组卷流程  节点下的文件只在当前节点下组卷
 	 */
-	private void archiveAutoMethod3(List<ArchiveTreeContract> list){
+	private void archiveAutoMethod3(List<ArchiveTreeContract> list,Map<Integer,List<ArchiveFile>> boxMap){
 		//步骤1:遍历节点集合
 		for(ArchiveTreeContract node:list){
 			//步骤2:获取当前节点的案卷规格
@@ -511,7 +630,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 					archiveFilesSize++;
 					//步骤5:判断文件是否存在分盒设置
 					if(file.getBoxNumber()!=null){
-						//TODO 走分盒组卷流程
+						//添加到分盒文件集合
+						addBoxMap(file,boxMap);
 						if(archiveFilesSize==archiveFiles.size() && waitArchiveFiles.size()>0){
 							//最后一个文件直接将waitArchiveFiles组卷
 							createArchive3(waitArchiveFiles,node,archivesSize);
@@ -581,7 +701,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	/**
 	 * 分类并卷组卷  设置分类的节点下只有一个案卷,节点下的所有文件都组成这个案卷。如果设置分类节点(select=1的)多个,案卷归属排序第一个节点。
 	 */
-	private void archiveAutoMethod2(List<ArchiveTreeContract> list,Long projectId){
+	private void archiveAutoMethod2(List<ArchiveTreeContract> list,Long projectId,Map<Integer,List<ArchiveFile>> boxMap){
 
 		//分类并卷集合<groupId,List<文件>>
 		Map<Long,List<ArchiveFile>> archiveMap = new HashMap<>();
@@ -593,17 +713,14 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			//根据分组ID来创建唯一案卷
 			Long archiveAutoGroupId=node.getArchiveAutoGroupId();
 			//步骤2:查询节点下的未归档文件
-			List<ArchiveFile> archiveFiles = archiveFileClient.listWrappers(Wrappers.<ArchiveFile>lambdaQuery()
-					.eq(ArchiveFile::getNodeId, node)
-					.eq(ArchiveFile::getIsArchive, 0)
-					.eq(ArchiveFile::getIsDeleted,0)
-					.orderByAsc(ArchiveFile::getSort));
+			List<ArchiveFile> archiveFiles = archiveFileClient.getListByNodeID(node.getId().toString(),0);
 			//步骤3:遍历未归档文件
 			if(archiveFiles!=null){
 				for(ArchiveFile file:archiveFiles){
 					//步骤4:判断文件是否存在分盒设置
-					if(file.getBoxNumber()!=null){
-						//TODO 走分盒流程
+					if(file.getBoxNumber()!=null && file.getBoxNumber()!=-1){
+						//添加到分盒文件集合
+						addBoxMap(file,boxMap);
 					}else{
 						//分类并卷流程
 						//步骤5:将文件按照<groupId,List<文件>>放入集合
@@ -635,7 +752,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	/**
 	 * 默认组卷流程 文件可以跨节点组卷,受最高并卷节点限制范围,跨节点文件组卷时,案卷规格按照第一个文件所在的节点规格 组卷。
 	 */
-	private void archiveAutoMethod1(List<ArchiveTreeContract> list){
+	private void archiveAutoMethod1(List<ArchiveTreeContract> list,Map<Integer,List<ArchiveFile>> boxMap){
 		//最高并卷节点
 		Long archiveAutoNodeId=null;
 
@@ -689,7 +806,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 				archiveFilesSize++;
 				//步骤3.4:判断文件是否存在分盒设置
 				if(file.getBoxNumber()!=null) {
-					//TODO 走分盒组卷流程
+					//添加到分盒文件集合
+					addBoxMap(file,boxMap);
 					if(nodeSize==list.size() && archiveFilesSize==archiveFiles.size()){
 						//如果当前是最后一个文件直接将waitArchiveFiles组卷
 						createArchive1(waitArchiveFiles,archivesSize);
@@ -765,6 +883,18 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 	}
 
+	/**
+	 * 分盒组卷流程
+	 * @param boxMap
+	 */
+	private void archiveAutoMethodBox(Map<Integer,List<ArchiveFile>> boxMap){
+		Set<Map.Entry<Integer, List<ArchiveFile>>> entries = boxMap.entrySet();
+		for (Map.Entry<Integer, List<ArchiveFile>> entry:entries){
+			//一个分盒一个案卷 归属第一个文件所在节点
+			createArchiveBox(entry.getValue());
+		}
+	}
+
 	/**
 	 * 查询案卷,排序
 	 * @param ids

+ 13 - 0
blade-service/blade-archive/src/main/resources/application-dev.yml

@@ -2,9 +2,22 @@
 server:
   port: 8686
 
+#默认对象存储配置
+oss:
+  enabled: true
+  name: minio
+  tenant-mode: true
+  endpoint: http://127.0.0.1:9000
+  access-key: D99KGE6ZTQXSATTJWU24
+  secret-key: QyVqGnhIQQE734UYSUFlGOZViE6+ZlDEfUG3NjhJ
+  bucket-name: bladex
+
 #数据源配置
 spring:
   datasource:
     url: ${blade.datasource.dev.url}
     username: ${blade.datasource.dev.username}
     password: ${blade.datasource.dev.password}
+
+
+

+ 8 - 0
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java

@@ -186,4 +186,12 @@ public class ArchiveFileClientImpl implements ArchiveFileClient {
             return 0L;
         }
     }
+
+    @Override
+    public List<ArchiveFile> getListByNodeID(String nodeId,Integer isArchive) {
+        List<ArchiveFile> files = fileMapper.getListByNodeID(nodeId, isArchive);
+        return files;
+    }
+
+
 }

+ 2 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.java

@@ -72,4 +72,6 @@ public interface ArchiveFileMapper extends BaseMapper<ArchiveFile> {
 	List<ArchiveFileVO> getAllArchiveFileByContractType(@Param("projectId")Long projectId);
 
 	List<ArchiveFile> getAllArchiveFileUrl(@Param("projectId")Long projectId);
+
+	public List<ArchiveFile> getListByNodeID(@Param("nodeId") String nodeId,@Param("isArchive")Integer isArchive);
 }

+ 11 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml

@@ -287,4 +287,15 @@
         WHERE  uaf.project_id = #{projectId};
     </select>
 
+
+
+    <select id="getListByNodeID" resultMap="archiveFileResultMap">
+        select * from u_archive_file
+        where
+          node_id = #{nodeId} and
+          is_archive = #{isArchive} and
+          is_deleted = 0
+          order by sort
+    </select>
+
 </mapper>