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 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 zixiangs, List receipts) throws DataException { List 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 query = new LambdaQueryWrapper<>(); query.eq(DmsWenjianFushenYanqiShenqingEntity::getFlowId, flowId) .eq(DmsWenjianFushenYanqiShenqingEntity::getFlowTaskId, taskId) .isNull(DmsWenjianFushenYanqiShenqingEntity::getDeleteMark); List 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 findZixiangs(String shenqingId) { LambdaQueryWrapper 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; } }