吉安感知网项目-后端
linwei
2026-01-27 e7e920b15e7cb9cf28e380a445ce87b9937c675a
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
 
package org.sxkj.resource.controller;
 
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.DateTimeUtil;
import org.springblade.core.tool.utils.Func;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.sxkj.common.model.ResponseResult;
import org.sxkj.resource.dto.AttachDto;
import org.sxkj.resource.entity.Attach;
import org.sxkj.resource.param.AttachPageParam;
import org.sxkj.resource.param.AttachParam;
import org.sxkj.resource.service.IAttachService;
import org.sxkj.resource.vo.AttachVO;
import org.sxkj.resource.vo.AttachmentDownloadParam;
 
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.Objects;
 
/**
 * 附件表 控制器
 *
 * @author Chill
 */
@Slf4j
@NonDS
@RestController
@AllArgsConstructor
@RequestMapping("/attach")
@Api(value = "附件表接口", tags = "附件")
public class AttachController extends BladeController {
 
    private final IAttachService attachService;
 
    /**
     * 详情
     */
    @GetMapping("/detail")
    @ApiOperationSupport(order = 1)
    @ApiOperation(value = "附件详情", notes = "传入attach")
    public R<Attach> detail(AttachParam attach) {
        Attach detail = attachService.getOne(Wrappers.lambdaQuery(Attach.class).eq(Attach::getId, attach.getId()));
        return R.data(detail);
    }
 
    /**
     * 自定义分页 附件表
     */
    @GetMapping("/page")
    @ApiOperationSupport(order = 3)
    @ApiOperation(value = "附件分页", notes = "传入attach")
    public R<IPage<AttachVO>> page(AttachPageParam attach, Query query) {
        IPage<AttachVO> pages = attachService.selectAttachPage(Condition.getPage(query), attach);
        return R.data(pages);
    }
 
    /**
     * 新增或修改 附件表
     */
    @PostMapping("/submit")
    @ApiOperationSupport(order = 6)
    @ApiOperation(value = "新增或修改", notes = "传入attach")
    public R submit(@Valid @RequestBody AttachDto attachDto) {
        Attach attach = Objects.requireNonNull(BeanUtil.copy(attachDto, Attach.class));
        return R.status(attachService.saveOrUpdate(attach));
    }
 
 
    /**
     * 删除 附件表
     */
    @PostMapping("/remove")
    @ApiOperationSupport(order = 7)
    @ApiOperation(value = "附件逻辑删除", notes = "传入ids")
    public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
        return R.status(attachService.update(Wrappers.lambdaUpdate(Attach.class)
            .set(Attach::getIsDeleted, true)
            .in(Attach::getId, Func.toLongList(ids))));
    }
 
    // @GetMapping("/test")
    // public R test(@RequestParam(required = true) Date startTime, @RequestParam(required = true) Date endTime) {
    //     CacheUtil.clear(RESOURCE_CACHE);
    //     attachClient.processingYesterdayVideo(startTime, endTime);
    //     return R.success("成功");
    // }
 
    // @GetMapping("/getlotInfoList")
    // public ResponseResult getlotInfoList(@ApiParam Long lotInfoId) {
    //     return ResponseResult.success(attachService.getlotInfoList(lotInfoId));
    // }
 
    /**
     * 分页 附件表
     */
     @GetMapping("/list")
     @ApiOperationSupport(order = 2)
     @ApiOperation(value = "附件分页", notes = "传入attach")
     public R<IPage<Attach>> list(Attach attach, Query query) {
         String patrolTaskId = attach.getPatrolTaskId();
         QueryWrapper<Attach> queryWrapper1 = Condition.getQueryWrapper(attach);
         QueryWrapper<Attach> queryWrapper = queryWrapper1.eq(!StringUtils.isEmpty(patrolTaskId), "patrol_task_id", patrolTaskId);
         queryWrapper.eq("is_deleted", 0);
         IPage<Attach> pages = attachService.page(Condition.getPage(query), queryWrapper);
         return R.data(pages);
     }
 
    /**
     * 自定义分页 附件表
     */
    // @PostMapping("/aiImagesPage")
    // @ApiOperationSupport(order = 3)
    // @ApiOperation(value = "自定义分页附件表分页", notes = "ai分页数据")
    // public R<IPage<AttachVO>> aiPage(@RequestBody AttachVO attach, Query query) {
    //     String areaCode = HeaderUtils.getAreaCode();
    //     attach.setAreaCode(areaCode);
    //     List<Integer> resultTypes = attach.getResultTypes();
    //     String wordOrderType = attach.getWordOrderType();
    //     settingResultType(attach, wordOrderType, resultTypes);
    //     if (Objects.nonNull(attach.getAiStatus()) && Objects.nonNull(attach.getResultTypes())
    //         && attach.getResultTypes().contains(Attach.RESULT_TYPE_AI)) {
    //         attach.setResultTypes(Arrays.asList(Attach.RESULT_TYPE_AI));
    //     }
    //     List<String> aiEventMd5s = attachService.findAiEventMd5s(attach.getEventRecordIds());
    //     attach.setMd5s(aiEventMd5s);
    //     if (!CollectionUtils.isEmpty(attach.getEventRecordIds())) {
    //         attach.setResultTypes(Arrays.asList(Attach.RESULT_TYPE_AI, Attach.RESULT_TYPE_IMG));
    //     }
    //     IPage page = Condition.getPage(query);
    //     List<AttachVO> aiAttachImages = attachService.findAiAttachImages(page, attach);
    //     AttachVO.settingNickName(aiAttachImages);
    //     page.setRecords(aiAttachImages);
    //     return R.data(page);
    // }
 
    /**
     * 后台数据中心列表接口
     */
    // @PostMapping("/attachmentsPage")
    // @ApiOperationSupport(order = 4)
    // @ApiOperation(value = "后台数据中心列表接口")
    // public R<IPage<AttachVO>> attachmentsPage(@RequestBody AttachVO attach, Query query) {
    //     IPage page = Condition.getPage(query);
    //     IPage attachPage = attachService.findAttachImages(page, attach);
    //     return R.data(attachPage);
    // }
 
 
 
    /**
     * 新增 附件表
     */
     @PostMapping("/save")
     @ApiOperationSupport(order = 4)
     @ApiOperation(value = "新增", notes = "传入attach")
     public R save(@Valid @RequestBody Attach attach) {
         return R.status(attachService.save(attach));
     }
 
    /**
     * 修改 附件表
     */
     @PostMapping("/update")
     @ApiOperationSupport(order = 5)
     @ApiOperation(value = "修改", notes = "传入attach")
     public R update(@Valid @RequestBody Attach attach) {
         return R.status(attachService.updateById(attach));
     }
 
    /**
     * 流式附件下载接口,支持下载zip压缩包,不使用本地存储
     * @param param
     * @param response
     * @throws IOException
     */
    @ApiOperation(value = "流式附件下载接口", notes = "使用流方式返回数据,不使用本地存储")
    @PostMapping("/downloadByByte")
    public void downloadByByte(
        @ApiParam(value = "附件下载参数") @RequestBody AttachmentDownloadParam param,
        HttpServletResponse response) throws IOException {
 
        // 设置文件名
        String timestamp = DateTimeUtil.format(LocalDateTime.now(), "yyyyMMdd_HHmmss");
        String fileName = "attachments_" + timestamp + ".zip";
 
        // 设置响应头
        response.setContentType("application/zip");
        response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, StandardCharsets.UTF_8.name()));
 
        // 获取响应输出流
        ServletOutputStream outputStream = null;
        try {
            outputStream = response.getOutputStream();
 
            Boolean result = attachService.downloadByByte(param, outputStream);
            if (!result) {
                return;
            }
        } catch (Exception e) {
            if (!response.isCommitted()) {
                response.reset();
                response.setContentType("application/json;charset=UTF-8");
                ResponseResult errorResult = ResponseResult.error("下载文件失败: " + e.getMessage());
 
                // 使用输出流写入错误信息,避免getWriter()冲突
                try {
                    byte[] errorBytes = JSON.toJSONString(errorResult).getBytes(StandardCharsets.UTF_8);
                    outputStream.write(errorBytes);
                } catch (IOException ioException) {
                    log.error("Error writing error response: {}", ioException.getMessage());
                }
            } else {
                log.error("Cannot send error response: response already committed. Exception: {}", e.getMessage());
            }
        }
    }
 
    /**
     * 删除 附件表及对应的附件信息
     *
     * @param ids
     * @return
     */
    // @PostMapping("/removeAttachAndData")
    // @ApiOperationSupport(order = 9)
    // @ApiOperation(value = "删除", notes = "传入ids")
    // @PreAuth(RoleConstant.HAS_ROLE_ADMINISTRATOR)
    // public R removeAttachAndData(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
    //     return R.status(attachService.removeBatchAndDataByIds(Func.toLongList(ids)));
    // }
 
    // @GetMapping("/deptSize")
    // @ApiOperationSupport(order = 8)
    // @ApiOperation(value = "获取部门文件大小")
    // public R<List<DeptAndSizeVo>> getDeptSize(@RequestParam String startTime, @RequestParam String endTime) {
    //     return R.data(attachService.getDeptAllSize(startTime, endTime));
    // }
 
    /**
     * 历史正射图片处理
     *
     * @return
     */
    // @GetMapping("/hisOrtPicHandler")
    // @ApiOperationSupport(order = 9)
    // @ApiOperation(value = "历史正射图片处理")
    // public R hisOrtPicHandler() {
    //     return R.data(attachService.hisOrtPicHandler());
    // }
 
    /**
     * 自动更新附件表md5值
     *
     * @return
     */
    // @GetMapping("saveMd5")
    // public R saveMd5() {
    //     attachService.saveMd5();
    //     return R.success("");
    // }
 
 
    // @ApiOperation(value = "地图位置上图片数据", notes = "")
    // @PostMapping("/mapAttachs")
    // public ResponseResult<TreeVo> mapEvents(@RequestBody AttachQueryParam dto) {
    //     if (Objects.nonNull(dto.getDateEnum())) {
    //         TimeRange timeRange = TimeRangeUtils.getTimeRange(dto.getDateEnum());
    //         dto.setStartDate(timeRange.getStartTime());
    //         dto.setEndDate(timeRange.getEndTime());
    //     }
    //     if (Objects.nonNull(dto.getStartDate())) {
    //         dto.setStartTime(TimeRangeUtils.getEpochMilli(dto.getStartDate()));
    //     }
    //     if (Objects.nonNull(dto.getEndDate())) {
    //         dto.setEndTime(TimeRangeUtils.getEpochMilli(dto.getEndDate()));
    //     }
    //     String areaCode = HeaderUtils.getHeader(CommonConstant.AREA_CODE).orElse(null);
    //     dto.setAreaCode(!StringUtils.isEmpty(dto.getAreaCode()) ? dto.getAreaCode() : areaCode);
    //     TreeVo treeVo = attachService.mapAttachEvents(dto);
    //     return ResponseResult.success(treeVo);
    // }
 
    /**
     * 图片分析对比 前后图片对比
     *
     * @param id 图片id
     * @return
     */
    // @GetMapping("contrastiveAnalysis")
    // public ResponseResult contrastiveAnalysis(@RequestParam() Long id) {
    //     List<AnalysisAttachVo> list = attachService.contrastiveAnalysis(id);
    //     return ResponseResult.success(list);
    // }
 
    // @ApiOperation(value = "附件详情", notes = "")
    // @GetMapping("/getAttachInfo")
    // public ResponseResult<AttachInfoVO> getAttachInfo(@ApiParam(value = "附件iD") @RequestParam("id") Long id) throws IOException {
    //     return ResponseResult.success(attachService.getAttachInfo(id));
    // }
 
    // @ApiOperation(value = "通过任务id查询附件详情集合", notes = "")
    // @GetMapping("/getAttachInfoByJobId")
    // public ResponseResult<List<AttachInfoVO>> getAttachInfoByJobId(@ApiParam(value = "任务id") @RequestParam("jobId") String jobId) throws IOException {
    //     return ResponseResult.success(attachService.getAttachInfoByJobId(jobId));
    // }
 
 
    // @ApiLog("修改文件名称")
    // @PostMapping("/updateFileName")
    // public ResponseResult updateFileName(@RequestParam Long id, @RequestParam String nickName) {
    //     if (attachService.updateFileName(id, nickName) > 0) {
    //         return ResponseResult.success();
    //     }
    //     return ResponseResult.error("修改失败");
    // }
 
 
    /**
     * 删除无用的404状态的链接地址
     *
     * @return
     */
    // @GetMapping("deletedNotExistsUrl")
    // public ResponseResult deletedNotExistsUrl() {
    //     attachService.deletedNotExistsUrl();
    //     return ResponseResult.success();
    // }
 
    // @ApiLog("删除图片视频")
    // @DeleteMapping("/deleteMediaFile")
    // public ResponseResult deleteMediaFile(@RequestBody List<Long> ids) {
    //     attachService.deleteMediaFile(ids);
    //     return ResponseResult.success();
    // }
 
    /**
     * 附件统计
     */
    // @ApiOperation(value = "附件统计", notes = "")
    // @PostMapping("/attachTypeStatistics")
    // public ResponseResult<List<AttachTypeStatisticsVO>> attachTypeStatistics(@RequestBody AttachStatisticsVo attachStatisticsVo) {
    //     List<AttachTypeStatisticsVO> result = attachService.attachTypeStatistics(attachStatisticsVo);
    //     return ResponseResult.success(result);
    // }
 
    /**
     * 个人中心附件统计
     */
    // @ApiOperation(value = "个人中心附件统计", notes = "")
    // @PostMapping("/getManageAttachTypeStatistics")
    // public ResponseResult<List<LineColumnDateVo>> getManageAttachTypeStatistics(@RequestBody WaylineJobInfoQueryDto dto) {
    //     WaylineJobInfoQueryParam param = new WaylineJobInfoQueryParam(dto);
    //     param.setFormatTime(ChartDataVo.getTimeFormatByEnum(param.getDateEnum()));
    //     List<LineColumnDateVo> result = attachService.getManageAttachTypeStatistics(param);
    //     return ResponseResult.success(result);
    // }
 
}