package jnpf.dmsService.impl;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import jnpf.audit.sdk.annotation.AuditLog;
|
import jnpf.dmsEntity.DmsWenjianFushenYanqiShenqingEntity;
|
import jnpf.dmsEntity.DmsWenjianFushenYanqiShenqingZixiangEntity;
|
import jnpf.dmsEntity.storage.form.DmsFileExtendValidityForm;
|
import jnpf.dmsEntity.storage.form.DmsFileExtendValidityForm.FileRequest;
|
import jnpf.dmsMapper.DmsWenjianFushenYanqiShenqingMapper;
|
import jnpf.dmsMapper.DmsWenjianFushenYanqiShenqingZixiangMapper;
|
import jnpf.dmsMapper.DmsWenjianZiyuanMapper;
|
import jnpf.dmsService.DmsFileValidityService;
|
import jnpf.dmsService.DmsWenjianFushenYanqiShenqingTongguoService;
|
import jnpf.exception.DataException;
|
import lombok.RequiredArgsConstructor;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.text.SimpleDateFormat;
|
import java.time.LocalDate;
|
import java.time.ZoneId;
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.UUID;
|
|
@Service
|
@RequiredArgsConstructor
|
public class DmsWenjianFushenYanqiShenqingTongguoServiceImpl
|
implements DmsWenjianFushenYanqiShenqingTongguoService {
|
|
private static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
|
|
private final DmsWenjianFushenYanqiShenqingMapper shenqingMapper;
|
private final DmsWenjianFushenYanqiShenqingZixiangMapper zixiangMapper;
|
private final DmsWenjianZiyuanMapper ziyuanMapper;
|
private final DmsFileValidityService fileValidityService;
|
private final jnpf.dmsService.DmsBusinessLifecycleGuard businessOccupancy;
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
@AuditLog(
|
action = "FILE_REVIEW_EXTENSION_APPROVE",
|
label = "文件复审延期申请审批通过",
|
bizModule = "文件复审延期申请",
|
bizType = "DMS_FILE_REVIEW_EXTENSION",
|
bizCodeExpr = "#result",
|
targetTable = "wenjian_fushen_yanqi_shenqing",
|
targetIdExpr = "#result"
|
)
|
public String tongguo(String flowId, String taskId) throws DataException {
|
String normalizedFlowId = requireValue(flowId, "流程ID(flow_id)");
|
String normalizedTaskId = requireValue(taskId, "流程任务ID(task_id)");
|
DmsWenjianFushenYanqiShenqingEntity shenqing = findApplication(
|
normalizedFlowId, normalizedTaskId);
|
List<DmsWenjianFushenYanqiShenqingZixiangEntity> zixiangs = findZixiangs(shenqing.getId());
|
var receipts=businessOccupancy.requireCurrentUserExtension(normalizedTaskId,shenqing.getId(),
|
zixiangs.stream().map(DmsWenjianFushenYanqiShenqingZixiangEntity::getWenjianId).toList());
|
String fushenRiqi = formatDate(shenqing.getShenqingRiqi());
|
|
if (!zixiangs.isEmpty()) {
|
fileValidityService.extendValidity(buildExtendValidityForm(
|
normalizedFlowId, normalizedTaskId, zixiangs, receipts));
|
}
|
for (DmsWenjianFushenYanqiShenqingZixiangEntity zixiang : zixiangs) {
|
String wenjianId = requireValue(zixiang.getWenjianId(), "文件复审延期申请子项wenjian_id");
|
int updated = ziyuanMapper.updateReviewExtension(
|
wenjianId, zixiang.getYanqiZhi(), shenqing.getId(), fushenRiqi);
|
if (updated != 1) {
|
throw new DataException("未找到可更新的文件资源:wenjian_id=" + wenjianId);
|
}
|
}
|
businessOccupancy.completeExecution(receipts);
|
return shenqing.getId();
|
}
|
|
private DmsFileExtendValidityForm buildExtendValidityForm(
|
String flowId, String taskId,
|
List<DmsWenjianFushenYanqiShenqingZixiangEntity> zixiangs,
|
List<jnpf.dmsBusinessOccupancy.BusinessFileOccupancy> receipts) throws DataException {
|
List<FileRequest> files = new ArrayList<>(zixiangs.size());
|
for (DmsWenjianFushenYanqiShenqingZixiangEntity zixiang : zixiangs) {
|
String wenjianId = requireValue(zixiang.getWenjianId(), "文件复审延期申请子项wenjian_id");
|
String fileVersionId = requireValue(receipts.isEmpty() ? ziyuanMapper.selectFileVersionIdByWenjianId(wenjianId)
|
: receipts.stream().filter(r -> wenjianId.equals(r.getFileId())).findFirst().orElseThrow().getCenterVersionId(),
|
"文件中心版本ID:wenjian_id=" + wenjianId);
|
FileRequest file = new FileRequest();
|
try {
|
file.setFileVersionId(UUID.fromString(fileVersionId));
|
} catch (IllegalArgumentException exception) {
|
throw new DataException("文件中心版本ID格式不正确:wenjian_id=" + wenjianId);
|
}
|
file.setEffectiveTo(endOfDay(zixiang.getYanqiZhi()));
|
files.add(file);
|
}
|
DmsFileExtendValidityForm form = new DmsFileExtendValidityForm();
|
form.setSourceId(flowId);
|
form.setTaskId(taskId);
|
form.setFiles(files);
|
return form;
|
}
|
|
private DmsWenjianFushenYanqiShenqingEntity findApplication(String flowId, String taskId)
|
throws DataException {
|
LambdaQueryWrapper<DmsWenjianFushenYanqiShenqingEntity> query = new LambdaQueryWrapper<>();
|
query.eq(DmsWenjianFushenYanqiShenqingEntity::getFlowId, flowId)
|
.eq(DmsWenjianFushenYanqiShenqingEntity::getFlowTaskId, taskId)
|
.isNull(DmsWenjianFushenYanqiShenqingEntity::getDeleteMark);
|
List<DmsWenjianFushenYanqiShenqingEntity> applications = shenqingMapper.selectList(query);
|
if (applications == null || applications.isEmpty()) {
|
throw new DataException("未找到文件复审延期申请:flow_id=" + flowId + ", task_id=" + taskId);
|
}
|
if (applications.size() > 1) {
|
throw new DataException("flow_id与task_id关联了多条文件复审延期申请,无法确认通过记录");
|
}
|
return applications.get(0);
|
}
|
|
private List<DmsWenjianFushenYanqiShenqingZixiangEntity> findZixiangs(String shenqingId) {
|
LambdaQueryWrapper<DmsWenjianFushenYanqiShenqingZixiangEntity> query = new LambdaQueryWrapper<>();
|
query.eq(DmsWenjianFushenYanqiShenqingZixiangEntity::getForeignId, shenqingId)
|
.isNull(DmsWenjianFushenYanqiShenqingZixiangEntity::getDeleteMark);
|
return zixiangMapper.selectList(query);
|
}
|
|
private String formatDate(Date value) {
|
return value == null ? null : new SimpleDateFormat(DATE_TIME_PATTERN).format(value);
|
}
|
|
private Date endOfDay(Date value) throws DataException {
|
if (value == null) {
|
throw new DataException("文件复审延期申请子项yanqi_zhi不能为空");
|
}
|
ZoneId zoneId = ZoneId.of("Asia/Shanghai");
|
LocalDate date = value.toInstant().atZone(zoneId).toLocalDate();
|
return Date.from(date.plusDays(1).atStartOfDay(zoneId).toInstant());
|
}
|
|
private String requireValue(String value, String fieldName) throws DataException {
|
String result = value == null ? "" : value.trim();
|
if (result.isEmpty()) {
|
throw new DataException(fieldName + "不能为空");
|
}
|
return result;
|
}
|
}
|