forked from dyf/fys-Multi-tenant
Compare commits
60 Commits
3ca6b69709
...
fys-prod
Author | SHA1 | Date | |
---|---|---|---|
17ed75f54a | |||
0abc5d48c0 | |||
f70c3fa399 | |||
d849be68ed | |||
f80debbf2b | |||
ad59eea2a9 | |||
e7c8e245ba | |||
80b944cbf0 | |||
da6b888934 | |||
619356209b | |||
d84a7cde3b | |||
e4dbee15dd | |||
33e53de5a1 | |||
3bce279d7b | |||
9338b0d24b | |||
537cc0b2d7 | |||
8750bc8e10 | |||
6dde6c3a3b | |||
879e485056 | |||
bb096f53cd | |||
38724dbfad | |||
69c4cc2004 | |||
e9227dea89 | |||
b369b28949 | |||
a7340c744e | |||
f1d1528c40 | |||
6bbe9cbdd1 | |||
3feafc2cd9 | |||
13986bb493 | |||
f2921ff12f | |||
ec89dd8c1e | |||
57322c9c87 | |||
73e1df4232 | |||
4e608b8f3a | |||
7d91426414 | |||
ad06811747 | |||
aeaa906bc9 | |||
36092932bf | |||
34188f20dd | |||
0fa0e4ab1b | |||
e321dcd652 | |||
e35955f156 | |||
3c2d97aaf2 | |||
6ed1241a6d | |||
78e2538f71 | |||
faef79e56d | |||
7b1615ce4d | |||
171eeabea1 | |||
cc776300ec | |||
04df7e3ec7 | |||
7be94fe1d2 | |||
6f24759361 | |||
1cf7c47ef9 | |||
530ee83488 | |||
f938716e2d | |||
bbf1c6cfd5 | |||
082f890009 | |||
800b825892 | |||
bdee8c8383 | |||
6f4e18fb3f |
@ -94,10 +94,10 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- demo模块 -->
|
<!-- demo模块 -->
|
||||||
<dependency>
|
<!-- <dependency> -->
|
||||||
<groupId>com.fuyuanshen</groupId>
|
<!-- <groupId>com.fuyuanshen</groupId> -->
|
||||||
<artifactId>fys-demo</artifactId>
|
<!-- <artifactId>fys-demo</artifactId> -->
|
||||||
</dependency>
|
<!-- </dependency> -->
|
||||||
|
|
||||||
<!-- 工作流模块 -->
|
<!-- 工作流模块 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -99,7 +99,7 @@ public class AppAuthController {
|
|||||||
*/
|
*/
|
||||||
@PostMapping("/logout")
|
@PostMapping("/logout")
|
||||||
public R<Void> logout() {
|
public R<Void> logout() {
|
||||||
// loginService.logout();
|
loginService.logout();
|
||||||
return R.ok("退出成功");
|
return R.ok("退出成功");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,16 +1,20 @@
|
|||||||
package com.fuyuanshen.app.controller;
|
package com.fuyuanshen.app.controller;
|
||||||
|
|
||||||
|
import com.fuyuanshen.app.domain.bo.AppPersonnelInfoBo;
|
||||||
import com.fuyuanshen.app.domain.dto.APPReNameDTO;
|
import com.fuyuanshen.app.domain.dto.APPReNameDTO;
|
||||||
import com.fuyuanshen.app.domain.vo.APPDeviceTypeVo;
|
import com.fuyuanshen.app.domain.vo.APPDeviceTypeVo;
|
||||||
import com.fuyuanshen.app.service.equipment.APPDeviceService;
|
import com.fuyuanshen.app.domain.vo.AppDeviceDetailVo;
|
||||||
|
import com.fuyuanshen.app.service.AppDeviceBizService;
|
||||||
import com.fuyuanshen.common.core.domain.R;
|
import com.fuyuanshen.common.core.domain.R;
|
||||||
|
import com.fuyuanshen.common.core.validate.AddGroup;
|
||||||
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.web.core.BaseController;
|
import com.fuyuanshen.common.web.core.BaseController;
|
||||||
import com.fuyuanshen.equipment.domain.dto.AppDeviceBo;
|
import com.fuyuanshen.equipment.domain.dto.AppDeviceBo;
|
||||||
|
import com.fuyuanshen.equipment.domain.dto.AppDeviceSendMsgBo;
|
||||||
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.AppDeviceVo;
|
||||||
import com.fuyuanshen.equipment.service.DeviceService;
|
import jakarta.validation.constraints.NotNull;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
@ -26,18 +30,16 @@ import java.util.List;
|
|||||||
@RequestMapping("/app/device")
|
@RequestMapping("/app/device")
|
||||||
public class AppDeviceController extends BaseController {
|
public class AppDeviceController extends BaseController {
|
||||||
|
|
||||||
private final DeviceService deviceService;
|
private final AppDeviceBizService appDeviceService;
|
||||||
|
|
||||||
|
|
||||||
private final APPDeviceService appDeviceService;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询设备列表
|
* 查询设备列表
|
||||||
*/
|
*/
|
||||||
@GetMapping("/list")
|
@GetMapping("/list")
|
||||||
public TableDataInfo<AppDeviceVo> list(DeviceQueryCriteria bo, PageQuery pageQuery) {
|
public TableDataInfo<AppDeviceVo> list(DeviceQueryCriteria bo, PageQuery pageQuery) {
|
||||||
|
|
||||||
return deviceService.queryAppDeviceList(bo,pageQuery);
|
return appDeviceService.queryAppDeviceList(bo,pageQuery);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -45,7 +47,7 @@ public class AppDeviceController extends BaseController {
|
|||||||
*/
|
*/
|
||||||
@PostMapping("/bind")
|
@PostMapping("/bind")
|
||||||
public R<Void> bind(@RequestBody AppDeviceBo bo) {
|
public R<Void> bind(@RequestBody AppDeviceBo bo) {
|
||||||
return toAjax(deviceService.bindDevice(bo));
|
return toAjax(appDeviceService.bindDevice(bo));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -54,7 +56,7 @@ public class AppDeviceController extends BaseController {
|
|||||||
*/
|
*/
|
||||||
@DeleteMapping("/unBind")
|
@DeleteMapping("/unBind")
|
||||||
public R<Void> unBind(Long id) {
|
public R<Void> unBind(Long id) {
|
||||||
return toAjax(deviceService.unBindDevice(id));
|
return toAjax(appDeviceService.unBindDevice(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -76,4 +78,31 @@ public class AppDeviceController extends BaseController {
|
|||||||
appDeviceService.reName(reNameDTO);
|
appDeviceService.reName(reNameDTO);
|
||||||
return R.ok("重命名成功!!!");
|
return R.ok("重命名成功!!!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取设备详细信息
|
||||||
|
*
|
||||||
|
* @param id 主键
|
||||||
|
*/
|
||||||
|
@GetMapping("/{id}")
|
||||||
|
public R<AppDeviceDetailVo> getInfo(@NotNull(message = "主键不能为空")
|
||||||
|
@PathVariable Long id) {
|
||||||
|
return R.ok(appDeviceService.getInfo(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 人员信息登记
|
||||||
|
*/
|
||||||
|
@PostMapping(value = "/registerPersonInfo")
|
||||||
|
public R<Void> registerPersonInfo(@Validated(AddGroup.class) @RequestBody AppPersonnelInfoBo bo) {
|
||||||
|
return toAjax(appDeviceService.registerPersonInfo(bo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送信息
|
||||||
|
*/
|
||||||
|
@PostMapping(value = "/sendMessage")
|
||||||
|
public R<Void> sendMessage(@RequestBody AppDeviceSendMsgBo bo) {
|
||||||
|
return toAjax(appDeviceService.sendMessage(bo));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,118 @@
|
|||||||
|
package com.fuyuanshen.app.controller;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.annotation.SaIgnore;
|
||||||
|
import cn.hutool.core.util.RandomUtil;
|
||||||
|
import com.fuyuanshen.app.domain.bo.AppDeviceShareBo;
|
||||||
|
import com.fuyuanshen.app.domain.vo.AppDeviceShareDetailVo;
|
||||||
|
import com.fuyuanshen.app.domain.vo.AppDeviceShareVo;
|
||||||
|
import com.fuyuanshen.app.service.AppDeviceShareService;
|
||||||
|
import com.fuyuanshen.app.service.IAppDeviceShareService;
|
||||||
|
import com.fuyuanshen.common.core.constant.Constants;
|
||||||
|
import com.fuyuanshen.common.core.domain.R;
|
||||||
|
import com.fuyuanshen.common.core.validate.AddGroup;
|
||||||
|
import com.fuyuanshen.common.idempotent.annotation.RepeatSubmit;
|
||||||
|
import com.fuyuanshen.common.mybatis.core.page.PageQuery;
|
||||||
|
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
|
||||||
|
import com.fuyuanshen.common.ratelimiter.annotation.RateLimiter;
|
||||||
|
import com.fuyuanshen.common.redis.utils.RedisUtils;
|
||||||
|
import com.fuyuanshen.common.web.core.BaseController;
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
|
import jakarta.validation.constraints.NotEmpty;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.dromara.sms4j.api.SmsBlend;
|
||||||
|
import org.dromara.sms4j.api.entity.SmsResponse;
|
||||||
|
import org.dromara.sms4j.core.factory.SmsFactory;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.time.Duration;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
|
||||||
|
import static com.fuyuanshen.common.core.constant.GlobalConstants.DEVICE_SHARE_CODES_KEY;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* APP 设备分享
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-07-16
|
||||||
|
*/
|
||||||
|
@Validated
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/app/deviceShare")
|
||||||
|
public class AppDeviceShareController extends BaseController {
|
||||||
|
|
||||||
|
private final IAppDeviceShareService deviceShareService;
|
||||||
|
|
||||||
|
private final AppDeviceShareService appDeviceShareService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分享管理列表
|
||||||
|
*/
|
||||||
|
@GetMapping("/deviceShareList")
|
||||||
|
public TableDataInfo<AppDeviceShareVo> list(AppDeviceShareBo bo, PageQuery pageQuery) {
|
||||||
|
return deviceShareService.queryPageList(bo, pageQuery);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 他人分享管理列表
|
||||||
|
*/
|
||||||
|
@GetMapping("/otherDeviceShareList")
|
||||||
|
public TableDataInfo<AppDeviceShareVo> otherDeviceShareList(AppDeviceShareBo bo, PageQuery pageQuery) {
|
||||||
|
return deviceShareService.otherDeviceShareList(bo, pageQuery);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取设备分享详细信息
|
||||||
|
*
|
||||||
|
* @param id 主键
|
||||||
|
*/
|
||||||
|
@GetMapping("/{id}")
|
||||||
|
public R<AppDeviceShareDetailVo> getInfo(@NotNull(message = "主键不能为空")
|
||||||
|
@PathVariable Long id) {
|
||||||
|
return R.ok(appDeviceShareService.getInfo(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增设备分享
|
||||||
|
*/
|
||||||
|
@RepeatSubmit()
|
||||||
|
@PostMapping("/deviceShare")
|
||||||
|
public R<Void> deviceShare(@Validated(AddGroup.class) @RequestBody AppDeviceShareBo bo) {
|
||||||
|
return toAjax(appDeviceShareService.deviceShare(bo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 移除分享用户
|
||||||
|
*
|
||||||
|
* @param ids 主键串
|
||||||
|
*/
|
||||||
|
@DeleteMapping("/{ids}")
|
||||||
|
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||||
|
@PathVariable Long[] ids) {
|
||||||
|
return toAjax(appDeviceShareService.remove(ids));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 短信验证码
|
||||||
|
*
|
||||||
|
* @param phonenumber 用户手机号
|
||||||
|
*/
|
||||||
|
@SaIgnore
|
||||||
|
@RateLimiter(key = "#phonenumber", time = 60, count = 1)
|
||||||
|
@GetMapping("/sms/code")
|
||||||
|
public R<Void> smsCode(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) {
|
||||||
|
String key = DEVICE_SHARE_CODES_KEY + phonenumber;
|
||||||
|
String code = RandomUtil.randomNumbers(4);
|
||||||
|
RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
|
||||||
|
LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
|
||||||
|
map.put("code", code);
|
||||||
|
SmsBlend smsBlend = SmsFactory.getSmsBlend("config1");
|
||||||
|
SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, map);
|
||||||
|
if (!smsResponse.isSuccess()) {
|
||||||
|
return R.fail(smsResponse.getData().toString());
|
||||||
|
}
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
}
|
@ -1,17 +1,29 @@
|
|||||||
package com.fuyuanshen.app.controller;
|
package com.fuyuanshen.app.controller;
|
||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaIgnore;
|
import cn.dev33.satoken.annotation.SaIgnore;
|
||||||
|
import cn.hutool.core.util.RandomUtil;
|
||||||
import com.fuyuanshen.app.domain.dto.APPForgotPasswordDTO;
|
import com.fuyuanshen.app.domain.dto.APPForgotPasswordDTO;
|
||||||
import com.fuyuanshen.app.domain.dto.APPForgotPasswordSmsDTO;
|
import com.fuyuanshen.app.domain.dto.APPForgotPasswordSmsDTO;
|
||||||
import com.fuyuanshen.app.domain.dto.APPUpdateUserDTO;
|
import com.fuyuanshen.app.domain.dto.APPUpdateUserDTO;
|
||||||
import com.fuyuanshen.app.domain.vo.APPUserInfoVo;
|
import com.fuyuanshen.app.domain.vo.APPUserInfoVo;
|
||||||
import com.fuyuanshen.app.service.IAppUserService;
|
import com.fuyuanshen.app.service.IAppUserService;
|
||||||
|
import com.fuyuanshen.common.core.constant.Constants;
|
||||||
|
import com.fuyuanshen.common.core.constant.GlobalConstants;
|
||||||
import com.fuyuanshen.common.core.domain.R;
|
import com.fuyuanshen.common.core.domain.R;
|
||||||
|
import com.fuyuanshen.common.ratelimiter.annotation.RateLimiter;
|
||||||
|
import com.fuyuanshen.common.redis.utils.RedisUtils;
|
||||||
import com.fuyuanshen.common.web.core.BaseController;
|
import com.fuyuanshen.common.web.core.BaseController;
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.dromara.sms4j.api.SmsBlend;
|
||||||
|
import org.dromara.sms4j.api.entity.SmsResponse;
|
||||||
|
import org.dromara.sms4j.core.factory.SmsFactory;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.time.Duration;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* APP 用户管理
|
* APP 用户管理
|
||||||
* @date 2025-06-27
|
* @date 2025-06-27
|
||||||
@ -50,13 +62,27 @@ public class AppUserController extends BaseController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 发送忘记密码短信
|
* 发送忘记密码短信
|
||||||
|
*
|
||||||
|
* @param phonenumber 用户手机号
|
||||||
*/
|
*/
|
||||||
@SaIgnore
|
@SaIgnore
|
||||||
@PostMapping("/sendForgotPasswordSms")
|
@RateLimiter(key = "#phonenumber", time = 60, count = 1)
|
||||||
public R<Void> sendForgotPasswordSms(@Validated @RequestBody APPForgotPasswordSmsDTO dto) throws Exception {
|
@GetMapping("/sendForgotPasswordSms")
|
||||||
return toAjax(appUserService.sendForgotPasswordSms(dto));
|
public R<Void> smsCode(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) {
|
||||||
|
String key = GlobalConstants.APP_FORGOT_PASSWORD_SMS_KEY + phonenumber;
|
||||||
|
String code = RandomUtil.randomNumbers(4);
|
||||||
|
RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
|
||||||
|
// 验证码模板id 自行处理 (查数据库或写死均可)
|
||||||
|
String templateId = "";
|
||||||
|
LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
|
||||||
|
map.put("code", code);
|
||||||
|
SmsBlend smsBlend = SmsFactory.getSmsBlend("config1");
|
||||||
|
SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, map);
|
||||||
|
if (!smsResponse.isSuccess()) {
|
||||||
|
return R.fail(smsResponse.getData().toString());
|
||||||
|
}
|
||||||
|
return R.ok();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,237 @@
|
|||||||
|
package com.fuyuanshen.app.service;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSON;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.fuyuanshen.app.domain.AppPersonnelInfo;
|
||||||
|
import com.fuyuanshen.app.domain.bo.AppPersonnelInfoBo;
|
||||||
|
import com.fuyuanshen.app.domain.dto.APPReNameDTO;
|
||||||
|
import com.fuyuanshen.app.domain.vo.APPDeviceTypeVo;
|
||||||
|
import com.fuyuanshen.app.domain.vo.AppDeviceDetailVo;
|
||||||
|
import com.fuyuanshen.app.domain.vo.AppPersonnelInfoVo;
|
||||||
|
import com.fuyuanshen.app.mapper.AppPersonnelInfoMapper;
|
||||||
|
import com.fuyuanshen.app.mapper.equipment.APPDeviceMapper;
|
||||||
|
import com.fuyuanshen.common.core.exception.ServiceException;
|
||||||
|
import com.fuyuanshen.common.core.utils.MapstructUtils;
|
||||||
|
import com.fuyuanshen.common.core.utils.ObjectUtils;
|
||||||
|
import com.fuyuanshen.common.mybatis.core.page.PageQuery;
|
||||||
|
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
|
||||||
|
import com.fuyuanshen.common.satoken.utils.AppLoginHelper;
|
||||||
|
import com.fuyuanshen.equipment.domain.Device;
|
||||||
|
import com.fuyuanshen.equipment.domain.DeviceType;
|
||||||
|
import com.fuyuanshen.equipment.domain.dto.AppDeviceBo;
|
||||||
|
import com.fuyuanshen.equipment.domain.dto.AppDeviceSendMsgBo;
|
||||||
|
import com.fuyuanshen.equipment.domain.query.DeviceQueryCriteria;
|
||||||
|
import com.fuyuanshen.equipment.domain.vo.AppDeviceVo;
|
||||||
|
import com.fuyuanshen.equipment.enums.BindingStatusEnum;
|
||||||
|
import com.fuyuanshen.equipment.enums.CommunicationModeEnum;
|
||||||
|
import com.fuyuanshen.equipment.mapper.DeviceMapper;
|
||||||
|
import com.fuyuanshen.equipment.mapper.DeviceTypeMapper;
|
||||||
|
import com.fuyuanshen.equipment.utils.c.ReliableTextToBitmap;
|
||||||
|
import com.fuyuanshen.system.mqtt.config.MqttGateway;
|
||||||
|
import com.fuyuanshen.system.mqtt.constants.MqttConstants;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class AppDeviceBizService {
|
||||||
|
|
||||||
|
private final APPDeviceMapper appDeviceMapper;
|
||||||
|
private final DeviceMapper deviceMapper;
|
||||||
|
private final AppPersonnelInfoMapper appPersonnelInfoMapper;
|
||||||
|
private final DeviceTypeMapper deviceTypeMapper;
|
||||||
|
private final MqttGateway mqttGateway;
|
||||||
|
|
||||||
|
|
||||||
|
public List<APPDeviceTypeVo> getTypeList() {
|
||||||
|
Long userId = AppLoginHelper.getUserId();
|
||||||
|
return appDeviceMapper.getTypeList(userId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reName(APPReNameDTO reNameDTO) {
|
||||||
|
UpdateWrapper<Device> updateWrapper = new UpdateWrapper<>();
|
||||||
|
updateWrapper.eq("id", reNameDTO.getId())
|
||||||
|
.eq("binding_user_id", AppLoginHelper.getUserId())
|
||||||
|
.set("device_name", reNameDTO.getDeviceName());
|
||||||
|
deviceMapper.update(updateWrapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int sendMessage(AppDeviceSendMsgBo bo) {
|
||||||
|
List<Long> deviceIds = bo.getDeviceIds();
|
||||||
|
if(deviceIds == null || deviceIds.isEmpty()){
|
||||||
|
throw new ServiceException("请选择设备");
|
||||||
|
}
|
||||||
|
for (Long deviceId : deviceIds){
|
||||||
|
Device deviceObj = deviceMapper.selectById(deviceId);
|
||||||
|
if(deviceObj==null) {
|
||||||
|
throw new ServiceException("设备不存在"+deviceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] msg = ReliableTextToBitmap.textToBitmapBytes(bo.getSendMsg());
|
||||||
|
Map<String,Object> linkHashMap = new HashMap<>();
|
||||||
|
linkHashMap.put("message",msg);
|
||||||
|
String sendMsg = JSON.toJSONString(linkHashMap);
|
||||||
|
mqttGateway.sendMsgToMqtt(MqttConstants.GLOBAL_PUB_KEY+deviceObj.getDeviceImei(), 1 ,sendMsg);
|
||||||
|
log.info("发送设备消息:{}", bo.getSendMsg());
|
||||||
|
|
||||||
|
UpdateWrapper<Device> updateWrapper = new UpdateWrapper<>();
|
||||||
|
updateWrapper.eq("id", deviceId)
|
||||||
|
.eq("binding_user_id", AppLoginHelper.getUserId())
|
||||||
|
.set("send_msg", bo.getSendMsg());
|
||||||
|
deviceMapper.update(updateWrapper);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public TableDataInfo<AppDeviceVo> queryAppDeviceList(DeviceQueryCriteria bo, PageQuery pageQuery) {
|
||||||
|
if (bo.getBindingUserId() == null) {
|
||||||
|
Long userId = AppLoginHelper.getUserId();
|
||||||
|
bo.setBindingUserId(userId);
|
||||||
|
}
|
||||||
|
Page<AppDeviceVo> result = deviceMapper.queryAppBindDeviceList(pageQuery.build(), bo);
|
||||||
|
return TableDataInfo.build(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int bindDevice(AppDeviceBo bo) {
|
||||||
|
Integer mode = bo.getCommunicationMode();
|
||||||
|
Long userId = AppLoginHelper.getUserId();
|
||||||
|
if (mode == CommunicationModeEnum.FOUR_G.getValue()) {
|
||||||
|
|
||||||
|
String deviceImei = bo.getDeviceImei();
|
||||||
|
QueryWrapper<Device> qw = new QueryWrapper<Device>()
|
||||||
|
.eq("device_imei", deviceImei);
|
||||||
|
List<Device> devices = deviceMapper.selectList(qw);
|
||||||
|
if (devices.isEmpty()) {
|
||||||
|
throw new RuntimeException("请先将设备入库!!!");
|
||||||
|
}
|
||||||
|
Device device = devices.get(0);
|
||||||
|
if (device.getBindingStatus() != null && device.getBindingStatus() == BindingStatusEnum.BOUND.getCode()) {
|
||||||
|
throw new RuntimeException("设备已绑定");
|
||||||
|
}
|
||||||
|
UpdateWrapper<Device> deviceUpdateWrapper = new UpdateWrapper<>();
|
||||||
|
deviceUpdateWrapper.eq("id", device.getId())
|
||||||
|
.set("binding_status", BindingStatusEnum.BOUND.getCode())
|
||||||
|
.set("binding_user_id", userId)
|
||||||
|
.set("binding_time", new Date());
|
||||||
|
|
||||||
|
|
||||||
|
return deviceMapper.update(null, deviceUpdateWrapper);
|
||||||
|
} else if (mode == CommunicationModeEnum.BLUETOOTH.getValue()) {
|
||||||
|
String deviceMac = bo.getDeviceMac();
|
||||||
|
QueryWrapper<Device> qw = new QueryWrapper<Device>()
|
||||||
|
.eq("device_mac", deviceMac);
|
||||||
|
List<Device> devices = deviceMapper.selectList(qw);
|
||||||
|
if (devices.isEmpty()) {
|
||||||
|
throw new RuntimeException("请先将设备入库!!!");
|
||||||
|
}
|
||||||
|
Device device = devices.get(0);
|
||||||
|
if (device.getBindingStatus() != null && device.getBindingStatus() == BindingStatusEnum.BOUND.getCode()) {
|
||||||
|
throw new RuntimeException("设备已绑定");
|
||||||
|
}
|
||||||
|
UpdateWrapper<Device> deviceUpdateWrapper = new UpdateWrapper<>();
|
||||||
|
deviceUpdateWrapper.eq("id", device.getId())
|
||||||
|
.set("binding_status", BindingStatusEnum.BOUND.getCode())
|
||||||
|
.set("binding_user_id", userId)
|
||||||
|
.set("binding_time", new Date());
|
||||||
|
return deviceMapper.update(null, deviceUpdateWrapper);
|
||||||
|
} else {
|
||||||
|
throw new RuntimeException("通讯方式错误");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public int unBindDevice(Long id) {
|
||||||
|
Device device = deviceMapper.selectById(id);
|
||||||
|
if (device == null) {
|
||||||
|
throw new RuntimeException("请先将设备入库!!!");
|
||||||
|
}
|
||||||
|
UpdateWrapper<Device> deviceUpdateWrapper = new UpdateWrapper<>();
|
||||||
|
deviceUpdateWrapper.eq("id", device.getId())
|
||||||
|
.set("binding_status", BindingStatusEnum.UNBOUND.getCode())
|
||||||
|
.set("binding_user_id", null)
|
||||||
|
.set("binding_time", null);
|
||||||
|
return deviceMapper.update(null, deviceUpdateWrapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AppDeviceDetailVo getInfo(Long id) {
|
||||||
|
Device device = deviceMapper.selectById(id);
|
||||||
|
if (device == null) {
|
||||||
|
throw new RuntimeException("请先将设备入库!!!");
|
||||||
|
}
|
||||||
|
AppDeviceDetailVo vo = new AppDeviceDetailVo();
|
||||||
|
vo.setDeviceId(device.getId());
|
||||||
|
vo.setDeviceName(device.getDeviceName());
|
||||||
|
vo.setDevicePic(device.getDevicePic());
|
||||||
|
vo.setDeviceImei(device.getDeviceImei());
|
||||||
|
vo.setDeviceMac(device.getDeviceMac());
|
||||||
|
vo.setDeviceStatus(device.getDeviceStatus());
|
||||||
|
DeviceType deviceType = deviceTypeMapper.selectById(device.getDeviceType());
|
||||||
|
if(deviceType!=null){
|
||||||
|
vo.setCommunicationMode(Integer.valueOf(deviceType.getCommunicationMode()));
|
||||||
|
vo.setTypeName(deviceType.getTypeName());
|
||||||
|
}
|
||||||
|
vo.setBluetoothName(device.getBluetoothName());
|
||||||
|
|
||||||
|
vo.setSendMsg(device.getSendMsg());
|
||||||
|
|
||||||
|
QueryWrapper<AppPersonnelInfo> qw = new QueryWrapper<AppPersonnelInfo>()
|
||||||
|
.eq("device_id", device.getId());
|
||||||
|
AppPersonnelInfo appPersonnelInfo = appPersonnelInfoMapper.selectOne(qw);
|
||||||
|
if(appPersonnelInfo != null){
|
||||||
|
AppPersonnelInfoVo personnelInfoVo = MapstructUtils.convert(appPersonnelInfo, AppPersonnelInfoVo.class);
|
||||||
|
vo.setPersonnelInfo(personnelInfoVo);
|
||||||
|
}
|
||||||
|
return vo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean registerPersonInfo(AppPersonnelInfoBo bo) {
|
||||||
|
Long deviceId = bo.getDeviceId();
|
||||||
|
Device deviceObj = deviceMapper.selectById(deviceId);
|
||||||
|
if(deviceObj == null){
|
||||||
|
throw new RuntimeException("请先将设备入库!!!");
|
||||||
|
}
|
||||||
|
QueryWrapper<AppPersonnelInfo> qw = new QueryWrapper<AppPersonnelInfo>()
|
||||||
|
.eq("device_id", deviceId);
|
||||||
|
List<AppPersonnelInfoVo> appPersonnelInfoVos = appPersonnelInfoMapper.selectVoList(qw);
|
||||||
|
// unitName,position,name,id
|
||||||
|
byte[] unitName = ReliableTextToBitmap.textToBitmapBytes(bo.getUnitName());
|
||||||
|
byte[] position = ReliableTextToBitmap.textToBitmapBytes(bo.getPosition());
|
||||||
|
byte[] name = ReliableTextToBitmap.textToBitmapBytes(bo.getName());
|
||||||
|
byte[] id = ReliableTextToBitmap.textToBitmapBytes(bo.getCode());
|
||||||
|
Map<String,Object> linkHashMap = new HashMap<>();
|
||||||
|
linkHashMap.put("unitName",unitName);
|
||||||
|
linkHashMap.put("position",position);
|
||||||
|
linkHashMap.put("name",name);
|
||||||
|
linkHashMap.put("id",id);
|
||||||
|
String personnelInfo = JSON.toJSONString(linkHashMap);
|
||||||
|
mqttGateway.sendMsgToMqtt(MqttConstants.GLOBAL_PUB_KEY+deviceObj.getDeviceImei(), 1 ,personnelInfo);
|
||||||
|
log.info("发送点阵数据到设备消息:{}", bo);
|
||||||
|
|
||||||
|
if(ObjectUtils.length(appPersonnelInfoVos) == 0){
|
||||||
|
AppPersonnelInfo appPersonnelInfo = MapstructUtils.convert(bo, AppPersonnelInfo.class);
|
||||||
|
return appPersonnelInfoMapper.insertOrUpdate(appPersonnelInfo);
|
||||||
|
}else {
|
||||||
|
UpdateWrapper<AppPersonnelInfo> uw = new UpdateWrapper<>();
|
||||||
|
uw.eq("device_id", deviceId)
|
||||||
|
.set("name", bo.getName())
|
||||||
|
.set("position", bo.getPosition())
|
||||||
|
.set("unit_name", bo.getUnitName())
|
||||||
|
.set("code",bo.getCode());
|
||||||
|
return appPersonnelInfoMapper.update(null, uw)>0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,135 @@
|
|||||||
|
package com.fuyuanshen.app.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||||
|
import com.fuyuanshen.app.domain.AppDeviceShare;
|
||||||
|
import com.fuyuanshen.app.domain.AppPersonnelInfo;
|
||||||
|
import com.fuyuanshen.app.domain.bo.AppDeviceShareBo;
|
||||||
|
import com.fuyuanshen.app.domain.vo.AppDeviceShareDetailVo;
|
||||||
|
import com.fuyuanshen.app.domain.vo.AppDeviceShareVo;
|
||||||
|
import com.fuyuanshen.app.domain.vo.AppPersonnelInfoVo;
|
||||||
|
import com.fuyuanshen.app.mapper.AppDeviceShareMapper;
|
||||||
|
import com.fuyuanshen.app.mapper.AppPersonnelInfoMapper;
|
||||||
|
import com.fuyuanshen.common.core.constant.Constants;
|
||||||
|
import com.fuyuanshen.common.core.constant.GlobalConstants;
|
||||||
|
import com.fuyuanshen.common.core.exception.ServiceException;
|
||||||
|
import com.fuyuanshen.common.core.exception.user.CaptchaExpireException;
|
||||||
|
import com.fuyuanshen.common.core.utils.MessageUtils;
|
||||||
|
import com.fuyuanshen.common.core.utils.StringUtils;
|
||||||
|
import com.fuyuanshen.common.redis.utils.RedisUtils;
|
||||||
|
import com.fuyuanshen.common.satoken.utils.AppLoginHelper;
|
||||||
|
import com.fuyuanshen.equipment.domain.Device;
|
||||||
|
import com.fuyuanshen.equipment.domain.DeviceType;
|
||||||
|
import com.fuyuanshen.equipment.mapper.DeviceMapper;
|
||||||
|
import com.fuyuanshen.equipment.mapper.DeviceTypeMapper;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
public class AppDeviceShareService {
|
||||||
|
|
||||||
|
private final AppDeviceShareMapper appDeviceShareMapper;
|
||||||
|
|
||||||
|
private final DeviceMapper deviceMapper;
|
||||||
|
|
||||||
|
private final DeviceTypeMapper deviceTypeMapper;
|
||||||
|
|
||||||
|
private final AppPersonnelInfoMapper appPersonnelInfoMapper;
|
||||||
|
|
||||||
|
public AppDeviceShareDetailVo getInfo(Long id) {
|
||||||
|
|
||||||
|
LambdaQueryWrapper<AppDeviceShare> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
queryWrapper.eq(AppDeviceShare::getDeviceId, id);
|
||||||
|
List<AppDeviceShareVo> appDeviceShareVos = appDeviceShareMapper.selectVoList(queryWrapper);
|
||||||
|
if(appDeviceShareVos==null || appDeviceShareVos.isEmpty()){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
AppDeviceShareVo shareVo = appDeviceShareVos.get(0);
|
||||||
|
AppDeviceShareDetailVo shareDetailVo = new AppDeviceShareDetailVo();
|
||||||
|
shareDetailVo.setId(shareVo.getId());
|
||||||
|
shareDetailVo.setDeviceId(shareVo.getDeviceId());
|
||||||
|
shareDetailVo.setPhonenumber(shareVo.getPhonenumber());
|
||||||
|
shareDetailVo.setPermission(shareVo.getPermission());
|
||||||
|
|
||||||
|
Device device = deviceMapper.selectById(shareVo.getDeviceId());
|
||||||
|
shareDetailVo.setDeviceName(device.getDeviceName());
|
||||||
|
shareDetailVo.setDeviceImei(device.getDeviceImei());
|
||||||
|
shareDetailVo.setDeviceMac(device.getDeviceMac());
|
||||||
|
|
||||||
|
DeviceType deviceType = deviceTypeMapper.selectById(device.getDeviceType());
|
||||||
|
if(deviceType!=null){
|
||||||
|
shareDetailVo.setCommunicationMode(Integer.valueOf(deviceType.getCommunicationMode()));
|
||||||
|
}
|
||||||
|
shareDetailVo.setDevicePic(device.getDevicePic());
|
||||||
|
shareDetailVo.setTypeName(deviceType.getTypeName());
|
||||||
|
shareDetailVo.setBluetoothName(device.getBluetoothName());
|
||||||
|
shareDetailVo.setDeviceStatus(device.getDeviceStatus());
|
||||||
|
shareDetailVo.setSendMsg(device.getSendMsg());
|
||||||
|
|
||||||
|
LambdaQueryWrapper<AppPersonnelInfo> qw = new LambdaQueryWrapper<>();
|
||||||
|
qw.eq(AppPersonnelInfo::getDeviceId, device.getId());
|
||||||
|
List<AppPersonnelInfoVo> appPersonnelInfoVos = appPersonnelInfoMapper.selectVoList(qw);
|
||||||
|
if(appPersonnelInfoVos!=null && !appPersonnelInfoVos.isEmpty()){
|
||||||
|
shareDetailVo.setPersonnelInfo(appPersonnelInfoVos.get(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
return shareDetailVo;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 校验短信验证码
|
||||||
|
*/
|
||||||
|
private boolean validateSmsCode(String tenantId, String phonenumber, String smsCode) {
|
||||||
|
String code = RedisUtils.getCacheObject(GlobalConstants.DEVICE_SHARE_CODES_KEY + phonenumber);
|
||||||
|
if (StringUtils.isBlank(code)) {
|
||||||
|
throw new ServiceException("验证码失效");
|
||||||
|
}
|
||||||
|
return code.equals(smsCode);
|
||||||
|
}
|
||||||
|
public int deviceShare(AppDeviceShareBo bo) {
|
||||||
|
boolean flag = validateSmsCode(AppLoginHelper.getTenantId(), bo.getPhonenumber(), bo.getSmsCode());
|
||||||
|
if(!flag){
|
||||||
|
throw new ServiceException("验证码错误");
|
||||||
|
}
|
||||||
|
|
||||||
|
Device device = deviceMapper.selectById(bo.getDeviceId());
|
||||||
|
if(device==null){
|
||||||
|
throw new ServiceException("设备不存在");
|
||||||
|
}
|
||||||
|
Long userId = AppLoginHelper.getUserId();
|
||||||
|
LambdaQueryWrapper<AppDeviceShare> lqw = new LambdaQueryWrapper<>();
|
||||||
|
lqw.eq(AppDeviceShare::getDeviceId, bo.getDeviceId());
|
||||||
|
lqw.eq(AppDeviceShare::getPhonenumber, bo.getPhonenumber());
|
||||||
|
Long count = appDeviceShareMapper.selectCount(lqw);
|
||||||
|
if(count>0){
|
||||||
|
|
||||||
|
UpdateWrapper<AppDeviceShare> uw = new UpdateWrapper<>();
|
||||||
|
uw.eq("device_id", bo.getDeviceId());
|
||||||
|
uw.eq("phonenumber", bo.getPhonenumber());
|
||||||
|
uw.set("permission", bo.getPermission());
|
||||||
|
uw.set("update_by", userId);
|
||||||
|
uw.set("update_time", new Date());
|
||||||
|
|
||||||
|
return appDeviceShareMapper.update(uw);
|
||||||
|
}else {
|
||||||
|
AppDeviceShare appDeviceShare = new AppDeviceShare();
|
||||||
|
appDeviceShare.setDeviceId(bo.getDeviceId());
|
||||||
|
appDeviceShare.setPhonenumber(bo.getPhonenumber());
|
||||||
|
appDeviceShare.setPermission(bo.getPermission());
|
||||||
|
appDeviceShare.setCreateBy(userId);
|
||||||
|
return appDeviceShareMapper.insert(appDeviceShare);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int remove(Long[] ids) {
|
||||||
|
return appDeviceShareMapper.deleteByIds(Arrays.asList(ids));
|
||||||
|
}
|
||||||
|
}
|
@ -67,7 +67,7 @@ public class CaptchaController {
|
|||||||
LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
|
LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
|
||||||
map.put("code", code);
|
map.put("code", code);
|
||||||
SmsBlend smsBlend = SmsFactory.getSmsBlend("config1");
|
SmsBlend smsBlend = SmsFactory.getSmsBlend("config1");
|
||||||
SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, templateId, map);
|
SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, map);
|
||||||
if (!smsResponse.isSuccess()) {
|
if (!smsResponse.isSuccess()) {
|
||||||
log.error("验证码短信发送异常 => {}", smsResponse);
|
log.error("验证码短信发送异常 => {}", smsResponse);
|
||||||
return R.fail(smsResponse.getData().toString());
|
return R.fail(smsResponse.getData().toString());
|
||||||
|
@ -14,12 +14,10 @@ import com.fuyuanshen.common.core.constant.SystemConstants;
|
|||||||
import com.fuyuanshen.common.core.domain.model.AppLoginUser;
|
import com.fuyuanshen.common.core.domain.model.AppLoginUser;
|
||||||
import com.fuyuanshen.common.core.domain.model.SmsLoginBody;
|
import com.fuyuanshen.common.core.domain.model.SmsLoginBody;
|
||||||
import com.fuyuanshen.common.core.enums.LoginType;
|
import com.fuyuanshen.common.core.enums.LoginType;
|
||||||
|
import com.fuyuanshen.common.core.enums.UserType;
|
||||||
import com.fuyuanshen.common.core.exception.user.CaptchaExpireException;
|
import com.fuyuanshen.common.core.exception.user.CaptchaExpireException;
|
||||||
import com.fuyuanshen.common.core.exception.user.UserException;
|
import com.fuyuanshen.common.core.exception.user.UserException;
|
||||||
import com.fuyuanshen.common.core.utils.MessageUtils;
|
import com.fuyuanshen.common.core.utils.*;
|
||||||
import com.fuyuanshen.common.core.utils.ServletUtils;
|
|
||||||
import com.fuyuanshen.common.core.utils.StringUtils;
|
|
||||||
import com.fuyuanshen.common.core.utils.ValidatorUtils;
|
|
||||||
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;
|
||||||
import com.fuyuanshen.common.satoken.utils.AppLoginHelper;
|
import com.fuyuanshen.common.satoken.utils.AppLoginHelper;
|
||||||
@ -60,9 +58,10 @@ public class AppSmsAuthStrategy implements IAuthStrategy {
|
|||||||
AppUserVo user = loadUserByPhonenumber(phonenumber);
|
AppUserVo user = loadUserByPhonenumber(phonenumber);
|
||||||
if (ObjectUtil.isNull(user)) {
|
if (ObjectUtil.isNull(user)) {
|
||||||
//新增Appuser
|
//新增Appuser
|
||||||
addAppUser(tenantId, phonenumber);
|
AppUser appUser = addAppUser(tenantId, phonenumber);
|
||||||
|
user = new AppUserVo();
|
||||||
user = appUserMapper.selectVoOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhonenumber, phonenumber));
|
MapstructUtils.convert(appUser, user);
|
||||||
|
// user = appUserMapper.selectVoOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhonenumber, phonenumber));
|
||||||
// loginService.recordLogininfor(tenantId, phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.not.exists", phonenumber));
|
// loginService.recordLogininfor(tenantId, phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.not.exists", phonenumber));
|
||||||
// throw new UserException("user.not.exists", phonenumber);
|
// throw new UserException("user.not.exists", phonenumber);
|
||||||
}
|
}
|
||||||
@ -72,6 +71,7 @@ public class AppSmsAuthStrategy implements IAuthStrategy {
|
|||||||
});
|
});
|
||||||
loginUser.setClientKey(client.getClientKey());
|
loginUser.setClientKey(client.getClientKey());
|
||||||
loginUser.setDeviceType(client.getDeviceType());
|
loginUser.setDeviceType(client.getDeviceType());
|
||||||
|
loginUser.setUserType(UserType.APP_USER.getUserType());
|
||||||
SaLoginParameter model = new SaLoginParameter();
|
SaLoginParameter model = new SaLoginParameter();
|
||||||
model.setDeviceType(client.getDeviceType());
|
model.setDeviceType(client.getDeviceType());
|
||||||
// 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置
|
// 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置
|
||||||
@ -89,7 +89,7 @@ public class AppSmsAuthStrategy implements IAuthStrategy {
|
|||||||
return loginVo;
|
return loginVo;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addAppUser(String tenantId, String phonenumber) {
|
private AppUser addAppUser(String tenantId, String phonenumber) {
|
||||||
AppUser appUser = new AppUser();
|
AppUser appUser = new AppUser();
|
||||||
appUser.setPhonenumber(phonenumber);
|
appUser.setPhonenumber(phonenumber);
|
||||||
appUser.setUserName(phonenumber);
|
appUser.setUserName(phonenumber);
|
||||||
@ -98,6 +98,7 @@ public class AppSmsAuthStrategy implements IAuthStrategy {
|
|||||||
appUser.setLoginIp(ServletUtils.getClientIP());
|
appUser.setLoginIp(ServletUtils.getClientIP());
|
||||||
appUser.setTenantId(tenantId);
|
appUser.setTenantId(tenantId);
|
||||||
appUserMapper.insert(appUser);
|
appUserMapper.insert(appUser);
|
||||||
|
return appUser;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -114,7 +115,9 @@ public class AppSmsAuthStrategy implements IAuthStrategy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private AppUserVo loadUserByPhonenumber(String phonenumber) {
|
private AppUserVo loadUserByPhonenumber(String phonenumber) {
|
||||||
AppUserVo user = appUserMapper.selectVoOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhonenumber, phonenumber));
|
AppUserVo user = appUserMapper.selectVoOne(new LambdaQueryWrapper<AppUser>()
|
||||||
|
.eq(AppUser::getPhonenumber, phonenumber)
|
||||||
|
.eq(AppUser::getUserType, UserType.APP_USER.getUserType()));
|
||||||
if (ObjectUtil.isNull(user)) {
|
if (ObjectUtil.isNull(user)) {
|
||||||
log.info("登录用户:{} 不存在.", phonenumber);
|
log.info("登录用户:{} 不存在.", phonenumber);
|
||||||
// throw new UserException("user.not.exists", phonenumber);
|
// throw new UserException("user.not.exists", phonenumber);
|
||||||
@ -126,5 +129,4 @@ public class AppSmsAuthStrategy implements IAuthStrategy {
|
|||||||
}
|
}
|
||||||
return user;
|
return user;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -303,6 +303,6 @@ mqtt:
|
|||||||
password: fys123456
|
password: fys123456
|
||||||
url: tcp://47.107.152.87:1883
|
url: tcp://47.107.152.87:1883
|
||||||
subClientId: fys_subClient
|
subClientId: fys_subClient
|
||||||
subTopic: worker/alert/#,worker/location/#
|
subTopic: A/#,worker/location/#
|
||||||
pubTopic: worker/location
|
pubTopic: B/#
|
||||||
pubClientId: fys_pubClient
|
pubClientId: fys_pubClient
|
@ -4,7 +4,7 @@ spring.servlet.multipart.location: /fys/server/temp
|
|||||||
--- # 监控中心配置
|
--- # 监控中心配置
|
||||||
spring.boot.admin.client:
|
spring.boot.admin.client:
|
||||||
# 增加客户端开关
|
# 增加客户端开关
|
||||||
enabled: true
|
enabled: false
|
||||||
url: http://localhost:9090/admin
|
url: http://localhost:9090/admin
|
||||||
instance:
|
instance:
|
||||||
service-host-type: IP
|
service-host-type: IP
|
||||||
@ -16,7 +16,7 @@ spring.boot.admin.client:
|
|||||||
|
|
||||||
--- # snail-job 配置
|
--- # snail-job 配置
|
||||||
snail-job:
|
snail-job:
|
||||||
enabled: true
|
enabled: false
|
||||||
# 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务
|
# 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务
|
||||||
group: "fys_group"
|
group: "fys_group"
|
||||||
# SnailJob 接入验证令牌 详见 script/sql/ry_job.sql `sj_group_config`表
|
# SnailJob 接入验证令牌 详见 script/sql/ry_job.sql `sj_group_config`表
|
||||||
|
@ -17,6 +17,11 @@ public interface GlobalConstants {
|
|||||||
*/
|
*/
|
||||||
String CAPTCHA_CODE_KEY = GLOBAL_REDIS_KEY + "captcha_codes:";
|
String CAPTCHA_CODE_KEY = GLOBAL_REDIS_KEY + "captcha_codes:";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备分享验证码 redis key
|
||||||
|
*/
|
||||||
|
String DEVICE_SHARE_CODES_KEY = GLOBAL_REDIS_KEY + "device_share_codes:";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 验证码 redis key
|
* 验证码 redis key
|
||||||
*/
|
*/
|
||||||
|
@ -37,7 +37,7 @@ public enum BusinessType {
|
|||||||
EXPORT,
|
EXPORT,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 导入
|
*
|
||||||
*/
|
*/
|
||||||
IMPORT,
|
IMPORT,
|
||||||
|
|
||||||
|
@ -17,8 +17,8 @@ public class TestSMSController {
|
|||||||
public void testSend() {
|
public void testSend() {
|
||||||
// 在创建完SmsBlend实例后,再未手动调用注销的情况下框架会持有该实例,可以直接通过指定configId来获取想要的配置,如果你想使用
|
// 在创建完SmsBlend实例后,再未手动调用注销的情况下框架会持有该实例,可以直接通过指定configId来获取想要的配置,如果你想使用
|
||||||
// 负载均衡形式获取实例,只要使用getSmsBlend的无参重载方法即可,如果你仅有一个配置,也可以使用该方法
|
// 负载均衡形式获取实例,只要使用getSmsBlend的无参重载方法即可,如果你仅有一个配置,也可以使用该方法
|
||||||
SmsBlend smsBlend = SmsFactory.getSmsBlend("alibaba");
|
SmsBlend smsBlend = SmsFactory.getSmsBlend("config1");
|
||||||
SmsResponse smsResponse = smsBlend.sendMessage("18656573389", "123");
|
SmsResponse smsResponse = smsBlend.sendMessage("18656573389", "1234");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -0,0 +1,105 @@
|
|||||||
|
//package com.fuyuanshen.app.controller;
|
||||||
|
//
|
||||||
|
//import java.util.List;
|
||||||
|
//
|
||||||
|
//import lombok.RequiredArgsConstructor;
|
||||||
|
//import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
//import jakarta.validation.constraints.*;
|
||||||
|
//import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||||
|
//import org.springframework.web.bind.annotation.*;
|
||||||
|
//import org.springframework.validation.annotation.Validated;
|
||||||
|
//import com.fuyuanshen.common.idempotent.annotation.RepeatSubmit;
|
||||||
|
//import com.fuyuanshen.common.log.annotation.Log;
|
||||||
|
//import com.fuyuanshen.common.web.core.BaseController;
|
||||||
|
//import com.fuyuanshen.common.mybatis.core.page.PageQuery;
|
||||||
|
//import com.fuyuanshen.common.core.domain.R;
|
||||||
|
//import com.fuyuanshen.common.core.validate.AddGroup;
|
||||||
|
//import com.fuyuanshen.common.core.validate.EditGroup;
|
||||||
|
//import com.fuyuanshen.common.log.enums.BusinessType;
|
||||||
|
//import com.fuyuanshen.common.excel.utils.ExcelUtil;
|
||||||
|
//import com.fuyuanshen.app.domain.vo.AppDeviceShareVo;
|
||||||
|
//import com.fuyuanshen.app.domain.bo.AppDeviceShareBo;
|
||||||
|
//import com.fuyuanshen.app.service.IAppDeviceShareService;
|
||||||
|
//import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
|
||||||
|
//
|
||||||
|
///**
|
||||||
|
// * 设备分享
|
||||||
|
// *
|
||||||
|
// * @author Lion Li
|
||||||
|
// * @date 2025-07-16
|
||||||
|
// */
|
||||||
|
//@Validated
|
||||||
|
//@RequiredArgsConstructor
|
||||||
|
//@RestController
|
||||||
|
//@RequestMapping("/app/deviceShare")
|
||||||
|
//public class AppDeviceShareController extends BaseController {
|
||||||
|
//
|
||||||
|
// private final IAppDeviceShareService appDeviceShareService;
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * 查询设备分享列表
|
||||||
|
// */
|
||||||
|
// @SaCheckPermission("app:deviceShare:list")
|
||||||
|
// @GetMapping("/list")
|
||||||
|
// public TableDataInfo<AppDeviceShareVo> list(AppDeviceShareBo bo, PageQuery pageQuery) {
|
||||||
|
// return appDeviceShareService.queryPageList(bo, pageQuery);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * 导出设备分享列表
|
||||||
|
// */
|
||||||
|
// @SaCheckPermission("app:deviceShare:export")
|
||||||
|
// @Log(title = "设备分享", businessType = BusinessType.EXPORT)
|
||||||
|
// @PostMapping("/export")
|
||||||
|
// public void export(AppDeviceShareBo bo, HttpServletResponse response) {
|
||||||
|
// List<AppDeviceShareVo> list = appDeviceShareService.queryList(bo);
|
||||||
|
// ExcelUtil.exportExcel(list, "设备分享", AppDeviceShareVo.class, response);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * 获取设备分享详细信息
|
||||||
|
// *
|
||||||
|
// * @param id 主键
|
||||||
|
// */
|
||||||
|
// @SaCheckPermission("app:deviceShare:query")
|
||||||
|
// @GetMapping("/{id}")
|
||||||
|
// public R<AppDeviceShareVo> getInfo(@NotNull(message = "主键不能为空")
|
||||||
|
// @PathVariable Long id) {
|
||||||
|
// return R.ok(appDeviceShareService.queryById(id));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * 新增设备分享
|
||||||
|
// */
|
||||||
|
// @SaCheckPermission("app:deviceShare:add")
|
||||||
|
// @Log(title = "设备分享", businessType = BusinessType.INSERT)
|
||||||
|
// @RepeatSubmit()
|
||||||
|
// @PostMapping()
|
||||||
|
// public R<Void> add(@Validated(AddGroup.class) @RequestBody AppDeviceShareBo bo) {
|
||||||
|
// return toAjax(appDeviceShareService.insertByBo(bo));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * 修改设备分享
|
||||||
|
// */
|
||||||
|
// @SaCheckPermission("app:deviceShare:edit")
|
||||||
|
// @Log(title = "设备分享", businessType = BusinessType.UPDATE)
|
||||||
|
// @RepeatSubmit()
|
||||||
|
// @PutMapping()
|
||||||
|
// public R<Void> edit(@Validated(EditGroup.class) @RequestBody AppDeviceShareBo bo) {
|
||||||
|
// return toAjax(appDeviceShareService.updateByBo(bo));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * 删除设备分享
|
||||||
|
// *
|
||||||
|
// * @param ids 主键串
|
||||||
|
// */
|
||||||
|
// @SaCheckPermission("app:deviceShare:remove")
|
||||||
|
// @Log(title = "设备分享", businessType = BusinessType.DELETE)
|
||||||
|
// @DeleteMapping("/{ids}")
|
||||||
|
// public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||||
|
// @PathVariable Long[] ids) {
|
||||||
|
// return toAjax(appDeviceShareService.deleteWithValidByIds(List.of(ids), true));
|
||||||
|
// }
|
||||||
|
//}
|
@ -2,6 +2,7 @@ package com.fuyuanshen.app.controller;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.fuyuanshen.common.core.enums.UserType;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import jakarta.validation.constraints.*;
|
import jakarta.validation.constraints.*;
|
||||||
@ -36,12 +37,14 @@ public class AppUserController extends BaseController {
|
|||||||
|
|
||||||
private final IAppUserService appUserService;
|
private final IAppUserService appUserService;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询APP用户信息列表
|
* 查询APP用户信息列表
|
||||||
*/
|
*/
|
||||||
// @SaCheckPermission("app:user:list")
|
// @SaCheckPermission("app:user:list")
|
||||||
@GetMapping("/list")
|
@GetMapping("/list")
|
||||||
public TableDataInfo<AppUserVo> list(AppUserBo bo, PageQuery pageQuery) {
|
public TableDataInfo<AppUserVo> list(AppUserBo bo, PageQuery pageQuery) {
|
||||||
|
bo.setUserType(UserType.APP_USER.getUserType());
|
||||||
return appUserService.queryPageList(bo, pageQuery);
|
return appUserService.queryPageList(bo, pageQuery);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,6 @@ package com.fuyuanshen.app.controller.equipment;
|
|||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.fuyuanshen.app.domain.APPDevice;
|
import com.fuyuanshen.app.domain.APPDevice;
|
||||||
import com.fuyuanshen.app.domain.APPDeviceType;
|
import com.fuyuanshen.app.domain.APPDeviceType;
|
||||||
import com.fuyuanshen.app.domain.dto.APPUnbindDTO;
|
|
||||||
import com.fuyuanshen.app.domain.query.APPDeviceQueryCriteria;
|
import com.fuyuanshen.app.domain.query.APPDeviceQueryCriteria;
|
||||||
import com.fuyuanshen.app.service.equipment.APPDeviceService;
|
import com.fuyuanshen.app.service.equipment.APPDeviceService;
|
||||||
import com.fuyuanshen.common.core.domain.R;
|
import com.fuyuanshen.common.core.domain.R;
|
||||||
|
@ -0,0 +1,51 @@
|
|||||||
|
package com.fuyuanshen.app.domain;
|
||||||
|
|
||||||
|
import com.fuyuanshen.common.tenant.core.TenantEntity;
|
||||||
|
import com.baomidou.mybatisplus.annotation.*;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备分享对象 app_device_share
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-07-16
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@TableName("app_device_share")
|
||||||
|
public class AppDeviceShare extends TenantEntity {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键id
|
||||||
|
*/
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备ID
|
||||||
|
*/
|
||||||
|
private Long deviceId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 手机号
|
||||||
|
*/
|
||||||
|
private String phonenumber;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 功能权限(1:灯光模式;2:激光模式;3:开机画面;4:人员信息登记;5:发送信息;6:产品信息)
|
||||||
|
以逗号分隔
|
||||||
|
*/
|
||||||
|
private String permission;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备注
|
||||||
|
*/
|
||||||
|
private String remark;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -37,9 +37,9 @@ public class AppPersonnelInfo extends TenantEntity {
|
|||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 部门名称
|
* 职位
|
||||||
*/
|
*/
|
||||||
private String deptName;
|
private String position;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 单位名称
|
* 单位名称
|
||||||
@ -51,5 +51,6 @@ public class AppPersonnelInfo extends TenantEntity {
|
|||||||
*/
|
*/
|
||||||
private String sendMsg;
|
private String sendMsg;
|
||||||
|
|
||||||
|
private String code;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,49 @@
|
|||||||
|
package com.fuyuanshen.app.domain.bo;
|
||||||
|
|
||||||
|
import com.fuyuanshen.app.domain.AppDeviceShare;
|
||||||
|
import com.fuyuanshen.common.mybatis.core.domain.BaseEntity;
|
||||||
|
import io.github.linpeilie.annotations.AutoMapper;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import jakarta.validation.constraints.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备分享业务对象 app_device_share
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-07-16
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@AutoMapper(target = AppDeviceShare.class, reverseConvertGenerate = false)
|
||||||
|
public class AppDeviceShareBo extends BaseEntity {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键id
|
||||||
|
*/
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备ID
|
||||||
|
*/
|
||||||
|
private Long deviceId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 手机号
|
||||||
|
*/
|
||||||
|
private String phonenumber;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 功能权限(1:灯光模式;2:激光模式;3:开机画面;4:人员信息登记;5:发送信息;6:产品信息)
|
||||||
|
以逗号分隔
|
||||||
|
*/
|
||||||
|
private String permission;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备注
|
||||||
|
*/
|
||||||
|
private String remark;
|
||||||
|
|
||||||
|
|
||||||
|
private String smsCode;
|
||||||
|
}
|
@ -23,13 +23,11 @@ public class AppPersonnelInfoBo extends BaseEntity {
|
|||||||
/**
|
/**
|
||||||
* 主键
|
* 主键
|
||||||
*/
|
*/
|
||||||
@NotNull(message = "主键不能为空", groups = { AddGroup.class, EditGroup.class })
|
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设备id
|
* 设备id
|
||||||
*/
|
*/
|
||||||
@NotNull(message = "设备id不能为空", groups = { AddGroup.class, EditGroup.class })
|
|
||||||
private Long deviceId;
|
private Long deviceId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -37,6 +35,11 @@ public class AppPersonnelInfoBo extends BaseEntity {
|
|||||||
*/
|
*/
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 职位
|
||||||
|
*/
|
||||||
|
private String position;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 部门名称
|
* 部门名称
|
||||||
*/
|
*/
|
||||||
@ -52,5 +55,8 @@ public class AppPersonnelInfoBo extends BaseEntity {
|
|||||||
*/
|
*/
|
||||||
private String sendMsg;
|
private String sendMsg;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ID号
|
||||||
|
*/
|
||||||
|
private String code;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,77 @@
|
|||||||
|
package com.fuyuanshen.app.domain.vo;
|
||||||
|
|
||||||
|
import cn.idev.excel.annotation.ExcelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class AppDeviceDetailVo {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备ID
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "设备ID")
|
||||||
|
private Long deviceId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 手机号
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "手机号")
|
||||||
|
private String phonenumber;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备名称
|
||||||
|
*/
|
||||||
|
private String deviceName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备IMEI
|
||||||
|
*/
|
||||||
|
private String deviceImei;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备MAC
|
||||||
|
*/
|
||||||
|
private String deviceMac;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通讯方式 0:4G;1:蓝牙
|
||||||
|
*/
|
||||||
|
private Integer communicationMode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备图片
|
||||||
|
*/
|
||||||
|
private String devicePic;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备类型
|
||||||
|
*/
|
||||||
|
private String typeName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 蓝牙名称
|
||||||
|
*/
|
||||||
|
private String bluetoothName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备状态
|
||||||
|
* 0 失效
|
||||||
|
* 1 正常
|
||||||
|
*/
|
||||||
|
private Integer deviceStatus;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 人员信息
|
||||||
|
*/
|
||||||
|
private AppPersonnelInfoVo personnelInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送信息
|
||||||
|
*/
|
||||||
|
private String sendMsg;
|
||||||
|
}
|
@ -0,0 +1,107 @@
|
|||||||
|
package com.fuyuanshen.app.domain.vo;
|
||||||
|
|
||||||
|
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
|
||||||
|
import cn.idev.excel.annotation.ExcelProperty;
|
||||||
|
import com.fuyuanshen.app.domain.AppDeviceShare;
|
||||||
|
import com.fuyuanshen.common.excel.annotation.ExcelDictFormat;
|
||||||
|
import com.fuyuanshen.common.excel.convert.ExcelDictConvert;
|
||||||
|
import io.github.linpeilie.annotations.AutoMapper;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备分享视图对象 app_device_share
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-07-16
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ExcelIgnoreUnannotated
|
||||||
|
@AutoMapper(target = AppDeviceShare.class)
|
||||||
|
public class AppDeviceShareDetailVo implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键id
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "主键id")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备ID
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "设备ID")
|
||||||
|
private Long deviceId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 手机号
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "手机号")
|
||||||
|
private String phonenumber;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 功能权限(1:灯光模式;2:激光模式;3:开机画面;4:人员信息登记;5:发送信息;6:产品信息)
|
||||||
|
以逗号分隔
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "功能权限", converter = ExcelDictConvert.class)
|
||||||
|
@ExcelDictFormat(readConverterExp = "1=:灯光模式;2:激光模式;3:开机画面;4:人员信息登记;5:发送信息;6:产品信息")
|
||||||
|
private String permission;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备名称
|
||||||
|
*/
|
||||||
|
private String deviceName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备IMEI
|
||||||
|
*/
|
||||||
|
private String deviceImei;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备MAC
|
||||||
|
*/
|
||||||
|
private String deviceMac;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通讯方式 0:4G;1:蓝牙
|
||||||
|
*/
|
||||||
|
private Integer communicationMode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备图片
|
||||||
|
*/
|
||||||
|
private String devicePic;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备类型
|
||||||
|
*/
|
||||||
|
private String typeName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 蓝牙名称
|
||||||
|
*/
|
||||||
|
private String bluetoothName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备状态
|
||||||
|
* 0 失效
|
||||||
|
* 1 正常
|
||||||
|
*/
|
||||||
|
private Integer deviceStatus;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 人员信息
|
||||||
|
*/
|
||||||
|
private AppPersonnelInfoVo personnelInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送信息
|
||||||
|
*/
|
||||||
|
private String sendMsg;
|
||||||
|
}
|
@ -0,0 +1,76 @@
|
|||||||
|
package com.fuyuanshen.app.domain.vo;
|
||||||
|
|
||||||
|
import com.fuyuanshen.app.domain.AppDeviceShare;
|
||||||
|
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
|
||||||
|
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.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备分享视图对象 app_device_share
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-07-16
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ExcelIgnoreUnannotated
|
||||||
|
@AutoMapper(target = AppDeviceShare.class)
|
||||||
|
public class AppDeviceShareVo implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键id
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "主键id")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备ID
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "设备ID")
|
||||||
|
private Long deviceId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备IMEI
|
||||||
|
*/
|
||||||
|
private String deviceImei;
|
||||||
|
/**
|
||||||
|
* 设备名称
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "设备名称")
|
||||||
|
private String deviceName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 手机号
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "手机号")
|
||||||
|
private String phonenumber;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 功能权限(1:灯光模式;2:激光模式;3:开机画面;4:人员信息登记;5:发送信息;6:产品信息)
|
||||||
|
以逗号分隔
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "功能权限", converter = ExcelDictConvert.class)
|
||||||
|
@ExcelDictFormat(readConverterExp = "1=:灯光模式;2:激光模式;3:开机画面;4:人员信息登记;5:发送信息;6:产品信息")
|
||||||
|
private String permission;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备注
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "备注")
|
||||||
|
private String remark;
|
||||||
|
|
||||||
|
// 设备图片
|
||||||
|
private String devicePic;
|
||||||
|
}
|
@ -23,4 +23,8 @@ public class AppFileVo {
|
|||||||
* 文件url
|
* 文件url
|
||||||
*/
|
*/
|
||||||
private String fileUrl;
|
private String fileUrl;
|
||||||
|
/**
|
||||||
|
* 文件类型(1:操作说明,2:产品参数)
|
||||||
|
*/
|
||||||
|
private Long fileType;
|
||||||
}
|
}
|
||||||
|
@ -47,10 +47,10 @@ public class AppPersonnelInfoVo implements Serializable {
|
|||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 部门名称
|
* 岗位
|
||||||
*/
|
*/
|
||||||
@ExcelProperty(value = "部门名称")
|
@ExcelProperty(value = "岗位")
|
||||||
private String deptName;
|
private String position;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 单位名称
|
* 单位名称
|
||||||
@ -59,10 +59,10 @@ public class AppPersonnelInfoVo implements Serializable {
|
|||||||
private String unitName;
|
private String unitName;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 发送信息
|
* ID号
|
||||||
*/
|
*/
|
||||||
@ExcelProperty(value = "发送信息")
|
@ExcelProperty(value = "ID号")
|
||||||
private String sendMsg;
|
private String code;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
package com.fuyuanshen.app.domain.vo;
|
package com.fuyuanshen.app.domain.vo;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.FieldFill;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
import com.fuyuanshen.app.domain.AppUser;
|
import com.fuyuanshen.app.domain.AppUser;
|
||||||
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
|
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
|
||||||
@ -120,4 +123,10 @@ public class AppUserVo implements Serializable {
|
|||||||
* 部门ID
|
* 部门ID
|
||||||
*/
|
*/
|
||||||
private Long deptId;
|
private Long deptId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建时间
|
||||||
|
*/
|
||||||
|
private Date createTime;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,19 @@
|
|||||||
|
package com.fuyuanshen.app.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.fuyuanshen.app.domain.AppDeviceShare;
|
||||||
|
import com.fuyuanshen.app.domain.bo.AppDeviceShareBo;
|
||||||
|
import com.fuyuanshen.app.domain.vo.AppDeviceShareVo;
|
||||||
|
import com.fuyuanshen.common.mybatis.core.mapper.BaseMapperPlus;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备分享Mapper接口
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-07-16
|
||||||
|
*/
|
||||||
|
public interface AppDeviceShareMapper extends BaseMapperPlus<AppDeviceShare, AppDeviceShareVo> {
|
||||||
|
IPage<AppDeviceShareVo> otherDeviceShareList(@Param("bo") AppDeviceShareBo bo, Page<AppDeviceShareVo> page);
|
||||||
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
package com.fuyuanshen.app.service;
|
||||||
|
|
||||||
|
import com.fuyuanshen.app.domain.vo.AppDeviceShareVo;
|
||||||
|
import com.fuyuanshen.app.domain.bo.AppDeviceShareBo;
|
||||||
|
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
|
||||||
|
import com.fuyuanshen.common.mybatis.core.page.PageQuery;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备分享Service接口
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-07-16
|
||||||
|
*/
|
||||||
|
public interface IAppDeviceShareService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询设备分享
|
||||||
|
*
|
||||||
|
* @param id 主键
|
||||||
|
* @return 设备分享
|
||||||
|
*/
|
||||||
|
AppDeviceShareVo queryById(Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页查询设备分享列表
|
||||||
|
*
|
||||||
|
* @param bo 查询条件
|
||||||
|
* @param pageQuery 分页参数
|
||||||
|
* @return 设备分享分页列表
|
||||||
|
*/
|
||||||
|
TableDataInfo<AppDeviceShareVo> queryPageList(AppDeviceShareBo bo, PageQuery pageQuery);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询符合条件的设备分享列表
|
||||||
|
*
|
||||||
|
* @param bo 查询条件
|
||||||
|
* @return 设备分享列表
|
||||||
|
*/
|
||||||
|
List<AppDeviceShareVo> queryList(AppDeviceShareBo bo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增设备分享
|
||||||
|
*
|
||||||
|
* @param bo 设备分享
|
||||||
|
* @return 是否新增成功
|
||||||
|
*/
|
||||||
|
Boolean insertByBo(AppDeviceShareBo bo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改设备分享
|
||||||
|
*
|
||||||
|
* @param bo 设备分享
|
||||||
|
* @return 是否修改成功
|
||||||
|
*/
|
||||||
|
Boolean updateByBo(AppDeviceShareBo bo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验并批量删除设备分享信息
|
||||||
|
*
|
||||||
|
* @param ids 待删除的主键集合
|
||||||
|
* @param isValid 是否进行有效性校验
|
||||||
|
* @return 是否删除成功
|
||||||
|
*/
|
||||||
|
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||||
|
|
||||||
|
TableDataInfo<AppDeviceShareVo> otherDeviceShareList(AppDeviceShareBo bo, PageQuery pageQuery);
|
||||||
|
}
|
@ -4,6 +4,7 @@ import com.fuyuanshen.app.domain.vo.AppPersonnelInfoVo;
|
|||||||
import com.fuyuanshen.app.domain.bo.AppPersonnelInfoBo;
|
import com.fuyuanshen.app.domain.bo.AppPersonnelInfoBo;
|
||||||
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.dto.AppDeviceBo;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -65,4 +66,6 @@ public interface IAppPersonnelInfoService {
|
|||||||
* @return 是否删除成功
|
* @return 是否删除成功
|
||||||
*/
|
*/
|
||||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||||
|
|
||||||
|
boolean registerPersonInfo(AppPersonnelInfoBo bo);
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,9 @@ import com.fuyuanshen.app.domain.dto.APPReNameDTO;
|
|||||||
import com.fuyuanshen.app.domain.dto.APPUnbindDTO;
|
import com.fuyuanshen.app.domain.dto.APPUnbindDTO;
|
||||||
import com.fuyuanshen.app.domain.query.APPDeviceQueryCriteria;
|
import com.fuyuanshen.app.domain.query.APPDeviceQueryCriteria;
|
||||||
import com.fuyuanshen.app.domain.vo.APPDeviceTypeVo;
|
import com.fuyuanshen.app.domain.vo.APPDeviceTypeVo;
|
||||||
|
import com.fuyuanshen.app.domain.vo.AppDeviceDetailVo;
|
||||||
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
|
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
|
||||||
|
import com.fuyuanshen.equipment.domain.dto.AppDeviceBo;
|
||||||
import com.fuyuanshen.equipment.domain.query.DeviceQueryCriteria;
|
import com.fuyuanshen.equipment.domain.query.DeviceQueryCriteria;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -73,4 +75,5 @@ public interface APPDeviceService extends IService<APPDevice> {
|
|||||||
TableDataInfo<APPDevice> queryAppDeviceList(DeviceQueryCriteria criteria);
|
TableDataInfo<APPDevice> queryAppDeviceList(DeviceQueryCriteria criteria);
|
||||||
|
|
||||||
|
|
||||||
|
int sendMessage(AppDeviceBo bo);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,169 @@
|
|||||||
|
package com.fuyuanshen.app.service.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
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.PageQuery;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
|
import com.fuyuanshen.common.satoken.utils.AppLoginHelper;
|
||||||
|
import com.fuyuanshen.equipment.domain.Device;
|
||||||
|
import com.fuyuanshen.equipment.mapper.DeviceMapper;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import com.fuyuanshen.app.domain.bo.AppDeviceShareBo;
|
||||||
|
import com.fuyuanshen.app.domain.vo.AppDeviceShareVo;
|
||||||
|
import com.fuyuanshen.app.domain.AppDeviceShare;
|
||||||
|
import com.fuyuanshen.app.mapper.AppDeviceShareMapper;
|
||||||
|
import com.fuyuanshen.app.service.IAppDeviceShareService;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备分享Service业务层处理
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-07-16
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Service
|
||||||
|
public class AppDeviceShareServiceImpl implements IAppDeviceShareService {
|
||||||
|
|
||||||
|
private final AppDeviceShareMapper baseMapper;
|
||||||
|
|
||||||
|
private final DeviceMapper deviceMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询设备分享
|
||||||
|
*
|
||||||
|
* @param id 主键
|
||||||
|
* @return 设备分享
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public AppDeviceShareVo queryById(Long id){
|
||||||
|
return baseMapper.selectVoById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页查询设备分享列表
|
||||||
|
*
|
||||||
|
* @param bo 查询条件
|
||||||
|
* @param pageQuery 分页参数
|
||||||
|
* @return 设备分享分页列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public TableDataInfo<AppDeviceShareVo> queryPageList(AppDeviceShareBo bo, PageQuery pageQuery) {
|
||||||
|
Long userId = AppLoginHelper.getUserId();
|
||||||
|
bo.setCreateBy(userId);
|
||||||
|
LambdaQueryWrapper<AppDeviceShare> lqw = buildQueryWrapper(bo);
|
||||||
|
Page<AppDeviceShareVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||||
|
List<AppDeviceShareVo> records = result.getRecords();
|
||||||
|
records.forEach(r -> {
|
||||||
|
Device device = deviceMapper.selectById(r.getDeviceId());
|
||||||
|
if(device != null){
|
||||||
|
r.setDevicePic(device.getDevicePic());
|
||||||
|
r.setDeviceName(device.getDeviceName());
|
||||||
|
r.setDeviceImei(device.getDeviceImei());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return TableDataInfo.build(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询符合条件的设备分享列表
|
||||||
|
*
|
||||||
|
* @param bo 查询条件
|
||||||
|
* @return 设备分享列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<AppDeviceShareVo> queryList(AppDeviceShareBo bo) {
|
||||||
|
LambdaQueryWrapper<AppDeviceShare> lqw = buildQueryWrapper(bo);
|
||||||
|
return baseMapper.selectVoList(lqw);
|
||||||
|
}
|
||||||
|
|
||||||
|
private LambdaQueryWrapper<AppDeviceShare> buildQueryWrapper(AppDeviceShareBo bo) {
|
||||||
|
Map<String, Object> params = bo.getParams();
|
||||||
|
LambdaQueryWrapper<AppDeviceShare> lqw = Wrappers.lambdaQuery();
|
||||||
|
lqw.eq(bo.getDeviceId() != null, AppDeviceShare::getDeviceId, bo.getDeviceId());
|
||||||
|
lqw.eq(StringUtils.isNotBlank(bo.getPhonenumber()), AppDeviceShare::getPhonenumber, bo.getPhonenumber());
|
||||||
|
lqw.eq(StringUtils.isNotBlank(bo.getPermission()), AppDeviceShare::getPermission, bo.getPermission());
|
||||||
|
lqw.eq(bo.getCreateBy()!=null, AppDeviceShare::getCreateBy, bo.getCreateBy());
|
||||||
|
return lqw;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增设备分享
|
||||||
|
*
|
||||||
|
* @param bo 设备分享
|
||||||
|
* @return 是否新增成功
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Boolean insertByBo(AppDeviceShareBo bo) {
|
||||||
|
AppDeviceShare add = MapstructUtils.convert(bo, AppDeviceShare.class);
|
||||||
|
validEntityBeforeSave(add);
|
||||||
|
boolean flag = baseMapper.insert(add) > 0;
|
||||||
|
if (flag) {
|
||||||
|
bo.setId(add.getId());
|
||||||
|
}
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改设备分享
|
||||||
|
*
|
||||||
|
* @param bo 设备分享
|
||||||
|
* @return 是否修改成功
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Boolean updateByBo(AppDeviceShareBo bo) {
|
||||||
|
AppDeviceShare update = MapstructUtils.convert(bo, AppDeviceShare.class);
|
||||||
|
validEntityBeforeSave(update);
|
||||||
|
return baseMapper.updateById(update) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存前的数据校验
|
||||||
|
*/
|
||||||
|
private void validEntityBeforeSave(AppDeviceShare entity){
|
||||||
|
//TODO 做一些数据校验,如唯一约束
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验并批量删除设备分享信息
|
||||||
|
*
|
||||||
|
* @param ids 待删除的主键集合
|
||||||
|
* @param isValid 是否进行有效性校验
|
||||||
|
* @return 是否删除成功
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||||
|
if(isValid){
|
||||||
|
//TODO 做一些业务上的校验,判断是否需要校验
|
||||||
|
}
|
||||||
|
return baseMapper.deleteByIds(ids) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TableDataInfo<AppDeviceShareVo> otherDeviceShareList(AppDeviceShareBo bo, PageQuery pageQuery) {
|
||||||
|
String username = AppLoginHelper.getUsername();
|
||||||
|
bo.setPhonenumber(username);
|
||||||
|
Page<AppDeviceShareVo> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||||
|
IPage<AppDeviceShareVo> result = baseMapper.otherDeviceShareList(bo, page);
|
||||||
|
List<AppDeviceShareVo> records = result.getRecords();
|
||||||
|
records.forEach(r -> {
|
||||||
|
Device device = deviceMapper.selectById(r.getDeviceId());
|
||||||
|
if(device != null){
|
||||||
|
r.setDevicePic(device.getDevicePic());
|
||||||
|
r.setDeviceName(device.getDeviceName());
|
||||||
|
r.setDeviceImei(device.getDeviceImei());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return TableDataInfo.build(result);
|
||||||
|
}
|
||||||
|
}
|
@ -7,6 +7,7 @@ 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.common.satoken.utils.AppLoginHelper;
|
||||||
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;
|
||||||
@ -66,6 +67,8 @@ public class AppOperationVideoServiceImpl implements IAppOperationVideoService {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public List<AppOperationVideoVo> queryList(AppOperationVideoBo bo) {
|
public List<AppOperationVideoVo> queryList(AppOperationVideoBo bo) {
|
||||||
|
Long userId = AppLoginHelper.getUserId();
|
||||||
|
bo.setCreateBy(userId);
|
||||||
LambdaQueryWrapper<AppOperationVideo> lqw = buildQueryWrapper(bo);
|
LambdaQueryWrapper<AppOperationVideo> lqw = buildQueryWrapper(bo);
|
||||||
return baseMapper.selectVoList(lqw);
|
return baseMapper.selectVoList(lqw);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package com.fuyuanshen.app.service.impl;
|
package com.fuyuanshen.app.service.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
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;
|
||||||
@ -7,6 +8,8 @@ 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.Device;
|
||||||
|
import com.fuyuanshen.equipment.domain.dto.AppDeviceBo;
|
||||||
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;
|
||||||
@ -75,7 +78,6 @@ public class AppPersonnelInfoServiceImpl implements IAppPersonnelInfoService {
|
|||||||
LambdaQueryWrapper<AppPersonnelInfo> lqw = Wrappers.lambdaQuery();
|
LambdaQueryWrapper<AppPersonnelInfo> lqw = Wrappers.lambdaQuery();
|
||||||
lqw.eq(bo.getDeviceId() != null, AppPersonnelInfo::getDeviceId, bo.getDeviceId());
|
lqw.eq(bo.getDeviceId() != null, AppPersonnelInfo::getDeviceId, bo.getDeviceId());
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getName()), AppPersonnelInfo::getName, bo.getName());
|
lqw.like(StringUtils.isNotBlank(bo.getName()), AppPersonnelInfo::getName, bo.getName());
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getDeptName()), AppPersonnelInfo::getDeptName, bo.getDeptName());
|
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getUnitName()), AppPersonnelInfo::getUnitName, bo.getUnitName());
|
lqw.like(StringUtils.isNotBlank(bo.getUnitName()), AppPersonnelInfo::getUnitName, bo.getUnitName());
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getSendMsg()), AppPersonnelInfo::getSendMsg, bo.getSendMsg());
|
lqw.eq(StringUtils.isNotBlank(bo.getSendMsg()), AppPersonnelInfo::getSendMsg, bo.getSendMsg());
|
||||||
return lqw;
|
return lqw;
|
||||||
@ -132,4 +134,13 @@ public class AppPersonnelInfoServiceImpl implements IAppPersonnelInfoService {
|
|||||||
}
|
}
|
||||||
return baseMapper.deleteByIds(ids) > 0;
|
return baseMapper.deleteByIds(ids) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean registerPersonInfo(AppPersonnelInfoBo bo) {
|
||||||
|
|
||||||
|
AppPersonnelInfo appPersonnelInfo = MapstructUtils.convert(bo, AppPersonnelInfo.class);
|
||||||
|
|
||||||
|
return baseMapper.insertOrUpdate(appPersonnelInfo);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -172,6 +172,7 @@ public class AppUserServiceImpl implements IAppUserService {
|
|||||||
appUserVo.setNickName(user.getNickName());
|
appUserVo.setNickName(user.getNickName());
|
||||||
appUserVo.setGender(user.getSex());
|
appUserVo.setGender(user.getSex());
|
||||||
appUserVo.setPhone(user.getPhonenumber());
|
appUserVo.setPhone(user.getPhonenumber());
|
||||||
|
appUserVo.setRegion(user.getRegion());
|
||||||
if(user.getAvatar() != null){
|
if(user.getAvatar() != null){
|
||||||
SysOssVo oss = sysOssService.getById(user.getAvatar());
|
SysOssVo oss = sysOssService.getById(user.getAvatar());
|
||||||
if(oss != null){
|
if(oss != null){
|
||||||
@ -192,8 +193,11 @@ public class AppUserServiceImpl implements IAppUserService {
|
|||||||
AppUser updUser= new AppUser();
|
AppUser updUser= new AppUser();
|
||||||
updUser.setUserId(appUser.getUserId());
|
updUser.setUserId(appUser.getUserId());
|
||||||
updUser.setNickName(bo.getNickName());
|
updUser.setNickName(bo.getNickName());
|
||||||
|
if(bo.getFile() != null){
|
||||||
SysOssVo oss = sysOssService.upload(bo.getFile());
|
SysOssVo oss = sysOssService.upload(bo.getFile());
|
||||||
updUser.setAvatar(oss.getOssId());
|
updUser.setAvatar(oss.getOssId());
|
||||||
|
}
|
||||||
|
|
||||||
updUser.setRegion(bo.getRegion());
|
updUser.setRegion(bo.getRegion());
|
||||||
updUser.setSex(bo.getGender());
|
updUser.setSex(bo.getGender());
|
||||||
return baseMapper.update(updUser, new LambdaQueryWrapper<AppUser>().eq(AppUser::getUserId, appUser.getUserId()));
|
return baseMapper.update(updUser, new LambdaQueryWrapper<AppUser>().eq(AppUser::getUserId, appUser.getUserId()));
|
||||||
|
@ -23,8 +23,8 @@ import com.fuyuanshen.common.satoken.utils.AppLoginHelper;
|
|||||||
import com.fuyuanshen.common.satoken.utils.LoginHelper;
|
import com.fuyuanshen.common.satoken.utils.LoginHelper;
|
||||||
import com.fuyuanshen.equipment.domain.Device;
|
import com.fuyuanshen.equipment.domain.Device;
|
||||||
import com.fuyuanshen.equipment.domain.DeviceType;
|
import com.fuyuanshen.equipment.domain.DeviceType;
|
||||||
|
import com.fuyuanshen.equipment.domain.dto.AppDeviceBo;
|
||||||
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.enums.BindingStatusEnum;
|
import com.fuyuanshen.equipment.enums.BindingStatusEnum;
|
||||||
import com.fuyuanshen.equipment.enums.CommunicationModeEnum;
|
import com.fuyuanshen.equipment.enums.CommunicationModeEnum;
|
||||||
import com.fuyuanshen.equipment.mapper.DeviceMapper;
|
import com.fuyuanshen.equipment.mapper.DeviceMapper;
|
||||||
@ -227,5 +227,14 @@ public class APPDeviceServiceImpl extends ServiceImpl<APPDeviceMapper, APPDevice
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int sendMessage(AppDeviceBo bo) {
|
||||||
|
UpdateWrapper<Device> updateWrapper = new UpdateWrapper<>();
|
||||||
|
updateWrapper.eq("id", bo.getDeviceId())
|
||||||
|
.eq("binding_user_id", AppLoginHelper.getUserId())
|
||||||
|
.set("send_msg", bo.getSendMsg());
|
||||||
|
return deviceMapper.update(updateWrapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6,15 +6,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
|
|
||||||
<select id="queryAppFileList" resultType="com.fuyuanshen.app.domain.vo.AppFileVo">
|
<select id="queryAppFileList" resultType="com.fuyuanshen.app.domain.vo.AppFileVo">
|
||||||
select a.id,a.business_id,a.file_id,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,b.file_name,b.url fileUrl from app_business_file a left join sys_oss b on a.file_id = b.oss_id
|
||||||
where
|
where 1=1
|
||||||
|
<if test="createBy != null">
|
||||||
|
a.create_by = #{createBy}
|
||||||
|
</if>
|
||||||
<if test="businessId != null">
|
<if test="businessId != null">
|
||||||
and a.business_id = #{businessId}
|
and a.business_id = #{businessId}
|
||||||
</if>
|
</if>
|
||||||
<if test="fileId != null">
|
<if test="fileId != null">
|
||||||
and a.file_id = #{fileId}
|
and a.file_id = #{fileId}
|
||||||
</if>
|
</if>
|
||||||
|
<if test="fileType != null">
|
||||||
|
and a.file_type = #{fileType}
|
||||||
|
</if>
|
||||||
<if test="createBy != null">
|
<if test="createBy != null">
|
||||||
a.create_by = #{createBy}
|
and a.create_by = #{createBy}
|
||||||
</if>
|
</if>
|
||||||
order by a.create_time desc
|
order by a.create_time desc
|
||||||
</select>
|
</select>
|
||||||
|
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<!DOCTYPE mapper
|
||||||
|
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
<mapper namespace="com.fuyuanshen.app.mapper.AppDeviceShareMapper">
|
||||||
|
|
||||||
|
<select id="otherDeviceShareList" resultType="com.fuyuanshen.app.domain.vo.AppDeviceShareVo">
|
||||||
|
SELECT * FROM app_device_share a where a.phonenumber = #{bo.phonenumber}
|
||||||
|
</select>
|
||||||
|
</mapper>
|
@ -3,6 +3,7 @@ package com.fuyuanshen.customer.controller;
|
|||||||
import cn.hutool.core.collection.CollectionUtil;
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
import cn.hutool.crypto.digest.BCrypt;
|
import cn.hutool.crypto.digest.BCrypt;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.fuyuanshen.common.core.domain.R;
|
||||||
import com.fuyuanshen.common.core.domain.ResponseVO;
|
import com.fuyuanshen.common.core.domain.ResponseVO;
|
||||||
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;
|
||||||
@ -51,43 +52,43 @@ public class CustomerController {
|
|||||||
|
|
||||||
@GetMapping(value = "/allCustomer")
|
@GetMapping(value = "/allCustomer")
|
||||||
@Operation(summary = "查询所有客户")
|
@Operation(summary = "查询所有客户")
|
||||||
public ResponseVO<List<Customer>> queryAllCustomer(UserQueryCriteria criteria) {
|
public R<List<Customer>> queryAllCustomer(UserQueryCriteria criteria) {
|
||||||
List<Customer> customers = customerService.queryAllCustomers(criteria);
|
List<Customer> customers = customerService.queryAllCustomers(criteria);
|
||||||
return ResponseVO.success(customers);
|
return R.ok(customers);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// @Log("新增客户")
|
// @Log("新增客户")
|
||||||
@Operation(summary = "新增客户")
|
@Operation(summary = "新增客户")
|
||||||
@PostMapping(value = "/addCustomer")
|
@PostMapping(value = "/addCustomer")
|
||||||
public ResponseVO<Object> addCustomer(@Validated @RequestBody Customer customer) throws BadRequestException {
|
public R<Void> addCustomer(@Validated @RequestBody Customer customer) throws BadRequestException {
|
||||||
if (StringUtils.isBlank(customer.getPassword())) {
|
if (StringUtils.isBlank(customer.getPassword())) {
|
||||||
throw new BadRequestException("账号密码不能为空");
|
throw new BadRequestException("账号密码不能为空");
|
||||||
}
|
}
|
||||||
customer.setPassword(BCrypt.hashpw(customer.getPassword()));
|
customer.setPassword(BCrypt.hashpw(customer.getPassword()));
|
||||||
customerService.addCustomer(customer);
|
customerService.addCustomer(customer);
|
||||||
return ResponseVO.success("新增客户成功!!!");
|
return R.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// @Log("修改客户")
|
// @Log("修改客户")
|
||||||
@Operation(summary = "修改客户")
|
@Operation(summary = "修改客户")
|
||||||
@PutMapping(value = "updateCustomer")
|
@PutMapping(value = "updateCustomer")
|
||||||
public ResponseVO<Object> updateCustomer(@RequestBody Customer resources) throws Exception {
|
public R<Void> updateCustomer(@RequestBody Customer resources) throws Exception {
|
||||||
customerService.updateCustomer(resources);
|
customerService.updateCustomer(resources);
|
||||||
return ResponseVO.success(null);
|
return R.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// @Log("删除客户")
|
// @Log("删除客户")
|
||||||
@Operation(summary = "删除客户")
|
@Operation(summary = "删除客户")
|
||||||
@DeleteMapping(value = "/deleteCustomer")
|
@DeleteMapping(value = "/deleteCustomer")
|
||||||
public ResponseVO<Object> deleteCustomer(@RequestBody Set<Long> ids) throws BadRequestException {
|
public R<Void> deleteCustomer(@RequestBody Set<Long> ids) throws BadRequestException {
|
||||||
if (CollectionUtil.isEmpty(ids)) {
|
if (CollectionUtil.isEmpty(ids)) {
|
||||||
throw new BadRequestException("请选择要删除的客户");
|
throw new BadRequestException("请选择要删除的客户");
|
||||||
}
|
}
|
||||||
customerService.delete(ids);
|
customerService.delete(ids);
|
||||||
return ResponseVO.success(null);
|
return R.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -92,7 +92,7 @@ public class Customer extends TenantEntity {
|
|||||||
/**
|
/**
|
||||||
* 帐号状态(0正常 1停用)
|
* 帐号状态(0正常 1停用)
|
||||||
*/
|
*/
|
||||||
private String status;
|
private String status = "0";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除标志(0代表存在 1代表删除)
|
* 删除标志(0代表存在 1代表删除)
|
||||||
|
@ -50,6 +50,12 @@ public class UserQueryCriteria extends BaseEntity {
|
|||||||
@Schema(name = "是否启用")
|
@Schema(name = "是否启用")
|
||||||
private Boolean enabled;
|
private Boolean enabled;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 帐号状态(0正常 1停用)
|
||||||
|
*/
|
||||||
|
@Schema(name = "帐号状态(0正常 1停用)")
|
||||||
|
private String status;
|
||||||
|
|
||||||
@Schema(name = "部门ID")
|
@Schema(name = "部门ID")
|
||||||
private Long deptId;
|
private Long deptId;
|
||||||
|
|
||||||
|
@ -58,6 +58,12 @@ public class ConsumerVo extends TenantEntity {
|
|||||||
@Schema(name = "是否启用")
|
@Schema(name = "是否启用")
|
||||||
private Boolean enabled;
|
private Boolean enabled;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 帐号状态(0正常 1停用)
|
||||||
|
*/
|
||||||
|
@Schema(name = "帐号状态(0正常 1停用)")
|
||||||
|
private String status;
|
||||||
|
|
||||||
@Schema(name = "是否为admin账号", hidden = true)
|
@Schema(name = "是否为admin账号", hidden = true)
|
||||||
private Boolean isAdmin = false;
|
private Boolean isAdmin = false;
|
||||||
|
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
package com.fuyuanshen.customer.service.impl;
|
package com.fuyuanshen.customer.service.impl;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import com.fuyuanshen.common.core.domain.model.LoginUser;
|
import com.fuyuanshen.common.core.domain.model.LoginUser;
|
||||||
|
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.satoken.utils.LoginHelper;
|
import com.fuyuanshen.common.satoken.utils.LoginHelper;
|
||||||
import com.fuyuanshen.customer.constant.ArrayConstants;
|
import com.fuyuanshen.customer.constant.ArrayConstants;
|
||||||
@ -92,6 +94,7 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> i
|
|||||||
}
|
}
|
||||||
customer.setUserLevel((byte) (loginUser.getUserLevel() + 1));
|
customer.setUserLevel((byte) (loginUser.getUserLevel() + 1));
|
||||||
customer.setPid(loginUser.getUserId());
|
customer.setPid(loginUser.getUserId());
|
||||||
|
customer.setStatus("0");
|
||||||
|
|
||||||
save(customer);
|
save(customer);
|
||||||
|
|
||||||
@ -106,13 +109,40 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> i
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改客户
|
* 修改客户
|
||||||
|
* 不是因为寂寞才想你,只是因为想你才寂寞。
|
||||||
*
|
*
|
||||||
* @param resources /
|
* @param customer /
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void updateCustomer(Customer resources) throws Exception {
|
public void updateCustomer(Customer customer) throws Exception {
|
||||||
saveOrUpdate(resources);
|
|
||||||
|
UserQueryCriteria userQueryCriteria = new UserQueryCriteria();
|
||||||
|
if (StringUtils.isNotEmpty(customer.getUserName())) {
|
||||||
|
userQueryCriteria.setCustomerName(customer.getUserName());
|
||||||
|
List<Customer> customers = customerMapper.queryCustomers(userQueryCriteria);
|
||||||
|
if (!customers.isEmpty()) {
|
||||||
|
throw new BadRequestException("用户名已存在!!!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (customer.getEnabled()) {
|
||||||
|
customer.setStatus("0");
|
||||||
|
} else {
|
||||||
|
// 强制下线
|
||||||
|
// StpUtil.logout(customer.getCustomerId());
|
||||||
|
// StpUtil.kickout(customer.getCustomerId());
|
||||||
|
customer.setStatus("1");
|
||||||
|
// 检查目标用户是否有有效的登录状态
|
||||||
|
if (StpUtil.isLogin(customer.getCustomerId())) {
|
||||||
|
// 用户已登录,可以执行踢出操作
|
||||||
|
StpUtil.kickout(customer.getCustomerId());
|
||||||
|
} else {
|
||||||
|
// 用户未登录,无法踢出
|
||||||
|
System.out.println("目标用户未登录,无法执行踢出操作");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
saveOrUpdate(customer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -68,8 +68,8 @@
|
|||||||
<if test="criteria.id != null">
|
<if test="criteria.id != null">
|
||||||
and u1.user_id = #{criteria.id}
|
and u1.user_id = #{criteria.id}
|
||||||
</if>
|
</if>
|
||||||
<if test="criteria.enabled != null">
|
<if test="criteria.status != null">
|
||||||
and u1.enabled = #{criteria.enabled}
|
and u.status = #{criteria.status}
|
||||||
</if>
|
</if>
|
||||||
<if test="criteria.deptIds != null and criteria.deptIds.size() != 0">
|
<if test="criteria.deptIds != null and criteria.deptIds.size() != 0">
|
||||||
and u1.dept_id in
|
and u1.dept_id in
|
||||||
@ -94,7 +94,7 @@
|
|||||||
<!-- 分页查询客户 -->
|
<!-- 分页查询客户 -->
|
||||||
<select id="findCustomers" resultType="com.fuyuanshen.customer.domain.Customer">
|
<select id="findCustomers" resultType="com.fuyuanshen.customer.domain.Customer">
|
||||||
select
|
select
|
||||||
u.user_id as customerId, u.nick_name , u.user_name, u.enabled, u.create_time
|
u.user_id as customerId, u.nick_name , u.user_name, u.enabled, u.create_time,u.status
|
||||||
from sys_user u
|
from sys_user u
|
||||||
<where>
|
<where>
|
||||||
<if test="criteria.ids != null and !criteria.ids.isEmpty()">
|
<if test="criteria.ids != null and !criteria.ids.isEmpty()">
|
||||||
@ -109,8 +109,8 @@
|
|||||||
<if test="criteria.blurry != null and criteria.blurry.trim() != ''">
|
<if test="criteria.blurry != null and criteria.blurry.trim() != ''">
|
||||||
and u.nick_name like concat('%', TRIM(#{criteria.blurry}), '%')
|
and u.nick_name like concat('%', TRIM(#{criteria.blurry}), '%')
|
||||||
</if>
|
</if>
|
||||||
<if test="criteria.enabled != null">
|
<if test="criteria.status != null">
|
||||||
and u.enabled = #{criteria.enabled}
|
and u.status = #{criteria.status}
|
||||||
</if>
|
</if>
|
||||||
<if test="criteria.params.beginTime != null and criteria.params.endTime != null">
|
<if test="criteria.params.beginTime != null and criteria.params.endTime != null">
|
||||||
and u.create_time between #{criteria.params.beginTime} and #{criteria.params.endTime}
|
and u.create_time between #{criteria.params.beginTime} and #{criteria.params.endTime}
|
||||||
@ -139,8 +139,8 @@
|
|||||||
<if test="criteria.blurry != null and criteria.blurry.trim() != ''">
|
<if test="criteria.blurry != null and criteria.blurry.trim() != ''">
|
||||||
and u.nick_name like concat('%', TRIM(#{criteria.blurry}), '%')
|
and u.nick_name like concat('%', TRIM(#{criteria.blurry}), '%')
|
||||||
</if>
|
</if>
|
||||||
<if test="criteria.enabled != null">
|
<if test="criteria.status != null">
|
||||||
and u.enabled = #{criteria.enabled}
|
and u.status = #{criteria.status}
|
||||||
</if>
|
</if>
|
||||||
<if test="criteria.params.beginTime != null and criteria.params.endTime != null">
|
<if test="criteria.params.beginTime != null and criteria.params.endTime != null">
|
||||||
and u.create_time between #{criteria.params.beginTime} and #{criteria.params.endTime}
|
and u.create_time between #{criteria.params.beginTime} and #{criteria.params.endTime}
|
||||||
|
@ -103,6 +103,11 @@
|
|||||||
<artifactId>fys-common-websocket</artifactId>
|
<artifactId>fys-common-websocket</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bytedeco</groupId>
|
||||||
|
<artifactId>javacv-platform</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
@ -0,0 +1,244 @@
|
|||||||
|
package com.fuyuanshen.demo.controller;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.annotation.SaIgnore;
|
||||||
|
import com.fuyuanshen.common.core.domain.R;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.util.Base64;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import org.bytedeco.javacv.FFmpegFrameGrabber;
|
||||||
|
import org.bytedeco.javacv.Frame;
|
||||||
|
import org.bytedeco.javacv.Java2DFrameUtils;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/video")
|
||||||
|
public class VideoUploadController {
|
||||||
|
|
||||||
|
// 可配置项:建议从 application.yml 中读取
|
||||||
|
private static final int MAX_VIDEO_SIZE = 10 * 1024 * 1024; // 10 MB
|
||||||
|
private static final int FRAME_RATE = 15; // 每秒抽15帧
|
||||||
|
private static final int DURATION = 2; // 抽2秒
|
||||||
|
private static final int TOTAL_FRAMES = FRAME_RATE * DURATION;
|
||||||
|
private static final int WIDTH = 160;
|
||||||
|
private static final int HEIGHT = 80;
|
||||||
|
private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
|
||||||
|
|
||||||
|
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
||||||
|
@SaIgnore
|
||||||
|
public R<List<String>> upload(@RequestParam("file") MultipartFile file) {
|
||||||
|
if (file == null || file.isEmpty()) {
|
||||||
|
return R.fail("上传文件不能为空");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isVideo(file.getOriginalFilename())) {
|
||||||
|
return R.fail("只允许上传视频文件");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (file.getSize() > MAX_VIDEO_SIZE) {
|
||||||
|
return R.fail("视频大小不能超过10MB");
|
||||||
|
}
|
||||||
|
|
||||||
|
File tempFile = null;
|
||||||
|
try {
|
||||||
|
// 创建临时文件保存上传的视频
|
||||||
|
tempFile = createTempVideoFile(file);
|
||||||
|
|
||||||
|
|
||||||
|
List<BufferedImage> frames = extractFramesFromVideo(tempFile);
|
||||||
|
if (frames.isEmpty()) {
|
||||||
|
return R.fail("无法提取任何帧");
|
||||||
|
}
|
||||||
|
|
||||||
|
// ✅ 新增:保存帧为图片
|
||||||
|
//saveFramesToLocal(frames, "extracted_frame");
|
||||||
|
|
||||||
|
byte[] binaryData = convertFramesToRGB565(frames);
|
||||||
|
// String base64Data = Base64.getEncoder().encodeToString(binaryData);
|
||||||
|
//
|
||||||
|
// return R.ok(base64Data);
|
||||||
|
// 构造响应头
|
||||||
|
// 将二进制数据转为 Hex 字符串
|
||||||
|
// 转换为 Hex 字符串列表
|
||||||
|
List<String> hexList = bytesToHexList(binaryData);
|
||||||
|
|
||||||
|
return R.ok(hexList);
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
return R.fail("视频处理失败:" + e.getMessage());
|
||||||
|
} finally {
|
||||||
|
deleteTempFile(tempFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* rgb565 转 hex
|
||||||
|
*/
|
||||||
|
private List<String> bytesToHexList(byte[] bytes) {
|
||||||
|
List<String> hexList = new ArrayList<>();
|
||||||
|
for (byte b : bytes) {
|
||||||
|
int value = b & 0xFF;
|
||||||
|
char high = HEX_ARRAY[value >>> 4];
|
||||||
|
char low = HEX_ARRAY[value & 0x0F];
|
||||||
|
hexList.add(String.valueOf(high) + low);
|
||||||
|
}
|
||||||
|
return hexList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建临时文件并保存上传的视频
|
||||||
|
*/
|
||||||
|
private File createTempVideoFile(MultipartFile file) throws Exception {
|
||||||
|
File tempFile = Files.createTempFile("upload-", ".mp4").toFile();
|
||||||
|
file.transferTo(tempFile);
|
||||||
|
return tempFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从视频中按时间均匀提取指定数量的帧
|
||||||
|
*/
|
||||||
|
private List<BufferedImage> extractFramesFromVideo(File videoFile) throws Exception {
|
||||||
|
List<BufferedImage> frames = new ArrayList<>();
|
||||||
|
|
||||||
|
try (FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(videoFile)) {
|
||||||
|
grabber.start();
|
||||||
|
|
||||||
|
// 获取视频总帧数和帧率
|
||||||
|
long totalFramesInVideo = grabber.getLengthInFrames();
|
||||||
|
int fps = (int) Math.round(grabber.getFrameRate());
|
||||||
|
if (fps <= 0) fps = 30;
|
||||||
|
|
||||||
|
double durationSeconds = (double) totalFramesInVideo / fps;
|
||||||
|
|
||||||
|
if (durationSeconds < DURATION) {
|
||||||
|
throw new IllegalArgumentException("视频太短,至少需要 " + DURATION + " 秒");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算每帧之间的间隔(浮点以实现更精确跳转)
|
||||||
|
double frameInterval = (double) totalFramesInVideo / TOTAL_FRAMES;
|
||||||
|
|
||||||
|
for (int i = 0; i < TOTAL_FRAMES; i++) {
|
||||||
|
int targetFrameNumber = (int) Math.round(i * frameInterval);
|
||||||
|
|
||||||
|
// 避免设置无效帧号
|
||||||
|
if (targetFrameNumber >= totalFramesInVideo) {
|
||||||
|
throw new IllegalArgumentException("目标帧超出范围: " + targetFrameNumber + " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
grabber.setFrameNumber(targetFrameNumber);
|
||||||
|
Frame frame = grabber.grab();
|
||||||
|
|
||||||
|
if (frame != null && frame.image != null) {
|
||||||
|
BufferedImage bufferedImage = Java2DFrameUtils.toBufferedImage(frame);
|
||||||
|
frames.add(cropImage(bufferedImage, WIDTH, HEIGHT));
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("无法获取第 " + targetFrameNumber + "帧 ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grabber.stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
return frames;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将抽取的帧保存到本地,用于调试
|
||||||
|
*/
|
||||||
|
private void saveFramesToLocal(List<BufferedImage> frames, String prefix) {
|
||||||
|
// 指定输出目录
|
||||||
|
File outputDir = new File("output_frames");
|
||||||
|
if (!outputDir.exists()) {
|
||||||
|
outputDir.mkdirs();
|
||||||
|
}
|
||||||
|
|
||||||
|
int index = 0;
|
||||||
|
for (BufferedImage frame : frames) {
|
||||||
|
try {
|
||||||
|
File outputImage = new File(outputDir, prefix + "_" + (index++) + ".png");
|
||||||
|
ImageIO.write(frame, "png", outputImage);
|
||||||
|
System.out.println("保存帧图片成功: " + outputImage.getAbsolutePath());
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new IllegalArgumentException("保存帧图片失败 " + e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将所有帧转换为 RGB565 格式字节数组
|
||||||
|
*/
|
||||||
|
private byte[] convertFramesToRGB565(List<BufferedImage> frames) throws Exception {
|
||||||
|
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
||||||
|
|
||||||
|
for (BufferedImage image : frames) {
|
||||||
|
byte[] rgb565Bytes = convertToRGB565(image);
|
||||||
|
byteArrayOutputStream.write(rgb565Bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
return byteArrayOutputStream.toByteArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断是否是支持的视频格式
|
||||||
|
*/
|
||||||
|
private boolean isVideo(String filename) {
|
||||||
|
String ext = filename.substring(filename.lastIndexOf('.')).toLowerCase();
|
||||||
|
return Arrays.asList(".mp4", ".avi", ".mov", ".mkv").contains(ext);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 裁剪图像到目标尺寸
|
||||||
|
*/
|
||||||
|
private BufferedImage cropImage(BufferedImage img, int targetWidth, int targetHeight) {
|
||||||
|
int w = Math.min(img.getWidth(), targetWidth);
|
||||||
|
int h = Math.min(img.getHeight(), targetHeight);
|
||||||
|
return img.getSubimage(0, 0, w, h);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将 BufferedImage 转换为 RGB565 格式的字节数组
|
||||||
|
*/
|
||||||
|
private byte[] convertToRGB565(BufferedImage image) {
|
||||||
|
int width = image.getWidth();
|
||||||
|
int height = image.getHeight();
|
||||||
|
byte[] result = new byte[width * height * 2]; // RGB565: 2 bytes per pixel
|
||||||
|
int index = 0;
|
||||||
|
|
||||||
|
for (int y = 0; y < height; y++) {
|
||||||
|
for (int x = 0; x < width; x++) {
|
||||||
|
int rgb = image.getRGB(x, y);
|
||||||
|
int r = ((rgb >> 16) & 0xFF) >> 3;
|
||||||
|
int g = ((rgb >> 8) & 0xFF) >> 2;
|
||||||
|
int b = (rgb & 0xFF) >> 3;
|
||||||
|
short pixel = (short) ((r << 11) | (g << 5) | b);
|
||||||
|
|
||||||
|
result[index++] = (byte) (pixel >> 8); // High byte first
|
||||||
|
result[index++] = (byte) pixel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除临时文件
|
||||||
|
*/
|
||||||
|
private void deleteTempFile(File file) {
|
||||||
|
if (file != null && file.exists()) {
|
||||||
|
if (!file.delete()) {
|
||||||
|
throw new IllegalArgumentException("无法删除临时文件: " + file.getAbsolutePath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -6,17 +6,17 @@ import com.fuyuanshen.common.core.validate.EditGroup;
|
|||||||
import com.fuyuanshen.common.idempotent.annotation.RepeatSubmit;
|
import com.fuyuanshen.common.idempotent.annotation.RepeatSubmit;
|
||||||
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.log.enums.BusinessType;
|
||||||
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
|
|
||||||
import com.fuyuanshen.common.web.core.BaseController;
|
import com.fuyuanshen.common.web.core.BaseController;
|
||||||
import com.fuyuanshen.equipment.domain.bo.UserAppBo;
|
import com.fuyuanshen.equipment.domain.bo.UserAppBo;
|
||||||
import com.fuyuanshen.equipment.domain.query.DeviceQueryCriteria;
|
|
||||||
import com.fuyuanshen.equipment.service.AppUserService;
|
import com.fuyuanshen.equipment.service.AppUserService;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.PutMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Description:
|
* @Description:
|
||||||
|
@ -4,11 +4,13 @@ package com.fuyuanshen.equipment.controller;
|
|||||||
import com.alibaba.excel.EasyExcel;
|
import com.alibaba.excel.EasyExcel;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.fuyuanshen.common.core.constant.ResponseMessageConstants;
|
import com.fuyuanshen.common.core.constant.ResponseMessageConstants;
|
||||||
|
import com.fuyuanshen.common.core.domain.R;
|
||||||
import com.fuyuanshen.common.core.domain.ResponseVO;
|
import com.fuyuanshen.common.core.domain.ResponseVO;
|
||||||
import com.fuyuanshen.common.core.domain.model.LoginUser;
|
import com.fuyuanshen.common.core.domain.model.LoginUser;
|
||||||
import com.fuyuanshen.common.core.utils.file.FileUtil;
|
import com.fuyuanshen.common.core.utils.file.FileUtil;
|
||||||
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
|
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
|
||||||
import com.fuyuanshen.common.satoken.utils.LoginHelper;
|
import com.fuyuanshen.common.satoken.utils.LoginHelper;
|
||||||
|
import com.fuyuanshen.common.web.core.BaseController;
|
||||||
import com.fuyuanshen.customer.mapper.CustomerMapper;
|
import com.fuyuanshen.customer.mapper.CustomerMapper;
|
||||||
import com.fuyuanshen.equipment.domain.Device;
|
import com.fuyuanshen.equipment.domain.Device;
|
||||||
import com.fuyuanshen.equipment.domain.dto.DeviceExcelImportDTO;
|
import com.fuyuanshen.equipment.domain.dto.DeviceExcelImportDTO;
|
||||||
@ -49,7 +51,7 @@ import java.util.List;
|
|||||||
@RestController
|
@RestController
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@RequestMapping("/api/device")
|
@RequestMapping("/api/device")
|
||||||
public class DeviceController {
|
public class DeviceController extends BaseController {
|
||||||
|
|
||||||
private final ISysOssService ossService;
|
private final ISysOssService ossService;
|
||||||
private final DeviceService deviceService;
|
private final DeviceService deviceService;
|
||||||
@ -72,106 +74,106 @@ public class DeviceController {
|
|||||||
// @Log("新增设备")
|
// @Log("新增设备")
|
||||||
@Operation(summary = "新增设备")
|
@Operation(summary = "新增设备")
|
||||||
@PostMapping(value = "/add")
|
@PostMapping(value = "/add")
|
||||||
public ResponseVO<Object> addDevice(@Validated @ModelAttribute DeviceForm deviceForm) {
|
public R<Void> addDevice(@Validated @ModelAttribute DeviceForm deviceForm) {
|
||||||
try {
|
try {
|
||||||
deviceService.addDevice(deviceForm);
|
deviceService.addDevice(deviceForm);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("addDevice error: " + e.getMessage());
|
log.error("addDevice error: " + e.getMessage());
|
||||||
return ResponseVO.fail(e.getMessage());
|
return R.fail(e.getMessage());
|
||||||
}
|
}
|
||||||
return ResponseVO.success(null);
|
return R.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// @Log("修改设备")
|
// @Log("修改设备")
|
||||||
@Operation(summary = "修改设备")
|
@Operation(summary = "修改设备")
|
||||||
@PutMapping(value = "/update")
|
@PutMapping(value = "/update")
|
||||||
public ResponseVO<Object> updateDevice(@Validated @ModelAttribute DeviceForm deviceForm) {
|
public R<Void> updateDevice(@Validated @ModelAttribute DeviceForm deviceForm) {
|
||||||
try {
|
try {
|
||||||
deviceService.update(deviceForm);
|
deviceService.update(deviceForm);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
log.error("updateDevice error: " + e.getMessage());
|
log.error("updateDevice error: " + e.getMessage());
|
||||||
return ResponseVO.fail("出错了");
|
return R.fail(e.getMessage());
|
||||||
}
|
}
|
||||||
return ResponseVO.success(null);
|
return R.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Operation(summary = "设备详情")
|
@Operation(summary = "设备详情")
|
||||||
@GetMapping(value = "/detail/{id}")
|
@GetMapping(value = "/detail/{id}")
|
||||||
public ResponseVO<Object> getDevice(@PathVariable Long id) {
|
public R<Device> getDevice(@PathVariable Long id) {
|
||||||
Device device = deviceService.getById(id);
|
Device device = deviceService.getById(id);
|
||||||
return ResponseVO.success(device);
|
return R.ok(device);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// @Log("删除设备")
|
// @Log("删除设备")
|
||||||
@Operation(summary = "删除设备")
|
@Operation(summary = "删除设备")
|
||||||
@DeleteMapping(value = "/delete")
|
@DeleteMapping(value = "/delete")
|
||||||
public ResponseVO<Object> deleteDevice(@Parameter(name = "传ID数组[]") @RequestBody List<Long> ids) {
|
public R<Void> deleteDevice(@Parameter(name = "传ID数组[]") @RequestBody List<Long> ids) {
|
||||||
deviceService.deleteAll(ids);
|
deviceService.deleteAll(ids);
|
||||||
return ResponseVO.success(ResponseMessageConstants.DELETE_SUCCESS);
|
return R.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Operation(summary = "设备定位")
|
@Operation(summary = "设备定位")
|
||||||
@GetMapping(value = "/locateDevice")
|
@GetMapping(value = "/locateDevice")
|
||||||
public ResponseVO<Object> locateDevice(DeviceQueryCriteria criteria) throws IOException {
|
public R<List<Device>> locateDevice(DeviceQueryCriteria criteria) throws IOException {
|
||||||
List<Device> devices = deviceService.queryAllDevices(criteria);
|
List<Device> devices = deviceService.queryAllDevices(criteria);
|
||||||
return ResponseVO.success(devices);
|
return R.ok(devices);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// @Log("分配客户")
|
// @Log("分配客户")
|
||||||
@Operation(summary = "分配客户")
|
@Operation(summary = "分配客户")
|
||||||
@PutMapping(value = "/assignCustomer")
|
@PutMapping(value = "/assignCustomer")
|
||||||
public ResponseVO<Object> assignCustomer(@Validated @RequestBody CustomerVo customerVo) {
|
public R<Void> assignCustomer(@Validated @RequestBody CustomerVo customerVo) {
|
||||||
deviceService.assignCustomer(customerVo);
|
deviceService.assignCustomer(customerVo);
|
||||||
return ResponseVO.success(null);
|
return R.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// @Log("撤回设备")
|
// @Log("撤回设备")
|
||||||
@Operation(summary = "撤回分配设备")
|
@Operation(summary = "撤回分配设备")
|
||||||
@PostMapping(value = "/withdraw")
|
@PostMapping(value = "/withdraw")
|
||||||
public ResponseVO<Object> withdrawDevice(@RequestBody List<Long> ids) {
|
public R<Void> withdrawDevice(@RequestBody List<Long> ids) {
|
||||||
try {
|
try {
|
||||||
deviceService.withdrawDevice(ids);
|
deviceService.withdrawDevice(ids);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("updateDevice error: " + e.getMessage());
|
log.error("updateDevice error: " + e.getMessage());
|
||||||
return ResponseVO.fail("出错了");
|
return R.fail(e.getMessage());
|
||||||
}
|
}
|
||||||
return ResponseVO.success(null);
|
return R.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param deviceForm
|
* @param id
|
||||||
* @return
|
* @return
|
||||||
* @ModelAttribute 主要用于将请求参数绑定到 Java 对象上,它会从 HTTP 请求的查询参数(Query Parameters)
|
* @ModelAttribute 主要用于将请求参数绑定到 Java 对象上,它会从 HTTP 请求的查询参数(Query Parameters)
|
||||||
* 或表单数据(Form Data)中提取值,并自动填充到指定的对象属性中。
|
* 或表单数据(Form Data)中提取值,并自动填充到指定的对象属性中。
|
||||||
*/
|
*/
|
||||||
// @Log("解绑设备")
|
// @Log("解绑设备")
|
||||||
@Operation(summary = "解绑设备")
|
@Operation(summary = "WEB端解绑设备")
|
||||||
@PostMapping(value = "/unbind")
|
@GetMapping(value = "/unbind")
|
||||||
public ResponseVO<Object> unbindDevice(@Validated @ModelAttribute DeviceForm deviceForm) {
|
public R<Void> unbindDevice(@Validated Long id) {
|
||||||
deviceService.unbindDevice(deviceForm);
|
return toAjax(deviceService.webUnBindDevice(id));
|
||||||
return ResponseVO.success("解绑成功!!!");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Operation(summary = "导出数据设备")
|
@Operation(summary = "导出数据设备")
|
||||||
@GetMapping(value = "/download")
|
@GetMapping(value = "/download")
|
||||||
public void exportDevice(HttpServletResponse response, DeviceQueryCriteria criteria) throws IOException {
|
public R<Void> exportDevice(HttpServletResponse response, DeviceQueryCriteria criteria) throws IOException {
|
||||||
List<Device> devices = deviceService.queryAll(criteria);
|
List<Device> devices = deviceService.queryAll(criteria);
|
||||||
exportService.export(devices, response);
|
exportService.export(devices, response);
|
||||||
|
return R.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Operation(summary = "导入设备数据")
|
@Operation(summary = "导入设备数据")
|
||||||
@PostMapping(value = "/import", consumes = "multipart/form-data")
|
@PostMapping(value = "/import", consumes = "multipart/form-data")
|
||||||
public ResponseVO<ImportResult> importData(@Parameter(name = "文件", required = true) @RequestPart("file") MultipartFile file) throws BadRequestException {
|
public R<ImportResult> importData(@Parameter(name = "文件", required = true) @RequestPart("file") MultipartFile file) throws BadRequestException {
|
||||||
|
|
||||||
String suffix = FileUtil.getExtensionName(file.getOriginalFilename());
|
String suffix = FileUtil.getExtensionName(file.getOriginalFilename());
|
||||||
if (!("xlsx".equalsIgnoreCase(suffix))) {
|
if (!("xlsx".equalsIgnoreCase(suffix))) {
|
||||||
@ -195,13 +197,13 @@ public class DeviceController {
|
|||||||
// 设置响应消息
|
// 设置响应消息
|
||||||
String message = String.format("成功导入 %d 条数据,失败 %d 条", result.getSuccessCount(), result.getFailureCount());
|
String message = String.format("成功导入 %d 条数据,失败 %d 条", result.getSuccessCount(), result.getFailureCount());
|
||||||
// 返回带有正确泛型的响应
|
// 返回带有正确泛型的响应
|
||||||
return ResponseVO.<ImportResult>success(message, result);
|
return R.ok(message, result);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("导入设备数据出错: {}", e.getMessage(), e);
|
log.error("导入设备数据出错: {}", e.getMessage(), e);
|
||||||
// 在异常情况下,设置默认结果
|
// 在异常情况下,设置默认结果
|
||||||
String errorMessage = String.format("导入失败: %s。成功 %d 条,失败 %d 条", e.getMessage(), result.getSuccessCount(), result.getFailureCount());
|
String errorMessage = String.format("导入失败: %s。成功 %d 条,失败 %d 条", e.getMessage(), result.getSuccessCount(), result.getFailureCount());
|
||||||
// 使用新方法确保类型正确
|
// 使用新方法确保类型正确
|
||||||
return ResponseVO.<ImportResult>fail(errorMessage, result);
|
return R.fail(errorMessage, result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.fuyuanshen.equipment.controller;
|
package com.fuyuanshen.equipment.controller;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.fuyuanshen.common.core.domain.R;
|
||||||
import com.fuyuanshen.common.core.domain.ResponseVO;
|
import com.fuyuanshen.common.core.domain.ResponseVO;
|
||||||
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
|
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
|
||||||
import com.fuyuanshen.equipment.domain.DeviceType;
|
import com.fuyuanshen.equipment.domain.DeviceType;
|
||||||
@ -40,43 +41,45 @@ public class DeviceTypeController {
|
|||||||
|
|
||||||
@GetMapping(value = "/all")
|
@GetMapping(value = "/all")
|
||||||
@Operation(summary = "查询所有设备类型")
|
@Operation(summary = "查询所有设备类型")
|
||||||
public ResponseVO<Object> queryDeviceTypes() {
|
public R<List<DeviceType>> queryDeviceTypes() {
|
||||||
List<DeviceType> deviceTypes = deviceTypeService.queryDeviceTypes();
|
List<DeviceType> deviceTypes = deviceTypeService.queryDeviceTypes();
|
||||||
return ResponseVO.success(deviceTypes);
|
return R.ok(deviceTypes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// @Log("新增设备类型")
|
// @Log("新增设备类型")
|
||||||
@Operation(summary = "新增设备类型")
|
@Operation(summary = "新增设备类型")
|
||||||
@PostMapping(value = "/add")
|
@PostMapping(value = "/add")
|
||||||
public ResponseVO<Object> createDeviceType(@Validated @RequestBody DeviceType resources) {
|
public R<Void> createDeviceType(@Validated @RequestBody DeviceType resources) {
|
||||||
deviceTypeService.create(resources);
|
deviceTypeService.create(resources);
|
||||||
return ResponseVO.success(null);
|
return R.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// @Log("修改设备类型")
|
// @Log("修改设备类型")
|
||||||
@Operation(summary = "修改设备类型")
|
@Operation(summary = "修改设备类型")
|
||||||
@PutMapping(value = "/update")
|
@PutMapping(value = "/update")
|
||||||
public ResponseVO<Object> updateDeviceType(@Validated @RequestBody DeviceTypeForm resources) {
|
public R<Void> updateDeviceType(@Validated @RequestBody DeviceTypeForm resources) {
|
||||||
deviceTypeService.update(resources);
|
deviceTypeService.update(resources);
|
||||||
return ResponseVO.success(null);
|
return R.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// @Log("删除设备类型")
|
// @Log("删除设备类型")
|
||||||
@Operation(summary = "删除设备类型")
|
@Operation(summary = "删除设备类型")
|
||||||
@DeleteMapping(value = "/delete")
|
@DeleteMapping(value = "/delete")
|
||||||
public ResponseVO<Object> deleteDeviceType(@Parameter(name = "传ID数组[]") @RequestBody List<Long> ids) {
|
public R<Void> deleteDeviceType(@Parameter(name = "传ID数组[]") @RequestBody List<Long> ids) {
|
||||||
deviceTypeService.deleteAll(ids);
|
deviceTypeService.deleteAll(ids);
|
||||||
return ResponseVO.success("删除成功!!!");
|
return R.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@GetMapping(value = "/communicationMode")
|
@GetMapping(value = "/communicationMode")
|
||||||
@Operation(summary = "获取设备类型通讯方式")
|
@Operation(summary = "获取设备类型通讯方式")
|
||||||
public ResponseVO<DeviceType> getCommunicationMode(@Parameter(name = "设备类型ID", required = true) Long id) {
|
public R<DeviceType> getCommunicationMode(@Parameter(name = "设备类型ID", required = true) Long id) {
|
||||||
return ResponseVO.success(deviceTypeService.getCommunicationMode(id));
|
DeviceType communicationMode = deviceTypeService.getCommunicationMode(id);
|
||||||
|
return R.ok(communicationMode);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,8 @@ import com.fuyuanshen.common.tenant.core.TenantEntity;
|
|||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Description: 设备表
|
* @Description: 设备表
|
||||||
* @Author: WY
|
* @Author: WY
|
||||||
@ -19,6 +21,9 @@ import lombok.Data;
|
|||||||
@JsonInclude(JsonInclude.Include.ALWAYS) // 关键注解
|
@JsonInclude(JsonInclude.Include.ALWAYS) // 关键注解
|
||||||
public class Device extends TenantEntity {
|
public class Device extends TenantEntity {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* id
|
||||||
|
*/
|
||||||
@TableId(value = "id", type = IdType.AUTO)
|
@TableId(value = "id", type = IdType.AUTO)
|
||||||
@Schema(name = "ID")
|
@Schema(name = "ID")
|
||||||
private Long id;
|
private Long id;
|
||||||
@ -27,6 +32,9 @@ public class Device extends TenantEntity {
|
|||||||
@TableField(exist = false)
|
@TableField(exist = false)
|
||||||
private Long assignId;
|
private Long assignId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* device_type
|
||||||
|
*/
|
||||||
@Schema(name = "设备类型")
|
@Schema(name = "设备类型")
|
||||||
private Long deviceType;
|
private Long deviceType;
|
||||||
|
|
||||||
@ -97,9 +105,6 @@ public class Device extends TenantEntity {
|
|||||||
@Schema(name = "设备状态")
|
@Schema(name = "设备状态")
|
||||||
private Integer deviceStatus;
|
private Integer deviceStatus;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 绑定状态
|
* 绑定状态
|
||||||
* 0 未绑定
|
* 0 未绑定
|
||||||
@ -114,4 +119,24 @@ public class Device extends TenantEntity {
|
|||||||
private String createByName;
|
private String createByName;
|
||||||
|
|
||||||
private Long bindingUserId;
|
private Long bindingUserId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 绑定时间
|
||||||
|
*/
|
||||||
|
private Date bindingTime;
|
||||||
|
|
||||||
|
private String sendMsg;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发布主题(格式:A/{device_id})
|
||||||
|
* pub_topic
|
||||||
|
*/
|
||||||
|
private String pubTopic;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订阅主题(格式:B/{device_id})
|
||||||
|
* sub_topic
|
||||||
|
*/
|
||||||
|
private String subTopic;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@ public class DeviceAssignments extends TenantEntity {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 设备id
|
* 设备id
|
||||||
|
* device_id
|
||||||
*/
|
*/
|
||||||
private Long deviceId;
|
private Long deviceId;
|
||||||
|
|
||||||
@ -34,7 +35,7 @@ public class DeviceAssignments extends TenantEntity {
|
|||||||
private Long fromCustomerId;
|
private Long fromCustomerId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 接收方
|
* 接收方(当前设备所处位置)
|
||||||
*/
|
*/
|
||||||
private Long toCustomerId;
|
private Long toCustomerId;
|
||||||
|
|
||||||
|
@ -28,4 +28,7 @@ public class AppDeviceBo {
|
|||||||
@NotNull(message = "通讯方式不能为空", groups = { EditGroup.class })
|
@NotNull(message = "通讯方式不能为空", groups = { EditGroup.class })
|
||||||
private Integer communicationMode;
|
private Integer communicationMode;
|
||||||
|
|
||||||
|
private String sendMsg;
|
||||||
|
|
||||||
|
private Long deviceId;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,16 @@
|
|||||||
|
package com.fuyuanshen.equipment.domain.dto;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 绑定设备参数
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class AppDeviceSendMsgBo {
|
||||||
|
|
||||||
|
private String sendMsg;
|
||||||
|
|
||||||
|
private List<Long> deviceIds;
|
||||||
|
}
|
@ -58,7 +58,9 @@ public class DeviceExcelImportDTO {
|
|||||||
private String remark;
|
private String remark;
|
||||||
|
|
||||||
@ExcelProperty("设备类型名称")
|
@ExcelProperty("设备类型名称")
|
||||||
@ColumnWidth(20)
|
|
||||||
private String typeName;
|
private String typeName;
|
||||||
|
|
||||||
|
@ExcelProperty("蓝牙名称")
|
||||||
|
private String bluetoothName;
|
||||||
|
|
||||||
}
|
}
|
@ -1,10 +1,12 @@
|
|||||||
package com.fuyuanshen.equipment.domain.vo;
|
package com.fuyuanshen.equipment.domain.vo;
|
||||||
|
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class AppDeviceVo {
|
public class AppDeviceVo implements Serializable {
|
||||||
|
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
@ -49,4 +51,10 @@ public class AppDeviceVo {
|
|||||||
* 1 正常
|
* 1 正常
|
||||||
*/
|
*/
|
||||||
private Integer deviceStatus;
|
private Integer deviceStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 绑定时间
|
||||||
|
*/
|
||||||
|
private Date bindingTime;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -85,6 +85,14 @@ public interface DeviceService extends IService<Device> {
|
|||||||
*/
|
*/
|
||||||
void unbindDevice(DeviceForm deviceForm);
|
void unbindDevice(DeviceForm deviceForm);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* WEB端查看APP客户设备绑定
|
||||||
|
*
|
||||||
|
* @param bo
|
||||||
|
* @param pageQuery
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
TableDataInfo<AppDeviceVo> queryAppDeviceList(DeviceQueryCriteria bo, PageQuery pageQuery);
|
TableDataInfo<AppDeviceVo> queryAppDeviceList(DeviceQueryCriteria bo, PageQuery pageQuery);
|
||||||
|
|
||||||
int bindDevice(AppDeviceBo bo);
|
int bindDevice(AppDeviceBo bo);
|
||||||
@ -98,4 +106,12 @@ public interface DeviceService extends IService<Device> {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
Boolean queryDevice(String mac);
|
Boolean queryDevice(String mac);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* WEB端解绑设备
|
||||||
|
*
|
||||||
|
* @param id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
int webUnBindDevice(Long id);
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
|
|||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import com.fuyuanshen.common.core.domain.model.LoginUser;
|
import com.fuyuanshen.common.core.domain.model.LoginUser;
|
||||||
|
import com.fuyuanshen.common.core.exception.BadRequestException;
|
||||||
|
import com.fuyuanshen.common.core.utils.StringUtils;
|
||||||
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.satoken.utils.AppLoginHelper;
|
import com.fuyuanshen.common.satoken.utils.AppLoginHelper;
|
||||||
@ -54,6 +56,7 @@ import java.time.LocalDateTime;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Description:
|
* @Description:
|
||||||
@ -97,6 +100,12 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
|
|||||||
public TableDataInfo<Device> queryAll(DeviceQueryCriteria criteria, Page<Device> page) throws IOException {
|
public TableDataInfo<Device> queryAll(DeviceQueryCriteria criteria, Page<Device> page) throws IOException {
|
||||||
|
|
||||||
criteria.setCurrentOwnerId(LoginHelper.getUserId());
|
criteria.setCurrentOwnerId(LoginHelper.getUserId());
|
||||||
|
if (criteria.getDeviceType() != null) {
|
||||||
|
DeviceTypeGrants deviceTypeGrant = deviceTypeGrantsMapper.selectById(criteria.getDeviceType());
|
||||||
|
if (deviceTypeGrant != null) {
|
||||||
|
criteria.setDeviceType(deviceTypeGrant.getDeviceTypeId());
|
||||||
|
}
|
||||||
|
}
|
||||||
IPage<Device> devices = deviceMapper.findAll(criteria, page);
|
IPage<Device> devices = deviceMapper.findAll(criteria, page);
|
||||||
|
|
||||||
List<Device> records = devices.getRecords();
|
List<Device> records = devices.getRecords();
|
||||||
@ -138,6 +147,16 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
|
|||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void addDevice(DeviceForm deviceForm) throws Exception {
|
public void addDevice(DeviceForm deviceForm) throws Exception {
|
||||||
|
|
||||||
|
Device device1 = deviceMapper.selectOne(new QueryWrapper<Device>().eq("device_mac", deviceForm.getDeviceMac()));
|
||||||
|
if (device1 != null) {
|
||||||
|
throw new BadRequestException("设备MAC已存在!!!");
|
||||||
|
}
|
||||||
|
Device device2 = deviceMapper.selectOne(new QueryWrapper<Device>().eq("device_imei", deviceForm.getDeviceImei()));
|
||||||
|
if (device2 != null) {
|
||||||
|
throw new BadRequestException("设备IMEI已存在!!!");
|
||||||
|
}
|
||||||
|
|
||||||
DeviceTypeQueryCriteria queryCriteria = new DeviceTypeQueryCriteria();
|
DeviceTypeQueryCriteria queryCriteria = new DeviceTypeQueryCriteria();
|
||||||
queryCriteria.setDeviceTypeId(deviceForm.getDeviceType());
|
queryCriteria.setDeviceTypeId(deviceForm.getDeviceType());
|
||||||
queryCriteria.setCustomerId(LoginHelper.getUserId());
|
queryCriteria.setCustomerId(LoginHelper.getUserId());
|
||||||
@ -167,7 +186,12 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
|
|||||||
device.setCreateByName(loginUser.getNickname());
|
device.setCreateByName(loginUser.getNickname());
|
||||||
device.setTypeName(deviceTypes.getTypeName());
|
device.setTypeName(deviceTypes.getTypeName());
|
||||||
device.setDeviceType(deviceTypes.getId());
|
device.setDeviceType(deviceTypes.getId());
|
||||||
|
if (device.getDeviceImei() != null) {
|
||||||
|
device.setPubTopic("A/" + device.getDeviceImei());
|
||||||
|
device.setSubTopic("B/" + device.getDeviceImei());
|
||||||
|
}
|
||||||
|
// 0 未绑定
|
||||||
|
device.setBindingStatus(0);
|
||||||
deviceMapper.insert(device);
|
deviceMapper.insert(device);
|
||||||
|
|
||||||
// 新增设备类型记录
|
// 新增设备类型记录
|
||||||
@ -272,20 +296,32 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
|
|||||||
public void deleteAll(List<Long> ids) {
|
public void deleteAll(List<Long> ids) {
|
||||||
List<Long> invalidIds = new ArrayList<>();
|
List<Long> invalidIds = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Long id : ids) {
|
||||||
|
DeviceAssignments deviceAssignment = deviceAssignmentsMapper.selectById(id);
|
||||||
|
Device device = deviceMapper.selectById(deviceAssignment.getDeviceId());
|
||||||
|
|
||||||
|
if (StringUtils.isNotEmpty(deviceAssignment.getAssigneeName())) {
|
||||||
|
throw new BadRequestException(device.getDeviceName() + ":设备已分配,请先解绑设备!!!");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (device.getBindingStatus() != null && device.getBindingStatus().equals(1)) {
|
||||||
|
throw new BadRequestException(device.getDeviceName() + ":设备已绑定,请先解绑设备!!!");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 接收者
|
||||||
|
if (Objects.equals(deviceAssignment.getAssigneeId(), device.getOriginalOwnerId())) {
|
||||||
|
invalidIds.add(deviceAssignment.getDeviceId());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除设备:分配记录
|
||||||
|
deviceAssignmentsMapper.delete(new LambdaQueryWrapper<DeviceAssignments>()
|
||||||
|
.eq(DeviceAssignments::getDeviceId, deviceAssignment.getDeviceId())
|
||||||
|
.eq(DeviceAssignments::getAssigneeId, deviceAssignment.getAssigneeId()));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
deviceAssignmentsMapper.deleteByIds(ids);
|
deviceAssignmentsMapper.deleteByIds(ids);
|
||||||
//
|
deviceMapper.deleteByIds(invalidIds);
|
||||||
// for (Long id : ids) {
|
|
||||||
//
|
|
||||||
// Device deviceType = deviceMapper.selectById(id);
|
|
||||||
// if (deviceType == null || !Objects.equals(deviceType.getCurrentOwnerId(), LoginHelper.getUserId())) {
|
|
||||||
// invalidIds.add(id);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// if (!invalidIds.isEmpty()) {
|
|
||||||
// throw new RuntimeException("以下设备无法删除(ID 不存在或无权限): " + invalidIds);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// deviceMapper.deleteByIds(ids);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -313,9 +349,9 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
|
|||||||
List<DeviceTypeGrants> deviceTypeGrants = new ArrayList<>();
|
List<DeviceTypeGrants> deviceTypeGrants = new ArrayList<>();
|
||||||
for (DeviceAssignments assignment : assignments) {
|
for (DeviceAssignments assignment : assignments) {
|
||||||
|
|
||||||
if (assignment.getToCustomerId() != null) {
|
if (assignment.getToCustomerId() != null && assignment.getToCustomerId() != 0L) {
|
||||||
log.info("设备已经分配客户!!!");
|
log.info("设备已经分配客户!!!");
|
||||||
continue;
|
throw new RuntimeException("设备已经分配客户!!!");
|
||||||
}
|
}
|
||||||
|
|
||||||
Device device = deviceMapper.selectById(assignment.getDeviceId());
|
Device device = deviceMapper.selectById(assignment.getDeviceId());
|
||||||
@ -406,54 +442,6 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 撤回设备
|
|
||||||
*
|
|
||||||
* @param ids
|
|
||||||
*/
|
|
||||||
// @Override
|
|
||||||
// public void withdrawDevice(List<Long> ids) {
|
|
||||||
// ids.forEach((id) -> {
|
|
||||||
// List<Device> deviceChain = getDeviceChain(id);
|
|
||||||
// deviceChain.forEach((device) -> {
|
|
||||||
// device.setDeviceStatus(DeviceStatusEnum.INVALID.getCode());
|
|
||||||
// deviceMapper.updateById(device);
|
|
||||||
// });
|
|
||||||
// });
|
|
||||||
//
|
|
||||||
// ids.forEach((id) -> {
|
|
||||||
// Device device = new Device();
|
|
||||||
// device.setId(id);
|
|
||||||
// device.setCustomerId(null);
|
|
||||||
// device.setCustomerName("");
|
|
||||||
// deviceMapper.updateById(device);
|
|
||||||
// });
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// public List<Device> getDeviceChain(Long originalDeviceId) {
|
|
||||||
// List<Device> chain = new ArrayList<>();
|
|
||||||
// Set<Long> visited = new HashSet<>(); // 防止循环引用
|
|
||||||
// findNext(chain, visited, originalDeviceId);
|
|
||||||
// return chain;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// private void findNext(List<Device> chain, Set<Long> visited, Long currentOriginalDeviceId) {
|
|
||||||
// if (visited.contains(currentOriginalDeviceId)) {
|
|
||||||
// log.info("检测到循环引用,终止递归");
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// visited.add(currentOriginalDeviceId);
|
|
||||||
//
|
|
||||||
// List<Device> devices = deviceMapper.findByOriginalDeviceId(currentOriginalDeviceId);
|
|
||||||
// for (Device device : devices) {
|
|
||||||
// chain.add(device);
|
|
||||||
// findNext(chain, visited, device.getId());
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 撤回设备
|
* 撤回设备
|
||||||
*
|
*
|
||||||
@ -468,7 +456,7 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
|
|||||||
Device device = deviceMapper.selectById(assignment.getDeviceId());
|
Device device = deviceMapper.selectById(assignment.getDeviceId());
|
||||||
// 接收者
|
// 接收者
|
||||||
assignment.setAssigneeName("");
|
assignment.setAssigneeName("");
|
||||||
assignment.setToCustomerId(null);
|
assignment.setToCustomerId(0L);
|
||||||
deviceAssignmentsMapper.updateById(assignment);
|
deviceAssignmentsMapper.updateById(assignment);
|
||||||
|
|
||||||
// 获取所有已分配的设备
|
// 获取所有已分配的设备
|
||||||
@ -496,7 +484,13 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* WEB端查看APP客户设备绑定
|
||||||
|
*
|
||||||
|
* @param bo
|
||||||
|
* @param pageQuery
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public TableDataInfo<AppDeviceVo> queryAppDeviceList(DeviceQueryCriteria bo, PageQuery pageQuery) {
|
public TableDataInfo<AppDeviceVo> queryAppDeviceList(DeviceQueryCriteria bo, PageQuery pageQuery) {
|
||||||
if (bo.getBindingUserId() == null) {
|
if (bo.getBindingUserId() == null) {
|
||||||
@ -527,8 +521,9 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
|
|||||||
UpdateWrapper<Device> deviceUpdateWrapper = new UpdateWrapper<>();
|
UpdateWrapper<Device> deviceUpdateWrapper = new UpdateWrapper<>();
|
||||||
deviceUpdateWrapper.eq("id", device.getId())
|
deviceUpdateWrapper.eq("id", device.getId())
|
||||||
.set("binding_status", BindingStatusEnum.BOUND.getCode())
|
.set("binding_status", BindingStatusEnum.BOUND.getCode())
|
||||||
.set("binding_user_id", userId);
|
.set("binding_user_id", userId)
|
||||||
;
|
.set("binding_time", new Date());
|
||||||
|
|
||||||
|
|
||||||
return baseMapper.update(null, deviceUpdateWrapper);
|
return baseMapper.update(null, deviceUpdateWrapper);
|
||||||
} else if (mode == CommunicationModeEnum.BLUETOOTH.getValue()) {
|
} else if (mode == CommunicationModeEnum.BLUETOOTH.getValue()) {
|
||||||
@ -546,7 +541,8 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
|
|||||||
UpdateWrapper<Device> deviceUpdateWrapper = new UpdateWrapper<>();
|
UpdateWrapper<Device> deviceUpdateWrapper = new UpdateWrapper<>();
|
||||||
deviceUpdateWrapper.eq("id", device.getId())
|
deviceUpdateWrapper.eq("id", device.getId())
|
||||||
.set("binding_status", BindingStatusEnum.BOUND.getCode())
|
.set("binding_status", BindingStatusEnum.BOUND.getCode())
|
||||||
.set("binding_user_id", userId);
|
.set("binding_user_id", userId)
|
||||||
|
.set("binding_time", new Date());
|
||||||
return baseMapper.update(null, deviceUpdateWrapper);
|
return baseMapper.update(null, deviceUpdateWrapper);
|
||||||
} else {
|
} else {
|
||||||
throw new RuntimeException("通讯方式错误");
|
throw new RuntimeException("通讯方式错误");
|
||||||
@ -565,11 +561,27 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
|
|||||||
UpdateWrapper<Device> deviceUpdateWrapper = new UpdateWrapper<>();
|
UpdateWrapper<Device> deviceUpdateWrapper = new UpdateWrapper<>();
|
||||||
deviceUpdateWrapper.eq("id", device.getId())
|
deviceUpdateWrapper.eq("id", device.getId())
|
||||||
.set("binding_status", BindingStatusEnum.UNBOUND.getCode())
|
.set("binding_status", BindingStatusEnum.UNBOUND.getCode())
|
||||||
.set("binding_user_id", null);
|
.set("binding_user_id", null)
|
||||||
|
.set("binding_time", null);
|
||||||
return baseMapper.update(null, deviceUpdateWrapper);
|
return baseMapper.update(null, deviceUpdateWrapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* WEB端解绑设备
|
||||||
|
*
|
||||||
|
* @param id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int webUnBindDevice(Long id) {
|
||||||
|
DeviceAssignments deviceAssignment = deviceAssignmentsMapper.selectById(id);
|
||||||
|
if (deviceAssignment == null) {
|
||||||
|
throw new RuntimeException("请先将设备入库!!!");
|
||||||
|
}
|
||||||
|
return unBindDevice(deviceAssignment.getDeviceId());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询设备MAC号
|
* 查询设备MAC号
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package com.fuyuanshen.equipment.service.impl;
|
package com.fuyuanshen.equipment.service.impl;
|
||||||
|
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
@ -10,11 +12,13 @@ import com.fuyuanshen.common.core.utils.PageUtil;
|
|||||||
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
|
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
|
||||||
import com.fuyuanshen.common.satoken.utils.LoginHelper;
|
import com.fuyuanshen.common.satoken.utils.LoginHelper;
|
||||||
import com.fuyuanshen.equipment.domain.Device;
|
import com.fuyuanshen.equipment.domain.Device;
|
||||||
|
import com.fuyuanshen.equipment.domain.DeviceAssignments;
|
||||||
import com.fuyuanshen.equipment.domain.DeviceType;
|
import com.fuyuanshen.equipment.domain.DeviceType;
|
||||||
import com.fuyuanshen.equipment.domain.DeviceTypeGrants;
|
import com.fuyuanshen.equipment.domain.DeviceTypeGrants;
|
||||||
import com.fuyuanshen.equipment.domain.form.DeviceTypeForm;
|
import com.fuyuanshen.equipment.domain.form.DeviceTypeForm;
|
||||||
import com.fuyuanshen.equipment.domain.query.DeviceQueryCriteria;
|
import com.fuyuanshen.equipment.domain.query.DeviceQueryCriteria;
|
||||||
import com.fuyuanshen.equipment.domain.query.DeviceTypeQueryCriteria;
|
import com.fuyuanshen.equipment.domain.query.DeviceTypeQueryCriteria;
|
||||||
|
import com.fuyuanshen.equipment.mapper.DeviceAssignmentsMapper;
|
||||||
import com.fuyuanshen.equipment.mapper.DeviceMapper;
|
import com.fuyuanshen.equipment.mapper.DeviceMapper;
|
||||||
import com.fuyuanshen.equipment.mapper.DeviceTypeGrantsMapper;
|
import com.fuyuanshen.equipment.mapper.DeviceTypeGrantsMapper;
|
||||||
import com.fuyuanshen.equipment.mapper.DeviceTypeMapper;
|
import com.fuyuanshen.equipment.mapper.DeviceTypeMapper;
|
||||||
@ -41,6 +45,7 @@ public class DeviceTypeServiceImpl extends ServiceImpl<DeviceTypeMapper, DeviceT
|
|||||||
private final DeviceMapper deviceMapper;
|
private final DeviceMapper deviceMapper;
|
||||||
|
|
||||||
private final DeviceTypeGrantsMapper deviceTypeGrantsMapper;
|
private final DeviceTypeGrantsMapper deviceTypeGrantsMapper;
|
||||||
|
private final DeviceAssignmentsMapper deviceAssignmentsMapper;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -155,30 +160,33 @@ public class DeviceTypeServiceImpl extends ServiceImpl<DeviceTypeMapper, DeviceT
|
|||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void deleteAll(List<Long> ids) {
|
public void deleteAll(List<Long> ids) {
|
||||||
|
|
||||||
|
List<Long> deviceTypeId = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Long id : ids) {
|
||||||
|
DeviceTypeGrants deviceTypeGrant = deviceTypeGrantsMapper.selectById(id);
|
||||||
|
|
||||||
|
// List<DeviceTypeGrants> deviceTypeGrants = deviceTypeGrantsMapper.selectList(new QueryWrapper<DeviceTypeGrants>()
|
||||||
|
// .eq("device_type_id", deviceTypeGrant.getDeviceTypeId()));
|
||||||
|
|
||||||
|
// List<DeviceTypeGrants> deviceAssignments = deviceTypeGrantsMapper.selectList(new QueryWrapper<DeviceTypeGrants>()
|
||||||
|
// .eq("device_id", deviceTypeGrant.getDeviceTypeId()));
|
||||||
|
|
||||||
|
// if (CollectionUtil.isNotEmpty(deviceAssignments)) {
|
||||||
|
// throw new RuntimeException("该设备类型已绑定设备,无法删除");
|
||||||
|
// }
|
||||||
|
// Device device = deviceMapper.selectById(deviceTypeGrant.getDeviceTypeId());
|
||||||
|
|
||||||
|
List<Device> devices = deviceMapper.selectList(new QueryWrapper<Device>()
|
||||||
|
.eq("device_type", deviceTypeGrant.getDeviceTypeId()));
|
||||||
|
if (CollectionUtil.isNotEmpty(devices)) {
|
||||||
|
throw new RuntimeException("该设备类型已绑定设备,无法删除!!!");
|
||||||
|
}
|
||||||
|
deviceTypeId.add(deviceTypeGrant.getDeviceTypeId());
|
||||||
|
}
|
||||||
|
|
||||||
deviceTypeGrantsMapper.deleteByIds(ids);
|
deviceTypeGrantsMapper.deleteByIds(ids);
|
||||||
//
|
deviceTypeMapper.deleteByIds(deviceTypeId);
|
||||||
// List<Long> invalidIds = new ArrayList<>();
|
|
||||||
// List<Long> invalidId2 = new ArrayList<>();
|
|
||||||
// for (Long id : ids) {
|
|
||||||
// DeviceType deviceType = deviceTypeMapper.selectById(id);
|
|
||||||
// if (deviceType == null || !Objects.equals(deviceType.getOwnerCustomerId(), LoginHelper.getUserId())) {
|
|
||||||
// invalidIds.add(id);
|
|
||||||
// }
|
|
||||||
// DeviceQueryCriteria deviceQueryCriteria = new DeviceQueryCriteria();
|
|
||||||
// deviceQueryCriteria.setDeviceType(id);
|
|
||||||
// List<Device> devices = deviceMapper.findAll(deviceQueryCriteria);
|
|
||||||
// if (!devices.isEmpty()) {
|
|
||||||
// invalidId2.add(id);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// if (!invalidIds.isEmpty()) {
|
|
||||||
// throw new RuntimeException("以下设备类型无法删除(ID 不存在或无权限): " + invalidIds);
|
|
||||||
// }
|
|
||||||
// if (!invalidId2.isEmpty()) {
|
|
||||||
// throw new RuntimeException("以下设备类型无法删除(已绑定设备): " + invalidId2);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// deviceTypeMapper.deleteByIds(ids);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,239 @@
|
|||||||
|
package com.fuyuanshen.equipment.utils.c;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 可靠点阵生成工具 - 终极版
|
||||||
|
*
|
||||||
|
* @author: 默苍璃
|
||||||
|
* @date: 2025-07-15
|
||||||
|
*/
|
||||||
|
public class ReliableTextToBitmap {
|
||||||
|
|
||||||
|
public static void main(String[] args) throws IOException {
|
||||||
|
String unit = "繁體繁體繁體";
|
||||||
|
String department = "A研B发C";
|
||||||
|
String name = "12李34四56";
|
||||||
|
|
||||||
|
byte[] unitBytes = textToBitmapBytes(unit);
|
||||||
|
byte[] deptBytes = textToBitmapBytes(department);
|
||||||
|
byte[] nameBytes = textToBitmapBytes(name);
|
||||||
|
|
||||||
|
generateCFile(unitBytes, deptBytes, nameBytes, "display_data.c");
|
||||||
|
|
||||||
|
// 生成预览图片
|
||||||
|
generatePreviewImage(unitBytes, "unit_image.png");
|
||||||
|
generatePreviewImage(deptBytes, "department_image.png");
|
||||||
|
generatePreviewImage(nameBytes, "name_image.png");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 专门生成预览图片的方法
|
||||||
|
private static void generatePreviewImage(byte[] data, String filename) {
|
||||||
|
try {
|
||||||
|
BufferedImage image = convertByteArrayToImage(data, 12);
|
||||||
|
ImageIO.write(image, "PNG", new File(filename));
|
||||||
|
System.out.println("成功生成预览图片: " + filename);
|
||||||
|
} catch (IOException e) {
|
||||||
|
System.err.println("图片生成失败: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 可靠的字节数组转图像方法
|
||||||
|
*/
|
||||||
|
public static BufferedImage convertByteArrayToImage(byte[] data, int height) {
|
||||||
|
if (data == null || data.length == 0) {
|
||||||
|
return new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算宽度
|
||||||
|
int width = (data.length * 8) / height;
|
||||||
|
|
||||||
|
// 创建RGB图像
|
||||||
|
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
|
||||||
|
|
||||||
|
// 设置白色背景
|
||||||
|
for (int y = 0; y < height; y++) {
|
||||||
|
for (int x = 0; x < width; x++) {
|
||||||
|
image.setRGB(x, y, Color.WHITE.getRGB());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 直接设置像素点
|
||||||
|
int bitIndex = 0;
|
||||||
|
for (int i = 0; i < data.length; i++) {
|
||||||
|
int value = data[i] & 0xFF;
|
||||||
|
for (int bit = 7; bit >= 0; bit--) { // 高位在前
|
||||||
|
boolean isBlack = ((value >> bit) & 1) == 1;
|
||||||
|
if (isBlack) {
|
||||||
|
int x = bitIndex % width;
|
||||||
|
int y = bitIndex / width;
|
||||||
|
if (y < height) { // 确保不越界
|
||||||
|
image.setRGB(x, y, Color.BLACK.getRGB());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bitIndex++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 可靠的点阵生成方法
|
||||||
|
*/
|
||||||
|
public static byte[] textToBitmapBytes(String text) {
|
||||||
|
if (text == null || text.isEmpty()) {
|
||||||
|
return new byte[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1. 创建画布 - 使用RGB类型避免问题
|
||||||
|
Font font = new Font("宋体", Font.PLAIN, 12);
|
||||||
|
BufferedImage image = createTextImage(text, font);
|
||||||
|
|
||||||
|
// 2. 直接提取点阵数据
|
||||||
|
return extractBitmapData(image);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建文本图像 - 最可靠的方法
|
||||||
|
*/
|
||||||
|
private static BufferedImage createTextImage(String text, Font font) {
|
||||||
|
// 创建临时图像获取字体度量
|
||||||
|
BufferedImage tempImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
|
||||||
|
Graphics2D tempG = tempImage.createGraphics();
|
||||||
|
tempG.setFont(font);
|
||||||
|
FontMetrics metrics = tempG.getFontMetrics();
|
||||||
|
|
||||||
|
// 计算文本宽度
|
||||||
|
int totalWidth = metrics.stringWidth(text);
|
||||||
|
|
||||||
|
// 宽度对齐到8的倍数
|
||||||
|
int width = (int) Math.ceil(totalWidth / 8.0) * 8;
|
||||||
|
int height = 12;
|
||||||
|
|
||||||
|
// 创建RGB图像
|
||||||
|
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
|
||||||
|
Graphics2D g = image.createGraphics();
|
||||||
|
|
||||||
|
// 设置白色背景
|
||||||
|
g.setColor(Color.WHITE);
|
||||||
|
g.fillRect(0, 0, width, height);
|
||||||
|
|
||||||
|
// 设置黑色文本
|
||||||
|
g.setColor(Color.BLACK);
|
||||||
|
g.setFont(font);
|
||||||
|
|
||||||
|
// 关闭抗锯齿 - 确保清晰度
|
||||||
|
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
|
||||||
|
RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
|
||||||
|
|
||||||
|
// 绘制文本 - 精确居中
|
||||||
|
int y = (height - metrics.getHeight()) / 2 + metrics.getAscent();
|
||||||
|
g.drawString(text, 0, y);
|
||||||
|
|
||||||
|
g.dispose();
|
||||||
|
tempG.dispose();
|
||||||
|
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 提取点阵数据 - 简单可靠的方法
|
||||||
|
*/
|
||||||
|
private static byte[] extractBitmapData(BufferedImage image) {
|
||||||
|
int width = image.getWidth();
|
||||||
|
int height = image.getHeight();
|
||||||
|
|
||||||
|
List<Byte> byteList = new ArrayList<>();
|
||||||
|
int currentByte = 0;
|
||||||
|
int bitCount = 0;
|
||||||
|
|
||||||
|
for (int y = 0; y < height; y++) {
|
||||||
|
for (int x = 0; x < width; x++) {
|
||||||
|
// 获取像素颜色
|
||||||
|
Color color = new Color(image.getRGB(x, y));
|
||||||
|
|
||||||
|
// 简单阈值判断 - 灰度小于128为黑色
|
||||||
|
int gray = (color.getRed() + color.getGreen() + color.getBlue()) / 3;
|
||||||
|
boolean isBlack = gray < 128;
|
||||||
|
|
||||||
|
// 高位优先打包
|
||||||
|
currentByte = (currentByte << 1) | (isBlack ? 1 : 0);
|
||||||
|
bitCount++;
|
||||||
|
|
||||||
|
if (bitCount == 8) {
|
||||||
|
byteList.add((byte) currentByte);
|
||||||
|
currentByte = 0;
|
||||||
|
bitCount = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理最后不满8位的部分
|
||||||
|
if (bitCount > 0) {
|
||||||
|
currentByte <<= (8 - bitCount);
|
||||||
|
byteList.add((byte) currentByte);
|
||||||
|
}
|
||||||
|
|
||||||
|
return byteListToArray(byteList);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static byte[] byteListToArray(List<Byte> byteList) {
|
||||||
|
byte[] result = new byte[byteList.size()];
|
||||||
|
for (int i = 0; i < byteList.size(); i++) {
|
||||||
|
result[i] = byteList.get(i);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void generateCFile(byte[] unit, byte[] department, byte[] name, String filename) throws IOException {
|
||||||
|
try (FileWriter writer = new FileWriter(filename)) {
|
||||||
|
writer.write("/**\n");
|
||||||
|
writer.write(" * 点阵显示数据 - 可靠生成\n");
|
||||||
|
writer.write(" * 宽度计算公式: width = (数组长度 * 8) / 12\n");
|
||||||
|
writer.write(" */\n\n");
|
||||||
|
writer.write("#include <stdint.h>\n\n");
|
||||||
|
|
||||||
|
// 单位数据
|
||||||
|
writer.write(String.format("// 单位: %d 字节, 宽度: %d 像素\n",
|
||||||
|
unit.length, (unit.length * 8) / 12));
|
||||||
|
writer.write("const uint8_t unit[] = {\n ");
|
||||||
|
writeByteArray(writer, unit);
|
||||||
|
writer.write("\n};\n\n");
|
||||||
|
|
||||||
|
// 部门数据
|
||||||
|
writer.write(String.format("// 部门: %d 字节, 宽度: %d 像素\n",
|
||||||
|
department.length, (department.length * 8) / 12));
|
||||||
|
writer.write("const uint8_t department[] = {\n ");
|
||||||
|
writeByteArray(writer, department);
|
||||||
|
writer.write("\n};\n\n");
|
||||||
|
|
||||||
|
// 姓名数据
|
||||||
|
writer.write(String.format("// 姓名: %d 字节, 宽度: %d 像素\n",
|
||||||
|
name.length, (name.length * 8) / 12));
|
||||||
|
writer.write("const uint8_t name[] = {\n ");
|
||||||
|
writeByteArray(writer, name);
|
||||||
|
writer.write("\n};\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void writeByteArray(FileWriter writer, byte[] data) throws IOException {
|
||||||
|
for (int i = 0; i < data.length; i++) {
|
||||||
|
int value = data[i] & 0xFF;
|
||||||
|
writer.write(String.format("0x%02X", value));
|
||||||
|
|
||||||
|
if (i < data.length - 1) {
|
||||||
|
writer.write(", ");
|
||||||
|
if ((i + 1) % 12 == 0) writer.write("\n ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -36,51 +36,21 @@
|
|||||||
d.device_imei, d.longitude, d.latitude, d.tenant_id
|
d.device_imei, d.longitude, d.latitude, d.tenant_id
|
||||||
</sql>
|
</sql>
|
||||||
|
|
||||||
<!-- 分页查询设备 -->
|
|
||||||
<select id="findAll1" resultType="com.fuyuanshen.equipment.domain.Device">
|
|
||||||
select d.* , t.type_name
|
|
||||||
FROM device d
|
|
||||||
LEFT JOIN device_type t ON d.device_type = t.id
|
|
||||||
<where>
|
|
||||||
<!-- 时间范围等其他条件保持原样 -->
|
|
||||||
<if test="criteria.deviceName != null and criteria.deviceName.trim() != ''">
|
|
||||||
and d.device_name like concat('%', TRIM(#{criteria.deviceName}), '%')
|
|
||||||
</if>
|
|
||||||
<if test="criteria.deviceMac != null">
|
|
||||||
and d.device_mac = #{criteria.deviceMac}
|
|
||||||
</if>
|
|
||||||
<if test="criteria.deviceImei != null">
|
|
||||||
and d.device_imei = #{criteria.deviceImei}
|
|
||||||
</if>
|
|
||||||
<if test="criteria.deviceType != null">
|
|
||||||
and d.device_type = #{criteria.deviceType}
|
|
||||||
</if>
|
|
||||||
<if test="criteria.deviceStatus != null">
|
|
||||||
and d.device_status = #{criteria.deviceStatus}
|
|
||||||
</if>
|
|
||||||
<if test="criteria.currentOwnerId != null">
|
|
||||||
and d.current_owner_id = #{criteria.currentOwnerId}
|
|
||||||
</if>
|
|
||||||
<if test="criteria.params.beginTime != null and criteria.params.endTime != null">
|
|
||||||
and d.create_time between #{criteria.params.beginTime} and #{criteria.params.endTime}
|
|
||||||
</if>
|
|
||||||
<if test="criteria.tenantId != null">
|
|
||||||
AND tenant_id = #{criteria.tenantId}
|
|
||||||
</if>
|
|
||||||
</where>
|
|
||||||
order by d.create_time desc
|
|
||||||
</select>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- 分页查询设备 -->
|
<!-- 分页查询设备 -->
|
||||||
<select id="findAll" resultType="com.fuyuanshen.equipment.domain.Device">
|
<select id="findAll" resultType="com.fuyuanshen.equipment.domain.Device">
|
||||||
select
|
SELECT *
|
||||||
|
FROM (
|
||||||
|
SELECT
|
||||||
da.id AS id, d.device_name, d.bluetooth_name,
|
da.id AS id, d.device_name, d.bluetooth_name,
|
||||||
d.device_pic, d.device_mac, d.device_sn, d.update_by,d.device_imei,
|
d.pub_topic, d.sub_topic, d.device_pic,
|
||||||
d.update_time, dg.id AS device_type, d.remark, d.binding_status,d.type_name AS typeName,
|
d.device_mac, d.device_sn, d.update_by,
|
||||||
da.assignee_id AS customerId, da.assignee_name AS customerName, da.active AS deviceStatus,
|
d.device_imei, d.update_time, dg.id AS device_type,
|
||||||
da.create_time AS create_time , da.assigner_name AS createByName , da.id AS assignId
|
d.remark, d.binding_status, t.type_name AS typeName,
|
||||||
from device d
|
da.assignee_id AS customerId, da.assignee_name AS customerName,
|
||||||
|
da.active AS deviceStatus, da.create_time AS create_time,
|
||||||
|
da.assigner_name AS createByName, da.id AS assignId,
|
||||||
|
ROW_NUMBER() OVER (PARTITION BY d.id ORDER BY da.create_time DESC) AS rn
|
||||||
|
FROM device d
|
||||||
LEFT JOIN device_type t ON d.device_type = t.id
|
LEFT JOIN device_type t ON d.device_type = t.id
|
||||||
LEFT JOIN device_type_grants dg ON dg.device_type_id = t.id
|
LEFT JOIN device_type_grants dg ON dg.device_type_id = t.id
|
||||||
LEFT JOIN device_assignments da ON da.device_id = d.id
|
LEFT JOIN device_assignments da ON da.device_id = d.id
|
||||||
@ -107,9 +77,12 @@
|
|||||||
AND da.assignee_id = #{criteria.currentOwnerId}
|
AND da.assignee_id = #{criteria.currentOwnerId}
|
||||||
AND dg.customer_id = #{criteria.currentOwnerId}
|
AND dg.customer_id = #{criteria.currentOwnerId}
|
||||||
</where>
|
</where>
|
||||||
ORDER BY da.create_time DESC
|
) AS ranked
|
||||||
|
WHERE rn = 1
|
||||||
|
ORDER BY create_time DESC
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
|
||||||
<select id="findAllDevices" resultType="com.fuyuanshen.equipment.domain.Device">
|
<select id="findAllDevices" resultType="com.fuyuanshen.equipment.domain.Device">
|
||||||
select
|
select
|
||||||
d.id, d.customer_id, d.device_name,d.bluetooth_name,
|
d.id, d.customer_id, d.device_name,d.bluetooth_name,
|
||||||
@ -174,7 +147,8 @@
|
|||||||
d.device_pic,
|
d.device_pic,
|
||||||
dt.type_name,
|
dt.type_name,
|
||||||
dt.communication_mode,
|
dt.communication_mode,
|
||||||
d.bluetooth_name
|
d.bluetooth_name,
|
||||||
|
d.binding_time
|
||||||
from device d
|
from device d
|
||||||
inner join device_type dt on d.device_type = dt.id
|
inner join device_type dt on d.device_type = dt.id
|
||||||
where d.binding_user_id = #{criteria.bindingUserId}
|
where d.binding_user_id = #{criteria.bindingUserId}
|
||||||
|
@ -44,7 +44,7 @@ public class MqttOutboundConfiguration {
|
|||||||
mqttPahoClientFactory
|
mqttPahoClientFactory
|
||||||
);
|
);
|
||||||
mqttPahoMessageHandler.setDefaultQos(1);
|
mqttPahoMessageHandler.setDefaultQos(1);
|
||||||
mqttPahoMessageHandler.setDefaultTopic("worker/location");
|
mqttPahoMessageHandler.setDefaultTopic("B/#");
|
||||||
mqttPahoMessageHandler.setAsync(true);
|
mqttPahoMessageHandler.setAsync(true);
|
||||||
return mqttPahoMessageHandler;
|
return mqttPahoMessageHandler;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,16 @@
|
|||||||
|
package com.fuyuanshen.system.mqtt.constants;
|
||||||
|
|
||||||
|
|
||||||
|
public interface MqttConstants {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 全局发布消息的key
|
||||||
|
*/
|
||||||
|
String GLOBAL_PUB_KEY = "B/";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 全局订阅消息的key
|
||||||
|
*/
|
||||||
|
String GLOBAL_SUB_KEY = "A/";
|
||||||
|
}
|
@ -27,5 +27,6 @@ public class ReceiverMessageHandler implements MessageHandler {
|
|||||||
String timestamp = Objects.requireNonNull(headers.get("timestamp")).toString();
|
String timestamp = Objects.requireNonNull(headers.get("timestamp")).toString();
|
||||||
log.info("MQTT payload= {} \n receivedTopic = {} \n receivedQos = {} \n timestamp = {}"
|
log.info("MQTT payload= {} \n receivedTopic = {} \n receivedQos = {} \n timestamp = {}"
|
||||||
,payload,receivedTopic,receivedQos,timestamp);
|
,payload,receivedTopic,receivedQos,timestamp);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
24
pom.xml
24
pom.xml
@ -37,6 +37,8 @@
|
|||||||
<lombok.version>1.18.36</lombok.version>
|
<lombok.version>1.18.36</lombok.version>
|
||||||
<bouncycastle.version>1.80</bouncycastle.version>
|
<bouncycastle.version>1.80</bouncycastle.version>
|
||||||
<justauth.version>1.16.7</justauth.version>
|
<justauth.version>1.16.7</justauth.version>
|
||||||
|
|
||||||
|
<javacv-platform.version>1.5.7</javacv-platform.version>
|
||||||
<!-- 离线IP地址定位库 -->
|
<!-- 离线IP地址定位库 -->
|
||||||
<ip2region.version>2.7.0</ip2region.version>
|
<ip2region.version>2.7.0</ip2region.version>
|
||||||
|
|
||||||
@ -81,10 +83,10 @@
|
|||||||
<monitor.username>fys</monitor.username>
|
<monitor.username>fys</monitor.username>
|
||||||
<monitor.password>123456</monitor.password>
|
<monitor.password>123456</monitor.password>
|
||||||
</properties>
|
</properties>
|
||||||
<activation>
|
<!-- <activation> -->
|
||||||
<!-- 默认环境 -->
|
<!-- <!– 默认环境 –> -->
|
||||||
<activeByDefault>true</activeByDefault>
|
<!-- <activeByDefault>true</activeByDefault> -->
|
||||||
</activation>
|
<!-- </activation> -->
|
||||||
</profile>
|
</profile>
|
||||||
<profile>
|
<profile>
|
||||||
<id>prod</id>
|
<id>prod</id>
|
||||||
@ -94,10 +96,10 @@
|
|||||||
<monitor.username>fys</monitor.username>
|
<monitor.username>fys</monitor.username>
|
||||||
<monitor.password>123456</monitor.password>
|
<monitor.password>123456</monitor.password>
|
||||||
</properties>
|
</properties>
|
||||||
<!-- <activation> -->
|
<activation>
|
||||||
<!-- <!– 默认环境 –> -->
|
<!-- 默认环境 -->
|
||||||
<!-- <activeByDefault>true</activeByDefault> -->
|
<activeByDefault>true</activeByDefault>
|
||||||
<!-- </activation> -->
|
</activation>
|
||||||
</profile>
|
</profile>
|
||||||
</profiles>
|
</profiles>
|
||||||
|
|
||||||
@ -142,6 +144,12 @@
|
|||||||
<version>${justauth.version}</version>
|
<version>${justauth.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bytedeco</groupId>
|
||||||
|
<artifactId>javacv-platform</artifactId>
|
||||||
|
<version>${javacv-platform.version}</version> <!-- 使用合适的版本号 -->
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!-- common 的依赖配置-->
|
<!-- common 的依赖配置-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.fuyuanshen</groupId>
|
<groupId>com.fuyuanshen</groupId>
|
||||||
|
Reference in New Issue
Block a user