|  |  | 
 |  |  | package com.ruoyi.app.application.service.impl; | 
 |  |  |  | 
 |  |  | import java.math.BigDecimal; | 
 |  |  | import java.util.*; | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  |  | 
 |  |  | import com.alibaba.fastjson2.JSON; | 
 |  |  | 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.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-23 | 
 |  |  |  * @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<String,Thread> threadMap = new HashMap(); | 
 |  |  |  | 
 |  |  |     @PostConstruct | 
 |  |  |     public void init(){ | 
 |  |  |         ArdAppApplication para = new ArdAppApplication(); | 
 |  |  |         para.setState("1");//查询同意的申请 | 
 |  |  |         List<ArdAppApplication> 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 applicationId 单兵端申请查看指挥端位置或三一车辆位置主键 | 
 |  |  |      * @param soilderId 单兵端申请查看指挥端位置或三一车辆位置主键 | 
 |  |  |      * @return 单兵端申请查看指挥端位置或三一车辆位置 | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     public ArdAppApplication selectArdAppApplicationByApplicationId(String applicationId) { | 
 |  |  |         return ardAppApplicationMapper.selectArdAppApplicationByApplicationId(applicationId); | 
 |  |  |     public ArdAppApplication selectArdAppApplicationBySoilderId(String soilderId) { | 
 |  |  |         return ardAppApplicationMapper.selectArdAppApplicationBySoilderId(soilderId); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  | 
 |  |  |     /** | 
 |  |  |      * 批量删除单兵端申请查看指挥端位置或三一车辆位置 | 
 |  |  |      * | 
 |  |  |      * @param applicationIds 需要删除的单兵端申请查看指挥端位置或三一车辆位置主键 | 
 |  |  |      * @param soilderIds 需要删除的单兵端申请查看指挥端位置或三一车辆位置主键 | 
 |  |  |      * @return 结果 | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     public int deleteArdAppApplicationByApplicationIds(String[] applicationIds) { | 
 |  |  |         return ardAppApplicationMapper.deleteArdAppApplicationByApplicationIds(applicationIds); | 
 |  |  |     public int deleteArdAppApplicationBySoilderIds(String[] soilderIds) { | 
 |  |  |         return ardAppApplicationMapper.deleteArdAppApplicationBySoilderIds(soilderIds); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 删除单兵端申请查看指挥端位置或三一车辆位置信息 | 
 |  |  |      * | 
 |  |  |      * @param applicationId 单兵端申请查看指挥端位置或三一车辆位置主键 | 
 |  |  |      * @param soilderId 单兵端申请查看指挥端位置或三一车辆位置主键 | 
 |  |  |      * @return 结果 | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     public int deleteArdAppApplicationByApplicationId(String applicationId) { | 
 |  |  |         return ardAppApplicationMapper.deleteArdAppApplicationByApplicationId(applicationId); | 
 |  |  |     public int deleteArdAppApplicationBySoilderId(String soilderId) { | 
 |  |  |         return ardAppApplicationMapper.deleteArdAppApplicationBySoilderId(soilderId); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  | 
 |  |  |             ardAppApplication.setApplicationType("Commander"); | 
 |  |  |             ardAppApplication.setBegin(""); | 
 |  |  |             ardAppApplication.setState("0"); | 
 |  |  |             ardAppApplication.setSoilderCheck("true");//指挥端未审批也设为true,不需要单兵端查看 | 
 |  |  |             int resultSingle = ardAppApplicationMapper.updateArdAppApplicationByCommanderIdAndSoilderIdAndType(ardAppApplication); | 
 |  |  |             result = result + resultSingle; | 
 |  |  |             if(resultSingle == 0){ | 
 |  |  | 
 |  |  |             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<SysRole> sysRoleList = sysRoleMapper.selectRolePermissionByUserId(commanderId); | 
 |  |  |             for(SysRole sysRole : sysRoleList){ | 
 |  |  |                 if(!sysRole.getRoleKey().equals("appLeader")){ | 
 |  |  |                     Map<String,Object> resultMap = ardAppApplicationMapper.selectSYCarApplicationByPCIdAndSoilderId(commanderId,usersId); | 
 |  |  |                     Map<String,Map<String,Object>> 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<String, List<Map<String, Object>>> getCheckPosition(String usersId) { | 
 |  |  |         Map<String, List<Map<String, Object>>> result = new HashMap(); | 
 |  |  |         //查看指挥端位置申请 | 
 |  |  |         List<Map<String,Object>> ardAppApplicationList = ardAppApplicationMapper.selectArdAppApplicationByCommanderId(usersId); | 
 |  |  |         //查看指挥端位置申请 | 
 |  |  |         List<Map<String, Object>> resultCommanderPosition = new ArrayList(); | 
 |  |  |         for(Map<String, Object> map : ardAppApplicationList){ | 
 |  |  |             if(((String)map.get("applicationType")).equals("Commander")){ | 
 |  |  | 
 |  |  |         } | 
 |  |  |         return 0; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public Map<String, List<Map<String, Object>>> getCheckPositionTrue(String commanderId) { | 
 |  |  |         Map<String, List<Map<String, Object>>> result = new HashMap(); | 
 |  |  |         List<Map<String,Object>> ardAppApplicationList = ardAppApplicationMapper.selectArdAppApplicationByCommanderIdTrue(commanderId); | 
 |  |  |         Date date = new Date(); | 
 |  |  |         //查看指挥端位置申请 | 
 |  |  |         List<Map<String, Object>> resultCommanderPosition = new ArrayList(); | 
 |  |  |         //查看车辆位置申请 | 
 |  |  |         List<Map<String, Object>> resultSYCarsPosition = new ArrayList(); | 
 |  |  |         for(Map<String, Object> 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<String, List<Map<String, Object>>> getSendPositionTrue(String soilderId) { | 
 |  |  |         Map<String, List<Map<String, Object>>> result = new HashMap(); | 
 |  |  |         List<Map<String,Object>> ardAppApplicationList = ardAppApplicationMapper.selectArdAppApplicationBySoilderIdTrue(soilderId); | 
 |  |  |         Date date = new Date(); | 
 |  |  |         //查看指挥端位置申请 | 
 |  |  |         List<Map<String, Object>> resultCommanderPosition = new ArrayList(); | 
 |  |  |         //查看车辆位置申请 | 
 |  |  |         List<Map<String, Object>> resultSYCarsPosition = new ArrayList(); | 
 |  |  |         for(Map<String, Object> 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<String, List<Map<String, Object>>> getCheckPositionOwn(String soilderId) { | 
 |  |  |         Map<String, List<Map<String, Object>>> result = new HashMap(); | 
 |  |  |         List<Map<String,Object>> ardAppApplicationList = ardAppApplicationMapper.selectArdAppApplicationBySoilderIdFalse(soilderId); | 
 |  |  |         Date date = new Date(); | 
 |  |  |         //查看指挥端位置申请 | 
 |  |  |         List<Map<String, Object>> resultCommanderPosition = new ArrayList(); | 
 |  |  |         //查看车辆位置申请 | 
 |  |  |         List<Map<String, Object>> resultSYCarsPosition = new ArrayList(); | 
 |  |  |         for(Map<String, Object> 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<String, String> para) { | 
 |  |  |         String applicationType = para.get("applicationType"); | 
 |  |  |         String commanderId = para.get("commanderId"); | 
 |  |  |         int result = ardAppApplicationMapper.updateSoilderCheckByCommanderIdAndSoilderIdAndType(soilderId,commanderId,applicationType); | 
 |  |  |         return result; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public List<Map<String, Object>> getCheckPositionNo(String commanderId) {/// | 
 |  |  |         List<Map<String,Object>> ardAppApplicationList = ardAppApplicationMapper.selectArdAppApplicationByCommanderIdNoCheck(commanderId); | 
 |  |  |         Date date = new Date(); | 
 |  |  |         for(Map<String, Object> 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<String,Map<String,List<Map<String,Object>>>> getSoilderAndCarPositionByCommanderId(String commanderId,Map<String, Double> para) { | 
 |  |  |         Map<String,Map<String,List<Map<String,Object>>>> mapResault = new HashMap(); | 
 |  |  |         SysUser sysUser = userMapper.selectUserById(commanderId);//获取系统用户 | 
 |  |  |         List<Long> deptIdList = new ArrayList(); | 
 |  |  |         deptIdList.add(sysUser.getDeptId()); | 
 |  |  |         deptIdList = getOwnAndChildrenDeptIdList(deptIdList,new ArrayList());//递归查询下属部门主键 | 
 |  |  |         List<SysUser> sysUsersResult = userMapper.getOwnAndChildrenSoilderListAll(deptIdList); | 
 |  |  |         List<SysUser> sysUsersResultOnline = sysUsersResult.stream().filter(sysUserTest -> sysUserTest.getAppOnlineState().equals("1")).collect(Collectors.toList());//在线用户 | 
 |  |  |         List<SysUser> sysUsersResultOffline = sysUsersResult.stream().filter(sysUserTest -> !sysUserTest.getAppOnlineState().equals("1")).collect(Collectors.toList());//离线用户 | 
 |  |  |         List<Map<String,Object>> sysUsersOnlineList = new ArrayList(); | 
 |  |  |         List<Map<String,Object>> sysUsersOfflineList = new ArrayList(); | 
 |  |  |         for(SysUser sysUserIn : sysUsersResultOnline){ | 
 |  |  |             Map<String,Object> 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<Map<String,Object>> sysUsersOnlineNearList = new ArrayList();//在200米内 | 
 |  |  |         for(Map<String,Object> 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<String,List<Map<String,Object>>> appMap = new HashMap(); | 
 |  |  |         appMap.put("onlineApp",sysUsersOnlineNearList); | 
 |  |  |         for(SysUser sysUserIn : sysUsersResultOffline){ | 
 |  |  |             Map<String,Object> 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<ArdSyUser> ardSyUserList = ardSyUserMapper.selectArdSyUserList(ardSyUserPara);//查询挂接的三一账号 | 
 |  |  |  | 
 |  |  |         String syURL = ""; | 
 |  |  |         List<SysConfig> sysConfigResult = sysConfigMapper.selectByType("syCarPT"); | 
 |  |  |         if(sysConfigResult.size() > 0){ | 
 |  |  |             syURL = sysConfigResult.get(0).getConfigValue(); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if(ardSyUserList.size() == 0 || syURL.equals("")){ | 
 |  |  |             List<Map<String,Object>> onlineCar = new ArrayList(); | 
 |  |  |             List<Map<String,Object>> offlineCar = new ArrayList(); | 
 |  |  |             Map<String,List<Map<String,Object>>> carMap = new HashMap(); | 
 |  |  |             carMap.put("onlineCar",onlineCar); | 
 |  |  |             carMap.put("offlineCar",offlineCar); | 
 |  |  |             mapResault.put("car",carMap); | 
 |  |  |             return mapResault; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         List<String> 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<String,Object> syLoginResult = sYClient.logIn(syURL, passwordMd5, ardSyUserList.get(0).getUserId()); | 
 |  |  |         String sessionId = (String) syLoginResult.get("sessionId"); | 
 |  |  |         Map<String,Object> carNearPositionResult = sYClient.getCarNearPositionByCarId(syURL, carIds, ardSyUserList.get(0).getUserId(),sessionId); | 
 |  |  |         if(((String)carNearPositionResult.get("rspCode")).equals("1")){ | 
 |  |  |             List<Map<String,Object>> SYCarPositionList = (List<Map<String, Object>>) carNearPositionResult.get("list"); | 
 |  |  |             //筛选在线 | 
 |  |  |             List<Map<String,Object>> onlineSYCarPositionList = SYCarPositionList.stream().filter(map -> ((String)map.get("stateCn")).startsWith("在线")).collect(Collectors.toList()); | 
 |  |  |             //筛选200米范围内 | 
 |  |  |             List<Map<String,Object>> onlineSYCarPositionNearList = new ArrayList();//在200米内 | 
 |  |  |             for(Map<String,Object> 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<String,Object> sycar : onlineSYCarPositionList){ | 
 |  |  |             for(Map<String,Object> sycar : onlineSYCarPositionNearList){ | 
 |  |  |                 Map<String,Object> map = ardSyCarMapper.getArdSyCarAndDeptByCarId((String)sycar.get("carId")); | 
 |  |  |                 String carModel = this.minioEndpoint + "/" + (String) map.get("carModel"); | 
 |  |  |                 map.put("carModel",carModel); | 
 |  |  |                 sycar.putAll(map); | 
 |  |  |             } | 
 |  |  |             //筛选离线 | 
 |  |  |             List<Map<String,Object>> offlineSYCarPositionList = SYCarPositionList.stream().filter(map -> ((String)map.get("stateCn")).startsWith("离线")).collect(Collectors.toList()); | 
 |  |  |             for(Map<String,Object> sycar : offlineSYCarPositionList){ | 
 |  |  |                 Map<String,Object> map = ardSyCarMapper.getArdSyCarAndDeptByCarId((String)sycar.get("carId")); | 
 |  |  |                 String carModel = this.minioEndpoint + "/" + (String) map.get("carModel"); | 
 |  |  |                 map.put("carModel",carModel); | 
 |  |  |                 sycar.putAll(map); | 
 |  |  |             } | 
 |  |  |             Map<String,List<Map<String,Object>>> carMap = new HashMap(); | 
 |  |  |             //carMap.put("onlineCar",onlineSYCarPositionList); | 
 |  |  |             carMap.put("onlineCar",onlineSYCarPositionNearList); | 
 |  |  |             carMap.put("offlineCar",offlineSYCarPositionList); | 
 |  |  |             mapResault.put("car",carMap); | 
 |  |  |         }else{ | 
 |  |  |             List<Map<String,Object>> onlineCar = new ArrayList(); | 
 |  |  |             List<Map<String,Object>> offlineCar = new ArrayList(); | 
 |  |  |             Map<String,List<Map<String,Object>>> carMap = new HashMap(); | 
 |  |  |             carMap.put("onlineCar",onlineCar); | 
 |  |  |             carMap.put("offlineCar",offlineCar); | 
 |  |  |             mapResault.put("car",carMap); | 
 |  |  |             return mapResault; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return mapResault; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public Map<String, List<Map<String, Object>>> getSendPositionALL(String soilderId) { | 
 |  |  |         Map<String, List<Map<String, Object>>> result = new HashMap(); | 
 |  |  |         List<Map<String,Object>> ardAppApplicationList = ardAppApplicationMapper.selectArdAppApplicationBySoilderIdALL(soilderId); | 
 |  |  |         Date date = new Date(); | 
 |  |  |         //查看指挥端位置申请 | 
 |  |  |         List<Map<String, Object>> resultCommanderPosition = new ArrayList(); | 
 |  |  |         //查看车辆位置申请 | 
 |  |  |         List<Map<String, Object>> resultSYCarsPosition = new ArrayList(); | 
 |  |  |         for(Map<String, Object> map : ardAppApplicationList){ | 
 |  |  |             if(((String)map.get("begin")).equals("")){ | 
 |  |  |                 map.put("time",""); | 
 |  |  |                 if(((String)map.get("applicationType")).equals("Commander")){ | 
 |  |  |                     resultCommanderPosition.add(map); | 
 |  |  |                 }else if(((String)map.get("applicationType")).equals("SYCar")){ | 
 |  |  |                     resultSYCarsPosition.add(map); | 
 |  |  |                 } | 
 |  |  |             }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 + "秒"); | 
 |  |  |                 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; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public List<Long> getOwnAndChildrenDeptIdList(List<Long> deptIdList,List<Long> deptIdListr){ | 
 |  |  |         deptIdListr.addAll(deptIdList); | 
 |  |  |         List<Long> result = sysDeptMapper.getChildrenDeptIdList(deptIdList); | 
 |  |  |         if(result.size() != 0){ | 
 |  |  |             deptIdListr.addAll(result); | 
 |  |  |             result = getOwnAndChildrenDeptIdList(result,deptIdListr); | 
 |  |  |         } | 
 |  |  |         deptIdListr = deptIdListr.stream().distinct().collect(Collectors.toList()); | 
 |  |  |         return deptIdListr; | 
 |  |  |     } | 
 |  |  | } |