package com.ruoyi.app.application.service.impl; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; import com.ruoyi.app.position.appcontainer.AppContainer; import com.ruoyi.app.position.domain.ArdAppPosition; import com.ruoyi.app.position.mapper.ArdAppPositionMapper; import com.ruoyi.common.core.domain.entity.SysConfig; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.sy.domain.ArdSyUser; import com.ruoyi.sy.mapper.ArdSyCarMapper; import com.ruoyi.sy.mapper.ArdSyUserMapper; import com.ruoyi.system.mapper.SysConfigMapper; import com.ruoyi.system.mapper.SysDeptMapper; import com.ruoyi.system.mapper.SysRoleMapper; import com.ruoyi.system.mapper.SysUserMapper; import com.ruoyi.utils.forest.SYClient; import com.ruoyi.utils.gis.GisUtil; import com.ruoyi.utils.websocket.util.WebSocketUtils; import org.apache.commons.codec.digest.DigestUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.app.application.mapper.ArdAppApplicationMapper; import com.ruoyi.app.application.domain.ArdAppApplication; import com.ruoyi.app.application.service.IArdAppApplicationService; import javax.annotation.PostConstruct; import javax.annotation.Resource; import javax.websocket.Session; import static com.ruoyi.utils.websocket.util.WebSocketUtils.ONLINE_USER_SESSIONS; /** * 单兵端申请查看指挥端位置或三一车辆位置Service业务层处理 * * @author ard * @date 2024-01-25 */ @Service public class ArdAppApplicationServiceImpl implements IArdAppApplicationService { @Resource private ArdAppApplicationMapper ardAppApplicationMapper; @Resource private SysRoleMapper sysRoleMapper; @Resource private SysUserMapper userMapper; @Resource private SysDeptMapper sysDeptMapper; @Resource private ArdAppPositionMapper ardAppPositionMapper; @Resource private ArdSyUserMapper ardSyUserMapper; @Resource private SysConfigMapper sysConfigMapper; @Resource private ArdSyCarMapper ardSyCarMapper; @Resource private SYClient sYClient; @Value("${minio.endpoint}") private String minioEndpoint; private Map threadMap = new HashMap(); @PostConstruct public void init(){ ArdAppApplication para = new ArdAppApplication(); para.setState("1");//查询同意的申请 List ardAppApplicationList = ardAppApplicationMapper.selectArdAppApplicationList(para); Date date = new Date(); Long now = date.getTime(); for(ArdAppApplication ardAppApplication : ardAppApplicationList){ Long begin = Long.parseLong(ardAppApplication.getBegin()); //判断是否超时 if(now - begin <= 24*60*60*1000){//未超时从新创建线程 String key = ardAppApplication.getCommanderId() + "," + ardAppApplication.getSoilderId() + "," + ardAppApplication.getApplicationType(); Thread thread = new Thread(key){//创建线程计时剩余时长 @Override public void run() { try { Thread.sleep(24*60*60*1000 - (now - begin));//剩余时长 } catch (InterruptedException e) { e.printStackTrace(); return; } Thread currentThread = Thread.currentThread(); String state = "000";//state为000,即超时 String commanderId = currentThread.getName().split(",")[0]; String soilderId = currentThread.getName().split(",")[1]; String applicationType = currentThread.getName().split(",")[2]; int result = ardAppApplicationMapper.updateArdAppApplicationBeginByCommanderIdAndSoilderIdAndType(commanderId,soilderId,applicationType,"",state); threadMap.remove(currentThread.getName()); } }; thread.start(); this.threadMap.put(key,thread); }else{//超时更改状态 String state = "000";//state为000,即超时 String commanderId = ardAppApplication.getCommanderId(); String soilderId = ardAppApplication.getSoilderId(); String applicationType = ardAppApplication.getApplicationType(); int result = ardAppApplicationMapper.updateArdAppApplicationBeginByCommanderIdAndSoilderIdAndType(commanderId,soilderId,applicationType,"",state); } } } /** * 查询单兵端申请查看指挥端位置或三一车辆位置 * * @param soilderId 单兵端申请查看指挥端位置或三一车辆位置主键 * @return 单兵端申请查看指挥端位置或三一车辆位置 */ @Override public ArdAppApplication selectArdAppApplicationBySoilderId(String soilderId) { return ardAppApplicationMapper.selectArdAppApplicationBySoilderId(soilderId); } /** * 查询单兵端申请查看指挥端位置或三一车辆位置列表 * * @param ardAppApplication 单兵端申请查看指挥端位置或三一车辆位置 * @return 单兵端申请查看指挥端位置或三一车辆位置 */ @Override public List selectArdAppApplicationList(ArdAppApplication ardAppApplication) { return ardAppApplicationMapper.selectArdAppApplicationList(ardAppApplication); } /** * 新增单兵端申请查看指挥端位置或三一车辆位置 * * @param ardAppApplication 单兵端申请查看指挥端位置或三一车辆位置 * @return 结果 */ @Override public int insertArdAppApplication(ArdAppApplication ardAppApplication) { return ardAppApplicationMapper.insertArdAppApplication(ardAppApplication); } /** * 修改单兵端申请查看指挥端位置或三一车辆位置 * * @param ardAppApplication 单兵端申请查看指挥端位置或三一车辆位置 * @return 结果 */ @Override public int updateArdAppApplication(ArdAppApplication ardAppApplication) { return ardAppApplicationMapper.updateArdAppApplication(ardAppApplication); } /** * 批量删除单兵端申请查看指挥端位置或三一车辆位置 * * @param soilderIds 需要删除的单兵端申请查看指挥端位置或三一车辆位置主键 * @return 结果 */ @Override public int deleteArdAppApplicationBySoilderIds(String[] soilderIds) { return ardAppApplicationMapper.deleteArdAppApplicationBySoilderIds(soilderIds); } /** * 删除单兵端申请查看指挥端位置或三一车辆位置信息 * * @param soilderId 单兵端申请查看指挥端位置或三一车辆位置主键 * @return 结果 */ @Override public int deleteArdAppApplicationBySoilderId(String soilderId) { return ardAppApplicationMapper.deleteArdAppApplicationBySoilderId(soilderId); } @Override public int sendCheckCommandersPosition(String usersId, Map para) { String reason = (String) para.get("reason"); List usersIdList = (List) para.get("usersIdList"); int result = 0; for(String commanderId : usersIdList){ ArdAppApplication ardAppApplication = new ArdAppApplication(); ardAppApplication.setCommanderId(commanderId); ardAppApplication.setSoilderId(usersId); ardAppApplication.setReason(reason); ardAppApplication.setApplicationType("Commander"); ardAppApplication.setBegin(""); ardAppApplication.setState("0"); ardAppApplication.setSoilderCheck("true");//指挥端未审批也设为true,不需要单兵端查看 int resultSingle = ardAppApplicationMapper.updateArdAppApplicationByCommanderIdAndSoilderIdAndType(ardAppApplication); result = result + resultSingle; if(resultSingle == 0){ ardAppApplication.setApplicationId(IdUtils.simpleUUID()); resultSingle = ardAppApplicationMapper.insertArdAppApplication(ardAppApplication); result = result + resultSingle; } } return result; } @Override public int sendCheckSYCarsPosition(String usersId, Map para) { String reason = (String) para.get("reason"); List usersIdList = (List) para.get("usersIdList"); int result = 0; for(String commanderId : usersIdList){ ArdAppApplication ardAppApplication = new ArdAppApplication(); ardAppApplication.setCommanderId(commanderId); ardAppApplication.setSoilderId(usersId); ardAppApplication.setReason(reason); ardAppApplication.setApplicationType("SYCar"); ardAppApplication.setBegin(""); ardAppApplication.setState("0"); ardAppApplication.setSoilderCheck("true");//指挥端未审批也设为true,不需要单兵端查看 int resultSingle = ardAppApplicationMapper.updateArdAppApplicationByCommanderIdAndSoilderIdAndType(ardAppApplication); result = result + resultSingle; if(resultSingle == 0){ ardAppApplication.setApplicationId(IdUtils.simpleUUID()); resultSingle = ardAppApplicationMapper.insertArdAppApplication(ardAppApplication); result = result + resultSingle; } //加入给pc端websocket转发 List sysRoleList = sysRoleMapper.selectRolePermissionByUserId(commanderId); for(SysRole sysRole : sysRoleList){ if(!sysRole.getRoleKey().equals("appLeader")){ Map resultMap = ardAppApplicationMapper.selectSYCarApplicationByPCIdAndSoilderId(commanderId,usersId); Map> msg = new HashMap(); msg.put("60000",resultMap); for(String id : ONLINE_USER_SESSIONS.keySet()){ if(id.startsWith(commanderId)){ Session session = ONLINE_USER_SESSIONS.get(id); WebSocketUtils.sendMessage(session,msg); break; } } break;//一个pc端用户可能挂接多个角色,每个pc端只转发一次 } } } return result; } @Override public Map>> getCheckPosition(String usersId) { Map>> result = new HashMap(); List> ardAppApplicationList = ardAppApplicationMapper.selectArdAppApplicationByCommanderId(usersId); //查看指挥端位置申请 List> resultCommanderPosition = new ArrayList(); for(Map map : ardAppApplicationList){ if(((String)map.get("applicationType")).equals("Commander")){ resultCommanderPosition.add(map); } } //查看车辆位置申请 List> resultSYCarsPosition = new ArrayList(); for(Map map : ardAppApplicationList){ if(((String)map.get("applicationType")).equals("SYCar")){ resultSYCarsPosition.add(map); } } result.put("commander",resultCommanderPosition); result.put("SYCars",resultSYCarsPosition); return result; } @Override public int approvalCheckPosition(String commanderId, Map para) { String applicationType = para.get("applicationType"); String soilderId = para.get("soilderId"); String state = para.get("state"); String begin = ""; if(state.equals("1")){//state为1,即同意 begin = String.valueOf(new Date().getTime());//设置开始时间 int result = ardAppApplicationMapper.updateArdAppApplicationBeginByCommanderIdAndSoilderIdAndType(commanderId,soilderId,applicationType,begin,state); String key = commanderId + "," + soilderId + "," + applicationType; Thread thread = new Thread(key){//创建线程计时24小时 @Override public void run() { try { Thread.sleep(24*60*60*1000); //Thread.sleep(3*60*1000); } catch (InterruptedException e) { e.printStackTrace(); return; } Thread currentThread = Thread.currentThread(); String state = "000";//state为000,即超时 String commanderId = currentThread.getName().split(",")[0]; String soilderId = currentThread.getName().split(",")[1]; String applicationType = currentThread.getName().split(",")[2]; int result = ardAppApplicationMapper.updateArdAppApplicationBeginByCommanderIdAndSoilderIdAndType(commanderId,soilderId,applicationType,"",state); threadMap.remove(currentThread.getName()); } }; thread.start(); this.threadMap.put(key,thread); return result; }else if(state.equals("-1")){//state为1,即驳回 int result = ardAppApplicationMapper.updateArdAppApplicationBeginByCommanderIdAndSoilderIdAndType(commanderId,soilderId,applicationType,"",state); return result; }else if(state.equals("00")){//state为00,即撤销 String key = commanderId + "," + soilderId + "," + applicationType; try{ this.threadMap.get(key).interrupt();//撤销后线程销毁 }catch(Exception e){ e.printStackTrace(); } this.threadMap.remove(key); int result = ardAppApplicationMapper.updateArdAppApplicationBeginByCommanderIdAndSoilderIdAndType(commanderId,soilderId,applicationType,"",state); return result; } return 0; } @Override public Map>> getCheckPositionTrue(String commanderId) { Map>> result = new HashMap(); List> ardAppApplicationList = ardAppApplicationMapper.selectArdAppApplicationByCommanderIdTrue(commanderId); Date date = new Date(); //查看指挥端位置申请 List> resultCommanderPosition = new ArrayList(); //查看车辆位置申请 List> resultSYCarsPosition = new ArrayList(); for(Map map : ardAppApplicationList){ Long interval = date.getTime() - Long.parseLong((String)map.get("begin")); interval = 24 * 60 * 60 * 1000 - interval; Long hour = interval / (60 * 60 * 1000); Long min = (interval - hour * 60 * 60 * 1000) / (60 * 1000); Long second = (interval - hour * 60 * 60 * 1000 - min * 60 * 1000) / 1000; map.put("time",hour + "时" + min + "分" + second + "秒"); if(((String)map.get("applicationType")).equals("Commander")){ resultCommanderPosition.add(map); }else if(((String)map.get("applicationType")).equals("SYCar")){ resultSYCarsPosition.add(map); } } result.put("commander",resultCommanderPosition); result.put("SYCars",resultSYCarsPosition); return result; } @Override public Map>> getSendPositionTrue(String soilderId) { Map>> result = new HashMap(); List> ardAppApplicationList = ardAppApplicationMapper.selectArdAppApplicationBySoilderIdTrue(soilderId); Date date = new Date(); //查看指挥端位置申请 List> resultCommanderPosition = new ArrayList(); //查看车辆位置申请 List> resultSYCarsPosition = new ArrayList(); for(Map map : ardAppApplicationList){ Long interval = date.getTime() - Long.parseLong((String)map.get("begin")); interval = 24 * 60 * 60 * 1000 - interval; Long hour = interval / (60 * 60 * 1000); Long min = (interval - hour * 60 * 60 * 1000) / (60 * 1000); Long second = (interval - hour * 60 * 60 * 1000 - min * 60 * 1000) / 1000; map.put("time",hour + "时" + min + "分" + second + "秒"); if(((String)map.get("applicationType")).equals("Commander")){ resultCommanderPosition.add(map); }else if(((String)map.get("applicationType")).equals("SYCar")){ resultSYCarsPosition.add(map); } } result.put("commander",resultCommanderPosition); result.put("SYCars",resultSYCarsPosition); return result; } @Override public Map>> getCheckPositionOwn(String soilderId) { Map>> result = new HashMap(); List> ardAppApplicationList = ardAppApplicationMapper.selectArdAppApplicationBySoilderIdFalse(soilderId); Date date = new Date(); //查看指挥端位置申请 List> resultCommanderPosition = new ArrayList(); //查看车辆位置申请 List> resultSYCarsPosition = new ArrayList(); for(Map map : ardAppApplicationList){ /*if(((String)map.get("state")).equals("1")){ Long interval = date.getTime() - Long.parseLong((String)map.get("begin")); interval = 24 * 60 * 60 * 1000 - interval; Long hour = interval / (60 * 60 * 1000); Long min = (interval - hour * 60 * 60 * 1000) / (60 * 1000); map.put("time",hour + "时" + min + "分"); if(((String)map.get("applicationType")).equals("Commander")){ resultCommanderPosition.add(map); }else if(((String)map.get("applicationType")).equals("SYCar")){ resultSYCarsPosition.add(map); } }else{ map.put("time",""); if(((String)map.get("applicationType")).equals("Commander")){ resultCommanderPosition.add(map); }else if(((String)map.get("applicationType")).equals("SYCar")){ resultSYCarsPosition.add(map); } }*/ if(((String)map.get("applicationType")).equals("Commander")){ resultCommanderPosition.add(map); }else if(((String)map.get("applicationType")).equals("SYCar")){ resultSYCarsPosition.add(map); } } result.put("commander",resultCommanderPosition); result.put("SYCars",resultSYCarsPosition); return result; } @Override public int approvalCheckPositionOwn(String soilderId, Map para) { String applicationType = para.get("applicationType"); String commanderId = para.get("commanderId"); int result = ardAppApplicationMapper.updateSoilderCheckByCommanderIdAndSoilderIdAndType(soilderId,commanderId,applicationType); return result; } @Override public List> getCheckPositionNo(String commanderId) {/// List> ardAppApplicationList = ardAppApplicationMapper.selectArdAppApplicationByCommanderIdNoCheck(commanderId); Date date = new Date(); for(Map map : ardAppApplicationList){ if(((String)map.get("begin")).equals("")){ map.put("time",""); }else{ Long interval = date.getTime() - Long.parseLong((String)map.get("begin")); interval = 24 * 60 * 60 * 1000 - interval; Long hour = interval / (60 * 60 * 1000); Long min = (interval - hour * 60 * 60 * 1000) / (60 * 1000); Long second = (interval - hour * 60 * 60 * 1000 - min * 60 * 1000) / 1000; map.put("time",hour + "时" + min + "分" + second + "秒"); } } return ardAppApplicationList; } @Override public Map>>> getSoilderAndCarPositionByCommanderId(String commanderId,Map para) { Map>>> mapResault = new HashMap(); SysUser sysUser = userMapper.selectUserById(commanderId);//获取系统用户 List deptIdList = new ArrayList(); deptIdList.add(sysUser.getDeptId()); deptIdList = getOwnAndChildrenDeptIdList(deptIdList,new ArrayList());//递归查询下属部门主键 List sysUsersResult = userMapper.getOwnAndChildrenSoilderListAll(deptIdList); List sysUsersResultOnline = sysUsersResult.stream().filter(sysUserTest -> sysUserTest.getAppOnlineState().equals("1")).collect(Collectors.toList());//在线用户 List sysUsersResultOffline = sysUsersResult.stream().filter(sysUserTest -> !sysUserTest.getAppOnlineState().equals("1")).collect(Collectors.toList());//离线用户 List> sysUsersOnlineList = new ArrayList(); List> sysUsersOfflineList = new ArrayList(); for(SysUser sysUserIn : sysUsersResultOnline){ Map map = new HashMap(); map.put("userId",sysUserIn.getUserId()); map.put("deptId",sysUserIn.getDeptId()); map.put("userName",sysUserIn.getUserName()); map.put("nickName",sysUserIn.getNickName()); try{ map.put("longitude", AppContainer.getArdAppPositionMap().get(sysUserIn.getUserId()).getLongitude()); map.put("latitude",AppContainer.getArdAppPositionMap().get(sysUserIn.getUserId()).getLatitude()); map.put("altitude",AppContainer.getArdAppPositionMap().get(sysUserIn.getUserId()).getAltitude()); }catch(Exception e){ ArdAppPosition ardAppPosition = ardAppPositionMapper.getLastAPPPositionByUserId(sysUserIn.getUserId()); map.put("longitude",ardAppPosition.getLongitude()); map.put("latitude",ardAppPosition.getLatitude()); map.put("altitude",ardAppPosition.getAltitude()); } sysUsersOnlineList.add(map); } List> sysUsersOnlineNearList = new ArrayList();//在200米内 for(Map mapOn : sysUsersOnlineList){ Double longitude = (Double) mapOn.get("longitude"); Double latitude = (Double) mapOn.get("latitude"); double distance = GisUtil.getDistance(para.get("longitude"),para.get("latitude"),longitude,latitude); if(distance <= 200){ sysUsersOnlineNearList.add(mapOn); } } Map>> appMap = new HashMap(); appMap.put("onlineApp",sysUsersOnlineNearList); for(SysUser sysUserIn : sysUsersResultOffline){ Map map = new HashMap(); map.put("userId",sysUserIn.getUserId()); map.put("deptId",sysUserIn.getDeptId()); map.put("userName",sysUserIn.getUserName()); map.put("nickName",sysUserIn.getNickName()); sysUsersOfflineList.add(map); } appMap.put("offlineApp",sysUsersOfflineList); mapResault.put("app",appMap); ArdSyUser ardSyUserPara = new ArdSyUser(); ardSyUserPara.setSysUserId(commanderId); List ardSyUserList = ardSyUserMapper.selectArdSyUserList(ardSyUserPara);//查询挂接的三一账号 String syURL = ""; List sysConfigResult = sysConfigMapper.selectByType("syCarPT"); if(sysConfigResult.size() > 0){ syURL = sysConfigResult.get(0).getConfigValue(); } if(ardSyUserList.size() == 0 || syURL.equals("")){ List> onlineCar = new ArrayList(); List> offlineCar = new ArrayList(); Map>> carMap = new HashMap(); carMap.put("onlineCar",onlineCar); carMap.put("offlineCar",offlineCar); mapResault.put("car",carMap); return mapResault; } List carIdList = ardSyCarMapper.selectArdSyCarByDeptIds(deptIdList); String carIds = ""; for(String carId : carIdList){ carIds = carIds + carId + ","; } carIds = carIds.substring(0,carIds.length() - 1); String passwordMd5 = DigestUtils.md5Hex(ardSyUserList.get(0).getPassword()); Map syLoginResult = sYClient.logIn(syURL, passwordMd5, ardSyUserList.get(0).getUserId()); String sessionId = (String) syLoginResult.get("sessionId"); Map carNearPositionResult = sYClient.getCarNearPositionByCarId(syURL, carIds, ardSyUserList.get(0).getUserId(),sessionId); if(((String)carNearPositionResult.get("rspCode")).equals("1")){ List> SYCarPositionList = (List>) carNearPositionResult.get("list"); //筛选在线 List> onlineSYCarPositionList = SYCarPositionList.stream().filter(map -> ((String)map.get("stateCn")).startsWith("在线")).collect(Collectors.toList()); //筛选200米范围内 List> onlineSYCarPositionNearList = new ArrayList();//在200米内 for(Map mapOn : onlineSYCarPositionList){ Double longitude = new BigDecimal((String) mapOn.get("lng")).doubleValue(); Double latitude = new BigDecimal((String) mapOn.get("lat")).doubleValue(); double distance = GisUtil.getDistance(para.get("longitude"),para.get("latitude"),longitude,latitude); if(distance <= 200){ mapOn.put("longitude",longitude); mapOn.put("latitude",latitude); onlineSYCarPositionNearList.add(mapOn); } } //for(Map sycar : onlineSYCarPositionList){ for(Map sycar : onlineSYCarPositionNearList){ Map map = ardSyCarMapper.getArdSyCarAndDeptByCarId((String)sycar.get("carId")); String carModel = this.minioEndpoint + "/" + (String) map.get("carModel"); map.put("carModel",carModel); sycar.putAll(map); } //筛选离线 List> offlineSYCarPositionList = SYCarPositionList.stream().filter(map -> ((String)map.get("stateCn")).startsWith("离线")).collect(Collectors.toList()); for(Map sycar : offlineSYCarPositionList){ Map map = ardSyCarMapper.getArdSyCarAndDeptByCarId((String)sycar.get("carId")); String carModel = this.minioEndpoint + "/" + (String) map.get("carModel"); map.put("carModel",carModel); sycar.putAll(map); } Map>> carMap = new HashMap(); //carMap.put("onlineCar",onlineSYCarPositionList); carMap.put("onlineCar",onlineSYCarPositionNearList); carMap.put("offlineCar",offlineSYCarPositionList); mapResault.put("car",carMap); }else{ List> onlineCar = new ArrayList(); List> offlineCar = new ArrayList(); Map>> carMap = new HashMap(); carMap.put("onlineCar",onlineCar); carMap.put("offlineCar",offlineCar); mapResault.put("car",carMap); return mapResault; } return mapResault; } public List getOwnAndChildrenDeptIdList(List deptIdList,List deptIdListr){ deptIdListr.addAll(deptIdList); List result = sysDeptMapper.getChildrenDeptIdList(deptIdList); if(result.size() != 0){ deptIdListr.addAll(result); result = getOwnAndChildrenDeptIdList(result,deptIdListr); } deptIdListr = deptIdListr.stream().distinct().collect(Collectors.toList()); return deptIdListr; } }