diff --git a/pasd-fire/pom.xml b/pasd-fire/pom.xml index 478c782..cbc0036 100644 --- a/pasd-fire/pom.xml +++ b/pasd-fire/pom.xml @@ -11,18 +11,34 @@ pasd-fire pasd-fire - - 消防设施管理模块 - + http://maven.apache.org - - com.ruoyi ruoyi-common + + org.projectlombok + lombok + + + + + com.baomidou + mybatis-plus-boot-starter + 3.5.3 + + + + + com.baomidou + mybatis-plus-annotation + 3.5.3 + - + + + \ No newline at end of file diff --git a/pasd-fire/src/main/java/com/ruoyi/fire/controller/FireFacilityController.java b/pasd-fire/src/main/java/com/ruoyi/fire/controller/FireFacilityController.java index 840209a..3135bf8 100644 --- a/pasd-fire/src/main/java/com/ruoyi/fire/controller/FireFacilityController.java +++ b/pasd-fire/src/main/java/com/ruoyi/fire/controller/FireFacilityController.java @@ -1,26 +1,24 @@ package com.ruoyi.fire.controller; -import java.util.List; -import javax.servlet.http.HttpServletResponse; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.PageDomain; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.page.TableSupport; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.fire.domain.FireFacility; import com.ruoyi.fire.service.IFireFacilityService; -import com.ruoyi.common.utils.poi.ExcelUtil; -import com.ruoyi.common.core.page.TableDataInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; /** * facilitiesController @@ -28,39 +26,86 @@ import com.ruoyi.common.core.page.TableDataInfo; * @author Junhua * @date 2025-07-15 */ +@Anonymous @RestController @RequestMapping("/fire/facility") public class FireFacilityController extends BaseController { + + @Autowired private IFireFacilityService fireFacilityService; /** - * 查询facilities列表 + * 检查并更新设施状态 */ - @PreAuthorize("@ss.hasPermi('fire:facility:list')") - @GetMapping("/list") - public TableDataInfo list(FireFacility fireFacility) { + @GetMapping("/check-status/{id}") + public AjaxResult checkAndUpdateStatus(@PathVariable Long id) { + + + + int result = fireFacilityService.checkAndUpdateStatus(id); + + + if (result > 0) { + return AjaxResult.success("状态已更新"); + } + return AjaxResult.success("状态无需更新"); + } + + +/// 获取所有设施列表 + + + +@GetMapping("/list") +public TableDataInfo list(FireFacility fireFacility) { + // 获取当前分页信息 + PageDomain pageDomain = TableSupport.buildPageRequest(); + Integer pageNum = pageDomain.getPageNum(); + Integer pageSize = pageDomain.getPageSize(); + + // 传递分页参数到状态更新方法 + fireFacilityService.checkAndUpdateExpirationStatus(fireFacility, pageNum, pageSize); + + // 执行分页查询 + startPage(); + List list = fireFacilityService.selectFireFacilityList(fireFacility); + + return getDataTable(list); +} + + /** + * 查询根据id查询设施列表 + */ +// @PreAuthorize("@ss.hasPermi('fire:facility:list')") + @GetMapping("/details") + public TableDataInfo getDetails(FireFacility fireFacility) { startPage(); - List list = fireFacilityService.selectFireFacilityList(fireFacility); + List list = fireFacilityService.getDetails(fireFacility); return getDataTable(list); } /** * 导出facilities列表 */ - @PreAuthorize("@ss.hasPermi('fire:facility:export')") +// @PreAuthorize("@ss.hasPermi('fire:facility:export')") @Log(title = "facilities", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, FireFacility fireFacility) { + List list = fireFacilityService.selectFireFacilityList(fireFacility); ExcelUtil util = new ExcelUtil(FireFacility.class); + // 调试:打印前 5 条数据的 remark 值 + list.stream().limit(5).forEach(f -> { + System.out.println("ID: " + f.getId() + ", Remark: " + f.getRemark()); + }); util.exportExcel(response, list, "facilities数据"); } /** * 获取facilities详细信息 */ - @PreAuthorize("@ss.hasPermi('fire:facility:query')") +// @PreAuthorize("@ss.hasPermi('fire:facility:query')") @GetMapping(value = "/{id}") public AjaxResult getInfo(@PathVariable("id") Long id) { return success(fireFacilityService.selectFireFacilityById(id)); @@ -69,7 +114,7 @@ public class FireFacilityController extends BaseController { /** * 新增facilities */ - @PreAuthorize("@ss.hasPermi('fire:facility:add')") +// @PreAuthorize("@ss.hasPermi('fire:facility:add')") @Log(title = "facilities", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody FireFacility fireFacility) { @@ -79,7 +124,7 @@ public class FireFacilityController extends BaseController { /** * 修改facilities */ - @PreAuthorize("@ss.hasPermi('fire:facility:edit')") +// @PreAuthorize("@ss.hasPermi('fire:facility:edit')") @Log(title = "facilities", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult edit(@RequestBody FireFacility fireFacility) { @@ -89,10 +134,34 @@ public class FireFacilityController extends BaseController { /** * 删除facilities */ - @PreAuthorize("@ss.hasPermi('fire:facility:remove')") +// @PreAuthorize("@ss.hasPermi('fire:facility:remove')") @Log(title = "facilities", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public AjaxResult remove(@PathVariable Long[] ids) { return toAjax(fireFacilityService.deleteFireFacilityByIds(ids)); } + /** + * 导入Excel数据 + * @param file Excel文件 + * @param updateSupport 是否支持更新(1=支持,0=不支持) + * @return 导入结果 + */ + @Log(title = "消防设施", businessType = BusinessType.IMPORT) + @PostMapping("/importData") + public AjaxResult importData(MultipartFile file, @RequestParam(defaultValue = "0") String updateSupport) throws Exception { + + boolean isUpdate = "1".equals(updateSupport); // 1表示支持更新,0表示仅新增 + String result = fireFacilityService.importFireFacility(file, isUpdate); + return success(result); + } + + /** + * 下载导入模板 + * @param response 响应对象 + */ + @GetMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) { + ExcelUtil util = new ExcelUtil<>(FireFacility.class); + util.exportExcel(response, null, "消防设施导入模板"); + } } diff --git a/pasd-fire/src/main/java/com/ruoyi/fire/controller/FireFacilityRepairController.java b/pasd-fire/src/main/java/com/ruoyi/fire/controller/FireFacilityRepairController.java new file mode 100644 index 0000000..18aad02 --- /dev/null +++ b/pasd-fire/src/main/java/com/ruoyi/fire/controller/FireFacilityRepairController.java @@ -0,0 +1,104 @@ +package com.ruoyi.fire.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.fire.domain.FireFacilityRepair; +import com.ruoyi.fire.service.IFireFacilityRepairService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 消防设施维修记录Controller + * + * @author Junhua + * @date 2025-07-16 + */ +@RestController +@RequestMapping("/fire_facility_repair/repair") +public class FireFacilityRepairController extends BaseController +{ + @Autowired + private IFireFacilityRepairService fireFacilityRepairService; + + /** + * 查询消防设施维修记录列表 + */ + @PreAuthorize("@ss.hasPermi('fire_facility_repair:repair:list')") + @GetMapping("/list") + public TableDataInfo list(FireFacilityRepair fireFacilityRepair) + { + startPage(); + List list = fireFacilityRepairService.selectFireFacilityRepairList(fireFacilityRepair); + return getDataTable(list); + } + + /** + * 导出消防设施维修记录列表 + */ + @PreAuthorize("@ss.hasPermi('fire_facility_repair:repair:export')") + @Log(title = "消防设施维修记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, FireFacilityRepair fireFacilityRepair) + { + List list = fireFacilityRepairService.selectFireFacilityRepairList(fireFacilityRepair); + ExcelUtil util = new ExcelUtil(FireFacilityRepair.class); + util.exportExcel(response, list, "消防设施维修记录数据"); + } + + /** + * 获取消防设施维修记录详细信息 + */ + @PreAuthorize("@ss.hasPermi('fire_facility_repair:repair:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(fireFacilityRepairService.selectFireFacilityRepairById(id)); + } + + /** + * 新增消防设施维修记录 + */ + @PreAuthorize("@ss.hasPermi('fire_facility_repair:repair:add')") + @Log(title = "消防设施维修记录", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody FireFacilityRepair fireFacilityRepair) + { + return toAjax(fireFacilityRepairService.insertFireFacilityRepair(fireFacilityRepair)); + } + + /** + * 修改消防设施维修记录 + */ + @PreAuthorize("@ss.hasPermi('fire_facility_repair:repair:edit')") + @Log(title = "消防设施维修记录", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody FireFacilityRepair fireFacilityRepair) + { + return toAjax(fireFacilityRepairService.updateFireFacilityRepair(fireFacilityRepair)); + } + + /** + * 删除消防设施维修记录 + */ + @PreAuthorize("@ss.hasPermi('fire_facility_repair:repair:remove')") + @Log(title = "消防设施维修记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(fireFacilityRepairService.deleteFireFacilityRepairByIds(ids)); + } +} diff --git a/pasd-fire/src/main/java/com/ruoyi/fire/controller/FireFacilityReplacementController.java b/pasd-fire/src/main/java/com/ruoyi/fire/controller/FireFacilityReplacementController.java new file mode 100644 index 0000000..5c16101 --- /dev/null +++ b/pasd-fire/src/main/java/com/ruoyi/fire/controller/FireFacilityReplacementController.java @@ -0,0 +1,104 @@ +package com.ruoyi.fire.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.fire.domain.FireFacilityReplacement; +import com.ruoyi.fire.service.IFireFacilityReplacementService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 消防设施更换记录Controller + * + * @author Junhau + * @date 2025-07-17 + */ +@RestController +@RequestMapping("/fire_facility_replacement/replacement") +public class FireFacilityReplacementController extends BaseController +{ + @Autowired + private IFireFacilityReplacementService fireFacilityReplacementService; + + /** + * 查询消防设施更换记录列表 + */ + @PreAuthorize("@ss.hasPermi('fire_facility_replacement:replacement:list')") + @GetMapping("/list") + public TableDataInfo list(FireFacilityReplacement fireFacilityReplacement) + { + startPage(); + List list = fireFacilityReplacementService.selectFireFacilityReplacementList(fireFacilityReplacement); + return getDataTable(list); + } + + /** + * 导出消防设施更换记录列表 + */ + @PreAuthorize("@ss.hasPermi('fire_facility_replacement:replacement:export')") + @Log(title = "消防设施更换记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, FireFacilityReplacement fireFacilityReplacement) + { + List list = fireFacilityReplacementService.selectFireFacilityReplacementList(fireFacilityReplacement); + ExcelUtil util = new ExcelUtil(FireFacilityReplacement.class); + util.exportExcel(response, list, "消防设施更换记录数据"); + } + + /** + * 获取消防设施更换记录详细信息 + */ + @PreAuthorize("@ss.hasPermi('fire_facility_replacement:replacement:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(fireFacilityReplacementService.selectFireFacilityReplacementById(id)); + } + + /** + * 新增消防设施更换记录 + */ + @PreAuthorize("@ss.hasPermi('fire_facility_replacement:replacement:add')") + @Log(title = "消防设施更换记录", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody FireFacilityReplacement fireFacilityReplacement) + { + return toAjax(fireFacilityReplacementService.insertFireFacilityReplacement(fireFacilityReplacement)); + } + + /** + * 修改消防设施更换记录 + */ + @PreAuthorize("@ss.hasPermi('fire_facility_replacement:replacement:edit')") + @Log(title = "消防设施更换记录", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody FireFacilityReplacement fireFacilityReplacement) + { + return toAjax(fireFacilityReplacementService.updateFireFacilityReplacement(fireFacilityReplacement)); + } + + /** + * 删除消防设施更换记录 + */ + @PreAuthorize("@ss.hasPermi('fire_facility_replacement:replacement:remove')") + @Log(title = "消防设施更换记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(fireFacilityReplacementService.deleteFireFacilityReplacementByIds(ids)); + } +} diff --git a/pasd-fire/src/main/java/com/ruoyi/fire/controller/FireFacilityReportController.java b/pasd-fire/src/main/java/com/ruoyi/fire/controller/FireFacilityReportController.java new file mode 100644 index 0000000..55ba155 --- /dev/null +++ b/pasd-fire/src/main/java/com/ruoyi/fire/controller/FireFacilityReportController.java @@ -0,0 +1,104 @@ +package com.ruoyi.fire.controller; + +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.fire.domain.FireFacilityReport; +import com.ruoyi.fire.service.IFireFacilityReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.HashMap; + +@RestController +@RequestMapping("/fire/facility-report") +public class FireFacilityReportController extends BaseController { + + @Autowired + private IFireFacilityReportService fireFacilityReportService; + + /** + * 按设施类型筛选统计数据 + */ + @GetMapping("/report") + public AjaxResult getReport(@RequestParam(required = false) String facilityType) { + return AjaxResult.success(fireFacilityReportService.getReportData(facilityType)); + } + + /** + * 获取指定状态+设施类型的详情数据 + */ + @GetMapping("/detail") + public AjaxResult getDetail( + @RequestParam Integer status, + @RequestParam(required = false) String facilityType, + @RequestParam(defaultValue = "1") int pageNum, + @RequestParam(defaultValue = "10") int pageSize) { + + FireFacilityReport query = new FireFacilityReport(); + query.setFacilityType(facilityType); + + // 1. 查询所有数据 + List facilityList = fireFacilityReportService.selectFireFacilityReportList(query); + + // 2. 筛选出所有符合状态条件的数据 + List filteredList = facilityList.stream() + .map(facility -> { + Integer dynamicStatus = fireFacilityReportService.calculateDynamicStatus( + facility.getExpiryDate(), + facility.getStatus() + ); + facility.setDynamicStatus(dynamicStatus); + facility.setStatusText(fireFacilityReportService.getStatusText(dynamicStatus)); + return facility; + }) + .filter(facility -> Objects.equals(facility.getDynamicStatus(), status)) + .collect(Collectors.toList()); + + // 3. 计算总条数(关键:用于前端分页控件) + int total = filteredList.size(); + + // 4. 执行分页逻辑 + int start = (pageNum - 1) * pageSize; + // 处理边界情况:当start超过列表长度时,返回空列表 + if (start >= filteredList.size()) { + Map result = new HashMap<>(); + result.put("list", Collections.emptyList()); + result.put("total", total); + return AjaxResult.success(result); + } + + int end = Math.min(start + pageSize, filteredList.size()); + List pagedList = filteredList.subList(start, end); + + // 5. 返回分页数据和总条数 + Map result = new HashMap<>(); + result.put("list", pagedList); + result.put("total", total); + return AjaxResult.success(result); + } + + /** + * 获取所有状态的设施数据(支持按类型筛选) + */ + @GetMapping("/all") + public AjaxResult getAllData(@RequestParam(required = false) String facilityType) { + FireFacilityReport query = new FireFacilityReport(); + query.setFacilityType(facilityType); + + List list = fireFacilityReportService.selectFireFacilityReportList(query); + list.forEach(facility -> { + Integer dynamicStatus = fireFacilityReportService.calculateDynamicStatus( + facility.getExpiryDate(), + facility.getStatus() + ); + facility.setDynamicStatus(dynamicStatus); + facility.setStatusText(fireFacilityReportService.getStatusText(dynamicStatus)); + }); + return AjaxResult.success(list); + } +} diff --git a/pasd-fire/src/main/java/com/ruoyi/fire/domain/FireFacility.java b/pasd-fire/src/main/java/com/ruoyi/fire/domain/FireFacility.java index 94efa9e..0f81630 100644 --- a/pasd-fire/src/main/java/com/ruoyi/fire/domain/FireFacility.java +++ b/pasd-fire/src/main/java/com/ruoyi/fire/domain/FireFacility.java @@ -1,6 +1,10 @@ + + package com.ruoyi.fire.domain; import java.util.Date; +import java.util.HashMap; +import java.util.Map; import com.fasterxml.jackson.annotation.JsonFormat; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -14,154 +18,170 @@ import com.ruoyi.common.core.domain.BaseEntity; * @author Junhua * @date 2025-07-15 */ -public class FireFacility extends BaseEntity { +public class FireFacility extends BaseEntity +{ private static final long serialVersionUID = 1L; - /** - * 设施ID,自增主键 - */ + private transient String statusName; + + public String getStatusName() { + return statusName; + } + + public void setStatusName(String statusName) { + this.statusName = statusName; + } + + + /** 设施ID,自增主键 */ @Excel(name = "设施ID,自增主键") private Long id; - /** - * 位置ID(字符串描述,如"A101") - */ - @Excel(name = "位置ID", readConverterExp = "字=符串描述,如A101") + /** 位置ID(字符串描述,如"A101") */ + @Excel(name = "位置ID") private String locationId; - /** - * 设施名称(如"干粉灭火器") - */ - @Excel(name = "设施名称", readConverterExp = "如=干粉灭火器") + /** 设施名称(如"干粉灭火器") */ + @Excel(name = "设施名称") private String facilityName; - /** - * 设施类型(如"灭火器/消防栓") - */ - @Excel(name = "设施类型", readConverterExp = "如=灭火器/消防栓") + /** 设施类型(如"灭火器/消防栓") */ + @Excel(name = "设施类型") private String facilityType; - /** - * 型号规格 - */ + /** 型号规格 */ @Excel(name = "型号规格") private String modelNumber; - /** - * 数量(通常≤10,用tinyint节省空间) - */ - @Excel(name = "数量", readConverterExp = "通=常≤10,用tinyint节省空间") + /** 数量(通常≤10,用tinyint节省空间) */ + @Excel(name = "数量") private Integer quantity; - /** - * 入库时间(默认当前日期) - */ - @Excel(name = "入库时间", readConverterExp = "默=认当前日期") + /** 入库时间(默认当前日期) */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "入库时间",width = 30, dateFormat = "yyyy-MM-dd") private Date entryDate; - /** - * 生产日期 - */ + /** 生产日期 */ @JsonFormat(pattern = "yyyy-MM-dd") @Excel(name = "生产日期", width = 30, dateFormat = "yyyy-MM-dd") private Date productionDate; - /** - * 过期日期 - */ + /** 过期日期 */ @JsonFormat(pattern = "yyyy-MM-dd") @Excel(name = "过期日期", width = 30, dateFormat = "yyyy-MM-dd") private Date expiryDate; - /** - * 状态(0=正常,1=即将过期,2=已过期,3=维修中,4=已更换,5=已报废) - */ - @Excel(name = "状态", readConverterExp = "0==正常,1=即将过期,2=已过期,3=维修中,4=已更换,5=已报废") + /** 备注 */ + @Excel(name = "备注") + private String remark; + + /** 状态(0=正常,1=即将过期,2=已过期,3=维修中,4=已更换,5=已报废) */ + @Excel(name = "状态", dictType = "fire_facility_status") private Integer status; - public void setId(Long id) { + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public void setId(Long id) + { this.id = id; } - public Long getId() { + public Long getId() + { return id; } - - public void setLocationId(String locationId) { + public void setLocationId(String locationId) + { this.locationId = locationId; } - public String getLocationId() { + public String getLocationId() + { return locationId; } - - public void setFacilityName(String facilityName) { + public void setFacilityName(String facilityName) + { this.facilityName = facilityName; } - public String getFacilityName() { + public String getFacilityName() + { return facilityName; } - - public void setFacilityType(String facilityType) { + public void setFacilityType(String facilityType) + { this.facilityType = facilityType; } - public String getFacilityType() { + public String getFacilityType() + { return facilityType; } - - public void setModelNumber(String modelNumber) { + public void setModelNumber(String modelNumber) + { this.modelNumber = modelNumber; } - public String getModelNumber() { + public String getModelNumber() + { return modelNumber; } - - public void setQuantity(Integer quantity) { + public void setQuantity(Integer quantity) + { this.quantity = quantity; } - public Integer getQuantity() { + public Integer getQuantity() + { return quantity; } - - public void setEntryDate(Date entryDate) { + public void setEntryDate(Date entryDate) + { this.entryDate = entryDate; } - public Date getEntryDate() { + public Date getEntryDate() + { return entryDate; } - - public void setProductionDate(Date productionDate) { + public void setProductionDate(Date productionDate) + { this.productionDate = productionDate; } - public Date getProductionDate() { + public Date getProductionDate() + { return productionDate; } - - public void setExpiryDate(Date expiryDate) { + public void setExpiryDate(Date expiryDate) + { this.expiryDate = expiryDate; } - public Date getExpiryDate() { + public Date getExpiryDate() + { return expiryDate; } - - public void setStatus(Integer status) { + public void setStatus(Integer status) + { this.status = status; } - public Integer getStatus() { + public Integer getStatus() + { return status; } @Override public String toString() { - return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("id", getId()) .append("locationId", getLocationId()) .append("facilityName", getFacilityName()) @@ -177,4 +197,16 @@ public class FireFacility extends BaseEntity { .append("updateTime", getUpdateTime()) .toString(); } + + + + + + + + + + + + } diff --git a/pasd-fire/src/main/java/com/ruoyi/fire/domain/FireFacilityRepair.java b/pasd-fire/src/main/java/com/ruoyi/fire/domain/FireFacilityRepair.java new file mode 100644 index 0000000..689bdae --- /dev/null +++ b/pasd-fire/src/main/java/com/ruoyi/fire/domain/FireFacilityRepair.java @@ -0,0 +1,152 @@ +package com.ruoyi.fire.domain; +import java.util.Date; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + + 消防设施维修记录对象 fire_facility_repair + @author Junhua + @date 2025-07-16 + */ +public class FireFacilityRepair extends BaseEntity +{ + private static final long serialVersionUID = 1L; + /** 维修 ID,自增主键 */ + private Long id; + /** 设施 ID(逻辑关联 fire_facilities.id) */ + @Excel (name = "设施 ID") + @NotNull (message = "设施 ID 不能为空") + private Long facilityId; + /** 维修日期 */ + @JsonFormat (pattern = "yyyy-MM-dd") + @Excel (name = "维修日期", width = 30, dateFormat = "yyyy-MM-dd") + @NotNull (message = "维修日期不能为空") + private Date repairDate; + /** 维修内容(详细描述) */ + @Excel (name = "维修内容") + @NotBlank (message = "维修内容不能为空") + @Size (max = 500, message = "维修内容不能超过 500 个字符") + private String repairContent; + /** + 维修结果(0 = 成功,1 = 失败,2 = 部分解决) + 通过 dictType 关联数据字典,实现 Excel 导出时的文本映射 + */ + @Excel (name = "维修结果", dictType = "fire_repair_result") // 核心修改:添加 dictType 关联字典 + @NotNull (message = "维修结果不能为空") + private Integer repairResult; + /** 操作人员(工号 || 姓名) */ + @Excel (name = "操作人员") + @NotBlank (message = "操作人员不能为空") + @Size (max = 20, message = "操作人员姓名不能超过 20 个字符") + private String replacePerson; + /** 下次检查日期 */ + @JsonFormat (pattern = "yyyy-MM-dd") + @Excel (name = "下次检查日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date nextCheckDate; + /** 创建时间 */ + @JsonFormat (pattern = "yyyy-MM-dd HH:mm:ss") + @Excel (name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + /** 备注 */ + @Excel (name = "备注") + @Size (max = 200, message = "备注不能超过 200 个字符") + private String remark; + // 以下为 getter/setter 方法(保持不变) + public void setId (Long id) + { + this.id = id; + } + public Long getId() + { + return id; + } + public void setFacilityId(Long facilityId) + { + this.facilityId = facilityId; + } + public Long getFacilityId() + { + return facilityId; + } + public void setRepairDate(Date repairDate) + { + this.repairDate = repairDate; + } + public Date getRepairDate() + { + return repairDate; + } + public void setRepairContent(String repairContent) + { + this.repairContent = repairContent; + } + public String getRepairContent() + { + return repairContent; + } + public void setRepairResult(Integer repairResult) + { + this.repairResult = repairResult; + } + public Integer getRepairResult() + { + return repairResult; + } + public void setReplacePerson(String replacePerson) + { + this.replacePerson = replacePerson; + } + public String getReplacePerson() + { + return replacePerson; + } + public void setNextCheckDate(Date nextCheckDate) + { + this.nextCheckDate = nextCheckDate; + } + public Date getNextCheckDate() + { + return nextCheckDate; + } + @Override + public void setRemark(String remark) + { + this.remark = remark; + } + @Override + public String getRemark() + { + return remark; + } + @Override + public void setCreateTime(Date createTime) + { + this.createTime = createTime; + } + @Override + public Date getCreateTime() + { + return createTime; + } + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("facilityId", getFacilityId()) + .append("repairDate", getRepairDate()) + .append("repairContent", getRepairContent()) + .append("repairResult", getRepairResult()) + .append("replacePerson", getReplacePerson()) + .append("nextCheckDate", getNextCheckDate()) + .append("remark", getRemark()) + .append("createTime", getCreateTime()) + .toString(); + } +} diff --git a/pasd-fire/src/main/java/com/ruoyi/fire/domain/FireFacilityReplacement.java b/pasd-fire/src/main/java/com/ruoyi/fire/domain/FireFacilityReplacement.java new file mode 100644 index 0000000..75b1913 --- /dev/null +++ b/pasd-fire/src/main/java/com/ruoyi/fire/domain/FireFacilityReplacement.java @@ -0,0 +1,164 @@ +package com.ruoyi.fire.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 消防设施更换记录对象 fire_facility_replacement + * + * @author system + * @date 2025-07-22 + */ +public class FireFacilityReplacement extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 设施ID,自增主键 */ + @Excel(name = "设施ID,自增主键") + private Long id; + + /** 原设施ID(逻辑关联fire_facilities.id) */ + @Excel(name = "原设施ID") + @NotNull(message = "原设施ID不能为空") + private Long oldFacilityId; + + /** 新设施ID(逻辑关联fire_facilities.id) */ + @Excel(name = "新设施ID") + @NotNull(message = "新设施ID不能为空") + private Long newFacilityId; + + /** 更换日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "更换日期", width = 30, dateFormat = "yyyy-MM-dd") + @NotNull(message = "更换日期不能为空") + private Date replaceDate; + + /** 更换原因(详细说明) */ + @Excel(name = "更换原因") + @NotBlank(message = "更换原因不能为空") + @Size(max = 200, message = "更换原因长度不能超过200个字符") + private String replaceReason; + + /** 更换人(操作人员) */ + @Excel(name = "更换人") + @NotBlank(message = "更换人不能为空") + @Size(max = 20, message = "更换人姓名长度不能超过20个字符") + private String replacePerson; + + /** 备注 */ + @Excel(name = "备注") + @Size(max = 200, message = "备注长度不能超过200个字符") + private String remark; + + /** 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + // 以下为所有字段的getter和setter方法,确保每个字段都能被正确访问和设置 + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setOldFacilityId(Long oldFacilityId) + { + this.oldFacilityId = oldFacilityId; + } + + public Long getOldFacilityId() + { + return oldFacilityId; + } + + public void setNewFacilityId(Long newFacilityId) + { + this.newFacilityId = newFacilityId; + } + + public Long getNewFacilityId() + { + return newFacilityId; + } + + public void setReplaceDate(Date replaceDate) + { + this.replaceDate = replaceDate; + } + + public Date getReplaceDate() + { + return replaceDate; + } + + public void setReplaceReason(String replaceReason) + { + this.replaceReason = replaceReason; + } + + public String getReplaceReason() + { + return replaceReason; + } + + public void setReplacePerson(String replacePerson) + { + this.replacePerson = replacePerson; + } + + public String getReplacePerson() + { + return replacePerson; + } + + @Override + public void setRemark(String remark) + { + this.remark = remark; + } + + @Override + public String getRemark() + { + return remark; + } + + @Override + public void setCreateTime(Date createTime) + { + this.createTime = createTime; + } + + @Override + public Date getCreateTime() + { + return createTime; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("oldFacilityId", getOldFacilityId()) + .append("newFacilityId", getNewFacilityId()) + .append("replaceDate", getReplaceDate()) + .append("replaceReason", getReplaceReason()) + .append("replacePerson", getReplacePerson()) + .append("remark", getRemark()) + .append("createTime", getCreateTime()) + .toString(); + } +} diff --git a/pasd-fire/src/main/java/com/ruoyi/fire/domain/FireFacilityReport.java b/pasd-fire/src/main/java/com/ruoyi/fire/domain/FireFacilityReport.java new file mode 100644 index 0000000..55ba1f2 --- /dev/null +++ b/pasd-fire/src/main/java/com/ruoyi/fire/domain/FireFacilityReport.java @@ -0,0 +1,57 @@ +package com.ruoyi.fire.domain; + +import com.ruoyi.common.core.domain.BaseEntity; +import java.util.Date; + +public class FireFacilityReport extends BaseEntity { + private Long id; + private String locationId; + private String facilityName; + private String facilityType; + private String modelNumber; + private Integer quantity; + private Date entryDate; + private Date productionDate; + private Date expiryDate; + private Integer status; + private String remark; + private Date createTime; + private Date updateTime; + + // 动态计算的状态 + private Integer dynamicStatus; + // 状态文本 + private String statusText; + + // Getters and Setters + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + public String getLocationId() { return locationId; } + public void setLocationId(String locationId) { this.locationId = locationId; } + public String getFacilityName() { return facilityName; } + public void setFacilityName(String facilityName) { this.facilityName = facilityName; } + public String getFacilityType() { return facilityType; } + public void setFacilityType(String facilityType) { this.facilityType = facilityType; } + public String getModelNumber() { return modelNumber; } + public void setModelNumber(String modelNumber) { this.modelNumber = modelNumber; } + public Integer getQuantity() { return quantity; } + public void setQuantity(Integer quantity) { this.quantity = quantity; } + public Date getEntryDate() { return entryDate; } + public void setEntryDate(Date entryDate) { this.entryDate = entryDate; } + public Date getProductionDate() { return productionDate; } + public void setProductionDate(Date productionDate) { this.productionDate = productionDate; } + public Date getExpiryDate() { return expiryDate; } + public void setExpiryDate(Date expiryDate) { this.expiryDate = expiryDate; } + public Integer getStatus() { return status; } + public void setStatus(Integer status) { this.status = status; } + public String getRemark() { return remark; } + public void setRemark(String remark) { this.remark = remark; } + public Date getCreateTime() { return createTime; } + public void setCreateTime(Date createTime) { this.createTime = createTime; } + public Date getUpdateTime() { return updateTime; } + public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } + public Integer getDynamicStatus() { return dynamicStatus; } + public void setDynamicStatus(Integer dynamicStatus) { this.dynamicStatus = dynamicStatus; } + public String getStatusText() { return statusText; } + public void setStatusText(String statusText) { this.statusText = statusText; } +} \ No newline at end of file diff --git a/pasd-fire/src/main/java/com/ruoyi/fire/mapper/FireFacilityMapper.java b/pasd-fire/src/main/java/com/ruoyi/fire/mapper/FireFacilityMapper.java index 6000a08..d3c5c3a 100644 --- a/pasd-fire/src/main/java/com/ruoyi/fire/mapper/FireFacilityMapper.java +++ b/pasd-fire/src/main/java/com/ruoyi/fire/mapper/FireFacilityMapper.java @@ -1,19 +1,23 @@ package com.ruoyi.fire.mapper; +import java.util.Date; import java.util.List; +import java.util.Map; import com.ruoyi.fire.domain.FireFacility; +import org.apache.ibatis.annotations.Param; /** * facilitiesMapper接口 - * + * * @author Junhua * @date 2025-07-15 */ -public interface FireFacilityMapper { +public interface FireFacilityMapper +{ /** * 查询facilities - * + * * @param id facilities主键 * @return facilities */ @@ -21,7 +25,7 @@ public interface FireFacilityMapper { /** * 查询facilities列表 - * + * * @param fireFacility facilities * @return facilities集合 */ @@ -29,7 +33,7 @@ public interface FireFacilityMapper { /** * 新增facilities - * + * * @param fireFacility facilities * @return 结果 */ @@ -37,7 +41,7 @@ public interface FireFacilityMapper { /** * 修改facilities - * + * * @param fireFacility facilities * @return 结果 */ @@ -45,7 +49,7 @@ public interface FireFacilityMapper { /** * 删除facilities - * + * * @param id facilities主键 * @return 结果 */ @@ -53,9 +57,26 @@ public interface FireFacilityMapper { /** * 批量删除facilities - * + * * @param ids 需要删除的数据主键集合 * @return 结果 */ public int deleteFireFacilityByIds(Long[] ids); + + /** + * 根据位置ID和设施名称查询(用于校验重复) + * @param locationId 位置ID + * @param facilityName 设施名称 + * @return 消防设施对象 + */ + FireFacility selectByLocationAndName( + @Param("locationId") String locationId, + @Param("facilityName") String facilityName); + + /** + * 查询根据id查询设施列表 + */ + List getDetails(FireFacility fireFacility); + } + diff --git a/pasd-fire/src/main/java/com/ruoyi/fire/mapper/FireFacilityRepairMapper.java b/pasd-fire/src/main/java/com/ruoyi/fire/mapper/FireFacilityRepairMapper.java new file mode 100644 index 0000000..99d627e --- /dev/null +++ b/pasd-fire/src/main/java/com/ruoyi/fire/mapper/FireFacilityRepairMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.fire.mapper; + +import java.util.List; +import com.ruoyi.fire.domain.FireFacilityRepair; + +/** + * 消防设施维修记录Mapper接口 + * + * @author Junhua + * @date 2025-07-16 + */ +public interface FireFacilityRepairMapper +{ + /** + * 查询消防设施维修记录 + * + * @param id 消防设施维修记录主键 + * @return 消防设施维修记录 + */ + public FireFacilityRepair selectFireFacilityRepairById(Long id); + + /** + * 查询消防设施维修记录列表 + * + * @param fireFacilityRepair 消防设施维修记录 + * @return 消防设施维修记录集合 + */ + public List selectFireFacilityRepairList(FireFacilityRepair fireFacilityRepair); + + /** + * 新增消防设施维修记录 + * + * @param fireFacilityRepair 消防设施维修记录 + * @return 结果 + */ + public int insertFireFacilityRepair(FireFacilityRepair fireFacilityRepair); + + /** + * 修改消防设施维修记录 + * + * @param fireFacilityRepair 消防设施维修记录 + * @return 结果 + */ + public int updateFireFacilityRepair(FireFacilityRepair fireFacilityRepair); + + /** + * 删除消防设施维修记录 + * + * @param id 消防设施维修记录主键 + * @return 结果 + */ + public int deleteFireFacilityRepairById(Long id); + + /** + * 批量删除消防设施维修记录 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteFireFacilityRepairByIds(Long[] ids); +} diff --git a/pasd-fire/src/main/java/com/ruoyi/fire/mapper/FireFacilityReplacementMapper.java b/pasd-fire/src/main/java/com/ruoyi/fire/mapper/FireFacilityReplacementMapper.java new file mode 100644 index 0000000..2d28d09 --- /dev/null +++ b/pasd-fire/src/main/java/com/ruoyi/fire/mapper/FireFacilityReplacementMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.fire.mapper; + +import java.util.List; +import com.ruoyi.fire.domain.FireFacilityReplacement; + +/** + * 消防设施更换记录Mapper接口 + * + * @author Junhau + * @date 2025-07-17 + */ +public interface FireFacilityReplacementMapper +{ + /** + * 查询消防设施更换记录 + * + * @param id 消防设施更换记录主键 + * @return 消防设施更换记录 + */ + public FireFacilityReplacement selectFireFacilityReplacementById(Long id); + + /** + * 查询消防设施更换记录列表 + * + * @param fireFacilityReplacement 消防设施更换记录 + * @return 消防设施更换记录集合 + */ + public List selectFireFacilityReplacementList(FireFacilityReplacement fireFacilityReplacement); + + /** + * 新增消防设施更换记录 + * + * @param fireFacilityReplacement 消防设施更换记录 + * @return 结果 + */ + public int insertFireFacilityReplacement(FireFacilityReplacement fireFacilityReplacement); + + /** + * 修改消防设施更换记录 + * + * @param fireFacilityReplacement 消防设施更换记录 + * @return 结果 + */ + public int updateFireFacilityReplacement(FireFacilityReplacement fireFacilityReplacement); + + /** + * 删除消防设施更换记录 + * + * @param id 消防设施更换记录主键 + * @return 结果 + */ + public int deleteFireFacilityReplacementById(Long id); + + /** + * 批量删除消防设施更换记录 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteFireFacilityReplacementByIds(Long[] ids); +} diff --git a/pasd-fire/src/main/java/com/ruoyi/fire/mapper/FireFacilityReportMapper.java b/pasd-fire/src/main/java/com/ruoyi/fire/mapper/FireFacilityReportMapper.java new file mode 100644 index 0000000..844009b --- /dev/null +++ b/pasd-fire/src/main/java/com/ruoyi/fire/mapper/FireFacilityReportMapper.java @@ -0,0 +1,16 @@ +package com.ruoyi.fire.mapper; + +// 移除错误的Lettuce导入,改为MyBatis的Param注解 +import org.apache.ibatis.annotations.Param; // 正确的导入 +import org.apache.ibatis.annotations.Mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.fire.domain.FireFacilityReport; +import java.util.List; + +@Mapper +public interface FireFacilityReportMapper extends BaseMapper { + List selectFireFacilityReportList(FireFacilityReport fireFacilityReport); + + // 使用MyBatis的@Param注解绑定参数名称 + int batchUpdateStatus(@Param("ids") List ids, @Param("newStatus") Integer newStatus); +} \ No newline at end of file diff --git a/pasd-fire/src/main/java/com/ruoyi/fire/service/IFireFacilityRepairService.java b/pasd-fire/src/main/java/com/ruoyi/fire/service/IFireFacilityRepairService.java new file mode 100644 index 0000000..25a7efc --- /dev/null +++ b/pasd-fire/src/main/java/com/ruoyi/fire/service/IFireFacilityRepairService.java @@ -0,0 +1,61 @@ +package com.ruoyi.fire.service; + +import java.util.List; +import com.ruoyi.fire.domain.FireFacilityRepair; + +/** + * 消防设施维修记录Service接口 + * + * @author Junhua + * @date 2025-07-16 + */ +public interface IFireFacilityRepairService +{ + /** + * 查询消防设施维修记录 + * + * @param id 消防设施维修记录主键 + * @return 消防设施维修记录 + */ + public FireFacilityRepair selectFireFacilityRepairById(Long id); + + /** + * 查询消防设施维修记录列表 + * + * @param fireFacilityRepair 消防设施维修记录 + * @return 消防设施维修记录集合 + */ + public List selectFireFacilityRepairList(FireFacilityRepair fireFacilityRepair); + + /** + * 新增消防设施维修记录 + * + * @param fireFacilityRepair 消防设施维修记录 + * @return 结果 + */ + public int insertFireFacilityRepair(FireFacilityRepair fireFacilityRepair); + + /** + * 修改消防设施维修记录 + * + * @param fireFacilityRepair 消防设施维修记录 + * @return 结果 + */ + public int updateFireFacilityRepair(FireFacilityRepair fireFacilityRepair); + + /** + * 批量删除消防设施维修记录 + * + * @param ids 需要删除的消防设施维修记录主键集合 + * @return 结果 + */ + public int deleteFireFacilityRepairByIds(Long[] ids); + + /** + * 删除消防设施维修记录信息 + * + * @param id 消防设施维修记录主键 + * @return 结果 + */ + public int deleteFireFacilityRepairById(Long id); +} diff --git a/pasd-fire/src/main/java/com/ruoyi/fire/service/IFireFacilityReplacementService.java b/pasd-fire/src/main/java/com/ruoyi/fire/service/IFireFacilityReplacementService.java new file mode 100644 index 0000000..d647f58 --- /dev/null +++ b/pasd-fire/src/main/java/com/ruoyi/fire/service/IFireFacilityReplacementService.java @@ -0,0 +1,61 @@ +package com.ruoyi.fire.service; + +import java.util.List; +import com.ruoyi.fire.domain.FireFacilityReplacement; + +/** + * 消防设施更换记录Service接口 + * + * @author Junhau + * @date 2025-07-17 + */ +public interface IFireFacilityReplacementService +{ + /** + * 查询消防设施更换记录 + * + * @param id 消防设施更换记录主键 + * @return 消防设施更换记录 + */ + public FireFacilityReplacement selectFireFacilityReplacementById(Long id); + + /** + * 查询消防设施更换记录列表 + * + * @param fireFacilityReplacement 消防设施更换记录 + * @return 消防设施更换记录集合 + */ + public List selectFireFacilityReplacementList(FireFacilityReplacement fireFacilityReplacement); + + /** + * 新增消防设施更换记录 + * + * @param fireFacilityReplacement 消防设施更换记录 + * @return 结果 + */ + public int insertFireFacilityReplacement(FireFacilityReplacement fireFacilityReplacement); + + /** + * 修改消防设施更换记录 + * + * @param fireFacilityReplacement 消防设施更换记录 + * @return 结果 + */ + public int updateFireFacilityReplacement(FireFacilityReplacement fireFacilityReplacement); + + /** + * 批量删除消防设施更换记录 + * + * @param ids 需要删除的消防设施更换记录主键集合 + * @return 结果 + */ + public int deleteFireFacilityReplacementByIds(Long[] ids); + + /** + * 删除消防设施更换记录信息 + * + * @param id 消防设施更换记录主键 + * @return 结果 + */ + public int deleteFireFacilityReplacementById(Long id); +} diff --git a/pasd-fire/src/main/java/com/ruoyi/fire/service/IFireFacilityReportService.java b/pasd-fire/src/main/java/com/ruoyi/fire/service/IFireFacilityReportService.java new file mode 100644 index 0000000..7d1ef8c --- /dev/null +++ b/pasd-fire/src/main/java/com/ruoyi/fire/service/IFireFacilityReportService.java @@ -0,0 +1,22 @@ +package com.ruoyi.fire.service; + +import com.ruoyi.fire.domain.FireFacilityReport; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +public interface IFireFacilityReportService { + List selectFireFacilityReportList(FireFacilityReport fireFacilityReport); + int updateExpiryStatus(); + List> getReportData(String facilityType); + + + // 新增:计算动态状态的方法 + Integer calculateDynamicStatus(Date expiryDate, Integer originalStatus); + + // 新增:状态文本转换方法 + String getStatusText(Integer status); + + +} \ No newline at end of file diff --git a/pasd-fire/src/main/java/com/ruoyi/fire/service/IFireFacilityService.java b/pasd-fire/src/main/java/com/ruoyi/fire/service/IFireFacilityService.java index a50f6da..20a83d1 100644 --- a/pasd-fire/src/main/java/com/ruoyi/fire/service/IFireFacilityService.java +++ b/pasd-fire/src/main/java/com/ruoyi/fire/service/IFireFacilityService.java @@ -1,61 +1,92 @@ package com.ruoyi.fire.service; +import com.ruoyi.fire.domain.FireFacility; +import org.springframework.web.multipart.MultipartFile; + import java.util.List; -import com.ruoyi.fire.domain.FireFacility; - /** - * facilitiesService接口 + * 消防设施Service接口 * * @author Junhua * @date 2025-07-15 */ public interface IFireFacilityService { - /** - * 查询facilities - * - * @param id facilities主键 - * @return facilities - */ - public FireFacility selectFireFacilityById(Long id); /** - * 查询facilities列表 - * - * @param fireFacility facilities - * @return facilities集合 + * 检查并更新设施状态(根据过期时间) + * @param id 设施ID + * @return 1=更新成功,0=未更新 */ - public List selectFireFacilityList(FireFacility fireFacility); + int checkAndUpdateStatus(Long id); /** - * 新增facilities - * - * @param fireFacility facilities + * 分页更新设施过期状态 + * @param fireFacility 查询条件 + * @param pageNum 页码 + * @param pageSize 每页条数 + */ + void checkAndUpdateExpirationStatus(FireFacility fireFacility, Integer pageNum, Integer pageSize); + + /** + * 查询设施 + * @param id 设施主键 + * @return 设施 + */ + FireFacility selectFireFacilityById(Long id); + + /** + * 查询设施列表 + * @param fireFacility 设施 + * @return 设施集合 + */ + List selectFireFacilityList(FireFacility fireFacility); + + /** + * 新增设施 + * @param fireFacility 设施 * @return 结果 */ - public int insertFireFacility(FireFacility fireFacility); + int insertFireFacility(FireFacility fireFacility); /** - * 修改facilities - * - * @param fireFacility facilities + * 修改设施 + * @param fireFacility 设施 * @return 结果 */ - public int updateFireFacility(FireFacility fireFacility); + int updateFireFacility(FireFacility fireFacility); /** - * 批量删除facilities - * - * @param ids 需要删除的facilities主键集合 + * 批量删除设施 + * @param ids 需要删除的设施主键 * @return 结果 */ - public int deleteFireFacilityByIds(Long[] ids); + int deleteFireFacilityByIds(Long[] ids); /** - * 删除facilities信息 - * - * @param id facilities主键 + * 删除设施信息 + * @param id 设施主键 * @return 结果 */ - public int deleteFireFacilityById(Long id); -} + int deleteFireFacilityById(Long id); + + /** + * 导入消防设施数据 + * @param file Excel文件 + * @param updateSupport 是否支持更新 + * @return 导入结果 + */ + String importFireFacility(MultipartFile file, boolean updateSupport) throws Exception; + + /** + * 查询设施详情列表 + * @param fireFacility 查询条件 + * @return 设施详情集合 + */ + List getDetails(FireFacility fireFacility); + /** + * 根据位置和名称查询设施(用于导入时判断重复) + */ + + public FireFacility selectByLocationAndName(String locationId, String facilityName); +} \ No newline at end of file diff --git a/pasd-fire/src/main/java/com/ruoyi/fire/service/impl/FireFacilityRepairServiceImpl.java b/pasd-fire/src/main/java/com/ruoyi/fire/service/impl/FireFacilityRepairServiceImpl.java new file mode 100644 index 0000000..e9e9212 --- /dev/null +++ b/pasd-fire/src/main/java/com/ruoyi/fire/service/impl/FireFacilityRepairServiceImpl.java @@ -0,0 +1,95 @@ +package com.ruoyi.fire.service.impl; + +import java.util.List; +import com.ruoyi.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.fire.mapper.FireFacilityRepairMapper; +import com.ruoyi.fire.domain.FireFacilityRepair; +import com.ruoyi.fire.service.IFireFacilityRepairService; + +/** + * 消防设施维修记录Service业务层处理 + * + * @author Junhua + * @date 2025-07-16 + */ +@Service +public class FireFacilityRepairServiceImpl implements IFireFacilityRepairService +{ + @Autowired + private FireFacilityRepairMapper fireFacilityRepairMapper; + + /** + * 查询消防设施维修记录 + * + * @param id 消防设施维修记录主键 + * @return 消防设施维修记录 + */ + @Override + public FireFacilityRepair selectFireFacilityRepairById(Long id) + { + return fireFacilityRepairMapper.selectFireFacilityRepairById(id); + } + + /** + * 查询消防设施维修记录列表 + * + * @param fireFacilityRepair 消防设施维修记录 + * @return 消防设施维修记录 + */ + @Override + public List selectFireFacilityRepairList(FireFacilityRepair fireFacilityRepair) + { + return fireFacilityRepairMapper.selectFireFacilityRepairList(fireFacilityRepair); + } + + /** + * 新增消防设施维修记录 + * + * @param fireFacilityRepair 消防设施维修记录 + * @return 结果 + */ + @Override + public int insertFireFacilityRepair(FireFacilityRepair fireFacilityRepair) + { + fireFacilityRepair.setCreateTime(DateUtils.getNowDate()); + return fireFacilityRepairMapper.insertFireFacilityRepair(fireFacilityRepair); + } + + /** + * 修改消防设施维修记录 + * + * @param fireFacilityRepair 消防设施维修记录 + * @return 结果 + */ + @Override + public int updateFireFacilityRepair(FireFacilityRepair fireFacilityRepair) + { + return fireFacilityRepairMapper.updateFireFacilityRepair(fireFacilityRepair); + } + + /** + * 批量删除消防设施维修记录 + * + * @param ids 需要删除的消防设施维修记录主键 + * @return 结果 + */ + @Override + public int deleteFireFacilityRepairByIds(Long[] ids) + { + return fireFacilityRepairMapper.deleteFireFacilityRepairByIds(ids); + } + + /** + * 删除消防设施维修记录信息 + * + * @param id 消防设施维修记录主键 + * @return 结果 + */ + @Override + public int deleteFireFacilityRepairById(Long id) + { + return fireFacilityRepairMapper.deleteFireFacilityRepairById(id); + } +} diff --git a/pasd-fire/src/main/java/com/ruoyi/fire/service/impl/FireFacilityReplacementServiceImpl.java b/pasd-fire/src/main/java/com/ruoyi/fire/service/impl/FireFacilityReplacementServiceImpl.java new file mode 100644 index 0000000..f0437db --- /dev/null +++ b/pasd-fire/src/main/java/com/ruoyi/fire/service/impl/FireFacilityReplacementServiceImpl.java @@ -0,0 +1,95 @@ +package com.ruoyi.fire.service.impl; + +import java.util.List; +import com.ruoyi.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.fire.mapper.FireFacilityReplacementMapper; +import com.ruoyi.fire.domain.FireFacilityReplacement; +import com.ruoyi.fire.service.IFireFacilityReplacementService; + +/** + * 消防设施更换记录Service业务层处理 + * + * @author Junhau + * @date 2025-07-17 + */ +@Service +public class FireFacilityReplacementServiceImpl implements IFireFacilityReplacementService +{ + @Autowired + private FireFacilityReplacementMapper fireFacilityReplacementMapper; + + /** + * 查询消防设施更换记录 + * + * @param id 消防设施更换记录主键 + * @return 消防设施更换记录 + */ + @Override + public FireFacilityReplacement selectFireFacilityReplacementById(Long id) + { + return fireFacilityReplacementMapper.selectFireFacilityReplacementById(id); + } + + /** + * 查询消防设施更换记录列表 + * + * @param fireFacilityReplacement 消防设施更换记录 + * @return 消防设施更换记录 + */ + @Override + public List selectFireFacilityReplacementList(FireFacilityReplacement fireFacilityReplacement) + { + return fireFacilityReplacementMapper.selectFireFacilityReplacementList(fireFacilityReplacement); + } + + /** + * 新增消防设施更换记录 + * + * @param fireFacilityReplacement 消防设施更换记录 + * @return 结果 + */ + @Override + public int insertFireFacilityReplacement(FireFacilityReplacement fireFacilityReplacement) + { + fireFacilityReplacement.setCreateTime(DateUtils.getNowDate()); + return fireFacilityReplacementMapper.insertFireFacilityReplacement(fireFacilityReplacement); + } + + /** + * 修改消防设施更换记录 + * + * @param fireFacilityReplacement 消防设施更换记录 + * @return 结果 + */ + @Override + public int updateFireFacilityReplacement(FireFacilityReplacement fireFacilityReplacement) + { + return fireFacilityReplacementMapper.updateFireFacilityReplacement(fireFacilityReplacement); + } + + /** + * 批量删除消防设施更换记录 + * + * @param ids 需要删除的消防设施更换记录主键 + * @return 结果 + */ + @Override + public int deleteFireFacilityReplacementByIds(Long[] ids) + { + return fireFacilityReplacementMapper.deleteFireFacilityReplacementByIds(ids); + } + + /** + * 删除消防设施更换记录信息 + * + * @param id 消防设施更换记录主键 + * @return 结果 + */ + @Override + public int deleteFireFacilityReplacementById(Long id) + { + return fireFacilityReplacementMapper.deleteFireFacilityReplacementById(id); + } +} diff --git a/pasd-fire/src/main/java/com/ruoyi/fire/service/impl/FireFacilityReportServiceImpl.java b/pasd-fire/src/main/java/com/ruoyi/fire/service/impl/FireFacilityReportServiceImpl.java new file mode 100644 index 0000000..28f528f --- /dev/null +++ b/pasd-fire/src/main/java/com/ruoyi/fire/service/impl/FireFacilityReportServiceImpl.java @@ -0,0 +1,129 @@ +package com.ruoyi.fire.service.impl; + +import com.ruoyi.fire.domain.FireFacilityReport; +import com.ruoyi.fire.service.IFireFacilityReportService; +import com.ruoyi.fire.mapper.FireFacilityReportMapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; +import java.time.ZoneId; +import java.time.temporal.ChronoUnit; +import java.util.*; + +@Service +public class FireFacilityReportServiceImpl extends ServiceImpl implements IFireFacilityReportService { + + // 状态常量定义 + public static final int STATUS_NORMAL = 0; // 正常 + public static final int STATUS_WILL_EXPIRE = 1; // 即将过期 + public static final int STATUS_EXPIRED = 2; // 已过期 + public static final int STATUS_REPAIRING = 3; // 维修中 + public static final int STATUS_REPLACED = 4; // 已更换 + public static final int STATUS_SCRAPPED = 5; // 已报废 + + @Override + public List selectFireFacilityReportList(FireFacilityReport fireFacilityReport) { + return baseMapper.selectFireFacilityReportList(fireFacilityReport); + } + + @Override + @Transactional + public int updateExpiryStatus() { + return 0; // 已废弃 + } + + /** + * 支持按设施类型筛选的统计数据 + */ + @Override + public List> getReportData(String facilityType) { // 接收设施类型参数 + // 1. 按设施类型筛选数据 + FireFacilityReport query = new FireFacilityReport(); + query.setFacilityType(facilityType); // 应用前端筛选条件 + List list = selectFireFacilityReportList(query); + + // 2. 计算动态状态和状态文本 + for (FireFacilityReport facility : list) { + Integer dynamicStatus = calculateDynamicStatus(facility.getExpiryDate(), facility.getStatus()); + facility.setDynamicStatus(dynamicStatus); + facility.setStatusText(getStatusText(dynamicStatus)); + } + + // 3. 按【动态状态+设施类型】分组统计 + Map> statsMap = new HashMap<>(16); + for (FireFacilityReport facility : list) { + String statusKey = String.valueOf(facility.getDynamicStatus()); + String typeKey = facility.getFacilityType(); + if (typeKey == null) typeKey = "未知类型"; // 处理空类型 + + statsMap.computeIfAbsent(statusKey, k -> new HashMap<>(16)); + Integer currentTotal = statsMap.get(statusKey).getOrDefault(typeKey, 0); + statsMap.get(statusKey).put(typeKey, currentTotal + (facility.getQuantity() == null ? 1 : facility.getQuantity())); + } + + // 4. 按优先级排序组装结果 + List> resultList = new ArrayList<>(); + Integer[] priorityOrder = {STATUS_REPAIRING, STATUS_REPLACED, STATUS_SCRAPPED, STATUS_NORMAL, STATUS_WILL_EXPIRE, STATUS_EXPIRED}; + + for (Integer status : priorityOrder) { + Map typeCountMap = statsMap.get(String.valueOf(status)); + if (typeCountMap == null || typeCountMap.isEmpty()) continue; + + for (Map.Entry entry : typeCountMap.entrySet()) { + Map reportItem = new HashMap<>(8); + reportItem.put("status", status); + reportItem.put("statusText", getStatusText(status)); + reportItem.put("facilityType", entry.getKey()); + reportItem.put("total", entry.getValue()); + resultList.add(reportItem); + } + } + + return resultList; + } + + @Override + public Integer calculateDynamicStatus(Date expiryDate, Integer originalStatus) { + // 优先处理特殊状态 + if (originalStatus != null) { + if (originalStatus == STATUS_REPAIRING || originalStatus == STATUS_REPLACED || originalStatus == STATUS_SCRAPPED) { + return originalStatus; + } + } + + // 无过期日期默认正常 + if (expiryDate == null) { + return STATUS_NORMAL; + } + + // 日期转换(处理时区) + LocalDate today = LocalDate.now(); + LocalDate expiryLocalDate = expiryDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + long daysDiff = ChronoUnit.DAYS.between(today, expiryLocalDate); + + if (daysDiff < 0) { + return STATUS_EXPIRED; + } else if (daysDiff <= 30) { + return STATUS_WILL_EXPIRE; + } else { + return STATUS_NORMAL; + } + } + + @Override // 实现接口方法 + public String getStatusText(Integer status) { + if (status == null) { + return "未知状态"; + } + switch (status) { + case STATUS_NORMAL: return "正常"; + case STATUS_WILL_EXPIRE: return "即将过期"; + case STATUS_EXPIRED: return "已过期"; + case STATUS_REPAIRING: return "维修中"; + case STATUS_REPLACED: return "已更换"; + case STATUS_SCRAPPED: return "已报废"; + default: return "未知状态"; + } + } +} \ No newline at end of file diff --git a/pasd-fire/src/main/java/com/ruoyi/fire/service/impl/FireFacilityServiceImpl.java b/pasd-fire/src/main/java/com/ruoyi/fire/service/impl/FireFacilityServiceImpl.java index 21446b9..e0b200b 100644 --- a/pasd-fire/src/main/java/com/ruoyi/fire/service/impl/FireFacilityServiceImpl.java +++ b/pasd-fire/src/main/java/com/ruoyi/fire/service/impl/FireFacilityServiceImpl.java @@ -1,30 +1,174 @@ package com.ruoyi.fire.service.impl; -import java.util.List; - +import com.github.pagehelper.PageHelper; import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.fire.domain.FireFacility; +import com.ruoyi.fire.mapper.FireFacilityMapper; +import com.ruoyi.fire.service.IFireFacilityService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.ruoyi.fire.mapper.FireFacilityMapper; -import com.ruoyi.fire.domain.FireFacility; -import com.ruoyi.fire.service.IFireFacilityService; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.time.LocalDate; +import java.time.ZoneId; +import java.time.temporal.ChronoUnit; +import java.util.Date; +import java.util.List; /** - * facilitiesService业务层处理 + * 消防设施服务实现类 + * 实现接口定义的所有业务逻辑,包含状态动态计算、CRUD操作等 * * @author Junhua * @date 2025-07-15 */ @Service public class FireFacilityServiceImpl implements IFireFacilityService { + // 消防设施状态常量定义 + private static final Integer STATUS_NORMAL = 0; // 正常 + private static final Integer STATUS_WILL_EXPIRE = 1; // 即将过期 + private static final Integer STATUS_EXPIRED = 2; // 已过期 + private static final Integer STATUS_REPAIRING = 3; // 维修中 + private static final Integer STATUS_REPLACED = 4; // 已更换 + private static final Integer STATUS_SCRAPPED = 5; // 已报废 + + // 日志记录器 + private static final Logger log = LoggerFactory.getLogger(FireFacilityServiceImpl.class); + + // 注入数据访问层(Mapper) @Autowired private FireFacilityMapper fireFacilityMapper; /** - * 查询facilities - * - * @param id facilities主键 - * @return facilities + * 检查并更新设施状态(核心逻辑) + */ + @Override + @Transactional(rollbackFor = Exception.class) // 事务管理:异常时回滚 + public int checkAndUpdateStatus(Long id) { + // 1. 参数校验 + if (id == null || id <= 0) { + throw new IllegalArgumentException("设施ID无效(必须为正整数)"); + } + + // 2. 查询设施信息 + FireFacility facility = fireFacilityMapper.selectFireFacilityById(id); + if (facility == null) { + throw new RuntimeException("未查询到ID为" + id + "的消防设施"); + } + + // 3. 计算应有的动态状态 + Integer dynamicStatus = calculateDynamicStatus(facility.getExpiryDate(), facility.getStatus()); + Integer currentStatus = facility.getStatus(); + + // 4. 特殊状态(维修中/已更换/已报废)不更新 + if (currentStatus != null && ( + currentStatus == STATUS_REPAIRING || + currentStatus == STATUS_REPLACED || + currentStatus == STATUS_SCRAPPED)) { + log.info("设施[ID:{}]处于特殊状态({}),不执行状态更新", id, currentStatus); + return 0; + } + + // 5. 状态变化时执行更新 + if (!dynamicStatus.equals(currentStatus)) { + facility.setStatus(dynamicStatus); + facility.setUpdateTime(new Date()); // 更新时间戳 + int updateRows = fireFacilityMapper.updateFireFacility(facility); + log.info("设施[ID:{}]状态更新:{} → {}", id, currentStatus, dynamicStatus); + return updateRows > 0 ? 1 : 0; + } + + // 6. 状态未变化 + log.info("设施[ID:{}]状态未发生变化(当前状态:{})", id, currentStatus); + return 0; + } + + /** + * 计算动态状态(核心算法) + * 根据过期日期和当前状态,自动判断应有的状态 + */ + private Integer calculateDynamicStatus(Date expiryDate, Integer originalStatus) { + // 处理原始状态为null的情况(默认正常) + if (originalStatus == null) { + originalStatus = STATUS_NORMAL; + } + + // 特殊状态直接返回(不参与动态计算) + if (originalStatus == STATUS_REPAIRING || + originalStatus == STATUS_REPLACED || + originalStatus == STATUS_SCRAPPED) { + return originalStatus; + } + + // 无过期日期时默认正常 + if (expiryDate == null) { + return STATUS_NORMAL; + } + + try { + // 转换日期为LocalDate(处理时区问题) + LocalDate today = LocalDate.now(); + LocalDate expiryLocalDate = expiryDate.toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDate(); + + // 计算与过期日期的天数差 + long daysDiff = ChronoUnit.DAYS.between(today, expiryLocalDate); + + // 判断状态 + if (daysDiff < 0) { + return STATUS_EXPIRED; // 已过期(过期日期在今天之前) + } else if (daysDiff <= 30) { + return STATUS_WILL_EXPIRE; // 即将过期(30天内过期) + } else { + return STATUS_NORMAL; // 正常(30天以上过期) + } + } catch (Exception e) { + log.error("日期转换失败,expiryDate={}", expiryDate, e); + throw new RuntimeException("处理过期日期时发生错误,请检查日期格式是否合法"); + } + } + + /** + * 分页更新设施状态(用于列表查询时批量刷新) + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void checkAndUpdateExpirationStatus(FireFacility fireFacility, Integer pageNum, Integer pageSize) { + // 1. 分页查询当前页数据 + PageHelper.startPage(pageNum, pageSize); + List facilityList = fireFacilityMapper.selectFireFacilityList(fireFacility); + log.info("开始更新第{}页设施状态,共{}条数据", pageNum, facilityList.size()); + + // 2. 遍历当前页数据,逐个更新状态 + Date now = new Date(); + for (FireFacility facility : facilityList) { + // 跳过特殊状态的设施 + if (facility.getStatus() != null && ( + facility.getStatus() == STATUS_REPAIRING || + facility.getStatus() == STATUS_REPLACED || + facility.getStatus() == STATUS_SCRAPPED)) { + continue; + } + + // 计算新状态并更新 + Integer newStatus = calculateDynamicStatus(facility.getExpiryDate(), facility.getStatus()); + if (!newStatus.equals(facility.getStatus())) { + facility.setStatus(newStatus); + facility.setUpdateTime(now); + fireFacilityMapper.updateFireFacility(facility); + log.debug("批量更新 - 设施[ID:{}]状态:{} → {}", facility.getId(), facility.getStatus(), newStatus); + } + } + } + + /** + * 根据ID查询设施 */ @Override public FireFacility selectFireFacilityById(Long id) { @@ -32,10 +176,7 @@ public class FireFacilityServiceImpl implements IFireFacilityService { } /** - * 查询facilities列表 - * - * @param fireFacility facilities - * @return facilities + * 查询设施列表 */ @Override public List selectFireFacilityList(FireFacility fireFacility) { @@ -43,34 +184,31 @@ public class FireFacilityServiceImpl implements IFireFacilityService { } /** - * 新增facilities - * - * @param fireFacility facilities - * @return 结果 + * 新增设施 */ @Override public int insertFireFacility(FireFacility fireFacility) { - fireFacility.setCreateTime(DateUtils.getNowDate()); + // 设置创建/更新时间 + Date now = new Date(); + fireFacility.setCreateTime(now); + fireFacility.setUpdateTime(now); + // 自动计算初始状态 + fireFacility.setStatus(calculateDynamicStatus(fireFacility.getExpiryDate(), null)); return fireFacilityMapper.insertFireFacility(fireFacility); } /** - * 修改facilities - * - * @param fireFacility facilities - * @return 结果 + * 修改设施 */ @Override public int updateFireFacility(FireFacility fireFacility) { - fireFacility.setUpdateTime(DateUtils.getNowDate()); + // 更新时间戳 + fireFacility.setUpdateTime(new Date()); return fireFacilityMapper.updateFireFacility(fireFacility); } /** - * 批量删除facilities - * - * @param ids 需要删除的facilities主键 - * @return 结果 + * 批量删除设施 */ @Override public int deleteFireFacilityByIds(Long[] ids) { @@ -78,13 +216,92 @@ public class FireFacilityServiceImpl implements IFireFacilityService { } /** - * 删除facilities信息 - * - * @param id facilities主键 - * @return 结果 + * 单个删除设施 */ @Override public int deleteFireFacilityById(Long id) { return fireFacilityMapper.deleteFireFacilityById(id); } -} + + /** + * 导入设施数据 + */ + @Override + public String importFireFacility(MultipartFile file, boolean updateSupport) throws Exception { + ExcelUtil util = new ExcelUtil<>(FireFacility.class); + List facilityList = util.importExcel(file.getInputStream()); + + // 校验导入数据 + if (StringUtils.isEmpty(facilityList)) { + throw new Exception("导入数据为空,请检查Excel文件内容"); + } + + int successNum = 0; // 成功数量 + int failureNum = 0; // 失败数量 + StringBuilder failureMsg = new StringBuilder(); // 失败原因 + Date now = new Date(); + + // 遍历处理每条数据 + for (FireFacility facility : facilityList) { + try { + // 基础校验:名称和位置ID不能为空 + if (StringUtils.isEmpty(facility.getFacilityName()) || StringUtils.isEmpty(facility.getLocationId())) { + failureNum++; + failureMsg.append("
" + failureNum + "、设施名称或位置ID为空"); + continue; + } + + // 检查是否已存在(根据位置+名称判断) + FireFacility existFacility = selectByLocationAndName(facility.getLocationId(), facility.getFacilityName()); + if (existFacility == null) { + // 新增 + facility.setCreateTime(now); + facility.setUpdateTime(now); + facility.setStatus(calculateDynamicStatus(facility.getExpiryDate(), null)); + fireFacilityMapper.insertFireFacility(facility); + successNum++; + } else if (updateSupport) { + // 更新已存在的数据 + facility.setId(existFacility.getId()); // 覆盖ID + facility.setCreateTime(existFacility.getCreateTime()); // 保留创建时间 + facility.setUpdateTime(now); // 更新时间戳 + fireFacilityMapper.updateFireFacility(facility); + successNum++; + } else { + // 不允许更新,视为失败 + failureNum++; + failureMsg.append("
" + failureNum + "、设施[" + facility.getFacilityName() + "]已存在"); + } + } catch (Exception e) { + failureNum++; + String facilityName = (facility.getFacilityName() != null) ? facility.getFacilityName() : "未知设施"; + failureMsg.append("
" + failureNum + "、设施[" + facilityName + "]导入失败:" + e.getMessage()); + log.error("导入设施失败", e); + } + } + + // 组装结果 + if (failureNum > 0) { + failureMsg.insert(0, "导入失败,共" + failureNum + "条数据异常:"); + throw new Exception(failureMsg.toString()); + } else { + return "导入成功,共处理" + successNum + "条数据"; + } + } + + /** + * 查询设施详情列表 + */ + @Override + public List getDetails(FireFacility fireFacility) { + return fireFacilityMapper.getDetails(fireFacility); + } + + /** + * 根据位置和名称查询设施(用于导入时判断重复) + */ + @Override + public FireFacility selectByLocationAndName(String locationId, String facilityName) { + return fireFacilityMapper.selectByLocationAndName(locationId, facilityName); + } +} \ No newline at end of file diff --git a/pasd-fire/src/main/resources/mapper/fire/FireFacilityMapper.xml b/pasd-fire/src/main/resources/mapper/fire/FireFacilityMapper.xml index 2668d4f..ebb259e 100644 --- a/pasd-fire/src/main/resources/mapper/fire/FireFacilityMapper.xml +++ b/pasd-fire/src/main/resources/mapper/fire/FireFacilityMapper.xml @@ -3,7 +3,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + @@ -26,7 +26,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + + + where location_id = #{locationId} and facility_name = #{facilityName} + + + + + + + + \ No newline at end of file diff --git a/pasd-fire/src/main/resources/mapper/fire/FireFacilityRepairMapper.xml b/pasd-fire/src/main/resources/mapper/fire/FireFacilityRepairMapper.xml new file mode 100644 index 0000000..4255c90 --- /dev/null +++ b/pasd-fire/src/main/resources/mapper/fire/FireFacilityRepairMapper.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + select id, facility_id, repair_date, repair_content, repair_result, replace_person, remark, next_check_date, create_time from fire_facility_repair + + + + + + + + insert into fire_facility_repair + + facility_id, + repair_date, + repair_content, + repair_result, + replace_person, + remark, + next_check_date, + create_time, + + + #{facilityId}, + #{repairDate}, + #{repairContent}, + #{repairResult}, + #{replacePerson}, + #{remark}, + #{nextCheckDate}, + #{createTime}, + + + + + update fire_facility_repair + + facility_id = #{facilityId}, + repair_date = #{repairDate}, + repair_content = #{repairContent}, + repair_result = #{repairResult}, + replace_person = #{replacePerson}, + remark = #{remark}, + next_check_date = #{nextCheckDate}, + create_time = #{createTime}, + + where id = #{id} + + + + delete from fire_facility_repair where id = #{id} + + + + delete from fire_facility_repair where id in + + #{id} + + + \ No newline at end of file diff --git a/pasd-fire/src/main/resources/mapper/fire/FireFacilityReplacementMapper.xml b/pasd-fire/src/main/resources/mapper/fire/FireFacilityReplacementMapper.xml new file mode 100644 index 0000000..61cf7ff --- /dev/null +++ b/pasd-fire/src/main/resources/mapper/fire/FireFacilityReplacementMapper.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + select id, old_facility_id, new_facility_id, replace_date, replace_reason, replace_person, remark, create_time from fire_facility_replacement + + + + + + + + insert into fire_facility_replacement + + old_facility_id, + new_facility_id, + replace_date, + replace_reason, + replace_person, + remark, + create_time, + + + #{oldFacilityId}, + #{newFacilityId}, + #{replaceDate}, + #{replaceReason}, + #{replacePerson}, + #{remark}, + #{createTime}, + + + + + update fire_facility_replacement + + old_facility_id = #{oldFacilityId}, + new_facility_id = #{newFacilityId}, + replace_date = #{replaceDate}, + replace_reason = #{replaceReason}, + replace_person = #{replacePerson}, + remark = #{remark}, + create_time = #{createTime}, + + where id = #{id} + + + + delete from fire_facility_replacement where id = #{id} + + + + delete from fire_facility_replacement where id in + + #{id} + + + \ No newline at end of file diff --git a/pasd-fire/src/main/resources/mapper/fire/FireFacilityReportMapper.xml b/pasd-fire/src/main/resources/mapper/fire/FireFacilityReportMapper.xml new file mode 100644 index 0000000..e5f96f7 --- /dev/null +++ b/pasd-fire/src/main/resources/mapper/fire/FireFacilityReportMapper.xml @@ -0,0 +1,39 @@ + + + + + + + + UPDATE fire_facilities + SET status = #{newStatus}, + update_time = NOW() + WHERE id IN + + #{id} + + + + \ No newline at end of file