diff --git a/business-css/pom.xml b/business-css/pom.xml index 8763eea..925ee02 100644 --- a/business-css/pom.xml +++ b/business-css/pom.xml @@ -23,7 +23,7 @@ UTF-8 - + org.springframework.boot @@ -66,18 +66,6 @@ plain - - - org.apache.poi - poi - 4.1.2 - - - org.apache.poi - poi-ooxml - 4.1.2 - - @@ -101,6 +89,29 @@ org.springframework.boot spring-boot-maven-plugin + + org.apache.maven.plugins + maven-enforcer-plugin + 3.4.1 + + + enforce-java + + enforce + + + + + [17,) + + + [3.6.3,) + + + + + + org.apache.maven.plugins maven-compiler-plugin diff --git a/business-css/src/main/java/com/yfd/business/css/config/OpenApiConfig.java b/business-css/src/main/java/com/yfd/business/css/config/OpenApiConfig.java new file mode 100644 index 0000000..aee2814 --- /dev/null +++ b/business-css/src/main/java/com/yfd/business/css/config/OpenApiConfig.java @@ -0,0 +1,28 @@ +package com.yfd.business.css.config; + +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import org.springdoc.core.models.GroupedOpenApi; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class OpenApiConfig { + + @Bean + public OpenAPI businessCssOpenAPI() { + return new OpenAPI() + .info(new Info() + .title("Business CSS API") + .description("临界事故情景分析业务接口") + .version("v1")); + } + + @Bean + public GroupedOpenApi businessCssGroup() { + return GroupedOpenApi.builder() + .group("business-css") + .packagesToScan("com.yfd.business.css.controller") + .build(); + } +} diff --git a/business-css/src/main/java/com/yfd/business/css/controller/AlgorithmController.java b/business-css/src/main/java/com/yfd/business/css/controller/AlgorithmController.java index 83f48c1..0c05ddc 100644 --- a/business-css/src/main/java/com/yfd/business/css/controller/AlgorithmController.java +++ b/business-css/src/main/java/com/yfd/business/css/controller/AlgorithmController.java @@ -16,17 +16,7 @@ public class AlgorithmController { @Autowired private AlgorithmService algorithmService; - @GetMapping - public List getAllAlgorithms() { - return algorithmService.list(); - } - - @GetMapping("/page") - public Page getAlgorithmsPage(@RequestParam(defaultValue = "1") int current, - @RequestParam(defaultValue = "10") int size) { - return algorithmService.page(new Page<>(current, size)); - } - + @GetMapping("/{id}") public Algorithm getAlgorithmById(@PathVariable String id) { return algorithmService.getById(id); @@ -48,12 +38,29 @@ public class AlgorithmController { return algorithmService.removeById(id); } - @GetMapping("/search") - public List searchAlgorithms(@RequestParam String keyword) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.like("name", keyword) - .or() - .like("description", keyword); - return algorithmService.list(queryWrapper); + @DeleteMapping + public boolean deleteAlgorithms(@RequestBody List ids) { + return algorithmService.removeByIds(ids); } -} \ No newline at end of file + + /** + * 根据算法名称搜索并分页返回 + * 输入参数:查询参数 name(算法名称关键词,可为空),pageNum(页码,默认1),pageSize(每页条数,默认10) + * 输出参数:算法分页列表 + * @param name 算法名称关键词(可为空) + * @param pageNum 页码 + * @param pageSize 每页条数 + * @return 算法分页列表 + */ + @GetMapping("/search") + public Page searchAlgorithms(@RequestParam(required = false) String name, + @RequestParam(defaultValue = "1") long pageNum, + @RequestParam(defaultValue = "10") long pageSize) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (name != null && !name.isEmpty()) { + queryWrapper.like("name", name); + } + Page page = new Page<>(pageNum, pageSize); + return algorithmService.page(page, queryWrapper); + } +} diff --git a/business-css/src/main/java/com/yfd/business/css/controller/CriticalDataController.java b/business-css/src/main/java/com/yfd/business/css/controller/CriticalDataController.java index d3c39c4..14b3695 100644 --- a/business-css/src/main/java/com/yfd/business/css/controller/CriticalDataController.java +++ b/business-css/src/main/java/com/yfd/business/css/controller/CriticalDataController.java @@ -1,6 +1,7 @@ package com.yfd.business.css.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.business.css.domain.CriticalData; import com.yfd.business.css.service.CriticalDataService; import org.springframework.web.bind.annotation.*; @@ -81,15 +82,21 @@ public class CriticalDataController { /** - * 6. 根据设备类型获取临界数据列表 - * 输入参数:查询参数 deviceType(设备类型) - * 输出参数:临界数据列表(按创建时间倒序) + * 6. 根据设备类型获取临界数据分页列表 + * 输入参数:查询参数 deviceType(设备类型),pageNum(页码,默认1),pageSize(每页条数,默认10) + * 输出参数:临界数据分页列表(按创建时间倒序) * @param deviceType 设备类型 - * @return 临界数据列表 + * @param pageNum 页码 + * @param pageSize 每页条数 + * @return 临界数据分页列表 */ @GetMapping("/by-device-type") - public List listByDeviceType(@RequestParam String deviceType) { - return criticalDataService.list( + public Page listByDeviceType(@RequestParam String deviceType, + @RequestParam(defaultValue = "1") long pageNum, + @RequestParam(defaultValue = "10") long pageSize) { + Page page = new Page<>(pageNum, pageSize); + return criticalDataService.page( + page, new QueryWrapper() .eq("device_type", deviceType) .orderByDesc("created_at") diff --git a/business-css/src/main/java/com/yfd/business/css/controller/DeviceController.java b/business-css/src/main/java/com/yfd/business/css/controller/DeviceController.java index 5c28783..0381e34 100644 --- a/business-css/src/main/java/com/yfd/business/css/controller/DeviceController.java +++ b/business-css/src/main/java/com/yfd/business/css/controller/DeviceController.java @@ -1,6 +1,7 @@ package com.yfd.business.css.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.business.css.domain.Device; import com.yfd.business.css.service.DeviceService; import org.springframework.web.bind.annotation.*; @@ -96,34 +97,24 @@ public class DeviceController { } - /** - * 6. 根据设备类型获取设备列表 - * 输入参数:查询参数 type(设备类型) - * 输出参数:设备列表(按创建时间倒序) - * @param type 设备类型 - * @return 设备列表 - */ - @GetMapping("/by-type") - public List listByType(@RequestParam String type) { - return deviceService.list( - new QueryWrapper() - .eq("type", type) - .orderByDesc("created_at") - ); - } + /** - * 7. 设备查询(类型 + 名称) - * 输入参数:查询参数 type(可选),name(可选) - * 输出参数:设备列表(按创建时间倒序) + * 6. 设备分页查询(类型 可选 + 名称 可选) + * 输入参数:查询参数 type(可选),name(可选),pageNum(页码,默认1),pageSize(每页条数,默认10) + * 输出参数:设备分页列表(按创建时间倒序) * @param type 设备类型(可选) * @param name 设备名称关键词(可选) - * @return 设备列表 + * @param pageNum 页码 + * @param pageSize 每页条数 + * @return 设备分页列表 */ @GetMapping("/search") - public List search(@RequestParam(required = false) String type, - @RequestParam(required = false) String name) { - + public Page search(@RequestParam(required = false) String type, + @RequestParam(required = false) String name, + @RequestParam(defaultValue = "1") long pageNum, + @RequestParam(defaultValue = "20") long pageSize) { + Page page = new Page<>(pageNum, pageSize); QueryWrapper wrapper = new QueryWrapper<>(); if (type != null && !type.isEmpty()) { @@ -133,6 +124,6 @@ public class DeviceController { wrapper.like("name", name); } - return deviceService.list(wrapper.orderByDesc("created_at")); + return deviceService.page(page, wrapper.orderByDesc("created_at")); } } diff --git a/business-css/src/main/java/com/yfd/business/css/controller/EventController.java b/business-css/src/main/java/com/yfd/business/css/controller/EventController.java index 8b6e990..46c0849 100644 --- a/business-css/src/main/java/com/yfd/business/css/controller/EventController.java +++ b/business-css/src/main/java/com/yfd/business/css/controller/EventController.java @@ -33,6 +33,32 @@ public class EventController { )); } + /** + * 修改始发事件 + * 输入参数:路径参数 eventId(事件ID),请求体中的事件对象 + * 输出参数:标准响应结构,包含修改后的事件对象 + * @param eventId 事件ID + * @param event 事件对象 + * @return 修改结果 + */ + @PutMapping("/{eventId}") + public ResponseEntity> updateEvent(@PathVariable String eventId, + @RequestBody Event event) { + event.setEventId(eventId); + boolean ok = eventService.updateById(event); + if (!ok) { + return ResponseEntity.badRequest().body(Map.of( + "code", 1, + "msg", "修改失败" + )); + } + return ResponseEntity.ok(Map.of( + "code", 0, + "msg", "修改成功", + "data", event + )); + } + /** * 修改 Event 的 attr_changes */ diff --git a/business-css/src/main/java/com/yfd/business/css/controller/MaterialController.java b/business-css/src/main/java/com/yfd/business/css/controller/MaterialController.java index f8fc9ff..f3a0c54 100644 --- a/business-css/src/main/java/com/yfd/business/css/controller/MaterialController.java +++ b/business-css/src/main/java/com/yfd/business/css/controller/MaterialController.java @@ -1,6 +1,7 @@ package com.yfd.business.css.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.business.css.domain.Material; import com.yfd.business.css.service.MaterialService; import org.springframework.web.bind.annotation.*; @@ -79,18 +80,23 @@ public class MaterialController { } /** - * 5. 根据物料名称搜索 - * 输入参数:查询参数 name(物料名称关键词) - * 输出参数:物料列表(按创建时间倒序) - * @param name 物料名称关键词 - * @return 物料列表 + * 5. 根据物料名称搜索(可为空)并分页返回 + * 输入参数:查询参数 name(物料名称关键词,可为空),pageNum(页码,默认1),pageSize(每页条数,默认10) + * 输出参数:物料分页列表(按创建时间倒序) + * @param name 物料名称关键词(可为空) + * @param pageNum 页码 + * @param pageSize 每页条数 + * @return 物料分页列表 */ @GetMapping("/search") - public List search(@RequestParam String name) { - return materialService.list( - new QueryWrapper() - .like("name", name) - .orderByDesc("created_at") - ); + public Page search(@RequestParam(required = false) String name, + @RequestParam(defaultValue = "1") long pageNum, + @RequestParam(defaultValue = "10") long pageSize) { + QueryWrapper wrapper = new QueryWrapper<>(); + if (name != null && !name.isEmpty()) { + wrapper.like("name", name); + } + Page page = new Page<>(pageNum, pageSize); + return materialService.page(page, wrapper.orderByDesc("created_at")); } } diff --git a/business-css/src/main/java/com/yfd/business/css/controller/ProjectController.java b/business-css/src/main/java/com/yfd/business/css/controller/ProjectController.java index 324b5d1..1671f79 100644 --- a/business-css/src/main/java/com/yfd/business/css/controller/ProjectController.java +++ b/business-css/src/main/java/com/yfd/business/css/controller/ProjectController.java @@ -1,6 +1,7 @@ package com.yfd.business.css.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.business.css.domain.Project; import com.yfd.business.css.service.ProjectService; import org.springframework.http.HttpHeaders; @@ -11,6 +12,12 @@ import org.springframework.web.bind.annotation.*; import jakarta.annotation.Resource; import java.util.List; import java.util.Map; +import java.io.ByteArrayOutputStream; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import java.time.format.DateTimeFormatter; @RestController @RequestMapping("/projects") @@ -67,63 +74,65 @@ public class ProjectController { return projectService.removeByIds(ids); } + /** - * 4. 导出所有项目 + * 4.1 导出所有项目(Excel) * 输入参数:无 - * 导出描述:返回所有项目的 JSON 数组,作为附件 `projects.json` - * 输出参数:附件字节流(application/octet-stream) - * @return 附件响应,文件名为 projects.json + * 导出描述:返回所有项目的 Excel 附件 `projects.xlsx` + * 导出列:project_id, code, name, description, created_at, updated_at + * @return 附件响应,文件名为 projects.xlsx */ - @GetMapping("/export/all") - public ResponseEntity exportAll() { - byte[] data = projectService.exportAllProjects(); - + @GetMapping("/exportAllExports") + public ResponseEntity exportAllExports() { + byte[] bytes = projectService.exportAllProjectsExcel(); return ResponseEntity.ok() - .header(HttpHeaders.CONTENT_DISPOSITION, - "attachment; filename=projects.json") + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=projects.xlsx") .contentType(MediaType.APPLICATION_OCTET_STREAM) - .body(data); + .body(bytes); } /** - * 5. 导出项目工程 + * 5.1 导出项目工程(Excel 多 Sheet) * 输入参数:路径参数项目ID - * 导出描述:返回 ZIP 附件 `project_{id}.zip`,包含以下 JSON 文件: - * - project.json:项目对象 - * - devices.json:设备列表 - * - materials.json:物料列表 - * - scenarios.json:情景列表 - * - events.json:事件列表 - * - scenario-results.json:情景结果列表 + * 导出描述:返回 Excel 附件 `project_{id}.xlsx`,包含以下 Sheet: + * - projects(项目)- project_id, code, name, description, created_at, updated_at + * - devices(设备)- device_id, project_id, code, type, name, size, volume, flow_rate, pulse_velocity, created_at, updated_at + * - materials(物料)- material_id, project_id, name, u_concentration, uo2_density, u_enrichment, pu_concentration, puo2_density, pu_isotope, hno3_acidity, h2c2o4_concentration, organic_ratio, moisture_content, custom_attrs, created_at, updated_at + * - scenarios(情景)- scenario_id, project_id, name, description, created_at, updated_at + * - events(事件)- event_id, scenario_id, device_id, material_id, trigger_time, attr_changes, created_at + * - scenario_results(情景结果)- scenario_id, device_id, step, keff_value, attr_state * 输出参数:附件字节流(application/octet-stream) * @param id 项目ID - * @return 附件响应,文件名为 project_{id}.zip + * @return 附件响应,文件名为 project_{id}.xlsx */ - @GetMapping("/{id}/export") - public ResponseEntity exportProject(@PathVariable String id) { - byte[] data = projectService.exportProjectEngineering(id); - + @GetMapping("/{id}/exportProject") + public ResponseEntity exportProjectExcel(@PathVariable String id) { + byte[] bytes = projectService.exportProjectEngineeringExcel(id); return ResponseEntity.ok() - .header(HttpHeaders.CONTENT_DISPOSITION, - "attachment; filename=project_" + id + ".zip") + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=project_" + id + ".xlsx") .contentType(MediaType.APPLICATION_OCTET_STREAM) - .body(data); + .body(bytes); } /** - * 6. 根据项目名称搜索 - * 输入参数:查询参数 name(项目名称关键词) - * 输出参数:项目列表 - * @param name 项目名称关键词 - * @return 匹配的项目列表 + * 6. 根据项目名称搜索(可为空)并分页返回 + * 输入参数:查询参数 name(项目名称关键词,可为空),pageNum(页码,默认1),pageSize(每页条数,默认10) + * 输出参数:项目分页列表(按创建时间倒序) + * @param name 项目名称关键词(可为空) + * @param pageNum 页码 + * @param pageSize 每页条数 + * @return 项目分页列表 */ @GetMapping("/search") - public List searchByName(@RequestParam String name) { - return projectService.list( - new QueryWrapper() - .like("name", name) - .orderByDesc("created_at") - ); + public Page search(@RequestParam(required = false) String name, + @RequestParam(defaultValue = "1") long pageNum, + @RequestParam(defaultValue = "10") long pageSize) { + QueryWrapper wrapper = new QueryWrapper<>(); + if (name != null && !name.isEmpty()) { + wrapper.like("name", name); + } + Page page = new Page<>(pageNum, pageSize); + return projectService.page(page, wrapper.orderByDesc("created_at")); } /** diff --git a/business-css/src/main/java/com/yfd/business/css/controller/ScenarioController.java b/business-css/src/main/java/com/yfd/business/css/controller/ScenarioController.java index a1b08e1..b3d7589 100644 --- a/business-css/src/main/java/com/yfd/business/css/controller/ScenarioController.java +++ b/business-css/src/main/java/com/yfd/business/css/controller/ScenarioController.java @@ -1,6 +1,7 @@ package com.yfd.business.css.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.business.css.domain.Scenario; import com.yfd.business.css.service.ScenarioService; import org.springframework.web.bind.annotation.*; @@ -63,21 +64,7 @@ public class ScenarioController { return scenarioService.removeByIds(ids); } - /** - * 4. 根据情景名称搜索 - * 输入参数:查询参数 name(情景名称关键词) - * 输出参数:情景列表(按创建时间倒序) - * @param name 情景名称关键词 - * @return 情景列表 - */ - @GetMapping("/search") - public List searchByName(@RequestParam String name) { - return scenarioService.list( - new QueryWrapper() - .like("name", name) - .orderByDesc("created_at") - ); - } + /** * 5. 根据情景ID获取情景记录 @@ -92,18 +79,25 @@ public class ScenarioController { } /** - * 6. 根据项目ID查询情景列表 - * 输入参数:查询参数 projectId(项目ID) - * 输出参数:情景列表(按创建时间倒序) + * 6. 根据项目ID与情景名称查询情景列表(分页) + * 输入参数:projectId(项目ID),name(情景名称关键词,可为空),pageNum(默认1),pageSize(默认20) + * 输出参数:情景分页列表(按创建时间倒序) * @param projectId 项目ID - * @return 情景列表 + * @param name 情景名称关键词(可为空) + * @param pageNum 页码 + * @param pageSize 每页条数 + * @return 情景分页列表 */ @GetMapping("/by-project") - public List listByProject(@RequestParam String projectId) { - return scenarioService.list( - new QueryWrapper() - .eq("project_id", projectId) - .orderByDesc("created_at") - ); + public Page listByProject(@RequestParam String projectId, + @RequestParam(required = false) String name, + @RequestParam(defaultValue = "1") long pageNum, + @RequestParam(defaultValue = "20") long pageSize) { + Page page = new Page<>(pageNum, pageSize); + QueryWrapper wrapper = new QueryWrapper().eq("project_id", projectId); + if (name != null && !name.isEmpty()) { + wrapper.like("name", name); + } + return scenarioService.page(page, wrapper.orderByDesc("created_at")); } } diff --git a/business-css/src/main/java/com/yfd/business/css/controller/ScenarioResultController.java b/business-css/src/main/java/com/yfd/business/css/controller/ScenarioResultController.java index 0548466..626994a 100644 --- a/business-css/src/main/java/com/yfd/business/css/controller/ScenarioResultController.java +++ b/business-css/src/main/java/com/yfd/business/css/controller/ScenarioResultController.java @@ -6,8 +6,16 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import java.util.List; import java.util.Map; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import jakarta.servlet.http.HttpServletResponse; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; @RestController @RequestMapping("/scenario-results") @@ -34,21 +42,65 @@ public class ScenarioResultController { } /** - * 根据情景ID与设备ID获取情景结果列表 - * 输入参数:查询参数 scenarioId(情景ID)、deviceId(设备ID) - * 输出参数:情景结果列表(按时间点 step 排序) + * 根据情景ID与设备ID获取情景结果分页列表 + * 输入参数:查询参数 scenarioId(情景ID)、deviceId(设备ID),pageNum(页码,默认1),pageSize(每页条数,默认10) + * 输出参数:情景结果分页列表(按时间点 step 排序) * @param scenarioId 情景ID * @param deviceId 设备ID - * @return 情景结果列表 + * @param pageNum 页码 + * @param pageSize 每页条数 + * @return 情景结果分页列表 */ @GetMapping("/by-scenario") - public List listByScenario(@RequestParam String scenarioId, - @RequestParam String deviceId) { - return scenarioResultService.list( + public Page listByScenario(@RequestParam String scenarioId, + @RequestParam String deviceId, + @RequestParam(defaultValue = "1") long pageNum, + @RequestParam(defaultValue = "10") long pageSize) { + Page page = new Page<>(pageNum, pageSize); + return scenarioResultService.page( + page, new QueryWrapper() .eq("scenario_id", scenarioId) .eq("device_id", deviceId) .orderByAsc("step") ); } + + /** + * 导出情景结果到 Excel + * 输入参数:查询参数 scenarioId(情景ID)、deviceId(设备ID) + * 输出参数:Excel 文件(包含 step、device_id、keff_value、attr_state 列) + */ + @GetMapping("/export") + public void exportScenarioResults(@RequestParam String scenarioId, + @RequestParam String deviceId, + HttpServletResponse response) throws Exception { + List results = scenarioResultService.list( + new QueryWrapper() + .eq("scenario_id", scenarioId) + .eq("device_id", deviceId) + .orderByAsc("step") + ); + Workbook workbook = new XSSFWorkbook(); + Sheet sheet = workbook.createSheet("ScenarioResults"); + Row header = sheet.createRow(0); + header.createCell(0).setCellValue("step"); + header.createCell(1).setCellValue("device_id"); + header.createCell(2).setCellValue("keff_value"); + header.createCell(3).setCellValue("attr_state"); + for (int i = 0; i < results.size(); i++) { + ScenarioResult r = results.get(i); + Row row = sheet.createRow(i + 1); + row.createCell(0).setCellValue(r.getStep() == null ? 0 : r.getStep()); + row.createCell(1).setCellValue(r.getDeviceId() == null ? "" : r.getDeviceId()); + row.createCell(2).setCellValue(r.getKeffValue() == null ? "" : r.getKeffValue().toPlainString()); + row.createCell(3).setCellValue(r.getAttrState() == null ? "" : r.getAttrState()); + } + String fileName = "scenario_results_" + scenarioId + "_" + deviceId + ".xlsx"; + String encoded = URLEncoder.encode(fileName, StandardCharsets.UTF_8.name()).replaceAll("\\+", "%20"); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encoded); + workbook.write(response.getOutputStream()); + workbook.close(); + } } diff --git a/business-css/src/main/java/com/yfd/business/css/domain/Algorithm.java b/business-css/src/main/java/com/yfd/business/css/domain/Algorithm.java index 7cb178a..6790e3f 100644 --- a/business-css/src/main/java/com/yfd/business/css/domain/Algorithm.java +++ b/business-css/src/main/java/com/yfd/business/css/domain/Algorithm.java @@ -38,4 +38,7 @@ public class Algorithm implements Serializable { @TableField("output_params") private String outputParams; -} \ No newline at end of file + + @TableField("modifer") + private String modifier; +} diff --git a/business-css/src/main/java/com/yfd/business/css/domain/CriticalData.java b/business-css/src/main/java/com/yfd/business/css/domain/CriticalData.java index f5bf6cc..354336c 100644 --- a/business-css/src/main/java/com/yfd/business/css/domain/CriticalData.java +++ b/business-css/src/main/java/com/yfd/business/css/domain/CriticalData.java @@ -45,4 +45,7 @@ public class CriticalData implements Serializable { @TableField("updated_at") private LocalDateTime updatedAt; + + @TableField("modifer") + private String modifier; } diff --git a/business-css/src/main/java/com/yfd/business/css/domain/Device.java b/business-css/src/main/java/com/yfd/business/css/domain/Device.java index ca7d0d8..01d8fbc 100644 --- a/business-css/src/main/java/com/yfd/business/css/domain/Device.java +++ b/business-css/src/main/java/com/yfd/business/css/domain/Device.java @@ -47,4 +47,7 @@ public class Device implements Serializable { @TableField("updated_at") private LocalDateTime updatedAt; + + @TableField("modifer") + private String modifier; } diff --git a/business-css/src/main/java/com/yfd/business/css/domain/Event.java b/business-css/src/main/java/com/yfd/business/css/domain/Event.java index 6ceff81..4e794f5 100644 --- a/business-css/src/main/java/com/yfd/business/css/domain/Event.java +++ b/business-css/src/main/java/com/yfd/business/css/domain/Event.java @@ -35,4 +35,7 @@ public class Event implements Serializable { @TableField("created_at") private LocalDateTime createdAt; + + @TableField("modifer") + private String modifier; } diff --git a/business-css/src/main/java/com/yfd/business/css/domain/Material.java b/business-css/src/main/java/com/yfd/business/css/domain/Material.java index e1f8169..3c619bc 100644 --- a/business-css/src/main/java/com/yfd/business/css/domain/Material.java +++ b/business-css/src/main/java/com/yfd/business/css/domain/Material.java @@ -63,4 +63,7 @@ public class Material implements Serializable { @TableField("updated_at") private LocalDateTime updatedAt; + + @TableField("modifer") + private String modifier; } diff --git a/business-css/src/main/java/com/yfd/business/css/domain/Project.java b/business-css/src/main/java/com/yfd/business/css/domain/Project.java index e5ac6d0..915b640 100644 --- a/business-css/src/main/java/com/yfd/business/css/domain/Project.java +++ b/business-css/src/main/java/com/yfd/business/css/domain/Project.java @@ -35,4 +35,7 @@ public class Project implements Serializable { @TableField("updated_at") private LocalDateTime updatedAt; + + @TableField("modifer") + private String modifier; } diff --git a/business-css/src/main/java/com/yfd/business/css/domain/Scenario.java b/business-css/src/main/java/com/yfd/business/css/domain/Scenario.java index 3ab42a2..367f474 100644 --- a/business-css/src/main/java/com/yfd/business/css/domain/Scenario.java +++ b/business-css/src/main/java/com/yfd/business/css/domain/Scenario.java @@ -32,4 +32,7 @@ public class Scenario implements Serializable { @TableField("updated_at") private LocalDateTime updatedAt; + + @TableField("modifer") + private String modifier; } diff --git a/business-css/src/main/java/com/yfd/business/css/service/ProjectService.java b/business-css/src/main/java/com/yfd/business/css/service/ProjectService.java index 1d39a51..b5723a8 100644 --- a/business-css/src/main/java/com/yfd/business/css/service/ProjectService.java +++ b/business-css/src/main/java/com/yfd/business/css/service/ProjectService.java @@ -4,14 +4,15 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.yfd.business.css.domain.Project; public interface ProjectService extends IService { + /** - * 导出所有项目 + * 导出所有项目为 Excel */ - byte[] exportAllProjects(); + byte[] exportAllProjectsExcel(); /** - * 导出项目工程(设备 + 物料 + 场景 + 事件 + 结果) + * 导出项目工程为 Excel(多 Sheet) */ - byte[] exportProjectEngineering(String projectId); + byte[] exportProjectEngineeringExcel(String projectId); } diff --git a/business-css/src/main/java/com/yfd/business/css/service/impl/ProjectServiceImpl.java b/business-css/src/main/java/com/yfd/business/css/service/impl/ProjectServiceImpl.java index f83f9a9..74f23a1 100644 --- a/business-css/src/main/java/com/yfd/business/css/service/impl/ProjectServiceImpl.java +++ b/business-css/src/main/java/com/yfd/business/css/service/impl/ProjectServiceImpl.java @@ -19,9 +19,12 @@ import com.yfd.business.css.service.ScenarioService; import com.yfd.business.css.service.EventService; import com.yfd.business.css.service.ScenarioResultService; import java.util.List; -import java.util.zip.ZipOutputStream; -import java.util.zip.ZipEntry; import java.io.ByteArrayOutputStream; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import java.time.format.DateTimeFormatter; @Service public class ProjectServiceImpl @@ -39,35 +42,44 @@ public class ProjectServiceImpl private EventService eventService; @Resource private ScenarioResultService scenarioResultService; + @Override - public byte[] exportAllProjects() { - try { - List projects = this.list(); - return objectMapper.writeValueAsBytes(projects); + public byte[] exportAllProjectsExcel() { + try (Workbook wb = new XSSFWorkbook(); ByteArrayOutputStream out = new ByteArrayOutputStream()) { + List list = this.list(new QueryWrapper().orderByDesc("created_at")); + Sheet sheet = wb.createSheet("projects"); + int r = 0; + Row header = sheet.createRow(r++); + String[] cols = {"project_id","code","name","description","created_at","updated_at"}; + for (int i = 0; i < cols.length; i++) header.createCell(i).setCellValue(cols[i]); + DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + for (Project p : list) { + Row row = sheet.createRow(r++); + row.createCell(0).setCellValue(p.getProjectId()); + row.createCell(1).setCellValue(p.getCode() == null ? "" : p.getCode()); + row.createCell(2).setCellValue(p.getName() == null ? "" : p.getName()); + row.createCell(3).setCellValue(p.getDescription() == null ? "" : p.getDescription()); + row.createCell(4).setCellValue(p.getCreatedAt() == null ? "" : fmt.format(p.getCreatedAt())); + row.createCell(5).setCellValue(p.getUpdatedAt() == null ? "" : fmt.format(p.getUpdatedAt())); + } + for (int i = 0; i < cols.length; i++) sheet.autoSizeColumn(i); + wb.write(out); + return out.toByteArray(); } catch (Exception e) { throw new RuntimeException(e); } } @Override - public byte[] exportProjectEngineering(String projectId) { - try { - Project project = this.getById(projectId); - if (project == null) { - throw new IllegalArgumentException("项目不存在: " + projectId); - } + public byte[] exportProjectEngineeringExcel(String projectId) { + try (Workbook wb = new XSSFWorkbook(); ByteArrayOutputStream out = new ByteArrayOutputStream()) { + DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - List devices = deviceService.list( - new QueryWrapper().eq("project_id", projectId) - ); - List materials = materialService.list( - new QueryWrapper().eq("project_id", projectId) - ); - List scenarios = scenarioService.list( - new QueryWrapper().eq("project_id", projectId) - ); + List projects = this.list(new QueryWrapper().eq("project_id", projectId)); + List devices = deviceService.list(new QueryWrapper().eq("project_id", projectId)); + List materials = materialService.list(new QueryWrapper().eq("project_id", projectId)); + List scenarios = scenarioService.list(new QueryWrapper().eq("project_id", projectId)); List scenarioIds = scenarios.stream().map(Scenario::getScenarioId).toList(); - List events = scenarioIds.isEmpty() ? List.of() : eventService.list(new QueryWrapper().in("scenario_id", scenarioIds)); @@ -75,39 +87,107 @@ public class ProjectServiceImpl ? List.of() : scenarioResultService.list(new QueryWrapper().in("scenario_id", scenarioIds)); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - try (ZipOutputStream zos = new ZipOutputStream(baos)) { - // 项目信息 - zos.putNextEntry(new ZipEntry("project.json")); - zos.write(objectMapper.writeValueAsBytes(project)); - zos.closeEntry(); - - // 设备 - zos.putNextEntry(new ZipEntry("devices.json")); - zos.write(objectMapper.writeValueAsBytes(devices)); - zos.closeEntry(); - - // 物料 - zos.putNextEntry(new ZipEntry("materials.json")); - zos.write(objectMapper.writeValueAsBytes(materials)); - zos.closeEntry(); - - // 情景 - zos.putNextEntry(new ZipEntry("scenarios.json")); - zos.write(objectMapper.writeValueAsBytes(scenarios)); - zos.closeEntry(); - - // 事件 - zos.putNextEntry(new ZipEntry("events.json")); - zos.write(objectMapper.writeValueAsBytes(events)); - zos.closeEntry(); - - // 结果 - zos.putNextEntry(new ZipEntry("scenario-results.json")); - zos.write(objectMapper.writeValueAsBytes(results)); - zos.closeEntry(); + Sheet s1 = wb.createSheet("projects"); + String[] h1 = {"project_id","code","name","description","created_at","updated_at"}; + int r = 0; Row rh1 = s1.createRow(r++); for (int i=0;i - - - org.apache.maven.plugins - maven-enforcer-plugin - 3.4.1 - - - enforce-rules - - enforce - - - - - - [3.6.3,) - - - [17,) - - - - - - - - org.apache.maven.plugins diff --git a/mvn-settings.xml b/mvn-settings.xml new file mode 100644 index 0000000..d2918e8 --- /dev/null +++ b/mvn-settings.xml @@ -0,0 +1,45 @@ + + + + + aliyunmaven + Aliyun Maven + central + https://maven.aliyun.com/repository/public + + + + + aliyun + + + central + https://repo.maven.apache.org/maven2 + + true + + + true + + + + + + central + https://repo.maven.apache.org/maven2 + + true + + + true + + + + + + + aliyun + + diff --git a/scripts/mvn17.cmd b/scripts/mvn17.cmd new file mode 100644 index 0000000..73701a2 --- /dev/null +++ b/scripts/mvn17.cmd @@ -0,0 +1,4 @@ +@echo off +set "JAVA_HOME=C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot" +set "PATH=%JAVA_HOME%\bin;%PATH%" +mvn %* diff --git a/系统代码结构框架规划.md b/系统代码结构框架规划.md index 337139e..bd47c57 100644 --- a/系统代码结构框架规划.md +++ b/系统代码结构框架规划.md @@ -162,6 +162,8 @@ src/main/resources # 1. 安装 framework 到本地仓库 mvn -DskipTests clean install -pl framework + + # 2. 启动业务模块(自动依赖 framework) mvn -DskipTests spring-boot:run -pl business-css ``` @@ -218,4 +220,18 @@ business-css/target/business-css-1.0-SNAPSHOT.jar # 业务服务(含内嵌 To --- -> **一句话总结**:framework 做“平台”,business-css 做“产品”;平台沉淀,产品迭代,互不污染,横向复制。 \ No newline at end of file +> **一句话总结**:framework 做“平台”,business-css 做“产品”;平台沉淀,产品迭代,互不污染,横向复制。 + +## 快速稳定方案(作用:脚本先设置 JAVA_HOME 与 PATH 指向 17,再调用 Maven,确保所有构建/运行都用 JDK 17,不受工具自带 JDK 8 影响。) +使用项目内脚本强制 JDK 17(已为你添加): +scripts\mvn17.cmd -s mvn-settings.xml -DskipTests -pl framework -am install + +scripts\mvn17.cmd -s mvn-settings.xml -DskipTests -f business-css\pom.xml spring-boot:run -Dspring-boot.run.profiles=local + +## 在工具内终端验证并调整到 17: +- 验证: mvn -version 、 where java 、 where mvn +- 临时修正当前终端(一次性手动): + - set "JAVA_HOME=C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot" + - set "PATH=%JAVA_HOME%\bin;%PATH%" + - 再 mvn -version 应为 17 +