package com.ruoyi.sy.service.impl;
|
|
import java.awt.geom.Point2D;
|
import java.io.IOException;
|
import java.text.SimpleDateFormat;
|
import java.util.*;
|
|
import com.alibaba.fastjson2.JSON;
|
import com.ruoyi.common.core.domain.AjaxResult;
|
import com.ruoyi.common.core.domain.entity.SysConfig;
|
import com.ruoyi.common.utils.uuid.IdUtils;
|
import com.ruoyi.sy.domain.ArdSyUser;
|
import com.ruoyi.sy.domain.ArdTankLock;
|
import com.ruoyi.sy.domain.ArdTankWall;
|
import com.ruoyi.sy.mapper.ArdSyUserMapper;
|
import com.ruoyi.sy.mapper.ArdTankLockMapper;
|
import com.ruoyi.sy.mapper.ArdTankWallMapper;
|
import com.ruoyi.system.mapper.SysConfigMapper;
|
import com.ruoyi.utils.forest.SYClient;
|
import com.ruoyi.utils.gps.GeoTools;
|
import okhttp3.OkHttpClient;
|
import okhttp3.Request;
|
import okhttp3.Response;
|
import org.apache.commons.codec.digest.DigestUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import com.ruoyi.common.utils.StringUtils;
|
import com.ruoyi.common.utils.SecurityUtils;
|
import com.ruoyi.sy.mapper.ArdTankLockProcessLogMapper;
|
import com.ruoyi.sy.domain.ArdTankLockProcessLog;
|
import com.ruoyi.sy.service.IArdTankLockProcessLogService;
|
|
import javax.annotation.Resource;
|
|
/**
|
* 罐车锁操控日志Service业务层处理
|
*
|
* @author ard
|
* @date 2024-07-10
|
*/
|
@Service
|
public class ArdTankLockProcessLogServiceImpl implements IArdTankLockProcessLogService {
|
@Resource
|
private ArdTankLockProcessLogMapper ardTankLockProcessLogMapper;
|
|
@Resource
|
private ArdTankWallMapper ardTankWallMapper;
|
|
@Resource
|
private ArdSyUserMapper ardSyUserMapper;
|
|
@Resource
|
private SysConfigMapper sysConfigMapper;
|
|
@Resource
|
private ArdTankLockMapper ardTankLockMapper;
|
|
@Resource
|
private SYClient sYClient;
|
|
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
/**
|
* 查询罐车锁操控日志
|
*
|
* @param id 罐车锁操控日志主键
|
* @return 罐车锁操控日志
|
*/
|
@Override
|
public ArdTankLockProcessLog selectArdTankLockProcessLogById(String id) {
|
return ardTankLockProcessLogMapper.selectArdTankLockProcessLogById(id);
|
}
|
|
/**
|
* 查询罐车锁操控日志列表
|
*
|
* @param ardTankLockProcessLog 罐车锁操控日志
|
* @return 罐车锁操控日志
|
*/
|
@Override
|
public List<ArdTankLockProcessLog> selectArdTankLockProcessLogList(ArdTankLockProcessLog ardTankLockProcessLog) {
|
return ardTankLockProcessLogMapper.selectArdTankLockProcessLogList(ardTankLockProcessLog);
|
}
|
|
/**
|
* 新增罐车锁操控日志
|
*
|
* @param ardTankLockProcessLog 罐车锁操控日志
|
* @return 结果
|
*/
|
@Override
|
public int insertArdTankLockProcessLog(ArdTankLockProcessLog ardTankLockProcessLog) {
|
ardTankLockProcessLog.setId(IdUtils.simpleUUID());
|
ardTankLockProcessLog.setUserId(SecurityUtils.getUserId());
|
return ardTankLockProcessLogMapper.insertArdTankLockProcessLog(ardTankLockProcessLog);
|
}
|
|
/**
|
* 修改罐车锁操控日志
|
*
|
* @param ardTankLockProcessLog 罐车锁操控日志
|
* @return 结果
|
*/
|
@Override
|
public int updateArdTankLockProcessLog(ArdTankLockProcessLog ardTankLockProcessLog) {
|
return ardTankLockProcessLogMapper.updateArdTankLockProcessLog(ardTankLockProcessLog);
|
}
|
|
/**
|
* 批量删除罐车锁操控日志
|
*
|
* @param ids 需要删除的罐车锁操控日志主键
|
* @return 结果
|
*/
|
@Override
|
public int deleteArdTankLockProcessLogByIds(String[] ids) {
|
return ardTankLockProcessLogMapper.deleteArdTankLockProcessLogByIds(ids);
|
}
|
|
/**
|
* 删除罐车锁操控日志信息
|
*
|
* @param id 罐车锁操控日志主键
|
* @return 结果
|
*/
|
@Override
|
public int deleteArdTankLockProcessLogById(String id) {
|
return ardTankLockProcessLogMapper.deleteArdTankLockProcessLogById(id);
|
}
|
|
@Override
|
public AjaxResult processArdTankLockByLockId(String userId, String username, Map<String,String> para) {
|
String lockId = para.get("lockId");
|
String lockNum = para.get("lockNum");
|
String carId = para.get("carId");
|
String process = para.get("process");//01:开,02:关
|
String processReason = para.get("processReason");//操控原因
|
|
//判断使能
|
ArdTankLock ardTankLock = ardTankLockMapper.selectArdTankLockById(lockId);
|
if(ardTankLock.getEnable().equals("false")){
|
return AjaxResult.error("该锁使能关闭,无法操控");
|
}
|
|
ArdSyUser ardSyUser = ardSyUserMapper.userById(userId);
|
if(ardSyUser == null){
|
return AjaxResult.error("未挂接三一账号");
|
}
|
List<SysConfig> syURLResult = sysConfigMapper.selectByType("syCarPT");
|
String syURL = "";
|
if(syURLResult.size() != 0){
|
syURL = syURLResult.get(0).getConfigValue();
|
}else{
|
return AjaxResult.error("三一平台未录入");
|
}
|
String passwordMd5 = DigestUtils.md5Hex(ardSyUser.getPassword());
|
Map<String, Object> LogInResult = sYClient.logIn(syURL, passwordMd5, ardSyUser.getUserId());
|
String sessionId = (String) LogInResult.get("sessionId");
|
|
String lng = "";
|
String lat = "";
|
String carPlate = "";
|
Map<String,Object> syResult = sYClient.getCarNearPositionByCarId(syURL, carId, ardSyUser.getUserId(), sessionId);
|
if(((String)syResult.get("rspCode")).equals("1")){
|
Map<String,Object> carMap = ((List<Map<String,Object>>)syResult.get("list")).get(0);
|
if(Integer.parseInt((String)carMap.get("speed")) != 0){
|
return AjaxResult.error("车辆正在行驶中");
|
}
|
lng = (String) carMap.get("lng");
|
lat = (String) carMap.get("lat");
|
carPlate = (String) carMap.get("carName");
|
}else{
|
return AjaxResult.error("三一平台报错");
|
}
|
|
List<ArdTankWall> ardTankWallList = ardTankWallMapper.getArdTankWallProcessByLockId(lockId);//查询锁挂接的全部需要动作的电子围栏
|
if(!ardTankWallList.isEmpty()){//挂接了动作电子围栏
|
Point2D.Double point = new Point2D.Double(Double.parseDouble(lng), Double.parseDouble(lat));//车辆当前位置
|
List<Point2D.Double> pts = new ArrayList<Point2D.Double>();
|
for(ArdTankWall ardTankWall : ardTankWallList){
|
pts.clear();
|
String[] wallpoiArro = ardTankWall.getWallPoi().split(",");
|
for (int j = 0; j < wallpoiArro.length; j = j + 3) {//构建多边形
|
pts.add(new Point2D.Double(Double.parseDouble(wallpoiArro[j]), Double.parseDouble(wallpoiArro[j+1])));
|
}
|
if(GeoTools.IsPtInPoly(point, pts)){//在任意电子围栏内,不报警
|
return AjaxResult.error("当前车辆正处在" + ardTankWall.getWallName() + "中");
|
}
|
}
|
return AjaxResult.error("当前车辆正处在电子围栏外");
|
}else{
|
try{
|
String lockNumHead = lockNum.substring(0,2);
|
String lockNumTail = lockNum.substring(2,4);
|
String checkNum = Integer.toHexString(Integer.parseInt(lockNumHead, 16)//锁编号高8位
|
+ Integer.parseInt(lockNumTail, 16)//锁编号低8位
|
+ Integer.parseInt("02", 16)//设置锁芯状态功能码02
|
+ Integer.parseInt(process, 16));//操作
|
if(checkNum.length() == 1){
|
checkNum = "0" + checkNum;
|
}
|
if(checkNum.length() > 2){
|
checkNum = checkNum.substring(checkNum.length() - 2,checkNum.length());
|
}
|
|
String paramsStr = lockNum + "02" + process + checkNum;
|
paramsStr = "%7B%22type%22%3A%22ff%22%2C%22dataCnt%22%3A%22" + paramsStr + "%22%7D";
|
Map<String,Object> result = sendCmd(syURL, ardSyUser.getUserId(), carId, 199, "DataDownTransfer", paramsStr, sessionId);
|
if(((String)result.get("rspCode")).equals("0")){
|
ArdTankLockProcessLog ardTankLockProcessLog = new ArdTankLockProcessLog();
|
ardTankLockProcessLog.setId(IdUtils.simpleUUID());
|
ardTankLockProcessLog.setLockId(lockId);
|
ardTankLockProcessLog.setLockNum(lockNum);
|
ardTankLockProcessLog.setCarId(carId);
|
ardTankLockProcessLog.setCarPlate(carPlate);
|
ardTankLockProcessLog.setUserId(userId);
|
ardTankLockProcessLog.setUserName(username);
|
if(process.equals("01")){
|
ardTankLockProcessLog.setProcess("开动作");
|
}else if(process.equals("02")){
|
ardTankLockProcessLog.setProcess("关动作");
|
}
|
ardTankLockProcessLog.setProcessReason(processReason);
|
ardTankLockProcessLog.setLongitude(lng);
|
ardTankLockProcessLog.setLatitude(lat);
|
ardTankLockProcessLog.setProcessTime(this.sdf.format(new Date()));
|
ardTankLockProcessLogMapper.insertArdTankLockProcessLog(ardTankLockProcessLog);
|
return AjaxResult.success("发送成功");
|
}else{
|
return AjaxResult.error("发送失败");
|
}
|
}catch(Exception e){
|
e.printStackTrace();
|
return AjaxResult.error("发送失败");
|
}
|
}
|
}
|
|
public Map<String,Object> sendCmd(String syURL,String userId,String carId,Integer cmdId,String cmd,String paramsStr,String sessionId){
|
OkHttpClient okHttpClient = new OkHttpClient();
|
|
Request request = new Request.Builder()
|
.url(syURL + "/gps-web/api/send_cmd.jsp?params="+paramsStr+"&userId="+userId+"&carId="+carId+"&cmdId="+cmdId+"&cmd="+cmd+"&sessionId="+sessionId)
|
.build();
|
//System.out.println("url = " + syURL + "/gps-web/api/send_cmd.jsp?params="+paramsStr+"&userId="+userId+"&carId="+carId+"&cmdId="+cmdId+"&cmd="+cmd+"&sessionId="+sessionId);
|
Response response = null;
|
try {
|
response = okHttpClient.newCall(request).execute();
|
} catch (IOException e) {
|
// TODO Auto-generated catch block
|
e.printStackTrace();
|
}
|
|
okhttp3.ResponseBody responseBody = response.body();
|
|
try {
|
String message = responseBody.string();// 响应体
|
Map<String,Object> map = (Map<String, Object>) JSON.parse(message);
|
return map;
|
} catch (IOException e) {
|
// TODO Auto-generated catch block
|
e.printStackTrace();
|
return new HashMap();
|
}
|
}
|
}
|