|
@@ -58,6 +58,7 @@ import org.springblade.manager.feign.ProjectClient;
|
|
|
import org.springblade.resource.feign.NewIOSSClient;
|
|
|
import org.springblade.system.entity.DictBiz;
|
|
|
import org.springblade.system.feign.IDictBizClient;
|
|
|
+import org.springblade.system.user.entity.User;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.scheduling.annotation.Async;
|
|
|
import org.springframework.scheduling.annotation.EnableAsync;
|
|
@@ -71,7 +72,7 @@ import java.util.concurrent.Executors;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
- * 服务实现类
|
|
|
+ * 服务实现类
|
|
|
*
|
|
|
* @author BladeX
|
|
|
* @since 2023-02-17
|
|
@@ -80,1563 +81,1569 @@ import java.util.stream.Collectors;
|
|
|
@AllArgsConstructor
|
|
|
public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper, ArchivesAuto> implements IArchivesAutoService {
|
|
|
|
|
|
- private final IDictBizClient iDictBizClient;
|
|
|
- private ArchiveFileClient archiveFileClient;
|
|
|
- private ArchiveTreeContractClient archiveTreeContractClient;
|
|
|
- private ContractClient contractClient;
|
|
|
- private ProjectClient projectClient;
|
|
|
- private final ArchivesAutoMapper autoMapper;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private ExecutorService executorService;
|
|
|
-
|
|
|
- private Map<String, Integer> indexMap = new HashMap<>(); //按立卷位区分和生成流水号
|
|
|
- private IArchiveAutoPdfService archiveAutoPdfService;
|
|
|
- private final NewIOSSClient iossClient;
|
|
|
-
|
|
|
- private final IArchiveProjectConfigService archiveProjectConfigService;
|
|
|
-
|
|
|
-
|
|
|
- @Override
|
|
|
- public IPage<ArchivesAutoVO> selectArchivesAutoPage(IPage<ArchivesAutoVO> page, ArchivesAutoVO archivesAuto) {
|
|
|
- return page.setRecords(baseMapper.selectArchivesAutoPage(page, archivesAuto));
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public IPage<ArchivesAutoVO> pageByArchivesAuto(ArchivesAutoVO vo) {
|
|
|
- IPage<ArchivesAutoVO> page = new Page<>(vo.getCurrent(), vo.getSize());
|
|
|
- if (StringUtils.isNotBlank(vo.getStorageTime())) {
|
|
|
- vo.setStorageTimes(Arrays.asList(vo.getStorageTime().split(",")));
|
|
|
- }
|
|
|
- if (StringUtils.isNotBlank(vo.getSecretLevel())) {
|
|
|
- vo.setSecretLevels(Arrays.asList(vo.getSecretLevel().split(",")));
|
|
|
- }
|
|
|
- if (StringUtils.isNotBlank(vo.getCarrierType())) {
|
|
|
- vo.setCarrierTypes(Arrays.asList(vo.getCarrierType().split(",")));
|
|
|
- }
|
|
|
- if (StringUtils.isNotBlank(vo.getYear())) {
|
|
|
- vo.setYears(Arrays.asList(vo.getYear().split(",")));
|
|
|
- }
|
|
|
- if (StringUtils.isNotBlank(vo.getMonth())) {
|
|
|
- vo.setMonths(Arrays.asList(vo.getMonth().split(",")));
|
|
|
- }
|
|
|
- if (StringUtils.isNotBlank(vo.getCarrierType())) {
|
|
|
- vo.setCarrierTypes(Arrays.asList(vo.getCarrierType().split(",")));
|
|
|
- }
|
|
|
- List<ArchivesAutoVO> archivesAutos = null;
|
|
|
- //获取合同段类型
|
|
|
- ContractInfo contractInfo = contractClient.getContractById(vo.getContractId());
|
|
|
- Integer contractType = contractInfo.getContractType();
|
|
|
- //根据用户在当前合同段的权限,判断返回
|
|
|
- BladeUser user = AuthUtil.getUser();
|
|
|
- String name = baseMapper.getUserRoleName(vo.getProjectId(), vo.getContractId(), user.getUserId());
|
|
|
- if (name.contains("超级管理员") || contractType == 3) {
|
|
|
- vo.setContractId(null);
|
|
|
- }
|
|
|
- if (StringUtils.isNotBlank(vo.getNodeIds())) {
|
|
|
- vo.setNodeIdArray(Arrays.asList(vo.getNodeIds().split(",")));
|
|
|
- archivesAutos = baseMapper.pageByArchivesAuto2(page, vo);
|
|
|
- } else {
|
|
|
- archivesAutos = baseMapper.pageByArchivesAuto(page, vo);
|
|
|
- }
|
|
|
- if (archivesAutos != null && archivesAutos.size() > 0) {
|
|
|
- archivesAutos.stream().forEach(aa -> {
|
|
|
- if (StringUtils.isNotBlank(aa.getStorageTime())) {
|
|
|
- aa.setStorageTimeValue("3".equals(aa.getStorageTime()) ? "永久" : ("2".equals(aa.getStorageTime()) ? "30年" : "10年"));
|
|
|
- }
|
|
|
- if (StringUtils.isNotBlank(aa.getSecretLevel())) {
|
|
|
- aa.setSecretLevelValue("1".equals(aa.getSecretLevel()) ? "机密" : ("2".equals(aa.getSecretLevel()) ? "绝密" : "秘密"));
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
- return page.setRecords(archivesAutos);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public IPage<ArchivesAutoVO> selectArchivesAutoFilePage(ArchivesAutoVO vo) {
|
|
|
- Query query = new Query();
|
|
|
- query.setCurrent(vo.getCurrent());
|
|
|
- query.setSize(vo.getSize());
|
|
|
- //设置分页
|
|
|
- IPage<ArchivesAutoVO> iPage = Condition.getPage(query);
|
|
|
-
|
|
|
- //汇总
|
|
|
- Integer total = this.baseMapper.selectArchivesAutoFileCount(vo);
|
|
|
- if (total == null) {
|
|
|
- total = 0;
|
|
|
- }
|
|
|
- //分页
|
|
|
- int current = (vo.getCurrent() - 1) * vo.getSize();
|
|
|
-
|
|
|
- List<ArchivesAuto> pageList = this.baseMapper.selectArchivesAutoFilePage(current, vo.getSize(), vo);
|
|
|
- //设置分页信息
|
|
|
- iPage.setTotal(total);
|
|
|
- List<ArchivesAutoVO> pageVoList = JSONArray.parseArray(JSONObject.toJSONString(pageList), ArchivesAutoVO.class);
|
|
|
- List<DictBiz> sheetSourceList = this.iDictBizClient.getList("security_level", "notRoot").getData();
|
|
|
- List<DictBiz> sheetSourceList1 = this.iDictBizClient.getList("storage_period", "notRoot").getData();
|
|
|
-
|
|
|
- pageVoList.forEach(vos -> {
|
|
|
- if (StringUtils.isNotEmpty(vos.getSecretLevel())) {
|
|
|
- sheetSourceList.forEach(source -> {
|
|
|
- if (source.getDictKey().equals(vos.getSecretLevel())) {
|
|
|
- vos.setSecretLevelValue(source.getDictValue());
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
- if (StringUtils.isNotEmpty(vos.getStorageTime())) {
|
|
|
- sheetSourceList1.forEach(source -> {
|
|
|
- if (source.getDictKey().equals(vos.getStorageTime())) {
|
|
|
- vos.setStorageTimeValue(source.getDictValue());
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- return iPage.setRecords(pageVoList);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public boolean updateArchivesAutoFileByNodeId(String ids, String nodeId, String nodeSort) {
|
|
|
- try {
|
|
|
- baseMapper.updateArchivesAutoFileByNodeId(Func.toLongList(ids), nodeId, nodeSort);
|
|
|
-
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
- return false;
|
|
|
- }
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public Map<String, Integer> getAllArchiveByContractType(Long projectId, String typ) {
|
|
|
- List<ArchivesAutoVO> list = baseMapper.getAllArchiveByContractType(projectId, typ);
|
|
|
- List<ContractInfo> infos = contractClient.queryContractListByIds(Arrays.asList(projectId));
|
|
|
- int key1 = 0, key2 = 0, key3 = 0;
|
|
|
- //判断案卷属于1施工,2监理,还是3业主
|
|
|
- for (ArchivesAutoVO l : list) {
|
|
|
- String type = l.getContractType();
|
|
|
- if (StringUtils.isBlank(type)) {
|
|
|
- //业主
|
|
|
- key3++;
|
|
|
- } else if ("S".equals(type)) {
|
|
|
- //监理
|
|
|
- key2++;
|
|
|
- } else if ("C".equals(type)) {
|
|
|
- //施工
|
|
|
- key1++;
|
|
|
- } else if (type.length() > 10) {
|
|
|
- for (ContractInfo info : infos) {
|
|
|
- if (type.equals(info.getId() + "")) {
|
|
|
- Integer t = info.getContractType();
|
|
|
- if (t == 1) {
|
|
|
- key1++;
|
|
|
- } else if (t == 2) {
|
|
|
- key2++;
|
|
|
- } else {
|
|
|
- key3++;
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- System.out.println(type);
|
|
|
- }
|
|
|
- }
|
|
|
- Map<String, Integer> map = new HashMap<>();
|
|
|
- map.put("key1", key1);
|
|
|
- map.put("key2", key2);
|
|
|
- map.put("key3", key3);
|
|
|
- return map;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<Map<String, String>> getAllArchiveAgeByContractType(Long projectId) {
|
|
|
- List<Map<String, String>> list = baseMapper.getAllArchiveAgeByContractType(projectId);
|
|
|
- return list;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void splitArchvies(Long projectId, Long contractId, Long nodeId) {
|
|
|
- List<String> removeFiles = new ArrayList<>();
|
|
|
- //没合同段的默认整个项目
|
|
|
- if (contractId == null) {
|
|
|
- //清除案卷封面等pdf
|
|
|
- List<String> archivesOutUrlList = baseMapper.getArchivesOutUrlList(projectId);
|
|
|
- if (archivesOutUrlList != null && archivesOutUrlList.size() > 0) {
|
|
|
- for (String outUrl : archivesOutUrlList) {
|
|
|
- String[] splits = outUrl.split(",");
|
|
|
- for (String url : splits) {
|
|
|
- if (StringUtils.isNotEmpty(url.trim())) {
|
|
|
- removeFiles.add(FileUtils.getAliYunSubUrl(url));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- //清除文件页面pdf
|
|
|
- List<String> filePageUrlList = baseMapper.getFilePageUrlList(projectId);
|
|
|
- if (filePageUrlList != null && filePageUrlList.size() > 0) {
|
|
|
- for (String url : filePageUrlList) {
|
|
|
- if (StringUtils.isNotEmpty(url.trim())) {
|
|
|
- removeFiles.add(FileUtils.getAliYunSubUrl(url));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- executorService.execute(() -> {
|
|
|
- iossClient.removeFiles(removeFiles);
|
|
|
- log.debug("文件删完了");
|
|
|
- });
|
|
|
-
|
|
|
- //取消未锁定案卷文件关联
|
|
|
- baseMapper.splitArchvies(projectId);
|
|
|
-
|
|
|
- } else {
|
|
|
- String treeCode = getAuthCode(contractId);
|
|
|
- if (nodeId != null) {
|
|
|
- //有节点的按节点
|
|
|
- String strNodeId = nodeId.toString();
|
|
|
- ArchiveTreeContract archiveTreeContract = archiveTreeContractClient.getArchiveTreeContractById(nodeId);
|
|
|
- String ancestors = archiveTreeContract.getAncestors() + "," + nodeId;
|
|
|
-
|
|
|
- //清除案卷封面等pdf
|
|
|
- List<String> archivesOutUrlList = baseMapper.getArchivesOutUrlListByNode(projectId, ancestors, strNodeId);
|
|
|
- if (archivesOutUrlList != null && archivesOutUrlList.size() > 0) {
|
|
|
- for (String outUrl : archivesOutUrlList) {
|
|
|
- String[] splits = outUrl.split(",");
|
|
|
- for (String url : splits) {
|
|
|
- if (StringUtils.isNotEmpty(url.trim())) {
|
|
|
- removeFiles.add(FileUtils.getAliYunSubUrl(url));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- //清除文件页面pdf
|
|
|
- List<String> filePageUrlList = baseMapper.getFilePageUrlListByNode(projectId, ancestors, strNodeId);
|
|
|
- if (filePageUrlList != null && filePageUrlList.size() > 0) {
|
|
|
- for (String url : filePageUrlList) {
|
|
|
- if (StringUtils.isNotEmpty(url.trim())) {
|
|
|
- removeFiles.add(FileUtils.getAliYunSubUrl(url));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- executorService.execute(() -> {
|
|
|
- iossClient.removeFiles(removeFiles);
|
|
|
- log.debug("文件删完了");
|
|
|
- });
|
|
|
-
|
|
|
- baseMapper.splitArchviesByNode(projectId, ancestors, strNodeId);
|
|
|
- } else {
|
|
|
- //没节点的按合同段
|
|
|
- //清除案卷封面等pdf
|
|
|
- List<String> archivesOutUrlList = baseMapper.getArchivesOutUrlListByContract(projectId, contractId, treeCode);
|
|
|
- if (archivesOutUrlList != null && archivesOutUrlList.size() > 0) {
|
|
|
- for (String outUrl : archivesOutUrlList) {
|
|
|
- String[] splits = outUrl.split(",");
|
|
|
- for (String url : splits) {
|
|
|
- if (StringUtils.isNotEmpty(url.trim())) {
|
|
|
- removeFiles.add(FileUtils.getAliYunSubUrl(url));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- //清除文件页面pdf
|
|
|
- List<String> filePageUrlList = baseMapper.getFilePageUrlListByContract(projectId, contractId, treeCode);
|
|
|
- if (filePageUrlList != null && filePageUrlList.size() > 0) {
|
|
|
- for (String url : filePageUrlList) {
|
|
|
- if (StringUtils.isNotEmpty(url.trim())) {
|
|
|
- removeFiles.add(FileUtils.getAliYunSubUrl(url));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- executorService.execute(() -> {
|
|
|
- iossClient.removeFiles(removeFiles);
|
|
|
- log.debug("文件删完了");
|
|
|
- });
|
|
|
-
|
|
|
- //没节点的按合同段
|
|
|
- baseMapper.splitArchviesByContract(projectId, contractId, treeCode);
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void archiveAutoMethod(Long projectId, Long contractId, Long nodeId) {
|
|
|
- //步骤一:把档号集合初始化
|
|
|
- indexMap = new HashMap<>();
|
|
|
- //步骤二:查询归档树节点。存在未归档文件的节点。
|
|
|
- List<ArchiveTreeContract> list = archiveTreeContractClient.getHavedFileNodeByProjectID(projectId);
|
|
|
-
|
|
|
- //按合同段过滤
|
|
|
- List<ArchiveTreeContract> authlist = authFilter(list, contractId, nodeId);
|
|
|
-
|
|
|
- //步骤三:遍历归档树节点整理出 默认规则节点,分类并卷节点,单独组卷节点 三个集合。
|
|
|
- List<ArchiveTreeContract> list1 = new ArrayList<>();
|
|
|
- List<ArchiveTreeContract> list2 = new ArrayList<>();
|
|
|
- List<ArchiveTreeContract> list3 = new ArrayList<>();
|
|
|
- for (ArchiveTreeContract treeContract : authlist) {
|
|
|
- Integer archiveAutoType = treeContract.getArchiveAutoType();
|
|
|
- switch (archiveAutoType) {
|
|
|
- case 1:
|
|
|
- list1.add(treeContract);
|
|
|
- break;
|
|
|
- case 2:
|
|
|
- list2.add(treeContract);
|
|
|
- break;
|
|
|
- case 3:
|
|
|
- list3.add(treeContract);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- //步骤四:按照单独,分类,默认,分盒的顺序执行组卷流程。
|
|
|
-
|
|
|
- //分盒文件集合
|
|
|
- Map<String, List<ArchiveFile>> boxMap = new LinkedHashMap<>();
|
|
|
-
|
|
|
- archiveAutoMethod3(list3, boxMap);//单独组卷
|
|
|
- archiveAutoMethod2(list2, projectId, boxMap);//分类组卷
|
|
|
- archiveAutoMethod1(list1, boxMap);//默认组卷
|
|
|
- archiveAutoMethodBox(boxMap);//分盒组卷
|
|
|
- }
|
|
|
-
|
|
|
- private void addBoxMap(ArchiveFile file, Map<String, List<ArchiveFile>> boxMap) {
|
|
|
- String boxName = file.getBoxName();
|
|
|
- if (boxMap.containsKey(boxName)) {
|
|
|
- List<ArchiveFile> boxFiles = boxMap.get(boxName);
|
|
|
- boxFiles.add(file);
|
|
|
- boxMap.put(boxName, boxFiles);
|
|
|
- } else {
|
|
|
- List<ArchiveFile> boxFiles = new ArrayList<>();
|
|
|
- boxFiles.add(file);
|
|
|
- boxMap.put(boxName, boxFiles);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public IPage<ArchivesAutoVO> pageByAuthenticate(ArchivesAutoVO vo) {
|
|
|
- IPage<ArchivesAutoVO> page = new Page<>(vo.getCurrent(), vo.getSize());
|
|
|
- //根据权限返回结果
|
|
|
- ContractInfo contractInfo = contractClient.getContractById(vo.getContractId());
|
|
|
- Integer contractType = contractInfo.getContractType();
|
|
|
- //根据用户在当前合同段的权限,判断返回
|
|
|
- BladeUser user = AuthUtil.getUser();
|
|
|
- String name = baseMapper.getUserRoleName(vo.getProjectId(), vo.getContractId(), user.getUserId());
|
|
|
- List<ArchivesAutoVO> list = new ArrayList<>();
|
|
|
- if (name.contains("超级管理员") || contractType == 3) {
|
|
|
- list = baseMapper.pageByAuthenticate(page, vo);
|
|
|
- } else {
|
|
|
- ArchiveTreeContract node = archiveTreeContractClient.getArchiveTreeContractById(vo.getNodeId());
|
|
|
- if (node.getAncestors().split(",").length <= 2) {
|
|
|
- //查询当前合同
|
|
|
- ArchiveTreeContract archiveTreeContract = archiveTreeContractClient.getArchiveTreeContractByNodeName(contractInfo.getContractName());
|
|
|
- vo.setNodeId(archiveTreeContract.getId());
|
|
|
- }
|
|
|
- list = baseMapper.pageByAuthenticate(page, vo);
|
|
|
- }
|
|
|
- return page.setRecords(list);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<String> getFilingUnitList(Long projectId) {
|
|
|
- return baseMapper.getFilingUnitList(projectId);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void batchDestroyArchive(String ids) {
|
|
|
- List<String> list = Arrays.asList(ids.split(","));
|
|
|
- //查询出档案的文件
|
|
|
- List<ArchiveFile> files = archiveFileClient.getAllArchiveFileByArchiveIds(list);
|
|
|
- if (files != null && files.size() > 0) {
|
|
|
- //销毁阿里云上文件
|
|
|
- List<String> removeFiles = new ArrayList<>();
|
|
|
- for (ArchiveFile file : files) {
|
|
|
- if (StringUtils.isNotBlank(file.getFileUrl())) {
|
|
|
- removeFiles.add(FileUtils.getAliYunSubUrl(file.getFileUrl()));
|
|
|
- }
|
|
|
- if (StringUtils.isNotBlank(file.getPdfFileUrl())) {
|
|
|
- removeFiles.add(FileUtils.getAliYunSubUrl(file.getFileUrl()));
|
|
|
- }
|
|
|
-
|
|
|
- //打码的也要删除
|
|
|
- if (StringUtils.isNotBlank(file.getPdfPageUrl())) {
|
|
|
- removeFiles.add(FileUtils.getAliYunSubUrl(file.getPdfPageUrl()));
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- iossClient.removeFiles(removeFiles);
|
|
|
- //删除文件
|
|
|
- List<Long> collect = files.stream().map(file -> file.getId()).collect(Collectors.toList());
|
|
|
- archiveFileClient.batchDeleteArchiveFile(collect);
|
|
|
- }
|
|
|
- //销毁案卷
|
|
|
- baseMapper.batchDestroyByIds(list);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- /**
|
|
|
- * 检查当前案卷的文件集合是否在规格内,能否开始组卷。
|
|
|
- * return
|
|
|
- * 0不能组卷,当前文件入待组卷集合,还能试加文件。
|
|
|
- * 1可以组卷,当前文件加入待组卷集合后开始组卷。
|
|
|
- * -1 不可组卷,当前文件不能加入待组卷集合, 待组卷集合要组卷了。
|
|
|
- * null 程序出错了
|
|
|
- */
|
|
|
- private Integer checkSpecificationSize(int SpecificationSize, int archivesSize) {
|
|
|
- //按照当前目录节点的参数(卷盒规格)进行页数组合,
|
|
|
- // 30MM默认为300页组成一卷、400MM默认为400页组成一卷、50MM默认为500页组成一卷、60MM默认为600组成一卷。
|
|
|
- //注意:允许组卷上浮区间为100页
|
|
|
- //意思是如果A\B两个文件进行并卷组卷,总页数规格为300页,但是A+B的文件数为350页,已经超过固定规格,但是上浮区间在100以内,则允许这样组卷。
|
|
|
- //超过300之后,则不在继续与其他文件进行并卷组卷了。
|
|
|
- int SpecificationSizeMax = SpecificationSize + 100;
|
|
|
-
|
|
|
- if (archivesSize < SpecificationSize) {
|
|
|
- //小于规格的 返回true ,当前文件加入待组卷集合,还可以试加文件,未到组卷规格
|
|
|
- return 0;
|
|
|
- }
|
|
|
- if (archivesSize == SpecificationSize) {
|
|
|
- //等于规则的 当前文件加入待组卷集合,待组卷集合可以组卷了。
|
|
|
- return 1;
|
|
|
- }
|
|
|
- if (archivesSize <= SpecificationSizeMax) {
|
|
|
- //小于等于规格上浮区间,当前文件加入待组卷集合,当前文件集合可以组卷了
|
|
|
- return 1;
|
|
|
- }
|
|
|
- if (archivesSize > SpecificationSizeMax) {
|
|
|
- //大于规格上浮区间,当前文件不能加入当前待组卷集合,先把当前待组卷集合的文件先组卷完成,清空待组卷集合后再重新计算检查当前文件。
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- private ArchivesAuto builtArchives(ArchiveTreeContract node, int pageN, int fileN, String startDate, String endDate, String archiveName) {
|
|
|
- ArchivesAuto archivesAuto = new ArchivesAuto();
|
|
|
- archivesAuto.setProjectId(node.getProjectId());
|
|
|
- archivesAuto.setContractId(node.getContractId());
|
|
|
- archivesAuto.setName(archiveName);//案卷题名
|
|
|
- if (indexMap == null) {
|
|
|
- indexMap = new HashMap<>(); //监理,施工的按合同段分类从0开始依次设置档号,建设单位的没有合同段 就先按一类依次设置
|
|
|
- }
|
|
|
-
|
|
|
- ContractInfo nodeContract = null;
|
|
|
- List<ContractInfo> contracts = null;
|
|
|
- //获取立卷单位
|
|
|
- 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(treeCode)) {
|
|
|
- fileNumberSuffix = indexMap.get(treeCode);
|
|
|
- indexMap.put(treeCode, fileNumberSuffix + 1);
|
|
|
- } else {
|
|
|
- fileNumberSuffix = 1;
|
|
|
- indexMap.put(treeCode, fileNumberSuffix + 1);
|
|
|
- }
|
|
|
-
|
|
|
- archivesAuto.setFileNumber(fileNumberSuffix.toString());//档号
|
|
|
- //archivesAuto.setMicron();//微缩号
|
|
|
- archivesAuto.setUnit(unit);//立卷单位
|
|
|
- //archivesAuto.setQuantity();//数量/单位
|
|
|
-
|
|
|
- archivesAuto.setSpecification(node.getSpecification());//案卷规格 从节点规格获取
|
|
|
- //archivesAuto.setStartDate(LocalDateTime.parse(startDate));//文件开始时间
|
|
|
- //archivesAuto.setEndDate(LocalDateTime.parse(endDate));//文件结束时间
|
|
|
-
|
|
|
- //TODO 保管期限
|
|
|
- String storageTime = node.getStorageTime();
|
|
|
- if (StringUtils.isEmpty(storageTime)) {
|
|
|
- //节点没有值,就从合同段获取,没有合同段id的 用业主的合同段
|
|
|
- Long nodeContractId = archivesAuto.getContractId();
|
|
|
- if (nodeContractId != null && nodeContractId != -1) {
|
|
|
- if (nodeContract == null) {
|
|
|
- nodeContract = contractClient.getContractById(nodeContractId);
|
|
|
- }
|
|
|
- storageTime = nodeContract.getStoragePeriod().toString();
|
|
|
- } else {
|
|
|
- List<Long> pids = new ArrayList<>();
|
|
|
- pids.add(archivesAuto.getProjectId());
|
|
|
- if (contracts == null) {
|
|
|
- contracts = contractClient.queryContractListByIds(pids);
|
|
|
- }
|
|
|
- for (ContractInfo c : contracts) {
|
|
|
- if (c.getContractType() == 3) {
|
|
|
- storageTime = c.getStoragePeriod().toString();
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- archivesAuto.setStorageTime(storageTime);//保管期限 从节点规格获取
|
|
|
-
|
|
|
- //保密级别 没地方设置 暂留
|
|
|
- String secretLevel = "";
|
|
|
- if (StringUtils.isEmpty(secretLevel)) {
|
|
|
- //节点没有值,就从合同段获取,没有合同段id的 用业主的合同段
|
|
|
- Long nodeContractId = archivesAuto.getContractId();
|
|
|
- if (nodeContractId != null && nodeContractId != -1) {
|
|
|
- if (nodeContract == null) {
|
|
|
- nodeContract = contractClient.getContractById(nodeContractId);
|
|
|
- }
|
|
|
- if (nodeContract.getSecurityLevel() == null) {
|
|
|
- secretLevel = "4";
|
|
|
- } else {
|
|
|
- secretLevel = nodeContract.getSecurityLevel().toString();
|
|
|
- }
|
|
|
- } else {
|
|
|
- List<Long> pids = new ArrayList<>();
|
|
|
- pids.add(archivesAuto.getProjectId());
|
|
|
- if (contracts == null) {
|
|
|
- contracts = contractClient.queryContractListByIds(pids);
|
|
|
- }
|
|
|
- for (ContractInfo c : contracts) {
|
|
|
- if (c.getContractType() == 3) {
|
|
|
- if (nodeContract.getSecurityLevel() == null) {
|
|
|
- secretLevel = "4";
|
|
|
- } else {
|
|
|
- secretLevel = c.getSecurityLevel().toString();
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- archivesAuto.setSecretLevel(secretLevel);
|
|
|
-
|
|
|
- //立卷人 从节点规格获取
|
|
|
- String rollor = node.getRollor();
|
|
|
- if (StringUtils.isEmpty(rollor)) {
|
|
|
- //节点没有值,就从合同段获取,没有合同段id的 用业主的合同段
|
|
|
- Long nodeContractId = archivesAuto.getContractId();
|
|
|
- if (nodeContractId != null && nodeContractId != -1) {
|
|
|
- if (nodeContract == null) {
|
|
|
- nodeContract = contractClient.getContractById(nodeContractId);
|
|
|
- }
|
|
|
- rollor = nodeContract.getFiler();
|
|
|
- } else {
|
|
|
- List<Long> pids = new ArrayList<>();
|
|
|
- pids.add(archivesAuto.getProjectId());
|
|
|
- if (contracts == null) {
|
|
|
- contracts = contractClient.queryContractListByIds(pids);
|
|
|
- }
|
|
|
- for (ContractInfo c : contracts) {
|
|
|
- if (c.getContractType() == 3) {
|
|
|
- rollor = c.getFiler();
|
|
|
- ;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- archivesAuto.setRollor(rollor);
|
|
|
-
|
|
|
- //审核人 从节点规格获取
|
|
|
- String reviewer = node.getReviewer();
|
|
|
- if (StringUtils.isEmpty(reviewer)) {
|
|
|
- //节点没有值,就从合同段获取,没有合同段id的 用业主的合同段
|
|
|
- Long nodeContractId = archivesAuto.getContractId();
|
|
|
- if (nodeContractId != null && nodeContractId != -1) {
|
|
|
- if (nodeContract == null) {
|
|
|
- nodeContract = contractClient.getContractById(nodeContractId);
|
|
|
- }
|
|
|
- reviewer = nodeContract.getReviewer();
|
|
|
- } else {
|
|
|
- List<Long> pids = new ArrayList<>();
|
|
|
- pids.add(archivesAuto.getProjectId());
|
|
|
- if (contracts == null) {
|
|
|
- contracts = contractClient.queryContractListByIds(pids);
|
|
|
- }
|
|
|
- for (ContractInfo c : contracts) {
|
|
|
- if (c.getContractType() == 3) {
|
|
|
- reviewer = c.getReviewer();
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- archivesAuto.setReviewer(reviewer);
|
|
|
-
|
|
|
- //载体类型
|
|
|
- if (node.getStorageType() != null) {
|
|
|
- archivesAuto.setCarrierType(node.getStorageType().toString());
|
|
|
- }
|
|
|
- //archivesAuto.setKeywords();//主题词
|
|
|
- //archivesAuto.setStorageLocation();//存放位置
|
|
|
- archivesAuto.setIsArchive(1);//已归档
|
|
|
- //archivesAuto.setRemark();//备注
|
|
|
- LocalDateTime now = LocalDateTime.now();
|
|
|
- LocalDateTime nextday = now.plusDays(1);
|
|
|
- archivesAuto.setRollDate(now);//立卷日期
|
|
|
- archivesAuto.setReviewDate(nextday);//审核日期
|
|
|
-
|
|
|
- archivesAuto.setNodeId(node.getId());//归档树节点
|
|
|
- archivesAuto.setOutUrl("");//TODO 生成案卷的封面 目录 备考表,背级
|
|
|
- archivesAuto.setFileN(fileN);//文件数量
|
|
|
- archivesAuto.setPageN(pageN);//案卷页数
|
|
|
- //archivesAuto.setMileage();
|
|
|
- //archivesAuto.setFileType();
|
|
|
- //archivesAuto.setSize();
|
|
|
- archivesAuto.setTreeSort(node.getTreeSort());
|
|
|
- //archivesAuto.setIsOpen();
|
|
|
- //archivesAuto.setIscheck(0);
|
|
|
- archivesAuto.setIsAutoFile(0);//是否案卷收集上传的案卷
|
|
|
- archivesAuto.setIsLock(0);//案卷锁定状态
|
|
|
- archivesAuto.setIsDeleted(0);
|
|
|
- baseMapper.insert(archivesAuto);
|
|
|
- log.debug("组好" + archivesAuto.getName());
|
|
|
- return archivesAuto;
|
|
|
- }
|
|
|
-
|
|
|
- private String getArchiveStartDateAndEndDate(List<ArchiveFile> waitArchiveFiles) {
|
|
|
- //找出文件集合中的最大最小时间
|
|
|
- List<String> fileTimeList = new ArrayList<>();
|
|
|
- for (ArchiveFile file : waitArchiveFiles) {
|
|
|
- fileTimeList.add(file.getFileTime());
|
|
|
- }
|
|
|
- Collections.sort(fileTimeList);
|
|
|
- String startDate = fileTimeList.get(0);
|
|
|
- String endDate = fileTimeList.get(fileTimeList.size() - 1);
|
|
|
- return startDate + "," + endDate;
|
|
|
- }
|
|
|
-
|
|
|
- private String builtArchiveName(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node, boolean isCrossNode) {
|
|
|
-
|
|
|
- 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 LinkedHashSet<>();
|
|
|
- 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 + node.getArchiveNameSuffix();
|
|
|
- }
|
|
|
-
|
|
|
- private String builtFilePageNo(ArchivesAuto archivesAuto, List<ArchiveFile> waitArchiveFiles) {
|
|
|
- //生成文件对应的页码,返回url
|
|
|
- archiveAutoPdfService.builtFilePageNo(archivesAuto, waitArchiveFiles);
|
|
|
- this.updateById(archivesAuto);
|
|
|
-
|
|
|
- return "";
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- /**
|
|
|
- * 单独组卷规则组卷
|
|
|
- *
|
|
|
- * @param waitArchiveFiles
|
|
|
- * @param node 规格参数所在节点
|
|
|
- * @param pageN
|
|
|
- */
|
|
|
- private void createArchive3(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node, int pageN) {
|
|
|
-
|
|
|
- String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
|
|
|
- String[] split = archiveStartDateAndEndDate.split(",");
|
|
|
- String startDate = split.length >= 1 ? split[0] : "";
|
|
|
- String endDate = split.length >= 2 ? split[1] : "";
|
|
|
- int fileN = waitArchiveFiles.size();
|
|
|
-
|
|
|
- String archiveName = builtArchiveName(waitArchiveFiles, node, false);//获取案卷题名
|
|
|
- //1.创建新案卷
|
|
|
- ArchivesAuto archivesAuto = builtArchives(node, pageN, fileN, startDate, endDate, archiveName);
|
|
|
- //2.设置文件所属案卷,组卷状态
|
|
|
- Long archivesAutoId = archivesAuto.getId();
|
|
|
-
|
|
|
- //封面和生成文件页码
|
|
|
- archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(), archivesAuto, waitArchiveFiles);
|
|
|
-
|
|
|
- builtFilePageNo(archivesAuto, waitArchiveFiles);//生成文件页码
|
|
|
-
|
|
|
-
|
|
|
- for (ArchiveFile file : waitArchiveFiles) {
|
|
|
- file.setArchiveId(archivesAutoId);//设置文件所属案卷
|
|
|
- file.setIsArchive(1);
|
|
|
-
|
|
|
- }
|
|
|
- archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 分类并卷组卷
|
|
|
- *
|
|
|
- * @param waitArchiveFiles
|
|
|
- * @param archiveAutoGroupId 分类并卷分组ID
|
|
|
- */
|
|
|
- private void createArchive2(List<ArchiveFile> waitArchiveFiles, Long archiveAutoGroupId, Long projectId) {
|
|
|
-
|
|
|
- //获取同一分类archiveAutoGroupId下设置的(设置规则时选中的)节点,排好序
|
|
|
- List<ArchiveTreeContract> selectList = archiveTreeContractClient.getStorageNodeByGroupId(projectId, archiveAutoGroupId);
|
|
|
- //分类并卷节点默认采用同类型下第一个存储节点为归属节点
|
|
|
- ArchiveTreeContract node = selectList.get(0);
|
|
|
- //获取案卷文件起止时间
|
|
|
- String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
|
|
|
- String[] split = archiveStartDateAndEndDate.split(",");
|
|
|
- String startDate = split.length >= 1 ? split[0] : "";
|
|
|
- String endDate = split.length >= 2 ? split[1] : "";
|
|
|
- int fileN = waitArchiveFiles.size();
|
|
|
- //获取案卷内文件总页数
|
|
|
- int pageN = 0;
|
|
|
- for (ArchiveFile file : waitArchiveFiles) {
|
|
|
- pageN = pageN + file.getFilePage();
|
|
|
- }
|
|
|
- //默认组卷存在跨节点组卷 注意案卷归属节点,案卷命名方式
|
|
|
- //获取案卷题名
|
|
|
- String archiveName = builtArchiveName(waitArchiveFiles, node, true);//获取案卷题名
|
|
|
-
|
|
|
- //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);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 默认规则组卷
|
|
|
- *
|
|
|
- * @param waitArchiveFiles
|
|
|
- * @param pageN
|
|
|
- */
|
|
|
- private void createArchive1(List<ArchiveFile> waitArchiveFiles, int pageN) {
|
|
|
-
|
|
|
- //获取案卷文件起止时间
|
|
|
- String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
|
|
|
- String[] split = archiveStartDateAndEndDate.split(",");
|
|
|
- String startDate = split.length >= 1 ? split[0] : "";
|
|
|
- String endDate = split.length >= 2 ? split[1] : "";
|
|
|
- int fileN = waitArchiveFiles.size();
|
|
|
-
|
|
|
-
|
|
|
- //默认组卷存在跨节点组卷 注意案卷归属节点,案卷命名方式
|
|
|
- //案卷归属节点为 排第一的文件所属节点
|
|
|
- ArchiveFile firstFile = waitArchiveFiles.get(0);
|
|
|
- Long nodeId = Long.parseLong(firstFile.getNodeId());
|
|
|
- ArchiveTreeContract node = archiveTreeContractClient.getArchiveTreeContractById(nodeId);
|
|
|
-
|
|
|
- //获取案卷题名
|
|
|
- String archiveName = builtArchiveName(waitArchiveFiles, node, true);//获取案卷题名
|
|
|
-
|
|
|
- //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 createArchiveBox(String boxName, 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.length >= 1 ? split[0] : "";
|
|
|
- String endDate = split.length >= 2 ? 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, boxName);
|
|
|
-
|
|
|
- //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, Map<String, List<ArchiveFile>> boxMap) {
|
|
|
- //步骤1:遍历节点集合
|
|
|
- for (ArchiveTreeContract node : list) {
|
|
|
- //步骤2:获取当前节点的案卷规格
|
|
|
- String specificationStr = node.getSpecification();
|
|
|
- if (StringUtils.isEmpty(specificationStr)) {
|
|
|
- specificationStr = "30";
|
|
|
- }
|
|
|
- int specification = Integer.parseInt(specificationStr);
|
|
|
- int specificationSize = specification * 10;
|
|
|
- //步骤3:查询节点下的未组卷文件
|
|
|
- List<ArchiveFile> archiveFiles = archiveFileClient.getListByNodeID(node.getId().toString());
|
|
|
- //步骤4:遍历未归档文件
|
|
|
- //待组卷文件集合
|
|
|
- List<ArchiveFile> waitArchiveFiles = new ArrayList<>();
|
|
|
- //待组卷文件总页数
|
|
|
- int archivesSize = 0;
|
|
|
- if (archiveFiles != null) {
|
|
|
- int archiveFilesSize = 0;
|
|
|
- for (ArchiveFile file : archiveFiles) {
|
|
|
- archiveFilesSize++;
|
|
|
- //步骤5:判断文件是否存在分盒设置
|
|
|
- if (file.getBoxNumber() != null && file.getBoxNumber() != -1) {
|
|
|
- //添加到分盒文件集合
|
|
|
- addBoxMap(file, boxMap);
|
|
|
- if (archiveFilesSize == archiveFiles.size() && waitArchiveFiles.size() > 0) {
|
|
|
- //最后一个文件直接将waitArchiveFiles组卷
|
|
|
- createArchive3(waitArchiveFiles, node, archivesSize);
|
|
|
- }
|
|
|
- } else {
|
|
|
- //单独组卷流程
|
|
|
- //步骤6:计算和判断待组卷文件集合是否达到组卷要求,达到要求创建案卷,案卷归属当前节点,案卷下文件改为已组卷
|
|
|
- Integer filePage = file.getFilePage();
|
|
|
- archivesSize = archivesSize + filePage;
|
|
|
- Integer checkStatus = checkSpecificationSize(specificationSize, archivesSize);
|
|
|
- //步骤6.1未到规格 不组卷
|
|
|
- if (checkStatus == 0) {
|
|
|
- waitArchiveFiles.add(file);
|
|
|
- //判断是否最后一个文件
|
|
|
- if (archiveFilesSize == archiveFiles.size()) {
|
|
|
- //最后一个文件直接将waitArchiveFiles组卷
|
|
|
- createArchive3(waitArchiveFiles, node, archivesSize);
|
|
|
- } else {
|
|
|
- continue;
|
|
|
- }
|
|
|
- }
|
|
|
- //步骤6.2达到规格 可以组一卷
|
|
|
- if (checkStatus == 1) {
|
|
|
- waitArchiveFiles.add(file);
|
|
|
- //将waitArchiveFiles组卷
|
|
|
- createArchive3(waitArchiveFiles, node, archivesSize);
|
|
|
- //将待组卷文件集合,总页数还原初始值,
|
|
|
- waitArchiveFiles.clear();
|
|
|
- archivesSize = 0;
|
|
|
- }
|
|
|
- //步骤6.3超出规格
|
|
|
- if (checkStatus == -1) {
|
|
|
- //如果waitArchiveFiles集合size>0,先将集合中文件组卷。再将当前文件放入集合
|
|
|
- if (waitArchiveFiles.size() > 0) {
|
|
|
- //将waitArchiveFiles组卷,
|
|
|
- createArchive3(waitArchiveFiles, node, archivesSize - filePage);
|
|
|
- //然后将待组卷文件集合,总页数还原初始值,
|
|
|
- waitArchiveFiles.clear();
|
|
|
- //保存当前文件进入待组卷集合,待组卷页数=当前文件页数
|
|
|
- waitArchiveFiles.add(file);
|
|
|
- archivesSize = filePage;
|
|
|
-
|
|
|
- //判断是否最后一个文件
|
|
|
- if (archiveFilesSize == archiveFiles.size()) {
|
|
|
- //如果当前文件最后一个文件直接将waitArchiveFiles组卷
|
|
|
- createArchive3(waitArchiveFiles, node, archivesSize);
|
|
|
- waitArchiveFiles.clear();
|
|
|
- archivesSize = 0;
|
|
|
- }
|
|
|
- } else {
|
|
|
- //步骤6.3.2如果waitArchiveFiles集合size=0,说明当前文件已经超过规格,直接将当前文件组卷
|
|
|
- waitArchiveFiles.add(file);
|
|
|
- //直接将waitArchiveFiles组卷
|
|
|
- createArchive3(waitArchiveFiles, node, archivesSize);
|
|
|
- waitArchiveFiles.clear();
|
|
|
- archivesSize = 0;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 分类并卷组卷 设置分类的节点下只有一个案卷,节点下的所有文件都组成这个案卷。如果设置分类节点(select=1的)多个,案卷归属排序第一个节点。
|
|
|
- */
|
|
|
- private void archiveAutoMethod2(List<ArchiveTreeContract> list, Long projectId, Map<String, List<ArchiveFile>> boxMap) {
|
|
|
-
|
|
|
- //分类并卷集合<groupId,List<文件>>
|
|
|
- Map<Long, List<ArchiveFile>> archiveMap = new HashMap<>();
|
|
|
- //记录同个分组id的第一个节点ID 案卷归属于这个节点
|
|
|
- Map<Long, Long> groupId2NodeIdMap = new HashMap<>();
|
|
|
-
|
|
|
- //步骤1:遍历节点集合
|
|
|
- for (ArchiveTreeContract node : list) {
|
|
|
- //根据分组ID来创建唯一案卷
|
|
|
- Long archiveAutoGroupId = node.getArchiveAutoGroupId();
|
|
|
- //步骤2:查询节点下的未归档文件
|
|
|
- List<ArchiveFile> archiveFiles = archiveFileClient.getListByNodeID(node.getId().toString());
|
|
|
- //步骤3:遍历未归档文件
|
|
|
- if (archiveFiles != null) {
|
|
|
- for (ArchiveFile file : archiveFiles) {
|
|
|
- //步骤4:判断文件是否存在分盒设置
|
|
|
- if (file.getBoxNumber() != null && file.getBoxNumber() != -1) {
|
|
|
- //添加到分盒文件集合
|
|
|
- addBoxMap(file, boxMap);
|
|
|
- } else {
|
|
|
- //分类并卷流程
|
|
|
- //步骤5:将文件按照<groupId,List<文件>>放入集合
|
|
|
- if (archiveMap.containsKey(archiveAutoGroupId)) {
|
|
|
- List<ArchiveFile> groupList = archiveMap.get(archiveAutoGroupId);
|
|
|
- groupList.add(file);
|
|
|
- archiveMap.put(archiveAutoGroupId, groupList);
|
|
|
- } else {
|
|
|
- List<ArchiveFile> groupList = new ArrayList<>();
|
|
|
- groupList.add(file);
|
|
|
- archiveMap.put(archiveAutoGroupId, groupList);
|
|
|
- groupId2NodeIdMap.put(archiveAutoGroupId, node.getId());
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- //步骤6:按集合创建案卷,每个group类的案卷归属顺序排第一个节点
|
|
|
- Set<Map.Entry<Long, List<ArchiveFile>>> entries = archiveMap.entrySet();
|
|
|
- for (Map.Entry<Long, List<ArchiveFile>> entry : entries) {
|
|
|
- Long archiveAutoGroupId = entry.getKey();
|
|
|
- List<ArchiveFile> archiveFiles = entry.getValue();
|
|
|
- //一个archiveAutoGroupId组成一个案卷 案卷归属同个key的归档树节点select=1的第一个groupId2NodeIdMap
|
|
|
- createArchive2(archiveFiles, archiveAutoGroupId, projectId);
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 默认组卷流程 文件可以跨节点组卷,受最高并卷节点限制范围,跨节点文件组卷时,案卷规格按照第一个文件所在的节点规格 组卷。
|
|
|
- */
|
|
|
- private void archiveAutoMethod1(List<ArchiveTreeContract> list, Map<String, List<ArchiveFile>> boxMap) {
|
|
|
- //最高并卷节点
|
|
|
- Long archiveAutoNodeId = null;
|
|
|
-
|
|
|
- //当前待组卷规格大小
|
|
|
- int specificationSize = 0;
|
|
|
- //待组卷文件总页数
|
|
|
- int archivesSize = 0;
|
|
|
- //待组卷文件集合
|
|
|
- List<ArchiveFile> waitArchiveFiles = new ArrayList<>();
|
|
|
-
|
|
|
- //步骤1:遍历节点集合
|
|
|
- int nodeSize = 0;
|
|
|
- for (ArchiveTreeContract node : list) {
|
|
|
- nodeSize++;
|
|
|
- if (archiveAutoNodeId == null) {
|
|
|
- archiveAutoNodeId = node.getArchiveAutoNodeId();
|
|
|
- }
|
|
|
- //当前节点的的archiveAutoNodeId
|
|
|
- Long archiveAutoNodeId_current = node.getArchiveAutoNodeId();
|
|
|
-
|
|
|
-
|
|
|
- //步骤2:判断当前节点是否超出最高节点
|
|
|
- if (!archiveAutoNodeId.equals(archiveAutoNodeId_current)) {
|
|
|
- //超过最高并卷节点(节点是排序好的,只要不相等就超过了)
|
|
|
- if (waitArchiveFiles.size() > 0) {
|
|
|
- //将待组卷集合里的文件组卷
|
|
|
- createArchive1(waitArchiveFiles, archivesSize);
|
|
|
- }
|
|
|
- waitArchiveFiles.clear();
|
|
|
- archivesSize = 0;
|
|
|
- archiveAutoNodeId = node.getArchiveAutoNodeId();//更新当前最高并卷节点
|
|
|
- }
|
|
|
-
|
|
|
- //步骤3.1:获取节点规格
|
|
|
- if (waitArchiveFiles.size() == 0) {
|
|
|
- //waitArchiveFiles待组卷文件为空时,按当前节点的规格
|
|
|
- String specificationStr = node.getSpecification();
|
|
|
- if (StringUtils.isEmpty(specificationStr)) {
|
|
|
- specificationStr = "30";
|
|
|
- }
|
|
|
- int specification = Integer.parseInt(specificationStr);
|
|
|
- specificationSize = specification * 10;
|
|
|
- }
|
|
|
-
|
|
|
- //步骤3.2:查询出当前节点未组卷的文件
|
|
|
- List<ArchiveFile> archiveFiles = archiveFileClient.getListByNodeID(node.getId().toString());
|
|
|
- //步骤3.3:遍历未组卷文件
|
|
|
- int archiveFilesSize = 0;
|
|
|
- for (ArchiveFile file : archiveFiles) {
|
|
|
- archiveFilesSize++;
|
|
|
- //步骤3.4:判断文件是否存在分盒设置
|
|
|
- if (file.getBoxNumber() != null && file.getBoxNumber() != -1) {
|
|
|
- //添加到分盒文件集合
|
|
|
- addBoxMap(file, boxMap);
|
|
|
- if (nodeSize == list.size() && archiveFilesSize == archiveFiles.size()) {
|
|
|
- //如果当前是最后一个文件直接将waitArchiveFiles组卷
|
|
|
- createArchive1(waitArchiveFiles, archivesSize);
|
|
|
- }
|
|
|
- } else {
|
|
|
- //步骤3.5 计算和判断待组卷文件集合是否达到组卷要求,达到要求创建案卷,案卷归属当前节点,案卷下文件改为已组卷
|
|
|
- Integer filePage = file.getFilePage();
|
|
|
- archivesSize = archivesSize + filePage;
|
|
|
- Integer checkStatus = checkSpecificationSize(specificationSize, archivesSize);
|
|
|
- //步骤3.6未到规格 不组卷
|
|
|
- if (checkStatus == 0) {
|
|
|
- waitArchiveFiles.add(file);
|
|
|
- //判断是否最后一个节点,最后一个文件
|
|
|
- if (nodeSize == list.size() && archiveFilesSize == archiveFiles.size()) {
|
|
|
- //直接将waitArchiveFiles待组卷集合组卷,归属集合第一个文件所在节点
|
|
|
- createArchive1(waitArchiveFiles, archivesSize);
|
|
|
- //将待组卷文件集合,总页数还原初始值,
|
|
|
- waitArchiveFiles.clear();
|
|
|
- archivesSize = 0;
|
|
|
- } else {
|
|
|
- continue;
|
|
|
- }
|
|
|
- }
|
|
|
- //步骤3.7达到规格 可以组一卷
|
|
|
- if (checkStatus == 1) {
|
|
|
- waitArchiveFiles.add(file);
|
|
|
- //将waitArchiveFiles待组卷集合组卷,归属集合第一个文件所在节点
|
|
|
- createArchive1(waitArchiveFiles, archivesSize);
|
|
|
- //将待组卷文件集合,总页数还原初始值,
|
|
|
- waitArchiveFiles.clear();
|
|
|
- archivesSize = 0;
|
|
|
-
|
|
|
- String specificationStr = node.getSpecification();
|
|
|
- if (StringUtils.isEmpty(specificationStr)) {
|
|
|
- specificationStr = "30";
|
|
|
- }
|
|
|
- int specification = Integer.parseInt(specificationStr);
|
|
|
- specificationSize = specification * 10;//更新specificationSize待组卷规格为 当前节点的组卷规格
|
|
|
- }
|
|
|
- //步骤3.8超出规格
|
|
|
- if (checkStatus == -1) {
|
|
|
- //步骤3.9如果waitArchiveFiles集合size>0,先将集合中文件组卷。再将当前文件加入集合
|
|
|
- if (waitArchiveFiles.size() > 0) {
|
|
|
- //3.9.1 将waitArchiveFiles组卷,归属集合第一个文件所在节点
|
|
|
- createArchive1(waitArchiveFiles, archivesSize);
|
|
|
- //将待组卷文件集合,总页数还原初始值,
|
|
|
- waitArchiveFiles.clear();
|
|
|
- //3.9.2保存当前文件进入待组卷集合,
|
|
|
- waitArchiveFiles.add(file);
|
|
|
- //3.9.3待组卷页数=当前文件页数
|
|
|
- archivesSize = filePage;
|
|
|
-
|
|
|
- String specificationStr = node.getSpecification();
|
|
|
- if (StringUtils.isEmpty(specificationStr)) {
|
|
|
- specificationStr = "30";
|
|
|
- }
|
|
|
- int specification = Integer.parseInt(specificationStr);
|
|
|
- specificationSize = specification * 10;//更新specificationSize待组卷规格为 当前节点的组卷规格
|
|
|
-
|
|
|
- //3.9.4 判断当前文件是不是最后一个节点,最后一个文件
|
|
|
- if (nodeSize == list.size() && archiveFilesSize == archiveFiles.size()) {
|
|
|
- //最后一个文件再将waitArchiveFiles组卷
|
|
|
- createArchive1(waitArchiveFiles, archivesSize);
|
|
|
- }
|
|
|
- } else {
|
|
|
- //步骤3.10 如果waitArchiveFiles集合size=0,说明当前文件已经超过规格,直接将当前文件组卷
|
|
|
- waitArchiveFiles.add(file);
|
|
|
- //直接将waitArchiveFiles组卷
|
|
|
- createArchive1(waitArchiveFiles, archivesSize);
|
|
|
- waitArchiveFiles.clear();
|
|
|
- archivesSize = 0;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 分盒组卷流程
|
|
|
- *
|
|
|
- * @param boxMap
|
|
|
- */
|
|
|
- private void archiveAutoMethodBox(Map<String, List<ArchiveFile>> boxMap) {
|
|
|
- Set<Map.Entry<String, List<ArchiveFile>>> entries = boxMap.entrySet();
|
|
|
- for (Map.Entry<String, List<ArchiveFile>> entry : entries) {
|
|
|
- //一个分盒一个案卷 归属第一个文件所在节点
|
|
|
- createArchiveBox(entry.getKey(), entry.getValue());
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 查询案卷,排序
|
|
|
- *
|
|
|
- * @param ids
|
|
|
- * @return
|
|
|
- */
|
|
|
- public List<ArchivesAuto> findArchivesAutosByIds(List<Long> ids) {
|
|
|
- QueryWrapper<ArchivesAuto> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.in("node_id", ids)
|
|
|
- .eq("is_deleted", 0)
|
|
|
- .eq("is_archive", 1)
|
|
|
- .ne("is_auto_file", 1)
|
|
|
- .orderByAsc("tree_sort")
|
|
|
- .orderByAsc("auto_file_sort")
|
|
|
- .orderByAsc("file_number");
|
|
|
-
|
|
|
- return this.list(queryWrapper);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- /**
|
|
|
- * 不重组的情况下刷新档号
|
|
|
- * projectId 为当前项目
|
|
|
- * contractId 为客户端当前选定的合同段
|
|
|
- * nodeId 为左侧树选定的节点i
|
|
|
- * 规则,1. 合同段ID为空,则不过滤
|
|
|
- * 2. 业主或者管理员,treeCode为空,则按照nodeid过滤,nodeid为空,则不过滤
|
|
|
- * 3. 合同段用户,安装找contractId过滤,过滤该合同段所有节点。
|
|
|
- *
|
|
|
- * @param projectId
|
|
|
- * @param contractId
|
|
|
- * @param nodeId
|
|
|
- */
|
|
|
- public void refreshFileNumberNoSlipt(Long projectId, Long contractId, Long nodeId) {
|
|
|
- List<ArchiveTreeContract> list = archiveTreeContractClient.getListByProjectId(projectId);
|
|
|
- this.refreshFileNumberNoSlipt(list, contractId, nodeId);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * @param archiveTreeContracts
|
|
|
- * @param contractId
|
|
|
- * @param nodeId
|
|
|
- */
|
|
|
- public void refreshFileNumberNoSlipt(List<ArchiveTreeContract> archiveTreeContracts, Long contractId, Long nodeId) {
|
|
|
-
|
|
|
- List<ArchiveTreeContractVO2> subTreeList = new ArrayList<>();
|
|
|
- List<List<ArchiveTreeContract>> subGroupedList = new ArrayList<>();
|
|
|
- ArchiveTreeUtil.getGroupedList(archiveTreeContracts, subTreeList, subGroupedList);
|
|
|
- Integer index = 1;
|
|
|
-
|
|
|
- List<ArchivesAuto> changeList = new ArrayList<>();
|
|
|
-
|
|
|
- //分组,分程 建设单位,各个合同段,电子单位等
|
|
|
- for (List<ArchiveTreeContract> subList : subGroupedList) {
|
|
|
- List<Long> ids = subList.stream()
|
|
|
- .map(ArchiveTreeContract::getId)
|
|
|
- .collect(Collectors.toList());
|
|
|
-
|
|
|
- //todo 后续根据 authFilter函数过滤
|
|
|
-
|
|
|
- subList = authFilter(subList, contractId, nodeId);
|
|
|
-
|
|
|
- index = 1;
|
|
|
- List<ArchivesAuto> archivesAutos = findArchivesAutosByIds(ids);
|
|
|
- if (archivesAutos == null || archivesAutos.size() == 0) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- //准备节点id-节点档号前缀Map
|
|
|
- Map<String, String> node_fileNumberPrefixMap = new HashMap<>();
|
|
|
- for (ArchiveTreeContract node : subList) {
|
|
|
- node_fileNumberPrefixMap.put(node.getId().toString(), node.getFileNumberPrefix());
|
|
|
- }
|
|
|
-
|
|
|
- for (ArchivesAuto archivesAuto : archivesAutos) {
|
|
|
- String nodeId1 = archivesAuto.getNodeId().toString();
|
|
|
- String fileNumberPrefix = "";
|
|
|
- if (node_fileNumberPrefixMap.containsKey(nodeId1)) {
|
|
|
- fileNumberPrefix = node_fileNumberPrefixMap.get(nodeId1);
|
|
|
- if (StringUtils.isEmpty(fileNumberPrefix)) {
|
|
|
- //节点没有值,就从合同段获取,没有合同段id的 用业主的合同段
|
|
|
- Long nodeContractId = archivesAuto.getContractId();
|
|
|
- if (nodeContractId != null) {
|
|
|
- ContractInfo nodeContract = contractClient.getContractById(nodeContractId);
|
|
|
- fileNumberPrefix = nodeContract.getPrefix();
|
|
|
- } else {
|
|
|
- List<Long> pids = new ArrayList<>();
|
|
|
- pids.add(archivesAuto.getProjectId());
|
|
|
- List<ContractInfo> contracts = contractClient.queryContractListByIds(pids);
|
|
|
- for (ContractInfo c : contracts) {
|
|
|
- if (c.getContractType() == 3) {
|
|
|
- fileNumberPrefix = c.getPrefix();
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- String fileNumber = fileNumberPrefix + "_" + index;
|
|
|
- if (archiveAutoPdfService.refreshFileNumber(archivesAuto, fileNumber)) {
|
|
|
- changeList.add(archivesAuto);
|
|
|
- }
|
|
|
- index++;
|
|
|
- }
|
|
|
- }
|
|
|
- this.updateBatchById(changeList);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取案卷合成pdf文件
|
|
|
- *
|
|
|
- * @param archiveId
|
|
|
- * @return
|
|
|
- */
|
|
|
- public String getMergeArchivesFile(Long archiveId) {
|
|
|
- String url = "";
|
|
|
-
|
|
|
- List<String> urlList = new ArrayList<>();//合成pdf集合
|
|
|
-
|
|
|
- ArchivesAuto archivesAuto = this.getById(archiveId);
|
|
|
-
|
|
|
- //判断archivesAuto是否为空
|
|
|
- if (archivesAuto == null) {
|
|
|
- return url;
|
|
|
- }
|
|
|
- String outUrl = archivesAuto.getOutUrl();
|
|
|
- //判断outUrl是否为空
|
|
|
- String[] frontUrls = null;
|
|
|
- if (StringUtils.isNotEmpty(outUrl)) {
|
|
|
- frontUrls = outUrl.split(",");
|
|
|
- }
|
|
|
-
|
|
|
- ArchiveProjectConfig config = archiveProjectConfigService.getByProjectIdOrNew(archivesAuto.getProjectId());
|
|
|
-
|
|
|
- // 根据 factorType 字符串生成档案号码字符串链表
|
|
|
- String front = "";
|
|
|
- String cataLog = "";
|
|
|
- String spare = "";
|
|
|
- String back = "";
|
|
|
-
|
|
|
-
|
|
|
- if (frontUrls != null) {
|
|
|
- for (String frontUrl : frontUrls) {
|
|
|
- if (frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[0]) && config.getFactorType().contains("1")) {
|
|
|
- front = frontUrl;
|
|
|
- } else if (frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[1]) && config.getFactorType().contains("2")) {
|
|
|
- cataLog = frontUrl;
|
|
|
- } else if (frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[2]) && config.getFactorType().contains("3")) {
|
|
|
- spare = frontUrl;
|
|
|
- } else if (frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[3]) && config.getFactorType().contains("4")) {
|
|
|
- back = frontUrl;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- List<String> fileUrls = new ArrayList<>();
|
|
|
- if (!archivesAuto.isMedia()) {
|
|
|
- List<ArchiveFile> result = this.archiveFileClient.getArchiveFileByArchivesId(archivesAuto.getId().toString(), "");
|
|
|
- if (result != null && result.size() > 0) {
|
|
|
- //循环访问result,如果pdfpageurl不为空则取出,否则取pdffileurl
|
|
|
- for (ArchiveFile archiveFile : result) {
|
|
|
- String pdfPageUrl = archiveFile.getPdfPageUrl();
|
|
|
- if (StringUtils.isEmpty(pdfPageUrl)) {
|
|
|
- fileUrls.add(archiveFile.getPdfFileUrl());
|
|
|
- } else {
|
|
|
- fileUrls.add(pdfPageUrl);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (fileUrls.size() > 0) {
|
|
|
- //此处暂时这么处理,等oss上传接口里文件名可以区分后,再单独取
|
|
|
+ private final IDictBizClient iDictBizClient;
|
|
|
+ private ArchiveFileClient archiveFileClient;
|
|
|
+ private ArchiveTreeContractClient archiveTreeContractClient;
|
|
|
+ private ContractClient contractClient;
|
|
|
+ private ProjectClient projectClient;
|
|
|
+ private final ArchivesAutoMapper autoMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ExecutorService executorService;
|
|
|
+
|
|
|
+ private Map<String,Integer> indexMap = new HashMap<>(); //按立卷位区分和生成流水号
|
|
|
+ private IArchiveAutoPdfService archiveAutoPdfService;
|
|
|
+ private final NewIOSSClient iossClient;
|
|
|
+
|
|
|
+ private final IArchiveProjectConfigService archiveProjectConfigService;
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IPage<ArchivesAutoVO> selectArchivesAutoPage(IPage<ArchivesAutoVO> page, ArchivesAutoVO archivesAuto) {
|
|
|
+ return page.setRecords(baseMapper.selectArchivesAutoPage(page, archivesAuto));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IPage<ArchivesAutoVO> pageByArchivesAuto(ArchivesAutoVO vo) {
|
|
|
+ IPage<ArchivesAutoVO> page = new Page<>(vo.getCurrent(),vo.getSize());
|
|
|
+ if (StringUtils.isNotBlank(vo.getStorageTime())) {
|
|
|
+ vo.setStorageTimes(Arrays.asList(vo.getStorageTime().split(",")));
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(vo.getSecretLevel())){
|
|
|
+ vo.setSecretLevels(Arrays.asList(vo.getSecretLevel().split(",")));
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(vo.getCarrierType())) {
|
|
|
+ vo.setCarrierTypes(Arrays.asList(vo.getCarrierType().split(",")));
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(vo.getYear())) {
|
|
|
+ vo.setYears(Arrays.asList(vo.getYear().split(",")));
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(vo.getMonth())) {
|
|
|
+ vo.setMonths(Arrays.asList(vo.getMonth().split(",")));
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(vo.getCarrierType())) {
|
|
|
+ vo.setCarrierTypes(Arrays.asList(vo.getCarrierType().split(",")));
|
|
|
+ }
|
|
|
+ List<ArchivesAutoVO> archivesAutos = null;
|
|
|
+ //获取合同段类型
|
|
|
+ ContractInfo contractInfo = contractClient.getContractById(vo.getContractId());
|
|
|
+ Integer contractType = contractInfo.getContractType();
|
|
|
+ //根据用户在当前合同段的权限,判断返回
|
|
|
+ BladeUser user = AuthUtil.getUser();
|
|
|
+ String name = baseMapper.getUserRoleName(vo.getProjectId(),vo.getContractId(),user.getUserId());
|
|
|
+ if (name.contains("超级管理员") || contractType == 3) {
|
|
|
+ vo.setContractId(null);
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(vo.getNodeIds())) {
|
|
|
+ vo.setNodeIdArray(Arrays.asList(vo.getNodeIds().split(",")));
|
|
|
+ archivesAutos = baseMapper.pageByArchivesAuto2(page, vo);
|
|
|
+ } else {
|
|
|
+ archivesAutos = baseMapper.pageByArchivesAuto(page, vo);
|
|
|
+ }
|
|
|
+ if (archivesAutos != null && archivesAutos.size() >0) {
|
|
|
+ archivesAutos.stream().forEach(aa -> {
|
|
|
+ if (StringUtils.isNotBlank(aa.getStorageTime())) {
|
|
|
+ aa.setStorageTimeValue("3".equals(aa.getStorageTime()) ? "永久" : ("2".equals(aa.getStorageTime()) ? "30年" : "10年"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(aa.getSecretLevel())) {
|
|
|
+ aa.setSecretLevelValue("1".equals(aa.getSecretLevel()) ? "机密" : ("2".equals(aa.getSecretLevel()) ? "绝密" : "秘密"));
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return page.setRecords(archivesAutos);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IPage<ArchivesAutoVO> selectArchivesAutoFilePage(ArchivesAutoVO vo) {
|
|
|
+ Query query = new Query();
|
|
|
+ query.setCurrent(vo.getCurrent());
|
|
|
+ query.setSize(vo.getSize());
|
|
|
+ //设置分页
|
|
|
+ IPage<ArchivesAutoVO> iPage = Condition.getPage(query);
|
|
|
+
|
|
|
+ //汇总
|
|
|
+ Integer total = this.baseMapper.selectArchivesAutoFileCount(vo);
|
|
|
+ if(total == null){
|
|
|
+ total = 0;
|
|
|
+ }
|
|
|
+ //分页
|
|
|
+ int current = (vo.getCurrent() - 1) * vo.getSize();
|
|
|
+
|
|
|
+ List<ArchivesAuto> pageList = this.baseMapper.selectArchivesAutoFilePage(current, vo.getSize(), vo);
|
|
|
+ //设置分页信息
|
|
|
+ iPage.setTotal(total);
|
|
|
+ List<ArchivesAutoVO> pageVoList = JSONArray.parseArray(JSONObject.toJSONString(pageList), ArchivesAutoVO.class);
|
|
|
+ List<DictBiz> sheetSourceList = this.iDictBizClient.getList("security_level", "notRoot").getData();
|
|
|
+ List<DictBiz> sheetSourceList1 = this.iDictBizClient.getList("storage_period", "notRoot").getData();
|
|
|
+
|
|
|
+ pageVoList.forEach(vos -> {
|
|
|
+ if(StringUtils.isNotEmpty(vos.getSecretLevel())){
|
|
|
+ sheetSourceList.forEach(source -> {
|
|
|
+ if( source.getDictKey().equals(vos.getSecretLevel())){
|
|
|
+ vos.setSecretLevelValue(source.getDictValue());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ if(StringUtils.isNotEmpty(vos.getStorageTime())){
|
|
|
+ sheetSourceList1.forEach(source -> {
|
|
|
+ if ( source.getDictKey().equals(vos.getStorageTime())) {
|
|
|
+ vos.setStorageTimeValue(source.getDictValue());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ return iPage.setRecords(pageVoList);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean updateArchivesAutoFileByNodeId(String ids, String nodeId,String nodeSort) {
|
|
|
+ try {
|
|
|
+ baseMapper.updateArchivesAutoFileByNodeId(Func.toLongList(ids),nodeId,nodeSort);
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map<String, Integer> getAllArchiveByContractType(Long projectId,String typ) {
|
|
|
+ List<ArchivesAutoVO> list = baseMapper.getAllArchiveByContractType(projectId,typ);
|
|
|
+ List<ContractInfo> infos = contractClient.queryContractListByIds(Arrays.asList(projectId));
|
|
|
+ int key1=0,key2=0,key3=0;
|
|
|
+ //判断案卷属于1施工,2监理,还是3业主
|
|
|
+ for (ArchivesAutoVO l : list) {
|
|
|
+ String type = l.getContractType();
|
|
|
+ if (StringUtils.isBlank(type)){
|
|
|
+ //业主
|
|
|
+ key3++;
|
|
|
+ }else if ("S".equals(type)){
|
|
|
+ //监理
|
|
|
+ key2++;
|
|
|
+ }else if ("C".equals(type)){
|
|
|
+ //施工
|
|
|
+ key1++;
|
|
|
+ }else if (type.length() > 10){
|
|
|
+ for (ContractInfo info : infos) {
|
|
|
+ if (type.equals(info.getId()+"")){
|
|
|
+ Integer t = info.getContractType();
|
|
|
+ if (t == 1){
|
|
|
+ key1++;
|
|
|
+ }else if(t==2){
|
|
|
+ key2++;
|
|
|
+ }else {
|
|
|
+ key3++;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ System.out.println(type);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Map<String,Integer> map = new HashMap<>();
|
|
|
+ map.put("key1",key1);
|
|
|
+ map.put("key2",key2);
|
|
|
+ map.put("key3",key3);
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Map<String, String>> getAllArchiveAgeByContractType(Long projectId) {
|
|
|
+ List<Map<String,String>> list = baseMapper.getAllArchiveAgeByContractType(projectId);
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void splitArchvies(Long projectId,Long contractId,Long nodeId){
|
|
|
+ List<String> removeFiles = new ArrayList<>();
|
|
|
+ //没合同段的默认整个项目
|
|
|
+ if (contractId == null) {
|
|
|
+ //清除案卷封面等pdf
|
|
|
+ List<String> archivesOutUrlList = baseMapper.getArchivesOutUrlList(projectId);
|
|
|
+ if(archivesOutUrlList!=null && archivesOutUrlList.size()>0){
|
|
|
+ for(String outUrl:archivesOutUrlList){
|
|
|
+ String[] splits = outUrl.split(",");
|
|
|
+ for(String url:splits){
|
|
|
+ if(StringUtils.isNotEmpty(url.trim())){
|
|
|
+ removeFiles.add(FileUtils.getAliYunSubUrl(url));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //清除文件页面pdf
|
|
|
+ List<String> filePageUrlList = baseMapper.getFilePageUrlList(projectId);
|
|
|
+ if(filePageUrlList!=null && filePageUrlList.size()>0){
|
|
|
+ for(String url:filePageUrlList){
|
|
|
+ if(StringUtils.isNotEmpty(url.trim())){
|
|
|
+ removeFiles.add(FileUtils.getAliYunSubUrl(url));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ executorService.execute(()->{
|
|
|
+ iossClient.removeFiles(removeFiles);
|
|
|
+ log.debug("文件删完了");
|
|
|
+ });
|
|
|
+
|
|
|
+ //取消未锁定案卷文件关联
|
|
|
+ baseMapper.splitArchvies(projectId);
|
|
|
+
|
|
|
+ }else{
|
|
|
+ String treeCode = getAuthCode(contractId);
|
|
|
+ if (nodeId!= null) {
|
|
|
+ //有节点的按节点
|
|
|
+ String strNodeId = nodeId.toString();
|
|
|
+ ArchiveTreeContract archiveTreeContract = archiveTreeContractClient.getArchiveTreeContractById(nodeId);
|
|
|
+ String ancestors=archiveTreeContract.getAncestors()+","+nodeId;
|
|
|
+
|
|
|
+ //清除案卷封面等pdf
|
|
|
+ List<String> archivesOutUrlList = baseMapper.getArchivesOutUrlListByNode(projectId,ancestors,strNodeId);
|
|
|
+ if(archivesOutUrlList!=null && archivesOutUrlList.size()>0){
|
|
|
+ for(String outUrl:archivesOutUrlList){
|
|
|
+ String[] splits = outUrl.split(",");
|
|
|
+ for(String url:splits){
|
|
|
+ if(StringUtils.isNotEmpty(url.trim())){
|
|
|
+ removeFiles.add(FileUtils.getAliYunSubUrl(url));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //清除文件页面pdf
|
|
|
+ List<String> filePageUrlList = baseMapper.getFilePageUrlListByNode(projectId,ancestors,strNodeId);
|
|
|
+ if(filePageUrlList!=null && filePageUrlList.size()>0){
|
|
|
+ for(String url:filePageUrlList){
|
|
|
+ if(StringUtils.isNotEmpty(url.trim())){
|
|
|
+ removeFiles.add(FileUtils.getAliYunSubUrl(url));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ executorService.execute(()->{
|
|
|
+ iossClient.removeFiles(removeFiles);
|
|
|
+ log.debug("文件删完了");
|
|
|
+ });
|
|
|
+
|
|
|
+ baseMapper.splitArchviesByNode(projectId,ancestors,strNodeId);
|
|
|
+ }else{
|
|
|
+ //没节点的按合同段
|
|
|
+ //清除案卷封面等pdf
|
|
|
+ List<String> archivesOutUrlList = baseMapper.getArchivesOutUrlListByContract(projectId,contractId,treeCode);
|
|
|
+ if(archivesOutUrlList!=null && archivesOutUrlList.size()>0){
|
|
|
+ for(String outUrl:archivesOutUrlList){
|
|
|
+ String[] splits = outUrl.split(",");
|
|
|
+ for(String url:splits){
|
|
|
+ if(StringUtils.isNotEmpty(url.trim())){
|
|
|
+ removeFiles.add(FileUtils.getAliYunSubUrl(url));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //清除文件页面pdf
|
|
|
+ List<String> filePageUrlList = baseMapper.getFilePageUrlListByContract(projectId,contractId,treeCode);
|
|
|
+ if(filePageUrlList!=null && filePageUrlList.size()>0){
|
|
|
+ for(String url:filePageUrlList){
|
|
|
+ if(StringUtils.isNotEmpty(url.trim())){
|
|
|
+ removeFiles.add(FileUtils.getAliYunSubUrl(url));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ executorService.execute(()->{
|
|
|
+ iossClient.removeFiles(removeFiles);
|
|
|
+ log.debug("文件删完了");
|
|
|
+ });
|
|
|
+
|
|
|
+ //没节点的按合同段
|
|
|
+ baseMapper.splitArchviesByContract(projectId,contractId,treeCode);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void archiveAutoMethod(Long projectId,Long contractId,Long nodeId){
|
|
|
+ //步骤一:把档号集合初始化
|
|
|
+ indexMap = new HashMap<>();
|
|
|
+ //步骤二:查询归档树节点。存在未归档文件的节点。
|
|
|
+ List<ArchiveTreeContract> list = archiveTreeContractClient.getHavedFileNodeByProjectID(projectId);
|
|
|
+
|
|
|
+ //按合同段过滤
|
|
|
+ List<ArchiveTreeContract> authlist = authFilter(list, contractId, nodeId);
|
|
|
+
|
|
|
+ //步骤三:遍历归档树节点整理出 默认规则节点,分类并卷节点,单独组卷节点 三个集合。
|
|
|
+ List<ArchiveTreeContract> list1= new ArrayList<>();
|
|
|
+ List<ArchiveTreeContract> list2= new ArrayList<>();
|
|
|
+ List<ArchiveTreeContract> list3= new ArrayList<>();
|
|
|
+ for(ArchiveTreeContract treeContract:authlist){
|
|
|
+ Integer archiveAutoType = treeContract.getArchiveAutoType();
|
|
|
+ switch (archiveAutoType){
|
|
|
+ case 1:
|
|
|
+ list1.add(treeContract);
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ list2.add(treeContract);
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ list3.add(treeContract);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //步骤四:按照单独,分类,默认,分盒的顺序执行组卷流程。
|
|
|
+
|
|
|
+ //分盒文件集合
|
|
|
+ Map<String,List<ArchiveFile>> boxMap = new LinkedHashMap<>();
|
|
|
+
|
|
|
+ archiveAutoMethod3(list3,boxMap);//单独组卷
|
|
|
+ archiveAutoMethod2(list2,projectId,boxMap);//分类组卷
|
|
|
+ archiveAutoMethod1(list1,boxMap);//默认组卷
|
|
|
+ archiveAutoMethodBox(boxMap);//分盒组卷
|
|
|
+ }
|
|
|
+
|
|
|
+ private void addBoxMap(ArchiveFile file,Map<String,List<ArchiveFile>> boxMap){
|
|
|
+ String boxName = file.getBoxName();
|
|
|
+ if(boxMap.containsKey(boxName)){
|
|
|
+ List<ArchiveFile> boxFiles = boxMap.get(boxName);
|
|
|
+ boxFiles.add(file);
|
|
|
+ boxMap.put(boxName,boxFiles);
|
|
|
+ }else{
|
|
|
+ List<ArchiveFile> boxFiles = new ArrayList<>();
|
|
|
+ boxFiles.add(file);
|
|
|
+ boxMap.put(boxName,boxFiles);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IPage<ArchivesAutoVO> pageByAuthenticate(ArchivesAutoVO vo) {
|
|
|
+ IPage<ArchivesAutoVO> page = new Page<>(vo.getCurrent(),vo.getSize());
|
|
|
+ //根据权限返回结果
|
|
|
+ ContractInfo contractInfo = contractClient.getContractById(vo.getContractId());
|
|
|
+ Integer contractType = contractInfo.getContractType();
|
|
|
+ //根据用户在当前合同段的权限,判断返回
|
|
|
+ BladeUser user = AuthUtil.getUser();
|
|
|
+ String name = baseMapper.getUserRoleName(vo.getProjectId(),vo.getContractId(),user.getUserId());
|
|
|
+ List<ArchivesAutoVO> list = new ArrayList<>();
|
|
|
+ if (name.contains("超级管理员") || contractType == 3) {
|
|
|
+ list = baseMapper.pageByAuthenticate(page, vo);
|
|
|
+ }else {
|
|
|
+ ArchiveTreeContract node = archiveTreeContractClient.getArchiveTreeContractById(vo.getNodeId());
|
|
|
+ if (node.getAncestors().split(",").length <= 2){
|
|
|
+ //查询当前合同
|
|
|
+ ArchiveTreeContract archiveTreeContract = archiveTreeContractClient.getArchiveTreeContractByNodeName(contractInfo.getContractName());
|
|
|
+ vo.setNodeId(archiveTreeContract.getId());
|
|
|
+ }
|
|
|
+ list = baseMapper.pageByAuthenticate(page, vo);
|
|
|
+ }
|
|
|
+ if (list != null && list.size() > 0){
|
|
|
+ list.stream().forEach(l->{
|
|
|
+ if (l.getFileSize() != null){
|
|
|
+ l.setFileSizeValue(org.springblade.common.utils.FileUtils.formatSize(l.getFileSize()*1024L));
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return page.setRecords(list);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<String> getFilingUnitList(Long projectId) {
|
|
|
+ return baseMapper.getFilingUnitList(projectId);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void batchDestroyArchive(String ids) {
|
|
|
+ List<String> list = Arrays.asList(ids.split(","));
|
|
|
+ //查询出档案的文件
|
|
|
+ List<ArchiveFile> files = archiveFileClient.getAllArchiveFileByArchiveIds(list);
|
|
|
+ if (files != null && files.size() > 0) {
|
|
|
+ //销毁阿里云上文件
|
|
|
+ List<String> removeFiles = new ArrayList<>();
|
|
|
+ for (ArchiveFile file : files) {
|
|
|
+ if (StringUtils.isNotBlank(file.getFileUrl())){
|
|
|
+ removeFiles.add(FileUtils.getAliYunSubUrl(file.getFileUrl()));
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(file.getPdfFileUrl())){
|
|
|
+ removeFiles.add(FileUtils.getAliYunSubUrl(file.getFileUrl()));
|
|
|
+ }
|
|
|
+
|
|
|
+ //打码的也要删除
|
|
|
+ if (StringUtils.isNotBlank(file.getPdfPageUrl())){
|
|
|
+ removeFiles.add(FileUtils.getAliYunSubUrl(file.getPdfPageUrl()));
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ iossClient.removeFiles(removeFiles);
|
|
|
+ //删除文件
|
|
|
+ List<Long> collect = files.stream().map(file -> file.getId()).collect(Collectors.toList());
|
|
|
+ archiveFileClient.batchDeleteArchiveFile(collect);
|
|
|
+ }
|
|
|
+ //销毁案卷
|
|
|
+ baseMapper.batchDestroyByIds(list);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 检查当前案卷的文件集合是否在规格内,能否开始组卷。
|
|
|
+ * return
|
|
|
+ * 0不能组卷,当前文件入待组卷集合,还能试加文件。
|
|
|
+ * 1可以组卷,当前文件加入待组卷集合后开始组卷。
|
|
|
+ * -1 不可组卷,当前文件不能加入待组卷集合, 待组卷集合要组卷了。
|
|
|
+ * null 程序出错了
|
|
|
+ */
|
|
|
+ private Integer checkSpecificationSize(int SpecificationSize,int archivesSize){
|
|
|
+ //按照当前目录节点的参数(卷盒规格)进行页数组合,
|
|
|
+ // 30MM默认为300页组成一卷、400MM默认为400页组成一卷、50MM默认为500页组成一卷、60MM默认为600组成一卷。
|
|
|
+ //注意:允许组卷上浮区间为100页
|
|
|
+ //意思是如果A\B两个文件进行并卷组卷,总页数规格为300页,但是A+B的文件数为350页,已经超过固定规格,但是上浮区间在100以内,则允许这样组卷。
|
|
|
+ //超过300之后,则不在继续与其他文件进行并卷组卷了。
|
|
|
+ int SpecificationSizeMax =SpecificationSize+100;
|
|
|
+
|
|
|
+ if(archivesSize<SpecificationSize){
|
|
|
+ //小于规格的 返回true ,当前文件加入待组卷集合,还可以试加文件,未到组卷规格
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ if(archivesSize==SpecificationSize){
|
|
|
+ //等于规则的 当前文件加入待组卷集合,待组卷集合可以组卷了。
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ if(archivesSize<=SpecificationSizeMax){
|
|
|
+ //小于等于规格上浮区间,当前文件加入待组卷集合,当前文件集合可以组卷了
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ if(archivesSize>SpecificationSizeMax){
|
|
|
+ //大于规格上浮区间,当前文件不能加入当前待组卷集合,先把当前待组卷集合的文件先组卷完成,清空待组卷集合后再重新计算检查当前文件。
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ArchivesAuto builtArchives(ArchiveTreeContract node,int pageN,int fileN,String startDate,String endDate,String archiveName){
|
|
|
+ ArchivesAuto archivesAuto = new ArchivesAuto();
|
|
|
+ archivesAuto.setProjectId(node.getProjectId());
|
|
|
+ archivesAuto.setContractId(node.getContractId());
|
|
|
+ archivesAuto.setName(archiveName);//案卷题名
|
|
|
+ if(indexMap==null){
|
|
|
+ indexMap=new HashMap<>(); //监理,施工的按合同段分类从0开始依次设置档号,建设单位的没有合同段 就先按一类依次设置
|
|
|
+ }
|
|
|
+
|
|
|
+ ContractInfo nodeContract=null;
|
|
|
+ List<ContractInfo> contracts =null;
|
|
|
+ //获取立卷单位
|
|
|
+ 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(treeCode)){
|
|
|
+ fileNumberSuffix = indexMap.get(treeCode);
|
|
|
+ indexMap.put(treeCode,fileNumberSuffix+1);
|
|
|
+ }else{
|
|
|
+ fileNumberSuffix=1;
|
|
|
+ indexMap.put(treeCode,fileNumberSuffix+1);
|
|
|
+ }
|
|
|
+
|
|
|
+ archivesAuto.setFileNumber(fileNumberSuffix.toString());//档号
|
|
|
+ //archivesAuto.setMicron();//微缩号
|
|
|
+ archivesAuto.setUnit(unit);//立卷单位
|
|
|
+ //archivesAuto.setQuantity();//数量/单位
|
|
|
+
|
|
|
+ archivesAuto.setSpecification(node.getSpecification());//案卷规格 从节点规格获取
|
|
|
+ //archivesAuto.setStartDate(LocalDateTime.parse(startDate));//文件开始时间
|
|
|
+ //archivesAuto.setEndDate(LocalDateTime.parse(endDate));//文件结束时间
|
|
|
+
|
|
|
+ //TODO 保管期限
|
|
|
+ String storageTime = node.getStorageTime();
|
|
|
+ if(StringUtils.isEmpty(storageTime)){
|
|
|
+ //节点没有值,就从合同段获取,没有合同段id的 用业主的合同段
|
|
|
+ Long nodeContractId = archivesAuto.getContractId();
|
|
|
+ if(nodeContractId!=null && nodeContractId!=-1){
|
|
|
+ if(nodeContract==null){
|
|
|
+ nodeContract = contractClient.getContractById(nodeContractId);
|
|
|
+ }
|
|
|
+ storageTime = nodeContract.getStoragePeriod().toString();
|
|
|
+ }else{
|
|
|
+ List<Long> pids= new ArrayList<>();
|
|
|
+ pids.add(archivesAuto.getProjectId());
|
|
|
+ if(contracts==null){
|
|
|
+ contracts = contractClient.queryContractListByIds(pids);
|
|
|
+ }
|
|
|
+ for(ContractInfo c:contracts){
|
|
|
+ if(c.getContractType()==3){
|
|
|
+ storageTime = c.getStoragePeriod().toString();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ archivesAuto.setStorageTime(storageTime);//保管期限 从节点规格获取
|
|
|
+
|
|
|
+ //保密级别 没地方设置 暂留
|
|
|
+ String secretLevel="";
|
|
|
+ if(StringUtils.isEmpty(secretLevel)){
|
|
|
+ //节点没有值,就从合同段获取,没有合同段id的 用业主的合同段
|
|
|
+ Long nodeContractId = archivesAuto.getContractId();
|
|
|
+ if(nodeContractId!=null && nodeContractId!=-1){
|
|
|
+ if(nodeContract==null){
|
|
|
+ nodeContract = contractClient.getContractById(nodeContractId);
|
|
|
+ }
|
|
|
+ if(nodeContract.getSecurityLevel()==null){
|
|
|
+ secretLevel="4";
|
|
|
+ }else{
|
|
|
+ secretLevel = nodeContract.getSecurityLevel().toString();
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ List<Long> pids= new ArrayList<>();
|
|
|
+ pids.add(archivesAuto.getProjectId());
|
|
|
+ if(contracts==null){
|
|
|
+ contracts = contractClient.queryContractListByIds(pids);
|
|
|
+ }
|
|
|
+ for(ContractInfo c:contracts){
|
|
|
+ if(c.getContractType()==3){
|
|
|
+ if(nodeContract.getSecurityLevel()==null){
|
|
|
+ secretLevel="4";
|
|
|
+ }else{
|
|
|
+ secretLevel = c.getSecurityLevel().toString();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ archivesAuto.setSecretLevel(secretLevel);
|
|
|
+
|
|
|
+ //立卷人 从节点规格获取
|
|
|
+ String rollor = node.getRollor();
|
|
|
+ if(StringUtils.isEmpty(rollor)){
|
|
|
+ //节点没有值,就从合同段获取,没有合同段id的 用业主的合同段
|
|
|
+ Long nodeContractId = archivesAuto.getContractId();
|
|
|
+ if(nodeContractId!=null && nodeContractId!=-1){
|
|
|
+ if(nodeContract==null){
|
|
|
+ nodeContract = contractClient.getContractById(nodeContractId);
|
|
|
+ }
|
|
|
+ rollor = nodeContract.getFiler();
|
|
|
+ }else{
|
|
|
+ List<Long> pids= new ArrayList<>();
|
|
|
+ pids.add(archivesAuto.getProjectId());
|
|
|
+ if(contracts==null){
|
|
|
+ contracts = contractClient.queryContractListByIds(pids);
|
|
|
+ }
|
|
|
+ for(ContractInfo c:contracts){
|
|
|
+ if(c.getContractType()==3){
|
|
|
+ rollor = c.getFiler();;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ archivesAuto.setRollor(rollor);
|
|
|
+
|
|
|
+ //审核人 从节点规格获取
|
|
|
+ String reviewer = node.getReviewer();
|
|
|
+ if(StringUtils.isEmpty(reviewer)){
|
|
|
+ //节点没有值,就从合同段获取,没有合同段id的 用业主的合同段
|
|
|
+ Long nodeContractId = archivesAuto.getContractId();
|
|
|
+ if(nodeContractId!=null && nodeContractId!=-1){
|
|
|
+ if(nodeContract==null){
|
|
|
+ nodeContract = contractClient.getContractById(nodeContractId);
|
|
|
+ }
|
|
|
+ reviewer = nodeContract.getReviewer();
|
|
|
+ }else{
|
|
|
+ List<Long> pids= new ArrayList<>();
|
|
|
+ pids.add(archivesAuto.getProjectId());
|
|
|
+ if(contracts==null){
|
|
|
+ contracts = contractClient.queryContractListByIds(pids);
|
|
|
+ }
|
|
|
+ for(ContractInfo c:contracts){
|
|
|
+ if(c.getContractType()==3){
|
|
|
+ reviewer = c.getReviewer();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ archivesAuto.setReviewer(reviewer);
|
|
|
+
|
|
|
+ //载体类型
|
|
|
+ if (node.getStorageType()!= null){
|
|
|
+ archivesAuto.setCarrierType(node.getStorageType().toString());
|
|
|
+ }
|
|
|
+ //archivesAuto.setKeywords();//主题词
|
|
|
+ //archivesAuto.setStorageLocation();//存放位置
|
|
|
+ archivesAuto.setIsArchive(1);//已归档
|
|
|
+ //archivesAuto.setRemark();//备注
|
|
|
+ LocalDateTime now = LocalDateTime.now();
|
|
|
+ LocalDateTime nextday = now.plusDays(1);
|
|
|
+ archivesAuto.setRollDate(now);//立卷日期
|
|
|
+ archivesAuto.setReviewDate(nextday);//审核日期
|
|
|
+
|
|
|
+ archivesAuto.setNodeId(node.getId());//归档树节点
|
|
|
+ archivesAuto.setOutUrl("");//TODO 生成案卷的封面 目录 备考表,背级
|
|
|
+ archivesAuto.setFileN(fileN);//文件数量
|
|
|
+ archivesAuto.setPageN(pageN);//案卷页数
|
|
|
+ //archivesAuto.setMileage();
|
|
|
+ //archivesAuto.setFileType();
|
|
|
+ //archivesAuto.setSize();
|
|
|
+ archivesAuto.setTreeSort(node.getTreeSort());
|
|
|
+ //archivesAuto.setIsOpen();
|
|
|
+ //archivesAuto.setIscheck(0);
|
|
|
+ archivesAuto.setIsAutoFile(0);//是否案卷收集上传的案卷
|
|
|
+ archivesAuto.setIsLock(0);//案卷锁定状态
|
|
|
+ archivesAuto.setIsDeleted(0);
|
|
|
+ baseMapper.insert(archivesAuto);
|
|
|
+ log.debug("组好"+archivesAuto.getName());
|
|
|
+ return archivesAuto;
|
|
|
+ }
|
|
|
+
|
|
|
+ private String getArchiveStartDateAndEndDate(List<ArchiveFile> waitArchiveFiles){
|
|
|
+ //找出文件集合中的最大最小时间
|
|
|
+ List<String> fileTimeList = new ArrayList<>();
|
|
|
+ for(ArchiveFile file:waitArchiveFiles){
|
|
|
+ fileTimeList.add(file.getFileTime());
|
|
|
+ }
|
|
|
+ Collections.sort(fileTimeList);
|
|
|
+ String startDate=fileTimeList.get(0);
|
|
|
+ String endDate=fileTimeList.get(fileTimeList.size()-1);
|
|
|
+ return startDate+","+endDate;
|
|
|
+ }
|
|
|
+
|
|
|
+ private String builtArchiveName(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node,boolean isCrossNode){
|
|
|
+
|
|
|
+ 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 LinkedHashSet<>();
|
|
|
+ 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+node.getArchiveNameSuffix();
|
|
|
+ }
|
|
|
+ private String builtFilePageNo(ArchivesAuto archivesAuto,List<ArchiveFile> waitArchiveFiles){
|
|
|
+ //生成文件对应的页码,返回url
|
|
|
+ archiveAutoPdfService.builtFilePageNo(archivesAuto,waitArchiveFiles);
|
|
|
+ this.updateById(archivesAuto);
|
|
|
+
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 单独组卷规则组卷
|
|
|
+ * @param waitArchiveFiles
|
|
|
+ * @param node 规格参数所在节点
|
|
|
+ * @param pageN
|
|
|
+ */
|
|
|
+ private void createArchive3(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node,int pageN){
|
|
|
+
|
|
|
+ String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
|
|
|
+ String[] split = archiveStartDateAndEndDate.split(",");
|
|
|
+ String startDate= split.length>=1 ?split[0]:"";
|
|
|
+ String endDate=split.length>=2 ?split[1]:"";
|
|
|
+ int fileN =waitArchiveFiles.size();
|
|
|
+
|
|
|
+ String archiveName=builtArchiveName(waitArchiveFiles,node,false);//获取案卷题名
|
|
|
+ //1.创建新案卷
|
|
|
+ ArchivesAuto archivesAuto = builtArchives(node, pageN, fileN,startDate,endDate,archiveName);
|
|
|
+ //2.设置文件所属案卷,组卷状态
|
|
|
+ Long archivesAutoId = archivesAuto.getId();
|
|
|
+
|
|
|
+ //封面和生成文件页码
|
|
|
+ archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(),archivesAuto,waitArchiveFiles);
|
|
|
+
|
|
|
+ builtFilePageNo(archivesAuto,waitArchiveFiles);//生成文件页码
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ for(ArchiveFile file:waitArchiveFiles){
|
|
|
+ file.setArchiveId(archivesAutoId);//设置文件所属案卷
|
|
|
+ file.setIsArchive(1);
|
|
|
+
|
|
|
+ }
|
|
|
+ archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分类并卷组卷
|
|
|
+ * @param waitArchiveFiles
|
|
|
+ * @param archiveAutoGroupId 分类并卷分组ID
|
|
|
+ */
|
|
|
+ private void createArchive2(List<ArchiveFile> waitArchiveFiles, Long archiveAutoGroupId,Long projectId){
|
|
|
+
|
|
|
+ //获取同一分类archiveAutoGroupId下设置的(设置规则时选中的)节点,排好序
|
|
|
+ List<ArchiveTreeContract> selectList=archiveTreeContractClient.getStorageNodeByGroupId(projectId,archiveAutoGroupId);
|
|
|
+ //分类并卷节点默认采用同类型下第一个存储节点为归属节点
|
|
|
+ ArchiveTreeContract node = selectList.get(0);
|
|
|
+ //获取案卷文件起止时间
|
|
|
+ String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
|
|
|
+ String[] split = archiveStartDateAndEndDate.split(",");
|
|
|
+ String startDate= split.length>=1 ?split[0]:"";
|
|
|
+ String endDate=split.length>=2 ?split[1]:"";
|
|
|
+ int fileN =waitArchiveFiles.size();
|
|
|
+ //获取案卷内文件总页数
|
|
|
+ int pageN=0;
|
|
|
+ for(ArchiveFile file:waitArchiveFiles){
|
|
|
+ pageN=pageN+file.getFilePage();
|
|
|
+ }
|
|
|
+ //默认组卷存在跨节点组卷 注意案卷归属节点,案卷命名方式
|
|
|
+ //获取案卷题名
|
|
|
+ String archiveName=builtArchiveName(waitArchiveFiles,node,true);//获取案卷题名
|
|
|
+
|
|
|
+ //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);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认规则组卷
|
|
|
+ * @param waitArchiveFiles
|
|
|
+ * @param pageN
|
|
|
+ */
|
|
|
+ private void createArchive1(List<ArchiveFile> waitArchiveFiles,int pageN){
|
|
|
+
|
|
|
+ //获取案卷文件起止时间
|
|
|
+ String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
|
|
|
+ String[] split = archiveStartDateAndEndDate.split(",");
|
|
|
+ String startDate= split.length>=1 ?split[0]:"";
|
|
|
+ String endDate=split.length>=2 ?split[1]:"";
|
|
|
+ int fileN =waitArchiveFiles.size();
|
|
|
+
|
|
|
+
|
|
|
+ //默认组卷存在跨节点组卷 注意案卷归属节点,案卷命名方式
|
|
|
+ //案卷归属节点为 排第一的文件所属节点
|
|
|
+ ArchiveFile firstFile = waitArchiveFiles.get(0);
|
|
|
+ Long nodeId = Long.parseLong(firstFile.getNodeId());
|
|
|
+ ArchiveTreeContract node = archiveTreeContractClient.getArchiveTreeContractById(nodeId);
|
|
|
+
|
|
|
+ //获取案卷题名
|
|
|
+ String archiveName=builtArchiveName(waitArchiveFiles,node,true);//获取案卷题名
|
|
|
+
|
|
|
+ //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 createArchiveBox(String boxName,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.length>=1 ?split[0]:"";
|
|
|
+ String endDate=split.length>=2 ?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,boxName);
|
|
|
+
|
|
|
+ //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,Map<String,List<ArchiveFile>> boxMap){
|
|
|
+ //步骤1:遍历节点集合
|
|
|
+ for(ArchiveTreeContract node:list){
|
|
|
+ //步骤2:获取当前节点的案卷规格
|
|
|
+ String specificationStr = node.getSpecification();
|
|
|
+ if(StringUtils.isEmpty(specificationStr)){
|
|
|
+ specificationStr="30";
|
|
|
+ }
|
|
|
+ int specification = Integer.parseInt(specificationStr);
|
|
|
+ int specificationSize=specification*10;
|
|
|
+ //步骤3:查询节点下的未组卷文件
|
|
|
+ List<ArchiveFile> archiveFiles = archiveFileClient.getListByNodeID(node.getId().toString());
|
|
|
+ //步骤4:遍历未归档文件
|
|
|
+ //待组卷文件集合
|
|
|
+ List<ArchiveFile> waitArchiveFiles = new ArrayList<>();
|
|
|
+ //待组卷文件总页数
|
|
|
+ int archivesSize=0;
|
|
|
+ if(archiveFiles!=null){
|
|
|
+ int archiveFilesSize=0;
|
|
|
+ for(ArchiveFile file:archiveFiles){
|
|
|
+ archiveFilesSize++;
|
|
|
+ //步骤5:判断文件是否存在分盒设置
|
|
|
+ if(file.getBoxNumber()!=null && file.getBoxNumber()!=-1){
|
|
|
+ //添加到分盒文件集合
|
|
|
+ addBoxMap(file,boxMap);
|
|
|
+ if(archiveFilesSize==archiveFiles.size() && waitArchiveFiles.size()>0){
|
|
|
+ //最后一个文件直接将waitArchiveFiles组卷
|
|
|
+ createArchive3(waitArchiveFiles,node,archivesSize);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ //单独组卷流程
|
|
|
+ //步骤6:计算和判断待组卷文件集合是否达到组卷要求,达到要求创建案卷,案卷归属当前节点,案卷下文件改为已组卷
|
|
|
+ Integer filePage = file.getFilePage();
|
|
|
+ archivesSize=archivesSize+filePage;
|
|
|
+ Integer checkStatus = checkSpecificationSize(specificationSize, archivesSize);
|
|
|
+ //步骤6.1未到规格 不组卷
|
|
|
+ if(checkStatus==0){
|
|
|
+ waitArchiveFiles.add(file);
|
|
|
+ //判断是否最后一个文件
|
|
|
+ if(archiveFilesSize==archiveFiles.size()){
|
|
|
+ //最后一个文件直接将waitArchiveFiles组卷
|
|
|
+ createArchive3(waitArchiveFiles,node,archivesSize);
|
|
|
+ }else{
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //步骤6.2达到规格 可以组一卷
|
|
|
+ if(checkStatus==1){
|
|
|
+ waitArchiveFiles.add(file);
|
|
|
+ //将waitArchiveFiles组卷
|
|
|
+ createArchive3(waitArchiveFiles,node,archivesSize);
|
|
|
+ //将待组卷文件集合,总页数还原初始值,
|
|
|
+ waitArchiveFiles.clear();
|
|
|
+ archivesSize=0;
|
|
|
+ }
|
|
|
+ //步骤6.3超出规格
|
|
|
+ if(checkStatus==-1){
|
|
|
+ //如果waitArchiveFiles集合size>0,先将集合中文件组卷。再将当前文件放入集合
|
|
|
+ if(waitArchiveFiles.size()>0){
|
|
|
+ //将waitArchiveFiles组卷,
|
|
|
+ createArchive3(waitArchiveFiles,node,archivesSize-filePage);
|
|
|
+ //然后将待组卷文件集合,总页数还原初始值,
|
|
|
+ waitArchiveFiles.clear();
|
|
|
+ //保存当前文件进入待组卷集合,待组卷页数=当前文件页数
|
|
|
+ waitArchiveFiles.add(file);
|
|
|
+ archivesSize=filePage;
|
|
|
+
|
|
|
+ //判断是否最后一个文件
|
|
|
+ if(archiveFilesSize==archiveFiles.size()){
|
|
|
+ //如果当前文件最后一个文件直接将waitArchiveFiles组卷
|
|
|
+ createArchive3(waitArchiveFiles,node,archivesSize);
|
|
|
+ waitArchiveFiles.clear();
|
|
|
+ archivesSize=0;
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ //步骤6.3.2如果waitArchiveFiles集合size=0,说明当前文件已经超过规格,直接将当前文件组卷
|
|
|
+ waitArchiveFiles.add(file);
|
|
|
+ //直接将waitArchiveFiles组卷
|
|
|
+ createArchive3(waitArchiveFiles,node,archivesSize);
|
|
|
+ waitArchiveFiles.clear();
|
|
|
+ archivesSize=0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分类并卷组卷 设置分类的节点下只有一个案卷,节点下的所有文件都组成这个案卷。如果设置分类节点(select=1的)多个,案卷归属排序第一个节点。
|
|
|
+ */
|
|
|
+ private void archiveAutoMethod2(List<ArchiveTreeContract> list,Long projectId,Map<String,List<ArchiveFile>> boxMap){
|
|
|
+
|
|
|
+ //分类并卷集合<groupId,List<文件>>
|
|
|
+ Map<Long,List<ArchiveFile>> archiveMap = new HashMap<>();
|
|
|
+ //记录同个分组id的第一个节点ID 案卷归属于这个节点
|
|
|
+ Map<Long,Long> groupId2NodeIdMap = new HashMap<>();
|
|
|
+
|
|
|
+ //步骤1:遍历节点集合
|
|
|
+ for(ArchiveTreeContract node:list) {
|
|
|
+ //根据分组ID来创建唯一案卷
|
|
|
+ Long archiveAutoGroupId=node.getArchiveAutoGroupId();
|
|
|
+ //步骤2:查询节点下的未归档文件
|
|
|
+ List<ArchiveFile> archiveFiles = archiveFileClient.getListByNodeID(node.getId().toString());
|
|
|
+ //步骤3:遍历未归档文件
|
|
|
+ if(archiveFiles!=null){
|
|
|
+ for(ArchiveFile file:archiveFiles){
|
|
|
+ //步骤4:判断文件是否存在分盒设置
|
|
|
+ if(file.getBoxNumber()!=null && file.getBoxNumber()!=-1){
|
|
|
+ //添加到分盒文件集合
|
|
|
+ addBoxMap(file,boxMap);
|
|
|
+ }else{
|
|
|
+ //分类并卷流程
|
|
|
+ //步骤5:将文件按照<groupId,List<文件>>放入集合
|
|
|
+ if(archiveMap.containsKey(archiveAutoGroupId)){
|
|
|
+ List<ArchiveFile> groupList = archiveMap.get(archiveAutoGroupId);
|
|
|
+ groupList.add(file);
|
|
|
+ archiveMap.put(archiveAutoGroupId,groupList);
|
|
|
+ }else{
|
|
|
+ List<ArchiveFile> groupList= new ArrayList<>();
|
|
|
+ groupList.add(file);
|
|
|
+ archiveMap.put(archiveAutoGroupId,groupList);
|
|
|
+ groupId2NodeIdMap.put(archiveAutoGroupId,node.getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //步骤6:按集合创建案卷,每个group类的案卷归属顺序排第一个节点
|
|
|
+ Set<Map.Entry<Long, List<ArchiveFile>>> entries = archiveMap.entrySet();
|
|
|
+ for(Map.Entry<Long, List<ArchiveFile>> entry:entries){
|
|
|
+ Long archiveAutoGroupId = entry.getKey();
|
|
|
+ List<ArchiveFile> archiveFiles = entry.getValue();
|
|
|
+ //一个archiveAutoGroupId组成一个案卷 案卷归属同个key的归档树节点select=1的第一个groupId2NodeIdMap
|
|
|
+ createArchive2(archiveFiles,archiveAutoGroupId,projectId);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认组卷流程 文件可以跨节点组卷,受最高并卷节点限制范围,跨节点文件组卷时,案卷规格按照第一个文件所在的节点规格 组卷。
|
|
|
+ */
|
|
|
+ private void archiveAutoMethod1(List<ArchiveTreeContract> list,Map<String,List<ArchiveFile>> boxMap){
|
|
|
+ //最高并卷节点
|
|
|
+ Long archiveAutoNodeId=null;
|
|
|
+
|
|
|
+ //当前待组卷规格大小
|
|
|
+ int specificationSize=0;
|
|
|
+ //待组卷文件总页数
|
|
|
+ int archivesSize=0;
|
|
|
+ //待组卷文件集合
|
|
|
+ List<ArchiveFile> waitArchiveFiles = new ArrayList<>();
|
|
|
+
|
|
|
+ //步骤1:遍历节点集合
|
|
|
+ int nodeSize=0;
|
|
|
+ for(ArchiveTreeContract node:list){
|
|
|
+ nodeSize++;
|
|
|
+ if(archiveAutoNodeId==null){
|
|
|
+ archiveAutoNodeId=node.getArchiveAutoNodeId();
|
|
|
+ }
|
|
|
+ //当前节点的的archiveAutoNodeId
|
|
|
+ Long archiveAutoNodeId_current = node.getArchiveAutoNodeId();
|
|
|
+
|
|
|
+
|
|
|
+ //步骤2:判断当前节点是否超出最高节点
|
|
|
+ if(!archiveAutoNodeId.equals(archiveAutoNodeId_current)) {
|
|
|
+ //超过最高并卷节点(节点是排序好的,只要不相等就超过了)
|
|
|
+ if(waitArchiveFiles.size()>0){
|
|
|
+ //将待组卷集合里的文件组卷
|
|
|
+ createArchive1(waitArchiveFiles,archivesSize);
|
|
|
+ }
|
|
|
+ waitArchiveFiles.clear();
|
|
|
+ archivesSize=0;
|
|
|
+ archiveAutoNodeId=node.getArchiveAutoNodeId();//更新当前最高并卷节点
|
|
|
+ }
|
|
|
+
|
|
|
+ //步骤3.1:获取节点规格
|
|
|
+ if(waitArchiveFiles.size()==0){
|
|
|
+ //waitArchiveFiles待组卷文件为空时,按当前节点的规格
|
|
|
+ String specificationStr = node.getSpecification();
|
|
|
+ if(StringUtils.isEmpty(specificationStr)){
|
|
|
+ specificationStr="30";
|
|
|
+ }
|
|
|
+ int specification = Integer.parseInt(specificationStr);
|
|
|
+ specificationSize=specification*10;
|
|
|
+ }
|
|
|
+
|
|
|
+ //步骤3.2:查询出当前节点未组卷的文件
|
|
|
+ List<ArchiveFile> archiveFiles = archiveFileClient.getListByNodeID(node.getId().toString());
|
|
|
+ //步骤3.3:遍历未组卷文件
|
|
|
+ int archiveFilesSize=0;
|
|
|
+ for(ArchiveFile file:archiveFiles){
|
|
|
+ archiveFilesSize++;
|
|
|
+ //步骤3.4:判断文件是否存在分盒设置
|
|
|
+ if(file.getBoxNumber()!=null && file.getBoxNumber()!=-1) {
|
|
|
+ //添加到分盒文件集合
|
|
|
+ addBoxMap(file,boxMap);
|
|
|
+ if(nodeSize==list.size() && archiveFilesSize==archiveFiles.size()){
|
|
|
+ //如果当前是最后一个文件直接将waitArchiveFiles组卷
|
|
|
+ createArchive1(waitArchiveFiles,archivesSize);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ //步骤3.5 计算和判断待组卷文件集合是否达到组卷要求,达到要求创建案卷,案卷归属当前节点,案卷下文件改为已组卷
|
|
|
+ Integer filePage = file.getFilePage();
|
|
|
+ archivesSize=archivesSize+filePage;
|
|
|
+ Integer checkStatus = checkSpecificationSize(specificationSize, archivesSize);
|
|
|
+ //步骤3.6未到规格 不组卷
|
|
|
+ if(checkStatus==0){
|
|
|
+ waitArchiveFiles.add(file);
|
|
|
+ //判断是否最后一个节点,最后一个文件
|
|
|
+ if(nodeSize==list.size() && archiveFilesSize==archiveFiles.size()){
|
|
|
+ //直接将waitArchiveFiles待组卷集合组卷,归属集合第一个文件所在节点
|
|
|
+ createArchive1(waitArchiveFiles,archivesSize);
|
|
|
+ //将待组卷文件集合,总页数还原初始值,
|
|
|
+ waitArchiveFiles.clear();
|
|
|
+ archivesSize=0;
|
|
|
+ }else{
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //步骤3.7达到规格 可以组一卷
|
|
|
+ if(checkStatus==1){
|
|
|
+ waitArchiveFiles.add(file);
|
|
|
+ //将waitArchiveFiles待组卷集合组卷,归属集合第一个文件所在节点
|
|
|
+ createArchive1(waitArchiveFiles,archivesSize);
|
|
|
+ //将待组卷文件集合,总页数还原初始值,
|
|
|
+ waitArchiveFiles.clear();
|
|
|
+ archivesSize=0;
|
|
|
+
|
|
|
+ String specificationStr = node.getSpecification();
|
|
|
+ if(StringUtils.isEmpty(specificationStr)){
|
|
|
+ specificationStr="30";
|
|
|
+ }
|
|
|
+ int specification = Integer.parseInt(specificationStr);
|
|
|
+ specificationSize=specification*10;//更新specificationSize待组卷规格为 当前节点的组卷规格
|
|
|
+ }
|
|
|
+ //步骤3.8超出规格
|
|
|
+ if(checkStatus==-1){
|
|
|
+ //步骤3.9如果waitArchiveFiles集合size>0,先将集合中文件组卷。再将当前文件加入集合
|
|
|
+ if(waitArchiveFiles.size()>0){
|
|
|
+ //3.9.1 将waitArchiveFiles组卷,归属集合第一个文件所在节点
|
|
|
+ createArchive1(waitArchiveFiles,archivesSize);
|
|
|
+ //将待组卷文件集合,总页数还原初始值,
|
|
|
+ waitArchiveFiles.clear();
|
|
|
+ //3.9.2保存当前文件进入待组卷集合,
|
|
|
+ waitArchiveFiles.add(file);
|
|
|
+ //3.9.3待组卷页数=当前文件页数
|
|
|
+ archivesSize=filePage;
|
|
|
+
|
|
|
+ String specificationStr = node.getSpecification();
|
|
|
+ if(StringUtils.isEmpty(specificationStr)){
|
|
|
+ specificationStr="30";
|
|
|
+ }
|
|
|
+ int specification = Integer.parseInt(specificationStr);
|
|
|
+ specificationSize=specification*10;//更新specificationSize待组卷规格为 当前节点的组卷规格
|
|
|
+
|
|
|
+ //3.9.4 判断当前文件是不是最后一个节点,最后一个文件
|
|
|
+ if(nodeSize==list.size() && archiveFilesSize==archiveFiles.size()){
|
|
|
+ //最后一个文件再将waitArchiveFiles组卷
|
|
|
+ createArchive1(waitArchiveFiles,archivesSize);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ //步骤3.10 如果waitArchiveFiles集合size=0,说明当前文件已经超过规格,直接将当前文件组卷
|
|
|
+ waitArchiveFiles.add(file);
|
|
|
+ //直接将waitArchiveFiles组卷
|
|
|
+ createArchive1(waitArchiveFiles,archivesSize);
|
|
|
+ waitArchiveFiles.clear();
|
|
|
+ archivesSize=0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分盒组卷流程
|
|
|
+ * @param boxMap
|
|
|
+ */
|
|
|
+ private void archiveAutoMethodBox(Map<String,List<ArchiveFile>> boxMap){
|
|
|
+ Set<Map.Entry<String, List<ArchiveFile>>> entries = boxMap.entrySet();
|
|
|
+ for (Map.Entry<String, List<ArchiveFile>> entry:entries){
|
|
|
+ //一个分盒一个案卷 归属第一个文件所在节点
|
|
|
+ createArchiveBox(entry.getKey(),entry.getValue());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询案卷,排序
|
|
|
+ * @param ids
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public List<ArchivesAuto> findArchivesAutosByIds(List<Long> ids) {
|
|
|
+ QueryWrapper<ArchivesAuto> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.in("node_id", ids)
|
|
|
+ .eq("is_deleted",0)
|
|
|
+ .eq("is_archive",1)
|
|
|
+ .ne("is_auto_file",1)
|
|
|
+ .orderByAsc("tree_sort")
|
|
|
+ .orderByAsc("auto_file_sort")
|
|
|
+ .orderByAsc("file_number");
|
|
|
+
|
|
|
+ return this.list(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 不重组的情况下刷新档号
|
|
|
+ * projectId 为当前项目
|
|
|
+ * contractId 为客户端当前选定的合同段
|
|
|
+ * nodeId 为左侧树选定的节点i
|
|
|
+ * 规则,1. 合同段ID为空,则不过滤
|
|
|
+ * 2. 业主或者管理员,treeCode为空,则按照nodeid过滤,nodeid为空,则不过滤
|
|
|
+ * 3. 合同段用户,安装找contractId过滤,过滤该合同段所有节点。
|
|
|
+ * @param projectId
|
|
|
+ * @param contractId
|
|
|
+ * @param nodeId
|
|
|
+ */
|
|
|
+ public void refreshFileNumberNoSlipt(Long projectId,Long contractId,Long nodeId) {
|
|
|
+ List<ArchiveTreeContract> list = archiveTreeContractClient.getListByProjectId(projectId);
|
|
|
+ this.refreshFileNumberNoSlipt(list,contractId,nodeId);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @param archiveTreeContracts
|
|
|
+ * @param contractId
|
|
|
+ * @param nodeId
|
|
|
+ */
|
|
|
+ public void refreshFileNumberNoSlipt(List<ArchiveTreeContract> archiveTreeContracts,Long contractId,Long nodeId) {
|
|
|
+
|
|
|
+ List<ArchiveTreeContractVO2> subTreeList = new ArrayList<>();
|
|
|
+ List<List<ArchiveTreeContract>> subGroupedList = new ArrayList<>();
|
|
|
+ ArchiveTreeUtil.getGroupedList(archiveTreeContracts,subTreeList,subGroupedList);
|
|
|
+ Integer index = 1;
|
|
|
+
|
|
|
+ List<ArchivesAuto> changeList = new ArrayList<>();
|
|
|
+
|
|
|
+ //分组,分程 建设单位,各个合同段,电子单位等
|
|
|
+ for (List<ArchiveTreeContract> subList: subGroupedList) {
|
|
|
+ List<Long> ids = subList.stream()
|
|
|
+ .map(ArchiveTreeContract::getId)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ //todo 后续根据 authFilter函数过滤
|
|
|
+
|
|
|
+ subList = authFilter(subList,contractId,nodeId);
|
|
|
+
|
|
|
+ index =1;
|
|
|
+ List<ArchivesAuto> archivesAutos = findArchivesAutosByIds(ids);
|
|
|
+ if (archivesAutos == null || archivesAutos.size() == 0) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //准备节点id-节点档号前缀Map
|
|
|
+ Map<String,String> node_fileNumberPrefixMap= new HashMap<>();
|
|
|
+ for(ArchiveTreeContract node:subList){
|
|
|
+ node_fileNumberPrefixMap.put(node.getId().toString(),node.getFileNumberPrefix());
|
|
|
+ }
|
|
|
+
|
|
|
+ for (ArchivesAuto archivesAuto: archivesAutos) {
|
|
|
+ String nodeId1 = archivesAuto.getNodeId().toString();
|
|
|
+ String fileNumberPrefix ="";
|
|
|
+ if(node_fileNumberPrefixMap.containsKey(nodeId1)){
|
|
|
+ fileNumberPrefix=node_fileNumberPrefixMap.get(nodeId1);
|
|
|
+ if(StringUtils.isEmpty(fileNumberPrefix)){
|
|
|
+ //节点没有值,就从合同段获取,没有合同段id的 用业主的合同段
|
|
|
+ Long nodeContractId = archivesAuto.getContractId();
|
|
|
+ if(nodeContractId!=null){
|
|
|
+ ContractInfo nodeContract = contractClient.getContractById(nodeContractId);
|
|
|
+ fileNumberPrefix = nodeContract.getPrefix();
|
|
|
+ }else{
|
|
|
+ List<Long> pids= new ArrayList<>();
|
|
|
+ pids.add(archivesAuto.getProjectId());
|
|
|
+ List<ContractInfo> contracts = contractClient.queryContractListByIds(pids);
|
|
|
+ for(ContractInfo c:contracts){
|
|
|
+ if(c.getContractType()==3){
|
|
|
+ fileNumberPrefix = c.getPrefix();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ String fileNumber = fileNumberPrefix +"_"+ index;
|
|
|
+ if (archiveAutoPdfService.refreshFileNumber(archivesAuto,fileNumber)){
|
|
|
+ changeList.add(archivesAuto);
|
|
|
+ }
|
|
|
+ index++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.updateBatchById(changeList);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取案卷合成pdf文件
|
|
|
+ * @param archiveId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public String getMergeArchivesFile(Long archiveId){
|
|
|
+ String url = "";
|
|
|
+
|
|
|
+ List<String> urlList= new ArrayList<>();//合成pdf集合
|
|
|
+
|
|
|
+ ArchivesAuto archivesAuto = this.getById(archiveId);
|
|
|
+
|
|
|
+ //判断archivesAuto是否为空
|
|
|
+ if (archivesAuto == null){
|
|
|
+ return url;
|
|
|
+ }
|
|
|
+ String outUrl = archivesAuto.getOutUrl();
|
|
|
+ //判断outUrl是否为空
|
|
|
+ String[] frontUrls = null;
|
|
|
+ if (StringUtils.isNotEmpty(outUrl)){
|
|
|
+ frontUrls = outUrl.split(",");
|
|
|
+ }
|
|
|
+
|
|
|
+ ArchiveProjectConfig config = archiveProjectConfigService.getByProjectIdOrNew(archivesAuto.getProjectId());
|
|
|
+
|
|
|
+ // 根据 factorType 字符串生成档案号码字符串链表
|
|
|
+ String front = "";
|
|
|
+ String cataLog = "";
|
|
|
+ String spare = "";
|
|
|
+ String back = "";
|
|
|
+
|
|
|
+
|
|
|
+ if(frontUrls != null ) {
|
|
|
+ for (String frontUrl : frontUrls) {
|
|
|
+ if (frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[0]) && config.getFactorType().contains("1")) {
|
|
|
+ front = frontUrl;
|
|
|
+ } else if (frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[1]) && config.getFactorType().contains("2")) {
|
|
|
+ cataLog = frontUrl;
|
|
|
+ } else if (frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[2]) && config.getFactorType().contains("3")) {
|
|
|
+ spare = frontUrl;
|
|
|
+ } else if (frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[3]) && config.getFactorType().contains("4")) {
|
|
|
+ back = frontUrl;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ List<String> fileUrls =new ArrayList<>();
|
|
|
+ if (!archivesAuto.isMedia()) {
|
|
|
+ List<ArchiveFile> result = this.archiveFileClient.getArchiveFileByArchivesId(archivesAuto.getId().toString(),"");
|
|
|
+ if(result != null && result.size() > 0){
|
|
|
+ //循环访问result,如果pdfpageurl不为空则取出,否则取pdffileurl
|
|
|
+ for (ArchiveFile archiveFile : result) {
|
|
|
+ String pdfPageUrl = archiveFile.getPdfPageUrl();
|
|
|
+ if (StringUtils.isEmpty(pdfPageUrl)) {
|
|
|
+ fileUrls.add(archiveFile.getPdfFileUrl());
|
|
|
+ }else{
|
|
|
+ fileUrls.add(pdfPageUrl);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (fileUrls.size() > 0){
|
|
|
+ //此处暂时这么处理,等oss上传接口里文件名可以区分后,再单独取
|
|
|
// if (frontUrls != null && frontUrls.length > 3){
|
|
|
//
|
|
|
// urlList.add(frontUrls[0]);
|
|
|
// urlList.add(frontUrls[1]);
|
|
|
// }
|
|
|
- if (StringUtils.isNotEmpty(front)) {
|
|
|
- urlList.add(front);
|
|
|
- }
|
|
|
+ if (StringUtils.isNotEmpty(front)) {
|
|
|
+ urlList.add(front);
|
|
|
+ }
|
|
|
|
|
|
- if (StringUtils.isNotEmpty(cataLog)) {
|
|
|
- urlList.add(cataLog);
|
|
|
- }
|
|
|
+ if (StringUtils.isNotEmpty(cataLog)) {
|
|
|
+ urlList.add(cataLog);
|
|
|
+ }
|
|
|
|
|
|
- urlList.addAll(fileUrls);
|
|
|
+ urlList.addAll(fileUrls);
|
|
|
|
|
|
// if (frontUrls != null && frontUrls.length > 3){
|
|
|
// urlList.add(frontUrls[2]);
|
|
|
// urlList.add(frontUrls[3]);
|
|
|
// }
|
|
|
- if (StringUtils.isNotEmpty(spare)) {
|
|
|
- urlList.add(spare);
|
|
|
- }
|
|
|
-
|
|
|
- if (StringUtils.isNotEmpty(back)) {
|
|
|
- urlList.add(back);
|
|
|
- }
|
|
|
- String fileName = SnowFlakeUtil.getId().toString();
|
|
|
- url = archiveAutoPdfService.MergePdfAndUpload(urlList, fileName, null, archivesAuto.getProjectId());
|
|
|
- }
|
|
|
- return url;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 拆卷
|
|
|
- *
|
|
|
- * @param ids
|
|
|
- * @return
|
|
|
- */
|
|
|
- public boolean slipt(String ids) {
|
|
|
-
|
|
|
- List orgIds = Func.toLongList(ids);
|
|
|
-
|
|
|
- List<String> strIds = new ArrayList<>();
|
|
|
- List<Long> lIds = new ArrayList<>();
|
|
|
-
|
|
|
- //排除锁定的和单文件案卷这种
|
|
|
- List<ArchivesAuto> archivesAutos = this.listByIds(orgIds);
|
|
|
- for (ArchivesAuto ar : archivesAutos) {
|
|
|
- if (ar.getIsLock() != null && ar.getIsLock() == 1) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- if (ar.getIsAutoFile() != null && ar.getIsAutoFile() == 1) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- lIds.add(ar.getId());
|
|
|
- strIds.add(ar.getId().toString());
|
|
|
- }
|
|
|
-
|
|
|
- //更新
|
|
|
- List<ArchiveFile> files = archiveFileClient.getAllArchiveFileByArchiveIds(strIds);
|
|
|
- List<String> removeFiles = new ArrayList<>();
|
|
|
- if (files != null && files.size() > 0) {
|
|
|
-
|
|
|
- List<Long> fids = files.stream()
|
|
|
- .map(ArchiveFile::getId)
|
|
|
- .collect(Collectors.toList());
|
|
|
- baseMapper.splitFiles(fids);
|
|
|
-
|
|
|
- //删除打码文件
|
|
|
- for (ArchiveFile file : files) {
|
|
|
- //打码的也要删除
|
|
|
- if (StringUtils.isNotBlank(file.getPdfPageUrl())) {
|
|
|
- removeFiles.add(FileUtils.getAliYunSubUrl(file.getPdfPageUrl()));
|
|
|
- }
|
|
|
- }
|
|
|
- iossClient.removeFiles(removeFiles);
|
|
|
- }
|
|
|
-
|
|
|
- //删除案卷
|
|
|
- return this.deleteLogic(lIds);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 从案卷删除文件,兵重新生成封面和打码文件
|
|
|
- *
|
|
|
- * @param ids
|
|
|
- * @return
|
|
|
- */
|
|
|
- public boolean removeFiles(String ids, Long archiveId) {
|
|
|
- List<Long> fids = Func.toLongList(ids);
|
|
|
-
|
|
|
-
|
|
|
- ArchivesAuto archivesAuto = this.getById(archiveId);
|
|
|
-
|
|
|
- List<String> strIds = new ArrayList<>();
|
|
|
- strIds.add(archiveId.toString());
|
|
|
- List<ArchiveFile> files = archiveFileClient.getAllArchiveFileByArchiveIds(strIds);
|
|
|
- List<ArchiveFile> waitArchiveFiles = new ArrayList<>();
|
|
|
- if (files != null && files.size() > 0) {
|
|
|
- List<String> removeFiles = new ArrayList<>();
|
|
|
- for (ArchiveFile file : files) {
|
|
|
-
|
|
|
- if (StringUtils.isNotBlank(file.getPdfPageUrl())) {
|
|
|
- removeFiles.add(FileUtils.getAliYunSubUrl(file.getPdfPageUrl()));
|
|
|
- }
|
|
|
-
|
|
|
- if (!fids.contains(file.getId())) {
|
|
|
- waitArchiveFiles.add(file);
|
|
|
- }
|
|
|
- }
|
|
|
- //删除文件
|
|
|
- iossClient.removeFiles(removeFiles);
|
|
|
-
|
|
|
- //删除不用的案卷
|
|
|
- if (fids.size() > 0) {
|
|
|
- baseMapper.splitFiles(fids);
|
|
|
- }
|
|
|
-
|
|
|
- Long archivesAutoId = archivesAuto.getId();
|
|
|
-
|
|
|
- //封面和生成文件页码
|
|
|
- archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(), archivesAuto, waitArchiveFiles);
|
|
|
-
|
|
|
- builtFilePageNo(archivesAuto, waitArchiveFiles);//生成文件页码
|
|
|
-
|
|
|
- for (ArchiveFile file : waitArchiveFiles) {
|
|
|
- file.setArchiveId(archivesAutoId);//设置文件所属案卷
|
|
|
- file.setIsArchive(1);
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- //保存
|
|
|
- this.updateById(archivesAuto);
|
|
|
- archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- /**
|
|
|
- * 施工则返回“C”,监理则返回“S”,其他返回“”
|
|
|
- *
|
|
|
- * @return
|
|
|
- */
|
|
|
- public String getAuthCode(Long contractId) {
|
|
|
- String code = "";
|
|
|
- BladeUser bladeUser = AuthUtil.getUser();
|
|
|
- if (AuthUtil.isAdministrator() || contractId == null) {
|
|
|
- return code;
|
|
|
- }
|
|
|
-
|
|
|
- //查询合同段信息
|
|
|
- ContractInfo contractInfo = contractClient.getContractById(contractId);
|
|
|
- switch (contractInfo.getContractType()) {
|
|
|
- case 2:
|
|
|
- code = "S";
|
|
|
- break;
|
|
|
- case 3:
|
|
|
- code = "";
|
|
|
- break;
|
|
|
- default:
|
|
|
- code = "C";
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- return code;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 带权限筛选的档案列表筛选函数
|
|
|
- * 规则,1. 合同段ID为空,则不过滤
|
|
|
- * 2. 业主或者管理员,treeCode为空,则按照nodeid过滤,nodeid为空,则不过滤
|
|
|
- * 3. 合同段用户,安装找contractId过滤,过滤该合同段所有节点。
|
|
|
- *
|
|
|
- * @param archiveTreeContracts 档案列表archiveTreeContracts
|
|
|
- * @param contractId 合同编号,用于获取权限码
|
|
|
- * @param nodeId 筛选条件:节点编号
|
|
|
- * @return 符合条件的档案列表
|
|
|
- */
|
|
|
- public List<ArchiveTreeContract> authFilter(List<ArchiveTreeContract> archiveTreeContracts, Long contractId, Long nodeId) {
|
|
|
- //合同段ID为空则全部返回
|
|
|
- if (contractId == null) {
|
|
|
- return archiveTreeContracts;
|
|
|
- }
|
|
|
-
|
|
|
- String treeCode = getAuthCode(contractId);
|
|
|
- String strNodeId = "";
|
|
|
- if (nodeId != null) {
|
|
|
- ArchiveTreeContract node = archiveTreeContractClient.getArchiveTreeContractById(nodeId);
|
|
|
- strNodeId = nodeId.toString();
|
|
|
- if (node.getContractId() == null || node.getContractId() == -1) {
|
|
|
- treeCode = "";
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return archiveTreeContractFilter(archiveTreeContracts, treeCode, strNodeId, contractId);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 对档案列表进行筛选
|
|
|
- *
|
|
|
- * @param archiveTreeContracts 档案列表
|
|
|
- * @param treeCode 筛选条件:权限码
|
|
|
- * @param nodeId 筛选条件:节点编号
|
|
|
- * @return 符合条件的档案列表
|
|
|
- */
|
|
|
- public List<ArchiveTreeContract> archiveTreeContractFilter(List<ArchiveTreeContract> archiveTreeContracts, String treeCode, String nodeId, Long contractId) {
|
|
|
- List<ArchiveTreeContract> result = new ArrayList<>();
|
|
|
-
|
|
|
- if (StringUtils.isEmpty(treeCode) && StringUtils.isEmpty(nodeId)) {
|
|
|
- return archiveTreeContracts;
|
|
|
- }
|
|
|
-
|
|
|
- for (ArchiveTreeContract contract : archiveTreeContracts) {
|
|
|
- if (StringUtils.isEmpty(treeCode)) {
|
|
|
- if (StringUtils.isNotEmpty(contract.getAncestors()) && contract.getAncestors().contains(nodeId)) {
|
|
|
- result.add(contract);
|
|
|
- }
|
|
|
- } else {
|
|
|
- if (treeCode.equals(contract.getTreeCode()) || contractId.toString().equals(contract.getTreeCode())) {
|
|
|
- result.add(contract);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- public void test() {
|
|
|
- String ids = "1654406079229165569";
|
|
|
-
|
|
|
- List<Long> fids = Func.toLongList(ids);
|
|
|
-
|
|
|
-
|
|
|
- LambdaQueryWrapper<ArchiveFile> wrapper = Wrappers.lambdaQuery();
|
|
|
- wrapper.in(ArchiveFile::getId, fids);
|
|
|
-
|
|
|
- // 调用 listWrappers() 方法来获取符合条件的 ArchiveFile 对象列表
|
|
|
- List<ArchiveFile> files = archiveFileClient.listbyIds(fids);
|
|
|
- System.out.println();
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<DictBiz> getCarrierTypeByDict() {
|
|
|
- return autoMapper.getCarrierTypeByDict();
|
|
|
- }
|
|
|
+ if (StringUtils.isNotEmpty(spare)) {
|
|
|
+ urlList.add(spare);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (StringUtils.isNotEmpty(back)) {
|
|
|
+ urlList.add(back);
|
|
|
+ }
|
|
|
+ String fileName = SnowFlakeUtil.getId().toString();
|
|
|
+ url = archiveAutoPdfService.MergePdfAndUpload(urlList,fileName,null,archivesAuto.getProjectId());
|
|
|
+ }
|
|
|
+ return url;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 拆卷
|
|
|
+ * @param ids
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public boolean slipt(String ids) {
|
|
|
+
|
|
|
+ List orgIds = Func.toLongList(ids);
|
|
|
+
|
|
|
+ List<String> strIds = new ArrayList<>();
|
|
|
+ List<Long> lIds = new ArrayList<>();
|
|
|
+
|
|
|
+ //排除锁定的和单文件案卷这种
|
|
|
+ List<ArchivesAuto> archivesAutos = this.listByIds(orgIds);
|
|
|
+ for (ArchivesAuto ar: archivesAutos) {
|
|
|
+ if (ar.getIsLock()!= null && ar.getIsLock() == 1) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (ar.getIsAutoFile()!= null && ar.getIsAutoFile() == 1) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ lIds.add(ar.getId());
|
|
|
+ strIds.add(ar.getId().toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ //更新
|
|
|
+ List<ArchiveFile> files = archiveFileClient.getAllArchiveFileByArchiveIds(strIds);
|
|
|
+ List<String> removeFiles = new ArrayList<>();
|
|
|
+ if (files != null && files.size() > 0) {
|
|
|
+
|
|
|
+ List<Long> fids = files.stream()
|
|
|
+ .map(ArchiveFile::getId)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ baseMapper.splitFiles(fids);
|
|
|
+
|
|
|
+ //删除打码文件
|
|
|
+ for (ArchiveFile file : files) {
|
|
|
+ //打码的也要删除
|
|
|
+ if (StringUtils.isNotBlank(file.getPdfPageUrl())){
|
|
|
+ removeFiles.add(FileUtils.getAliYunSubUrl(file.getPdfPageUrl()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ iossClient.removeFiles(removeFiles);
|
|
|
+ }
|
|
|
+
|
|
|
+ //删除案卷
|
|
|
+ return this.deleteLogic(lIds);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 从案卷删除文件,兵重新生成封面和打码文件
|
|
|
+ * @param ids
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public boolean removeFiles(String ids,Long archiveId) {
|
|
|
+ List<Long> fids = Func.toLongList(ids);
|
|
|
+
|
|
|
+
|
|
|
+ ArchivesAuto archivesAuto = this.getById(archiveId);
|
|
|
+
|
|
|
+ List<String> strIds = new ArrayList<>();
|
|
|
+ strIds.add(archiveId.toString());
|
|
|
+ List<ArchiveFile> files = archiveFileClient.getAllArchiveFileByArchiveIds(strIds);
|
|
|
+ List<ArchiveFile> waitArchiveFiles = new ArrayList<>();
|
|
|
+ if (files != null && files.size() > 0) {
|
|
|
+ List<String> removeFiles = new ArrayList<>();
|
|
|
+ for (ArchiveFile file : files) {
|
|
|
+
|
|
|
+ if (StringUtils.isNotBlank(file.getPdfPageUrl())){
|
|
|
+ removeFiles.add(FileUtils.getAliYunSubUrl(file.getPdfPageUrl()));
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!fids.contains(file.getId())) {
|
|
|
+ waitArchiveFiles.add(file);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //删除文件
|
|
|
+ iossClient.removeFiles(removeFiles);
|
|
|
+
|
|
|
+ //删除不用的案卷
|
|
|
+ if (fids.size() > 0) {
|
|
|
+ baseMapper.splitFiles(fids);
|
|
|
+ }
|
|
|
+
|
|
|
+ Long archivesAutoId = archivesAuto.getId();
|
|
|
+
|
|
|
+ //封面和生成文件页码
|
|
|
+ archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(),archivesAuto,waitArchiveFiles);
|
|
|
+
|
|
|
+ builtFilePageNo(archivesAuto,waitArchiveFiles);//生成文件页码
|
|
|
+
|
|
|
+ for(ArchiveFile file:waitArchiveFiles){
|
|
|
+ file.setArchiveId(archivesAutoId);//设置文件所属案卷
|
|
|
+ file.setIsArchive(1);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //保存
|
|
|
+ this.updateById(archivesAuto);
|
|
|
+ archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 施工则返回“C”,监理则返回“S”,其他返回“”
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public String getAuthCode(Long contractId) {
|
|
|
+ String code ="";
|
|
|
+ BladeUser bladeUser = AuthUtil.getUser();
|
|
|
+ if (AuthUtil.isAdministrator() || contractId == null) {
|
|
|
+ return code;
|
|
|
+ }
|
|
|
+
|
|
|
+ //查询合同段信息
|
|
|
+ ContractInfo contractInfo = contractClient.getContractById(contractId);
|
|
|
+ switch (contractInfo.getContractType()){
|
|
|
+ case 2:
|
|
|
+ code = "S";
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ code = "";
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ code = "C";
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return code;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 带权限筛选的档案列表筛选函数
|
|
|
+ * 规则,1. 合同段ID为空,则不过滤
|
|
|
+ * 2. 业主或者管理员,treeCode为空,则按照nodeid过滤,nodeid为空,则不过滤
|
|
|
+ * 3. 合同段用户,安装找contractId过滤,过滤该合同段所有节点。
|
|
|
+ * @param archiveTreeContracts 档案列表archiveTreeContracts
|
|
|
+ * @param contractId 合同编号,用于获取权限码
|
|
|
+ * @param nodeId 筛选条件:节点编号
|
|
|
+ * @return 符合条件的档案列表
|
|
|
+ */
|
|
|
+ public List<ArchiveTreeContract> authFilter(List<ArchiveTreeContract> archiveTreeContracts, Long contractId, Long nodeId) {
|
|
|
+ //合同段ID为空则全部返回
|
|
|
+ if (contractId == null) {
|
|
|
+ return archiveTreeContracts;
|
|
|
+ }
|
|
|
+
|
|
|
+ String treeCode = getAuthCode(contractId);
|
|
|
+ String strNodeId = "";
|
|
|
+ if (nodeId!= null) {
|
|
|
+ ArchiveTreeContract node = archiveTreeContractClient.getArchiveTreeContractById(nodeId);
|
|
|
+ strNodeId = nodeId.toString();
|
|
|
+ if(node.getContractId()==null || node.getContractId()==-1){
|
|
|
+ treeCode="";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return archiveTreeContractFilter(archiveTreeContracts, treeCode, strNodeId,contractId);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 对档案列表进行筛选
|
|
|
+ * @param archiveTreeContracts 档案列表
|
|
|
+ * @param treeCode 筛选条件:权限码
|
|
|
+ * @param nodeId 筛选条件:节点编号
|
|
|
+ * @return 符合条件的档案列表
|
|
|
+ */
|
|
|
+ public List<ArchiveTreeContract> archiveTreeContractFilter(List<ArchiveTreeContract> archiveTreeContracts, String treeCode, String nodeId,Long contractId) {
|
|
|
+ List<ArchiveTreeContract> result = new ArrayList<>();
|
|
|
+
|
|
|
+ if (StringUtils.isEmpty(treeCode) && StringUtils.isEmpty(nodeId)) {
|
|
|
+ return archiveTreeContracts;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (ArchiveTreeContract contract : archiveTreeContracts) {
|
|
|
+ if (StringUtils.isEmpty(treeCode)) {
|
|
|
+ if (StringUtils.isNotEmpty(contract.getAncestors()) && contract.getAncestors().contains(nodeId)) {
|
|
|
+ result.add(contract);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (treeCode.equals(contract.getTreeCode()) || contractId.toString().equals(contract.getTreeCode())) {
|
|
|
+ result.add(contract);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void test(){
|
|
|
+ String ids = "1654406079229165569";
|
|
|
+
|
|
|
+ List<Long> fids = Func.toLongList(ids);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ LambdaQueryWrapper<ArchiveFile> wrapper = Wrappers.lambdaQuery();
|
|
|
+ wrapper.in(ArchiveFile::getId, fids);
|
|
|
+
|
|
|
+ // 调用 listWrappers() 方法来获取符合条件的 ArchiveFile 对象列表
|
|
|
+ List<ArchiveFile> files = archiveFileClient.listbyIds(fids);
|
|
|
+ System.out.println();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<DictBiz> getCarrierTypeByDict() {
|
|
|
+ return autoMapper.getCarrierTypeByDict();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<User> getArchiveDestroyUser() {
|
|
|
+ return autoMapper.getArchiveDestroyUser();
|
|
|
+ }
|
|
|
|
|
|
|
|
|
}
|