huanghongfa
2021-08-26 3adb33652e097365ced4bdb58c31fce476b244fb
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
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
package com.panzhihua.service_community.service.impl;
 
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists;
import com.panzhihua.common.model.dtos.community.reserve.*;
import com.panzhihua.common.model.vos.R;
import com.panzhihua.common.model.vos.community.questnaire.QuestnaiteSubSelectionVO;
import com.panzhihua.common.model.vos.community.questnaire.QuestnaiteSubVO;
import com.panzhihua.common.model.vos.community.reserve.*;
import com.panzhihua.common.utlis.StringUtils;
import com.panzhihua.service_community.dao.ComActReserveMapper;
import com.panzhihua.service_community.dao.ComActReserveSubMapper;
import com.panzhihua.service_community.model.dos.*;
import com.panzhihua.service_community.service.ComActReserveService;
import com.panzhihua.service_community.service.ComActReserveSubSelectionService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 
/**
 * @auther lyq
 * @create 2021-08-23 10:33:11
 * @describe 预约登记表服务实现类
 */
@Slf4j
@Service
public class ComActReserveServiceImpl extends ServiceImpl<ComActReserveMapper, ComActReserveDO> implements ComActReserveService {
 
    @Resource
    private ComActReserveSubMapper comActReserveSubMapper;
    @Resource
    private ComActReserveSubSelectionService comActReserveSubSelectionService;
 
    /**
     * 社区后台-分页查询预约登记列表
     * @param pageReserveDTO    请求参数
     * @return  预约登记列表
     */
    @Override
    public R pageReserveAdmin(PageReserveAdminDTO pageReserveDTO){
        IPage<ComActReserveListAdminVO> reservePage = this.baseMapper.pageReserveAdmin(new Page(pageReserveDTO.getPageNum(),pageReserveDTO.getPageSize()),pageReserveDTO);
        reservePage.getRecords().forEach(reserve -> {
            //判断广告位置
            StringBuilder sb = new StringBuilder();
            if(reserve.getAdverPositionTop().equals(ComActQuestnaireDO.isOk.yes)){
                sb.append("首页顶部,");
            }
            if(reserve.getAdverPositionApplication().equals(ComActQuestnaireDO.isOk.yes)){
                sb.append("首页应用,");
            }
            String advertPosition = sb.toString();
            if(advertPosition.length() > 0){
                reserve.setAdvertPosition(advertPosition.substring(0,advertPosition.length()-1));
            }else{
                reserve.setAdvertPosition("无");
            }
        });
        return R.ok(reservePage);
    }
 
    /**
     * 社区后台-新增预约登记信息
     * @param addReserveDTO 请求参数
     * @return  新增结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R addReserveAdmin(AddReserveAdminDTO addReserveDTO){
        Date nowDate = new Date();
        Long userId = addReserveDTO.getUserId();
        //新增预约登记信息
        ComActReserveDO reserveDO = new ComActReserveDO();
        BeanUtils.copyProperties(addReserveDTO,reserveDO);
        reserveDO.setStatus(ComActReserveDO.status.dfb);
        reserveDO.setCreateAt(nowDate);
        reserveDO.setCreateBy(userId);
 
        if(addReserveDTO.getIsPublish().equals(ComActReserveDO.isOk.yes)){
            reserveDO.setStatus(ComActReserveDO.status.jxz);
            reserveDO.setPublishTime(nowDate);
        }
        this.baseMapper.insert(reserveDO);
 
        //根据上传的json数据录入选项以及题目到数据库
        if(StringUtils.isEmpty(addReserveDTO.getJsonObject())){
            return R.fail("组件json数据为空,录入失败");
        }
        List<QuestnaiteSubVO> reserveSubVOS = JSON.parseArray(addReserveDTO.getJsonObject(),QuestnaiteSubVO.class);
        reserveSubVOS.forEach(reserveSub -> {
            ComActReserveSubDO comActReserveSubDO = new ComActReserveSubDO();
            comActReserveSubDO.setType(reserveSub.getType());
            comActReserveSubDO.setContent(reserveSub.getLabel());
            comActReserveSubDO.setSort(reserveSub.getSort());
            comActReserveSubDO.setReserveId(reserveDO.getId());
            comActReserveSubDO.setCreateBy(userId);
            comActReserveSubDO.setCreateAt(nowDate);
            comActReserveSubDO.setKey(reserveSub.getKey());
            comActReserveSubMapper.insert(comActReserveSubDO);
 
            ArrayList<ComActReserveSubSelectionDO> subSelectionList = Lists.newArrayList();
            if(reserveSub.getOptions() != null && !reserveSub.getOptions().isEmpty()) {
                List<QuestnaiteSubSelectionVO> subOptions = reserveSub.getOptions();
                for(int i=0; i<subOptions.size(); i++){
                    QuestnaiteSubSelectionVO subSelect = subOptions.get(i);
                    ComActReserveSubSelectionDO subSelectionDO = new ComActReserveSubSelectionDO();
                    subSelectionDO.setReserveSubId(comActReserveSubDO.getId());
                    if(subSelect.getType().equals(1)){
                        //添加选项名称
                        subSelectionDO.setOptionName(subSelect.getOptionName());
                    }else {
                        subSelectionDO.setOptionName(String.valueOf(Character.toChars('A' + i)));
                    }
                    subSelectionDO.setContent(subSelect.getLabel());
                    subSelectionDO.setReserveId(reserveDO.getId());
                    subSelectionDO.setCreateBy(userId);
                    subSelectionDO.setCreateAt(nowDate);
                    subSelectionDO.setType(subSelect.getType());
                    subSelectionDO.setKey(subSelect.getKey());
                    subSelectionList.add(subSelectionDO);
                }
            }
            comActReserveSubSelectionService.saveBatch(subSelectionList);
        });
 
        return R.ok();
    }
 
    /**
     * 社区后台-编辑预约登记信息
     * @param editReserveDTO 请求参数
     * @return  新增结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R editReserveAdmin(EditReserveAdminDTO editReserveDTO){
        Date nowDate = new Date();
        Long userId = editReserveDTO.getUserId();
        Long reserveId = editReserveDTO.getId();
        //查询预约登记信息
        ComActReserveDO reserveDO = this.baseMapper.selectById(reserveId);
        if(reserveDO == null){
            return R.fail("未查询到预约登记记录");
        }
        if(!reserveDO.getStatus().equals(ComActReserveDO.status.dfb)){
            return R.fail("不可修改不是待发布状态的预约登记记录");
        }
        BeanUtils.copyProperties(editReserveDTO,reserveDO);
        reserveDO.setStatus(ComActReserveDO.status.dfb);
        reserveDO.setUpdateAt(nowDate);
        reserveDO.setUpdateBy(userId);
        if(editReserveDTO.getIsPublish().equals(ComActReserveDO.isOk.yes)){
            reserveDO.setStatus(ComActReserveDO.status.jxz);
            reserveDO.setPublishTime(nowDate);
        }
        this.baseMapper.updateById(reserveDO);
 
        //根据上传的json数据录入选项以及题目到数据库
        if(StringUtils.isEmpty(editReserveDTO.getJsonObject())){
            return R.fail("组件json数据为空,录入失败");
        }
 
        //清除原来预约登记题目以及题目选项
        this.baseMapper.deleteReserveSubAll(reserveId);
        //清除原有的,添加更新的
        List<QuestnaiteSubVO> reserveSubVOS = JSON.parseArray(editReserveDTO.getJsonObject(),QuestnaiteSubVO.class);
        if(reserveSubVOS.isEmpty()){
            return R.fail("组件json数据为空,录入失败");
        }
        reserveSubVOS.forEach(reserveSub -> {
            ComActReserveSubDO comActReserveSubDO = new ComActReserveSubDO();
            comActReserveSubDO.setType(reserveSub.getType());
            comActReserveSubDO.setContent(reserveSub.getLabel());
            comActReserveSubDO.setSort(reserveSub.getSort());
            comActReserveSubDO.setReserveId(reserveDO.getId());
            comActReserveSubDO.setCreateBy(userId);
            comActReserveSubDO.setCreateAt(nowDate);
            comActReserveSubDO.setKey(reserveSub.getKey());
            comActReserveSubMapper.insert(comActReserveSubDO);
 
            ArrayList<ComActReserveSubSelectionDO> subSelectionList = Lists.newArrayList();
            if(reserveSub.getOptions() != null && !reserveSub.getOptions().isEmpty()) {
                List<QuestnaiteSubSelectionVO> subOptions = reserveSub.getOptions();
                for(int i=0; i<subOptions.size(); i++){
                    QuestnaiteSubSelectionVO subSelect = subOptions.get(i);
                    ComActReserveSubSelectionDO subSelectionDO = new ComActReserveSubSelectionDO();
                    subSelectionDO.setReserveSubId(comActReserveSubDO.getId());
                    if(subSelect.getType().equals(1)){
                        //添加选项名称
                        subSelectionDO.setOptionName(subSelect.getOptionName());
                    }else {
                        subSelectionDO.setOptionName(String.valueOf(Character.toChars('A' + i)));
                    }
                    subSelectionDO.setContent(subSelect.getLabel());
                    subSelectionDO.setReserveId(reserveDO.getId());
                    subSelectionDO.setCreateBy(userId);
                    subSelectionDO.setCreateAt(nowDate);
                    subSelectionDO.setType(subSelect.getType());
                    subSelectionDO.setKey(subSelect.getKey());
                    subSelectionList.add(subSelectionDO);
                }
            }
            comActReserveSubSelectionService.saveBatch(subSelectionList);
        });
        return R.ok();
    }
 
    /**
     * 社区后台-修改预约登记状态
     * @param editReserveDTO    请求参数
     * @return  修改结果
     */
    @Override
    public R editReserveStatusAdmin(EditComActReserveStatusDTO editReserveDTO){
        Date nowDate = new Date();
        Long userId = editReserveDTO.getUserId();
        Long reserveId = editReserveDTO.getId();
        //查询预约登记信息
        ComActReserveDO reserveDO = this.baseMapper.selectById(reserveId);
        if(reserveDO == null){
            return R.fail("未查询到预约登记记录");
        }
 
        if(editReserveDTO.getType().equals(EditComActReserveStatusDTO.type.tz)){
            reserveDO.setStatus(ComActReserveDO.status.ytz);
            reserveDO.setEndTime(nowDate);
        }else if(editReserveDTO.getType().equals(EditComActReserveStatusDTO.type.fb)){
            reserveDO.setStatus(ComActReserveDO.status.jxz);
            reserveDO.setPublishTime(nowDate);
        }
        reserveDO.setUpdateBy(userId);
        reserveDO.setUpdateAt(nowDate);
        if(this.baseMapper.updateById(reserveDO) > 0){
            return R.ok();
        }else{
            return R.fail();
        }
    }
 
    /**
     * 社区后台-继续预约登记
     * @param editReserveDTO    请求参数
     * @return  修改结果
     */
    @Override
    public R editReserveInfoAdmin(EditComActReserveInfoDTO editReserveDTO){
        Date nowDate = new Date();
        Long userId = editReserveDTO.getUserId();
        Long reserveId = editReserveDTO.getId();
        //查询预约登记信息
        ComActReserveDO reserveDO = this.baseMapper.selectById(reserveId);
        if(reserveDO == null){
            return R.fail("未查询到预约登记记录");
        }
        BeanUtils.copyProperties(editReserveDTO,reserveDO);
        reserveDO.setStatus(ComActReserveDO.status.jxz);
        reserveDO.setUpdateAt(nowDate);
        reserveDO.setUpdateBy(userId);
        reserveDO.setEndTime(null);
        if(this.baseMapper.updateById(reserveDO) > 0){
            return R.ok();
        }else{
            return R.fail();
        }
    }
 
    /**
     * 社区后台-根据预约登记id查询详情
     * @param reserveId 预约登记id
     * @return  预约登记详情
     */
    @Override
    public R detailReserveAdmin(Long reserveId){
        ComActReserveDetailAdminVO reserveDetailAdminVO = new ComActReserveDetailAdminVO();
        //查询预约登记信息
        ComActReserveDO reserveDO = this.baseMapper.selectById(reserveId);
        BeanUtils.copyProperties(reserveDO,reserveDetailAdminVO);
        return R.ok(reserveDetailAdminVO);
    }
 
    /**
     * 社区后台-根据社区id统计预约类数据
     * @param makeStatisticsDTO   请求参数
     * @return  统计预约类数据
     */
    @Override
    public R makeStatisticsAdmin(ComActReserveMakeStatisticsDTO makeStatisticsDTO){
        Long communityId = makeStatisticsDTO.getCommunityId();
        ComActReserveMakeStatisticsAdminVO makeStatisticsAdminVO = new ComActReserveMakeStatisticsAdminVO();
        //查询预约登记统计汇总左边数据
        List<ComActReserveMakeLeftStatisticsAdminVO> leftStatisticsList = this.baseMapper.getReserveMakeLeftStatistics(communityId);
        if(!leftStatisticsList.isEmpty()){
            makeStatisticsAdminVO.setLeftStatisticsList(leftStatisticsList);
        }
 
        //查询预约登记统计汇总右边数据
        List<ComActReserveMakeRightStatisticsAdminVO> rightStatisticsList = getRightStatisticsList(makeStatisticsDTO);
        if(!rightStatisticsList.isEmpty()){
            makeStatisticsAdminVO.setRightStatisticsList(rightStatisticsList);
        }
        return R.ok(makeStatisticsAdminVO);
    }
 
    /**
     * 社区后台-查询预约统计汇总右边数据
     * @param makeStatisticsDTO 请求参数
     * @return  预约统计汇总右边数据
     */
    private List<ComActReserveMakeRightStatisticsAdminVO> getRightStatisticsList(ComActReserveMakeStatisticsDTO makeStatisticsDTO){
        Long communityId = makeStatisticsDTO.getCommunityId();
        //查询预约登记统计汇总右边数据
        List<ComActReserveMakeRightStatisticsAdminVO> rightStatisticsList = this.baseMapper.getReserveMakeRightStatistics(makeStatisticsDTO);
        if(!rightStatisticsList.isEmpty()){
            rightStatisticsList.forEach(rightStatistics -> {
                String date = rightStatistics.getReserveTime();
                Integer count = this.baseMapper.getReserveRecordCount(communityId,date + " 00:00:00",date + " 23:59:59");
                rightStatistics.setAllCount(count);
 
                //计算百分比
                BigDecimal tag = BigDecimal.ZERO;
                if(count >= 0){
                    tag = BigDecimal.valueOf(rightStatistics.getCount()).divide(BigDecimal.valueOf(count),2, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
                }
                rightStatistics.setTag(tag);
            });
        }
        return rightStatisticsList;
    }
 
    /**
     * 社区后台-查询导出预约统计汇总数据
     * @param makeStatisticsDTO   请求参数
     * @return  统计预约类数据
     */
    @Override
    public R makeStatisticsExportAdmin(ComActReserveMakeStatisticsDTO makeStatisticsDTO){
        return R.ok(getRightStatisticsList(makeStatisticsDTO));
    }
 
    /**
     * 删除预约登记信息
     * @param reserveId 预约登记id
     * @return  删除结果
     */
    @Override
    public R deleteReserveAdmin(Long reserveId){
        //查询预约登记信息
        ComActReserveDO reserveDO = this.baseMapper.selectById(reserveId);
        if(reserveDO == null){
            return R.fail("未查询到预约登记信息");
        }
        reserveDO.setIsDel(ComActReserveDO.isOk.yes);
        reserveDO.setUpdateAt(new Date());
 
        if(this.baseMapper.updateById(reserveDO) > 0){
            return R.ok();
        }else{
            return R.fail();
        }
    }
 
    /**
     * 查询社区所有预约信息列表
     * @param communityId   社区id
     * @return  预约信息列表
     */
    @Override
    public R listReserveAdmin(Long communityId){
        return R.ok(this.baseMapper.listReserveAdmin(communityId));
    }
 
}