yanghb
2024-12-24 a9bfa50919ff24f44848bbfc07d458b3108d63be
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
package com.zzg.web.controller.state;
 
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
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.StateHousehold;
import com.zzg.common.core.domain.entity.state.StateProject;
import com.zzg.common.core.domain.entity.state.StateProjectCollectionFile;
import com.zzg.common.core.domain.entity.state.StateProjectNotice;
import com.zzg.common.enums.HouseSearchStatusEnum;
import com.zzg.common.enums.StateProjectStatusEnum;
import com.zzg.common.exception.GlobalException;
import com.zzg.common.utils.DateUtils;
import com.zzg.system.convert.StateProjectConvert;
import com.zzg.system.domain.bo.*;
import com.zzg.system.domain.vo.CalculateCompensationVO;
import com.zzg.system.domain.vo.ParentCollectionFileVO;
import com.zzg.system.domain.vo.ProjectImplPageVO;
import com.zzg.system.domain.vo.StateProjectNoticeVO;
import com.zzg.system.service.state.*;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
 
import java.util.List;
import java.util.Objects;
 
@Slf4j
@RestController
@RequiredArgsConstructor
public class StateProjectController {
 
    private final StateProjectService stateProjectService;
    private final StateProjectCollectionFileService stateProjectCollectionFileService;
    private final StateProjectNoticeService stateProjectNoticeService;
    private final StateHouseholdService stateHouseholdService;
 
    // 查询所有项目
    @GetMapping(UrlConstants.STATE_PROJECT_LIST)
    public AjaxResult<List<StateProject>> list() {
        return AjaxResult.success(stateProjectService.list());
    }
 
    // 分页查询
    @PostMapping(UrlConstants.STATE_PROJECT_PAGE)
    @ApiOperation(value = "分页查询项目列表", notes = "分页查询项目列表")
    public AjaxResult<JSONObject> page(@RequestBody GetProjectPageBO getProjectPageBO) {
        return AjaxResult.success(stateProjectService.getPage(getProjectPageBO));
    }
 
    // 分页查询
    @PostMapping(UrlConstants.STATE_PROJECT_PAGE_APPLY_RECORD)
    @ApiOperation(value = "分页查询项目列表 仅针对住宅临时安置费处进行查询", notes = "分页查询项目列表")
    public AjaxResult<JSONObject> pageForApplyRecord(@RequestBody GetProjectPageBO getProjectPageBO) {
        return AjaxResult.success(stateProjectService.getPageForApplyRecord(getProjectPageBO));
    }
 
    // 根据ID查询项目
    @GetMapping(UrlConstants.STATE_PROJECT_GET_BY_ID)
    public AjaxResult<StateProjectBO> getById(@PathVariable String id) {
        return AjaxResult.success(stateProjectService.getProjectInfoById(id));
    }
 
    @GetMapping(UrlConstants.STATE_PROJECT_GET_STREET_BY_ID)
    public AjaxResult<String[]> getProjectBelongingStreetTownById(@PathVariable String id) {
        return AjaxResult.success(stateProjectService.getProjectBelongingStreetTownById(id));
    }
 
    // 创建项目
    @PostMapping(UrlConstants.STATE_PROJECT_SAVE)
    @ApiOperation(value = "新建或更新项目", notes = "新建或更新项目")
    public AjaxResult<StateProject> create(@RequestBody StateProjectBO stateProject) {
        return AjaxResult.success(stateProjectService.saveProjectAndInfo(stateProject));
    }
 
    // 更新项目
    @PutMapping(UrlConstants.STATE_PROJECT_UPDATE)
    public AjaxResult<Boolean> update(@RequestBody StateProject stateProject) {
        return AjaxResult.success(stateProjectService.updateById(stateProject));
    }
 
    @PostMapping(UrlConstants.STATE_PROJECT_UPDATE_STATUS)
    @ApiOperation(value = "修改项目状态,例如转征收,并发布公告", notes = "修改项目状态,例如转征收,并发布公告")
    public AjaxResult<Boolean> update(@RequestBody UpdateProjectAndAddNoticeBO updateProjectAndAddNoticeBO) {
        if (StateProjectStatusEnum.LEVY.getKey().equals(updateProjectAndAddNoticeBO.getProjectStatus())
                || StateProjectStatusEnum.SIMULATE.getKey().equals(updateProjectAndAddNoticeBO.getProjectStatus())) {
            HouseAgreeMoveRateBO houseAgreeMoveRateBO = stateHouseholdService.currentProjectRate(updateProjectAndAddNoticeBO.getProjectId());
            if (Objects.isNull(houseAgreeMoveRateBO)) {
                throw new GlobalException("当前项目未添加任何房产信息数据");
            }
            if (houseAgreeMoveRateBO.getAreaAgreeMoveRate() <= 66.66) {
                throw new GlobalException("房产同意面积未超过2/3");
            }
            if (houseAgreeMoveRateBO.getPersonAgreeMoveRate() <= 95.00) {
                throw new GlobalException("房产同意率未超过95%");
            }
        }
 
        StateProject projectById = stateProjectService.getProjectById(updateProjectAndAddNoticeBO.getProjectId());
        projectById.setStatus(updateProjectAndAddNoticeBO.getProjectStatus());
        projectById.setIsNeedEvaluate(updateProjectAndAddNoticeBO.getIsNeedEvaluate());
        if (updateProjectAndAddNoticeBO.getProjectStatus().equals(StateProjectStatusEnum.SIMULATE.getKey())) {
            projectById.setSimulatedTime(DateUtil.parseDate(com.zzg.common.utils.DateUtil.formatDate(com.zzg.common.utils.DateUtil.getNewDate(), DateUtils.YYYY_MM_DD)));
            projectById.setStage(StateProjectStatusEnum.SIMULATE.getKey());
        } else if (updateProjectAndAddNoticeBO.getProjectStatus().equals(StateProjectStatusEnum.LEVY.getKey())) {
            projectById.setLevyTime(DateUtil.parseDate(com.zzg.common.utils.DateUtil.formatDate(com.zzg.common.utils.DateUtil.getNewDate(), DateUtils.YYYY_MM_DD)));
            projectById.setStage(StateProjectStatusEnum.LEVY.getKey());
            if (projectById.getIsNeedEvaluate() == 1) {
                LambdaQueryWrapper<StateHousehold> queryWrapper = new LambdaQueryWrapper<>();
                queryWrapper.eq(StateHousehold::getStateProjectId, projectById.getId());
                List<StateHousehold> householdList = stateHouseholdService.list(queryWrapper);
                if (!CollectionUtils.isEmpty(householdList)) {
                    householdList.forEach(e -> {
                        //协议状态、调查评估签订状态重置
                        e.setAgreementStatus(null);
                        if (StringUtils.isNotBlank(e.getAppendData())) {
                            String appendData = e.getAppendData();
                            CalculateCompensationVO calculateCompensationVO = JSON.parseObject(appendData, CalculateCompensationVO.class);
                            if (Objects.nonNull(calculateCompensationVO.getSurveyResultRegistrationBO())) {
                                calculateCompensationVO.getSurveyResultRegistrationBO().setIsSignedVirtualAgreement(null);
                            }
                            e.setAppendData(JSON.toJSONString(calculateCompensationVO));
                        }
                    });
                    stateHouseholdService.saveOrUpdateBatch(householdList);
                }
            }
        }
 
        stateProjectService.saveProject(projectById);
 
        StateProjectNotice stateProjectNotice = StateProjectConvert.INSTANCE.updateProjectAndAddNoticeBOToEntity(updateProjectAndAddNoticeBO);
        if (Objects.nonNull(updateProjectAndAddNoticeBO.getFileBOList()) && !CollectionUtils.isEmpty(updateProjectAndAddNoticeBO.getFileBOList())) {
            stateProjectNotice.setFileUrl(JSON.toJSONString(updateProjectAndAddNoticeBO.getFileBOList()));
        }
        if (Objects.nonNull(updateProjectAndAddNoticeBO.getImgBOList()) && !CollectionUtils.isEmpty(updateProjectAndAddNoticeBO.getImgBOList())) {
            stateProjectNotice.setImgUrl(JSON.toJSONString(updateProjectAndAddNoticeBO.getImgBOList()));
        }
        //1 正常公告 2转征收的公告
        stateProjectNotice.setType(2);
        stateProjectNoticeService.saveOrUpdate(stateProjectNotice);
        //转征收后,将房产调查状态改为调查过 用于app端展示对应数据
        LambdaUpdateWrapper<StateHousehold> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(StateHousehold::getStateProjectId, updateProjectAndAddNoticeBO.getProjectId());
        if (updateProjectAndAddNoticeBO.getProjectStatus().equals(StateProjectStatusEnum.LEVY.getKey())) {
            updateWrapper.set(StateHousehold::getSearchStatus, HouseSearchStatusEnum.SEARCHED.getValue());
        }
        updateWrapper.set(StateHousehold::getStage, StateProjectStatusEnum.LEVY.getKey());
        //对于转征收的数据 协议的审核状态挂在房产上的 房产的对应状态需要置空
        updateWrapper.set(StateHousehold::getAgreementStatus, null);
        stateHouseholdService.update(updateWrapper);
        return AjaxResult.success();
    }
 
    // 删除项目
    @DeleteMapping(UrlConstants.STATE_PROJECT_DELETE)
    @ApiOperation(value = "删除项目", notes = "删除项目")
    public AjaxResult<Boolean> delete(@PathVariable String id) {
        return AjaxResult.success(stateProjectService.removeById(id));
    }
 
    // 删除项目
    @PostMapping(UrlConstants.STATE_PROJECT_SUCCESS)
    @ApiOperation(value = "将项目改为已完成", notes = "将项目改为已完成")
    public AjaxResult<Boolean> successProject(@RequestBody GetProjectPageBO getProjectPageBO) {
        //todo接workflow 并计算金额
        stateProjectService.updateProjectAppStage(getProjectPageBO.getProjectId(), StateProjectStatusEnum.SUCCESS.getKey());
        return AjaxResult.success(stateProjectService.updateProjectStatus(getProjectPageBO.getProjectId(), StateProjectStatusEnum.SUCCESS.getKey()));
    }
 
    @PostMapping(UrlConstants.STATE_PROJECT_APP_SUCCESS)
    @ApiOperation(value = "app将项目改为已完成", notes = "app将项目改为已完成")
    public AjaxResult<Boolean> appSuccessProject(@RequestBody GetProjectPageBO getProjectPageBO) {
        return AjaxResult.success(stateProjectService.updateProjectAppStage(getProjectPageBO.getProjectId(), StateProjectStatusEnum.SUCCESS.getKey()));
    }
 
    @PostMapping(UrlConstants.STATE_PROJECT_NOTICE_SIMULATE)
    @ApiOperation(value = "将项目改为模拟", notes = "将项目改为模拟")
    public AjaxResult<Boolean> simulatedProject(@RequestBody GetProjectPageBO getProjectPageBO) {
        stateProjectService.updateProjectAppStage(getProjectPageBO.getProjectId(), StateProjectStatusEnum.SIMULATE.getKey());
        return AjaxResult.success(stateProjectService.updateProjectStatus(getProjectPageBO.getProjectId(), StateProjectStatusEnum.SIMULATE.getKey()));
    }
 
    @DeleteMapping(UrlConstants.STATE_PROJECT_CANCELLATION)
    @ApiOperation(value = "作废项目", notes = "作废项目")
    public AjaxResult<Boolean> cancellationStateProject(@PathVariable String id) {
        return AjaxResult.success(stateProjectService.cancellationStateProject(id));
    }
 
    //查询所有征集文件
    @GetMapping(UrlConstants.STATE_PROJECT_COLLECTION_FILE_LIST)
    @ApiOperation(value = "查询所有征集文件", notes = "查询所有征集文件")
    public AjaxResult<List<StateProjectCollectionFile>> listCollectionFile(@RequestParam String projectId, @RequestParam Integer fileType, @RequestParam Boolean isBefore) {
        return AjaxResult.success(stateProjectCollectionFileService.getByProjectIdAndType(projectId, fileType, isBefore));
    }
 
    @GetMapping(UrlConstants.STATE_PROJECT_COLLECTION_FILE_PARENT)
    @ApiOperation(value = "查询所有父亲文件", notes = "查询所有父亲文件")
    public AjaxResult<List<ParentCollectionFileVO>> listCollectionFileParent(@RequestParam Boolean isBefore) {
        return AjaxResult.success(stateProjectCollectionFileService.getParentCollectionFile(isBefore));
    }
 
    @GetMapping(UrlConstants.STATE_PROJECT_REMOVE_COLLECTION_FILE)
    @ApiOperation(value = "删除征收文件", notes = "删除征收文件")
    public AjaxResult<Boolean> removeCollectionFile(@RequestParam String fileId) {
        return AjaxResult.success(stateProjectCollectionFileService.removeById(fileId));
    }
 
    @PostMapping(UrlConstants.STATE_PROJECT_ADD_COLLECTION_FILE)
    @ApiOperation(value = "添加征收文件", notes = "添加征收文件")
    public AjaxResult<Object> addCollectionFile(@RequestBody @Validated UploadFileBO uploadFileBO) {
        return AjaxResult.success(stateProjectCollectionFileService.addCollectionFile(uploadFileBO));
    }
 
    @PostMapping(UrlConstants.STATE_PROJECT_NOTICE_PAGE)
    @ApiOperation(value = "分页查询公告", notes = "分页查询公告")
    public AjaxResult<Page<StateProjectNotice>> pageNotice(@RequestBody GetProjectPageBO getProjectPageBO) {
        return AjaxResult.success(stateProjectNoticeService.page(new Page<>(getProjectPageBO.getPageNum(), getProjectPageBO.getPageSize())));
    }
 
    @PostMapping(UrlConstants.STATE_PROJECT_NOTICE_PAGE_AFTER_UPDATE_PROJECT)
    @ApiOperation(value = "分页查询公告", notes = "分页查询公告在更新项目之后")
    public AjaxResult<Page<StateProjectNotice>> pageNoticeAfterUpdateProject(@RequestBody GetProjectPageBO getProjectPageBO) {
        LambdaQueryWrapper<StateProjectNotice> stateProjectNoticeLambdaQueryWrapper = new LambdaQueryWrapper<>();
        //对于新建项目而言 此处没有公告
        if (Objects.isNull(getProjectPageBO.getProjectId())) {
            return AjaxResult.success();
        }
        stateProjectNoticeLambdaQueryWrapper.eq(StateProjectNotice::getProjectId, getProjectPageBO.getProjectId());
        return AjaxResult.success(stateProjectNoticeService.page(new Page<>(getProjectPageBO.getPageNum(), getProjectPageBO.getPageSize()), stateProjectNoticeLambdaQueryWrapper));
    }
 
    @GetMapping(UrlConstants.STATE_PROJECT_NOTICE_GET)
    @ApiOperation(value = "查询公告详情", notes = "查询公告详情")
    public AjaxResult<StateProjectNoticeVO> getNoticeInfo(@RequestParam String noticeId) {
        StateProjectNoticeVO stateProjectNoticeVO = stateProjectNoticeService.getStateProjectNoticeVO(noticeId);
        return AjaxResult.success(stateProjectNoticeVO);
    }
 
    @DeleteMapping(UrlConstants.STATE_PROJECT_NOTICE_DELETE)
    @ApiOperation(value = "删除公告", notes = "删除公告")
    public AjaxResult<Boolean> deleteNotice(@PathVariable String id) {
        return AjaxResult.success(stateProjectNoticeService.removeById(id));
    }
 
    @PostMapping(UrlConstants.STATE_PROJECT_NOTICE_ADD)
    @ApiOperation(value = "新增公告", notes = "新增公告")
    public AjaxResult<Boolean> addNotice(@RequestBody UpdateProjectAndAddNoticeBO updateProjectAndAddNoticeBO) {
        StateProjectNotice stateProjectNotice = StateProjectConvert.INSTANCE.updateProjectAndAddNoticeBOToEntity(updateProjectAndAddNoticeBO);
        if (Objects.nonNull(updateProjectAndAddNoticeBO.getFileBOList()) && !CollectionUtils.isEmpty(updateProjectAndAddNoticeBO.getFileBOList())) {
            stateProjectNotice.setFileUrl(JSON.toJSONString(updateProjectAndAddNoticeBO.getFileBOList()));
        }
        if (Objects.nonNull(updateProjectAndAddNoticeBO.getImgBOList()) && !CollectionUtils.isEmpty(updateProjectAndAddNoticeBO.getImgBOList())) {
            stateProjectNotice.setImgUrl(JSON.toJSONString(updateProjectAndAddNoticeBO.getImgBOList()));
        }
        //1 正常公告 2转征收的公告
        stateProjectNotice.setType(1);
        return AjaxResult.success(stateProjectNoticeService.saveOrUpdate(stateProjectNotice));
    }
 
    @PostMapping(UrlConstants.STATE_PROJECT_IMPL_PAGE)
    @ApiOperation(value = "项目实施查询", notes = "项目实施查询")
    public AjaxResult<PageInfo<ProjectImplPageVO>> projectImplPage(@RequestBody GetProjectPageBO getProjectPageBO) {
        return AjaxResult.success(stateProjectService.getProjectImplPage(getProjectPageBO));
    }
}