1. 联调

This commit is contained in:
邱贞招 2024-06-11 16:38:59 +08:00
parent 3aa79b1438
commit ec20e746a7
9 changed files with 72 additions and 16 deletions

View File

@ -5,8 +5,6 @@ import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.ruoyi.common.constant.IotConstants; import com.ruoyi.common.constant.IotConstants;
import com.ruoyi.common.constant.ServiceConstants; import com.ruoyi.common.constant.ServiceConstants;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.SysUser;
@ -37,7 +35,6 @@ import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.security.InvalidKeyException; import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -185,17 +182,22 @@ public class ReceiveController {
if (noRidingOutage.equals("1") && value.getStatus() != 3) { // 禁行区内断电 if (noRidingOutage.equals("1") && value.getStatus() != 3) { // 禁行区内断电
log.info("禁行区内断电命令--SN" + device.getSn()); log.info("禁行区内断电命令--SN" + device.getSn());
asDeviceService.sendCommand(device.getMac(), Token.getToken(), IotConstants.COMMAND_QLOSE+IotConstants.COMMAND_FREQUENCY_5, "禁行区内断电"); asDeviceService.sendCommand(device.getMac(), Token.getToken(), IotConstants.COMMAND_QLOSE+IotConstants.COMMAND_FREQUENCY_5, "禁行区内断电");
device.setLockStatus(ServiceConstants.LOCK_STATUS_CLOSE);
int updateAsDevice = asDeviceService.updateAsDevice(device);
if (updateAsDevice > 0) {
log.info("禁行区内断电--更新设备锁状态成功SN" + device.getSn());
}
} }
} }
/** 3.超出运营区外断电*/ /** 3.超出运营区外断电*/
boolean isAreaZone = asDeviceService.isAreaZone(device.getSn(), area); boolean isAreaZone = asDeviceService.isAreaZone(device.getSn(), area);
if(!isAreaZone){ if(!isAreaZone){
//是否在20米范围内 //是否在30米范围内
boolean inPolygon = GeoUtils.isInPolygonWithTolerance(lon.toString(), lat.toString(), GeoUtils.fromWkt(area.getBoundary()), 20); boolean inPolygon = GeoUtils.isInPolygonWithTolerance(lon.toString(), lat.toString(), GeoUtils.fromWkt(area.getBoundary()), 60);
if(inPolygon){ if(inPolygon){
//在20米范围内发报警 //在20米范围内发报警
log.info("超出运营区20米内发送警告命令--SN" + device.getSn()); log.info("超出运营区30米内发送警告命令--SN" + device.getSn());
asDeviceService.sendCommand(device.getMac(), Token.getToken(), IotConstants.COMMAND_PLAY3, "超出运营区20米内"); asDeviceService.sendCommand(device.getMac(), Token.getToken(), IotConstants.COMMAND_PLAY3, "超出运营区30米内");
}else{ }else{
//超出运营区外断电 //超出运营区外断电
String isAdminUnlocking = device.getIsAdminUnlocking();// 是否管理员开锁 String isAdminUnlocking = device.getIsAdminUnlocking();// 是否管理员开锁
@ -203,6 +205,27 @@ public class ReceiveController {
if (areaOutOutage.equals("1") && value.getStatus() != 3 && !isAdminUnlocking.equals("1")) { // 超出营运区断电 if (areaOutOutage.equals("1") && value.getStatus() != 3 && !isAdminUnlocking.equals("1")) { // 超出营运区断电
log.info("超出营运区断电命令--SN" + device.getSn()); log.info("超出营运区断电命令--SN" + device.getSn());
asDeviceService.sendCommand(device.getMac(), Token.getToken(), IotConstants.COMMAND_QLOSE+IotConstants.COMMAND_FREQUENCY_5, "超出营运区断电"); asDeviceService.sendCommand(device.getMac(), Token.getToken(), IotConstants.COMMAND_QLOSE+IotConstants.COMMAND_FREQUENCY_5, "超出营运区断电");
device.setLockStatus(ServiceConstants.LOCK_STATUS_CLOSE);
int updateAsDevice = asDeviceService.updateAsDevice(device);
if (updateAsDevice > 0) {
log.info("禁行区内断电--更新设备锁状态成功SN" + device.getSn());
}
}
}
}else{
// 判断该车辆是否在进行中的订单,并且车辆的锁状态是关状态是骑行中
Boolean inOrderBySn = etOrderService.isInOrderBySn(device.getSn());
if (inOrderBySn && ServiceConstants.VEHICLE_STATUS_IN_USING.equals(device.getStatus()) && ServiceConstants.LOCK_STATUS_CLOSE.equals(device.getLockStatus())) { // 有正在骑行的订单给车辆上电
log.info("返回营运区上电,有正在骑行的订单,给车辆上电--SN" + device.getSn());
asDeviceService.sendCommand(device.getMac(), Token.getToken(), IotConstants.COMMAND_OPEN+IotConstants.COMMAND_FREQUENCY_5, "返回营运区上电");
// 更新车辆状态和锁状态
/** 3.更新车辆状态*/
device.setLockStatus(ServiceConstants.LOCK_STATUS_OPEN);
device.setStatus(ServiceConstants.VEHICLE_STATUS_IN_USING);
device.setIsAdminUnlocking("0");
int i1 = asDeviceService.updateAsDevice(device);
if(i1>1){
log.info("【返回营运区上电】更新车辆状态成功");
} }
} }
} }

View File

@ -138,6 +138,7 @@ public class SysLoginController
log.info("没有传入areaId参数【areaId={}】",areaId); log.info("没有传入areaId参数【areaId={}】",areaId);
return AjaxResult.error("请传areaId参数"+"【areaId="+areaId+""); return AjaxResult.error("请传areaId参数"+"【areaId="+areaId+"");
} }
log.info("【微信登录/wxlogin】areaId参数【areaId={}】",areaId);
AjaxResult ajax = AjaxResult.success(); AjaxResult ajax = AjaxResult.success();
// 生成令牌 // 生成令牌
String token = loginService.wxloing(mobileCode,jsCode,areaId); String token = loginService.wxloing(mobileCode,jsCode,areaId);

View File

@ -119,7 +119,7 @@ public class IotConstants {
/** /**
* 命令 频率5秒 * 命令 频率5秒
*/ */
public static final String COMMAND_FREQUENCY_5 = "sub10@"; public static final String COMMAND_FREQUENCY_5 = "sub5@";
/** /**
* 命令 频率20秒 * 命令 频率20秒

View File

@ -232,7 +232,7 @@ public class GeoUtils {
/** /**
* 判断一个点是否在一个圆形区域内考虑误差距离 * 判断一个点是否在一个圆形区域内考虑误差距离
* */ * */
public static boolean isInPolygonWithTolerance (String longitude, String latitude, Geometry polygon, double tolerance) { public static boolean isInPolygonWithTolerance(String longitude, String latitude, Geometry polygon, double tolerance) {
double lon = Double.parseDouble(longitude); double lon = Double.parseDouble(longitude);
double lat = Double.parseDouble(latitude); double lat = Double.parseDouble(latitude);
@ -247,6 +247,7 @@ public class GeoUtils {
Coordinate[] coordinates = polygon.getCoordinates(); Coordinate[] coordinates = polygon.getCoordinates();
for (Coordinate coord : coordinates) { for (Coordinate coord : coordinates) {
double distance = calculateDistance(lat, lon, coord.y, coord.x); double distance = calculateDistance(lat, lon, coord.y, coord.x);
log.info("距离----distance:{}",distance);
if (distance <= tolerance) { if (distance <= tolerance) {
return true; return true;
} }

View File

@ -4,6 +4,7 @@ import javax.annotation.Resource;
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.core.domain.entity.AsUser; import com.ruoyi.common.core.domain.entity.AsUser;
import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysDept;
@ -13,6 +14,7 @@ import com.ruoyi.common.utils.wx.AccessTokenUtil;
import com.ruoyi.common.utils.wx.vo.WeChatMiniAuthorizeVo; import com.ruoyi.common.utils.wx.vo.WeChatMiniAuthorizeVo;
import com.ruoyi.system.service.IAsUserService; import com.ruoyi.system.service.IAsUserService;
import com.ruoyi.system.service.IWxPayService; import com.ruoyi.system.service.IWxPayService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationManager;
@ -47,6 +49,7 @@ import com.ruoyi.system.service.ISysUserService;
* *
* @author ruoyi * @author ruoyi
*/ */
@Slf4j
@Component @Component
public class SysLoginService public class SysLoginService
{ {
@ -206,13 +209,15 @@ public class SysLoginService
*/ */
public String wxloing(String mobileCode,String jsCode,String areaId) { public String wxloing(String mobileCode,String jsCode,String areaId) {
//根据jsCode换取openid //根据jsCode换取openid
String openId = getOpenId(jsCode); SysDept dept = wxPayService.getDeptObjByAreaId(Long.parseLong(areaId));
log.info("【微信登录/wxlogin】获取到运营商对象【{}】", JSON.toJSON(dept));
String openId = getOpenId(jsCode,dept.getAppid(),dept.getAppSecret());
String url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token="; String url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=";
String phoneNumber = null; String phoneNumber = null;
AsUser user = null; AsUser user = null;
/** 根据手机号获取到用户名*/ /** 根据手机号获取到用户名*/
SysDept dept = wxPayService.getDeptObjByAreaId(Long.parseLong(areaId));
String token = AccessTokenUtil.getToken(dept.getAppid(), dept.getAppSecret()); String token = AccessTokenUtil.getToken(dept.getAppid(), dept.getAppSecret());
url = url+token; url = url+token;
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
@ -286,8 +291,10 @@ public class SysLoginService
*/ */
public String loginByopenid(String jsCode,String areaId) { public String loginByopenid(String jsCode,String areaId) {
//根据jsCode换取openid //根据jsCode换取openid
String openid = getOpenId(jsCode); SysDept dept = wxPayService.getDeptObjByAreaId(Long.parseLong(areaId));
AsUser user = asUserService.selectUserByWxopenid(openid); log.info("【微信登录/wxlogin】获取到运营商对象【{}】", JSON.toJSON(dept));
String openId = getOpenId(jsCode,dept.getAppid(),dept.getAppSecret());
AsUser user = asUserService.selectUserByWxopenid(openId);
if(ObjectUtils.isEmpty(user)){ if(ObjectUtils.isEmpty(user)){
throw new ServiceException("未查询到用户信息"); throw new ServiceException("未查询到用户信息");
}else{ }else{
@ -318,10 +325,8 @@ public class SysLoginService
return tokenService.createToken(loginUser); return tokenService.createToken(loginUser);
} }
private String getOpenId(String jsCode) { private String getOpenId(String jsCode,String appId,String secret) {
//根据jsCode换取openid //根据jsCode换取openid
String appId = SpringUtils.getRequiredProperty("wx.appid");
String secret = SpringUtils.getRequiredProperty("wx.appSecret");
String url = StrUtil.format("https://api.weixin.qq.com/sns/jscode2session?appid={}&secret={}&js_code={}&grant_type=authorization_code", appId, secret, jsCode); String url = StrUtil.format("https://api.weixin.qq.com/sns/jscode2session?appid={}&secret={}&js_code={}&grant_type=authorization_code", appId, secret, jsCode);
String s = HttpUtils.sendGet(url); String s = HttpUtils.sendGet(url);
WeChatMiniAuthorizeVo authorizeVo = JSONObject.parseObject(s, WeChatMiniAuthorizeVo.class); WeChatMiniAuthorizeVo authorizeVo = JSONObject.parseObject(s, WeChatMiniAuthorizeVo.class);

View File

@ -94,6 +94,14 @@ public interface EtOrderMapper
*/ */
public List<EtOrder> isInOrder(@Param("userId") Long userId,@Param("orderNo") String orderNo); public List<EtOrder> isInOrder(@Param("userId") Long userId,@Param("orderNo") String orderNo);
/**
* 查询当前车辆是否有正在进行中的订单
*
* @param sn 用户id
* @return 结果
*/
public List<EtOrder> isInOrderBySn(@Param("sn") String sn);
/** /**
* 检验预约订单只能有一个 * 检验预约订单只能有一个
* *

View File

@ -110,6 +110,11 @@ public interface IEtOrderService
*/ */
List<EtOrder> isInOrder(Long userId,String orderNo); List<EtOrder> isInOrder(Long userId,String orderNo);
/**
* 查询当前车辆是否有正在进行中的订单
*/
Boolean isInOrderBySn(String sn);
/** /**
* 创建订单 * 创建订单
* @param order 订单信息 * @param order 订单信息

View File

@ -812,4 +812,12 @@ public class EtOrderServiceImpl implements IEtOrderService
} }
return inOrder; return inOrder;
} }
/**
* 查询当前车辆是否有正在进行中的订单
*/
@Override
public Boolean isInOrderBySn(String sn) {
List<EtOrder> inOrder = etOrderMapper.isInOrderBySn(sn);
return inOrder.size() > 0;
}
} }

View File

@ -146,6 +146,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</where> </where>
</select> </select>
<select id="isInOrderBySn" resultMap="EtOrderResult" parameterType="String">
<include refid="selectEtOrderVo"/>
where sn = #{sn} and status =2 and type = 1
</select>
<select id="checkIsUnique" resultType="Integer" parameterType="Long"> <select id="checkIsUnique" resultType="Integer" parameterType="Long">
select count(1) from et_order select count(1) from et_order
where user_id = #{userId} and status = 0 and type=1 where user_id = #{userId} and status = 0 and type=1