设备对接 init

master
guochaojie 4 months ago
parent 344776a768
commit 0cbe9be165

@ -2,27 +2,31 @@ package cc.yunxi.controller;
import cc.yunxi.common.domain.CommonResult;
import cc.yunxi.common.utils.BeanUtils;
import cc.yunxi.common.utils.WebUtils;
import cc.yunxi.domain.dto.QrCodeDTO;
import cc.yunxi.domain.vo.device.RecycleDeviceOpenDoorReqVO;
import cc.yunxi.domain.vo.device.RecycleDeviceRespVO;
import cc.yunxi.domain.vo.device.RecycleDeviceRespVO.RecycleDeviceDoorVO;
import cc.yunxi.domain.po.RecycleBucket;
import cc.yunxi.domain.po.RecycleDevice;
import cc.yunxi.domain.po.RecycleDeviceConfig;
import cc.yunxi.domain.vo.device.*;
import cc.yunxi.domain.vo.file.FileUploadRespVO;
import cc.yunxi.service.IFileService;
import cc.yunxi.service.IRecycleBucketService;
import cc.yunxi.service.IRecycleDeviceConfigService;
import cc.yunxi.service.IRecycleDeviceService;
import cc.yunxi.utils.DeviceStatusManager;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.SneakyThrows;
import io.swagger.annotations.ApiModelProperty;
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.io.IOException;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import java.util.Map;
/**
* <p>
@ -36,84 +40,146 @@ import java.util.Map;
@RestController
@RequestMapping("/device")
@Slf4j
@Validated
public class DeviceController {
@Resource
private IRecycleDeviceService deviceService;
private static final String OPEN_API_URL = "https://dev-api.zsgai.com/open_api/open_door_for_devsn";
@ApiOperation("设备状态上报")
@PostMapping("/device_state")
public CommonResult<String> deviceState(HttpServletRequest request) throws Exception {
// 1. 参数解析处理
Map<String, String> dataMap = WebUtils.parseQueryString(request);
String listDoor = dataMap.remove("listDoor");
RecycleDeviceRespVO recycleDeviceRespVO = BeanUtils.copyBean(dataMap, RecycleDeviceRespVO.class);
if(StrUtil.isNotEmpty(listDoor)) {
JSONArray jsonArray = JSONUtil.parseArray(listDoor);
List<RecycleDeviceDoorVO> deviceDoorVOList = BeanUtils.copyList(jsonArray, RecycleDeviceDoorVO.class);
recycleDeviceRespVO.setListDoor(deviceDoorVOList);
private DeviceStatusManager deviceStatusManager;
@Resource
private IRecycleDeviceService recycleDeviceService;
@Resource
private IRecycleDeviceConfigService recycleDeviceConfigService;
@Resource
private IRecycleBucketService recycleBucketService;
@Resource
private IFileService fileService;
//获取设备配置
@PostMapping("/conf")
@ApiModelProperty("获取设备配置")
public CommonResult<DeviceRespVO> conf(@RequestBody DeviceVO deviceVO) {
CommonResult<DeviceRespVO> result = new CommonResult<>();
DeviceRespVO respVO = new DeviceRespVO();
RecycleDevice device = recycleDeviceService.getByDeviceCode(deviceVO.getDeviceCode());
if (device == null) {
return result.error(400, "设备不存在");
}
String companyId = device.getBeLongCompanyId();
if (StrUtil.isBlank(companyId)) {
return result.error(400, "设备未绑定公司,还未投用!!");
}
RecycleDeviceConfig config = recycleDeviceConfigService.getByCompanyId(companyId);
if (config == null) {
return result.error(400, "设备未配置!!");
}
log.info("recycleDeviceRespVO = {}", recycleDeviceRespVO);
deviceService.saveDeviceInfo(recycleDeviceRespVO);
return CommonResult.success("ok");
List<RecycleBucket> buckets = recycleBucketService.getByDeviceCode(deviceVO.getDeviceCode());
if (buckets.size() == 0) {
return result.error(400, "当前设备没有桶配置清单!!");
}
respVO.setDeviceCode(device.getDeviceCode());
respVO.setDeviceName(device.getDeviceName());
respVO.setUserStatus(device.getUseStatus());
respVO.setCleanLock(Integer.valueOf(config.getCleanLock()));
respVO.setUsePhoneLogin(config.getAllowPhoneLogin());
ArrayList<DeviceRespVO.Bucket> list = new ArrayList<>();
for (RecycleBucket bucket : buckets) {
DeviceRespVO.Bucket _bucket = new DeviceRespVO.Bucket();
_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.setPrice(bucket.getPrice());
_bucket.setSingleWeightLimit(BigDecimal.ZERO);
_bucket.setTotalWeightLimit(bucket.getWarningWeight());
_bucket.setSmokeAlarm(bucket.getSmogSet());
_bucket.setFullAlarm(bucket.getFullSet());
String bucketImg = bucket.getBucketImg();
List<FileUploadRespVO> img = JSONUtil.toList(bucketImg, FileUploadRespVO.class);
if (img.size() > 0) {
FileUploadRespVO file = img.get(0);
byte[] bytes = fileService.download(file.getUrl());
String base64 = fileService.encodeToBase64(bytes);
_bucket.setImage(base64);
}
list.add(_bucket);
}
respVO.setBucketList(list);
respVO.setPromotionSet(config.getPromotionSet());
respVO.setSlogan(config.getPromotionSlogans());
ArrayList<DeviceRespVO.Poster> posters = new ArrayList<>();
String pics = config.getPromotionPic1();
List<FileUploadRespVO> files = JSONUtil.toList(pics, FileUploadRespVO.class);
for (int i = 0; i < files.size(); i++) {
FileUploadRespVO file = files.get(i);
DeviceRespVO.Poster poster = new DeviceRespVO.Poster();
byte[] bytes = fileService.download(file.getUrl());
String base64 = fileService.encodeToBase64(bytes);
poster.setShowOrd(i);
poster.setImage(base64);
posters.add(poster);
}
respVO.setPosterList(posters);
result.setData(respVO);
return result;
}
//手机号登录
@PostMapping("/login")
@ApiModelProperty("手机号登录")
public CommonResult<LoginRespVO> login(@RequestBody LoginReqVO loginReqVO) {
CommonResult<LoginRespVO> result = new CommonResult<>();
@ApiOperation("请求登陆")
@GetMapping("/login_name")
public CommonResult<String> loginName(@RequestBody QrCodeDTO qrCodeDTO) {
// 处理数据
String devsn = qrCodeDTO.getDevsn();
Integer devid = qrCodeDTO.getDevid();
return CommonResult.success("ok");
return result;
}
//投递重量上传
@PostMapping("/delivery")
@ApiModelProperty("投递订单上传")
public CommonResult<String> delivery(@RequestBody DeliveryOrderVO orderVO) {
@SneakyThrows
@ApiOperation("开门")
@GetMapping("/open_door_for_devsn")
public CommonResult<String> openDoor(@RequestBody RecycleDeviceOpenDoorReqVO recycleDeviceOpenDoorReqVO) {
// devUserId
return CommonResult.success("ok");
return null;
}
@SneakyThrows
@ApiOperation("关门")
@GetMapping("/close_door_for_devsn")
public CommonResult<String> closeDoor(HttpServletRequest request) {
String queryString = request.getQueryString();
String parameters = WebUtils.getParameters(request);
String requestBody = WebUtils.getRequestPostStr(request);
log.info("deliveryData receive params = {}", parameters);
log.info("deliveryData receive json = {}", requestBody);
return CommonResult.success(queryString);
//清运重量上传
@PostMapping("/clean")
@ApiModelProperty("清运订单上传")
public CommonResult<String> clean(@RequestBody CleanOrderVO orderVO) {
return null;
}
//设备事件上报
@PostMapping("/event")
@ApiModelProperty("设备事件上报")
public CommonResult<String> event(@RequestBody DeviceEventVO eventVO) {
CommonResult<String> result = new CommonResult<>();
return result;
}
@SneakyThrows
@ApiOperation("上传投递重量")
@GetMapping("/delivery_data")
public CommonResult<String> deliveryData(HttpServletRequest request) {
String queryString = request.getQueryString();
String parameters = WebUtils.getParameters(request);
String requestBody = WebUtils.getRequestPostStr(request);
log.info("deliveryData receive params = {}", parameters);
log.info("deliveryData receive json = {}", requestBody);
return CommonResult.success(queryString);
//设备心跳上报
@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());
deviceStatusManager.putDeviceStatus(des);
log.info("设备心跳上报成功,设备编码:{}", deviceCode);
return CommonResult.success(deviceCode);
}
@ApiModelProperty("设备命令下发")
@PostMapping("/command")
public CommonResult<String> command(@RequestBody CommandVO commandVO) {
@SneakyThrows
@ApiOperation("上传清运重量")
@GetMapping("/clean_data")
public CommonResult<String> cleanData(HttpServletRequest request) {
String queryString = request.getQueryString();
String parameters = WebUtils.getParameters(request);
String requestBody = WebUtils.getRequestPostStr(request);
log.info("cleanData receive params = {}", parameters);
log.info("cleanData receive json = {}", requestBody);
return CommonResult.success(queryString);
//todo 记录指令下发事件
return null;
}
}

@ -1,49 +1,24 @@
package cc.yunxi.controller;
import cc.yunxi.aspect.UserTypeAnnotation;
import cc.yunxi.common.domain.CommonResult;
import cc.yunxi.common.domain.PageDTO;
import cc.yunxi.common.utils.BeanUtils;
import cc.yunxi.common.utils.WebUtils;
import cc.yunxi.domain.dto.UserDTO;
import cc.yunxi.domain.dto.WxLoginDTO;
import cc.yunxi.domain.dto.ZSGLoginDTO;
import cc.yunxi.domain.po.Client;
import cc.yunxi.domain.po.ClientAccountDetail;
import cc.yunxi.domain.query.ClientAccountQuery;
import cc.yunxi.domain.query.ClientQuery;
import cc.yunxi.domain.vo.client.ClientAccountRespVO;
import cc.yunxi.domain.vo.client.ClientRespVO;
import cc.yunxi.domain.vo.client.ClientUpdateVO;
import cc.yunxi.domain.vo.device.RecycleDeviceOpenDoorReqVO;
import cc.yunxi.domain.vo.device.RecycleDeviceRespVO;
import cc.yunxi.domain.vo.file.FileUploadReqVO;
import cc.yunxi.domain.vo.file.FileUploadRespVO;
import cc.yunxi.enums.UserTypeEnum;
import cc.yunxi.service.*;
import cc.yunxi.service.IFileService;
import cc.yunxi.service.impl.CommonService;
import cc.yunxi.utils.RestTemplateUtils;
import cc.yunxi.utils.UserContext;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
@ -66,17 +41,17 @@ public class EntranceController {
@Resource
private CommonService commonService;
@Resource
private IRecycleDeviceService deviceService;
// @Resource
// private IRecycleDeviceService deviceService;
@Resource
private final IFileService fileService;
@Resource
private IRecycleDevicePhotoService recycleDevicePhotoService;
// @Resource
// private IRecycleDevicePhotoService recycleDevicePhotoService;
@Resource
private IRecycleDeviceRunningDataService recycleDeviceRunningDataService;
// @Resource
// private IRecycleDeviceRunningDataService recycleDeviceRunningDataService;
@ApiOperation("回收柜二维码请求设备信息接口")
@ -94,22 +69,22 @@ public class EntranceController {
return CommonResult.success(zsgLoginDTO,"请求成功");
}
@ApiOperation("回收柜设备状态上报")
@RequestMapping("/device_state")
public CommonResult<String> ZSG_DeviceState(HttpServletRequest request) throws Exception {
// 1. 参数解析处理
Map<String, String> dataMap = WebUtils.parseQueryString(request);
String listDoor = dataMap.remove("listDoor");
RecycleDeviceRespVO recycleDeviceRespVO = BeanUtils.copyBean(dataMap, RecycleDeviceRespVO.class);
if(StrUtil.isNotEmpty(listDoor)) {
JSONArray jsonArray = JSONUtil.parseArray(listDoor);
List<RecycleDeviceRespVO.RecycleDeviceDoorVO> deviceDoorVOList = BeanUtils.copyList(jsonArray, RecycleDeviceRespVO.RecycleDeviceDoorVO.class);
recycleDeviceRespVO.setListDoor(deviceDoorVOList);
}
log.info("recycleDeviceRespVO = {}", recycleDeviceRespVO);
deviceService.saveDeviceInfo(recycleDeviceRespVO);
return CommonResult.success("ok");
}
// @ApiOperation("回收柜设备状态上报")
// @RequestMapping("/device_state")
// public CommonResult<String> ZSG_DeviceState(HttpServletRequest request) throws Exception {
// // 1. 参数解析处理
// Map<String, String> dataMap = WebUtils.parseQueryString(request);
// String listDoor = dataMap.remove("listDoor");
// RecycleDeviceRespVO recycleDeviceRespVO = BeanUtils.copyBean(dataMap, RecycleDeviceRespVO.class);
// if(StrUtil.isNotEmpty(listDoor)) {
// JSONArray jsonArray = JSONUtil.parseArray(listDoor);
// List<RecycleDeviceRespVO.RecycleDeviceDoorVO> deviceDoorVOList = BeanUtils.copyList(jsonArray, RecycleDeviceRespVO.RecycleDeviceDoorVO.class);
// recycleDeviceRespVO.setListDoor(deviceDoorVOList);
// }
// log.info("recycleDeviceRespVO = {}", recycleDeviceRespVO);
// deviceService.saveDeviceInfo(recycleDeviceRespVO);
// return CommonResult.success("ok");
// }
@SneakyThrows
@ApiOperation("开门")
@GetMapping("/open_door_for_devsn")
@ -144,49 +119,49 @@ public class EntranceController {
return CommonResult.success("ok");
}
@ApiOperation("投递照片上传")
@PostMapping(value ="/device/file/delivery_photo", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public CommonResult<String> ZSG_DeliveryPhoto(@RequestParam(name="orderid ",required = true) String orderid,@RequestBody FileUploadReqVO uploadReqVO) {
FileUploadRespVO uploadRespVO = fileService.uploadImage(uploadReqVO);
recycleDevicePhotoService.addRecycleDevicePhoto(orderid,uploadRespVO.getUrl());
return CommonResult.success("请求成功");
}
@ApiOperation("清运照片上传")
@PostMapping(value ="/device/file/clean_photo", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public CommonResult<String> ZSG_CleanPhoto(@RequestParam(name="orderid ",required = true) String orderid,@RequestBody FileUploadReqVO uploadReqVO) {
FileUploadRespVO uploadRespVO = fileService.uploadImage(uploadReqVO);
recycleDevicePhotoService.addRecycleDevicePhoto(orderid,uploadRespVO.getUrl());
return CommonResult.success("请求成功");
}
@ApiOperation("上传投递重量")
@PostMapping(value ="/delivery_data")
public CommonResult<String> ZSG_DeliveryData(HttpServletRequest request) throws Exception {
// 1. 参数解析处理
Map<String, String> dataMap = WebUtils.parseQueryString(request);
RecycleDeviceRespVO recycleDeviceRespVO = BeanUtils.copyBean(dataMap, RecycleDeviceRespVO.class);
// 2. 保存数据
recycleDeviceRunningDataService.addRecycleDeviceRunningData(recycleDeviceRespVO,1);
return CommonResult.success("上传成功");
}
@ApiOperation("上传清运重量")
@PostMapping(value ="/clean_data")
public CommonResult<String> ZSG_CleanData(HttpServletRequest request) throws Exception {
// 1. 参数解析处理
Map<String, String> dataMap = WebUtils.parseQueryString(request);
RecycleDeviceRespVO recycleDeviceRespVO = BeanUtils.copyBean(dataMap, RecycleDeviceRespVO.class);
// 2. 保存数据
recycleDeviceRunningDataService.addRecycleDeviceRunningData(recycleDeviceRespVO,2);
return CommonResult.success("上传成功");
}
// @ApiOperation("投递照片上传")
// @PostMapping(value ="/device/file/delivery_photo", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
// public CommonResult<String> ZSG_DeliveryPhoto(@RequestParam(name="orderid ",required = true) String orderid,@RequestBody FileUploadReqVO uploadReqVO) {
// FileUploadRespVO uploadRespVO = fileService.uploadImage(uploadReqVO);
//
// recycleDevicePhotoService.addRecycleDevicePhoto(orderid,uploadRespVO.getUrl());
// return CommonResult.success("请求成功");
// }
// @ApiOperation("清运照片上传")
// @PostMapping(value ="/device/file/clean_photo", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
// public CommonResult<String> ZSG_CleanPhoto(@RequestParam(name="orderid ",required = true) String orderid,@RequestBody FileUploadReqVO uploadReqVO) {
// FileUploadRespVO uploadRespVO = fileService.uploadImage(uploadReqVO);
// recycleDevicePhotoService.addRecycleDevicePhoto(orderid,uploadRespVO.getUrl());
// return CommonResult.success("请求成功");
// }
// @ApiOperation("上传投递重量")
// @PostMapping(value ="/delivery_data")
// public CommonResult<String> ZSG_DeliveryData(HttpServletRequest request) throws Exception {
//
// // 1. 参数解析处理
// Map<String, String> dataMap = WebUtils.parseQueryString(request);
//
// RecycleDeviceRespVO recycleDeviceRespVO = BeanUtils.copyBean(dataMap, RecycleDeviceRespVO.class);
//
// // 2. 保存数据
// recycleDeviceRunningDataService.addRecycleDeviceRunningData(recycleDeviceRespVO,1);
//
// return CommonResult.success("上传成功");
// }
// @ApiOperation("上传清运重量")
// @PostMapping(value ="/clean_data")
// public CommonResult<String> ZSG_CleanData(HttpServletRequest request) throws Exception {
// // 1. 参数解析处理
// Map<String, String> dataMap = WebUtils.parseQueryString(request);
//
// RecycleDeviceRespVO recycleDeviceRespVO = BeanUtils.copyBean(dataMap, RecycleDeviceRespVO.class);
//
// // 2. 保存数据
// recycleDeviceRunningDataService.addRecycleDeviceRunningData(recycleDeviceRespVO,2);
//
// return CommonResult.success("上传成功");
// }
}

@ -0,0 +1,128 @@
package cc.yunxi.domain.po;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.util.Date;
/**
*
*
*/
@Data
@TableName("nx_recycle_bucket")
@ApiModel(value = "RecycleBucket", description = "回收桶配置")
@EqualsAndHashCode(callSuper = false)
public class RecycleBucket {
@TableId(value = "ID", type = IdType.ASSIGN_UUID)
private String id;
@TableField(value = "BUCKET_CODE")
@ApiModelProperty("回收桶编码")
private String bucketCode;
@TableField(value = "SHOW_NAME")
@ApiModelProperty("显示名字")
private String showName;
@TableField(value = "DOOR_NUM")
@ApiModelProperty("桶编号")
private Integer doorNum;
@TableField(value = "DEVICE_CODE")
@ApiModelProperty("设备编码")
private String deviceCode;
@TableField(value = "IS_SHOW")
@ApiModelProperty("是否显示")
private Integer isShow;
@TableField(value = "SHOW_ORD")
@ApiModelProperty("显示顺序")
private Integer showOrd;
@TableField(value = "PRODUCT_CODE")
@ApiModelProperty("产品编码")
private String productCode;
@TableField(value = "PRODUCT_SUB_CODE")
@ApiModelProperty("产品子编码")
private String productSubCode;
@TableField(value = "PRICE")
@ApiModelProperty("单价")
private BigDecimal price;
@TableField(value = "FULL_STATUS")
@ApiModelProperty("满溢状态")
private Integer fullStatus;
@TableField(value = "FULL_SET")
@ApiModelProperty(value = "满溢报警 0:关闭1开启", allowableValues = "0,1")
private Integer fullSet;
@TableField(value = "SMOG_STATUS")
@ApiModelProperty(value = "烟雾报警状态 0:关闭1开启", allowableValues = "0,1")
private Integer smogStatus;
@TableField(value = "SMOG_SET")
@ApiModelProperty(value = "烟雾报警 0:关闭1开启", allowableValues = "0,1")
private Integer smogSet;
@TableField(value = "CONTAINER_WEIGHT")
@ApiModelProperty("容器重量")
private BigDecimal containerWeight;
@TableField(value = "CURRENT_WEIGHT")
@ApiModelProperty("当前总重")
private BigDecimal currentWeight;
@TableField(value = "WARNING_WEIGHT")
@ApiModelProperty("报警重量")
private BigDecimal warningWeight;
@TableField(value = "CLOSE_DELAY")
@ApiModelProperty("关闭延时")
private Integer closeDelay;
@TableField(value = "DELIVERY_DOOR_STATUS")
@ApiModelProperty(value = "投递门状态", allowableValues = "0,1")
private Integer deliveryDoorStatus;
@TableField(value = "CLEAN_DOOR_STATUS")
@ApiModelProperty(value = "清运门状态", allowableValues = "0,1")
private Integer cleanDoorStatus;
@TableField(value = "BAG_NO")
@ApiModelProperty("回收袋编号")
private String bagNo;
@TableField(value = "BUCKET_IMG")
@ApiModelProperty("桶图片")
private String bucketImg;
@TableField(value = "STATUS")
@ApiModelProperty(value = "使用状态", allowableValues = "0,1")
private Integer status;
@TableField(value = "F_TENANT_ID")
@ApiModelProperty("租户编码")
private String tenantId;
@TableField("F_CREATOR_TIME")
@ApiModelProperty("创建时间")
private Date creatorTime;
@TableField("F_CREATOR_USER_ID")
@ApiModelProperty("创建用户")
private String creatorUserId;
@TableField("F_LAST_MODIFY_TIME")
@ApiModelProperty("修改时间")
private Date lastModifyTime;
@TableField("F_LAST_MODIFY_USER_ID")
@ApiModelProperty("修改用户")
private String lastModifyUserId;
@TableField("F_DELETE_TIME")
@ApiModelProperty("删除时间")
private Date deleteTime;
@TableField("F_DELETE_USER_ID")
@ApiModelProperty("删除用户")
private String deleteUserId;
@TableField("F_DELETE_MARK")
@ApiModelProperty("删除标记")
private String deleteMark;
@TableField("COMPANY_ID")
@ApiModelProperty("公司ID")
private String companyId;
@TableField("DEPARTMENT_ID")
@ApiModelProperty("部门ID")
private String departmentId;
@TableField("ORGANIZE_JSON_ID")
@ApiModelProperty("组织架构")
private String organizeJsonId;
@TableField("F_VERSION")
@ApiModelProperty("版本")
private Integer version;
@TableField("F_FLOW_ID")
@ApiModelProperty("工作流")
private String flowId;
}

@ -0,0 +1,87 @@
package cc.yunxi.domain.po;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
*
*
* @ V3.5
* @ https://www.jnpfsoft.com
* @ JNPF
* @ 2024-05-29
*/
@Data
@TableName("nx_recycle_clean_order")
public class RecycleCleanOrderEntity {
@TableId(value ="ID" )
private String id;
@TableField(value = "ORDER_NO" , updateStrategy = FieldStrategy.IGNORED)
private String orderNo;
@TableField(value = "DEVICE_CODE" , updateStrategy = FieldStrategy.IGNORED)
private String deviceCode;
@TableField(value = "BUCKET_CODE" , updateStrategy = FieldStrategy.IGNORED)
private String bucketCode;
@TableField(value = "DOOR_NUM" , updateStrategy = FieldStrategy.IGNORED)
private String doorNum;
@TableField(value = "PRODUCT_CODE" , updateStrategy = FieldStrategy.IGNORED)
private String productCode;
@TableField(value = "DEVICE_ORDER_NO" , updateStrategy = FieldStrategy.IGNORED)
private String deviceOrderNo;
@TableField(value = "PRODUCT_SUB_CODE" , updateStrategy = FieldStrategy.IGNORED)
private String productSubCode;
@TableField(value = "PRICE" , updateStrategy = FieldStrategy.IGNORED)
private BigDecimal price;
@TableField(value = "WEIGHT" , updateStrategy = FieldStrategy.IGNORED)
private BigDecimal weight;
@TableField(value = "TOTAL_PRICE" , updateStrategy = FieldStrategy.IGNORED)
private BigDecimal totalPrice;
@TableField(value = "ADJUST_WEIGHT" , updateStrategy = FieldStrategy.IGNORED)
private BigDecimal adjustWeight;
@TableField(value = "ADJUST_PRICE" , updateStrategy = FieldStrategy.IGNORED)
private BigDecimal adjustPrice;
@TableField(value = "CLEAN_USER_ID" , updateStrategy = FieldStrategy.IGNORED)
private String cleanUserId;
@TableField(value = "PHONE" , updateStrategy = FieldStrategy.IGNORED)
private String phone;
@TableField(value = "ENTRY_STATUS" , updateStrategy = FieldStrategy.IGNORED)
private Integer entryStatus;
@TableField(value = "BAG_NO" , updateStrategy = FieldStrategy.IGNORED)
private String bagNo;
@TableField(value = "ADJUST_STATUS" , updateStrategy = FieldStrategy.IGNORED)
private Integer adjustStatus;
@TableField(value = "ADJUST_COMM" , updateStrategy = FieldStrategy.IGNORED)
private String adjustComm;
@TableField(value = "F_TENANT_ID" , updateStrategy = FieldStrategy.IGNORED)
private String tenantId;
@TableField("F_CREATOR_TIME")
private Date creatorTime;
@TableField("F_CREATOR_USER_ID")
private String creatorUserId;
@TableField("F_LAST_MODIFY_TIME")
private Date lastModifyTime;
@TableField("F_LAST_MODIFY_USER_ID")
private String lastModifyUserId;
@TableField("F_DELETE_TIME")
private Date deleteTime;
@TableField("F_DELETE_USER_ID")
private Integer deleteUserId;
@TableField("F_DELETE_MARK")
private String deleteMark;
@TableField("COMPANY_ID")
private String companyId;
@TableField("DEPARTMENT_ID")
private String departmentId;
@TableField("ORGANIZE_JSON_ID")
private String organizeJsonId;
@TableField("F_VERSION")
private Integer version;
@TableField("F_FLOW_ID")
private String flowId;
}

@ -0,0 +1,99 @@
package cc.yunxi.domain.po;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
*
*
* @ V3.5
* @ https://www.jnpfsoft.com
* @ JNPF
* @ 2024-05-31
*/
@Data
@TableName("nx_recycle_delivery_order")
public class RecycleDeliveryOrderEntity {
@TableId(value ="ID" )
private String id;
@TableField(value = "ORDER_NO" , updateStrategy = FieldStrategy.IGNORED)
private String orderNo;
@TableField(value = "DEVICE_ORDER_NO" , updateStrategy = FieldStrategy.IGNORED)
private Integer deviceOrderNo;
@TableField(value = "DEVICE_CODE" , updateStrategy = FieldStrategy.IGNORED)
private String deviceCode;
@TableField(value = "BUCKET_CODE" , updateStrategy = FieldStrategy.IGNORED)
private String bucketCode;
@TableField(value = "DOOR_NUM" , updateStrategy = FieldStrategy.IGNORED)
private Integer doorNum;
@TableField(value = "BAG_NO" , updateStrategy = FieldStrategy.IGNORED)
private Integer bagNo;
@TableField(value = "ORIGINAL_WEIGHT" , updateStrategy = FieldStrategy.IGNORED)
private BigDecimal originalWeight;
@TableField(value = "REPORT_WEIGHT" , updateStrategy = FieldStrategy.IGNORED)
private BigDecimal reportWeight;
@TableField(value = "ADJUST_WEIGHT" , updateStrategy = FieldStrategy.IGNORED)
private BigDecimal adjustWeight;
@TableField(value = "PRODUCT_CODE" , updateStrategy = FieldStrategy.IGNORED)
private String productCode;
@TableField(value = "PRODUCT_SUB_CODE" , updateStrategy = FieldStrategy.IGNORED)
private String productSubCode;
@TableField(value = "PRICE" , updateStrategy = FieldStrategy.IGNORED)
private BigDecimal price;
@TableField(value = "TOTAL_PRICE" , updateStrategy = FieldStrategy.IGNORED)
private BigDecimal totalPrice;
@TableField(value = "ADJUST_PRICE" , updateStrategy = FieldStrategy.IGNORED)
private BigDecimal adjustPrice;
@TableField(value = "ADJUST_SET" , updateStrategy = FieldStrategy.IGNORED)
private Integer adjustSet;
@TableField(value = "ADJUST_STATUS" , updateStrategy = FieldStrategy.IGNORED)
private Integer adjustStatus;
@TableField(value = "ADJUST_COMM" , updateStrategy = FieldStrategy.IGNORED)
private String adjustComm;
@TableField(value = "DELIVER_ID" , updateStrategy = FieldStrategy.IGNORED)
private String deliverId;
@TableField(value = "PHONE" , updateStrategy = FieldStrategy.IGNORED)
private String phone;
@TableField(value = "CLEAN_STATUS" , updateStrategy = FieldStrategy.IGNORED)
private Integer cleanStatus;
@TableField(value = "CLEAN_NO" , updateStrategy = FieldStrategy.IGNORED)
private String cleanNo;
@TableField(value = "CLEANER_PHONE" , updateStrategy = FieldStrategy.IGNORED)
private String cleanerPhone;
@TableField(value = "LOGIN_TYPE" , updateStrategy = FieldStrategy.IGNORED)
private Integer loginType;
@TableField(value = "PHOTO" , updateStrategy = FieldStrategy.IGNORED)
private String photo;
@TableField("F_FLOW_ID")
private String flowId;
@TableField("F_CREATOR_TIME")
private Date creatorTime;
@TableField("F_CREATOR_USER_ID")
private String creatorUserId;
@TableField("F_LAST_MODIFY_TIME")
private Date lastModifyTime;
@TableField("F_LAST_MODIFY_USER_ID")
private String lastModifyUserId;
@TableField("F_DELETE_TIME")
private Date deleteTime;
@TableField("F_DELETE_USER_ID")
private String deleteUserId;
@TableField("F_DELETE_MARK")
private String deleteMark;
@TableField("F_TENANT_ID")
private String tenantId;
@TableField("COMPANY_ID")
private String companyId;
@TableField("DEPARTMENT_ID")
private String departmentId;
@TableField("ORGANIZE_JSON_ID")
private String organizeJsonId;
@TableField("F_VERSION")
private Integer version;
}

@ -1,84 +1,92 @@
package cc.yunxi.domain.po;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.time.LocalDateTime;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
/**
* <p>
*
* </p>
*
* @author ccongli
* @since 2024-04-11 10:33:58
*/
@Data
@ApiModel(value = "RecycleDevice", description = "回收柜设备表")
@EqualsAndHashCode(callSuper = false)
@TableName("nx_recycle_device")
@ApiModel(value = "RecycleDevice对象", description = "回收柜设备表")
public class RecycleDevice {
@ApiModelProperty("主键id")
@EqualsAndHashCode.Exclude
@TableId(value = "id", type = IdType.ASSIGN_ID)
@TableId(value = "ID", type = IdType.ASSIGN_UUID)
@ApiModelProperty("主键ID")
private String id;
@TableField(value = "DEVICE_CODE")
@ApiModelProperty("设备编码")
@TableField("devsn")
private String devsn;
@ApiModelProperty("烟雾报警 0未报警 1报警")
@TableField("allSmoke")
private Integer allSmoke;
@ApiModelProperty("是否满溢 0未满溢 1满溢")
@TableField("isSpill")
private Integer isSpill;
@ApiModelProperty("是否超重报警 0未报警 1报警")
@TableField("weightSpill")
private Integer weightSpill;
@ApiModelProperty("是否压缩报警 0未报警 1报警")
@TableField("compressdSpill")
private Integer compressdSpill;
@ApiModelProperty("当前设备整体重量,多筒累加 kg")
@TableField("weight")
private Double weight;
@ApiModelProperty("筒数量")
@TableField("size")
private Integer size;
@ApiModelProperty("配置的版本号")
@TableField("appConfigVersion")
private String appConfigVersion;
private String deviceCode;
@TableField(value = "DEVICE_NAME")
@ApiModelProperty("设备名称")
private String deviceName;
@TableField(value = "CITY")
@ApiModelProperty("设备城市")
private String city;
@TableField(value = "ADDRESS")
@ApiModelProperty("地址")
private String address;
@TableField(value = "STATUS")
@ApiModelProperty(value = "在线状态")
private Integer status;
@TableField(value = "USE_STATUS")
@ApiModelProperty("启用状态")
private Integer useStatus;
@TableField(value = "IP_ADDRESS")
@ApiModelProperty("IP地址")
private String ipAddress;
@TableField(value = "BOX_WEIGHT")
@ApiModelProperty("箱体重量")
private Double boxWeight;
@TableField(value = "BE_LONG_STATION_CODE")
@ApiModelProperty("所属回收站")
private String beLongStationCode;
@TableField(value = "BE_LONG_COMPANY_ID")
@ApiModelProperty("所属商户")
private String beLongCompanyId;
@TableField(value = "LATITUDE")
@ApiModelProperty("纬度")
private String latitude;
@TableField(value = "LONGITUDE")
@ApiModelProperty("经度")
private String longitude;
@TableField("F_CREATOR_USER_ID")
@ApiModelProperty("创建用户")
private String creatorUserId;
@TableField("F_CREATOR_TIME")
@ApiModelProperty("创建时间")
@TableField("f_creator_time")
private LocalDateTime createTime;
@ApiModelProperty("更新时间")
@TableField("f_last_modify_time")
private LocalDateTime updateTime;
@ApiModelProperty("公司id")
@TableField("company_id")
private Date creatorTime;
@TableField("F_LAST_MODIFY_TIME")
@ApiModelProperty("修改时间")
private Date lastModifyTime;
@TableField("F_LAST_MODIFY_USER_ID")
@ApiModelProperty("修改人")
private String lastModifyUserId;
@TableField("COMPANY_ID")
@ApiModelProperty("公司")
private String companyId;
@TableField("ORGANIZE_JSON_ID")
@ApiModelProperty("组织id")
@TableField("organize_json_id")
private String organizeJsonId;
@TableField("F_FLOW_ID")
@ApiModelProperty("工作流")
private String flowId;
@TableField("F_DELETE_TIME")
@ApiModelProperty("删除时间")
private Date deleteTime;
@TableField("F_DELETE_USER_ID")
@ApiModelProperty("删除用户")
private String deleteUserId;
@TableField("F_DELETE_MARK")
@ApiModelProperty("删除标记")
private Integer deleteMark;
@TableField("F_TENANT_ID")
@ApiModelProperty("租户id")
private Integer tenantId;
}

@ -0,0 +1,146 @@
package cc.yunxi.domain.po;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* ()
*/
@Data
@TableName("nx_recycle_device_config")
@ApiModel(value = "商户设备(配置)")
public class RecycleDeviceConfig {
@TableId(value = "ID")
@ApiModelProperty("主键")
private String id;
@TableField(value = "DELIVERY_PRICE")
@ApiModelProperty("统一价格")
private BigDecimal deliveryPrice;
@TableField(value = "BUCKET1_PRICE")
@ApiModelProperty("1号桶价格")
private BigDecimal bucket1Price;
@TableField(value = "BUCKET2_PRICE")
@ApiModelProperty("2号桶价格")
private BigDecimal bucket2Price;
@TableField(value = "BUCKET3_PRICE")
@ApiModelProperty("3号桶价格")
private BigDecimal bucket3Price;
@TableField(value = "BUCKET4_PRICE")
@ApiModelProperty("4号桶价格")
private BigDecimal bucket4Price;
@TableField(value = "BUCKET5_PRICE")
@ApiModelProperty("5号桶价格")
private BigDecimal bucket5Price;
@TableField(value = "BUCKET6_PRICE")
@ApiModelProperty("6号桶价格")
private BigDecimal bucket6Price;
@TableField(value = "BUCKET7_PRICE")
@ApiModelProperty("7号桶价格")
private BigDecimal bucket7Price;
@TableField(value = "BUCKET8_PRICE")
@ApiModelProperty("8号桶价格")
private BigDecimal bucket8Price;
@TableField(value = "BUCKET9_PRICE")
@ApiModelProperty("9号桶价格")
private BigDecimal bucket9Price;
@TableField(value = "BUCKET10_PRICE")
@ApiModelProperty("10号桶价格")
private BigDecimal bucket10Price;
@TableField(value = "BUCKET11_PRICE")
@ApiModelProperty("11号桶价格")
private BigDecimal bucket11Price;
@TableField(value = "BUCKET12_PRICE")
@ApiModelProperty("12号桶价格")
private BigDecimal bucket12Price;
@TableField(value = "DELIVERY_ADJUST_SET")
@ApiModelProperty(value = "投递审核配置 1自动 224H 348H", allowableValues = "1,2,3")
private String deliveryAdjustSet;
@TableField(value = "CLEAN_ADJUST_SET")
@ApiModelProperty(value = "清运审核配置 1自动 2手动", allowableValues = "1,2")
private String cleanAdjustSet;
@TableField(value = "WARNING_WEIGHT")
@ApiModelProperty("报警重量")
private BigDecimal warningWeight;
@TableField(value = "CLOSE_DELAY")
@ApiModelProperty("投递关门延时")
private Integer closeDelay;
@TableField(value = "FULL_SET")
@ApiModelProperty(value = "满意报警 0关闭 1开启")
private String fullSet;
@TableField(value = "SMOG_SET")
@ApiModelProperty(value = "烟雾报警 0关闭 1开启")
private String smogSet;
@TableField(value = "CLEAN_LOCK")
@ApiModelProperty(value = "清运锁 0关闭 1开启")
private String cleanLock;
@TableField(value = "PROMOTION_SET")
@ApiModelProperty(value = "宣传配置 0关闭 1开启")
private String promotionSet;
@TableField(value = "ALLOW_PHONE_LOGIN")
@ApiModelProperty(value = "手机号登录 0关闭 1开启")
private String allowPhoneLogin;
@TableField("PROMOTION_SLOGANS")
@ApiModelProperty("宣传语")
private String promotionSlogans;
@TableField(value = "PROMOTION_PIC1")
@ApiModelProperty("宣传图片1")
private String promotionPic1;
@TableField("PROMOTION_PIC2")
@ApiModelProperty("宣传海报2")
private String promotionPic2;
@TableField("PROMOTION_PIC3")
@ApiModelProperty("宣传海报3")
private String promotionPic3;
@TableField("PROMOTION_PIC4")
@ApiModelProperty("宣传海报4")
private String promotionPic4;
@TableField("PROMOTION_PIC5")
@ApiModelProperty("宣传海报5")
private String promotionPic5;
@TableField("F_TENANT_ID")
@ApiModelProperty("租户id")
private String tenantId;
@TableField("F_CREATOR_TIME")
@ApiModelProperty("创建时间")
private Date creatorTime;
@TableField("F_CREATOR_USER_ID")
@ApiModelProperty("创建用户id")
private String creatorUserId;
@TableField("F_LAST_MODIFY_TIME")
@ApiModelProperty("修改时间")
private Date lastModifyTime;
@TableField("F_LAST_MODIFY_USER_ID")
@ApiModelProperty("修改用户")
private String lastModifyUserId;
@TableField("F_DELETE_TIME")
@ApiModelProperty("删除时间")
private Date deleteTime;
@TableField("F_DELETE_USER_ID")
@ApiModelProperty("删除用户")
private String deleteUserId;
@TableField("F_DELETE_MARK")
@ApiModelProperty("删除编辑")
private String deleteMark;
@TableField("COMPANY_ID")
@ApiModelProperty("公司id")
private String companyId;
@TableField("DEPARTMENT_ID")
@ApiModelProperty("部门id")
private String departmentId;
@TableField("ORGANIZE_JSON_ID")
@ApiModelProperty("组织id")
private String organizeJsonId;
@TableField("F_VERSION")
@ApiModelProperty("版本")
private Integer version;
@TableField("F_FLOW_ID")
@ApiModelProperty("工作流")
private String flowId;
}

@ -1,58 +0,0 @@
package cc.yunxi.domain.po;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* <p>
*
* </p>
*
* @author ccongli
* @since 2024-04-11 10:33:58
*/
@Data
@TableName("nx_recycle_device_photo")
@ApiModel(value = "RecycleDevicePhoto对象", description = "回收柜投递/清运照片表")
public class RecycleDevicePhoto {
@ApiModelProperty("主键id")
@EqualsAndHashCode.Exclude
@TableId(value = "id", type = IdType.ASSIGN_ID)
private String id;
@ApiModelProperty("订单编号")
@TableField("order_id")
private String orderId;
@ApiModelProperty("上传文件地址")
@TableField("file_url")
private String fileUrl;
@ApiModelProperty("创建时间")
@TableField("f_creator_time")
private LocalDateTime createTime;
@ApiModelProperty("更新时间")
@TableField("f_last_modify_time")
private LocalDateTime updateTime;
@ApiModelProperty("公司id")
@TableField("company_id")
private String companyId;
@ApiModelProperty("组织id")
@TableField("organize_json_id")
private String organizeJsonId;
}

@ -1,79 +0,0 @@
package cc.yunxi.domain.po;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* <p>
*
* </p>
*
* @author ccongli
* @since 2024-04-11 10:33:58
*/
@Data
@TableName("nx_recycle_device_running_data")
@ApiModel(value = "RecycleDeviceRunningData", description = "回收柜投递/清运订单表")
public class RecycleDeviceRunningData {
@ApiModelProperty("主键id")
@EqualsAndHashCode.Exclude
@TableId(value = "id", type = IdType.ASSIGN_ID)
private String id;
@ApiModelProperty("投递/清运编号")
@TableField("no")
private String no;
@ApiModelProperty("重量")
@TableField("weight")
private BigDecimal weight;
@ApiModelProperty("价格")
@TableField("price")
private BigDecimal price;
@ApiModelProperty("订单编号")
@TableField("order_id")
private String orderId;
@ApiModelProperty("手机号码")
@TableField("phone")
private String phone;
@ApiModelProperty("类型1为投递2为清运")
@TableField("type")
private Integer type;
@ApiModelProperty("提交信息详细")
@TableField("postDetail")
private String postDetail;
@ApiModelProperty("创建时间")
@TableField("f_creator_time")
private LocalDateTime createTime;
@ApiModelProperty("更新时间")
@TableField("f_last_modify_time")
private LocalDateTime updateTime;
@ApiModelProperty("公司id")
@TableField("company_id")
private String companyId;
@ApiModelProperty("组织id")
@TableField("organize_json_id")
private String organizeJsonId;
}

@ -0,0 +1,26 @@
package cc.yunxi.domain.vo.device;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@Data
@ApiModel("清运单")
public class CleanOrderVO {
private String id;
private String orderNo;
private String orderType;
private String orderStatus;
private String orderTime;
private String orderAddress;
private String orderDesc;
private String orderUser;
private String orderUserPhone;
private String orderUserAddress;
private String orderUserAddressDetail;
private String orderUserAddressLongitude;
private String orderUserAddressLatitude;
private String orderUserAddressArea;
private String orderUserAddressAreaCode;
private String orderUserAddressCity;
}

@ -0,0 +1,26 @@
package cc.yunxi.domain.vo.device;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
@Data
@ApiModel("设备控制命令")
public class CommandVO {
@ApiModelProperty(value = "命令", required = true, example = "reboot")
@NotBlank(message = "命令不能为空")
private String cmd;
@ApiModelProperty(value = "命令参数", required = true, example = "设备编码")
@NotBlank(message = "命令参数不能为空")
private String data;
@ApiModelProperty(value = "操作时间", required = true, example = "admin")
@NotNull(message = "操作时间不能为空")
private LocalDateTime optTime;
@ApiModelProperty(value = "备注", example = "重启设备")
private String remark;
}

@ -0,0 +1,46 @@
package cc.yunxi.domain.vo.device;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ApiModel("投递单")
public class DeliveryOrderVO {
@ApiModelProperty("订单号")
private String orderNum;
@ApiModelProperty("设备编码")
private String deviceCode;
@ApiModelProperty("桶编码")
private String bucketCode;
@ApiModelProperty("门号")
private String doorNum;
@ApiModelProperty("回收大类")
private String code;
@ApiModelProperty("回收子类")
private String subCode;
@ApiModelProperty("回收单价")
private BigDecimal price;
@ApiModelProperty("重量")
private BigDecimal weight;
@ApiModelProperty("总价")
private BigDecimal totalPrice;
@ApiModelProperty("开始时间")
private LocalDateTime starTime;
@ApiModelProperty("完成时间")
private LocalDateTime finishTime;
@ApiModelProperty("用户id")
private String userId;
@ApiModelProperty("用户手机")
private String phone;
@ApiModelProperty("上报类型")
private String reportType;
@ApiModelProperty("上报时间")
private LocalDateTime reportTime;
@ApiModelProperty("抓拍图片")
private List<Snap> images;
}

@ -0,0 +1,33 @@
package cc.yunxi.domain.vo.device;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel("设备事件")
public class DeviceEventVO {
@ApiModelProperty("设备编码")
private String deviceCode;
@ApiModelProperty("桶编码")
private String bucketCode;
@ApiModelProperty("门号")
private String doorNum;
@ApiModelProperty("事件类型")
private String eventType;
@ApiModelProperty("事件时间")
private String eventTime;
@ApiModelProperty("事件描述")
private String eventDesc;
@ApiModelProperty("订单号")
private String orderNo;
@ApiModelProperty("订单类型")
private String orderType;
@ApiModelProperty("用户ID")
private String userId;
@ApiModelProperty("用户手机号")
private String phone;
@ApiModelProperty("是否本地")
private String isLocal;
}

@ -0,0 +1,95 @@
package cc.yunxi.domain.vo.device;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel("设备信息配置")
public class DeviceRespVO {
@ApiModelProperty(value = "设备编码", required = true, example = "DE000001")
@NotBlank(message = "设备编码不能为空")
private String deviceCode;
@ApiModelProperty(value = "设备名称", required = true, example = "设备1")
@NotBlank(message = "设备名称不能为空")
private String deviceName;
@ApiModelProperty(value = "是否开启服务", required = true, example = "1")
@NotNull(message = "是否开启服务不能为空")
private Integer userStatus;
@ApiModelProperty(value = "是否开启清理锁", required = true, example = "1")
@NotNull(message = "是否开启清理锁不能为空")
private Integer cleanLock;
@ApiModelProperty("是否开启手机号登录")
private String usePhoneLogin;
@ApiModelProperty("设备桶清单")
private List<Bucket> bucketList;
@ApiModelProperty("设备二维码")
@NotNull(message = "设备二维码不能为空")
private String qrCode;
@ApiModelProperty(value = "设备宣传设置", required = true, example = "1")
@NotBlank(message = "设备宣传设置不能为空")
private String promotionSet;
@ApiModelProperty("设备宣传语")
private String slogan;
@ApiModelProperty("宣传海报")
private List<Poster> posterList;
@Data
@ApiModel("桶配置信息")
@Accessors(chain = true)
public static class Bucket {
@ApiModelProperty(value = "桶编码", required = true, example = "bk00001")
@NotBlank(message = "桶编码不能为空")
private String bucketCode;
@ApiModelProperty(value = "门号", required = true, example = "1")
@NotBlank(message = "门号不能为空")
private Integer doorNum;
@ApiModelProperty(value = "显示顺序", required = true, example = "1")
@NotNull(message = "显示顺序不能为空")
private Integer ordNum;
@ApiModelProperty(value = "回收大类", required = true, example = "HS001")
@NotBlank(message = "回收大类不能为空")
private String code;
@ApiModelProperty(value = "回收子类", example = "HS001001")
private String subCode;
@ApiModelProperty(value = "显示文字", required = true, example = "纸张&废塑料")
@NotBlank(message = "显示文字不能为空")
private String showText;
@ApiModelProperty(value = "满溢报警", required = true, example = "1")
@NotNull(message = "满溢报警不能为空")
private Integer fullAlarm;
@ApiModelProperty(value = "烟雾报警", required = true, example = "1")
@NotNull(message = "烟雾报警不能为空")
private Integer smokeAlarm;
@ApiModelProperty(value = "单价", required = true, example = "1.00")
@NotNull(message = "单价不能为空")
private BigDecimal price;
@ApiModelProperty(value = "单次限重", required = true, example = "1.00")
@NotNull(message = "单次限重不能为空")
private BigDecimal singleWeightLimit;
@ApiModelProperty(value = "总限重", required = true, example = "1.00")
@NotNull(message = "总限重不能为空")
private BigDecimal totalWeightLimit;
@ApiModelProperty(value = "桶身图片", required = true)
@NotNull(message = "桶身图片不能为空")
private String image;
}
@Data
@ApiModel("海报")
@Accessors(chain = true)
public static class Poster {
@ApiModelProperty("显示顺序")
private Integer showOrd;
@ApiModelProperty("图片")
private String image;
}
}

@ -0,0 +1,22 @@
package cc.yunxi.domain.vo.device;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@ApiModel("设备状态")
public class DeviceStatus {
@ApiModelProperty("设备编码")
private String deviceCode;//设备编码
@ApiModelProperty("设备ip地址")
private String ip;//IP地址
@ApiModelProperty("最后心跳时间")
private LocalDateTime heartBeat;//心跳时间
@ApiModelProperty("ip是否变化")
private Boolean ipChanged;//ip是否变化
@ApiModelProperty("设备是否在线")
private Boolean online;//设备是否在线
}

@ -0,0 +1,15 @@
package cc.yunxi.domain.vo.device;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
@ApiModel(value = "DeviceVO", description = "设备信息")
public class DeviceVO {
@ApiModelProperty(value = "设备编码", required = true)
@NotBlank(message = "设备编码不能为空")
private String deviceCode;
}

@ -0,0 +1,23 @@
package cc.yunxi.domain.vo.device;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
//手机号登录
@Data
@ApiModel("手机号登录")
public class LoginReqVO {
//手机号
@ApiModelProperty(value = "设备编码", required = true, example = "DE123456789")
@NotBlank(message = "设备编码不能为空")
private String deviceCode;
//设备编码
@ApiModelProperty(value = "手机号", required = true, example = "13800138000")
@NotBlank(message = "手机号不能为空")
private String phone;
}

@ -0,0 +1,24 @@
package cc.yunxi.domain.vo.device;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
//设备手机号登录成功
@Data
@ApiModel("设备手机号登录成功")
public class LoginRespVO {
@ApiModelProperty("用户id")
private String userId;//用户id
@ApiModelProperty("用户名")
private String userName;//用户名
@ApiModelProperty("用户状态")
private String status;//用户状态
private String phone;//手机号
private String token;//手机号
private Long timeExpire;
private String deviceCode;//设备编码
private List<Integer> roles;//用户角色
}

@ -1,36 +0,0 @@
package cc.yunxi.domain.vo.device;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import javax.validation.constraints.Size;
import java.time.LocalDateTime;
/**
* <p>
* VO
* </p>
*
* @author ccongli
* @since 2024-02-28 16:08:09
*/
@Data
@ApiModel(description = "设备柜开门 Request VO")
public class RecycleDeviceOpenDoorReqVO {
@ApiModelProperty(value = "设备编码", required = true)
@NotBlank(message = "设备编码不能为空")
private String devsn;
@ApiModelProperty(value = "手机号码", required = true)
@NotBlank(message = "手机号码不能为空")
private String loginName;
@ApiModelProperty(value = "垃圾袋编码", required = true)
@NotBlank(message = "垃圾袋编码不能为空")
private String bagNo;
}

@ -0,0 +1,18 @@
package cc.yunxi.domain.vo.device;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@ApiModel("抓拍")
@Accessors(chain = true)
public class Snap {
@ApiModelProperty(value = "内外",required = true,allowableValues = "inside,outside")
private String inside;
@ApiModelProperty("抓拍时间")
private String takeTime;
@ApiModelProperty("图片")
private byte[] image;
}

@ -0,0 +1,12 @@
package cc.yunxi.mapper;
import cc.yunxi.domain.po.RecycleBucket;
import cc.yunxi.domain.po.RecycleDevice;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface RecycleBucketMapper extends BaseMapper<RecycleBucket> {
// TODO 此处编写RecycleDevice的mapper.xml文件中需要的方法
}

@ -0,0 +1,11 @@
package cc.yunxi.mapper;
import cc.yunxi.domain.po.RecycleDeviceConfig;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface RecycleDeviceConfigMapper extends BaseMapper<RecycleDeviceConfig> {
// TODO 此处编写RecycleDevice的mapper.xml文件中需要的方法
}

@ -4,14 +4,6 @@ import cc.yunxi.domain.po.RecycleDevice;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* Mapper
* </p>
*
* @author ccongli
* @since 2024-04-11 10:33:58
*/
@Mapper
public interface RecycleDeviceMapper extends BaseMapper<RecycleDevice> {

@ -1,19 +0,0 @@
package cc.yunxi.mapper;
import cc.yunxi.domain.po.RecycleDevice;
import cc.yunxi.domain.po.RecycleDevicePhoto;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* Mapper
* </p>
*
* @author ccongli
* @since 2024-04-11 10:33:58
*/
@Mapper
public interface RecycleDevicePhotoMapper extends BaseMapper<RecycleDevicePhoto> {
}

@ -1,19 +0,0 @@
package cc.yunxi.mapper;
import cc.yunxi.domain.po.RecycleDevicePhoto;
import cc.yunxi.domain.po.RecycleDeviceRunningData;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* Mapper
* </p>
*
* @author ccongli
* @since 2024-04-11 10:33:58
*/
@Mapper
public interface RecycleDeviceRunningDataMapper extends BaseMapper<RecycleDeviceRunningData> {
}

@ -21,6 +21,7 @@ public interface IFileService extends IService<File> {
/**
*
*
* @param uploadReqVO
* @return FileUploadRespVO
*/
@ -29,11 +30,36 @@ public interface IFileService extends IService<File> {
/**
*
*
* @param uploadReqVO
* @return FileUploadRespVO
*/
FileUploadRespVO uploadImage(@Valid FileUploadReqVO uploadReqVO);
/**
* base64
*
* @param file
* @return base64
*/
String encodeToBase64(byte[] file);
/**
* base64
*
* @param image
* @return
*/
byte[] decodeToBase64(String image);
/**
* Base64
*
* @param image64
* @return FileUploadRespVO
*/
FileUploadRespVO uploadImage(String image64, String filename);
/**
*

@ -0,0 +1,14 @@
package cc.yunxi.service;
import cc.yunxi.domain.po.RecycleBucket;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.validation.constraints.NotBlank;
import java.util.List;
public interface IRecycleBucketService extends IService<RecycleBucket> {
RecycleBucket getByBucketCode(@NotBlank(message = "桶编码不能为空") String bucketCode);
List<RecycleBucket> getByDeviceCode(@NotBlank(message = "设备编码不能为空") String deviceCode);
}

@ -0,0 +1,11 @@
package cc.yunxi.service;
import cc.yunxi.domain.po.RecycleDeviceConfig;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.validation.constraints.NotBlank;
public interface IRecycleDeviceConfigService extends IService<RecycleDeviceConfig> {
RecycleDeviceConfig getByCompanyId(@NotBlank(message = "companyId 不能为空") String companyId);
}

@ -1,21 +0,0 @@
package cc.yunxi.service;
import cc.yunxi.domain.po.RecycleDevice;
import cc.yunxi.domain.po.RecycleDevicePhoto;
import cc.yunxi.domain.vo.device.RecycleDeviceRespVO;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.validation.Valid;
/**
* <p>
*
* </p>
*
* @author ccongli
* @since 2024-04-11 10:33:58
*/
public interface IRecycleDevicePhotoService extends IService<RecycleDevicePhoto> {
Boolean addRecycleDevicePhoto(String orderId,String url);
}

@ -1,19 +0,0 @@
package cc.yunxi.service;
import cc.yunxi.domain.po.RecycleDevicePhoto;
import cc.yunxi.domain.po.RecycleDeviceRunningData;
import cc.yunxi.domain.vo.device.RecycleDeviceRespVO;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
*
* </p>
*
* @author ccongli
* @since 2024-04-11 10:33:58
*/
public interface IRecycleDeviceRunningDataService extends IService<RecycleDeviceRunningData> {
Boolean addRecycleDeviceRunningData(RecycleDeviceRespVO recycleDeviceRespVO,Integer type);
}

@ -1,30 +1,16 @@
package cc.yunxi.service;
import cc.yunxi.domain.po.RecycleDevice;
import cc.yunxi.domain.vo.device.RecycleDeviceRespVO;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import java.util.List;
/**
* <p>
*
* </p>
*
* @author ccongli
* @since 2024-04-11 10:33:58
*/
public interface IRecycleDeviceService extends IService<RecycleDevice> {
/**
*
*/
RecycleDevice getDeviceInfo(String devsn);
RecycleDevice getByDeviceCode(@NotBlank String deviceCode);
List<RecycleDevice> getByDeviceName(@NotBlank String companyId);
/**
*
*/
void saveDeviceInfo(@Valid RecycleDeviceRespVO recycleDeviceRespVO);
int updateDevice();
}

@ -32,6 +32,7 @@ import java.io.InputStream;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.time.LocalDateTime;
import java.util.Base64;
import java.util.List;
import java.util.Optional;
@ -70,6 +71,7 @@ public class FileServiceImpl extends ServiceImpl<FileMapper, File> implements IF
/**
* hashFile
*
* @param hashName
* @return File
*/
@ -167,6 +169,71 @@ public class FileServiceImpl extends ServiceImpl<FileMapper, File> implements IF
}
}
@Override
public String encodeToBase64(byte[] file) {
return Base64.getEncoder().encodeToString(file);
}
@Override
public byte[] decodeToBase64(String image) {
return Base64.getDecoder().decode(image);
}
@Override
public FileUploadRespVO uploadImage(String image64, String fileName) {
byte[] image = decodeToBase64(image64);
return base64ImageUpload(image, fileName, FileStyleEnum.IMAGE);
}
private FileUploadRespVO base64ImageUpload(byte[] content, String fileName, FileStyleEnum fileStyleEnum) {
try {
String[] split = fileName.split("\\.");
String fileType = split[split.length - 1];
if (!imageAllowTypes.contains(fileType.toLowerCase())) {
throw new BizIllegalException("图片格式不正确");
}
if (content.length > DataSizeUtil.parse(imageMaxSize)) {
throw new BizIllegalException("图片大小限制" + fileMaxSize);
}
// 生成md5文件名
String hashName = FileUtils.generateName(content, fileName);
// 确定上传路径
String URI = basePath + fileStyleEnum.toString().toLowerCase() + "/" + hashName;
String fullPath = System.getProperty("user.dir") + URI;
// 判断文件是否存在,如果存在直接返回
FileUploadRespVO uploadRespVO = new FileUploadRespVO();
File fileInfo = getFileInfoByHashVal(hashName);
if (fileInfo != null && FileUtil.exist(fullPath)) {
uploadRespVO.setName(fileInfo.getFilename());
uploadRespVO.setUrl(fileInfo.getUrl());
uploadRespVO.setField(fileInfo.getHashVal());
} else {
// 上传到文件存储位置
FileUtil.writeBytes(content, fullPath);
uploadRespVO.setName(fileName);
uploadRespVO.setField(hashName);
// uploadRespVO.setUrl(getUrl(URI));
uploadRespVO.setUrl(URI);
// 判断文件来源
String userId = ObjectUtil.isNotEmpty(UserContext.getUser()) ? UserContext.getUser().getId() : "";
Integer source = StrUtil.isNotEmpty(userId) ? 1 : 2;
if (fileInfo == null) {
// 入库操作
fileInfo = new File().setUrl(URI)
.setFilename(fileName)
.setHashVal(hashName)
.setSize(DataSizeUtil.format(content.length))
.setSource(source)
.setCreatorTime(LocalDateTime.now())
.setCreatorUserId(userId);
this.save(fileInfo);
}
}
return uploadRespVO;
} catch (Exception exception) {
throw new BizIllegalException("上传失败");
}
}
// 拼接为完整的静态访问地址
private String getUrl(String Uri) {

@ -0,0 +1,33 @@
package cc.yunxi.service.impl;
import cc.yunxi.domain.po.RecycleBucket;
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.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class RecycleBucketServiceImpl extends ServiceImpl<RecycleBucketMapper, RecycleBucket> implements IRecycleBucketService {
@Resource
private RecycleBucketMapper recycleBucketMapper;
@Override
public RecycleBucket getByBucketCode(String bucketCode) {
QueryWrapper<RecycleBucket> query = new QueryWrapper<>();
query.eq("bucket_code", bucketCode);
return recycleBucketMapper.selectOne(query);
}
@Override
public List<RecycleBucket> getByDeviceCode(String deviceCode) {
QueryWrapper<RecycleBucket> query = new QueryWrapper<>();
query.eq("device_code", deviceCode);
return recycleBucketMapper.selectList(query);
}
}

@ -0,0 +1,25 @@
package cc.yunxi.service.impl;
import cc.yunxi.domain.po.RecycleDeviceConfig;
import cc.yunxi.mapper.RecycleDeviceConfigMapper;
import cc.yunxi.service.IRecycleDeviceConfigService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class RecycleDeviceConfigServiceImpl extends ServiceImpl<RecycleDeviceConfigMapper, RecycleDeviceConfig> implements IRecycleDeviceConfigService {
@Resource
private RecycleDeviceConfigMapper recycleDeviceConfigMapper;
@Override
public RecycleDeviceConfig getByCompanyId(String companyId) {
QueryWrapper<RecycleDeviceConfig> query = new QueryWrapper<>();
query.eq("company_id", companyId);
return recycleDeviceConfigMapper.selectOne(query);
}
}

@ -1,47 +0,0 @@
package cc.yunxi.service.impl;
import cc.yunxi.common.utils.BeanUtils;
import cc.yunxi.domain.po.RecycleDevice;
import cc.yunxi.domain.po.RecycleDeviceDoor;
import cc.yunxi.domain.vo.device.RecycleDeviceRespVO;
import cc.yunxi.mapper.RecycleDeviceDoorMapper;
import cc.yunxi.service.IRecycleDeviceDoorService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.enums.SqlMethod;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.ibatis.binding.MapperMethod;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;
import java.util.Collection;
import java.util.function.Function;
/**
* <p>
*
* </p>
*
* @author ccongli
* @since 2024-04-11 10:34:14
*/
@Service
@Validated
public class RecycleDeviceDoorServiceImpl extends ServiceImpl<RecycleDeviceDoorMapper, RecycleDeviceDoor> implements IRecycleDeviceDoorService {
// 批量更新
public boolean updateBatchByQueryWrapper(Collection<RecycleDeviceDoor> entityList,
Function<RecycleDeviceDoor, LambdaUpdateWrapper> wrapperFunction) {
String sqlStatement = this.getSqlStatement(SqlMethod.UPDATE);
return this.executeBatch(entityList, DEFAULT_BATCH_SIZE, (sqlSession, entity) -> {
MapperMethod.ParamMap param = new MapperMethod.ParamMap<>();
param.put(Constants.ENTITY, entity);
param.put(Constants.WRAPPER, wrapperFunction.apply(entity));
sqlSession.update(sqlStatement, param);
});
}
}

@ -1,49 +0,0 @@
package cc.yunxi.service.impl;
import cc.yunxi.common.domain.LambdaQueryWrapperX;
import cc.yunxi.common.domain.LambdaUpdateWrapperX;
import cc.yunxi.common.utils.BeanUtils;
import cc.yunxi.domain.po.RecycleDevice;
import cc.yunxi.domain.po.RecycleDeviceDoor;
import cc.yunxi.domain.po.RecycleDevicePhoto;
import cc.yunxi.domain.vo.device.RecycleDeviceRespVO;
import cc.yunxi.mapper.RecycleDeviceMapper;
import cc.yunxi.mapper.RecycleDevicePhotoMapper;
import cc.yunxi.service.IRecycleDeviceDoorService;
import cc.yunxi.service.IRecycleDevicePhotoService;
import cc.yunxi.service.IRecycleDeviceService;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
/**
* <p>
*
* </p>
*
* @author ccongli
* @since 2024-04-11 10:33:58
*/
@Service
public class RecycleDevicePhotoServiceImpl extends ServiceImpl<RecycleDevicePhotoMapper, RecycleDevicePhoto> implements IRecycleDevicePhotoService {
@Override
public Boolean addRecycleDevicePhoto(String orderId,String url) {
RecycleDevicePhoto recycleDevicePhoto = new RecycleDevicePhoto();
recycleDevicePhoto.setId(orderId);
recycleDevicePhoto.setFileUrl(url);
recycleDevicePhoto.setCreateTime(LocalDateTime.now());
return this.save(recycleDevicePhoto);
}
}

@ -1,54 +0,0 @@
package cc.yunxi.service.impl;
import cc.yunxi.domain.po.RecycleDevicePhoto;
import cc.yunxi.domain.po.RecycleDeviceRunningData;
import cc.yunxi.domain.vo.device.RecycleDeviceRespVO;
import cc.yunxi.mapper.RecycleDevicePhotoMapper;
import cc.yunxi.mapper.RecycleDeviceRunningDataMapper;
import cc.yunxi.service.IRecycleDevicePhotoService;
import cc.yunxi.service.IRecycleDeviceRunningDataService;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
/**
* <p>
*
* </p>
*
* @author ccongli
* @since 2024-04-11 10:33:58
*/
@Service
public class RecycleDeviceRunningDataServiceImpl extends ServiceImpl<RecycleDeviceRunningDataMapper, RecycleDeviceRunningData> implements IRecycleDeviceRunningDataService {
@Override
public Boolean addRecycleDeviceRunningData(RecycleDeviceRespVO recycleDeviceRespVO,Integer type) {
String data = recycleDeviceRespVO.getData();
JSONObject jsonObject = JSONUtil.parseObj(data);
RecycleDeviceRunningData recycleDeviceRunningData = new RecycleDeviceRunningData();
recycleDeviceRunningData.setType(type);
recycleDeviceRunningData.setNo(jsonObject.getStr("no"));
recycleDeviceRunningData.setWeight(jsonObject.getBigDecimal("weight"));
recycleDeviceRunningData.setPrice(jsonObject.getBigDecimal("price"));
recycleDeviceRunningData.setOrderId(recycleDeviceRespVO.getOrderId());
recycleDeviceRunningData.setPhone(jsonObject.getStr("phone"));
recycleDeviceRunningData.setPostDetail(JSONUtil.toJsonStr(recycleDeviceRespVO));
recycleDeviceRunningData.setCreateTime(LocalDateTime.now());
return this.save(recycleDeviceRunningData);
}
}

@ -1,84 +1,38 @@
package cc.yunxi.service.impl;
import cc.yunxi.common.domain.LambdaQueryWrapperX;
import cc.yunxi.common.domain.LambdaUpdateWrapperX;
import cc.yunxi.common.utils.BeanUtils;
import cc.yunxi.domain.po.RecycleDevice;
import cc.yunxi.domain.po.RecycleDeviceDoor;
import cc.yunxi.domain.vo.device.RecycleDeviceRespVO;
import cc.yunxi.mapper.RecycleDeviceDoorMapper;
import cc.yunxi.mapper.RecycleDeviceMapper;
import cc.yunxi.service.IRecycleDeviceDoorService;
import cc.yunxi.service.IRecycleDeviceService;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.enums.SqlMethod;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <p>
*
* </p>
*
* @author ccongli
* @since 2024-04-11 10:33:58
*/
@Service
public class RecycleDeviceServiceImpl extends ServiceImpl<RecycleDeviceMapper, RecycleDevice> implements IRecycleDeviceService {
@Resource
private IRecycleDeviceDoorService recycleDeviceDoorService;
private RecycleDeviceMapper recycleDeviceMapper;
@Override
public RecycleDevice getDeviceInfo(String devsn) {
LambdaQueryWrapperX<RecycleDevice> wrapperX = new LambdaQueryWrapperX();
wrapperX.eq(RecycleDevice::getDevsn, devsn);
return this.getOne(wrapperX, false);
public RecycleDevice getByDeviceCode(String deviceCode) {
QueryWrapper<RecycleDevice> wrapper = new QueryWrapper<>();
wrapper.eq("device_code", deviceCode);
return recycleDeviceMapper.selectOne(wrapper);
}
/**
*
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void saveDeviceInfo(RecycleDeviceRespVO recycleDeviceRespVO) {
RecycleDevice recycleDevice = BeanUtils.copyBean(recycleDeviceRespVO, RecycleDevice.class);
List<RecycleDeviceDoor> deviceDoorList = BeanUtils.copyList(recycleDeviceRespVO.getListDoor(), RecycleDeviceDoor.class);
RecycleDevice deviceInfo = this.getDeviceInfo(recycleDevice.getDevsn());
LocalDateTime now = LocalDateTime.now();
if (ObjectUtil.isEmpty(deviceInfo)) { // 添加
recycleDevice.setCreateTime(now); // 组织机构维护 todo
this.save(recycleDevice);
deviceDoorList.forEach(v -> {
v.setDevsn(recycleDevice.getDevsn());
v.setCreateTime(now);
});
recycleDeviceDoorService.saveBatch(deviceDoorList);
} else { // 更新
LambdaUpdateWrapperX<RecycleDevice> wrapperX = new LambdaUpdateWrapperX<>();
wrapperX.eq(RecycleDevice::getDevsn, deviceInfo.getDevsn());
recycleDevice.setUpdateTime(now);
this.update(recycleDevice, wrapperX);
LambdaUpdateWrapper<RecycleDeviceDoor> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(RecycleDeviceDoor::getDevsn, deviceInfo.getDevsn());
deviceDoorList.forEach(v -> v.setUpdateTime(now));
recycleDeviceDoorService.updateBatchByQueryWrapper(deviceDoorList, v -> updateWrapper);
}
public List<RecycleDevice> getByDeviceName(String companyId) {
QueryWrapper<RecycleDevice> wrapper = new QueryWrapper<>();
wrapper.eq("company_id", companyId);
return recycleDeviceMapper.selectList(wrapper);
}
@Override
public int updateDevice() {
return 0;
}
}

@ -0,0 +1,51 @@
package cc.yunxi.utils;
import cc.yunxi.domain.vo.device.DeviceStatus;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@Component
public class DeviceStatusManager {
private static final ConcurrentHashMap<String, DeviceStatus> DEVICE_STATUS_MAP = new ConcurrentHashMap<>();
public DeviceStatus getDeviceStatus(String deviceCode) {
return DEVICE_STATUS_MAP.get(deviceCode);
}
public ConcurrentHashMap<String, DeviceStatus> getAllDeviceStatus() {
return DEVICE_STATUS_MAP;
}
public void putDeviceStatus(DeviceStatus deviceStatus) {
DEVICE_STATUS_MAP.put(deviceStatus.getDeviceCode(), deviceStatus);
}
public void removeDeviceStatus(String deviceCode) {
DEVICE_STATUS_MAP.remove(deviceCode);
}
//状态是否改变
private boolean isChanged(DeviceStatus deviceStatus) {
DeviceStatus oldStatus = DEVICE_STATUS_MAP.get(deviceStatus.getDeviceCode());
if (oldStatus == null) {
return true;
} else {
if (!oldStatus.getIp().equals(deviceStatus.getIp())) {
log.info("设备编码:{} 的IP地址发生变化old:{} , new:{} ", deviceStatus.getDeviceCode(), oldStatus.getIp(), deviceStatus.getIp());
return true;
}
}
return false;
}
}

@ -0,0 +1,55 @@
package cc.yunxi.utils;
import cc.yunxi.domain.vo.device.DeviceStatus;
import io.swagger.annotations.ApiModel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@Component
@ApiModel("设备状态监控")
public class DeviceStatusMonitor {
//注入设备service
//注入桶service
private final Long TIME_OUT = new Long(1000 * 60);//心跳周期
@Resource
private DeviceStatusManager statusManager;
@Scheduled(fixedDelay = 1000 * 90)//每1.5个周期执行一次 必定有一次心跳 无则视为掉线
public void monitorDeviceStatus() {
ConcurrentHashMap<String, DeviceStatus> allDeviceStatus = statusManager.getAllDeviceStatus();
if (allDeviceStatus.size() > 0) {
log.info("设备状态监控开始");
//需要更新状态的设备
List<DeviceStatus> list = new ArrayList<>();
// 遍历设备状态
for (DeviceStatus deviceStatus : allDeviceStatus.values()) {
// 判断设备状态是否超时
if (System.currentTimeMillis() - deviceStatus.getHeartBeat().toEpochSecond(ZoneOffset.of("+8")) > TIME_OUT) {
// 设备状态超时,修改设备状态为离线
deviceStatus.setOnline(false);
//todo 更新设备在线状态
log.info("设备 {} 已离线", deviceStatus.getDeviceCode());
}
if (deviceStatus.getIpChanged()) {
//todo 更新设备通信地址
deviceStatus.setIpChanged(false);
log.info("设备ip地址发生变化,新的地址:{},已更新至数据库", deviceStatus.getIp());
}
}
// todo 更新设备状态
log.info("设备状态监控结束");
} else {
log.error("没有设备在线!!!");
}
}
}

@ -1,5 +1,6 @@
<?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="cc.yunxi.mapper.RecycleDevicePhotoMapper">
<mapper namespace="cc.yunxi.mapper.RecycleBucketMapper">
</mapper>

@ -1,5 +1,6 @@
<?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="cc.yunxi.mapper.RecycleDeviceRunningDataMapper">
<mapper namespace="cc.yunxi.mapper.RecycleDeviceConfigMapper">
</mapper>

@ -2,4 +2,5 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cc.yunxi.mapper.RecycleDeviceMapper">
</mapper>

Loading…
Cancel
Save