事故管理

This commit is contained in:
hekaiyu 2025-11-24 16:42:21 +08:00
parent 259604d42a
commit 697e869621
31 changed files with 1033 additions and 82 deletions

View File

@ -0,0 +1,12 @@
package org.jeecg.modules.base.entity;
import lombok.Data;
@Data
public class DoseFactor {
private String nuclideName;
private Double halfLife;
private Double cef;
private Double sef;
private Double rif;
}

View File

@ -37,4 +37,6 @@ public class Engineering {
private Integer sceneType;
/**工程备注*/
private String remark;
/**事故类型*/
private Integer eventType;
}

View File

@ -0,0 +1,50 @@
package org.jeecg.modules.base.entity;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* @Description: 事故比例系数表
* @Author: jeecg-boot
* @Date: 2025-11-14
* @Version: V1.0
*/
@Data
@TableName("stas_event_coefficient")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
public class EventCoefficient implements Serializable {
private static final long serialVersionUID = 1L;
/**主键*/
@TableId(type = IdType.ASSIGN_ID)
private Integer id;
/**创建人*/
private String createBy;
/**创建日期*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**更新人*/
private String updateBy;
/**更新日期*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**事故类型名称*/
@Excel(name = "事故类型名称", width = 15)
private String eventTypeName;
/**核素名称*/
@Excel(name = "核素名称", width = 15)
private String nuclideName;
/**核素系数*/
@Excel(name = "核素系数", width = 15)
private Double nuclideCoefficient;
}

View File

@ -0,0 +1,46 @@
package org.jeecg.modules.base.entity;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* @Description: 事故类型表
* @Author: jeecg-boot
* @Date: 2023-12-12
* @Version: V1.0
*/
@Data
@TableName("stas_event_type")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
public class EventType implements Serializable {
private static final long serialVersionUID = 1L;
/**主键*/
@TableId(type = IdType.ASSIGN_ID)
private Integer id;
/**创建人*/
private String createBy;
/**创建日期*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**事故名称*/
@Excel(name = "事故名称", width = 15)
private String eventName;
/**热功率(MW)*/
@Excel(name = "热功率(MW)", width = 15)
private Double power;
/**运行平衡时间(s)*/
@Excel(name = "运行平衡时间(s)", width = 15)
private Long runTime;
}

View File

@ -0,0 +1,47 @@
package org.jeecg.modules.base.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
* @Description: 核素种类
* @Author: jeecg-boot
* @Date: 2023-09-20
* @Version: V1.0
*/
@Data
@TableName("stas_nuclide_type")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
public class NuclideType implements Serializable {
private static final long serialVersionUID = 1L;
/**主键*/
@TableId(type = IdType.ASSIGN_ID)
private Integer id;
/**创建人*/
private String createBy;
/**创建日期*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**核素名称*/
@Excel(name = "核素名称", width = 15)
private String nuclideName;
/**半衰期*/
@Excel(name = "半衰期", width = 15)
private Double halfLife;
/**热谱*/
@Excel(name = "热谱", width = 15)
private Double heatSpectrum;
}

View File

@ -2,8 +2,11 @@ package org.jeecg.modules.base.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.jeecg.modules.base.entity.DoseFactor;
import org.jeecg.modules.base.entity.Engineering;
import java.util.List;
/**
* @Description: wrf
* @Author: jeecg-boot
@ -13,4 +16,6 @@ import org.jeecg.modules.base.entity.Engineering;
@Mapper
public interface EngineeringMapper extends BaseMapper<Engineering> {
List<DoseFactor> getDoseFactor();
}

View File

@ -0,0 +1,14 @@
package org.jeecg.modules.base.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.jeecg.modules.base.entity.EventCoefficient;
/**
* @Description: 事故比例系数表
* @Author: jeecg-boot
* @Date: 2023-10-23
* @Version: V1.0
*/
public interface EventCoefficientMapper extends BaseMapper<EventCoefficient> {
}

View File

@ -0,0 +1,14 @@
package org.jeecg.modules.base.mapper;
import org.jeecg.modules.base.entity.EventType;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 事故类型表
* @Author: jeecg-boot
* @Date: 2023-12-12
* @Version: V1.0
*/
public interface EventTypeMapper extends BaseMapper<EventType> {
}

View File

@ -0,0 +1,14 @@
package org.jeecg.modules.base.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.jeecg.modules.base.entity.NuclideType;
/**
* @Description: 核素模块
* @Author: jeecg-boot
* @Date: 2023-09-20
* @Version: V1.0
*/
public interface NuclideTypeMapper extends BaseMapper<NuclideType> {
}

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.base.mapper.EngineeringMapper">
<select id="getDoseFactor" resultType="org.jeecg.modules.base.entity.DoseFactor">
select * from stas_dose_factor
</select>
</mapper>

View File

@ -4,18 +4,14 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.baseAPI.service.BaseAPIService;
import org.jeecg.baseAPI.utils.DateTimeUtils;
import org.jeecg.common.constant.DiffusionPrefixConstants;
import org.jeecg.common.constant.EventConstants;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.properties.EventServerProperties;
import org.jeecg.common.util.DateUtils;
import org.jeecg.common.util.NcUtil;
import org.jeecg.diffusion.service.DiffusionDataService;
import org.jeecg.diffusion.vo.DiffusionResultVO;
import org.jeecg.modules.base.entity.Engineering;
import org.jeecg.modules.base.entity.Wrf;
import org.jeecg.modules.base.mapper.CmaqMapper;
import org.jeecg.modules.base.mapper.EngineeringMapper;
import org.jeecg.modules.base.mapper.WrfMapper;
import org.springframework.stereotype.Service;
@ -23,10 +19,7 @@ import ucar.nc2.NetcdfFile;
import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

View File

@ -2,6 +2,7 @@ package org.jeecg.engineering.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.base.entity.DoseFactor;
import org.jeecg.modules.base.entity.Engineering;
import org.jeecg.runProcess.VO.RunProcessParamVO;
@ -35,5 +36,8 @@ public interface EngineeringService extends IService<Engineering> {
*/
void initDir(Engineering engineering);
/**
* 获取剂量转换因子
*/
List<DoseFactor> getDoseFactor();
}

View File

@ -15,6 +15,7 @@ import org.jeecg.runProcess.VO.RunProcessParamVO;
import org.springframework.stereotype.Service;
import java.io.File;
import java.util.List;
import java.util.Map;
@Service
@ -74,5 +75,10 @@ public class EngineeringServiceImpl extends ServiceImpl<EngineeringMapper, Engin
RemoteExecuteCommand.runRemoteLinuxCmd(ip, username, password, runCmd);
}
@Override
public List<DoseFactor> getDoseFactor(){
return this.baseMapper.getDoseFactor();
}
}

View File

@ -0,0 +1,12 @@
package org.jeecg.engineering.vo;
import lombok.Data;
@Data
public class DoseFactorVO {
private String nuclideName;
private Double halfLife;
private Double cef;
private Double sef;
private Double rif;
}

View File

@ -0,0 +1,15 @@
package org.jeecg.eventCoefficient.VO;
import lombok.Data;
import java.util.List;
import java.util.Map;
@Data
public class EventCoefficientResultVO {
/** 核素名称集合 */
List<String> bizSourceItems;
/** 系数集合 */
List<Map<String,String>> resultMaps;
}

View File

@ -0,0 +1,127 @@
package org.jeecg.eventCoefficient.controller;
import java.util.*;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.eventCoefficient.VO.EventCoefficientResultVO;
import org.jeecg.eventCoefficient.service.EventCoefficientService;
import org.jeecg.modules.base.entity.EventCoefficient;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.system.base.controller.JeecgController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.jeecg.common.aspect.annotation.AutoLog;
/**
* @Description: 事故比例系数表
* @Author: jeecg-boot
* @Date: 2023-10-23
* @Version: V1.0
*/
@RestController
@RequestMapping("/eventCoefficient")
@Slf4j
public class EventCoefficientController extends JeecgController<EventCoefficient, EventCoefficientService> {
@Autowired
private EventCoefficientService eventCoefficientService;
/**
* 分页列表查询
*
* @param eventCoefficient
* @param pageNo
* @param pageSize
* @param req
* @return
*/
@Operation(summary = "事故比例系数表-分页列表查询")
@GetMapping(value = "/list")
public Result<IPage<EventCoefficient>> queryPageList(EventCoefficient eventCoefficient,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10000") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<EventCoefficient> queryWrapper = QueryGenerator.initQueryWrapper(eventCoefficient, req.getParameterMap());
Page<EventCoefficient> page = new Page<EventCoefficient>(pageNo, pageSize);
IPage<EventCoefficient> pageList = eventCoefficientService.page(page, queryWrapper);
return Result.OK(pageList);
}
/**
* 编辑
*
* @param eventCoefficient
* @return
*/
@AutoLog(value = "事故比例系数表-编辑")
@Operation(summary = "事故比例系数表-编辑")
@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
public Result<String> edit(@RequestBody EventCoefficient eventCoefficient) {
eventCoefficientService.updateById(eventCoefficient);
return Result.OK("编辑成功!");
}
/**
* 通过id删除
*
* @param id
* @return
*/
@AutoLog(value = "事故比例系数表-通过id删除")
@Operation(summary = "事故比例系数表-通过id删除")
@DeleteMapping(value = "/delete")
public Result<String> delete(@RequestParam(name="id",required=true) String id) {
eventCoefficientService.removeById(id);
return Result.OK("删除成功!");
}
/**
* 批量删除
*
* @param ids
* @return
*/
@AutoLog(value = "事故比例系数表-批量删除")
@Operation(summary = "事故比例系数表-批量删除")
@DeleteMapping(value = "/deleteBatch")
public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
this.eventCoefficientService.removeByIds(Arrays.asList(ids.split(",")));
return Result.OK("批量删除成功!");
}
/**
* 通过id查询
*
* @param id
* @return
*/
//@AutoLog(value = "事故比例系数表-通过id查询")
@Operation(summary = "事故比例系数表-通过id查询")
@GetMapping(value = "/queryById")
public Result<EventCoefficient> queryById(@RequestParam(name="id",required=true) String id) {
EventCoefficient eventCoefficient = eventCoefficientService.getById(id);
if(eventCoefficient==null) {
return Result.error("未找到对应数据");
}
return Result.OK(eventCoefficient);
}
public double calculateActivity(int power,int runTime,double halfLife,double heatSpectrum){
double activity;
if(halfLife < power){
activity = 310 * heatSpectrum * 100 * power * 1000000000000l;
}else{
activity = 210 * heatSpectrum * 100 * runTime * power * 1000000000000l / halfLife;
}
return activity;
}
}

View File

@ -0,0 +1,14 @@
package org.jeecg.eventCoefficient.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.base.entity.EventCoefficient;
/**
* @Description: 事故比例系数表
* @Author: jeecg-boot
* @Date: 2023-10-23
* @Version: V1.0
*/
public interface EventCoefficientService extends IService<EventCoefficient> {
}

View File

@ -0,0 +1,19 @@
package org.jeecg.eventCoefficient.service.impl;
import org.jeecg.modules.base.mapper.EventCoefficientMapper;
import org.jeecg.eventCoefficient.service.EventCoefficientService;
import org.jeecg.modules.base.entity.EventCoefficient;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
/**
* @Description: 事故比例系数表
* @Author: jeecg-boot
* @Date: 2023-10-23
* @Version: V1.0
*/
@Service
public class EventCoefficientServiceImpl extends ServiceImpl<EventCoefficientMapper, EventCoefficient> implements EventCoefficientService {
}

View File

@ -0,0 +1,108 @@
package org.jeecg.eventType.controller;
import javax.servlet.http.HttpServletRequest;
import io.swagger.v3.oas.annotations.Operation;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.eventType.vo.EventCoefficientVO;
import org.jeecg.eventType.vo.EventResultVO;
import org.jeecg.modules.base.entity.EventType;
import org.jeecg.eventType.service.EventTypeService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.system.base.controller.JeecgController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.jeecg.common.aspect.annotation.AutoLog;
import java.util.List;
/**
* @Description: 事故类型表
* @Author: jeecg-boot
* @Date: 2023-12-12
* @Version: V1.0
*/
@RestController
@RequestMapping("/eventType")
@Slf4j
public class BizEventTypeController extends JeecgController<EventType, EventTypeService> {
@Autowired
private EventTypeService eventTypeService;
/**
* 列表查询
* @return
*/
//@AutoLog(value = "事故类型表-分页列表查询")
@Operation(summary = "事故类型表-列表查询")
@GetMapping(value = "/list")
public Result<EventResultVO> queryPageList() {
return Result.OK(eventTypeService.queryCoefficients());
}
/**
* 添加
*
* @param eventType
* @return
*/
@AutoLog(value = "事故类型表-添加")
@Operation(summary = "事故类型表-添加")
@PostMapping(value = "/add")
public Result<String> add(@RequestBody EventType eventType) {
eventTypeService.addEventType(eventType);
return Result.OK("添加成功!");
}
/**
* 编辑
*
* @param eventCoefficientVOs
* @return
*/
@AutoLog(value = "事故类型表-编辑")
@Operation(summary = "事故类型表-编辑")
@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
public Result<String> edit(@RequestBody List<EventCoefficientVO> eventCoefficientVOs) {
eventTypeService.editCoefficientType(eventCoefficientVOs);
return Result.OK("编辑成功!");
}
/**
* 通过id删除
*
* @param id
* @return
*/
@AutoLog(value = "事故类型表-通过id删除")
@Operation(summary = "事故类型表-通过id删除")
@DeleteMapping(value = "/delete")
public Result<String> delete(@RequestParam(name="id",required=true) Integer id) {
eventTypeService.delEventType(id);
return Result.OK("删除成功!");
}
/**
* 通过id查询
*
* @param id
* @return
*/
//@AutoLog(value = "事故类型表-通过id查询")
@Operation(summary = "事故类型表-通过id查询")
@GetMapping(value = "/queryById")
public Result<EventType> queryById(@RequestParam(name="id",required=true) String id) {
EventType eventType = eventTypeService.getById(id);
if(eventType==null) {
return Result.error("未找到对应数据");
}
return Result.OK(eventType);
}
}

View File

@ -0,0 +1,22 @@
package org.jeecg.eventType.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.eventType.vo.EventCoefficientVO;
import org.jeecg.eventType.vo.EventResultVO;
import org.jeecg.modules.base.entity.EventType;
import java.util.List;
/**
* @Description: 事故类型表
* @Author: jeecg-boot
* @Date: 2023-12-12
* @Version: V1.0
*/
public interface EventTypeService extends IService<EventType> {
void addEventType(EventType eventType);
void delEventType(Integer id);
void editCoefficientType(List<EventCoefficientVO> eventCoefficientVOs);
EventResultVO queryCoefficients();
}

View File

@ -0,0 +1,226 @@
package org.jeecg.eventType.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import lombok.RequiredArgsConstructor;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.eventCoefficient.service.EventCoefficientService;
import org.jeecg.eventType.vo.EventCoefficientVO;
import org.jeecg.eventType.vo.EventResultVO;
import org.jeecg.modules.base.entity.EventCoefficient;
import org.jeecg.modules.base.entity.EventType;
import org.jeecg.modules.base.entity.NuclideType;
import org.jeecg.modules.base.mapper.EventCoefficientMapper;
import org.jeecg.modules.base.mapper.EventTypeMapper;
import org.jeecg.eventType.service.EventTypeService;
import org.jeecg.modules.base.mapper.NuclideTypeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Description: 事故类型表
* @Author: jeecg-boot
* @Date: 2023-12-12
* @Version: V1.0
*/
@Service
@RequiredArgsConstructor
public class EventTypeServiceImpl extends ServiceImpl<EventTypeMapper, EventType> implements EventTypeService {
public final EventCoefficientMapper eventCoefficientMapper;
public final NuclideTypeMapper nuclideTypeMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public void addEventType(EventType eventType) {
List<NuclideType> nuclideTypes = nuclideTypeMapper.selectList(
new LambdaQueryWrapper<NuclideType>().orderByAsc(NuclideType::getCreateTime)
);
if (CollectionUtils.isEmpty(nuclideTypes)) {
throw new JeecgBootException("核素信息为空!");
}
// 检查事件名称是否已存在
Long eventCount = this.baseMapper.selectCount(
new LambdaQueryWrapper<EventType>().eq(EventType::getEventName, eventType.getEventName())
);
if (eventCount > 0) {
throw new JeecgBootException("事件名称已存在!");
}
String eventName = eventType.getEventName();
List<EventCoefficient> values = new ArrayList<>();
for (NuclideType nuclideType : nuclideTypes) {
EventCoefficient eventCoefficient = new EventCoefficient();
eventCoefficient.setEventTypeName(eventName);
eventCoefficient.setNuclideName(nuclideType.getNuclideName());
eventCoefficient.setNuclideCoefficient(0d);
values.add(eventCoefficient);
}
eventCoefficientMapper.insert(values);
this.baseMapper.insert(eventType);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delEventType(Integer id){
EventType eventType = this.baseMapper.selectById(id);
this.baseMapper.deleteById(id);
eventCoefficientMapper.delete(new LambdaQueryWrapper<EventCoefficient>().eq(EventCoefficient::getEventTypeName,eventType.getEventName()));
}
@Override
@Transactional(rollbackFor = Exception.class)
public void editCoefficientType(List<EventCoefficientVO> eventCoefficientVOs) {
if (CollectionUtils.isEmpty(eventCoefficientVOs)) {
throw new JeecgBootException("系数信息为空!");
}
// 查询核素信息只查询所需字段
List<NuclideType> nuclideTypes = nuclideTypeMapper.selectList(
new LambdaQueryWrapper<NuclideType>()
.select(NuclideType::getNuclideName)
.orderByAsc(NuclideType::getCreateTime)
);
if (CollectionUtils.isEmpty(nuclideTypes)) {
throw new JeecgBootException("核素信息为空!");
}
int nuclideCount = nuclideTypes.size();
// 批量删除
this.baseMapper.delete(null);
eventCoefficientMapper.delete(null);
// 批量插入事件类型和系数
List<EventType> eventTypes = new ArrayList<>();
List<EventCoefficient> allEventCoefficients = new ArrayList<>();
for (EventCoefficientVO eventCoefficientVO : eventCoefficientVOs) {
String eventName = eventCoefficientVO.getEventName();
List<Double> coefficients = eventCoefficientVO.getCoefficients();
// 添加事件类型
EventType eventType = new EventType();
eventType.setEventName(eventName);
eventTypes.add(eventType);
// 构建系数列表自动补全缺失的系数为0
for (int i = 0; i < nuclideCount; i++) {
EventCoefficient eventCoefficient = new EventCoefficient();
eventCoefficient.setEventTypeName(eventName);
eventCoefficient.setNuclideName(nuclideTypes.get(i).getNuclideName());
// 如果系数数量不足后续核素的值设置为0
if (i < coefficients.size()) {
eventCoefficient.setNuclideCoefficient(coefficients.get(i));
} else {
eventCoefficient.setNuclideCoefficient(0.0);
}
allEventCoefficients.add(eventCoefficient);
}
}
// 批量插入
if (!eventTypes.isEmpty()) {
this.baseMapper.insert(eventTypes);
}
if (!allEventCoefficients.isEmpty()) {
eventCoefficientMapper.insert(allEventCoefficients);
}
}
@Override
public EventResultVO queryCoefficients() {
EventResultVO resultVO = new EventResultVO();
// 1. 获取核素信息
List<NuclideType> nuclideTypes = nuclideTypeMapper.selectList(
new LambdaQueryWrapper<NuclideType>().orderByAsc(NuclideType::getCreateTime)
);
if (CollectionUtils.isEmpty(nuclideTypes)) {
throw new JeecgBootException("核素信息为空!");
}
// 提取核素名称列表
List<String> nuclideNames = nuclideTypes.stream()
.map(NuclideType::getNuclideName)
.collect(Collectors.toList());
resultVO.setNuclideNames(nuclideNames);
// 2. 获取事件类型和系数数据
List<EventType> eventTypes = this.baseMapper.selectList(
new LambdaQueryWrapper<EventType>().orderByAsc(EventType::getCreateTime)
);
if (CollectionUtils.isEmpty(eventTypes)) {
resultVO.setEventCoefficients(Collections.emptyList());
return resultVO;
}
List<EventCoefficient> coefficients = eventCoefficientMapper.selectList(
new LambdaQueryWrapper<EventCoefficient>().orderByAsc(EventCoefficient::getNuclideName)
);
// 3. 按事件类型分组系数数据
Map<String, List<EventCoefficient>> groupedByEventType = coefficients.stream()
.collect(Collectors.groupingBy(EventCoefficient::getEventTypeName));
// 4. 构建事件系数VO列表
List<EventCoefficientVO> eventCoefficients = eventTypes.stream()
.map(eventType -> buildEventCoefficientVO(eventType, nuclideTypes, groupedByEventType))
.collect(Collectors.toList());
resultVO.setEventCoefficients(eventCoefficients);
return resultVO;
}
/**
* 构建事件系数VO对象
*/
private EventCoefficientVO buildEventCoefficientVO(EventType eventType,
List<NuclideType> nuclideTypes,
Map<String, List<EventCoefficient>> groupedByEventType) {
EventCoefficientVO vo = new EventCoefficientVO();
vo.setEventName(eventType.getEventName());
List<EventCoefficient> valueByEventType = groupedByEventType.get(eventType.getEventName());
if (CollectionUtils.isEmpty(valueByEventType)) {
// 如果该事件类型没有系数数据则全部设为0
List<Double> zeroCoefficients = Collections.nCopies(nuclideTypes.size(), 0.0);
vo.setCoefficients(zeroCoefficients);
} else {
// 创建系数映射表提高查询效率
Map<String, Double> coefficientMap = valueByEventType.stream()
.collect(Collectors.toMap(
EventCoefficient::getNuclideName,
EventCoefficient::getNuclideCoefficient,
(v1, v2) -> v1
));
// 按照核素顺序构建系数列表
List<Double> coefficients = nuclideTypes.stream()
.map(nuclide -> coefficientMap.getOrDefault(nuclide.getNuclideName(), 0.0))
.collect(Collectors.toList());
vo.setCoefficients(coefficients);
}
return vo;
}
}

View File

@ -0,0 +1,16 @@
package org.jeecg.eventType.vo;
import lombok.Data;
import org.jeecg.modules.base.entity.EventCoefficient;
import java.util.List;
import java.util.Map;
@Data
public class EventCoefficientVO {
/** 事故名称 */
private String eventName;
/** 系数集合 */
private List<Double> coefficients;
}

View File

@ -0,0 +1,15 @@
package org.jeecg.eventType.vo;
import lombok.Data;
import java.util.List;
@Data
public class EventResultVO {
/** 核素名称集合 */
private List<String> nuclideNames;
/** 系数集合 */
List<EventCoefficientVO> eventCoefficients;
}

View File

@ -0,0 +1,84 @@
package org.jeecg.nuclideType.controller;
import javax.servlet.http.HttpServletRequest;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.system.query.QueryGenerator;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.modules.base.entity.NuclideType;
import org.jeecg.nuclideType.service.NuclideTypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.jeecg.common.aspect.annotation.AutoLog;
/**
* @Description: 核素模块
* @Author: jeecg-boot
* @Date: 2023-09-20
* @Version: V1.0
*/
@RestController
@RequestMapping("/nuclideType")
@Slf4j
public class NuclideController extends JeecgController<NuclideType, NuclideTypeService> {
@Autowired
private NuclideTypeService nuclideTypeService;
/**
* 分页列表查询
*
* @param nuclideType
* @param pageNo
* @param pageSize
* @param req
* @return
*/
//@AutoLog(value = "核素模块-分页列表查询")
@Operation(summary = "核素模块-分页列表查询")
@GetMapping(value = "/list")
public Result<IPage<NuclideType>> queryPageList(NuclideType nuclideType,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10000") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<NuclideType> queryWrapper = QueryGenerator.initQueryWrapper(nuclideType, req.getParameterMap());
Page<NuclideType> page = new Page<NuclideType>(pageNo, pageSize);
IPage<NuclideType> pageList = nuclideTypeService.page(page, queryWrapper);
return Result.OK(pageList);
}
/**
* 添加
*
* @param nuclideType
* @return
*/
@AutoLog(value = "核素模块-添加")
@Operation(summary = "核素模块-添加")
@PostMapping(value = "/add")
public Result<String> add(@RequestBody NuclideType nuclideType) {
nuclideTypeService.save(nuclideType);
return Result.OK("添加成功!");
}
/**
* 通过id删除
*
* @param id
* @return
*/
@AutoLog(value = "核素模块-通过id删除")
@Operation(summary = "核素模块-通过id删除")
@DeleteMapping(value = "/delete")
public Result<String> delete(@RequestParam(name="id",required=true) String id) {
nuclideTypeService.removeById(id);
return Result.OK("删除成功!");
}
}

View File

@ -0,0 +1,15 @@
package org.jeecg.nuclideType.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.base.entity.NuclideType;
/**
* @Description: 核素模块
* @Author: jeecg-boot
* @Date: 2023-09-20
* @Version: V1.0
*/
public interface NuclideTypeService extends IService<NuclideType> {
}

View File

@ -0,0 +1,19 @@
package org.jeecg.nuclideType.service.impl;
import org.jeecg.modules.base.entity.NuclideType;
import org.jeecg.modules.base.mapper.NuclideTypeMapper;
import org.jeecg.nuclideType.service.NuclideTypeService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
/**
* @Description: 核素模块
* @Author: jeecg-boot
* @Date: 2023-09-20
* @Version: V1.0
*/
@Service
public class NuclideTypeServiceImpl extends ServiceImpl<NuclideTypeMapper, NuclideType> implements NuclideTypeService {
}

View File

@ -7,6 +7,7 @@ public class RunProcessParamVO {
private String enginId;
private Integer weatherDataType;
private Integer sceneType;
private Integer eventType;
private String eventTime;
private Integer analogTime;

View File

@ -7,12 +7,17 @@ import org.jeecg.cmaq.service.CmaqService;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.engineering.service.EngineeringService;
import org.jeecg.modules.base.entity.DoseFactor;
import org.jeecg.modules.base.entity.Engineering;
import org.jeecg.runProcess.VO.RunProcessParamVO;
import org.jeecg.runProcess.service.RunProcessService;
import org.jeecg.wrf.service.WrfService;
import org.springframework.web.bind.annotation.*;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
@ -52,6 +57,7 @@ public class RunProcessController {
// return Result.error("程序正在运行中...");
// }
bizEngineering.setSceneType(sceneType);
bizEngineering.setEventType(paramVO.getEventType());
bizEngineering.setEnginStatus(2);
engineeringService.updateById(bizEngineering);
@ -64,5 +70,41 @@ public class RunProcessController {
return Result.OK("运行成功!");
}
/**
* 运行wrf所有程序
*
* @param
* @return
*/
@GetMapping(value = "/test")
public Result<?> test() {
List<DoseFactor> doseFactors = engineeringService.getDoseFactor();
try (BufferedWriter writer = new BufferedWriter(new FileWriter("D:\\hky_word\\Projectlibrary\\resultFile\\dose\\py\\doseFactor.txt"))) {
for (DoseFactor factor : doseFactors) {
if (factor != null) { // 安全检查避免 NullPointerException
// *** 关键修改点使用 \t 分割不控制格式 ***
writer.write(
valueOrEmpty(factor.getHalfLife()) + "\t" +
valueOrEmpty(factor.getCef()) + "\t" +
valueOrEmpty(factor.getSef()) + "\t" +
valueOrEmpty(factor.getRif())
);
writer.newLine(); // 写入换行符
}
}
System.out.println("文件DoseFactor已成功生成。");
} catch (IOException e) {
System.err.println("生成文件时出错: " + e.getMessage());
e.printStackTrace();
} catch (NullPointerException e) {
System.err.println("处理数据时出现空指针异常: " + e.getMessage());
e.printStackTrace();
}
return Result.OK("运行成功!");
}
private String valueOrEmpty(Double value) {
return (value != null) ? value.toString() : " ";
}
}

View File

@ -10,83 +10,83 @@ public class TestMain {
public static void main(String[] args) {
// String[] cmd_dep = {
// "python",
// "E:\\runtimeEnv\\fileSystem\\event\\python\\sum_dry_wet_to_nc.py",
// "ASIJ",
// "E:\\runtimeEnv\\fileSystem\\event\\admin\\002\\",
// "E:\\runtimeEnv\\fileSystem\\event\\admin\\002\\",
// "out_dep_20160701",
// "20160701",
// "20160702"
// };
// ProcessBuilder depBuilder = new ProcessBuilder(cmd_dep);
// ExecutePyUtils.executePythonProcess(depBuilder, "dep");
//
// String[] cmd_wrf = {
// "python",
// "E:\\runtimeEnv\\fileSystem\\event\\python\\merge_results_to_nc.py",
// "XLAT,XLONG,HGT,U,V,W",
// "E:\\runtimeEnv\\fileSystem\\event\\admin\\002\\",
// "E:\\runtimeEnv\\fileSystem\\event\\admin\\002\\",
// "out_wrf_20160701",
// "20160701",
// "20160702",
// "wrfout_d03_{YYYY-MM-DD}_00_00_00" // 使用占位符
// };
// ProcessBuilder wrfBuilder = new ProcessBuilder(cmd_wrf);
// ExecutePyUtils.executePythonProcess(wrfBuilder, "wrf");
//
// String[] cmd_cmaq = {
// "python",
// "E:\\runtimeEnv\\fileSystem\\event\\python\\merge_results_to_nc.py",
// "CO,ASIJ",
// "E:\\runtimeEnv\\fileSystem\\event\\admin\\002\\",
// "E:\\runtimeEnv\\fileSystem\\event\\admin\\002\\",
// "out_conc_20160701",
// "20160701",
// "20160702",
// "CCTM.CONC.d03.{YYYYMMDD}" // 使用占位符
// };
// ProcessBuilder concBuilder = new ProcessBuilder(cmd_cmaq);
// ExecutePyUtils.executePythonProcess(concBuilder, "conc");
//
// String[] cmd_metcr03d = {
// "python",
// "E:\\runtimeEnv\\fileSystem\\event\\python\\merge_results_to_nc.py",
// "TA,PRES",
// "E:\\runtimeEnv\\fileSystem\\event\\admin\\002\\",
// "E:\\runtimeEnv\\fileSystem\\event\\admin\\002\\",
// "out_metcr03d_20160701",
// "20160701",
// "20160702",
// "METCRO3D_d03_{YYYYMMDD}" // 使用占位符
// };
// ProcessBuilder metcr03dBuilder = new ProcessBuilder(cmd_metcr03d);
// ExecutePyUtils.executePythonProcess(metcr03dBuilder, "metcr03d");
//
// String[] cmd_emis = {
// "python",
// "E:\\runtimeEnv\\fileSystem\\event\\python\\merge_results_to_nc.py",
// "CO,PSI",
// "E:\\runtimeEnv\\fileSystem\\event\\admin\\002\\",
// "E:\\runtimeEnv\\fileSystem\\event\\admin\\002\\",
// "out_emis_20160701",
// "20160701",
// "20160702",
// "emis_{YYYYMMDD}" // 使用占位符
// };
// ProcessBuilder emisBuilder = new ProcessBuilder(cmd_emis);
// ExecutePyUtils.executePythonProcess(emisBuilder, "emis");
String[] cmd_dep = {
"python",
"D:\\hky_word\\Projectlibrary\\resultFile\\dose\\py\\sum_dry_wet_to_nc.py",
"ASIJ",
"D:\\hky_word\\Projectlibrary\\resultFile\\admin\\工程002",
"D:\\hky_word\\Projectlibrary\\resultFile\\dose\\工程002",
"out_dep_20160701",
"20160701",
"20160702"
};
ProcessBuilder depBuilder = new ProcessBuilder(cmd_dep);
ExecutePyUtils.executePythonProcess(depBuilder, "dep");
String[] cmd_wrf = {
"python",
"D:\\hky_word\\Projectlibrary\\resultFile\\dose\\py\\merge_results_to_nc.py",
"XLAT,XLONG,HGT,U,V,W",
"D:\\hky_word\\Projectlibrary\\resultFile\\admin\\工程002",
"D:\\hky_word\\Projectlibrary\\resultFile\\dose\\工程002",
"out_wrf_20160701",
"20160701",
"20160702",
"wrfout_d03_{YYYY-MM-DD}_00_00_00" // 使用占位符
};
ProcessBuilder wrfBuilder = new ProcessBuilder(cmd_wrf);
ExecutePyUtils.executePythonProcess(wrfBuilder, "wrf");
String[] cmd_cmaq = {
"python",
"D:\\hky_word\\Projectlibrary\\resultFile\\dose\\py\\merge_results_to_nc.py",
"CO,ASIJ",
"D:\\hky_word\\Projectlibrary\\resultFile\\admin\\工程002",
"D:\\hky_word\\Projectlibrary\\resultFile\\dose\\工程002",
"out_conc_20160701",
"20160701",
"20160702",
"CCTM.CONC.d03.{YYYYMMDD}" // 使用占位符
};
ProcessBuilder concBuilder = new ProcessBuilder(cmd_cmaq);
ExecutePyUtils.executePythonProcess(concBuilder, "conc");
String[] cmd_metcr03d = {
"python",
"D:\\hky_word\\Projectlibrary\\resultFile\\dose\\py\\merge_results_to_nc.py",
"TA,PRES",
"D:\\hky_word\\Projectlibrary\\resultFile\\admin\\工程002",
"D:\\hky_word\\Projectlibrary\\resultFile\\dose\\工程002",
"out_metcr03d_20160701",
"20160701",
"20160702",
"METCRO3D_d03_{YYYYMMDD}" // 使用占位符
};
ProcessBuilder metcr03dBuilder = new ProcessBuilder(cmd_metcr03d);
ExecutePyUtils.executePythonProcess(metcr03dBuilder, "metcr03d");
String[] cmd_emis = {
"python",
"D:\\hky_word\\Projectlibrary\\resultFile\\dose\\py\\merge_results_to_nc.py",
"CO,PSI",
"D:\\hky_word\\Projectlibrary\\resultFile\\admin\\工程002",
"D:\\hky_word\\Projectlibrary\\resultFile\\dose\\工程002",
"out_emis_20160701",
"20160701",
"20160702",
"emis_{YYYYMMDD}" // 使用占位符
};
ProcessBuilder emisBuilder = new ProcessBuilder(cmd_emis);
ExecutePyUtils.executePythonProcess(emisBuilder, "emis");
String[] cmd_dose = {
"python",
"E:\\runtimeEnv\\fileSystem\\event\\python\\convert_conc_to_dose.py",
"D:\\hky_word\\Projectlibrary\\resultFile\\dose\\py\\convert_conc_to_dose.py",
"20160701",
"20160702",
"E:\\runtimeEnv\\fileSystem\\event\\admin\\002\\",
"E:\\runtimeEnv\\fileSystem\\event\\admin\\002\\",
"E:\\runtimeEnv\\fileSystem\\event\\python\\data_48.xlsx",
"D:\\hky_word\\Projectlibrary\\resultFile\\dose\\工程002",
"D:\\hky_word\\Projectlibrary\\resultFile\\dose\\工程002",
"D:\\hky_word\\Projectlibrary\\resultFile\\dose\\data_48.xlsx",
"out_dep_20160701",
"out_wrf_20160701",
"out_conc_20160701",

View File

@ -86,7 +86,7 @@ public class RunProcessServiceImpl implements RunProcessService {
workDirPath + EventConstants.EMIS_DIR, resultFilePath,
EventConstants.EMIS_OUT_PREFIX, EventConstants.EMIS_PATTERN, "合并EMIS结果数据");
exeDosePy(sDate, eDate, resultFilePath, resultFilePath, scriptsPath,"合并EMIS结果数据");
exeDosePy(sDate, eDate, resultFilePath, resultFilePath, scriptsPath,"执行剂量转换");
}catch (Exception e){
e.printStackTrace();

View File

@ -233,6 +233,6 @@ public class DownloadT1hJob {
* 获取基准时间
*/
private String getBaseTime() {
return LocalDateTime.now().format(DATE_FORMATTER) + "00";
return LocalDateTime.now().minusDays(1).format(DATE_FORMATTER) + "00";
}
}