linwe
2024-08-09 8b7258c9427882bb1798f1502eaa35184c6e374e
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
package org.springblade.modules.eCallEventTwo.service.impl;
 
import cn.hutool.core.convert.Convert;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import liquibase.repackaged.org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springblade.common.utils.SpringUtils;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.modules.eCallEventTwo.dto.*;
import org.springblade.modules.eCallEventTwo.entity.ECallEventTwoEntity;
import org.springblade.modules.eCallEventTwo.entity.EcOrder;
import org.springblade.modules.eCallEventTwo.mapper.EcOrderMapper;
import org.springblade.modules.eCallEventTwo.service.EcOrderService;
import org.springblade.modules.eCallEventTwo.service.IECallEventTwoService;
import org.springblade.modules.grid.entity.GridEntity;
import org.springblade.modules.grid.service.IGridService;
import org.springblade.modules.police.entity.PoliceAffairsGridEntity;
import org.springblade.modules.police.service.IPoliceAffairsGridService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
 
/**
 * EcOrderService业务层处理
 *
 * @author ${context.author}
 * @date 2024-05-27 16:26:59
 */
@Service
public class EcOrderServiceImpl extends ServiceImpl<EcOrderMapper, EcOrder> implements EcOrderService {
 
    private static final int DEFAULT_SCALE = 2; // 默认保留两位小数
    private static final RoundingMode DEFAULT_ROUNDING_MODE = RoundingMode.HALF_UP; // 默认四舍五入
    @Autowired
    private IECallEventTwoService ecOrderService;
 
    protected static final Logger log = LoggerFactory.getLogger(EcOrderServiceImpl.class);
    /**
     * 查询工单
     *
     * @param orderId 工单ID
     * @return 工单
     */
    @Override
    public EcOrderDTO selectEcOrderById(Long orderId) {
        return this.baseMapper.selectEcOrderById(orderId);
    }
 
    /**
     * 查询工单列表
     *
     * @param ecOrderDTO 工单
     * @return 工单集合
     */
    @Override
    public List<EcOrderDTO> selectEcOrderList(EcOrderDTO ecOrderDTO) {
        return this.baseMapper.selectEcOrderList(ecOrderDTO);
    }
 
    /**
     * 新增工单
     *
     * @param ecOrderDTO 工单
     * @return 结果
     */
    @Override
    public int insertEcOrder(EcOrderDTO ecOrderDTO) {
        return this.baseMapper.insert(ecOrderDTO);
    }
 
    /**
     * 修改工单
     *
     * @param ecOrderDTO 工单
     * @return 结果
     */
    @Override
    public int updateEcOrder(EcOrderDTO ecOrderDTO) {
        return this.baseMapper.updateById(ecOrderDTO);
    }
 
    /**
     * 删除工单对象
     *
     * @param ids 需要删除的数据ID
     * @return 结果
     */
    @Override
    public int deleteEcOrderByIds(String ids) {
        return this.removeByIds(Arrays.asList(Convert.toStrArray(ids))) ? 1 : 0;
    }
 
    /**
     * 删除工单信息
     *
     * @param orderId 工单ID
     * @return 结果
     */
    @Override
    public int deleteEcOrderById(Long orderId) {
        return this.removeById(orderId) ? 1 : 0;
    }
 
    @Override
    public boolean SynchronizeData(EcOrderParamDTO ecOrderParamDTO) {
        processPages(100, ecOrderParamDTO);
        return true;
    }
 
    public void processPages(int pageSize, EcOrderParamDTO ecOrderParamDTO) {
        QueryWrapper<EcOrder> ecOrderQueryWrapper = new QueryWrapper<>();
        if (StringUtils.isNotBlank(ecOrderParamDTO.getStartTime()) && StringUtils.isNotEmpty(ecOrderParamDTO.getEndTime())) {
            ecOrderQueryWrapper.between("import_time", ecOrderParamDTO.getStartTime(), ecOrderParamDTO.getEndTime());
        }
        // System.out.println("**********参数**************************" + JSON.toJSONString(ecOrderParamDTO));
        long count = count(ecOrderQueryWrapper);
        System.out.println("**********总数**************************" + count);
        int totalPages = (int) Math.ceil((double) count / pageSize); // 计算总页数
 
        for (int pageNum = 1; pageNum <= totalPages; pageNum++) {
            Page<EcOrder> page = new Page<>(pageNum, pageSize);
            IPage<EcOrder> resultPage = baseMapper.selectPage(page, ecOrderQueryWrapper);
            List<EcOrder> records = resultPage.getRecords();
            List<ECallEventTwoEntity> recordEntityList = BeanUtil.copy(records, ECallEventTwoEntity.class);
            List<ECallEventTwoEntity> addList = new ArrayList<>();
            List<ECallEventTwoEntity> updateList = new ArrayList<>();
            // 过滤出已同步的订单
            recordEntityList.forEach(record -> {
                long count1 = ecOrderService.count(Wrappers.<ECallEventTwoEntity>lambdaQuery().eq(ECallEventTwoEntity::getOrderCode, record.getOrderCode()));
                if (count1 == 0) {
                    setGridInfo(record);
                    addList.add(record);
                } else {
                    setGridInfo(record);
                    updateList.add(record);
                }
            });
            // 同步订单
            boolean b = false;
            if (addList.size() > 0) {
                b = ecOrderService.saveBatch(addList);
            }
            if (updateList.size() > 0) {
                b = ecOrderService.saveOrUpdateBatch(updateList);
            }
            System.out.println("更新第" + pageNum + "页" + b);
        }
    }
 
    @Override
    @DS("master")
    public boolean saveEcOrder(List<ECallEventTwoEntity> recordEntityList) {
        return false;
    }
 
 
    /**
     * 设置警格网格信息
     *
     * @param ecOrderEntity
     */
    public void setGridInfo(ECallEventTwoEntity ecOrderEntity) {
        try {
            if (ecOrderEntity.getSceneGeoLng() == null || ecOrderEntity.getSceneGeoLat() == null) {
                return;
            }
            // 根据位置设置网格,警格编号
            IGridService gridService = SpringUtils.getBean(IGridService.class);
            IPoliceAffairsGridService policeAffairsGridService = SpringUtils.getBean(IPoliceAffairsGridService.class);
            String point = "'POINT(" + ecOrderEntity.getSceneGeoLng().toString() + " " + ecOrderEntity.getSceneGeoLat().toString() + ")'";
            // 点坐标解析网格
            List<GridEntity> gridEntityList = gridService.spatialAnalysis(point);
            if (gridEntityList.size() > 0) {
                GridEntity gridEntity = gridEntityList.get(0);
                ecOrderEntity.setGridCode(gridEntity.getGridCode());
            }
            // 点坐标解析警格
            List<PoliceAffairsGridEntity> policeAffairsGridEntityList = policeAffairsGridService.spatialAnalysis(point);
            if (policeAffairsGridEntityList.size() > 0) {
                PoliceAffairsGridEntity policeAffairsGridEntity = policeAffairsGridEntityList.get(0);
                ecOrderEntity.setJwGridCode(policeAffairsGridEntity.getJwGridCode());
            }
        } catch (Exception e) {
            System.out.println("获取警格网格信息失败" + e);
        }
    }
 
    /**
     * 获取单位考核指标
     *
     * @return
     */
    @Override
    public List<Map<String, String>> getUnitAssessmentIndicators() {
        List<Map<String, String>> result = baseMapper.getUnitAssessmentIndicators();
        return result;
    }
 
 
    /**
     * 统计办结率
     */
    @Override
    public IPage<EcOrderDTO> getCount(IPage<EcOrderDTO> page, EcOrderParamDTO ecOrderParamDTO) {
        // acpt_org_code
        List<EcOrderDTO> result = baseMapper.getOrgCode(page, ecOrderParamDTO);
        for (EcOrderDTO ecOrderDTO : result) {
            if (ecOrderParamDTO.getTagMain().equals("Y")) {
                ecOrderParamDTO.setSinkOrgCode(ecOrderDTO.getSinkOrgCode());
            } else {
                ecOrderParamDTO.setSubjectOrgCode(ecOrderDTO.getSubjectOrgCode());
            }
            // 统计办结率
            buildRate(ecOrderParamDTO, ecOrderDTO);
            // 获取单位名称
            if (ecOrderParamDTO.getTagMain().equals("Y")) {
                ecOrderDTO.setOrgCode(ecOrderDTO.getSinkOrgCode());
                ecOrderDTO.setOrgName(ecOrderDTO.getSinkOrgName());
            } else {
                ecOrderDTO.setOrgCode(ecOrderDTO.getSubjectOrgCode());
                ecOrderDTO.setOrgName(ecOrderDTO.getSubjectOrgName());
            }
        }
        return page.setRecords(result);
    }
 
    @NotNull
    private void buildRate(EcOrderParamDTO ecOrderParamDTO, EcOrderDTO ecOrder) {
        // 统计订单
        EcOrderDTO ecOrderDTO = BeanUtil.copy(ecOrderParamDTO, EcOrderDTO.class);
        int i = baseMapper.selectEcOrderCount(ecOrderDTO);
        // 统计派发
        EcDispatchDTO ecDispatchDTO = BeanUtil.copy(ecOrderParamDTO, EcDispatchDTO.class);
        int i1 = baseMapper.selectEcDispatchCount(ecDispatchDTO);
        // 统计处理
        EcHandleDTO ecHandleDTO = BeanUtil.copy(ecOrderParamDTO, EcHandleDTO.class);
        int i2 = baseMapper.selectEcHandleCount(ecHandleDTO);
        // 统计回访
        EcOrderCheckDTO ecOrderCheckDTO = BeanUtil.copy(ecOrderParamDTO, EcOrderCheckDTO.class);
        int i3 = baseMapper.selectEcOrderCheckCount(ecOrderCheckDTO);
        // 统计办结
        EcOrderDoneDTO ecOrderDoneDTO = BeanUtil.copy(ecOrderParamDTO, EcOrderDoneDTO.class);
        int i4 = baseMapper.selectEcOrderDoneCount(ecOrderDoneDTO);
        // 统计答复
        EcOrderRespDTO ecOrderRespDTO = BeanUtil.copy(ecOrderParamDTO, EcOrderRespDTO.class);
        int i5 = baseMapper.selectEcOrderRespCount(ecOrderRespDTO);
        // 统计核实
        EcOrderReviewDTO ecOrderReviewDTO = BeanUtil.copy(ecOrderParamDTO, EcOrderReviewDTO.class);
        int i6 = baseMapper.selectEcOrderReviewCount(ecOrderReviewDTO);
        // 统计督办
        EcOrderSuperviseDTO ecOrderSuperviseDTO = BeanUtil.copy(ecOrderParamDTO, EcOrderSuperviseDTO.class);
        int i7 = baseMapper.selectEcOrderSuperviseCount(ecOrderSuperviseDTO);
        // 工单数    派发单数    办理单数(率)    办结单数(率)    答复单数(率)    回访单数(率)    核实单数    督办单数
        // Map<String, String> result = new HashMap<>();
        // 工单数
        // result.put("orderNumber", String.valueOf(i));
        ecOrder.setOrderNumber(String.valueOf(i));
        // 派发单数(率)
        // result.put("dispatchRate", getRate(i1, i));
        ecOrder.setDispatchRate(getRate(i1, i));
        // result.put("dispatchNumber", String.valueOf(i1));
        ecOrder.setDispatchNumber(String.valueOf(i1));
        // 办理单数(率)
        // result.put("handRate", getRate(i2, i));
        ecOrder.setHandRate(getRate(i2, i));
        // result.put("handNumber", String.valueOf(i2));
        // 办结单数(率)
        // result.put("checkRate", getRate(i3, i));
        ecOrder.setCheckRate(getRate(i3, i));
        // result.put("checkNumber", String.valueOf(i3));
        // 答复单数(率)
        // result.put("doneRate", getRate(i4, i));
        ecOrder.setDoneRate(getRate(i4, i));
        // result.put("doneNumber", String.valueOf(i4));
        // 回访单数(率)
        // result.put("respRate", getRate(i5, i));
        ecOrder.setRespRate(getRate(i5, i));
        // result.put("respNumber", String.valueOf(i5));
        // 核实单数(率)
        // result.put("reviewRate", getRate(i6, i));
        ecOrder.setReviewRate(getRate(i6, i));
        // result.put("reviewNumber", String.valueOf(i6));
        // 督办单数
        // result.put("superviseNumber", String.valueOf(i7));
        ecOrder.setSuperviseNumber(String.valueOf(i7));
        // 返回结果
        // return result;
    }
 
 
    public static String getRate(int dividend, int divisor) {
        // 检查除数是否为0
        if (divisor == 0) {
            return "0";
        }
        // 将int转换为BigDecimal
        BigDecimal bdDividend = BigDecimal.valueOf(dividend);
        BigDecimal bdDivisor = BigDecimal.valueOf(divisor);
        // 执行除法操作,设置精度(scale)和舍入模式(RoundingMode)
        int scale = DEFAULT_SCALE;
        RoundingMode roundingMode = DEFAULT_ROUNDING_MODE;
        // 进行除法运算
        BigDecimal result;
        try {
            result = bdDividend.divide(bdDivisor, scale, roundingMode);
        } catch (ArithmeticException e) {
            // 处理因除数为0或其他原因引发的算术异常
            throw new RuntimeException("除法运算出错", e);
        }
        return result.toString();
    }
 
}