package jnpf.dmsService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import jnpf.audit.sdk.annotation.AuditLog; import jnpf.base.ActionResult; import jnpf.base.ActionResultCode; import jnpf.dms.DmsResourceApi; import jnpf.dmsEntity.DmsWenjianBanbenEntity; import jnpf.dmsEntity.permission.form.DmsPersonalFolderFileForm; import jnpf.dmsEntity.print.form.DmsWorkflowPrintFilesGrantForm; import jnpf.dmsEntity.print.vo.DmsWorkflowPrintFilesGrantResultVO; import jnpf.dmsEntity.waifa.DmsWenjianWaifaShenqingDetailEntity; import jnpf.dmsEntity.waifa.DmsWenjianWaifaShenqingEntity; import jnpf.dmsMapper.DmsWenjianBanbenMapper; import jnpf.dmsMapper.DmsWenjianWaifaShenqingDetailMapper; import jnpf.dmsMapper.DmsWenjianWaifaShenqingMapper; import jnpf.exception.DataException; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.UUID; /** 文件辅助管理中的外发打印授权业务。 */ @Service @RequiredArgsConstructor public class DmsWenjianFuzhuGuanliWaifaService { private static final String FLOWABLE_SERVICE_ID = "jnpf-flowable"; private final DmsWenjianWaifaShenqingMapper shenqingMapper; private final DmsWenjianWaifaShenqingDetailMapper zixiangMapper; private final DmsWenjianBanbenMapper banbenMapper; private final DmsResourceApi dmsResourceApi; /** 按外发申请明细 ID 标记为已打印。 */ public void waifaYidayin(String id) { String normalizedId = requireValue(id, "外发申请明细ID(id)"); LambdaUpdateWrapper update = new LambdaUpdateWrapper<>(); update.eq(DmsWenjianWaifaShenqingDetailEntity::getId, normalizedId) .set(DmsWenjianWaifaShenqingDetailEntity::getShifouYidayin, "yes"); if (zixiangMapper.update(null, update) != 1) { throw new DataException("未找到对应的外发申请明细:id=" + normalizedId); } } /** 根据流程对应的外发申请,为申请人永久授予相关文件版本的打印权限。 */ public DmsWorkflowPrintFilesGrantResultVO waifaWenjianShouquan( String flowId, String flowTaskId) { String normalizedFlowId = requireValue(flowId, "流程ID(flow_id)"); String normalizedFlowTaskId = requireValue(flowTaskId, "流程任务ID(flow_task_id)"); DmsWenjianWaifaShenqingEntity shenqing = findShenqing( normalizedFlowId, normalizedFlowTaskId); Set banbenIds = findBanbenIds(shenqing.getId()); List banbens = findBanbens(banbenIds); DmsWorkflowPrintFilesGrantForm grantForm = buildGrantForm(shenqing, banbens); ActionResult response; try { response = dmsResourceApi.grantWorkflowPrintFiles( FLOWABLE_SERVICE_ID, grantForm); } 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 DmsWenjianWaifaShenqingEntity findShenqing(String flowId, String flowTaskId) { LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.eq(DmsWenjianWaifaShenqingEntity::getFlowId, flowId) .eq(DmsWenjianWaifaShenqingEntity::getFlowTaskId, flowTaskId) .isNull(DmsWenjianWaifaShenqingEntity::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); } /** 查询申请明细并提取非空的业务版本 ID,保持原顺序去重。 */ private Set findBanbenIds(String shenqingId) { LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.eq(DmsWenjianWaifaShenqingDetailEntity::getRequestId, shenqingId) .isNull(DmsWenjianWaifaShenqingDetailEntity::getDeleteMark); List rows = zixiangMapper.selectList(query); if (rows.isEmpty()) { throw new DataException("文件外发申请未关联外发明细,无法授权"); } Set ids = new LinkedHashSet<>(); for (DmsWenjianWaifaShenqingDetailEntity row : rows) { ids.add(requireValue(row.getBanbenId(), "文件外发明细版本ID(banben_id)")); } return ids; } /** 按明细版本 ID 查询全部未删除的业务文件版本。 */ private List 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("部分外发明细未找到对应的有效文件版本"); } return rows; } /** 组装永久有效的文件打印授权请求。 */ private DmsWorkflowPrintFilesGrantForm buildGrantForm( DmsWenjianWaifaShenqingEntity shenqing, List banbens) { List files = new ArrayList<>(banbens.size()); for (DmsWenjianBanbenEntity banben : banbens) { DmsPersonalFolderFileForm.FileRelation relation = new DmsPersonalFolderFileForm.FileRelation(); try { relation.setDocumentId(UUID.fromString(banben.getWenjianZhongxinWenjianId())); relation.setFileVersionId(UUID.fromString(banben.getWenjianZhongxinBanbenId())); } catch (IllegalArgumentException exception) { throw new DataException("文件中心文件ID或版本ID格式不正确:banben_id=" + banben.getId()); } relation.setValidTo(null); files.add(relation); } DmsWorkflowPrintFilesGrantForm form = new DmsWorkflowPrintFilesGrantForm(); form.setUserId(requireValue( shenqing.getApplicantUserId(), "文件外发申请人(shenqing_ren)")); form.setFiles(files); return form; } 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(); } }