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<DmsWenjianWaifaShenqingDetailEntity> 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<String> banbenIds = findBanbenIds(shenqing.getId());
|
List<DmsWenjianBanbenEntity> banbens = findBanbens(banbenIds);
|
DmsWorkflowPrintFilesGrantForm grantForm = buildGrantForm(shenqing, banbens);
|
|
ActionResult<DmsWorkflowPrintFilesGrantResultVO> 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<DmsWenjianWaifaShenqingEntity> query = new LambdaQueryWrapper<>();
|
query.eq(DmsWenjianWaifaShenqingEntity::getFlowId, flowId)
|
.eq(DmsWenjianWaifaShenqingEntity::getFlowTaskId, flowTaskId)
|
.isNull(DmsWenjianWaifaShenqingEntity::getDeleteMark);
|
List<DmsWenjianWaifaShenqingEntity> 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<String> findBanbenIds(String shenqingId) {
|
LambdaQueryWrapper<DmsWenjianWaifaShenqingDetailEntity> query =
|
new LambdaQueryWrapper<>();
|
query.eq(DmsWenjianWaifaShenqingDetailEntity::getRequestId, shenqingId)
|
.isNull(DmsWenjianWaifaShenqingDetailEntity::getDeleteMark);
|
List<DmsWenjianWaifaShenqingDetailEntity> rows = zixiangMapper.selectList(query);
|
if (rows.isEmpty()) {
|
throw new DataException("文件外发申请未关联外发明细,无法授权");
|
}
|
Set<String> ids = new LinkedHashSet<>();
|
for (DmsWenjianWaifaShenqingDetailEntity row : rows) {
|
ids.add(requireValue(row.getBanbenId(), "文件外发明细版本ID(banben_id)"));
|
}
|
return ids;
|
}
|
|
/** 按明细版本 ID 查询全部未删除的业务文件版本。 */
|
private List<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("部分外发明细未找到对应的有效文件版本");
|
}
|
return rows;
|
}
|
|
/** 组装永久有效的文件打印授权请求。 */
|
private DmsWorkflowPrintFilesGrantForm buildGrantForm(
|
DmsWenjianWaifaShenqingEntity shenqing,
|
List<DmsWenjianBanbenEntity> banbens) {
|
List<DmsPersonalFolderFileForm.FileRelation> 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();
|
}
|
}
|