|
|
|
@ -8,25 +8,26 @@ 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.service.impl.CommonService;
|
|
|
|
|
import cc.yunxi.utils.DeviceStatusManager;
|
|
|
|
|
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.ApiModelProperty;
|
|
|
|
|
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 javax.annotation.Resource;
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
import java.time.LocalDateTime;
|
|
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* <p>
|
|
|
|
@ -63,13 +64,68 @@ public class DeviceController {
|
|
|
|
|
private IClientService clientService;
|
|
|
|
|
@Resource
|
|
|
|
|
private ICommonService commonService;
|
|
|
|
|
@Resource
|
|
|
|
|
private RedisTool redisTool;
|
|
|
|
|
|
|
|
|
|
@Resource
|
|
|
|
|
private IFileService fileService;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ApiOperation("小程序获取设备配置")
|
|
|
|
|
@PostMapping("/getDeviceConfig")
|
|
|
|
|
public CommonResult<Map<String, Object>> getDeviceConfig(@RequestBody DeviceVO deviceVO) {
|
|
|
|
|
RecycleDevice device = deviceService.getByDeviceCode(deviceVO.getDeviceCode());
|
|
|
|
|
if (device == null) {
|
|
|
|
|
return CommonResult.error(404, "设备不存在");
|
|
|
|
|
}
|
|
|
|
|
if (device.getStatus() != 1) {
|
|
|
|
|
return CommonResult.error(404, "当前设备已暂停服务");
|
|
|
|
|
}
|
|
|
|
|
RecycleDeviceConfig config = configService.getByCompanyId(device.getBeLongCompanyId());
|
|
|
|
|
if (config == null) {
|
|
|
|
|
return CommonResult.error(404, "设备未配置配置项!!");
|
|
|
|
|
}
|
|
|
|
|
List<RecycleBucket> buckets = bucketService.getByDeviceCode(deviceVO.getDeviceCode());
|
|
|
|
|
if (buckets.size() == 0) {
|
|
|
|
|
return CommonResult.error(404, "当前设备没有桶配置清单!!");
|
|
|
|
|
}
|
|
|
|
|
Map<String, Object> result = new HashMap<>();
|
|
|
|
|
result.put("deviceCode", device.getDeviceCode());//设备代码
|
|
|
|
|
result.put("deviceName", deviceVO.getDeviceCode());//设备名称
|
|
|
|
|
result.put("userStatus", device.getUseStatus());//设备状态
|
|
|
|
|
List<Object> list = new ArrayList<>();
|
|
|
|
|
for (RecycleBucket bucket : buckets) {
|
|
|
|
|
Map<String, Object> _bucket = new HashMap<>();
|
|
|
|
|
_bucket.put("bucketCode", bucket.getBucketCode());//桶编码
|
|
|
|
|
_bucket.put("doorNum", bucket.getDoorNum());//门号
|
|
|
|
|
_bucket.put("showOrd", bucket.getShowOrd());//显示顺序
|
|
|
|
|
_bucket.put("productCode", bucket.getProductCode());//
|
|
|
|
|
_bucket.put("productSubCode", bucket.getProductSubCode());//
|
|
|
|
|
_bucket.put("isShow", bucket.getIsShow());//是否显示
|
|
|
|
|
_bucket.put("showName", bucket.getShowName());//显示名称
|
|
|
|
|
BigDecimal price = calculatePrice(bucket, config);//综合计算价格
|
|
|
|
|
_bucket.put("price", price);//价格
|
|
|
|
|
_bucket.put("currentWeight", bucket.getCurrentWeight());//当前重量
|
|
|
|
|
BigDecimal warningWeight = config.getWarningWeight();
|
|
|
|
|
if (null != warningWeight && warningWeight.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
|
|
_bucket.put("warningWeight", warningWeight);//报警重量
|
|
|
|
|
}
|
|
|
|
|
BigDecimal weight = bucket.getWarningWeight();
|
|
|
|
|
if (null != weight && weight.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
|
|
_bucket.put("warningWeight", weight);//报警重量
|
|
|
|
|
}
|
|
|
|
|
_bucket.put("closeDelay", bucket.getCloseDelay());//关门时延
|
|
|
|
|
_bucket.put("bagNo", bucket.getBagNo());//垃圾袋编号
|
|
|
|
|
list.add(_bucket);
|
|
|
|
|
}
|
|
|
|
|
result.put("bucketList", list);
|
|
|
|
|
return CommonResult.success(result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//获取设备配置
|
|
|
|
|
@PostMapping("/conf")
|
|
|
|
|
@ApiModelProperty("获取设备配置")
|
|
|
|
|
@ApiOperation("机柜获取设备配置")
|
|
|
|
|
public CommonResult<DeviceRespVO> conf(@RequestBody DeviceVO deviceVO) {
|
|
|
|
|
CommonResult<DeviceRespVO> result = new CommonResult<>();
|
|
|
|
|
DeviceRespVO respVO = new DeviceRespVO();
|
|
|
|
@ -114,9 +170,9 @@ public class DeviceController {
|
|
|
|
|
_bucket.setBucketCode(bucket.getBucketCode());
|
|
|
|
|
_bucket.setDoorNum(bucket.getDoorNum());
|
|
|
|
|
_bucket.setOrdNum(bucket.getShowOrd());
|
|
|
|
|
_bucket.setCode(bucket.getProductCode());
|
|
|
|
|
_bucket.setSubCode(bucket.getProductSubCode());
|
|
|
|
|
_bucket.setShowText(bucket.getShowName());
|
|
|
|
|
_bucket.setProductCode(bucket.getProductCode());
|
|
|
|
|
_bucket.setProductSubCode(bucket.getProductSubCode());
|
|
|
|
|
_bucket.setShowName(bucket.getShowName());
|
|
|
|
|
_bucket.setPrice(price);
|
|
|
|
|
_bucket.setSingleWeightLimit(BigDecimal.ZERO);
|
|
|
|
|
_bucket.setTotalWeightLimit(bucket.getWarningWeight());
|
|
|
|
@ -222,7 +278,7 @@ public class DeviceController {
|
|
|
|
|
|
|
|
|
|
//手机号登录
|
|
|
|
|
@PostMapping("/customerLogin")
|
|
|
|
|
@ApiModelProperty("投递员手机号登录")
|
|
|
|
|
@ApiOperation("投递员手机号登录")
|
|
|
|
|
public CommonResult<LoginRespVO> customerLogin(@RequestBody LoginReqVO loginReqVO) {
|
|
|
|
|
CommonResult<LoginRespVO> result = new CommonResult<>();
|
|
|
|
|
Client client = clientService.getLastestClientByPhone(loginReqVO.getPhone());
|
|
|
|
@ -246,7 +302,7 @@ public class DeviceController {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@PostMapping("/customerLogin")
|
|
|
|
|
@ApiModelProperty("清运员手机号登录")
|
|
|
|
|
@ApiOperation("清运员手机号登录")
|
|
|
|
|
public CommonResult<LoginRespVO> cleanerLogin(@RequestBody LoginReqVO loginReqVO) {
|
|
|
|
|
|
|
|
|
|
Recycler recycler = recyclerService.getRecyclerByPhoneNumber(loginReqVO.getPhone());
|
|
|
|
@ -278,7 +334,7 @@ public class DeviceController {
|
|
|
|
|
|
|
|
|
|
//投递重量上传
|
|
|
|
|
@PostMapping("/delivery")
|
|
|
|
|
@ApiModelProperty("投递订单上传")
|
|
|
|
|
@ApiOperation("投递订单上传")
|
|
|
|
|
public CommonResult<String> delivery(@RequestBody DeliveryOrderVO orderVO) {
|
|
|
|
|
// UserDTO user = UserContext.getUser();
|
|
|
|
|
RecycleDevice device = deviceService.getByDeviceCode(orderVO.getDeviceCode());
|
|
|
|
@ -333,7 +389,7 @@ public class DeviceController {
|
|
|
|
|
|
|
|
|
|
//清运重量上传
|
|
|
|
|
@PostMapping("/clean")
|
|
|
|
|
@ApiModelProperty("清运订单上传")
|
|
|
|
|
@ApiOperation("清运订单上传")
|
|
|
|
|
public CommonResult<String> clean(@RequestBody CleanOrderVO orderVO) {
|
|
|
|
|
UserDTO user = UserContext.getUser();
|
|
|
|
|
RecycleDevice device = deviceService.getByDeviceCode(orderVO.getDeviceCode());
|
|
|
|
@ -388,7 +444,7 @@ public class DeviceController {
|
|
|
|
|
|
|
|
|
|
//设备事件上报
|
|
|
|
|
@PostMapping("/event")
|
|
|
|
|
@ApiModelProperty("设备事件上报")
|
|
|
|
|
@ApiOperation("设备事件上报")
|
|
|
|
|
public CommonResult<String> event(@RequestBody DeviceEventVO eventVO) {
|
|
|
|
|
RecycleDevice device = deviceService.getByDeviceCode(eventVO.getDeviceCode());
|
|
|
|
|
|
|
|
|
@ -412,32 +468,25 @@ public class DeviceController {
|
|
|
|
|
|
|
|
|
|
//设备心跳上报
|
|
|
|
|
@PostMapping("/heartbeat")
|
|
|
|
|
@ApiModelProperty("设备心跳上报")
|
|
|
|
|
public CommonResult<String> heartbeat(@RequestParam String deviceCode, HttpServletRequest request) {
|
|
|
|
|
String remoteAddr = request.getRemoteAddr();
|
|
|
|
|
DeviceStatus des = new DeviceStatus();
|
|
|
|
|
des.setDeviceCode(deviceCode);
|
|
|
|
|
des.setIp(remoteAddr);
|
|
|
|
|
des.setHeartBeat(LocalDateTime.now());
|
|
|
|
|
@ApiOperation("设备心跳上报")
|
|
|
|
|
public CommonResult<String> heartbeat(@RequestBody DeviceStatus des) {
|
|
|
|
|
deviceStatusManager.putDeviceStatus(des);
|
|
|
|
|
log.info("设备心跳上报成功,设备编码:{}", deviceCode);
|
|
|
|
|
return CommonResult.success(deviceCode);
|
|
|
|
|
return CommonResult.success(des.getDeviceCode());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ApiModelProperty("设备命令下发")
|
|
|
|
|
@ApiOperation("设备命令下发")
|
|
|
|
|
@PostMapping("/command")
|
|
|
|
|
public CommonResult<String> command(@RequestBody CommandVO commandVO) {
|
|
|
|
|
String deviceCode = commandVO.getDeviceCode();
|
|
|
|
|
UserDTO user = UserContext.getUser();
|
|
|
|
|
public CommonResult<String> command(@RequestBody CommandVO cmd) {
|
|
|
|
|
String deviceCode = cmd.getDeviceCode();
|
|
|
|
|
DeviceStatus status = deviceStatusManager.getDeviceStatus(deviceCode);
|
|
|
|
|
|
|
|
|
|
// 判断设备是否在线
|
|
|
|
|
Boolean online = status.getOnline();
|
|
|
|
|
if (!online) return CommonResult.error(400, "设备不在线");
|
|
|
|
|
|
|
|
|
|
String ip = status.getIp();
|
|
|
|
|
// 下发指令
|
|
|
|
|
String res = HttpUtil.post("http://" + ip + "/command", JSONUtil.toJsonStr(commandVO), 1000);
|
|
|
|
|
String ip = status.getIp();
|
|
|
|
|
Integer port = status.getPort();
|
|
|
|
|
String res = HttpUtil.post("http://" + ip + ":" + port + "/command", JSONUtil.toJsonStr(cmd), 1000);
|
|
|
|
|
|
|
|
|
|
// 记录指令下发事件
|
|
|
|
|
CommonResult _result = JSONUtil.toBean(res, CommonResult.class);
|
|
|
|
|
RecycleDeviceEvent event = new RecycleDeviceEvent();
|
|
|
|
@ -454,6 +503,7 @@ public class DeviceController {
|
|
|
|
|
} else {
|
|
|
|
|
event.setEventResult("0");
|
|
|
|
|
}
|
|
|
|
|
UserDTO user = UserContext.getUser();
|
|
|
|
|
event.setCreateUserId(user.getId());
|
|
|
|
|
event.setCreateTime(new Date());
|
|
|
|
|
event.setCompanyId(user.getCompanyId());
|
|
|
|
@ -463,7 +513,7 @@ public class DeviceController {
|
|
|
|
|
return _result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ApiModelProperty("获取设备状态")
|
|
|
|
|
@ApiOperation("获取设备状态")
|
|
|
|
|
@PostMapping("/status")
|
|
|
|
|
public CommonResult<String> command(@RequestBody DeviceVO deviceVO) {
|
|
|
|
|
String deviceCode = deviceVO.getDeviceCode();
|
|
|
|
@ -476,15 +526,66 @@ public class DeviceController {
|
|
|
|
|
// 判断设备是否在线
|
|
|
|
|
Boolean online = status.getOnline();
|
|
|
|
|
if (!online) return CommonResult.error(400, "设备不在线");
|
|
|
|
|
String post = HttpUtil.post("http://" + status.getIp() + "/command", JSONUtil.toJsonStr(cmd), 1000);
|
|
|
|
|
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, "获取状态失败");
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
return CommonResult.error(400, json.getStr("msg"));
|
|
|
|
|
}
|
|
|
|
|
return CommonResult.success("状态已更新", "success");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ApiOperation("接收实时重量")
|
|
|
|
|
@PostMapping("/weight")
|
|
|
|
|
public CommonResult<String> weight(@RequestBody WeightVO weight) {
|
|
|
|
|
DeviceStatus deviceStatus = deviceStatusManager.getDeviceStatus(weight.getDeviceCode());
|
|
|
|
|
List<BucketStatus> bucketList = deviceStatus.getBucketList();
|
|
|
|
|
boolean flag = false;
|
|
|
|
|
for (BucketStatus bucketStatus : bucketList) {
|
|
|
|
|
if (bucketStatus.getBucketCode().equals(weight.getBucketCode()))
|
|
|
|
|
flag = true;
|
|
|
|
|
}
|
|
|
|
|
if (!flag) {
|
|
|
|
|
CommonResult.error(400, "设备编码与桶编码不匹配");
|
|
|
|
|
}
|
|
|
|
|
redisTool.setValue(weight.getBucketCode(), JSONUtil.toJsonStr(weight), 1000 * 60l);//一分钟过期
|
|
|
|
|
return CommonResult.success("success");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ApiOperation("获取实时重量")
|
|
|
|
|
@PostMapping("/getWeight")
|
|
|
|
|
public CommonResult<WeightVO> getWeight(@RequestBody DeviceBucketVO deviceBucketVO) {
|
|
|
|
|
// DeviceStatus deviceStatus = deviceStatusManager.getDeviceStatus(deviceBucketVO.getDeviceCode());
|
|
|
|
|
// List<BucketStatus> 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) {
|
|
|
|
|
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);
|
|
|
|
|
} else {
|
|
|
|
|
return CommonResult.error(400, "获取重量失败");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|