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 2054fc3..cc7328e 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 @@ -78,4 +78,14 @@ public class SyncTask extends BaseSyncTask { this.setIncrementData(JSONObject.toJSONString(_increment_data)); } } + + public SyncTask clone(){ + SyncTask out = super.clone(); + out._save_data = (JSONObject) this._save_data.clone(); + out._update_data = (JSONObject) this._update_data.clone(); + out._delete_data = (JSONObject) this._delete_data.clone(); + out._increment_data = (JSONObject) this._increment_data.clone(); + + return out; + } } diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java index 0186407..7f85929 100644 --- a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java @@ -694,4 +694,40 @@ public class OrderclusterService extends BaseService { return out == null ? new BigDecimal(0) : out; } + + + + /** + * 按客户查询未完成的配额量 + * + * @param customer_id + * @return + */ + public BigDecimal getOverTotalPriceByCustomer(int customer_id) { + String sql = "select sum(a.total_price) total_price from ( \n" + + " select t.ordercluster_id, sum(t.weight) weight, sum(t.total_price) total_price from order_sale t \n" + + " left join ordercluster o on o.id = t.ordercluster_id\n" + + " where t.state = ? \n" + + " and o.state < ? \n" + + " and o.customer_id = ? \n" + + " group by t.ordercluster_id \n" + + " \n" + + " union \n" + + " select t.ordercluster_id, sum(t.weight) weight, sum(t.total_price) total_price from order_temp t \n" + + " left join ordercluster o on o.id = t.ordercluster_id\n" + + " where t.state = ? \n" + + " and o.state < ? \n" + + " and o.customer_id = ? \n" + + " group by t.ordercluster_id \n" + + ") a \n" + + "group by a.ordercluster_id "; + + BigDecimal out = Db.queryBigDecimal( + sql, + OrderStateEnum.RECEIVED.getStateid(), OrderStateEnum.RECEIVED.getStateid(), customer_id, + OrderStateEnum.RECEIVED.getStateid(), OrderStateEnum.RECEIVED.getStateid(), customer_id + ); + + return out == null ? new BigDecimal(0) : out; + } } 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 7821e8e..70b7cea 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 @@ -114,6 +114,7 @@ public class OrderclusterSyncService extends BaseSyncService { continue; } + // 当前配额指定的客户、超市、品类对应的单价 BigDecimal unitprice = CustomerSupermarketProductService.me.getUnitPrice(customer_id, supermarket_id, product.getId()); if (unitprice == null) { return Result.failed("未配置商品单价"); @@ -123,7 +124,7 @@ public class OrderclusterSyncService extends BaseSyncService { List undonlist = OrderclusterService.me.undonlist(supermarket_id, customer_id); if (undonlist != null && !undonlist.isEmpty()) { - BigDecimal plan_total_weight = new BigDecimal(total_weight); // 本次配额重量 + BigDecimal plan_total_price = new BigDecimal(total_weight).multiply(unitprice); // 本次配额总价格 for (Record record : undonlist) { Date record_cutoff_time = record.getDate("cutoff_time"); @@ -132,16 +133,16 @@ public class OrderclusterSyncService extends BaseSyncService { if (record_cutoff_time.getTime() == cutoff_time.getTime()) { return Result.failedstr("客户[%s][%s]在砂站[%s]还有未完成的配额", customerObj.getName(), DateTimeUtil.sdfymd.get().format(cutoff_time), SvrCacheData.SUP_CACHE.get(supermarket_id).getName()); } else { - // 累加总量 - plan_total_weight = plan_total_weight.add(record.getBigDecimal("total_weight")); + // 累加总价 + plan_total_price = plan_total_price.add(record.getBigDecimal("total_weight").multiply(record.getBigDecimal("unit_price"))); } } // 按客户统计已完成量 - BigDecimal overweight = OrderclusterService.me.getOverWeightByCustomer(customer_id); // 按客户找集团订单已完成量 + BigDecimal overTotalPrice = OrderclusterService.me.getOverTotalPriceByCustomer(customer_id); // 按客户找集团订单已完成量 - if (plan_total_weight.subtract(overweight).multiply(unitprice).compareTo(prepayCustomer.getSurplus()) > 0) { - return Result.failedstr("剩余总配额 %.2f,客户余额(%.2f)不足", plan_total_weight.subtract(overweight), prepayCustomer.getSurplus()); + if (plan_total_price.subtract(overTotalPrice).compareTo(prepayCustomer.getSurplus()) > 0) { + return Result.failedstr("剩余总配额 %.2f元,客户余额(%.2f元)不足", plan_total_price.subtract(overTotalPrice), prepayCustomer.getSurplus()); } } @@ -730,22 +731,22 @@ public class OrderclusterSyncService extends BaseSyncService { List undonlist = OrderclusterService.me.undonlist(oldobj.getCustomerId()); if (undonlist != null && !undonlist.isEmpty()) { - BigDecimal plan_total_weight = model.getTotalWeight(); + BigDecimal plan_total_price = model.getTotalWeight().multiply(oldobj.getUnitPrice()); for (Record record : undonlist) { if (model.getId().equals(record.getInt("id"))) { continue; // 当前修改的记录已经做为初始值了,不再累计 } - // 累加总量 - plan_total_weight = plan_total_weight.add(record.getBigDecimal("total_weight")); + // 累加总价 + plan_total_price = plan_total_price.add(record.getBigDecimal("total_weight").multiply(record.getBigDecimal("unit_price"))); } // 按客户统计已完成量 - BigDecimal overweight = OrderclusterService.me.getOverWeightByCustomer(oldobj.getCustomerId()); // 按客户找集团订单已完成量 + BigDecimal overTotalPrice = OrderclusterService.me.getOverTotalPriceByCustomer(oldobj.getCustomerId()); // 按客户找集团订单已完成量 - if (plan_total_weight.subtract(overweight).multiply(oldobj.getUnitPrice()).compareTo(prepayCustomer.getSurplus()) > 0) { - return Result.failedstr("计划总配额 %.2f,超过了客户余额(%.2f)", plan_total_weight.subtract(overweight), prepayCustomer.getSurplus()); + if (plan_total_price.subtract(overTotalPrice).compareTo(prepayCustomer.getSurplus()) > 0) { + return Result.failedstr("剩余总配额 %.2f元,客户余额(%.2f元)不足", plan_total_price.subtract(overTotalPrice), prepayCustomer.getSurplus()); } } } @@ -957,22 +958,22 @@ public class OrderclusterSyncService extends BaseSyncService { List undonlist = OrderclusterService.me.undonlist(oldobj.getCustomerId()); if (undonlist != null && !undonlist.isEmpty()) { - BigDecimal plan_total_weight = total_weight; + BigDecimal plan_total_price = total_weight.multiply(oldobj.getUnitPrice()); for (Record record : undonlist) { if (oldobj.getId().equals(record.getInt("id"))) { continue; // 当前修改的记录已经做为初始值了,不再累计 } - // 累加总量 - plan_total_weight = plan_total_weight.add(record.getBigDecimal("total_weight")); + // 累加总价 + plan_total_price = plan_total_price.add(record.getBigDecimal("total_weight").multiply(record.getBigDecimal("unit_price"))); } // 按客户统计已完成量 - BigDecimal overweight = OrderclusterService.me.getOverWeightByCustomer(oldobj.getCustomerId()); // 按客户找集团订单已完成量 + BigDecimal overTotalPrice = OrderclusterService.me.getOverTotalPriceByCustomer(oldobj.getCustomerId()); // 按客户找集团订单已完成量 - if (plan_total_weight.subtract(overweight).multiply(oldobj.getUnitPrice()).compareTo(prepayCustomer.getSurplus()) > 0) { - return Result.failedstr("计划总配额 %.2f,超过了客户余额(%.2f)", plan_total_weight.subtract(overweight), prepayCustomer.getSurplus()); + if (plan_total_price.subtract(overTotalPrice).compareTo(prepayCustomer.getSurplus()) > 0) { + return Result.failedstr("剩余总配额 %.2f元,客户余额(%.2f元)不足", plan_total_price.subtract(overTotalPrice), prepayCustomer.getSurplus()); } } 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 842ec36..a11ea2d 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 @@ -270,6 +270,8 @@ public class SyncTaskService { try { JSONArray saveauthlics = new JSONArray(); // 授权车牌号需要推送更新到其他砂站 JSONArray deleteauthlics = new JSONArray(); + List sts = new ArrayList<>(); + Date now = new Date(); if (save_data != null && !save_data.isEmpty()) { for (String tablename : save_data.keySet()) { @@ -283,10 +285,39 @@ public class SyncTaskService { continue; } + SyncTask synctask = new SyncTask(); + synctask.setCreateTime(now); + for (int i = 0; i < arr.size(); i++) { JSONObject obj = arr.getJSONObject(i); list.add(new Record().setColumns(obj.getInnerMap())); + + // 分发黑名单 + if(Blacklist.dao.getTablename().equals(tablename)) { + Blacklist blacklist = new Blacklist(); + blacklist._setAttrs(obj.getInnerMap()); + synctask.addSaveData(blacklist); + } + } + + // 分发黑名单 + if(Blacklist.dao.getTablename().equals(tablename)){ + for (Map.Entry entry : SvrCacheData.SUP_CACHE.entrySet()) { + Supermarket supermarket = entry.getValue(); + + // 只对已经部署了客户端的砂站同步数据 + // 从下面上报的数据,再广播出去 + if (supermarket.getIsdeploy() == 0 || supermarket.getId() == current_supermarket_id) { + continue; + } + + SyncTask newsynctask = synctask.clone(); + newsynctask.setId(StrKit.getRandomUUID()); + newsynctask.setSupermarketId(supermarket.getId()); + + sts.add(newsynctask); + } } int[] ret = Db.batchSave(tablename, list, list.size()); @@ -320,10 +351,39 @@ public class SyncTaskService { } } + SyncTask synctask = new SyncTask(); + synctask.setCreateTime(now); + for (int i = 0; i < arr.size(); i++) { JSONObject obj = arr.getJSONObject(i); list.add(new Record().setColumns(obj.getInnerMap())); + + // 分发黑名单 + if(Blacklist.dao.getTablename().equals(tablename)) { + Blacklist blacklist = new Blacklist(); + blacklist._setAttrs(obj.getInnerMap()); + synctask.addUpdateData(blacklist); + } + } + + // 分发黑名单 + if(Blacklist.dao.getTablename().equals(tablename)){ + for (Map.Entry entry : SvrCacheData.SUP_CACHE.entrySet()) { + Supermarket supermarket = entry.getValue(); + + // 只对已经部署了客户端的砂站同步数据 + // 从下面上报的数据,再广播出去 + if (supermarket.getIsdeploy() == 0 || supermarket.getId() == current_supermarket_id) { + continue; + } + + SyncTask newsynctask = synctask.clone(); + newsynctask.setId(StrKit.getRandomUUID()); + newsynctask.setSupermarketId(supermarket.getId()); + + sts.add(newsynctask); + } } int[] ret = Db.batchUpdate(tablename, pks, list, list.size()); @@ -368,8 +428,6 @@ 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); @@ -432,20 +490,20 @@ public class SyncTaskService { sts.add(synctask); } + } - if (!sts.isEmpty()) { - int[] ret = Db.batchSave(sts, sts.size()); + if (!sts.isEmpty()) { + int[] ret = Db.batchSave(sts, sts.size()); - if (ret.length != sts.size()) { + if (ret.length != sts.size()) { + return false; + } + + for (int i : ret) { + // 必须是每条 sql 修改一条记录 + if (i != 1) { return false; } - - for (int i : ret) { - // 必须是每条 sql 修改一条记录 - if (i != 1) { - return false; - } - } } } diff --git a/ssjygl-xsx-service/src/main/resources/log4j.properties b/ssjygl-xsx-service/src/main/resources/log4j.properties index d2d7d36..082b51f 100644 --- a/ssjygl-xsx-service/src/main/resources/log4j.properties +++ b/ssjygl-xsx-service/src/main/resources/log4j.properties @@ -1,5 +1,5 @@ # 日志级别 -log4j.rootLogger=DEBUG, console, fileDebug, fileInfo +log4j.rootLogger=DEBUG, console, fileDebug, fileError log4j.rootLogger.encoding=UTF-8 log4j.logger.com.cowr=DEBUG log4j.logger.com.jfinal=DEBUG @@ -33,16 +33,16 @@ log4j.appender.fileDebug.MaxBackupIndex=1000 log4j.appender.fileDebug.layout=org.apache.log4j.PatternLayout log4j.appender.fileDebug.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss.SSS} %p %t %F %L - %M %m %X{traceId}%n -# 输出到文件 info -log4j.appender.fileInfo=org.apache.log4j.RollingFileAppender -log4j.appender.fileInfo.encoding=UTF-8 -log4j.appender.fileInfo.Append=true -log4j.appender.fileInfo.Threshold=INFO -log4j.appender.fileInfo.File=../logs/ssjygl.xsx.service.info.log -log4j.appender.fileInfo.MaxFileSize=10MB -log4j.appender.fileInfo.MaxBackupIndex=500 -log4j.appender.fileInfo.layout=org.apache.log4j.PatternLayout -log4j.appender.fileInfo.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss.SSS} %p %t %F %L - %M %m %n +# 输出到文件 error +log4j.appender.fileError=org.apache.log4j.RollingFileAppender +log4j.appender.fileError.encoding=UTF-8 +log4j.appender.fileError.Append=true +log4j.appender.fileError.Threshold=ERROR +log4j.appender.fileError.File=../logs/ssjygl.xsx.service.error.log +log4j.appender.fileError.MaxFileSize=10MB +log4j.appender.fileError.MaxBackupIndex=500 +log4j.appender.fileError.layout=org.apache.log4j.PatternLayout +log4j.appender.fileError.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss.SSS} %p %t %F %L - %M %m %n # ConversionPattern参数的格式含义 # 格式名 含义