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.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 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 String processArdTankLockByLockId(String userId, String username, Map 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 "该锁使能关闭,无法操控"; } ArdSyUser ardSyUser = ardSyUserMapper.userById(userId); if(ardSyUser == null){ return "未挂接三一账号"; } List syURLResult = sysConfigMapper.selectByType("syCarPT"); String syURL = ""; if(syURLResult.size() != 0){ syURL = syURLResult.get(0).getConfigValue(); }else{ return "三一平台未录入"; } String passwordMd5 = DigestUtils.md5Hex(ardSyUser.getPassword()); Map LogInResult = sYClient.logIn(syURL, passwordMd5, ardSyUser.getUserId()); String sessionId = (String) LogInResult.get("sessionId"); String lng = ""; String lat = ""; String carPlate = ""; Map syResult = sYClient.getCarNearPositionByCarId(syURL, carId, ardSyUser.getUserId(), sessionId); if(((String)syResult.get("rspCode")).equals("1")){ Map carMap = ((List>)syResult.get("list")).get(0); if(Integer.parseInt((String)carMap.get("speed")) != 0){ return "车辆正在行驶中"; } lng = (String) carMap.get("lng"); lat = (String) carMap.get("lat"); carPlate = (String) carMap.get("carName"); }else{ return "三一平台报错"; } List ardTankWallList = ardTankWallMapper.getArdTankWallProcessByLockId(lockId);//查询锁挂接的全部需要动作的电子围栏 if(!ardTankWallList.isEmpty()){//挂接了动作电子围栏 Point2D.Double point = new Point2D.Double(Double.parseDouble(lng), Double.parseDouble(lat));//车辆当前位置 List pts = new ArrayList(); 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 "当前车辆正处在" + ardTankWall.getWallName() + "中"; } } return "当前车辆正处在电子围栏外"; }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"; //System.out.println(paramsStr); Map result = sendCmd(syURL, ardSyUser.getUserId(), carId, 199, "DataDownTransfer", paramsStr, sessionId); //System.out.println("111111111111"); //System.out.println(result); 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 "发送成功"; }else{ return "发送失败"; } }catch(Exception e){ e.printStackTrace(); return "发送失败"; } } } public Map 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 map = (Map) JSON.parse(message); return map; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return new HashMap(); } } }