package jnpf.dmsService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import jnpf.base.ActionResult; import jnpf.base.ActionResultCode; import jnpf.dms.DmsResourceApi; import jnpf.dmsEntity.DmsWenjianBanbenEntity; import jnpf.dmsEntity.download.entity.DmsWenjianXiazaiShenqingDetailEntity; import jnpf.dmsEntity.download.entity.DmsWenjianXiazaiShenqingEntity; import jnpf.dmsEntity.permission.form.DmsPersonalFolderDownloadForm; import jnpf.dmsEntity.permission.vo.DmsPersonalFolderAddResultVO; import jnpf.dmsMapper.DmsWenjianBanbenMapper; import jnpf.dmsMapper.DmsWenjianXiazaiShenqingDetailMapper; import jnpf.dmsMapper.DmsWenjianXiazaiShenqingMapper; import jnpf.exception.DataException; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Date; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; /** 文件辅助管理中的下载授权业务。 */ @Service @RequiredArgsConstructor public class DmsWenjianFuzhuGuanliXiazaiService { private static final String FLOWABLE_SERVICE_ID = "jnpf-flowable"; private final DmsWenjianXiazaiShenqingMapper shenqingMapper; private final DmsWenjianXiazaiShenqingDetailMapper zixiangMapper; private final DmsWenjianBanbenMapper banbenMapper; private final DmsResourceApi dmsResourceApi; /** * 根据流程申请把获批下载的文件版本加入申请人的个人文件夹。 */ public DmsPersonalFolderAddResultVO xiazaiWenjianShouquan( String flowId, String flowTaskId) { String normalizedFlowId = requireValue(flowId, "流程ID(flow_id)"); String normalizedFlowTaskId = requireValue(flowTaskId, "流程任务ID(flow_task_id)"); DmsWenjianXiazaiShenqingEntity shenqing = findShenqing( normalizedFlowId, normalizedFlowTaskId); List zixiangs = findZixiangs(shenqing.getId()); Set banbenIds = extractBanbenIds(zixiangs); Map banbenById = findBanbens(banbenIds); List targets = buildAuthorizationTargets(zixiangs, banbenById); DmsPersonalFolderDownloadForm downloadForm = buildDownloadForm(shenqing, targets); ActionResult response; try { response = dmsResourceApi.addDownloadedFilesToPersonalFolder( FLOWABLE_SERVICE_ID, downloadForm); } catch (RuntimeException exception) { throw new DataException("调用DMS个人文件夹下载授权接口失败"); } if (response == null || !ActionResultCode.SUCCESS.getCode().equals(response.getCode()) || response.getData() == null) { String message = response == null ? null : response.getMsg(); throw new DataException(isBlank(message) ? "下载文件授权失败或响应数据不完整" : message); } return response.getData(); } /** 查询流程唯一对应的未删除下载申请。 */ private DmsWenjianXiazaiShenqingEntity findShenqing(String flowId, String flowTaskId) { LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.eq(DmsWenjianXiazaiShenqingEntity::getFlowId, flowId) .eq(DmsWenjianXiazaiShenqingEntity::getFlowTaskId, flowTaskId) .isNull(DmsWenjianXiazaiShenqingEntity::getDeleteMark); List rows = shenqingMapper.selectList(query); if (rows.isEmpty()) { throw new DataException("未找到文件下载申请:flow_id=" + flowId + ", flow_task_id=" + flowTaskId); } if (rows.size() > 1) { throw new DataException("flow_id与flow_task_id关联了多条文件下载申请,无法授权"); } return rows.get(0); } /** 根据申请主键查询未删除的下载申请明细。 */ private List findZixiangs(String shenqingId) { LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.eq(DmsWenjianXiazaiShenqingDetailEntity::getRequestId, shenqingId) .isNull(DmsWenjianXiazaiShenqingDetailEntity::getDeleteMark); List rows = zixiangMapper.selectList(query); if (rows.isEmpty()) { throw new DataException("文件下载申请未关联下载明细,无法授权"); } return rows; } /** 从下载明细提取业务版本 ID,并保持原顺序去重。 */ private Set extractBanbenIds(List zixiangs) { Set ids = new LinkedHashSet<>(); for (DmsWenjianXiazaiShenqingDetailEntity zixiang : zixiangs) { ids.add(requireValue(zixiang.getBanbenId(), "文件下载明细版本ID(banben_id)")); } return ids; } /** 按明细版本 ID 查询未删除的业务文件版本。 */ private Map findBanbens(Set banbenIds) { LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.in(DmsWenjianBanbenEntity::getId, banbenIds) .isNull(DmsWenjianBanbenEntity::getDeleteMark); List rows = banbenMapper.selectList(query); if (rows.size() != banbenIds.size()) { throw new DataException("部分下载明细未找到对应的有效文件版本"); } Map result = new LinkedHashMap<>(); for (DmsWenjianBanbenEntity row : rows) { result.put(row.getId(), row); } return result; } /** 关联下载时限与文件中心文件、版本 ID,形成待授权数据。 */ private List buildAuthorizationTargets( List zixiangs, Map banbenById) { List targets = new ArrayList<>(zixiangs.size()); for (DmsWenjianXiazaiShenqingDetailEntity zixiang : zixiangs) { String banbenId = zixiang.getBanbenId().trim(); requireValue(zixiang.getXiazaiShixian(), "文件下载明细下载时限(xiazai_shixian)"); DmsWenjianBanbenEntity banben = banbenById.get(banbenId); if (banben == null) { throw new DataException("未找到文件版本:banben_id=" + banbenId); } requireValue(banben.getWenjianZhongxinBanbenId(), "文件中心版本ID"); requireValue(banben.getWenjianZhongxinWenjianId(), "文件中心文件ID"); targets.add(new DownloadAuthorizationTarget(zixiang, banben)); } return targets; } /** 组装个人文件夹下载授权请求。 */ private DmsPersonalFolderDownloadForm buildDownloadForm( DmsWenjianXiazaiShenqingEntity shenqing, List targets) { List files = new ArrayList<>(targets.size()); for (DownloadAuthorizationTarget target : targets) { DmsPersonalFolderDownloadForm.FileRelation relation = new DmsPersonalFolderDownloadForm.FileRelation(); try { relation.setDocumentId(UUID.fromString( target.banben.getWenjianZhongxinWenjianId().trim())); relation.setFileVersionId(UUID.fromString( target.banben.getWenjianZhongxinBanbenId().trim())); } catch (IllegalArgumentException exception) { throw new DataException("文件中心文件ID或版本ID格式不正确:banben_id=" + target.banben.getId()); } relation.setValidTo(calculateValidTo( target.zixiang.getXiazaiShixian(), target.banben.getId())); files.add(relation); } DmsPersonalFolderDownloadForm form = new DmsPersonalFolderDownloadForm(); form.setUserId(requireValue(shenqing.getApplicantUserId(), "文件下载申请人(shenqing_ren)")); form.setFiles(files); form.setRequestId(shenqing.getId()); return form; } /** 将下载时限转换为当天结束时间;na 表示永久有效。 */ private Date calculateValidTo(String rawXiazaiShixian, String banbenId) { return DmsDownloadDeadline.resolve(rawXiazaiShixian, banbenId); } private String requireValue(String value, String fieldName) { if (isBlank(value)) { throw new DataException(fieldName + "不能为空"); } return value.trim(); } private boolean isBlank(String value) { return value == null || value.trim().isEmpty(); } /** 单条待授权文件数据。 */ private static final class DownloadAuthorizationTarget { private final DmsWenjianXiazaiShenqingDetailEntity zixiang; private final DmsWenjianBanbenEntity banben; private DownloadAuthorizationTarget(DmsWenjianXiazaiShenqingDetailEntity zixiang, DmsWenjianBanbenEntity banben) { this.zixiang = zixiang; this.banben = banben; } } }