2 Commits

Author SHA1 Message Date
dyf
03f453f901 Merge pull request 'refactor(equipment): 将业务文件和操作视频功能从app模块迁移到equipment模块' (#25) from liwenlong/fys-Multi-tenant:jingquan into jingquan
Reviewed-on: #25
2026-02-27 15:29:26 +08:00
e23c5267ee refactor(equipment): 将业务文件和操作视频功能从app模块迁移到equipment模块
- 移动AppBusinessFile相关类到equipment模块
- 移动AppOperationVideo相关类到equipment模块
- 更新所有导入路径以指向新的equipment包结构
- 重构设备创建流程中的文件克隆逻辑
- 添加cloneFiles方法支持从设备类型复制文件和视频到新设备
- 优化DeviceXinghanBizService中的设备验证逻辑
- 更新Mapper XML命名空间和返回类型引用
- 调整设备导入Excel的必填字段验证规则
2026-02-27 15:13:53 +08:00
26 changed files with 186 additions and 115 deletions

View File

@ -1,8 +1,8 @@
package com.fuyuanshen.app.controller; package com.fuyuanshen.app.controller;
import com.fuyuanshen.app.domain.bo.AppBusinessFileBo; import com.fuyuanshen.equipment.domain.bo.AppBusinessFileBo;
import com.fuyuanshen.app.domain.dto.AppFileDto; import com.fuyuanshen.app.domain.dto.AppFileDto;
import com.fuyuanshen.app.domain.vo.AppFileVo; import com.fuyuanshen.equipment.domain.vo.AppFileVo;
import com.fuyuanshen.app.service.AppFileService; import com.fuyuanshen.app.service.AppFileService;
import com.fuyuanshen.common.core.domain.R; import com.fuyuanshen.common.core.domain.R;
import com.fuyuanshen.common.web.core.BaseController; import com.fuyuanshen.common.web.core.BaseController;

View File

@ -1,8 +1,8 @@
package com.fuyuanshen.app.controller; package com.fuyuanshen.app.controller;
import com.fuyuanshen.app.domain.bo.AppOperationVideoBo; import com.fuyuanshen.equipment.domain.bo.AppOperationVideoBo;
import com.fuyuanshen.app.domain.vo.AppOperationVideoVo; import com.fuyuanshen.equipment.domain.vo.AppOperationVideoVo;
import com.fuyuanshen.app.service.IAppOperationVideoService; import com.fuyuanshen.equipment.service.IAppOperationVideoService;
import com.fuyuanshen.common.core.domain.R; import com.fuyuanshen.common.core.domain.R;
import com.fuyuanshen.common.core.domain.model.AppLoginUser; import com.fuyuanshen.common.core.domain.model.AppLoginUser;
import com.fuyuanshen.common.satoken.utils.AppLoginHelper; import com.fuyuanshen.common.satoken.utils.AppLoginHelper;

View File

@ -1,13 +1,14 @@
package com.fuyuanshen.app.service; package com.fuyuanshen.app.service;
import com.fuyuanshen.app.domain.bo.AppBusinessFileBo; import com.fuyuanshen.equipment.domain.bo.AppBusinessFileBo;
import com.fuyuanshen.app.domain.dto.AppFileDto; import com.fuyuanshen.app.domain.dto.AppFileDto;
import com.fuyuanshen.app.domain.vo.AppBusinessFileVo; import com.fuyuanshen.equipment.domain.vo.AppBusinessFileVo;
import com.fuyuanshen.app.domain.vo.AppFileVo; import com.fuyuanshen.equipment.domain.vo.AppFileVo;
import com.fuyuanshen.common.core.exception.ServiceException; import com.fuyuanshen.common.core.exception.ServiceException;
import com.fuyuanshen.common.oss.core.OssClient; import com.fuyuanshen.common.oss.core.OssClient;
import com.fuyuanshen.common.oss.factory.OssFactory; import com.fuyuanshen.common.oss.factory.OssFactory;
import com.fuyuanshen.common.satoken.utils.AppLoginHelper; import com.fuyuanshen.common.satoken.utils.AppLoginHelper;
import com.fuyuanshen.equipment.service.IAppBusinessFileService;
import com.fuyuanshen.equipment.utils.FileHashUtil; import com.fuyuanshen.equipment.utils.FileHashUtil;
import com.fuyuanshen.system.domain.vo.SysOssVo; import com.fuyuanshen.system.domain.vo.SysOssVo;
import com.fuyuanshen.system.service.ISysOssService; import com.fuyuanshen.system.service.ISysOssService;

View File

@ -1,19 +1,15 @@
package com.fuyuanshen.web.controller.device; package com.fuyuanshen.web.controller.device;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.fuyuanshen.equipment.domain.bo.AppOperationVideoBo;
import com.fuyuanshen.app.domain.bo.AppOperationVideoBo;
import com.fuyuanshen.app.domain.dto.AppDeviceLogoUploadDto;
import com.fuyuanshen.app.domain.dto.AppFileDto; import com.fuyuanshen.app.domain.dto.AppFileDto;
import com.fuyuanshen.common.core.domain.R; import com.fuyuanshen.common.core.domain.R;
import com.fuyuanshen.common.core.exception.ServiceException; import com.fuyuanshen.common.core.exception.ServiceException;
import com.fuyuanshen.common.log.annotation.Log; import com.fuyuanshen.common.log.annotation.Log;
import com.fuyuanshen.common.log.enums.BusinessType;
import com.fuyuanshen.common.mybatis.core.page.PageQuery; import com.fuyuanshen.common.mybatis.core.page.PageQuery;
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo; import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
import com.fuyuanshen.common.ratelimiter.annotation.FunctionAccessAnnotation; import com.fuyuanshen.common.ratelimiter.annotation.FunctionAccessAnnotation;
import com.fuyuanshen.common.web.core.BaseController; import com.fuyuanshen.common.web.core.BaseController;
import com.fuyuanshen.equipment.domain.query.DeviceQueryCriteria; import com.fuyuanshen.equipment.domain.query.DeviceQueryCriteria;
import com.fuyuanshen.equipment.domain.vo.AppDeviceVo;
import com.fuyuanshen.equipment.domain.vo.WebDeviceVo; import com.fuyuanshen.equipment.domain.vo.WebDeviceVo;
import com.fuyuanshen.web.domain.Dto.DeviceDebugEditDto; import com.fuyuanshen.web.domain.Dto.DeviceDebugEditDto;
import com.fuyuanshen.web.domain.Dto.DeviceDebugLogoUploadDto; import com.fuyuanshen.web.domain.Dto.DeviceDebugLogoUploadDto;
@ -28,8 +24,6 @@ import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/** /**
* 联调中心 * 联调中心
@ -125,7 +119,7 @@ public class DeviceDebugController extends BaseController {
} }
deviceDebugService.delFile(bo.getFileIds()); deviceDebugService.delFile(bo.getFileIds());
// 修改操作视频 // 修改操作视频
if (bo.getVideoUrl().isEmpty()) { if (!bo.getVideoUrl().isEmpty()) {
AppOperationVideoBo appOperationVideoBo = new AppOperationVideoBo(); AppOperationVideoBo appOperationVideoBo = new AppOperationVideoBo();
appOperationVideoBo.setDeviceIds(new Long[]{ bo.getDeviceId() }); appOperationVideoBo.setDeviceIds(new Long[]{ bo.getDeviceId() });
appOperationVideoBo.setVideoUrl(bo.getVideoUrl()); appOperationVideoBo.setVideoUrl(bo.getVideoUrl());

View File

@ -1,10 +1,7 @@
package com.fuyuanshen.web.domain.vo; package com.fuyuanshen.web.domain.vo;
import com.fuyuanshen.app.domain.vo.AppBusinessFileVo; import com.fuyuanshen.equipment.domain.vo.AppFileVo;
import com.fuyuanshen.app.domain.vo.AppFileVo; import com.fuyuanshen.equipment.domain.vo.AppOperationVideoVo;
import com.fuyuanshen.app.domain.vo.AppOperationVideoVo;
import com.fuyuanshen.equipment.domain.Device;
import com.fuyuanshen.equipment.domain.vo.AppDeviceVo;
import lombok.Data; import lombok.Data;
import java.util.List; import java.util.List;

View File

@ -1,13 +1,13 @@
package com.fuyuanshen.web.service.device; package com.fuyuanshen.web.service.device;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import com.fuyuanshen.app.domain.AppBusinessFile; import com.fuyuanshen.equipment.domain.AppBusinessFile;
import com.fuyuanshen.app.domain.AppOperationVideo; import com.fuyuanshen.equipment.domain.AppOperationVideo;
import com.fuyuanshen.app.domain.bo.AppBusinessFileBo; import com.fuyuanshen.equipment.domain.bo.AppBusinessFileBo;
import com.fuyuanshen.app.domain.bo.AppOperationVideoBo; import com.fuyuanshen.equipment.domain.bo.AppOperationVideoBo;
import com.fuyuanshen.app.domain.dto.AppFileDto; import com.fuyuanshen.app.domain.dto.AppFileDto;
import com.fuyuanshen.app.service.IAppBusinessFileService; import com.fuyuanshen.equipment.service.IAppBusinessFileService;
import com.fuyuanshen.app.service.IAppOperationVideoService; import com.fuyuanshen.equipment.service.IAppOperationVideoService;
import com.fuyuanshen.common.core.exception.ServiceException; import com.fuyuanshen.common.core.exception.ServiceException;
import com.fuyuanshen.common.satoken.utils.AppLoginHelper; import com.fuyuanshen.common.satoken.utils.AppLoginHelper;
import com.fuyuanshen.equipment.service.DeviceService; import com.fuyuanshen.equipment.service.DeviceService;

View File

@ -1,11 +1,11 @@
package com.fuyuanshen.web.service.device; package com.fuyuanshen.web.service.device;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.UUID; import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
@ -15,20 +15,17 @@ import com.fuyuanshen.app.domain.AppPersonnelInfo;
import com.fuyuanshen.app.domain.AppPersonnelInfoRecords; import com.fuyuanshen.app.domain.AppPersonnelInfoRecords;
import com.fuyuanshen.app.domain.bo.AppPersonnelInfoBo; import com.fuyuanshen.app.domain.bo.AppPersonnelInfoBo;
import com.fuyuanshen.app.domain.dto.AppDeviceLogoUploadDto; import com.fuyuanshen.app.domain.dto.AppDeviceLogoUploadDto;
import com.fuyuanshen.app.domain.dto.DeviceInstructDto;
import com.fuyuanshen.app.domain.vo.AppDeviceDetailVo;
import com.fuyuanshen.app.domain.vo.AppPersonnelInfoVo; import com.fuyuanshen.app.domain.vo.AppPersonnelInfoVo;
import com.fuyuanshen.app.mapper.AppPersonnelInfoMapper; import com.fuyuanshen.app.mapper.AppPersonnelInfoMapper;
import com.fuyuanshen.app.mapper.AppPersonnelInfoRecordsMapper; import com.fuyuanshen.app.mapper.AppPersonnelInfoRecordsMapper;
import com.fuyuanshen.equipment.service.IAppBusinessFileService;
import com.fuyuanshen.equipment.service.IAppOperationVideoService;
import com.fuyuanshen.common.core.constant.GlobalConstants; import com.fuyuanshen.common.core.constant.GlobalConstants;
import com.fuyuanshen.common.core.domain.R;
import com.fuyuanshen.common.core.domain.model.AppLoginUser; import com.fuyuanshen.common.core.domain.model.AppLoginUser;
import com.fuyuanshen.common.core.domain.model.LoginUser;
import com.fuyuanshen.common.core.exception.BadRequestException; import com.fuyuanshen.common.core.exception.BadRequestException;
import com.fuyuanshen.common.core.exception.ServiceException; import com.fuyuanshen.common.core.exception.ServiceException;
import com.fuyuanshen.common.core.utils.ImageToCArrayConverter; import com.fuyuanshen.common.core.utils.ImageToCArrayConverter;
import com.fuyuanshen.common.core.utils.MapstructUtils; import com.fuyuanshen.common.core.utils.MapstructUtils;
import com.fuyuanshen.common.core.utils.ObjectUtils;
import com.fuyuanshen.common.core.utils.StringUtils; import com.fuyuanshen.common.core.utils.StringUtils;
import com.fuyuanshen.common.json.utils.JsonUtils; import com.fuyuanshen.common.json.utils.JsonUtils;
import com.fuyuanshen.common.redis.utils.RedisUtils; import com.fuyuanshen.common.redis.utils.RedisUtils;
@ -40,7 +37,6 @@ import com.fuyuanshen.equipment.domain.dto.AppDeviceSendMsgBo;
import com.fuyuanshen.equipment.domain.form.DeviceForm; import com.fuyuanshen.equipment.domain.form.DeviceForm;
import com.fuyuanshen.equipment.domain.query.DeviceTypeQueryCriteria; import com.fuyuanshen.equipment.domain.query.DeviceTypeQueryCriteria;
import com.fuyuanshen.equipment.enums.DeviceActiveStatusEnum; import com.fuyuanshen.equipment.enums.DeviceActiveStatusEnum;
import com.fuyuanshen.equipment.enums.LightModeEnum;
import com.fuyuanshen.equipment.mapper.DeviceLogMapper; import com.fuyuanshen.equipment.mapper.DeviceLogMapper;
import com.fuyuanshen.equipment.mapper.DeviceMapper; import com.fuyuanshen.equipment.mapper.DeviceMapper;
import com.fuyuanshen.equipment.mapper.DeviceTypeGrantsMapper; import com.fuyuanshen.equipment.mapper.DeviceTypeGrantsMapper;
@ -51,8 +47,6 @@ import com.fuyuanshen.global.mqtt.base.MqttXinghanJson;
import com.fuyuanshen.global.mqtt.config.MqttGateway; import com.fuyuanshen.global.mqtt.config.MqttGateway;
import com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants; import com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants;
import com.fuyuanshen.global.mqtt.constants.MqttConstants; import com.fuyuanshen.global.mqtt.constants.MqttConstants;
import com.fuyuanshen.system.domain.vo.SysOssVo;
import com.fuyuanshen.system.domain.vo.SysRoleVo;
import com.fuyuanshen.web.domain.Dto.DeviceDebugLogoUploadDto; import com.fuyuanshen.web.domain.Dto.DeviceDebugLogoUploadDto;
import com.fuyuanshen.web.domain.Dto.DeviceXinghanInstructDto; import com.fuyuanshen.web.domain.Dto.DeviceXinghanInstructDto;
import com.fuyuanshen.web.domain.vo.DeviceXinghanDetailVo; import com.fuyuanshen.web.domain.vo.DeviceXinghanDetailVo;
@ -64,15 +58,12 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.IOException; import java.io.IOException;
import java.time.Duration; import java.time.Duration;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
import static com.fuyuanshen.common.core.constant.GlobalConstants.GLOBAL_REDIS_KEY; import static com.fuyuanshen.common.core.constant.GlobalConstants.GLOBAL_REDIS_KEY;
import static com.fuyuanshen.common.core.utils.ImageToCArrayConverter.convertHexToDecimal; import static com.fuyuanshen.common.core.utils.ImageToCArrayConverter.convertHexToDecimal;
@ -93,6 +84,8 @@ public class DeviceXinghanBizService {
private final IDeviceAlarmService deviceAlarmService; private final IDeviceAlarmService deviceAlarmService;
private final DeviceTypeGrantsMapper deviceTypeGrantsMapper; private final DeviceTypeGrantsMapper deviceTypeGrantsMapper;
private final DeviceAssignmentsService deviceAssignmentsService; private final DeviceAssignmentsService deviceAssignmentsService;
private final IAppBusinessFileService appBusinessFileService;
private final IAppOperationVideoService appOperationVideoService;
@Autowired @Autowired
private ObjectMapper objectMapper; private ObjectMapper objectMapper;
private final AliyunVoiceUtil voiceUtil; private final AliyunVoiceUtil voiceUtil;
@ -721,20 +714,31 @@ public class DeviceXinghanBizService {
return deviceTypeMapper.findAll(criteria); return deviceTypeMapper.findAll(criteria);
} }
// @Log("新增设备") /**
public void addDevice(DeviceForm deviceForm) { * 校验唯一性约束
if (deviceForm.getDeviceMac() != null && deviceForm.getBluetoothName() == null) { */
private void validateDeviceUnique(DeviceForm form) {
if (form.getDeviceMac() != null && form.getBluetoothName() == null) {
throw new BadRequestException("请填写蓝牙名称!!!"); throw new BadRequestException("请填写蓝牙名称!!!");
} }
Device device1 = deviceMapper.selectOne(new QueryWrapper<Device>().eq("device_mac", deviceForm.getDeviceMac())); // 使用 QueryWrapper 替代 lambdaQuery()
if (device1 != null) { Long macCount = deviceMapper.selectCount(new LambdaQueryWrapper<Device>()
.eq(Device::getDeviceMac, form.getDeviceMac()));
if (macCount > 0) {
throw new BadRequestException("设备MAC已存在"); throw new BadRequestException("设备MAC已存在");
} }
Device device2 = deviceMapper.selectOne(new QueryWrapper<Device>().eq("device_imei", deviceForm.getDeviceImei()));
if (device2 != null) { Long imeiCount = deviceMapper.selectCount(new LambdaQueryWrapper<Device>()
.eq(Device::getDeviceImei, form.getDeviceImei()));
if (imeiCount > 0) {
throw new BadRequestException("设备IMEI已存在"); throw new BadRequestException("设备IMEI已存在");
} }
}
// @Log("新增设备")
public void addDevice(DeviceForm deviceForm) {
validateDeviceUnique(deviceForm);
DeviceTypeQueryCriteria queryCriteria = new DeviceTypeQueryCriteria(); DeviceTypeQueryCriteria queryCriteria = new DeviceTypeQueryCriteria();
queryCriteria.setDeviceTypeId(deviceForm.getDeviceType()); queryCriteria.setDeviceTypeId(deviceForm.getDeviceType());
@ -768,6 +772,14 @@ public class DeviceXinghanBizService {
device.setBindingStatus(0); device.setBindingStatus(0);
deviceMapper.insert(device); deviceMapper.insert(device);
Long deviceId = device.getDeviceId();
// 查询设备类型的文件列表
// 4. 核心优化:同步设备类型的文件列表 (一行代码)
appBusinessFileService.cloneFiles(deviceTypes.getId(), device.getId());
//同步设备类型的视频列表
appOperationVideoService.cloneFiles(deviceTypes.getId(), device.getId());
// 新增设备类型记录 // 新增设备类型记录
DeviceAssignments assignments = new DeviceAssignments(); DeviceAssignments assignments = new DeviceAssignments();
assignments.setDeviceId(device.getId()); assignments.setDeviceId(device.getId());

View File

@ -17,9 +17,9 @@ import com.fuyuanshen.common.core.validate.AddGroup;
import com.fuyuanshen.common.core.validate.EditGroup; import com.fuyuanshen.common.core.validate.EditGroup;
import com.fuyuanshen.common.log.enums.BusinessType; import com.fuyuanshen.common.log.enums.BusinessType;
import com.fuyuanshen.common.excel.utils.ExcelUtil; import com.fuyuanshen.common.excel.utils.ExcelUtil;
import com.fuyuanshen.app.domain.vo.AppBusinessFileVo; import com.fuyuanshen.equipment.domain.vo.AppBusinessFileVo;
import com.fuyuanshen.app.domain.bo.AppBusinessFileBo; import com.fuyuanshen.equipment.domain.bo.AppBusinessFileBo;
import com.fuyuanshen.app.service.IAppBusinessFileService; import com.fuyuanshen.equipment.service.IAppBusinessFileService;
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo; import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
/** /**

View File

@ -17,9 +17,9 @@ import com.fuyuanshen.common.core.validate.AddGroup;
import com.fuyuanshen.common.core.validate.EditGroup; import com.fuyuanshen.common.core.validate.EditGroup;
import com.fuyuanshen.common.log.enums.BusinessType; import com.fuyuanshen.common.log.enums.BusinessType;
import com.fuyuanshen.common.excel.utils.ExcelUtil; import com.fuyuanshen.common.excel.utils.ExcelUtil;
import com.fuyuanshen.app.domain.vo.AppOperationVideoVo; import com.fuyuanshen.equipment.domain.vo.AppOperationVideoVo;
import com.fuyuanshen.app.domain.bo.AppOperationVideoBo; import com.fuyuanshen.equipment.domain.bo.AppOperationVideoBo;
import com.fuyuanshen.app.service.IAppOperationVideoService; import com.fuyuanshen.equipment.service.IAppOperationVideoService;
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo; import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
/** /**

View File

@ -317,8 +317,7 @@ public class DeviceController extends BaseController {
// 定义必需的表头 // 定义必需的表头
Set<String> requiredHeaders = new HashSet<>(Arrays.asList( Set<String> requiredHeaders = new HashSet<>(Arrays.asList(
"设备名称", "设备类型名称", "设备图片", "设备MAC", "蓝牙名称", "设备IMEI", "设备名称", "设备类型名称", "设备图片", "设备MAC", "蓝牙名称", "设备IMEI",
"备注", "是否支持蓝牙", "定位方式", "通讯方式", "备注"
"型号字典用于APP页面跳转", "型号字典用于PC页面跳转"
)); ));
// 检查必需的表头是否都存在 // 检查必需的表头是否都存在

View File

@ -1,4 +1,4 @@
package com.fuyuanshen.app.domain; package com.fuyuanshen.equipment.domain;
import com.fuyuanshen.common.tenant.core.TenantEntity; import com.fuyuanshen.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.annotation.*;

View File

@ -1,4 +1,4 @@
package com.fuyuanshen.app.domain; package com.fuyuanshen.equipment.domain;
import com.fuyuanshen.common.tenant.core.TenantEntity; import com.fuyuanshen.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.annotation.*;

View File

@ -1,6 +1,6 @@
package com.fuyuanshen.app.domain.bo; package com.fuyuanshen.equipment.domain.bo;
import com.fuyuanshen.app.domain.AppBusinessFile; import com.fuyuanshen.equipment.domain.AppBusinessFile;
import com.fuyuanshen.common.core.validate.EditGroup; import com.fuyuanshen.common.core.validate.EditGroup;
import com.fuyuanshen.common.mybatis.core.domain.BaseEntity; import com.fuyuanshen.common.mybatis.core.domain.BaseEntity;
import io.github.linpeilie.annotations.AutoMapper; import io.github.linpeilie.annotations.AutoMapper;

View File

@ -1,6 +1,6 @@
package com.fuyuanshen.app.domain.bo; package com.fuyuanshen.equipment.domain.bo;
import com.fuyuanshen.app.domain.AppOperationVideo; import com.fuyuanshen.equipment.domain.AppOperationVideo;
import com.fuyuanshen.common.core.validate.EditGroup; import com.fuyuanshen.common.core.validate.EditGroup;
import com.fuyuanshen.common.mybatis.core.domain.BaseEntity; import com.fuyuanshen.common.mybatis.core.domain.BaseEntity;
import io.github.linpeilie.annotations.AutoMapper; import io.github.linpeilie.annotations.AutoMapper;

View File

@ -1,17 +1,13 @@
package com.fuyuanshen.app.domain.vo; package com.fuyuanshen.equipment.domain.vo;
import com.fuyuanshen.app.domain.AppBusinessFile; import com.fuyuanshen.equipment.domain.AppBusinessFile;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.ExcelProperty;
import com.fuyuanshen.common.excel.annotation.ExcelDictFormat;
import com.fuyuanshen.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper; import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data; import lombok.Data;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date;
/** /**

View File

@ -1,4 +1,4 @@
package com.fuyuanshen.app.domain.vo; package com.fuyuanshen.equipment.domain.vo;
import lombok.Data; import lombok.Data;

View File

@ -1,17 +1,13 @@
package com.fuyuanshen.app.domain.vo; package com.fuyuanshen.equipment.domain.vo;
import com.fuyuanshen.app.domain.AppOperationVideo; import com.fuyuanshen.equipment.domain.AppOperationVideo;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.ExcelProperty;
import com.fuyuanshen.common.excel.annotation.ExcelDictFormat;
import com.fuyuanshen.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper; import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data; import lombok.Data;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date;
/** /**

View File

@ -1,10 +1,10 @@
package com.fuyuanshen.app.mapper; package com.fuyuanshen.equipment.mapper;
import com.fuyuanshen.app.domain.AppBusinessFile;
import com.fuyuanshen.app.domain.bo.AppBusinessFileBo;
import com.fuyuanshen.app.domain.vo.AppBusinessFileVo;
import com.fuyuanshen.app.domain.vo.AppFileVo;
import com.fuyuanshen.common.mybatis.core.mapper.BaseMapperPlus; import com.fuyuanshen.common.mybatis.core.mapper.BaseMapperPlus;
import com.fuyuanshen.equipment.domain.AppBusinessFile;
import com.fuyuanshen.equipment.domain.bo.AppBusinessFileBo;
import com.fuyuanshen.equipment.domain.vo.AppBusinessFileVo;
import com.fuyuanshen.equipment.domain.vo.AppFileVo;
import java.util.List; import java.util.List;

View File

@ -1,8 +1,8 @@
package com.fuyuanshen.app.mapper; package com.fuyuanshen.equipment.mapper;
import com.fuyuanshen.app.domain.AppOperationVideo;
import com.fuyuanshen.app.domain.vo.AppOperationVideoVo;
import com.fuyuanshen.common.mybatis.core.mapper.BaseMapperPlus; import com.fuyuanshen.common.mybatis.core.mapper.BaseMapperPlus;
import com.fuyuanshen.equipment.domain.AppOperationVideo;
import com.fuyuanshen.equipment.domain.vo.AppOperationVideoVo;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
/** /**

View File

@ -1,11 +1,11 @@
package com.fuyuanshen.app.service; package com.fuyuanshen.equipment.service;
import com.fuyuanshen.app.domain.AppBusinessFile;
import com.fuyuanshen.app.domain.vo.AppBusinessFileVo;
import com.fuyuanshen.app.domain.bo.AppBusinessFileBo;
import com.fuyuanshen.app.domain.vo.AppFileVo;
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo; import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
import com.fuyuanshen.common.mybatis.core.page.PageQuery; import com.fuyuanshen.common.mybatis.core.page.PageQuery;
import com.fuyuanshen.equipment.domain.AppBusinessFile;
import com.fuyuanshen.equipment.domain.bo.AppBusinessFileBo;
import com.fuyuanshen.equipment.domain.vo.AppBusinessFileVo;
import com.fuyuanshen.equipment.domain.vo.AppFileVo;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@ -57,7 +57,9 @@ public interface IAppBusinessFileService {
* @param bo 批量新增app业务文件 * @param bo 批量新增app业务文件
* @return 是否新增成功 * @return 是否新增成功
*/ */
Boolean insertBatch(Collection<AppBusinessFile> bo,Boolean isBatch); Boolean insertBatch(Collection<AppBusinessFile> bo, Boolean isBatch);
void cloneFiles(Long sourceId, Long targetId);
/** /**
* 修改app业务文件 * 修改app业务文件

View File

@ -1,11 +1,10 @@
package com.fuyuanshen.app.service; package com.fuyuanshen.equipment.service;
import com.fuyuanshen.app.domain.AppBusinessFile;
import com.fuyuanshen.app.domain.AppOperationVideo;
import com.fuyuanshen.app.domain.vo.AppOperationVideoVo;
import com.fuyuanshen.app.domain.bo.AppOperationVideoBo;
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo; import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
import com.fuyuanshen.common.mybatis.core.page.PageQuery; import com.fuyuanshen.common.mybatis.core.page.PageQuery;
import com.fuyuanshen.equipment.domain.AppOperationVideo;
import com.fuyuanshen.equipment.domain.bo.AppOperationVideoBo;
import com.fuyuanshen.equipment.domain.vo.AppOperationVideoVo;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@ -59,6 +58,8 @@ public interface IAppOperationVideoService {
*/ */
Boolean insertBatch(Collection<AppOperationVideo> bo); Boolean insertBatch(Collection<AppOperationVideo> bo);
void cloneFiles(Long sourceId, Long targetId);
/** /**
* 修改操作视频 * 修改操作视频
* *

View File

@ -1,27 +1,29 @@
package com.fuyuanshen.app.service.impl; package com.fuyuanshen.equipment.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fuyuanshen.app.domain.vo.AppFileVo;
import com.fuyuanshen.common.core.utils.MapstructUtils; import com.fuyuanshen.common.core.utils.MapstructUtils;
import com.fuyuanshen.common.core.utils.StringUtils;
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo; import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
import com.fuyuanshen.common.mybatis.core.page.PageQuery; import com.fuyuanshen.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.fuyuanshen.equipment.domain.AppBusinessFile;
import com.fuyuanshen.equipment.domain.bo.AppBusinessFileBo;
import com.fuyuanshen.equipment.domain.vo.AppBusinessFileVo;
import com.fuyuanshen.equipment.domain.vo.AppFileVo;
import com.fuyuanshen.equipment.mapper.AppBusinessFileMapper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.fuyuanshen.app.domain.bo.AppBusinessFileBo; import com.fuyuanshen.equipment.service.IAppBusinessFileService;
import com.fuyuanshen.app.domain.vo.AppBusinessFileVo; import org.springframework.transaction.annotation.Transactional;
import com.fuyuanshen.app.domain.AppBusinessFile;
import com.fuyuanshen.app.mapper.AppBusinessFileMapper;
import com.fuyuanshen.app.service.IAppBusinessFileService;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Collection; import java.util.Collection;
import java.util.stream.Collectors;
/** /**
* app业务文件Service业务层处理 * app业务文件Service业务层处理
@ -117,6 +119,38 @@ public class AppBusinessFileServiceImpl implements IAppBusinessFileService {
return baseMapper.insertBatch(bo); return baseMapper.insertBatch(bo);
} }
/**
* 克隆业务文件列表到新业务ID
* @param sourceId 源业务ID如设备类型ID
* @param targetId 目标业务ID如新设备ID
*/
@Transactional(rollbackFor = Exception.class)
@Override
public void cloneFiles(Long sourceId, Long targetId) {
// 1. 使用 Wrappers 替代 this.lambdaQuery()
List<AppBusinessFile> sourceFiles = baseMapper.selectList(
Wrappers.<AppBusinessFile>lambdaQuery().eq(AppBusinessFile::getBusinessId, sourceId)
);
if (CollUtil.isEmpty(sourceFiles)) {
return;
}
// 2. 批量转换并重置ID
List<AppBusinessFile> newFiles = sourceFiles.stream().map(file -> {
AppBusinessFile entity = new AppBusinessFile();
// 建议使用你代码中已有的 MapstructUtils BeanUtil
BeanUtil.copyProperties(file, entity);
entity.setId(null); // 确保主键自增
entity.setBusinessId(targetId); // 绑定到新设备ID
return entity;
}).collect(Collectors.toList());
// 3. 使用你已有的 insertBatch 替代 saveBatch
// 注意这里第二个参数传 false因为是新设备不需要执行你 insertBatch 里的删除逻辑
this.insertBatch(newFiles, false);
}
/** /**
* 修改app业务文件 * 修改app业务文件
* *

View File

@ -1,7 +1,8 @@
package com.fuyuanshen.app.service.impl; package com.fuyuanshen.equipment.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fuyuanshen.app.domain.AppBusinessFile;
import com.fuyuanshen.common.core.utils.MapstructUtils; import com.fuyuanshen.common.core.utils.MapstructUtils;
import com.fuyuanshen.common.core.utils.StringUtils; import com.fuyuanshen.common.core.utils.StringUtils;
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo; import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
@ -9,18 +10,20 @@ import com.fuyuanshen.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.fuyuanshen.equipment.domain.AppOperationVideo;
import com.fuyuanshen.equipment.domain.bo.AppOperationVideoBo;
import com.fuyuanshen.equipment.domain.vo.AppOperationVideoVo;
import com.fuyuanshen.equipment.mapper.AppOperationVideoMapper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.fuyuanshen.app.domain.bo.AppOperationVideoBo; import com.fuyuanshen.equipment.service.IAppOperationVideoService;
import com.fuyuanshen.app.domain.vo.AppOperationVideoVo; import org.springframework.transaction.annotation.Transactional;
import com.fuyuanshen.app.domain.AppOperationVideo;
import com.fuyuanshen.app.mapper.AppOperationVideoMapper;
import com.fuyuanshen.app.service.IAppOperationVideoService;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Collection; import java.util.Collection;
import java.util.stream.Collectors;
/** /**
* 操作视频Service业务层处理 * 操作视频Service业务层处理
@ -125,6 +128,37 @@ public class AppOperationVideoServiceImpl implements IAppOperationVideoService {
return baseMapper.updateById(update) > 0; return baseMapper.updateById(update) > 0;
} }
/**
* 克隆业务文件列表到新业务ID
* @param sourceId 源业务ID如设备类型ID
* @param targetId 目标业务ID如新设备ID
*/
@Transactional(rollbackFor = Exception.class)
@Override
public void cloneFiles(Long sourceId, Long targetId) {
// 1. 使用 Wrappers 替代 this.lambdaQuery()
List<AppOperationVideo> sourceFiles = baseMapper.selectList(
Wrappers.<AppOperationVideo>lambdaQuery().eq(AppOperationVideo::getDeviceId, sourceId)
);
if (CollUtil.isEmpty(sourceFiles)) {
return;
}
// 2. 批量转换并重置ID
List<AppOperationVideo> newFiles = sourceFiles.stream().map(file -> {
AppOperationVideo entity = new AppOperationVideo();
// 建议使用你代码中已有的 MapstructUtils BeanUtil
BeanUtil.copyProperties(file, entity);
entity.setId(null); // 确保主键自增
entity.setDeviceId(targetId); // 绑定到新设备ID
return entity;
}).collect(Collectors.toList());
// 3. 使用你已有的 insertBatch 替代 saveBatch
this.insertBatch(newFiles);
}
/** /**
* 保存前的数据校验 * 保存前的数据校验
*/ */

View File

@ -30,10 +30,7 @@ import com.fuyuanshen.equipment.enums.BindingStatusEnum;
import com.fuyuanshen.equipment.enums.CommunicationModeEnum; import com.fuyuanshen.equipment.enums.CommunicationModeEnum;
import com.fuyuanshen.equipment.enums.DeviceActiveStatusEnum; import com.fuyuanshen.equipment.enums.DeviceActiveStatusEnum;
import com.fuyuanshen.equipment.mapper.*; import com.fuyuanshen.equipment.mapper.*;
import com.fuyuanshen.equipment.service.DeviceAssignmentsService; import com.fuyuanshen.equipment.service.*;
import com.fuyuanshen.equipment.service.DeviceService;
import com.fuyuanshen.equipment.service.DeviceTypeGrantsService;
import com.fuyuanshen.equipment.service.IDeviceGeoFenceService;
import com.fuyuanshen.equipment.utils.FileHashUtil; import com.fuyuanshen.equipment.utils.FileHashUtil;
import com.fuyuanshen.system.domain.vo.SysOssVo; import com.fuyuanshen.system.domain.vo.SysOssVo;
import com.fuyuanshen.system.domain.vo.SysRoleVo; import com.fuyuanshen.system.domain.vo.SysRoleVo;
@ -77,6 +74,8 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
private final DeviceFenceAccessRecordMapper deviceFenceAccessRecordMapper; private final DeviceFenceAccessRecordMapper deviceFenceAccessRecordMapper;
private final FileHashUtil fileHashUtil; private final FileHashUtil fileHashUtil;
private final IAppBusinessFileService appBusinessFileService;
private final IAppOperationVideoService appOperationVideoService;
/** /**
@ -334,6 +333,12 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
device.setBindingStatus(0); device.setBindingStatus(0);
deviceMapper.insert(device); deviceMapper.insert(device);
// 查询设备类型的文件列表
// 4. 核心优化:同步设备类型的文件列表 (一行代码)
appBusinessFileService.cloneFiles(deviceType.getId(), device.getId());
//同步设备类型的视频列表
appOperationVideoService.cloneFiles(deviceType.getId(), device.getId());
// 新增设备类型记录 // 新增设备类型记录
DeviceAssignments assignments = new DeviceAssignments(); DeviceAssignments assignments = new DeviceAssignments();
assignments.setDeviceId(device.getId()); assignments.setDeviceId(device.getId());

View File

@ -2,9 +2,9 @@
<!DOCTYPE mapper <!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fuyuanshen.app.mapper.AppBusinessFileMapper"> <mapper namespace="com.fuyuanshen.equipment.mapper.AppBusinessFileMapper">
<select id="queryAppFileList" resultType="com.fuyuanshen.app.domain.vo.AppFileVo"> <select id="queryAppFileList" resultType="com.fuyuanshen.equipment.domain.vo.AppFileVo">
select a.id,a.business_id,a.file_id,a.file_type,b.file_name,b.url fileUrl from app_business_file a left join sys_oss b on a.file_id = b.oss_id select a.id,a.business_id,a.file_id,a.file_type,b.file_name,b.url fileUrl from app_business_file a left join sys_oss b on a.file_id = b.oss_id
where 1=1 where 1=1
<if test="businessId != null"> <if test="businessId != null">

View File

@ -2,6 +2,6 @@
<!DOCTYPE mapper <!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fuyuanshen.app.mapper.AppOperationVideoMapper"> <mapper namespace="com.fuyuanshen.equipment.mapper.AppOperationVideoMapper">
</mapper> </mapper>