mitao
2025-01-15 da8bd34ef4e721b9d6255f983c68ef3975d0962d
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
package com.zzg.web.controller.state;
 
import cn.afterturn.easypoi.word.WordExportUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.github.pagehelper.PageInfo;
import com.zzg.common.constant.state.UrlConstants;
import com.zzg.common.core.domain.AjaxResult;
import com.zzg.common.core.domain.entity.state.StateAgreement;
import com.zzg.common.core.domain.entity.state.StateHousehold;
import com.zzg.common.core.domain.entity.state.StateProject;
import com.zzg.common.enums.AgreementTypeEnum;
import com.zzg.common.enums.ProcessCategoryEnum;
import com.zzg.common.enums.SubmitStatusEnum;
import com.zzg.common.exception.GlobalException;
import com.zzg.common.utils.file.FileUtils;
import com.zzg.system.domain.bo.*;
import com.zzg.system.domain.vo.AgreementDetailVO;
import com.zzg.system.domain.vo.StateAgreementVO;
import com.zzg.system.service.state.StateAgreementService;
import com.zzg.system.service.state.StateHouseholdService;
import com.zzg.system.service.state.StateProcessTemplateService;
import com.zzg.system.service.state.StateProjectService;
import lombok.RequiredArgsConstructor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springframework.http.MediaType;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
 
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;
 
@RestController
@RequiredArgsConstructor
public class StateAgreementController {
 
    private final StateAgreementService stateAgreementService;
    private final StateHouseholdService stateHouseholdService;
    private final StateProcessTemplateService stateProcessTemplateService;
    private final StateProjectService stateProjectService;
    // 新增协议
    @PostMapping(UrlConstants.STATE_AGREEMENT_SAVE)
    public AjaxResult<Boolean> createAgreement(@RequestBody StateAgreementSaveBO saveBO) {
        //根据协议类型和房产id进行排重 每个协议只能存在一份
        LambdaQueryWrapper<StateAgreement> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(StateAgreement::getAgreementFileType, saveBO.getAgreementFileType());
        queryWrapper.eq(StateAgreement::getStateHouseholdId, saveBO.getStateHouseholdId());
        queryWrapper.isNotNull(StateAgreement::getAgreementNumber);
 
        StateAgreement stateAgreement = stateAgreementService.getOne(queryWrapper);
        if (ObjectUtil.isNotEmpty(stateAgreement) && Objects.isNull(saveBO.getId())) {
            throw new GlobalException("每种协议类型只能存在一份");
        }
 
        if (!CollectionUtils.isEmpty(saveBO.getFileBOList())) {
            saveBO.setFileUrl(JSON.toJSONString(saveBO.getFileBOList()));
            String appendFileName = saveBO.getFileBOList().stream().map(FileBO::getOriginalFilename).collect(Collectors.joining(","));
            saveBO.setAppendFileName(appendFileName);
        }
        return AjaxResult.success(stateAgreementService.saveOrUpdate(saveBO));
    }
    // 模拟转征收
    @PostMapping(UrlConstants.STATE_AGREEMENT_UPDATE)
    public AjaxResult<Boolean> updateAgreement(@RequestBody UpdateAgreementBO bo) {
        return AjaxResult.success(stateAgreementService.updateStateAgreement(bo.getHouseId()));
    }
    // 更新协议
    @PostMapping(UrlConstants.STATE_AGREEMENT_UPDATE_AGREEMENT)
    public AjaxResult<StateAgreementSaveBO> updateAgreement(@RequestBody StateAgreementSaveBO saveBO) {
        if (!CollectionUtils.isEmpty(saveBO.getFileBOList())) {
            saveBO.setFileUrl(JSON.toJSONString(saveBO.getFileBOList()));
            String appendFileName = saveBO.getFileBOList().stream().map(FileBO::getOriginalFilename).collect(Collectors.joining(","));
            saveBO.setAppendFileName(appendFileName);
        }
        stateAgreementService.saveOrUpdate(saveBO);
        return AjaxResult.success(saveBO);
    }
    // 协议详情 - 编辑 -删除按钮
    @GetMapping(UrlConstants.STATE_AGREEMENT_DEL)
    public AjaxResult<Boolean> deleteAgreement(@RequestParam String agreementId) {
        StateAgreement stateAgreement = stateAgreementService.getById(agreementId);
        if (ObjectUtil.isNull(stateAgreement)) {
            throw new GlobalException("该协议不存在");
        }
        List<Integer> fileList = Stream.of(AgreementTypeEnum.values()).map(AgreementTypeEnum::getValue).collect(Collectors.toList());
 
        //保留固定协议数据
        if (fileList.contains(stateAgreement.getAgreementFileType())
                && !Objects.equals(stateAgreement.getAgreementFileType(), AgreementTypeEnum.OTHER_AGREEMENT.getValue())) {
            LambdaUpdateWrapper<StateAgreement> updateWrapper = new LambdaUpdateWrapper<>();
            updateWrapper.eq(StateAgreement::getId, stateAgreement.getId()) // 根据 ID 进行更新
                    .set(StateAgreement::getSignAt, null)
                    .set(StateAgreement::getMoney, null)
                    .set(StateAgreement::getAppendFileName, null)
                    .set(StateAgreement::getAgreementNumber, null)
                    .set(StateAgreement::getFileUrl, null);
            return AjaxResult.success(stateAgreementService.update(updateWrapper));
        }
        return AjaxResult.success(stateAgreementService.removeById(agreementId));
    }
    // 协议管理 - 页面查询
    @PostMapping(UrlConstants.STATE_AGREEMENT_LIST)
    public AjaxResult<PageInfo<StateAgreementVO>> listStateAgreement(@RequestBody StateAgreementBO request) {
        return AjaxResult.success(stateAgreementService.listDataByCondition(request));
    }
    // 协议详情
    @GetMapping(UrlConstants.STATE_AGREEMENT_DETAIL)
    public AjaxResult<List<AgreementDetailVO>> getAgreementDetail(@RequestParam String stateHouseId) {
        return AjaxResult.success(stateAgreementService.listAgreementDetailByHouseId(stateHouseId));
    }
    //生成协议word
    @GetMapping(UrlConstants.STATE_AGREEMENT_GENERATE)
    public void generateAgreementDetail(
            @RequestParam String stateHouseholdId,
            @RequestParam String stateAgreementId,
            HttpServletResponse response
    ) throws Exception {
        StateAgreementBO request = new StateAgreementBO();
        request.setStateHouseholdId(stateHouseholdId);
        Map<String, Object> wordData = stateAgreementService.getWordData(stateHouseholdId, stateAgreementId);
        LambdaQueryWrapper<StateAgreement> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(StateAgreement::getId, stateAgreementId)
                .eq(StateAgreement::getStateHouseholdId, stateHouseholdId);
        StateAgreement one = stateAgreementService.getOne(queryWrapper);
        Integer agreementFileType = one.getAgreementFileType();
        AgreementTypeEnum enumByValue = AgreementTypeEnum.getEnumByValue(agreementFileType);
        String templatePath;
        switch (enumByValue) {
            case STATE_AGREEMENT:
                templatePath = "templates/成都市国有土地上房屋征收补协议.docx";
                break;
            case VIRTUAL_STATE_AGREEMENT:
                templatePath = "templates/成都市国有土地上房屋模拟搬迁补偿协议(房屋征收).docx";
                break;
            case VIRTUAL_STATE_MOVE_AGREEMENT:
                templatePath = "templates/成都市国有土地上房屋模拟搬迁补偿协议(协议搬迁).docx";
                break;
            default:
                templatePath = "templates/word_template.docx";
        }
 
        XWPFDocument document = WordExportUtil.exportWord07(templatePath, wordData);
        response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
        // 4. 设置响应头,生成下载
        FileUtils.setAttachmentResponseHeader(response, "协议文件.docx");
        // 5. 将生成的文档写入响应流
        document.write(response.getOutputStream());
        document.close();
    }
 
    //协议提交审核接口
    @GetMapping(UrlConstants.STATE_AGREEMENT_WORKFLOW_SUBMIT)
    public AjaxResult<Boolean> submitAgreement(@RequestParam List<String> agreementId) {
        if (CollectionUtils.isEmpty(agreementId)) {
            return AjaxResult.success(Boolean.FALSE);
        }
        List<StateAgreement> agreementList = stateAgreementService.listByIds(agreementId);
        if (CollectionUtils.isEmpty(agreementList)) {
            return AjaxResult.success(false);
        }
        agreementList.forEach(stateAgreement -> stateAgreement.setAuditStatus(SubmitStatusEnum.SUBMITTED.getValue()));
        StateHousehold stateHousehold = stateHouseholdService.getById(agreementList.get(0).getStateHouseholdId());
        if (ObjectUtil.isNotEmpty(stateHousehold)) {
            //审核中
            stateHousehold.setAgreementStatus(SubmitStatusEnum.PENDING_REVIEW.getValue());
            stateHouseholdService.updateById(stateHousehold);
 
            //提交审核(协议签订)
            ProcessStartBO processStartBO = new ProcessStartBO();
            processStartBO.setCategory(ProcessCategoryEnum.CATEGORY3.getValue().toString());
            processStartBO.setModuleName("协议签订");
            //查询征收单位
            StateProject stateProject = stateProjectService.getProjectById(stateHousehold.getStateProjectId());
            String name = ObjectUtil.isEmpty(stateProject) ? "" : stateProject.getProjectName();
            processStartBO.setName(name);
 
            String cedName = ObjectUtil.isEmpty(stateProject) ? "" : stateProject.getDepartment();
            String remark = String.format("【镇/街】:%s,【征收实施单位】:%s", stateHousehold.getBelongingStreetTown(), cedName);
            processStartBO.setRemark(remark);
            Map<String, Object> variable = new HashMap<>();
            variable.put("stateHouseholdId", stateHousehold.getId());
            processStartBO.setVariable(variable);
            stateProcessTemplateService.start(processStartBO);
        }
        return AjaxResult.success(stateAgreementService.saveOrUpdateBatch(agreementList));
    }
}