Explorar el Código

数据管理/基础数据

wanggaokun hace 9 meses
padre
commit
1d8ad67696
Se han modificado 73 ficheros con 5805 adiciones y 42 borrados
  1. 21 0
      als-modules/agile-assurance/pom.xml
  2. 131 0
      als-modules/agile-assurance/src/main/java/org/eco/als/controller/AircraftController.java
  3. 131 0
      als-modules/agile-assurance/src/main/java/org/eco/als/controller/AlsFaultCaseController.java
  4. 131 0
      als-modules/agile-assurance/src/main/java/org/eco/als/controller/MaintenanceRecordController.java
  5. 131 0
      als-modules/agile-assurance/src/main/java/org/eco/als/controller/ProductController.java
  6. 131 0
      als-modules/agile-assurance/src/main/java/org/eco/als/controller/SortieController.java
  7. 131 0
      als-modules/agile-assurance/src/main/java/org/eco/als/controller/TechnicalDocController.java
  8. 41 0
      als-modules/agile-assurance/src/main/java/org/eco/als/domain/Aircraft.java
  9. 112 0
      als-modules/agile-assurance/src/main/java/org/eco/als/domain/AlsFaultCase.java
  10. 182 0
      als-modules/agile-assurance/src/main/java/org/eco/als/domain/MaintenanceRecord.java
  11. 46 0
      als-modules/agile-assurance/src/main/java/org/eco/als/domain/Product.java
  12. 67 0
      als-modules/agile-assurance/src/main/java/org/eco/als/domain/Sortie.java
  13. 62 0
      als-modules/agile-assurance/src/main/java/org/eco/als/domain/TechnicalDoc.java
  14. 32 0
      als-modules/agile-assurance/src/main/java/org/eco/als/domain/bo/AircraftBo.java
  15. 106 0
      als-modules/agile-assurance/src/main/java/org/eco/als/domain/bo/AlsFaultCaseBo.java
  16. 179 0
      als-modules/agile-assurance/src/main/java/org/eco/als/domain/bo/MaintenanceRecordBo.java
  17. 38 0
      als-modules/agile-assurance/src/main/java/org/eco/als/domain/bo/ProductBo.java
  18. 68 0
      als-modules/agile-assurance/src/main/java/org/eco/als/domain/bo/SortieBo.java
  19. 52 0
      als-modules/agile-assurance/src/main/java/org/eco/als/domain/bo/TechnicalDocBo.java
  20. 50 0
      als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/AircraftImportVo.java
  21. 48 0
      als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/AircraftVo.java
  22. 129 0
      als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/AlsFaultCaseImportVo.java
  23. 133 0
      als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/AlsFaultCaseVo.java
  24. 213 0
      als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/MaintenanceRecordImportVo.java
  25. 217 0
      als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/MaintenanceRecordVo.java
  26. 56 0
      als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/ProductImportVo.java
  27. 54 0
      als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/ProductVo.java
  28. 75 0
      als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/SortieImportVo.java
  29. 79 0
      als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/SortieVo.java
  30. 69 0
      als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/TechnicalDocImportVo.java
  31. 73 0
      als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/TechnicalDocVo.java
  32. 125 0
      als-modules/agile-assurance/src/main/java/org/eco/als/listener/AircraftImportListener.java
  33. 125 0
      als-modules/agile-assurance/src/main/java/org/eco/als/listener/AlsFaultCaseImportListener.java
  34. 125 0
      als-modules/agile-assurance/src/main/java/org/eco/als/listener/MaintenanceRecordImportListener.java
  35. 125 0
      als-modules/agile-assurance/src/main/java/org/eco/als/listener/ProductImportListener.java
  36. 125 0
      als-modules/agile-assurance/src/main/java/org/eco/als/listener/SortieImportListener.java
  37. 125 0
      als-modules/agile-assurance/src/main/java/org/eco/als/listener/TechnicalDocImportListener.java
  38. 16 0
      als-modules/agile-assurance/src/main/java/org/eco/als/mapper/AircraftMapper.java
  39. 16 0
      als-modules/agile-assurance/src/main/java/org/eco/als/mapper/AlsFaultCaseMapper.java
  40. 16 0
      als-modules/agile-assurance/src/main/java/org/eco/als/mapper/MaintenanceRecordMapper.java
  41. 16 0
      als-modules/agile-assurance/src/main/java/org/eco/als/mapper/ProductMapper.java
  42. 16 0
      als-modules/agile-assurance/src/main/java/org/eco/als/mapper/SortieMapper.java
  43. 16 0
      als-modules/agile-assurance/src/main/java/org/eco/als/mapper/TechnicalDocMapper.java
  44. 89 0
      als-modules/agile-assurance/src/main/java/org/eco/als/service/IAircraftService.java
  45. 97 0
      als-modules/agile-assurance/src/main/java/org/eco/als/service/IAlsFaultCaseService.java
  46. 97 0
      als-modules/agile-assurance/src/main/java/org/eco/als/service/IMaintenanceRecordService.java
  47. 89 0
      als-modules/agile-assurance/src/main/java/org/eco/als/service/IProductService.java
  48. 97 0
      als-modules/agile-assurance/src/main/java/org/eco/als/service/ISortieService.java
  49. 97 0
      als-modules/agile-assurance/src/main/java/org/eco/als/service/ITechnicalDocService.java
  50. 190 0
      als-modules/agile-assurance/src/main/java/org/eco/als/service/impl/AircraftServiceImpl.java
  51. 200 0
      als-modules/agile-assurance/src/main/java/org/eco/als/service/impl/AlsFaultCaseServiceImpl.java
  52. 196 0
      als-modules/agile-assurance/src/main/java/org/eco/als/service/impl/MaintenanceRecordServiceImpl.java
  53. 192 0
      als-modules/agile-assurance/src/main/java/org/eco/als/service/impl/ProductServiceImpl.java
  54. 196 0
      als-modules/agile-assurance/src/main/java/org/eco/als/service/impl/SortieServiceImpl.java
  55. 198 0
      als-modules/agile-assurance/src/main/java/org/eco/als/service/impl/TechnicalDocServiceImpl.java
  56. 7 0
      als-modules/agile-assurance/src/main/resources/mapper/als/AircraftMapper.xml
  57. 7 0
      als-modules/agile-assurance/src/main/resources/mapper/als/AlsFaultCaseMapper.xml
  58. 7 0
      als-modules/agile-assurance/src/main/resources/mapper/als/MaintenanceRecordMapper.xml
  59. 7 0
      als-modules/agile-assurance/src/main/resources/mapper/als/ProductMapper.xml
  60. 7 0
      als-modules/agile-assurance/src/main/resources/mapper/als/SortieMapper.xml
  61. 7 0
      als-modules/agile-assurance/src/main/resources/mapper/als/TechnicalDocMapper.xml
  62. 3 0
      als-modules/generator/src/main/java/org/eco/generator/domain/GenTable.java
  63. 2 14
      als-modules/generator/src/main/java/org/eco/generator/service/GenTableServiceImpl.java
  64. 2 2
      als-modules/generator/src/main/resources/generator.yml
  65. 19 4
      als-modules/generator/src/main/resources/vm/java/controller.java.vm
  66. 13 6
      als-modules/generator/src/main/resources/vm/java/listener.java.vm
  67. 31 1
      als-modules/generator/src/main/resources/vm/java/service.java.vm
  68. 94 1
      als-modules/generator/src/main/resources/vm/java/serviceImpl.java.vm
  69. 12 12
      als-modules/generator/src/main/resources/vm/sql/dm8/sql.vm
  70. 1 0
      als-modules/pom.xml
  71. 5 0
      als-start/pom.xml
  72. 2 2
      als-start/src/main/resources/application-dev.yml
  73. 7 0
      pom.xml

+ 21 - 0
als-modules/agile-assurance/pom.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.eco</groupId>
+        <artifactId>als-modules</artifactId>
+        <version>${revision}</version>
+    </parent>
+    <artifactId>agile-assurance</artifactId>
+    <name>agile-assurance</name>
+    <description>灵巧保障模块</description>
+
+    <dependencies>
+        <!-- 获取系统信息 -->
+        <dependency>
+            <groupId>org.eco</groupId>
+            <artifactId>system</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 131 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/controller/AircraftController.java

@@ -0,0 +1,131 @@
+package org.eco.als.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import org.eco.als.domain.bo.AircraftBo;
+import org.eco.als.domain.vo.AircraftVo;
+import org.eco.als.service.IAircraftService;
+import org.eco.common.core.core.domain.CommonResult;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.log.annotation.Log;
+import org.eco.common.log.enums.BusinessType;
+import org.eco.common.security.utils.LoginHelper;
+import org.eco.common.web.annotation.RepeatSubmit;
+import org.eco.common.web.core.BaseController;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 机型机号Controller
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/als/aircraft")
+public class AircraftController extends BaseController {
+    @Resource
+    private IAircraftService aircraftService;
+
+    /**
+     * 查询机型机号列表
+     */
+    @SaCheckPermission("als:aircraft:list")
+    @GetMapping("/list")
+    public CommonResult<List<AircraftVo>> list(AircraftBo aircraftBo) {
+        List<AircraftVo> list = aircraftService.selectList(aircraftBo);
+        return CommonResult.success(list);
+    }
+
+    /**
+     * 导出机型机号列表
+     */
+    @SaCheckPermission("als:aircraft:export")
+    @Log(title = "机型机号", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public CommonResult<Void> export(HttpServletResponse response, AircraftBo aircraftBo) {
+        LoginUser loginUser = LoginHelper.getLoginUser();
+        List<AircraftVo> list = aircraftService.selectList(aircraftBo);
+        aircraftService.asyncExport(list, "机型机号", loginUser);
+        return CommonResult.success();
+    }
+
+    /**
+     * 导入机型机号列表
+     */
+    @Log(title = "机型机号", businessType = BusinessType.IMPORT)
+    @SaCheckPermission("als:aircraft:import")
+    @PostMapping("/importData")
+    public CommonResult<Void> importData(MultipartFile file, boolean updateSupport) {
+        LoginUser loginUser = LoginHelper.getLoginUser();
+        aircraftService.asyncImportData(file, updateSupport, loginUser);
+        return CommonResult.success();
+    }
+
+    /**
+     * 获取机型机号详细信息
+     */
+    @SaCheckPermission("als:aircraft:query")
+    @GetMapping(value = "/{id}")
+    public CommonResult<AircraftVo> getInfo(@PathVariable Long id) {
+        return CommonResult.success(aircraftService.selectById(id));
+    }
+
+    /**
+     * 新增机型机号
+     */
+    @SaCheckPermission("als:aircraft:add")
+    @Log(title = "机型机号", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public CommonResult<Void> add(@Validated @RequestBody AircraftBo aircraftBo) {
+        boolean inserted = aircraftService.insert(aircraftBo);
+        if (!inserted) {
+            return CommonResult.fail("新增机型机号记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 修改机型机号
+     */
+    @SaCheckPermission("als:aircraft:edit")
+    @Log(title = "机型机号", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public CommonResult<Void> edit(@Validated @RequestBody AircraftBo aircraftBo) {
+        boolean updated = aircraftService.update(aircraftBo);
+        if (!updated) {
+            return CommonResult.fail("修改机型机号记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 删除机型机号
+     */
+    @SaCheckPermission("als:aircraft:remove")
+    @Log(title = "机型机号", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public CommonResult<Void> remove(@PathVariable Long[] ids) {
+        boolean deleted = aircraftService.deleteByIds(ids);
+        if (!deleted) {
+            return CommonResult.fail("删除机型机号记录失败!");
+        }
+        return CommonResult.success();
+    }
+}

+ 131 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/controller/AlsFaultCaseController.java

@@ -0,0 +1,131 @@
+package org.eco.als.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import org.eco.als.domain.bo.AlsFaultCaseBo;
+import org.eco.als.domain.vo.AlsFaultCaseVo;
+import org.eco.als.service.IAlsFaultCaseService;
+import org.eco.common.core.core.domain.CommonResult;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.core.core.page.PageResult;
+import org.eco.common.log.annotation.Log;
+import org.eco.common.log.enums.BusinessType;
+import org.eco.common.security.utils.LoginHelper;
+import org.eco.common.web.annotation.RepeatSubmit;
+import org.eco.common.web.core.BaseController;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 故障案例Controller
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/als/faultCase")
+public class AlsFaultCaseController extends BaseController {
+    @Resource
+    private IAlsFaultCaseService alsFaultCaseService;
+
+    /**
+     * 查询故障案例列表
+     */
+    @SaCheckPermission("als:faultCase:list")
+    @GetMapping("/list")
+    public CommonResult<PageResult<AlsFaultCaseVo>> list(AlsFaultCaseBo alsFaultCaseBo) {
+        return CommonResult.success(alsFaultCaseService.selectPage(alsFaultCaseBo));
+    }
+
+    /**
+     * 导出故障案例列表
+     */
+    @SaCheckPermission("als:faultCase:export")
+    @Log(title = "故障案例", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public CommonResult<Void> export(HttpServletResponse response, AlsFaultCaseBo alsFaultCaseBo) {
+        LoginUser loginUser = LoginHelper.getLoginUser();
+        List<AlsFaultCaseVo> list = alsFaultCaseService.selectList(alsFaultCaseBo);
+        alsFaultCaseService.asyncExport(list, "故障案例", loginUser);
+        return CommonResult.success();
+    }
+
+    /**
+     * 导入故障案例列表
+     */
+    @Log(title = "故障案例", businessType = BusinessType.IMPORT)
+    @SaCheckPermission("als:faultCase:import")
+    @PostMapping("/importData")
+    public CommonResult<Void> importData(MultipartFile file, boolean updateSupport) {
+        LoginUser loginUser = LoginHelper.getLoginUser();
+        alsFaultCaseService.asyncImportData(file, updateSupport, loginUser);
+        return CommonResult.success();
+    }
+
+    /**
+     * 获取故障案例详细信息
+     */
+    @SaCheckPermission("als:faultCase:query")
+    @GetMapping(value = "/{id}")
+    public CommonResult<AlsFaultCaseVo> getInfo(@PathVariable Long id) {
+        return CommonResult.success(alsFaultCaseService.selectById(id));
+    }
+
+    /**
+     * 新增故障案例
+     */
+    @SaCheckPermission("als:faultCase:add")
+    @Log(title = "故障案例", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public CommonResult<Void> add(@Validated @RequestBody AlsFaultCaseBo alsFaultCaseBo) {
+        boolean inserted = alsFaultCaseService.insert(alsFaultCaseBo);
+        if (!inserted) {
+            return CommonResult.fail("新增故障案例记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 修改故障案例
+     */
+    @SaCheckPermission("als:faultCase:edit")
+    @Log(title = "故障案例", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public CommonResult<Void> edit(@Validated @RequestBody AlsFaultCaseBo alsFaultCaseBo) {
+        boolean updated = alsFaultCaseService.update(alsFaultCaseBo);
+        if (!updated) {
+            return CommonResult.fail("修改故障案例记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 删除故障案例
+     */
+    @SaCheckPermission("als:faultCase:remove")
+    @Log(title = "故障案例", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public CommonResult<Void> remove(@PathVariable Long[] ids) {
+        boolean deleted = alsFaultCaseService.deleteByIds(ids);
+        if (!deleted) {
+            return CommonResult.fail("删除故障案例记录失败!");
+        }
+        return CommonResult.success();
+    }
+}

+ 131 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/controller/MaintenanceRecordController.java

@@ -0,0 +1,131 @@
+package org.eco.als.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import org.eco.als.domain.bo.MaintenanceRecordBo;
+import org.eco.als.domain.vo.MaintenanceRecordVo;
+import org.eco.als.service.IMaintenanceRecordService;
+import org.eco.common.core.core.domain.CommonResult;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.core.core.page.PageResult;
+import org.eco.common.log.annotation.Log;
+import org.eco.common.log.enums.BusinessType;
+import org.eco.common.security.utils.LoginHelper;
+import org.eco.common.web.annotation.RepeatSubmit;
+import org.eco.common.web.core.BaseController;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 维修记录Controller
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/als/maintenanceRecord")
+public class MaintenanceRecordController extends BaseController {
+    @Resource
+    private IMaintenanceRecordService maintenanceRecordService;
+
+    /**
+     * 查询维修记录列表
+     */
+    @SaCheckPermission("als:maintenanceRecord:list")
+    @GetMapping("/list")
+    public CommonResult<PageResult<MaintenanceRecordVo>> list(MaintenanceRecordBo maintenanceRecordBo) {
+        return CommonResult.success(maintenanceRecordService.selectPage(maintenanceRecordBo));
+    }
+
+    /**
+     * 导出维修记录列表
+     */
+    @SaCheckPermission("als:maintenanceRecord:export")
+    @Log(title = "维修记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public CommonResult<Void> export(HttpServletResponse response, MaintenanceRecordBo maintenanceRecordBo) {
+        LoginUser loginUser = LoginHelper.getLoginUser();
+        List<MaintenanceRecordVo> list = maintenanceRecordService.selectList(maintenanceRecordBo);
+        maintenanceRecordService.asyncExport(list, "维修记录", loginUser);
+        return CommonResult.success();
+    }
+
+    /**
+     * 导入维修记录列表
+     */
+    @Log(title = "维修记录", businessType = BusinessType.IMPORT)
+    @SaCheckPermission("als:maintenanceRecord:import")
+    @PostMapping("/importData")
+    public CommonResult<Void> importData(MultipartFile file, boolean updateSupport) {
+        LoginUser loginUser = LoginHelper.getLoginUser();
+        maintenanceRecordService.asyncImportData(file, updateSupport, loginUser);
+        return CommonResult.success();
+    }
+
+    /**
+     * 获取维修记录详细信息
+     */
+    @SaCheckPermission("als:maintenanceRecord:query")
+    @GetMapping(value = "/{id}")
+    public CommonResult<MaintenanceRecordVo> getInfo(@PathVariable Long id) {
+        return CommonResult.success(maintenanceRecordService.selectById(id));
+    }
+
+    /**
+     * 新增维修记录
+     */
+    @SaCheckPermission("als:maintenanceRecord:add")
+    @Log(title = "维修记录", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public CommonResult<Void> add(@Validated @RequestBody MaintenanceRecordBo maintenanceRecordBo) {
+        boolean inserted = maintenanceRecordService.insert(maintenanceRecordBo);
+        if (!inserted) {
+            return CommonResult.fail("新增维修记录记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 修改维修记录
+     */
+    @SaCheckPermission("als:maintenanceRecord:edit")
+    @Log(title = "维修记录", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public CommonResult<Void> edit(@Validated @RequestBody MaintenanceRecordBo maintenanceRecordBo) {
+        boolean updated = maintenanceRecordService.update(maintenanceRecordBo);
+        if (!updated) {
+            return CommonResult.fail("修改维修记录记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 删除维修记录
+     */
+    @SaCheckPermission("als:maintenanceRecord:remove")
+    @Log(title = "维修记录", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public CommonResult<Void> remove(@PathVariable Long[] ids) {
+        boolean deleted = maintenanceRecordService.deleteByIds(ids);
+        if (!deleted) {
+            return CommonResult.fail("删除维修记录记录失败!");
+        }
+        return CommonResult.success();
+    }
+}

+ 131 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/controller/ProductController.java

@@ -0,0 +1,131 @@
+package org.eco.als.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import org.eco.als.domain.bo.ProductBo;
+import org.eco.als.domain.vo.ProductVo;
+import org.eco.als.service.IProductService;
+import org.eco.common.core.core.domain.CommonResult;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.log.annotation.Log;
+import org.eco.common.log.enums.BusinessType;
+import org.eco.common.security.utils.LoginHelper;
+import org.eco.common.web.annotation.RepeatSubmit;
+import org.eco.common.web.core.BaseController;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 产品树Controller
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/als/product")
+public class ProductController extends BaseController {
+    @Resource
+    private IProductService productService;
+
+    /**
+     * 查询产品树列表
+     */
+    @SaCheckPermission("als:product:list")
+    @GetMapping("/list")
+    public CommonResult<List<ProductVo>> list(ProductBo productBo) {
+        List<ProductVo> list = productService.selectList(productBo);
+        return CommonResult.success(list);
+    }
+
+    /**
+     * 导出产品树列表
+     */
+    @SaCheckPermission("als:product:export")
+    @Log(title = "产品树", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public CommonResult<Void> export(HttpServletResponse response, ProductBo productBo) {
+        LoginUser loginUser = LoginHelper.getLoginUser();
+        List<ProductVo> list = productService.selectList(productBo);
+        productService.asyncExport(list, "产品树", loginUser);
+        return CommonResult.success();
+    }
+
+    /**
+     * 导入产品树列表
+     */
+    @Log(title = "产品树", businessType = BusinessType.IMPORT)
+    @SaCheckPermission("als:product:import")
+    @PostMapping("/importData")
+    public CommonResult<Void> importData(MultipartFile file, boolean updateSupport) {
+        LoginUser loginUser = LoginHelper.getLoginUser();
+        productService.asyncImportData(file, updateSupport, loginUser);
+        return CommonResult.success();
+    }
+
+    /**
+     * 获取产品树详细信息
+     */
+    @SaCheckPermission("als:product:query")
+    @GetMapping(value = "/{id}")
+    public CommonResult<ProductVo> getInfo(@PathVariable Long id) {
+        return CommonResult.success(productService.selectById(id));
+    }
+
+    /**
+     * 新增产品树
+     */
+    @SaCheckPermission("als:product:add")
+    @Log(title = "产品树", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public CommonResult<Void> add(@Validated @RequestBody ProductBo productBo) {
+        boolean inserted = productService.insert(productBo);
+        if (!inserted) {
+            return CommonResult.fail("新增产品树记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 修改产品树
+     */
+    @SaCheckPermission("als:product:edit")
+    @Log(title = "产品树", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public CommonResult<Void> edit(@Validated @RequestBody ProductBo productBo) {
+        boolean updated = productService.update(productBo);
+        if (!updated) {
+            return CommonResult.fail("修改产品树记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 删除产品树
+     */
+    @SaCheckPermission("als:product:remove")
+    @Log(title = "产品树", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public CommonResult<Void> remove(@PathVariable Long[] ids) {
+        boolean deleted = productService.deleteByIds(ids);
+        if (!deleted) {
+            return CommonResult.fail("删除产品树记录失败!");
+        }
+        return CommonResult.success();
+    }
+}

+ 131 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/controller/SortieController.java

@@ -0,0 +1,131 @@
+package org.eco.als.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import org.eco.als.domain.bo.SortieBo;
+import org.eco.als.domain.vo.SortieVo;
+import org.eco.als.service.ISortieService;
+import org.eco.common.core.core.domain.CommonResult;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.core.core.page.PageResult;
+import org.eco.common.log.annotation.Log;
+import org.eco.common.log.enums.BusinessType;
+import org.eco.common.security.utils.LoginHelper;
+import org.eco.common.web.annotation.RepeatSubmit;
+import org.eco.common.web.core.BaseController;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 架次Controller
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/als/sortie")
+public class SortieController extends BaseController {
+    @Resource
+    private ISortieService sortieService;
+
+    /**
+     * 查询架次列表
+     */
+    @SaCheckPermission("als:sortie:list")
+    @GetMapping("/list")
+    public CommonResult<PageResult<SortieVo>> list(SortieBo sortieBo) {
+        return CommonResult.success(sortieService.selectPage(sortieBo));
+    }
+
+    /**
+     * 导出架次列表
+     */
+    @SaCheckPermission("als:sortie:export")
+    @Log(title = "架次", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public CommonResult<Void> export(HttpServletResponse response, SortieBo sortieBo) {
+        LoginUser loginUser = LoginHelper.getLoginUser();
+        List<SortieVo> list = sortieService.selectList(sortieBo);
+        sortieService.asyncExport(list, "架次", loginUser);
+        return CommonResult.success();
+    }
+
+    /**
+     * 导入架次列表
+     */
+    @Log(title = "架次", businessType = BusinessType.IMPORT)
+    @SaCheckPermission("als:sortie:import")
+    @PostMapping("/importData")
+    public CommonResult<Void> importData(MultipartFile file, boolean updateSupport) {
+        LoginUser loginUser = LoginHelper.getLoginUser();
+        sortieService.asyncImportData(file, updateSupport, loginUser);
+        return CommonResult.success();
+    }
+
+    /**
+     * 获取架次详细信息
+     */
+    @SaCheckPermission("als:sortie:query")
+    @GetMapping(value = "/{id}")
+    public CommonResult<SortieVo> getInfo(@PathVariable Long id) {
+        return CommonResult.success(sortieService.selectById(id));
+    }
+
+    /**
+     * 新增架次
+     */
+    @SaCheckPermission("als:sortie:add")
+    @Log(title = "架次", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public CommonResult<Void> add(@Validated @RequestBody SortieBo sortieBo) {
+        boolean inserted = sortieService.insert(sortieBo);
+        if (!inserted) {
+            return CommonResult.fail("新增架次记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 修改架次
+     */
+    @SaCheckPermission("als:sortie:edit")
+    @Log(title = "架次", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public CommonResult<Void> edit(@Validated @RequestBody SortieBo sortieBo) {
+        boolean updated = sortieService.update(sortieBo);
+        if (!updated) {
+            return CommonResult.fail("修改架次记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 删除架次
+     */
+    @SaCheckPermission("als:sortie:remove")
+    @Log(title = "架次", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public CommonResult<Void> remove(@PathVariable Long[] ids) {
+        boolean deleted = sortieService.deleteByIds(ids);
+        if (!deleted) {
+            return CommonResult.fail("删除架次记录失败!");
+        }
+        return CommonResult.success();
+    }
+}

+ 131 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/controller/TechnicalDocController.java

@@ -0,0 +1,131 @@
+package org.eco.als.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import org.eco.als.domain.bo.TechnicalDocBo;
+import org.eco.als.domain.vo.TechnicalDocVo;
+import org.eco.als.service.ITechnicalDocService;
+import org.eco.common.core.core.domain.CommonResult;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.core.core.page.PageResult;
+import org.eco.common.log.annotation.Log;
+import org.eco.common.log.enums.BusinessType;
+import org.eco.common.security.utils.LoginHelper;
+import org.eco.common.web.annotation.RepeatSubmit;
+import org.eco.common.web.core.BaseController;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 技术资料Controller
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/als/technicalDoc")
+public class TechnicalDocController extends BaseController {
+    @Resource
+    private ITechnicalDocService technicalDocService;
+
+    /**
+     * 查询技术资料列表
+     */
+    @SaCheckPermission("als:technicalDoc:list")
+    @GetMapping("/list")
+    public CommonResult<PageResult<TechnicalDocVo>> list(TechnicalDocBo technicalDocBo) {
+        return CommonResult.success(technicalDocService.selectPage(technicalDocBo));
+    }
+
+    /**
+     * 导出技术资料列表
+     */
+    @SaCheckPermission("als:technicalDoc:export")
+    @Log(title = "技术资料", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public CommonResult<Void> export(HttpServletResponse response, TechnicalDocBo technicalDocBo) {
+        LoginUser loginUser = LoginHelper.getLoginUser();
+        List<TechnicalDocVo> list = technicalDocService.selectList(technicalDocBo);
+        technicalDocService.asyncExport(list, "技术资料", loginUser);
+        return CommonResult.success();
+    }
+
+    /**
+     * 导入技术资料列表
+     */
+    @Log(title = "技术资料", businessType = BusinessType.IMPORT)
+    @SaCheckPermission("als:technicalDoc:import")
+    @PostMapping("/importData")
+    public CommonResult<Void> importData(MultipartFile file, boolean updateSupport) {
+        LoginUser loginUser = LoginHelper.getLoginUser();
+        technicalDocService.asyncImportData(file, updateSupport, loginUser);
+        return CommonResult.success();
+    }
+
+    /**
+     * 获取技术资料详细信息
+     */
+    @SaCheckPermission("als:technicalDoc:query")
+    @GetMapping(value = "/{id}")
+    public CommonResult<TechnicalDocVo> getInfo(@PathVariable Long id) {
+        return CommonResult.success(technicalDocService.selectById(id));
+    }
+
+    /**
+     * 新增技术资料
+     */
+    @SaCheckPermission("als:technicalDoc:add")
+    @Log(title = "技术资料", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public CommonResult<Void> add(@Validated @RequestBody TechnicalDocBo technicalDocBo) {
+        boolean inserted = technicalDocService.insert(technicalDocBo);
+        if (!inserted) {
+            return CommonResult.fail("新增技术资料记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 修改技术资料
+     */
+    @SaCheckPermission("als:technicalDoc:edit")
+    @Log(title = "技术资料", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public CommonResult<Void> edit(@Validated @RequestBody TechnicalDocBo technicalDocBo) {
+        boolean updated = technicalDocService.update(technicalDocBo);
+        if (!updated) {
+            return CommonResult.fail("修改技术资料记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 删除技术资料
+     */
+    @SaCheckPermission("als:technicalDoc:remove")
+    @Log(title = "技术资料", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public CommonResult<Void> remove(@PathVariable Long[] ids) {
+        boolean deleted = technicalDocService.deleteByIds(ids);
+        if (!deleted) {
+            return CommonResult.fail("删除技术资料记录失败!");
+        }
+        return CommonResult.success();
+    }
+}

+ 41 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/Aircraft.java

@@ -0,0 +1,41 @@
+package org.eco.als.domain;
+
+import com.mybatisflex.annotation.Column;
+import com.mybatisflex.annotation.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.eco.common.orm.core.domain.TreeEntity;
+
+import java.io.Serial;
+
+/**
+ * 机型机号对象 als_aircraft_t
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Table(value = "als_aircraft_t")
+public class Aircraft extends TreeEntity {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 编号
+     */
+    private Long id;
+
+    /**
+     * 机型/机号
+     */
+    private String name;
+
+    /**
+     * 删除标识(1删除 0未删除)
+     */
+    @Column(isLogicDelete = true)
+    private Integer delFlag;
+
+
+}

+ 112 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/AlsFaultCase.java

@@ -0,0 +1,112 @@
+package org.eco.als.domain;
+
+import com.mybatisflex.annotation.Column;
+import com.mybatisflex.annotation.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.eco.common.orm.core.domain.BaseEntity;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * 故障案例对象 als_fault_case_t
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Table(value = "als_fault_case_t")
+public class AlsFaultCase extends BaseEntity {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 编号
+     */
+    private Long id;
+
+    /**
+     * 机型
+     */
+    private String aircraftType;
+
+    /**
+     * 单位
+     */
+    private String unitName;
+
+    /**
+     * 故障件名称
+     */
+    private String itemName;
+
+    /**
+     * 专业
+     */
+    private String specialty;
+
+    /**
+     * 故障现象
+     */
+    private String faultPhenomenon;
+
+    /**
+     * 发动机型别
+     */
+    private String engineType;
+
+    /**
+     * 故障发生地点
+     */
+    private String locationFault;
+
+    /**
+     * 故障件型别
+     */
+    private String itemType;
+
+    /**
+     * 发生日期
+     */
+    private Date occurDate;
+
+    /**
+     * 系统
+     */
+    private String systemName;
+
+    /**
+     * 故障原因
+     */
+    private String causeFault;
+
+    /**
+     * 故障性质
+     */
+    private String natureFault;
+
+    /**
+     * 判明方法
+     */
+    private String methodDetermination;
+
+    /**
+     * 排除方法
+     */
+    private String methodRectification;
+
+    /**
+     * 备注
+     */
+    private String remarks;
+
+    /**
+     * 删除标识(1删除 0未删除)
+     */
+    @Column(isLogicDelete = true)
+    private Integer delFlag;
+
+
+}

+ 182 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/MaintenanceRecord.java

@@ -0,0 +1,182 @@
+package org.eco.als.domain;
+
+import com.mybatisflex.annotation.Column;
+import com.mybatisflex.annotation.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.eco.common.orm.core.domain.BaseEntity;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * 维修记录对象 als_maintenance_record_t
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Table(value = "als_maintenance_record_t")
+public class MaintenanceRecord extends BaseEntity {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 编号
+     */
+    private Long id;
+
+    /**
+     * 机型
+     */
+    private String aircraftType;
+
+    /**
+     * 机号
+     */
+    private String aircraftNo;
+
+    /**
+     * 出厂号码
+     */
+    private String serialNumber;
+
+    /**
+     * 专业
+     */
+    private String specialty;
+
+    /**
+     * 系统
+     */
+    private String systemName;
+
+    /**
+     * 发动机型别
+     */
+    private String engineType;
+
+    /**
+     * 发动机号码
+     */
+    private String engineSerialNumber;
+
+    /**
+     * 单位
+     */
+    private String unitName;
+
+    /**
+     * 故障现象
+     */
+    private String faultPhenomenon;
+
+    /**
+     * 故障发生地点
+     */
+    private String locationFault;
+
+    /**
+     * 发现时机
+     */
+    private String discoveryTime;
+
+    /**
+     * 故障件名称
+     */
+    private String itemName;
+
+    /**
+     * 故障件型别
+     */
+    private String itemType;
+
+    /**
+     * 故换件号码
+     */
+    private String partNumber;
+
+    /**
+     * 故换件型别
+     */
+    private String parttype;
+
+    /**
+     * 故障失常码
+     */
+    private String faultcode;
+
+    /**
+     * 故障件装机日期
+     */
+    private Date installationDate;
+
+    /**
+     * 故障原因
+     */
+    private String causeFault;
+
+    /**
+     * 故障性质
+     */
+    private String natureFault;
+
+    /**
+     * 故障责任
+     */
+    private String liabilityFault;
+
+    /**
+     * 故障后果
+     */
+    private String consequencesFault;
+
+    /**
+     * 发生日期
+     */
+    private Date occurDate;
+
+    /**
+     * 判明方法
+     */
+    private String methodDetermination;
+
+    /**
+     * 排除方法
+     */
+    private String methodRectification;
+
+    /**
+     * 发现人
+     */
+    private String discoveredBy;
+
+    /**
+     * 排故人
+     */
+    private String rectificationBy;
+
+    /**
+     * 审核人
+     */
+    private String reviewerBy;
+
+    /**
+     * 排故人数
+     */
+    private String rectificationNumber;
+
+    /**
+     * 备注
+     */
+    private String remarks;
+
+    /**
+     * 删除标识(1删除 0未删除)
+     */
+    @Column(isLogicDelete = true)
+    private Integer delFlag;
+
+
+}

+ 46 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/Product.java

@@ -0,0 +1,46 @@
+package org.eco.als.domain;
+
+import com.mybatisflex.annotation.Column;
+import com.mybatisflex.annotation.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.eco.common.orm.core.domain.TreeEntity;
+
+import java.io.Serial;
+
+/**
+ * 产品树对象 als_product_t
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Table(value = "als_product_t")
+public class Product extends TreeEntity {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 编号
+     */
+    private Long id;
+
+    /**
+     * SNS编号
+     */
+    private String snsCode;
+
+    /**
+     * 产品名称
+     */
+    private String name;
+
+    /**
+     * 删除标识(1删除 0未删除)
+     */
+    @Column(isLogicDelete = true)
+    private Integer delFlag;
+
+
+}

+ 67 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/Sortie.java

@@ -0,0 +1,67 @@
+package org.eco.als.domain;
+
+import com.mybatisflex.annotation.Column;
+import com.mybatisflex.annotation.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.eco.common.orm.core.domain.BaseEntity;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * 架次对象 als_sortie_t
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Table(value = "als_sortie_t")
+public class Sortie extends BaseEntity {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 编号
+     */
+    private Long id;
+
+    /**
+     * 架次号
+     */
+    private String sortieNo;
+
+    /**
+     * 机号
+     */
+    private String aircraftNo;
+
+    /**
+     * 飞行日期
+     */
+    private Date flightDate;
+
+    /**
+     * 开始时间
+     */
+    private Date startTime;
+
+    /**
+     * 结束时间
+     */
+    private String endTime;
+
+    /**
+     * 飞行时长
+     */
+    private String duration;
+
+    /**
+     * 删除标识(1删除 0未删除)
+     */
+    @Column(isLogicDelete = true)
+    private Integer delFlag;
+
+
+}

+ 62 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/TechnicalDoc.java

@@ -0,0 +1,62 @@
+package org.eco.als.domain;
+
+import com.mybatisflex.annotation.Column;
+import com.mybatisflex.annotation.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.eco.common.orm.core.domain.BaseEntity;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * 技术资料对象 als_technical_doc_t
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Table(value = "als_technical_doc_t")
+public class TechnicalDoc extends BaseEntity {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 编号
+     */
+    private Long id;
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 作者
+     */
+    private String author;
+
+    /**
+     * 出版时间
+     */
+    private Date publicationDate;
+
+    /**
+     * 资料类型
+     */
+    private String type;
+
+    /**
+     * 文件Id
+     */
+    private Long ossId;
+
+    /**
+     * 删除标识(1删除 0未删除)
+     */
+    @Column(isLogicDelete = true)
+    private Integer delFlag;
+
+
+}

+ 32 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/bo/AircraftBo.java

@@ -0,0 +1,32 @@
+package org.eco.als.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.eco.als.domain.Aircraft;
+import org.eco.common.orm.core.domain.TreeEntity;
+
+/**
+ * 机型机号业务对象 als_aircraft_t
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = Aircraft.class, reverseConvertGenerate = false)
+public class AircraftBo extends TreeEntity {
+    /**
+     * 编号
+     */
+    private Long id;
+
+    /**
+     * 机型/机号
+     */
+    @NotBlank(message = "机型/机号不能为空")
+    private String name;
+
+
+}

+ 106 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/bo/AlsFaultCaseBo.java

@@ -0,0 +1,106 @@
+package org.eco.als.domain.bo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.eco.als.domain.AlsFaultCase;
+import org.eco.common.orm.core.domain.BaseEntity;
+
+import java.util.Date;
+
+/**
+ * 故障案例业务对象 als_fault_case_t
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = AlsFaultCase.class, reverseConvertGenerate = false)
+public class AlsFaultCaseBo extends BaseEntity {
+    /**
+     * 编号
+     */
+    private Long id;
+
+    /**
+     * 机型
+     */
+    @NotBlank(message = "机型不能为空")
+    private String aircraftType;
+
+    /**
+     * 单位
+     */
+    private String unitName;
+
+    /**
+     * 故障件名称
+     */
+    private String itemName;
+
+    /**
+     * 专业
+     */
+    private String specialty;
+
+    /**
+     * 故障现象
+     */
+    private String faultPhenomenon;
+
+    /**
+     * 发动机型别
+     */
+    private String engineType;
+
+    /**
+     * 故障发生地点
+     */
+    private String locationFault;
+
+    /**
+     * 故障件型别
+     */
+    private String itemType;
+
+    /**
+     * 发生日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date occurDate;
+
+    /**
+     * 系统
+     */
+    private String systemName;
+
+    /**
+     * 故障原因
+     */
+    private String causeFault;
+
+    /**
+     * 故障性质
+     */
+    private String natureFault;
+
+    /**
+     * 判明方法
+     */
+    private String methodDetermination;
+
+    /**
+     * 排除方法
+     */
+    private String methodRectification;
+
+    /**
+     * 备注
+     */
+    private String remarks;
+
+
+}

+ 179 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/bo/MaintenanceRecordBo.java

@@ -0,0 +1,179 @@
+package org.eco.als.domain.bo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.eco.als.domain.MaintenanceRecord;
+import org.eco.common.orm.core.domain.BaseEntity;
+
+import java.util.Date;
+
+/**
+ * 维修记录业务对象 als_maintenance_record_t
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = MaintenanceRecord.class, reverseConvertGenerate = false)
+public class MaintenanceRecordBo extends BaseEntity {
+    /**
+     * 编号
+     */
+    private Long id;
+
+    /**
+     * 机型
+     */
+    @NotBlank(message = "机型不能为空")
+    private String aircraftType;
+
+    /**
+     * 机号
+     */
+    @NotBlank(message = "机号不能为空")
+    private String aircraftNo;
+
+    /**
+     * 出厂号码
+     */
+    @NotBlank(message = "出厂号码不能为空")
+    private String serialNumber;
+
+    /**
+     * 专业
+     */
+    private String specialty;
+
+    /**
+     * 系统
+     */
+    private String systemName;
+
+    /**
+     * 发动机型别
+     */
+    private String engineType;
+
+    /**
+     * 发动机号码
+     */
+    private String engineSerialNumber;
+
+    /**
+     * 单位
+     */
+    private String unitName;
+
+    /**
+     * 故障现象
+     */
+    private String faultPhenomenon;
+
+    /**
+     * 故障发生地点
+     */
+    private String locationFault;
+
+    /**
+     * 发现时机
+     */
+    private String discoveryTime;
+
+    /**
+     * 故障件名称
+     */
+    private String itemName;
+
+    /**
+     * 故障件型别
+     */
+    private String itemType;
+
+    /**
+     * 故换件号码
+     */
+    private String partNumber;
+
+    /**
+     * 故换件型别
+     */
+    private String parttype;
+
+    /**
+     * 故障失常码
+     */
+    private String faultcode;
+
+    /**
+     * 故障件装机日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date installationDate;
+
+    /**
+     * 故障原因
+     */
+    private String causeFault;
+
+    /**
+     * 故障性质
+     */
+    private String natureFault;
+
+    /**
+     * 故障责任
+     */
+    private String liabilityFault;
+
+    /**
+     * 故障后果
+     */
+    private String consequencesFault;
+
+    /**
+     * 发生日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date occurDate;
+
+    /**
+     * 判明方法
+     */
+    private String methodDetermination;
+
+    /**
+     * 排除方法
+     */
+    private String methodRectification;
+
+    /**
+     * 发现人
+     */
+    private String discoveredBy;
+
+    /**
+     * 排故人
+     */
+    private String rectificationBy;
+
+    /**
+     * 审核人
+     */
+    private String reviewerBy;
+
+    /**
+     * 排故人数
+     */
+    private String rectificationNumber;
+
+    /**
+     * 备注
+     */
+    private String remarks;
+
+
+}

+ 38 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/bo/ProductBo.java

@@ -0,0 +1,38 @@
+package org.eco.als.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.eco.als.domain.Product;
+import org.eco.common.orm.core.domain.TreeEntity;
+
+/**
+ * 产品树业务对象 als_product_t
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = Product.class, reverseConvertGenerate = false)
+public class ProductBo extends TreeEntity {
+    /**
+     * 编号
+     */
+    private Long id;
+
+    /**
+     * SNS编号
+     */
+    @NotBlank(message = "SNS编号不能为空")
+    private String snsCode;
+
+    /**
+     * 产品名称
+     */
+    @NotBlank(message = "产品名称不能为空")
+    private String name;
+
+
+}

+ 68 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/bo/SortieBo.java

@@ -0,0 +1,68 @@
+package org.eco.als.domain.bo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.eco.als.domain.Sortie;
+import org.eco.common.orm.core.domain.BaseEntity;
+
+import java.util.Date;
+
+/**
+ * 架次业务对象 als_sortie_t
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = Sortie.class, reverseConvertGenerate = false)
+public class SortieBo extends BaseEntity {
+    /**
+     * 编号
+     */
+    private Long id;
+
+    /**
+     * 架次号
+     */
+    @NotBlank(message = "架次号不能为空")
+    private String sortieNo;
+
+    /**
+     * 机号
+     */
+    @NotBlank(message = "机号不能为空")
+    private String aircraftNo;
+
+    /**
+     * 飞行日期
+     */
+    @NotNull(message = "飞行日期不能为空")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date flightDate;
+
+    /**
+     * 开始时间
+     */
+    @NotNull(message = "开始时间不能为空")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date startTime;
+
+    /**
+     * 结束时间
+     */
+    @NotBlank(message = "结束时间不能为空")
+    private String endTime;
+
+    /**
+     * 飞行时长
+     */
+    @NotBlank(message = "飞行时长不能为空")
+    private String duration;
+
+
+}

+ 52 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/bo/TechnicalDocBo.java

@@ -0,0 +1,52 @@
+package org.eco.als.domain.bo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.eco.als.domain.TechnicalDoc;
+import org.eco.common.orm.core.domain.BaseEntity;
+
+import java.util.Date;
+
+/**
+ * 技术资料业务对象 als_technical_doc_t
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = TechnicalDoc.class, reverseConvertGenerate = false)
+public class TechnicalDocBo extends BaseEntity {
+    /**
+     * 编号
+     */
+    private Long id;
+
+    /**
+     * 名称
+     */
+    @NotBlank(message = "名称不能为空")
+    private String name;
+
+    /**
+     * 作者
+     */
+    @NotBlank(message = "作者不能为空")
+    private String author;
+
+    /**
+     * 出版时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date publicationDate;
+
+    /**
+     * 资料类型
+     */
+    private String type;
+
+
+}

+ 50 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/AircraftImportVo.java

@@ -0,0 +1,50 @@
+package org.eco.als.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 机型机号导入视图对象 als_aircraft_t
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+
+@Data
+@NoArgsConstructor
+public class AircraftImportVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * 编号
+     */
+    @ExcelProperty(value = "编号")
+    private Long id;
+
+    /**
+     * 机型Id
+     */
+    @ExcelProperty(value = "机型Id")
+    private String parentId;
+
+    /**
+     * 机型/机号
+     */
+    @ExcelProperty(value = "机型/机号")
+    private String name;
+
+    /**
+     * 删除标识(1删除 0未删除)
+     */
+    @ExcelProperty(value = "删除标识(1删除 0未删除)")
+    private Integer delFlag;
+
+
+}

+ 48 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/AircraftVo.java

@@ -0,0 +1,48 @@
+package org.eco.als.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.eco.als.domain.Aircraft;
+import org.eco.common.orm.core.domain.TreeEntity;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 机型机号视图对象 als_aircraft_t
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Data
+@ExcelIgnoreUnannotated
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = Aircraft.class)
+public class AircraftVo extends TreeEntity implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 编号
+     */
+    @ExcelProperty(value = "编号")
+    private Long id;
+
+    /**
+     * 机型/机号
+     */
+    @ExcelProperty(value = "机型/机号")
+    private String name;
+
+    /**
+     * 删除标识(1删除 0未删除)
+     */
+    @ExcelProperty(value = "删除标识(1删除 0未删除)")
+    private Integer delFlag;
+
+
+}

+ 129 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/AlsFaultCaseImportVo.java

@@ -0,0 +1,129 @@
+package org.eco.als.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 故障案例导入视图对象 als_fault_case_t
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+
+@Data
+@NoArgsConstructor
+public class AlsFaultCaseImportVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * 编号
+     */
+    @ExcelProperty(value = "编号")
+    private Long id;
+
+    /**
+     * 机型
+     */
+    @ExcelProperty(value = "机型")
+    private String aircraftType;
+
+    /**
+     * 单位
+     */
+    @ExcelProperty(value = "单位")
+    private String unitName;
+
+    /**
+     * 故障件名称
+     */
+    @ExcelProperty(value = "故障件名称")
+    private String itemName;
+
+    /**
+     * 专业
+     */
+    @ExcelProperty(value = "专业")
+    private String specialty;
+
+    /**
+     * 故障现象
+     */
+    @ExcelProperty(value = "故障现象")
+    private String faultPhenomenon;
+
+    /**
+     * 发动机型别
+     */
+    @ExcelProperty(value = "发动机型别")
+    private String engineType;
+
+    /**
+     * 故障发生地点
+     */
+    @ExcelProperty(value = "故障发生地点")
+    private String locationFault;
+
+    /**
+     * 故障件型别
+     */
+    @ExcelProperty(value = "故障件型别")
+    private String itemType;
+
+    /**
+     * 发生日期
+     */
+    @ExcelProperty(value = "发生日期")
+    private Date occurDate;
+
+    /**
+     * 系统
+     */
+    @ExcelProperty(value = "系统")
+    private String systemName;
+
+    /**
+     * 故障原因
+     */
+    @ExcelProperty(value = "故障原因")
+    private String causeFault;
+
+    /**
+     * 故障性质
+     */
+    @ExcelProperty(value = "故障性质")
+    private String natureFault;
+
+    /**
+     * 判明方法
+     */
+    @ExcelProperty(value = "判明方法")
+    private String methodDetermination;
+
+    /**
+     * 排除方法
+     */
+    @ExcelProperty(value = "排除方法")
+    private String methodRectification;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remarks;
+
+    /**
+     * 删除标识(1删除 0未删除)
+     */
+    @ExcelProperty(value = "删除标识(1删除 0未删除)")
+    private Integer delFlag;
+
+
+}

+ 133 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/AlsFaultCaseVo.java

@@ -0,0 +1,133 @@
+package org.eco.als.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.eco.als.domain.AlsFaultCase;
+import org.eco.common.orm.core.domain.BaseEntity;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 故障案例视图对象 als_fault_case_t
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Data
+@ExcelIgnoreUnannotated
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = AlsFaultCase.class)
+public class AlsFaultCaseVo extends BaseEntity implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 编号
+     */
+    @ExcelProperty(value = "编号")
+    private Long id;
+
+    /**
+     * 机型
+     */
+    @ExcelProperty(value = "机型")
+    private String aircraftType;
+
+    /**
+     * 单位
+     */
+    @ExcelProperty(value = "单位")
+    private String unitName;
+
+    /**
+     * 故障件名称
+     */
+    @ExcelProperty(value = "故障件名称")
+    private String itemName;
+
+    /**
+     * 专业
+     */
+    @ExcelProperty(value = "专业")
+    private String specialty;
+
+    /**
+     * 故障现象
+     */
+    @ExcelProperty(value = "故障现象")
+    private String faultPhenomenon;
+
+    /**
+     * 发动机型别
+     */
+    @ExcelProperty(value = "发动机型别")
+    private String engineType;
+
+    /**
+     * 故障发生地点
+     */
+    @ExcelProperty(value = "故障发生地点")
+    private String locationFault;
+
+    /**
+     * 故障件型别
+     */
+    @ExcelProperty(value = "故障件型别")
+    private String itemType;
+
+    /**
+     * 发生日期
+     */
+    @ExcelProperty(value = "发生日期")
+    private Date occurDate;
+
+    /**
+     * 系统
+     */
+    @ExcelProperty(value = "系统")
+    private String systemName;
+
+    /**
+     * 故障原因
+     */
+    @ExcelProperty(value = "故障原因")
+    private String causeFault;
+
+    /**
+     * 故障性质
+     */
+    @ExcelProperty(value = "故障性质")
+    private String natureFault;
+
+    /**
+     * 判明方法
+     */
+    @ExcelProperty(value = "判明方法")
+    private String methodDetermination;
+
+    /**
+     * 排除方法
+     */
+    @ExcelProperty(value = "排除方法")
+    private String methodRectification;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remarks;
+
+    /**
+     * 删除标识(1删除 0未删除)
+     */
+    @ExcelProperty(value = "删除标识(1删除 0未删除)")
+    private Integer delFlag;
+
+
+}

+ 213 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/MaintenanceRecordImportVo.java

@@ -0,0 +1,213 @@
+package org.eco.als.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 维修记录导入视图对象 als_maintenance_record_t
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+
+@Data
+@NoArgsConstructor
+public class MaintenanceRecordImportVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * 编号
+     */
+    @ExcelProperty(value = "编号")
+    private Long id;
+
+    /**
+     * 机型
+     */
+    @ExcelProperty(value = "机型")
+    private String aircraftType;
+
+    /**
+     * 机号
+     */
+    @ExcelProperty(value = "机号")
+    private String aircraftNo;
+
+    /**
+     * 出厂号码
+     */
+    @ExcelProperty(value = "出厂号码")
+    private String serialNumber;
+
+    /**
+     * 专业
+     */
+    @ExcelProperty(value = "专业")
+    private String specialty;
+
+    /**
+     * 系统
+     */
+    @ExcelProperty(value = "系统")
+    private String systemName;
+
+    /**
+     * 发动机型别
+     */
+    @ExcelProperty(value = "发动机型别")
+    private String engineType;
+
+    /**
+     * 发动机号码
+     */
+    @ExcelProperty(value = "发动机号码")
+    private String engineSerialNumber;
+
+    /**
+     * 单位
+     */
+    @ExcelProperty(value = "单位")
+    private String unitName;
+
+    /**
+     * 故障现象
+     */
+    @ExcelProperty(value = "故障现象")
+    private String faultPhenomenon;
+
+    /**
+     * 故障发生地点
+     */
+    @ExcelProperty(value = "故障发生地点")
+    private String locationFault;
+
+    /**
+     * 发现时机
+     */
+    @ExcelProperty(value = "发现时机")
+    private String discoveryTime;
+
+    /**
+     * 故障件名称
+     */
+    @ExcelProperty(value = "故障件名称")
+    private String itemName;
+
+    /**
+     * 故障件型别
+     */
+    @ExcelProperty(value = "故障件型别")
+    private String itemType;
+
+    /**
+     * 故换件号码
+     */
+    @ExcelProperty(value = "故换件号码")
+    private String partNumber;
+
+    /**
+     * 故换件型别
+     */
+    @ExcelProperty(value = "故换件型别")
+    private String parttype;
+
+    /**
+     * 故障失常码
+     */
+    @ExcelProperty(value = "故障失常码")
+    private String faultcode;
+
+    /**
+     * 故障件装机日期
+     */
+    @ExcelProperty(value = "故障件装机日期")
+    private Date installationDate;
+
+    /**
+     * 故障原因
+     */
+    @ExcelProperty(value = "故障原因")
+    private String causeFault;
+
+    /**
+     * 故障性质
+     */
+    @ExcelProperty(value = "故障性质")
+    private String natureFault;
+
+    /**
+     * 故障责任
+     */
+    @ExcelProperty(value = "故障责任")
+    private String liabilityFault;
+
+    /**
+     * 故障后果
+     */
+    @ExcelProperty(value = "故障后果")
+    private String consequencesFault;
+
+    /**
+     * 发生日期
+     */
+    @ExcelProperty(value = "发生日期")
+    private Date occurDate;
+
+    /**
+     * 判明方法
+     */
+    @ExcelProperty(value = "判明方法")
+    private String methodDetermination;
+
+    /**
+     * 排除方法
+     */
+    @ExcelProperty(value = "排除方法")
+    private String methodRectification;
+
+    /**
+     * 发现人
+     */
+    @ExcelProperty(value = "发现人")
+    private String discoveredBy;
+
+    /**
+     * 排故人
+     */
+    @ExcelProperty(value = "排故人")
+    private String rectificationBy;
+
+    /**
+     * 审核人
+     */
+    @ExcelProperty(value = "审核人")
+    private String reviewerBy;
+
+    /**
+     * 排故人数
+     */
+    @ExcelProperty(value = "排故人数")
+    private String rectificationNumber;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remarks;
+
+    /**
+     * 删除标识(1删除 0未删除)
+     */
+    @ExcelProperty(value = "删除标识(1删除 0未删除)")
+    private Integer delFlag;
+
+
+}

+ 217 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/MaintenanceRecordVo.java

@@ -0,0 +1,217 @@
+package org.eco.als.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.eco.als.domain.MaintenanceRecord;
+import org.eco.common.orm.core.domain.BaseEntity;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 维修记录视图对象 als_maintenance_record_t
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Data
+@ExcelIgnoreUnannotated
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = MaintenanceRecord.class)
+public class MaintenanceRecordVo extends BaseEntity implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 编号
+     */
+    @ExcelProperty(value = "编号")
+    private Long id;
+
+    /**
+     * 机型
+     */
+    @ExcelProperty(value = "机型")
+    private String aircraftType;
+
+    /**
+     * 机号
+     */
+    @ExcelProperty(value = "机号")
+    private String aircraftNo;
+
+    /**
+     * 出厂号码
+     */
+    @ExcelProperty(value = "出厂号码")
+    private String serialNumber;
+
+    /**
+     * 专业
+     */
+    @ExcelProperty(value = "专业")
+    private String specialty;
+
+    /**
+     * 系统
+     */
+    @ExcelProperty(value = "系统")
+    private String systemName;
+
+    /**
+     * 发动机型别
+     */
+    @ExcelProperty(value = "发动机型别")
+    private String engineType;
+
+    /**
+     * 发动机号码
+     */
+    @ExcelProperty(value = "发动机号码")
+    private String engineSerialNumber;
+
+    /**
+     * 单位
+     */
+    @ExcelProperty(value = "单位")
+    private String unitName;
+
+    /**
+     * 故障现象
+     */
+    @ExcelProperty(value = "故障现象")
+    private String faultPhenomenon;
+
+    /**
+     * 故障发生地点
+     */
+    @ExcelProperty(value = "故障发生地点")
+    private String locationFault;
+
+    /**
+     * 发现时机
+     */
+    @ExcelProperty(value = "发现时机")
+    private String discoveryTime;
+
+    /**
+     * 故障件名称
+     */
+    @ExcelProperty(value = "故障件名称")
+    private String itemName;
+
+    /**
+     * 故障件型别
+     */
+    @ExcelProperty(value = "故障件型别")
+    private String itemType;
+
+    /**
+     * 故换件号码
+     */
+    @ExcelProperty(value = "故换件号码")
+    private String partNumber;
+
+    /**
+     * 故换件型别
+     */
+    @ExcelProperty(value = "故换件型别")
+    private String parttype;
+
+    /**
+     * 故障失常码
+     */
+    @ExcelProperty(value = "故障失常码")
+    private String faultcode;
+
+    /**
+     * 故障件装机日期
+     */
+    @ExcelProperty(value = "故障件装机日期")
+    private Date installationDate;
+
+    /**
+     * 故障原因
+     */
+    @ExcelProperty(value = "故障原因")
+    private String causeFault;
+
+    /**
+     * 故障性质
+     */
+    @ExcelProperty(value = "故障性质")
+    private String natureFault;
+
+    /**
+     * 故障责任
+     */
+    @ExcelProperty(value = "故障责任")
+    private String liabilityFault;
+
+    /**
+     * 故障后果
+     */
+    @ExcelProperty(value = "故障后果")
+    private String consequencesFault;
+
+    /**
+     * 发生日期
+     */
+    @ExcelProperty(value = "发生日期")
+    private Date occurDate;
+
+    /**
+     * 判明方法
+     */
+    @ExcelProperty(value = "判明方法")
+    private String methodDetermination;
+
+    /**
+     * 排除方法
+     */
+    @ExcelProperty(value = "排除方法")
+    private String methodRectification;
+
+    /**
+     * 发现人
+     */
+    @ExcelProperty(value = "发现人")
+    private String discoveredBy;
+
+    /**
+     * 排故人
+     */
+    @ExcelProperty(value = "排故人")
+    private String rectificationBy;
+
+    /**
+     * 审核人
+     */
+    @ExcelProperty(value = "审核人")
+    private String reviewerBy;
+
+    /**
+     * 排故人数
+     */
+    @ExcelProperty(value = "排故人数")
+    private String rectificationNumber;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remarks;
+
+    /**
+     * 删除标识(1删除 0未删除)
+     */
+    @ExcelProperty(value = "删除标识(1删除 0未删除)")
+    private Integer delFlag;
+
+
+}

+ 56 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/ProductImportVo.java

@@ -0,0 +1,56 @@
+package org.eco.als.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 产品树导入视图对象 als_product_t
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+
+@Data
+@NoArgsConstructor
+public class ProductImportVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * 编号
+     */
+    @ExcelProperty(value = "编号")
+    private Long id;
+
+    /**
+     * 父id
+     */
+    @ExcelProperty(value = "父id")
+    private Long parentId;
+
+    /**
+     * SNS编号
+     */
+    @ExcelProperty(value = "SNS编号")
+    private String snsCode;
+
+    /**
+     * 产品名称
+     */
+    @ExcelProperty(value = "产品名称")
+    private String name;
+
+    /**
+     * 删除标识(1删除 0未删除)
+     */
+    @ExcelProperty(value = "删除标识(1删除 0未删除)")
+    private Integer delFlag;
+
+
+}

+ 54 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/ProductVo.java

@@ -0,0 +1,54 @@
+package org.eco.als.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.eco.als.domain.Product;
+import org.eco.common.orm.core.domain.TreeEntity;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 产品树视图对象 als_product_t
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Data
+@ExcelIgnoreUnannotated
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = Product.class)
+public class ProductVo extends TreeEntity implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 编号
+     */
+    @ExcelProperty(value = "编号")
+    private Long id;
+
+    /**
+     * SNS编号
+     */
+    @ExcelProperty(value = "SNS编号")
+    private String snsCode;
+
+    /**
+     * 产品名称
+     */
+    @ExcelProperty(value = "产品名称")
+    private String name;
+
+    /**
+     * 删除标识(1删除 0未删除)
+     */
+    @ExcelProperty(value = "删除标识(1删除 0未删除)")
+    private Integer delFlag;
+
+
+}

+ 75 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/SortieImportVo.java

@@ -0,0 +1,75 @@
+package org.eco.als.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 架次导入视图对象 als_sortie_t
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+
+@Data
+@NoArgsConstructor
+public class SortieImportVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * 编号
+     */
+    @ExcelProperty(value = "编号")
+    private Long id;
+
+    /**
+     * 架次号
+     */
+    @ExcelProperty(value = "架次号")
+    private String sortieNo;
+
+    /**
+     * 机号
+     */
+    @ExcelProperty(value = "机号")
+    private String aircraftNo;
+
+    /**
+     * 飞行日期
+     */
+    @ExcelProperty(value = "飞行日期")
+    private Date flightDate;
+
+    /**
+     * 开始时间
+     */
+    @ExcelProperty(value = "开始时间")
+    private Date startTime;
+
+    /**
+     * 结束时间
+     */
+    @ExcelProperty(value = "结束时间")
+    private String endTime;
+
+    /**
+     * 飞行时长
+     */
+    @ExcelProperty(value = "飞行时长")
+    private String duration;
+
+    /**
+     * 删除标识(1删除 0未删除)
+     */
+    @ExcelProperty(value = "删除标识(1删除 0未删除)")
+    private Integer delFlag;
+
+
+}

+ 79 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/SortieVo.java

@@ -0,0 +1,79 @@
+package org.eco.als.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.eco.als.domain.Sortie;
+import org.eco.common.orm.core.domain.BaseEntity;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 架次视图对象 als_sortie_t
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Data
+@ExcelIgnoreUnannotated
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = Sortie.class)
+public class SortieVo extends BaseEntity implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 编号
+     */
+    @ExcelProperty(value = "编号")
+    private Long id;
+
+    /**
+     * 架次号
+     */
+    @ExcelProperty(value = "架次号")
+    private String sortieNo;
+
+    /**
+     * 机号
+     */
+    @ExcelProperty(value = "机号")
+    private String aircraftNo;
+
+    /**
+     * 飞行日期
+     */
+    @ExcelProperty(value = "飞行日期")
+    private Date flightDate;
+
+    /**
+     * 开始时间
+     */
+    @ExcelProperty(value = "开始时间")
+    private Date startTime;
+
+    /**
+     * 结束时间
+     */
+    @ExcelProperty(value = "结束时间")
+    private String endTime;
+
+    /**
+     * 飞行时长
+     */
+    @ExcelProperty(value = "飞行时长")
+    private String duration;
+
+    /**
+     * 删除标识(1删除 0未删除)
+     */
+    @ExcelProperty(value = "删除标识(1删除 0未删除)")
+    private Integer delFlag;
+
+
+}

+ 69 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/TechnicalDocImportVo.java

@@ -0,0 +1,69 @@
+package org.eco.als.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 技术资料导入视图对象 als_technical_doc_t
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+
+@Data
+@NoArgsConstructor
+public class TechnicalDocImportVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * 编号
+     */
+    @ExcelProperty(value = "编号")
+    private Long id;
+
+    /**
+     * 名称
+     */
+    @ExcelProperty(value = "名称")
+    private String name;
+
+    /**
+     * 作者
+     */
+    @ExcelProperty(value = "作者")
+    private String author;
+
+    /**
+     * 出版时间
+     */
+    @ExcelProperty(value = "出版时间")
+    private Date publicationDate;
+
+    /**
+     * 资料类型
+     */
+    @ExcelProperty(value = "资料类型")
+    private String type;
+
+    /**
+     * 文件Id
+     */
+    @ExcelProperty(value = "文件Id")
+    private Long ossId;
+
+    /**
+     * 删除标识(1删除 0未删除)
+     */
+    @ExcelProperty(value = "删除标识(1删除 0未删除)")
+    private Integer delFlag;
+
+
+}

+ 73 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/TechnicalDocVo.java

@@ -0,0 +1,73 @@
+package org.eco.als.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.eco.als.domain.TechnicalDoc;
+import org.eco.common.orm.core.domain.BaseEntity;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 技术资料视图对象 als_technical_doc_t
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Data
+@ExcelIgnoreUnannotated
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = TechnicalDoc.class)
+public class TechnicalDocVo extends BaseEntity implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 编号
+     */
+    @ExcelProperty(value = "编号")
+    private Long id;
+
+    /**
+     * 名称
+     */
+    @ExcelProperty(value = "名称")
+    private String name;
+
+    /**
+     * 作者
+     */
+    @ExcelProperty(value = "作者")
+    private String author;
+
+    /**
+     * 出版时间
+     */
+    @ExcelProperty(value = "出版时间")
+    private Date publicationDate;
+
+    /**
+     * 资料类型
+     */
+    @ExcelProperty(value = "资料类型")
+    private String type;
+
+    /**
+     * 文件Id
+     */
+    @ExcelProperty(value = "文件Id")
+    private Long ossId;
+
+    /**
+     * 删除标识(1删除 0未删除)
+     */
+    @ExcelProperty(value = "删除标识(1删除 0未删除)")
+    private Integer delFlag;
+
+
+}

+ 125 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/listener/AircraftImportListener.java

@@ -0,0 +1,125 @@
+package org.eco.als.listener;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import lombok.extern.slf4j.Slf4j;
+import org.eco.als.domain.bo.AircraftBo;
+import org.eco.als.domain.vo.AircraftImportVo;
+import org.eco.als.domain.vo.AircraftVo;
+import org.eco.als.service.IAircraftService;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.core.utils.SpringUtils;
+import org.eco.common.core.utils.ValidatorUtils;
+import org.eco.common.excel.core.ExcelListener;
+import org.eco.common.excel.core.ExcelResult;
+import org.eco.common.excel.entity.ExcelResultRes;
+
+import java.util.List;
+
+/**
+ * 机型机号自定义导入
+ *
+ * @author wgk
+ */
+@Slf4j
+public class AircraftImportListener extends AnalysisEventListener<AircraftImportVo> implements ExcelListener<AircraftImportVo> {
+    private final IAircraftService aircraftService;
+
+    private final Boolean isUpdateSupport;
+    private final LoginUser loginUser;
+    private final StringBuilder successMsg = new StringBuilder();
+    private final StringBuilder failureMsg = new StringBuilder();
+    private int successNum = 0;
+    private int failureNum = 0;
+
+    public AircraftImportListener(Boolean isUpdateSupport, LoginUser loginUser) {
+        this.aircraftService = SpringUtils.getBean(IAircraftService.class);
+        this.isUpdateSupport = isUpdateSupport;
+        this.loginUser = loginUser;
+    }
+
+    @Override
+    public void invoke(AircraftImportVo aircraftVo, AnalysisContext context) {
+        try {
+
+            AircraftBo aircraftBo = BeanUtil.toBean(aircraftVo, AircraftBo.class);
+
+            //TODO:根据某个字段,查询数据库表中是否存在记录,不存在就新增,存在就更新
+            AircraftVo aircraftVo1 = null;
+
+            aircraftVo1 = aircraftService.selectById(aircraftVo.getId());
+            if (ObjectUtil.isNull(aircraftVo1)) {
+                //不存在就新增
+                aircraftBo.setVersion(0);
+                ValidatorUtils.validate(aircraftBo);
+                boolean inserted = aircraftService.insertWithPk(aircraftBo);//树表需要前台传来主键值
+
+                if (inserted) {
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、机型机号 记录导入成功");
+                    return;
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append("、机型机号 记录导入失败");
+                    return;
+                }
+            } else if (isUpdateSupport) {
+                //存在就更新
+                aircraftBo.setId(aircraftVo1.getId());//主键
+                aircraftBo.setVersion(aircraftVo1.getVersion());
+                boolean updated = aircraftService.update(aircraftBo);
+                if (updated) {
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、机型机号 记录更新成功");
+                    return;
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append("、机型机号 记录更新失败");
+                    return;
+                }
+            }
+        } catch (Exception e) {
+            failureNum++;
+            String msg = "<br/>" + failureNum + "、机型机号 记录导入失败:" ;
+            failureMsg.append(msg).append(e.getMessage());
+            log.error(msg, e);
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+        log.info("解析完成");
+    }
+
+    @Override
+    public ExcelResult<AircraftImportVo> getExcelResult() {
+        return new ExcelResult<>() {
+
+            @Override
+            public ExcelResultRes getAnalysis() {
+                if (failureNum > 0 && successNum == 0) {
+                    failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据没有成功导入,错误如下:");
+                    return ExcelResultRes.builder().logInfo(failureMsg.toString()).status("0").build();
+                } else if (failureNum > 0 && successNum > 0) {
+                    failureMsg.insert(0, "很抱歉,部分导入失败!共 " + failureNum + " 条数据没有成功导入,错误如下:");
+                    return ExcelResultRes.builder().logInfo(failureMsg.toString()).status("2").build();
+                } else {
+                    successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+                    return ExcelResultRes.builder().logInfo(successMsg.toString()).status("1").build();
+                }
+            }
+
+            @Override
+            public List<AircraftImportVo> getList() {
+                return null;
+            }
+
+            @Override
+            public List<String> getErrorList() {
+                return null;
+            }
+        };
+    }
+}

+ 125 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/listener/AlsFaultCaseImportListener.java

@@ -0,0 +1,125 @@
+package org.eco.als.listener;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import lombok.extern.slf4j.Slf4j;
+import org.eco.als.domain.bo.AlsFaultCaseBo;
+import org.eco.als.domain.vo.AlsFaultCaseImportVo;
+import org.eco.als.domain.vo.AlsFaultCaseVo;
+import org.eco.als.service.IAlsFaultCaseService;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.core.utils.SpringUtils;
+import org.eco.common.core.utils.ValidatorUtils;
+import org.eco.common.excel.core.ExcelListener;
+import org.eco.common.excel.core.ExcelResult;
+import org.eco.common.excel.entity.ExcelResultRes;
+
+import java.util.List;
+
+/**
+ * 故障案例自定义导入
+ *
+ * @author wgk
+ */
+@Slf4j
+public class AlsFaultCaseImportListener extends AnalysisEventListener<AlsFaultCaseImportVo> implements ExcelListener<AlsFaultCaseImportVo> {
+    private final IAlsFaultCaseService alsFaultCaseService;
+
+    private final Boolean isUpdateSupport;
+    private final LoginUser loginUser;
+    private final StringBuilder successMsg = new StringBuilder();
+    private final StringBuilder failureMsg = new StringBuilder();
+    private int successNum = 0;
+    private int failureNum = 0;
+
+    public AlsFaultCaseImportListener(Boolean isUpdateSupport, LoginUser loginUser) {
+        this.alsFaultCaseService = SpringUtils.getBean(IAlsFaultCaseService.class);
+        this.isUpdateSupport = isUpdateSupport;
+        this.loginUser = loginUser;
+    }
+
+    @Override
+    public void invoke(AlsFaultCaseImportVo alsFaultCaseVo, AnalysisContext context) {
+        try {
+
+            AlsFaultCaseBo alsFaultCaseBo = BeanUtil.toBean(alsFaultCaseVo, AlsFaultCaseBo.class);
+
+            //TODO:根据某个字段,查询数据库表中是否存在记录,不存在就新增,存在就更新
+            AlsFaultCaseVo alsFaultCaseVo1 = null;
+
+            //alsFaultCaseVo1 = alsFaultCaseService.selectBySomefield(alsFaultCaseVo.getSomefield());
+            if (ObjectUtil.isNull(alsFaultCaseVo1)) {
+                //不存在就新增
+                alsFaultCaseBo.setVersion(0);
+                ValidatorUtils.validate(alsFaultCaseBo);
+                boolean inserted = alsFaultCaseService.insert(alsFaultCaseBo);
+
+                if (inserted) {
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、故障案例 记录导入成功");
+                    return;
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append("、故障案例 记录导入失败");
+                    return;
+                }
+            } else if (isUpdateSupport) {
+                //存在就更新
+                alsFaultCaseBo.setId(alsFaultCaseVo1.getId());//主键
+                alsFaultCaseBo.setVersion(alsFaultCaseVo1.getVersion());
+                boolean updated = alsFaultCaseService.update(alsFaultCaseBo);
+                if (updated) {
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、故障案例 记录更新成功");
+                    return;
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append("、故障案例 记录更新失败");
+                    return;
+                }
+            }
+        } catch (Exception e) {
+            failureNum++;
+            String msg = "<br/>" + failureNum + "、故障案例 记录导入失败:" ;
+            failureMsg.append(msg).append(e.getMessage());
+            log.error(msg, e);
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+        log.info("解析完成");
+    }
+
+    @Override
+    public ExcelResult<AlsFaultCaseImportVo> getExcelResult() {
+        return new ExcelResult<>() {
+
+            @Override
+            public ExcelResultRes getAnalysis() {
+                if (failureNum > 0 && successNum == 0) {
+                    failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据没有成功导入,错误如下:");
+                    return ExcelResultRes.builder().logInfo(failureMsg.toString()).status("0").build();
+                } else if (failureNum > 0 && successNum > 0) {
+                    failureMsg.insert(0, "很抱歉,部分导入失败!共 " + failureNum + " 条数据没有成功导入,错误如下:");
+                    return ExcelResultRes.builder().logInfo(failureMsg.toString()).status("2").build();
+                } else {
+                    successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+                    return ExcelResultRes.builder().logInfo(successMsg.toString()).status("1").build();
+                }
+            }
+
+            @Override
+            public List<AlsFaultCaseImportVo> getList() {
+                return null;
+            }
+
+            @Override
+            public List<String> getErrorList() {
+                return null;
+            }
+        };
+    }
+}

+ 125 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/listener/MaintenanceRecordImportListener.java

@@ -0,0 +1,125 @@
+package org.eco.als.listener;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import lombok.extern.slf4j.Slf4j;
+import org.eco.als.domain.bo.MaintenanceRecordBo;
+import org.eco.als.domain.vo.MaintenanceRecordImportVo;
+import org.eco.als.domain.vo.MaintenanceRecordVo;
+import org.eco.als.service.IMaintenanceRecordService;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.core.utils.SpringUtils;
+import org.eco.common.core.utils.ValidatorUtils;
+import org.eco.common.excel.core.ExcelListener;
+import org.eco.common.excel.core.ExcelResult;
+import org.eco.common.excel.entity.ExcelResultRes;
+
+import java.util.List;
+
+/**
+ * 维修记录自定义导入
+ *
+ * @author wgk
+ */
+@Slf4j
+public class MaintenanceRecordImportListener extends AnalysisEventListener<MaintenanceRecordImportVo> implements ExcelListener<MaintenanceRecordImportVo> {
+    private final IMaintenanceRecordService maintenanceRecordService;
+
+    private final Boolean isUpdateSupport;
+    private final LoginUser loginUser;
+    private final StringBuilder successMsg = new StringBuilder();
+    private final StringBuilder failureMsg = new StringBuilder();
+    private int successNum = 0;
+    private int failureNum = 0;
+
+    public MaintenanceRecordImportListener(Boolean isUpdateSupport, LoginUser loginUser) {
+        this.maintenanceRecordService = SpringUtils.getBean(IMaintenanceRecordService.class);
+        this.isUpdateSupport = isUpdateSupport;
+        this.loginUser = loginUser;
+    }
+
+    @Override
+    public void invoke(MaintenanceRecordImportVo maintenanceRecordVo, AnalysisContext context) {
+        try {
+
+            MaintenanceRecordBo maintenanceRecordBo = BeanUtil.toBean(maintenanceRecordVo, MaintenanceRecordBo.class);
+
+            //TODO:根据某个字段,查询数据库表中是否存在记录,不存在就新增,存在就更新
+            MaintenanceRecordVo maintenanceRecordVo1 = null;
+
+            //maintenanceRecordVo1 = maintenanceRecordService.selectBySomefield(maintenanceRecordVo.getSomefield());
+            if (ObjectUtil.isNull(maintenanceRecordVo1)) {
+                //不存在就新增
+                maintenanceRecordBo.setVersion(0);
+                ValidatorUtils.validate(maintenanceRecordBo);
+                boolean inserted = maintenanceRecordService.insert(maintenanceRecordBo);
+
+                if (inserted) {
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、维修记录 记录导入成功");
+                    return;
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append("、维修记录 记录导入失败");
+                    return;
+                }
+            } else if (isUpdateSupport) {
+                //存在就更新
+                maintenanceRecordBo.setId(maintenanceRecordVo1.getId());//主键
+                maintenanceRecordBo.setVersion(maintenanceRecordVo1.getVersion());
+                boolean updated = maintenanceRecordService.update(maintenanceRecordBo);
+                if (updated) {
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、维修记录 记录更新成功");
+                    return;
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append("、维修记录 记录更新失败");
+                    return;
+                }
+            }
+        } catch (Exception e) {
+            failureNum++;
+            String msg = "<br/>" + failureNum + "、维修记录 记录导入失败:" ;
+            failureMsg.append(msg).append(e.getMessage());
+            log.error(msg, e);
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+        log.info("解析完成");
+    }
+
+    @Override
+    public ExcelResult<MaintenanceRecordImportVo> getExcelResult() {
+        return new ExcelResult<>() {
+
+            @Override
+            public ExcelResultRes getAnalysis() {
+                if (failureNum > 0 && successNum == 0) {
+                    failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据没有成功导入,错误如下:");
+                    return ExcelResultRes.builder().logInfo(failureMsg.toString()).status("0").build();
+                } else if (failureNum > 0 && successNum > 0) {
+                    failureMsg.insert(0, "很抱歉,部分导入失败!共 " + failureNum + " 条数据没有成功导入,错误如下:");
+                    return ExcelResultRes.builder().logInfo(failureMsg.toString()).status("2").build();
+                } else {
+                    successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+                    return ExcelResultRes.builder().logInfo(successMsg.toString()).status("1").build();
+                }
+            }
+
+            @Override
+            public List<MaintenanceRecordImportVo> getList() {
+                return null;
+            }
+
+            @Override
+            public List<String> getErrorList() {
+                return null;
+            }
+        };
+    }
+}

+ 125 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/listener/ProductImportListener.java

@@ -0,0 +1,125 @@
+package org.eco.als.listener;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import lombok.extern.slf4j.Slf4j;
+import org.eco.als.domain.bo.ProductBo;
+import org.eco.als.domain.vo.ProductImportVo;
+import org.eco.als.domain.vo.ProductVo;
+import org.eco.als.service.IProductService;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.core.utils.SpringUtils;
+import org.eco.common.core.utils.ValidatorUtils;
+import org.eco.common.excel.core.ExcelListener;
+import org.eco.common.excel.core.ExcelResult;
+import org.eco.common.excel.entity.ExcelResultRes;
+
+import java.util.List;
+
+/**
+ * 产品树自定义导入
+ *
+ * @author wgk
+ */
+@Slf4j
+public class ProductImportListener extends AnalysisEventListener<ProductImportVo> implements ExcelListener<ProductImportVo> {
+    private final IProductService productService;
+
+    private final Boolean isUpdateSupport;
+    private final LoginUser loginUser;
+    private final StringBuilder successMsg = new StringBuilder();
+    private final StringBuilder failureMsg = new StringBuilder();
+    private int successNum = 0;
+    private int failureNum = 0;
+
+    public ProductImportListener(Boolean isUpdateSupport, LoginUser loginUser) {
+        this.productService = SpringUtils.getBean(IProductService.class);
+        this.isUpdateSupport = isUpdateSupport;
+        this.loginUser = loginUser;
+    }
+
+    @Override
+    public void invoke(ProductImportVo productVo, AnalysisContext context) {
+        try {
+
+            ProductBo productBo = BeanUtil.toBean(productVo, ProductBo.class);
+
+            //TODO:根据某个字段,查询数据库表中是否存在记录,不存在就新增,存在就更新
+            ProductVo productVo1 = null;
+
+            productVo1 = productService.selectById(productVo.getId());
+            if (ObjectUtil.isNull(productVo1)) {
+                //不存在就新增
+                productBo.setVersion(0);
+                ValidatorUtils.validate(productBo);
+                boolean inserted = productService.insertWithPk(productBo);//树表需要前台传来主键值
+
+                if (inserted) {
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、产品树 记录导入成功");
+                    return;
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append("、产品树 记录导入失败");
+                    return;
+                }
+            } else if (isUpdateSupport) {
+                //存在就更新
+                productBo.setId(productVo1.getId());//主键
+                productBo.setVersion(productVo1.getVersion());
+                boolean updated = productService.update(productBo);
+                if (updated) {
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、产品树 记录更新成功");
+                    return;
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append("、产品树 记录更新失败");
+                    return;
+                }
+            }
+        } catch (Exception e) {
+            failureNum++;
+            String msg = "<br/>" + failureNum + "、产品树 记录导入失败:" ;
+            failureMsg.append(msg).append(e.getMessage());
+            log.error(msg, e);
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+        log.info("解析完成");
+    }
+
+    @Override
+    public ExcelResult<ProductImportVo> getExcelResult() {
+        return new ExcelResult<>() {
+
+            @Override
+            public ExcelResultRes getAnalysis() {
+                if (failureNum > 0 && successNum == 0) {
+                    failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据没有成功导入,错误如下:");
+                    return ExcelResultRes.builder().logInfo(failureMsg.toString()).status("0").build();
+                } else if (failureNum > 0 && successNum > 0) {
+                    failureMsg.insert(0, "很抱歉,部分导入失败!共 " + failureNum + " 条数据没有成功导入,错误如下:");
+                    return ExcelResultRes.builder().logInfo(failureMsg.toString()).status("2").build();
+                } else {
+                    successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+                    return ExcelResultRes.builder().logInfo(successMsg.toString()).status("1").build();
+                }
+            }
+
+            @Override
+            public List<ProductImportVo> getList() {
+                return null;
+            }
+
+            @Override
+            public List<String> getErrorList() {
+                return null;
+            }
+        };
+    }
+}

+ 125 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/listener/SortieImportListener.java

@@ -0,0 +1,125 @@
+package org.eco.als.listener;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import lombok.extern.slf4j.Slf4j;
+import org.eco.als.domain.bo.SortieBo;
+import org.eco.als.domain.vo.SortieImportVo;
+import org.eco.als.domain.vo.SortieVo;
+import org.eco.als.service.ISortieService;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.core.utils.SpringUtils;
+import org.eco.common.core.utils.ValidatorUtils;
+import org.eco.common.excel.core.ExcelListener;
+import org.eco.common.excel.core.ExcelResult;
+import org.eco.common.excel.entity.ExcelResultRes;
+
+import java.util.List;
+
+/**
+ * 架次自定义导入
+ *
+ * @author wgk
+ */
+@Slf4j
+public class SortieImportListener extends AnalysisEventListener<SortieImportVo> implements ExcelListener<SortieImportVo> {
+    private final ISortieService sortieService;
+
+    private final Boolean isUpdateSupport;
+    private final LoginUser loginUser;
+    private final StringBuilder successMsg = new StringBuilder();
+    private final StringBuilder failureMsg = new StringBuilder();
+    private int successNum = 0;
+    private int failureNum = 0;
+
+    public SortieImportListener(Boolean isUpdateSupport, LoginUser loginUser) {
+        this.sortieService = SpringUtils.getBean(ISortieService.class);
+        this.isUpdateSupport = isUpdateSupport;
+        this.loginUser = loginUser;
+    }
+
+    @Override
+    public void invoke(SortieImportVo sortieVo, AnalysisContext context) {
+        try {
+
+            SortieBo sortieBo = BeanUtil.toBean(sortieVo, SortieBo.class);
+
+            //TODO:根据某个字段,查询数据库表中是否存在记录,不存在就新增,存在就更新
+            SortieVo sortieVo1 = null;
+
+            //sortieVo1 = sortieService.selectBySomefield(sortieVo.getSomefield());
+            if (ObjectUtil.isNull(sortieVo1)) {
+                //不存在就新增
+                sortieBo.setVersion(0);
+                ValidatorUtils.validate(sortieBo);
+                boolean inserted = sortieService.insert(sortieBo);
+
+                if (inserted) {
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、架次 记录导入成功");
+                    return;
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append("、架次 记录导入失败");
+                    return;
+                }
+            } else if (isUpdateSupport) {
+                //存在就更新
+                sortieBo.setId(sortieVo1.getId());//主键
+                sortieBo.setVersion(sortieVo1.getVersion());
+                boolean updated = sortieService.update(sortieBo);
+                if (updated) {
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、架次 记录更新成功");
+                    return;
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append("、架次 记录更新失败");
+                    return;
+                }
+            }
+        } catch (Exception e) {
+            failureNum++;
+            String msg = "<br/>" + failureNum + "、架次 记录导入失败:" ;
+            failureMsg.append(msg).append(e.getMessage());
+            log.error(msg, e);
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+        log.info("解析完成");
+    }
+
+    @Override
+    public ExcelResult<SortieImportVo> getExcelResult() {
+        return new ExcelResult<>() {
+
+            @Override
+            public ExcelResultRes getAnalysis() {
+                if (failureNum > 0 && successNum == 0) {
+                    failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据没有成功导入,错误如下:");
+                    return ExcelResultRes.builder().logInfo(failureMsg.toString()).status("0").build();
+                } else if (failureNum > 0 && successNum > 0) {
+                    failureMsg.insert(0, "很抱歉,部分导入失败!共 " + failureNum + " 条数据没有成功导入,错误如下:");
+                    return ExcelResultRes.builder().logInfo(failureMsg.toString()).status("2").build();
+                } else {
+                    successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+                    return ExcelResultRes.builder().logInfo(successMsg.toString()).status("1").build();
+                }
+            }
+
+            @Override
+            public List<SortieImportVo> getList() {
+                return null;
+            }
+
+            @Override
+            public List<String> getErrorList() {
+                return null;
+            }
+        };
+    }
+}

+ 125 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/listener/TechnicalDocImportListener.java

@@ -0,0 +1,125 @@
+package org.eco.als.listener;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import lombok.extern.slf4j.Slf4j;
+import org.eco.als.domain.bo.TechnicalDocBo;
+import org.eco.als.domain.vo.TechnicalDocImportVo;
+import org.eco.als.domain.vo.TechnicalDocVo;
+import org.eco.als.service.ITechnicalDocService;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.core.utils.SpringUtils;
+import org.eco.common.core.utils.ValidatorUtils;
+import org.eco.common.excel.core.ExcelListener;
+import org.eco.common.excel.core.ExcelResult;
+import org.eco.common.excel.entity.ExcelResultRes;
+
+import java.util.List;
+
+/**
+ * 技术资料自定义导入
+ *
+ * @author wgk
+ */
+@Slf4j
+public class TechnicalDocImportListener extends AnalysisEventListener<TechnicalDocImportVo> implements ExcelListener<TechnicalDocImportVo> {
+    private final ITechnicalDocService technicalDocService;
+
+    private final Boolean isUpdateSupport;
+    private final LoginUser loginUser;
+    private final StringBuilder successMsg = new StringBuilder();
+    private final StringBuilder failureMsg = new StringBuilder();
+    private int successNum = 0;
+    private int failureNum = 0;
+
+    public TechnicalDocImportListener(Boolean isUpdateSupport, LoginUser loginUser) {
+        this.technicalDocService = SpringUtils.getBean(ITechnicalDocService.class);
+        this.isUpdateSupport = isUpdateSupport;
+        this.loginUser = loginUser;
+    }
+
+    @Override
+    public void invoke(TechnicalDocImportVo technicalDocVo, AnalysisContext context) {
+        try {
+
+            TechnicalDocBo technicalDocBo = BeanUtil.toBean(technicalDocVo, TechnicalDocBo.class);
+
+            //TODO:根据某个字段,查询数据库表中是否存在记录,不存在就新增,存在就更新
+            TechnicalDocVo technicalDocVo1 = null;
+
+            //technicalDocVo1 = technicalDocService.selectBySomefield(technicalDocVo.getSomefield());
+            if (ObjectUtil.isNull(technicalDocVo1)) {
+                //不存在就新增
+                technicalDocBo.setVersion(0);
+                ValidatorUtils.validate(technicalDocBo);
+                boolean inserted = technicalDocService.insert(technicalDocBo);
+
+                if (inserted) {
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、技术资料 记录导入成功");
+                    return;
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append("、技术资料 记录导入失败");
+                    return;
+                }
+            } else if (isUpdateSupport) {
+                //存在就更新
+                technicalDocBo.setId(technicalDocVo1.getId());//主键
+                technicalDocBo.setVersion(technicalDocVo1.getVersion());
+                boolean updated = technicalDocService.update(technicalDocBo);
+                if (updated) {
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、技术资料 记录更新成功");
+                    return;
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append("、技术资料 记录更新失败");
+                    return;
+                }
+            }
+        } catch (Exception e) {
+            failureNum++;
+            String msg = "<br/>" + failureNum + "、技术资料 记录导入失败:" ;
+            failureMsg.append(msg).append(e.getMessage());
+            log.error(msg, e);
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+        log.info("解析完成");
+    }
+
+    @Override
+    public ExcelResult<TechnicalDocImportVo> getExcelResult() {
+        return new ExcelResult<>() {
+
+            @Override
+            public ExcelResultRes getAnalysis() {
+                if (failureNum > 0 && successNum == 0) {
+                    failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据没有成功导入,错误如下:");
+                    return ExcelResultRes.builder().logInfo(failureMsg.toString()).status("0").build();
+                } else if (failureNum > 0 && successNum > 0) {
+                    failureMsg.insert(0, "很抱歉,部分导入失败!共 " + failureNum + " 条数据没有成功导入,错误如下:");
+                    return ExcelResultRes.builder().logInfo(failureMsg.toString()).status("2").build();
+                } else {
+                    successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+                    return ExcelResultRes.builder().logInfo(successMsg.toString()).status("1").build();
+                }
+            }
+
+            @Override
+            public List<TechnicalDocImportVo> getList() {
+                return null;
+            }
+
+            @Override
+            public List<String> getErrorList() {
+                return null;
+            }
+        };
+    }
+}

+ 16 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/mapper/AircraftMapper.java

@@ -0,0 +1,16 @@
+package org.eco.als.mapper;
+
+import com.mybatisflex.core.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.eco.als.domain.Aircraft;
+
+/**
+ * 机型机号Mapper接口
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Mapper
+public interface AircraftMapper extends BaseMapper<Aircraft> {
+
+}

+ 16 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/mapper/AlsFaultCaseMapper.java

@@ -0,0 +1,16 @@
+package org.eco.als.mapper;
+
+import com.mybatisflex.core.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.eco.als.domain.AlsFaultCase;
+
+/**
+ * 故障案例Mapper接口
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Mapper
+public interface AlsFaultCaseMapper extends BaseMapper<AlsFaultCase> {
+
+}

+ 16 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/mapper/MaintenanceRecordMapper.java

@@ -0,0 +1,16 @@
+package org.eco.als.mapper;
+
+import com.mybatisflex.core.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.eco.als.domain.MaintenanceRecord;
+
+/**
+ * 维修记录Mapper接口
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Mapper
+public interface MaintenanceRecordMapper extends BaseMapper<MaintenanceRecord> {
+
+}

+ 16 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/mapper/ProductMapper.java

@@ -0,0 +1,16 @@
+package org.eco.als.mapper;
+
+import com.mybatisflex.core.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.eco.als.domain.Product;
+
+/**
+ * 产品树Mapper接口
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Mapper
+public interface ProductMapper extends BaseMapper<Product> {
+
+}

+ 16 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/mapper/SortieMapper.java

@@ -0,0 +1,16 @@
+package org.eco.als.mapper;
+
+import com.mybatisflex.core.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.eco.als.domain.Sortie;
+
+/**
+ * 架次Mapper接口
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Mapper
+public interface SortieMapper extends BaseMapper<Sortie> {
+
+}

+ 16 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/mapper/TechnicalDocMapper.java

@@ -0,0 +1,16 @@
+package org.eco.als.mapper;
+
+import com.mybatisflex.core.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.eco.als.domain.TechnicalDoc;
+
+/**
+ * 技术资料Mapper接口
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Mapper
+public interface TechnicalDocMapper extends BaseMapper<TechnicalDoc> {
+
+}

+ 89 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/service/IAircraftService.java

@@ -0,0 +1,89 @@
+package org.eco.als.service;
+
+import org.eco.als.domain.Aircraft;
+import org.eco.als.domain.bo.AircraftBo;
+import org.eco.als.domain.vo.AircraftVo;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.orm.core.service.IBaseService;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 机型机号Service接口
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+public interface IAircraftService extends IBaseService<Aircraft> {
+    /**
+     * 查询机型机号
+     *
+     * @param id 机型机号主键
+     * @return 机型机号
+     */
+    AircraftVo selectById(Long id);
+
+    /**
+     * 查询机型机号列表
+     *
+     * @param aircraftBo 机型机号Bo
+     * @return 机型机号集合
+     */
+    List<AircraftVo> selectList(AircraftBo aircraftBo);
+
+
+    /**
+     * 新增机型机号
+     *
+     * @param aircraftBo 机型机号Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    boolean insert(AircraftBo aircraftBo);
+
+    /**
+     * 新增机型机号,前台提供主键值,一般用于导入的场合
+     *
+     * @param aircraftBo 机型机号Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    boolean insertWithPk(AircraftBo aircraftBo);
+
+    /**
+     * 修改机型机号
+     *
+     * @param aircraftBo 机型机号Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    boolean update(AircraftBo aircraftBo);
+
+    /**
+     * 批量删除机型机号
+     *
+     * @param ids 需要删除的机型机号主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    boolean deleteByIds(Long[] ids);
+
+    /**
+     * 异步导入
+     *
+     * @param file          导入的文件
+     * @param updateSupport 是否覆盖
+     * @param user          用户上下文信息
+     */
+    @Async
+    void asyncImportData(MultipartFile file, boolean updateSupport, LoginUser user);
+
+    /**
+     * asyncExport 异步导出
+     *
+     * @param listVo    数据列表
+     * @param sheetName 文件名称
+     * @param user      上下文
+     */
+    @Async
+    void asyncExport(List<AircraftVo> listVo, String sheetName, LoginUser user);
+
+}

+ 97 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/service/IAlsFaultCaseService.java

@@ -0,0 +1,97 @@
+package org.eco.als.service;
+
+import org.eco.als.domain.AlsFaultCase;
+import org.eco.als.domain.bo.AlsFaultCaseBo;
+import org.eco.als.domain.vo.AlsFaultCaseVo;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.core.core.page.PageResult;
+import org.eco.common.orm.core.service.IBaseService;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 故障案例Service接口
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+public interface IAlsFaultCaseService extends IBaseService<AlsFaultCase> {
+    /**
+     * 查询故障案例
+     *
+     * @param id 故障案例主键
+     * @return 故障案例
+     */
+    AlsFaultCaseVo selectById(Long id);
+
+    /**
+     * 查询故障案例列表
+     *
+     * @param alsFaultCaseBo 故障案例Bo
+     * @return 故障案例集合
+     */
+    List<AlsFaultCaseVo> selectList(AlsFaultCaseBo alsFaultCaseBo);
+
+    /**
+     * 分页查询故障案例列表
+     *
+     * @param alsFaultCaseBo 故障案例Bo
+     * @return 分页故障案例集合
+     */
+    PageResult<AlsFaultCaseVo> selectPage(AlsFaultCaseBo alsFaultCaseBo);
+
+    /**
+     * 新增故障案例
+     *
+     * @param alsFaultCaseBo 故障案例Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    boolean insert(AlsFaultCaseBo alsFaultCaseBo);
+
+    /**
+     * 新增故障案例,前台提供主键值,一般用于导入的场合
+     *
+     * @param alsFaultCaseBo 故障案例Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    boolean insertWithPk(AlsFaultCaseBo alsFaultCaseBo);
+
+    /**
+     * 修改故障案例
+     *
+     * @param alsFaultCaseBo 故障案例Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    boolean update(AlsFaultCaseBo alsFaultCaseBo);
+
+    /**
+     * 批量删除故障案例
+     *
+     * @param ids 需要删除的故障案例主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    boolean deleteByIds(Long[] ids);
+
+    /**
+     * 异步导入
+     *
+     * @param file          导入的文件
+     * @param updateSupport 是否覆盖
+     * @param user          用户上下文信息
+     */
+    @Async
+    void asyncImportData(MultipartFile file, boolean updateSupport, LoginUser user);
+
+    /**
+     * asyncExport 异步导出
+     *
+     * @param listVo    数据列表
+     * @param sheetName 文件名称
+     * @param user      上下文
+     */
+    @Async
+    void asyncExport(List<AlsFaultCaseVo> listVo, String sheetName, LoginUser user);
+
+}

+ 97 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/service/IMaintenanceRecordService.java

@@ -0,0 +1,97 @@
+package org.eco.als.service;
+
+import org.eco.als.domain.MaintenanceRecord;
+import org.eco.als.domain.bo.MaintenanceRecordBo;
+import org.eco.als.domain.vo.MaintenanceRecordVo;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.core.core.page.PageResult;
+import org.eco.common.orm.core.service.IBaseService;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 维修记录Service接口
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+public interface IMaintenanceRecordService extends IBaseService<MaintenanceRecord> {
+    /**
+     * 查询维修记录
+     *
+     * @param id 维修记录主键
+     * @return 维修记录
+     */
+    MaintenanceRecordVo selectById(Long id);
+
+    /**
+     * 查询维修记录列表
+     *
+     * @param maintenanceRecordBo 维修记录Bo
+     * @return 维修记录集合
+     */
+    List<MaintenanceRecordVo> selectList(MaintenanceRecordBo maintenanceRecordBo);
+
+    /**
+     * 分页查询维修记录列表
+     *
+     * @param maintenanceRecordBo 维修记录Bo
+     * @return 分页维修记录集合
+     */
+    PageResult<MaintenanceRecordVo> selectPage(MaintenanceRecordBo maintenanceRecordBo);
+
+    /**
+     * 新增维修记录
+     *
+     * @param maintenanceRecordBo 维修记录Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    boolean insert(MaintenanceRecordBo maintenanceRecordBo);
+
+    /**
+     * 新增维修记录,前台提供主键值,一般用于导入的场合
+     *
+     * @param maintenanceRecordBo 维修记录Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    boolean insertWithPk(MaintenanceRecordBo maintenanceRecordBo);
+
+    /**
+     * 修改维修记录
+     *
+     * @param maintenanceRecordBo 维修记录Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    boolean update(MaintenanceRecordBo maintenanceRecordBo);
+
+    /**
+     * 批量删除维修记录
+     *
+     * @param ids 需要删除的维修记录主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    boolean deleteByIds(Long[] ids);
+
+    /**
+     * 异步导入
+     *
+     * @param file          导入的文件
+     * @param updateSupport 是否覆盖
+     * @param user          用户上下文信息
+     */
+    @Async
+    void asyncImportData(MultipartFile file, boolean updateSupport, LoginUser user);
+
+    /**
+     * asyncExport 异步导出
+     *
+     * @param listVo    数据列表
+     * @param sheetName 文件名称
+     * @param user      上下文
+     */
+    @Async
+    void asyncExport(List<MaintenanceRecordVo> listVo, String sheetName, LoginUser user);
+
+}

+ 89 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/service/IProductService.java

@@ -0,0 +1,89 @@
+package org.eco.als.service;
+
+import org.eco.als.domain.Product;
+import org.eco.als.domain.bo.ProductBo;
+import org.eco.als.domain.vo.ProductVo;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.orm.core.service.IBaseService;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 产品树Service接口
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+public interface IProductService extends IBaseService<Product> {
+    /**
+     * 查询产品树
+     *
+     * @param id 产品树主键
+     * @return 产品树
+     */
+    ProductVo selectById(Long id);
+
+    /**
+     * 查询产品树列表
+     *
+     * @param productBo 产品树Bo
+     * @return 产品树集合
+     */
+    List<ProductVo> selectList(ProductBo productBo);
+
+
+    /**
+     * 新增产品树
+     *
+     * @param productBo 产品树Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    boolean insert(ProductBo productBo);
+
+    /**
+     * 新增产品树,前台提供主键值,一般用于导入的场合
+     *
+     * @param productBo 产品树Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    boolean insertWithPk(ProductBo productBo);
+
+    /**
+     * 修改产品树
+     *
+     * @param productBo 产品树Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    boolean update(ProductBo productBo);
+
+    /**
+     * 批量删除产品树
+     *
+     * @param ids 需要删除的产品树主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    boolean deleteByIds(Long[] ids);
+
+    /**
+     * 异步导入
+     *
+     * @param file          导入的文件
+     * @param updateSupport 是否覆盖
+     * @param user          用户上下文信息
+     */
+    @Async
+    void asyncImportData(MultipartFile file, boolean updateSupport, LoginUser user);
+
+    /**
+     * asyncExport 异步导出
+     *
+     * @param listVo    数据列表
+     * @param sheetName 文件名称
+     * @param user      上下文
+     */
+    @Async
+    void asyncExport(List<ProductVo> listVo, String sheetName, LoginUser user);
+
+}

+ 97 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/service/ISortieService.java

@@ -0,0 +1,97 @@
+package org.eco.als.service;
+
+import org.eco.als.domain.Sortie;
+import org.eco.als.domain.bo.SortieBo;
+import org.eco.als.domain.vo.SortieVo;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.core.core.page.PageResult;
+import org.eco.common.orm.core.service.IBaseService;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 架次Service接口
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+public interface ISortieService extends IBaseService<Sortie> {
+    /**
+     * 查询架次
+     *
+     * @param id 架次主键
+     * @return 架次
+     */
+    SortieVo selectById(Long id);
+
+    /**
+     * 查询架次列表
+     *
+     * @param sortieBo 架次Bo
+     * @return 架次集合
+     */
+    List<SortieVo> selectList(SortieBo sortieBo);
+
+    /**
+     * 分页查询架次列表
+     *
+     * @param sortieBo 架次Bo
+     * @return 分页架次集合
+     */
+    PageResult<SortieVo> selectPage(SortieBo sortieBo);
+
+    /**
+     * 新增架次
+     *
+     * @param sortieBo 架次Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    boolean insert(SortieBo sortieBo);
+
+    /**
+     * 新增架次,前台提供主键值,一般用于导入的场合
+     *
+     * @param sortieBo 架次Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    boolean insertWithPk(SortieBo sortieBo);
+
+    /**
+     * 修改架次
+     *
+     * @param sortieBo 架次Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    boolean update(SortieBo sortieBo);
+
+    /**
+     * 批量删除架次
+     *
+     * @param ids 需要删除的架次主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    boolean deleteByIds(Long[] ids);
+
+    /**
+     * 异步导入
+     *
+     * @param file          导入的文件
+     * @param updateSupport 是否覆盖
+     * @param user          用户上下文信息
+     */
+    @Async
+    void asyncImportData(MultipartFile file, boolean updateSupport, LoginUser user);
+
+    /**
+     * asyncExport 异步导出
+     *
+     * @param listVo    数据列表
+     * @param sheetName 文件名称
+     * @param user      上下文
+     */
+    @Async
+    void asyncExport(List<SortieVo> listVo, String sheetName, LoginUser user);
+
+}

+ 97 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/service/ITechnicalDocService.java

@@ -0,0 +1,97 @@
+package org.eco.als.service;
+
+import org.eco.als.domain.TechnicalDoc;
+import org.eco.als.domain.bo.TechnicalDocBo;
+import org.eco.als.domain.vo.TechnicalDocVo;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.core.core.page.PageResult;
+import org.eco.common.orm.core.service.IBaseService;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 技术资料Service接口
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+public interface ITechnicalDocService extends IBaseService<TechnicalDoc> {
+    /**
+     * 查询技术资料
+     *
+     * @param id 技术资料主键
+     * @return 技术资料
+     */
+    TechnicalDocVo selectById(Long id);
+
+    /**
+     * 查询技术资料列表
+     *
+     * @param technicalDocBo 技术资料Bo
+     * @return 技术资料集合
+     */
+    List<TechnicalDocVo> selectList(TechnicalDocBo technicalDocBo);
+
+    /**
+     * 分页查询技术资料列表
+     *
+     * @param technicalDocBo 技术资料Bo
+     * @return 分页技术资料集合
+     */
+    PageResult<TechnicalDocVo> selectPage(TechnicalDocBo technicalDocBo);
+
+    /**
+     * 新增技术资料
+     *
+     * @param technicalDocBo 技术资料Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    boolean insert(TechnicalDocBo technicalDocBo);
+
+    /**
+     * 新增技术资料,前台提供主键值,一般用于导入的场合
+     *
+     * @param technicalDocBo 技术资料Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    boolean insertWithPk(TechnicalDocBo technicalDocBo);
+
+    /**
+     * 修改技术资料
+     *
+     * @param technicalDocBo 技术资料Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    boolean update(TechnicalDocBo technicalDocBo);
+
+    /**
+     * 批量删除技术资料
+     *
+     * @param ids 需要删除的技术资料主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    boolean deleteByIds(Long[] ids);
+
+    /**
+     * 异步导入
+     *
+     * @param file          导入的文件
+     * @param updateSupport 是否覆盖
+     * @param user          用户上下文信息
+     */
+    @Async
+    void asyncImportData(MultipartFile file, boolean updateSupport, LoginUser user);
+
+    /**
+     * asyncExport 异步导出
+     *
+     * @param listVo    数据列表
+     * @param sheetName 文件名称
+     * @param user      上下文
+     */
+    @Async
+    void asyncExport(List<TechnicalDocVo> listVo, String sheetName, LoginUser user);
+
+}

+ 190 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/service/impl/AircraftServiceImpl.java

@@ -0,0 +1,190 @@
+package org.eco.als.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.mybatisflex.core.query.QueryWrapper;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.eco.als.domain.Aircraft;
+import org.eco.als.domain.bo.AircraftBo;
+import org.eco.als.domain.vo.AircraftImportVo;
+import org.eco.als.domain.vo.AircraftVo;
+import org.eco.als.listener.AircraftImportListener;
+import org.eco.als.mapper.AircraftMapper;
+import org.eco.als.service.IAircraftService;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.core.utils.MapstructUtils;
+import org.eco.common.core.utils.bean.BeanUtils;
+import org.eco.common.excel.entity.ExcelResultRes;
+import org.eco.common.excel.service.IExcelService;
+import org.eco.common.orm.core.service.impl.BaseServiceImpl;
+import org.eco.system.domain.bo.ImportExportBo;
+import org.eco.system.service.IImportExportService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.eco.als.domain.table.AircraftTableDef.AIRCRAFT;
+
+/**
+ * 机型机号Service业务层处理
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Service
+@Slf4j
+public class AircraftServiceImpl extends BaseServiceImpl<AircraftMapper, Aircraft> implements IAircraftService {
+    @Resource
+    private AircraftMapper aircraftMapper;
+
+    @Resource
+    private IExcelService excelService;
+
+    @Resource
+    private IImportExportService importExportService;
+
+    @Override
+    public QueryWrapper query() {
+        return super.query().from(AIRCRAFT);
+    }
+
+    private QueryWrapper buildQueryWrapper(AircraftBo aircraftBo) {
+        QueryWrapper queryWrapper = super.buildBaseQueryWrapper();
+        queryWrapper.and(AIRCRAFT.NAME.like
+            (aircraftBo.getName()));
+        queryWrapper.orderBy(AIRCRAFT.ORDER_NUM.asc());
+
+        return queryWrapper;
+    }
+
+    /**
+     * 查询机型机号
+     *
+     * @param id 机型机号主键
+     * @return 机型机号
+     */
+    @Override
+    public AircraftVo selectById(Long id) {
+        return this.getOneAs(query().where(AIRCRAFT.ID.eq(id)), AircraftVo.class);
+
+    }
+
+    /**
+     * 查询机型机号列表
+     *
+     * @param aircraftBo 机型机号Bo
+     * @return 机型机号集合
+     */
+    @Override
+    public List<AircraftVo> selectList(AircraftBo aircraftBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(aircraftBo);
+        return this.listAs(queryWrapper, AircraftVo.class);
+    }
+
+
+    /**
+     * 新增机型机号
+     *
+     * @param aircraftBo 机型机号Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    @Override
+    public boolean insert(AircraftBo aircraftBo) {
+        Aircraft aircraft = MapstructUtils.convert(aircraftBo, Aircraft.class);
+
+        return this.save(aircraft);//使用全局配置的雪花算法主键生成器生成ID值
+    }
+
+    /**
+     * 新增机型机号,前台提供主键值,一般用于导入的场合
+     *
+     * @param aircraftBo 机型机号Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    @Override
+    public boolean insertWithPk(AircraftBo aircraftBo) {
+        Aircraft aircraft = MapstructUtils.convert(aircraftBo, Aircraft.class);
+
+        //获取祖级列表字段
+        Long parentId = aircraft.getParentId();
+        if (parentId == 0) {
+            aircraft.setAncestors("0");
+        } else {
+            AircraftVo parentAircraft = selectById(aircraftBo.getParentId());
+            if (ObjectUtil.isNotNull(parentAircraft)) {
+                aircraft.setAncestors(parentAircraft.getAncestors() + "," + parentId);
+            } else {
+                aircraft.setAncestors("0");
+            }
+        }
+
+        return aircraftMapper.insertWithPk(aircraft) > 0;//前台传来主键值
+    }
+
+    /**
+     * 修改机型机号
+     *
+     * @param aircraftBo 机型机号Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    @Override
+    public boolean update(AircraftBo aircraftBo) {
+        Aircraft aircraft = MapstructUtils.convert(aircraftBo, Aircraft.class);
+        if (ObjectUtil.isNotNull(aircraft) && ObjectUtil.isNotNull(aircraft.getId())) {
+            boolean updated = this.updateById(aircraft);
+            return updated;
+        }
+        return false;
+    }
+
+    @Override
+    public void asyncImportData(MultipartFile file, boolean updateSupport, LoginUser loginUser) {
+        ExcelResultRes result;
+        try {
+            String name = file.getOriginalFilename();
+            result = excelService.importExcel(file.getInputStream(), name, AircraftImportVo.class, new AircraftImportListener(updateSupport, loginUser));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        ImportExportBo bo = new ImportExportBo();
+        BeanUtils.copyProperties(result, bo);
+        bo.setUpdateBy(loginUser.getUserId());
+        bo.setCreateBy(loginUser.getUserId());
+        bo.setType("0");
+        boolean flag = importExportService.insert(bo);
+        if (flag) {
+            log.info("异步导入日志写入成功");
+        }
+    }
+
+    @Override
+    public void asyncExport(List<AircraftVo> listVo, String sheetName, LoginUser loginUser) {
+        ExcelResultRes result = excelService.exportExcel(listVo, sheetName, AircraftVo.class);
+        ImportExportBo bo = new ImportExportBo();
+        BeanUtils.copyProperties(result, bo);
+        bo.setUpdateBy(loginUser.getUserId());
+        bo.setCreateBy(loginUser.getUserId());
+        bo.setType("1");
+        boolean flag = importExportService.insert(bo);
+        if (flag) {
+            log.info("异步导出日志写入成功");
+        }
+    }
+
+    /**
+     * 批量删除机型机号
+     *
+     * @param ids 需要删除的机型机号主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    @Transactional
+    @Override
+    public boolean deleteByIds(Long[] ids) {
+        return this.removeByIds(Arrays.asList(ids));
+    }
+
+}

+ 200 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/service/impl/AlsFaultCaseServiceImpl.java

@@ -0,0 +1,200 @@
+package org.eco.als.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.mybatisflex.core.paginate.Page;
+import com.mybatisflex.core.query.QueryWrapper;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.eco.als.domain.AlsFaultCase;
+import org.eco.als.domain.bo.AlsFaultCaseBo;
+import org.eco.als.domain.vo.AlsFaultCaseImportVo;
+import org.eco.als.domain.vo.AlsFaultCaseVo;
+import org.eco.als.listener.AlsFaultCaseImportListener;
+import org.eco.als.mapper.AlsFaultCaseMapper;
+import org.eco.als.service.IAlsFaultCaseService;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.core.core.page.PageResult;
+import org.eco.common.core.utils.MapstructUtils;
+import org.eco.common.core.utils.bean.BeanUtils;
+import org.eco.common.excel.entity.ExcelResultRes;
+import org.eco.common.excel.service.IExcelService;
+import org.eco.common.orm.core.page.PageQuery;
+import org.eco.common.orm.core.service.impl.BaseServiceImpl;
+import org.eco.system.domain.bo.ImportExportBo;
+import org.eco.system.service.IImportExportService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.eco.als.domain.table.AlsFaultCaseTableDef.ALS_FAULT_CASE;
+
+/**
+ * 故障案例Service业务层处理
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Service
+@Slf4j
+public class AlsFaultCaseServiceImpl extends BaseServiceImpl<AlsFaultCaseMapper, AlsFaultCase> implements IAlsFaultCaseService {
+    @Resource
+    private AlsFaultCaseMapper alsFaultCaseMapper;
+
+    @Resource
+    private IExcelService excelService;
+
+    @Resource
+    private IImportExportService importExportService;
+
+    @Override
+    public QueryWrapper query() {
+        return super.query().from(ALS_FAULT_CASE);
+    }
+
+    private QueryWrapper buildQueryWrapper(AlsFaultCaseBo alsFaultCaseBo) {
+        QueryWrapper queryWrapper = super.buildBaseQueryWrapper();
+        queryWrapper.and(ALS_FAULT_CASE.AIRCRAFT_TYPE.eq
+            (alsFaultCaseBo.getAircraftType()));
+        queryWrapper.and(ALS_FAULT_CASE.UNIT_NAME.like
+            (alsFaultCaseBo.getUnitName()));
+        queryWrapper.and(ALS_FAULT_CASE.ITEM_NAME.like
+            (alsFaultCaseBo.getItemName()));
+        queryWrapper.and(ALS_FAULT_CASE.OCCUR_DATE.eq
+            (alsFaultCaseBo.getOccurDate()));
+        queryWrapper.and(ALS_FAULT_CASE.SYSTEM_NAME.like
+            (alsFaultCaseBo.getSystemName()));
+
+        return queryWrapper;
+    }
+
+    /**
+     * 查询故障案例
+     *
+     * @param id 故障案例主键
+     * @return 故障案例
+     */
+    @Override
+    public AlsFaultCaseVo selectById(Long id) {
+        return this.getOneAs(query().where(ALS_FAULT_CASE.ID.eq(id)), AlsFaultCaseVo.class);
+
+    }
+
+    /**
+     * 查询故障案例列表
+     *
+     * @param alsFaultCaseBo 故障案例Bo
+     * @return 故障案例集合
+     */
+    @Override
+    public List<AlsFaultCaseVo> selectList(AlsFaultCaseBo alsFaultCaseBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(alsFaultCaseBo);
+        return this.listAs(queryWrapper, AlsFaultCaseVo.class);
+    }
+
+    /**
+     * 分页查询故障案例列表
+     *
+     * @param alsFaultCaseBo 故障案例Bo
+     * @return 分页故障案例集合
+     */
+    @Override
+    public PageResult<AlsFaultCaseVo> selectPage(AlsFaultCaseBo alsFaultCaseBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(alsFaultCaseBo);
+        Page<AlsFaultCaseVo> page = this.pageAs(PageQuery.build(), queryWrapper, AlsFaultCaseVo.class);
+        return PageResult.build(page);
+    }
+
+    /**
+     * 新增故障案例
+     *
+     * @param alsFaultCaseBo 故障案例Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    @Override
+    public boolean insert(AlsFaultCaseBo alsFaultCaseBo) {
+        AlsFaultCase alsFaultCase = MapstructUtils.convert(alsFaultCaseBo, AlsFaultCase.class);
+
+        return this.save(alsFaultCase);//使用全局配置的雪花算法主键生成器生成ID值
+    }
+
+    /**
+     * 新增故障案例,前台提供主键值,一般用于导入的场合
+     *
+     * @param alsFaultCaseBo 故障案例Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    @Override
+    public boolean insertWithPk(AlsFaultCaseBo alsFaultCaseBo) {
+        AlsFaultCase alsFaultCase = MapstructUtils.convert(alsFaultCaseBo, AlsFaultCase.class);
+
+
+        return alsFaultCaseMapper.insertWithPk(alsFaultCase) > 0;//前台传来主键值
+    }
+
+    /**
+     * 修改故障案例
+     *
+     * @param alsFaultCaseBo 故障案例Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    @Override
+    public boolean update(AlsFaultCaseBo alsFaultCaseBo) {
+        AlsFaultCase alsFaultCase = MapstructUtils.convert(alsFaultCaseBo, AlsFaultCase.class);
+        if (ObjectUtil.isNotNull(alsFaultCase) && ObjectUtil.isNotNull(alsFaultCase.getId())) {
+            boolean updated = this.updateById(alsFaultCase);
+            return updated;
+        }
+        return false;
+    }
+
+    @Override
+    public void asyncImportData(MultipartFile file, boolean updateSupport, LoginUser loginUser) {
+        ExcelResultRes result;
+        try {
+            String name = file.getOriginalFilename();
+            result = excelService.importExcel(file.getInputStream(), name, AlsFaultCaseImportVo.class, new AlsFaultCaseImportListener(updateSupport, loginUser));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        ImportExportBo bo = new ImportExportBo();
+        BeanUtils.copyProperties(result, bo);
+        bo.setUpdateBy(loginUser.getUserId());
+        bo.setCreateBy(loginUser.getUserId());
+        bo.setType("0");
+        boolean flag = importExportService.insert(bo);
+        if (flag) {
+            log.info("异步导入日志写入成功");
+        }
+    }
+
+    @Override
+    public void asyncExport(List<AlsFaultCaseVo> listVo, String sheetName, LoginUser loginUser) {
+        ExcelResultRes result = excelService.exportExcel(listVo, sheetName, AlsFaultCaseVo.class);
+        ImportExportBo bo = new ImportExportBo();
+        BeanUtils.copyProperties(result, bo);
+        bo.setUpdateBy(loginUser.getUserId());
+        bo.setCreateBy(loginUser.getUserId());
+        bo.setType("1");
+        boolean flag = importExportService.insert(bo);
+        if (flag) {
+            log.info("异步导出日志写入成功");
+        }
+    }
+
+    /**
+     * 批量删除故障案例
+     *
+     * @param ids 需要删除的故障案例主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    @Transactional
+    @Override
+    public boolean deleteByIds(Long[] ids) {
+        return this.removeByIds(Arrays.asList(ids));
+    }
+
+}

+ 196 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/service/impl/MaintenanceRecordServiceImpl.java

@@ -0,0 +1,196 @@
+package org.eco.als.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.mybatisflex.core.paginate.Page;
+import com.mybatisflex.core.query.QueryWrapper;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.eco.als.domain.MaintenanceRecord;
+import org.eco.als.domain.bo.MaintenanceRecordBo;
+import org.eco.als.domain.vo.MaintenanceRecordImportVo;
+import org.eco.als.domain.vo.MaintenanceRecordVo;
+import org.eco.als.listener.MaintenanceRecordImportListener;
+import org.eco.als.mapper.MaintenanceRecordMapper;
+import org.eco.als.service.IMaintenanceRecordService;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.core.core.page.PageResult;
+import org.eco.common.core.utils.MapstructUtils;
+import org.eco.common.core.utils.bean.BeanUtils;
+import org.eco.common.excel.entity.ExcelResultRes;
+import org.eco.common.excel.service.IExcelService;
+import org.eco.common.orm.core.page.PageQuery;
+import org.eco.common.orm.core.service.impl.BaseServiceImpl;
+import org.eco.system.domain.bo.ImportExportBo;
+import org.eco.system.service.IImportExportService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.eco.als.domain.table.MaintenanceRecordTableDef.MAINTENANCE_RECORD;
+
+/**
+ * 维修记录Service业务层处理
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Service
+@Slf4j
+public class MaintenanceRecordServiceImpl extends BaseServiceImpl<MaintenanceRecordMapper, MaintenanceRecord> implements IMaintenanceRecordService {
+    @Resource
+    private MaintenanceRecordMapper maintenanceRecordMapper;
+
+    @Resource
+    private IExcelService excelService;
+
+    @Resource
+    private IImportExportService importExportService;
+
+    @Override
+    public QueryWrapper query() {
+        return super.query().from(MAINTENANCE_RECORD);
+    }
+
+    private QueryWrapper buildQueryWrapper(MaintenanceRecordBo maintenanceRecordBo) {
+        QueryWrapper queryWrapper = super.buildBaseQueryWrapper();
+        queryWrapper.and(MAINTENANCE_RECORD.AIRCRAFT_TYPE.eq
+            (maintenanceRecordBo.getAircraftType()));
+        queryWrapper.and(MAINTENANCE_RECORD.AIRCRAFT_NO.eq
+            (maintenanceRecordBo.getAircraftNo()));
+        queryWrapper.and(MAINTENANCE_RECORD.SERIAL_NUMBER.eq
+            (maintenanceRecordBo.getSerialNumber()));
+
+        return queryWrapper;
+    }
+
+    /**
+     * 查询维修记录
+     *
+     * @param id 维修记录主键
+     * @return 维修记录
+     */
+    @Override
+    public MaintenanceRecordVo selectById(Long id) {
+        return this.getOneAs(query().where(MAINTENANCE_RECORD.ID.eq(id)), MaintenanceRecordVo.class);
+
+    }
+
+    /**
+     * 查询维修记录列表
+     *
+     * @param maintenanceRecordBo 维修记录Bo
+     * @return 维修记录集合
+     */
+    @Override
+    public List<MaintenanceRecordVo> selectList(MaintenanceRecordBo maintenanceRecordBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(maintenanceRecordBo);
+        return this.listAs(queryWrapper, MaintenanceRecordVo.class);
+    }
+
+    /**
+     * 分页查询维修记录列表
+     *
+     * @param maintenanceRecordBo 维修记录Bo
+     * @return 分页维修记录集合
+     */
+    @Override
+    public PageResult<MaintenanceRecordVo> selectPage(MaintenanceRecordBo maintenanceRecordBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(maintenanceRecordBo);
+        Page<MaintenanceRecordVo> page = this.pageAs(PageQuery.build(), queryWrapper, MaintenanceRecordVo.class);
+        return PageResult.build(page);
+    }
+
+    /**
+     * 新增维修记录
+     *
+     * @param maintenanceRecordBo 维修记录Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    @Override
+    public boolean insert(MaintenanceRecordBo maintenanceRecordBo) {
+        MaintenanceRecord maintenanceRecord = MapstructUtils.convert(maintenanceRecordBo, MaintenanceRecord.class);
+
+        return this.save(maintenanceRecord);//使用全局配置的雪花算法主键生成器生成ID值
+    }
+
+    /**
+     * 新增维修记录,前台提供主键值,一般用于导入的场合
+     *
+     * @param maintenanceRecordBo 维修记录Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    @Override
+    public boolean insertWithPk(MaintenanceRecordBo maintenanceRecordBo) {
+        MaintenanceRecord maintenanceRecord = MapstructUtils.convert(maintenanceRecordBo, MaintenanceRecord.class);
+
+
+        return maintenanceRecordMapper.insertWithPk(maintenanceRecord) > 0;//前台传来主键值
+    }
+
+    /**
+     * 修改维修记录
+     *
+     * @param maintenanceRecordBo 维修记录Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    @Override
+    public boolean update(MaintenanceRecordBo maintenanceRecordBo) {
+        MaintenanceRecord maintenanceRecord = MapstructUtils.convert(maintenanceRecordBo, MaintenanceRecord.class);
+        if (ObjectUtil.isNotNull(maintenanceRecord) && ObjectUtil.isNotNull(maintenanceRecord.getId())) {
+            boolean updated = this.updateById(maintenanceRecord);
+            return updated;
+        }
+        return false;
+    }
+
+    @Override
+    public void asyncImportData(MultipartFile file, boolean updateSupport, LoginUser loginUser) {
+        ExcelResultRes result;
+        try {
+            String name = file.getOriginalFilename();
+            result = excelService.importExcel(file.getInputStream(), name, MaintenanceRecordImportVo.class, new MaintenanceRecordImportListener(updateSupport, loginUser));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        ImportExportBo bo = new ImportExportBo();
+        BeanUtils.copyProperties(result, bo);
+        bo.setUpdateBy(loginUser.getUserId());
+        bo.setCreateBy(loginUser.getUserId());
+        bo.setType("0");
+        boolean flag = importExportService.insert(bo);
+        if (flag) {
+            log.info("异步导入日志写入成功");
+        }
+    }
+
+    @Override
+    public void asyncExport(List<MaintenanceRecordVo> listVo, String sheetName, LoginUser loginUser) {
+        ExcelResultRes result = excelService.exportExcel(listVo, sheetName, MaintenanceRecordVo.class);
+        ImportExportBo bo = new ImportExportBo();
+        BeanUtils.copyProperties(result, bo);
+        bo.setUpdateBy(loginUser.getUserId());
+        bo.setCreateBy(loginUser.getUserId());
+        bo.setType("1");
+        boolean flag = importExportService.insert(bo);
+        if (flag) {
+            log.info("异步导出日志写入成功");
+        }
+    }
+
+    /**
+     * 批量删除维修记录
+     *
+     * @param ids 需要删除的维修记录主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    @Transactional
+    @Override
+    public boolean deleteByIds(Long[] ids) {
+        return this.removeByIds(Arrays.asList(ids));
+    }
+
+}

+ 192 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/service/impl/ProductServiceImpl.java

@@ -0,0 +1,192 @@
+package org.eco.als.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.mybatisflex.core.query.QueryWrapper;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.eco.als.domain.Product;
+import org.eco.als.domain.bo.ProductBo;
+import org.eco.als.domain.vo.ProductImportVo;
+import org.eco.als.domain.vo.ProductVo;
+import org.eco.als.listener.ProductImportListener;
+import org.eco.als.mapper.ProductMapper;
+import org.eco.als.service.IProductService;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.core.utils.MapstructUtils;
+import org.eco.common.core.utils.bean.BeanUtils;
+import org.eco.common.excel.entity.ExcelResultRes;
+import org.eco.common.excel.service.IExcelService;
+import org.eco.common.orm.core.service.impl.BaseServiceImpl;
+import org.eco.system.domain.bo.ImportExportBo;
+import org.eco.system.service.IImportExportService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.eco.als.domain.table.ProductTableDef.PRODUCT;
+
+/**
+ * 产品树Service业务层处理
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Service
+@Slf4j
+public class ProductServiceImpl extends BaseServiceImpl<ProductMapper, Product> implements IProductService {
+    @Resource
+    private ProductMapper productMapper;
+
+    @Resource
+    private IExcelService excelService;
+
+    @Resource
+    private IImportExportService importExportService;
+
+    @Override
+    public QueryWrapper query() {
+        return super.query().from(PRODUCT);
+    }
+
+    private QueryWrapper buildQueryWrapper(ProductBo productBo) {
+        QueryWrapper queryWrapper = super.buildBaseQueryWrapper();
+        queryWrapper.and(PRODUCT.SNS_CODE.eq
+            (productBo.getSnsCode()));
+        queryWrapper.and(PRODUCT.NAME.like
+            (productBo.getName()));
+        queryWrapper.orderBy(PRODUCT.ORDER_NUM.asc());
+
+        return queryWrapper;
+    }
+
+    /**
+     * 查询产品树
+     *
+     * @param id 产品树主键
+     * @return 产品树
+     */
+    @Override
+    public ProductVo selectById(Long id) {
+        return this.getOneAs(query().where(PRODUCT.ID.eq(id)), ProductVo.class);
+
+    }
+
+    /**
+     * 查询产品树列表
+     *
+     * @param productBo 产品树Bo
+     * @return 产品树集合
+     */
+    @Override
+    public List<ProductVo> selectList(ProductBo productBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(productBo);
+        return this.listAs(queryWrapper, ProductVo.class);
+    }
+
+
+    /**
+     * 新增产品树
+     *
+     * @param productBo 产品树Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    @Override
+    public boolean insert(ProductBo productBo) {
+        Product product = MapstructUtils.convert(productBo, Product.class);
+
+        return this.save(product);//使用全局配置的雪花算法主键生成器生成ID值
+    }
+
+    /**
+     * 新增产品树,前台提供主键值,一般用于导入的场合
+     *
+     * @param productBo 产品树Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    @Override
+    public boolean insertWithPk(ProductBo productBo) {
+        Product product = MapstructUtils.convert(productBo, Product.class);
+
+        //获取祖级列表字段
+        Long parentId = product.getParentId();
+        if (parentId == 0) {
+            product.setAncestors("0");
+        } else {
+            ProductVo parentProduct = selectById(productBo.getParentId());
+            if (ObjectUtil.isNotNull(parentProduct)) {
+                product.setAncestors(parentProduct.getAncestors() + "," + parentId);
+            } else {
+                product.setAncestors("0");
+            }
+        }
+
+        return productMapper.insertWithPk(product) > 0;//前台传来主键值
+    }
+
+    /**
+     * 修改产品树
+     *
+     * @param productBo 产品树Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    @Override
+    public boolean update(ProductBo productBo) {
+        Product product = MapstructUtils.convert(productBo, Product.class);
+        if (ObjectUtil.isNotNull(product) && ObjectUtil.isNotNull(product.getId())) {
+            boolean updated = this.updateById(product);
+            return updated;
+        }
+        return false;
+    }
+
+    @Override
+    public void asyncImportData(MultipartFile file, boolean updateSupport, LoginUser loginUser) {
+        ExcelResultRes result;
+        try {
+            String name = file.getOriginalFilename();
+            result = excelService.importExcel(file.getInputStream(), name, ProductImportVo.class, new ProductImportListener(updateSupport, loginUser));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        ImportExportBo bo = new ImportExportBo();
+        BeanUtils.copyProperties(result, bo);
+        bo.setUpdateBy(loginUser.getUserId());
+        bo.setCreateBy(loginUser.getUserId());
+        bo.setType("0");
+        boolean flag = importExportService.insert(bo);
+        if (flag) {
+            log.info("异步导入日志写入成功");
+        }
+    }
+
+    @Override
+    public void asyncExport(List<ProductVo> listVo, String sheetName, LoginUser loginUser) {
+        ExcelResultRes result = excelService.exportExcel(listVo, sheetName, ProductVo.class);
+        ImportExportBo bo = new ImportExportBo();
+        BeanUtils.copyProperties(result, bo);
+        bo.setUpdateBy(loginUser.getUserId());
+        bo.setCreateBy(loginUser.getUserId());
+        bo.setType("1");
+        boolean flag = importExportService.insert(bo);
+        if (flag) {
+            log.info("异步导出日志写入成功");
+        }
+    }
+
+    /**
+     * 批量删除产品树
+     *
+     * @param ids 需要删除的产品树主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    @Transactional
+    @Override
+    public boolean deleteByIds(Long[] ids) {
+        return this.removeByIds(Arrays.asList(ids));
+    }
+
+}

+ 196 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/service/impl/SortieServiceImpl.java

@@ -0,0 +1,196 @@
+package org.eco.als.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.mybatisflex.core.paginate.Page;
+import com.mybatisflex.core.query.QueryWrapper;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.eco.als.domain.Sortie;
+import org.eco.als.domain.bo.SortieBo;
+import org.eco.als.domain.vo.SortieImportVo;
+import org.eco.als.domain.vo.SortieVo;
+import org.eco.als.listener.SortieImportListener;
+import org.eco.als.mapper.SortieMapper;
+import org.eco.als.service.ISortieService;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.core.core.page.PageResult;
+import org.eco.common.core.utils.MapstructUtils;
+import org.eco.common.core.utils.bean.BeanUtils;
+import org.eco.common.excel.entity.ExcelResultRes;
+import org.eco.common.excel.service.IExcelService;
+import org.eco.common.orm.core.page.PageQuery;
+import org.eco.common.orm.core.service.impl.BaseServiceImpl;
+import org.eco.system.domain.bo.ImportExportBo;
+import org.eco.system.service.IImportExportService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.eco.als.domain.table.SortieTableDef.SORTIE;
+
+/**
+ * 架次Service业务层处理
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Service
+@Slf4j
+public class SortieServiceImpl extends BaseServiceImpl<SortieMapper, Sortie> implements ISortieService {
+    @Resource
+    private SortieMapper sortieMapper;
+
+    @Resource
+    private IExcelService excelService;
+
+    @Resource
+    private IImportExportService importExportService;
+
+    @Override
+    public QueryWrapper query() {
+        return super.query().from(SORTIE);
+    }
+
+    private QueryWrapper buildQueryWrapper(SortieBo sortieBo) {
+        QueryWrapper queryWrapper = super.buildBaseQueryWrapper();
+        queryWrapper.and(SORTIE.SORTIE_NO.eq
+            (sortieBo.getSortieNo()));
+        queryWrapper.and(SORTIE.AIRCRAFT_NO.eq
+            (sortieBo.getAircraftNo()));
+        queryWrapper.and(SORTIE.FLIGHT_DATE.eq
+            (sortieBo.getFlightDate()));
+
+        return queryWrapper;
+    }
+
+    /**
+     * 查询架次
+     *
+     * @param id 架次主键
+     * @return 架次
+     */
+    @Override
+    public SortieVo selectById(Long id) {
+        return this.getOneAs(query().where(SORTIE.ID.eq(id)), SortieVo.class);
+
+    }
+
+    /**
+     * 查询架次列表
+     *
+     * @param sortieBo 架次Bo
+     * @return 架次集合
+     */
+    @Override
+    public List<SortieVo> selectList(SortieBo sortieBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(sortieBo);
+        return this.listAs(queryWrapper, SortieVo.class);
+    }
+
+    /**
+     * 分页查询架次列表
+     *
+     * @param sortieBo 架次Bo
+     * @return 分页架次集合
+     */
+    @Override
+    public PageResult<SortieVo> selectPage(SortieBo sortieBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(sortieBo);
+        Page<SortieVo> page = this.pageAs(PageQuery.build(), queryWrapper, SortieVo.class);
+        return PageResult.build(page);
+    }
+
+    /**
+     * 新增架次
+     *
+     * @param sortieBo 架次Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    @Override
+    public boolean insert(SortieBo sortieBo) {
+        Sortie sortie = MapstructUtils.convert(sortieBo, Sortie.class);
+
+        return this.save(sortie);//使用全局配置的雪花算法主键生成器生成ID值
+    }
+
+    /**
+     * 新增架次,前台提供主键值,一般用于导入的场合
+     *
+     * @param sortieBo 架次Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    @Override
+    public boolean insertWithPk(SortieBo sortieBo) {
+        Sortie sortie = MapstructUtils.convert(sortieBo, Sortie.class);
+
+
+        return sortieMapper.insertWithPk(sortie) > 0;//前台传来主键值
+    }
+
+    /**
+     * 修改架次
+     *
+     * @param sortieBo 架次Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    @Override
+    public boolean update(SortieBo sortieBo) {
+        Sortie sortie = MapstructUtils.convert(sortieBo, Sortie.class);
+        if (ObjectUtil.isNotNull(sortie) && ObjectUtil.isNotNull(sortie.getId())) {
+            boolean updated = this.updateById(sortie);
+            return updated;
+        }
+        return false;
+    }
+
+    @Override
+    public void asyncImportData(MultipartFile file, boolean updateSupport, LoginUser loginUser) {
+        ExcelResultRes result;
+        try {
+            String name = file.getOriginalFilename();
+            result = excelService.importExcel(file.getInputStream(), name, SortieImportVo.class, new SortieImportListener(updateSupport, loginUser));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        ImportExportBo bo = new ImportExportBo();
+        BeanUtils.copyProperties(result, bo);
+        bo.setUpdateBy(loginUser.getUserId());
+        bo.setCreateBy(loginUser.getUserId());
+        bo.setType("0");
+        boolean flag = importExportService.insert(bo);
+        if (flag) {
+            log.info("异步导入日志写入成功");
+        }
+    }
+
+    @Override
+    public void asyncExport(List<SortieVo> listVo, String sheetName, LoginUser loginUser) {
+        ExcelResultRes result = excelService.exportExcel(listVo, sheetName, SortieVo.class);
+        ImportExportBo bo = new ImportExportBo();
+        BeanUtils.copyProperties(result, bo);
+        bo.setUpdateBy(loginUser.getUserId());
+        bo.setCreateBy(loginUser.getUserId());
+        bo.setType("1");
+        boolean flag = importExportService.insert(bo);
+        if (flag) {
+            log.info("异步导出日志写入成功");
+        }
+    }
+
+    /**
+     * 批量删除架次
+     *
+     * @param ids 需要删除的架次主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    @Transactional
+    @Override
+    public boolean deleteByIds(Long[] ids) {
+        return this.removeByIds(Arrays.asList(ids));
+    }
+
+}

+ 198 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/service/impl/TechnicalDocServiceImpl.java

@@ -0,0 +1,198 @@
+package org.eco.als.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.mybatisflex.core.paginate.Page;
+import com.mybatisflex.core.query.QueryWrapper;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.eco.als.domain.TechnicalDoc;
+import org.eco.als.domain.bo.TechnicalDocBo;
+import org.eco.als.domain.vo.TechnicalDocImportVo;
+import org.eco.als.domain.vo.TechnicalDocVo;
+import org.eco.als.listener.TechnicalDocImportListener;
+import org.eco.als.mapper.TechnicalDocMapper;
+import org.eco.als.service.ITechnicalDocService;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.core.core.page.PageResult;
+import org.eco.common.core.utils.MapstructUtils;
+import org.eco.common.core.utils.bean.BeanUtils;
+import org.eco.common.excel.entity.ExcelResultRes;
+import org.eco.common.excel.service.IExcelService;
+import org.eco.common.orm.core.page.PageQuery;
+import org.eco.common.orm.core.service.impl.BaseServiceImpl;
+import org.eco.system.domain.bo.ImportExportBo;
+import org.eco.system.service.IImportExportService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.eco.als.domain.table.TechnicalDocTableDef.TECHNICAL_DOC;
+
+/**
+ * 技术资料Service业务层处理
+ *
+ * @author wgk
+ * @date 2024-07-18
+ */
+@Service
+@Slf4j
+public class TechnicalDocServiceImpl extends BaseServiceImpl<TechnicalDocMapper, TechnicalDoc> implements ITechnicalDocService {
+    @Resource
+    private TechnicalDocMapper technicalDocMapper;
+
+    @Resource
+    private IExcelService excelService;
+
+    @Resource
+    private IImportExportService importExportService;
+
+    @Override
+    public QueryWrapper query() {
+        return super.query().from(TECHNICAL_DOC);
+    }
+
+    private QueryWrapper buildQueryWrapper(TechnicalDocBo technicalDocBo) {
+        QueryWrapper queryWrapper = super.buildBaseQueryWrapper();
+        queryWrapper.and(TECHNICAL_DOC.NAME.like
+            (technicalDocBo.getName()));
+        queryWrapper.and(TECHNICAL_DOC.AUTHOR.eq
+            (technicalDocBo.getAuthor()));
+        queryWrapper.and(TECHNICAL_DOC.PUBLICATION_DATE.eq
+            (technicalDocBo.getPublicationDate()));
+        queryWrapper.and(TECHNICAL_DOC.TYPE.eq
+            (technicalDocBo.getType()));
+
+        return queryWrapper;
+    }
+
+    /**
+     * 查询技术资料
+     *
+     * @param id 技术资料主键
+     * @return 技术资料
+     */
+    @Override
+    public TechnicalDocVo selectById(Long id) {
+        return this.getOneAs(query().where(TECHNICAL_DOC.ID.eq(id)), TechnicalDocVo.class);
+
+    }
+
+    /**
+     * 查询技术资料列表
+     *
+     * @param technicalDocBo 技术资料Bo
+     * @return 技术资料集合
+     */
+    @Override
+    public List<TechnicalDocVo> selectList(TechnicalDocBo technicalDocBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(technicalDocBo);
+        return this.listAs(queryWrapper, TechnicalDocVo.class);
+    }
+
+    /**
+     * 分页查询技术资料列表
+     *
+     * @param technicalDocBo 技术资料Bo
+     * @return 分页技术资料集合
+     */
+    @Override
+    public PageResult<TechnicalDocVo> selectPage(TechnicalDocBo technicalDocBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(technicalDocBo);
+        Page<TechnicalDocVo> page = this.pageAs(PageQuery.build(), queryWrapper, TechnicalDocVo.class);
+        return PageResult.build(page);
+    }
+
+    /**
+     * 新增技术资料
+     *
+     * @param technicalDocBo 技术资料Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    @Override
+    public boolean insert(TechnicalDocBo technicalDocBo) {
+        TechnicalDoc technicalDoc = MapstructUtils.convert(technicalDocBo, TechnicalDoc.class);
+
+        return this.save(technicalDoc);//使用全局配置的雪花算法主键生成器生成ID值
+    }
+
+    /**
+     * 新增技术资料,前台提供主键值,一般用于导入的场合
+     *
+     * @param technicalDocBo 技术资料Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    @Override
+    public boolean insertWithPk(TechnicalDocBo technicalDocBo) {
+        TechnicalDoc technicalDoc = MapstructUtils.convert(technicalDocBo, TechnicalDoc.class);
+
+
+        return technicalDocMapper.insertWithPk(technicalDoc) > 0;//前台传来主键值
+    }
+
+    /**
+     * 修改技术资料
+     *
+     * @param technicalDocBo 技术资料Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    @Override
+    public boolean update(TechnicalDocBo technicalDocBo) {
+        TechnicalDoc technicalDoc = MapstructUtils.convert(technicalDocBo, TechnicalDoc.class);
+        if (ObjectUtil.isNotNull(technicalDoc) && ObjectUtil.isNotNull(technicalDoc.getId())) {
+            boolean updated = this.updateById(technicalDoc);
+            return updated;
+        }
+        return false;
+    }
+
+    @Override
+    public void asyncImportData(MultipartFile file, boolean updateSupport, LoginUser loginUser) {
+        ExcelResultRes result;
+        try {
+            String name = file.getOriginalFilename();
+            result = excelService.importExcel(file.getInputStream(), name, TechnicalDocImportVo.class, new TechnicalDocImportListener(updateSupport, loginUser));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        ImportExportBo bo = new ImportExportBo();
+        BeanUtils.copyProperties(result, bo);
+        bo.setUpdateBy(loginUser.getUserId());
+        bo.setCreateBy(loginUser.getUserId());
+        bo.setType("0");
+        boolean flag = importExportService.insert(bo);
+        if (flag) {
+            log.info("异步导入日志写入成功");
+        }
+    }
+
+    @Override
+    public void asyncExport(List<TechnicalDocVo> listVo, String sheetName, LoginUser loginUser) {
+        ExcelResultRes result = excelService.exportExcel(listVo, sheetName, TechnicalDocVo.class);
+        ImportExportBo bo = new ImportExportBo();
+        BeanUtils.copyProperties(result, bo);
+        bo.setUpdateBy(loginUser.getUserId());
+        bo.setCreateBy(loginUser.getUserId());
+        bo.setType("1");
+        boolean flag = importExportService.insert(bo);
+        if (flag) {
+            log.info("异步导出日志写入成功");
+        }
+    }
+
+    /**
+     * 批量删除技术资料
+     *
+     * @param ids 需要删除的技术资料主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    @Transactional
+    @Override
+    public boolean deleteByIds(Long[] ids) {
+        return this.removeByIds(Arrays.asList(ids));
+    }
+
+}

+ 7 - 0
als-modules/agile-assurance/src/main/resources/mapper/als/AircraftMapper.xml

@@ -0,0 +1,7 @@
+<?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.eco.als.mapper.AircraftMapper">
+
+</mapper>

+ 7 - 0
als-modules/agile-assurance/src/main/resources/mapper/als/AlsFaultCaseMapper.xml

@@ -0,0 +1,7 @@
+<?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.eco.als.mapper.AlsFaultCaseMapper">
+
+</mapper>

+ 7 - 0
als-modules/agile-assurance/src/main/resources/mapper/als/MaintenanceRecordMapper.xml

@@ -0,0 +1,7 @@
+<?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.eco.als.mapper.MaintenanceRecordMapper">
+
+</mapper>

+ 7 - 0
als-modules/agile-assurance/src/main/resources/mapper/als/ProductMapper.xml

@@ -0,0 +1,7 @@
+<?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.eco.als.mapper.ProductMapper">
+
+</mapper>

+ 7 - 0
als-modules/agile-assurance/src/main/resources/mapper/als/SortieMapper.xml

@@ -0,0 +1,7 @@
+<?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.eco.als.mapper.SortieMapper">
+
+</mapper>

+ 7 - 0
als-modules/agile-assurance/src/main/resources/mapper/als/TechnicalDocMapper.xml

@@ -0,0 +1,7 @@
+<?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.eco.als.mapper.TechnicalDocMapper">
+
+</mapper>

+ 3 - 0
als-modules/generator/src/main/java/org/eco/generator/domain/GenTable.java

@@ -2,6 +2,7 @@ package org.eco.generator.domain;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.mybatisflex.annotation.RelationOneToMany;
 import org.eco.common.core.constant.GenConstants;
 import org.eco.common.core.utils.StringUtils;
 import com.mybatisflex.annotation.Column;
@@ -124,6 +125,8 @@ public class GenTable implements Serializable {
      * 表列信息
      */
     @Valid
+    @Column(ignore = true)
+    @RelationOneToMany(selfField = "tableId", targetField = "tableId",orderBy = "sort")
     private List<GenTableColumn> columns;
 
     /**

+ 2 - 14
als-modules/generator/src/main/java/org/eco/generator/service/GenTableServiceImpl.java

@@ -1,6 +1,7 @@
 package org.eco.generator.service;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
@@ -113,18 +114,6 @@ public class GenTableServiceImpl extends BaseServiceImpl<GenTableMapper, GenTabl
      */
     @Override
     public GenTable selectGenTableById(Long id) {
-        /*SELECT t.table_id, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, t.tpl_category, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.gen_type, t.gen_path, t.options, t.remark,
-        c.column_id, c.column_name, c.column_comment, c.column_type, c.java_type, c.java_field, c.is_pk, c.is_increment, c.is_required, c.is_insert, c.is_edit, c.is_list, c.is_query, c.query_type, c.html_type, c.dict_type, c.sort
-        FROM gen_table t
-        LEFT JOIN gen_table_column c ON t.table_id = c.table_id
-        where t.table_id = #{tableId} order by c.sort*/
-
-//        QueryWrapper queryWrapper = QueryWrapper.create()
-//            .from(GEN_TABLE)
-//            .leftJoin(GEN_TABLE_COLUMN).on(GEN_TABLE_COLUMN.TABLE_ID.eq(GEN_TABLE.TABLE_ID))
-//            .where(GEN_TABLE.TABLE_ID.eq(id))
-//            .orderBy(GEN_TABLE_COLUMN.SORT.asc());
-//        GenTable genTable = this.getOne(queryWrapper);
         GenTable genTable = genTableMapper.selectOneWithRelationsById(id);
         setTableFromOptions(genTable);
         return genTable;
@@ -566,10 +555,9 @@ public class GenTableServiceImpl extends BaseServiceImpl<GenTableMapper, GenTabl
      * @param table table
      */
     private void setMenuIds(GenTable table) {
-        String nowStr = DateUtils.dateTimeNow();
         List<Long> menuIds = new ArrayList<>();
         for (int i = 0; i < 7; i++) {
-            menuIds.add(Long.valueOf(nowStr + "0" + i));
+            menuIds.add(Long.valueOf(IdUtil.getSnowflakeNextIdStr()));
         }
         table.setMenuIds(menuIds);
     }

+ 2 - 2
als-modules/generator/src/main/resources/generator.yml

@@ -3,10 +3,10 @@ gen:
   # 作者
   author: wgk
   # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
-  packageName: org.eco.demo
+  packageName: org.eco.als
   # 自动去除表前后缀,默认是false
   autoRemove: true
   # 表前缀(生成类名不会包含表前缀,多个用逗号分隔)
-  tablePrefix: sys_,eco_
+  tablePrefix: sys_,eco_,als_
   # 表后缀(生成类名不会包含表前缀,多个用逗号分隔)
   tableSuffix: _t

+ 19 - 4
als-modules/generator/src/main/resources/vm/java/controller.java.vm

@@ -8,16 +8,17 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.eco.common.core.core.domain.CommonResult;
-import org.eco.common.excel.utils.ExcelUtil;
 import org.eco.common.log.annotation.Log;
 import org.eco.common.log.enums.BusinessType;
+import org.eco.common.security.utils.LoginHelper;
+import org.eco.common.core.core.domain.model.LoginUser;
 import org.eco.common.web.annotation.RepeatSubmit;
 import org.eco.common.web.core.BaseController;
 import jakarta.annotation.Resource;
 import ${packageName}.domain.vo.${ClassName}Vo;
 import ${packageName}.domain.bo.${ClassName}Bo;
 import ${packageName}.service.I${ClassName}Service;
-
+import org.springframework.web.multipart.MultipartFile;
 #if($table.crud || $table.sub)
 import org.eco.common.core.core.page.PageResult;
 #elseif($table.tree)
@@ -59,9 +60,23 @@ public class ${ClassName}Controller extends BaseController {
     @SaCheckPermission("${permissionPrefix}:export")
     @Log(title = "${functionName}", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
-    public void export(HttpServletResponse response, ${ClassName}Bo ${className}Bo) {
+    public CommonResult<Void> export(HttpServletResponse response, ${ClassName}Bo ${className}Bo) {
+        LoginUser loginUser = LoginHelper.getLoginUser();
         List<${ClassName}Vo> list = ${className}Service.selectList(${className}Bo);
-        ExcelUtil.exportExcel(list, "${functionName}", ${ClassName}Vo.class, response);
+        ${className}Service.asyncExport(list, "${functionName}", loginUser);
+        return CommonResult.success();
+    }
+
+    /**
+     * 导入${functionName}列表
+     */
+    @Log(title = "${functionName}", businessType = BusinessType.IMPORT)
+    @SaCheckPermission("${permissionPrefix}:import")
+    @PostMapping("/importData")
+    public CommonResult<Void> importData(MultipartFile file, boolean updateSupport) {
+        LoginUser loginUser = LoginHelper.getLoginUser();
+        ${className}Service.asyncImportData(file, updateSupport, loginUser);
+        return CommonResult.success();
     }
 
     /**

+ 13 - 6
als-modules/generator/src/main/resources/vm/java/listener.java.vm

@@ -9,6 +9,8 @@ import org.eco.common.core.utils.SpringUtils;
 import org.eco.common.core.utils.ValidatorUtils;
 import org.eco.common.excel.core.ExcelListener;
 import org.eco.common.excel.core.ExcelResult;
+import org.eco.common.excel.entity.ExcelResultRes;
+import org.eco.common.core.core.domain.model.LoginUser;
 import ${packageName}.domain.bo.${ClassName}Bo;
 import ${packageName}.domain.vo.${ClassName}ImportVo;
 import ${packageName}.domain.vo.${ClassName}Vo;
@@ -27,14 +29,16 @@ public class ${ClassName}ImportListener extends AnalysisEventListener<${ClassNam
     private final I${ClassName}Service ${className}Service;
 
     private final Boolean isUpdateSupport;
+    private final LoginUser loginUser;
     private int successNum = 0;
     private int failureNum = 0;
     private final StringBuilder successMsg = new StringBuilder();
     private final StringBuilder failureMsg = new StringBuilder();
 
-    public ${ClassName}ImportListener(Boolean isUpdateSupport) {
+    public ${ClassName}ImportListener(Boolean isUpdateSupport, LoginUser loginUser) {
         this.${className}Service = SpringUtils.getBean(I${ClassName}Service.class);
         this.isUpdateSupport = isUpdateSupport;
+        this.loginUser = loginUser;
     }
 
     @Override
@@ -95,7 +99,7 @@ public class ${ClassName}ImportListener extends AnalysisEventListener<${ClassNam
 
     @Override
     public void doAfterAllAnalysed(AnalysisContext context) {
-
+        log.info("解析完成");
     }
 
     @Override
@@ -103,14 +107,17 @@ public class ${ClassName}ImportListener extends AnalysisEventListener<${ClassNam
         return new ExcelResult<>() {
 
             @Override
-            public String getAnalysis() {
-                if (failureNum > 0) {
+            public ExcelResultRes getAnalysis() {
+                if (failureNum > 0 && successNum == 0) {
                     failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据没有成功导入,错误如下:");
-                    throw new BusinessException(failureMsg.toString());
+                    return ExcelResultRes.builder().logInfo(failureMsg.toString()).status("0").build();
+                } else if (failureNum > 0 && successNum > 0) {
+                    failureMsg.insert(0, "很抱歉,部分导入失败!共 " + failureNum + " 条数据没有成功导入,错误如下:");
+                    return ExcelResultRes.builder().logInfo(failureMsg.toString()).status("2").build();
                 } else {
                     successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+                    return ExcelResultRes.builder().logInfo(successMsg.toString()).status("1").build();
                 }
-                return successMsg.toString();
             }
 
             @Override

+ 31 - 1
als-modules/generator/src/main/resources/vm/java/service.java.vm

@@ -1,11 +1,13 @@
 package ${packageName}.service;
 
 import java.util.List;
-
+import org.eco.common.core.core.domain.model.LoginUser;
 import ${packageName}.domain.${ClassName};
 import ${packageName}.domain.vo.${ClassName}Vo;
 import ${packageName}.domain.bo.${ClassName}Bo;
 import org.eco.common.orm.core.service.IBaseService;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.web.multipart.MultipartFile;
 #if($table.crud || $table.sub)
 import org.eco.common.core.core.page.PageResult;
 #end
@@ -51,6 +53,14 @@ public interface I${ClassName}Service extends IBaseService<${ClassName}> {
      */
     boolean insert(${ClassName}Bo ${className}Bo);
 
+    /**
+     * 新增${functionName},前台提供主键值,一般用于导入的场合
+     *
+     * @param ${className}Bo ${functionName}Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    boolean insertWithPk(${ClassName}Bo ${className}Bo);
+
     /**
      * 修改${functionName}
      *
@@ -67,4 +77,24 @@ public interface I${ClassName}Service extends IBaseService<${ClassName}> {
      */
     boolean deleteByIds(${pkColumn.javaType}[] ${pkColumn.javaField}s);
 
+    /**
+     * 异步导入
+     *
+     * @param file          导入的文件
+     * @param updateSupport 是否覆盖
+     * @param user          用户上下文信息
+     */
+    @Async
+    void asyncImportData(MultipartFile file, boolean updateSupport, LoginUser user);
+
+    /**
+     * asyncExport 异步导出
+     *
+     * @param listVo    数据列表
+     * @param sheetName 文件名称
+     * @param user      上下文
+     */
+    @Async
+    void asyncExport(List<${ClassName}Vo> listVo, String sheetName, LoginUser user);
+
 }

+ 94 - 1
als-modules/generator/src/main/resources/vm/java/serviceImpl.java.vm

@@ -6,8 +6,15 @@ import java.util.List;
 import cn.hutool.core.util.ObjectUtil;
 import com.mybatisflex.core.paginate.Page;
 import com.mybatisflex.core.query.QueryWrapper;
+import lombok.extern.slf4j.Slf4j;
+import org.eco.common.core.core.domain.model.LoginUser;
+import org.eco.common.excel.entity.ExcelResultRes;
+import org.eco.common.excel.service.IExcelService;
+import org.eco.common.core.utils.bean.BeanUtils;
 import org.eco.common.core.utils.MapstructUtils;
+import org.eco.system.service.IImportExportService;
 import org.eco.common.core.utils.StringUtils;
+import org.eco.system.domain.bo.ImportExportBo;
 import org.eco.common.orm.core.page.PageQuery;
 import org.eco.common.core.core.page.PageResult;
 import org.eco.common.orm.core.service.impl.BaseServiceImpl;
@@ -19,7 +26,9 @@ import org.eco.common.orm.core.service.impl.BaseServiceImpl;
 import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-#if($table.sub)
+import org.springframework.web.multipart.MultipartFile;
+import java.io.IOException;
+    #if($table.sub)
 import java.util.ArrayList;
 import ${packageName}.domain.${subClassName};
 import ${packageName}.mapper.${subClassName}Mapper;
@@ -29,6 +38,8 @@ import ${packageName}.mapper.${ClassName}Mapper;
 import ${packageName}.domain.${ClassName};
 import ${packageName}.domain.bo.${ClassName}Bo;
 import ${packageName}.domain.vo.${ClassName}Vo;
+import ${packageName}.domain.vo.${ClassName}ImportVo;
+import ${packageName}.listener.${ClassName}ImportListener;
 import ${packageName}.service.I${ClassName}Service;
 import static ${packageName}.domain.table.${ClassName}TableDef.${CapitalUnderScoreClassName};
 
@@ -39,9 +50,16 @@ import static ${packageName}.domain.table.${ClassName}TableDef.${CapitalUnderSco
  * @date ${datetime}
  */
 @Service
+@Slf4j
 public class ${ClassName}ServiceImpl extends BaseServiceImpl<${ClassName}Mapper, ${ClassName}> implements I${ClassName}Service {
     @Resource
     private ${ClassName}Mapper ${className}Mapper;
+
+    @Resource
+    private IExcelService excelService;
+
+    @Resource
+    private IImportExportService importExportService;
     #if($table.sub)
     @Resource
     private ${subClassName}Mapper ${subclassName}Mapper;
@@ -155,6 +173,46 @@ public class ${ClassName}ServiceImpl extends BaseServiceImpl<${ClassName}Mapper,
     #end
     }
 
+    /**
+     * 新增${functionName},前台提供主键值,一般用于导入的场合
+     *
+     * @param ${className}Bo ${functionName}Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+        #if($table.sub)
+        @Transactional
+        #end
+    @Override
+    public boolean insertWithPk(${ClassName}Bo ${className}Bo)
+    {
+        ${ClassName} ${className} = MapstructUtils.convert(${className}Bo, ${ClassName}.class);
+
+        #if($table.tree)
+            //获取祖级列表字段
+            Long parentId = ${className}.getParentId();
+            if (parentId == 0) {
+                ${className}.setAncestors("0");
+            } else {
+                    ${ClassName}Vo parent${ClassName} = selectById(${className}Bo.getParentId());
+                if (ObjectUtil.isNotNull(parent${ClassName})) {
+                    ${className}.setAncestors(parent${ClassName}.getAncestors()+"," +parentId);
+                } else {
+                    ${className}.setAncestors("0");
+                }
+            }
+        #end
+
+        #if($table.sub)
+            boolean inserted = ${className}Mapper.insertWithPk(${className}) > 0;//前台传来主键值
+            if (inserted && ObjectUtil.isNotNull(${className})) {
+                return insert${subClassName}(${className});
+            }
+            return false;
+        #else
+            return ${className}Mapper.insertWithPk(${className}) > 0;//前台传来主键值
+        #end
+    }
+
     /**
      * 修改${functionName}
      *
@@ -183,6 +241,40 @@ public class ${ClassName}ServiceImpl extends BaseServiceImpl<${ClassName}Mapper,
         return false;
     }
 
+    @Override
+    public void asyncImportData(MultipartFile file, boolean updateSupport, LoginUser loginUser) {
+        ExcelResultRes result;
+        try {
+            String name = file.getOriginalFilename();
+            result = excelService.importExcel(file.getInputStream(), name, ${ClassName}ImportVo.class, new ${ClassName}ImportListener(updateSupport, loginUser));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        ImportExportBo bo = new ImportExportBo();
+        BeanUtils.copyProperties(result, bo);
+        bo.setUpdateBy(loginUser.getUserId());
+        bo.setCreateBy(loginUser.getUserId());
+        bo.setType("0");
+        boolean flag = importExportService.insert(bo);
+        if (flag) {
+            log.info("异步导入日志写入成功");
+        }
+    }
+
+    @Override
+    public void asyncExport(List<${ClassName}Vo> listVo, String sheetName, LoginUser loginUser) {
+        ExcelResultRes result = excelService.exportExcel(listVo, sheetName, ${ClassName}Vo.class);
+        ImportExportBo bo = new ImportExportBo();
+        BeanUtils.copyProperties(result, bo);
+        bo.setUpdateBy(loginUser.getUserId());
+        bo.setCreateBy(loginUser.getUserId());
+        bo.setType("1");
+        boolean flag = importExportService.insert(bo);
+        if (flag) {
+            log.info("异步导出日志写入成功");
+        }
+    }
+
     /**
      * 批量删除${functionName}
      *
@@ -221,5 +313,6 @@ public class ${ClassName}ServiceImpl extends BaseServiceImpl<${ClassName}Mapper,
         }
         return true;
     }
+
     #end
 }

+ 12 - 12
als-modules/generator/src/main/resources/vm/sql/dm8/sql.vm

@@ -1,19 +1,19 @@
 -- 菜单 SQL
-insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
-values(${table.menuIds[0]}, '${functionName}', ${parentMenuId}, '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '', 1, now(), 1, null, '${functionName}菜单');
+insert into als.sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(${table.menuIds[0]}, '${functionName}', ${parentMenuId}, '1', '${businessName}', '${moduleName}/${businessName}/index', 0, 1, 'C', '1', '0', '${permissionPrefix}:list', '', 1, now(), 1, null, '${functionName}菜单');
 
 -- 按钮 SQL
-insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
-values(${table.menuIds[1]}, '${functionName}查询', ${table.menuIds[0]}, '1',  '', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query',        '', 1, now(), 1, null, '');
+insert into als.sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(${table.menuIds[1]}, '${functionName}查询', ${table.menuIds[0]}, '1',  '', '', 0, 1, 'F', '1', '1', '${permissionPrefix}:query',        '', 1, now(), 1, null, '');
 
-insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
-values(${table.menuIds[2]}, '${functionName}新增', ${table.menuIds[0]}, '2',  '', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add',          '', 1, now(), 1, null, '');
+insert into als.sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(${table.menuIds[2]}, '${functionName}新增', ${table.menuIds[0]}, '2',  '', '', 0, 1, 'F', '1', '1', '${permissionPrefix}:add',          '', 1, now(), 1, null, '');
 
-insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
-values(${table.menuIds[3]}, '${functionName}修改', ${table.menuIds[0]}, '3',  '', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit',         '', 1, now(), 1, null, '');
+insert into als.sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(${table.menuIds[3]}, '${functionName}修改', ${table.menuIds[0]}, '3',  '', '', 0, 1, 'F', '1', '1', '${permissionPrefix}:edit',         '', 1, now(), 1, null, '');
 
-insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
-values(${table.menuIds[4]}, '${functionName}删除', ${table.menuIds[0]}, '4',  '', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove',       '', 1, now(), 1, null, '');
+insert into als.sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(${table.menuIds[4]}, '${functionName}删除', ${table.menuIds[0]}, '4',  '', '', 0, 1, 'F', '1', '1', '${permissionPrefix}:remove',       '', 1, now(), 1, null, '');
 
-insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
-values(${table.menuIds[5]}, '${functionName}导出', ${table.menuIds[0]}, '5',  '', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export',       '', 1, now(), 1, null, '');
+insert into als.sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(${table.menuIds[5]}, '${functionName}导出', ${table.menuIds[0]}, '5',  '', '', 0, 1, 'F', '1', '1', '${permissionPrefix}:export',       '', 1, now(), 1, null, '');

+ 1 - 0
als-modules/pom.xml

@@ -14,6 +14,7 @@
         <module>generator</module>
         <module>job</module>
         <module>system</module>
+        <module>agile-assurance</module>
     </modules>
 
     <artifactId>als-modules</artifactId>

+ 5 - 0
als-start/pom.xml

@@ -68,6 +68,11 @@
             <groupId>org.eco</groupId>
             <artifactId>system</artifactId>
         </dependency>
+        <!-- 灵巧保障模块-->
+        <dependency>
+            <groupId>org.eco</groupId>
+            <artifactId>agile-assurance</artifactId>
+        </dependency>
 
         <!-- PowerJob定时任务处理器-->
         <dependency>

+ 2 - 2
als-start/src/main/resources/application-dev.yml

@@ -98,7 +98,7 @@ redisson:
 --- # 监控中心客户端配置 false true
 spring.boot.admin.client:
   # 增加客户端开关
-  enabled: true
+  enabled: false
   url: http://localhost:9099/admin
   instance:
     service-host-type: IP
@@ -109,7 +109,7 @@ spring.boot.admin.client:
 powerjob:
   worker:
     # 如何开启调度中心请查看文档教程 false true
-    enabled: true
+    enabled: false
     # 需要先在 powerjob 登录页执行应用注册后才能使用
     app-name: als-worker
     # 28080 端口 随着主应用端口飘逸 避免集群冲突

+ 7 - 0
pom.xml

@@ -408,6 +408,13 @@
                 <version>${revision}</version>
             </dependency>
 
+            <!-- 灵巧保障模块-->
+            <dependency>
+                <groupId>org.eco</groupId>
+                <artifactId>agile-assurance</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>