diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/enums/Enums.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/enums/Enums.java index 9f24eeb..8aa280d 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/common/enums/Enums.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/enums/Enums.java @@ -9,6 +9,7 @@ public interface Enums { HEARTBEATREPLY, // 心跳回复 SYNCTASK, // 数据同步 SYNCRECV, // 数据同步反馈 + SYNCFAIL, // 数据同步失败,返回失败原因 } /** diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/sms/AliyunSmsService.java b/ssjygl-xsx-common/src/main/java/com/cowr/sms/AliyunSmsService.java index 43d1eb8..4e69551 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/sms/AliyunSmsService.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/sms/AliyunSmsService.java @@ -19,7 +19,11 @@ public class AliyunSmsService { this.client = new DefaultAcsClient(DefaultProfile.getProfile(regionId, accessKeyId, secret)); } - public String generator(String temp_code_str, JSONObject param) { + public String generator(String temp_code_str, JSONObject param) throws Exception { + if(temp_code_str == null){ + throw new Exception("模板文件不存在"); + } + for (String key : param.keySet()) { temp_code_str = temp_code_str.replace("${" + key + "}", param.getString(key)); } diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/common/DeviceThread.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/common/DeviceThread.java index 3e9e544..6300bf9 100644 --- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/common/DeviceThread.java +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/common/DeviceThread.java @@ -52,6 +52,8 @@ public class DeviceThread extends Thread { private List controllers = new ArrayList<>(); private List threads = new ArrayList<>(); + private int supermarket_id; + /* { "flow": [{ @@ -160,9 +162,21 @@ public class DeviceThread extends Thread { String plckey = plcconf.getString("ip") + "_" + plcconf.getIntValue("port"); // 一个摄像头只能连一次 - Camera camera = new Camera(which + "_camera", cameraconf.getString("ip")); - XiShuiScale scale = new XiShuiScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port")); - LEDThread led = new LEDThread(which + "_led", ledconf.getString("ip"), ledconf.getIntValue("port")); + Camera camera = new Camera(which + "_camera", cameraconf.getString("ip")); + LEDThread led = new LEDThread(which + "_led", ledconf.getString("ip"), ledconf.getIntValue("port")); + AbsScale scale; + + if (supermarket_id == 3) { // 城隍用了耀华的表头 + scale = new YaoHuaScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port")); + } else if (supermarket_id == 4) { // 石畈用了两个不一样的表头 + if (scaleconf.getIntValue("port") == 10001) { + scale = new YaoHuaScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port")); + } else { + scale = new XiShuiScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port")); + } + } else { + scale = new XiShuiScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port")); + } PLC plc = null; for (Map.Entry entry : plcMap.entrySet()) { @@ -231,6 +245,14 @@ public class DeviceThread extends Thread { return cameras.get(ip); } + public int getSupermarket_id() { + return supermarket_id; + } + + public void setSupermarket_id(int supermarket_id) { + this.supermarket_id = supermarket_id; + } + /** * 定时任务定时扫描检查 */ diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/PLC.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/PLC.java index 2cfa02e..f8436da 100644 --- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/PLC.java +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/PLC.java @@ -256,10 +256,10 @@ public class PLC extends Device { public static void main(String[] args) { try { - PLC plc = new PLC("_plc", "192.168.20.21", 502, com.cowr.local.ssjygl.devicectrl.common.DeviceThread.defaultAddressTable); + PLC plc = new PLC("_plc", "192.168.20.20", 502, com.cowr.local.ssjygl.devicectrl.common.DeviceThread.defaultAddressTable); plc.connect(); plc.isConnected(); - plc.write("rodOut2Down"); + plc.write("rodOut1Up"); // plc.write("rodOut2Up"); // plc.write("sensorIn2Reset"); diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/XiShuiScale.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/XiShuiScale.java index 0f6057e..d123b2d 100644 --- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/XiShuiScale.java +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/XiShuiScale.java @@ -1,7 +1,5 @@ package com.cowr.local.ssjygl.devicectrl.device; -; - import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; @@ -94,7 +92,7 @@ public class XiShuiScale extends AbsScale { public static void main(String[] args) { - XiShuiScale s = new XiShuiScale("scale", "192.168.20.31", 10001); + XiShuiScale s = new XiShuiScale("scale", "192.168.20.30", 10003); try { boolean connect = s.connect(); diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/YaoHuaScale.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/YaoHuaScale.java new file mode 100644 index 0000000..ef4be78 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/YaoHuaScale.java @@ -0,0 +1,126 @@ +package com.cowr.local.ssjygl.devicectrl.device; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + +/** + * 耀华称重显示器 + */ +public class YaoHuaScale extends AbsScale { + public YaoHuaScale(String id, String ip, int port) { + super(id, ip, port); + } + + @Override + public double weigh() throws IOException { + InputStream inputStream = socket.getInputStream(); + byte[] clearBuf = new byte[inputStream.available()]; + inputStream.read(clearBuf); + int errCount = 0; + + String weight = "0.0"; + while (true) { + if (errCount >= 10) { + break; + } + + errCount++; + + byte[] buf = new byte[12]; + int read = inputStream.read(buf); + + if (read != 18) { + continue; + } + + weight = new String(Arrays.copyOfRange(buf, 2, 8)); + break; + } + + return Double.parseDouble(weight) / 1000d; + } + + @Override + public double weigh15() throws IOException { + ArrayList list = new ArrayList<>(); + AtomicBoolean run = new AtomicBoolean(true); + + InputStream inputStream = socket.getInputStream(); + byte[] clearBuf = new byte[inputStream.available()]; + inputStream.read(clearBuf); + int errCount = 0; + + while (run.get() && list.size() < 15) { + long st = System.currentTimeMillis(); + + byte[] buf = new byte[12]; + int read = inputStream.read(buf); + + if (read != 18 && errCount < 10) { + errCount++; + continue; + } + + String weight = new String(Arrays.copyOfRange(buf, 2, 8)); + + if (!pattern.matcher(weight).matches() || weight.equals("000000")) { +// System.out.println("error:" + weight); + + if (errCount == 100) { + break; + } + errCount++; + continue; + } + +// System.out.println("读一次耗时:" + (System.currentTimeMillis() - st) + ", " + Double.parseDouble(flip(weight))); + list.add(weight); + } + + String max = "0"; + if (list.size() > 0) { + Map collect = list.stream().collect( + Collectors.groupingBy(num -> num, Collectors.counting())); + max = collect.entrySet().stream().max(Comparator.comparingLong(Map.Entry::getValue)).get().getKey(); + } + + return Double.parseDouble(max) / 1000d; + } + + + public static void main(String[] args) { + YaoHuaScale s = new YaoHuaScale("scale", "192.168.20.30", 10001); + + try { + boolean connect = s.connect(); + System.out.println("connect " + connect); + } catch (IOException e) { + e.printStackTrace(); + } + + long st = System.currentTimeMillis(); + + for (int i = 0; i < 100; i++) { + try { + st = System.currentTimeMillis(); + double weigh = s.weigh15(); + System.out.println("end:" + weigh + ", tm: " + (System.currentTimeMillis() - st)); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + } catch (IOException e) { + e.printStackTrace(); + } +// break; + } + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/Config.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/Config.java index 02baad9..5c46d1d 100644 --- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/Config.java +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/Config.java @@ -342,6 +342,7 @@ public class Config extends JFinalConfig { // 最后启动 deviceThread // if ("prod".equals(ENV)) { + deviceThread.setSupermarket_id(CliCacheData.SUP.getId()); deviceThread.start(); // } } catch (Exception e) { diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/netty/NettyClient.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/netty/NettyClient.java index 5ccb951..f074ffe 100644 --- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/netty/NettyClient.java +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/netty/NettyClient.java @@ -2,6 +2,7 @@ package com.cowr.local.ssjygl.netty; import com.alibaba.fastjson.JSONObject; import com.cowr.common.enums.Enums; +import com.cowr.common.view.Result; import com.cowr.local.ssjygl.main.Config; import com.cowr.local.ssjygl.synctask.SyncTaskService; import com.jfinal.log.Log; @@ -104,7 +105,7 @@ public class NettyClient { log.debug("停止 socket 服务"); try { if (channel != null) { - if(channel.parent() != null){ + if (channel.parent() != null) { channel.parent().close(); } channel.close(); @@ -154,14 +155,20 @@ public class NettyClient { log.debug("注册成功,supermarket_id:" + supermarket_id); } else if (Enums.MsgTarget.SYNCTASK.name().equals(target)) { JSONObject data = json.getJSONObject("data"); - boolean ret = SyncTaskService.me.recv(data); + Result ret = SyncTaskService.me.recv(data); // 接收成功后,返回id - if (ret) { + if (ret.getCode() == Result.SUCCESS) { sendMsg(ctx, new JSONObject() .fluentPut("target", Enums.MsgTarget.SYNCRECV) .fluentPut("id", data.get("id")) .toJSONString()); + } else { + sendMsg(ctx, new JSONObject() + .fluentPut("target", Enums.MsgTarget.SYNCFAIL) + .fluentPut("id", data.get("id")) + .fluentPut("msg", ret.getMsg()) + .toJSONString()); } } else if (Enums.MsgTarget.SYNCRECV.name().equals(target)) { SyncTaskService.me.syncComplete(json.getString("id")); diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/synctask/SyncTaskService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/synctask/SyncTaskService.java index 0524c1a..d0bf210 100644 --- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/synctask/SyncTaskService.java +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/synctask/SyncTaskService.java @@ -3,6 +3,7 @@ package com.cowr.local.ssjygl.synctask; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.cowr.common.enums.Enums; +import com.cowr.common.view.Result; import com.cowr.local.ssjygl.main.CliCacheData; import com.cowr.local.ssjygl.main.Config; import com.cowr.model.AuthLicense; @@ -111,9 +112,9 @@ public class SyncTaskService { * @param data * @return */ - public boolean recv(JSONObject data) { + public Result recv(JSONObject data) { if(!isEnable()){ - return true; + return Result.success(); } long st = System.currentTimeMillis(); @@ -130,9 +131,10 @@ public class SyncTaskService { ) { log.error("同步的数据是空的 %s", data.toJSONString()); log.debug("recv 1 time: %s", System.currentTimeMillis() - st); - return true; + return Result.failedstr("同步的数据是空的 %s", data.toJSONString()); } + final String[] err = {null}; boolean ret = Db.tx(new IAtom() { @Override public boolean run() { @@ -219,8 +221,10 @@ public class SyncTaskService { } catch (Exception e) { if (e.getMessage().contains("PRIMARY")) { log.error("主键冲突 %s", data.toJSONString()); + err[0] = String.format("主键冲突 %s", data.toJSONString()); } else if (e.getMessage().contains("Duplicate entry")) { log.error("重复数据 %s", data.toJSONString()); + err[0] = String.format("重复数据 %s", data.toJSONString()); } else { log.error(e.getMessage(), e); } @@ -231,12 +235,12 @@ public class SyncTaskService { }); log.debug("recv 2 time: %s", System.currentTimeMillis() - st); - return ret; + return ret ? Result.success() : Result.failed(err[0]); } catch (Exception e) { log.error(e.getMessage(), e); log.debug("recv 3 time: %s", System.currentTimeMillis() - st); - return false; + return Result.failed(e.getMessage()); } } diff --git a/ssjygl-xsx-local/src/main/resources/dev/config.properties b/ssjygl-xsx-local/src/main/resources/dev/config.properties index 8161eb6..b339445 100644 --- a/ssjygl-xsx-local/src/main/resources/dev/config.properties +++ b/ssjygl-xsx-local/src/main/resources/dev/config.properties @@ -10,7 +10,7 @@ socketserver.port=21002 socketio.port=12002 #当前部署本地程序的砂站id -current.supermarket_id=6 +current.supermarket_id=1 #打印用到的配置信息 print.vendor=浠水县长投环保有限公司 diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/netty/NettyServer.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/netty/NettyServer.java index c5c5d1e..6c03d8d 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/netty/NettyServer.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/netty/NettyServer.java @@ -199,6 +199,9 @@ public class NettyServer { } } else if (Enums.MsgTarget.SYNCRECV.name().equals(target)) { SyncTaskService.me.syncComplete(json.getString("id")); + } else if (Enums.MsgTarget.SYNCFAIL.name().equals(target)) { + log.debug("客户端[%s]同步数据[sync_task id:%s]发生错误", map.get(ctx.channel()), json.getString("id")); + log.debug("客户端上传错误信息:%s", json.getString("msg")); } else { System.out.println(json); } diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/smslog/SmsService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/smslog/SmsService.java index 3f67121..20bb087 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/smslog/SmsService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/smslog/SmsService.java @@ -76,7 +76,13 @@ public class SmsService { obj.put("date", DateTimeUtil.sdfymd.get().format(ordercluster.getCutoffTime())); obj.put("weight", String.format("%.2f", ordercluster.getTotalWeight())); - String content = this.aliyunsms.generator(Const.SMS_TEMP_MAP.get(Const.TEMP_CODE_PEIE), obj); + String content = null; + try { + content = this.aliyunsms.generator(Const.SMS_TEMP_MAP.get(Const.TEMP_CODE_PEIE), obj); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } for (Sysuser sysuser : users) { try { diff --git a/ssjygl-xsx-service/src/main/resources/log4j.properties b/ssjygl-xsx-service/src/main/resources/log4j.properties index e64bad2..d2d7d36 100644 --- a/ssjygl-xsx-service/src/main/resources/log4j.properties +++ b/ssjygl-xsx-service/src/main/resources/log4j.properties @@ -57,21 +57,21 @@ log4j.appender.fileInfo.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss.SSS} %p # %t 输出产生该日志事件的线程名 -# nettyclient 日志 +# nettyserver 日志 log4j.additivity.com.cowr.service.ssjygl.netty=false -log4j.logger.com.cowr.service.ssjygl.netty=DEBUG, nettyclientFile, nettyclientConsole -log4j.appender.nettyclientFile=org.apache.log4j.RollingFileAppender -log4j.appender.nettyclientFile.encoding=UTF-8 -log4j.appender.nettyclientFile.Append=true -log4j.appender.nettyclientFile.Threshold=DEBUG -log4j.appender.nettyclientFile.File=../logs/ssjygl.xsx.nettyclient.log -log4j.appender.nettyclientFile.MaxFileSize=10MB -log4j.appender.nettyclientFile.MaxBackupIndex=1000 -log4j.appender.nettyclientFile.layout=org.apache.log4j.PatternLayout -log4j.appender.nettyclientFile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss.SSS} %p %F %L - %M %m %X{traceId}%n +log4j.logger.com.cowr.service.ssjygl.netty=DEBUG, nettyserverFile, nettyserverConsole +log4j.appender.nettyserverFile=org.apache.log4j.RollingFileAppender +log4j.appender.nettyserverFile.encoding=UTF-8 +log4j.appender.nettyserverFile.Append=true +log4j.appender.nettyserverFile.Threshold=DEBUG +log4j.appender.nettyserverFile.File=../logs/ssjygl.xsx.nettyserver.log +log4j.appender.nettyserverFile.MaxFileSize=10MB +log4j.appender.nettyserverFile.MaxBackupIndex=1000 +log4j.appender.nettyserverFile.layout=org.apache.log4j.PatternLayout +log4j.appender.nettyserverFile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss.SSS} %p %F %L - %M %m %X{traceId}%n -log4j.appender.nettyclientConsole.Threshold=DEBUG -log4j.appender.nettyclientConsole=org.apache.log4j.ConsoleAppender -log4j.appender.nettyclientConsole.encoding=UTF-8 -log4j.appender.nettyclientConsole.layout=org.apache.log4j.PatternLayout -log4j.appender.nettyclientConsole.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}[%p][%l]: %m%n \ No newline at end of file +log4j.appender.nettyserverConsole.Threshold=DEBUG +log4j.appender.nettyserverConsole=org.apache.log4j.ConsoleAppender +log4j.appender.nettyserverConsole.encoding=UTF-8 +log4j.appender.nettyserverConsole.layout=org.apache.log4j.PatternLayout +log4j.appender.nettyserverConsole.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}[%p][%l]: %m%n \ No newline at end of file