fix:引擎申请设备超时后因根据设备id释放设备引起正在执行任务的设备失去使用权。
修改方案: 1.请求方申请设备时自带token值,设备管理服务判断设备是否空闲,如果空闲,那么请求方提供的token作为本次申请的token; 2.如果在申请过程中出现问题,请求方依然可以根据token释放设备,设备管理服务接收到改token的释放也会检查token是否有效 设备管理 1.增加接口:批量申请设备使用时,使用请求方提供的token 执行引擎 1.更改设备申请接口 2.修改移动和PC的设备申请逻辑,将两者相同逻辑部分进行抽取,简化代码 3.配置文件增加配置,亦可以不修改,接口地址有默认值。hz_1122_temp
							parent
							
								
									e6b4fe6d88
								
							
						
					
					
						commit
						5a5bef44c2
					
				|  | @ -143,4 +143,10 @@ public class AtuServerConfig { | ||||||
|     private String remoteProtocol; |     private String remoteProtocol; | ||||||
| 
 | 
 | ||||||
|     private Boolean IsPcExecutor; |     private Boolean IsPcExecutor; | ||||||
|  | 
 | ||||||
|  |     private String acquireDeviceWithTokenUrl; | ||||||
|  | 
 | ||||||
|  |     public String getAcquireDeviceWithTokenUrl() { | ||||||
|  |         return StringUtils.isBlank(this.acquireDeviceWithTokenUrl) ?  "/api/cctp-device-mgr/pub/deviceList/apply/batchWithToken" : this.acquireDeviceWithTokenUrl; | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,21 @@ | ||||||
|  | package net.northking.cctp.se.device.dto; | ||||||
|  | 
 | ||||||
|  | import io.swagger.annotations.ApiModel; | ||||||
|  | import io.swagger.annotations.ApiModelProperty; | ||||||
|  | import lombok.Data; | ||||||
|  | import lombok.ToString; | ||||||
|  | 
 | ||||||
|  | @Data | ||||||
|  | @ApiModel(value = "设备申请") | ||||||
|  | @ToString | ||||||
|  | public class ApplyDeviceDto { | ||||||
|  | 
 | ||||||
|  |     @ApiModelProperty(value = "设备Id") | ||||||
|  |     private String id; | ||||||
|  | 
 | ||||||
|  |     @ApiModelProperty(value = "设备类型", notes = "1-pc,2-移动") | ||||||
|  |     private String type; | ||||||
|  | 
 | ||||||
|  |     @ApiModelProperty(value = "token", notes = "可由请求方带上") | ||||||
|  |     private String token; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,25 @@ | ||||||
|  | package net.northking.cctp.se.device.dto; | ||||||
|  | 
 | ||||||
|  | import io.swagger.annotations.ApiModel; | ||||||
|  | import io.swagger.annotations.ApiModelProperty; | ||||||
|  | import lombok.Data; | ||||||
|  | import lombok.ToString; | ||||||
|  | 
 | ||||||
|  | import java.util.List; | ||||||
|  | 
 | ||||||
|  | @Data | ||||||
|  | @ApiModel(value = "设备批量申请dto") | ||||||
|  | @ToString | ||||||
|  | public class BatchApplyDeviceDto { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     @ApiModelProperty(value = "申请人id") | ||||||
|  |     private String id; | ||||||
|  | 
 | ||||||
|  |     @ApiModelProperty(value = "使用来源,engine为引擎使用0") | ||||||
|  |     private String userBy; | ||||||
|  | 
 | ||||||
|  |     @ApiModelProperty(value = "设备列表") | ||||||
|  |     private List<ApplyDeviceDto> deviceList; | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -8,6 +8,8 @@ import com.rabbitmq.client.GetResponse; | ||||||
| import net.northking.cctp.common.http.ResultWrapper; | import net.northking.cctp.common.http.ResultWrapper; | ||||||
| import net.northking.cctp.element.core.exception.ExecuteException; | import net.northking.cctp.element.core.exception.ExecuteException; | ||||||
| import net.northking.cctp.se.config.AtuServerConfig; | import net.northking.cctp.se.config.AtuServerConfig; | ||||||
|  | import net.northking.cctp.se.device.dto.ApplyDeviceDto; | ||||||
|  | import net.northking.cctp.se.device.dto.BatchApplyDeviceDto; | ||||||
| import net.northking.cctp.se.dto.ScriptEngineInfo; | import net.northking.cctp.se.dto.ScriptEngineInfo; | ||||||
| import net.northking.cctp.se.exec.constant.AtuExecConstant; | import net.northking.cctp.se.exec.constant.AtuExecConstant; | ||||||
| import net.northking.cctp.se.lifecycle.EngineRuntime; | import net.northking.cctp.se.lifecycle.EngineRuntime; | ||||||
|  | @ -24,11 +26,12 @@ import org.springframework.amqp.core.Message; | ||||||
| import org.springframework.amqp.rabbit.core.RabbitAdmin; | import org.springframework.amqp.rabbit.core.RabbitAdmin; | ||||||
| import org.springframework.amqp.rabbit.core.RabbitTemplate; | import org.springframework.amqp.rabbit.core.RabbitTemplate; | ||||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||||
| import org.springframework.http.HttpStatus; | import org.springframework.core.ParameterizedTypeReference; | ||||||
| import org.springframework.http.ResponseEntity; | import org.springframework.http.*; | ||||||
| import org.springframework.scheduling.annotation.Scheduled; | import org.springframework.scheduling.annotation.Scheduled; | ||||||
| import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||||
| import org.springframework.util.CollectionUtils; | import org.springframework.util.CollectionUtils; | ||||||
|  | import org.springframework.util.DigestUtils; | ||||||
| import org.springframework.web.client.RestTemplate; | import org.springframework.web.client.RestTemplate; | ||||||
| 
 | 
 | ||||||
| import java.util.*; | import java.util.*; | ||||||
|  | @ -98,42 +101,10 @@ public class AtuPlanTaskSchedule { | ||||||
|                 //获取引擎注册后的设备id
 |                 //获取引擎注册后的设备id
 | ||||||
|                 EngineRuntime engineRuntime = EngineRuntime.getRuntime(); |                 EngineRuntime engineRuntime = EngineRuntime.getRuntime(); | ||||||
|                 ScriptEngineInfo info = engineRuntime.getEngineInfo(); |                 ScriptEngineInfo info = engineRuntime.getEngineInfo(); | ||||||
|                 Map<String,Object> paramMap = new HashMap<>(); |                 List<String> deviceList = Collections.singletonList(taskDeviceId);  // 需要申请的设备集合
 | ||||||
|                 paramMap.put("id",info.getEngineId()); |  | ||||||
|                 List<String> tryAcqurieDeviceIdList = Collections.singletonList(taskDeviceId); |  | ||||||
|                 paramMap.put("deviceList",tryAcqurieDeviceIdList); |  | ||||||
|                 paramMap.put("type","1"); |  | ||||||
|                 paramMap.put("userBy","engine"); |  | ||||||
|                 String url = atuServerConfig.getServerUrl() + atuServerConfig.getTryAcqurieDeviceUrl(); |  | ||||||
|                 try { |  | ||||||
|                     ResponseEntity<ResultWrapper> result = restTemplate.postForEntity(url, paramMap, ResultWrapper.class); |  | ||||||
|                     if(HttpStatus.OK.equals(result.getStatusCode())){ |  | ||||||
|                         ResultWrapper deviceResult = result.getBody(); |  | ||||||
|                         if (deviceResult != null && deviceResult.isSuccess()) { |  | ||||||
|                             List<Map<String,String>> body = (List<Map<String,String>>)deviceResult.getData(); |  | ||||||
|                             if(!CollectionUtils.isEmpty(body)){ |  | ||||||
|                                 logger.debug("移动任务请求占用成功移动端设备信息:"+JSON.toJSONString(body)); |  | ||||||
|                                 for (int i = 0; i < body.size(); i++) { |  | ||||||
|                                     Map<String, String> deviceMap =  body.get(i); |  | ||||||
|                                     String deviceId = deviceMap.get("id"); |  | ||||||
|                                     String deviceToken = deviceMap.get("token"); |  | ||||||
|                                     //获取设备对应的一条计划信息
 |  | ||||||
|                                     boolean isUsed = getTaskFromQueue(deviceId, deviceToken,TYPE_MOBILE); |  | ||||||
|                                     if(!isUsed){ |  | ||||||
|                                         //无任务 释放设备
 |  | ||||||
|                                         logger.debug("无任务释放移动端设备:"+deviceId); |  | ||||||
|                                         releaseDevice(deviceToken); |  | ||||||
|                                     } |  | ||||||
|                                 } |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
| 
 | 
 | ||||||
|                     } |                 List<ApplyDeviceDto> resultList = acquireDevice(deviceList, TYPE_MOBILE, info.getEngineId()); | ||||||
|                 }catch (Exception e){ |                 useDeviceGetTask(resultList, TYPE_MOBILE); | ||||||
|                     logger.error("请求占用设备失败,原因:",e); |  | ||||||
|                     //释放所有设备
 |  | ||||||
|                     releaseDevices(e, info.getEngineId(), tryAcqurieDeviceIdList); |  | ||||||
|                 } |  | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | @ -152,74 +123,88 @@ public class AtuPlanTaskSchedule { | ||||||
|         if(!CollectionUtils.isEmpty(batchList)){ |         if(!CollectionUtils.isEmpty(batchList)){ | ||||||
|             logger.debug("存在PC类型的委托任务共{}条", batchList.size()); |             logger.debug("存在PC类型的委托任务共{}条", batchList.size()); | ||||||
|             if(batchList.size()>0){ |             if(batchList.size()>0){ | ||||||
|                 Map<String,Object> paramMap = new HashMap<>(); |  | ||||||
|                 List<String> list = new ArrayList<>(); |                 List<String> list = new ArrayList<>(); | ||||||
|                 list.add(deviceId); |                 list.add(deviceId); | ||||||
|                 paramMap.put("id",engineId); | 
 | ||||||
|                 paramMap.put("deviceList",list); |                 List<ApplyDeviceDto> resultList = acquireDevice(list, TYPE_PC, engineId); | ||||||
|                 paramMap.put("type","2"); |                 useDeviceGetTask(resultList, TYPE_PC); | ||||||
|                 paramMap.put("userBy","engine"); |             } | ||||||
|                 //判断设备是否空闲
 |         } | ||||||
|                 String url = atuServerConfig.getServerUrl() + atuServerConfig.getTryAcqurieDeviceUrl(); |     } | ||||||
|  | 
 | ||||||
|  |     private void useDeviceGetTask(List<ApplyDeviceDto> deviceList, String type) { | ||||||
|  |         if (!deviceList.isEmpty()) { | ||||||
|  |             for (ApplyDeviceDto device : deviceList) { | ||||||
|  |                 boolean isUsed = false; | ||||||
|                 try { |                 try { | ||||||
|                     ResponseEntity<ResultWrapper> resultEntity = restTemplate.postForEntity(url, paramMap, ResultWrapper.class); |                     logger.debug("设备{}占用成功,token:{}", device.getId(), device.getToken()); | ||||||
|                     logger.debug("pc任务请求设备使用结果:"+ JSON.toJSONString(resultEntity)); |                     isUsed = getTaskFromQueue(device.getId(), device.getToken(), type); | ||||||
|                     if (HttpStatus.OK.equals(resultEntity.getStatusCode())) { |  | ||||||
|                         ResultWrapper deviceResult = resultEntity.getBody(); |  | ||||||
|                         if (deviceResult!= null && deviceResult.isSuccess()) { |  | ||||||
|                             List<Map<String, String>> body = (List<Map<String, String>>) deviceResult.getData(); |  | ||||||
|                             if (!CollectionUtils.isEmpty(body)) { |  | ||||||
|                                 Map<String, String> deviceMap = body.get(0); |  | ||||||
|                                 String deviceToken = deviceMap.get("token"); |  | ||||||
|                                 logger.debug("设备token:" + deviceToken); |  | ||||||
|                                 logger.debug("当前设备{}占用成功。", deviceId); |  | ||||||
|                                 boolean isUsed = getTaskFromQueue(deviceId, deviceToken, TYPE_PC); |  | ||||||
|                     if (!isUsed) { |                     if (!isUsed) { | ||||||
|                                     //设备无任务可领
 |                         // 设备无任务可领
 | ||||||
|                                     logger.debug("无任务释放PC设备:" + deviceId); |                         logger.debug("无任务释放设备:{}", device.getId()); | ||||||
|                                     releaseDevice(deviceToken); |  | ||||||
|                                 } |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
|                     } |                     } | ||||||
|                 } catch (Exception e) { |                 } catch (Exception e) { | ||||||
|                     logger.error("设备请求占用异常:",e); |                     logger.error("从队列获取任务失败,准备释放设备{}", device.getId(), e); | ||||||
|                     releaseDevices(e, info.getEngineId(), list); |                 } finally { | ||||||
|  |                     if (!isUsed) { | ||||||
|  |                         releaseDevice(device.getToken()); | ||||||
|  |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private void releaseDevices(Exception e, String engineId, List<String> deviceIds) { | 
 | ||||||
|         //释放所有设备
 |     /** | ||||||
|         String errorMsg = e.getMessage(); |      * | ||||||
|         if (errorMsg.contains("Read timed out")) { |      * @param deviceList    需要申请的设备集合 | ||||||
|             int count = 0; |      * @param type 1-pc 2-移动 | ||||||
|             Map<String, Object> requestMap = new HashMap<>(); |      * @param engineId  引擎id | ||||||
|             requestMap.put("id", engineId); |      * @return | ||||||
|             requestMap.put("deviceList", deviceIds); |      */ | ||||||
|             while (count++ < 50) { |     private List<ApplyDeviceDto> acquireDevice(List<String> deviceList, String type, String engineId) { | ||||||
|  |         if (deviceList.isEmpty()) { | ||||||
|  |             return new ArrayList<>(); | ||||||
|  |         } | ||||||
|  |         BatchApplyDeviceDto queryDto = new BatchApplyDeviceDto(); | ||||||
|  |         queryDto.setId(engineId); | ||||||
|  |         queryDto.setUserBy("engine"); | ||||||
|  |         List<ApplyDeviceDto> queryDeviceList = new ArrayList<>(); | ||||||
|  |         queryDto.setDeviceList(queryDeviceList); | ||||||
|  |         for (String deviceId : deviceList) { | ||||||
|  |             ApplyDeviceDto dto = new ApplyDeviceDto(); | ||||||
|  |             dto.setId(deviceId); | ||||||
|  |             dto.setType(type); | ||||||
|  |             dto.setToken(DigestUtils.md5DigestAsHex(String.format("%s@%s@%s", deviceId, engineId, System.currentTimeMillis()).getBytes())); | ||||||
|  |             queryDeviceList.add(dto); | ||||||
|  |         } | ||||||
|         try { |         try { | ||||||
|                     logger.debug("pc任务请求占用设备超时处理===="); |             String url = atuServerConfig.getServerUrl() + atuServerConfig.getAcquireDeviceWithTokenUrl(); | ||||||
|                     //请求超时释放请求设备
 |             HttpHeaders headers = new HttpHeaders(); | ||||||
|                     String urlRelease = atuServerConfig.getServerUrl() + atuServerConfig.getReleaseDeviceBatch(); |             headers.setContentType(MediaType.APPLICATION_JSON); | ||||||
|                     ResponseEntity<ResultWrapper> entity = restTemplate.postForEntity(urlRelease, requestMap, ResultWrapper.class); |             HttpEntity<BatchApplyDeviceDto> requestEntity = new HttpEntity<>(queryDto, headers); | ||||||
|                     if (HttpStatus.OK == entity.getStatusCode()) { |             ResponseEntity<ResultWrapper<List<ApplyDeviceDto>>> resultEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, new ParameterizedTypeReference<ResultWrapper<List<ApplyDeviceDto>>>(){}); | ||||||
|                         count += 50; |             logger.debug("{} 任务请求设备使用是结果:{}", TYPE_MOBILE.equals(type) ? "移动" : "PC", JSON.toJSONString(resultEntity)); | ||||||
|                     } |             if (resultEntity.getStatusCode().is2xxSuccessful()) { | ||||||
|                     Thread.sleep(2000); |                 ResultWrapper<List<ApplyDeviceDto>> deviceResult = resultEntity.getBody(); | ||||||
|                 } catch (Exception innerE) { |                 if (deviceResult != null && deviceResult.isSuccess() && deviceResult.getData() != null && !deviceResult.getData().isEmpty()) { | ||||||
|                     // todo: 增加发送队列
 |                     return deviceResult.getData(); | ||||||
|                     logger.error("超时释放设备失败:", innerE); |  | ||||||
|                     logger.debug("使用队列方式释放使用的设备:{}", requestMap); |  | ||||||
|                     try { |  | ||||||
|                         rabbitTemplate.convertAndSend(AtuExecConstant.ENGINE_RELEASE_ID, new Message(om.writeValueAsBytes(requestMap))); |  | ||||||
|                         count += 50; |  | ||||||
|                     } catch (JsonProcessingException jpe) { |  | ||||||
|                         logger.error("释放设备失败", jpe); |  | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  |         } catch (Exception e) { | ||||||
|  |             logger.error("设备请求占用异常", e); | ||||||
|  |             releaseDeviceAsException(queryDeviceList); | ||||||
|         } |         } | ||||||
|  |         return new ArrayList<>(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * 由于token是引擎自行创建,如果出现申请出错的时候,也可以使用该token释放,设备管理会自行判断该token是否有效 | ||||||
|  |      * @param queryDeviceList 申请的设备集合 | ||||||
|  |      */ | ||||||
|  |     private void releaseDeviceAsException(List<ApplyDeviceDto> queryDeviceList) { | ||||||
|  |         for (ApplyDeviceDto dto : queryDeviceList) { | ||||||
|  |             releaseDevice(dto.getToken()); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -44,6 +44,7 @@ atu: | ||||||
|     projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} |     projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} | ||||||
|     testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl |     testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl | ||||||
|     busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName |     busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName | ||||||
|  |     acquireDeviceWithTokenUrl: /api/cctp-device-mgr/pub/deviceList/apply/batchWithToken | ||||||
|   engine: |   engine: | ||||||
|     executor-pool: |     executor-pool: | ||||||
|       pcSize: 1 |       pcSize: 1 | ||||||
|  |  | ||||||
|  | @ -44,6 +44,7 @@ atu: | ||||||
|     projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} |     projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} | ||||||
|     testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl |     testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl | ||||||
|     busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName |     busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName | ||||||
|  |     acquireDeviceWithTokenUrl: /api/cctp-device-mgr/pub/deviceList/apply/batchWithToken | ||||||
|   engine: |   engine: | ||||||
|     executor-pool: |     executor-pool: | ||||||
|       pcSize: 1 |       pcSize: 1 | ||||||
|  |  | ||||||
|  | @ -45,6 +45,7 @@ atu: | ||||||
|     projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} |     projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} | ||||||
|     testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl |     testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl | ||||||
|     busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName |     busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName | ||||||
|  |     acquireDeviceWithTokenUrl: /api/cctp-device-mgr/pub/deviceList/apply/batchWithToken | ||||||
|   engine: |   engine: | ||||||
|     executor-pool: |     executor-pool: | ||||||
|       pcSize: 1 |       pcSize: 1 | ||||||
|  |  | ||||||
|  | @ -44,6 +44,7 @@ atu: | ||||||
|     projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} |     projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} | ||||||
|     testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl |     testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl | ||||||
|     busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName |     busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName | ||||||
|  |     acquireDeviceWithTokenUrl: /api/cctp-device-mgr/pub/deviceList/apply/batchWithToken | ||||||
|   engine: |   engine: | ||||||
|     executor-pool: |     executor-pool: | ||||||
|       pcSize: 1 |       pcSize: 1 | ||||||
|  |  | ||||||
|  | @ -44,6 +44,7 @@ atu: | ||||||
|     projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} |     projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} | ||||||
|     testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl |     testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl | ||||||
|     busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName |     busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName | ||||||
|  |     acquireDeviceWithTokenUrl: /api/cctp-device-mgr/pub/deviceList/apply/batchWithToken | ||||||
|   engine: |   engine: | ||||||
|     executor-pool: |     executor-pool: | ||||||
|       pcSize: 1 |       pcSize: 1 | ||||||
|  |  | ||||||
|  | @ -45,6 +45,7 @@ atu: | ||||||
|     projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} |     projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} | ||||||
|     testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl |     testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl | ||||||
|     busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName |     busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName | ||||||
|  |     acquireDeviceWithTokenUrl: /api/cctp-device-mgr/pub/deviceList/apply/batchWithToken | ||||||
|   engine: |   engine: | ||||||
|     executor-pool: |     executor-pool: | ||||||
|       pcSize: 1 |       pcSize: 1 | ||||||
|  |  | ||||||
|  | @ -46,6 +46,7 @@ atu: | ||||||
|     projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} |     projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} | ||||||
|     testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl |     testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl | ||||||
|     busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName |     busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName | ||||||
|  |     acquireDeviceWithTokenUrl: /api/cctp-device-mgr/pub/deviceList/apply/batchWithToken | ||||||
|   engine: |   engine: | ||||||
|     executor-pool: |     executor-pool: | ||||||
|       pcSize: 1 |       pcSize: 1 | ||||||
|  |  | ||||||
|  | @ -44,6 +44,7 @@ atu: | ||||||
|     projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} |     projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} | ||||||
|     testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl |     testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl | ||||||
|     busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName |     busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName | ||||||
|  |     acquireDeviceWithTokenUrl: /api/cctp-device-mgr/pub/deviceList/apply/batchWithToken | ||||||
|   engine: |   engine: | ||||||
|     executor-pool: |     executor-pool: | ||||||
|       pcSize: 1 |       pcSize: 1 | ||||||
|  |  | ||||||
|  | @ -44,6 +44,7 @@ atu: | ||||||
|     projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} |     projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} | ||||||
|     testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl |     testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl | ||||||
|     busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName |     busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName | ||||||
|  |     acquireDeviceWithTokenUrl: /api/cctp-device-mgr/pub/deviceList/apply/batchWithToken | ||||||
|   engine: |   engine: | ||||||
|     executor-pool: |     executor-pool: | ||||||
|       pcSize: 1 |       pcSize: 1 | ||||||
|  |  | ||||||
|  | @ -46,6 +46,7 @@ atu: | ||||||
|     projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} |     projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} | ||||||
|     testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl |     testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl | ||||||
|     busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName |     busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName | ||||||
|  |     acquireDeviceWithTokenUrl: /api/cctp-device-mgr/pub/deviceList/apply/batchWithToken | ||||||
|   engine: |   engine: | ||||||
|     executor-pool: |     executor-pool: | ||||||
|       pcSize: 1 |       pcSize: 1 | ||||||
|  |  | ||||||
|  | @ -46,6 +46,7 @@ atu: | ||||||
|     projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} |     projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} | ||||||
|     testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl |     testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl | ||||||
|     busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName |     busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName | ||||||
|  |     acquireDeviceWithTokenUrl: /api/cctp-device-mgr/pub/deviceList/apply/batchWithToken | ||||||
|   engine: |   engine: | ||||||
|     executor-pool: |     executor-pool: | ||||||
|       pcSize: 1 |       pcSize: 1 | ||||||
|  |  | ||||||
|  | @ -44,6 +44,7 @@ atu: | ||||||
|     projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} |     projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} | ||||||
|     testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl |     testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl | ||||||
|     busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName |     busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName | ||||||
|  |     acquireDeviceWithTokenUrl: /api/cctp-device-mgr/pub/deviceList/apply/batchWithToken | ||||||
|   engine: |   engine: | ||||||
|     executor-pool: |     executor-pool: | ||||||
|       pcSize: 1 |       pcSize: 1 | ||||||
|  |  | ||||||
|  | @ -4,10 +4,7 @@ import net.northking.cctp.common.db.Pagination; | ||||||
| import net.northking.cctp.common.http.QueryByPage; | import net.northking.cctp.common.http.QueryByPage; | ||||||
| import net.northking.cctp.device.db.entity.CdDeviceToken; | import net.northking.cctp.device.db.entity.CdDeviceToken; | ||||||
| import net.northking.cctp.device.db.entity.CdDeviceUsageLog; | import net.northking.cctp.device.db.entity.CdDeviceUsageLog; | ||||||
| import net.northking.cctp.device.dto.device.CdMobileDeviceExitDto; | import net.northking.cctp.device.dto.device.*; | ||||||
| import net.northking.cctp.device.dto.device.DeviceLockDto; |  | ||||||
| import net.northking.cctp.device.dto.device.DeviceLogDto; |  | ||||||
| import net.northking.cctp.device.dto.device.DeviceInfoDto; |  | ||||||
| import net.northking.cctp.device.dto.pcDevice.CdDeviceRemoteDto; | import net.northking.cctp.device.dto.pcDevice.CdDeviceRemoteDto; | ||||||
| import net.northking.cctp.device.dto.pcDevice.CdPcDeviceExitDto; | import net.northking.cctp.device.dto.pcDevice.CdPcDeviceExitDto; | ||||||
| import net.northking.cctp.device.dto.pcDevice.CdPcDeviceRemoteDto; | import net.northking.cctp.device.dto.pcDevice.CdPcDeviceRemoteDto; | ||||||
|  | @ -62,4 +59,13 @@ public interface DeviceActivityApiService { | ||||||
|      * @param deviceTokens 设备token信息 |      * @param deviceTokens 设备token信息 | ||||||
|      */ |      */ | ||||||
|     void release(List<CdDeviceToken> deviceTokens); |     void release(List<CdDeviceToken> deviceTokens); | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * 批量申请设备 | ||||||
|  |      * @param devices | ||||||
|  |      * @param request | ||||||
|  |      * @return | ||||||
|  |      */ | ||||||
|  |     List<ApplyDeviceDto> deviceListApply(BatchApplyDeviceDto devices, HttpServletRequest request); | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -3,7 +3,6 @@ package net.northking.cctp.device.api.activity.service; | ||||||
| import com.alibaba.fastjson.JSON; | import com.alibaba.fastjson.JSON; | ||||||
| import com.alibaba.fastjson.JSONObject; | import com.alibaba.fastjson.JSONObject; | ||||||
| import com.alibaba.fastjson.TypeReference; | import com.alibaba.fastjson.TypeReference; | ||||||
| import com.github.pagehelper.page.PageMethod; |  | ||||||
| import net.northking.cctp.common.cache.EntityNameCache; | import net.northking.cctp.common.cache.EntityNameCache; | ||||||
| import net.northking.cctp.common.cache.EntityNameCatalog; | import net.northking.cctp.common.cache.EntityNameCatalog; | ||||||
| import net.northking.cctp.common.db.Pagination; | import net.northking.cctp.common.db.Pagination; | ||||||
|  | @ -15,10 +14,7 @@ import net.northking.cctp.device.constants.DeviceConstants; | ||||||
| import net.northking.cctp.device.constants.DeviceError; | import net.northking.cctp.device.constants.DeviceError; | ||||||
| import net.northking.cctp.device.db.entity.*; | import net.northking.cctp.device.db.entity.*; | ||||||
| import net.northking.cctp.device.db.service.*; | import net.northking.cctp.device.db.service.*; | ||||||
| import net.northking.cctp.device.dto.device.CdMobileDeviceExitDto; | import net.northking.cctp.device.dto.device.*; | ||||||
| import net.northking.cctp.device.dto.device.DeviceInfoDto; |  | ||||||
| import net.northking.cctp.device.dto.device.DeviceLockDto; |  | ||||||
| import net.northking.cctp.device.dto.device.DeviceLogDto; |  | ||||||
| import net.northking.cctp.device.dto.pcDevice.CdDeviceRemoteDto; | import net.northking.cctp.device.dto.pcDevice.CdDeviceRemoteDto; | ||||||
| import net.northking.cctp.device.dto.pcDevice.CdPcDeviceExitDto; | import net.northking.cctp.device.dto.pcDevice.CdPcDeviceExitDto; | ||||||
| import net.northking.cctp.device.dto.pcDevice.CdPcDeviceRemoteDto; | import net.northking.cctp.device.dto.pcDevice.CdPcDeviceRemoteDto; | ||||||
|  | @ -31,6 +27,7 @@ import org.springframework.data.redis.core.ZSetOperations; | ||||||
| import org.springframework.integration.redis.util.RedisLockRegistry; | import org.springframework.integration.redis.util.RedisLockRegistry; | ||||||
| import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||||
| import org.springframework.transaction.annotation.Transactional; | import org.springframework.transaction.annotation.Transactional; | ||||||
|  | import org.springframework.util.CollectionUtils; | ||||||
| import org.springframework.util.DigestUtils; | import org.springframework.util.DigestUtils; | ||||||
| import org.springframework.util.StringUtils; | import org.springframework.util.StringUtils; | ||||||
| 
 | 
 | ||||||
|  | @ -38,7 +35,6 @@ import javax.servlet.http.HttpServletRequest; | ||||||
| import java.util.*; | import java.util.*; | ||||||
| import java.util.concurrent.TimeUnit; | import java.util.concurrent.TimeUnit; | ||||||
| import java.util.concurrent.locks.Lock; | import java.util.concurrent.locks.Lock; | ||||||
| import java.util.stream.Collectors; |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @Service | @Service | ||||||
|  | @ -690,6 +686,10 @@ public class DeviceActivityApiServiceImpl implements DeviceActivityApiService { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public Map<String, String>  applyMobDevice(String deviceId, String userId,HttpServletRequest request,String userBy) { |     public Map<String, String>  applyMobDevice(String deviceId, String userId,HttpServletRequest request,String userBy) { | ||||||
|  |         return applyMobDevice(deviceId, userId, request, userBy, null); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public Map<String, String>  applyMobDevice(String deviceId, String userId,HttpServletRequest request,String userBy, String token) { | ||||||
|         //校验设备是否使用中 如果设备使用中 直接返回null
 |         //校验设备是否使用中 如果设备使用中 直接返回null
 | ||||||
|         CdDeviceStatus status = this.cdDeviceStatusService.findByPrimaryKey(deviceId); |         CdDeviceStatus status = this.cdDeviceStatusService.findByPrimaryKey(deviceId); | ||||||
|         if (!status.getUsageStatus().equals(DeviceConstants.DEVICE_STATUS_ONLINE)) { |         if (!status.getUsageStatus().equals(DeviceConstants.DEVICE_STATUS_ONLINE)) { | ||||||
|  | @ -705,8 +705,10 @@ public class DeviceActivityApiServiceImpl implements DeviceActivityApiService { | ||||||
|         CdDeviceCtrl ctrl = this.cdDeviceCtrlService.findByPrimaryKey(device.getCtrlId()); |         CdDeviceCtrl ctrl = this.cdDeviceCtrlService.findByPrimaryKey(device.getCtrlId()); | ||||||
| 
 | 
 | ||||||
|         Date date = new Date(); |         Date date = new Date(); | ||||||
|  |         if (StringUtils.hasText(token)) {   // 如果传入token,那么使用传入token
 | ||||||
|             String index = deviceId + DeviceConstants.STR_REGEX + ctrl.getId() + DeviceConstants.STR_REGEX + date; |             String index = deviceId + DeviceConstants.STR_REGEX + ctrl.getId() + DeviceConstants.STR_REGEX + date; | ||||||
|         String token = DigestUtils.md5DigestAsHex(index.getBytes()); |             token = DigestUtils.md5DigestAsHex(index.getBytes()); | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|         //记录到设备令牌表
 |         //记录到设备令牌表
 | ||||||
|         CdDeviceToken cdDeviceToken = new CdDeviceToken(); |         CdDeviceToken cdDeviceToken = new CdDeviceToken(); | ||||||
|  | @ -748,6 +750,10 @@ public class DeviceActivityApiServiceImpl implements DeviceActivityApiService { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public Map<String, String> applyPcDevice(String deviceId, String userId,HttpServletRequest request,String userBy) { |     public Map<String, String> applyPcDevice(String deviceId, String userId,HttpServletRequest request,String userBy) { | ||||||
|  |         return applyPcDevice(deviceId, userId, request, userBy, null); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public Map<String, String> applyPcDevice(String deviceId, String userId,HttpServletRequest request,String userBy, String token) { | ||||||
|         CdDeviceStatus status = this.cdDeviceStatusService.findByPrimaryKey(deviceId); |         CdDeviceStatus status = this.cdDeviceStatusService.findByPrimaryKey(deviceId); | ||||||
|         if (!status.getUsageStatus().equals(DeviceConstants.DEVICE_STATUS_ONLINE)) { |         if (!status.getUsageStatus().equals(DeviceConstants.DEVICE_STATUS_ONLINE)) { | ||||||
|             return null; |             return null; | ||||||
|  | @ -760,8 +766,10 @@ public class DeviceActivityApiServiceImpl implements DeviceActivityApiService { | ||||||
|         List<CdEngineInfo> engineList = this.cdEngineInfoService.query(cdEngineInfo); |         List<CdEngineInfo> engineList = this.cdEngineInfoService.query(cdEngineInfo); | ||||||
|         //新增令牌
 |         //新增令牌
 | ||||||
|         Date date = new Date(); |         Date date = new Date(); | ||||||
|  |         if (StringUtils.hasText(token)) { | ||||||
|             String index = deviceId + DeviceConstants.STR_REGEX + engineList.get(0).getId() + DeviceConstants.STR_REGEX + date; |             String index = deviceId + DeviceConstants.STR_REGEX + engineList.get(0).getId() + DeviceConstants.STR_REGEX + date; | ||||||
|         String token = DigestUtils.md5DigestAsHex(index.getBytes()); |             token = DigestUtils.md5DigestAsHex(index.getBytes()); | ||||||
|  |         } | ||||||
|         //记录到设备令牌表
 |         //记录到设备令牌表
 | ||||||
|         CdDeviceToken cdDeviceToken = new CdDeviceToken(); |         CdDeviceToken cdDeviceToken = new CdDeviceToken(); | ||||||
|         cdDeviceToken.setId(deviceId); |         cdDeviceToken.setId(deviceId); | ||||||
|  | @ -837,4 +845,52 @@ public class DeviceActivityApiServiceImpl implements DeviceActivityApiService { | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * 批量申请设备 | ||||||
|  |      * type解释:引擎中1代表pc设备,2代表移动设备,注意 | ||||||
|  |      * | ||||||
|  |      * @param devices | ||||||
|  |      * @param request | ||||||
|  |      * @return | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public List<ApplyDeviceDto> deviceListApply(BatchApplyDeviceDto devices, HttpServletRequest request) { | ||||||
|  |         List<ApplyDeviceDto> resultList = new ArrayList<>(); | ||||||
|  |         String userId = devices.getId(); | ||||||
|  |         String userBy = devices.getUserBy(); | ||||||
|  |         if (!CollectionUtils.isEmpty(devices.getDeviceList())) { | ||||||
|  |             List<ApplyDeviceDto> applyList = devices.getDeviceList(); | ||||||
|  |             for (ApplyDeviceDto device : applyList) { | ||||||
|  |                 ApplyDeviceDto result = new ApplyDeviceDto(); | ||||||
|  |                 Map<String, String> deviceTokenMap = null; | ||||||
|  |                 String deviceId = device.getId(); | ||||||
|  |                 String lockKey = String.format("%s%s", DeviceConstants.ENGINE_DEVICE_TYPE_MOBILE.equals(device.getType()) ? DeviceConstants.LOCK_MOBILE : DeviceConstants.LOCK_PC, deviceId); | ||||||
|  |                 Lock lock = redisLockRegistry.obtain(lockKey); | ||||||
|  |                 try { | ||||||
|  |                     if (lock.tryLock(5000, TimeUnit.MILLISECONDS)) { | ||||||
|  |                         if (DeviceConstants.ENGINE_DEVICE_TYPE_MOBILE.equals(device.getType())) { | ||||||
|  |                             deviceTokenMap = applyMobDevice(deviceId, userId, request, userBy, device.getToken()); | ||||||
|  |                         } else { | ||||||
|  |                             deviceTokenMap = applyPcDevice(deviceId, userId, request, userBy, device.getToken()); | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } catch (InterruptedException e) { | ||||||
|  |                     logger.error("申请移动设备异常:",e); | ||||||
|  |                     Thread.currentThread().interrupt(); | ||||||
|  |                 } finally { | ||||||
|  |                     lock.unlock(); | ||||||
|  |                 } | ||||||
|  |                 if (deviceTokenMap != null) { | ||||||
|  |                     result.setId(deviceTokenMap.get("id")); | ||||||
|  |                     result.setToken(deviceTokenMap.get("token")); | ||||||
|  |                     if (StringUtils.hasText(result.getToken())) { | ||||||
|  |                         resultList.add(result); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return resultList; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -38,7 +38,7 @@ public class DeviceMQReceiver { | ||||||
|     private final static Logger logger = LoggerFactory.getLogger(DeviceMQReceiver.class); |     private final static Logger logger = LoggerFactory.getLogger(DeviceMQReceiver.class); | ||||||
| 
 | 
 | ||||||
|     @RabbitListener(queuesToDeclare = {@Queue(value = "execute.engine.release")}) |     @RabbitListener(queuesToDeclare = {@Queue(value = "execute.engine.release")}) | ||||||
|     public void DeviceMQReceiver(Message message){ |     public void releaseReceive(Message message){ | ||||||
|         // 释放设备
 |         // 释放设备
 | ||||||
|         try{ |         try{ | ||||||
|             byte[] body = message.getBody(); |             byte[] body = message.getBody(); | ||||||
|  | @ -73,21 +73,4 @@ public class DeviceMQReceiver { | ||||||
|             logger.error("释放设备异常",e); |             logger.error("释放设备异常",e); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * |  | ||||||
|      * @param message |  | ||||||
|      */ |  | ||||||
|     @RabbitListener(queuesToDeclare = {@Queue(value = "execute.engine.release.id")}) |  | ||||||
|     public void releaseById(Message message){ |  | ||||||
|         try{ |  | ||||||
|             byte[] body = message.getBody(); |  | ||||||
|             Map<String, Object> mqParam = om.readValue(body, new TypeReference<Map<String, Object>>() { |  | ||||||
|             }); |  | ||||||
| 
 |  | ||||||
|             activityService.releaseDeviceList(mqParam); |  | ||||||
|         }catch (Exception e){ |  | ||||||
|             logger.error("释放设备异常",e); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -20,7 +20,7 @@ public class DeviceConstants { | ||||||
|      */ |      */ | ||||||
|     public final static String LOCK_MOBILE = "lock:mobile:"; |     public final static String LOCK_MOBILE = "lock:mobile:"; | ||||||
| 
 | 
 | ||||||
|     public final static String LOCK_PC = "lock:mobile:"; |     public final static String LOCK_PC = "lock:pc:"; | ||||||
| 
 | 
 | ||||||
|     //安卓类型
 |     //安卓类型
 | ||||||
|     public final static String MOBILE_PLATFORM_ANDROID = "0"; |     public final static String MOBILE_PLATFORM_ANDROID = "0"; | ||||||
|  | @ -202,4 +202,9 @@ public class DeviceConstants { | ||||||
|     public final static String WS_AMOUNT = "amount"; |     public final static String WS_AMOUNT = "amount"; | ||||||
| 
 | 
 | ||||||
|     public static final String ENGINE_MOB_ACTIVE_THREAD_KEY = "engine:mobile:activeThread"; |     public static final String ENGINE_MOB_ACTIVE_THREAD_KEY = "engine:mobile:activeThread"; | ||||||
|  | 
 | ||||||
|  |     public final static String ENGINE_DEVICE_TYPE_PC = "1"; // 引擎使用的设备类型,PC
 | ||||||
|  | 
 | ||||||
|  |     public final static String ENGINE_DEVICE_TYPE_MOBILE = "2"; // 引擎使用的设备类型,移动
 | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,21 @@ | ||||||
|  | package net.northking.cctp.device.dto.device; | ||||||
|  | 
 | ||||||
|  | import io.swagger.annotations.ApiModel; | ||||||
|  | import io.swagger.annotations.ApiModelProperty; | ||||||
|  | import lombok.Data; | ||||||
|  | import lombok.ToString; | ||||||
|  | 
 | ||||||
|  | @Data | ||||||
|  | @ApiModel(value = "设备申请") | ||||||
|  | @ToString | ||||||
|  | public class ApplyDeviceDto { | ||||||
|  | 
 | ||||||
|  |     @ApiModelProperty(value = "设备Id") | ||||||
|  |     private String id; | ||||||
|  | 
 | ||||||
|  |     @ApiModelProperty(value = "设备类型", notes = "1-pc,2-移动") | ||||||
|  |     private String type; | ||||||
|  | 
 | ||||||
|  |     @ApiModelProperty(value = "token", notes = "可由请求方带上") | ||||||
|  |     private String token; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,25 @@ | ||||||
|  | package net.northking.cctp.device.dto.device; | ||||||
|  | 
 | ||||||
|  | import io.swagger.annotations.ApiModel; | ||||||
|  | import io.swagger.annotations.ApiModelProperty; | ||||||
|  | import lombok.Data; | ||||||
|  | import lombok.ToString; | ||||||
|  | 
 | ||||||
|  | import java.util.List; | ||||||
|  | 
 | ||||||
|  | @Data | ||||||
|  | @ApiModel(value = "设备批量申请dto") | ||||||
|  | @ToString | ||||||
|  | public class BatchApplyDeviceDto { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     @ApiModelProperty(value = "申请人id") | ||||||
|  |     private String id; | ||||||
|  | 
 | ||||||
|  |     @ApiModelProperty(value = "使用来源,engine为引擎使用0") | ||||||
|  |     private String userBy; | ||||||
|  | 
 | ||||||
|  |     @ApiModelProperty(value = "设备列表") | ||||||
|  |     private List<ApplyDeviceDto> deviceList; | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -10,9 +10,7 @@ import net.northking.cctp.device.db.entity.CdDeviceStatus; | ||||||
| import net.northking.cctp.device.db.entity.CdDeviceToken; | import net.northking.cctp.device.db.entity.CdDeviceToken; | ||||||
| import net.northking.cctp.device.db.service.CdDeviceStatusService; | import net.northking.cctp.device.db.service.CdDeviceStatusService; | ||||||
| import net.northking.cctp.device.db.service.CdDeviceTokenService; | import net.northking.cctp.device.db.service.CdDeviceTokenService; | ||||||
| import net.northking.cctp.device.dto.device.CdMobileDeviceExitDto; | import net.northking.cctp.device.dto.device.*; | ||||||
| import net.northking.cctp.device.dto.device.DeviceInfoDto; |  | ||||||
| import net.northking.cctp.device.dto.device.DeviceLockDto; |  | ||||||
| import net.northking.cctp.device.dto.pcDevice.CdDeviceRemoteDto; | import net.northking.cctp.device.dto.pcDevice.CdDeviceRemoteDto; | ||||||
| import net.northking.cctp.device.dto.pcDevice.CdPcDeviceExitDto; | import net.northking.cctp.device.dto.pcDevice.CdPcDeviceExitDto; | ||||||
| import net.northking.cctp.device.dto.pcDevice.CdPcDeviceRemoteDto; | import net.northking.cctp.device.dto.pcDevice.CdPcDeviceRemoteDto; | ||||||
|  | @ -161,4 +159,13 @@ public class DevicePubCtrl { | ||||||
|         Map<String, List<String>> result = apiService.queryDeviceType(deviceIds); |         Map<String, List<String>> result = apiService.queryDeviceType(deviceIds); | ||||||
|         return wrapper.success(result); |         return wrapper.success(result); | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     @ApiOperation(value = "批量申请设备使用", notes = "token由请求方提供") | ||||||
|  |     @PostMapping(value = "/deviceList/apply/batchWithToken") | ||||||
|  |     public ResultWrapper<List<ApplyDeviceDto>> batchApplyWithToken(@RequestBody BatchApplyDeviceDto devices, HttpServletRequest request) { | ||||||
|  |         logger.debug("批量申请设备(pub),{}", devices); | ||||||
|  |         ResultWrapper<List<ApplyDeviceDto>> wrapper = new ResultWrapper<>(); | ||||||
|  |         List<ApplyDeviceDto> resultList = apiService.deviceListApply(devices, request); | ||||||
|  |         return wrapper.success(resultList); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue