刘光辉
4 小时以前 06f314545ac3514d7ce28939920866ae8188d31c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
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();
    }
}