dev
parent
c2894722ac
commit
32fc38e6de
|
|
@ -27,12 +27,12 @@ public class OSSPlugin implements IPlugin {
|
||||||
}
|
}
|
||||||
|
|
||||||
OSSKit.setCli(this._ossClient, bucketName);
|
OSSKit.setCli(this._ossClient, bucketName);
|
||||||
return true;
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 不论是否发生异常,都要返回 true,否则 jfinal 启动不起来
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ public class SyncTask extends BaseSyncTask<SyncTask> {
|
||||||
private JSONObject _save_data = new JSONObject();
|
private JSONObject _save_data = new JSONObject();
|
||||||
private JSONObject _update_data = new JSONObject();
|
private JSONObject _update_data = new JSONObject();
|
||||||
private JSONObject _delete_data = new JSONObject();
|
private JSONObject _delete_data = new JSONObject();
|
||||||
|
private JSONObject _increment_data = new JSONObject();
|
||||||
|
|
||||||
private SyncTask add(JSONObject obj, BaseModel model){
|
private SyncTask add(JSONObject obj, BaseModel model){
|
||||||
String key = model.getTablename();
|
String key = model.getTablename();
|
||||||
|
|
@ -49,6 +50,26 @@ public class SyncTask extends BaseSyncTask<SyncTask> {
|
||||||
return add(_delete_data, model);
|
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(){
|
public void setJson(){
|
||||||
if(!_save_data.isEmpty() && this.getSaveData() == null){
|
if(!_save_data.isEmpty() && this.getSaveData() == null){
|
||||||
this.setSaveData(JSONObject.toJSONString(_save_data, SerializerFeature.WriteDateUseDateFormat)); // 新增的数据,就不要发送 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){
|
if(!_delete_data.isEmpty() && this.getDeleteData() == null){
|
||||||
this.setDeleteData(JSONObject.toJSONString(_delete_data, SerializerFeature.WriteDateUseDateFormat));
|
this.setDeleteData(JSONObject.toJSONString(_delete_data, SerializerFeature.WriteDateUseDateFormat));
|
||||||
}
|
}
|
||||||
|
if(!_increment_data.isEmpty() && this.getIncrementData() == null){
|
||||||
|
this.setIncrementData(JSONObject.toJSONString(_increment_data));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import com.jfinal.plugin.activerecord.IBean;
|
||||||
import com.alibaba.fastjson.annotation.JSONField;
|
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
|
* TableName: sync_task
|
||||||
* Remarks: 日志相关 - 数据同步
|
* Remarks: 日志相关 - 数据同步
|
||||||
* PrimaryKey: id
|
* PrimaryKey: id
|
||||||
|
|
@ -92,7 +92,7 @@ public abstract class BaseSyncTask<M extends BaseSyncTask<M>> extends BaseModel<
|
||||||
* isNullable: NO
|
* isNullable: NO
|
||||||
* isPrimaryKey: NO
|
* isPrimaryKey: NO
|
||||||
* defaultValue:
|
* defaultValue:
|
||||||
* @param supermarketId 砂站id
|
* @param supermarketId 超市id
|
||||||
*/
|
*/
|
||||||
@JSONField(name="supermarket_id")
|
@JSONField(name="supermarket_id")
|
||||||
public void setSupermarketId(Integer supermarketId) {
|
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")
|
@JSONField(name="supermarket_id")
|
||||||
public Integer getSupermarketId() {
|
public Integer getSupermarketId() {
|
||||||
|
|
@ -138,7 +138,7 @@ public abstract class BaseSyncTask<M extends BaseSyncTask<M>> extends BaseModel<
|
||||||
* defaultValue:
|
* defaultValue:
|
||||||
* @param saveData 需要新增的数据
|
* @param saveData 需要新增的数据
|
||||||
{
|
{
|
||||||
tablename: [{数据体}]
|
tablename: { pks: '多个主键逗号分隔', data: [{数据体}] }
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
@JSONField(name="save_data")
|
@JSONField(name="save_data")
|
||||||
|
|
@ -150,7 +150,7 @@ public abstract class BaseSyncTask<M extends BaseSyncTask<M>> extends BaseModel<
|
||||||
/**
|
/**
|
||||||
* @return save_data 需要新增的数据
|
* @return save_data 需要新增的数据
|
||||||
{
|
{
|
||||||
tablename: [{数据体}]
|
tablename: { pks: '多个主键逗号分隔', data: [{数据体}] }
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
@JSONField(name="save_data")
|
@JSONField(name="save_data")
|
||||||
|
|
@ -164,9 +164,9 @@ public abstract class BaseSyncTask<M extends BaseSyncTask<M>> extends BaseModel<
|
||||||
* isNullable: YES
|
* isNullable: YES
|
||||||
* isPrimaryKey: NO
|
* isPrimaryKey: NO
|
||||||
* defaultValue:
|
* defaultValue:
|
||||||
* @param updateData 需要修改的数据
|
* @param updateData 需要新增的数据
|
||||||
{
|
{
|
||||||
tablename: [{数据体}]
|
tablename: { pks: '多个主键逗号分隔', data: [{数据体}] }
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
@JSONField(name="update_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")
|
@JSONField(name="update_data")
|
||||||
|
|
@ -194,7 +194,7 @@ public abstract class BaseSyncTask<M extends BaseSyncTask<M>> extends BaseModel<
|
||||||
* defaultValue:
|
* defaultValue:
|
||||||
* @param deleteData 需要删除的数据
|
* @param deleteData 需要删除的数据
|
||||||
{
|
{
|
||||||
tablename: [{数据体,主要是主键}]
|
tablename: { pks: '多个主键逗号分隔', data: [{数据体}] }
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
@JSONField(name="delete_data")
|
@JSONField(name="delete_data")
|
||||||
|
|
@ -206,11 +206,51 @@ public abstract class BaseSyncTask<M extends BaseSyncTask<M>> extends BaseModel<
|
||||||
/**
|
/**
|
||||||
* @return delete_data 需要删除的数据
|
* @return delete_data 需要删除的数据
|
||||||
{
|
{
|
||||||
tablename: [{数据体,主要是主键}]
|
tablename: { pks: '多个主键逗号分隔', data: [{数据体}] }
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
@JSONField(name="delete_data")
|
@JSONField(name="delete_data")
|
||||||
public String getDeleteData() {
|
public String getDeleteData() {
|
||||||
return getStr("delete_data");
|
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");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -159,7 +159,9 @@ public class LEDThread extends Device implements Runnable {
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
if (e.getMessage().contains("Socket is not connected")) {
|
if (e.getMessage().contains("Socket is not connected")) {
|
||||||
log.error("LED %s %s 连接已断开", getId(), getIp());
|
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);
|
log.error(e.getMessage(), e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -242,7 +242,13 @@ public class Config extends JFinalConfig {
|
||||||
SqlReporter.setLog(devMode);
|
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 = new WallFilter(); // 加强数据库安全
|
||||||
wallFilter.setDbType("mysql");
|
wallFilter.setDbType("mysql");
|
||||||
druidPlugin.addFilter(wallFilter);
|
druidPlugin.addFilter(wallFilter);
|
||||||
|
|
@ -276,6 +282,7 @@ public class Config extends JFinalConfig {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 没有外网时,oss 连接失败会导致系统启动失败
|
||||||
me.add(new OSSPlugin(configprop.get("endpoint"), configprop.get("bucketName")));
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 判断当前是 开发 环境,还是 生产 环境
|
* 判断当前是 开发 环境,还是 生产 环境
|
||||||
* 根据不同的环境变量读取不同数据库连接
|
* 根据不同的环境变量读取不同数据库连接
|
||||||
|
|
|
||||||
|
|
@ -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));
|
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)
|
@Before(SnValidator.class)
|
||||||
public void invoice() {
|
public void invoice() {
|
||||||
Sysuser tokenuser = SysuserSyncService.me.getSysuserByToken(get("token"));
|
Sysuser tokenuser = SysuserSyncService.me.getSysuserByToken(get("token"));
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package com.cowr.local.ssjygl.order.ordertemp;
|
package com.cowr.local.ssjygl.order.ordertemp;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.cowr.common.enums.Enums;
|
import com.cowr.common.enums.Enums;
|
||||||
import com.cowr.common.enums.OrderStateEnum;
|
import com.cowr.common.enums.OrderStateEnum;
|
||||||
import com.cowr.common.enums.OrderTypeEnum;
|
import com.cowr.common.enums.OrderTypeEnum;
|
||||||
|
|
@ -680,15 +681,20 @@ public class OrderTempSyncService {
|
||||||
order.setIsprepaid(1);
|
order.setIsprepaid(1);
|
||||||
order.setPaid(new BigDecimal(0)); // 预付费的实际支付为 0
|
order.setPaid(new BigDecimal(0)); // 预付费的实际支付为 0
|
||||||
order.setPrepayCustomerId(prepayCustomer.getId());
|
order.setPrepayCustomerId(prepayCustomer.getId());
|
||||||
prepayCustomer.setSpendTime(now);
|
|
||||||
|
|
||||||
if (prepayCustomer.getSurplus().compareTo(order.getTotalPrice()) < 1) {
|
if (prepayCustomer.getSurplus().compareTo(order.getTotalPrice()) < 1) {
|
||||||
return false;
|
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();
|
ret = prepayCustomer.update();
|
||||||
|
|
||||||
|
|
@ -779,6 +785,14 @@ public class OrderTempSyncService {
|
||||||
return LocalOrderService.me.orderPayComplete(ret, order.toRecord(), transport, printerId);
|
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) {
|
public Result cancel(String sn, String invalid_memo, Sysuser sysuser, String password) {
|
||||||
// TODO: 判断权限
|
// TODO: 判断权限
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import com.cowr.common.view.Result;
|
||||||
import com.cowr.local.ssjygl.main.CliCacheData;
|
import com.cowr.local.ssjygl.main.CliCacheData;
|
||||||
import com.cowr.local.ssjygl.main.Config;
|
import com.cowr.local.ssjygl.main.Config;
|
||||||
import com.cowr.model.AuthLicense;
|
import com.cowr.model.AuthLicense;
|
||||||
|
import com.cowr.model.Supermarket;
|
||||||
import com.cowr.model.SyncTask;
|
import com.cowr.model.SyncTask;
|
||||||
import com.cowr.ssjygl.CacheData;
|
import com.cowr.ssjygl.CacheData;
|
||||||
import com.jfinal.kit.StrKit;
|
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.IAtom;
|
||||||
import com.jfinal.plugin.activerecord.Record;
|
import com.jfinal.plugin.activerecord.Record;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
|
@ -46,9 +48,10 @@ public class SyncTaskService {
|
||||||
|
|
||||||
boolean ret = synctask.save();
|
boolean ret = synctask.save();
|
||||||
|
|
||||||
if(ret){
|
// 2020-10-10 创建的任务不能立马就发出,要事务完成后发出,避免事务回滚
|
||||||
send(synctask);
|
// if(ret){
|
||||||
}
|
// send(synctask);
|
||||||
|
// }
|
||||||
|
|
||||||
return ret; // 有插入的,还是需要返回插入状态
|
return ret; // 有插入的,还是需要返回插入状态
|
||||||
}
|
}
|
||||||
|
|
@ -109,10 +112,10 @@ public class SyncTaskService {
|
||||||
* <p>
|
* <p>
|
||||||
* 多个表的操作,放到一个 synctask 里面,在接收时,也就可以放在一个事务里面处理了
|
* 多个表的操作,放到一个 synctask 里面,在接收时,也就可以放在一个事务里面处理了
|
||||||
*
|
*
|
||||||
* @param data
|
* @param recvdata
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public Result recv(JSONObject data) {
|
public Result recv(JSONObject recvdata) {
|
||||||
if(!isEnable()){
|
if(!isEnable()){
|
||||||
return Result.success();
|
return Result.success();
|
||||||
}
|
}
|
||||||
|
|
@ -120,18 +123,20 @@ public class SyncTaskService {
|
||||||
long st = System.currentTimeMillis();
|
long st = System.currentTimeMillis();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
JSONObject save_data = JSONObject.parseObject(data.getString("save_data"));
|
JSONObject save_data = JSONObject.parseObject(recvdata.getString("save_data"));
|
||||||
JSONObject update_data = JSONObject.parseObject(data.getString("update_data"));
|
JSONObject update_data = JSONObject.parseObject(recvdata.getString("update_data"));
|
||||||
JSONObject delete_data = JSONObject.parseObject(data.getString("delete_data"));
|
JSONObject delete_data = JSONObject.parseObject(recvdata.getString("delete_data"));
|
||||||
|
JSONObject increment_data = JSONObject.parseObject(recvdata.getString("increment_data"));
|
||||||
|
|
||||||
if (
|
if (
|
||||||
(save_data == null || save_data.isEmpty())
|
(save_data == null || save_data.isEmpty())
|
||||||
&& (update_data == null || update_data.isEmpty())
|
&& (update_data == null || update_data.isEmpty())
|
||||||
&& (delete_data == null || delete_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);
|
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};
|
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()) {
|
if (!saveauthlics.isEmpty() && !deleteauthlics.isEmpty()) {
|
||||||
return recvAuthLicense(saveauthlics, deleteauthlics);
|
return recvAuthLicense(saveauthlics, deleteauthlics);
|
||||||
}
|
}
|
||||||
|
|
@ -220,11 +274,11 @@ public class SyncTaskService {
|
||||||
return true;
|
return true;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
if (e.getMessage().contains("PRIMARY")) {
|
if (e.getMessage().contains("PRIMARY")) {
|
||||||
log.error("主键冲突 %s", data.toJSONString());
|
log.error("主键冲突 %s", recvdata.toJSONString());
|
||||||
err[0] = String.format("主键冲突 %s", data.toJSONString());
|
err[0] = String.format("主键冲突 %s", recvdata.toJSONString());
|
||||||
} else if (e.getMessage().contains("Duplicate entry")) {
|
} else if (e.getMessage().contains("Duplicate entry")) {
|
||||||
log.error("重复数据 %s", data.toJSONString());
|
log.error("重复数据 %s", recvdata.toJSONString());
|
||||||
err[0] = String.format("重复数据 %s", data.toJSONString());
|
err[0] = String.format("重复数据 %s", recvdata.toJSONString());
|
||||||
} else {
|
} else {
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -756,6 +756,7 @@ public class TransportSyncService {
|
||||||
|
|
||||||
Record logrecord = new Record();
|
Record logrecord = new Record();
|
||||||
logrecord.set("id", transport_id);
|
logrecord.set("id", transport_id);
|
||||||
|
logrecord.set("modify_content", "manualWeight");
|
||||||
|
|
||||||
if (which.startsWith(Enums.CtrlFlowEnum.R.name())) { // 入场重量
|
if (which.startsWith(Enums.CtrlFlowEnum.R.name())) { // 入场重量
|
||||||
transport.setFirstWeight(new BigDecimal(weight));
|
transport.setFirstWeight(new BigDecimal(weight));
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ package com.cowr.service.ssjygl.cache;
|
||||||
|
|
||||||
import com.cowr.common.view.Result;
|
import com.cowr.common.view.Result;
|
||||||
import com.cowr.service.ssjygl.main.AuthInterceptor;
|
import com.cowr.service.ssjygl.main.AuthInterceptor;
|
||||||
|
import com.cowr.service.ssjygl.main.SvrCacheData;
|
||||||
import com.cowr.service.ssjygl.supermarket.SupermarketSyncService;
|
import com.cowr.service.ssjygl.supermarket.SupermarketSyncService;
|
||||||
import com.cowr.ssjygl.transportcompany.TransportCompanyService;
|
import com.cowr.ssjygl.transportcompany.TransportCompanyService;
|
||||||
import com.cowr.ssjygl.transprice.TransPriceService;
|
import com.cowr.ssjygl.transprice.TransPriceService;
|
||||||
|
|
@ -23,4 +24,8 @@ public class CacheController extends Controller {
|
||||||
|
|
||||||
renderJson(Result.success("重新加载完成"));
|
renderJson(Result.success("重新加载完成"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void last(){
|
||||||
|
renderJson(SvrCacheData.SUP_HEARTBEAT);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -53,13 +53,14 @@ public class OrderclusterController extends BaseController {
|
||||||
|
|
||||||
String customer_name = get("customer_name");
|
String customer_name = get("customer_name");
|
||||||
String customer_texpayer_num = get("customer_texpayer_num");
|
String customer_texpayer_num = get("customer_texpayer_num");
|
||||||
|
String customer_texpayer_name = get("customer_texpayer_name");
|
||||||
Integer req_receipt = getInt("req_receipt");
|
Integer req_receipt = getInt("req_receipt");
|
||||||
double total_weight = getParaToDouble("total_weight");
|
double total_weight = getParaToDouble("total_weight");
|
||||||
Date cutoff_time = getDate("cutoff_time");
|
Date cutoff_time = getDate("cutoff_time");
|
||||||
int supermarket_id = getInt("supermarket_id");
|
int supermarket_id = getInt("supermarket_id");
|
||||||
String trucks = get("trucks");
|
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));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -216,6 +216,7 @@ public class OrderclusterSyncService extends BaseSyncService {
|
||||||
|
|
||||||
public Result save(
|
public Result save(
|
||||||
String customer_name,
|
String customer_name,
|
||||||
|
String customer_texpayer_name,
|
||||||
String customer_texpayer_num,
|
String customer_texpayer_num,
|
||||||
Integer req_receipt,
|
Integer req_receipt,
|
||||||
double total_weight,
|
double total_weight,
|
||||||
|
|
@ -310,6 +311,7 @@ public class OrderclusterSyncService extends BaseSyncService {
|
||||||
|
|
||||||
// 判断是否需要开具发票
|
// 判断是否需要开具发票
|
||||||
// if (req_receipt == 1) {
|
// if (req_receipt == 1) {
|
||||||
|
model.setCustomerTexpayerName(customer_texpayer_name);
|
||||||
model.setCustomerTexpayerNum(customer_texpayer_num);
|
model.setCustomerTexpayerNum(customer_texpayer_num);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import com.cowr.common.view.PageParam;
|
||||||
import com.cowr.common.view.Result;
|
import com.cowr.common.view.Result;
|
||||||
import com.cowr.model.Sysuser;
|
import com.cowr.model.Sysuser;
|
||||||
import com.cowr.service.ssjygl.system.sysuser.SysuserSyncService;
|
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.OrderTempPKValidator;
|
||||||
import com.cowr.ssjygl.order.ordertemp.OrderTempService;
|
import com.cowr.ssjygl.order.ordertemp.OrderTempService;
|
||||||
import com.jfinal.aop.Before;
|
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)));
|
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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package com.cowr.service.ssjygl.order.ordertemp;
|
package com.cowr.service.ssjygl.order.ordertemp;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.cowr.common.enums.Enums;
|
import com.cowr.common.enums.Enums;
|
||||||
import com.cowr.common.enums.OrderStateEnum;
|
import com.cowr.common.enums.OrderStateEnum;
|
||||||
import com.cowr.common.view.Result;
|
import com.cowr.common.view.Result;
|
||||||
|
|
@ -130,7 +131,13 @@ public class OrderTempSyncService {
|
||||||
prepayCustomer.setSurplus(prepayCustomer.getSurplus().add(order.getTotalPrice()));
|
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();
|
ret = prepayCustomer.update();
|
||||||
}
|
}
|
||||||
|
|
@ -151,7 +158,7 @@ public class OrderTempSyncService {
|
||||||
|
|
||||||
synctask.addUpdateData(stock);
|
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);
|
&& ModifyLogService.me.save(order.tablename, "sn", logrecord.toJson(), Enums.DataOpType.UPDATE.getId(), sysuser);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ import com.jfinal.plugin.activerecord.Db;
|
||||||
import com.jfinal.plugin.activerecord.IAtom;
|
import com.jfinal.plugin.activerecord.IAtom;
|
||||||
import com.jfinal.plugin.activerecord.Record;
|
import com.jfinal.plugin.activerecord.Record;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
|
@ -89,11 +90,12 @@ public class SyncTaskService {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (ret) {
|
// 2020-10-10 创建的任务不能立马就发出,要事务完成后发出,避免事务回滚
|
||||||
for (SyncTask obj : list) {
|
// if (ret) {
|
||||||
send(obj);
|
// for (SyncTask obj : list) {
|
||||||
}
|
// send(obj);
|
||||||
}
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
return ret; // 有插入的,还是需要返回插入状态
|
return ret; // 有插入的,还是需要返回插入状态
|
||||||
}
|
}
|
||||||
|
|
@ -189,11 +191,11 @@ public class SyncTaskService {
|
||||||
* <p>
|
* <p>
|
||||||
* 多个表的操作,放到一个 synctask 里面,在接收时,也就可以放在一个事务里面处理了
|
* 多个表的操作,放到一个 synctask 里面,在接收时,也就可以放在一个事务里面处理了
|
||||||
*
|
*
|
||||||
* @param data
|
* @param recvdata
|
||||||
* @param current_supermarket_id 发送数据的 supermarket
|
* @param current_supermarket_id 发送数据的 supermarket
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public boolean recv(JSONObject data, int current_supermarket_id) {
|
public boolean recv(JSONObject recvdata, int current_supermarket_id) {
|
||||||
if (!isEnable()) {
|
if (!isEnable()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -201,16 +203,18 @@ public class SyncTaskService {
|
||||||
long st = System.currentTimeMillis();
|
long st = System.currentTimeMillis();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
JSONObject save_data = JSONObject.parseObject(data.getString("save_data"));
|
JSONObject save_data = JSONObject.parseObject(recvdata.getString("save_data"));
|
||||||
JSONObject update_data = JSONObject.parseObject(data.getString("update_data"));
|
JSONObject update_data = JSONObject.parseObject(recvdata.getString("update_data"));
|
||||||
JSONObject delete_data = JSONObject.parseObject(data.getString("delete_data"));
|
JSONObject delete_data = JSONObject.parseObject(recvdata.getString("delete_data"));
|
||||||
|
JSONObject increment_data = JSONObject.parseObject(recvdata.getString("increment_data"));
|
||||||
|
|
||||||
if (
|
if (
|
||||||
(save_data == null || save_data.isEmpty())
|
(save_data == null || save_data.isEmpty())
|
||||||
&& (update_data == null || update_data.isEmpty())
|
&& (update_data == null || update_data.isEmpty())
|
||||||
&& (delete_data == null || delete_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);
|
log.debug("recv 1 time: %s", System.currentTimeMillis() - st);
|
||||||
return true;
|
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()) {
|
if (!saveauthlics.isEmpty() && !deleteauthlics.isEmpty()) {
|
||||||
return recvAuthLicense(saveauthlics, deleteauthlics, current_supermarket_id);
|
return recvAuthLicense(saveauthlics, deleteauthlics, current_supermarket_id);
|
||||||
}
|
}
|
||||||
|
|
@ -299,9 +381,9 @@ public class SyncTaskService {
|
||||||
return true;
|
return true;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
if (e.getMessage().contains("PRIMARY")) {
|
if (e.getMessage().contains("PRIMARY")) {
|
||||||
log.error("主键冲突 %s", data.toJSONString());
|
log.error("主键冲突 %s", recvdata.toJSONString());
|
||||||
} else if (e.getMessage().contains("Duplicate entry")) {
|
} else if (e.getMessage().contains("Duplicate entry")) {
|
||||||
log.error("重复数据 %s", data.toJSONString());
|
log.error("重复数据 %s", recvdata.toJSONString());
|
||||||
} else {
|
} else {
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue