diff --git a/fys-common/fys-common-core/src/main/java/com/fuyuanshen/common/core/constant/ResponseMessageConstants.java b/fys-common/fys-common-core/src/main/java/com/fuyuanshen/common/core/constant/ResponseMessageConstants.java new file mode 100644 index 0000000..a571cb0 --- /dev/null +++ b/fys-common/fys-common-core/src/main/java/com/fuyuanshen/common/core/constant/ResponseMessageConstants.java @@ -0,0 +1,28 @@ +package com.fuyuanshen.common.core.constant; + +/** + * 响应消息常量类 + * + * @author: 默苍璃 + * @date: 2025-06-2117:21 + */ +public class ResponseMessageConstants { + + /** + * 删除操作成功提示 + */ + public static final String DELETE_SUCCESS = "删除成功!"; + + /** + * 新增操作成功提示 + */ + public static final String SAVE_SUCCESS = "新增成功!"; + + /** + * 更新操作成功提示 + */ + public static final String UPDATE_SUCCESS = "更新成功!"; + + // 可根据业务需求继续扩展其他常用提示信息 + +} diff --git a/fys-modules/fys-equipment/pom.xml b/fys-modules/fys-equipment/pom.xml index 42b39fe..ca320b0 100644 --- a/fys-modules/fys-equipment/pom.xml +++ b/fys-modules/fys-equipment/pom.xml @@ -101,8 +101,19 @@ fys-common-sse + + com.alibaba + easyexcel + 3.3.1 + + + poi-ooxml-schemas + org.apache.poi + + + + - diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/controller/DeviceController.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/controller/DeviceController.java index e9ef1db..663006c 100644 --- a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/controller/DeviceController.java +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/controller/DeviceController.java @@ -2,21 +2,28 @@ package com.fuyuanshen.equipment.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fuyuanshen.common.core.constant.ResponseMessageConstants; import com.fuyuanshen.common.core.domain.PageResult; import com.fuyuanshen.common.core.domain.ResponseVO; import com.fuyuanshen.equipment.domain.Device; +import com.fuyuanshen.equipment.domain.dto.ImportResult; import com.fuyuanshen.equipment.domain.form.DeviceForm; import com.fuyuanshen.equipment.domain.query.DeviceQueryCriteria; +import com.fuyuanshen.equipment.domain.vo.CustomerVo; import com.fuyuanshen.equipment.service.DeviceService; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import java.io.IOException; +import java.util.List; /** * @Description: @@ -60,152 +67,126 @@ public class DeviceController { } return ResponseVO.success(null); } -// -// -// /** -// * @param deviceForm -// * @return -// * @ModelAttribute 主要用于将请求参数绑定到 Java 对象上,它会从 HTTP 请求的查询参数(Query Parameters) -// * 或表单数据(Form Data)中提取值,并自动填充到指定的对象属性中。 -// */ -// @Log("解绑设备") -// @ApiOperation("解绑设备") -// @PostMapping(value = "/unbind") -// public ResponseVO unbindDevice(@Validated @ModelAttribute DeviceForm deviceForm) { -// deviceService.unbindDevice(deviceForm); -// return ResponseVO.success("解绑成功!!!"); -// } -// -// -// @Log("修改设备") -// @ApiOperation("修改设备") -// @PutMapping(value = "/update") -// public ResponseVO updateDevice(@Validated @ModelAttribute DeviceForm deviceForm) { -// try { -// deviceService.update(deviceForm); -// } catch (Exception e) { -// log.error("updateDevice error: " + e.getMessage()); -// return ResponseVO.fail("出错了"); -// } -// return ResponseVO.success(null); -// } -// -// -// @Log("分配客户") -// @ApiOperation("分配客户") -// @PutMapping(value = "/assignCustomer") -// public ResponseVO assignCustomer(@Validated @RequestBody CustomerVo customerVo) { -// deviceService.assignCustomer(customerVo); -// return ResponseVO.success(null); -// } -// -// -// @Log("撤回设备") -// @ApiOperation("撤回设备") -// @PostMapping(value = "/withdraw") -// public ResponseVO withdrawDevice(@Validated @ModelAttribute DeviceForm deviceForm) { -// try { -// deviceService.withdrawDevice(deviceForm); -// } catch (Exception e) { -// log.error("updateDevice error: " + e.getMessage()); -// return ResponseVO.fail("出错了"); -// } -// return ResponseVO.success(null); -// } -// -// -// @ApiOperation("设备详情") -// @GetMapping(value = "/detail/{id}") -// public ResponseVO getDevice(@PathVariable Long id) { -// Device device = deviceService.getById(id); -// return ResponseVO.success(device); -// } -// -// -// @Log("删除设备") -// @ApiOperation("删除设备") -// @DeleteMapping(value = "/delete") -// public ResponseVO deleteDevice(@ApiParam(value = "传ID数组[]") @RequestBody List ids) { -// // deviceService.deleteAll(ids); -// deviceService.deleteAssign(ids); -// return ResponseVO.success(ResponseMessageConstants.DELETE_SUCCESS); -// } -// -// -// @ApiOperation("导出数据设备") -// @GetMapping(value = "/download") -// public void exportDevice(HttpServletResponse response, DeviceQueryCriteria criteria) throws IOException { -// // deviceService.download(deviceService.queryAll(criteria), response); -// User onlineuser = userService.findByName(SecurityUtils.getCurrentUsername()); -// -// // 只能看到自己的创建的设备,以及被分配的设备。 -// if (onlineuser.getTenantId() != null && !onlineuser.getTenantId().equals(UserConstants.SUPER_ADMIN_ID)) { -// // criteria.setTenantId(onlineuser.getTenantId()); -// criteria.setCurrentOwnerId(onlineuser.getId()); -// } -// exportService.export(deviceService.queryAll(criteria), response); -// } -// -// -// @ApiOperation("设备定位") -// @GetMapping(value = "/locateDevice") -// public ResponseVO locateDevice(DeviceQueryCriteria criteria) throws IOException { -// List devices = deviceService.queryAllDevices(criteria); -// return ResponseVO.success(devices); -// } -// -// @ApiOperation("设备数据模板下载") -// @GetMapping("/template") -// public void download(HttpServletRequest request, HttpServletResponse response) throws IOException, URISyntaxException { -// // String filePath = "resources" + File.separator + "template" + File.separator + "device_import.csv"; -// Path path = Paths.get(ClassLoader.getSystemResource("template/device_import.csv").toURI()); -// FileUtil.downloadFile(request, response, new File(path.toUri()), true); -// } -// -// -// @ApiOperation("导入设备数据") -// @PostMapping(value = "/import", consumes = "multipart/form-data") -// public ResponseVO importData(@ApiParam(value = "文件", required = true) @RequestPart("file") MultipartFile file) { -// -// String suffix = FileUtil.getExtensionName(file.getOriginalFilename()); -// if (!("xlsx".equalsIgnoreCase(suffix))) { -// throw new BadRequestException("只能上传Excel——xlsx格式文件"); -// } -// -// ImportResult result = new ImportResult(); -// try { -// User currentUser = userMapper.findByUsername(SecurityUtils.getCurrentUsername()); -// DeviceImportParams params = DeviceImportParams.builder().ip(ip).deviceService(deviceService).tenantId(currentUser.getTenantId()).file(file).filePath(filePath).deviceMapper(deviceMapper).deviceAssignmentsService(deviceAssignmentsService).deviceTypeMapper(deviceTypeMapper).userId(currentUser.getId()).userMapper(userMapper).build(); -// // 创建监听器 -// UploadDeviceDataListener listener = new UploadDeviceDataListener(params); -// // 读取Excel -// EasyExcel.read(file.getInputStream(), DeviceExcelImportDTO.class, listener).sheet().doRead(); -// // 获取导入结果 -// result = listener.getImportResult(); -// // 设置响应消息 -// String message = String.format("成功导入 %d 条数据,失败 %d 条", result.getSuccessCount(), result.getFailureCount()); -// // 返回带有正确泛型的响应 -// return ResponseVO.success(message, result); -// } catch (Exception e) { -// log.error("导入设备数据出错: {}", e.getMessage(), e); -// // 在异常情况下,设置默认结果 -// String errorMessage = String.format("导入失败: %s。成功 %d 条,失败 %d 条", e.getMessage(), result.getSuccessCount(), result.getFailureCount()); -// // 使用新方法确保类型正确 -// return ResponseVO.fail(errorMessage, result); -// } -// } -// -// @ApiOperation("下载导入错误报告") -// @GetMapping("/download-import-errors") -// public ResponseEntity downloadImportErrors(@RequestParam String errorData) { -// try { -// // 解码Base64字符串 -// byte[] data = Base64.getDecoder().decode(errorData); -// return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"import_errors.xlsx\"").contentType(MediaType.APPLICATION_OCTET_STREAM).body(data); -// } catch (Exception e) { -// log.error("下载错误报告失败", e); -// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); -// } -// } + + + // @Log("修改设备") + @Operation(summary = "修改设备") + @PutMapping(value = "/update") + public ResponseVO updateDevice(@Validated @ModelAttribute DeviceForm deviceForm) { + try { + deviceService.update(deviceForm); + } catch (Exception e) { + e.printStackTrace(); + log.error("updateDevice error: " + e.getMessage()); + return ResponseVO.fail("出错了"); + } + return ResponseVO.success(null); + } + + + @Operation(summary = "设备详情") + @GetMapping(value = "/detail/{id}") + public ResponseVO getDevice(@PathVariable Long id) { + Device device = deviceService.getById(id); + return ResponseVO.success(device); + } + + + // @Log("删除设备") + @Operation(summary = "删除设备") + @DeleteMapping(value = "/delete") + public ResponseVO deleteDevice(@Parameter(name = "传ID数组[]") @RequestBody List ids) { + deviceService.deleteAll(ids); + // deviceService.deleteAssign(ids); + return ResponseVO.success(ResponseMessageConstants.DELETE_SUCCESS); + } + + + @Operation(summary = "设备定位") + @GetMapping(value = "/locateDevice") + public ResponseVO locateDevice(DeviceQueryCriteria criteria) throws IOException { + List devices = deviceService.queryAllDevices(criteria); + return ResponseVO.success(devices); + } + + + // @Log("分配客户") + @Operation(summary = "分配客户") + @PutMapping(value = "/assignCustomer") + public ResponseVO assignCustomer(@Validated @RequestBody CustomerVo customerVo) { + deviceService.assignCustomer(customerVo); + return ResponseVO.success(null); + } + + + // @Log("撤回设备") + @Operation(summary = "撤回设备") + @PostMapping(value = "/withdraw") + public ResponseVO withdrawDevice(@Validated @ModelAttribute DeviceForm deviceForm) { + try { + deviceService.withdrawDevice(deviceForm); + } catch (Exception e) { + log.error("updateDevice error: " + e.getMessage()); + return ResponseVO.fail("出错了"); + } + return ResponseVO.success(null); + } + + + /** + * @param deviceForm + * @return + * @ModelAttribute 主要用于将请求参数绑定到 Java 对象上,它会从 HTTP 请求的查询参数(Query Parameters) + * 或表单数据(Form Data)中提取值,并自动填充到指定的对象属性中。 + */ + // @Log("解绑设备") + @Operation(summary = "解绑设备") + @PostMapping(value = "/unbind") + public ResponseVO unbindDevice(@Validated @ModelAttribute DeviceForm deviceForm) { + deviceService.unbindDevice(deviceForm); + return ResponseVO.success("解绑成功!!!"); + } + + + @Operation(summary = "导出数据设备") + @GetMapping(value = "/download") + public void exportDevice(HttpServletResponse response, DeviceQueryCriteria criteria) throws IOException { + + } + + + @Operation(summary = "导入设备数据") + @PostMapping(value = "/import", consumes = "multipart/form-data") + public ResponseVO importData(@Parameter(name = "文件", required = true) @RequestPart("file") MultipartFile file) { + + // String suffix = FileUtil.getExtensionName(file.getOriginalFilename()); + // if (!("xlsx".equalsIgnoreCase(suffix))) { + // throw new BadRequestException("只能上传Excel——xlsx格式文件"); + // } + // + // ImportResult result = new ImportResult(); + // try { + // User currentUser = userMapper.findByUsername(SecurityUtils.getCurrentUsername()); + // DeviceImportParams params = DeviceImportParams.builder().ip(ip).deviceService(deviceService).tenantId(currentUser.getTenantId()).file(file).filePath(filePath).deviceMapper(deviceMapper).deviceAssignmentsService(deviceAssignmentsService).deviceTypeMapper(deviceTypeMapper).userId(currentUser.getId()).userMapper(userMapper).build(); + // // 创建监听器 + // UploadDeviceDataListener listener = new UploadDeviceDataListener(params); + // // 读取Excel + // EasyExcel.read(file.getInputStream(), DeviceExcelImportDTO.class, listener).sheet().doRead(); + // // 获取导入结果 + // result = listener.getImportResult(); + // // 设置响应消息 + // String message = String.format("成功导入 %d 条数据,失败 %d 条", result.getSuccessCount(), result.getFailureCount()); + // // 返回带有正确泛型的响应 + // return ResponseVO.success(message, result); + // } catch (Exception e) { + // log.error("导入设备数据出错: {}", e.getMessage(), e); + // // 在异常情况下,设置默认结果 + // String errorMessage = String.format("导入失败: %s。成功 %d 条,失败 %d 条", e.getMessage(), result.getSuccessCount(), result.getFailureCount()); + // // 使用新方法确保类型正确 + // return ResponseVO.fail(errorMessage, result); + return null; + } } + + diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/dto/DeviceExcelImportDTO.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/dto/DeviceExcelImportDTO.java new file mode 100644 index 0000000..7fce9e8 --- /dev/null +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/dto/DeviceExcelImportDTO.java @@ -0,0 +1,65 @@ +package com.fuyuanshen.equipment.domain.dto; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.converters.bytearray.ByteArrayImageConverter; +import lombok.Data; + +/** + * @author: 默苍璃 + * @date: 2025-06-0710:00 + */ +@Data +@HeadRowHeight(20) // 表头行高 +@ContentRowHeight(100) // 内容行高 +public class DeviceExcelImportDTO { + + @ExcelProperty("设备类型") + private Long deviceType; + + @ExcelProperty("客户号") + private Long customerId; + + @ExcelProperty("设备名称") + @ColumnWidth(20) + private String deviceName; + + + @ExcelProperty(value = "设备图片", converter = ByteArrayImageConverter.class) + @ColumnWidth(15) + private byte[] devicePic; + + // 添加图片写入方法 + public void setDevicePicFromBytes(byte[] bytes) { + this.devicePic = bytes; + } + + @ExcelProperty("设备MAC") + @ColumnWidth(20) + private String deviceMac; + + @ExcelProperty("设备IMEI") + @ColumnWidth(20) + private String deviceImei; + + @ExcelProperty("设备SN") + @ColumnWidth(20) + private String deviceSn; + + @ExcelProperty("经度") + private String longitude; + + @ExcelProperty("纬度") + private String latitude; + + @ExcelProperty("备注") + @ColumnWidth(30) + private String remark; + + @ExcelProperty("设备类型名称") + @ColumnWidth(20) + private String typeName; + +} \ No newline at end of file diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/dto/ImportResult.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/dto/ImportResult.java new file mode 100644 index 0000000..fd4fa5e --- /dev/null +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/dto/ImportResult.java @@ -0,0 +1,25 @@ +package com.fuyuanshen.equipment.domain.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @author: 默苍璃 + * @date: 2025-06-0717:01 + */ +@Data +public class ImportResult { + private int successCount; + private int failureCount; + private List failedRecords; + // private byte[] errorExcelData; // 存储失败数据的Excel字节流 + + private String errorExcelUrl; // 改为存储错误报告的URL + + // 添加成功/失败统计信息 + public String getSummary() { + return String.format("成功导入 %d 条数据,失败 %d 条", successCount, failureCount); + } + +} diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/vo/CustomerVo.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/vo/CustomerVo.java new file mode 100644 index 0000000..b2ff048 --- /dev/null +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/vo/CustomerVo.java @@ -0,0 +1,27 @@ +package com.fuyuanshen.equipment.domain.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.springframework.validation.annotation.Validated; + +import java.util.List; + +/** + * @Description: 分配客户的Vo类 + * @Author: WY + * @Date: 2025/5/28 + **/ +@Data +@Validated +public class CustomerVo { + + @Schema(name = "客户ID") + @NotNull(message = "客户ID不能为空") + private Long customerId; + + @Schema(name = "设备ID") + @NotNull(message = "设备ID不能为空") + private List deviceIds; + +} diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/DeviceService.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/DeviceService.java index 54126fb..fec0c52 100644 --- a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/DeviceService.java +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/DeviceService.java @@ -6,8 +6,10 @@ import com.fuyuanshen.common.core.domain.PageResult; import com.fuyuanshen.equipment.domain.Device; import com.fuyuanshen.equipment.domain.form.DeviceForm; import com.fuyuanshen.equipment.domain.query.DeviceQueryCriteria; +import com.fuyuanshen.equipment.domain.vo.CustomerVo; import java.io.IOException; +import java.util.List; /** * @Description: @@ -25,6 +27,14 @@ public interface DeviceService extends IService { */ PageResult queryAll(DeviceQueryCriteria criteria, Page page) throws IOException; + /** + * 查询所有设备信息 + * + * @param criteria + * @return + */ + List queryAllDevices(DeviceQueryCriteria criteria); + /** * 新增设备 * @@ -32,85 +42,34 @@ public interface DeviceService extends IService { */ void addDevice(DeviceForm resources) throws Exception; - // /** - // * 查询所有数据不分页 - // * - // * @param criteria 条件参数 - // * @return List - // */ - // List queryAll(DeviceQueryCriteria criteria); - // - // /** - // * 查询所有设备信息 - // * - // * @param criteria - // * @return - // */ - // List queryAllDevices(DeviceQueryCriteria criteria); - // - // /** - // * 创建 - // * - // * @param resources / - // */ - // void create(Device resources); - // - // /** - // * 新增设备 - // * - // * @param resources - // */ - // void addDevice(DeviceForm resources) throws Exception; - // - // /** - // * 编辑 - // * - // * @param resources / - // */ - // void update(DeviceForm resources) throws Exception; - // - // /** - // * 分配客户 - // */ - // void assignCustomer(CustomerVo customerVo); - // - // void withdrawDevice(DeviceForm deviceForm); - // - // /** - // * 多选删除 - // * - // * @param ids / - // */ - // void deleteAll(List ids); - // - // /** - // * 删除设备分配记录 - // * - // * @param ids - // */ - // void deleteAssign(List ids); - // - // /** - // * 导出数据 - // * - // * @param all 待导出的数据 - // * @param response / - // * @throws IOException / - // */ - // void download(List all, HttpServletResponse response) throws IOException; - // - // /** - // * 导入设备数据 - // * - // * @param file - // */ - // void importData(MultipartFile file) throws IOException; - // - // /** - // * 解绑设备 - // * - // * @param deviceForm - // */ - // void unbindDevice(DeviceForm deviceForm); + /** + * 修改设备 + * + * @param resources / + */ + void update(DeviceForm resources) throws Exception; + /** + * 批量删除 + * + * @param ids / + */ + void deleteAll(List ids); + + /** + * 分配客户 + */ + void assignCustomer(CustomerVo customerVo); + + /** + * 撤回设备 + */ + void withdrawDevice(DeviceForm deviceForm); + + /** + * 解绑设备 + * + * @param deviceForm + */ + void unbindDevice(DeviceForm deviceForm); } diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/impl/DeviceServiceImpl.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/impl/DeviceServiceImpl.java index 44e07ef..a51b8d8 100644 --- a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/impl/DeviceServiceImpl.java +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/impl/DeviceServiceImpl.java @@ -1,18 +1,17 @@ package com.fuyuanshen.equipment.service.impl; import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; - import com.fuyuanshen.common.core.domain.PageResult; import com.fuyuanshen.common.core.utils.PageUtil; -import com.fuyuanshen.equipment.domain.Device; import com.fuyuanshen.equipment.constants.DeviceConstants; -import com.fuyuanshen.equipment.domain.DeviceType; +import com.fuyuanshen.equipment.domain.Device; import com.fuyuanshen.equipment.domain.form.DeviceForm; import com.fuyuanshen.equipment.domain.query.DeviceQueryCriteria; -import com.fuyuanshen.equipment.enums.DeviceStatusEnum; +import com.fuyuanshen.equipment.domain.vo.CustomerVo; import com.fuyuanshen.equipment.mapper.DeviceMapper; import com.fuyuanshen.equipment.service.DeviceService; import lombok.RequiredArgsConstructor; @@ -22,9 +21,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; -import java.io.*; -import java.time.LocalDateTime; -import java.util.*; +import java.io.File; +import java.io.IOException; +import java.sql.Timestamp; +import java.util.List; /** * @Description: @@ -69,6 +69,18 @@ public class DeviceServiceImpl extends ServiceImpl impleme } + /** + * 查询所有设备 + * + * @param criteria 筛选条件 + * @return + */ + @Override + public List queryAllDevices(DeviceQueryCriteria criteria) { + return deviceMapper.findAllDevices(criteria); + } + + /** * 新增设备 * @@ -83,7 +95,7 @@ public class DeviceServiceImpl extends ServiceImpl impleme // LoginUser user = LoginHelper.getLoginUser(); // 保存图片并获取URL - String imageUrl = saveDeviceImage(deviceForm.getFile(), deviceForm.getDeviceMac()); + String imageUrl = saveDeviceImage(deviceForm.getFile(), deviceForm.getDeviceName()); // 设置图片路径 deviceForm.setDevicePic(imageUrl); @@ -95,6 +107,33 @@ public class DeviceServiceImpl extends ServiceImpl impleme } + + /** + * 更新设备信息 + * + * @param deviceForm / + * @throws Exception + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void update(DeviceForm deviceForm) throws Exception { + + Device device = getById(deviceForm.getId()); + if (device == null) { + throw new Exception("设备不存在!!!"); + } + + // 处理上传的图片 + String imageUrl = saveDeviceImage(deviceForm.getFile(), device.getDeviceName()); + deviceForm.setDevicePic(imageUrl); + + // 更新字段 + BeanUtil.copyProperties(deviceForm, device, true); + device.setUpdateTime(new Timestamp(System.currentTimeMillis())); + deviceMapper.updateById(device); + } + + /** * 保存设备图片并返回访问路径 * @@ -124,457 +163,55 @@ public class DeviceServiceImpl extends ServiceImpl impleme } - // /** - // * 更新设备信息 - // * - // * @param deviceForm / - // * @throws Exception - // */ - // @Override - // @Transactional(rollbackFor = Exception.class) - // public void update(DeviceForm deviceForm) throws Exception { - // Device device = getById(deviceForm.getId()); - // - // // 处理上传的图片 - // String imageUrl = saveDeviceImage(deviceForm.getFile(), device.getDeviceMac()); - // deviceForm.setDevicePic(imageUrl); - // - // // 更新字段 - // BeanUtil.copyProperties(deviceForm, device, true); - // device.setUpdateTime(new Timestamp(System.currentTimeMillis())); - // deviceMapper.updateById(device); - // } - // - // - // /** - // * 保存设备图片并返回访问路径 - // * - // * @param file MultipartFile - // * @param deviceMac 设备MAC用于生成唯一文件名 - // * @return 文件存储路径 URL 形式 - // */ - // private String saveDeviceImage(MultipartFile file, String deviceMac) throws IOException { - // if (file == null || file.isEmpty()) { - // return null; - // } - // - // String originalFileName = file.getOriginalFilename(); - // String fileExtension = originalFileName.substring(originalFileName.lastIndexOf(".") + 1); - // String newFileName = "PS_" + deviceMac + "." + fileExtension; - // - // File newFile = new File(filePath + DeviceConstants.FILE_ACCESS_ISOLATION + File.separator + newFileName); - // - // if (!newFile.getParentFile().exists()) { - // newFile.getParentFile().mkdirs(); - // } - // - // log.info("图片保存路径: {}", newFile.getAbsolutePath()); - // file.transferTo(newFile); - // - // return ip + DeviceConstants.FILE_ACCESS_PREFIX + "/" + DeviceConstants.FILE_ACCESS_ISOLATION + "/" + newFileName; - // } - // - // - // /** - // * 分配客户 历史记录版本 - // * - // * @param customerVo - // */ - // - // public void assignCustomer1(CustomerVo customerVo) { - // - // // 防止管理员误操作 - // User currentUser = userService.findById(SecurityUtils.getCurrentUserId()); - // if (currentUser.getTenantId().equals(UserConstants.SUPER_ADMIN_ID)) { - // throw new BadRequestException(ExceptionMessages.ADMIN_OPERATION_NOT_ALLOWED); - // } - // - // List assignments = new ArrayList<>(); - // List deviceTypeGrants = new ArrayList<>(); - // List devices = new ArrayList<>(); - // customerVo.getDeviceIds().forEach(deviceId -> { - // - // // 阻止重复分配 - // Device device = deviceMapper.selectById(deviceId); - // if (device.getCustomerId() != null && device.getCustomerId().equals(customerVo.getCustomerId())) { - // throw new BadRequestException("设备 " + device.getDeviceName() + " 已被分配给客户 " + device.getCustomerName()); - // } - // - // // 自定义16位id - // Long generatedId = NanoId.generate(NanoIdLengthEnum.HIGH_CONCURRENCY.getLength()); - // - // // -- 记录分配历史 - // DeviceAssignments deviceAssignments = new DeviceAssignments(); - // deviceAssignments.setId(generatedId); - // deviceAssignments.setDeviceId(deviceId); - // deviceAssignments.setFromCustomerId(currentUser.getId()); - // deviceAssignments.setToCustomerId(customerVo.getCustomerId()); - // deviceAssignments.setAssignedAt(LocalDateTime.now()); - // deviceAssignments.setDeviceTypeGranted(DeviceAuthorizationStatus.AUTHORIZED.getValue()); - // assignments.add(deviceAssignments); - // - // // -- 授权设备类型给客户 - // // QueryWrapper deviceTypeGrantsQueryWrapper = new QueryWrapper<>(); - // // Long count = deviceTypeGrantsMapper.selectCount(deviceTypeGrantsQueryWrapper); - // DeviceTypeGrants deviceTypeGrant = new DeviceTypeGrants(); - // deviceTypeGrant.setGrantedAt(new Date()); - // // 设备类型 - // deviceTypeGrant.setDeviceTypeId(device.getDeviceType()); - // deviceTypeGrant.setAssignmentId(generatedId); - // // 被授权的客户 - // deviceTypeGrant.setCustomerId(customerVo.getCustomerId()); - // // 授权方客户 - // deviceTypeGrant.setGrantorCustomerId(currentUser.getId()); - // deviceTypeGrants.add(deviceTypeGrant); - // - // // -- 更新设备所有者 - // device.setCurrentOwnerId(customerVo.getCustomerId()); - // devices.add(device); - // }); - // - // deviceAssignmentsService.saveBatch(assignments); - // deviceTypeGrantsService.saveBatch(deviceTypeGrants); - // this.updateBatchById(devices); - // - // } - // - // - // /** - // * 分配客户 - // * - // * @param customerVo - // */ - // @Override - // @Transactional(rollbackFor = Exception.class) - // public void assignCustomer(CustomerVo customerVo) { - // - // // 获取当前登录用户 - // User currentUser = userService.findById(SecurityUtils.getCurrentUserId()); - // // 防止管理员误操作 - // AdminCheckUtil.checkIfSuperAdmin(currentUser); - // // 获取分配用户信息 - // User assignUser = userService.findById(customerVo.getCustomerId()); - // - // // 获取分配设备信息 - // List devices = deviceMapper.selectBatchIds(customerVo.getDeviceIds()); - // - // // 批量更新设备状态 - // List deviceTypeGrants = new ArrayList<>(); - // for (Device device : devices) { - // - // // 如果设备已分配给需要分配的客户,则跳过 - // LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - // wrapper.eq(DeviceAssignments::getDeviceId, device.getId()).eq(DeviceAssignments::getAssigneeId, customerVo.getCustomerId()).ne(DeviceAssignments::getActive, DeviceActiveStatusEnum.INACTIVE.getCode()); - // List deviceAssignments = deviceAssignmentsMapper.selectList(wrapper); - // if (CollectionUtil.isNotEmpty(deviceAssignments)) { - // log.info("设备 {} 已分配给客户 {}", device.getDeviceName(), device.getCustomerName()); - // continue; - // } - // - // // 更改分配客户 - // QueryWrapper q = new QueryWrapper<>(); - // q.eq("device_id", device.getId()); - // q.eq("assignee_id", currentUser.getId()); - // q.ne("active", DeviceActiveStatusEnum.INACTIVE.getCode()); - // DeviceAssignments d = new DeviceAssignments(); - // d.setAssigneeName(assignUser.getUsername()); - // deviceAssignmentsMapper.update(d, q); - // - // // 设备失效 - // // 获取用户的设备记录 - // DeviceAssignments assignment = deviceAssignmentsMapper.selectOne(new LambdaQueryWrapper().eq(DeviceAssignments::getDeviceId, device.getId()).eq(DeviceAssignments::getAssigneeId, currentUser.getId()).eq(DeviceAssignments::getActive, DeviceActiveStatusEnum.ACTIVE.getCode())); - // - // LambdaQueryWrapper q1 = new LambdaQueryWrapper<>(); - // q1.eq(DeviceAssignments::getDeviceId, device.getId()).ne(DeviceAssignments::getAssigneeId, currentUser.getId()).like(DeviceAssignments::getLever, assignment.getLever()); - // - // DeviceAssignments d1 = new DeviceAssignments(); - // d1.setActive(DeviceActiveStatusEnum.INACTIVE.getCode()); - // deviceAssignmentsMapper.update(d1, q1); - // - // // device.setCustomerId(assignUser.getId()); - // // device.setCustomerName(assignUser.getUsername()); - // - // // 新增设备类型记录 - // DeviceAssignments assignments = new DeviceAssignments(); - // assignments.setDeviceId(device.getId()); - // assignments.setAssignedAt(LocalDateTime.now()); - // // 分配者 - // assignments.setAssignerId(currentUser.getId()); - // assignments.setAssignerName(currentUser.getUsername()); - // // 接收者 - // assignments.setAssigneeId(assignUser.getId()); - // // assignments.setAssigneeName(assignUser.getUsername()); - // assignments.setActive(DeviceActiveStatusEnum.ACTIVE.getCode()); - // String lever = assignment.getLever() + ":" + assignUser.getId(); - // assignments.setLever(lever); - // deviceAssignmentsService.save(assignments); - // - // // // 获取当前用户的所有祖先用户 - // // List ancestorsById = userMapper.findAncestorsById(currentUser.getId()); - // // Set excludedTenantIds = new HashSet<>(); - // // if (CollectionUtil.isNotEmpty(ancestorsById)) { - // // // 提取所有需要排除的 tenant_id - // // excludedTenantIds = ancestorsById.stream().map(User::getTenantId).distinct().collect(Collectors.toSet()); - // // } - // // excludedTenantIds.add(currentUser.getTenantId()); - // // // 构建查询条件:device_mac 相同,并且 tenant_id 不在 excludedTenantIds 列表中 - // // Wrapper wrapper = new QueryWrapper().eq("device_mac", device.getDeviceMac()).notIn("tenant_id", excludedTenantIds); - // // - // // // 构建要更新的数据 - // // Device updateDevice = new Device(); - // // updateDevice.setDeviceStatus(0); - // // updateDevice.setUpdateTime(new Timestamp(System.currentTimeMillis())); - // - // // 根据条件批量更新 - // // deviceMapper.update(updateDevice, wrapper); - // - // // 创建并保存设备类型授权记录 - // createAndSaveDeviceTypeGrants(device, currentUser, customerVo, deviceTypeGrants); - // } - // - // this.updateBatchById(devices); - // - // deviceTypeGrantsService.saveBatch(deviceTypeGrants); - // - // // - // // // 批量分配 - // // Set deviceTypes = new HashSet<>(); - // // for (Device device : devices) { - // // device.setId(null); - // // device.setCustomerName(null); - // // device.setCustomerId(null); - // // device.setTenantId(user.getTenantId()); - // // device.setCreateTime(timestamp); - // // device.setCreateBy(currentUser.getUsername()); - // // device.setUpdateTime(timestamp); - // // - // // // 查询设备类型 - // // DeviceType deviceType = deviceTypeMapper.selectById(device.getDeviceType()); - // // // SnowflakeGenerator snowflakeGenerator = new SnowflakeGenerator(); - // // Long id = NanoId.generate(NanoIdLengthEnum.HIGH_CONCURRENCY.getLength()); - // // deviceType.setId(id); - // // deviceType.setCreateTime(timestamp); - // // deviceType.setCreateBy(currentUser.getUsername()); - // // deviceType.setCustomerId(customerVo.getCustomerId()); - // // deviceTypes.add(deviceType); - // // - // // device.setDeviceType(deviceType.getId()); - // // } - // // this.saveBatch(devices); - // // deviceTypeService.saveBatch(deviceTypes); - // - // } - // - // - // /** - // * 撤回设备 - // * - // * @param deviceForm - // */ - // @Override - // public void withdrawDevice(DeviceForm deviceForm) { - // DeviceAssignments assignment = deviceAssignmentsMapper.selectById(deviceForm.getAssignId()); - // // 接收者 - // assignment.setAssigneeName(""); - // deviceAssignmentsMapper.updateById(assignment); - // - // LambdaQueryWrapper q1 = new LambdaQueryWrapper<>(); - // q1.eq(DeviceAssignments::getAssignerId, assignment.getAssigneeId()) - // .like(DeviceAssignments::getLever, assignment.getLever()) - // .ne(DeviceAssignments::getId, assignment.getId()); - // - // DeviceAssignments d1 = new DeviceAssignments(); - // d1.setActive(DeviceActiveStatusEnum.INACTIVE.getCode()); - // deviceAssignmentsMapper.update(d1, q1); - // - // } - // - // - // /** - // * 创建并保存设备类型授权记录 - // * - // * @param device 当前设备对象 - // * @param currentUser 当前登录用户 - // * @param customerVo 客户信息 - // * @param deviceTypeGrants 授权记录集合 - // */ - // private void createAndSaveDeviceTypeGrants(Device device, User currentUser, CustomerVo customerVo, List deviceTypeGrants) { - // Long generatedId = NanoId.generate(NanoIdLengthEnum.HIGH_CONCURRENCY.getLength()); - // DeviceTypeGrants deviceTypeGrant = new DeviceTypeGrants(); - // deviceTypeGrant.setGrantedAt(new Date()); - // deviceTypeGrant.setDeviceTypeId(device.getDeviceType()); - // deviceTypeGrant.setAssignmentId(generatedId); - // deviceTypeGrant.setCustomerId(customerVo.getCustomerId()); - // deviceTypeGrant.setGrantorCustomerId(currentUser.getId()); - // deviceTypeGrants.add(deviceTypeGrant); - // } - // - // - // /** - // * 删除设备 - // * - // * @param ids / - // */ - // @Override - // @Transactional(rollbackFor = Exception.class) - // public void deleteAll(List ids) { - // - // SecurityUtils.getCurrentUserId(); - // - // // Step 1: 查询所有传入的设备(根据 ID) - // List allDevices = deviceMapper.selectBatchIds(ids); - // // Step 2: 使用 Java Stream 过滤出 customer_id 不为 null 的设备 - // Set nonNullCustomerIds = allDevices.stream().filter(device -> device.getCustomerId() != null && device.getDeviceStatus() == 1).map(Device::getId).collect(Collectors.toSet()); - // // Step 3: 从原始 ids 中“去掉”这些非空 customer_id 的设备 ID - // List remainingIds = ids.stream().filter(id -> !nonNullCustomerIds.contains(id)).collect(Collectors.toList()); - // if (CollectionUtil.isEmpty(remainingIds)) { - // throw new BadRequestException("已分配的设备不允许删除!!!"); - // } - // List devices = deviceMapper.selectBatchIds(remainingIds); - // for (Device device : devices) { - // String devicePic = device.getDevicePic(); - // if (StringUtils.isNotBlank(devicePic)) { - // File file = new File(devicePic); - // if (file.exists()) { - // if (file.delete()) { - // log.info("设备图片删除成功"); - // } else { - // log.error("设备图片删除失败"); - // } - // } - // } - // } - // - // deviceMapper.deleteBatchIds(ids); - // } + /** + * 删除设备 + * + * @param ids / + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(List ids) { + deviceMapper.deleteByIds(ids); + } + + + /** + * 分配客户 + * + * @param customerVo + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void assignCustomer(CustomerVo customerVo) { + + + } + + + /** + * 撤回设备 + * + * @param deviceForm + */ + @Override + public void withdrawDevice(DeviceForm deviceForm) { + + + } + + + /** + * 解绑设备 + * + * @param deviceForm + */ + @Override + @Transactional + public void unbindDevice(DeviceForm deviceForm) { + + } -// /** -// * 删除设备分配记录(分配记录id) -// * -// * @param ids -// */ -// public void deleteAssign1(List ids) { -// Long currentUserId = SecurityUtils.getCurrentUserId(); -// // Step 1: 查询所有传入的设备(根据 ID) -// // List deviceAssignments = deviceAssignmentsMapper.selectBatchIds(ids); -// QueryWrapper wrapper = new QueryWrapper<>(); -// // wrapper.eq("active", DeviceActiveStatusEnum.INACTIVE.getCode()); -// wrapper.in("device_id", ids); -// wrapper.eq("assigner_id", currentUserId); -// List deviceAssignments = deviceAssignmentsMapper.selectList(wrapper); -// // Step 2: 使用 Java Stream 过滤出 customer_id 不为 null 的设备 -// Set nonNullCustomerIds = deviceAssignments.stream().filter(device -> !StringUtils.isNotEmpty(device.getAssigneeName())).map(DeviceAssignments::getId).collect(Collectors.toSet()); -// if (CollectionUtil.isEmpty(nonNullCustomerIds)) { -// throw new BadRequestException("已分配的设备不允许删除!!!"); -// } -// -// // QueryWrapper de = new QueryWrapper<>(); -// // wrapper.eq("active", DeviceActiveStatusEnum.INACTIVE.getCode()); -// // wrapper.in("device_id", ids); -// // wrapper.eq("assignee_id", currentUserId); -// // deviceAssignmentsMapper.delete(de); -// -// deviceAssignmentsMapper.deleteBatchIds(nonNullCustomerIds); -// } -// -// -// /** -// * 删除设备分配记录(分配记录id) -// * -// * @param ids -// */ -// @Override -// @Transactional(rollbackFor = Exception.class) -// public void deleteAssign(List ids) { -// // Step 1: 查询所有传入的设备(根据 ID) -// List deviceAssignments = deviceAssignmentsMapper.selectBatchIds(ids); -// // Step 2: 使用 Java Stream 过滤出 customer_id 不为 null 的设备 -// Set nonNullCustomerIds = deviceAssignments.stream() -// .filter(device -> !StringUtils.isNotEmpty(device.getAssigneeName())) -// .map(DeviceAssignments::getId).collect(Collectors.toSet()); -// if (CollectionUtil.isEmpty(nonNullCustomerIds)) { -// throw new BadRequestException("已分配的设备不允许删除!!!"); -// } -// -// deviceAssignmentsMapper.deleteBatchIds(nonNullCustomerIds); -// deviceTypeGrantsMapper.delete(new QueryWrapper().in("assignment_id", nonNullCustomerIds)); -// } -// -// -// @Override -// public void download(List all, HttpServletResponse response) throws IOException { -// List> list = new ArrayList<>(); -// for (Device device : all) { -// Map map = new LinkedHashMap<>(); -// map.put("设备类型", device.getTypeName()); -// map.put("客户号", device.getCustomerId()); -// // map.put("设备编号", device.getDeviceNo()); -// map.put("设备名称", device.getDeviceName()); -// // map.put("设备图片", device.getDevicePic()); -// map.put("设备MAC", device.getDeviceMac()); -// map.put("设备SN", device.getDeviceSn()); -// map.put("创建者", device.getCreateBy()); -// map.put("更新者", device.getUpdateBy()); -// map.put("创建时间", device.getCreateTime()); -// map.put("更新时间", device.getUpdateTime()); -// list.add(map); -// } -// FileUtil.downloadExcel(list, response); -// } -// -// @Override -// @Transactional(rollbackFor = Exception.class) -// public void importData(MultipartFile file) throws IOException { -// String line = ""; -// String csvSplitBy = ","; -// List devices = new ArrayList<>(); -// User currentUser = userService.findByName(SecurityUtils.getCurrentUsername()); -// -// InputStream inputStream = file.getInputStream(); -// InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "GB2312"); -// BufferedReader br = new BufferedReader(inputStreamReader); -// -// // BufferedReader br = new BufferedReader(new FileReader((File) file)); -// br.readLine(); // 跳过第一行 -// while ((line = br.readLine()) != null) { -// // 使用分隔符分割并存储到List中 -// String[] values = line.split(csvSplitBy); -// Device device = new Device(); -// device.setDeviceName(values[0]); -// device.setDeviceMac(values[1]); -// device.setDeviceSn(values[2]); -// device.setCreateBy(currentUser.getUsername()); -// device.setUpdateBy(currentUser.getUsername()); -// devices.add(device); -// } -// -// this.saveBatch(devices); -// } -// -// -// /** -// * 解绑设备 -// * -// * @param deviceForm -// */ -// @Override -// @Transactional -// public void unbindDevice(DeviceForm deviceForm) { -// -// QueryWrapper queryWrapper = new QueryWrapper<>(); -// if (StringUtils.isNotEmpty(deviceForm.getDeviceMac())) { -// queryWrapper.eq("device_mac", deviceForm.getDeviceMac()); -// } -// if (StringUtils.isNotEmpty(deviceForm.getDeviceImei())) { -// queryWrapper.eq("device_imei", deviceForm.getDeviceImei()); -// } -// appDeviceMapper.delete(queryWrapper); -// Device device = new Device(); -// device.setId(deviceForm.getId()); -// device.setBindingStatus(BindingStatusEnum.UNBOUND.getCode()); -// deviceMapper.updateById(device); -// } }