|
@@ -31,7 +31,7 @@ import com.sckj.l2.entity.TL2Material;
|
|
|
import com.sckj.l2.service.impl.L2DataServiceImpl;
|
|
|
import com.sckj.l2.service.impl.TL2DataServiceImpl;
|
|
|
import com.sckj.l2.service.impl.TL2MaterialServiceImpl;
|
|
|
-import com.sckj.opc.dauaservice.OPCDAServiceImpl;
|
|
|
+import com.sckj.opc.dataservice.OPCDAServiceImpl;
|
|
|
import com.sckj.opc.entity.OPCData;
|
|
|
import com.sckj.opc.service.OPCDataServiceImpl;
|
|
|
import com.sckj.opc.utils.CustomUtil;
|
|
@@ -59,7 +59,6 @@ import java.time.format.DateTimeFormatter;
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
-import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
|
|
|
|
/**
|
|
@@ -174,23 +173,17 @@ public class DeviceEventListener extends EventListener { //
|
|
|
|
|
|
//铁口出铁状态
|
|
|
//1 出铁中 0 出铁结束
|
|
|
- private AtomicBoolean ironLoading1 = new AtomicBoolean(false);
|
|
|
+ private AtomicInteger ironLoading1 = new AtomicInteger(0);
|
|
|
//
|
|
|
- private AtomicBoolean ironLoading2 = new AtomicBoolean(false);
|
|
|
+ private AtomicInteger ironLoading2 = new AtomicInteger(0);
|
|
|
//
|
|
|
- private AtomicBoolean ironLoading3 = new AtomicBoolean(false);
|
|
|
+ private AtomicInteger ironLoading3 = new AtomicInteger(0);
|
|
|
//
|
|
|
- private AtomicBoolean ironLoading4 = new AtomicBoolean(false);
|
|
|
+ private AtomicInteger ironLoading4 = new AtomicInteger(0);
|
|
|
|
|
|
//出铁步骤
|
|
|
private List<IronStepVO> mSteps;
|
|
|
|
|
|
- //出铁参数
|
|
|
-// private Map<String, TIronParam> mIronParamMap;
|
|
|
-
|
|
|
- //出铁参数
|
|
|
-// private Map<String, TAudio> mIronAlarmMap;
|
|
|
-
|
|
|
private String openAlarmUrl;
|
|
|
|
|
|
private String closureAlarmUrl;
|
|
@@ -221,13 +214,20 @@ public class DeviceEventListener extends EventListener { //
|
|
|
//出铁时间
|
|
|
private AtomicDouble IRON_TIME = new AtomicDouble(0);
|
|
|
|
|
|
+ //实时温度最大值
|
|
|
+ private AtomicDouble tempMax = new AtomicDouble(0);
|
|
|
+
|
|
|
+ //实时温度最小值
|
|
|
+ private AtomicDouble tempMin = new AtomicDouble(0);
|
|
|
+
|
|
|
+
|
|
|
private String SERVER_URL = "";
|
|
|
|
|
|
//实时出铁总重量/总流量
|
|
|
private BigDecimal mTotalWeight = BigDecimal.ZERO;
|
|
|
//总干量
|
|
|
// private BigDecimal mTotalDry = BigDecimal.ZERO;
|
|
|
- //耗时(单位:s)
|
|
|
+ //出铁耗时(单位:秒)
|
|
|
private AtomicInteger mSecondsElapsed = new AtomicInteger(0);
|
|
|
|
|
|
//redis保存最多数量数据
|
|
@@ -270,20 +270,30 @@ public class DeviceEventListener extends EventListener { //
|
|
|
//打泥量选择公式
|
|
|
private TIronModel modelHitMud;
|
|
|
|
|
|
+ /// 堵口预警
|
|
|
+ private TIronModel modelClosureWarn1;
|
|
|
+ private TIronModel modelClosureWarn2;
|
|
|
+ private TIronModel modelClosureWarn3;
|
|
|
+
|
|
|
+ //出铁诊断
|
|
|
+ private TIronModel modelTappingTest;
|
|
|
+
|
|
|
+
|
|
|
/***
|
|
|
* 更新模型
|
|
|
*/
|
|
|
private void getModels() {
|
|
|
- modelHitMud = ironModelService.getById(1);
|
|
|
+ modelHitMud = ironModelService.lambdaQuery().eq(TIronModel::getModelName, "hit_mud").one();
|
|
|
+ modelClosureWarn1 = ironModelService.lambdaQuery().eq(TIronModel::getModelName, "closure_warn1").one();
|
|
|
+ modelClosureWarn2 = ironModelService.lambdaQuery().eq(TIronModel::getModelName, "closure_warn2").one();
|
|
|
+ modelClosureWarn3 = ironModelService.lambdaQuery().eq(TIronModel::getModelName, "closure_warn3").one();
|
|
|
+ modelTappingTest = ironModelService.lambdaQuery().eq(TIronModel::getModelName, "tapping_test").one();
|
|
|
}
|
|
|
|
|
|
private void getAudios() {
|
|
|
List<TAudio> list = audioService.lambdaQuery().eq(TAudio::getStatus, "1").eq(TAudio::getDelFlag, "1").list();
|
|
|
if (ObjectUtils.isNotEmpty(list)) {
|
|
|
for (TAudio tAudio : list) {
|
|
|
-// if (Objects.equals(tAudio.getExceptionType(), TaskNameConstants.TASKNAME_OPEN_WARN)) {
|
|
|
-// alarmUrlOpen = SERVER_URL + "/" + GlobalConfig.publicPrefix + File.separator + tAudio.getPath();
|
|
|
-// } else
|
|
|
if (Objects.equals(tAudio.getExceptionType(), "100")) {
|
|
|
closureAlarmUrl = SERVER_URL + "/" + GlobalConfig.publicPrefix + File.separator + tAudio.getPath();
|
|
|
} else if (Objects.equals(tAudio.getExceptionType(), "200")) {
|
|
@@ -389,7 +399,7 @@ public class DeviceEventListener extends EventListener { //
|
|
|
}
|
|
|
|
|
|
//出铁次数编号
|
|
|
- private Long mIronNo;
|
|
|
+ private String mIronNo;
|
|
|
|
|
|
/***
|
|
|
* L2数据项
|
|
@@ -518,6 +528,14 @@ public class DeviceEventListener extends EventListener { //
|
|
|
}
|
|
|
|
|
|
/***
|
|
|
+ * 返回出铁计时开始,单位分钟
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private int getIronElapsedMinute() {
|
|
|
+ return mSecondsElapsed.get() / 60;
|
|
|
+ }
|
|
|
+
|
|
|
+ /***
|
|
|
* 出铁计时
|
|
|
*/
|
|
|
private void getIronTime() {
|
|
@@ -558,36 +576,77 @@ public class DeviceEventListener extends EventListener { //
|
|
|
//堵口预警
|
|
|
scheduledTaskManager.addTask(scheduleClosureWarn.getName(), scheduleClosureWarn.getDelay(), scheduleClosureWarn.getPeriod(), TimeUnit.SECONDS, () -> {
|
|
|
//堵口预警
|
|
|
-
|
|
|
- if (speed1.get() > STANDARD_SPEED.get() || speed2.get() > STANDARD_SPEED.get()) {
|
|
|
- log.info("堵口预警:【speed1】:{},【speed2】:{},【standard_speed】:{},", speed1.get(), speed2.get(), STANDARD_SPEED.get());
|
|
|
-
|
|
|
+ String modelExpression1 = modelClosureWarn1.getModelExpression();
|
|
|
+
|
|
|
+ SpelExpressionParser parser = new SpelExpressionParser();
|
|
|
+ Expression expression1 = parser.parseExpression(modelExpression1);
|
|
|
+
|
|
|
+ StandardEvaluationContext context = new StandardEvaluationContext();
|
|
|
+ // 设置占位符对应的值
|
|
|
+ context.setVariable("ironSpeed", speed1.get() > speed2.get() ? speed1.get() : speed2.get());
|
|
|
+ context.setVariable("iron01State", ironLoading1);
|
|
|
+ context.setVariable("iron02State", ironLoading2);
|
|
|
+ context.setVariable("iron03State", ironLoading3);
|
|
|
+ context.setVariable("iron04State", ironLoading4);
|
|
|
+ context.setVariable("standardSpeed", STANDARD_SPEED.get());
|
|
|
+ //计算打泥量
|
|
|
+ //计算理论铁量= 矿批 × 综合品位 × 1.06,其中矿批是指L2中的干量
|
|
|
+ boolean result1 = expression1.getValue(context, Boolean.class);
|
|
|
+
|
|
|
+ if (result1) {
|
|
|
//流速过大可能是由于铁口深度不足或发生跑大流问题,则提示将当前铁口堵口
|
|
|
PushData.send2Warn(WarnData.warnClose("流速过快,请将当前铁口堵口", closureAlarmUrl));
|
|
|
taskExecutor.submit(() -> {
|
|
|
exceptionLogService.add(TExceptionLogCreateValidate.builder().exceptionType("4").exceptionDesc("流速过快,请将当前铁口堵口").build());
|
|
|
});
|
|
|
- } else if ((speed1.get() < STANDARD_SPEED.get() || speed2.get() < STANDARD_SPEED.get()) && (ironLoading2.get() || ironLoading3.get() || ironLoading4.get())) {
|
|
|
- log.info("堵口预警一:【speed1】:{},【speed2】:{},【standard_speed】:{},", speed1.get(), speed2.get(), STANDARD_SPEED.get());
|
|
|
- log.info("堵口预警一:【ironLoading1】:{},【ironLoading2】:{},【ironLoading3】:{},【ironLoading4】:{}", ironLoading1.get(), ironLoading2.get(), ironLoading3.get(), ironLoading4.get());
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
+ String modelExpression2 = modelClosureWarn2.getModelExpression();
|
|
|
+ Expression expression2 = parser.parseExpression(modelExpression2);
|
|
|
+ boolean result2 = expression2.getValue(context, Boolean.class);
|
|
|
+ if (result2) {
|
|
|
|
|
|
- //若流速过小,但其它铁口正在出铁,则提示将当前铁口堵口
|
|
|
- PushData.send2Warn(WarnData.warnClose("流速过小,请将当前铁口堵口", closureAlarmUrl));
|
|
|
- taskExecutor.submit(() -> {
|
|
|
- exceptionLogService.add(TExceptionLogCreateValidate.builder().exceptionType("4").exceptionDesc("流速过小,请将当前铁口堵口").build());
|
|
|
- });
|
|
|
- } else if ((speed1.get() < STANDARD_SPEED.get() || speed2.get() < STANDARD_SPEED.get()) && (!ironLoading2.get() && !ironLoading3.get() && !ironLoading4.get())) {
|
|
|
- log.info("堵口预警二:【speed1】:{},【speed2】:{},【standard_speed】:{},", speed1.get(), speed2.get(), STANDARD_SPEED.get());
|
|
|
- log.info("堵口预警二:【ironLoading1】:{},【ironLoading2】:{},【ironLoading3】:{},【ironLoading4】:{}", ironLoading1.get(), ironLoading2.get(), ironLoading3.get(), ironLoading4.get());
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
+ String modelExpression3 = modelClosureWarn3.getModelExpression();
|
|
|
+ Expression expression3 = parser.parseExpression(modelExpression3);
|
|
|
+ boolean result3 = expression3.getValue(context, Boolean.class);
|
|
|
+
|
|
|
+ if (result3) {
|
|
|
|
|
|
- //若流速过小且其他铁口均未出铁,则提示先将其它铁口打开,再进行堵口
|
|
|
- PushData.send2Warn(WarnData.warnClose("请先打开其它铁口,再堵口", closureAlarmUrl));
|
|
|
- taskExecutor.submit(() -> {
|
|
|
- exceptionLogService.add(TExceptionLogCreateValidate.builder().exceptionType("4").exceptionDesc("请先打开其它铁口,再堵口").build());
|
|
|
- });
|
|
|
}
|
|
|
+
|
|
|
+// if (speed1.get() > STANDARD_SPEED.get() || speed2.get() > STANDARD_SPEED.get()) {
|
|
|
+// log.info("堵口预警:【speed1】:{},【speed2】:{},【standard_speed】:{},", speed1.get(), speed2.get(), STANDARD_SPEED.get());
|
|
|
+//
|
|
|
+// //流速过大可能是由于铁口深度不足或发生跑大流问题,则提示将当前铁口堵口
|
|
|
+// PushData.send2Warn(WarnData.warnClose("流速过快,请将当前铁口堵口", closureAlarmUrl));
|
|
|
+// taskExecutor.submit(() -> {
|
|
|
+// exceptionLogService.add(TExceptionLogCreateValidate.builder().exceptionType("4").exceptionDesc("流速过快,请将当前铁口堵口").build());
|
|
|
+// });
|
|
|
+// } else if ((speed1.get() < STANDARD_SPEED.get() || speed2.get() < STANDARD_SPEED.get()) && (ironLoading2.get() || ironLoading3.get() || ironLoading4.get())) {
|
|
|
+// log.info("堵口预警一:【speed1】:{},【speed2】:{},【standard_speed】:{},", speed1.get(), speed2.get(), STANDARD_SPEED.get());
|
|
|
+// log.info("堵口预警一:【ironLoading1】:{},【ironLoading2】:{},【ironLoading3】:{},【ironLoading4】:{}", ironLoading1.get(), ironLoading2.get(), ironLoading3.get(), ironLoading4.get());
|
|
|
+//
|
|
|
+//
|
|
|
+// //若流速过小,但其它铁口正在出铁,则提示将当前铁口堵口
|
|
|
+// PushData.send2Warn(WarnData.warnClose("流速过小,请将当前铁口堵口", closureAlarmUrl));
|
|
|
+// taskExecutor.submit(() -> {
|
|
|
+// exceptionLogService.add(TExceptionLogCreateValidate.builder().exceptionType("4").exceptionDesc("流速过小,请将当前铁口堵口").build());
|
|
|
+// });
|
|
|
+// } else if ((speed1.get() < STANDARD_SPEED.get() || speed2.get() < STANDARD_SPEED.get()) && (!ironLoading2.get() && !ironLoading3.get() && !ironLoading4.get())) {
|
|
|
+// log.info("堵口预警二:【speed1】:{},【speed2】:{},【standard_speed】:{},", speed1.get(), speed2.get(), STANDARD_SPEED.get());
|
|
|
+// log.info("堵口预警二:【ironLoading1】:{},【ironLoading2】:{},【ironLoading3】:{},【ironLoading4】:{}", ironLoading1.get(), ironLoading2.get(), ironLoading3.get(), ironLoading4.get());
|
|
|
+//
|
|
|
+//
|
|
|
+// //若流速过小且其他铁口均未出铁,则提示先将其它铁口打开,再进行堵口
|
|
|
+// PushData.send2Warn(WarnData.warnClose("请先打开其它铁口,再堵口", closureAlarmUrl));
|
|
|
+// taskExecutor.submit(() -> {
|
|
|
+// exceptionLogService.add(TExceptionLogCreateValidate.builder().exceptionType("4").exceptionDesc("请先打开其它铁口,再堵口").build());
|
|
|
+// });
|
|
|
+// }
|
|
|
});
|
|
|
}
|
|
|
|
|
@@ -602,7 +661,7 @@ public class DeviceEventListener extends EventListener { //
|
|
|
if (ObjectUtils.isNotEmpty(tappingData) && ObjectUtils.isNotEmpty(modelHitMud)) {
|
|
|
log.info("开口深度openDepth(mm):{}", tappingData.getOpenDepth());
|
|
|
log.info("Tap对应铁水估计铁量ironWeight(t): {}", tappingData.getTheoryWeight());
|
|
|
- log.info("出铁时间ironCosttime(min): {}", mSecondsElapsed.get() / 60);
|
|
|
+ log.info("出铁时间ironCosttime(min): {}", getIronElapsedMinute());
|
|
|
log.info("平均流速ironSpeed(t/s): {}", speed1.get() > speed2.get() ? speed1.get() : speed2.get());
|
|
|
|
|
|
try {
|
|
@@ -614,7 +673,7 @@ public class DeviceEventListener extends EventListener { //
|
|
|
// 设置占位符对应的值
|
|
|
context.setVariable("openDepth", tappingData.getOpenDepth());
|
|
|
context.setVariable("ironWeight", tappingData.getTheoryWeight());
|
|
|
- context.setVariable("ironCosttime", mSecondsElapsed.get() / 60);
|
|
|
+ context.setVariable("ironCosttime", getIronElapsedMinute());
|
|
|
context.setVariable("ironSpeed", speed1.get() > speed2.get() ? speed1.get() : speed2.get());
|
|
|
//计算打泥量
|
|
|
//计算理论铁量= 矿批 × 综合品位 × 1.06,其中矿批是指L2中的干量
|
|
@@ -623,6 +682,7 @@ public class DeviceEventListener extends EventListener { //
|
|
|
// DecimalFormat decimalFormat = new DecimalFormat("#.00");
|
|
|
// String formattedResult = decimalFormat.format(result);
|
|
|
log.info("计算结果: {}", result);
|
|
|
+ PushData.send2IronHitMud(result);
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
}
|
|
@@ -648,7 +708,6 @@ public class DeviceEventListener extends EventListener { //
|
|
|
});
|
|
|
}
|
|
|
|
|
|
-
|
|
|
}
|
|
|
|
|
|
|
|
@@ -690,13 +749,35 @@ public class DeviceEventListener extends EventListener { //
|
|
|
//出铁时间
|
|
|
//String ironCosttime = fixedLatestElement.getI
|
|
|
//实际出铁量
|
|
|
- Double ironWeight = fixedLatestElement.getIronWeight();
|
|
|
+ String ironWeight = fixedLatestElement.getIronWeight();
|
|
|
|
|
|
// TIronData ironData = new TIronData();
|
|
|
// BeanUtils.copyProperties(ironData, fixedLatestElement);
|
|
|
//
|
|
|
// ironDataService.save(ironData);
|
|
|
|
|
|
+ try {
|
|
|
+ String modelExpression = modelTappingTest.getModelExpression();
|
|
|
+ if (ObjectUtils.isNotEmpty(modelExpression)) {
|
|
|
+ log.info("出铁诊断计算公式:{}", modelExpression);
|
|
|
+ SpelExpressionParser parser = new SpelExpressionParser();
|
|
|
+ Expression expression = parser.parseExpression(modelExpression);
|
|
|
+ StandardEvaluationContext context = new StandardEvaluationContext();
|
|
|
+ // 设置占位符对应的值
|
|
|
+ context.setVariable("ironTime", getIronElapsedMinute());
|
|
|
+ context.setVariable("ironWeight", mTotalWeight.doubleValue());
|
|
|
+ context.setVariable("ironSpeed", mTotalWeight.doubleValue() / (getIronElapsedMinute() == 0 ? 1 : getIronElapsedMinute()));
|
|
|
+ context.setVariable("ironTempChange", tempMax.get() - tempMin.get());
|
|
|
+ String result = expression.getValue(context, String.class);
|
|
|
+ // 使用 DecimalFormat 保留两位小数
|
|
|
+// DecimalFormat decimalFormat = new DecimalFormat("#.00");
|
|
|
+// String formattedResult = decimalFormat.format(result);
|
|
|
+ log.info("出铁诊断结果:{}", result);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
scheduledTaskManager.cancelTask(TaskNameConstants.TASKNAME_TAPPING_TEST);
|
|
|
});
|
|
|
}
|
|
@@ -708,7 +789,7 @@ public class DeviceEventListener extends EventListener { //
|
|
|
double ldyl = Double.parseDouble(ObjectUtils.defaultIfNull(mContext.lookupVariable("ldyl"), "0").toString());
|
|
|
double yc = sfyl - ldyl;
|
|
|
log.info("出铁预警:压差:{},标准压差:{},L1出铁状态:{}", yc, PRESSURE_DIFF_VALUE.get(), ironLoading1.get());
|
|
|
- if (PRESSURE_DIFF_VALUE.get() < yc && !ironLoading1.get()) {
|
|
|
+ if (PRESSURE_DIFF_VALUE.get() < yc && ironLoading1.get() == 0) {
|
|
|
PushData.send2Warn(WarnData.warnTapping("压差超过阈值,请出铁", tappingAlramUrl));
|
|
|
exceptionLogService.add(TExceptionLogCreateValidate.builder().exceptionType("4").exceptionDesc("压差超过阈值,请出铁").build());
|
|
|
} else {
|
|
@@ -750,6 +831,17 @@ public class DeviceEventListener extends EventListener { //
|
|
|
realtimeData.setTime(LocalDateUtils.formatDate(opcData.getServerTime()));
|
|
|
mRealtimeData.put(IRON_TEMP, realtimeData);
|
|
|
|
|
|
+ double tempNow = Double.parseDouble(opcData.getData().toString());
|
|
|
+
|
|
|
+ if (tempMax.get() == 0 || tempNow > tempMax.get()) {
|
|
|
+ tempMax.set(tempNow);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (tempMin.get() == 0 || tempNow < tempMin.get()) {
|
|
|
+ tempMin.set(tempNow);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
} else if (opcData.getPointName().contains(L1TagConstants.TAG_CAR11) || opcData.getPointName().contains(L1TagConstants.TAG_CAR12)) {
|
|
|
//1TH-1号车受铁速度
|
|
|
RealtimeData realtimeData = new RealtimeData();
|
|
@@ -792,22 +884,22 @@ public class DeviceEventListener extends EventListener { //
|
|
|
realtimeData.setDesc("出铁状态");
|
|
|
mRealtimeStatus.put(IRON_STATUS, realtimeData);
|
|
|
|
|
|
- ironLoading1.set("1".equals(opcData.getData().toString()));
|
|
|
+ ironLoading1.set(Integer.parseInt(opcData.getData().toString()));
|
|
|
|
|
|
- if (ironLoading1.get()) {
|
|
|
+ if (ironLoading1.get() == 1) {
|
|
|
taphole1Start();
|
|
|
} else {
|
|
|
taphole1End();
|
|
|
}
|
|
|
|
|
|
} else if (opcData.getPointName().contains(L1TagConstants.TAG_TAPHOLE2_STATUS)) {
|
|
|
- ironLoading2.set("1".equals(opcData.getData().toString()));
|
|
|
+ ironLoading2.set(Integer.parseInt(opcData.getData().toString()));
|
|
|
|
|
|
} else if (opcData.getPointName().contains(L1TagConstants.TAG_TAPHOLE3_STATUS)) {
|
|
|
- ironLoading3.set("1".equals(opcData.getData().toString()));
|
|
|
+ ironLoading3.set(Integer.parseInt(opcData.getData().toString()));
|
|
|
|
|
|
} else if (opcData.getPointName().contains(L1TagConstants.TAG_TAPHOLE4_STATUS)) {
|
|
|
- ironLoading4.set("1".equals(opcData.getData().toString()));
|
|
|
+ ironLoading4.set(Integer.parseInt(opcData.getData().toString()));
|
|
|
|
|
|
} else if (opcData.getPointName().contains(L1TagConstants.TAG_IRON_WEIGHT11) || opcData.getPointName().contains(L1TagConstants.TAG_IRON_WEIGHT12)) {
|
|
|
//铁水流量
|
|
@@ -1020,7 +1112,7 @@ public class DeviceEventListener extends EventListener { //
|
|
|
String userId;
|
|
|
if (ObjectUtils.isEmpty(client) || ObjectUtils.isEmpty(userId = SocketUtil.clientUserIds.get(client))) {
|
|
|
log.info("该客户已下线");
|
|
|
- PushData.send2Operation("该客户已下线", false);
|
|
|
+ PushData.send2Operation("该客户已下线", 0);
|
|
|
return null;
|
|
|
}
|
|
|
return userId;
|
|
@@ -1041,7 +1133,7 @@ public class DeviceEventListener extends EventListener { //
|
|
|
|
|
|
if (ObjectUtils.isEmpty(message)) {
|
|
|
log.info("请求数据为空");
|
|
|
- PushData.send2Operation("请求数据为空", false);
|
|
|
+ PushData.send2Operation("请求数据为空", 0);
|
|
|
return;
|
|
|
}
|
|
|
|