设备管理 接口

This commit is contained in:
2025-07-01 13:53:03 +08:00
parent 440aec266b
commit 53356957f3
8 changed files with 418 additions and 685 deletions

View File

@ -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 = "更新成功!";
// 可根据业务需求继续扩展其他常用提示信息
}

View File

@ -101,8 +101,19 @@
<artifactId>fys-common-sse</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.1</version>
<exclusions>
<exclusion>
<artifactId>poi-ooxml-schemas</artifactId>
<groupId>org.apache.poi</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>

View File

@ -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<Object> unbindDevice(@Validated @ModelAttribute DeviceForm deviceForm) {
// deviceService.unbindDevice(deviceForm);
// return ResponseVO.success("解绑成功!!!");
// }
//
//
// @Log("修改设备")
// @ApiOperation("修改设备")
// @PutMapping(value = "/update")
// public ResponseVO<Object> 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<Object> assignCustomer(@Validated @RequestBody CustomerVo customerVo) {
// deviceService.assignCustomer(customerVo);
// return ResponseVO.success(null);
// }
//
//
// @Log("撤回设备")
// @ApiOperation("撤回设备")
// @PostMapping(value = "/withdraw")
// public ResponseVO<Object> 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<Object> getDevice(@PathVariable Long id) {
// Device device = deviceService.getById(id);
// return ResponseVO.success(device);
// }
//
//
// @Log("删除设备")
// @ApiOperation("删除设备")
// @DeleteMapping(value = "/delete")
// public ResponseVO<Object> deleteDevice(@ApiParam(value = "传ID数组[]") @RequestBody List<Long> 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<Object> locateDevice(DeviceQueryCriteria criteria) throws IOException {
// List<Device> 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<ImportResult> 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.<ImportResult>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.<ImportResult>fail(errorMessage, result);
// }
// }
//
// @ApiOperation("下载导入错误报告")
// @GetMapping("/download-import-errors")
// public ResponseEntity<byte[]> 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<Object> 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<Object> getDevice(@PathVariable Long id) {
Device device = deviceService.getById(id);
return ResponseVO.success(device);
}
// @Log("删除设备")
@Operation(summary = "删除设备")
@DeleteMapping(value = "/delete")
public ResponseVO<Object> deleteDevice(@Parameter(name = "传ID数组[]") @RequestBody List<Long> ids) {
deviceService.deleteAll(ids);
// deviceService.deleteAssign(ids);
return ResponseVO.success(ResponseMessageConstants.DELETE_SUCCESS);
}
@Operation(summary = "设备定位")
@GetMapping(value = "/locateDevice")
public ResponseVO<Object> locateDevice(DeviceQueryCriteria criteria) throws IOException {
List<Device> devices = deviceService.queryAllDevices(criteria);
return ResponseVO.success(devices);
}
// @Log("分配客户")
@Operation(summary = "分配客户")
@PutMapping(value = "/assignCustomer")
public ResponseVO<Object> assignCustomer(@Validated @RequestBody CustomerVo customerVo) {
deviceService.assignCustomer(customerVo);
return ResponseVO.success(null);
}
// @Log("撤回设备")
@Operation(summary = "撤回设备")
@PostMapping(value = "/withdraw")
public ResponseVO<Object> 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<Object> 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<ImportResult> 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.<ImportResult>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.<ImportResult>fail(errorMessage, result);
return null;
}
}

View File

@ -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;
}

View File

@ -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<DeviceExcelImportDTO> failedRecords;
// private byte[] errorExcelData; // 存储失败数据的Excel字节流
private String errorExcelUrl; // 改为存储错误报告的URL
// 添加成功/失败统计信息
public String getSummary() {
return String.format("成功导入 %d 条数据,失败 %d 条", successCount, failureCount);
}
}

View File

@ -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<Long> deviceIds;
}

View File

@ -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<Device> {
*/
PageResult<Device> queryAll(DeviceQueryCriteria criteria, Page<Object> page) throws IOException;
/**
* 查询所有设备信息
*
* @param criteria
* @return
*/
List<Device> queryAllDevices(DeviceQueryCriteria criteria);
/**
* 新增设备
*
@ -32,85 +42,34 @@ public interface DeviceService extends IService<Device> {
*/
void addDevice(DeviceForm resources) throws Exception;
// /**
// * 查询所有数据不分页
// *
// * @param criteria 条件参数
// * @return List<DeviceDto>
// */
// List<Device> queryAll(DeviceQueryCriteria criteria);
//
// /**
// * 查询所有设备信息
// *
// * @param criteria
// * @return
// */
// List<Device> 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<Long> ids);
//
// /**
// * 删除设备分配记录
// *
// * @param ids
// */
// void deleteAssign(List<Long> ids);
//
// /**
// * 导出数据
// *
// * @param all 待导出的数据
// * @param response /
// * @throws IOException /
// */
// void download(List<Device> 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<Long> ids);
/**
* 分配客户
*/
void assignCustomer(CustomerVo customerVo);
/**
* 撤回设备
*/
void withdrawDevice(DeviceForm deviceForm);
/**
* 解绑设备
*
* @param deviceForm
*/
void unbindDevice(DeviceForm deviceForm);
}

View File

@ -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<DeviceMapper, Device> impleme
}
/**
* 查询所有设备
*
* @param criteria 筛选条件
* @return
*/
@Override
public List<Device> queryAllDevices(DeviceQueryCriteria criteria) {
return deviceMapper.findAllDevices(criteria);
}
/**
* 新增设备
*
@ -83,7 +95,7 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> 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<DeviceMapper, Device> 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<DeviceMapper, Device> 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<DeviceAssignments> assignments = new ArrayList<>();
// List<DeviceTypeGrants> deviceTypeGrants = new ArrayList<>();
// List<Device> 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<DeviceTypeGrants> 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<Device> devices = deviceMapper.selectBatchIds(customerVo.getDeviceIds());
//
// // 批量更新设备状态
// List<DeviceTypeGrants> deviceTypeGrants = new ArrayList<>();
// for (Device device : devices) {
//
// // 如果设备已分配给需要分配的客户,则跳过
// LambdaQueryWrapper<DeviceAssignments> wrapper = new LambdaQueryWrapper<>();
// wrapper.eq(DeviceAssignments::getDeviceId, device.getId()).eq(DeviceAssignments::getAssigneeId, customerVo.getCustomerId()).ne(DeviceAssignments::getActive, DeviceActiveStatusEnum.INACTIVE.getCode());
// List<DeviceAssignments> deviceAssignments = deviceAssignmentsMapper.selectList(wrapper);
// if (CollectionUtil.isNotEmpty(deviceAssignments)) {
// log.info("设备 {} 已分配给客户 {}", device.getDeviceName(), device.getCustomerName());
// continue;
// }
//
// // 更改分配客户
// QueryWrapper<DeviceAssignments> 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<DeviceAssignments>().eq(DeviceAssignments::getDeviceId, device.getId()).eq(DeviceAssignments::getAssigneeId, currentUser.getId()).eq(DeviceAssignments::getActive, DeviceActiveStatusEnum.ACTIVE.getCode()));
//
// LambdaQueryWrapper<DeviceAssignments> 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<User> ancestorsById = userMapper.findAncestorsById(currentUser.getId());
// // Set<Long> 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<Device> wrapper = new QueryWrapper<Device>().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<DeviceType> 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<DeviceAssignments> 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> 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<Long> ids) {
//
// SecurityUtils.getCurrentUserId();
//
// // Step 1: 查询所有传入的设备(根据 ID
// List<Device> allDevices = deviceMapper.selectBatchIds(ids);
// // Step 2: 使用 Java Stream 过滤出 customer_id 不为 null 的设备
// Set<Long> nonNullCustomerIds = allDevices.stream().filter(device -> device.getCustomerId() != null && device.getDeviceStatus() == 1).map(Device::getId).collect(Collectors.toSet());
// // Step 3: 从原始 ids 中“去掉”这些非空 customer_id 的设备 ID
// List<Long> remainingIds = ids.stream().filter(id -> !nonNullCustomerIds.contains(id)).collect(Collectors.toList());
// if (CollectionUtil.isEmpty(remainingIds)) {
// throw new BadRequestException("已分配的设备不允许删除!!!");
// }
// List<Device> 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<Long> 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<Long> ids) {
// Long currentUserId = SecurityUtils.getCurrentUserId();
// // Step 1: 查询所有传入的设备(根据 ID
// // List<DeviceAssignments> deviceAssignments = deviceAssignmentsMapper.selectBatchIds(ids);
// QueryWrapper<DeviceAssignments> wrapper = new QueryWrapper<>();
// // wrapper.eq("active", DeviceActiveStatusEnum.INACTIVE.getCode());
// wrapper.in("device_id", ids);
// wrapper.eq("assigner_id", currentUserId);
// List<DeviceAssignments> deviceAssignments = deviceAssignmentsMapper.selectList(wrapper);
// // Step 2: 使用 Java Stream 过滤出 customer_id 不为 null 的设备
// Set<Long> nonNullCustomerIds = deviceAssignments.stream().filter(device -> !StringUtils.isNotEmpty(device.getAssigneeName())).map(DeviceAssignments::getId).collect(Collectors.toSet());
// if (CollectionUtil.isEmpty(nonNullCustomerIds)) {
// throw new BadRequestException("已分配的设备不允许删除!!!");
// }
//
// // QueryWrapper<DeviceAssignments> 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<Long> ids) {
// // Step 1: 查询所有传入的设备(根据 ID
// List<DeviceAssignments> deviceAssignments = deviceAssignmentsMapper.selectBatchIds(ids);
// // Step 2: 使用 Java Stream 过滤出 customer_id 不为 null 的设备
// Set<Long> 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<DeviceTypeGrants>().in("assignment_id", nonNullCustomerIds));
// }
//
//
// @Override
// public void download(List<Device> all, HttpServletResponse response) throws IOException {
// List<Map<String, Object>> list = new ArrayList<>();
// for (Device device : all) {
// Map<String, Object> 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<Device> 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<APPDevice> 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);
// }
}