package com.xy.controller;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.yitter.idgen.YitIdHelper;
import com.xy.annotate.RestMappingController;
import com.xy.annotation.LogOperate;
import com.xy.collections.list.JArrayList;
import com.xy.collections.map.JMap;
import com.xy.device.EnumDeviceActiveStatus;
import com.xy.device.EnumDeviceFreezeStatus;
import com.xy.dto.*;
import com.xy.dto.be.MercDto;
import com.xy.dto.common.MercPlaceDto;
import com.xy.entity.*;
import com.xy.enums.LogEnum;
import com.xy.enums.MercStatus;
import com.xy.service.*;
import com.xy.service.be.MercFeignService;
import com.xy.service.common.MercLineService;
import com.xy.service.common.MercPlaceService;
import com.xy.service.factory.device.DeviceFactory;
import com.xy.utils.*;
import com.xy.utils.Enum.AlgorithmTypeEnum;
import com.xy.utils.enums.DeviceActiveStateEnum;
import com.xy.utils.enums.DeviceAuthCodeUseStatus;
import com.xy.utils.enums.DeviceLockState;
import com.xy.utils.enums.DeviceNetSateType;
import com.xy.vo.DeviceDetailVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import javax.validation.Valid;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import static com.xy.utils.Beans.copy;
/**
*
* 小程序-设备
*
*
* @author hechunping
* @since 2023/3/4
*/
@RestMappingController("merc-mini/device")
@AllArgsConstructor
@Api(tags = "小程序-设备")
@Slf4j
public class MercMiniDeviceController {
/**
* auth-code有效期30分钟,单位:s ,
*/
public static final Integer AUTH_CODE_TIMEOUT = 1800;
private final MercFeignService mercFeignService;
private final DeviceInfoServiceImpl deviceInfoService;
private final DeviceSysinfoServiceImpl deviceSysinfoService;
private final MercPlaceService mercPlaceService;
private final MercLineService mercLineService;
private final DeviceBluetoothAuthServiceImpl deviceBluetoothAuthService;
private final DeviceTempRecordsServiceImpl deviceTempRecordsService;
private final AlipayDeviceService alipayDeviceService;
private final DeviceStatusServiceImpl deviceStatusService;
private final DeviceConfigServiceImpl deviceConfigService;
private final DeviceTempSetServiceImpl deviceTempSetService;
public static void setCacheAuthCode(Long deviceId, String code) {
RedisService redisService = SpringBeanUtils.getBean(RedisService.class);
redisService.set("device:auth:code:" + deviceId, code, AUTH_CODE_TIMEOUT);
}
public static String getCacheAuthCode(Long deviceId) {
RedisService redisService = SpringBeanUtils.getBean(RedisService.class);
return redisService.get("device:auth:code:" + deviceId);
}
public static void delCacheAuthCode(Long deviceId) {
RedisService redisService = SpringBeanUtils.getBean(RedisService.class);
redisService.remove("device:auth:code:" + deviceId);
}
@LogOperate(logType = LogEnum.LogType.V2, optType = LogEnum.OptType.V2, logContent = "解绑商户")
@ApiOperation("解绑商户")
@PostMapping("unBindMercDevice")
R unBindMercDevice(@RequestBody @Validated DeviceInfoDto.MercDeviceUnBindDto dto) {
MercAuthUtils.MercAuth.Merc merc = MercAuthUtils.getMercAuth().getMerc();
dto.setMercId(merc.getId());
dto.setMercCode(merc.getMercCode());
dto.setMercName(merc.getName());
List deviceIds = dto.getDeviceIds();
String log = String.format("解绑商户:被解绑商户:%s,解绑设备:%s", merc.getId() + "," + merc.getName(), CollUtil.isEmpty(deviceIds) ? "" : CollUtil.join(deviceIds, ","));
return R.ok(deviceInfoService.unBindDeviceByMerc(dto)).setLogMsg(log);
}
@LogOperate(logType = LogEnum.LogType.V2, optType = LogEnum.OptType.V2, logContent = "商户设备授权")
@ApiOperation("商户设备授权")
@PostMapping("deviceAuth")
public R mercDeviceAuth(@RequestBody @Validated DeviceInfoDto.MercDeviceAuthDto auth) {
String mercCode = auth.getMercCode();
MercDto.Vo merc = R.feignCheckData(mercFeignService.obj(new MercDto.ListDTO().setMercCode(mercCode)));
// MercAuthUtils.MercAuth.Merc merc = MercAuthUtils.getMercAuth().getMerc();
auth.setMercCode(mercCode);
auth.setMercId(merc.getId());
auth.setParentId(merc.getParentId());
auth.setMercName(merc.getName());
auth.setAlgorithmId(merc.getAlgorithmId());
auth.setMercOperate(true);
// 设备服务授权处理
R r = R.feignCheck(deviceInfoService.mercDeviceAuth(auth));
List deviceIds = auth.getDeviceIds();
String log = String.format("商户设备授权:授权商户:%s,授权设备:%s", merc.getId() + "," + merc.getName(), deviceIds.size() == 0 ? "取消所有设备授权" : CollUtil.join(deviceIds, ","));
return R.ok(r.getData()).setLogMsg(log);
}
@ApiOperation("设备分页-管理员")
@PostMapping("pageByAdminName")
public R> pageByAdminName(@RequestBody @Validated DeviceInfoDto.PageByAdminNameDto dto) {
dto.setMercId(MercAuthUtils.getMercId());
dto.setDeviceIdList(getMyDevices());
dto.setPage(dto.getPage().setOrders(null));
return deviceInfoService.pageByAdminName(dto);
}
@ApiOperation("设备分页-商户")
@PostMapping("pageByMerc")
public R> pageByMerc(@RequestBody @Validated DeviceInfoDto.PageByMercDto dto) {
List deviceIds = dto.getDeviceIds();
dto.setMercId(MercAuthUtils.getMercId());
Boolean choosed = dto.getChoosed();
if (BooleanUtil.isTrue(choosed)) {
// 查询已选择,为前端传入 deviceIds
dto.setDeviceIds(deviceIds);
}
dto.setMyDeviceIds(getMyDevices());
return R.ok(deviceInfoService.pageByMerc(dto));
}
@ApiOperation("商户设备列表分页-穿梭框用")
@PostMapping("myDeviceList")
public R> myDeviceList(@RequestBody @Validated DeviceInfoDto.MyDeviceDTO dto) {
dto.setMercId(MercAuthUtils.getMercId());
return deviceInfoService.myDeviceList(dto);
}
@ApiOperation("设备列表带卡包数")
@PostMapping("algorithmChargingDevice")
public R> algorithmChargingDevice(@RequestBody @Validated DeviceInfoDto.AlgorithmCharging algorithmCharging) {
algorithmCharging.setMercId(MercAuthUtils.getMercId());
return deviceInfoService.algorithmChargingDevice(algorithmCharging);
}
@ApiOperation("商户设备首页统计")
@PostMapping("mercHomeStatistical")
public R mercHomeStatistical(@RequestBody @Valid DeviceInfoDto.MercHomeQueryDTO dto) {
dto.setMercId(MercAuthUtils.getMercId());
dto.setMyDeviceIds(getMyDevices());
return deviceInfoService.mercHomeStatistical(dto);
}
@ApiOperation("设备列表-Id&Name")
@PostMapping("listOfIdName")
public R listOfIdName() {
DeviceInfoDto.ListCommon listCommonDto = new DeviceInfoDto.ListCommon();
DeviceInfoDto.Vo voDto = new DeviceInfoDto.Vo();
voDto.setActiveState(Integer.valueOf(DeviceActiveStateEnum.TRUE.getCode()))
.setMercId(MercAuthUtils.getMercId());
listCommonDto.setVo(voDto);
List copy = copy(MercMiniDeviceDto.ListOfIdNameVo.class, deviceInfoService.listCommon(listCommonDto).getData());
return R.ok(copy);
}
@PostMapping("searchPage")
@ApiOperation("小程序商户设备搜索")
public R> mercDeviceSearchPage(@RequestBody DeviceInfoDto.Page page) {
page.setMercId(MercAuthUtils.getMercId());
page.setMyDeviceIds(getMyDevices());
return deviceInfoService.mercDeviceSearchPage(page);
}
@PostMapping("simpleDeviceSearchPage")
@ApiOperation("小程序-通用商户设备搜索组件")
public R> simpleDeviceSearchPage(@RequestBody DeviceInfoDto.SimpleDeviceSearchPageDto page) {
page.setMercId(MercAuthUtils.getMercId());
page.setMyDeviceIds(getMyDevices());
return deviceInfoService.simpleDeviceSearchPage(page);
}
@ApiOperation("小程序商户设备详情-设备信息")
@PostMapping("detail")
R detail(@RequestBody DeviceInfoDto.Obj obj) {
obj.setMercId(MercAuthUtils.getMercId());
obj.setIsStatus(true);
R r = deviceInfoService.obj(obj);
DeviceInfoDto.Vo vo = r.getData();
if (vo != null) {
Long algorithmId = vo.getAlgorithmId();
// 点位
Long placeId = vo.getPlaceId();
List merPlaceList = R.feignCheckData(mercPlaceService.list(new MercPlaceDto.ListDto().setIds(CollUtil.newArrayList(placeId))));
MercPlaceDto.Vo mercPlace = CollUtil.isNotEmpty(merPlaceList) ? merPlaceList.get(0) : null;
if (Emptys.check(mercPlace)) {
vo.setDistrictName(mercPlace.getRegionName());
vo.setPlaceName(mercPlace.getPlaceName());
vo.setPlaceImgs(mercPlace.getImgs());
}
// 返显区域名称
DeviceStatusDto.Vo deviceStatus = vo.getDeviceStatus();
vo.setNetStateName(deviceStatus == null ? StrUtil.EMPTY : DeviceNetSateType.getEnumByCode(deviceStatus.getNetState()).getDescription());
if (deviceStatus != null) {
Integer tempValue = deviceStatus.getTempValue();
if (tempValue == null) {
List deviceTempRecords = deviceTempRecordsService
.list(Wrappers.lambdaQuery()
.eq(DeviceTempRecords::getDeviceId, vo.getDeviceId()).orderByDesc(DeviceTempRecords::getCreateTime).last("limit 1")
);
if (CollUtil.isNotEmpty(deviceTempRecords)) {
deviceStatus.setTempValue(deviceTempRecords.get(0).getTempValue());
vo.setDeviceStatus(deviceStatus);
} else {
deviceStatus.setTempValue(0);
vo.setDeviceStatus(deviceStatus);
}
}
Integer deviceStateL = deviceStatus.getLockStateL();
Integer deviceStateR = deviceStatus.getLockStateR();
Boolean isUseBattery = deviceStatus.getIsUseBattery();
if (BooleanUtil.isTrue(isUseBattery)) {
// 使用电池。即断电状态
vo.setSysPower(2);
} else {
vo.setSysPower(1);
}
vo.setDeviceStateL(deviceStateL);
vo.setDeviceStateR(deviceStateR);
DeviceLockState deviceLockStateL = DeviceLockState.getEnumByCode(deviceStateL);
DeviceLockState deviceLockStateR = DeviceLockState.getEnumByCode(deviceStateR);
vo.setDeviceStateRName(deviceLockStateR == null ? "未知" : deviceLockStateR.getDescription());
vo.setDeviceStateLName(deviceLockStateL == null ? "未知" : deviceLockStateL.getDescription());
if (AlgorithmTypeEnum.ALIPAY.getId() == algorithmId) {
String deviceId = String.valueOf(vo.getDeviceId());
// 主动查询一次温度、音量 温度:TEMP 音量:VOL
alipayDeviceService.queryAttributes(new DeviceQueryAttr().setTerminalId(deviceId).setType("VOL"));
alipayDeviceService.queryAttributes(new DeviceQueryAttr().setTerminalId(deviceId).setType("TEMP"));
// 支付宝状态实时返回
DeviceDetailVO deviceDetailVO = alipayDeviceService.queryDetail(new DeviceDetailDTO().setTerminalId(String.valueOf(vo.getDeviceId())));
Boolean online = deviceDetailVO.getOnline();
Integer netState = BooleanUtil.isTrue(online) ? DeviceNetSateType.CONNECTED.getCode() : DeviceNetSateType.DISCONNECT.getCode();
if (!ObjectUtil.equals(netState, deviceStatus.getNetState())) {
// 存在差异更新设备状态表
deviceStatusService.updateById(new DeviceStatus().setDeviceId(vo.getDeviceId()).setNetState(netState));
}
deviceStatus.setNetState(netState);
vo.setDeviceStatus(deviceStatus);
}
}
// 工作温度设置
DeviceTempSetDto.Vo lastTempset = R.feignCheckData(deviceTempSetService.getLastOne(new DeviceTempSetDto.GetLastOneDto().setDeviceId(vo.getDeviceId())));
vo.setJobTempSetValue(lastTempset == null ? null : lastTempset.getTempValue());
// 设备配置
DeviceConfigDto.Vo deviceConfig = deviceConfigService.obj(new DeviceConfigDto.Obj().setDeviceId(vo.getDeviceId())).getData();
vo.setDeviceConfig(deviceConfig);
}
DeviceConfig deviceConfig = deviceConfigService.getById(obj.getDeviceId());
vo.setTempSetInfo(BeanUtil.copyProperties(deviceConfig, DeviceInfoDto.TempSetInfo.class));
return R.ok(vo);
}
@ApiOperation("小程序商户设备详情-数据统计")
@PostMapping("dataCount")
R dataCount(@RequestBody DeviceInfoDto.DeviceDataCountDTO dto) {
dto.setMercId(MercAuthUtils.getMercId());
return deviceInfoService.dataCount(dto);
}
private R checkDeviceByMerc(DeviceInfo deviceInfo) {
Long mercId = MercAuthUtils.getMercId();
// 商户是否已通过审核
MercDto.Vo mercInfo = mercFeignService.obj(new MercDto.ListDTO().setId(mercId)).getData();
if (!mercInfo.getStatus().equals(String.valueOf(MercStatus.APPROVED.getCode()))) {
return R.fail("商户未通过审核");
}
// 设备是否存在
if (!Emptys.check(deviceInfo)) {
return R.fail("机器不存在");
}
// 机器是否已授权给该商户
if (!deviceInfo.getMercId().equals(mercId)) {
return R.fail("机器未授权给商户");
}
// 机器是否冻结
Integer freezeStatus = SysDictUtils.getValue(EnumDeviceFreezeStatus.Code.CODE.getCode(), EnumDeviceFreezeStatus.N_2.getCode(), Integer.class);
if (deviceInfo.getFreezeStatus().equals(freezeStatus)) {
return R.fail("机器已冻结");
}
return R.ok();
}
@PostMapping("isMerc")
@ApiOperation("判断设备是否归属商户")
public R isMerc(@RequestBody MercMiniDeviceDto.Active active) {
DeviceInfo deviceInfo = deviceInfoService.getById(active.getDeviceId());
R checkR = this.checkDeviceByMerc(deviceInfo);
if (checkR.getCode() == R.Enum.SUCCESS.getCode()) {
Integer activeState = SysDictUtils.getValue(EnumDeviceActiveStatus.Code.CODE.getCode(), EnumDeviceActiveStatus.N_1.getCode(), Integer.class);
String refMercCode = deviceInfo.getMercCode();
// 非质检商户需要进行判断,质检商户跳过
if (!"10001".equals(refMercCode) && !deviceInfo.getActiveState().equals(activeState)) {
return R.fail("机器未激活");
}
return R.ok();
}
return checkR;
}
@PostMapping("getActiveInfo")
@ApiOperation("激活设备前判断")
public R getActiveInfo(@RequestBody MercMiniDeviceDto.Active active) {
DeviceInfo deviceInfo = deviceInfoService.getById(active.getDeviceId());
R checkR = this.checkDeviceByMerc(deviceInfo);
if (checkR.getCode() == R.Enum.SUCCESS.getCode()) {
Integer activeState = SysDictUtils.getValue(EnumDeviceActiveStatus.Code.CODE.getCode(), EnumDeviceActiveStatus.N_1.getCode(), Integer.class);
if (deviceInfo.getActiveState().equals(activeState)) {
return R.fail("机器已激活");
}
return R.ok();
}
return checkR;
}
@PostMapping("active")
@ApiOperation("激活设备")
public R active(@RequestBody MercMiniDeviceDto.Active2 active) {
List deviceIds = active.getDeviceId();
List list = deviceInfoService.list(new LambdaQueryWrapper()
.in(DeviceInfo::getDeviceId, deviceIds)
);
JMap cover = new JArrayList<>(list).toMap(DeviceInfo::getDeviceType).cover();
if (cover.size() > 1) {
return R.fail("批量激活设备类型必须一致");
}
for (DeviceInfo deviceInfo : list) {
R checkR = this.checkDeviceByMerc(deviceInfo);
if (checkR.getCode() == R.Enum.FAIL.getCode()) {
return checkR;
}
}
return FactoryUtils.getServiceRoute(DeviceFactory.class, list.get(0).getDeviceType()).active(active);
}
@PostMapping("restActive")
@ApiOperation("重置设备激活")
public R restActive(@RequestBody @Validated MercMiniDeviceDto.RestActive restActive) {
DeviceInfoDto.Vo deviceInfo = deviceInfoService.obj(new DeviceInfoDto.Obj().setDeviceId(restActive.getDeviceId()).setIsSysinfo(true)).getData();
DeviceSysinfoDto.Vo deviceSysinfo = deviceInfo.getDeviceSysinfo();
if (deviceSysinfo != null) {
restActive.setNfcSn(deviceSysinfo.getNfcSn());
}
return FactoryUtils.getServiceRoute(DeviceFactory.class, deviceInfo.getDeviceType()).restActive(restActive);
}
@ApiOperation("运营状态修改")
@PostMapping("modifyBusyStage")
public R modifyBusyStage(@RequestBody @Validated MercMiniDeviceDto.BusySate busySate) {
Long mercId = MercAuthUtils.getMercId();
DeviceInfo deviceInfo = deviceInfoService.getById(busySate.getDeviceId());
return FactoryUtils.getServiceRoute(DeviceFactory.class, deviceInfo.getDeviceType()).busyStatus(busySate.setMercId(mercId));
}
@ApiOperation("修改设备信息、上传坐标等")
@PostMapping("updateInfo")
public R updateInfo(@RequestBody @Validated MercMiniDeviceDto.UpdateInfo dto) {
DeviceInfo deviceInfo = deviceInfoService.getById(dto.getDeviceId());
if (!Emptys.check(deviceInfo) || !Objects.equals(deviceInfo.getMercId(), MercAuthUtils.getMercId())) {
return R.fail("设备不存在");
}
DeviceInfoDto.Update update = copy(DeviceInfoDto.Update.class, dto);
deviceInfoService.update(update);
return R.ok();
}
@ApiOperation("当前登录用户拥有的设备")
@PostMapping("myDevices")
R> myDevices() {
return R.ok(getMyDevices());
}
/**
* 获取登录人的设备
*
* @return
*/
List getMyDevices() {
boolean mercAdmin = MercAuthUtils.isMercAdmin();
Long mercId = MercAuthUtils.getMercId();
if (mercAdmin) {
MercAuthUtils.MercAuth.Merc merc = MercAuthUtils.getMercAuth().getMerc();
boolean qaModeMerc = MercAuthUtils.isQaModeMerc(merc.getMercCode());
//非QA需要查激活的设备
List deviceInfos = deviceInfoService.list(Wrappers.lambdaQuery().eq(DeviceInfo::getMercId, mercId).eq(!qaModeMerc, DeviceInfo::getActiveState, DeviceActiveStateEnum.TRUE.getCode()));
if (CollUtil.isEmpty(deviceInfos)) {
return CollUtil.newArrayList();
}
return deviceInfos.stream().map(DeviceInfo::getDeviceId).collect(Collectors.toList());
} else {
// 成员设备
List deviceIds = R.feignCheckData(mercFeignService.mercUserDevice());
return deviceIds;
}
}
@PostMapping("genCode")
@ApiOperation("蓝牙开门-生成授权码")
public R genCode(@RequestBody @Validated DeviceBluetoothAuthDto.GenCode dto) {
String deviceSn = dto.getDeviceSn();
List list = deviceSysinfoService.list(Wrappers.lambdaQuery().eq(DeviceSysinfo::getDeviceSn, deviceSn).orderByDesc(DeviceSysinfo::getCreateTime));
if (CollUtil.isEmpty(list)) {
return R.fail("设备不存在!");
}
DeviceSysinfo deviceSysinfo = list.get(0);
Long deviceId = deviceSysinfo.getDeviceId();
// 用户输入的
String authCode = dto.getAuthCode();
List myDevices = getMyDevices();
if (!myDevices.contains(deviceId)) {
return R.fail("抱歉!您无权对此设备进行授权!");
}
Long mercId = MercAuthUtils.getMercId();
DeviceBluetoothAuth deviceBluetoothAuth = deviceBluetoothAuthService.getOne(Wrappers.lambdaQuery()
.eq(DeviceBluetoothAuth::getDeviceId, deviceId)
.eq(DeviceBluetoothAuth::getMercId, mercId)
.eq(DeviceBluetoothAuth::getUseStatus, DeviceAuthCodeUseStatus.UN_USED.getCode())
);
String cacheAuthCode = getCacheAuthCode(deviceId);
if (deviceBluetoothAuth != null) {
if (StrUtil.isNotEmpty(cacheAuthCode)) {
return R.fail("此设备尚有未使用的授权码:【" + cacheAuthCode + "】,请使用后再来生成!");
} else {
// 已失效了
deviceBluetoothAuthService.saveOrUpdate(deviceBluetoothAuth.setUseStatus(DeviceAuthCodeUseStatus.TIME_OUT.getCode()));
}
}
// 缓存
setCacheAuthCode(deviceId, authCode);
DeviceBluetoothAuth saveInfo = new DeviceBluetoothAuth()
.setDeviceId(deviceId)
.setMercId(mercId)
.setDeviceId(deviceId).setAuthCode(authCode);
return R.ok(deviceBluetoothAuthService.save(saveInfo));
}
@PostMapping("genCodeByAdmin")
@ApiOperation("蓝牙开门-平台管理员生成授权码(通用码)")
public R genCodeByAdmin(@RequestBody @Validated DeviceBluetoothAuthDto.GenCodeByAdmin dto) {
long deviceId = YitIdHelper.nextId();
// 缓存
setCacheAuthCode(deviceId, String.valueOf(deviceId));
DeviceBluetoothAuth saveInfo = new DeviceBluetoothAuth()
.setDeviceId(deviceId)
.setMercId(0L)
.setDeviceId(deviceId).setAuthCode(String.valueOf(deviceId));
deviceBluetoothAuthService.save(saveInfo);
return R.ok(deviceId);
}
@PostMapping("verificationBlueCode")
@ApiOperation("蓝牙开门-校验并使用授权码(平台管理员生成)")
public R verificationBlueCode(@RequestBody @Validated DeviceBluetoothAuthDto.VerificationCodeByAdmin dto) {
String authCode = dto.getAuthCode();
String cacheAuthCode = getCacheAuthCode(Long.valueOf(authCode));
if (!authCode.equals(cacheAuthCode)) {
return R.fail("您输入的授权码有误或者无效!");
}
// 验证通过,缓存去掉授权码,并更新状态
// Long mercId = MercAuthUtils.getMercId();
DeviceBluetoothAuth deviceBluetoothAuth = deviceBluetoothAuthService.getOne(Wrappers.lambdaQuery()
.eq(DeviceBluetoothAuth::getDeviceId, Long.valueOf(authCode))
.eq(DeviceBluetoothAuth::getAuthCode, authCode)
.eq(DeviceBluetoothAuth::getUseStatus, DeviceAuthCodeUseStatus.UN_USED.getCode())
);
if (deviceBluetoothAuth == null) {
return R.fail("您输入的授权码无效!");
}
// 缓存去掉授权码
delCacheAuthCode(Long.valueOf(authCode));
deviceBluetoothAuth.setUseStatus(DeviceAuthCodeUseStatus.USED.getCode());
deviceBluetoothAuth.setUseUser(AuthorizeUtils.getLoginId(Long.class));
deviceBluetoothAuth.setUseTime(LocalDateTime.now());
return R.ok(deviceBluetoothAuthService.saveOrUpdate(deviceBluetoothAuth));
}
@PostMapping("verificationCode")
@ApiOperation("蓝牙开门-校验并使用授权码")
public R verificationCode(@RequestBody @Validated DeviceBluetoothAuthDto.VerificationCode dto) {
log.info("蓝牙开门-校验并使用授权码:" + JSONUtil.toJsonPrettyStr(dto));
String deviceSn = dto.getDeviceSn();
List list = deviceSysinfoService.list(Wrappers.lambdaQuery().eq(DeviceSysinfo::getDeviceSn, deviceSn).orderByDesc(DeviceSysinfo::getCreateTime));
if (CollUtil.isEmpty(list)) {
return R.fail("设备不存在!");
}
DeviceSysinfo deviceSysinfo = list.get(0);
Long deviceId = deviceSysinfo.getDeviceId();
String authCode = dto.getAuthCode();
String cacheAuthCode = getCacheAuthCode(deviceId);
if (!authCode.equals(cacheAuthCode)) {
return R.fail("您输入的授权码有误或者无效!");
}
// 验证通过,缓存去掉授权码,并更新状态
// Long mercId = MercAuthUtils.getMercId();
DeviceBluetoothAuth deviceBluetoothAuth = deviceBluetoothAuthService.getOne(Wrappers.lambdaQuery()
.eq(DeviceBluetoothAuth::getDeviceId, deviceId)
.eq(DeviceBluetoothAuth::getAuthCode, authCode)
// .eq(DeviceBluetoothAuth::getMercId, mercId)
.eq(DeviceBluetoothAuth::getUseStatus, DeviceAuthCodeUseStatus.UN_USED.getCode())
);
if (deviceBluetoothAuth == null) {
return R.fail("您输入的授权码无效!");
}
// 缓存去掉授权码
delCacheAuthCode(deviceId);
deviceBluetoothAuth.setUseStatus(DeviceAuthCodeUseStatus.USED.getCode());
deviceBluetoothAuth.setUseUser(AuthorizeUtils.getLoginId(Long.class));
deviceBluetoothAuth.setUseTime(LocalDateTime.now());
return R.ok(deviceBluetoothAuthService.saveOrUpdate(deviceBluetoothAuth));
}
@ApiOperation("支付宝Npad音量设置")
@PostMapping("setAliNpadVol")
public R setAliNpadVol(@RequestBody @Validated DeviceInfoDto.NfcVol nfcVol) {
String deviceId = nfcVol.getDeviceId();
DeviceSetAttr dto = new DeviceSetAttr();
dto.setType("VOL").setTerminalId(deviceId).setValue(nfcVol.getValue());
return R.ok(R.feignCheckData(alipayDeviceService.setAttributes(dto)));
}
@ApiOperation("音量、温度查询")
@PostMapping("queryAliNpadVol")
public R queryAliNpadVol(@RequestBody DeviceInfoDto.NfcVolQuery dto) {
DeviceQueryAttr deviceQueryAttr = new DeviceQueryAttr();
deviceQueryAttr.setTerminalId(dto.getDeviceId());
deviceQueryAttr.setType("VOL");
return R.ok(R.feignCheckData(alipayDeviceService.queryAttributes(deviceQueryAttr)));
}
}