From 32fc38e6de139c78d1794528e2fec3afda12977a Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Sat, 10 Oct 2020 23:38:46 +0800 Subject: [PATCH] . --- .../java/com/cowr/common/oss/OSSPlugin.java | 4 +- .../main/java/com/cowr/model/SyncTask.java | 24 ++++ .../com/cowr/model/base/BaseSyncTask.java | 62 ++++++++-- .../ssjygl/devicectrl/device/LEDThread.java | 4 +- .../com/cowr/local/ssjygl/main/Config.java | 13 ++- .../order/ordertemp/OrderTempController.java | 19 --- .../order/ordertemp/OrderTempSyncService.java | 20 +++- .../ssjygl/synctask/SyncTaskService.java | 82 ++++++++++--- .../transport/TransportSyncService.java | 1 + .../service/ssjygl/cache/CacheController.java | 5 + .../ordercluster/OrderclusterController.java | 17 +-- .../ordercluster/OrderclusterSyncService.java | 2 + .../order/ordertemp/OrderTempController.java | 20 ++++ .../order/ordertemp/OrderTempSyncService.java | 11 +- .../ssjygl/synctask/SyncTaskService.java | 108 +++++++++++++++--- 15 files changed, 318 insertions(+), 74 deletions(-) diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/oss/OSSPlugin.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/oss/OSSPlugin.java index c6e8058..e441c53 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/common/oss/OSSPlugin.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/oss/OSSPlugin.java @@ -27,12 +27,12 @@ public class OSSPlugin implements IPlugin { } OSSKit.setCli(this._ossClient, bucketName); - return true; } catch (Exception e) { e.printStackTrace(); - return false; } + // 不论是否发生异常,都要返回 true,否则 jfinal 启动不起来 + return true; } @Override diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/SyncTask.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/SyncTask.java index 16a20a8..7a2b6c6 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/model/SyncTask.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/SyncTask.java @@ -20,6 +20,7 @@ public class SyncTask extends BaseSyncTask { private JSONObject _save_data = new JSONObject(); private JSONObject _update_data = new JSONObject(); private JSONObject _delete_data = new JSONObject(); + private JSONObject _increment_data = new JSONObject(); private SyncTask add(JSONObject obj, BaseModel model){ String key = model.getTablename(); @@ -49,6 +50,26 @@ public class SyncTask extends BaseSyncTask { return add(_delete_data, model); } + public SyncTask addIncrementData(String tablename, String pks, Object pkv, JSONObject obj){ + JSONObject data = new JSONObject(); + data.put("pks", pks); + data.put("pkv", new JSONArray().add(pkv)); + data.put("increment", obj); + _increment_data.put(tablename, data); + + return this; + } + + public SyncTask addIncrementData(String tablename, String pks, JSONObject pkv, JSONObject obj){ + JSONObject data = new JSONObject(); + data.put("pks", pks); + data.put("pkv", pkv); + data.put("increment", obj); + _increment_data.put(tablename, data); + + return this; + } + public void setJson(){ if(!_save_data.isEmpty() && this.getSaveData() == null){ this.setSaveData(JSONObject.toJSONString(_save_data, SerializerFeature.WriteDateUseDateFormat)); // 新增的数据,就不要发送 null 值了 @@ -59,5 +80,8 @@ public class SyncTask extends BaseSyncTask { if(!_delete_data.isEmpty() && this.getDeleteData() == null){ this.setDeleteData(JSONObject.toJSONString(_delete_data, SerializerFeature.WriteDateUseDateFormat)); } + if(!_increment_data.isEmpty() && this.getIncrementData() == null){ + this.setIncrementData(JSONObject.toJSONString(_increment_data)); + } } } diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSyncTask.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSyncTask.java index 6dbdf27..ac11486 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSyncTask.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSyncTask.java @@ -5,7 +5,7 @@ import com.jfinal.plugin.activerecord.IBean; import com.alibaba.fastjson.annotation.JSONField; /** - * Generated by COWR Sun May 17 22:38:13 CST 2020 + * Generated by COWR Sat Oct 10 22:02:10 CST 2020 * TableName: sync_task * Remarks: 日志相关 - 数据同步 * PrimaryKey: id @@ -92,7 +92,7 @@ public abstract class BaseSyncTask> extends BaseModel< * isNullable: NO * isPrimaryKey: NO * defaultValue: - * @param supermarketId 砂站id + * @param supermarketId 超市id */ @JSONField(name="supermarket_id") public void setSupermarketId(Integer supermarketId) { @@ -101,7 +101,7 @@ public abstract class BaseSyncTask> extends BaseModel< /** - * @return supermarket_id 砂站id + * @return supermarket_id 超市id */ @JSONField(name="supermarket_id") public Integer getSupermarketId() { @@ -138,7 +138,7 @@ public abstract class BaseSyncTask> extends BaseModel< * defaultValue: * @param saveData 需要新增的数据 { - tablename: [{数据体}] + tablename: { pks: '多个主键逗号分隔', data: [{数据体}] } } */ @JSONField(name="save_data") @@ -150,7 +150,7 @@ public abstract class BaseSyncTask> extends BaseModel< /** * @return save_data 需要新增的数据 { - tablename: [{数据体}] + tablename: { pks: '多个主键逗号分隔', data: [{数据体}] } } */ @JSONField(name="save_data") @@ -164,9 +164,9 @@ public abstract class BaseSyncTask> extends BaseModel< * isNullable: YES * isPrimaryKey: NO * defaultValue: - * @param updateData 需要修改的数据 + * @param updateData 需要新增的数据 { - tablename: [{数据体}] + tablename: { pks: '多个主键逗号分隔', data: [{数据体}] } } */ @JSONField(name="update_data") @@ -176,9 +176,9 @@ public abstract class BaseSyncTask> extends BaseModel< /** - * @return update_data 需要修改的数据 + * @return update_data 需要新增的数据 { - tablename: [{数据体}] + tablename: { pks: '多个主键逗号分隔', data: [{数据体}] } } */ @JSONField(name="update_data") @@ -194,7 +194,7 @@ public abstract class BaseSyncTask> extends BaseModel< * defaultValue: * @param deleteData 需要删除的数据 { - tablename: [{数据体,主要是主键}] + tablename: { pks: '多个主键逗号分隔', data: [{数据体}] } } */ @JSONField(name="delete_data") @@ -206,11 +206,51 @@ public abstract class BaseSyncTask> extends BaseModel< /** * @return delete_data 需要删除的数据 { - tablename: [{数据体,主要是主键}] + tablename: { pks: '多个主键逗号分隔', data: [{数据体}] } } */ @JSONField(name="delete_data") public String getDeleteData() { return getStr("delete_data"); } + + /** + * name: increment_data + * type: JSON(1073741824) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param incrementData 需要修改的数据 +{ + tablename: { + pks: '', + increment: { + key: value + } + } +} + */ + @JSONField(name="increment_data") + public void setIncrementData(String incrementData) { + set("increment_data", incrementData); + } + + + /** + * @return increment_data 需要修改的数据 +{ + tablename: { + pks: '', + increment: { + key: value + } + } +} + */ + @JSONField(name="increment_data") + public String getIncrementData() { + return getStr("increment_data"); + } + + } diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/LEDThread.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/LEDThread.java index 5cd40bf..af99090 100644 --- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/LEDThread.java +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/LEDThread.java @@ -159,7 +159,9 @@ public class LEDThread extends Device implements Runnable { } catch (Exception e) { if (e.getMessage().contains("Socket is not connected")) { log.error("LED %s %s 连接已断开", getId(), getIp()); - } else { + } if(e.getMessage().contains("Read timed out")){ + log.error("LED %s %s 连接超时", getId(), getIp()); + }else { log.error(e.getMessage(), e); } 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 e680f23..8c8e2c6 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 @@ -242,7 +242,13 @@ public class Config extends JFinalConfig { SqlReporter.setLog(devMode); { - DruidPlugin druidPlugin = new DruidPlugin(dbprop.get("jdbcUrl"), dbprop.get("user"), dbprop.get("password").trim()); + String jdbcUrl = dbprop.get("jdbcUrl"); + + if (isDev() && jdbcUrl.contains("aliyuncs.com")) { + jdbcUrl = jdbcUrl.replace("/ssjy_xsx_dev?", "/ssjy_xsx_dev_" + configprop.get("current.supermarket_id") + "?"); + } + + DruidPlugin druidPlugin = new DruidPlugin(jdbcUrl, dbprop.get("user"), dbprop.get("password").trim()); wallFilter = new WallFilter(); // 加强数据库安全 wallFilter.setDbType("mysql"); druidPlugin.addFilter(wallFilter); @@ -276,6 +282,7 @@ public class Config extends JFinalConfig { )); } + // 没有外网时,oss 连接失败会导致系统启动失败 me.add(new OSSPlugin(configprop.get("endpoint"), configprop.get("bucketName"))); } @@ -377,6 +384,10 @@ public class Config extends JFinalConfig { } } + public static boolean isDev() { + return "dev".equals(ENV); + } + /** * 判断当前是 开发 环境,还是 生产 环境 * 根据不同的环境变量读取不同数据库连接 diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempController.java index 0036d39..dc1560a 100644 --- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempController.java +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempController.java @@ -110,25 +110,6 @@ public class OrderTempController extends BaseController { renderJson(OrderTempSyncService.me.prepay(uuid, transport_id, ordercluster_id, invoice_number, invoice_code, product_id, memo, printer, tokenuser, req_receipt)); } - /** - * 订单取消 - */ - @Before(OrderCancelValidator.class) - public void cancel() { - Sysuser tokenuser = SysuserSyncService.me.getSysuserByToken(get("token")); - - if (tokenuser == null) { - renderJson(Result.noauth()); - return; - } - - String sn = get("sn"); - String invalid_memo = get("invalid_memo"); - String password = get("password"); - - renderJson(OrderTempSyncService.me.cancel(sn, invalid_memo, tokenuser, password)); - } - @Before(SnValidator.class) public void invoice() { Sysuser tokenuser = SysuserSyncService.me.getSysuserByToken(get("token")); diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java index 456cd36..bdf141b 100644 --- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java @@ -1,5 +1,6 @@ package com.cowr.local.ssjygl.order.ordertemp; +import com.alibaba.fastjson.JSONObject; import com.cowr.common.enums.Enums; import com.cowr.common.enums.OrderStateEnum; import com.cowr.common.enums.OrderTypeEnum; @@ -680,15 +681,20 @@ public class OrderTempSyncService { order.setIsprepaid(1); order.setPaid(new BigDecimal(0)); // 预付费的实际支付为 0 order.setPrepayCustomerId(prepayCustomer.getId()); - prepayCustomer.setSpendTime(now); if (prepayCustomer.getSurplus().compareTo(order.getTotalPrice()) < 1) { return false; } - prepayCustomer.setSurplus(prepayCustomer.getSurplus().subtract(order.getTotalPrice())); + synctask.addIncrementData( + prepayCustomer.getTablename(), + "id", + prepayCustomer.getId(), + new JSONObject().fluentPut("surplus", new BigDecimal(0).subtract(order.getTotalPrice())) // 结算完成,在原余额上加上一个负数 + ); - synctask.addUpdateData(prepayCustomer); + // 只更新本地 prepayCustomer 的 surplus + prepayCustomer.setSurplus(prepayCustomer.getSurplus().subtract(order.getTotalPrice())); ret = prepayCustomer.update(); @@ -779,6 +785,14 @@ public class OrderTempSyncService { return LocalOrderService.me.orderPayComplete(ret, order.toRecord(), transport, printerId); } + /** + * @deprecated + * @param sn + * @param invalid_memo + * @param sysuser + * @param password + * @return + */ public Result cancel(String sn, String invalid_memo, Sysuser sysuser, String password) { // TODO: 判断权限 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 d0bf210..3c546bb 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 @@ -7,6 +7,7 @@ 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; +import com.cowr.model.Supermarket; import com.cowr.model.SyncTask; import com.cowr.ssjygl.CacheData; import com.jfinal.kit.StrKit; @@ -15,6 +16,7 @@ import com.jfinal.plugin.activerecord.Db; import com.jfinal.plugin.activerecord.IAtom; import com.jfinal.plugin.activerecord.Record; +import java.math.BigDecimal; import java.sql.SQLException; import java.util.*; @@ -46,9 +48,10 @@ public class SyncTaskService { boolean ret = synctask.save(); - if(ret){ - send(synctask); - } + // 2020-10-10 创建的任务不能立马就发出,要事务完成后发出,避免事务回滚 +// if(ret){ +// send(synctask); +// } return ret; // 有插入的,还是需要返回插入状态 } @@ -109,10 +112,10 @@ public class SyncTaskService { *

* 多个表的操作,放到一个 synctask 里面,在接收时,也就可以放在一个事务里面处理了 * - * @param data + * @param recvdata * @return */ - public Result recv(JSONObject data) { + public Result recv(JSONObject recvdata) { if(!isEnable()){ return Result.success(); } @@ -120,18 +123,20 @@ public class SyncTaskService { long st = System.currentTimeMillis(); try { - JSONObject save_data = JSONObject.parseObject(data.getString("save_data")); - JSONObject update_data = JSONObject.parseObject(data.getString("update_data")); - JSONObject delete_data = JSONObject.parseObject(data.getString("delete_data")); + JSONObject save_data = JSONObject.parseObject(recvdata.getString("save_data")); + JSONObject update_data = JSONObject.parseObject(recvdata.getString("update_data")); + JSONObject delete_data = JSONObject.parseObject(recvdata.getString("delete_data")); + JSONObject increment_data = JSONObject.parseObject(recvdata.getString("increment_data")); if ( (save_data == null || save_data.isEmpty()) && (update_data == null || update_data.isEmpty()) && (delete_data == null || delete_data.isEmpty()) + && (increment_data == null || increment_data.isEmpty()) ) { - log.error("同步的数据是空的 %s", data.toJSONString()); + log.error("同步的数据是空的 %s", recvdata.toJSONString()); log.debug("recv 1 time: %s", System.currentTimeMillis() - st); - return Result.failedstr("同步的数据是空的 %s", data.toJSONString()); + return Result.failedstr("同步的数据是空的 %s", recvdata.toJSONString()); } final String[] err = {null}; @@ -213,6 +218,55 @@ public class SyncTaskService { } } + // 增量更新 + // 对指定表的固定字段进行 增加或者减少 + // 2020-10-10 只在修改 PrepayCustomer 中的余额时需要用到 + if (increment_data != null && !increment_data.isEmpty()) { + for (String tablename : increment_data.keySet()) { + JSONObject data = increment_data.getJSONObject(tablename); + String pks = data.getString("pks"); + JSONArray pkv = data.getJSONArray("pkv"); + JSONObject increment_data = data.getJSONObject("increment_data"); + + Record record = Db.findByIds(tablename, pks, pkv.toArray()); + boolean change = false; + + if (record == null) { + log.error("未找到记录 %s,%s,%s", tablename, pks, pkv); + return false; + } + + for (String key : increment_data.keySet()) { + Map columns = record.getColumns(); + if (!columns.containsKey(key)) { + log.error("未找到属性 %s,%s", tablename, key); + return false; + } + + try { + BigDecimal old = record.getBigDecimal(key); + + record.set(key, old.add(new BigDecimal(increment_data.getString(key)))); + + change = true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + + if (change) { + boolean ret = Db.update(tablename, pks, record); + + if (!ret) { + return false; + } + } else { + log.debug("没有变化 %s", tablename); + } + } + } + if (!saveauthlics.isEmpty() && !deleteauthlics.isEmpty()) { return recvAuthLicense(saveauthlics, deleteauthlics); } @@ -220,11 +274,11 @@ public class SyncTaskService { return true; } catch (Exception e) { if (e.getMessage().contains("PRIMARY")) { - log.error("主键冲突 %s", data.toJSONString()); - err[0] = String.format("主键冲突 %s", data.toJSONString()); + log.error("主键冲突 %s", recvdata.toJSONString()); + err[0] = String.format("主键冲突 %s", recvdata.toJSONString()); } else if (e.getMessage().contains("Duplicate entry")) { - log.error("重复数据 %s", data.toJSONString()); - err[0] = String.format("重复数据 %s", data.toJSONString()); + log.error("重复数据 %s", recvdata.toJSONString()); + err[0] = String.format("重复数据 %s", recvdata.toJSONString()); } else { log.error(e.getMessage(), e); } diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportSyncService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportSyncService.java index 06a4ffa..6821e62 100644 --- a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportSyncService.java +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportSyncService.java @@ -756,6 +756,7 @@ public class TransportSyncService { Record logrecord = new Record(); logrecord.set("id", transport_id); + logrecord.set("modify_content", "manualWeight"); if (which.startsWith(Enums.CtrlFlowEnum.R.name())) { // 入场重量 transport.setFirstWeight(new BigDecimal(weight)); diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/cache/CacheController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/cache/CacheController.java index ddc4939..95f7d3a 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/cache/CacheController.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/cache/CacheController.java @@ -2,6 +2,7 @@ package com.cowr.service.ssjygl.cache; import com.cowr.common.view.Result; import com.cowr.service.ssjygl.main.AuthInterceptor; +import com.cowr.service.ssjygl.main.SvrCacheData; import com.cowr.service.ssjygl.supermarket.SupermarketSyncService; import com.cowr.ssjygl.transportcompany.TransportCompanyService; import com.cowr.ssjygl.transprice.TransPriceService; @@ -23,4 +24,8 @@ public class CacheController extends Controller { renderJson(Result.success("重新加载完成")); } + + public void last(){ + renderJson(SvrCacheData.SUP_HEARTBEAT); + } } diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterController.java index 2aeb34f..4b4cb06 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterController.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterController.java @@ -51,15 +51,16 @@ public class OrderclusterController extends BaseController { return; } - String customer_name = get("customer_name"); - String customer_texpayer_num = get("customer_texpayer_num"); - Integer req_receipt = getInt("req_receipt"); - double total_weight = getParaToDouble("total_weight"); - Date cutoff_time = getDate("cutoff_time"); - int supermarket_id = getInt("supermarket_id"); - String trucks = get("trucks"); + String customer_name = get("customer_name"); + String customer_texpayer_num = get("customer_texpayer_num"); + String customer_texpayer_name = get("customer_texpayer_name"); + Integer req_receipt = getInt("req_receipt"); + double total_weight = getParaToDouble("total_weight"); + Date cutoff_time = getDate("cutoff_time"); + int supermarket_id = getInt("supermarket_id"); + String trucks = get("trucks"); - renderJson(OrderclusterSyncService.me.save(customer_name, customer_texpayer_num, req_receipt, total_weight, cutoff_time, supermarket_id, trucks, tokenuser)); + renderJson(OrderclusterSyncService.me.save(customer_name, customer_texpayer_name, customer_texpayer_num, req_receipt, total_weight, cutoff_time, supermarket_id, trucks, tokenuser)); } /** diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java index 66ea4bf..702183e 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java @@ -216,6 +216,7 @@ public class OrderclusterSyncService extends BaseSyncService { public Result save( String customer_name, + String customer_texpayer_name, String customer_texpayer_num, Integer req_receipt, double total_weight, @@ -310,6 +311,7 @@ public class OrderclusterSyncService extends BaseSyncService { // 判断是否需要开具发票 // if (req_receipt == 1) { + model.setCustomerTexpayerName(customer_texpayer_name); model.setCustomerTexpayerNum(customer_texpayer_num); // } diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertemp/OrderTempController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertemp/OrderTempController.java index 4ec06e5..d6a3c3e 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertemp/OrderTempController.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertemp/OrderTempController.java @@ -6,6 +6,7 @@ import com.cowr.common.view.PageParam; import com.cowr.common.view.Result; import com.cowr.model.Sysuser; import com.cowr.service.ssjygl.system.sysuser.SysuserSyncService; +import com.cowr.ssjygl.order.OrderCancelValidator; import com.cowr.ssjygl.order.ordertemp.OrderTempPKValidator; import com.cowr.ssjygl.order.ordertemp.OrderTempService; import com.jfinal.aop.Before; @@ -55,4 +56,23 @@ public class OrderTempController extends BaseController { renderJson(Result.object(OrderTempService.me.find(pp, sn, truck_license, supermarket_id, customer_id, customer_name, stm, etm, isprepaid, state, invoice_code, invoice_type, product_id, invoice_code_is_null))); } + + /** + * 订单取消 + */ + @Before(OrderCancelValidator.class) + public void cancel() { + Sysuser tokenuser = SysuserSyncService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + String sn = get("sn"); + String invalid_memo = get("invalid_memo"); + String password = get("password"); + + renderJson(OrderTempSyncService.me.cancel(sn, invalid_memo, tokenuser, password)); + } } diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertemp/OrderTempSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertemp/OrderTempSyncService.java index e46ced4..48c8d55 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertemp/OrderTempSyncService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertemp/OrderTempSyncService.java @@ -1,5 +1,6 @@ package com.cowr.service.ssjygl.order.ordertemp; +import com.alibaba.fastjson.JSONObject; import com.cowr.common.enums.Enums; import com.cowr.common.enums.OrderStateEnum; import com.cowr.common.view.Result; @@ -130,7 +131,13 @@ public class OrderTempSyncService { prepayCustomer.setSurplus(prepayCustomer.getSurplus().add(order.getTotalPrice())); } - synctask.addUpdateData(prepayCustomer); + // 余额变化需要广播 + SyncTaskService.me.save(new SyncTask().addIncrementData( + prepayCustomer.getTablename(), + "id", + prepayCustomer.getId(), + new JSONObject().fluentPut("surplus", order.getTotalPrice()) // 取消订单,在原余额上加上一个数 + )); ret = prepayCustomer.update(); } @@ -151,7 +158,7 @@ public class OrderTempSyncService { synctask.addUpdateData(stock); - return ret && SyncTaskService.me.save(synctask) + return ret && SyncTaskService.me.save(synctask, order.getSupermarketId()) && ModifyLogService.me.save(order.tablename, "sn", logrecord.toJson(), Enums.DataOpType.UPDATE.getId(), sysuser); } catch (Exception e) { log.error(e.getMessage(), e); diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/synctask/SyncTaskService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/synctask/SyncTaskService.java index 5b01b14..63b01b8 100644 --- a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/synctask/SyncTaskService.java +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/synctask/SyncTaskService.java @@ -13,6 +13,7 @@ import com.jfinal.plugin.activerecord.Db; import com.jfinal.plugin.activerecord.IAtom; import com.jfinal.plugin.activerecord.Record; +import java.math.BigDecimal; import java.sql.SQLException; import java.util.*; @@ -89,11 +90,12 @@ public class SyncTaskService { } }); - if (ret) { - for (SyncTask obj : list) { - send(obj); - } - } + // 2020-10-10 创建的任务不能立马就发出,要事务完成后发出,避免事务回滚 +// if (ret) { +// for (SyncTask obj : list) { +// send(obj); +// } +// } return ret; // 有插入的,还是需要返回插入状态 } @@ -189,11 +191,11 @@ public class SyncTaskService { *

* 多个表的操作,放到一个 synctask 里面,在接收时,也就可以放在一个事务里面处理了 * - * @param data + * @param recvdata * @param current_supermarket_id 发送数据的 supermarket * @return */ - public boolean recv(JSONObject data, int current_supermarket_id) { + public boolean recv(JSONObject recvdata, int current_supermarket_id) { if (!isEnable()) { return true; } @@ -201,16 +203,18 @@ public class SyncTaskService { long st = System.currentTimeMillis(); try { - JSONObject save_data = JSONObject.parseObject(data.getString("save_data")); - JSONObject update_data = JSONObject.parseObject(data.getString("update_data")); - JSONObject delete_data = JSONObject.parseObject(data.getString("delete_data")); + JSONObject save_data = JSONObject.parseObject(recvdata.getString("save_data")); + JSONObject update_data = JSONObject.parseObject(recvdata.getString("update_data")); + JSONObject delete_data = JSONObject.parseObject(recvdata.getString("delete_data")); + JSONObject increment_data = JSONObject.parseObject(recvdata.getString("increment_data")); if ( (save_data == null || save_data.isEmpty()) && (update_data == null || update_data.isEmpty()) && (delete_data == null || delete_data.isEmpty()) + && (increment_data == null || increment_data.isEmpty()) ) { - log.error("同步的数据是空的 %s", data.toJSONString()); + log.error("同步的数据是空的 %s", recvdata.toJSONString()); log.debug("recv 1 time: %s", System.currentTimeMillis() - st); return true; } @@ -292,6 +296,84 @@ public class SyncTaskService { } } + // 增量更新 + // 对指定表的固定字段进行 增加或者减少 + // 2020-10-10 只在修改 PrepayCustomer 中的余额时需要用到 + if (increment_data != null && !increment_data.isEmpty()) { + List sts = new ArrayList<>(); + Date now = new Date(); + + for (String tablename : increment_data.keySet()) { + JSONObject data = increment_data.getJSONObject(tablename); + String pks = data.getString("pks"); + JSONArray pkv = data.getJSONArray("pkv"); + JSONObject increment_data = data.getJSONObject("increment_data"); + + Record record = Db.findByIds(tablename, pks, pkv.toArray()); + boolean change = false; + + if (record == null) { + log.error("未找到记录 %s,%s,%s", tablename, pks, pkv); + return false; + } + + for (String key : increment_data.keySet()) { + Map columns = record.getColumns(); + if (!columns.containsKey(key)) { + log.error("未找到属性 %s,%s", tablename, key); + return false; + } + + try { + BigDecimal old = record.getBigDecimal(key); + + record.set(key, old.add(new BigDecimal(increment_data.getString(key)))); + + change = true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + + if (change) { + boolean ret = Db.update(tablename, pks, record); + + if (!ret) { + return false; + } + } else { + log.debug("没有变化 %s", tablename); + } + } + + for (Map.Entry entry : SvrCacheData.SUP_CACHE.entrySet()) { + Supermarket supermarket = entry.getValue(); + + // 只对已经部署了客户端的砂站同步数据 + // 从下面上报的数据,再广播出去 + if (supermarket.getIsdeploy() == 0 || supermarket.getId() == current_supermarket_id) { + continue; + } + + SyncTask synctask = new SyncTask(); + synctask.setId(StrKit.getRandomUUID()); + synctask.setIncrementData(recvdata.getString("increment_data")); + synctask.setSupermarketId(supermarket.getId()); + synctask.setCreateTime(now); + + sts.add(synctask); + } + + if (!sts.isEmpty()) { + int[] ret = Db.batchSave(sts, sts.size()); + + if (ret.length != sts.size()) { + return false; + } + } + } + if (!saveauthlics.isEmpty() && !deleteauthlics.isEmpty()) { return recvAuthLicense(saveauthlics, deleteauthlics, current_supermarket_id); } @@ -299,9 +381,9 @@ public class SyncTaskService { return true; } catch (Exception e) { if (e.getMessage().contains("PRIMARY")) { - log.error("主键冲突 %s", data.toJSONString()); + log.error("主键冲突 %s", recvdata.toJSONString()); } else if (e.getMessage().contains("Duplicate entry")) { - log.error("重复数据 %s", data.toJSONString()); + log.error("重复数据 %s", recvdata.toJSONString()); } else { log.error(e.getMessage(), e); }