From 4e79a6fbc00b72f9d7665757ce1af750b7415d31 Mon Sep 17 00:00:00 2001 From: wany <13995595726@qq.com> Date: Tue, 25 Mar 2025 09:14:01 +0800 Subject: [PATCH] =?UTF-8?q?bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cowr/model/base/BaseOrderTransfer.java | 22 ++++ .../ordercluster/OrderclusterService.java | 46 ++++++- .../order/orderend/OrderEndService.java | 3 - .../order/ordertemp/OrderTempService.java | 2 +- .../ssjygl/stat/sale/OrderStatService.java | 7 +- .../devicectrl/common/DeviceThread.java | 57 ++++----- .../devicectrl/controllers/InController.java | 20 +-- .../devicectrl/controllers/OutController.java | 24 ++-- .../local/ssjygl/devicectrl/device/PLC.java | 2 +- .../ssjygl/devicectrl/device/YaoHuaScale.java | 15 ++- .../devicectrl/printer/ExcelHelper.java | 2 +- .../devicectrl/printer/JsdCellAddresses.java | 14 +++ .../local/ssjygl/hbrsms/HbrsmsService.java | 4 + .../local/ssjygl/order/LocalOrderService.java | 118 ++++++++++++++---- .../order/ordertemp/OrderTempController.java | 3 +- .../order/ordertemp/OrderTempSyncService.java | 3 +- .../OrderTransferController.java | 7 +- .../OrderTransferPayValidator.java | 2 +- .../OrderTransferSyncService.java | 45 +++++-- .../ssjygl/transport/TransportController.java | 21 ++++ .../src/main/resources/dev/db.properties | 2 +- .../src/main/resources/tpl_bill_full.xlsx | Bin 12366 -> 13140 bytes .../src/main/resources/tpl_bill_full1.xlsx | Bin 0 -> 12354 bytes 23 files changed, 314 insertions(+), 105 deletions(-) create mode 100644 ssjygl-xsct-local/src/main/resources/tpl_bill_full1.xlsx diff --git a/ssjygl-xsct-common/src/main/java/com/cowr/model/base/BaseOrderTransfer.java b/ssjygl-xsct-common/src/main/java/com/cowr/model/base/BaseOrderTransfer.java index 2a7871b..13f2120 100644 --- a/ssjygl-xsct-common/src/main/java/com/cowr/model/base/BaseOrderTransfer.java +++ b/ssjygl-xsct-common/src/main/java/com/cowr/model/base/BaseOrderTransfer.java @@ -722,4 +722,26 @@ public abstract class BaseOrderTransfer> extends return getStr("ticket_code"); } + /** + * name: ordercluster_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param orderclusterId ordercluste id + */ + @JSONField(name="ordercluster_id") + public void setOrderclusterId(Integer orderclusterId) { + set("ordercluster_id", orderclusterId); + } + + + /** + * @return ordercluster_id ordercluste id + */ + @JSONField(name="ordercluster_id") + public Integer getOrderclusterId() { + return getInt("ordercluster_id"); + } + } diff --git a/ssjygl-xsct-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java b/ssjygl-xsct-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java index 928b681..bca30b8 100644 --- a/ssjygl-xsct-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java +++ b/ssjygl-xsct-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java @@ -218,7 +218,7 @@ public class OrderclusterService extends BaseService { Page page = Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); List list = page.getList(); - setOverWeight(list); + setOverWeight2(list); setTruckNum(list); return page; @@ -730,6 +730,50 @@ public class OrderclusterService extends BaseService { } } + public void setOverWeight2(List list) { + // 使用已完成的订单动态计算剩余量 + if (list == null || list.isEmpty()) { + return; + } + + StringBuilder ids = new StringBuilder(); + Map map = new HashMap<>(); + for (Record record : list) { + if (ids.length() > 0) { + ids.append(", "); + } + + record.set("over_weight", record.get("total_weight")); // 默认用 total_weight 填充,下面根据实际的数据覆盖 + record.set("complete_weight", 0); + + ids.append(record.getStr("id")); + map.put(record.getInt("id"), record); + } + + String sql = " select t.ordercluster_id, sum(t.weight) weight from order_transfer t \n" + + " where t.state = ? \n" + + " and t.ordercluster_id in(" + ids.toString() + ") \n" + + " group by t.ordercluster_id "; + + List orderlist = Db.find(sql, OrderStateEnum.RECEIVED.getStateid()); + + for (Record cli : orderlist) { + int ordercluster_id = cli.getInt("ordercluster_id"); + BigDecimal weight = cli.getBigDecimal("weight"); + + if (map.containsKey(ordercluster_id) && weight != null) { + Record record = map.get(ordercluster_id); + if (record.getBigDecimal("total_weight").compareTo(weight) == 0) { + record.set("over_weight", 0); + } else { + record.set("over_weight", record.getBigDecimal("total_weight").subtract(weight).setScale(2, BigDecimal.ROUND_HALF_UP)); + } + + record.set("complete_weight", weight.setScale(2, BigDecimal.ROUND_HALF_UP)); + } + } + } + /** * 查询集团订单的子订单 * diff --git a/ssjygl-xsct-common/src/main/java/com/cowr/ssjygl/order/orderend/OrderEndService.java b/ssjygl-xsct-common/src/main/java/com/cowr/ssjygl/order/orderend/OrderEndService.java index 44fcee4..4164e03 100644 --- a/ssjygl-xsct-common/src/main/java/com/cowr/ssjygl/order/orderend/OrderEndService.java +++ b/ssjygl-xsct-common/src/main/java/com/cowr/ssjygl/order/orderend/OrderEndService.java @@ -165,7 +165,6 @@ public class OrderEndService extends BaseService { log.info("数据结果为空"); if (StrKit.notBlank(customerId) &&StrKit.notBlank(tm) &&StrKit.notBlank(supermarketId) &&StrKit.notBlank(String.valueOf(saleType)) - &&StrKit.notBlank(String.valueOf(invoiceType)) &&StrKit.notBlank(String.valueOf(productId)) &&StrKit.notBlank(String.valueOf(orderclusterId)) ){ @@ -173,7 +172,6 @@ public class OrderEndService extends BaseService { "_" + tm + "_" + supermarketId + "_" + saleType + -// "_" + invoiceType + "_" + productId + "_" + orderclusterId; Record first = Db.findFirst("select * from order_end WHERE ID = '" + id + "'"); @@ -216,7 +214,6 @@ public class OrderEndService extends BaseService { "_" + DateTimeUtil.sdf.get().format(o.getDate("date")) + "_" + o.getSupermarketId() + "_" + o.getSaleType() + -// "_" + o.getInvoiceType() + "_" + o.getProductId() + "_" + o.getOrderclusterId()); return o; diff --git a/ssjygl-xsct-common/src/main/java/com/cowr/ssjygl/order/ordertemp/OrderTempService.java b/ssjygl-xsct-common/src/main/java/com/cowr/ssjygl/order/ordertemp/OrderTempService.java index 917afa9..3640778 100644 --- a/ssjygl-xsct-common/src/main/java/com/cowr/ssjygl/order/ordertemp/OrderTempService.java +++ b/ssjygl-xsct-common/src/main/java/com/cowr/ssjygl/order/ordertemp/OrderTempService.java @@ -524,7 +524,7 @@ public class OrderTempService extends BaseService { "SUM( TOTAL_PRICE ) TOTAL_PRICE,\n" + "SALE_TYPE,\n" + "PRODUCT_ID,\n" + - "INVOICE_TYPE,\n" + +// "INVOICE_TYPE,\n" + "ORDERCLUSTER_ID,\n" + "ifnull(COUNT( SN ), 0 ) COUNT \n" + "FROM\n" + diff --git a/ssjygl-xsct-common/src/main/java/com/cowr/ssjygl/stat/sale/OrderStatService.java b/ssjygl-xsct-common/src/main/java/com/cowr/ssjygl/stat/sale/OrderStatService.java index 1580d43..ee20f06 100644 --- a/ssjygl-xsct-common/src/main/java/com/cowr/ssjygl/stat/sale/OrderStatService.java +++ b/ssjygl-xsct-common/src/main/java/com/cowr/ssjygl/stat/sale/OrderStatService.java @@ -630,7 +630,8 @@ public class OrderStatService { List sale_list = Db.find("SELECT\n" + " s.id AS sandfarm_id,\n" + " s.NAME AS sandfarm_name,\n" + - " IFNULL( SUM( CASE WHEN t.supermarket_id = 1 THEN t.count END ), 0 ) AS xsl_1,\n" + +// " IFNULL( SUM( CASE WHEN t.supermarket_id = 1 THEN t.count END ), 0 ) AS xsl_1,\n" + + " 0 AS xsl_1,\n" + " IFNULL( SUM( CASE WHEN t.supermarket_id = 1 THEN t.source_weight END ), 0 ) AS xse_1,\n" + " IFNULL( SUM( CASE WHEN t.supermarket_id = 1 THEN t.weight END ), 0 ) AS xss_1,\n" + " IFNULL( SUM( t.weight ), 0 ) AS weight \n" + @@ -3246,7 +3247,7 @@ public class OrderStatService { " ifnull( sum( CASE WHEN g.supermarket_id = 2 THEN g.count END ), 0 ) xsc_2,\n" + " ifnull( sum( CASE WHEN g.supermarket_id = 2 THEN g.source_weight END ), 0 ) xss_2,\n" + " ifnull( sum( CASE WHEN g.supermarket_id = 2 THEN g.weight END ), 0 ) xsw_2,\n" + - " ifnull( sum( CASE WHEN g.supermarket_id = 2 THEN g.trans_price END ), 0 ) xst_2,\n" + + " ifnull( sum( CASE WHEN g.supermarket_id = 2 THEN g.trans_price END ), 0 ) xst_2\n" + " ifnull( sum( CASE WHEN g.supermarket_id = 3 THEN g.count END ), 0 ) xsc_3,\n" + " ifnull( sum( CASE WHEN g.supermarket_id = 3 THEN g.source_weight END ), 0 ) xss_3,\n" + " ifnull( sum( CASE WHEN g.supermarket_id = 3 THEN g.weight END ), 0 ) xsw_3,\n" + @@ -3261,7 +3262,7 @@ public class OrderStatService { " ifnull( t.trans_co_id, ifnull( ot.trans_co_id, 0 ) ) trans_co_id,\n" + " t.supermarket_id,\n" + " t.truck_license license,\n" + - " ifnull( count( t.sn ), 0 ) count,\n" + + " ifnull( count( ot.sn ), 0 ) count,\n" + " ifnull( sum( t.weight ), 0 ) weight,\n" + " ifnull( sum( ot.weight ), 0 ) source_weight,\n" + " ifnull( sum( ot.trans_price ), 0 ) trans_price \n" + diff --git a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/common/DeviceThread.java b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/common/DeviceThread.java index faa0ebd..8f0206f 100644 --- a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/common/DeviceThread.java +++ b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/common/DeviceThread.java @@ -188,38 +188,39 @@ public class DeviceThread extends Thread { // 一个摄像头只能连一次 Camera camera = new Camera(which + "_camera", cameraconf.getString("ip")); LEDThread led = new LEDThread(which + "_led", ledconf.getString("ip"), ledconf.getIntValue("port")); - AbsScale scale; + AbsScale scale = null; // 根据砂站id,兼容不同的表头 - if (supermarket_id == 3) { // 城隍用了耀华的表头 + if (supermarket_id == 1) { // 城隍用了耀华的表头 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")); - - // 2021-03-07 原来地方1号传感器故障,让二期地磅厂家更换传感器 - scale = new DingsongScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port")); - } else { - scale = new XiShuiScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port")); - } - } else if (supermarket_id == 5) { - // 2021-04-15 融嘉入口磅换了 - if (which.startsWith(Enums.CtrlFlowEnum.R.name())) { - scale = new DingsongScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port")); - } else { - scale = new XiShuiScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port")); - } - } else if (supermarket_id == 7) { - if (which.startsWith(Enums.CtrlFlowEnum.C.name())) { - scale = new DingsongScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port")); - } else { - scale = new KeLiScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port")); - } - } else if (supermarket_id == 8 || supermarket_id == 9) { - scale = new DingsongScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port")); - } else { - scale = new XiShuiScale(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")); +// +// // 2021-03-07 原来地方1号传感器故障,让二期地磅厂家更换传感器 +// scale = new DingsongScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port")); +// } else { +// scale = new XiShuiScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port")); +// } +// } else if (supermarket_id == 5) { +// // 2021-04-15 融嘉入口磅换了 +// if (which.startsWith(Enums.CtrlFlowEnum.R.name())) { +// scale = new DingsongScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port")); +// } else { +// scale = new XiShuiScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port")); +// } +// } else if (supermarket_id == 7) { +// if (which.startsWith(Enums.CtrlFlowEnum.C.name())) { +// scale = new DingsongScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port")); +// } else { +// scale = new KeLiScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port")); +// } +// } else if (supermarket_id == 8 || supermarket_id == 9) { +// scale = new DingsongScale(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()) { diff --git a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/controllers/InController.java b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/controllers/InController.java index ebd725b..12cf510 100644 --- a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/controllers/InController.java +++ b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/controllers/InController.java @@ -160,18 +160,18 @@ public class InController extends Controller implements Runnable { log.error(e.getMessage(), e); } - log.debug("%s 【%s】上磅,重置地感线圈状态", getWhich(), pair.license); + log.debug("%s 【%s】上磅,重置雷达信号状态", getWhich(), pair.license); try { getPlc().write(getSensor1Reset()); // 重置前地感状态 } catch (IOException e) { - log.debug("%s 【%s】 重置地感线圈状态失败", getWhich(), pair.license); + log.debug("%s 【%s】 重置雷达信号状态失败", getWhich(), pair.license); log.error(e.getMessage(), e); } - log.debug("%s 【%s】上磅,等待地感线圈状态", getWhich(), pair.license); + log.debug("%s 【%s】上磅,等待雷达信号状态"+getSensor1(), getWhich(), pair.license); try { - while (!getResetFlow()) { // 流程没有被重置,就一直等待地感线圈状态 + while (!getResetFlow()) { // 流程没有被重置,就一直等待雷达信号状态 if (getPlc().read(getSensor1())) { // 读取前地感状态 break; } @@ -181,7 +181,7 @@ public class InController extends Controller implements Runnable { log.error(e.getMessage(), e); } - // 重置流程,这个位置要重置地感线圈状态 + // 重置流程,这个位置要重置雷达信号状态 if (getResetFlow()) { try { getPlc().write(getSensor1Reset()); // 重置前地感状态 @@ -293,13 +293,13 @@ public class InController extends Controller implements Runnable { try { getPlc().write(getSensor2Reset()); // 重置后地感状态 } catch (IOException e) { - log.debug("%s 【%s】 重置地感线圈状态失败", getWhich(), pair.license); + log.debug("%s 【%s】 重置雷达信号状态失败", getWhich(), pair.license); log.error(e.getMessage(), e); } - log.debug("%s 【%s】下磅,等待地感线圈状态", getWhich(), pair.license); + log.debug("%s 【%s】下磅,等待雷达信号状态", getWhich(), pair.license); try { - while (!getResetFlow()) { // 流程没有被重置,就一直等待地感线圈状态 + while (!getResetFlow()) { // 流程没有被重置,就一直等待雷达信号状态 if (getPlc().read(getSensor2())) { // 读取后地感状态 break; } @@ -313,7 +313,7 @@ public class InController extends Controller implements Runnable { try { getPlc().write(getSensor2Reset()); // 重置后地感状态 } catch (IOException e) { - log.debug("%s 【%s】 重置地感线圈状态失败", getWhich(), pair.license); + log.debug("%s 【%s】 重置雷达信号状态失败", getWhich(), pair.license); log.error(e.getMessage(), e); } setResetFlow(false); @@ -328,7 +328,7 @@ public class InController extends Controller implements Runnable { try { getPlc().write(getSensor2Reset()); // 重置后地感状态 } catch (IOException e) { - log.debug("%s 【%s】 重置地感线圈状态失败", getWhich(), pair.license); + log.debug("%s 【%s】 重置雷达信号状态失败", getWhich(), pair.license); log.error(e.getMessage(), e); } setResetFlow(false); diff --git a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/controllers/OutController.java b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/controllers/OutController.java index 2ff68ef..aa0da57 100644 --- a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/controllers/OutController.java +++ b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/controllers/OutController.java @@ -159,18 +159,18 @@ public class OutController extends Controller implements Runnable { log.error(e.getMessage(), e); } - log.debug("%s 【%s】上磅,重置地感线圈状态", getWhich(), pair.license); + log.debug("%s 【%s】上磅,重置雷达信号状态", getWhich(), pair.license); try { getPlc().write(getSensor1Reset()); // 重置前地感状态 } catch (IOException e) { - log.debug("%s 【%s】 重置地感线圈状态失败", getWhich(), pair.license); + log.debug("%s 【%s】 重置雷达信号状态失败", getWhich(), pair.license); log.error(e.getMessage(), e); } - log.debug("%s 【%s】上磅,等待地感线圈状态", getWhich(), pair.license); + log.debug("%s 【%s】上磅,等待雷达信号状态", getWhich(), pair.license); try { - while (!getResetFlow()) { // 流程没有被重置,就一直等待地感线圈状态 + while (!getResetFlow()) { // 流程没有被重置,就一直等待雷达信号状态 if (getPlc().read(getSensor1())) { // 读取前地感状态 break; } @@ -180,10 +180,10 @@ public class OutController extends Controller implements Runnable { log.error(e.getMessage(), e); } - // 获取到地感线圈状态后,等待 5 秒后开始称重 + // 获取到雷达信号状态后,等待 5 秒后开始称重 Thread.sleep(getScaleWaitTime()); - // 重置流程,这个位置要重置地感线圈状态 + // 重置流程,这个位置要重置雷达信号状态 if (getResetFlow()) { try { getPlc().write(getSensor1Reset()); // 重置前地感状态 @@ -203,7 +203,7 @@ public class OutController extends Controller implements Runnable { log.error(e.getMessage(), e); } - // 获取到地感线圈状态后,等待 5 秒后开始称重 + // 获取到雷达信号状态后,等待 5 秒后开始称重 Thread.sleep(getScaleWaitTime()); double weight = 0; @@ -303,13 +303,13 @@ public class OutController extends Controller implements Runnable { try { getPlc().write(getSensor2Reset()); // 重置后地感状态 } catch (IOException e) { - log.debug("%s 【%s】 重置地感线圈状态失败", getWhich(), pair.license); + log.debug("%s 【%s】 重置雷达信号状态失败", getWhich(), pair.license); log.error(e.getMessage(), e); } - log.debug("%s 【%s】下磅,等待地感线圈状态", getWhich(), pair.license); + log.debug("%s 【%s】下磅,等待雷达信号状态", getWhich(), pair.license); try { - while (!getResetFlow()) { // 流程没有被重置,就一直等待地感线圈状态 + while (!getResetFlow()) { // 流程没有被重置,就一直等待雷达信号状态 if (getPlc().read(getSensor2())) { // 读取后地感状态 break; } @@ -323,7 +323,7 @@ public class OutController extends Controller implements Runnable { try { getPlc().write(getSensor2Reset()); // 重置后地感状态 } catch (IOException e) { - log.debug("%s 【%s】 重置地感线圈状态失败", getWhich(), pair.license); + log.debug("%s 【%s】 重置雷达信号状态失败", getWhich(), pair.license); log.error(e.getMessage(), e); } setResetFlow(false); @@ -338,7 +338,7 @@ public class OutController extends Controller implements Runnable { try { getPlc().write(getSensor2Reset()); // 重置后地感状态 } catch (IOException e) { - log.debug("%s 【%s】 重置地感线圈状态失败", getWhich(), pair.license); + log.debug("%s 【%s】 重置雷达信号状态失败", getWhich(), pair.license); log.error(e.getMessage(), e); } setResetFlow(false); diff --git a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/PLC.java b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/PLC.java index 2fcdb34..95384f4 100644 --- a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/PLC.java +++ b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/PLC.java @@ -275,7 +275,7 @@ public class PLC extends Device { public static void main(String[] args) { try { - PLC plc = new PLC("_plc", "192.168.20.20", 502, com.cowr.local.ssjygl.devicectrl.common.DeviceThread.defaultAddressTable); + PLC plc = new PLC("_plc", "192.168.20.21", 502, com.cowr.local.ssjygl.devicectrl.common.DeviceThread.defaultAddressTable); plc.connect(); plc.isConnected(); // plc.write("rodIn1Down"); diff --git a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/YaoHuaScale.java b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/YaoHuaScale.java index 44912b0..7835ee0 100644 --- a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/YaoHuaScale.java +++ b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/YaoHuaScale.java @@ -110,7 +110,7 @@ public class YaoHuaScale extends AbsScale { public static void main(String[] args) { - YaoHuaScale s = new YaoHuaScale("scale", "192.168.20.30", 10001); + YaoHuaScale s = new YaoHuaScale("scale", "192.168.20.31", 10001); try { boolean connect = s.connect(); @@ -123,9 +123,20 @@ public class YaoHuaScale extends AbsScale { for (int i = 0; i < 100; i++) { try { - st = System.currentTimeMillis(); + if (!s.isConnected()) { + s.connect(); + } + double weigh = s.weigh15(); System.out.println("end:" + weigh + ", tm: " + (System.currentTimeMillis() - st)); + if (weigh > 0) { + + } else { + // 读数错误,断开连接,下次读取时重连 + s.disconnect(); + } + st = System.currentTimeMillis(); + try { Thread.sleep(1000); } catch (InterruptedException e) { diff --git a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/printer/ExcelHelper.java b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/printer/ExcelHelper.java index d43cbf8..ac2c43b 100644 --- a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/printer/ExcelHelper.java +++ b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/printer/ExcelHelper.java @@ -29,7 +29,7 @@ public class ExcelHelper { log.debug("读取模板耗时:" + (System.currentTimeMillis() - st)); Sheet sheet = workbook.getSheetAt(0); - if ("tpl_bill_full.xlsx".equals(tplFile.getName())) { + if ("tpl_bill_full.xlsx".equals(tplFile.getName()) || "tpl_bill_full1.xlsx".equals(tplFile.getName())) { addrMap = JsdCellAddresses.addrMap; datetimePrint = JsdCellAddresses.datetimePrint; } else { diff --git a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/printer/JsdCellAddresses.java b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/printer/JsdCellAddresses.java index 69c3d9a..3eb4401 100644 --- a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/printer/JsdCellAddresses.java +++ b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/devicectrl/printer/JsdCellAddresses.java @@ -8,10 +8,14 @@ import java.util.Map; // 保存预设的发票内容单元格位置 // 结算单 public class JsdCellAddresses { + // 订单号 + public static final CellAddress sn = makeCellAddress("d8"); // 开票时间 public static final CellAddress datetimePrint = makeCellAddress("o8"); // 客户名称 public static final CellAddress clientName = makeCellAddress("c9"); + + public static final CellAddress productName = makeCellAddress("b14"); // 净重 public static final CellAddress goodsNetWeight = makeCellAddress("g18"); @@ -31,17 +35,23 @@ public class JsdCellAddresses { public static final CellAddress priceGoodsTotalUpper = makeCellAddress("m17"); // 备注 public static final CellAddress remark = makeCellAddress("m20"); + public static final CellAddress memo = makeCellAddress("m21"); // 开票人 public static final CellAddress drawer = makeCellAddress("e24"); // 车牌号 public static final CellAddress truckLicense = makeCellAddress("m11"); + public static final CellAddress dest = makeCellAddress("d9"); + + public static final CellAddress origin = makeCellAddress("e20"); + public static Map addrMap = new HashMap<>(); static { addrMap.put("datatimePrint", datetimePrint); addrMap.put("goodsSetWeight", goodsSetWeight); addrMap.put("clientName", clientName); + addrMap.put("goodsName", productName); addrMap.put("goodsNetWeight", goodsNetWeight); addrMap.put("goodsTareWeight", goodsTareWeight); addrMap.put("goodsGrossWeight", goodsGrossWeight); @@ -51,6 +61,10 @@ public class JsdCellAddresses { addrMap.put("remark", remark); addrMap.put("drawer", drawer); addrMap.put("truck_license", truckLicense); + addrMap.put("dest", dest); + addrMap.put("origin", origin); + addrMap.put("sn", sn); + addrMap.put("memo", memo); } private static CellAddress makeCellAddress(String addr) { diff --git a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/hbrsms/HbrsmsService.java b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/hbrsms/HbrsmsService.java index f081555..a46f196 100644 --- a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/hbrsms/HbrsmsService.java +++ b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/hbrsms/HbrsmsService.java @@ -50,6 +50,10 @@ public class HbrsmsService { public void put(OrderTemp order, Transport transport) { + } + + public void put1(OrderTemp order, Transport transport) { + Hbrsms hbrsms = new Hbrsms(); hbrsms.setCategory(0); //0-砂石,1-卵石,2 - 土 String billerName = Config.configprop.get("hbrsms.billerName"); diff --git a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/order/LocalOrderService.java b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/order/LocalOrderService.java index 09469e9..98db424 100644 --- a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/order/LocalOrderService.java +++ b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/order/LocalOrderService.java @@ -148,8 +148,12 @@ public class LocalOrderService { try { printdata.set("first_weight", transport.getFirstWeight()); printdata.set("second_weight", transport.getSecondWeight()); + if (printerId == Enums.PrinterIdEnum.printer2.name()){ + Config.deviceThread.print(printerId, getPrintFile1(printdata)); + } else { + Config.deviceThread.print(printerId, getPrintFile(printdata)); + } - Config.deviceThread.print(printerId, getPrintFile(printdata)); out.set("print", true); } catch (Exception e) { out.set("print", "打印指令发送失败"); @@ -224,6 +228,7 @@ public class LocalOrderService { String transDistance = "---"; // 运输距离 String priceTransTotal = "---"; // 运输总价 String priceTransTotalUpper = "---"; // 运输总价大写 + String memo = ""; if (sntype == OrderTypeEnum.SALE.getTypeid()) { @@ -251,12 +256,12 @@ public class LocalOrderService { return null; } - origin = supermarket.getName(); // 运输起点 +// origin = supermarket.getName(); // 运输起点 dest = clientName; // 运输终点 vendor = CacheData.print_vendor; // 销售方名称 vendorTaxId = CacheData.print_vendorTaxId; // 销售方纳税人识别号 - remark = "销售订单:" + sn; +// remark = "销售订单:" + sn; if (order.get("total_price") != null) { paid = String.format("%.2f", order.getBigDecimal("total_price")); // 总价 @@ -284,13 +289,13 @@ public class LocalOrderService { goodsGrossWeight = String.format("%.2f", first_weight); // 毛重 goodsSetWeight = goodsNetWeight; - goodsNetWeight = String.format("%.2f", second_weight.subtract(first_weight)); // 计算净重 + goodsNetWeight = String.format("%.2f", first_weight.subtract(second_weight)); // 计算净重 - Sandfarm sandfarm = Sandfarm.dao.findById(order.get("sandfarm_id")); + Supermarket sandfarm = Supermarket.dao.findById(order.get("sandfarm_id")); if (sandfarm == null) { - log.error("获取砂场信息失败 %s", order.getInt("sandfarm_id")); + log.error("获取取土场信息失败 %s", order.getInt("sandfarm_id")); return null; } @@ -304,24 +309,24 @@ public class LocalOrderService { origin = sandfarm.getName(); // 运输起点 dest = supermarket.getName(); // 运输终点 - remark = "转运订单:" + sn; + remark = "原材料运输订单"; if (order.get("source_weight") != null) { remark += String.format("\n底单重量:%.2f", order.getBigDecimal("source_weight")); } // 运输单价,车辆载重对应的起步价 - priceTrans = TransPriceService.me.getOrderStartTransPrice(order.getInt("trans_co_id"), Math.abs(order.getDouble("weight"))) + ""; - - priceGoods = StrUtil.getRecordStr(order, "unit_price"); // 商品单价 - transDistance = StrUtil.getRecordStr(order, "trans_distance"); // 运输距离 - priceTransTotal = StrUtil.getRecordStr(order, "trans_price"); // 运输总价 - - if (order.get("trans_price") != null) { - priceTransTotalUpper = ChineseNumberUtil.getChineseNumber(order.getBigDecimal("trans_price").doubleValue()); - } else { - priceTransTotalUpper = ""; // 运输总价大写 - } +// priceTrans = TransPriceService.me.getOrderStartTransPrice(order.getInt("trans_co_id"), Math.abs(order.getDouble("weight"))) + ""; +// + priceGoods = StrUtil.getRecordStr(order, "sn"); // 商品单价 +// transDistance = StrUtil.getRecordStr(order, "trans_distance"); // 运输距离 +// priceTransTotal = StrUtil.getRecordStr(order, "trans_price"); // 运输总价 +// +// if (order.get("trans_price") != null) { +// priceTransTotalUpper = ChineseNumberUtil.getChineseNumber(order.getBigDecimal("trans_price").doubleValue()); +// } else { +// priceTransTotalUpper = ""; // 运输总价大写 +// } } else if (sntype == OrderTypeEnum.TEMP.getTypeid()) { int decimal; int total_weight_decimal = 0; @@ -364,7 +369,7 @@ public class LocalOrderService { return null; } - origin = supermarket.getName(); // 运输起点 + origin = "结算重量"; dest = StrUtil.getRecordStr(order, "customer_receiver_address"); // 运输终点 vendor = CacheData.print_vendor; // 销售方名称 @@ -379,6 +384,8 @@ public class LocalOrderService { } } + memo = StrUtil.getRecordStr(order, "memo"); + // if(StrKit.notBlank(origin)){ // remark += "\r\n发货地:" + origin; // } @@ -457,6 +464,7 @@ public class LocalOrderService { out.put("goodsTareWeight", new BigDecimal(goodsTareWeight).setScale(2, RoundingMode.HALF_UP).toString()); out.put("goodsGrossWeight", new BigDecimal(goodsGrossWeight).setScale(2, RoundingMode.HALF_UP).toString()); // out.put("qrcode", sn); + out.put("sn",sn); out.put("serial", sn); out.put("datetimePrint", sdf.get().format(new Date())); out.put("clientName", clientName); @@ -485,6 +493,7 @@ public class LocalOrderService { out.put("vendor", vendor); out.put("vendorTaxId", vendorTaxId); out.put("remark", remark); + out.put("memo", memo); out.put("drawer", StrUtil.getRecordStr(order, "settlement_user_name")); out.put("truck_license", StrUtil.getRecordStr(order, "truck_license")); @@ -511,14 +520,68 @@ public class LocalOrderService { Workbook wb = null; try { - Object invoice_type = data.get("invoice_type"); // 可能是 null + wb = ExcelHelper.genExcel(data, new File(PathKit.getRootClassPath() + "/tpl_bill_full.xlsx")); - if ("2".equals(invoice_type)) { // 2020-09-29 开专票的订单先用结算单模板 - wb = ExcelHelper.genExcel(data, new File(PathKit.getRootClassPath() + "/tpl_bill_full.xlsx")); - } else { // 其他的用冠名发票 - wb = ExcelHelper.genExcel(data, new File(PathKit.getRootClassPath() + "/tpl.xlsx")); +// Object invoice_type = data.get("invoice_type"); // 可能是 null +// +// if ("2".equals(invoice_type)) { // 2020-09-29 开专票的订单先用结算单模板 +// wb = ExcelHelper.genExcel(data, new File(PathKit.getRootClassPath() + "/tpl_bill_full.xlsx")); +// } else { // 其他的用冠名发票 +// wb = ExcelHelper.genExcel(data, new File(PathKit.getRootClassPath() + "/tpl.xlsx")); +// } + + if (wb == null) { + log.error("获取 Workbook 失败"); + return null; } + log.debug("生成文件耗时1:%s", System.currentTimeMillis() - st); + + File out = new File(String.format("%s%s%s-%d.xlsx", + Config.getRootPath() + File.separator + Const.PringExcelTmpFolder, + File.separator, + order.getStr("sn"), + System.currentTimeMillis() + )); + + try (FileOutputStream output = new FileOutputStream(out)) { + wb.write(output); + + log.debug("生成票据打印文件: %s", out.getAbsolutePath()); + log.debug("生成文件耗时2:%s", System.currentTimeMillis() - st); + + return out; + } catch (Exception e) { + log.error(e.getMessage(), e); + return null; + } + } catch (Exception e) { + log.error(e.getMessage(), e); + return null; + } finally { + if (wb != null) { + try { + wb.close(); + wb = null; + } catch (IOException e) { + log.error(e.getMessage(), e); + } + } + } + } + + public File getPrintFile1(Record order) { + long st = System.currentTimeMillis(); + Map data = getPrintModel(order); + + if (data == null) { + return null; + } + + Workbook wb = null; + try { + wb = ExcelHelper.genExcel(data, new File(PathKit.getRootClassPath() + "/tpl_bill_full1.xlsx")); + if (wb == null) { log.error("获取 Workbook 失败"); return null; @@ -597,7 +660,12 @@ public class LocalOrderService { cmd.set("printer", printerId); try { - Config.deviceThread.print(printerId, getPrintFile(printdata)); + if(printerId == Enums.PrinterIdEnum.printer2.name()){ + Config.deviceThread.print(printerId, getPrintFile1(printdata)); + }else { + Config.deviceThread.print(printerId, getPrintFile(printdata)); + } + cmd.set("status", true); ActionCmdLogSyncService.me.save(cmd.toJson(), sysuser); diff --git a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempController.java b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempController.java index f2d9df3..89e3b9b 100644 --- a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempController.java +++ b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempController.java @@ -246,7 +246,8 @@ public class OrderTempController extends BaseController { String sn = get("sn"); String printer = get("printer", Enums.PrinterIdEnum.printer1.name()); - if (Integer.parseInt(sn.substring(10, 12)) != OrderTypeEnum.TEMP.getTypeid()) { + if (Integer.parseInt(sn.substring(10, 12)) != OrderTypeEnum.TEMP.getTypeid() && + Integer.parseInt(sn.substring(10, 12)) != OrderTypeEnum.TRANSFER.getTypeid()) { renderJson(Result.failed("sn 不能为 null")); } else { renderJson(LocalOrderService.me.print(sn, printer, tokenuser)); diff --git a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java index 724fc62..0ab2ef4 100644 --- a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java +++ b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java @@ -742,6 +742,7 @@ public class OrderTempSyncService { // 根据客户消息判断是否需要打折 CustomerDiscount customerDiscount = CustomerDiscountService.me.getDiscountByCustomerId(customer.getId()); // 预付费结算 if (Objects.nonNull(customerDiscount) && Objects.nonNull(customerDiscount.getDiscount()) && 12 != transport.getSupermarketId()){ + order.setMemo("水杂点"+(100-customerDiscount.getDiscount())+"%"); net_weight = net_weight.multiply(BigDecimal.valueOf(customerDiscount.getDiscount()/100)); } @@ -870,7 +871,7 @@ public class OrderTempSyncService { order.setState(OrderStateEnum.RECEIVED.getStateid()); // 直接完成,没有前面的过程 order.setSaleType(ordercluster.getSaleType()); order.setCreateTime(now); - order.setMemo(memo); // 备注 +// order.setMemo(memo); // 备注 // 更新 transport 出入场信息 transport.setState(OrderStateEnum.RECEIVED.getStateid()); // 标记 transport state 为 5 ,表示出入场记录完成 diff --git a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/order/ordertransfer/OrderTransferController.java b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/order/ordertransfer/OrderTransferController.java index 49cd5a8..0e78bb5 100644 --- a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/order/ordertransfer/OrderTransferController.java +++ b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/order/ordertransfer/OrderTransferController.java @@ -53,10 +53,11 @@ public class OrderTransferController extends BaseController { String transport_id = get("transport_id"); String old_sn = get("old_sn"); Integer product_id = getInt("product_id",1); - String printer = get("printer", Enums.PrinterIdEnum.printer1.name()); + String printer = get("printer", Enums.PrinterIdEnum.printer2.name()); Double source_weight = getParaToDouble("source_weight"); String ticket_code = get("ticket_code"); - renderJson(OrderTransferSyncService.me.pay(uuid, transport_id, old_sn, product_id, printer, source_weight, tokenuser, ticket_code)); + Integer ordercluster_id = getInt("ordercluster_id"); + renderJson(OrderTransferSyncService.me.pay(uuid, transport_id, old_sn, product_id, printer, source_weight, tokenuser, ticket_code,ordercluster_id)); } /** @@ -87,7 +88,7 @@ public class OrderTransferController extends BaseController { } String sn = get("sn"); - String printer = get("printer", Enums.PrinterIdEnum.printer1.name()); + String printer = get("printer", Enums.PrinterIdEnum.printer2.name()); if (Integer.parseInt(sn.substring(10, 12)) != OrderTypeEnum.TRANSFER.getTypeid()) { renderJson(Result.failed("sn 不能为 null")); diff --git a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/order/ordertransfer/OrderTransferPayValidator.java b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/order/ordertransfer/OrderTransferPayValidator.java index d7ed081..8a5ec3c 100644 --- a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/order/ordertransfer/OrderTransferPayValidator.java +++ b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/order/ordertransfer/OrderTransferPayValidator.java @@ -12,7 +12,7 @@ public class OrderTransferPayValidator extends CrudParamValidator { validateString("uuid", 32, 32, "uuid", "uuid 长度 32,必填"); validateString("transport_id", 32, 32, "transport_id", "transport_id 长度 32,必填"); // validateInteger("sandfarm_id", 1, 2147483647, "sandfarm_id", "sandfarm_id 范围 1~2147483647"); - validateString("old_sn", 1, 16, "old_sn", "old_sn 长度 1~16"); +// validateString("old_sn", 1, 16, "old_sn", "old_sn 长度 1~16"); if (StrKit.notBlank(c.get("source_weight"))) { validateDouble("source_weight", 0.01, 9999, "source_weight", "source_weight 范围 0.01~999"); diff --git a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/order/ordertransfer/OrderTransferSyncService.java b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/order/ordertransfer/OrderTransferSyncService.java index 835ef46..884eab4 100644 --- a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/order/ordertransfer/OrderTransferSyncService.java +++ b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/order/ordertransfer/OrderTransferSyncService.java @@ -45,7 +45,8 @@ public class OrderTransferSyncService { String printerId, Double source_weight, Sysuser sysuser, - String ticket_code + String ticket_code, + Integer ordercluster_id ) { Transport transport = Transport.dao.findById(transport_id); if (transport == null) { @@ -86,19 +87,20 @@ public class OrderTransferSyncService { OrderTransfer order = new OrderTransfer(); order.setUuid(uuid); - if (old_sn.length() != 16) { - return Result.failed("【%s】取土场订单编号错误", old_sn); - } +// if (old_sn.length() != 16) { +// return Result.failed("【%s】取土场订单编号错误", old_sn); +// } // YYYYMMDD + 两位销售点id(避免离线生成订单号重复) + 两位订单类型 + 四位序列号 - Integer sandfarm_id = Integer.valueOf(old_sn.substring(8, 10)); +// Integer sandfarm_id = Integer.valueOf(old_sn.substring(8, 10)); - Supermarket byId = Supermarket.dao.findById(sandfarm_id); - if (Objects.isNull(byId) || byId.getType() != 1) { - return Result.failedstr("当前订单号不是取土场订单"); - } +// Supermarket byId = Supermarket.dao.findById(sandfarm_id); +// if (Objects.isNull(byId) || byId.getType() != 1) { +// return Result.failedstr("当前订单号不是取土场订单"); +// } order.setOldSn(old_sn); - order.setSandfarmId(sandfarm_id); + + order.setOrderclusterId(ordercluster_id); if (order.checkDuplicate("uuid")) { return Result.failed("【%s】已经存在", uuid); @@ -120,6 +122,15 @@ public class OrderTransferSyncService { order.setSourceWeight(new BigDecimal(source_weight)); } + Ordercluster ordercluster = Ordercluster.dao.findById(ordercluster_id); + if (ordercluster == null) { + return Result.failedstr("原材料运输订单【%s】信息不存在", ordercluster_id); + } + + if (ordercluster.getState() == OrderStateEnum.INVALID.getStateid()) { + return Result.failedstr("原材料运输订单【%s】已完结,请重新下单", ordercluster_id); + } + order.setSandfarmId(ordercluster.getSupermarketId()); TicketReceive ticketReceive = TicketReceiveService.me.checkSurplusReceive(transport.getSupermarketId(), ticket_code); if (ticketReceive == null) { return Result.failed("没有有效的结算单领用记录,或者结算单已经被使用"); @@ -174,7 +185,7 @@ public class OrderTransferSyncService { } - BigDecimal distance = SupermarketSandfarmDistanceService.me.getDistance(transport.getSupermarketId(), sandfarm_id); + BigDecimal distance = SupermarketSandfarmDistanceService.me.getDistance(transport.getSupermarketId(), ordercluster.getSupermarketId()); order.setTransDistance(distance); // 转运运距 BigDecimal transUnitPrice = new BigDecimal(TransPriceService.me.getTransferStartTransPrice(order.getTransDistance().doubleValue())); order.setTransUnitPrice(transUnitPrice); // 转运单价 @@ -201,6 +212,18 @@ public class OrderTransferSyncService { return false; } + if (ordercluster.getState() == OrderStateEnum.INITIAL.getStateid()) { + ordercluster.setState(OrderStateEnum.ENTERED.getStateid()); + + ret = ordercluster.update(); + + if (!ret) { + return false; + } + + synctask.addUpdateData(ordercluster); + } + // Stock stock = Stock.dao.findByIds(transport.getSupermarketId(), product_id); // if (stock == null) { // log.error("未找到库存信息 %s, %s", order.getSupermarketId(), order.getProductId()); diff --git a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/transport/TransportController.java b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/transport/TransportController.java index cceea2d..f7b4038 100644 --- a/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/transport/TransportController.java +++ b/ssjygl-xsct-local/src/main/java/com/cowr/local/ssjygl/transport/TransportController.java @@ -3,8 +3,10 @@ package com.cowr.local.ssjygl.transport; import com.cowr.common.base.BaseController; import com.cowr.common.enums.Enums; import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.devicectrl.device.YaoHuaScale; import com.cowr.local.ssjygl.main.AuthInterceptor; import com.cowr.local.ssjygl.main.CliCacheData; +import com.cowr.local.ssjygl.main.Config; import com.cowr.local.ssjygl.system.sysuser.SysuserSyncService; import com.cowr.model.Sysuser; import com.cowr.ssjygl.transport.LicenseValidator; @@ -16,6 +18,7 @@ import com.jfinal.kit.StrKit; import com.jfinal.upload.UploadFile; import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -292,6 +295,24 @@ public class TransportController extends BaseController { renderJson(result ? Result.success(true) : Result.failed("抬闸失败")); } + @Clear(AuthInterceptor.class) + public void getLedInfo() { + String which = getUpperCaseVal("which"); + String text = get("text"); + Config.deviceThread.getController(which).getLed().setInfo(" ", text); + } + + @Clear(AuthInterceptor.class) + public void getWeightInfo() throws IOException { + YaoHuaScale s = new YaoHuaScale("scale", "192.168.20.30", 10001); + if(!s .isConnected()){ + s.connect(); + } + String which = getUpperCaseVal("which"); + double v = Config.deviceThread.getController(which).getScale().weigh15(); + renderJson(v); + } + @Before(TransportIdValidator.class) public void cmdScale() { Sysuser tokenuser = SysuserSyncService.me.getSysuserByToken(get("token")); diff --git a/ssjygl-xsct-local/src/main/resources/dev/db.properties b/ssjygl-xsct-local/src/main/resources/dev/db.properties index 3bb4998..c84d28f 100644 --- a/ssjygl-xsct-local/src/main/resources/dev/db.properties +++ b/ssjygl-xsct-local/src/main/resources/dev/db.properties @@ -4,7 +4,7 @@ #user=root #password=19999999 -jdbcUrl=jdbc:mysql://192.168.66.47:3306/ssjy_xsct?characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull&useInformationSchema=true&serverTimezone=GMT%2B8&autoReconnect=true +jdbcUrl=jdbc:mysql://192.168.20.2:3306/ssjy_xsct?characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull&useInformationSchema=true&serverTimezone=GMT%2B8&autoReconnect=true user=root password=Ssjy_xsx_890 diff --git a/ssjygl-xsct-local/src/main/resources/tpl_bill_full.xlsx b/ssjygl-xsct-local/src/main/resources/tpl_bill_full.xlsx index 5ba066f4bd2fedbcd8bef042e18a020c34038ae3..d1beea39b091a2a3ca12da23cd8ef858f8dd4723 100644 GIT binary patch delta 8206 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 Y@FOgcJx)>hY<37O7d`R<=RY$453b^9n*aa+ delta 7431 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 diff --git a/ssjygl-xsct-local/src/main/resources/tpl_bill_full1.xlsx b/ssjygl-xsct-local/src/main/resources/tpl_bill_full1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..29210b803a2857c2c18aae265520ccc6fdf4918c GIT binary patch literal 12354 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 n-=+U