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<DmsWenjianXiazaiShenqingDetailEntity> zixiangs = findZixiangs(shenqing.getId());
|
Set<String> banbenIds = extractBanbenIds(zixiangs);
|
Map<String, DmsWenjianBanbenEntity> banbenById = findBanbens(banbenIds);
|
List<DownloadAuthorizationTarget> targets = buildAuthorizationTargets(zixiangs, banbenById);
|
DmsPersonalFolderDownloadForm downloadForm = buildDownloadForm(shenqing, targets);
|
|
ActionResult<DmsPersonalFolderAddResultVO> 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<DmsWenjianXiazaiShenqingEntity> query = new LambdaQueryWrapper<>();
|
query.eq(DmsWenjianXiazaiShenqingEntity::getFlowId, flowId)
|
.eq(DmsWenjianXiazaiShenqingEntity::getFlowTaskId, flowTaskId)
|
.isNull(DmsWenjianXiazaiShenqingEntity::getDeleteMark);
|
List<DmsWenjianXiazaiShenqingEntity> 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<DmsWenjianXiazaiShenqingDetailEntity> findZixiangs(String shenqingId) {
|
LambdaQueryWrapper<DmsWenjianXiazaiShenqingDetailEntity> query = new LambdaQueryWrapper<>();
|
query.eq(DmsWenjianXiazaiShenqingDetailEntity::getRequestId, shenqingId)
|
.isNull(DmsWenjianXiazaiShenqingDetailEntity::getDeleteMark);
|
List<DmsWenjianXiazaiShenqingDetailEntity> rows = zixiangMapper.selectList(query);
|
if (rows.isEmpty()) {
|
throw new DataException("文件下载申请未关联下载明细,无法授权");
|
}
|
return rows;
|
}
|
|
/** 从下载明细提取业务版本 ID,并保持原顺序去重。 */
|
private Set<String> extractBanbenIds(List<DmsWenjianXiazaiShenqingDetailEntity> zixiangs) {
|
Set<String> ids = new LinkedHashSet<>();
|
for (DmsWenjianXiazaiShenqingDetailEntity zixiang : zixiangs) {
|
ids.add(requireValue(zixiang.getBanbenId(), "文件下载明细版本ID(banben_id)"));
|
}
|
return ids;
|
}
|
|
/** 按明细版本 ID 查询未删除的业务文件版本。 */
|
private Map<String, DmsWenjianBanbenEntity> findBanbens(Set<String> banbenIds) {
|
LambdaQueryWrapper<DmsWenjianBanbenEntity> query = new LambdaQueryWrapper<>();
|
query.in(DmsWenjianBanbenEntity::getId, banbenIds)
|
.isNull(DmsWenjianBanbenEntity::getDeleteMark);
|
List<DmsWenjianBanbenEntity> rows = banbenMapper.selectList(query);
|
if (rows.size() != banbenIds.size()) {
|
throw new DataException("部分下载明细未找到对应的有效文件版本");
|
}
|
|
Map<String, DmsWenjianBanbenEntity> result = new LinkedHashMap<>();
|
for (DmsWenjianBanbenEntity row : rows) {
|
result.put(row.getId(), row);
|
}
|
return result;
|
}
|
|
/** 关联下载时限与文件中心文件、版本 ID,形成待授权数据。 */
|
private List<DownloadAuthorizationTarget> buildAuthorizationTargets(
|
List<DmsWenjianXiazaiShenqingDetailEntity> zixiangs,
|
Map<String, DmsWenjianBanbenEntity> banbenById) {
|
List<DownloadAuthorizationTarget> 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<DownloadAuthorizationTarget> targets) {
|
List<DmsPersonalFolderDownloadForm.FileRelation> 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;
|
}
|
}
|
}
|