Răsfoiți Sursa

Merge branch 'refs/heads/dev' into test-merge

# Conflicts:
#	blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
#	blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java
LHB 3 săptămâni în urmă
părinte
comite
079e86cf04

+ 19 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchivesAutoVO5.java

@@ -0,0 +1,19 @@
+package org.springblade.archive.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ArchivesAutoVO5 {
+    private Long id;
+    private String fileNumber;
+    private String name;
+    private String storageTimeValue;
+    private String storageTime;
+    private Integer pageN;
+    private String unit;
+    private String remark;
+}

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

@@ -30,6 +30,10 @@ import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.apache.http.message.BasicNameValuePair;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.WorkbookFactory;
 import org.springblade.archive.dto.ArchiveWarningDTO;
 import org.springblade.archive.dto.FindAndReplaceDto;
 import org.springblade.archive.dto.SaveApplyDTO;
@@ -41,6 +45,7 @@ import org.springblade.archive.utils.CallBgrsjk;
 import org.springblade.archive.vo.*;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.feign.ArchiveFileClient;
+import org.springblade.business.vo.NeiYeLedgerVO1;
 import org.springblade.common.utils.DeepSeekClient;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.mp.support.Condition;
@@ -54,6 +59,11 @@ import org.springblade.manager.feign.ArchiveTreeContractClient;
 import org.springblade.manager.feign.ContractClient;
 import org.springblade.manager.feign.ProjectClient;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.ByteArrayResource;
+import org.springframework.core.io.Resource;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
@@ -65,7 +75,9 @@ import org.springblade.archive.service.IArchivesAutoService;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.IOException;
+import java.io.*;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.util.*;
 import java.util.concurrent.ExecutorService;
 import java.util.stream.Collectors;
@@ -146,6 +158,53 @@ public class ArchivesAutoController extends BladeController {
 		return R.data(pages);
 	}
 
+	@SneakyThrows
+	@PostMapping ("/downloadArchiveAutoExcel")
+	@ApiOperationSupport(order = 13)
+	@ApiOperation(value = "档案下载案卷excel")
+	public ResponseEntity<Resource> downloadArchiveAutoExcel(HttpServletResponse response,Long nodeId,Long projectId,Long contractId) throws IOException, InvalidFormatException {
+		List<ArchiveTreeContract> archiveTreeContracts = this.archiveTreeContractClient.queryAllChildByAncestors(nodeId+"",contractId);
+		List<String> ids=new ArrayList<>();
+		if(archiveTreeContracts != null && archiveTreeContracts.size() > 0){
+			ids = JSONArray.parseArray(JSONObject.toJSONString(archiveTreeContracts.stream().map(ArchiveTreeContract::getId).distinct().collect(Collectors.toList())), String.class);
+			ids.add(nodeId+"");
+		}
+	    List<ArchivesAutoVO5> list=	archivesAutoService.selectArchivesAutoFileFormDownload(projectId,contractId,ids);
+		//String templatePath="/mnt/sdc/Users/hongchuangyanfa/Desktop/excel/archiveTemplate.xlsx";
+		String templatePath="C:\\Users\\hc01\\Desktop\\archiveTemplate.xlsx";
+		InputStream templateStream = new FileInputStream(new File(templatePath));
+		org.apache.poi.ss.usermodel.Workbook workbook = WorkbookFactory.create(templateStream);
+		Sheet sheet = workbook.getSheetAt(0);
+		// 3. 填充数据(假设数据从第2行开始填充)
+		int startRow = 1; // 第2行开始填充数据
+		for (int i = 0; i < list.size(); i++) {
+			Row row = sheet.createRow(startRow + i);
+			ArchivesAutoVO5 vo1 = list.get(i);
+			// 填充各列数据
+			row.createCell(0).setCellValue(i + 1); // 序号
+			row.createCell(1).setCellValue(StringUtils.isNotEmpty(vo1.getFileNumber())?vo1.getFileNumber():""); // 档号
+			row.createCell(2).setCellValue(StringUtils.isNotEmpty(vo1.getStorageTimeValue())?vo1.getStorageTimeValue():""); // 案卷题名
+			row.createCell(3).setCellValue(StringUtils.isNotEmpty(vo1.getStorageTimeValue())?vo1.getStorageTimeValue():""); // 保管期限
+			row.createCell(4).setCellValue(vo1.getPageN()+""); // 总页数
+			row.createCell(5).setCellValue(StringUtils.isNotEmpty(vo1.getUnit())?vo1.getUnit():""); // 立卷单位
+			row.createCell(6).setCellValue(StringUtils.isNotEmpty(vo1.getRemark())?vo1.getRemark():""); // 备注
+		}
+		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+		workbook.write(outputStream);
+		workbook.close();
+		ByteArrayResource resource = new ByteArrayResource(outputStream.toByteArray());
+
+		String fileName = "案卷目录.xlsx";
+		String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString())
+				.replaceAll("\\+", "%20");
+		return ResponseEntity.ok()
+				.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=UTF-8''" + encodedFileName)
+				.contentType(MediaType.APPLICATION_OCTET_STREAM)
+				.contentLength(resource.contentLength())
+				.body(resource);
+
+	}
+
     @GetMapping("/fileNumberFlush")
     @ApiOperationSupport(order = 4)
     @ApiOperation(value = "档号整理——按档号排序")

+ 1 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java

@@ -235,4 +235,5 @@ public interface ArchivesAutoMapper extends BaseMapper<ArchivesAuto> {
 	void deleteIsElementFileByProjectId(@Param("projectId") Long projectId);
 
 	void deleteIsElementFileByNode(@Param("projectId") Long projectId,@Param("ancestors") String ancestors,@Param("nodeId") String nodeId);
+	List<ArchivesAutoVO5> selectArchivesAutoFileFormDownload(@Param("projectId") Long projectId, @Param("contractId") Long contractId, @Param("ids") List<String> ids);
 }

+ 11 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml

@@ -1548,4 +1548,15 @@
         order by uatc.tree_sort,uaa.auto_file_sort is null ,uaa.auto_file_sort,uaa.file_number is null,
         SUBSTRING_INDEX(uaa.file_number, '_', 1), SUBSTRING_INDEX(uaa.file_number, '_', -1) + 0 ,uaa.create_time asc
     </select>
+    <select id="selectArchivesAutoFileFormDownload" resultType="org.springblade.archive.vo.ArchivesAutoVO5">
+        select u.id,u.file_number,u.name,u.storageTime,u.page_n,u.unit,u.remark from u_archives_auto u LEFT JOIN m_archive_tree_contract m ON u.node_id = m.id where u.is_deleted = 0 and u.project_id = #{vo.projectId} and u.is_archive=1
+        <if test="vo.nodeIds != null and vo.nodeIds != ''">
+            and u.node_id in
+            <foreach collection="vo.nodeIdArray" item="nodeId" open="(" separator="," close=")">
+                #{nodeId}
+            </foreach>
+        </if>
+        order by m.tree_sort,u.auto_file_sort is null ,u.auto_file_sort,u.file_number is null,
+        SUBSTRING_INDEX(u.file_number, '_', 1), SUBSTRING_INDEX(u.file_number, '_', -1) + 0 ,u.create_time asc
+    </select>
 </mapper>

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

@@ -170,5 +170,7 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 
 	boolean creatFileNameFormAI(String ids, Long projectId, Long contractId) throws IOException;
 
+	List<ArchivesAutoVO5> selectArchivesAutoFileFormDownload(Long projectId, Long contractId, List<String> ids);
+
 	boolean sortRule(Long projectId, Integer type);
 }

+ 16 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -1599,6 +1599,22 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		return aiNameService.saveBatch(aiNames);
 	}
 
+	@Override
+	public List<ArchivesAutoVO5> selectArchivesAutoFileFormDownload(Long projectId, Long contractId, List<String> ids) {
+		List<ArchivesAutoVO5> list = this.baseMapper.selectArchivesAutoFileFormDownload(projectId, contractId, ids);
+		List<DictBiz> sheetSourceList1 = this.iDictBizClient.getList("storage_period", "notRoot").getData();
+		list.forEach(vos -> {
+			if (StringUtils.isNotEmpty(vos.getStorageTime())) {
+				sheetSourceList1.forEach(source -> {
+					if (source.getDictKey().equals(vos.getStorageTime())) {
+						vos.setStorageTimeValue(source.getDictValue());
+					}
+				});
+			}
+		});
+		return list;
+	}
+
 
 	/**
 	 * 单独组卷规则组卷

+ 42 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -38,10 +38,7 @@ import org.springblade.business.feign.ContractLogClient;
 import org.springblade.business.feign.InformationQueryClient;
 import org.springblade.business.vo.SaveContractLogVO;
 import org.springblade.common.constant.CommonConstant;
-import org.springblade.common.utils.BaseUtils;
-import org.springblade.common.utils.CommonUtil;
-import org.springblade.common.utils.MathUtil;
-import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.common.utils.*;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.support.Condition;
@@ -58,9 +55,11 @@ import org.springblade.manager.dto.AddBussFileSortDTO;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.enums.ExecuteType;
 import org.springblade.manager.mapper.ExcelTabMapper;
+import org.springblade.manager.mapper.WbsTreeContractMapper;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.service.*;
 import org.springblade.manager.utils.*;
+import org.springblade.manager.utils.FileUtils;
 import org.springblade.manager.vo.*;
 import org.springblade.manager.wrapper.ExcelTabWrapper;
 import org.springblade.resource.feign.CommonFileClient;
@@ -163,6 +162,8 @@ public class ExcelTabController extends BladeController {
 
     private final  SignFtpUtil signFtpUtil;
 
+    private final WbsTreeContractMapper wbsTreeContractMapper;
+
     private final WbsTreeContractOldHtmlService wbsTreeContractOldHtmlService;
 
     @Autowired
@@ -4815,4 +4816,41 @@ public class ExcelTabController extends BladeController {
         List<ParameterElementVO2> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ParameterElementVO2.class));
         return R.data(query);
     }
+
+    @GetMapping("/checkAllNodeDate")
+    @ApiOperationSupport(order = 43)
+    @ApiOperation(value = "检查所有表单是否填写完毕日期")
+    public R checkAllNodeDate(Long projectId,Long contractId) throws Exception {
+        //查询出当前项目或合同段下所有的表单
+        List<WbsTreeContract>list= wbsTreeContractMapper.selectListForcheckAllNodeDate(projectId,contractId);
+        //将表单通过pid分组
+        Map<Long, List<WbsTreeContract>> map = list.stream().collect(Collectors.groupingBy(WbsTreeContract::getPId));
+        for (Map.Entry<Long, List<WbsTreeContract>> entry : map.entrySet()) {
+            Long pId = entry.getKey();
+            WbsTreeContract parent = wbsTreeContractMapper.selectOne(new LambdaQueryWrapper<>(WbsTreeContract.class).eq(WbsTreeContract::getPKeyId, pId));
+            List<WbsTreeContract> wbsTreeContractList = entry.getValue();
+            for (WbsTreeContract contract : wbsTreeContractList) {
+                Map<String, Object> dataInfo = excelTabService.getBussDataInfo(contract.getPKeyId(), 0, true);
+                InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(contract.getHtmlUrl());
+                String htmlString = IoUtil.readToString(inputStreamByUrl);
+                Document doc = Jsoup.parse(htmlString);
+                Elements dateElements = doc.select("el-date-picker");
+                if(!dateElements.isEmpty()){
+                    Boolean dateFlag=true;
+                    for (Element element : dateElements) {
+                        String keyname = element.attr("keyname");
+                        if(!dataInfo.containsKey(keyname)||(StringUtils.isEmpty(dataInfo.get(keyname).toString()))){
+                            dateFlag=false;
+                            break;
+                        }
+                    }
+                    if(!dateFlag){
+                        wbsTreeContractMapper.update(contract,new LambdaUpdateWrapper<WbsTreeContract>().eq(WbsTreeContract::getPKeyId,contract.getPKeyId()).set(WbsTreeContract::getDateIsComplete,2));
+                    }
+                }
+            }
+            wbsTreeContractService.checkNodeAllDate(parent);
+        }
+        return R.status(true);
+    }
 }

+ 1 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java

@@ -825,11 +825,6 @@ public class WbsTreeContractController extends BladeController {
         wbsTreeContractServiceImpl.resetTableDate(projectId);
         return R.success("成功");
     }
-    @GetMapping("/checkAllNodeDate")
-    @ApiOperationSupport(order = 43)
-    @ApiOperation(value = "检查所有表单是否填写完毕日期")
-    public R checkAllNodeDate(Long projectId,Long contractId){
-        return R.status(wbsTreeContractServiceImpl.checkAllNodeDate(projectId,contractId));
-    }
+
 
 }

+ 6 - 13
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -2828,6 +2828,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                     unit.setIsTypePrivatePid(null);
                     unit.setSort(i);
                     unit.setTreePId(null);
+                    unit.setDateIsComplete(null);
                     unit.setPId(wbsTreeContractRoot.getPKeyId());
                     unit.setAncestorsPId(wbsTreeContractRoot.getAncestorsPId() + "," + wbsTreeContractRoot.getPKeyId());
                     baseMapper.insert(unit);
@@ -2854,6 +2855,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                     subUnit.setIsTypePrivatePid(null);
                     subUnit.setSort(i);
                     subUnit.setTreePId(null);
+                    subUnit.setDateIsComplete(null);
                     subUnit.setPId(fatherNode.getPKeyId());
                     subUnit.setAncestorsPId(fatherNode.getAncestorsPId() + "," + fatherNode.getPKeyId());
                     baseMapper.insert(subUnit);
@@ -2900,6 +2902,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                 division.setIsTypePrivatePid(null);
                                 division.setSort(i);
                                 division.setTreePId(null);
+                                division.setDateIsComplete(null);
                                 division.setPId(contract.getPKeyId());
                                 division.setAncestorsPId(contract.getAncestorsPId() + "," + contract.getPKeyId());
                                 baseMapper.insert(division);
@@ -2953,6 +2956,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                 subDivision.setIsTypePrivatePid(null);
                                 subDivision.setSort(i);
                                 subDivision.setTreePId(null);
+                                subDivision.setDateIsComplete(null);
                                 subDivision.setPId(contract.getPKeyId());
                                 subDivision.setAncestorsPId(contract.getAncestorsPId() + "," + contract.getPKeyId());
                                 baseMapper.insert(subDivision);
@@ -3010,6 +3014,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                 item.setIsTypePrivatePid(null);
                                 item.setSort(i);
                                 item.setTreePId(null);
+                                item.setDateIsComplete(null);
                                 item.setPId(contract.getPKeyId());
                                 item.setAncestorsPId(contract.getAncestorsPId() + "," + contract.getPKeyId());
                                 baseMapper.insert(item);
@@ -3070,6 +3075,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                 subItem.setIsTypePrivatePid(null);
                                 subItem.setSort(i);
                                 subItem.setTreePId(null);
+                                subItem.setDateIsComplete(null);
                                 subItem.setPId(contract.getPKeyId());
                                 subItem.setAncestorsPId(contract.getAncestorsPId() + "," + contract.getPKeyId());
                                 baseMapper.insert(subItem);
@@ -4270,18 +4276,5 @@ public static boolean hasConflictingCodes(List<ImportTreeDto> list) {
     }
 
 
-    @Override
-    public boolean checkAllNodeDate(Long projectId, Long contractId) {
-        //查询出当前项目或合同段下所有的表单
-      List<WbsTreeContract>list= baseMapper.selectListForcheckAllNodeDate(projectId,contractId);
-        //将表单通过pid分组
-        Map<Long, List<WbsTreeContract>> map = list.stream().collect(Collectors.groupingBy(WbsTreeContract::getPId));
-        for (Map.Entry<Long, List<WbsTreeContract>> entry : map.entrySet()) {
-            List<WbsTreeContract> wbsTreeContractList = entry.getValue();
-            for (WbsTreeContract contract : wbsTreeContractList) {
 
-            }
-        }
-        return false;
-    }
 }