归档功能完善
This commit is contained in:
+8
-6
@@ -278,15 +278,17 @@ public class ContractLaunchController {
|
||||
* 合同归档。
|
||||
*
|
||||
* 合同全生命周期最后一步,状态变为 completed(已完成)。
|
||||
* 同时将归档信息推送到法务系统存档(TODO:联调时打开 settlementPushService.pushArchive 调用)。
|
||||
* 同时将归档信息按数据采集 V3.0 的合同归档接口推送到法务系统存档
|
||||
* (TODO:联调时打开 dataCollectionPushService.collectContractArchive 调用)。
|
||||
*
|
||||
* 请求体 ContractLaunchArchiveDto 字段:
|
||||
* archiveKeeper - 档案保管人手机号
|
||||
* archiveKeeperUnit - 档案保管单位名称
|
||||
* archiveKeeperUnitCode - 档案保管单位编码
|
||||
* archiveFiles - 归档附件列表
|
||||
* archiveReceiveDept - 合同归档接收部门编码
|
||||
* archiveTransferor - 移交人账号
|
||||
* archivePapers - 纸质档案材料列表
|
||||
* archiveEles - 电子档案材料列表(含 approvalAttachs)
|
||||
*
|
||||
* 归档附件自动保存到 file 子表(fileCategory = "archive")。
|
||||
* 归档附件自动保存到 file 子表(fileCategory = "archive"),
|
||||
* 纸质/电子档案明细分别保存到独立子表。
|
||||
*
|
||||
* 对应前端功能:归档按钮 → 合同完结
|
||||
*/
|
||||
|
||||
@@ -16,15 +16,15 @@ public class ContractLaunchArchiveDto implements Serializable {
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/** 档案保管人手机号 */
|
||||
private String archiveKeeper;
|
||||
/** 合同归档接收部门编码 */
|
||||
private String archiveReceiveDept;
|
||||
|
||||
/** 档案保管单位名称 */
|
||||
private String archiveKeeperUnit;
|
||||
/** 移交人账号 */
|
||||
private String archiveTransferor;
|
||||
|
||||
/** 档案保管单位编码 */
|
||||
private String archiveKeeperUnitCode;
|
||||
/** 纸质档案材料 */
|
||||
private List<ContractLaunchArchivePaperDto> archivePapers = new ArrayList<>();
|
||||
|
||||
/** 归档附件列表(纸质或电子档案材料) */
|
||||
private List<ContractLaunchFileDto> archiveFiles = new ArrayList<>();
|
||||
/** 电子档案材料 */
|
||||
private List<ContractLaunchArchiveEleDto> archiveEles = new ArrayList<>();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
package com.nbport.zgwl.contractlaunch.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 归档电子档案材料
|
||||
*/
|
||||
@Data
|
||||
public class ContractLaunchArchiveEleDto implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Long id;
|
||||
|
||||
private Long contractId;
|
||||
|
||||
/** 档案名称 */
|
||||
private String archivesName;
|
||||
|
||||
private Integer sortOrder;
|
||||
|
||||
private String remark;
|
||||
|
||||
/** 电子档案附件 */
|
||||
private List<ContractLaunchFileDto> approvalAttachs = new ArrayList<>();
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package com.nbport.zgwl.contractlaunch.dto;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* 归档纸质档案材料
|
||||
*/
|
||||
@Data
|
||||
public class ContractLaunchArchivePaperDto implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Long id;
|
||||
|
||||
private Long contractId;
|
||||
|
||||
/** 档案名称 */
|
||||
private String archivesName;
|
||||
|
||||
/** 份数 */
|
||||
private String archivesNum;
|
||||
|
||||
/** 归档时间 */
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||
private LocalDateTime archivesTime;
|
||||
|
||||
private Integer sortOrder;
|
||||
|
||||
private String remark;
|
||||
}
|
||||
@@ -302,13 +302,19 @@ public class ContractLaunchDto implements Serializable {
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||
private LocalDateTime archiveDate;
|
||||
|
||||
/** 档案保管人手机号 */
|
||||
/** 合同归档接收部门编码 */
|
||||
private String archiveReceiveDept;
|
||||
|
||||
/** 移交人账号 */
|
||||
private String archiveTransferor;
|
||||
|
||||
/** 档案保管人手机号(兼容旧归档实现保留) */
|
||||
private String archiveKeeper;
|
||||
|
||||
/** 档案保管单位 */
|
||||
/** 档案保管单位(兼容旧归档实现保留) */
|
||||
private String archiveKeeperUnit;
|
||||
|
||||
/** 档案保管单位编码 */
|
||||
/** 档案保管单位编码(兼容旧归档实现保留) */
|
||||
private String archiveKeeperUnitCode;
|
||||
|
||||
// ==================== 业务扩展字段(财务提醒) ====================
|
||||
@@ -377,6 +383,12 @@ public class ContractLaunchDto implements Serializable {
|
||||
/** 履行计划列表 */
|
||||
private List<ContractLaunchPlanDto> performancePlans = new ArrayList<>();
|
||||
|
||||
/** 纸质档案材料 */
|
||||
private List<ContractLaunchArchivePaperDto> archivePapers = new ArrayList<>();
|
||||
|
||||
/** 电子档案材料 */
|
||||
private List<ContractLaunchArchiveEleDto> archiveEles = new ArrayList<>();
|
||||
|
||||
/** 操作日志列表 */
|
||||
private List<ContractLaunchLogDto> logList = new ArrayList<>();
|
||||
}
|
||||
|
||||
@@ -23,6 +23,9 @@ public class ContractLaunchFileDto implements Serializable {
|
||||
/** 文件分类:body-正文, gist-签订依据, other-其他附件, signed-签署文件, archive-归档文件 */
|
||||
private String fileCategory;
|
||||
|
||||
/** 关联合同电子档案材料 ID(仅归档附件使用) */
|
||||
private Long archiveEleId;
|
||||
|
||||
/** 文件名 */
|
||||
private String fileName;
|
||||
|
||||
|
||||
@@ -3,6 +3,8 @@ package com.nbport.zgwl.contractlaunch.mapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.nbport.zgwl.contractlaunch.dto.ContractLaunchDto;
|
||||
import com.nbport.zgwl.contractlaunch.dto.ContractLaunchArchiveEleDto;
|
||||
import com.nbport.zgwl.contractlaunch.dto.ContractLaunchArchivePaperDto;
|
||||
import com.nbport.zgwl.contractlaunch.dto.ContractLaunchFileDto;
|
||||
import com.nbport.zgwl.contractlaunch.dto.ContractLaunchLogDto;
|
||||
import com.nbport.zgwl.contractlaunch.dto.ContractLaunchPartyDto;
|
||||
@@ -29,6 +31,12 @@ public interface ContractLaunchMapper {
|
||||
/** 获取日志表序列 */
|
||||
Long selectLogSeqNextVal();
|
||||
|
||||
/** 获取纸质归档表序列 */
|
||||
Long selectArchivePaperSeqNextVal();
|
||||
|
||||
/** 获取电子归档表序列 */
|
||||
Long selectArchiveEleSeqNextVal();
|
||||
|
||||
/** 分页查询合同列表 */
|
||||
IPage<ContractLaunchDto> selectContractPage(Page<ContractLaunchDto> page, @Param("query") ContractLaunchQueryDto queryDto);
|
||||
|
||||
@@ -62,6 +70,16 @@ public interface ContractLaunchMapper {
|
||||
@Param("createBy") String createBy,
|
||||
@Param("updateBy") String updateBy);
|
||||
|
||||
/** 批量插入纸质归档材料 */
|
||||
int batchInsertArchivePaper(@Param("list") List<ContractLaunchArchivePaperDto> list,
|
||||
@Param("createBy") String createBy,
|
||||
@Param("updateBy") String updateBy);
|
||||
|
||||
/** 批量插入电子归档材料 */
|
||||
int batchInsertArchiveEle(@Param("list") List<ContractLaunchArchiveEleDto> list,
|
||||
@Param("createBy") String createBy,
|
||||
@Param("updateBy") String updateBy);
|
||||
|
||||
/** 插入单条操作日志 */
|
||||
int insertLog(ContractLaunchLogDto logDto);
|
||||
|
||||
@@ -87,6 +105,14 @@ public interface ContractLaunchMapper {
|
||||
int deletePlanByContractId(@Param("contractId") Long contractId,
|
||||
@Param("updateBy") String updateBy);
|
||||
|
||||
/** 删除合同下的纸质归档材料(逻辑删除) */
|
||||
int deleteArchivePaperByContractId(@Param("contractId") Long contractId,
|
||||
@Param("updateBy") String updateBy);
|
||||
|
||||
/** 删除合同下的电子归档材料(逻辑删除) */
|
||||
int deleteArchiveEleByContractId(@Param("contractId") Long contractId,
|
||||
@Param("updateBy") String updateBy);
|
||||
|
||||
/** 批量查询合同方(按 contractIds) */
|
||||
List<ContractLaunchPartyDto> selectPartyByContractIds(@Param("contractIds") List<Long> contractIds);
|
||||
|
||||
@@ -96,6 +122,12 @@ public interface ContractLaunchMapper {
|
||||
/** 批量查询履行计划(按 contractIds) */
|
||||
List<ContractLaunchPlanDto> selectPlanByContractIds(@Param("contractIds") List<Long> contractIds);
|
||||
|
||||
/** 批量查询纸质归档材料(按 contractIds) */
|
||||
List<ContractLaunchArchivePaperDto> selectArchivePaperByContractIds(@Param("contractIds") List<Long> contractIds);
|
||||
|
||||
/** 批量查询电子归档材料(按 contractIds) */
|
||||
List<ContractLaunchArchiveEleDto> selectArchiveEleByContractIds(@Param("contractIds") List<Long> contractIds);
|
||||
|
||||
/** 批量查询操作日志(按 contractIds) */
|
||||
List<ContractLaunchLogDto> selectLogByContractIds(@Param("contractIds") List<Long> contractIds);
|
||||
}
|
||||
|
||||
+186
-32
@@ -6,6 +6,8 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.nbport.zgwl.common.PageResult;
|
||||
import com.nbport.zgwl.contractlaunch.dto.ContractLaunchApproveDto;
|
||||
import com.nbport.zgwl.contractlaunch.dto.ContractLaunchArchiveDto;
|
||||
import com.nbport.zgwl.contractlaunch.dto.ContractLaunchArchiveEleDto;
|
||||
import com.nbport.zgwl.contractlaunch.dto.ContractLaunchArchivePaperDto;
|
||||
import com.nbport.zgwl.contractlaunch.dto.ContractLaunchDto;
|
||||
import com.nbport.zgwl.contractlaunch.dto.ContractLaunchFileDto;
|
||||
import com.nbport.zgwl.contractlaunch.dto.ContractLaunchLogDto;
|
||||
@@ -489,32 +491,29 @@ public class ContractLaunchServiceImpl implements ContractLaunchService {
|
||||
throw new ServiceException("当前状态不允许归档");
|
||||
}
|
||||
SysUserEntity currentUser = adminSecurityManage.getUser();
|
||||
contract.setArchiveDate(LocalDateTime.now());
|
||||
contract.setArchiveKeeper(archiveDto == null ? null : archiveDto.getArchiveKeeper());
|
||||
contract.setArchiveKeeperUnit(archiveDto == null ? null : archiveDto.getArchiveKeeperUnit());
|
||||
contract.setArchiveKeeperUnitCode(archiveDto == null ? null : archiveDto.getArchiveKeeperUnitCode());
|
||||
validateArchiveRequest(archiveDto);
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
contract.setArchiveDate(now);
|
||||
contract.setArchiveReceiveDept(archiveDto.getArchiveReceiveDept());
|
||||
contract.setArchiveTransferor(archiveDto.getArchiveTransferor());
|
||||
contract.setArchiveKeeper(currentUser.getMobilePhone() == null || currentUser.getMobilePhone().isBlank()
|
||||
? archiveDto.getArchiveTransferor()
|
||||
: currentUser.getMobilePhone());
|
||||
contract.setArchiveKeeperUnit(currentUser.getSysOrgEntity() == null ? contract.getArchiveKeeperUnit() : currentUser.getSysOrgEntity().getOrgName());
|
||||
contract.setArchiveKeeperUnitCode(currentUser.getSysOrgEntity() == null ? contract.getArchiveKeeperUnitCode() : currentUser.getSysOrgEntity().getId());
|
||||
contract.setStatus(ContractLaunchConstants.STATUS_COMPLETED);
|
||||
contract.setUpdateBy(currentUser.getUsername());
|
||||
contract.setUpdateTime(LocalDateTime.now());
|
||||
contract.setUpdateTime(now);
|
||||
contractLaunchMapper.updateContract(contract);
|
||||
replaceArchiveChildren(id, archiveDto, currentUser.getUsername());
|
||||
|
||||
if (archiveDto != null && archiveDto.getArchiveFiles() != null && !archiveDto.getArchiveFiles().isEmpty()) {
|
||||
for (ContractLaunchFileDto fileDto : archiveDto.getArchiveFiles()) {
|
||||
fileDto.setId(contractLaunchMapper.selectFileSeqNextVal());
|
||||
fileDto.setContractId(id);
|
||||
fileDto.setFileCategory(ContractLaunchConstants.FILE_CATEGORY_ARCHIVE);
|
||||
}
|
||||
contractLaunchMapper.batchInsertFile(archiveDto.getArchiveFiles(), currentUser.getUsername(), currentUser.getUsername());
|
||||
}
|
||||
|
||||
Map<String, Object> payload = buildArchivePayload(contract, archiveDto);
|
||||
Map<String, Object> payload = buildArchivePayload(contract, archiveDto, false);
|
||||
log.info("合同归档参数:{}", JsonUtils.toJson(payload));
|
||||
insertLog(id, ContractLaunchConstants.ACTION_ARCHIVE, "合同归档", ContractLaunchConstants.ACTION_STATUS_PENDING, "合同归档接口当前先注释,使用测试按钮流转", payload, currentUser);
|
||||
|
||||
// TODO: 法务接口当前不可用,真实联调时打开下面调用即可
|
||||
// PushPayloadDTO requestDTO = new PushPayloadDTO();
|
||||
// requestDTO.setPayload(payload);
|
||||
// settlementPushService.pushArchive(requestDTO);
|
||||
// requestDTO.setPayload(buildArchivePayload(contract, archiveDto, true));
|
||||
// dataCollectionPushService.collectContractArchive(requestDTO);
|
||||
|
||||
return getDetail(id);
|
||||
@@ -791,14 +790,26 @@ public class ContractLaunchServiceImpl implements ContractLaunchService {
|
||||
.collect(Collectors.groupingBy(ContractLaunchFileDto::getContractId));
|
||||
Map<Long, List<ContractLaunchPlanDto>> planMap = contractLaunchMapper.selectPlanByContractIds(ids).stream()
|
||||
.collect(Collectors.groupingBy(ContractLaunchPlanDto::getContractId));
|
||||
Map<Long, List<ContractLaunchArchivePaperDto>> archivePaperMap = contractLaunchMapper.selectArchivePaperByContractIds(ids).stream()
|
||||
.collect(Collectors.groupingBy(ContractLaunchArchivePaperDto::getContractId));
|
||||
Map<Long, List<ContractLaunchArchiveEleDto>> archiveEleMap = contractLaunchMapper.selectArchiveEleByContractIds(ids).stream()
|
||||
.collect(Collectors.groupingBy(ContractLaunchArchiveEleDto::getContractId));
|
||||
Map<Long, List<ContractLaunchLogDto>> logMap = includeLogs
|
||||
? contractLaunchMapper.selectLogByContractIds(ids).stream().collect(Collectors.groupingBy(ContractLaunchLogDto::getContractId))
|
||||
: Collections.emptyMap();
|
||||
|
||||
list.forEach(item -> {
|
||||
item.setPartyList(new ArrayList<>(partyMap.getOrDefault(item.getId(), Collections.emptyList())));
|
||||
item.setFileList(new ArrayList<>(fileMap.getOrDefault(item.getId(), Collections.emptyList())));
|
||||
List<ContractLaunchFileDto> contractFiles = new ArrayList<>(fileMap.getOrDefault(item.getId(), Collections.emptyList()));
|
||||
item.setFileList(contractFiles);
|
||||
item.setPerformancePlans(new ArrayList<>(planMap.getOrDefault(item.getId(), Collections.emptyList())));
|
||||
item.setArchivePapers(new ArrayList<>(archivePaperMap.getOrDefault(item.getId(), Collections.emptyList())));
|
||||
List<ContractLaunchArchiveEleDto> archiveEles = new ArrayList<>(archiveEleMap.getOrDefault(item.getId(), Collections.emptyList()));
|
||||
Map<Long, List<ContractLaunchFileDto>> archiveFileMap = contractFiles.stream()
|
||||
.filter(file -> ContractLaunchConstants.FILE_CATEGORY_ARCHIVE.equals(file.getFileCategory()) && file.getArchiveEleId() != null)
|
||||
.collect(Collectors.groupingBy(ContractLaunchFileDto::getArchiveEleId));
|
||||
archiveEles.forEach(ele -> ele.setApprovalAttachs(new ArrayList<>(archiveFileMap.getOrDefault(ele.getId(), Collections.emptyList()))));
|
||||
item.setArchiveEles(archiveEles);
|
||||
item.setLogList(new ArrayList<>(logMap.getOrDefault(item.getId(), Collections.emptyList())));
|
||||
item.setCounterpartySummary(
|
||||
item.getPartyList().stream()
|
||||
@@ -1263,16 +1274,16 @@ public class ContractLaunchServiceImpl implements ContractLaunchService {
|
||||
return "GZBSQRQZ".equals(sealType) || "HTZYZBSQRQZ".equals(sealType);
|
||||
}
|
||||
|
||||
/** 构建归档报文(pushArchive 接口的 payload) */
|
||||
private Map<String, Object> buildArchivePayload(ContractLaunchDto contract, ContractLaunchArchiveDto archiveDto) {
|
||||
/** 构建归档报文(数据采集 V3.0 collectContractArchive 接口的 payload) */
|
||||
private Map<String, Object> buildArchivePayload(ContractLaunchDto contract, ContractLaunchArchiveDto archiveDto, boolean useLegalFilePayload) {
|
||||
Map<String, Object> payload = new LinkedHashMap<>();
|
||||
payload.put("contractCode", contract.getLawContractCode());
|
||||
payload.put("contractSysId", contract.getContractSysId());
|
||||
payload.put("Keeper", archiveDto == null ? null : archiveDto.getArchiveKeeper());
|
||||
payload.put("KeeperUnit", archiveDto == null ? null : archiveDto.getArchiveKeeperUnit());
|
||||
payload.put("KeeperUnitCode", archiveDto == null ? null : archiveDto.getArchiveKeeperUnitCode());
|
||||
payload.put("archivePapers", List.of());
|
||||
payload.put("archiveEles", buildSettlementArchiveEleList(archiveDto));
|
||||
payload.put("c_code", contract.getLawContractCode() == null || contract.getLawContractCode().isBlank()
|
||||
? contract.getContractCode()
|
||||
: contract.getLawContractCode());
|
||||
payload.put("c_receiveDept", archiveDto == null ? null : archiveDto.getArchiveReceiveDept());
|
||||
payload.put("c_transferor", archiveDto == null ? null : archiveDto.getArchiveTransferor());
|
||||
payload.put("c_papers", buildCollectionArchivePaperList(archiveDto));
|
||||
payload.put("c_elcs", buildCollectionArchiveEleList(archiveDto, useLegalFilePayload));
|
||||
return payload;
|
||||
}
|
||||
|
||||
@@ -1299,20 +1310,69 @@ public class ContractLaunchServiceImpl implements ContractLaunchService {
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private List<Map<String, Object>> buildSettlementArchiveEleList(ContractLaunchArchiveDto archiveDto) {
|
||||
if (archiveDto == null || archiveDto.getArchiveFiles() == null || archiveDto.getArchiveFiles().isEmpty()) {
|
||||
private List<Map<String, Object>> buildCollectionArchivePaperList(ContractLaunchArchiveDto archiveDto) {
|
||||
if (archiveDto == null || archiveDto.getArchivePapers() == null || archiveDto.getArchivePapers().isEmpty()) {
|
||||
return List.of();
|
||||
}
|
||||
return archiveDto.getArchiveFiles().stream()
|
||||
return archiveDto.getArchivePapers().stream()
|
||||
.map(item -> {
|
||||
Map<String, Object> map = new LinkedHashMap<>();
|
||||
map.put("archivesName", item.getFileName());
|
||||
map.put("approvalAttachs", List.of(legalFileBridgeService.buildSettlementPayload(item)));
|
||||
map.put("archivesName", item.getArchivesName());
|
||||
map.put("archivesNum", item.getArchivesNum());
|
||||
map.put("archivesTime", item.getArchivesTime());
|
||||
return map;
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private List<Map<String, Object>> buildCollectionArchiveEleList(ContractLaunchArchiveDto archiveDto, boolean useLegalFilePayload) {
|
||||
if (archiveDto == null || archiveDto.getArchiveEles() == null || archiveDto.getArchiveEles().isEmpty()) {
|
||||
return List.of();
|
||||
}
|
||||
return archiveDto.getArchiveEles().stream()
|
||||
.map(item -> {
|
||||
Map<String, Object> map = new LinkedHashMap<>();
|
||||
map.put("archivesName", item.getArchivesName());
|
||||
map.put("approvalAttachs", item.getApprovalAttachs().stream()
|
||||
.map(file -> buildArchiveCollectionFilePayload(file, useLegalFilePayload))
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toList()));
|
||||
return map;
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private Map<String, Object> buildArchiveCollectionFilePayload(ContractLaunchFileDto fileDto, boolean useLegalFilePayload) {
|
||||
if (fileDto == null) {
|
||||
return null;
|
||||
}
|
||||
if (useLegalFilePayload) {
|
||||
return legalFileBridgeService.buildCollectionPayload(fileDto);
|
||||
}
|
||||
if (fileDto.getFilePath() == null || fileDto.getFilePath().isBlank()) {
|
||||
return null;
|
||||
}
|
||||
Map<String, Object> map = new LinkedHashMap<>();
|
||||
map.put("size", fileDto.getFileSize() == null ? "" : String.valueOf(fileDto.getFileSize()));
|
||||
map.put("name", fileDto.getFileName());
|
||||
map.put("suffix", resolveArchiveFileSuffix(fileDto));
|
||||
map.put("path", fileDto.getFilePath());
|
||||
return map;
|
||||
}
|
||||
|
||||
private String resolveArchiveFileSuffix(ContractLaunchFileDto fileDto) {
|
||||
String fileType = trim(fileDto.getFileType());
|
||||
if (fileType != null && !fileType.isBlank()) {
|
||||
return fileType.startsWith(".") ? fileType.substring(1) : fileType;
|
||||
}
|
||||
String fileName = trim(fileDto.getFileName());
|
||||
if (fileName == null) {
|
||||
return "";
|
||||
}
|
||||
int index = fileName.lastIndexOf('.');
|
||||
return index >= 0 && index < fileName.length() - 1 ? fileName.substring(index + 1) : "";
|
||||
}
|
||||
|
||||
/**
|
||||
* 如果 signedFilePath 是外部URL,则下载到本地并返回本地路径;
|
||||
* 如果已是本地路径则直接返回。
|
||||
@@ -1413,6 +1473,100 @@ public class ContractLaunchServiceImpl implements ContractLaunchService {
|
||||
}
|
||||
}
|
||||
|
||||
private void replaceArchiveChildren(Long contractId, ContractLaunchArchiveDto archiveDto, String operator) {
|
||||
contractLaunchMapper.deleteArchivePaperByContractId(contractId, operator);
|
||||
contractLaunchMapper.deleteArchiveEleByContractId(contractId, operator);
|
||||
contractLaunchMapper.deleteFileByContractIdAndCategory(contractId, ContractLaunchConstants.FILE_CATEGORY_ARCHIVE, operator);
|
||||
|
||||
if (archiveDto == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
List<ContractLaunchArchivePaperDto> papers = archiveDto.getArchivePapers();
|
||||
if (papers != null && !papers.isEmpty()) {
|
||||
for (int i = 0; i < papers.size(); i++) {
|
||||
ContractLaunchArchivePaperDto paper = papers.get(i);
|
||||
paper.setId(contractLaunchMapper.selectArchivePaperSeqNextVal());
|
||||
paper.setContractId(contractId);
|
||||
paper.setSortOrder(i + 1);
|
||||
}
|
||||
contractLaunchMapper.batchInsertArchivePaper(papers, operator, operator);
|
||||
}
|
||||
|
||||
List<ContractLaunchArchiveEleDto> eles = archiveDto.getArchiveEles();
|
||||
if (eles != null && !eles.isEmpty()) {
|
||||
List<ContractLaunchFileDto> archiveFiles = new ArrayList<>();
|
||||
for (int i = 0; i < eles.size(); i++) {
|
||||
ContractLaunchArchiveEleDto ele = eles.get(i);
|
||||
ele.setId(contractLaunchMapper.selectArchiveEleSeqNextVal());
|
||||
ele.setContractId(contractId);
|
||||
ele.setSortOrder(i + 1);
|
||||
List<ContractLaunchFileDto> attachs = ele.getApprovalAttachs();
|
||||
if (attachs == null) {
|
||||
continue;
|
||||
}
|
||||
for (int j = 0; j < attachs.size(); j++) {
|
||||
ContractLaunchFileDto file = attachs.get(j);
|
||||
file.setId(contractLaunchMapper.selectFileSeqNextVal());
|
||||
file.setContractId(contractId);
|
||||
file.setFileCategory(ContractLaunchConstants.FILE_CATEGORY_ARCHIVE);
|
||||
file.setArchiveEleId(ele.getId());
|
||||
file.setSortOrder(j + 1);
|
||||
archiveFiles.add(file);
|
||||
}
|
||||
}
|
||||
contractLaunchMapper.batchInsertArchiveEle(eles, operator, operator);
|
||||
if (!archiveFiles.isEmpty()) {
|
||||
contractLaunchMapper.batchInsertFile(archiveFiles, operator, operator);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void validateArchiveRequest(ContractLaunchArchiveDto archiveDto) {
|
||||
if (archiveDto == null) {
|
||||
throw new ServiceException("归档信息不能为空");
|
||||
}
|
||||
if (archiveDto.getArchiveReceiveDept() == null || archiveDto.getArchiveReceiveDept().isBlank()) {
|
||||
throw new ServiceException("归档接收部门编码不能为空");
|
||||
}
|
||||
if (archiveDto.getArchiveTransferor() == null || archiveDto.getArchiveTransferor().isBlank()) {
|
||||
throw new ServiceException("移交人账号不能为空");
|
||||
}
|
||||
if (archiveDto.getArchivePapers() == null || archiveDto.getArchivePapers().isEmpty()) {
|
||||
throw new ServiceException("纸质档案材料不能为空");
|
||||
}
|
||||
for (ContractLaunchArchivePaperDto paper : archiveDto.getArchivePapers()) {
|
||||
if (paper.getArchivesName() == null || paper.getArchivesName().isBlank()) {
|
||||
throw new ServiceException("纸质档案名称不能为空");
|
||||
}
|
||||
if (paper.getArchivesNum() == null || paper.getArchivesNum().isBlank()) {
|
||||
throw new ServiceException("纸质档案份数不能为空");
|
||||
}
|
||||
if (paper.getArchivesTime() == null) {
|
||||
throw new ServiceException("纸质档案归档时间不能为空");
|
||||
}
|
||||
}
|
||||
if (archiveDto.getArchiveEles() == null || archiveDto.getArchiveEles().isEmpty()) {
|
||||
throw new ServiceException("电子档案材料不能为空");
|
||||
}
|
||||
for (ContractLaunchArchiveEleDto ele : archiveDto.getArchiveEles()) {
|
||||
if (ele.getArchivesName() == null || ele.getArchivesName().isBlank()) {
|
||||
throw new ServiceException("电子档案名称不能为空");
|
||||
}
|
||||
if (ele.getApprovalAttachs() == null || ele.getApprovalAttachs().isEmpty()) {
|
||||
throw new ServiceException("电子档案附件不能为空");
|
||||
}
|
||||
for (ContractLaunchFileDto file : ele.getApprovalAttachs()) {
|
||||
if (file.getFileName() == null || file.getFileName().isBlank()) {
|
||||
throw new ServiceException("电子档案附件文件名不能为空");
|
||||
}
|
||||
if (file.getFilePath() == null || file.getFilePath().isBlank()) {
|
||||
throw new ServiceException("电子档案附件路径不能为空");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isPlanAmountRequired(String valuationMode) {
|
||||
return !"0".equals(valuationMode) && !"3".equals(valuationMode);
|
||||
}
|
||||
|
||||
@@ -82,6 +82,8 @@
|
||||
<result property="sealDate" column="SEAL_DATE"/>
|
||||
<result property="activeDate" column="ACTIVE_DATE"/>
|
||||
<result property="archiveDate" column="ARCHIVE_DATE"/>
|
||||
<result property="archiveReceiveDept" column="ARCHIVE_RECEIVE_DEPT"/>
|
||||
<result property="archiveTransferor" column="ARCHIVE_TRANSFEROR"/>
|
||||
<result property="archiveKeeper" column="ARCHIVE_KEEPER"/>
|
||||
<result property="archiveKeeperUnit" column="ARCHIVE_KEEPER_UNIT"/>
|
||||
<result property="archiveKeeperUnitCode" column="ARCHIVE_KEEPER_UNIT_CODE"/>
|
||||
@@ -132,6 +134,7 @@
|
||||
<id property="id" column="ID"/>
|
||||
<result property="contractId" column="CONTRACT_ID"/>
|
||||
<result property="fileCategory" column="FILE_CATEGORY"/>
|
||||
<result property="archiveEleId" column="ARCHIVE_ELE_ID"/>
|
||||
<result property="fileName" column="FILE_NAME"/>
|
||||
<result property="filePath" column="FILE_PATH"/>
|
||||
<result property="legalFileUrl" column="LEGAL_FILE_URL"/>
|
||||
@@ -141,6 +144,24 @@
|
||||
<result property="remark" column="REMARK"/>
|
||||
</resultMap>
|
||||
|
||||
<resultMap id="ArchivePaperResult" type="com.nbport.zgwl.contractlaunch.dto.ContractLaunchArchivePaperDto">
|
||||
<id property="id" column="ID"/>
|
||||
<result property="contractId" column="CONTRACT_ID"/>
|
||||
<result property="archivesName" column="ARCHIVES_NAME"/>
|
||||
<result property="archivesNum" column="ARCHIVES_NUM"/>
|
||||
<result property="archivesTime" column="ARCHIVES_TIME"/>
|
||||
<result property="sortOrder" column="SORT_ORDER"/>
|
||||
<result property="remark" column="REMARK"/>
|
||||
</resultMap>
|
||||
|
||||
<resultMap id="ArchiveEleResult" type="com.nbport.zgwl.contractlaunch.dto.ContractLaunchArchiveEleDto">
|
||||
<id property="id" column="ID"/>
|
||||
<result property="contractId" column="CONTRACT_ID"/>
|
||||
<result property="archivesName" column="ARCHIVES_NAME"/>
|
||||
<result property="sortOrder" column="SORT_ORDER"/>
|
||||
<result property="remark" column="REMARK"/>
|
||||
</resultMap>
|
||||
|
||||
<resultMap id="PlanResult" type="com.nbport.zgwl.contractlaunch.dto.ContractLaunchPlanDto">
|
||||
<id property="id" column="ID"/>
|
||||
<result property="contractId" column="CONTRACT_ID"/>
|
||||
@@ -185,7 +206,7 @@
|
||||
EW_AMOUNT_TYPE, DJ_AMOUNT, YJ_AMOUNT, YFK_AMOUNT, BZJ_AMOUNT, BODY_SUMMARY,
|
||||
CONTRACT_TEXT_FILE_NAME, CONTRACT_TEXT_FILE_PATH, CONTRACT_TEXT_FILE_TYPE, CONTRACT_TEXT_FILE_SIZE,
|
||||
SIGNED_FILE_NAME, SIGNED_FILE_PATH, SIGNED_FILE_TYPE, SIGNED_FILE_SIZE, SIGNED_FILE_URL, SIGNED_OFFLINE_REASON,
|
||||
SIGN_DATE, SEAL_DATE, ACTIVE_DATE, ARCHIVE_DATE, ARCHIVE_KEEPER, ARCHIVE_KEEPER_UNIT,
|
||||
SIGN_DATE, SEAL_DATE, ACTIVE_DATE, ARCHIVE_DATE, ARCHIVE_RECEIVE_DEPT, ARCHIVE_TRANSFEROR, ARCHIVE_KEEPER, ARCHIVE_KEEPER_UNIT,
|
||||
ARCHIVE_KEEPER_UNIT_CODE, INVOICE_DATE, RECEIVE_DATE, REMIND_DAYS,
|
||||
INITIATOR, INITIATOR_DEPT, COMPANY_NAME, ORG_ID, QUERY_SCOPE,
|
||||
CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, IS_DELETED, REMARK
|
||||
@@ -207,6 +228,12 @@
|
||||
<select id="selectLogSeqNextVal" resultType="java.lang.Long" useCache="false" flushCache="true">
|
||||
select SEQ_SEAL_CONTRACT_LAUNCH_LOG.NEXTVAL from dual
|
||||
</select>
|
||||
<select id="selectArchivePaperSeqNextVal" resultType="java.lang.Long" useCache="false" flushCache="true">
|
||||
select SEQ_SEAL_CONTRACT_LAUNCH_AR_PAPER.NEXTVAL from dual
|
||||
</select>
|
||||
<select id="selectArchiveEleSeqNextVal" resultType="java.lang.Long" useCache="false" flushCache="true">
|
||||
select SEQ_SEAL_CONTRACT_LAUNCH_AR_ELE.NEXTVAL from dual
|
||||
</select>
|
||||
|
||||
<select id="selectContractPage" resultMap="ContractLaunchResult">
|
||||
<include refid="mainColumns"/>
|
||||
@@ -263,7 +290,7 @@
|
||||
TEMPLATE_FIELD_VALUES_JSON,
|
||||
CONTRACT_TEXT_FILE_NAME, CONTRACT_TEXT_FILE_PATH, CONTRACT_TEXT_FILE_TYPE, CONTRACT_TEXT_FILE_SIZE,
|
||||
SIGNED_FILE_NAME, SIGNED_FILE_PATH, SIGNED_FILE_TYPE, SIGNED_FILE_SIZE, SIGNED_FILE_URL, SIGNED_OFFLINE_REASON,
|
||||
SIGN_DATE, SEAL_DATE, ACTIVE_DATE, ARCHIVE_DATE, ARCHIVE_KEEPER, ARCHIVE_KEEPER_UNIT,
|
||||
SIGN_DATE, SEAL_DATE, ACTIVE_DATE, ARCHIVE_DATE, ARCHIVE_RECEIVE_DEPT, ARCHIVE_TRANSFEROR, ARCHIVE_KEEPER, ARCHIVE_KEEPER_UNIT,
|
||||
ARCHIVE_KEEPER_UNIT_CODE, INVOICE_DATE, RECEIVE_DATE, REMIND_DAYS,
|
||||
INITIATOR, INITIATOR_DEPT, COMPANY_NAME, ORG_ID, QUERY_SCOPE,
|
||||
CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, IS_DELETED, REMARK
|
||||
@@ -283,7 +310,7 @@
|
||||
#{templateFieldValuesJson},
|
||||
#{contractTextFileName}, #{contractTextFilePath}, #{contractTextFileType}, #{contractTextFileSize},
|
||||
#{signedFileName}, #{signedFilePath}, #{signedFileType}, #{signedFileSize}, #{signedFileUrl}, #{signedOfflineReason},
|
||||
#{signDate}, #{sealDate}, #{activeDate}, #{archiveDate}, #{archiveKeeper}, #{archiveKeeperUnit},
|
||||
#{signDate}, #{sealDate}, #{activeDate}, #{archiveDate}, #{archiveReceiveDept}, #{archiveTransferor}, #{archiveKeeper}, #{archiveKeeperUnit},
|
||||
#{archiveKeeperUnitCode}, #{invoiceDate}, #{receiveDate}, #{remindDays},
|
||||
#{initiator}, #{initiatorDept}, #{companyName}, #{orgId}, #{queryScope},
|
||||
#{createBy}, #{createTime}, #{updateBy}, #{updateTime}, #{isDeleted}, #{remark}
|
||||
@@ -369,6 +396,8 @@
|
||||
SEAL_DATE = #{sealDate},
|
||||
ACTIVE_DATE = #{activeDate},
|
||||
ARCHIVE_DATE = #{archiveDate},
|
||||
ARCHIVE_RECEIVE_DEPT = #{archiveReceiveDept},
|
||||
ARCHIVE_TRANSFEROR = #{archiveTransferor},
|
||||
ARCHIVE_KEEPER = #{archiveKeeper},
|
||||
ARCHIVE_KEEPER_UNIT = #{archiveKeeperUnit},
|
||||
ARCHIVE_KEEPER_UNIT_CODE = #{archiveKeeperUnitCode},
|
||||
@@ -422,10 +451,10 @@
|
||||
INSERT ALL
|
||||
<foreach collection="list" item="item">
|
||||
INTO SEAL_CONTRACT_LAUNCH_FILE (
|
||||
ID, CONTRACT_ID, FILE_CATEGORY, FILE_NAME, FILE_PATH, LEGAL_FILE_URL, FILE_TYPE, FILE_SIZE,
|
||||
ID, CONTRACT_ID, FILE_CATEGORY, ARCHIVE_ELE_ID, FILE_NAME, FILE_PATH, LEGAL_FILE_URL, FILE_TYPE, FILE_SIZE,
|
||||
SORT_ORDER, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, IS_DELETED, REMARK
|
||||
) VALUES (
|
||||
#{item.id}, #{item.contractId}, #{item.fileCategory}, #{item.fileName}, #{item.filePath}, #{item.legalFileUrl}, #{item.fileType}, #{item.fileSize},
|
||||
#{item.id}, #{item.contractId}, #{item.fileCategory}, #{item.archiveEleId}, #{item.fileName}, #{item.filePath}, #{item.legalFileUrl}, #{item.fileType}, #{item.fileSize},
|
||||
#{item.sortOrder}, #{createBy}, SYSDATE, #{updateBy}, SYSDATE, 'N', #{item.remark}
|
||||
)
|
||||
</foreach>
|
||||
@@ -448,6 +477,34 @@
|
||||
SELECT 1 FROM DUAL
|
||||
</insert>
|
||||
|
||||
<insert id="batchInsertArchivePaper">
|
||||
INSERT ALL
|
||||
<foreach collection="list" item="item">
|
||||
INTO SEAL_CONTRACT_LAUNCH_AR_PAPER (
|
||||
ID, CONTRACT_ID, ARCHIVES_NAME, ARCHIVES_NUM, ARCHIVES_TIME, SORT_ORDER,
|
||||
CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, IS_DELETED, REMARK
|
||||
) VALUES (
|
||||
#{item.id}, #{item.contractId}, #{item.archivesName}, #{item.archivesNum}, #{item.archivesTime}, #{item.sortOrder},
|
||||
#{createBy}, SYSDATE, #{updateBy}, SYSDATE, 'N', #{item.remark}
|
||||
)
|
||||
</foreach>
|
||||
SELECT 1 FROM DUAL
|
||||
</insert>
|
||||
|
||||
<insert id="batchInsertArchiveEle">
|
||||
INSERT ALL
|
||||
<foreach collection="list" item="item">
|
||||
INTO SEAL_CONTRACT_LAUNCH_AR_ELE (
|
||||
ID, CONTRACT_ID, ARCHIVES_NAME, SORT_ORDER,
|
||||
CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, IS_DELETED, REMARK
|
||||
) VALUES (
|
||||
#{item.id}, #{item.contractId}, #{item.archivesName}, #{item.sortOrder},
|
||||
#{createBy}, SYSDATE, #{updateBy}, SYSDATE, 'N', #{item.remark}
|
||||
)
|
||||
</foreach>
|
||||
SELECT 1 FROM DUAL
|
||||
</insert>
|
||||
|
||||
<insert id="insertLog" parameterType="com.nbport.zgwl.contractlaunch.dto.ContractLaunchLogDto">
|
||||
insert into SEAL_CONTRACT_LAUNCH_LOG (
|
||||
ID, CONTRACT_ID, ACTION_TYPE, ACTION_NAME, ACTION_STATUS, OPERATOR_NAME, OPERATOR_PHONE,
|
||||
@@ -504,6 +561,24 @@
|
||||
and IS_DELETED = 'N'
|
||||
</update>
|
||||
|
||||
<update id="deleteArchivePaperByContractId">
|
||||
update SEAL_CONTRACT_LAUNCH_AR_PAPER
|
||||
set IS_DELETED = 'Y',
|
||||
UPDATE_BY = #{updateBy},
|
||||
UPDATE_TIME = SYSDATE
|
||||
where CONTRACT_ID = #{contractId}
|
||||
and IS_DELETED = 'N'
|
||||
</update>
|
||||
|
||||
<update id="deleteArchiveEleByContractId">
|
||||
update SEAL_CONTRACT_LAUNCH_AR_ELE
|
||||
set IS_DELETED = 'Y',
|
||||
UPDATE_BY = #{updateBy},
|
||||
UPDATE_TIME = SYSDATE
|
||||
where CONTRACT_ID = #{contractId}
|
||||
and IS_DELETED = 'N'
|
||||
</update>
|
||||
|
||||
<select id="selectPartyByContractIds" resultMap="PartyResult">
|
||||
select ID, CONTRACT_ID, ROLE_CODE, ROLE_NAME, SORT_ORDER, PARTNER_ID, OPPOSITE_ID,
|
||||
COMPANY_NAME, COMPANY_TYPE, OPPOSITE_CHARACTER, CONTACT_NAME, CONTACT_PHONE,
|
||||
@@ -520,7 +595,7 @@
|
||||
</select>
|
||||
|
||||
<select id="selectFileByContractIds" resultMap="FileResult">
|
||||
select ID, CONTRACT_ID, FILE_CATEGORY, FILE_NAME, FILE_PATH, LEGAL_FILE_URL, FILE_TYPE, FILE_SIZE, SORT_ORDER, REMARK
|
||||
select ID, CONTRACT_ID, FILE_CATEGORY, ARCHIVE_ELE_ID, FILE_NAME, FILE_PATH, LEGAL_FILE_URL, FILE_TYPE, FILE_SIZE, SORT_ORDER, REMARK
|
||||
from SEAL_CONTRACT_LAUNCH_FILE
|
||||
where IS_DELETED = 'N'
|
||||
and CONTRACT_ID in
|
||||
@@ -542,6 +617,28 @@
|
||||
order by CONTRACT_ID asc, PLAN_TIME asc, ID asc
|
||||
</select>
|
||||
|
||||
<select id="selectArchivePaperByContractIds" resultMap="ArchivePaperResult">
|
||||
select ID, CONTRACT_ID, ARCHIVES_NAME, ARCHIVES_NUM, ARCHIVES_TIME, SORT_ORDER, REMARK
|
||||
from SEAL_CONTRACT_LAUNCH_AR_PAPER
|
||||
where IS_DELETED = 'N'
|
||||
and CONTRACT_ID in
|
||||
<foreach collection="contractIds" item="contractId" open="(" separator="," close=")">
|
||||
#{contractId}
|
||||
</foreach>
|
||||
order by CONTRACT_ID asc, SORT_ORDER asc, ID asc
|
||||
</select>
|
||||
|
||||
<select id="selectArchiveEleByContractIds" resultMap="ArchiveEleResult">
|
||||
select ID, CONTRACT_ID, ARCHIVES_NAME, SORT_ORDER, REMARK
|
||||
from SEAL_CONTRACT_LAUNCH_AR_ELE
|
||||
where IS_DELETED = 'N'
|
||||
and CONTRACT_ID in
|
||||
<foreach collection="contractIds" item="contractId" open="(" separator="," close=")">
|
||||
#{contractId}
|
||||
</foreach>
|
||||
order by CONTRACT_ID asc, SORT_ORDER asc, ID asc
|
||||
</select>
|
||||
|
||||
<select id="selectLogByContractIds" resultMap="LogResult">
|
||||
select ID, CONTRACT_ID, ACTION_TYPE, ACTION_NAME, ACTION_STATUS, OPERATOR_NAME, OPERATOR_PHONE,
|
||||
ACTION_TIME, ACTION_CONTENT, CALLBACK_PAYLOAD, REMARK
|
||||
|
||||
Reference in New Issue
Block a user