package com.se.simu.service; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.se.simu.config.PropertiesConfig; import com.se.simu.domain.dto.GeDb; import com.se.simu.domain.po.DataPo; import com.se.simu.domain.po.SimuPo; import com.se.simu.domain.vo.CreateFilesSimuVo; import com.se.simu.domain.vo.SimuVo; import com.se.simu.helper.StringHelper; import com.se.simu.helper.WebHelper; import com.se.simu.mapper.SimuMapper; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.io.File; import java.sql.Timestamp; import java.util.Date; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * SIMU 文件服务 * * @author xingjinshuang@smartearth.cn * @date 2024/12/24 */ @Slf4j @Service public class SimuFilesService { @Resource SimuMapper simuMapper; @Resource PropertiesConfig config; @Resource GedbService gedbService; @Resource UwService uwService; @Resource ResultService resultService; public IPage get(SimuVo vo) { QueryWrapper wrapper = getPageWrapper(vo); Page page = new Page<>(vo.getPageIndex(), vo.getPageSize()); page.addOrder(OrderItem.desc("id")); IPage paged = simuMapper.selectPage(page, wrapper); return paged; } private QueryWrapper getPageWrapper(SimuVo vo) { QueryWrapper wrapper = new QueryWrapper<>(); if (null != vo.getId()) { wrapper.eq("id", vo.getId()); } if (null != vo.getPid()) { wrapper.eq("pid", vo.getPid()); } if (null != vo.getNum()) { wrapper.eq("num", vo.getNum()); } if (!StringHelper.isEmpty(vo.getName())) { wrapper.like("lower(name)", vo.getName().trim().toLowerCase()); } if (!CollUtil.isEmpty(vo.getStatus())) { wrapper.in("status", vo.getStatus()); } return wrapper; } private boolean delDir(String dir) { File file = new File(dir); if (!file.exists() || !file.isDirectory()) { return false; } return FileUtil.del(dir); } /** * "状态: * 0-创建仿真任务, * 1-连接GEDB库, * 2-下载空间数据, * 3-下载高程数据, * 4-生成降雨文件, * 5-生成配置文件, * 6-模拟内涝仿真, * 7-处理水位文件, * 8-处理排水文件, * 9-处理仿真结果, * 10-完成,-10-出错 * * @param vo VO * @return boolean */ public boolean createByfiles(CreateFilesSimuVo vo,String token) { Date now = new Date(); String date = StringHelper.YMDHMS2_FORMAT.format(now); if (StringHelper.isEmpty(vo.getName())) { vo.setName(date); } DataPo data = BeanUtil.copyProperties(vo, DataPo.class); data.setPath(date, date); initPath(data); SimuPo simu = new SimuPo(vo.getNum(), vo.getPid(), vo.getName(), JSONUtil.toJsonStr(data), 0, vo.getBak()); simu.setServiceName(date); simu.setCreateTime(new Timestamp(now.getTime())); simu.setSemUrl(vo.getSemUrl()); simu.setPointUrl(vo.getPointName()); simu.setLinkUrl(vo.getLinkName()); int rows = simuMapper.insert(simu); if (rows > 0) { asyncCall(simu,token); } return rows > 0; } private void initPath(DataPo data) { createDir(config.getInPath() + File.separator + data.getInPath()); createDir(config.getOutPath() + File.separator + data.getOutPath()); } private void createDir(String path) { File f = new File(path); if (f.exists() && f.isDirectory()) { FileUtil.del(f); } f.mkdirs(); } private void asyncCall(SimuPo simu,String token) { ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(new Runnable() { @Override @SneakyThrows public void run() { cope(simu,token); } }); executor.shutdown(); } /** * "状态: * 0-创建仿真任务, * 1-连接GEDB库, * 2-下载空间数据, * 3-下载高程数据, * 4-生成降雨文件, * 5-生成配置文件, * 6-模拟内涝仿真, * 7-处理水位文件, * 8-处理排水文件, * 9-处理仿真结果, * 10-完成,-10-出错 * * @param simu 模拟 */ private void cope(SimuPo simu,String token) { try { DataPo data = JSONUtil.toBean(simu.getData(), DataPo.class); update(simu, 1, null); GeDb db = gedbService.connectGedb(token, data); simu.setData(JSONUtil.toJsonStr(data)); update(simu, 2, null); gedbService.copeVectors(token, data, db); update(simu, 3, null); gedbService.copeDem(token, data); update(simu, 4, null); uwService.createRainFile(data); update(simu, 5, null); uwService.createConfig(data); update(simu, 6, null); uwService.callExe(data); update(simu, 7, null); //uwService.copeWaterFiles(); update(simu, 8, null); uwService.copeDrainFiles(data); update(simu, 9, null); resultService.process(data); update(simu, 10, "完成"); } catch (Exception ex) { log.error(ex.getMessage(), ex); update(simu, -simu.getStatus(), ex.getMessage()); } } private void update(SimuPo simu, int status, String rs) { simu.setStatus(status); if (null != rs) simu.setResult(rs); simu.setUpdateTime(WebHelper.getCurrentTimestamp()); simuMapper.updateById(simu); } }