package com.se.nsl.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.se.nsl.domain.po.Simu; import com.se.nsl.domain.po.SimuData; import com.se.nsl.domain.vo.*; import com.se.nsl.service.RealTimeSimulationService; import com.se.nsl.service.ResolveService; import com.se.nsl.service.SimuService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.gdal.ogr.Geometry; import org.gdal.ogr.ogr; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.io.IOException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.List; @Api(tags = "03-推演模拟") @Slf4j @RestController @RequestMapping("/simu") @SuppressWarnings("ALL") public class SimuController extends BaseController { @Resource SimuService simuService; @Resource ResolveService resolveService; @Resource RealTimeSimulationService rts; /** * 分页查询推演模拟 * * @param pageNum 页码 * @param pageSize 每页数量 * @return 分页后的推演模拟 */ @ApiOperation(value = "selectPage") @GetMapping("/selectPage") public R selectPage(SimuVo vo, Integer pageNum, Integer pageSize) { try { if (null == pageNum || pageNum < 1) pageNum = 1; if (null == pageSize || pageSize < 1) pageSize = 10; if (pageSize > 1000) pageSize = 1000; IPage paged = simuService.selectPage(vo, pageNum, pageSize); if (null == paged) { return success(null, 0); } return success(paged.getRecords(), paged.getTotal()); } catch (Exception ex) { return fail(ex, null); } } /** * 根据ID批量删除推演模拟 * * @param ids 要删除的推演模拟ID列表 * @return 删除成功的记录数 */ @ApiOperation(value = "deleteByIds") @DeleteMapping("/deleteByIds") public R deleteByIds(@RequestParam List ids) { try { return success(simuService.deleteByIds(ids)); } catch (Exception ex) { return fail(ex, null); } } /** * 新增推演模拟 * * @param simu 推演模拟对象 * @return 新增成功的记录数 */ @ApiOperation(value = "insert") @PostMapping(value = "/insert", produces = "application/json; charset=UTF-8") public R insert(@RequestBody Simu simu) { try { if (StringUtils.isEmpty(simu.getData())) return fail("data为空"); SimuData data = JSON.parseObject(simu.getData(), SimuData.class); if (null == data) return fail("data数据格式(JSON)不正确"); if (StringUtils.isEmpty(simu.getGeom())) return fail("geom字符串不是WKT格式"); Geometry geom = Geometry.CreateFromWkt(simu.getGeom()); if (!(geom.GetGeometryType() == ogr.wkbMultiPolygon || geom.GetGeometryType() == ogr.wkbPolygon)) return fail("geom对象不是多边形"); int rows = simuService.insert(simu); System.out.println(String.format("id:%s", simu.getId())); if (rows > 0 && (null == data.getRainfalls() || data.getRainfalls().size() < 2)) { resolveService.createRainfall(simu); simuService.updateById(simu); } JSONObject json = new JSONObject(); json.put("id", simu.getId()); return success(json); } catch (Exception ex) { return fail(ex, null); } } @ApiOperation(value = "start") @GetMapping(value = "/start", produces = "application/json; charset=UTF-8") public R start(Integer id) { try { if (null == id || id < 1) return fail("id为空"); Simu simu = simuService.selectById(id); if (null == simu) return fail("方案找不到"); if (StringUtils.isEmpty(simu.getData())) return fail("方案数据(JSON)为空"); SimuData data = JSON.parseObject(simu.getData(), SimuData.class); if (null == data) return fail("方案数据格式(JSON)不正确"); //if (simu.getStatus() != 0) return fail("方案正在运行或已完成"); if (StringUtils.isEmpty(simu.getGeom())) return fail("方案的图形为空"); int rows = resolveService.start(simu); return success("ok"); } catch (Exception ex) { return fail(ex, null); } } /** * 修改推演模拟 * * @param simu 推演模拟对象 * @return 修改成功的记录数 */ @ApiOperation(value = "updateById") @PutMapping(value = "/updateById", produces = "application/json; charset=UTF-8") public R updateById(@RequestBody Simu simu) { try { if (StringUtils.isEmpty(simu.getData())) return fail("data为空"); SimuData data = JSON.parseObject(simu.getData(), SimuData.class); if (null == data) return fail("data数据格式(JSON)不正确"); if (StringUtils.isEmpty(simu.getGeom())) return fail("geom字符串不是WKT格式"); Geometry geom = Geometry.CreateFromWkt(simu.getGeom()); if (!(geom.GetGeometryType() == ogr.wkbMultiPolygon || geom.GetGeometryType() == ogr.wkbPolygon)) return fail("geom对象不是多边形"); if (null == data.getRainfalls() || data.getRainfalls().size() < 2) resolveService.createRainfall(simu); return success(simuService.updateById(simu)); } catch (Exception ex) { return fail(ex, null); } } @ApiOperation(value = "position") @GetMapping("/position") public R queryByPosition(double lon, double lat, Long time, String serviceName) { if (lon > 180 || lon < -180) { return clientError("经度范围应该在-180到180"); } if (lat > 90 || lat < -90) { return clientError("纬度范围应该在-90到90"); } if (time == null) { return clientError("时间戳不能为空"); } if (serviceName == null || serviceName.trim().isEmpty()) { return clientError("服务名不能为空"); } SimuResult result = simuService.queryByPosition(lon, lat, time, serviceName); if (result == null) { return notFound("未查找到相关数据"); } return success(result); } @ApiOperation(value = "realTime") @ApiImplicitParams({ @ApiImplicitParam(name = "date1", value = "5分钟前的时间,格式为2025-05-31 14:15:20"), @ApiImplicitParam(name = "rainfall1", value = "5分钟前的降雨强度"), @ApiImplicitParam(name = "date2", value = "当前时间,格式为2025-05-31 14:20:20"), @ApiImplicitParam(name = "rainfall2", value = "当前的降雨强度"), @ApiImplicitParam(name = "serviceName", value = "服务名") }) @GetMapping("/realTime") public R realTimeSimulate(String date1, double rainfall1, String date2, double rainfall2, String serviceName) { RealTimeInput input = new RealTimeInput(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime t1 = LocalDateTime.parse(date1, formatter); LocalDateTime t2 = LocalDateTime.parse(date2, formatter); RealTimeInput.RealTimeData d1 = new RealTimeInput.RealTimeData(); d1.setDateTime(t1); d1.setIntensity(rainfall1); RealTimeInput.RealTimeData d2 = new RealTimeInput.RealTimeData(); d2.setDateTime(t2); d2.setIntensity(rainfall2); input.setData(Arrays.asList(d1, d2)); input.setServiceName(serviceName); try { String layerJsonName = resolveService.realTimeSimulate(input); return success(layerJsonName); } catch (IOException e) { log.error("real-time simulate exception:", e); return fail("实时模拟异常"); } } @ApiOperation(value = "realTime") @PostMapping("/realTime2") public R realTimeSimulate(@RequestBody RealTimeSimuParam param) { try { String layerJsonName = rts.realTimeSimulate(param); return success(layerJsonName); } catch (IOException e) { log.error("real-time simulate exception:", e); return fail("实时模拟异常"); } } }