|
@@ -1,30 +1,32 @@
|
|
|
package com.fdkankan.modeling.receiver;
|
|
|
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
-import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONArray;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
-import com.fdkankan.common.constant.ConstantFilePath;
|
|
|
-import com.fdkankan.common.constant.ConstantUrl;
|
|
|
-import com.fdkankan.common.utils.CreateObjUtil;
|
|
|
-import com.fdkankan.common.utils.FileUtil;
|
|
|
-import com.fdkankan.common.utils.FileUtils;
|
|
|
+import com.fdkankan.utils.constant.ConstantFilePath;
|
|
|
+import com.fdkankan.utils.constant.ConstantUrl;
|
|
|
+import com.fdkankan.mq.message.BuildSceneMqMessage;
|
|
|
+import com.fdkankan.utils.utils.CreateObjUtil;
|
|
|
+import com.fdkankan.utils.utils.FileUtil;
|
|
|
+import com.fdkankan.utils.utils.FileUtils;
|
|
|
import com.fdkankan.modeling.constants.RedisKey;
|
|
|
import com.fdkankan.modeling.constants.SysConstants;
|
|
|
-import com.fdkankan.modeling.entity.*;
|
|
|
+import com.fdkankan.modeling.entity.SceneFileBuild;
|
|
|
+import com.fdkankan.modeling.entity.ScenePro;
|
|
|
+import com.fdkankan.modeling.entity.SceneProExt;
|
|
|
+import com.fdkankan.modeling.entity.User;
|
|
|
import com.fdkankan.modeling.push.PushMessageConfig;
|
|
|
import com.fdkankan.modeling.service.*;
|
|
|
import com.fdkankan.modeling.utils.ComputerUtil;
|
|
|
import com.fdkankan.modeling.utils.DingDingUtils;
|
|
|
import com.fdkankan.modeling.utils.PushMsgUtil;
|
|
|
+import com.fdkankan.oss.UploadUtils;
|
|
|
import com.taobao.api.ApiException;
|
|
|
import lombok.extern.log4j.Log4j2;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
|
|
|
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
|
|
|
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
|
|
|
-import org.apache.rocketmq.client.producer.DefaultMQProducer;
|
|
|
-import org.apache.rocketmq.common.message.Message;
|
|
|
import org.apache.rocketmq.common.message.MessageExt;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
@@ -32,8 +34,8 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
|
|
import org.springframework.data.redis.core.RedisTemplate;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
+import org.springframework.util.ObjectUtils;
|
|
|
import org.springframework.web.client.RestTemplate;
|
|
|
-import com.fdkankan.utils.UploadUtils;
|
|
|
|
|
|
import java.io.*;
|
|
|
import java.security.InvalidKeyException;
|
|
@@ -64,13 +66,6 @@ public class BuildSceneReceiver implements MessageListenerConcurrently {
|
|
|
private ISceneFileBuildService sceneFileBuildService;
|
|
|
|
|
|
@Autowired
|
|
|
- private ISceneProEditService sceneProEditService;
|
|
|
-
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private ISceneProEditExtService sceneProEditExtService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
private ISceneProExtService sceneProExtService;
|
|
|
|
|
|
@Autowired
|
|
@@ -78,9 +73,6 @@ public class BuildSceneReceiver implements MessageListenerConcurrently {
|
|
|
|
|
|
private RestTemplate restTemplate = new RestTemplate();
|
|
|
|
|
|
- @Value("${main.url}")
|
|
|
- private String mainUrl;
|
|
|
-
|
|
|
@Value("${4dkk.laserService.host}")
|
|
|
private String laserHost;
|
|
|
|
|
@@ -90,11 +82,6 @@ public class BuildSceneReceiver implements MessageListenerConcurrently {
|
|
|
@Value("${oss.url.prefix}")
|
|
|
private String prefixAli;
|
|
|
|
|
|
- @Value("${scene.pro.mobile.show.url}")
|
|
|
- private String sceneProNewUrl;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private DefaultMQProducer mqProducer;
|
|
|
|
|
|
@Autowired
|
|
|
private UploadUtils uploadUtils;
|
|
@@ -107,24 +94,23 @@ public class BuildSceneReceiver implements MessageListenerConcurrently {
|
|
|
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
|
|
|
}
|
|
|
MessageExt messageExt = msgExt.get(0);
|
|
|
- Object object = JSON.parse(messageExt.getBody());
|
|
|
- String msg = JSON.toJSONString(object);
|
|
|
- log.info("开始处理消息,消息队列:{},消息内容:{}", consumeConcurrentlyContext.getMessageQueue().getTopic(), msg);
|
|
|
- process(msg);
|
|
|
+ BuildSceneMqMessage message = JSONObject.parseObject(messageExt.getBody(), BuildSceneMqMessage.class);
|
|
|
+ log.info("开始处理消息,消息队列:{},消息内容:{}", consumeConcurrentlyContext.getMessageQueue().getTopic(),
|
|
|
+ JSONObject.toJSONString(message));
|
|
|
+ process(message);
|
|
|
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
|
|
|
}
|
|
|
|
|
|
- public void process(String content) {
|
|
|
+ public void process(BuildSceneMqMessage message) {
|
|
|
final ExecutorService exec = Executors.newFixedThreadPool(1);
|
|
|
Callable<String> call = (Callable<String>) () -> {
|
|
|
//开始执行耗时操作
|
|
|
- String[] strs = content.split(":;");
|
|
|
try {
|
|
|
- String key = RedisKey.SCENE_BUILDING + strs[4];
|
|
|
+ String key = RedisKey.SCENE_BUILDING + message.getSceneNum();
|
|
|
// 获取缓存锁,防止重复消费
|
|
|
Long building = redisTemplate.opsForValue().increment(key, 1);
|
|
|
if (building.compareTo(1L) != 0) {
|
|
|
- log.error("场景正在构建中,退出构建,当前服务器id:{},参数:{}", SysConstants.hostName, content);
|
|
|
+ log.error("场景正在构建中,退出构建,当前服务器id:{},参数:{}", SysConstants.hostName, JSONObject.toJSONString(message));
|
|
|
} else {
|
|
|
redisTemplate.expire(key, Duration.of(SysConstants.modelTimeOut, ChronoUnit.HOURS));
|
|
|
}
|
|
@@ -132,24 +118,24 @@ public class BuildSceneReceiver implements MessageListenerConcurrently {
|
|
|
Thread.sleep(2000L);
|
|
|
try {
|
|
|
FileUtils.writeFile("/opt/hosts/running.txt", DateUtil.formatDateTime(new Date()));
|
|
|
- String tomcatLog = "scenenum:" + content + "\ntime:" + DateUtil.formatDateTime(new Date()) +
|
|
|
+ String tomcatLog = "scenenum:" + message.getSceneNum() + "\ntime:" + DateUtil.formatDateTime(new Date()) +
|
|
|
" action:create hostname:" + SysConstants.hostName;
|
|
|
//打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
|
|
|
- FileWriter writer = new FileWriter("/mnt/elastic_log/tomcat" + "_" + strs[4] + ".log", true);
|
|
|
+ FileWriter writer = new FileWriter("/mnt/elastic_log/tomcat" + "_" + message.getSceneNum() + ".log", true);
|
|
|
writer.write(tomcatLog);
|
|
|
writer.close();
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
|
|
|
- BuildSceneReceiver.this.buildScene(content);
|
|
|
+ buildScene(message);
|
|
|
redisTemplate.delete(key);
|
|
|
try {
|
|
|
FileUtils.deleteFile("/opt/hosts/running.txt");
|
|
|
- String tomcatLog = "scenenum:" + content + "\ntime:" + DateUtil.formatDateTime(new Date()) +
|
|
|
+ String tomcatLog = "scenenum:" + message.getSceneNum() + "\ntime:" + DateUtil.formatDateTime(new Date()) +
|
|
|
" action:delete hostname:" + SysConstants.hostName;
|
|
|
//打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
|
|
|
- FileWriter writer = new FileWriter("/mnt/elastic_log/tomcat" + "_" + strs[4] + "log", true);
|
|
|
+ FileWriter writer = new FileWriter("/mnt/elastic_log/tomcat" + "_" + message.getSceneNum() + "log", true);
|
|
|
writer.write(tomcatLog);
|
|
|
writer.close();
|
|
|
} catch (Exception e) {
|
|
@@ -157,8 +143,8 @@ public class BuildSceneReceiver implements MessageListenerConcurrently {
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
- sceneProService.updateStatus(strs[4], -1);
|
|
|
- BuildSceneReceiver.this.handFail("计算失败", content);
|
|
|
+ sceneProService.updateStatus(message.getSceneNum(), -1);
|
|
|
+ BuildSceneReceiver.this.handFail("计算失败", message);
|
|
|
}
|
|
|
log.info("场景生成好了***");
|
|
|
return "success";
|
|
@@ -174,7 +160,7 @@ public class BuildSceneReceiver implements MessageListenerConcurrently {
|
|
|
log.error(trace.toString());
|
|
|
FileUtils.deleteFile("/opt/hosts/running.txt");
|
|
|
future.cancel(true);
|
|
|
- handFail("计算超时",content);
|
|
|
+ handFail("计算超时",message);
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
StringWriter trace=new StringWriter();
|
|
@@ -182,49 +168,41 @@ public class BuildSceneReceiver implements MessageListenerConcurrently {
|
|
|
log.error(trace.toString());
|
|
|
FileUtils.deleteFile("/opt/hosts/running.txt");
|
|
|
future.cancel(true);
|
|
|
- handFail("计算失败",content);
|
|
|
+ handFail("计算失败",message);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
- private void buildScene(String content){
|
|
|
+ private void buildScene(BuildSceneMqMessage message){
|
|
|
String projectNum = null;
|
|
|
SceneFileBuild sceneFileBuildEntity = null;
|
|
|
ScenePro scene = null;
|
|
|
SceneProExt sceneProExt = null;
|
|
|
try{
|
|
|
- String[] strs = content.split(":;");
|
|
|
-
|
|
|
- if(strs.length == 1){
|
|
|
+ if(StringUtils.equals(message.getIsStandardization(),"1")){
|
|
|
//表示标定算法
|
|
|
- Map<String,String> map = ComputerUtil.computerCalibration(strs[0]);
|
|
|
+ ComputerUtil.computerCalibration(message.getPath());
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- String unicode = strs[0];
|
|
|
- String path = strs[1];
|
|
|
- String prefix = strs[2];
|
|
|
- String imgsName = strs[3];
|
|
|
- projectNum = strs[4];
|
|
|
- String userName = strs[6];
|
|
|
+ String unicode = message.getUnicode();
|
|
|
+ String path = message.getPath();
|
|
|
+ String prefix = message.getPrefix();
|
|
|
+ String imgsName = message.getImgsName();
|
|
|
+ projectNum = message.getSceneNum();
|
|
|
+ String userName = message.getUserName();
|
|
|
//不同的相机不同的方法
|
|
|
- String cameraType = strs[7];
|
|
|
- String algorithm = strs[8];
|
|
|
- String fileId = strs[9];
|
|
|
- String cameraName = strs[10];
|
|
|
+ String cameraType = message.getCameraType();
|
|
|
+ String algorithm = message.getAlgorithm();
|
|
|
+ String fileId = message.getFileId();
|
|
|
+ String cameraName = message.getCameraName();
|
|
|
//0表示有4k图,1表示没有
|
|
|
- String resolution = strs[11];
|
|
|
+ String resolution = message.getResolution();
|
|
|
|
|
|
//判断调用V2还是V3版本的算法
|
|
|
- String buildType = "V2";
|
|
|
- if(strs.length >= 13){
|
|
|
- buildType = strs[12];
|
|
|
- }
|
|
|
+ String buildType = ObjectUtils.isEmpty(message.getBuildType()) ? "V2" : message.getBuildType();
|
|
|
+
|
|
|
|
|
|
- String rebuild = "0";
|
|
|
- if(strs.length >= 14){
|
|
|
- rebuild = strs[13];
|
|
|
- }
|
|
|
log.info("执行数据库操作--前");
|
|
|
sceneFileBuildEntity = sceneFileBuildService.findByFileId(fileId);
|
|
|
log.info("执行数据库操作--后");
|
|
@@ -237,7 +215,6 @@ public class BuildSceneReceiver implements MessageListenerConcurrently {
|
|
|
|
|
|
log.info("用的算法是:"+algorithm);
|
|
|
log.info("用的相机是:"+ (Integer.parseInt(cameraType) < 4 ? "单球目" : "双球目(八目)"));
|
|
|
- String isModel = strs[5];
|
|
|
Map<String,String> map = new HashMap<>();
|
|
|
|
|
|
//该场景使用的容量
|
|
@@ -295,7 +272,7 @@ public class BuildSceneReceiver implements MessageListenerConcurrently {
|
|
|
sceneProExt = sceneProExtService.lambdaQuery().eq(SceneProExt::getSceneProId, scene.getId()).getEntity();
|
|
|
if(scene == null){
|
|
|
log.info(projectNum + ":场景不存在");
|
|
|
- handFail("场景不存在",content);
|
|
|
+ handFail("场景不存在",message);
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -623,7 +600,7 @@ public class BuildSceneReceiver implements MessageListenerConcurrently {
|
|
|
log.info("激光转台相机 同步结束 :" + hotListJson);
|
|
|
}catch (Exception e){
|
|
|
e.printStackTrace();
|
|
|
- handFail("激光转台相机同步失败",content);
|
|
|
+ handFail("激光转台相机同步失败",message);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -641,7 +618,7 @@ public class BuildSceneReceiver implements MessageListenerConcurrently {
|
|
|
StringWriter trace=new StringWriter();
|
|
|
e.printStackTrace(new PrintWriter(trace));
|
|
|
log.error(trace.toString());
|
|
|
- handFail("计算失败",content);
|
|
|
+ handFail("计算失败",message);
|
|
|
}finally {
|
|
|
try{
|
|
|
scene = sceneProService.findBySceneNum(projectNum);
|
|
@@ -676,156 +653,9 @@ public class BuildSceneReceiver implements MessageListenerConcurrently {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void kanfangBuild(String content){
|
|
|
-
|
|
|
- JSONObject json = JSONObject.parseObject(content);
|
|
|
- String sceneName = json.getString("sceneName");
|
|
|
- String sceneNum = json.getString("sceneNum");
|
|
|
-
|
|
|
- // 获取缓存锁,防止重复消费
|
|
|
- Long building = redisTemplate.opsForValue().increment(RedisKey.SCENE_BUILDING + sceneNum, 1);
|
|
|
- if (building.compareTo(1L) != 0) {
|
|
|
- log.error("场景正在构建中,退出构建,当前服务器id:{},参数:{}", SysConstants.hostName,content);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- int sceneScheme = json.getIntValue("sceneScheme");
|
|
|
- long userId = json.getLong("userId");
|
|
|
- String dataSource = json.getString("dataSource");
|
|
|
- String queue = json.getString("callbackQueue");
|
|
|
- log.info("sceneName: {}, sceneNum: {}, sceneScheme: {}, userId: {}, dataSource:{}, queue:{}",
|
|
|
- sceneName, sceneNum, sceneScheme, userId, dataSource, queue);
|
|
|
-
|
|
|
- JSONObject result = new JSONObject();
|
|
|
- result.put("sceneNum", sceneNum);
|
|
|
-
|
|
|
- try{
|
|
|
- ScenePro scenePro = sceneProService.findBySceneNum(sceneNum);
|
|
|
-
|
|
|
- if(scenePro == null){
|
|
|
- scenePro = new ScenePro();
|
|
|
- SceneProExt sceneProExt = new SceneProExt();
|
|
|
-
|
|
|
- sceneProExt.setDataSource(dataSource);
|
|
|
- scenePro.setSceneName(sceneName);
|
|
|
- scenePro.setSceneCode(sceneNum);
|
|
|
- scenePro.setUserId(userId);
|
|
|
- scenePro.setSceneScheme(sceneScheme);
|
|
|
- sceneProExt.setSceneStatus(0);
|
|
|
- scenePro.setWebSite(mainUrl + sceneProNewUrl + sceneNum);
|
|
|
- sceneProExt.setPayStatus(1);
|
|
|
- scenePro.setBuildType("V3");
|
|
|
- sceneProExt.setSceneSource(12);
|
|
|
- scenePro.setSceneDec("<p>快速打造3D空间模型,让三维数字技术服务于生活。</p>");
|
|
|
- sceneProService.save(scenePro);
|
|
|
- sceneProExtService.save(sceneProExt);
|
|
|
-
|
|
|
- SceneProEdit sceneEdit = new SceneProEdit();
|
|
|
- SceneProEditExt sceneEditExt = new SceneProEditExt();
|
|
|
- sceneEdit.setNeedKey(0);
|
|
|
-
|
|
|
- sceneEdit.setProId(scenePro.getId());
|
|
|
- sceneEditExt.setMapVisi(1);
|
|
|
- sceneEditExt.setTourVisi(1);
|
|
|
- sceneEditExt.setVrVisi(1);
|
|
|
- sceneEditExt.setRulerVisi(1);
|
|
|
- sceneEditExt.setCadImgVisi(1);
|
|
|
- sceneEditExt.setPanoVisi(1);
|
|
|
- sceneEditExt.setM2dVisi(1);
|
|
|
- sceneEditExt.setM3dVisi(1);
|
|
|
- sceneEditExt.setMeasureVisi(0);
|
|
|
- sceneEdit.setFloorLogoSize(100);
|
|
|
- sceneEdit.setCreateTime(new Date());
|
|
|
- sceneProEditService.save(sceneEdit);
|
|
|
- sceneProEditExtService.save(sceneEditExt);
|
|
|
-
|
|
|
- //生成二维码logo
|
|
|
- restTemplate.getForObject(mainUrl + "api/scene/createSketchQrLogo?sceneNum=" + sceneNum,String.class);
|
|
|
- }else {
|
|
|
-
|
|
|
- SceneProExt sceneProExt = sceneProExtService.lambdaQuery()
|
|
|
- .eq(SceneProExt::getSceneProId,scenePro.getId()).getEntity();
|
|
|
-
|
|
|
- sceneProExt.setDataSource(dataSource);
|
|
|
- scenePro.setSceneName(sceneName);
|
|
|
- scenePro.setSceneCode(sceneNum);
|
|
|
- scenePro.setUserId(userId);
|
|
|
- scenePro.setSceneScheme(sceneScheme);
|
|
|
- sceneProExt.setSceneStatus(0);
|
|
|
- scenePro.setWebSite(mainUrl + sceneProNewUrl + sceneNum);
|
|
|
- sceneProExt.setPayStatus(1);
|
|
|
- scenePro.setBuildType("V3");
|
|
|
- sceneProExt.setSceneSource(12);
|
|
|
- sceneProService.updateById(scenePro);
|
|
|
- sceneProExtService.updateById(sceneProExt);
|
|
|
-
|
|
|
- SceneProEdit sceneEdit = sceneProEditService.lambdaQuery()
|
|
|
- .eq(SceneProEdit::getProId,scenePro.getId()).getEntity();
|
|
|
-
|
|
|
- SceneProEditExt sceneProEditExt = sceneProEditExtService.lambdaQuery()
|
|
|
- .eq(SceneProEditExt::getProEditId,sceneEdit.getId()).getEntity();
|
|
|
-
|
|
|
- sceneEdit.setNeedKey(0);
|
|
|
-
|
|
|
- sceneEdit.setProId(scenePro.getId());
|
|
|
- sceneEdit.setVersion(sceneEdit.getVersion() + 1);
|
|
|
- sceneProEditExt.setImagesVersion(sceneProEditExt.getImagesVersion() + 1);
|
|
|
- sceneEdit.setFloorEditVer(sceneEdit.getFloorEditVer() + 1);
|
|
|
- sceneEdit.setFloorPublishVer(sceneEdit.getFloorPublishVer() + 1);
|
|
|
- sceneEdit.setUpdateTime(new Date());
|
|
|
- sceneProEditService.updateById(sceneEdit);
|
|
|
- sceneProEditExtService.updateById(sceneProEditExt);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- com.alibaba.fastjson.JSONObject scenejson = com.alibaba.fastjson.JSONObject.parseObject(com.alibaba.fastjson.JSONObject.toJSONString(scenePro));
|
|
|
- FileUtils.writeFile(ConstantFilePath.SCENE_PATH+"data/data"+sceneNum+File.separator+"scene.json", scenejson.toString());
|
|
|
-
|
|
|
- //计算模型并返回需要上传oss的文件集合
|
|
|
- Map map = ComputerUtil.computer(sceneNum, dataSource, "V3");
|
|
|
- uploadUtils.uploadMulFiles(map);
|
|
|
-
|
|
|
- sceneProService.updateStatus(sceneNum, -2);
|
|
|
-
|
|
|
- log.info("计算完成,发送mq通知123看房");
|
|
|
-
|
|
|
- result.put("result", 1);
|
|
|
- result.put("code", 0);
|
|
|
- result.put("msg", "计算完成");
|
|
|
- Message msg = new Message(queue,JSONObject.toJSONString(result).getBytes());
|
|
|
- mqProducer.send(msg);
|
|
|
- }catch (Exception e){
|
|
|
- sceneProService.updateStatus(sceneNum, -1);
|
|
|
-
|
|
|
- log.info("计算失败,发送mq通知123看房");
|
|
|
-
|
|
|
- result.put("result", 0);
|
|
|
- result.put("code", 500);
|
|
|
- result.put("msg", "计算失败");
|
|
|
-
|
|
|
- Message msg = new Message(queue,JSONObject.toJSONString(result).getBytes());
|
|
|
- try {
|
|
|
- mqProducer.send(msg);
|
|
|
- } catch (Exception ee) {
|
|
|
- ee.printStackTrace();
|
|
|
- }
|
|
|
- handFail("看房场景计算失败",dataSource,sceneNum);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private void handFail(String reason,String content){
|
|
|
- String serverPath = "";
|
|
|
- String num = "";
|
|
|
- if(content.contains(":;")){
|
|
|
- String[] strs = content.split(":;");
|
|
|
- serverPath = strs[1].substring(0,strs[1].lastIndexOf("/")+1).concat(strs[2]);
|
|
|
- num = strs[4];
|
|
|
- }else{
|
|
|
- JSONObject json = JSONObject.parseObject(content);
|
|
|
- num = json.getString("sceneNum");
|
|
|
- serverPath = json.getString("dataSource");
|
|
|
- }
|
|
|
- handFail(reason,serverPath,num);
|
|
|
+ private void handFail(String reason,BuildSceneMqMessage message){
|
|
|
+ String serverPath = message.getPath().substring(0,message.getPath().lastIndexOf("/")+1).concat(message.getPrefix());
|
|
|
+ handFail(reason,serverPath,message.getSceneNum());
|
|
|
}
|
|
|
|
|
|
private void handFail(String reason,String serverPath,String num){
|