package com.ruoyi.sy.service.impl;
|
|
import java.text.ParseException;
|
import java.text.SimpleDateFormat;
|
import java.util.*;
|
|
import com.alibaba.fastjson.JSON;
|
import com.github.pagehelper.PageHelper;
|
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.ArdTankWallLockTemporary;
|
import com.ruoyi.sy.gps31.PositionContainer;
|
import com.ruoyi.sy.mapper.ArdSyUserMapper;
|
import com.ruoyi.sy.mapper.ArdTankLockMapper;
|
import com.ruoyi.sy.mapper.ArdTankWallLockTemporaryMapper;
|
import com.ruoyi.system.mapper.SysConfigMapper;
|
import com.ruoyi.system.mapper.SysUserMapper;
|
import com.ruoyi.utils.forest.SYClient;
|
import com.ruoyi.utils.websocket.util.WebSocketUtils;
|
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.ArdTankWallTemporaryMapper;
|
import com.ruoyi.sy.domain.ArdTankWallTemporary;
|
import com.ruoyi.sy.service.IArdTankWallTemporaryService;
|
|
import javax.annotation.Resource;
|
|
import static com.ruoyi.utils.websocket.util.WebSocketUtils.ONLINE_USER_SESSIONS;
|
|
/**
|
* 电磁锁临时电子围栏Service业务层处理
|
*
|
* @author ard
|
* @date 2024-08-01
|
*/
|
@Service
|
public class ArdTankWallTemporaryServiceImpl implements IArdTankWallTemporaryService {
|
|
@Resource
|
private ArdTankWallTemporaryMapper ardTankWallTemporaryMapper;
|
|
@Resource
|
private ArdTankLockMapper ardTankLockMapper;
|
|
@Resource
|
private ArdTankWallLockTemporaryMapper ardTankWallLockTemporaryMapper;
|
|
@Resource
|
private SysUserMapper sysUserMapper;
|
|
@Resource
|
private ArdSyUserMapper ardSyUserMapper;
|
|
@Resource
|
private SysConfigMapper sysConfigMapper;
|
|
@Resource
|
private SYClient sYClient;
|
|
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
/**
|
* 查询电磁锁临时电子围栏
|
*
|
* @param id 电磁锁临时电子围栏主键
|
* @return 电磁锁临时电子围栏
|
*/
|
@Override
|
public ArdTankWallTemporary selectArdTankWallTemporaryById(String id) {
|
return ardTankWallTemporaryMapper.selectArdTankWallTemporaryById(id);
|
}
|
|
/**
|
* 查询电磁锁临时电子围栏列表
|
*
|
* @param ardTankWallTemporary 电磁锁临时电子围栏
|
* @return 电磁锁临时电子围栏
|
*/
|
@Override
|
public List<ArdTankWallTemporary> selectArdTankWallTemporaryList(ArdTankWallTemporary ardTankWallTemporary) {
|
return ardTankWallTemporaryMapper.selectArdTankWallTemporaryList(ardTankWallTemporary);
|
}
|
|
/**
|
* 新增电磁锁临时电子围栏
|
*
|
* @param ardTankWallTemporary 电磁锁临时电子围栏
|
* @return 结果
|
*/
|
@Override
|
public int insertArdTankWallTemporary(ArdTankWallTemporary ardTankWallTemporary) {
|
ardTankWallTemporary.setId(IdUtils.simpleUUID());
|
ardTankWallTemporary.setUserId(SecurityUtils.getUserId());
|
return ardTankWallTemporaryMapper.insertArdTankWallTemporary(ardTankWallTemporary);
|
}
|
|
/**
|
* 修改电磁锁临时电子围栏
|
*
|
* @param ardTankWallTemporary 电磁锁临时电子围栏
|
* @return 结果
|
*/
|
@Override
|
public int updateArdTankWallTemporary(ArdTankWallTemporary ardTankWallTemporary) {
|
return ardTankWallTemporaryMapper.updateArdTankWallTemporary(ardTankWallTemporary);
|
}
|
|
/**
|
* 批量删除电磁锁临时电子围栏
|
*
|
* @param ids 需要删除的电磁锁临时电子围栏主键
|
* @return 结果
|
*/
|
@Override
|
public int deleteArdTankWallTemporaryByIds(String[] ids) {
|
return ardTankWallTemporaryMapper.deleteArdTankWallTemporaryByIds(ids);
|
}
|
|
/**
|
* 删除电磁锁临时电子围栏信息
|
*
|
* @param id 电磁锁临时电子围栏主键
|
* @return 结果
|
*/
|
@Override
|
public int deleteArdTankWallTemporaryById(String id) {
|
return ardTankWallTemporaryMapper.deleteArdTankWallTemporaryById(id);
|
}
|
|
@Override
|
public int insertArdTankWallTemporary(String userId, String userName, Map<String, Object> para) {
|
ArdSyUser ardSyUser = ardSyUserMapper.userById(userId);
|
if(ardSyUser == null){
|
return 0;
|
}
|
List<SysConfig> syURLResult = sysConfigMapper.selectByType("syCarPT");
|
String syURL = "";
|
if(syURLResult.size() != 0){
|
syURL = syURLResult.get(0).getConfigValue();
|
}else{
|
return 0;
|
}
|
/*String passwordMd5 = DigestUtils.md5Hex(ardSyUser.getPassword());
|
Map<String, Object> LogInResult = sYClient.logIn(syURL, passwordMd5, ardSyUser.getUserId());
|
String sessionId = (String) LogInResult.get("sessionId");*/
|
|
ArdTankWallTemporary ardTankWallTemporary = new ArdTankWallTemporary();
|
ardTankWallTemporary.setId(IdUtils.simpleUUID());
|
ardTankWallTemporary.setWallName((String) para.get("wallName"));
|
ardTankWallTemporary.setLongitude((Double) para.get("longitude"));
|
ardTankWallTemporary.setLatitude((Double) para.get("latitude"));
|
ardTankWallTemporary.setDistance((Integer) para.get("distance"));
|
ardTankWallTemporary.setInterval((String) para.get("interval"));
|
ardTankWallTemporary.setProcessTime(sdf.format(new Date()));
|
ardTankWallTemporary.setProcessMark("1");//1为生效
|
ardTankWallTemporary.setUserId(userId);
|
ardTankWallTemporary.setUserName(userName);
|
int result = ardTankWallTemporaryMapper.insertArdTankWallTemporary(ardTankWallTemporary);
|
try{
|
return result;
|
}finally {
|
ArdTankLock ardTankLock = new ArdTankLock();
|
ardTankLock.setCarId((String) para.get("carId"));
|
List<ArdTankLock> ardTankLockList = ardTankLockMapper.selectArdTankLockList(ardTankLock);
|
List<ArdTankWallLockTemporary> ardTankWallLockTemporaryList = new ArrayList();
|
for(ArdTankLock innerArdTankLock : ardTankLockList){
|
ArdTankWallLockTemporary ardTankWallLockTemporary = new ArdTankWallLockTemporary();
|
ardTankWallLockTemporary.setId(IdUtils.simpleUUID());
|
ardTankWallLockTemporary.setWallId(ardTankWallTemporary.getId());
|
ardTankWallLockTemporary.setLockId(innerArdTankLock.getId());
|
ardTankWallLockTemporary.setProcessType("开锁");
|
ardTankWallLockTemporaryList.add(ardTankWallLockTemporary);
|
}
|
if(!ardTankWallLockTemporaryList.isEmpty()){
|
ardTankWallLockTemporaryMapper.insertArdTankWallLockTemporaryList(ardTankWallLockTemporaryList);
|
}
|
//创建定时线程
|
String finalSyURL = syURL;
|
Thread thread = new Thread(){
|
@Override
|
public void run() {
|
try {
|
Thread.sleep(60 * 1000 * Long.parseLong((String) para.get("interval")));
|
} catch (InterruptedException e) {
|
//e.printStackTrace();
|
return;
|
}
|
String passwordMd5 = DigestUtils.md5Hex(ardSyUser.getPassword());
|
Map<String, Object> LogInResult = sYClient.logIn(finalSyURL, passwordMd5, ardSyUser.getUserId());
|
String sessionId = (String) LogInResult.get("sessionId");
|
Map<String,Object> syResult = sYClient.getCarNearPositionByCarId(finalSyURL, (String) para.get("carId"), ardSyUser.getUserId(), sessionId);
|
String carPlate = "";
|
if(((String)syResult.get("rspCode")).equals("1")){
|
Map<String,Object> carMap = ((List<Map<String,Object>>)syResult.get("list")).get(0);
|
carPlate = (String) carMap.get("carPlate");
|
}
|
|
List<String> userIdList = sysUserMapper.selectUserIdByCarId((String) para.get("carId"));//查看哪些用户权限下有这个车
|
|
for (String key : ONLINE_USER_SESSIONS.keySet()){
|
String userId = key.split("_")[0];
|
if(userIdList.contains(userId)){
|
Map<String,Object> data = new HashMap();
|
data.put("40003","车辆-" + carPlate + ": '" + (String) para.get("wallName") + "'"+ "临时电子围栏,已失效");
|
WebSocketUtils.sendMessage(ONLINE_USER_SESSIONS.get(key), JSON.toJSONString(data));
|
}
|
}
|
ardTankWallTemporary.setProcessMark("-1");//-1为到期
|
ardTankWallTemporaryMapper.updateArdTankWallTemporary(ardTankWallTemporary);
|
PositionContainer.getCarWallThreadMap().remove((String) para.get("carId"));
|
}
|
};
|
thread.start();
|
PositionContainer.getCarWallThreadMap().put((String) para.get("carId"),thread);
|
}
|
}
|
|
@Override
|
public int updateArdTankWallTemporary(String userId, String userName, Map<String, Object> para) {
|
ArdSyUser ardSyUser = ardSyUserMapper.userById(userId);
|
if(ardSyUser == null){
|
return 0;
|
}
|
List<SysConfig> syURLResult = sysConfigMapper.selectByType("syCarPT");
|
String syURL = "";
|
if(syURLResult.size() != 0){
|
syURL = syURLResult.get(0).getConfigValue();
|
}else{
|
return 0;
|
}
|
/*String passwordMd5 = DigestUtils.md5Hex(ardSyUser.getPassword());
|
Map<String, Object> LogInResult = sYClient.logIn(syURL, passwordMd5, ardSyUser.getUserId());
|
String sessionId = (String) LogInResult.get("sessionId");*/
|
|
ArdTankWallTemporary ardTankWallTemporary = new ArdTankWallTemporary();
|
ardTankWallTemporary.setId((String) para.get("id"));
|
ardTankWallTemporary.setProcessTime((String) para.get("processTime") + "/" + this.sdf.format(new Date()));
|
ardTankWallTemporary.setProcessMark("0");
|
ardTankWallTemporary.setUserId(para.get("userId") + "/" + userId);
|
ardTankWallTemporary.setUserName(para.get("userName") + "/" + userName);
|
int result = ardTankWallTemporaryMapper.updateArdTankWallTemporary(ardTankWallTemporary);
|
try{
|
return result;
|
}finally {
|
try{//关闭线程
|
PositionContainer.getCarWallThreadMap().get((String) para.get("carId")).interrupt();
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
String passwordMd5 = DigestUtils.md5Hex(ardSyUser.getPassword());
|
Map<String, Object> LogInResult = sYClient.logIn(syURL, passwordMd5, ardSyUser.getUserId());
|
String sessionId = (String) LogInResult.get("sessionId");
|
Map<String,Object> syResult = sYClient.getCarNearPositionByCarId(syURL, (String) para.get("carId"), ardSyUser.getUserId(), sessionId);
|
String carPlate = "";
|
if(((String)syResult.get("rspCode")).equals("1")){
|
Map<String,Object> carMap = ((List<Map<String,Object>>)syResult.get("list")).get(0);
|
carPlate = (String) carMap.get("carPlate");
|
}
|
|
List<String> userIdList = sysUserMapper.selectUserIdByCarId((String) para.get("carId"));//查看哪些用户权限下有这个车
|
for (String key : ONLINE_USER_SESSIONS.keySet()){
|
String usersId = key.split("_")[0];
|
if(userIdList.contains(usersId)){
|
Map<String,Object> data = new HashMap();
|
data.put("40003","车辆-" + carPlate + ":'" + (String) para.get("wallName") + "'" + "临时电子围栏," + "已被" + userName + "撤销");
|
WebSocketUtils.sendMessage(ONLINE_USER_SESSIONS.get(key), JSON.toJSONString(data));
|
}
|
}
|
PositionContainer.getCarWallThreadMap().remove((String) para.get("carId"));
|
}
|
}
|
|
@Override
|
public Map<String, Object> getArdTankWallTemporaryByCarId(Map<String, Object> para) {
|
//分页属性
|
Integer pageNum = (Integer) para.get("pageNum");
|
Integer pageSize = (Integer) para.get("pageSize");
|
|
PageHelper.startPage(pageNum, pageSize);//分页
|
Map<String,Object> resultMap = new HashMap();
|
List<ArdTankWallTemporary> resultList = ardTankWallTemporaryMapper.getArdTankWallTemporaryByCarId((String) para.get("carId"));
|
for(ArdTankWallTemporary ardTankWallTemporary : resultList){
|
String process = ardTankWallTemporary.getProcessTime();
|
String[] processArray = process.split("/");
|
ardTankWallTemporary.setProcessTime(processArray[0]);
|
try{
|
ardTankWallTemporary.setCancelTime(processArray[1]);
|
}catch (Exception e){
|
try{
|
Long cancelDate = this.sdf.parse(processArray[0]).getTime() + Long.parseLong(ardTankWallTemporary.getInterval()) * 60 * 1000;
|
ardTankWallTemporary.setCancelTime(this.sdf.format(cancelDate));
|
} catch (ParseException ex) {
|
ex.printStackTrace();
|
}
|
}
|
switch(ardTankWallTemporary.getProcessMark()){
|
case "1" : ardTankWallTemporary.setProcessInfo("生效");break;
|
case "0" : ardTankWallTemporary.setProcessInfo("失效");break;
|
case "-1" : ardTankWallTemporary.setProcessInfo("到期");break;
|
default : break;
|
}
|
String userName = ardTankWallTemporary.getUserName();
|
String[] userNameArray = userName.split("/");
|
userName = userNameArray[0];
|
ardTankWallTemporary.setUserName(userName);
|
try{
|
ardTankWallTemporary.setCancelUserName(userNameArray[1]);
|
}catch (Exception e){
|
ardTankWallTemporary.setCancelUserName("");
|
}
|
|
String userId = ardTankWallTemporary.getUserId();
|
String[] userIdArray = userId.split("/");
|
userId = userIdArray[0];
|
ardTankWallTemporary.setUserId(userId);
|
try{
|
ardTankWallTemporary.setCancelUserId(userIdArray[1]);
|
}catch (Exception e){
|
ardTankWallTemporary.setCancelUserId("");
|
}
|
}
|
|
Long total = ardTankWallTemporaryMapper.selectArdTankWallTemporaryTotalByCarId((String) para.get("carId"));
|
resultMap.put("list",resultList);
|
resultMap.put("total",total);
|
return resultMap;
|
}
|
|
@Override
|
public void restartArdTankWallTemporaryThread(String userId, String password) {
|
List<SysConfig> syURLResult = sysConfigMapper.selectByType("syCarPT");
|
String syURL = "";
|
if(syURLResult.size() != 0){
|
syURL = syURLResult.get(0).getConfigValue();
|
}else{
|
return;
|
}
|
|
List<Map<String,Object>> result = ardTankWallTemporaryMapper.getAliveArdTankWallTemporaryWithCarId();
|
Date now = new Date();
|
try{
|
String finalSyURL = syURL;
|
for(Map<String,Object> map : result){
|
if(now.getTime() - sdf.parse((String)map.get("processTime")).getTime() < Long.parseLong((String)map.get("interval")) * 60 * 1000){
|
//时间没有过期,从新创建线程
|
Thread thread = new Thread(){
|
@Override
|
public void run() {
|
try {
|
//计时从结束时间到当前时间
|
Thread.sleep( sdf.parse((String)map.get("processTime")).getTime() + Long.parseLong((String)map.get("interval")) * 60 * 1000 - now.getTime());
|
} catch (InterruptedException e) {
|
//e.printStackTrace();
|
return;
|
} catch (ParseException e) {
|
//e.printStackTrace();
|
return;
|
}
|
String passwordMd5 = DigestUtils.md5Hex(password);
|
Map<String, Object> LogInResult = sYClient.logIn(finalSyURL, passwordMd5, userId);
|
String sessionId = (String) LogInResult.get("sessionId");
|
Map<String,Object> syResult = sYClient.getCarNearPositionByCarId(finalSyURL, (String) map.get("carId"), userId, sessionId);
|
String carPlate = "";
|
if(((String)syResult.get("rspCode")).equals("1")){
|
Map<String,Object> carMap = ((List<Map<String,Object>>)syResult.get("list")).get(0);
|
carPlate = (String) carMap.get("carPlate");
|
}
|
|
List<String> userIdList = sysUserMapper.selectUserIdByCarId((String) map.get("carId"));//查看哪些用户权限下有这个车
|
|
for (String key : ONLINE_USER_SESSIONS.keySet()){
|
String userId = key.split("_")[0];
|
if(userIdList.contains(userId)){
|
Map<String,Object> data = new HashMap();
|
data.put("40003","车辆-" + carPlate + ": '" + (String) map.get("wallName") + "'"+ "临时电子围栏,已失效");
|
WebSocketUtils.sendMessage(ONLINE_USER_SESSIONS.get(key), JSON.toJSONString(data));
|
}
|
}
|
ArdTankWallTemporary ardTankWallTemporary = new ArdTankWallTemporary();
|
ardTankWallTemporary.setId((String) map.get("id"));
|
ardTankWallTemporary.setProcessMark("-1");//-1为到期
|
ardTankWallTemporaryMapper.updateArdTankWallTemporary(ardTankWallTemporary);
|
PositionContainer.getCarWallThreadMap().remove((String) map.get("carId"));
|
}
|
};
|
thread.start();
|
PositionContainer.getCarWallThreadMap().put((String) map.get("carId"), thread);
|
}else{
|
//超时
|
ArdTankWallTemporary ardTankWallTemporary = new ArdTankWallTemporary();
|
ardTankWallTemporary.setId((String) map.get("id"));
|
ardTankWallTemporary.setProcessMark("-1");//-1为到期
|
ardTankWallTemporaryMapper.updateArdTankWallTemporary(ardTankWallTemporary);
|
}
|
}
|
}catch (Exception e){
|
|
}
|
}
|
|
}
|