刘光辉
5 小时以前 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
package jnpf.dmsService.impl;
 
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import jnpf.audit.sdk.annotation.AuditLog;
import jnpf.dmsEntity.DmsWenjianFushenYanqiShenqingEntity;
import jnpf.dmsEntity.DmsWenjianFushenYanqiShenqingZixiangEntity;
import jnpf.dmsEntity.storage.form.DmsFileExtendValidityForm;
import jnpf.dmsEntity.storage.form.DmsFileExtendValidityForm.FileRequest;
import jnpf.dmsMapper.DmsWenjianFushenYanqiShenqingMapper;
import jnpf.dmsMapper.DmsWenjianFushenYanqiShenqingZixiangMapper;
import jnpf.dmsMapper.DmsWenjianZiyuanMapper;
import jnpf.dmsService.DmsFileValidityService;
import jnpf.dmsService.DmsWenjianFushenYanqiShenqingTongguoService;
import jnpf.exception.DataException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
 
@Service
@RequiredArgsConstructor
public class DmsWenjianFushenYanqiShenqingTongguoServiceImpl
        implements DmsWenjianFushenYanqiShenqingTongguoService {
 
    private static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
 
    private final DmsWenjianFushenYanqiShenqingMapper shenqingMapper;
    private final DmsWenjianFushenYanqiShenqingZixiangMapper zixiangMapper;
    private final DmsWenjianZiyuanMapper ziyuanMapper;
    private final DmsFileValidityService fileValidityService;
    private final jnpf.dmsService.DmsBusinessLifecycleGuard businessOccupancy;
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    @AuditLog(
            action = "FILE_REVIEW_EXTENSION_APPROVE",
            label = "文件复审延期申请审批通过",
            bizModule = "文件复审延期申请",
            bizType = "DMS_FILE_REVIEW_EXTENSION",
            bizCodeExpr = "#result",
            targetTable = "wenjian_fushen_yanqi_shenqing",
            targetIdExpr = "#result"
    )
    public String tongguo(String flowId, String taskId) throws DataException {
        String normalizedFlowId = requireValue(flowId, "流程ID(flow_id)");
        String normalizedTaskId = requireValue(taskId, "流程任务ID(task_id)");
        DmsWenjianFushenYanqiShenqingEntity shenqing = findApplication(
                normalizedFlowId, normalizedTaskId);
        List<DmsWenjianFushenYanqiShenqingZixiangEntity> zixiangs = findZixiangs(shenqing.getId());
        var receipts=businessOccupancy.requireCurrentUserExtension(normalizedTaskId,shenqing.getId(),
                zixiangs.stream().map(DmsWenjianFushenYanqiShenqingZixiangEntity::getWenjianId).toList());
        String fushenRiqi = formatDate(shenqing.getShenqingRiqi());
 
        if (!zixiangs.isEmpty()) {
            fileValidityService.extendValidity(buildExtendValidityForm(
                    normalizedFlowId, normalizedTaskId, zixiangs, receipts));
        }
        for (DmsWenjianFushenYanqiShenqingZixiangEntity zixiang : zixiangs) {
            String wenjianId = requireValue(zixiang.getWenjianId(), "文件复审延期申请子项wenjian_id");
            int updated = ziyuanMapper.updateReviewExtension(
                    wenjianId, zixiang.getYanqiZhi(), shenqing.getId(), fushenRiqi);
            if (updated != 1) {
                throw new DataException("未找到可更新的文件资源:wenjian_id=" + wenjianId);
            }
        }
        businessOccupancy.completeExecution(receipts);
        return shenqing.getId();
    }
 
    private DmsFileExtendValidityForm buildExtendValidityForm(
            String flowId, String taskId,
            List<DmsWenjianFushenYanqiShenqingZixiangEntity> zixiangs,
            List<jnpf.dmsBusinessOccupancy.BusinessFileOccupancy> receipts) throws DataException {
        List<FileRequest> files = new ArrayList<>(zixiangs.size());
        for (DmsWenjianFushenYanqiShenqingZixiangEntity zixiang : zixiangs) {
            String wenjianId = requireValue(zixiang.getWenjianId(), "文件复审延期申请子项wenjian_id");
            String fileVersionId = requireValue(receipts.isEmpty() ? ziyuanMapper.selectFileVersionIdByWenjianId(wenjianId)
                    : receipts.stream().filter(r -> wenjianId.equals(r.getFileId())).findFirst().orElseThrow().getCenterVersionId(),
                    "文件中心版本ID:wenjian_id=" + wenjianId);
            FileRequest file = new FileRequest();
            try {
                file.setFileVersionId(UUID.fromString(fileVersionId));
            } catch (IllegalArgumentException exception) {
                throw new DataException("文件中心版本ID格式不正确:wenjian_id=" + wenjianId);
            }
            file.setEffectiveTo(endOfDay(zixiang.getYanqiZhi()));
            files.add(file);
        }
        DmsFileExtendValidityForm form = new DmsFileExtendValidityForm();
        form.setSourceId(flowId);
        form.setTaskId(taskId);
        form.setFiles(files);
        return form;
    }
 
    private DmsWenjianFushenYanqiShenqingEntity findApplication(String flowId, String taskId)
            throws DataException {
        LambdaQueryWrapper<DmsWenjianFushenYanqiShenqingEntity> query = new LambdaQueryWrapper<>();
        query.eq(DmsWenjianFushenYanqiShenqingEntity::getFlowId, flowId)
                .eq(DmsWenjianFushenYanqiShenqingEntity::getFlowTaskId, taskId)
                .isNull(DmsWenjianFushenYanqiShenqingEntity::getDeleteMark);
        List<DmsWenjianFushenYanqiShenqingEntity> applications = shenqingMapper.selectList(query);
        if (applications == null || applications.isEmpty()) {
            throw new DataException("未找到文件复审延期申请:flow_id=" + flowId + ", task_id=" + taskId);
        }
        if (applications.size() > 1) {
            throw new DataException("flow_id与task_id关联了多条文件复审延期申请,无法确认通过记录");
        }
        return applications.get(0);
    }
 
    private List<DmsWenjianFushenYanqiShenqingZixiangEntity> findZixiangs(String shenqingId) {
        LambdaQueryWrapper<DmsWenjianFushenYanqiShenqingZixiangEntity> query = new LambdaQueryWrapper<>();
        query.eq(DmsWenjianFushenYanqiShenqingZixiangEntity::getForeignId, shenqingId)
                .isNull(DmsWenjianFushenYanqiShenqingZixiangEntity::getDeleteMark);
        return zixiangMapper.selectList(query);
    }
 
    private String formatDate(Date value) {
        return value == null ? null : new SimpleDateFormat(DATE_TIME_PATTERN).format(value);
    }
 
    private Date endOfDay(Date value) throws DataException {
        if (value == null) {
            throw new DataException("文件复审延期申请子项yanqi_zhi不能为空");
        }
        ZoneId zoneId = ZoneId.of("Asia/Shanghai");
        LocalDate date = value.toInstant().atZone(zoneId).toLocalDate();
        return Date.from(date.plusDays(1).atStartOfDay(zoneId).toInstant());
    }
 
    private String requireValue(String value, String fieldName) throws DataException {
        String result = value == null ? "" : value.trim();
        if (result.isEmpty()) {
            throw new DataException(fieldName + "不能为空");
        }
        return result;
    }
}