lisai17@sina.com 2020-10-10 23:38:46 +08:00
parent c2894722ac
commit 32fc38e6de
15 changed files with 318 additions and 74 deletions

View File

@ -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

View File

@ -20,6 +20,7 @@ public class SyncTask extends BaseSyncTask<SyncTask> {
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<SyncTask> {
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<SyncTask> {
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));
}
}
}

View File

@ -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<M extends BaseSyncTask<M>> 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<M extends BaseSyncTask<M>> 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<M extends BaseSyncTask<M>> extends BaseModel<
* defaultValue:
* @param saveData
{
tablename: [{}]
tablename: { pks: '', data: [{}] }
}
*/
@JSONField(name="save_data")
@ -150,7 +150,7 @@ public abstract class BaseSyncTask<M extends BaseSyncTask<M>> extends BaseModel<
/**
* @return save_data
{
tablename: [{}]
tablename: { pks: '', data: [{}] }
}
*/
@JSONField(name="save_data")
@ -164,9 +164,9 @@ public abstract class BaseSyncTask<M extends BaseSyncTask<M>> 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<M extends BaseSyncTask<M>> extends BaseModel<
/**
* @return update_data
* @return update_data
{
tablename: [{}]
tablename: { pks: '', data: [{}] }
}
*/
@JSONField(name="update_data")
@ -194,7 +194,7 @@ public abstract class BaseSyncTask<M extends BaseSyncTask<M>> extends BaseModel<
* defaultValue:
* @param deleteData
{
tablename: [{}]
tablename: { pks: '', data: [{}] }
}
*/
@JSONField(name="delete_data")
@ -206,11 +206,51 @@ public abstract class BaseSyncTask<M extends BaseSyncTask<M>> 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");
}
}

View File

@ -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);
}

View File

@ -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);
}
/**
*
*

View File

@ -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"));

View File

@ -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: 判断权限

View File

@ -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 {
* <p>
* 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<String, Object> 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);
}

View File

@ -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));

View File

@ -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);
}
}

View File

@ -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));
}
/**

View File

@ -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);
// }

View File

@ -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));
}
}

View File

@ -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);

View File

@ -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 {
* <p>
* 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<SyncTask> 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<String, Object> 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<Integer, Supermarket> 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);
}