diff --git a/build.gradle b/build.gradle
index 761f8b5..e2b539f 100644
--- a/build.gradle
+++ b/build.gradle
@@ -56,10 +56,12 @@
     compile group: 'org.apache.poi', name: 'poi-ooxml', version: '3.10.1'
     compile group: 'org.apache.poi', name: 'poi-ooxml-schemas', version: '3.10.1'
     compile group: 'org.apache.poi', name: 'poi-scratchpad', version: '3.10.1'
-    compile 'com.supwisdom:payapi-sdk:1.0.9-1-gb3cd8c8'
     compile group: 'org.springframework.security.oauth', name: 'spring-security-oauth2', version: '2.3.4.RELEASE'
 
 
+    implementation 'com.supwisdom:payapi-sdk:1.0.11'
+    implementation 'com.supwisdom:multi-tenant-core:1.1.4'
+    implementation 'com.supwisdom:multi-tenant-datasource:1.1.4'
     implementation 'com.github.penggle:kaptcha:2.3.2'
     implementation 'org.springframework.boot:spring-boot-devtools'
     implementation 'org.springframework.boot:spring-boot-starter-tomcat'
diff --git a/config/application-devel-pg-xkx.properties b/config/application-devel-pg-xkx.properties
index 09f071c..0e5c007 100644
--- a/config/application-devel-pg-xkx.properties
+++ b/config/application-devel-pg-xkx.properties
@@ -1,6 +1,6 @@
 spring.main.banner-mode=off
 # create and drop tables and sequences, loads import.sql
-spring.jpa.hibernate.ddl-auto=update
+spring.jpa.hibernate.ddl-auto=none
 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
 spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
 #spring.datasource.continue-on-error=true
@@ -27,11 +27,22 @@
 spring.jackson.serialization.fail-on-empty-beans=false
 
 # task setting
-cron.offlinedtl=0/30 * * * * ?
-payapi.logintime=0 0/20 * * * ?
-#restaurant.chkdtltask.cron=0 0/3 * * * ?
+# 对账任务
 restaurant.chkdtltask.cron=-
+# 统计任务
 restaurant.statement.cron=-
+# 客户信息校对任务
+restaurant.customercheck.cron=-
+# 流水入账任务
+restaurant.submitofflinedtl.cron=-
+# 查询流水状态任务
+restaurant.querydtlresult.cron=-
 
 # payapi setting
-payapi.url=http://localhost:8080/payapi
+payapi.url=http://172.28.201.70:10010/payapi
+payapi.appid=300091
+payapi.appkey=1ec857ac2c7749a4af092cd422e57861
+
+# multi-tenant setting
+multi-tenant.head.key=X-TENANT-ID
+
diff --git a/sql/public_SQL.sql b/sql/public_SQL.sql
new file mode 100644
index 0000000..57af746
--- /dev/null
+++ b/sql/public_SQL.sql
@@ -0,0 +1,12 @@
+create table "public"."tb_tenantconfig"(
+"cfgid" varchar(32) not null,
+"tenant_id" varchar(60) not null,
+"tenant_name" varchar(200),
+"tenant_schema" varchar(30) not null
+);
+alter table "public"."tb_tenantconfig" add constraint "uk_tenantconfig_tenantid" unique ("tenant_id");
+alter table "public"."tb_tenantconfig" add constraint "pk_tenantconfig_cfgid" primary key ("cfgid");
+
+-- INSERT INTO "tb_tenantconfig"("cfgid", "tenant_id", "tenant_name", "tenant_schema") VALUES ('1', 'dlszf.cn', '大理市政府机关食堂', 'dlszfst');
+-- INSERT INTO "tb_tenantconfig"("cfgid", "tenant_id", "tenant_name", "tenant_schema") VALUES ('2', 'ynrcc.cn', '大理农商行食堂', 'dlynrcc');
+-- commit;
\ No newline at end of file
diff --git a/sql/restarant_create_table.sql b/sql/restarant_create_table.sql
new file mode 100644
index 0000000..266e161
--- /dev/null
+++ b/sql/restarant_create_table.sql
@@ -0,0 +1,1334 @@
+-- ----------------------------
+-- Table structure for tb_account
+-- ----------------------------
+CREATE TABLE tb_account (
+  accno varchar(32) NOT NULL,
+  accname varchar(100),
+  availbal numeric(15, 2) NOT NULL,
+  balance numeric(15, 2) NOT NULL,
+  closedate varchar(8),
+  day_limit numeric(15, 2),
+  frozebal numeric(15, 2) NOT NULL,
+  lastday_dpsamt numeric(15, 2),
+  lastday_transamt numeric(15, 2),
+  last_transdate varchar(8),
+  lowfree_flag bool NOT NULL,
+  lowfree_limit numeric(15, 2),
+  max_bal numeric(15, 2),
+  opendate varchar(8) NOT NULL,
+  status varchar(20) NOT NULL,
+  subjno varchar(10),
+  tac varchar(32),
+  userid varchar(32) NOT NULL
+);
+ALTER TABLE tb_account ADD CONSTRAINT tb_account_pkey PRIMARY KEY (accno);
+ALTER TABLE tb_account ADD CONSTRAINT acc_subjno_uk UNIQUE (subjno, userid);
+CREATE INDEX acc_status_idx ON tb_account(status);
+CREATE INDEX acc_userid_idx ON tb_account(userid);
+
+-- ----------------------------
+-- Table structure for tb_apiclient
+-- ----------------------------
+CREATE TABLE tb_apiclient (
+  appid varchar(20) NOT NULL,
+  bcrypt_secret varchar(64) NOT NULL,
+  roles varchar(300),
+  secret varchar(64) NOT NULL,
+  status varchar(10) NOT NULL,
+  thirdurl varchar(200) 
+);
+ALTER TABLE tb_apiclient ADD CONSTRAINT tb_apiclient_pkey PRIMARY KEY (appid);
+
+
+-- ----------------------------
+-- Table structure for tb_area
+-- ----------------------------
+CREATE TABLE tb_area (
+  id int4 NOT NULL,
+  addr varchar(240),
+  arealevel int4,
+  areaname varchar(60),
+  fid int4,
+  remark varchar(240) 
+);
+ALTER TABLE tb_area ADD CONSTRAINT tb_area_pkey PRIMARY KEY (id);
+
+
+-- ----------------------------
+-- Table structure for tb_businesspara
+-- ----------------------------
+CREATE TABLE tb_businesspara (
+  parakey varchar(60) NOT NULL,
+  paraval varchar(1000) 
+);
+ALTER TABLE tb_businesspara ADD CONSTRAINT tb_businesspara_pkey PRIMARY KEY (parakey);
+
+
+-- ----------------------------
+-- Table structure for tb_card
+-- ----------------------------
+CREATE TABLE tb_card (
+  cardno varchar(32)  NOT NULL,
+  bankcardno varchar(20),
+  cardphyid varchar(8),
+  cardverno varchar(20),
+  closedate varchar(8),
+  custid varchar(32),
+  expiredate varchar(8),
+  opendate varchar(8),
+  status varchar(10),
+  transstatus varchar(32) 
+);
+ALTER TABLE tb_card ADD CONSTRAINT tb_card_pkey PRIMARY KEY (cardno);
+
+
+-- ----------------------------
+-- Table structure for tb_cardver
+-- ----------------------------
+CREATE TABLE tb_cardver (
+  cardverno varchar(20)  NOT NULL,
+  accdate varchar(8),
+  adderflag int4,
+  cardno varchar(32),
+  cardphyid varchar(8),
+  createtime varchar(14),
+  custid varchar(32),
+  optype varchar(10),
+  status varchar(10) 
+);
+ALTER TABLE tb_cardver ADD CONSTRAINT tb_cardver_pkey PRIMARY KEY (cardverno);
+
+
+-- ----------------------------
+-- Table structure for tb_check_ctl
+-- ----------------------------
+CREATE TABLE tb_check_ctl (
+  id varchar(32)  NOT NULL,
+  check_ok bool NOT NULL,
+  checkdate varchar(8)  NOT NULL,
+  download_ok bool NOT NULL,
+  lastsaved timestamp(6),
+  remark varchar(1000),
+  startdate varchar(8),
+  statdate varchar(8) NOT NULL
+);
+ALTER TABLE tb_check_ctl ADD CONSTRAINT tb_check_ctl_pkey PRIMARY KEY (id);
+
+
+-- ----------------------------
+-- Table structure for tb_check_detail
+-- ----------------------------
+CREATE TABLE tb_check_detail (
+  id varchar(32)  NOT NULL,
+  accdate varchar(8)  NOT NULL,
+  amount numeric(15,2) NOT NULL,
+  chkresult varchar(20),
+  lastsaved timestamp(6),
+  local_refno varchar(32) NOT NULL,
+  other_refno varchar(32) NOT NULL,
+  other_sourcetype varchar(32) NOT NULL,
+  remark varchar(200),
+  resolved varchar(20),
+  shopaccno varchar(32) NOT NULL,
+  paytime varchar(32) 
+);
+ALTER TABLE tb_check_detail ADD CONSTRAINT tb_check_detail_pkey PRIMARY KEY (id);
+ALTER TABLE tb_check_detail ADD CONSTRAINT uk_check_detail UNIQUE (accdate, shopaccno, local_refno);
+CREATE INDEX idx_check_detail_accdate ON tb_check_detail(accdate);
+
+
+-- ----------------------------
+-- Table structure for tb_check_file
+-- ----------------------------
+CREATE TABLE tb_check_file (
+  accdate varchar(8)  NOT NULL,
+  chkresult varchar(20)  NOT NULL,
+  lastsaved timestamp(6),
+  localamt numeric(15,2) NOT NULL,
+  localcnt int4 NOT NULL,
+  otheramt numeric(15,2) NOT NULL,
+  othercnt int4 NOT NULL,
+  remark varchar(1000),
+  status varchar(20) NOT NULL
+);
+ALTER TABLE tb_check_file ADD CONSTRAINT tb_check_file_pkey PRIMARY KEY (accdate);
+
+
+-- ----------------------------
+-- Table structure for tb_customer
+-- ----------------------------
+CREATE TABLE tb_customer (
+  custid varchar(32)  NOT NULL,
+  batchno varchar(14),
+  checkstatus varchar(10),
+  custname varchar(30),
+  custtype int4,
+  idno varchar(20),
+  idtype varchar(10),
+  lastsaved varchar(14),
+  operid varchar(100),
+  phone varchar(11),
+  status varchar(10),
+  deptcode varchar(32) 
+);
+ALTER TABLE tb_customer ADD CONSTRAINT tb_customer_pkey PRIMARY KEY (custid);
+CREATE INDEX customer_custid_idx ON tb_customer(custid);
+CREATE INDEX customer_name_idx ON tb_customer(custname);
+
+
+-- ----------------------------
+-- Table structure for tb_customerlist
+-- ----------------------------
+CREATE TABLE tb_customerlist (
+  cardno varchar(255)  NOT NULL,
+  listid varchar(255)  NOT NULL,
+  custname varchar(100),
+  lastsaved varchar(14),
+  listname varchar(50) 
+);
+ALTER TABLE tb_customerlist ADD CONSTRAINT tb_customerlist_pkey PRIMARY KEY (cardno, listid);
+
+
+-- ----------------------------
+-- Table structure for tb_custtype
+-- ----------------------------
+CREATE TABLE tb_custtype (
+  custtypeid int4 NOT NULL,
+  custtypename varchar(20),
+  feetype int4
+);
+ALTER TABLE tb_custtype ADD CONSTRAINT tb_custtype_pkey PRIMARY KEY (custtypeid);
+
+
+-- ----------------------------
+-- Table structure for tb_dept
+-- ----------------------------
+CREATE TABLE tb_dept (
+  deptcode varchar(32)  NOT NULL,
+  deptname varchar(255),
+  deptno varchar(20)  NOT NULL,
+  ename varchar(255),
+  fdeptcode varchar(32)  NOT NULL,
+  lastsaved varchar(20),
+  status varchar(255)  NOT NULL
+);
+ALTER TABLE tb_dept ADD CONSTRAINT tb_dept_pkey PRIMARY KEY (deptcode);
+ALTER TABLE tb_dept ADD CONSTRAINT uk_dept_deptno UNIQUE (deptno);
+
+
+-- ----------------------------
+-- Table structure for tb_device
+-- ----------------------------
+CREATE TABLE tb_device (
+  id int4 NOT NULL,
+  beatstatus int4,
+  cardverno varchar(20),
+  checkername varchar(20),
+  checkstatus varchar(14),
+  devgroupid int4,
+  devicename varchar(60),
+  devphyid varchar(20),
+  factoryid varchar(10),
+  lastbeattime varchar(14),
+  lastlogintime varchar(14),
+  lastsaved varchar(14),
+  operid varchar(100),
+  runstatus int4,
+  shopid varchar(15),
+  state int4
+);
+ALTER TABLE tb_device ADD CONSTRAINT tb_device_pkey PRIMARY KEY (id);
+ALTER TABLE tb_device ADD CONSTRAINT uk_device_devphyid UNIQUE (devphyid);
+
+
+-- ----------------------------
+-- Table structure for tb_devicegroup
+-- ----------------------------
+CREATE TABLE tb_devicegroup (
+  devgroupid int4 NOT NULL,
+  groupname varchar(60),
+  operid varchar(100),
+  pid int4,
+  grouptype varchar(10) 
+);
+ALTER TABLE tb_devicegroup ADD CONSTRAINT tb_devicegroup_pkey PRIMARY KEY (devgroupid);
+
+
+-- ----------------------------
+-- Table structure for tb_devpara
+-- ----------------------------
+CREATE TABLE tb_devpara (
+  paraname varchar(60)  NOT NULL,
+  groupid int4 NOT NULL,
+  maxval varchar(10),
+  minval varchar(10),
+  paradesc varchar(600),
+  paraval varchar(90),
+  valtype varchar(10) 
+);
+ALTER TABLE tb_devpara ADD CONSTRAINT tb_devpara_pkey PRIMARY KEY (paraname, groupid);
+
+
+-- ----------------------------
+-- Table structure for tb_devpara_bind
+-- ----------------------------
+CREATE TABLE tb_devpara_bind (
+  deviceid int4 NOT NULL,
+  groupid int4 NOT NULL,
+  lastsaved varchar(14) 
+);
+ALTER TABLE tb_devpara_bind ADD CONSTRAINT tb_devpara_bind_pkey PRIMARY KEY (deviceid);
+
+
+-- ----------------------------
+-- Table structure for tb_devpara_group
+-- ----------------------------
+CREATE TABLE tb_devpara_group (
+  groupid int4 NOT NULL,
+  globalflag bool NOT NULL,
+  groupname varchar(200),
+  lastsaved varchar(14),
+  verno int8 NOT NULL
+);
+ALTER TABLE tb_devpara_group ADD CONSTRAINT tb_devpara_group_pkey PRIMARY KEY (groupid);
+
+
+
+-- ----------------------------
+-- Table structure for tb_dictionary
+-- ----------------------------
+CREATE TABLE tb_dictionary (
+  dictval varchar(30)  NOT NULL,
+  dicttype varchar(255)  NOT NULL,
+  dictcaption varchar(60),
+  dicttypename varchar(60) 
+);
+ALTER TABLE tb_dictionary ADD CONSTRAINT tb_dictionary_pkey PRIMARY KEY (dictval, dicttype);
+
+
+
+-- ----------------------------
+-- Table structure for tb_discount_detail
+-- ----------------------------
+CREATE TABLE tb_discount_detail (
+  id varchar(32)  NOT NULL,
+  cardno varchar(20),
+  lastsaved varchar(14),
+  ruleid int4,
+  status varchar(10)  NOT NULL,
+  userid varchar(32),
+  username varchar(60) 
+);
+ALTER TABLE tb_discount_detail ADD CONSTRAINT tb_discount_detail_pkey PRIMARY KEY (id);
+CREATE INDEX discountdetail_ruleid_idx ON tb_discount_detail(ruleid);
+
+
+-- ----------------------------
+-- Table structure for tb_discount_devbind
+-- ----------------------------
+CREATE TABLE tb_discount_devbind (
+  id varchar(32)  NOT NULL,
+  create_operid varchar(32),
+  createtime varchar(14),
+  deviceid int4 NOT NULL,
+  ruleid int4 NOT NULL
+);
+ALTER TABLE tb_discount_devbind ADD CONSTRAINT tb_discount_devbind_pkey PRIMARY KEY (id);
+ALTER TABLE tb_discount_devbind ADD CONSTRAINT discount_devbind_uk UNIQUE (deviceid, ruleid);
+
+
+-- ----------------------------
+-- Table structure for tb_discount_rule
+-- ----------------------------
+CREATE TABLE tb_discount_rule (
+  ruleid int4 NOT NULL,
+  amount numeric(9,2) NOT NULL,
+  check_operid varchar(32),
+  create_operid varchar(32),
+  createtime varchar(14),
+  detail_status int4 NOT NULL,
+  endtime varchar(4)  NOT NULL,
+  lastsaved varchar(14),
+  limitcnt int4 NOT NULL,
+  remark varchar(600),
+  rulename varchar(200)  NOT NULL,
+  ruletype varchar(10)  NOT NULL,
+  starttime varchar(4)  NOT NULL,
+  status varchar(10)  NOT NULL,
+  verno int4 NOT NULL
+);
+ALTER TABLE tb_discount_rule ADD CONSTRAINT tb_discount_rule_pkey PRIMARY KEY (ruleid);
+
+
+-- ----------------------------
+-- Table structure for tb_feetype_config
+-- ----------------------------
+CREATE TABLE tb_feetype_config (
+  paytype varchar(20)  NOT NULL,
+  feetype varchar(20)  NOT NULL,
+  crsubjno varchar(10),
+  drsubjno varchar(10),
+  summary varchar(200) 
+);
+ALTER TABLE tb_feetype_config ADD CONSTRAINT tb_feetype_config_pkey PRIMARY KEY (paytype, feetype);
+
+
+-- ----------------------------
+-- Table structure for tb_function
+-- ----------------------------
+CREATE TABLE tb_function (
+  id int4 NOT NULL,
+  createtime varchar(14),
+  isleaf int4 NOT NULL,
+  lastsaved varchar(14),
+  menuicon varchar(255),
+  menuurl varchar(60)  NOT NULL,
+  name varchar(32),
+  ordernum int4,
+  parentid int4
+);
+ALTER TABLE tb_function ADD CONSTRAINT tb_function_pkey PRIMARY KEY (id);
+
+
+-- ----------------------------
+-- Table structure for tb_mealsdtl
+-- ----------------------------
+CREATE TABLE tb_mealsdtl (
+  id varchar(15)  NOT NULL,
+  amount numeric(9,2),
+  checkdate varchar(8)  NOT NULL,
+  count int4,
+  deptcode varchar(9)  NOT NULL,
+  devgroupid int4 NOT NULL,
+  deviceid varchar(9),
+  feeamount numeric(9,2),
+  feecount int4,
+  mealtype varchar(10)  NOT NULL
+);
+ALTER TABLE tb_mealsdtl ADD CONSTRAINT tb_mealsdtl_pkey PRIMARY KEY (id);
+CREATE INDEX mealsdtl_idx ON tb_mealsdtl(checkdate,mealtype,deptcode,devgroupid,deviceid);
+
+
+-- ----------------------------
+-- Table structure for tb_mealtype
+-- ----------------------------
+CREATE TABLE tb_mealtype (
+  mealtype varchar(255)  NOT NULL,
+  endtime varchar(255)  NOT NULL,
+  lastsaved varchar(255)  NOT NULL,
+  mealname varchar(255)  NOT NULL
+);
+ALTER TABLE tb_mealtype ADD CONSTRAINT tb_mealtype_pkey PRIMARY KEY (mealtype);
+
+
+-- ----------------------------
+-- Table structure for tb_offlinetransdtl
+CREATE TABLE tb_offlinetransdtl (
+  billno varchar(20)  NOT NULL,
+  accdate varchar(8),
+  acctime varchar(6),
+  amount numeric(9,2),
+  attr1 varchar(1000),
+  cardno varchar(9),
+  custid varchar(32),
+  custname varchar(30),
+  custtype int4,
+  managefee numeric(9,2),
+  mealtype varchar(10),
+  revbillno varchar(20),
+  revflag int4,
+  ruleid int4,
+  shopid varchar(15),
+  status varchar(10),
+  termid int4,
+  termsqlno int4,
+  transdate varchar(8),
+  transmode varchar(255),
+  transtime varchar(6),
+  transtype varchar(10) 
+);
+ALTER TABLE tb_offlinetransdtl ADD CONSTRAINT tb_offlinetransdtl_pkey PRIMARY KEY (billno);
+
+
+-- ----------------------------
+-- Table structure for tb_oper_log
+-- ----------------------------
+CREATE TABLE tb_oper_log (
+  id varchar(32)  NOT NULL,
+  functionid int4,
+  functionname varchar(255),
+  logdate varchar(255),
+  operid varchar(32)  NOT NULL,
+  opername varchar(255),
+  resname varchar(255),
+  respath varchar(255) 
+);
+ALTER TABLE tb_oper_log ADD CONSTRAINT tb_oper_log_pkey PRIMARY KEY (id);
+
+
+-- ----------------------------
+-- Table structure for tb_oper_role
+-- ----------------------------
+CREATE TABLE tb_oper_role (
+  id varchar(32)  NOT NULL,
+  operid varchar(32)  NOT NULL,
+  roleid varchar(32)  NOT NULL
+);
+ALTER TABLE tb_oper_role ADD CONSTRAINT tb_oper_role_pkey PRIMARY KEY (id);
+CREATE INDEX operrole_operid_idx ON tb_oper_role(operid);
+
+
+-- ----------------------------
+-- Table structure for tb_operator
+-- ----------------------------
+CREATE TABLE tb_operator (
+  operid varchar(32)  NOT NULL,
+  closedate varchar(8),
+  email varchar(60),
+  mobile varchar(20),
+  opendate varchar(8),
+  opercode varchar(20)  NOT NULL,
+  opername varchar(100)  NOT NULL,
+  operpwd varchar(80)  NOT NULL,
+  opertype varchar(20)  NOT NULL,
+  sex varchar(10),
+  status varchar(32)  NOT NULL
+);
+ALTER TABLE tb_operator ADD CONSTRAINT tb_operator_pkey PRIMARY KEY (operid);
+ALTER TABLE tb_operator ADD CONSTRAINT opercode_idx UNIQUE (opercode);
+
+
+-- ----------------------------
+-- Table structure for tb_paytype
+-- ----------------------------
+CREATE TABLE tb_paytype (
+  paytype varchar(20)  NOT NULL,
+  anonymous_enable varchar(10)  NOT NULL,
+  charge_enable varchar(10)  NOT NULL,
+  consume_enable varchar(10)  NOT NULL,
+  enable varchar(20)  NOT NULL,
+  paydesc varchar(200) 
+);
+ALTER TABLE tb_paytype ADD CONSTRAINT tb_paytype_pkey PRIMARY KEY (paytype);
+
+
+-- ----------------------------
+-- Table structure for tb_paytype_config
+-- ----------------------------
+CREATE TABLE tb_paytype_config (
+  paytype varchar(20)  NOT NULL,
+  configid varchar(40)  NOT NULL,
+  config_name varchar(200),
+  config_value varchar(2000) 
+);
+ALTER TABLE tb_paytype_config ADD CONSTRAINT tb_paytype_config_pkey PRIMARY KEY (paytype, configid);
+
+
+-- ----------------------------
+-- Table structure for tb_period
+-- ----------------------------
+CREATE TABLE tb_period (
+  period_year int4 NOT NULL,
+  period_month int4 NOT NULL,
+  enddate varchar(8)  NOT NULL,
+  settleflag int4 NOT NULL,
+  startdate varchar(8)  NOT NULL
+);
+ALTER TABLE tb_period ADD CONSTRAINT tb_period_pkey PRIMARY KEY (period_year, period_month);
+
+
+-- ----------------------------
+-- Table structure for tb_permission
+-- ----------------------------
+CREATE TABLE tb_permission (
+  id varchar(32)  NOT NULL,
+  resid int4,
+  role_func_id varchar(32),
+  roleid varchar(32) 
+);
+ALTER TABLE tb_permission ADD CONSTRAINT tb_permission_pkey PRIMARY KEY (id);
+
+
+-- ----------------------------
+-- Table structure for tb_person
+-- ----------------------------
+CREATE TABLE tb_person (
+  userid varchar(32)  NOT NULL,
+  addr varchar(240),
+  country varchar(3),
+  email varchar(60),
+  idno varchar(30),
+  idtype varchar(20),
+  lastsaved varchar(14),
+  mobile varchar(30),
+  name varchar(200),
+  nation varchar(3),
+  sex varchar(10),
+  status varchar(10)  NOT NULL,
+  tel varchar(20),
+  zipcode varchar(10) 
+);
+ALTER TABLE tb_person ADD CONSTRAINT tb_person_pkey PRIMARY KEY (userid);
+ALTER TABLE tb_person ADD CONSTRAINT person_idno_uk UNIQUE (idtype, idno);
+CREATE INDEX person_name_idx ON tb_person(name);
+
+-- ----------------------------
+-- Table structure for tb_person_identity
+-- ----------------------------
+CREATE TABLE tb_person_identity (
+  third_uid varchar(60)  NOT NULL,
+  createtime varchar(14),
+  lockflag int4 NOT NULL,
+  lossflag int4 NOT NULL,
+  status varchar(20)  NOT NULL,
+  userid varchar(32) 
+);
+ALTER TABLE tb_person_identity ADD CONSTRAINT tb_person_identity_pkey PRIMARY KEY (third_uid);
+ALTER TABLE tb_person_identity ADD CONSTRAINT fke0ix8ckx4xadoo6yrx0dkmrc0 FOREIGN KEY (userid) REFERENCES tb_person (userid) ON DELETE NO ACTION ON UPDATE NO ACTION;
+
+
+-- ----------------------------
+-- Table structure for tb_points_account
+-- ----------------------------
+CREATE TABLE tb_points_account (
+  userid varchar(32)  NOT NULL,
+  accumpoints int8,
+  lastsaved varchar(255),
+  points int8 NOT NULL,
+  sumpaypoints int8,
+  tac varchar(255) 
+);
+ALTER TABLE tb_points_account ADD CONSTRAINT tb_points_account_pkey PRIMARY KEY (userid);
+
+
+-- ----------------------------
+-- Table structure for tb_points_transdtl
+-- ----------------------------
+CREATE TABLE tb_points_transdtl (
+  refno varchar(32)  NOT NULL,
+  accdate varchar(8),
+  aftpoints int8,
+  befpoints int8,
+  billno varchar(32),
+  points int8 NOT NULL,
+  status varchar(15),
+  transdate varchar(8),
+  transtime varchar(9),
+  userid varchar(32)  NOT NULL
+);
+ALTER TABLE tb_points_transdtl ADD CONSTRAINT tb_points_transdtl_pkey PRIMARY KEY (refno);
+CREATE INDEX points_transdtl_idx ON tb_points_transdtl (billno);
+
+
+-- ----------------------------
+-- Table structure for tb_resource
+-- ----------------------------
+CREATE TABLE tb_resource (
+  id int4 NOT NULL,
+  code varchar(32)  NOT NULL,
+  function_id int4 NOT NULL,
+  name varchar(32),
+  uri varchar(32) 
+);
+ALTER TABLE tb_resource ADD CONSTRAINT tb_resource_pkey PRIMARY KEY (id);
+
+
+
+-- ----------------------------
+-- Table structure for tb_role
+-- ----------------------------
+CREATE TABLE tb_role (
+  roleid varchar(32)  NOT NULL,
+  createtime varchar(14),
+  editflag int4,
+  lastsaved varchar(14),
+  rolecode varchar(20)  NOT NULL,
+  roledesc varchar(60),
+  rolename varchar(60)  NOT NULL
+);
+ALTER TABLE tb_role ADD CONSTRAINT tb_role_pkey PRIMARY KEY (roleid);
+
+
+
+-- ----------------------------
+-- Table structure for tb_role_function
+-- ----------------------------
+CREATE TABLE tb_role_function (
+  id varchar(32)  NOT NULL,
+  functionid int4 NOT NULL,
+  permissions varchar(200),
+  roleid varchar(32)  NOT NULL
+);
+ALTER TABLE tb_role_function ADD CONSTRAINT tb_role_function_pkey PRIMARY KEY (id);
+
+
+-- ----------------------------
+-- Table structure for tb_rpt_mealsdtl
+-- ----------------------------
+CREATE TABLE tb_rpt_mealsdtl (
+  id varchar(32)  NOT NULL,
+  checkdate varchar(8)  NOT NULL,
+  custtype int4 NOT NULL,
+  deptcode varchar(32)  NOT NULL,
+  devgroupid int4 NOT NULL,
+  deviceid int4 NOT NULL,
+  feeamt numeric(15,2),
+  feecnt int4,
+  mealtype varchar(20)  NOT NULL,
+  paytype varchar(32)  NOT NULL,
+  totalamt numeric(15,2),
+  totalcnt int4
+);
+ALTER TABLE tb_rpt_mealsdtl ADD CONSTRAINT tb_rpt_mealsdtl_pkey PRIMARY KEY (id);
+ALTER TABLE tb_rpt_mealsdtl ADD CONSTRAINT uk_rpt_mealsdtl UNIQUE (checkdate, deptcode, custtype, devgroupid, deviceid, mealtype, paytype);
+
+-- ----------------------------
+-- Table structure for tb_settle_log
+-- ----------------------------
+CREATE TABLE tb_settle_log (
+  id varchar(32)  NOT NULL,
+  endtime varchar(14),
+  errcode varchar(10),
+  errmsg varchar(600),
+  starttime varchar(14) 
+);
+ALTER TABLE tb_settle_log ADD CONSTRAINT tb_settle_log_pkey PRIMARY KEY (id);
+
+
+
+-- ----------------------------
+-- Table structure for tb_settlectl
+-- ----------------------------
+CREATE TABLE tb_settlectl (
+  booksetno int4 NOT NULL,
+  periodmonth int4 NOT NULL,
+  periodyear int4 NOT NULL,
+  settledate int4 NOT NULL,
+  statdate int4,
+  status int4 NOT NULL,
+  updtime varchar(14) 
+);
+ALTER TABLE tb_settlectl ADD CONSTRAINT tb_settlectl_pkey PRIMARY KEY (booksetno);
+
+
+-- ----------------------------
+-- Table structure for tb_shop
+-- ----------------------------
+CREATE TABLE tb_shop (
+  shopid int4 NOT NULL,
+  addr varchar(240),
+  closedate varchar(8),
+  contactman varchar(60),
+  email varchar(60),
+  fshopid int4,
+  idno varchar(60),
+  idtype varchar(1),
+  mobile varchar(30),
+  opendate varchar(8),
+  shopaccno varchar(20),
+  shopname varchar(200),
+  shoptype int4,
+  status varchar(20),
+  tel varchar(20),
+  third_unique_identy varchar(200),
+  zipcode varchar(10) 
+);
+ALTER TABLE tb_shop ADD CONSTRAINT tb_shop_pkey PRIMARY KEY (shopid);
+CREATE INDEX shop_shopaccno_idx ON tb_shop(shopaccno);
+
+
+-- ----------------------------
+-- Table structure for tb_shop_paytype
+-- ----------------------------
+CREATE TABLE tb_shop_paytype (
+  shopaccno varchar(10)  NOT NULL,
+  paytype varchar(20)  NOT NULL,
+  anonymous_enable varchar(10)  NOT NULL,
+  consume_enable varchar(10)  NOT NULL,
+  createtime varchar(14),
+  reverse_enable varchar(10)  NOT NULL
+);
+ALTER TABLE tb_shop_paytype ADD CONSTRAINT tb_shop_paytype_pkey PRIMARY KEY (shopaccno, paytype);
+
+
+-- ----------------------------
+-- Table structure for tb_shop_paytype_config
+-- ----------------------------
+CREATE TABLE tb_shop_paytype_config (
+  cfgid int4 NOT NULL,
+  config_name varchar(200),
+  config_value varchar(2000),
+  configid varchar(40)  NOT NULL,
+  paytype varchar(20)  NOT NULL,
+  shopaccno varchar(10)  NOT NULL
+);
+ALTER TABLE tb_shop_paytype_config ADD CONSTRAINT tb_shop_paytype_config_pkey PRIMARY KEY (cfgid);
+ALTER TABLE tb_shop_paytype_config ADD CONSTRAINT shop_paytype_config_uk UNIQUE (shopaccno, paytype, configid);
+
+
+-- ----------------------------
+-- Table structure for tb_shopacc
+-- ----------------------------
+CREATE TABLE tb_shopacc (
+  shopaccno varchar(10)  NOT NULL,
+  closedate varchar(8),
+  opendate varchar(8),
+  shopid int4,
+  shopname varchar(200),
+  status varchar(20),
+  subjno varchar(10) 
+);
+ALTER TABLE tb_shopacc ADD CONSTRAINT tb_shopacc_pkey PRIMARY KEY (shopaccno);
+
+
+-- ----------------------------
+-- Table structure for tb_shopaccbal
+-- ----------------------------
+CREATE TABLE tb_shopaccbal (
+  shopaccno varchar(10)  NOT NULL,
+  accumcramt numeric(15,2),
+  accumdramt numeric(15,2),
+  balance numeric(15,2),
+  beginbal numeric(15,2),
+  cramt numeric(15,2),
+  dramt numeric(15,2),
+  lastsettleday varchar(8),
+  settletotalamt numeric(15,2),
+  updtime varchar(255) 
+);
+ALTER TABLE tb_shopaccbal ADD CONSTRAINT tb_shopaccbal_pkey PRIMARY KEY (shopaccno);
+
+
+-- ----------------------------
+-- Table structure for tb_shopaccday
+-- ----------------------------
+CREATE TABLE tb_shopaccday (
+  shopaccno varchar(10)  NOT NULL,
+  accdate varchar(8)  NOT NULL,
+  balance numeric(15,2),
+  beginbal numeric(15,2),
+  cramt numeric(15,2),
+  dramt numeric(15,2),
+  period_month int4,
+  period_year int4,
+  updtime varchar(255) 
+);
+ALTER TABLE tb_shopaccday ADD CONSTRAINT tb_shopaccday_pkey PRIMARY KEY (shopaccno, accdate);
+
+
+-- ----------------------------
+-- Table structure for tb_shopdevice
+-- ----------------------------
+CREATE TABLE tb_shopdevice (
+  deviceid int4 NOT NULL,
+  operid varchar(32)  NOT NULL,
+  shopid varchar(15)  NOT NULL
+);
+ALTER TABLE tb_shopdevice ADD CONSTRAINT tb_shopdevice_pkey PRIMARY KEY (deviceid);
+
+
+-- ----------------------------
+-- Table structure for tb_shopsettlement
+-- ----------------------------
+CREATE TABLE tb_shopsettlement (
+  shopsettlementno int4 NOT NULL,
+  operno varchar(40),
+  shopid varchar(255),
+  shopname varchar(200) 
+);
+ALTER TABLE tb_shopsettlement ADD CONSTRAINT tb_shopsettlement_pkey PRIMARY KEY (shopsettlementno);
+ALTER TABLE tb_shopsettlement ADD CONSTRAINT uk_shopsettlement_shopid UNIQUE (shopid);
+
+
+-- ----------------------------
+-- Table structure for tb_sourcetype
+-- ----------------------------
+CREATE TABLE tb_sourcetype (
+  sourcetype varchar(20)  NOT NULL,
+  anonymous_enable bool NOT NULL,
+  charge_enable bool NOT NULL,
+  checkable bool NOT NULL,
+  consume_enable bool NOT NULL,
+  enable bool NOT NULL,
+  paydesc varchar(200),
+  reversable bool NOT NULL
+);
+ALTER TABLE tb_sourcetype ADD CONSTRAINT tb_sourcetype_pkey PRIMARY KEY (sourcetype);
+
+
+-- ----------------------------
+-- Table structure for tb_subject
+-- ----------------------------
+CREATE TABLE tb_subject (
+  subjno varchar(10)  NOT NULL,
+  balflag int4,
+  displayflag varchar(1),
+  endflag int4,
+  fsubjno varchar(10),
+  opendate int4,
+  subjlevel int4,
+  subjname varchar(60)  NOT NULL,
+  subjtype int4
+);
+ALTER TABLE tb_subject ADD CONSTRAINT tb_subject_pkey PRIMARY KEY (subjno);
+
+
+-- ----------------------------
+-- Table structure for tb_subjectbal
+-- ----------------------------
+CREATE TABLE tb_subjectbal (
+  subjno varchar(10)  NOT NULL,
+  accumcramt numeric(15,2),
+  accumdramt numeric(15,2),
+  accumsettleamt numeric(15,2),
+  begincrbal numeric(15,2),
+  begindrbal numeric(15,2),
+  cramt numeric(15,2),
+  crbal numeric(15,2),
+  dramt numeric(15,2),
+  drbal numeric(15,2),
+  lastsettleday int4,
+  updtime varchar(14) 
+);
+ALTER TABLE tb_subjectbal ADD CONSTRAINT tb_subjectbal_pkey PRIMARY KEY (subjno);
+
+
+-- ----------------------------
+-- Table structure for tb_subjectday
+-- ----------------------------
+CREATE TABLE tb_subjectday (
+  subjno varchar(10)  NOT NULL,
+  accdate varchar(8)  NOT NULL,
+  begincrbal numeric(15,2),
+  begindrbal numeric(15,2),
+  cramt numeric(15,2),
+  crbal numeric(15,2),
+  dramt numeric(15,2),
+  drbal numeric(15,2),
+  period_month int4,
+  period_year int4,
+  updtime varchar(255) 
+);
+ALTER TABLE tb_subjectday ADD CONSTRAINT tb_subjectday_pkey PRIMARY KEY (subjno, accdate);
+
+
+-- ----------------------------
+-- Table structure for tb_syspara
+-- ----------------------------
+CREATE TABLE tb_syspara (
+  paraid int4 NOT NULL,
+  displayflag varchar(10),
+  editflag int4 NOT NULL,
+  lastsaved varchar(14),
+  paraname varchar(90),
+  paraunit varchar(20),
+  paraval varchar(100),
+  remark varchar(240),
+  valuetype varchar(10) 
+);
+ALTER TABLE tb_syspara ADD CONSTRAINT tb_syspara_pkey PRIMARY KEY (paraid);
+
+
+-- ----------------------------
+-- Table structure for tb_task_lock
+-- ----------------------------
+CREATE TABLE tb_task_lock (
+  taskcode varchar(30)  NOT NULL,
+  remark varchar(600),
+  taskstatus int4 NOT NULL,
+  tasktime varchar(20) 
+);
+ALTER TABLE tb_task_lock ADD CONSTRAINT tb_task_lock_pkey PRIMARY KEY (taskcode);
+
+-- ----------------------------
+-- Table structure for tb_tenant_jwtconfig
+-- ----------------------------
+CREATE TABLE tb_tenant_jwtconfig (
+  id varchar(20)  NOT NULL,
+  jwt_secret varchar(200) NOT NULL
+);
+ALTER TABLE tb_tenant_jwtconfig ADD CONSTRAINT tb_tenant_jwtconfig_pkey PRIMARY KEY (id);
+
+
+-- ----------------------------
+-- Table structure for tb_transcode
+-- ----------------------------
+CREATE TABLE tb_transcode (
+  transcode int4 NOT NULL,
+  transname varchar(100)  NOT NULL
+);
+ALTER TABLE tb_transcode ADD CONSTRAINT tb_transcode_pkey PRIMARY KEY (transcode);
+
+
+-- ----------------------------
+-- Table structure for tb_transdtl
+-- ----------------------------
+CREATE TABLE tb_transdtl (
+  billno varchar(20)  NOT NULL,
+  accdate varchar(8),
+  acctime varchar(6),
+  amount numeric(9,2) NOT NULL,
+  attr1 varchar(1000),
+  cardno varchar(9),
+  core_accdate varchar(8),
+  core_status varchar(20),
+  custid varchar(32),
+  custname varchar(30),
+  custtype int4,
+  managefee numeric(9,2),
+  managefeetype varchar(15),
+  mealtype varchar(10),
+  refno varchar(32),
+  revbillno varchar(20),
+  revflag int4,
+  ruleid int4,
+  shopid varchar(15),
+  status varchar(10),
+  termid int4,
+  termsqlno int4,
+  transdate varchar(8)  NOT NULL,
+  transmode varchar(10),
+  transtime varchar(6)  NOT NULL,
+  transtype varchar(10),
+  core_sourcetype varchar(32) 
+);
+ALTER TABLE tb_transdtl ADD CONSTRAINT tb_transdtl_pkey PRIMARY KEY (billno);
+CREATE INDEX transdtl_accdate_idx ON tb_transdtl(accdate);
+CREATE INDEX transdtl_coreaccdate_idx ON tb_transdtl(core_accdate,status);
+CREATE INDEX transdtl_status_idx ON tb_transdtl(status);
+CREATE INDEX transdtl_transdate_idx ON tb_transdtl (transdate);
+
+
+-- ----------------------------
+-- Table structure for tb_transtype
+-- ----------------------------
+CREATE TABLE tb_transtype (
+  transtype int4 NOT NULL,
+  crsubjno varchar(10),
+  drsubjno varchar(10),
+  summary varchar(200) 
+);
+ALTER TABLE tb_transtype ADD CONSTRAINT tb_transtype_pkey PRIMARY KEY (transtype);
+
+
+
+-- ----------------------------
+-- Table structure for tb_userdtl
+-- ----------------------------
+CREATE TABLE tb_userdtl (
+  refno varchar(32)  NOT NULL,
+  accdate varchar(8),
+  aftbal numeric(9,2),
+  amount numeric(9,2),
+  befbal numeric(9,2),
+  createtime varchar(14),
+  endtime varchar(14),
+  operid int4,
+  outtradeno varchar(60),
+  payinfo varchar(200),
+  paytype varchar(20),
+  remark varchar(240),
+  reverse_amount numeric(9,2),
+  reverse_flag varchar(255)  NOT NULL,
+  shopaccno varchar(20),
+  status varchar(20),
+  tradeflag int4 NOT NULL,
+  transcode int4,
+  transdate varchar(8),
+  transdesc varchar(240),
+  transtime varchar(6),
+  userid varchar(32) 
+);
+ALTER TABLE tb_userdtl ADD CONSTRAINT tb_userdtl_pkey PRIMARY KEY (refno);
+ALTER TABLE tb_userdtl ADD CONSTRAINT userdtl_outtradeno_uk UNIQUE (outtradeno, shopaccno);
+CREATE INDEX userdtl_accdate_idx ON tb_userdtl(accdate);
+CREATE INDEX userdtl_reverse_idx ON tb_userdtl(reverse_flag);
+CREATE INDEX userdtl_status_idx ON tb_userdtl(status);
+CREATE INDEX userdtl_transdate_idx ON tb_userdtl(transdate);
+
+
+-- ----------------------------
+-- Table structure for tb_userdtl_business
+-- ----------------------------
+CREATE TABLE tb_userdtl_business (
+  refno varchar(32)  NOT NULL,
+  json_content varchar(1000) 
+);
+ALTER TABLE tb_userdtl_business ADD CONSTRAINT tb_userdtl_business_pkey PRIMARY KEY (refno);
+
+
+-- ----------------------------
+-- Table structure for tb_userdtl_debitcredit
+-- ----------------------------
+CREATE TABLE tb_userdtl_debitcredit (
+  seqno int4 NOT NULL,
+  refno varchar(32)  NOT NULL,
+  amount numeric(9,2),
+  craccno varchar(32),
+  crsubjno varchar(10),
+  draccno varchar(32),
+  drsubjno varchar(10),
+  summary varchar(240) 
+);
+ALTER TABLE tb_userdtl_debitcredit ADD CONSTRAINT tb_userdtl_debitcredit_pkey PRIMARY KEY (seqno, refno);
+
+
+-- ----------------------------
+-- Table structure for tb_voucher
+-- ----------------------------
+CREATE TABLE tb_voucher (
+  voucherid varchar(32)  NOT NULL,
+  amount numeric(9,2),
+  attachments int4,
+  cashier varchar(32),
+  checker varchar(32),
+  checkflag int4,
+  createdate int4,
+  editflag int4,
+  entrycnt int4,
+  invalidflag int4,
+  periodmonth int4,
+  periodyear int4,
+  poster varchar(32),
+  postflag int4,
+  preparer varchar(32),
+  signflag int4,
+  sourcetype varchar(20),
+  summary varchar(200),
+  transcnt int4,
+  transdate int4,
+  voucherdate int4,
+  voucherno int4
+);
+ALTER TABLE tb_voucher ADD CONSTRAINT tb_voucher_pkey PRIMARY KEY (voucherid);
+
+
+-- ----------------------------
+-- Table structure for tb_voucherentry
+-- ----------------------------
+CREATE TABLE tb_voucherentry (
+  voucherid varchar(32)  NOT NULL,
+  entryid int4 NOT NULL,
+  accno varchar(32),
+  balance numeric(15,2),
+  balflag int4,
+  cramt numeric(15,2),
+  dramt numeric(15,2),
+  oppaccno varchar(32),
+  oppname varchar(240),
+  oppsubjno varchar(10),
+  subjno varchar(10),
+  summary varchar(240) 
+);
+ALTER TABLE tb_voucherentry ADD CONSTRAINT tb_voucherentry_pkey PRIMARY KEY (voucherid, entryid);
+
+
+-- ----------------------------
+-- Table structure for tb_vouchernoctl
+-- ----------------------------
+CREATE TABLE tb_vouchernoctl (
+  vouchertype int4 NOT NULL,
+  periodmonth int4 NOT NULL,
+  voucherno int4 NOT NULL
+);
+ALTER TABLE tb_vouchernoctl ADD CONSTRAINT tb_vouchernoctl_pkey PRIMARY KEY (vouchertype);
+
+
+-- ----------------------------
+-- Table structure for tb_whitelist
+-- ----------------------------
+CREATE TABLE tb_whitelist (
+  whitelistid int4 NOT NULL,
+  check_operid varchar(32),
+  create_operid varchar(32),
+  createtime varchar(14),
+  lastsaved varchar(14),
+  listname varchar(200)  NOT NULL,
+  remark varchar(600),
+  status varchar(10)  NOT NULL
+);
+ALTER TABLE tb_whitelist ADD CONSTRAINT tb_whitelist_pkey PRIMARY KEY (whitelistid);
+
+
+-- ----------------------------
+-- Table structure for tb_whitelist_detail
+-- ----------------------------
+CREATE TABLE tb_whitelist_detail (
+  id varchar(32)  NOT NULL,
+  cardno varchar(20),
+  cardphyid varchar(20),
+  lastsaved varchar(14),
+  status varchar(32),
+  userid varchar(32),
+  username varchar(60),
+  whitelistid int4 NOT NULL
+);
+ALTER TABLE tb_whitelist_detail ADD CONSTRAINT tb_whitelist_detail_pkey PRIMARY KEY (id);
+CREATE INDEX whitelistdetail_whitelistid_idx ON tb_whitelist_detail(whitelistid);
+
+
+-- ----------------------------
+-- Table structure for tb_whitelist_devbind
+-- ----------------------------
+CREATE TABLE tb_whitelist_devbind (
+  id varchar(32)  NOT NULL,
+  create_operid varchar(32),
+  createtime varchar(14),
+  deviceid int4 NOT NULL,
+  whitelistid int4 NOT NULL
+);
+ALTER TABLE tb_whitelist_devbind ADD CONSTRAINT tb_whitelist_devbind_pkey PRIMARY KEY (id);
+ALTER TABLE tb_whitelist_devbind ADD CONSTRAINT whitelistid_devbind_uk UNIQUE (deviceid, whitelistid);
+
+
+-- ----------------------------
+-- Sequence structure for seq_area
+-- ----------------------------
+CREATE SEQUENCE "seq_area" 
+INCREMENT 1
+MINVALUE  1
+MAXVALUE 999999999
+START 1
+CACHE 1;
+
+-- ----------------------------
+-- Sequence structure for seq_cardverno
+-- ----------------------------
+CREATE SEQUENCE "seq_cardverno" 
+INCREMENT 1
+MINVALUE  1
+MAXVALUE 99999999
+START 1
+CACHE 1
+CYCLE ;
+
+-- ----------------------------
+-- Sequence structure for seq_custtype
+-- ----------------------------
+CREATE SEQUENCE "seq_custtype" 
+INCREMENT 1
+MINVALUE  1
+MAXVALUE 999999999
+START 1
+CACHE 1;
+
+-- ----------------------------
+-- Sequence structure for seq_deptcode
+-- ----------------------------
+CREATE SEQUENCE "seq_deptcode" 
+INCREMENT 1
+MINVALUE  1
+MAXVALUE 999999999
+START 10
+CACHE 1;
+
+-- ----------------------------
+-- Sequence structure for seq_devgroup
+-- ----------------------------
+CREATE SEQUENCE "seq_devgroup" 
+INCREMENT 1
+MINVALUE  1
+MAXVALUE 999999999
+START 1
+CACHE 1;
+
+-- ----------------------------
+-- Sequence structure for seq_device
+-- ----------------------------
+CREATE SEQUENCE "seq_device" 
+INCREMENT 1
+MINVALUE  1
+MAXVALUE 99999999
+START 1
+CACHE 1;
+
+-- ----------------------------
+-- Sequence structure for seq_devparagroupid
+-- ----------------------------
+CREATE SEQUENCE "seq_devparagroupid" 
+INCREMENT 1
+MINVALUE  1
+MAXVALUE 999999999
+START 2
+CACHE 1;
+
+-- ----------------------------
+-- Sequence structure for seq_discountruleid
+-- ----------------------------
+CREATE SEQUENCE "seq_discountruleid" 
+INCREMENT 1
+MINVALUE  1
+MAXVALUE 999999999
+START 1
+CACHE 1;
+
+-- ----------------------------
+-- Sequence structure for seq_func
+-- ----------------------------
+CREATE SEQUENCE "seq_func" 
+INCREMENT 1
+MINVALUE  1
+MAXVALUE 999999999
+START 1000
+CACHE 1;
+
+-- ----------------------------
+-- Sequence structure for seq_mealsdtl
+-- ----------------------------
+CREATE SEQUENCE "seq_mealsdtl" 
+INCREMENT 1
+MINVALUE  1
+MAXVALUE 999999999
+START 1
+CACHE 1;
+
+-- ----------------------------
+-- Sequence structure for seq_refno
+-- ----------------------------
+CREATE SEQUENCE "seq_refno" 
+INCREMENT 1
+MINVALUE  1
+MAXVALUE 99999999
+START 1
+CACHE 1
+CYCLE ;
+
+-- ----------------------------
+-- Sequence structure for seq_res
+-- ----------------------------
+CREATE SEQUENCE "seq_res" 
+INCREMENT 1
+MINVALUE  1
+MAXVALUE 999999999
+START 1000
+CACHE 1;
+
+-- ----------------------------
+-- Sequence structure for seq_settlement
+-- ----------------------------
+CREATE SEQUENCE "seq_settlement" 
+INCREMENT 50
+MINVALUE  1
+MAXVALUE 999999999
+START 1
+CACHE 1;
+
+-- ----------------------------
+-- Sequence structure for seq_shop
+-- ----------------------------
+CREATE SEQUENCE "seq_shop" 
+INCREMENT 1
+MINVALUE  1
+MAXVALUE 999999999
+START 1
+CACHE 1;
+
+-- ----------------------------
+-- Sequence structure for seq_whitelistid
+-- ----------------------------
+CREATE SEQUENCE "seq_whitelistid" 
+INCREMENT 1
+MINVALUE  1
+MAXVALUE 999999999
+START 1
+CACHE 1;
diff --git a/src/main/java/com/supwisdom/dlpay/AppLoginRunner.java b/src/main/java/com/supwisdom/dlpay/AppLoginRunner.java
index a9eaa0a..6016549 100644
--- a/src/main/java/com/supwisdom/dlpay/AppLoginRunner.java
+++ b/src/main/java/com/supwisdom/dlpay/AppLoginRunner.java
@@ -1,13 +1,12 @@
 package com.supwisdom.dlpay;
 
-import com.supwisdom.dlpay.framework.dao.BusinessparaDao;
-import com.supwisdom.dlpay.framework.domain.TBusinesspara;
 import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.paysdk.ApiLoginHelper;
 import com.supwisdom.dlpay.paysdk.proxy.ApiLoginProxy;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.ApplicationArguments;
 import org.springframework.boot.ApplicationRunner;
 import org.springframework.cloud.openfeign.EnableFeignClients;
@@ -27,8 +26,12 @@
 
     @Autowired
     private ApiLoginProxy apiLoginProxy;
-    @Autowired
-    private BusinessparaDao businessparaDao;
+
+    @Value("${payapi.appid}")
+    private String appId;
+
+    @Value("${payapi.appkey}")
+    private String appKey;
 
     @Override
     public void run(ApplicationArguments args) throws Exception {
@@ -36,15 +39,13 @@
         doLogin();
     }
     private void doLogin() {
-        TBusinesspara appid=businessparaDao.findByParakey("payapi.appid");
-        TBusinesspara secret=businessparaDao.findByParakey("payapi.secret");
-        if(null==(appid)||null==(secret)){
+        if(StringUtil.isEmpty(appId) || StringUtil.isEmpty(appKey)){
             logger.info("业务参数appid或secret未配置");
             return;
         }
         try{
             ApiLoginHelper helper = new ApiLoginHelper(apiLoginProxy);
-            helper.login(appid.getParaval(), secret.getParaval());
+            helper.login(appId, appKey);
             logger.info("登录成功");
         }catch (Exception e){
             logger.error("登录失败");
diff --git a/src/main/java/com/supwisdom/dlpay/AppPreparedEvent.java b/src/main/java/com/supwisdom/dlpay/AppPreparedEvent.java
index 304379c..f4b8085 100644
--- a/src/main/java/com/supwisdom/dlpay/AppPreparedEvent.java
+++ b/src/main/java/com/supwisdom/dlpay/AppPreparedEvent.java
@@ -16,6 +16,6 @@
 
   @EventListener(ApplicationReadyEvent.class)
   public void setupDictPool() {
-    dictPool.init(); //初始化字典
+//    dictPool.init(); //初始化字典  TODO:多租户不合适
   }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/api/task/PosPayTask.java b/src/main/java/com/supwisdom/dlpay/api/task/PosPayTask.java
index 62c301f..e9fbb3b 100644
--- a/src/main/java/com/supwisdom/dlpay/api/task/PosPayTask.java
+++ b/src/main/java/com/supwisdom/dlpay/api/task/PosPayTask.java
@@ -11,6 +11,10 @@
 import com.supwisdom.dlpay.restaurant.service.OfflineTransDtlService;
 import com.supwisdom.dlpay.restaurant.service.TransDtlService;
 import com.supwisdom.dlpay.restaurant.util.RestaurantConstant;
+import com.supwisdom.dlpay.tenant.service.MultiTenantService;
+import com.supwisdom.multitenant.TenantContextHolder;
+import com.supwisdom.multitenant.TenantDetails;
+import net.javacrumbs.shedlock.core.SchedulerLock;
 import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -27,150 +31,183 @@
 @Configuration      //1.主要用于标记配置类，兼备Component的效果。
 @EnableScheduling   // 2.开启定时任务
 public class PosPayTask {
-    private static final Logger logger = LoggerFactory.getLogger(PosPayTask.class);
+  private static final Logger logger = LoggerFactory.getLogger(PosPayTask.class);
 
 
-    @Autowired
-    private TransDtlService transDtlService;
-    @Autowired
-    private OfflineTransDtlService offlineTransDtlService;
-    @Autowired
-    private CitizenCardPayProxy citizenCardPayProxy;
-    @Autowired
-    private SystemUtilService systemUtilService;
-    @Autowired
-    private TransactionProxy transactionProxy;
+  @Autowired
+  private TransDtlService transDtlService;
+  @Autowired
+  private OfflineTransDtlService offlineTransDtlService;
+  @Autowired
+  private CitizenCardPayProxy citizenCardPayProxy;
+  @Autowired
+  private SystemUtilService systemUtilService;
+  @Autowired
+  private TransactionProxy transactionProxy;
+  @Autowired
+  private MultiTenantService multiTenantService;
 
-    @Scheduled(cron = "0 0/1 * * * ?")
-    private void submitOfflineDtlTask() {
-        String date = DateUtil.getNow("yyyyMMdd");
-        List<TOfflineTransDtl> dtls = offlineTransDtlService.getUncheckOfflineTransdtl(date, RestaurantConstant.TRANSTYPE_TRANSDTL_OFFLINE);
-        logger.info("正在上传" + dtls.size() + "笔流水");
-        if (dtls.size() > 0) {
-            for (TOfflineTransDtl dtl : dtls) {
+  @Scheduled(cron = "${restaurant.submitofflinedtl.cron}")
+  @SchedulerLock(name = "RestaurantSubmitOfflinedtlTask", lockAtMostForString = "PT10M")
+  public void doSubmitOfflineDtlTask() {
+    long t1 = System.currentTimeMillis();
+    logger.debug("=================== 【脱机流水入账任务】开始： ===================");
 
-                TTransDtl tTransDtl = gettTransDtl(dtl);
-
-                CitizenCardPayinitParam param = new CitizenCardPayinitParam();
-                param.setBillno(dtl.getBillno());
-                param.setShopaccno(dtl.getShopid());
-                param.setTransdate(dtl.getTransdate());
-                param.setTranstime(dtl.getTranstime());
-                param.setCardNo(dtl.getCardno());
-                param.setDtltype("canteen");
-                Double amt = dtl.getAmount() * 100;
-                param.setAmount(amt.intValue());
-                logger.info(dtl.getBillno() + "开始消费逻辑");
-
-                CitizenPayResponse response = citizenCardPayProxy.citizencardPayinit(param);
-                if (response.getRetcode() != 0) {
-                    saveFailTransdtls(dtl, tTransDtl, response);
-                    logger.info(dtl.getBillno() + "初始化失败," + response.getRetcode() + "," + response.getRetmsg() + "," + response.getException());
-                    continue;
-                }
-                CitizenCardPayfinishParam finishparam = new CitizenCardPayfinishParam();
-                finishparam.setRefno(response.getRefno());
-                CitizenPayResponse finishresp = citizenCardPayProxy.citizencardPayFinish(finishparam);
-                if (finishresp.getRetcode() != 0) {
-                    saveFailTransdtls(dtl, tTransDtl, finishresp);
-                    logger.info(dtl.getBillno() + "消费确认失败," + finishresp.getRetcode() + "," + finishresp.getRetmsg() + "," + finishresp.getException());
-                    continue;
-                }
-                tTransDtl.setAccdate(date);
-                tTransDtl.setAcctime(systemUtilService.getSysdatetime().getHosttime());
-                tTransDtl.setCoreStatus(RestaurantConstant.STATUS_TRANSDTL_SUCCESS);
-                tTransDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_SUCCESS);
-                tTransDtl.setRefno(response.getRefno());
-                dtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_SUCCESS);
-                offlineTransDtlService.saveOfflineTransdtl(dtl);
-                transDtlService.saveTransdtl(tTransDtl);
-            }
-
-        }
-
-        List<TOfflineTransDtl> revdtls = offlineTransDtlService.getUncheckOfflineTransdtl(date, RestaurantConstant.TRANSTYPE_TRANSDTL_REVERT);
-        if (revdtls.size() > 0) {
-            for (TOfflineTransDtl revdtl : revdtls) {
-                TTransDtl tTransDtl = gettTransDtl(revdtl);
-                tTransDtl.setTranstype(RestaurantConstant.TRANSTYPE_TRANSDTL_REVERT);
-                transDtlService.doRevertTransdtl(tTransDtl);
-            }
-        }
-
+    List<TenantDetails> multiTenantSchemas = multiTenantService.getSystemAllTenantDetails();
+    for (TenantDetails schema : multiTenantSchemas) {
+      TenantContextHolder.getContext().setTenant(schema);  //切换schema
+      logger.debug("开始执行schema=[" + schema.getDbSchema() + "]的脱机流水入账任务：");
+      submitOfflineDtlTask(); //TODO:执行task
     }
 
-    private TTransDtl gettTransDtl(TOfflineTransDtl dtl) {
-        TTransDtl tTransDtl = new TTransDtl();
-        tTransDtl.setManagefee(dtl.getManagefee());
-        tTransDtl.setAmount(dtl.getAmount());
-        tTransDtl.setCardno(dtl.getCardno());
-        tTransDtl.setStatus(dtl.getStatus());
-        tTransDtl.setCustid(dtl.getCustid());
-        tTransDtl.setBillno(dtl.getBillno());
-        tTransDtl.setTermsqlno(dtl.getTermsqlno());
-        tTransDtl.setMealtype(dtl.getMealtype());
-        tTransDtl.setCusttype(dtl.getCusttype());
-        tTransDtl.setShopid(dtl.getShopid());
-        tTransDtl.setTransdate(dtl.getTransdate());
-        tTransDtl.setTranstime(dtl.getTranstime());
-        tTransDtl.setTranstype(RestaurantConstant.TRANSTYPE_TRANSDTL_OFFLINE);
+    long t2 = System.currentTimeMillis();
+    logger.debug("=================== 【脱机流水入账任务】结束，耗时 " + (t2 - t1) + " ms ===================");
+  }
 
-        tTransDtl.setCustname(dtl.getCustname());
-        tTransDtl.setTermid(dtl.getTermid());
-        tTransDtl.setRuleid(dtl.getRuleid());
-        tTransDtl.setManagefee(dtl.getManagefee());
-        return tTransDtl;
-    }
+  private void submitOfflineDtlTask() {
+    String date = DateUtil.getNow("yyyyMMdd");
+    List<TOfflineTransDtl> dtls = offlineTransDtlService.getUncheckOfflineTransdtl(date, RestaurantConstant.TRANSTYPE_TRANSDTL_OFFLINE);
+    logger.debug("正在上传" + dtls.size() + "笔流水");
+    if (dtls.size() > 0) {
+      for (TOfflineTransDtl dtl : dtls) {
 
-    private void saveFailTransdtls(TOfflineTransDtl dtl, TTransDtl tTransDtl, CitizenPayResponse finishresp) {
-        String status;
-        String attr;
-        if(RestaurantConstant.TRANSDTL_STATUS_WIT==finishresp.getRetcode()){
-            status=RestaurantConstant.STATUS_TRANSDTL_WAIT;
-            attr="";
-            tTransDtl.setRefno(finishresp.getRefno());
-        }else{
-            status=RestaurantConstant.STATUS_TRANSDTL_FAIL;
-            attr=finishresp.getRetmsg() + "," + finishresp.getException()+","+finishresp.getRetcode();
+        TTransDtl tTransDtl = gettTransDtl(dtl);
+
+        CitizenCardPayinitParam param = new CitizenCardPayinitParam();
+        param.setBillno(dtl.getBillno());
+        param.setShopaccno(dtl.getShopid());
+        param.setTransdate(dtl.getTransdate());
+        param.setTranstime(dtl.getTranstime());
+        param.setCardNo(dtl.getCardno());
+        param.setDtltype("canteen");
+        Double amt = dtl.getAmount() * 100;
+        param.setAmount(amt.intValue());
+        logger.info(dtl.getBillno() + "开始消费逻辑");
+
+        CitizenPayResponse response = citizenCardPayProxy.citizencardPayinit(param);
+        if (response.getRetcode() != 0) {
+          saveFailTransdtls(dtl, tTransDtl, response);
+          logger.error(dtl.getBillno() + "初始化失败," + response.getRetcode() + "," + response.getRetmsg() + "," + response.getException());
+          continue;
         }
-        dtl.setStatus(status);
-        dtl.setAttr1(attr);
-        tTransDtl.setStatus(status);
-        tTransDtl.setAttr1(attr);
+        CitizenCardPayfinishParam finishparam = new CitizenCardPayfinishParam();
+        finishparam.setRefno(response.getRefno());
+        CitizenPayResponse finishresp = citizenCardPayProxy.citizencardPayFinish(finishparam);
+        if (finishresp.getRetcode() != 0) {
+          saveFailTransdtls(dtl, tTransDtl, finishresp);
+          logger.error(dtl.getBillno() + "消费确认失败," + finishresp.getRetcode() + "," + finishresp.getRetmsg() + "," + finishresp.getException());
+          continue;
+        }
+        tTransDtl.setAccdate(date);
+        tTransDtl.setAcctime(systemUtilService.getSysdatetime().getHosttime());
+        tTransDtl.setCoreStatus(RestaurantConstant.STATUS_TRANSDTL_SUCCESS);
+        tTransDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_SUCCESS);
+        tTransDtl.setRefno(response.getRefno());
+        dtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_SUCCESS);
         offlineTransDtlService.saveOfflineTransdtl(dtl);
         transDtlService.saveTransdtl(tTransDtl);
+      }
+
     }
 
+    List<TOfflineTransDtl> revdtls = offlineTransDtlService.getUncheckOfflineTransdtl(date, RestaurantConstant.TRANSTYPE_TRANSDTL_REVERT);
+    if (revdtls.size() > 0) {
+      for (TOfflineTransDtl revdtl : revdtls) {
+        TTransDtl tTransDtl = gettTransDtl(revdtl);
+        tTransDtl.setTranstype(RestaurantConstant.TRANSTYPE_TRANSDTL_REVERT);
+        transDtlService.doRevertTransdtl(tTransDtl);
+      }
+    }
 
-    @Scheduled(cron = "0 0/10 * * * ?")
-    private void checkWipDtls() {
-        String date = DateUtil.getNow("yyyyMMdd");
-        List<TTransDtl> dtls = transDtlService.getSubmittingTransdtl(date);
-        logger.info("正在核对" + dtls.size() + "笔未上传流水");
-        if (dtls.size() > 0) {
-            for (TTransDtl dtl : dtls) {
-                QueryDtlResultParam param = new QueryDtlResultParam();
-                param.setShopaccno(dtl.getShopid());
-                param.setBillno(dtl.getBillno());
-                param.setRefno(dtl.getRefno());
-                QueryTransDtlResponse resp = transactionProxy.queryDtlResult(param);
-                logger.info(dtl.getBillno()+":status==="+resp.getStatus());
+  }
 
-                if(RestaurantConstant.STATUS_TRANSDTL_WAIT.equals(resp.getStatus())){
-                    logger.info(dtl.getBillno()+":"+resp.getRetcode()+":"+resp.getRetmsg());
-                }else if (RestaurantConstant.STATUS_TRANSDTL_SUCCESS.equals(resp.getStatus())){
-                    dtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_SUCCESS);
-                    transDtlService.saveTransdtl(dtl);
-                }else{
-                    dtl.setAttr1(resp.getRetmsg());
-                    dtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_FAIL);
-                    transDtlService.saveTransdtl(dtl);
+  private TTransDtl gettTransDtl(TOfflineTransDtl dtl) {
+    TTransDtl tTransDtl = new TTransDtl();
+    tTransDtl.setManagefee(dtl.getManagefee());
+    tTransDtl.setAmount(dtl.getAmount());
+    tTransDtl.setCardno(dtl.getCardno());
+    tTransDtl.setStatus(dtl.getStatus());
+    tTransDtl.setCustid(dtl.getCustid());
+    tTransDtl.setBillno(dtl.getBillno());
+    tTransDtl.setTermsqlno(dtl.getTermsqlno());
+    tTransDtl.setMealtype(dtl.getMealtype());
+    tTransDtl.setCusttype(dtl.getCusttype());
+    tTransDtl.setShopid(dtl.getShopid());
+    tTransDtl.setTransdate(dtl.getTransdate());
+    tTransDtl.setTranstime(dtl.getTranstime());
+    tTransDtl.setTranstype(RestaurantConstant.TRANSTYPE_TRANSDTL_OFFLINE);
 
-                }
+    tTransDtl.setCustname(dtl.getCustname());
+    tTransDtl.setTermid(dtl.getTermid());
+    tTransDtl.setRuleid(dtl.getRuleid());
+    tTransDtl.setManagefee(dtl.getManagefee());
+    return tTransDtl;
+  }
 
-            }
+  private void saveFailTransdtls(TOfflineTransDtl dtl, TTransDtl tTransDtl, CitizenPayResponse finishresp) {
+    String status;
+    String attr;
+    if (RestaurantConstant.TRANSDTL_STATUS_WIT == finishresp.getRetcode()) {
+      status = RestaurantConstant.STATUS_TRANSDTL_WAIT;
+      attr = "";
+      tTransDtl.setRefno(finishresp.getRefno());
+    } else {
+      status = RestaurantConstant.STATUS_TRANSDTL_FAIL;
+      attr = finishresp.getRetmsg() + "," + finishresp.getException() + "," + finishresp.getRetcode();
+    }
+    dtl.setStatus(status);
+    dtl.setAttr1(attr);
+    tTransDtl.setStatus(status);
+    tTransDtl.setAttr1(attr);
+    offlineTransDtlService.saveOfflineTransdtl(dtl);
+    transDtlService.saveTransdtl(tTransDtl);
+  }
+
+
+  @Scheduled(cron = "${restaurant.querydtlresult.cron}")
+  @SchedulerLock(name = "RestaurantQueryDtlResultTask", lockAtMostForString = "PT10M")
+  public void doQueryTask(){
+    long t1 = System.currentTimeMillis();
+    logger.debug("=================== 【查询流水状态任务】开始： ===================");
+
+    List<TenantDetails> multiTenantSchemas = multiTenantService.getSystemAllTenantDetails();
+    for (TenantDetails schema : multiTenantSchemas) {
+      TenantContextHolder.getContext().setTenant(schema);  //切换schema
+      logger.debug("开始执行schema=[" + schema.getDbSchema() + "]的查询待支付流水支付状态任务：");
+      checkWipDtls(); //TODO:执行task
+    }
+
+    long t2 = System.currentTimeMillis();
+    logger.debug("=================== 【查询流水状态任务】结束，耗时 " + (t2 - t1) + " ms ===================");
+  }
+
+  private void checkWipDtls() {
+    String date = DateUtil.getNow("yyyyMMdd");
+    List<TTransDtl> dtls = transDtlService.getSubmittingTransdtl(date);
+    logger.debug("正在核对" + dtls.size() + "笔未上传流水");
+    if (dtls.size() > 0) {
+      for (TTransDtl dtl : dtls) {
+        QueryDtlResultParam param = new QueryDtlResultParam();
+        param.setShopaccno(dtl.getShopid());
+        param.setBillno(dtl.getBillno());
+        param.setRefno(dtl.getRefno());
+        QueryTransDtlResponse resp = transactionProxy.queryDtlResult(param);
+        logger.info(dtl.getBillno() + ":status===" + resp.getStatus());
+
+        if (RestaurantConstant.STATUS_TRANSDTL_WAIT.equals(resp.getStatus())) {
+          logger.debug(dtl.getBillno() + ":" + resp.getRetcode() + ":" + resp.getRetmsg());
+        } else if (RestaurantConstant.STATUS_TRANSDTL_SUCCESS.equals(resp.getStatus())) {
+          dtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_SUCCESS);
+          transDtlService.saveTransdtl(dtl);
+        } else {
+          dtl.setAttr1(resp.getRetmsg());
+          dtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_FAIL);
+          transDtlService.saveTransdtl(dtl);
         }
 
+      }
     }
 
+  }
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/core/JwtConfig.java b/src/main/java/com/supwisdom/dlpay/framework/core/JwtConfig.java
index c8992a8..c66b9fd 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/core/JwtConfig.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/core/JwtConfig.java
@@ -29,4 +29,8 @@
   public String getTokenHeader() {
     return tokenHeader;
   }
+
+  public void setSecret(String secret) {
+    this.secret = secret;
+  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/core/JwtTokenUtil.java b/src/main/java/com/supwisdom/dlpay/framework/core/JwtTokenUtil.java
index 481df61..55d04da 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/core/JwtTokenUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/core/JwtTokenUtil.java
@@ -19,8 +19,11 @@
 public class JwtTokenUtil {
   private JwtConfig jwtConfig;
 
-  public JwtTokenUtil(JwtConfig config) {
+  public JwtTokenUtil(JwtConfig config, String secret) {
     this.jwtConfig = config;
+    if (null != secret && !"".equals(secret.trim())) {
+      this.jwtConfig.setSecret(secret); //TODO:替换秘钥
+    }
   }
 
   public String getHeader() {
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/TenantConfigDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/TenantConfigDao.java
index b52710e..f016336 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/TenantConfigDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/TenantConfigDao.java
@@ -5,8 +5,12 @@
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 @Repository
 public interface TenantConfigDao extends CrudRepository<TTenantConfig, String> {
-  @Query("select t from TTenantConfig  t where t.cfgid='main'")
-  TTenantConfig getDefault();
+  TTenantConfig getByTenantId(String tenantid);
+
+  @Query("from TTenantConfig t order by t.tenantId ")
+  List<TTenantConfig> findAllTenants();
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/TenantJwtconfigDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/TenantJwtconfigDao.java
new file mode 100644
index 0000000..cee36de
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/TenantJwtconfigDao.java
@@ -0,0 +1,12 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TTenantJwtconfig;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface TenantJwtconfigDao extends JpaRepository<TTenantJwtconfig, String> {
+  @Query("select t from TTenantJwtconfig  t where t.id='main'")
+  TTenantJwtconfig getDefault();
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TTenantConfig.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TTenantConfig.java
index 3499322..1ed3ace 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TTenantConfig.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TTenantConfig.java
@@ -1,21 +1,24 @@
 package com.supwisdom.dlpay.framework.domain;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
 import javax.validation.constraints.NotNull;
 
 @Entity
-@Table(name = "tb_tenantconfig")
+@Table(name = "TB_TENANTCONFIG", indexes = {@Index(name = "UK_TENANTCONFIG_TENANTID", unique = true, columnList = "TENANT_ID")})
 public class TTenantConfig {
   @Id
-  @Column(name = "cfgid", length = 20)
+  @Column(name = "CFGID", nullable = false, length = 20)
   private String cfgid;
 
+  @Column(name = "TENANT_ID", nullable = false, length = 60)
+  private String tenantId;
 
-  @Column(name = "datacenter_id", length = 40)
-  private String dataCenterId;
+  @Column(name = "TENANT_NAME", length = 200)
+  private String tenantName;
+
+  @Column(name = "TENANT_SCHEMA", nullable = false, length = 60)
+  private String tenantSchema;
+
 
   public String getCfgid() {
     return cfgid;
@@ -25,12 +28,27 @@
     this.cfgid = cfgid;
   }
 
-  public String getDataCenterId() {
-    return dataCenterId;
+  public String getTenantId() {
+    return tenantId;
   }
 
-  public void setDataCenterId(String dataCenterId) {
-    this.dataCenterId = dataCenterId;
+  public void setTenantId(String tenantId) {
+    this.tenantId = tenantId;
   }
 
+  public String getTenantName() {
+    return tenantName;
+  }
+
+  public void setTenantName(String tenantName) {
+    this.tenantName = tenantName;
+  }
+
+  public String getTenantSchema() {
+    return tenantSchema;
+  }
+
+  public void setTenantSchema(String tenantSchema) {
+    this.tenantSchema = tenantSchema;
+  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TTenantJwtconfig.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TTenantJwtconfig.java
new file mode 100644
index 0000000..b93a1e9
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TTenantJwtconfig.java
@@ -0,0 +1,33 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "TB_TENANT_JWTCONFIG")
+public class TTenantJwtconfig {
+  @Id
+  @Column(name = "id", nullable = false, length = 20)
+  private String id;
+
+  @Column(name = "jwt_secret", nullable = false, length = 200)
+  private String jwtSecret;
+
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public String getJwtSecret() {
+    return jwtSecret;
+  }
+
+  public void setJwtSecret(String jwtSecret) {
+    this.jwtSecret = jwtSecret;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/redisrepo/ApiClientRepository.java b/src/main/java/com/supwisdom/dlpay/framework/redisrepo/ApiClientRepository.java
index 1d48dd1..04043fe 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/redisrepo/ApiClientRepository.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/redisrepo/ApiClientRepository.java
@@ -1,6 +1,6 @@
 package com.supwisdom.dlpay.framework.redisrepo;
 
-import com.supwisdom.dlpay.framework.domain.ApiClientRedis;
+import com.supwisdom.dlpay.framework.redistable.ApiClientRedis;
 import org.springframework.data.repository.CrudRepository;
 
 public interface ApiClientRepository extends CrudRepository<ApiClientRedis, String> {
diff --git a/src/main/java/com/supwisdom/dlpay/framework/redisrepo/ApiJwtRepository.java b/src/main/java/com/supwisdom/dlpay/framework/redisrepo/ApiJwtRepository.java
index 38a3fbe..57e0a85 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/redisrepo/ApiJwtRepository.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/redisrepo/ApiJwtRepository.java
@@ -1,6 +1,6 @@
 package com.supwisdom.dlpay.framework.redisrepo;
 
-import com.supwisdom.dlpay.framework.domain.JwtRedis;
+import com.supwisdom.dlpay.framework.redistable.JwtRedis;
 import org.springframework.data.repository.CrudRepository;
 
 public interface ApiJwtRepository extends CrudRepository<JwtRedis, String> {
diff --git a/src/main/java/com/supwisdom/dlpay/framework/redisrepo/PersonRepository.java b/src/main/java/com/supwisdom/dlpay/framework/redisrepo/PersonRepository.java
index a4925cd..5e627f1 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/redisrepo/PersonRepository.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/redisrepo/PersonRepository.java
@@ -1,6 +1,6 @@
 package com.supwisdom.dlpay.framework.redisrepo;
 
-import com.supwisdom.dlpay.framework.domain.PersonRedis;
+import com.supwisdom.dlpay.framework.redistable.PersonRedis;
 import org.springframework.data.repository.CrudRepository;
 
 public interface PersonRepository extends CrudRepository<PersonRedis, String> {
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/ApiClientRedis.java b/src/main/java/com/supwisdom/dlpay/framework/redistable/ApiClientRedis.java
similarity index 94%
rename from src/main/java/com/supwisdom/dlpay/framework/domain/ApiClientRedis.java
rename to src/main/java/com/supwisdom/dlpay/framework/redistable/ApiClientRedis.java
index 2904156..3605ffa 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/ApiClientRedis.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/redistable/ApiClientRedis.java
@@ -1,9 +1,8 @@
-package com.supwisdom.dlpay.framework.domain;
+package com.supwisdom.dlpay.framework.redistable;
 
 import org.springframework.data.annotation.Id;
 import org.springframework.data.redis.core.RedisHash;
 
-
 @RedisHash("app_client")
 public class ApiClientRedis {
   private @Id
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/JwtRedis.java b/src/main/java/com/supwisdom/dlpay/framework/redistable/JwtRedis.java
similarity index 93%
rename from src/main/java/com/supwisdom/dlpay/framework/domain/JwtRedis.java
rename to src/main/java/com/supwisdom/dlpay/framework/redistable/JwtRedis.java
index 47ece23..b3f5752 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/JwtRedis.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/redistable/JwtRedis.java
@@ -1,4 +1,4 @@
-package com.supwisdom.dlpay.framework.domain;
+package com.supwisdom.dlpay.framework.redistable;
 
 import org.springframework.data.annotation.Id;
 import org.springframework.data.redis.core.RedisHash;
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/PersonRedis.java b/src/main/java/com/supwisdom/dlpay/framework/redistable/PersonRedis.java
similarity index 94%
rename from src/main/java/com/supwisdom/dlpay/framework/domain/PersonRedis.java
rename to src/main/java/com/supwisdom/dlpay/framework/redistable/PersonRedis.java
index 623e55a..c1651ec 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/PersonRedis.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/redistable/PersonRedis.java
@@ -1,4 +1,4 @@
-package com.supwisdom.dlpay.framework.domain;
+package com.supwisdom.dlpay.framework.redistable;
 
 import org.springframework.data.annotation.Id;
 import org.springframework.data.redis.core.RedisHash;
diff --git a/src/main/java/com/supwisdom/dlpay/framework/security/MyAuthenticationSuccessHandler.java b/src/main/java/com/supwisdom/dlpay/framework/security/MyAuthenticationSuccessHandler.java
index 8708919..693a9cb 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/security/MyAuthenticationSuccessHandler.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/security/MyAuthenticationSuccessHandler.java
@@ -2,23 +2,25 @@
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.supwisdom.dlpay.api.bean.JsonResult;
-import com.supwisdom.dlpay.framework.domain.TFunction;
 import com.supwisdom.dlpay.framework.domain.TOperLog;
 import com.supwisdom.dlpay.framework.domain.TOperator;
 import com.supwisdom.dlpay.framework.util.DateUtil;
 import com.supwisdom.dlpay.system.service.FunctionService;
 import com.supwisdom.dlpay.system.service.OperatorService;
+import com.supwisdom.multitenant.TenantContextHolder;
+import com.supwisdom.multitenant.TenantSessionData;
+import com.supwisdom.multitenant.config.TenantSessionProperties;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
 import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
 import org.springframework.stereotype.Component;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
 import java.io.IOException;
 
 @Component("myAuthenctiationSuccessHandler")
@@ -28,7 +30,9 @@
     @Autowired
     private OperatorService operatorService;
     @Autowired
-    private FunctionService functionService;
+    private TenantSessionProperties tenantSessionProperties;
+
+
 
     @Override
     public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
@@ -47,6 +51,10 @@
             log.setFunctionname("登录成功");
             operatorService.saveOperLog(log);
         }
+
+        HttpSession session = request.getSession();
+        session.setAttribute(tenantSessionProperties.getName(),TenantContextHolder.getContext().getTenant());
+
         response.setStatus(HttpStatus.OK.value());
         response.setContentType("application/json;charset=UTF-8");
         response.getWriter().write(objectMapper.writeValueAsString(JsonResult.ok("登录成功")));
diff --git a/src/main/java/com/supwisdom/dlpay/framework/service/impl/OperatorDetailServiceImpl.java b/src/main/java/com/supwisdom/dlpay/framework/service/impl/OperatorDetailServiceImpl.java
index 755828d..3619998 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/service/impl/OperatorDetailServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/service/impl/OperatorDetailServiceImpl.java
@@ -5,6 +5,11 @@
 import com.supwisdom.dlpay.framework.domain.TOperator;
 import com.supwisdom.dlpay.framework.service.OperatorDetailService;
 import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.tenant.TenantConstant;
+import com.supwisdom.dlpay.tenant.service.MultiTenantService;
+import com.supwisdom.multitenant.TenantContext;
+import com.supwisdom.multitenant.TenantContextHolder;
+import com.supwisdom.multitenant.TenantDetails;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.GrantedAuthority;
 import org.springframework.security.core.authority.AuthorityUtils;
@@ -22,10 +27,30 @@
   private OperatorDao operatorDao;
   @Autowired
   private OperRoleDao operRoleDao;
+  @Autowired
+  private MultiTenantService multiTenantService;
 
   @Override
   public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
-    TOperator oper = operatorDao.findByOpercode(username);
+    if (StringUtil.isEmpty(username)) throw new UsernameNotFoundException("用户名不能为空");
+
+    String opercode = username;
+    int index = username.lastIndexOf("@");
+    if (index > 1) {
+      opercode = username.substring(0, index);
+      TenantDetails details = multiTenantService.getDefaultTenantDetailsByTenantid(username.substring(index + 1));
+      if (null != details) TenantContextHolder.getContext().setTenant(details); //TODO：设置schema
+    } else {
+      TenantContextHolder.getContext().setTenant(TenantConstant.defaultTenantDetails);
+    }
+
+    TOperator oper = null;
+    try {
+      oper = operatorDao.findByOpercode(opercode);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+
     if (null == oper) {
       throw new UsernameNotFoundException("管理员不存在");
     }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CustomerServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CustomerServiceImpl.java
index cd30368..25ff130 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CustomerServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CustomerServiceImpl.java
@@ -165,7 +165,7 @@
         String cardverno = systemUtilService.getCardverno();
         List<TCard> card = cardDao.findAllByCustid(custid);
         for (TCard c : card) {
-            cardDao.deleteById(c.getCardno());
+            cardDao.delete(c);
             String date = DateUtil.getNow("yyyyMMdd");
             saveCardver(cardverno, date, c, c.getStatus(), RestaurantConstant.STATUS_CARD_LOGOUT, 0);
         }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/task/CheckTransdtlTask.java b/src/main/java/com/supwisdom/dlpay/restaurant/task/CheckTransdtlTask.java
index 0e37ba0..8efd88f 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/task/CheckTransdtlTask.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/task/CheckTransdtlTask.java
@@ -13,6 +13,10 @@
 import com.supwisdom.dlpay.restaurant.domain.TCheckFile;
 import com.supwisdom.dlpay.restaurant.service.CheckTransdtlService;
 import com.supwisdom.dlpay.restaurant.util.RestaurantConstant;
+import com.supwisdom.dlpay.tenant.TenantConstant;
+import com.supwisdom.dlpay.tenant.service.MultiTenantService;
+import com.supwisdom.multitenant.TenantContextHolder;
+import com.supwisdom.multitenant.TenantDetails;
 import net.javacrumbs.shedlock.core.SchedulerLock;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,6 +34,8 @@
   private SystemUtilService systemUtilService;
   @Autowired
   private CheckTransdtlService checkTransdtlService;
+  @Autowired
+  private MultiTenantService multiTenantService;
 
   @Autowired
   private ShopProxy shopProxy;
@@ -41,9 +47,22 @@
   @Scheduled(cron = "${restaurant.chkdtltask.cron}")
   @SchedulerLock(name = "RestaurantCheckTransdtlTask", lockAtMostForString = "PT20M")
   public void doCheckTransdtlTask(){
-    try{
-      long t1 = System.currentTimeMillis();
-      logger.info("=================== 对账任务开始： ===================");
+    long t1 = System.currentTimeMillis();
+    logger.info("=================== 对账任务开始： ===================");
+
+    List<TenantDetails> multiTenantSchemas = multiTenantService.getSystemAllTenantDetails();
+    for (TenantDetails schema : multiTenantSchemas) {
+      TenantContextHolder.getContext().setTenant(schema);  //切换schema
+      logger.info("开始执行schema=[" + schema.getDbSchema() + "]的对账任务：");
+      doDealCheckTask(); //TODO:执行task
+    }
+
+    long t2 = System.currentTimeMillis();
+    logger.info("=================== 对账任务结束，耗时 " + (t2 - t1) + " ms ===================");
+  }
+
+  private void doDealCheckTask() {
+    try {
       //step1: 获取上次对账到哪一天
       TCheckCtl chkCtl = checkTransdtlService.doGetCheckTransdtlCtl();
       if (null == chkCtl) {
@@ -64,11 +83,7 @@
         chkCtl = downloadBillData(chkCtl);
         if (chkCtl.getDownloadOk()) doCheckProcess(chkCtl);
       }
-
-      long t2 = System.currentTimeMillis();
-      logger.info("=================== 对账任务结束，耗时 " + (t2 - t1) + " ms ===================");
-
-    }catch (Exception e){
+    } catch (Exception e) {
       logger.error("跟核心平台对账报错：" + e.getMessage());
       e.printStackTrace();
     }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/task/RestaurantTask.java b/src/main/java/com/supwisdom/dlpay/restaurant/task/RestaurantTask.java
index dd82f82..0208f54 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/task/RestaurantTask.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/task/RestaurantTask.java
@@ -15,6 +15,10 @@
 import com.supwisdom.dlpay.restaurant.service.OfflineTransDtlService;
 import com.supwisdom.dlpay.restaurant.service.TransDtlService;
 import com.supwisdom.dlpay.restaurant.util.RestaurantConstant;
+import com.supwisdom.dlpay.tenant.service.MultiTenantService;
+import com.supwisdom.multitenant.TenantContextHolder;
+import com.supwisdom.multitenant.TenantDetails;
+import net.javacrumbs.shedlock.core.SchedulerLock;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -29,57 +33,75 @@
 @Configuration
 @EnableScheduling
 public class RestaurantTask {
-    private static final Logger logger = LoggerFactory.getLogger(RestaurantTask.class);
+  private static final Logger logger = LoggerFactory.getLogger(RestaurantTask.class);
 
-    @Autowired
-    private CardService cardService;
-    @Autowired
-    private CustomerService customerService;
-    @Autowired
-    private CustomerDao customerDao;
-    @Autowired
-    private UserProxy userProxy;
+  @Autowired
+  private MultiTenantService multiTenantService;
+  @Autowired
+  private CardService cardService;
+  @Autowired
+  private CustomerService customerService;
+  @Autowired
+  private CustomerDao customerDao;
+  @Autowired
+  private UserProxy userProxy;
 
-    @Scheduled(cron = "0 0/1 * * * ? ")
-    private void CustomerCheckTask(){
-        CustomerSearchBean searchBean=new CustomerSearchBean();
-        searchBean.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_UNCHECK);
+  @Scheduled(cron = "${restaurant.customercheck.cron}")
+  @SchedulerLock(name = "RestaurantCheckCustomerTask", lockAtMostForString = "PT20M")
+  public void doCustomerCheckTask() {
+    long t1 = System.currentTimeMillis();
+    logger.debug("=================== 客户信息校验任务开始： ===================");
 
-        List<CustomerShowBean> dtls=customerService.getCustomerPage(searchBean).getData();
-        logger.info("正同步"+dtls.size()+"名人员");
-        if(dtls.size()>0){
-            for(CustomerShowBean dtl:dtls){
-                QueryUserParam param=new QueryUserParam();
-                param.setCitizencardno(dtl.getCardno());
-                UserInforResponse resp=userProxy.querybycardno(param);
-                TCustomer customer=customerService.getCustomerByCustid(dtl.getCustid());
-
-                if(resp.getRetcode()==0){
-                    TCard card=cardService.getCardByCardno(dtl.getCardno());
-                    if(null!=card){
-                        card.setCardphyid(resp.getCardphyid());
-                        card.setExpiredate(resp.getExpiredate());
-                        card.setBankcardno(resp.getBankcardno());
-                        card.setStatus(resp.getCardstatus());
-                        card.setTransstatus(resp.getTransstatus());
-                        cardService.saveCard(card);
-                    }
-                    customer.setPhone(resp.getPhone());
-                    customer.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_NORMAL);
-                    customer.setStatus(RestaurantConstant.STATUS_CARD_NORMAL);
-                }else{
-                    customer.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_FAIL);
-                    customer.setStatus(RestaurantConstant.STATUS_CHECKSTATUS_FAIL);
-                }
-                customerDao.save(customer);
-
-
-            }
-
-        }
-
+    List<TenantDetails> multiTenantSchemas = multiTenantService.getSystemAllTenantDetails();
+    for (TenantDetails schema : multiTenantSchemas) {
+      TenantContextHolder.getContext().setTenant(schema);  //切换schema
+      logger.debug("开始执行schema=[" + schema.getDbSchema() + "]的客户信息校验任务：");
+      dealCustomerCheckTask(); //TODO:执行task
     }
 
+    long t2 = System.currentTimeMillis();
+    logger.debug("=================== 客户信息校验任务结束，耗时 " + (t2 - t1) + " ms ===================");
+  }
+
+  private void dealCustomerCheckTask() {
+    try {
+      CustomerSearchBean searchBean = new CustomerSearchBean();
+      searchBean.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_UNCHECK);
+
+      List<CustomerShowBean> dtls = customerService.getCustomerPage(searchBean).getData();
+      logger.debug("正同步" + dtls.size() + "名人员");
+      if (dtls.size() > 0) {
+        for (CustomerShowBean dtl : dtls) {
+          QueryUserParam param = new QueryUserParam();
+          param.setCitizencardno(dtl.getCardno());
+          UserInforResponse resp = userProxy.querybycardno(param);
+          TCustomer customer = customerService.getCustomerByCustid(dtl.getCustid());
+
+          if (resp.getRetcode() == 0) {
+            TCard card = cardService.getCardByCardno(dtl.getCardno());
+            if (null != card) {
+              card.setCardphyid(resp.getCardphyid());
+              card.setExpiredate(resp.getExpiredate());
+              card.setBankcardno(resp.getBankcardno());
+              card.setStatus(resp.getCardstatus());
+              card.setTransstatus(resp.getTransstatus());
+              cardService.saveCard(card);
+            }
+            customer.setPhone(resp.getPhone());
+            customer.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_NORMAL);
+            customer.setStatus(RestaurantConstant.STATUS_CARD_NORMAL);
+          } else {
+            customer.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_FAIL);
+            customer.setStatus(RestaurantConstant.STATUS_CHECKSTATUS_FAIL);
+          }
+          customerDao.save(customer);
+        }
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+
     //TODO 
     @Scheduled(cron = "0 0/1 * * * ? ")
     private void deleteExpiredWhitelist(){
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/task/TransdtlStatementTask.java b/src/main/java/com/supwisdom/dlpay/restaurant/task/TransdtlStatementTask.java
index cb256eb..7354852 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/task/TransdtlStatementTask.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/task/TransdtlStatementTask.java
@@ -4,6 +4,9 @@
 import com.supwisdom.dlpay.framework.util.DateUtil;
 import com.supwisdom.dlpay.restaurant.domain.TCheckCtl;
 import com.supwisdom.dlpay.restaurant.service.CheckTransdtlService;
+import com.supwisdom.dlpay.tenant.service.MultiTenantService;
+import com.supwisdom.multitenant.TenantContextHolder;
+import com.supwisdom.multitenant.TenantDetails;
 import net.javacrumbs.shedlock.core.SchedulerLock;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -12,6 +15,8 @@
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
+import java.util.List;
+
 /**
  * 流水统计任务
  */
@@ -22,6 +27,8 @@
   private SystemUtilService systemUtilService;
   @Autowired
   private CheckTransdtlService checkTransdtlService;
+  @Autowired
+  private MultiTenantService multiTenantService;
 
   private static final Logger logger = LoggerFactory.getLogger(TransdtlStatementTask.class);
 
@@ -29,10 +36,22 @@
   @Scheduled(cron = "${restaurant.statement.cron}")
   @SchedulerLock(name = "RestaurantStatementTask", lockAtMostForString = "PT10M")
   public void doStatementTask() {
-    try {
-      long t1 = System.currentTimeMillis();
-      logger.info("=================== 【流水统计任务】开始： ===================");
+    long t1 = System.currentTimeMillis();
+    logger.info("=================== 【流水统计任务】开始： ===================");
 
+    List<TenantDetails> multiTenantSchemas = multiTenantService.getSystemAllTenantDetails();
+    for (TenantDetails schema : multiTenantSchemas) {
+      TenantContextHolder.getContext().setTenant(schema);  //切换schema
+      logger.info("开始执行schema=[" + schema.getDbSchema() + "]的流水统计任务：");
+      doDealStatementTask(); //TODO:执行task
+    }
+
+    long t2 = System.currentTimeMillis();
+    logger.info("=================== 【流水统计任务】结束，耗时 " + (t2 - t1) + " ms ===================");
+  }
+
+  private void doDealStatementTask(){
+    try {
       TCheckCtl checkCtl = checkTransdtlService.getSystemCheckCtl();
       if (null == checkCtl) {
         logger.error("还未与核心平台对账！");
@@ -56,9 +75,6 @@
           break;
         }
       }
-
-      long t2 = System.currentTimeMillis();
-      logger.info("=================== 【流水统计任务】结束，耗时 " + (t2 - t1) + " ms ===================");
     } catch (Exception e) {
       logger.error("【流水统计任务】报错：" + e.getMessage());
       e.printStackTrace();
diff --git a/src/main/java/com/supwisdom/dlpay/tenant/MyTenantDetailsProvider.java b/src/main/java/com/supwisdom/dlpay/tenant/MyTenantDetailsProvider.java
new file mode 100644
index 0000000..0f70178
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/tenant/MyTenantDetailsProvider.java
@@ -0,0 +1,42 @@
+package com.supwisdom.dlpay.tenant;
+
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.tenant.service.MultiTenantService;
+import com.supwisdom.multitenant.TenantDetails;
+import com.supwisdom.multitenant.TenantDetailsProvider;
+import com.supwisdom.multitenant.TenantSessionData;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Map;
+
+@Component
+public class MyTenantDetailsProvider implements TenantDetailsProvider {
+  private static final Map<String, TenantDetails> tenantDetailsMap = new Hashtable<>();
+
+  @Autowired
+  private MultiTenantService multiTenantService;
+
+  static {
+    tenantDetailsMap.put(TenantConstant.DEFAULT_TENANTID, TenantConstant.defaultTenantDetails);
+  }
+
+  @Override
+  public TenantDetails createDetailsById(String id) {
+    if (StringUtil.isEmpty(id)) return TenantConstant.defaultTenantDetails;
+
+    TenantDetails tenantDetails = tenantDetailsMap.get(id);
+    if (null == tenantDetails) {
+      tenantDetails = multiTenantService.getDefaultTenantDetailsByTenantid(id);
+      tenantDetailsMap.put(tenantDetails.getId(), tenantDetails);
+    }
+    return tenantDetails;
+  }
+
+  @Override
+  public TenantDetails defaultTenant() {
+    return TenantConstant.defaultTenantDetails;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/tenant/TenantConstant.java b/src/main/java/com/supwisdom/dlpay/tenant/TenantConstant.java
new file mode 100644
index 0000000..41a9276
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/tenant/TenantConstant.java
@@ -0,0 +1,12 @@
+package com.supwisdom.dlpay.tenant;
+
+import com.supwisdom.multitenant.TenantDetails;
+
+public class TenantConstant {
+  public static final String HEADER_TETANTID = "X-TENANT-ID";
+  public static final String DEFAULT_TENANTID = "default";
+  public static final String DEFAULT_DATACENTER = "default";
+
+  //默认的TenantDetails
+  public static final TenantDetails defaultTenantDetails = new TenantDetails(DEFAULT_TENANTID, "public", true, DEFAULT_DATACENTER);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/tenant/service/MultiTenantService.java b/src/main/java/com/supwisdom/dlpay/tenant/service/MultiTenantService.java
new file mode 100644
index 0000000..1b464ad
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/tenant/service/MultiTenantService.java
@@ -0,0 +1,11 @@
+package com.supwisdom.dlpay.tenant.service;
+
+import com.supwisdom.multitenant.TenantDetails;
+
+import java.util.List;
+
+public interface MultiTenantService {
+  TenantDetails getDefaultTenantDetailsByTenantid(String tenantid);
+
+  List<TenantDetails> getSystemAllTenantDetails();
+}
diff --git a/src/main/java/com/supwisdom/dlpay/tenant/service/impl/MultiTenantServiceImpl.java b/src/main/java/com/supwisdom/dlpay/tenant/service/impl/MultiTenantServiceImpl.java
new file mode 100644
index 0000000..140a24a
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/tenant/service/impl/MultiTenantServiceImpl.java
@@ -0,0 +1,55 @@
+package com.supwisdom.dlpay.tenant.service.impl;
+
+import com.supwisdom.dlpay.framework.dao.TenantConfigDao;
+import com.supwisdom.dlpay.framework.domain.TTenantConfig;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.tenant.TenantConstant;
+import com.supwisdom.dlpay.tenant.service.MultiTenantService;
+import com.supwisdom.multitenant.TenantContextHolder;
+import com.supwisdom.multitenant.TenantDetails;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class MultiTenantServiceImpl implements MultiTenantService {
+  @Autowired
+  private TenantConfigDao tenantConfigDao;
+
+  @Override
+  public TenantDetails getDefaultTenantDetailsByTenantid(String tenantid) {
+    if(!StringUtil.isEmpty(tenantid)){
+      TenantContextHolder.getContext().setTenant(TenantConstant.defaultTenantDetails); //public下
+      TTenantConfig config = tenantConfigDao.getByTenantId(tenantid.trim());
+      if(null == config) throw new RuntimeException("tenantId=[" + tenantid + "] is error!!!");
+
+      TenantDetails tenantDetails = new TenantDetails();
+      tenantDetails.setId(tenantid.trim());
+      tenantDetails.setDbSchema(config.getTenantSchema());
+      tenantDetails.setDataCenter(TenantConstant.DEFAULT_DATACENTER);
+      tenantDetails.setEnabled(true);
+      return tenantDetails;
+    }
+    return TenantConstant.defaultTenantDetails;
+  }
+
+  @Override
+  public List<TenantDetails> getSystemAllTenantDetails() {
+    List<TenantDetails> result = new ArrayList<>(0);
+    TenantContextHolder.getContext().setTenant(TenantConstant.defaultTenantDetails); //public下
+    List<TTenantConfig> configList = tenantConfigDao.findAllTenants();
+    if (!StringUtil.isEmpty(configList)) {
+      for (TTenantConfig conf : configList) {
+        TenantDetails tenantDetails = new TenantDetails();
+        tenantDetails.setId(conf.getTenantId());
+        tenantDetails.setDbSchema(conf.getTenantSchema());
+        tenantDetails.setDataCenter(TenantConstant.DEFAULT_DATACENTER);
+        tenantDetails.setEnabled(true);
+        result.add(tenantDetails);
+      }
+    }
+    return result;
+  }
+}
diff --git a/src/main/kotlin/com/supwisdom/dlpay/RestaurantApplication.kt b/src/main/kotlin/com/supwisdom/dlpay/RestaurantApplication.kt
index eb901a8..654ab4b 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/RestaurantApplication.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/RestaurantApplication.kt
@@ -1,8 +1,11 @@
 package com.supwisdom.dlpay
 
+import com.supwisdom.multitenant.annotations.EnableHttpHeaderTenantInterceptor
+import com.supwisdom.multitenant.annotations.EnableSessionTenantInterceptor
 import io.lettuce.core.ReadFrom
 import net.javacrumbs.shedlock.core.LockProvider
 import net.javacrumbs.shedlock.provider.redis.spring.RedisLockProvider
+import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.boot.SpringApplication
 import org.springframework.boot.autoconfigure.SpringBootApplication
@@ -67,7 +70,10 @@
     }
 }
 
+@EnableSchedulerLock(defaultLockAtMostFor = "PT20M")
 @EnableDiscoveryClient
+@EnableSessionTenantInterceptor
+@EnableHttpHeaderTenantInterceptor
 @ServletComponentScan
 @SpringBootApplication
 class RestaurantApplication
diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
index 4eb8794..d73b384 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
@@ -1,14 +1,13 @@
 package com.supwisdom.dlpay.framework.controller
 
 import com.google.code.kaptcha.Producer
-import com.supwisdom.dlpay.exception.TransactionCheckException
 import com.supwisdom.dlpay.framework.ResponseBodyBuilder
 import com.supwisdom.dlpay.framework.core.JwtConfig
 import com.supwisdom.dlpay.framework.core.JwtTokenUtil
 import com.supwisdom.dlpay.framework.dao.ApiClientDao
-import com.supwisdom.dlpay.framework.dao.TenantConfigDao
-import com.supwisdom.dlpay.framework.domain.ApiClientRedis
-import com.supwisdom.dlpay.framework.domain.JwtRedis
+import com.supwisdom.dlpay.framework.dao.TenantJwtconfigDao
+import com.supwisdom.dlpay.framework.redistable.ApiClientRedis
+import com.supwisdom.dlpay.framework.redistable.JwtRedis
 import com.supwisdom.dlpay.framework.domain.TOperator
 import com.supwisdom.dlpay.framework.redisrepo.ApiClientRepository
 import com.supwisdom.dlpay.framework.redisrepo.ApiJwtRepository
@@ -18,23 +17,21 @@
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.util.*
 import com.supwisdom.dlpay.system.service.FunctionService
+import com.supwisdom.dlpay.tenant.TenantConstant
+import com.supwisdom.multitenant.TenantContextHolder
 import mu.KotlinLogging
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.http.HttpStatus
 import org.springframework.http.ResponseEntity
-import org.springframework.security.core.Authentication
 import org.springframework.security.core.annotation.AuthenticationPrincipal
 import org.springframework.security.core.context.SecurityContextHolder
 import org.springframework.security.core.userdetails.UserDetails
-import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer
-import org.springframework.security.oauth2.provider.OAuth2Authentication
 import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler
 import org.springframework.social.connect.web.HttpSessionSessionStrategy
 import org.springframework.stereotype.Controller
 import org.springframework.ui.Model
 import org.springframework.web.bind.annotation.*
 import org.springframework.web.context.request.ServletWebRequest
-import java.awt.image.BufferedImage
 import java.io.IOException
 import java.lang.Exception
 import java.security.Principal
@@ -62,20 +59,14 @@
     @Autowired
     lateinit var jwtConfig: JwtConfig
 
+    @Autowired
+    lateinit var tenantJwtconfigDao: TenantJwtconfigDao
+
 
     @GetMapping(value = ["/gettoken", "/gettoken/{clientid}"])
     @ResponseBody
-    fun loginInit(appid: String, @PathVariable clientid: String?,
-                  @RequestHeader(Constants.HEADER_TETANTID) tetantId: String?): ResponseEntity<Any> {
-
-     /*   tetantConfigDao.default?.also {
-            if (it.tenantId != tetantId) {
-                throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
-                        "租户ID错误")
-            }
-        } ?: throw TransactionCheckException(TradeErrorCode.BUSINESS_DEAL_ERROR,
-                "系统未配置租户信息")*/
-
+    fun loginInit(appid: String, @PathVariable clientid: String?): ResponseEntity<Any> {
+        val tenantId = TenantContextHolder.getContext().tenant?.id ?: TenantConstant.DEFAULT_TENANTID
         apiClientDao.findById(appid).run {
             if (!isPresent) {
                 return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build()
@@ -89,11 +80,11 @@
             val token = generateRandomToken()
             val now = systemUtil.sysdatetime.hostdatetime
             ApiClientRedis().also {
-                it.id = if (clientid == null) appid else "$appid-$clientid"
+                it.id = if (clientid == null) "$appid@$tenantId" else "$appid-$clientid@$tenantId"
                 it.loginTimestamp = now
                 it.roles = api.roles
-                it.tenantId = tetantId
-                it.token = HmacUtil.HMACSHA256( token,api.secret)
+                it.tenantId = tenantId
+                it.token = HmacUtil.HMACSHA256(token, api.secret)
             }.also {
                 apiClientRepository.save(it)
             }
@@ -116,11 +107,14 @@
 
     @GetMapping(value = ["/authentication", "/authentication/{clientid}"])
     fun login(appid: String, secret: String, @PathVariable clientid: String?): ResponseEntity<Any> {
-        val requestId = if (clientid == null) appid else "$appid-$clientid"
+        val tenantId = TenantContextHolder.getContext().tenant?.id ?: TenantConstant.DEFAULT_TENANTID
+        val requestId = if (clientid == null) "$appid@$tenantId" else "$appid-$clientid@$tenantId"
+        val jwtSecret = tenantJwtconfigDao.default?.jwtSecret ?: ""  //TODO: jwt秘钥从数据库取
+
         return apiClientRepository.findById(requestId).let {
             if (it.isPresent && checkSecretToken(it.get(), secret)) {
                 apiClientRepository.deleteById(requestId)
-                val token = JwtTokenUtil(jwtConfig).generateToken(
+                val token = JwtTokenUtil(jwtConfig, jwtSecret).generateToken(
                         mapOf(Constants.JWT_CLAIM_UID to appid,
                                 "issuer" to "payapi",
                                 "audience" to (clientid ?: appid),
@@ -152,12 +146,14 @@
         if (!auth.startsWith(jwtConfig.tokenHeader)) {
             return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build()
         }
-        val jwt = JwtTokenUtil(jwtConfig).verifyToken(auth.substring(jwtConfig.tokenHeader.length))
+        val jwtSecret = tenantJwtconfigDao.default?.jwtSecret ?: ""  //TODO: jwt秘钥从数据库取
+
+        val jwt = JwtTokenUtil(jwtConfig, jwtSecret).verifyToken(auth.substring(jwtConfig.tokenHeader.length))
         val appid = jwt["uid"] as String
         return apiClientDao.findById(appid).let {
             if (it.isPresent && it.get().status == TradeDict.STATUS_NORMAL) {
                 // 新证书
-                val token = JwtTokenUtil(jwtConfig).generateToken(
+                val token = JwtTokenUtil(jwtConfig, jwtSecret).generateToken(
                         mapOf(Constants.JWT_CLAIM_UID to appid,
                                 "issuer" to "payapi",
                                 "audience" to jwt["audience"],
diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt
index 8fc1a55..e504f96 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt
@@ -5,6 +5,7 @@
 import com.supwisdom.dlpay.framework.core.JwtConfig
 import com.supwisdom.dlpay.framework.core.JwtTokenUtil
 import com.supwisdom.dlpay.framework.dao.ApiClientDao
+import com.supwisdom.dlpay.framework.dao.TenantJwtconfigDao
 import com.supwisdom.dlpay.framework.service.CommonService
 import com.supwisdom.dlpay.framework.util.StringUtil
 import com.supwisdom.dlpay.framework.util.TradeErrorCode
@@ -18,21 +19,14 @@
     lateinit var jwtConfig: JwtConfig
     @Autowired
     lateinit var apiClientDao: ApiClientDao
-
-    private var jwtUtil: JwtTokenUtil? = null
-
-    private fun getUtil(): JwtTokenUtil {
-        if (jwtUtil == null) {
-            jwtUtil = JwtTokenUtil((jwtConfig))
-        }
-        return jwtUtil as JwtTokenUtil
-    }
+    @Autowired
+    lateinit var tenantJwtconfigDao: TenantJwtconfigDao
 
     override fun getSystemVersion(): String {
         try {
             return Manifests.read("Restaurant-Version") ?: "version 1.0"
         } catch (ex: Exception) {
-            ex.printStackTrace()
+//            ex.printStackTrace()
             return "unknown"
         }
     }
@@ -40,7 +34,8 @@
     override fun getRequestAppid(request: HttpServletRequest): String {
         request.getHeader(jwtConfig.header).let {
             if (null != it && it.startsWith(jwtConfig.tokenHeader)) {
-                val claims = getUtil().verifyToken(it.substring(jwtConfig.tokenHeader.length))
+                val jwtSecret = tenantJwtconfigDao.default?.jwtSecret ?: ""  //TODO: jwt秘钥从数据库取
+                val claims = JwtTokenUtil(jwtConfig, jwtSecret).verifyToken(it.substring(jwtConfig.tokenHeader.length))
                 val uid = claims["uid"]?.toString()
                 if (!StringUtil.isEmpty(uid)) {
                     return uid as String
diff --git a/src/main/kotlin/com/supwisdom/dlpay/security.kt b/src/main/kotlin/com/supwisdom/dlpay/security.kt
index 8e9ffce..3c52376 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/security.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/security.kt
@@ -3,8 +3,8 @@
 import com.supwisdom.dlpay.framework.core.JwtConfig
 import com.supwisdom.dlpay.framework.core.JwtTokenUtil
 import com.supwisdom.dlpay.framework.core.PasswordBCryptConfig
+import com.supwisdom.dlpay.framework.dao.TenantJwtconfigDao
 import com.supwisdom.dlpay.framework.redisrepo.ApiJwtRepository
-import com.supwisdom.dlpay.framework.security.MyPermissionEvaluator
 import com.supwisdom.dlpay.framework.security.ValidateCodeSecurityConfig
 import com.supwisdom.dlpay.framework.service.OperatorDetailService
 import com.supwisdom.dlpay.framework.util.TradeDict
@@ -26,7 +26,6 @@
 import org.springframework.security.core.authority.SimpleGrantedAuthority
 import org.springframework.security.core.context.SecurityContextHolder
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
-import org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler
 import org.springframework.security.web.authentication.AuthenticationFailureHandler
 import org.springframework.security.web.authentication.AuthenticationSuccessHandler
 import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter
@@ -49,15 +48,8 @@
     @Autowired
     lateinit var apiJwtRepository: ApiJwtRepository
 
-    private var jwtUtil: JwtTokenUtil? = null
-
-
-    private fun getUtil(): JwtTokenUtil {
-        if (jwtUtil == null) {
-            jwtUtil = JwtTokenUtil((jwtConfig))
-        }
-        return jwtUtil as JwtTokenUtil
-    }
+    @Autowired
+    lateinit var tenantJwtconfigDao: TenantJwtconfigDao
 
     override fun doFilterInternal(request: HttpServletRequest, response: HttpServletResponse, filterChain: FilterChain) {
         request.getHeader(jwtConfig.header)?.let { authHeader ->
@@ -67,7 +59,8 @@
                 } else {
                     throw JoseException("JWT Header error")
                 }
-                val claims = getUtil().verifyToken(jwt)
+                val jwtSecret = tenantJwtconfigDao.default?.jwtSecret ?: ""  //TODO: jwt秘钥从数据库取
+                val claims = JwtTokenUtil(jwtConfig, jwtSecret).verifyToken(jwt)
                 apiJwtRepository.findById(claims["jti"].toString()).let {
                     if (!it.isPresent) {
                         throw JoseException("JWT has not been register")
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index a606a3a..90e2544 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -35,4 +35,10 @@
 restaurant.chkdtltask.cron=27 3/10 * * * ?
 # 统计任务
 restaurant.statement.cron=0 7/10 * * * ?
+# 客户信息校对任务
+restaurant.customercheck.cron=0 0/1 * * * ?
+# 流水入账任务
+restaurant.submitofflinedtl.cron=0 0/1 * * * ?
+# 查询流水状态任务
+restaurant.querydtlresult.cron=0 0/2 * * * ?
 
diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql
index aafc754..da059e5 100644
--- a/src/main/resources/data.sql
+++ b/src/main/resources/data.sql
@@ -513,6 +513,11 @@
 INSERT INTO "tb_businesspara" (parakey,paraval) VALUES ('customer.ignore', 'false');
 INSERT INTO "tb_businesspara" (parakey,paraval) VALUES ('discounttime.month', '0');
 
+-- 多租户jwt秘钥配置，不同的租户secret最好配置不同
+INSERT INTO "tb_tenant_jwtconfig"("id", "jwt_secret") VALUES ('main', 'DLLSHLomEbrM0lk+NMQZbHfSxaDU1wekjT+kiC3YzDw=');
+--INSERT INTO "tb_tenant_jwtconfig"("id", "jwt_secret") VALUES ('main', 'DLSZFLomEbrM0lk+NMQZbHfSxaDU1wekjT+kiC3YzDw=');
+commit;
+
 
 CREATE SEQUENCE SEQ_REFNO
 INCREMENT BY 1
