diff --git a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java index 44a1929..4535cba 100644 --- a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java +++ b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.util.http.HttpUtils; import cn.iocoder.yudao.framework.excel.core.handler.SelectSheetWriteHandler; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.converters.longconverter.LongStringConverter; +import com.alibaba.excel.support.ExcelTypeEnum; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.multipart.MultipartFile; @@ -54,4 +55,45 @@ public class ExcelUtils { .doReadAllSync(); } + + /** + * 将列表以 CSV 响应给前端 + * + * @param response 响应 + * @param filename 文件名 + * @param sheetName Excel sheet 名 + * @param head Excel head 头 + * @param data 数据列表哦 + * @param 泛型,保证 head 和 data 类型的一致性 + * @throws IOException 写入失败的情况 + */ + public static void writeCSV(HttpServletResponse response, String filename, String sheetName, + Class head, List data) throws IOException { + response.setHeader("Content-Disposition", "attachment;filename=" + HttpUtils.encodeUtf8(filename)); +// response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + response.setContentType("application/vnd.opencmlformats-officedocument.spreadsheetml.sheet"); + // 输出 Excel + EasyExcel.write(response.getOutputStream(), head) + .excelType(ExcelTypeEnum.CSV) + .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理 + .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度 + .registerWriteHandler(new SelectSheetWriteHandler(head)) // 基于固定 sheet 实现下拉框 + .registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度 + .sheet(sheetName).doWrite(data); + + // 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了 + response.setHeader("Content-Disposition", "attachment;filename=" + HttpUtils.encodeUtf8(filename)); +// response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + response.setContentType("application/vnd.opencmlformats-officedocument.spreadsheetml.sheet"); + + } + + + public static List readCSV(MultipartFile file, Class head) throws IOException { + return EasyExcel.read(file.getInputStream(), head, null) + .excelType(ExcelTypeEnum.CSV) + .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理 + .doReadAllSync(); + } + } diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/pom.xml b/yudao-framework/yudao-spring-boot-starter-mybatis/pom.xml index 5a619c5..3505473 100644 --- a/yudao-framework/yudao-spring-boot-starter-mybatis/pom.xml +++ b/yudao-framework/yudao-spring-boot-starter-mybatis/pom.xml @@ -46,8 +46,15 @@ com.microsoft.sqlserver mssql-jdbc + 11.2.0.jre11 + true + + com.microsoft.sqlserver + sqljdbc4 + 4.0 + com.dameng DmJdbcDriver18 diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/device/DeviceController.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/device/DeviceController.java new file mode 100644 index 0000000..9688b49 --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/device/DeviceController.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.module.alert.controller.admin.device; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.alert.controller.admin.calcgroup.vo.CalcGroupPageReqVO; +import cn.iocoder.yudao.module.alert.controller.admin.calcgroup.vo.CalcGroupRespVO; +import cn.iocoder.yudao.module.alert.controller.admin.device.vo.DeviceRespVO; +import cn.iocoder.yudao.module.alert.dal.dataobject.calcgroup.CalcGroupDO; +import cn.iocoder.yudao.module.alert.dal.dataobject.device.DeviceDO; +import cn.iocoder.yudao.module.alert.service.calcgroup.CalcGroupService; +import cn.iocoder.yudao.module.alert.service.device.DeviceService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Comparator; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Tag(name = "设备 - 设备首页") +@RestController +@RequestMapping("/device") +@Validated +public class DeviceController { + @Resource + private DeviceService deviceService; + + @GetMapping("/info") + @Operation(summary = "获取页面属性", description = "用于构造前端页面") + public CommonResult getdeviceInfo(Long id) { + DeviceDO list = deviceService.getDeviceInfo(id); + return success(BeanUtils.toBean(list, DeviceRespVO.class)); + } +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/device/vo/DeviceRespVO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/device/vo/DeviceRespVO.java new file mode 100644 index 0000000..1703f26 --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/device/vo/DeviceRespVO.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.module.alert.controller.admin.device.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "设备 - 设备首页") +@Data +@ExcelIgnoreUnannotated +public class DeviceRespVO { + @JsonProperty("ID") + + @Schema(description = "id", example = "id") + private Long id; + + @JsonProperty("Unit_ID") + @Schema(description = "机组id", example = "id") + + private Long unitId; + + @JsonProperty("System_ID") + + @Schema(description = "系统id", example = "id") + + private Long systemId; + + @JsonProperty("Name") + + @Schema(description = "页面名称", example = "yudao") + private String name; + + @JsonProperty("Page_Content") + + @Schema(description = "页面信息", example = "yudao") + private String pageContent; +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/exa/EXAController.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/exa/EXAController.java index 56e98e3..e91b1d0 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/exa/EXAController.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/exa/EXAController.java @@ -105,8 +105,13 @@ public class EXAController { Point.builder().ItemName("gbqegj").GroupName("test").ItemType(5).Descriptor("fqnewfej") .EngUnits("ge").Source("批量录入").AutoSave(true).build() ); - // 输出 - ExcelUtils.write(response, "用户导入模板.xls", "测点列表", Point.class, list); + + + // 输出excel +// ExcelUtils.write(response, "用户导入模板.xls", "测点列表", Point.class, list); + //输出csv + ExcelUtils.writeCSV(response, "用户导入模板.csv", "测点列表", Point.class, list); + } @PostMapping("/import") @@ -119,7 +124,7 @@ public class EXAController { public CommonResult importExcel(@RequestParam("file") MultipartFile file, @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { System.out.println(file); - List list = ExcelUtils.read(file, Point.class); + List list = ExcelUtils.readCSV(file, Point.class); return success(exaService.importPointList(list, updateSupport)); } diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/InstantCalcController.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/InstantCalcController.java new file mode 100644 index 0000000..c4e2f5c --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/InstantCalcController.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.module.alert.controller.admin.instant; + +import cn.iocoder.yudao.module.alert.service.instant.InstantService; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Tag(name = "运行中心 - 模型实例-回算") +@RestController +@RequestMapping("/alert/instant/calc") +@Validated +public class InstantCalcController { + @Resource + private InstantService instantService; + + + + +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/vo/InstantPageReqVO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/vo/InstantPageReqVO.java index 640eea7..7098d13 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/vo/InstantPageReqVO.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/vo/InstantPageReqVO.java @@ -10,8 +10,13 @@ import lombok.EqualsAndHashCode; @EqualsAndHashCode(callSuper = true) public class InstantPageReqVO extends PageParam { + @Schema(description = "机组id", example = "id") - private Integer unitId; + private Integer unit; + @Schema(description = "系统id", example = "id") + private Integer type; + @Schema(description = "子系统id", example = "id") + private Integer system; @Schema(description = "系统id", example = "yudao") private Integer modelId; diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/dataobject/device/DeviceDO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/dataobject/device/DeviceDO.java new file mode 100644 index 0000000..b324e70 --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/dataobject/device/DeviceDO.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.module.alert.dal.dataobject.device; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonAlias; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@DS("slave") +@TableName(value = "Page_Display", autoResultMap = true) +@KeySequence("system_role_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = false) +public class DeviceDO { + @TableId("ID") + + @Schema(description = "id", example = "id") + private Long id; + + @TableField("Unit_ID") + @Schema(description = "机组id", example = "id") + + private Long unitId; + + @TableField("System_ID") + + @Schema(description = "系统id", example = "id") + + private Long systemId; + + @TableField("Name") + + @Schema(description = "页面名称", example = "yudao") + private String name; + + @TableField("Page_Content") + + @Schema(description = "页面信息", example = "yudao") + private String pageContent; + +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/mysql/device/DeviceMapper.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/mysql/device/DeviceMapper.java new file mode 100644 index 0000000..67fa2ec --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/mysql/device/DeviceMapper.java @@ -0,0 +1,10 @@ +package cn.iocoder.yudao.module.alert.dal.mysql.device; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.alert.dal.dataobject.device.DeviceDO; +import cn.iocoder.yudao.module.alert.dal.dataobject.instant.InstantTableDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DeviceMapper extends BaseMapperX { +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/mysql/instant/InstantMapper.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/mysql/instant/InstantMapper.java index 49d83d1..1453fd2 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/mysql/instant/InstantMapper.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/mysql/instant/InstantMapper.java @@ -17,6 +17,9 @@ public interface InstantMapper extends BaseMapperX { .eqIfPresent(InstantDO::getIsUpdate,reqVO.getIsUpdate()) .eqIfPresent(InstantDO::getRunning,reqVO.getRunning()) .eqIfPresent(InstantDO::getRunningLog,reqVO.getRunningLog()) + .eqIfPresent(InstantDO::getUnitId,reqVO.getUnit()) + .eqIfPresent(InstantDO::getSystemTypeId,reqVO.getType()) + .eqIfPresent(InstantDO::getSystemId,reqVO.getSystem()) .orderByAsc(InstantDO::getId)); } diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/device/DeviceService.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/device/DeviceService.java new file mode 100644 index 0000000..a6d57b1 --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/device/DeviceService.java @@ -0,0 +1,16 @@ +package cn.iocoder.yudao.module.alert.service.device; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.alert.controller.admin.instant.vo.*; +import cn.iocoder.yudao.module.alert.dal.dataobject.device.DeviceDO; +import cn.iocoder.yudao.module.alert.dal.dataobject.instant.InstantDO; +import jakarta.validation.Valid; + +import java.io.IOException; +import java.util.List; + +public interface DeviceService { + DeviceDO getDeviceInfo(Long id); + + +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/device/DeviceServiceImpl.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/device/DeviceServiceImpl.java new file mode 100644 index 0000000..a3c8883 --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/device/DeviceServiceImpl.java @@ -0,0 +1,52 @@ +package cn.iocoder.yudao.module.alert.service.device; + +import cn.hutool.core.util.ObjUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.json.JsonUtils; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.alert.controller.admin.exa.vo.Point; +import cn.iocoder.yudao.module.alert.controller.admin.instant.vo.*; +import cn.iocoder.yudao.module.alert.controller.admin.model.vo.RunModelInfoVO; +import cn.iocoder.yudao.module.alert.dal.dataobject.device.DeviceDO; +import cn.iocoder.yudao.module.alert.dal.dataobject.instant.InstantDO; +import cn.iocoder.yudao.module.alert.dal.dataobject.instant.InstantTableDO; +import cn.iocoder.yudao.module.alert.dal.mysql.device.DeviceMapper; +import cn.iocoder.yudao.module.alert.dal.mysql.instant.InstantMapper; +import cn.iocoder.yudao.module.alert.dal.mysql.instant.InstantTableMapper; +import cn.iocoder.yudao.module.alert.utils.EXAUtils; +import cn.iocoder.yudao.module.system.dal.redis.RedisKeyConstants; +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.dynamic.datasource.annotation.Slave; +import com.google.common.annotations.VisibleForTesting; +import com.mzt.logapi.context.LogRecordContext; +import com.mzt.logapi.service.impl.DiffParseFunction; +import com.mzt.logapi.starter.annotation.LogRecord; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.INSTANT_NOT_EXISTS; +import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.*; + +@Slave +@Service +@Slf4j +public class DeviceServiceImpl implements DeviceService { + @Resource + private DeviceMapper deviceMapper; + @Override + public DeviceDO getDeviceInfo(Long id) { + return deviceMapper.selectById(id); + } + +} diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml index 3680358..ae5cf1f 100644 --- a/yudao-server/src/main/resources/application-local.yaml +++ b/yudao-server/src/main/resources/application-local.yaml @@ -40,7 +40,7 @@ spring: time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒 min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒 max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒 - validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效 + validation-query: SELECT 1 # 配置检测连接是否有效 test-while-idle: true test-on-borrow: false test-on-return: false @@ -64,10 +64,12 @@ spring: # username: root # OpenGauss 连接的示例 # password: Yudao@2024 # OpenGauss 连接的示例 slave: # 模拟从库,可根据自己需要修改 - lazy: true # 开启懒加载,保证启动速度 - url: jdbc:mysql://120.26.116.243:3306/alert?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true - username: root - password: 123456 +# lazy: true # 开启懒加载,保证启动速度 +# url: jdbc:mysql://120.26.116.243:3306/alert?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true + url: jdbc:sqlserver://47.98.32.148:1433;DatabaseName=alert # SQLServer 连接的示例 + driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + username: sa + password: powerSIS#123 # tdengine: # IoT 数据库(需要 IoT 物联网再开启噢!) # url: jdbc:TAOS-RS://127.0.0.1:6041/ruoyi_vue_pro # driver-class-name: com.taosdata.jdbc.rs.RestfulDriver @@ -271,7 +273,7 @@ pf4j: # pluginsDir: /tmp/ pluginsDir: ../plugins EXA: - ip: 120.26.116.243 + ip: 120.27.236.75 point: head: XN. algorithm: