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 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 para) { ArdSyUser ardSyUser = ardSyUserMapper.userById(userId); if(ardSyUser == null){ return 0; } List 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 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 ardTankLockList = ardTankLockMapper.selectArdTankLockList(ardTankLock); List 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 LogInResult = sYClient.logIn(finalSyURL, passwordMd5, ardSyUser.getUserId()); String sessionId = (String) LogInResult.get("sessionId"); Map syResult = sYClient.getCarNearPositionByCarId(finalSyURL, (String) para.get("carId"), ardSyUser.getUserId(), sessionId); String carPlate = ""; if(((String)syResult.get("rspCode")).equals("1")){ Map carMap = ((List>)syResult.get("list")).get(0); carPlate = (String) carMap.get("carPlate"); } List userIdList = sysUserMapper.selectUserIdByCarId((String) para.get("carId"));//查看哪些用户权限下有这个车 for (String key : ONLINE_USER_SESSIONS.keySet()){ String userId = key.split("_")[0]; if(userIdList.contains(userId)){ Map 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 para) { ArdSyUser ardSyUser = ardSyUserMapper.userById(userId); if(ardSyUser == null){ return 0; } List 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 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 LogInResult = sYClient.logIn(syURL, passwordMd5, ardSyUser.getUserId()); String sessionId = (String) LogInResult.get("sessionId"); Map syResult = sYClient.getCarNearPositionByCarId(syURL, (String) para.get("carId"), ardSyUser.getUserId(), sessionId); String carPlate = ""; if(((String)syResult.get("rspCode")).equals("1")){ Map carMap = ((List>)syResult.get("list")).get(0); carPlate = (String) carMap.get("carPlate"); } List userIdList = sysUserMapper.selectUserIdByCarId((String) para.get("carId"));//查看哪些用户权限下有这个车 for (String key : ONLINE_USER_SESSIONS.keySet()){ String usersId = key.split("_")[0]; if(userIdList.contains(usersId)){ Map 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 getArdTankWallTemporaryByCarId(Map para) { //分页属性 Integer pageNum = (Integer) para.get("pageNum"); Integer pageSize = (Integer) para.get("pageSize"); PageHelper.startPage(pageNum, pageSize);//分页 Map resultMap = new HashMap(); List 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 syURLResult = sysConfigMapper.selectByType("syCarPT"); String syURL = ""; if(syURLResult.size() != 0){ syURL = syURLResult.get(0).getConfigValue(); }else{ return; } List> result = ardTankWallTemporaryMapper.getAliveArdTankWallTemporaryWithCarId(); Date now = new Date(); try{ String finalSyURL = syURL; for(Map 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 LogInResult = sYClient.logIn(finalSyURL, passwordMd5, userId); String sessionId = (String) LogInResult.get("sessionId"); Map syResult = sYClient.getCarNearPositionByCarId(finalSyURL, (String) map.get("carId"), userId, sessionId); String carPlate = ""; if(((String)syResult.get("rspCode")).equals("1")){ Map carMap = ((List>)syResult.get("list")).get(0); carPlate = (String) carMap.get("carPlate"); } List userIdList = sysUserMapper.selectUserIdByCarId((String) map.get("carId"));//查看哪些用户权限下有这个车 for (String key : ONLINE_USER_SESSIONS.keySet()){ String userId = key.split("_")[0]; if(userIdList.contains(userId)){ Map 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){ } } }