无关风月
16 小时以前 02bb94e413f6950b9786c5ee86c0937bc20f8ae8
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
package com.ruoyi.web.controller.api;
 
 
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.applet.dto.AppealDTO;
import com.ruoyi.system.dto.TTaskAuditBatchDTO;
import com.ruoyi.system.dto.TaskDetailDto;
import com.ruoyi.system.model.*;
import com.ruoyi.system.service.*;
import com.ruoyi.web.controller.tool.AmapApiClient;
import com.ruoyi.web.controller.tool.GeoChecker;
import com.ruoyi.web.controller.tool.PathParser;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import javax.annotation.Resource;
import javax.validation.Valid;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
 
/**
 * <p>
 * 任务操作记录 前端控制器
 * </p>
 *
 * @author xiaochen
 * @since 2025-05-28
 */
@Api(tags = "任务操作记录")
@RestController
@RequestMapping("/t-task-detail")
public class TTaskDetailController {
 
    @Autowired
    private TTaskDetailService taskDetailService;
    @Autowired
    private TTaskCleanService taskService;
    @Autowired
    private TAppealService appealService;
    @Autowired
    private TLocationService locationService;
    @Resource
    private TInspectorService inspectorService;
 
    @ApiOperation(value = "上传任务")
    @PostMapping(value = "/uploadTask")
    public R<Boolean> uploadTask(@RequestBody TaskDetailDto dto) {
        double radius = 50; // 单位:米
        int segments = 4;   // 四段,共 5 个点
        TTask task = taskService.getById(dto.getTaskId());
        if (task==null)return R.fail("任务不存在");
        TLocation location = locationService.getById(task.getLocationId());
        if (location==null)return R.fail("点位不存在");
        TInspector byId = inspectorService.getById(dto.getId());
        if (byId!=null){
            UpdateWrapper<TInspector> tInspectorUpdateWrapper = new UpdateWrapper<>();
            tInspectorUpdateWrapper.set("clear_status", dto.getClearStatus());
            tInspectorUpdateWrapper.set("unqualified", dto.getUnqualified());
            tInspectorUpdateWrapper.set("remark", dto.getRemark());
            tInspectorUpdateWrapper.set("picture", dto.getPicture());
            tInspectorUpdateWrapper.set("audio_url", dto.getAudioUrl());
            tInspectorUpdateWrapper.set("status", 1);
            tInspectorUpdateWrapper.set("audit_time", 1);
            tInspectorUpdateWrapper.set("audit_person", 1);
            tInspectorUpdateWrapper.set("audit_status", 1);
            tInspectorUpdateWrapper.set("audit_remark", 1);
            tInspectorUpdateWrapper.eq("id", dto.getId());
            inspectorService.update(tInspectorUpdateWrapper);
        }else{
            //        try {
//            String routeJson = AmapApiClient.getDrivingRoute(Double.parseDouble(location.getLocationLat()),
//                    Double.parseDouble(location.getLocationLon()),
//                            Double.parseDouble(location.getLocationLatEnd()),
//                                    Double.parseDouble(location.getLocationLonEnd()));
//            // 转化为json对象
//            JSONObject jsonObject = JSONObject.parseObject(routeJson);
//            JSONObject route = jsonObject.getJSONObject("route");
//            JSONArray paths = route.getJSONArray("paths");
//            JSONObject o = (JSONObject)paths.get(0);
//            BigDecimal distance = o.getBigDecimal("distance");
//            System.err.println( paths);
//            List<double[]> fivePoints = PathParser.parseAndInterpolate(routeJson, segments,
//                    Double.parseDouble(location.getLocationLat()),
//                    Double.parseDouble(location.getLocationLon()),
//                    Double.parseDouble(location.getLocationLatEnd()),
//                    Double.parseDouble(location.getLocationLonEnd()));
//
//            if (GeoChecker.isInAnyCircle(Double.parseDouble(dto.getLat()), Double.parseDouble(dto.getLon()),
//                    fivePoints, radius)) {
//                System.out.println("✅ 成功!您位于某个圆形电子围栏范围内。");
//            } else {
//                System.out.println("❌ 失败!您不在任何圆形电子围栏范围内。");
//                return R.fail("位置信息与点位不一致,请点击此处更新定位");
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
            taskDetailService.save(dto);
            // 修改任务状态
            taskService.update(Wrappers.<TTask>lambdaUpdate().set(TTask::getStatus, 3).eq(TTask::getId, dto.getTaskId()));
        }
 
        return R.ok();
    }
 
    @Resource
    private TokenService tokenService;
    @ApiOperation(value = "申诉")
    @PostMapping(value = "/appeal")
    public R<Boolean> appeal(@RequestBody AppealDTO dto) {
        List<TAppeal> list = appealService.lambdaQuery().eq(TAppeal::getTaskId, dto.getTaskId()).list();
        if (!list.isEmpty()){
            return R.fail("任务只有一次申诉机会");
        }
        dto.setAppealPerson(tokenService.getLoginUserApplet().getUserId()+"");
        appealService.save(dto);
        List<TTaskDetail> taskDetails = taskDetailService.lambdaQuery()
                .eq(TTaskDetail::getTaskId, dto.getTaskId())
                .eq(TTaskDetail::getAuditStatus, 1)
                .eq(TTaskDetail::getHandleType,1)
                .isNotNull(TTaskDetail::getClearStatus)
                .orderByDesc(TTaskDetail::getCreateTime).list();
        // 使用 stream 去重,保留每个 taskId 最新的一条
        taskDetails = new ArrayList<>(taskDetails.stream()
                .collect(Collectors.groupingBy(
                        TTaskDetail::getTaskId,
                        Collectors.collectingAndThen(
                                Collectors.toList(),
                                listAll -> listAll.get(0)
                        )
                ))
                .values());
        // 添加任务详情
        TTaskDetail taskDetail = new TTaskDetail();
        taskDetail.setTaskId(dto.getTaskId());
        taskDetail.setHandleType(4);
        taskDetail.setClearStatus(taskDetail.getClearStatus());
        taskDetail.setAppealId(dto.getId());
        taskDetailService.save(taskDetail);
        return R.ok();
    }
 
}