From 412287a37e3c6b1409181f8f3ffc7556bc301e57 Mon Sep 17 00:00:00 2001 From: guochaojie Date: Tue, 25 Jun 2024 11:08:31 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=AF=B9=E6=8E=A5=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cc/yunxi/controller/DeviceController.java | 185 +++++++++++------- .../yunxi/domain/po/RecycleStaffDevice.java | 58 ++++++ .../yunxi/domain/vo/device/BucketStatus.java | 6 +- .../yunxi/domain/vo/device/DeviceRespVO.java | 2 +- .../yunxi/domain/vo/device/DeviceStatus.java | 13 +- .../mapper/RecycleStaffDeviceMapper.java | 9 + .../yunxi/service/IRecycleBucketService.java | 4 + .../yunxi/service/IRecycleDeviceService.java | 7 +- .../service/IRecycleStaffDeviceService.java | 9 + .../impl/RecycleBucketServiceImpl.java | 36 ++++ .../impl/RecycleDeviceServiceImpl.java | 19 +- .../impl/RecycleStaffDeviceServiceImpl.java | 22 +++ .../main/java/cc/yunxi/utils/CommandUtil.java | 17 ++ .../cc/yunxi/utils/DeviceStatusManager.java | 60 ------ .../mapper/RecycleStaffDeviceMapper.xml | 6 + 15 files changed, 307 insertions(+), 146 deletions(-) create mode 100644 nxhs-service/src/main/java/cc/yunxi/domain/po/RecycleStaffDevice.java create mode 100644 nxhs-service/src/main/java/cc/yunxi/mapper/RecycleStaffDeviceMapper.java create mode 100644 nxhs-service/src/main/java/cc/yunxi/service/IRecycleStaffDeviceService.java create mode 100644 nxhs-service/src/main/java/cc/yunxi/service/impl/RecycleStaffDeviceServiceImpl.java create mode 100644 nxhs-service/src/main/java/cc/yunxi/utils/CommandUtil.java delete mode 100644 nxhs-service/src/main/java/cc/yunxi/utils/DeviceStatusManager.java create mode 100644 nxhs-service/src/main/resources/mapper/RecycleStaffDeviceMapper.xml diff --git a/nxhs-service/src/main/java/cc/yunxi/controller/DeviceController.java b/nxhs-service/src/main/java/cc/yunxi/controller/DeviceController.java index 5edb8bc..fb6da54 100644 --- a/nxhs-service/src/main/java/cc/yunxi/controller/DeviceController.java +++ b/nxhs-service/src/main/java/cc/yunxi/controller/DeviceController.java @@ -8,21 +8,22 @@ import cc.yunxi.domain.po.*; import cc.yunxi.domain.vo.device.*; import cc.yunxi.domain.vo.file.FileUploadRespVO; import cc.yunxi.service.*; -import cc.yunxi.utils.DeviceStatusManager; +import cc.yunxi.utils.CommandUtil; import cc.yunxi.utils.RedisTool; import cc.yunxi.utils.UserContext; import cn.hutool.core.util.StrUtil; -import cn.hutool.http.HttpUtil; -import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -44,8 +45,6 @@ import java.util.concurrent.TimeUnit; @Validated public class DeviceController { - @Resource - private DeviceStatusManager deviceStatusManager; @Resource private IRecycleDeviceService deviceService; @Resource @@ -61,11 +60,15 @@ public class DeviceController { @Resource private IRecyclerService recyclerService; @Resource + private IRecycleStaffDeviceService staffDeviceService; + @Resource private IClientService clientService; @Resource private ICommonService commonService; @Resource private RedisTool redisTool; + @Resource + private CommandUtil commandUtil; @Resource private IFileService fileService; @@ -129,7 +132,8 @@ public class DeviceController { //获取设备配置 @PostMapping("/conf") @ApiOperation("机柜获取设备配置") - public CommonResult conf(@RequestBody DeviceVO deviceVO) { + public CommonResult conf(@RequestBody DeviceVO deviceVO, HttpServletRequest request) { + CommonResult result = new CommonResult<>(); DeviceRespVO respVO = new DeviceRespVO(); RecycleDevice device = deviceService.getByDeviceCode(deviceVO.getDeviceCode()); @@ -150,7 +154,7 @@ public class DeviceController { } respVO.setDeviceCode(device.getDeviceCode()); respVO.setDeviceName(device.getDeviceName()); - respVO.setUserStatus(device.getUseStatus()); + respVO.setUseStatus(device.getUseStatus()); respVO.setCleanLock(Integer.valueOf(config.getCleanLock())); respVO.setUsePhoneLogin(config.getAllowPhoneLogin()); //二维码 @@ -334,9 +338,9 @@ public class DeviceController { if (device == null) { throw new BizIllegalException("登录失败:未查询到对应设备信息!"); } - String recyclerPhone = device.getBeLongRecyclerPhone(); - if (StrUtil.isEmpty(recyclerPhone) || !recyclerPhone.equals(loginReqVO.getPhone())) { - throw new BizIllegalException("登录失败:你不是当前设备的清运员或当前设备未分配清运员!"); + RecycleStaffDevice staffDevice = staffDeviceService.getByDeviceCode(loginReqVO.getDeviceCode(), loginReqVO.getPhone()); + if (null == staffDevice) { + throw new BizIllegalException("登录失败:你不是当前设备的管理人员!"); } //登录成功 @@ -489,26 +493,27 @@ public class DeviceController { //设备心跳上报 @PostMapping("/heartbeat") @ApiOperation("设备心跳上报") - public CommonResult heartbeat(@RequestBody DeviceStatus des) { - deviceStatusManager.putDeviceStatus(des); - return CommonResult.success(des.getDeviceCode()); + public CommonResult heartbeat(@RequestBody DeviceVO dev) { + log.info("设备心跳上报:" + dev.getDeviceCode()); + return CommonResult.success(dev.getDeviceCode()); } @ApiOperation("设备命令下发") @PostMapping("/command") public CommonResult command(@RequestBody CommandVO cmd) { String deviceCode = cmd.getDeviceCode(); - DeviceStatus status = deviceStatusManager.getDeviceStatus(deviceCode); + Object value = redisTool.getValue(deviceCode); + if (null == value) { + return CommonResult.error(400, "设备不在线"); + } + DeviceStatus status = JSONUtil.toBean(value.toString(), DeviceStatus.class); // 判断设备是否在线 Boolean online = status.getOnline(); if (!online) return CommonResult.error(400, "设备不在线"); // 下发指令 String ip = status.getIp(); - Integer port = status.getPort(); - String res = HttpUtil.post("http://" + ip + ":" + port + "/command", JSONUtil.toJsonStr(cmd), 1000); - + CommonResult _result = commandUtil.sendCommand(cmd, ip); // 记录指令下发事件 - CommonResult _result = JSONUtil.toBean(res, CommonResult.class); RecycleDeviceEvent event = new RecycleDeviceEvent(); event.setDeviceCode(deviceCode); event.setBucketCode("");// @@ -534,49 +539,98 @@ public class DeviceController { } @ApiOperation("获取设备状态") - @PostMapping("/status") - public CommonResult command(@RequestBody DeviceVO deviceVO) { - String deviceCode = deviceVO.getDeviceCode(); - CommandVO cmd = new CommandVO(); - cmd.setCmd(CMDEnum.status); - cmd.setDeviceCode(deviceCode); - cmd.setOptTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); - cmd.setRemark("获取设备状态"); - DeviceStatus status = deviceStatusManager.getDeviceStatus(deviceCode); - // 判断设备是否在线 - Boolean online = status.getOnline(); - if (!online) return CommonResult.error(400, "设备不在线"); - String ip = status.getIp(); - Integer port = status.getPort(); - String post = HttpUtil.post("http://" + ip + ":" + port + "/command", JSONUtil.toJsonStr(cmd), 1000); - JSONObject json = JSONUtil.parseObj(post); - Integer code = json.getInt("code"); - if (code == 200 || code == 201) { - String data = json.getStr("data"); - if (StrUtil.isEmpty(data)) { - DeviceStatus deviceStatus = JSONUtil.toBean(data, DeviceStatus.class); - deviceStatusManager.putDeviceStatus(deviceStatus); - return CommonResult.success("状态已更新", "success"); - } else { - return CommonResult.error(400, "获取状态失败"); - } + @PostMapping("/getStatus") + public CommonResult getStatus(@RequestBody DeviceVO deviceVO) { + Object value = redisTool.getValue(deviceVO.getDeviceCode()); + if (value == null) { + return CommonResult.error(400, "获取失败,设备不在线!"); + } + DeviceStatus status = JSONUtil.toBean(value.toString(), DeviceStatus.class); + CommandVO command = new CommandVO(); + command.setCmd(CMDEnum.status); + command.setDeviceCode(deviceVO.getDeviceCode()); + command.setOptTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + command.setData(""); + command.setRemark(""); + CommonResult commonResult = commandUtil.sendCommand(command, status.getIp()); + Object data = commonResult.getData(); + DeviceStatus status1 = JSONUtil.toBean(data.toString(), DeviceStatus.class); + deviceService.updateDevice(status1); + status1.getBucketList().forEach(bucket -> { + bucketService.updateStatus(bucket); + }); + return CommonResult.success("获取成功!"); + } + + @ApiOperation("接受设备状态") + @PostMapping("/receiveStatus") + public CommonResult receiveStatus(@RequestBody DeviceStatus des, HttpServletRequest request) { + String deviceCode = des.getDeviceCode(); + String host = request.getRemoteHost(); + des.setIp(host);//ip + des.setOnline(true);//在线 + log.info("设备编码:{},状态上报:{},host:{}", deviceCode, JSONUtil.toJsonStr(des), host); + Object value = redisTool.getValue(deviceCode); + if (value == null) { + //更新设备状态 + deviceService.updateDevice(des); + log.info("首次更新设备状态:{},详情:{}", des.getDeviceCode(), JSONUtil.toJsonStr(des)); + //更新桶配置 + des.getBucketList().forEach(bucket -> { + bucketService.updateStatus(bucket); + log.info("首次更新桶状态:{},详情:{}", bucket.getBucketCode(), JSONUtil.toJsonStr(bucket)); + }); } else { - return CommonResult.error(400, json.getStr("msg")); + DeviceStatus status = JSONUtil.toBean(value.toString(), DeviceStatus.class); + //判断是否发生了改变 + boolean changed = deviceService.isChanged(status, des); + if (changed) { + deviceService.updateDevice(des); + log.info("更新设备状态:{},详情:{}", des.getDeviceCode(), JSONUtil.toJsonStr(des)); + } + //更新设备状态 + List oldList = status.getBucketList(); + List newList = des.getBucketList(); + for (BucketStatus now : newList) { + //判断是否在旧桶列表中 + Optional first = oldList.stream() + .filter(old -> old.getBucketCode().equals(now.getBucketCode())) + .findFirst(); + if (first.isPresent()) { + BucketStatus old = first.get(); + boolean flag = bucketService.isChanged(old, now); + if (flag) { + bucketService.updateStatus(now); + log.info("更新桶状态:{},详情:{}", now.getBucketCode(), JSONUtil.toJsonStr(now)); + } + } else { + bucketService.updateStatus(now); + log.info("首次更新桶状态:{},详情:{}", now.getBucketCode(), JSONUtil.toJsonStr(now)); + } + } } + redisTool.setValue(deviceCode, JSONUtil.toJsonStr(des), 1000 * 60 * 60l); + CommonResult success = CommonResult.success(deviceCode); + success.setMsg("success"); + return success; } @ApiOperation("接收实时重量") @PostMapping("/weight") public CommonResult weight(@RequestBody WeightVO weight) { - DeviceStatus deviceStatus = deviceStatusManager.getDeviceStatus(weight.getDeviceCode()); - List bucketList = deviceStatus.getBucketList(); - boolean flag = false; - for (BucketStatus bucketStatus : bucketList) { - if (bucketStatus.getBucketCode().equals(weight.getBucketCode())) - flag = true; - } - if (!flag) { - CommonResult.error(400, "设备编码与桶编码不匹配"); + Object value = redisTool.getValue(weight.getDeviceCode()); + if (value != null) { + DeviceStatus status = JSONUtil.toBean(value.toString(), DeviceStatus.class); + List bucketList = status.getBucketList(); + if (bucketList.size() > 0) { + Optional first = bucketList + .stream() + .filter(bucketStatus -> bucketStatus.getBucketCode().equals(weight.getBucketCode())) + .findFirst(); + if (!first.isPresent()) { + CommonResult.error(400, "设备编码与桶编码不匹配"); + } + } } redisTool.setValue(weight.getBucketCode(), JSONUtil.toJsonStr(weight), 1000 * 60l);//一分钟过期 return CommonResult.success("success"); @@ -585,24 +639,17 @@ public class DeviceController { @ApiOperation("获取实时重量") @PostMapping("/getWeight") public CommonResult getWeight(@RequestBody DeviceBucketVO deviceBucketVO) { -// DeviceStatus deviceStatus = deviceStatusManager.getDeviceStatus(deviceBucketVO.getDeviceCode()); -// List bucketList = deviceStatus.getBucketList(); -// boolean flag = false; -// for (BucketStatus bucketStatus : bucketList) { -// if (bucketStatus.getBucketCode().equals(deviceBucketVO.getBucketCode())) -// flag = true; -// } -// if (!flag) { -// CommonResult.error(400, "设备编码与桶编码不匹配"); -// } - long keyExpire = redisTool.getKeyExpire(deviceBucketVO.getBucketCode(), TimeUnit.SECONDS); - if (keyExpire == -1) { + long expire = redisTool.getKeyExpire(deviceBucketVO.getBucketCode(), TimeUnit.SECONDS); + boolean exist = redisTool.existsKey(deviceBucketVO.getBucketCode()); + if (!exist || expire <= 0) { return CommonResult.error(400, "获取实时重量失败"); } Object value = redisTool.getValue(deviceBucketVO.getBucketCode()); if (value != null) { WeightVO weightVO = JSONUtil.toBean(value.toString(), WeightVO.class); - return CommonResult.success(weightVO); + CommonResult success = CommonResult.success(weightVO); + success.setMsg("success"); + return success; } else { return CommonResult.error(400, "获取重量失败"); } diff --git a/nxhs-service/src/main/java/cc/yunxi/domain/po/RecycleStaffDevice.java b/nxhs-service/src/main/java/cc/yunxi/domain/po/RecycleStaffDevice.java new file mode 100644 index 0000000..1304d8f --- /dev/null +++ b/nxhs-service/src/main/java/cc/yunxi/domain/po/RecycleStaffDevice.java @@ -0,0 +1,58 @@ +package cc.yunxi.domain.po; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import java.util.Date; + +/** + * + * + * @版本: V3.5 + * @版权: 引迈信息技术有限公司(https://www.jnpfsoft.com) + * @作者: JNPF开发平台组 + * @日期: 2024-06-24 + */ +@Data +@TableName("nx_recycle_staff_device") +public class RecycleStaffDevice { + @TableId(value ="ID" ) + private String id; + @TableField(value = "DEVICE_CODE" , updateStrategy = FieldStrategy.IGNORED) + private String deviceCode; + @TableField("STATION_ID") + private String stationId; + @TableField("OPEN_ID") + private String openId; + @TableField("USER_NAME") + private String userName; + @TableField("PHONE") + private String phone; + @TableField(value = "f_creator_time" , fill = FieldFill.INSERT) + private Date creatorTime; + @TableField(value = "f_creator_user_id" , fill = FieldFill.INSERT) + private String creatorUserId; + @TableField(value = "f_last_modify_time" , fill = FieldFill.INSERT_UPDATE) + private Date lastModifyTime; + @TableField(value = "f_last_modify_user_id" , fill = FieldFill.INSERT_UPDATE) + private String lastModifyUserId; + @TableField(value = "f_delete_time" , fill = FieldFill.UPDATE) + private Date deleteTime; + @TableField(value = "f_delete_user_id" , fill = FieldFill.UPDATE) + private String deleteUserId; + @TableField(value = "f_delete_mark" , updateStrategy = FieldStrategy.IGNORED) + private Integer deleteMark; + @TableField("F_TENANT_ID") + private String tenantId; + @TableField(value = "company_id" , fill = FieldFill.INSERT) + private String companyId; + @TableField(value = "department_id" , fill = FieldFill.INSERT) + private String departmentId; + @TableField(value = "organize_json_id" , fill = FieldFill.INSERT) + private String organizeJsonId; + + @TableField(value = "address" ) + private String address; + @TableField("DEVICE_NAME") + private String device_name; +} diff --git a/nxhs-service/src/main/java/cc/yunxi/domain/vo/device/BucketStatus.java b/nxhs-service/src/main/java/cc/yunxi/domain/vo/device/BucketStatus.java index fca7376..62e5914 100644 --- a/nxhs-service/src/main/java/cc/yunxi/domain/vo/device/BucketStatus.java +++ b/nxhs-service/src/main/java/cc/yunxi/domain/vo/device/BucketStatus.java @@ -14,13 +14,15 @@ public class BucketStatus { @ApiModelProperty(value = "桶编码",required = true) @NotBlank(message = "桶编码不能为空") private String bucketCode; - @ApiModelProperty(value = "桶编码",required = true) - @NotNull(message = "桶编码不能为空") + @ApiModelProperty(value = "门号",required = true) + @NotNull(message = "门号不能为空") private Integer doorNum; @ApiModelProperty(value = "投递门状态",required = true) private Boolean deliveryDoor; @ApiModelProperty(value = "清运门状态",required = true) private Boolean cleanDoor; + @ApiModelProperty(value = "烟雾报警", required = true, example = "true") + private Boolean smogAlarm; @ApiModelProperty(value = "是否满",required = true) private Boolean isFull; @ApiModelProperty(value = "重量",required = true) diff --git a/nxhs-service/src/main/java/cc/yunxi/domain/vo/device/DeviceRespVO.java b/nxhs-service/src/main/java/cc/yunxi/domain/vo/device/DeviceRespVO.java index 7ce9a65..5a0ae2b 100644 --- a/nxhs-service/src/main/java/cc/yunxi/domain/vo/device/DeviceRespVO.java +++ b/nxhs-service/src/main/java/cc/yunxi/domain/vo/device/DeviceRespVO.java @@ -22,7 +22,7 @@ public class DeviceRespVO { private String deviceName; @ApiModelProperty(value = "是否开启服务", required = true, example = "1") @NotNull(message = "是否开启服务不能为空") - private Integer userStatus; + private Integer useStatus; @ApiModelProperty(value = "是否开启清理锁", required = true, example = "1") @NotNull(message = "是否开启清理锁不能为空") private Integer cleanLock; diff --git a/nxhs-service/src/main/java/cc/yunxi/domain/vo/device/DeviceStatus.java b/nxhs-service/src/main/java/cc/yunxi/domain/vo/device/DeviceStatus.java index a4101ec..e6ceaa1 100644 --- a/nxhs-service/src/main/java/cc/yunxi/domain/vo/device/DeviceStatus.java +++ b/nxhs-service/src/main/java/cc/yunxi/domain/vo/device/DeviceStatus.java @@ -11,20 +11,15 @@ import java.util.List; @Data @ApiModel("设备状态") public class DeviceStatus { - @ApiModelProperty(value = "设备编码",required = true) + @ApiModelProperty(value = "设备编码", required = true) @NotBlank(message = "设备编码不能为空") private String deviceCode; - - @ApiModelProperty(value = "是否在线") + @ApiModelProperty(value = "是否在线", hidden = true) private Boolean online; - @ApiModelProperty(value = "设备ip地址",required = true) - @NotNull(message = "设备ip地址不能为空") + @ApiModelProperty(value = "设备ip地址", hidden = true) private String ip; - @ApiModelProperty(value = "设备端口",required = true) - @NotNull(message = "设备端口不能为空") + @ApiModelProperty(value = "设备端口", hidden = true) private Integer port; - @ApiModelProperty(value = "烟雾报警", required = true, example = "true") - private Boolean smogAlarm; @ApiModelProperty(value = "桶状态", required = true) private List bucketList; } diff --git a/nxhs-service/src/main/java/cc/yunxi/mapper/RecycleStaffDeviceMapper.java b/nxhs-service/src/main/java/cc/yunxi/mapper/RecycleStaffDeviceMapper.java new file mode 100644 index 0000000..0c6bb70 --- /dev/null +++ b/nxhs-service/src/main/java/cc/yunxi/mapper/RecycleStaffDeviceMapper.java @@ -0,0 +1,9 @@ +package cc.yunxi.mapper; + +import cc.yunxi.domain.po.RecycleStaffDevice; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RecycleStaffDeviceMapper extends BaseMapper { +} diff --git a/nxhs-service/src/main/java/cc/yunxi/service/IRecycleBucketService.java b/nxhs-service/src/main/java/cc/yunxi/service/IRecycleBucketService.java index 59a6be4..228fc80 100644 --- a/nxhs-service/src/main/java/cc/yunxi/service/IRecycleBucketService.java +++ b/nxhs-service/src/main/java/cc/yunxi/service/IRecycleBucketService.java @@ -1,6 +1,7 @@ package cc.yunxi.service; import cc.yunxi.domain.po.RecycleBucket; +import cc.yunxi.domain.vo.device.BucketStatus; import com.baomidou.mybatisplus.extension.service.IService; import javax.validation.constraints.NotBlank; import java.util.List; @@ -11,4 +12,7 @@ public interface IRecycleBucketService extends IService { List getByDeviceCode(@NotBlank(message = "设备编码不能为空") String deviceCode); + int updateStatus(BucketStatus status); + + boolean isChanged(BucketStatus old,BucketStatus now); } diff --git a/nxhs-service/src/main/java/cc/yunxi/service/IRecycleDeviceService.java b/nxhs-service/src/main/java/cc/yunxi/service/IRecycleDeviceService.java index 3c3feec..d3701f9 100644 --- a/nxhs-service/src/main/java/cc/yunxi/service/IRecycleDeviceService.java +++ b/nxhs-service/src/main/java/cc/yunxi/service/IRecycleDeviceService.java @@ -1,6 +1,7 @@ package cc.yunxi.service; import cc.yunxi.domain.po.RecycleDevice; +import cc.yunxi.domain.vo.device.DeviceStatus; import com.baomidou.mybatisplus.extension.service.IService; import javax.validation.constraints.NotBlank; @@ -10,7 +11,9 @@ public interface IRecycleDeviceService extends IService { RecycleDevice getByDeviceCode(@NotBlank String deviceCode); - List getByDeviceName(@NotBlank String companyId); + List getByCompanyId(@NotBlank String companyId); - int updateDevice(); + int updateDevice(DeviceStatus status); + + boolean isChanged(DeviceStatus old, DeviceStatus now); } diff --git a/nxhs-service/src/main/java/cc/yunxi/service/IRecycleStaffDeviceService.java b/nxhs-service/src/main/java/cc/yunxi/service/IRecycleStaffDeviceService.java new file mode 100644 index 0000000..d4db8a2 --- /dev/null +++ b/nxhs-service/src/main/java/cc/yunxi/service/IRecycleStaffDeviceService.java @@ -0,0 +1,9 @@ +package cc.yunxi.service; + +import cc.yunxi.domain.po.RecycleStaffDevice; +import com.baomidou.mybatisplus.extension.service.IService; + +public interface IRecycleStaffDeviceService extends IService { + + RecycleStaffDevice getByDeviceCode(String deviceCode,String phone); +} diff --git a/nxhs-service/src/main/java/cc/yunxi/service/impl/RecycleBucketServiceImpl.java b/nxhs-service/src/main/java/cc/yunxi/service/impl/RecycleBucketServiceImpl.java index f11de79..1da8415 100644 --- a/nxhs-service/src/main/java/cc/yunxi/service/impl/RecycleBucketServiceImpl.java +++ b/nxhs-service/src/main/java/cc/yunxi/service/impl/RecycleBucketServiceImpl.java @@ -1,10 +1,12 @@ package cc.yunxi.service.impl; import cc.yunxi.domain.po.RecycleBucket; +import cc.yunxi.domain.vo.device.BucketStatus; import cc.yunxi.mapper.RecycleBucketMapper; import cc.yunxi.mapper.RecycleDeviceMapper; import cc.yunxi.service.IRecycleBucketService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; @@ -30,4 +32,38 @@ public class RecycleBucketServiceImpl extends ServiceImpl wrapper = new UpdateWrapper<>(); + wrapper.lambda() + .set(RecycleBucket::getCurrentWeight, status.getWeight()) + .set(RecycleBucket::getDeliveryDoorStatus, status.getDeliveryDoor() ? 1 : 0) + .set(RecycleBucket::getCleanDoorStatus, status.getCleanDoor() ? 1 : 0) + .set(RecycleBucket::getFullStatus, status.getIsFull() ? 1 : 0) + .set(RecycleBucket::getSmogStatus, status.getSmogAlarm() ? 1 : 0) + .eq(RecycleBucket::getBucketCode, status.getBucketCode()); + boolean update = this.update(wrapper); + return update ? 1 : 0; + } + + @Override + public boolean isChanged(BucketStatus old, BucketStatus now) { + if (old.getWeight().compareTo(now.getWeight()) != 0) { + return true; + } + if (old.getIsFull() != now.getIsFull()) { + return true; + } + if (old.getSmogAlarm() != now.getSmogAlarm()) { + return true; + } + if (old.getCleanDoor() != now.getCleanDoor()) { + return true; + } + if (old.getDeliveryDoor() != now.getDeliveryDoor()) { + return true; + } + return false; + } } diff --git a/nxhs-service/src/main/java/cc/yunxi/service/impl/RecycleDeviceServiceImpl.java b/nxhs-service/src/main/java/cc/yunxi/service/impl/RecycleDeviceServiceImpl.java index 739078f..ff32ed8 100644 --- a/nxhs-service/src/main/java/cc/yunxi/service/impl/RecycleDeviceServiceImpl.java +++ b/nxhs-service/src/main/java/cc/yunxi/service/impl/RecycleDeviceServiceImpl.java @@ -1,9 +1,11 @@ package cc.yunxi.service.impl; import cc.yunxi.domain.po.RecycleDevice; +import cc.yunxi.domain.vo.device.DeviceStatus; import cc.yunxi.mapper.RecycleDeviceMapper; import cc.yunxi.service.IRecycleDeviceService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; @@ -24,15 +26,26 @@ public class RecycleDeviceServiceImpl extends ServiceImpl getByDeviceName(String companyId) { + public List getByCompanyId(String companyId) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("company_id", companyId); return recycleDeviceMapper.selectList(wrapper); } @Override - public int updateDevice() { - return 0; + public int updateDevice(DeviceStatus status) { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.lambda() + .set(RecycleDevice::getIpAddress, status.getIp()) + .set(RecycleDevice::getStatus, status.getOnline() ? 1 : 0) + .eq(RecycleDevice::getDeviceCode, status.getDeviceCode()); + return update(wrapper) ? 1 : 0; } + @Override + public boolean isChanged(DeviceStatus oldStatus, DeviceStatus newStatus) { + if (!oldStatus.getIp().equals(newStatus.getIp())) return true; + if (oldStatus.getOnline() != newStatus.getOnline()) return true; + return false; + } } diff --git a/nxhs-service/src/main/java/cc/yunxi/service/impl/RecycleStaffDeviceServiceImpl.java b/nxhs-service/src/main/java/cc/yunxi/service/impl/RecycleStaffDeviceServiceImpl.java new file mode 100644 index 0000000..a08a597 --- /dev/null +++ b/nxhs-service/src/main/java/cc/yunxi/service/impl/RecycleStaffDeviceServiceImpl.java @@ -0,0 +1,22 @@ +package cc.yunxi.service.impl; + +import cc.yunxi.domain.po.RecycleStaffDevice; +import cc.yunxi.mapper.RecycleStaffDeviceMapper; +import cc.yunxi.service.IRecycleStaffDeviceService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +@Service +public class RecycleStaffDeviceServiceImpl extends ServiceImpl implements IRecycleStaffDeviceService { + + @Override + public RecycleStaffDevice getByDeviceCode(String deviceCode, String phone) { + QueryWrapper query = new QueryWrapper<>(); + query.lambda() + .eq(RecycleStaffDevice::getDeviceCode, deviceCode) + .eq(RecycleStaffDevice::getPhone, phone) + .last("limit 1"); + return getOne(query); + } +} diff --git a/nxhs-service/src/main/java/cc/yunxi/utils/CommandUtil.java b/nxhs-service/src/main/java/cc/yunxi/utils/CommandUtil.java new file mode 100644 index 0000000..36ff170 --- /dev/null +++ b/nxhs-service/src/main/java/cc/yunxi/utils/CommandUtil.java @@ -0,0 +1,17 @@ +package cc.yunxi.utils; + +import cc.yunxi.common.domain.CommonResult; +import cc.yunxi.domain.vo.device.CommandVO; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; +import org.springframework.stereotype.Component; + +@Component +public class CommandUtil { + + private static final int PORT = 5000; + public CommonResult sendCommand(CommandVO command,String ip){ + String res = HttpUtil.post("http://" + ip + ":" + PORT + "/command", JSONUtil.toJsonStr(command), 1000); + return JSONUtil.toBean(res, CommonResult.class); + } +} diff --git a/nxhs-service/src/main/java/cc/yunxi/utils/DeviceStatusManager.java b/nxhs-service/src/main/java/cc/yunxi/utils/DeviceStatusManager.java deleted file mode 100644 index acbe395..0000000 --- a/nxhs-service/src/main/java/cc/yunxi/utils/DeviceStatusManager.java +++ /dev/null @@ -1,60 +0,0 @@ -package cc.yunxi.utils; - -import cc.yunxi.domain.vo.device.DeviceStatus; -import cn.hutool.json.JSONUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; - - -@Slf4j -@Component -public class DeviceStatusManager { - - @Resource - private RedisTool redisTool; - - public void putDeviceStatus(DeviceStatus des) { - String deviceCode = des.getDeviceCode(); - Object value = redisTool.getValue(deviceCode); - long keyExpire = redisTool.getKeyExpire(deviceCode, TimeUnit.SECONDS); - log.info("设备编码:{} 缓存过期时间:{}", deviceCode, keyExpire); - if (null == value) { - log.info("设备编码:{} 不存在,放入redis", deviceCode); - } else { - DeviceStatus status = JSONUtil.toBean(value.toString(), DeviceStatus.class); - boolean changed = isDeviceStatusChanged(status, des); - if (changed) { - //todo 更新数据库 - } - } - redisTool.setValue(deviceCode, JSONUtil.toJsonStr(des), 60 * 1000L); - log.info("设备状态信息:{} 状态信息已存在,更新缓存", deviceCode); - - } - - public DeviceStatus getDeviceStatus(String deviceCode) { - Object value = redisTool.getValue(deviceCode); - if (null != value) { - return JSONUtil.toBean(value.toString(), DeviceStatus.class); - } - return null; - } - - private boolean isDeviceStatusChanged(DeviceStatus old, DeviceStatus now) { - boolean flag = false; - if (old.getIp() != now.getIp()) { - flag = true; - } - if (old.getSmogAlarm() != now.getSmogAlarm()) { - flag = true; - } - - return flag; - } -} \ No newline at end of file diff --git a/nxhs-service/src/main/resources/mapper/RecycleStaffDeviceMapper.xml b/nxhs-service/src/main/resources/mapper/RecycleStaffDeviceMapper.xml new file mode 100644 index 0000000..d8feed5 --- /dev/null +++ b/nxhs-service/src/main/resources/mapper/RecycleStaffDeviceMapper.xml @@ -0,0 +1,6 @@ + + + + + +