先創(chuàng)建服務(wù)端的APP
1.官網(wǎng)下載Winrun4j盈匾。?http://winrun4j.sourceforge.net/
2.打開winrun4j文件夾腾务。
打開bin目錄;
3.把服務(wù)端那個(gè)APP所需要的東西都復(fù)制到一塊
我們看下posapp.ini里邊配置:
到這一步威酒,就差不多了窑睁,可以跑跑這個(gè)EXE,看看能不能跑起來葵孤,如果跑不起來担钮,去看日志哪里有錯(cuò)誤,修改哪里
接下來再創(chuàng)建服務(wù)端APP注冊為windows服務(wù)的小玩意
1.我們看下service.ini的配置箫津,和APP的配置是不一樣的。
2.那么重點(diǎn)來了宰啦,這一步才是注冊為服務(wù)至關(guān)重要的一步苏遥,
文件夾里是這幾個(gè)bat命令:
3.如果想把該程序注冊為服務(wù),那么以管理員身份運(yùn)行這里的命令赡模,而不是去雙擊運(yùn)行service.exe,那樣是不對的
我們下面看下這幾個(gè)文件的內(nèi)容田炭,從上到下的四個(gè):
RegisterService32.bat--
StartService32.bat--
StopService32.bat--
UnregisterService32.bat--
然后以管理員身份,去執(zhí)行RegisterService32.bat這個(gè)bat漓柑,該程序就被注冊為Windows服務(wù)了教硫,去控制面板看下服務(wù)是否啟動(dòng),歐克啦
下面為代碼辆布,
注意注冊為服務(wù)的瞬矩,需要在項(xiàng)目中繼承 ?【winrun4j的AbstractService這個(gè)類】
我們可以看下這三個(gè)類的代碼:
APPServer類
package hyi.pos.appserver.server
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.google.gson.reflect.TypeToken
import com.j256.ormlite.dao.Dao
import com.j256.ormlite.dao.DaoManager
import com.j256.ormlite.dao.GenericRawResults
import com.j256.ormlite.jdbc.JdbcDatabaseConnection
import com.j256.ormlite.stmt.DeleteBuilder
import com.j256.ormlite.stmt.UpdateBuilder
import com.j256.ormlite.support.ConnectionSource
import com.j256.ormlite.support.DatabaseConnection
import com.j256.ormlite.table.TableUtils
import groovy.sql.Sql
import groovy.util.logging.Log4j
import hyi.pos.appclient.client.AppClient
import hyi.pos.appserver.server.ext.NoticeProcess
import hyi.pos.appserver.util.MposMasterCopy
import hyi.pos.db.DBUtil
import hyi.pos.entity.mpos.ApplyPlan
import hyi.pos.entity.mpos.MemberBase
import hyi.pos.entity.mpos.MemberCard
import hyi.pos.entity.mpos.Model注冊
import hyi.pos.entity.mpos.MposCardDtl
import hyi.pos.entity.mpos.MposCashier
import hyi.pos.entity.mpos.MposDiffSalesOrder
import hyi.pos.entity.mpos.MposDiningArea
import hyi.pos.entity.mpos.MposDiningTable
import hyi.pos.entity.mpos.MposItemSet
import hyi.pos.entity.mpos.MposJshopTranflow
import hyi.pos.entity.mpos.MposJshopTranpay
import hyi.pos.entity.mpos.MposJshopTransaction
import hyi.pos.entity.mpos.MposLineItem
import hyi.pos.entity.mpos.MposO2oPayDtl
import hyi.pos.entity.mpos.MposSalesOrder
import hyi.pos.entity.mpos.MposServerCommand
import hyi.pos.entity.mpos.MposShift
import hyi.pos.entity.mpos.MposShiftReport
import hyi.pos.entity.mpos.MposTakeOutTranflow
import hyi.pos.entity.mpos.MposTakeOutTransaction
import hyi.pos.entity.mpos.MposTicketDtl
import hyi.pos.entity.mpos.MposTransactionTender
import hyi.pos.entity.mpos.MposTrantaste
import hyi.pos.entity.mpos.PointExItem
import hyi.pos.entity.mpos.Ticket
import hyi.pos.entity.mpos.Voucher
import hyi.pos.pay.PayUtil
import hyi.pos.pay.einvoice.EInvoiceUtil
import hyi.pos.pay.member.MemberDao
import hyi.pos.pay.member.MemberUtil
import hyi.pos.print.PrintServer
import hyi.pos.entity.mpos.MposTransaction
import org.apache.log4j.PropertyConfigurator
import java.lang.reflect.Type
import java.sql.ResultSet
import java.sql.Types
import java.text.SimpleDateFormat
import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit
import java.util.concurrent.locks.Lock
import java.util.concurrent.locks.ReentrantLock
/**
* App Server for mobile POS app.
*
* Start up command:
* java -jar app_server.jar
*
* To Peeping Tom: Don't mess up my code :)
*
* @author Bruce You
* @since 2012/12/12
*/
@Log4j
class AppServer{
? ? static final def VERSION= '1.5.6'
? ? static int APP_SERVER_PORT= 3160
? ? static final def COLUMN_VALUE_SEPARATOR= '|' // Pipe, Broken vertical bar
? ? static PushServer pushServer
static ServerSocket server
static String transDirInConf
static String dbType
static String TABLE_PREFIX
static String serverType
/** Directory where device will upload its files that are going to get processed. */
? ? static String uploadDir
static def dbConf
static Lock lock= new ReentrantLock()
? ? static masterVersion= ""
? ? /**
* Dining table state transition rules in STL (State Transition Language).
* Example:
*
* stl = '0空桌 -> 1點(diǎn)餐中 <-> 2已點(diǎn)餐 <-> 3結(jié)賬中 -> 4已結(jié)賬 & 清桌中 -> 0空桌'
*
*
* The stlMap will be:
*
* [0:1, 1:2, 2:13, 3:24, 4:0]
*
* The key is the source state, the value is the states to which could be transferred.
*/
? ? static stlMap= [:]
? ? /**
* Create server socket and listen on port 3160.
*/
? ? static void serverLoop() {
? ? ? ? dbConf= new ConfigSlurper().parse(new File('conf/db.properties').toURI().toURL())
? ? ? ? server= new ServerSocket(APP_SERVER_PORT)
? ? ? ? log.info"App server starts up (Ver ${VERSION} port=${APP_SERVER_PORT})..."
? ? ? ? println"App server starts up (Ver ${VERSION} port=${APP_SERVER_PORT})..."
? ? ? ? getUploadDir2()
? ? ? ? for (; ;) {
? ? ? ? ? ? server.accept{ Socket socket ->
try {
? ? ? ? ? ? ? ? ? ? socket.setSoTimeout(dbConf.readTimeOut ?:67000)
? ? ? ? ? ? ? ? ? ? protocolLoop(socket)
? ? ? ? ? ? ? ? } catch (Throwable e) {
? ? ? ? ? ? ? ? ? ? log.warn'serverLoop> Server failed', e
}
}
}
}
? ? static Gson createGson() {
? ? ? ? new GsonBuilder().setDateFormat('yyyy-MM-dd HH:mm:ss.SSS').create()
? ? }
? ? //static String readUtf8Line(InputStream inputStream) {
//? ? new BufferedReader(new InputStreamReader(inputStream, "UTF-8")).readLine()
//}
? ? static String readLine(InputStream inputStream) throws IOException{
? ? ? ? //StringBuilder line = new StringBuilder(40);
? ? ? ? def byteBuffer= new ByteArrayOutputStream()
? ? ? ? boolean foundTerminator= false;
while (true) {
? ? ? ? ? ? int nextByte= inputStream.read();
switch (nextByte) {
? ? ? ? ? ? ? ? case -1:
//if (line.length() == 0 && !foundTerminator) {
? ? ? ? ? ? ? ? ? ? if (byteBuffer.size() == 0 && !foundTerminator) {
? ? ? ? ? ? ? ? ? ? ? ? return null;
}
? ? ? ? ? ? ? ? ? ? //return line.toString();
? ? ? ? ? ? ? ? ? ? return byteBuffer.toString('UTF-8')
? ? ? ? ? ? ? ? case /*(byte) '\r'*/ 0x0d:
if (foundTerminator) {
? ? ? ? ? ? ? ? ? ? ? ? ((PushbackInputStream) inputStream).unread(nextByte);
//return line.toString();
? ? ? ? ? ? ? ? ? ? ? ? return byteBuffer.toString('UTF-8')
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? foundTerminator= true;
/* Have to be able to peek ahead one byte */
? ? ? ? ? ? ? ? ? ? if (!(inputStream.getClass() == PushbackInputStream.class)) {
? ? ? ? ? ? ? ? ? ? ? ? inputStream= new PushbackInputStream(inputStream);
}
? ? ? ? ? ? ? ? ? ? break;
case /*(byte) '\n' */ 0x0a:
//return line.toString();
? ? ? ? ? ? ? ? ? ? return byteBuffer.toString('UTF-8')
? ? ? ? ? ? ? ? default:
if (foundTerminator) {
? ? ? ? ? ? ? ? ? ? ? ? ((PushbackInputStream) inputStream).unread(nextByte);
//return line.toString();
? ? ? ? ? ? ? ? ? ? ? ? return byteBuffer.toString('UTF-8')
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? //line.append((char) nextByte);
? ? ? ? ? ? ? ? ? ? byteBuffer.write(nextByte)
? ? ? ? ? ? }
}
}
? ? /**
* Server-side protocol handler dispatcher.
*/
? ? static void protocolLoop(Socket socket) {
? ? ? ? log.info"Device connect: ${socket.remoteSocketAddress}"
? ? ? ? socket.withStreams{ InputStream input, OutputStream output ->
def command
//def deviceId = ''
? ? ? ? ? ? def storeIdAndDeviceId= ''
? ? ? ? ? ? while ((command= readLine(input)) != null) {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? storeIdAndDeviceId= processCommand(socket, input, output, command)
? ? ? ? ? ? ? ? } catch (Exception e) {
? ? ? ? ? ? ? ? ? ? log.error("AppServer", e)
? ? ? ? ? ? ? ? } finally {
? ? ? ? ? ? ? ? ? ? // in case of unwritten data exists
? ? ? ? ? ? ? ? ? ? output.flush()
? ? ? ? ? ? ? ? }
}
? ? ? ? ? ? log.info"[${storeIdAndDeviceId}]Device disconnect: ${socket.remoteSocketAddress}"
? ? ? ? }
}
? ? static String processCommand(socket, input, output, command) {
? ? ? ? PrintWriter out= new PrintWriter(socket.getOutputStream());
//BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
? ? ? ? log.info"Server received: $command"
? ? ? ? System.out.println"Server received: $command"
? ? ? ? if (command.startsWith('ok'))
? ? ? ? ? ? return ''
? ? ? ? /*// Command format: {command} {store_id}_{device_id} [arguments...]
if (command.startsWith('ruok')) {
//心跳
output << 'ok\n'
return ''
}*/
? ? ? ? if (command.startsWith('generateMaster')) {//主檔制作
? ? ? ? ? ? def args= command.split(/\s/)
? ? ? ? ? ? def s= ''
? ? ? ? ? ? if (args.size() > 1) {
? ? ? ? ? ? ? ? s= args[1]
? ? ? ? ? ? }
? ? ? ? ? ? log.info"Response: ok"
? ? ? ? ? ? MposMasterCopy.main(s== '' ?null : s)
? ? ? ? ? ? if (MposMasterCopy.ok) {
? ? ? ? ? ? ? ? log.info"MposMasterCopy: ok"
? ? ? ? ? ? ? ? output<< 'ok\n'
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? log.info"MposMasterCopy: ng"
? ? ? ? ? ? ? ? output<< 'ng\n'
? ? ? ? ? ? }
? ? ? ? ? ? return '' // finish this session immediately
? ? ? ? }
? ? ? ? def args= command.split(/\s/)
? ? ? ? /*if (args.length < 2)
return ''*/
? ? ? ? def storeIdAndDeviceId= args[1]
? ? ? ? def storeIdAndDeviceIdArray= storeIdAndDeviceId.split(/_/)
? ? ? ? if (storeIdAndDeviceIdArray.length< 2) {
? ? ? ? ? ? log.error("Cannot process command: \"${command}\", store_id or device_id is missed.")
? ? ? ? ? ? return ''
? ? ? ? }
? ? ? ? def storeId= storeIdAndDeviceIdArray[0]
? ? ? ? //deviceId在pos server上是機(jī)號,在后臺server上是客戶編號
? ? ? ? def deviceId= storeIdAndDeviceIdArray[1]
? ? ? ? //會員和支付時(shí)是pos直連后臺server锋玲,需要客戶編號
? ? ? ? def custId= storeIdAndDeviceIdArray.length> 2 ? storeIdAndDeviceIdArray[2] :''
? ? ? ? switch (command) {
? ? ? ? ? ? case ~/DownLoad\s.*/:
def tableName= args[2];
if (tableName.equals('end')) {
? ? ? ? ? ? ? ? ? ? out.println('end');
out.flush();
break;
} else {
? ? ? ? ? ? ? ? ? ? File file= dumpTable storeId, deviceId, tableName
FileInputStream fis= new FileInputStream(file);
File files= new File("D:\\JAVA\\TabletPos\\mobilepos\\appclient\\tmp")
? ? ? ? ? ? ? ? ? ? FileOutputStream fos= new FileOutputStream(new File(files));
byte[] buffer= new byte[4096];
int c= 0;
while ((c= fis.read(buffer)) != -1) {
? ? ? ? ? ? ? ? ? ? ? ? for (int i= 0; i< c; i++)
? ? ? ? ? ? ? ? ? ? ? ? ? ? fos.write(buffer[i]);
System.out.println(c);
}
? ? ? ? ? ? ? ? ? ? fos.close();
fis.close();
out.println(files.absolutePath);
out.flush();
break;
}
? ? ? ? ? ? case ~/getTable\s.*/:
def tableName= args[2]
? ? ? ? ? ? ? ? if (args.size() > 2) {
? ? ? ? ? ? ? ? ? ? def columnName= args[3]
? ? ? ? ? ? ? ? ? ? def keyName= args.size() > 4 ? args[4] :""
? ? ? ? ? ? ? ? ? ? doGetTable storeId, deviceId, columnName, tableName, keyName, output, input
} else
? ? ? ? ? ? ? ? ? ? doGetTable storeId, deviceId, tableName, output, input
break
? ? ? ? ? ? case ~/getFile\s.*/:
//TODO: 根據(jù)店號決定如何找到這個(gè)文件
? ? ? ? ? ? ? ? if (args.size() < 3) {
? ? ? ? ? ? ? ? ? ? doGetFile2 storeId, deviceId, output, input
} else {
? ? ? ? ? ? ? ? ? ? def getFile= args[2] as File
doGetFile storeId, deviceId, getFile, output, input
}
? ? ? ? ? ? ? ? break
? ? ? ? ? ? case ~/putFile\s.*/:
//TODO: 根據(jù)店號決定這個(gè)文件的路徑
? ? ? ? ? ? ? ? def putFile= args[2] as File
doPutFile storeId, deviceId, putFile, output, input
break
? ? ? ? ? ? case ~/putObject\s.*/:
def objectClassName= args[2]
? ? ? ? ? ? ? ? def objectClass=
? ? ? ? ? ? ? ? ? ? ? ? objectClassName.endsWith('.MposDiningTable') ? MposDiningTable :
objectClassName.endsWith('.MposSalesOrder') ? MposSalesOrder :
objectClassName.endsWith('.MposItemSet') ? MposItemSet :
objectClassName.endsWith('.MposTransaction') ? MposTransaction :
objectClassName.endsWith('.MposShift') ? MposShift :
objectClassName.endsWith('.MposShiftReport') ? MposShiftReport :
objectClassName.endsWith('.MposServerCommand') ? MposServerCommand :
//objectClassName.endsWith('.Pos_shift') ? Pos_shift :
//objectClassName.endsWith('.Pos_tranflow') ? Pos_tranflow :
//objectClassName.endsWith('.Pos_tranhead') ? Pos_tranhead :
//objectClassName.endsWith('.Pos_tranpay') ? Pos_tranpay :
//objectClassName.endsWith('.Tc_Shift') ? Tc_Shift :
? ? ? ? ? ? ? ? ? ? ? ? (objectClassNameas Class)
? ? ? ? ? ? ? ? def numOfObjects= args[3].toInteger()
? ? ? ? ? ? ? ? doPutObject storeId, deviceId, objectClass, numOfObjects, output, input
break
? ? ? ? ? ? case ~/putFile2\s.*/:
putFile2 storeId, deviceId, output, input
break
? ? ? ? //case ~/deleteObject\s.*/:
//? ? def objectClassName = args[2]
//? ? def objectClass =
//? ? ? ? objectClassName.endsWith('.MposDiningTable') ? MposDiningTable :
//? ? ? ? objectClassName.endsWith('.MposSalesOrder') ? MposSalesOrder :
//? ? ? ? (objectClassName as Class)
//? ? def numOfObjects = args[3].toInteger()
//? ? doDeleteObject storeId, deviceId, objectClass, numOfObjects, output, input
//? ? break
? ? ? ? ? ? case ~/putObject2\s.*/:
doPutObject2 storeId, deviceId, args[2], args[3], args[4], output, input
break
? ? ? ? ? ? case ~/uploadLog\s.*/:
doUpLog storeId,deviceId,output,input
break
? ? ? ? ? ? case ~/getObject\s.*/:
def objectClassName= args[2]
? ? ? ? ? ? ? ? def objectClass=
? ? ? ? ? ? ? ? ? ? ? ? objectClassName.endsWith('.MposDiningArea') ? MposDiningArea :
objectClassName.endsWith('.MposSalesOrder') ? MposSalesOrder :
objectClassName.endsWith('.MposTransaction') ? MposTransaction :
objectClassName.endsWith('.MposShiftReport') ? MposShiftReport :
(objectClassNameas Class)
? ? ? ? ? ? ? ? def argument=
? ? ? ? ? ? ? ? ? ? ? ? objectClass== MposSalesOrder ? args[3] :// 如果要查詢點(diǎn)單數(shù)據(jù)景用,client端會帶上桌子id
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? objectClass== MposTransaction ? args[3] :// 如果要查詢歷史交易,client端會帶上桌子代號
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? objectClass== MposShiftReport ? args[3] :// 如果要查詢交班報(bào)表惭蹂,client端會帶上日期
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? null
? ? ? ? ? ? ? ? doGetObject storeId, deviceId, objectClass, argument, output, input
break
? ? ? ? ? ? case ~/getPosVersion\s.*/:
doGetPosVersion storeId, deviceId, output, input
break
? ? ? ? ? ? case ~/getApkVersion\s.*/:
doGetApkVersion storeId, deviceId, output, input
break
? ? ? ? ? ? case ~/ruok\s.*/:
String masterVersion= ""
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? String masterJosnData= ([serverType== 'HQ' ?"db/${custId}/${storeId}/master.json" :"db/master.json"] as File).text
masterVersion= masterJosnData.split("\n")[2].split("\":\"")[1].substring(0,19)//本地master版本
? ? ? ? ? ? ? ? } catch (Exception e) {}
? ? ? ? ? ? ? ? output<< "ok_${masterVersion}\n"
? ? ? ? ? ? ? ? def date= null
? ? ? ? ? ? ? ? if (args.length> 4) {
? ? ? ? ? ? ? ? ? ? date= "${args[4]} ${args[5]}"
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? upPosVersion custId, storeId, deviceId, args[2], args[3], date, output, input
break
? ? ? ? ? ? case ~/getMasterVersion\s.*/:
doGetMasterVersion storeId, deviceId, output, input
break
? ? ? ? ? ? case ~/checkSellOff\s.*/:
def pluno= args[2]
? ? ? ? ? ? ? ? checkSellOff storeId, deviceId, pluno, output, input
break
? ? ? ? ? ? case ~/getTransaction\s.*/:
def flowno= args[2]
? ? ? ? ? ? ? ? getTransaction storeId, deviceId, flowno, output, input
break
? ? ? ? ? ? case ~/getTransactionInfos\s.*/:
def diningTableCode= args[2]
? ? ? ? ? ? ? ? getTransactionInfos storeId, deviceId, diningTableCode, output, input
break
? ? ? ? ? ? case ~/getTransactionsAndShifts\s.*/:
def startDate= args[2]
? ? ? ? ? ? ? ? def endDate= args[3]
? ? ? ? ? ? ? ? getTransactionsAndShifts custId, storeId, deviceId, startDate, endDate, output, input
break
? ? ? ? ? ? case ~/getDiffSalesOrders\s.*/:
def period= args[2]
? ? ? ? ? ? ? ? getDiffSalesOrders deviceId, period, output, input
break
? ? ? ? ? ? case ~/getMposItemSets\s.*/:
def period= args[2]
? ? ? ? ? ? ? ? getMposItemSets storeId, deviceId, period, output, input
break
? ? ? ? ? ? case ~/getPlatformOrders\s.*/:
String uploadFlag= args[2]
? ? ? ? ? ? ? ? getPlatformOrders storeId, uploadFlag, output, input
break
? ? ? ? ? ? case ~/platformOrderUpdate\s.*/:
String flowno= args[2]
? ? ? ? ? ? ? ? String flag= args[3]
? ? ? ? ? ? ? ? platformOrderUpdate storeId, flowno, flag, output, input
break
? ? ? ? ? ? case ~/kitchenPlayUpdate\s.*/:
def id= args[2]
? ? ? ? ? ? ? ? kitchenPlayUpdate id, output, input
break
? ? ? ? ? ? case ~/putCombineTable\s.*/:
putCombineTable storeId, deviceId, output, input
break
? ? ? ? ? ? case ~/putSplitTable\s.*/:
putSplitTable storeId, deviceId, output, input
break
? ? ? ? ? ? case ~/getSalesOrders\s.*/:
def diningTableIds= args[2]
? ? ? ? ? ? ? ? getSalesOrders storeId, deviceId, diningTableIds, output, input
break
? ? ? ? ? ? case ~/o2oPay\s.*/:
if (!custId) {
? ? ? ? ? ? ? ? ? ? log.error("Cannot process command: \"${command}\", custId is missed.")
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? def data= args[2]
? ? ? ? ? ? ? ? getO2oPay custId, storeId, deviceId, data, output, input
break
? ? ? ? ? ? case ~/getMember\s.*/:
if (!custId) {
? ? ? ? ? ? ? ? ? ? log.error("Cannot process command: \"${command}\", custId is missed.")
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? def data= args[2]
? ? ? ? ? ? ? ? getMember custId, storeId, deviceId, data, output, input
break
? ? ? ? ? ? case ~/getMemberCard\s.*/:
if (!custId) {
? ? ? ? ? ? ? ? ? ? log.error("Cannot process command: \"${command}\", custId is missed.")
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? def data= args[2]
? ? ? ? ? ? ? ? getMemberCard custId, storeId, deviceId, data, output, input
break
? ? ? ? ? ? case ~/weiXinOpenMemberCard\s.*/:
if (!custId) {
? ? ? ? ? ? ? ? ? ? log.error("Cannot process command: \"${command}\", custId is missed.")
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? weiXinOpenMemberCard custId, storeId, args[2], args[3], args[4], args[5], args[6], output, input
break
? ? ? ? ? ? case ~/bindEntityCard\s.*/:
if (!custId) {
? ? ? ? ? ? ? ? ? ? log.error("Cannot process command: \"${command}\", custId is missed.")
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? }//custId, storeno, memberno, idCode, telNo, OutputStream output, InputStream input
? ? ? ? ? ? ? ? bindEntityCard custId, storeId, args[2], args[3], args[4], output, input
break
? ? ? ? ? ? case ~/registVerify\s.*/:
if (!custId) {
? ? ? ? ? ? ? ? ? ? log.error("Cannot process command: \"${command}\", custId is missed.")
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? registVerify custId, storeId, deviceId, args[2], args[3], args.length> 4 ? args[4] :'', output, input
break
? ? ? ? ? ? case ~/openMemberCard\s.*/:
if (!custId) {
? ? ? ? ? ? ? ? ? ? log.error("Cannot process command: \"${command}\", custId is missed.")
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? openMemberCard custId, storeId, deviceId, args[2], args[3], args[4], args[5], output, input
break
? ? ? ? ? ? case ~/changeMemberCard\s.*/:
if (!custId) {
? ? ? ? ? ? ? ? ? ? log.error("Cannot process command: \"${command}\", custId is missed.")
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? changeMemberCard custId, storeId, deviceId, args[2], args[3], args[4], args[5], output, input
break
? ? ? ? ? ? case ~/updateVipPwd\s.*/:
if (!custId) {
? ? ? ? ? ? ? ? ? ? log.error("Cannot process command: \"${command}\", custId is missed.")
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? updateVipPwd custId, storeId, deviceId, args[2], args[3], args[4], args[5], output, input
break
? ? ? ? ? ? case ~/updateMenberPoins\s.*/:
if (!custId) {
? ? ? ? ? ? ? ? ? ? log.error("Cannot process command: \"${command}\", custId is missed.")
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? updateMenberPoins custId, storeId, deviceId, args[2], args[3], args[4], args[5], output, input
break
? ? ? ? ? ? case ~/getApplyPlan\s.*/:
if (!custId) {
? ? ? ? ? ? ? ? ? ? log.error("Cannot process command: \"${command}\", custId is missed.")
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? getApplyPlan custId, storeId, deviceId, output, input
break
? ? ? ? ? ? case ~/getPointExItem\s.*/:
if (!custId) {
? ? ? ? ? ? ? ? ? ? log.error("Cannot process command: \"${command}\", custId is missed.")
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? getPointExItem custId, storeId, deviceId, args[2], output, input
break
? ? ? ? ? ? case ~/apply\s.*/:
if (!custId) {
? ? ? ? ? ? ? ? ? ? log.error("Cannot process command: \"${command}\", custId is missed.")
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? apply custId, storeId, deviceId, args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], output, input
break
? ? ? ? ? ? case ~/applyReturn\s.*/:
if (!custId) {
? ? ? ? ? ? ? ? ? ? log.error("Cannot process command: \"${command}\", custId is missed.")
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? applyReturn custId, storeId, deviceId, args[2], args[3], args[4], args[5], args[6], output, input
break
? ? ? ? ? ? case ~/getVoucher\s.*/:
if (!custId) {
? ? ? ? ? ? ? ? ? ? log.error("Cannot process command: \"${command}\", custId is missed.")
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? getVoucher custId, storeId, deviceId, args[2], output, input
break
? ? ? ? ? ? case ~/getReturnAmount\s.*/:
if (!custId) {
? ? ? ? ? ? ? ? ? ? log.error("Cannot process command: \"${command}\", custId is missed.")
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? getReturnAmount custId, storeId, deviceId, args[2], args[3], output, input
break
? ? ? ? ? ? case ~/pay\s.*/:
if (!custId) {
? ? ? ? ? ? ? ? ? ? log.error("Cannot process command: \"${command}\", custId is missed.")
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? pay custId, storeId, deviceId, args[2], args[3], args[4], output, input
break
? ? ? ? ? ? case ~/pay2\s.*/:
if (!custId) {
? ? ? ? ? ? ? ? ? ? log.error("Cannot process command: \"${command}\", custId is missed.")
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? pay2 custId, storeId, deviceId, args[2], args[3], args[4], output, input
break
? ? ? ? ? ? case ~/integral\s.*/:
if (!custId) {
? ? ? ? ? ? ? ? ? ? log.error("Cannot process command: \"${command}\", custId is missed.")
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? integral(custId, storeId, deviceId, output, input)
? ? ? ? ? ? ? ? break
? ? ? ? ? ? case ~/integralToMoney\s.*/:
if (!custId) {
? ? ? ? ? ? ? ? ? ? log.error("Cannot process command: \"${command}\", custId is missed.")
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? integralToMoney(custId, storeId, deviceId, args[2], args[3], output, input)
? ? ? ? ? ? ? ? break
? ? ? ? ? ? case ~/getTicket\s.*/:
if (!custId) {
? ? ? ? ? ? ? ? ? ? log.error("Cannot process command: \"${command}\", custId is missed.")
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? getTicket custId, storeId, deviceId, args[2], output, input
break
? ? ? ? ? ? case ~/loseCard\s.*/:
if (!custId) {
? ? ? ? ? ? ? ? ? ? log.error("Cannot process command: \"${command}\", custId is missed.")
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? loseCard custId, storeId, deviceId, args[2], args[3], args[4], output, input
case ~/getAccDate\s.*/:
String accDate= getAccDate(storeId)
? ? ? ? ? ? ? ? log.info("${storeId} accDate = ${accDate}")
? ? ? ? ? ? ? ? output<< "${accDate}\n"
? ? ? ? ? ? ? ? break
? ? ? ? ? ? case ~/updateAccDate\s.*/:
updateAccdate(args[2], args[3], args[4], args[5], storeId, custId)
? ? ? ? ? ? ? ? break
? ? ? ? ? ? case ~/notice\s.*/:
(new NoticeProcess()).process(input, output, storeId, deviceId, args)
? ? ? ? ? ? ? ? break
? ? ? ? ? ? case ~/getEInvoice\s.*/:
getEInvoice(custId, storeId, deviceId, args.length> 2 ? args[2] :'', output, input)
? ? ? ? ? ? ? ? break
? ? ? ? ? ? case ~/checkObject\s.*/:
def objectClassName= args[2]
? ? ? ? ? ? ? ? def objectClass=
? ? ? ? ? ? ? ? ? ? ? ? objectClassName.endsWith('.MposDiningTable') ? MposDiningTable :
(objectClassNameas Class)
? ? ? ? ? ? ? ? doCheckObject storeId, deviceId, objectClass, output, input
break
? ? ? ? ? ? case ~/updateMemberMemo4\s.*/:
updateMemberMemo4 custId, storeId, deviceId, args[2], args[3], output, input
break
? ? ? ? ? ? default:
output<< "Response: ${command}\n"
? ? ? ? }
? ? ? ? return storeIdAndDeviceId
}
static? void doUpLog(storeId,deviceId,OutputStream output,InputStream input) {
? ? DataInputStream dataInputStream= new DataInputStream(input);
File file= new File("log\\" + storeId+ "-" + deviceId);
/* if (!file.exists()){
file.mkdir();
}*/
? ? FileOutputStream fileOutputStream1= new FileOutputStream(file);
byte[] bytes= new byte[51200];
int length= 0;
while ((length= dataInputStream.read(bytes)) != -1) {
? ? ? ? fileOutputStream1.write(bytes,0,length);
fileOutputStream1.flush();
}
? ? fileOutputStream1.close();
dataInputStream.close();
}
? ? static void doCheckObject(storeId, deviceId, objectClass, OutputStream output, InputStream input) {
? ? ? ? log.info"[${storeId}_${deviceId}]Going to get ${objectClass.toString()}objects"
? ? ? ? String objectsInJSON= readLine(input)
? ? ? ? log.info"[${storeId}_${deviceId}]Receive: ${objectsInJSON}"
? ? ? ? def gson= createGson()
? ? ? ? if (objectClass== MposDiningTable) { // 桌子狀態(tài)更新上傳
? ? ? ? ? ? Type collectionType= new TypeToken>(){}.getType()
? ? ? ? ? ? List diningTables= gson.fromJson(objectsInJSON, collectionType)
? ? ? ? ? ? def connSrc= getDbConnection(false)
? ? ? ? ? ? def dao= DaoManager.createDao(connSrc, MposDiningTable)
? ? ? ? ? ? def errResponse= checkDiningTableState(dao, diningTables)
? ? ? ? ? ? if (errResponse) {
? ? ? ? ? ? ? ? output<< errResponse+ "\n"
? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Send: $errResponse"
? ? ? ? ? ? ? ? return
? ? ? ? ? ? }
}
? ? ? ? output<< 'ok\n'
? ? ? ? log.info"[${storeId}_${deviceId}]Send: ok"
? ? }
? ? //下單時(shí)檢查桌子是否是空桌
? ? static String checkDiningTableState(Dao dao, List diningTables) {
? ? ? ? for (diningTablein diningTables) {
? ? ? ? ? ? def origDiningTable= dao.queryForId(diningTable.fId)
? ? ? ? ? ? def sourceState= origDiningTable.state
def targetState= diningTable.state
if (sourceState!= targetState) {
? ? ? ? ? ? ? ? // reject the transition
? ? ? ? ? ? ? ? def response= "ng Reject the dinging table state from $sourceState to $targetState"
? ? ? ? ? ? ? ? return response
}
}
? ? ? ? return null
? ? }
? ? //更新營業(yè)日期
? ? static void updateAccdate(accdate, shiftNumber, begFlowNo, endFlowNo, storeId, custId) {
? ? ? ? log.info("updateAccdate ${accdate} ${shiftNumber} ${begFlowNo} ${endFlowNo} ${storeId}")
? ? ? ? def transDb= getDbConnection(false)
? ? ? ? def tdao= DaoManager.createDao(transDb, MposTicketDtl)
? ? ? ? tdao.callBatchTasks{
? ? ? ? ? ? UpdateBuilder tupdateBuilder= tdao.updateBuilder()
? ? ? ? ? ? tupdateBuilder.updateColumnValue('Accdate', accdate).where().eq('custId', custId).and().eq('WarehouseID', storeId).and().between('Flowno', begFlowNo, endFlowNo)
? ? ? ? ? ? tupdateBuilder.update()
? ? ? ? ? ? def odao= DaoManager.createDao(transDb, MposO2oPayDtl)
? ? ? ? ? ? UpdateBuilder oupdateBuilder= odao.updateBuilder()
? ? ? ? ? ? oupdateBuilder.updateColumnValue('Accdate', accdate).where().eq('custId', custId).and().eq('Warehouseid', storeId).and().between('Flowno', begFlowNo, endFlowNo)
? ? ? ? ? ? oupdateBuilder.update()
? ? ? ? ? ? def cdao= DaoManager.createDao(transDb, MposCardDtl)
? ? ? ? ? ? UpdateBuilder cupdateBuilder= cdao.updateBuilder()
? ? ? ? ? ? cupdateBuilder.updateColumnValue('Accdate', accdate).where().eq('custId', custId).and().eq('Warehouseid', storeId).and().between('Flowno', begFlowNo, endFlowNo)
? ? ? ? ? ? cupdateBuilder.update()
? ? ? ? ? ? def ldao= DaoManager.createDao(transDb, MposLineItem)
? ? ? ? ? ? UpdateBuilder iupdateBuilder= ldao.updateBuilder()
? ? ? ? ? ? iupdateBuilder.updateColumnValue('AccDate', accdate).where().eq('custId', custId).and().eq('WarehouseID', storeId).and().between('flowno', begFlowNo, endFlowNo)
? ? ? ? ? ? iupdateBuilder.update()
? ? ? ? ? ? def ttdao= DaoManager.createDao(transDb, MposTransactionTender)
? ? ? ? ? ? UpdateBuilder ttupdateBuilder= ttdao.updateBuilder()
? ? ? ? ? ? ttupdateBuilder.updateColumnValue('Accdate', accdate).where().eq('custId', custId).and().eq('WarehouseID', storeId).and().between('flowno', begFlowNo, endFlowNo)
? ? ? ? ? ? ttupdateBuilder.update()
? ? ? ? ? ? def tsdao= DaoManager.createDao(transDb, MposTransaction)
? ? ? ? ? ? UpdateBuilder tstupdateBuilder= tsdao.updateBuilder()
? ? ? ? ? ? tstupdateBuilder.updateColumnValue('Accdate', accdate).where().eq('custId', custId).and().eq('Warehouseid', storeId).and().between('Flowno', begFlowNo, endFlowNo)
? ? ? ? ? ? tstupdateBuilder.update()
? ? ? ? ? ? def dao= DaoManager.createDao(transDb, MposShiftReport)
? ? ? ? ? ? UpdateBuilder updateBuilder= dao.updateBuilder()
? ? ? ? ? ? updateBuilder.updateColumnValue('Accdate', accdate).where().eq('custId', custId).and().eq('warehouseId', storeId).and().eq('flowno', shiftNumber)
? ? ? ? ? ? updateBuilder.update()
? ? ? ? ? ? def sao= DaoManager.createDao(transDb, MposShift)
? ? ? ? ? ? UpdateBuilder supdateBuilder= sao.updateBuilder()
? ? ? ? ? ? supdateBuilder.updateColumnValue('fAccDate',new SimpleDateFormat('yyyy-MM-dd').parse(accdate)).where().eq('custId', custId).and().eq('warehouseId', storeId).and().eq('fShift', shiftNumber)
? ? ? ? ? ? supdateBuilder.update()
? ? ? ? }
}
? ? /**
* 掛失/解掛
*? 接收
*? idCode 卡識別號
*? type 狀態(tài)(1:掛失伞插,2:解掛)
*? 返回
*? ok 掛失/解掛成功
*? ng 掛失/解掛失敗
*/
? ? static void loseCard(custId, storeId, deviceId, idCode, type, cashierNumber, OutputStream output, InputStream input) {
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Going to get loseCard of ${idCode} ${type}"
? ? ? ? def connSrc= getDbConnection()
? ? ? ? String result= MemberUtil.loseCard(custId, idCode, type, cashierNumber, connSrc)
? ? ? ? output<< "${result}"
? ? }
? ? /**
* 通過禮劵編號查詢
*? 接收
*? code 禮劵編號
*
*? 返回
*? Ticket對象, Ticket對象包含TicketBatch
*/
? ? static void getTicket(custId, storeId, deviceId, code, OutputStream output, InputStream input) {
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Going to get getTicket of ${code}"
? ? ? ? def connSrc= getDbConnection()
? ? ? ? Ticket ticket= MemberDao.queryTicketByCode(custId, code, connSrc)
? ? ? ? def gson= createGson()
? ? ? ? def json= gson.toJson(ticket)
? ? ? ? output<< json
output<< '\n'
? ? ? ? output.flush()
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Send ${Ticket.simpleName}: ${json}"
? ? ? ? def response= readLine(input)
? ? ? ? if (response)
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Client response: ${response}"
? ? ? ? else
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Client disconnected."
? ? }
? ? /**
* 禮券消費(fèi)扣款
*? 接收
*? code 禮券編號
*? amount 扣款金額,禮券允許多次使用時(shí)填要扣的金額,如果是一次性則填0
*? cashierNumber 操作員
*? transactions 交易數(shù)據(jù)
*
*? 返回
*? ok_XX 扣款成功,XX表示扣款金額,允許溢收
*? ng 扣款失敗,數(shù)據(jù)插入失敗
*? noUse 扣款失敗,不滿足扣款條件
*? Ticket 禮券不存在
*? status_8 禮券已注銷
*
*/
? ? static void pay2(custId, storeId, deviceId, code, amount, cashierNumber, OutputStream output, InputStream input) {
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}] pay2 ${code}"
? ? ? ? String objectsInJSON= readLine(input)
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Receive: ${objectsInJSON}"
? ? ? ? Type collectionType= new TypeToken>() {}.getType()
? ? ? ? def gson= createGson()
? ? ? ? List transactions= gson.fromJson(objectsInJSON, collectionType)
? ? ? ? if (transactions) {
? ? ? ? ? ? def connSrc= getDbConnection()
? ? ? ? ? ? String result= MemberUtil.pay2(custId, storeId, code, amountas BigDecimal, transactions.get(0), cashierNumber, connSrc)
? ? ? ? ? ? output<< "${result}"
? ? ? ? } else {
? ? ? ? ? ? output<< 'ng\n'
? ? ? ? }
}
? ? /**
* 會員儲值卡消費(fèi)扣款
*? 接收
*? idCode 卡識別卡號
*? amount 扣款金額,退金額填負(fù)數(shù)
*? cashierNumber 操作員
*? transactions 交易數(shù)據(jù)
*
*? 返回
*? ok 扣款成功
*? ng 扣款失敗,數(shù)據(jù)插入失敗
*? Member 扣款失敗,找不到會員卡/會員錢包/錢包使用規(guī)則
*? noUse 扣款失敗,不滿足扣款條件
*? noBalance 余額不足
*/
? ? static void pay(custId, storeId, deviceId, idCode, amount, cashierNumber, OutputStream output, InputStream input) {
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}] pay ${idCode} ${amount} "
? ? ? ? String objectsInJSON= readLine(input)
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Receive: ${objectsInJSON}"
? ? ? ? Type collectionType= new TypeToken>() {}.getType()
? ? ? ? def gson= createGson()
? ? ? ? List transactions= gson.fromJson(objectsInJSON, collectionType)
? ? ? ? if (transactions) {
? ? ? ? ? ? def connSrc= getDbConnection()
? ? ? ? ? ? String result= MemberUtil.pay(custId, storeId, idCode, amountas BigDecimal, transactions.get(0), cashierNumber, connSrc)
? ? ? ? ? ? output<< "${result}"
? ? ? ? } else {
? ? ? ? ? ? output<< 'ng\n'
? ? ? ? }
}
? ? /**
* 計(jì)算積分
*
*? 返回
*? 本次積分或0(0積分或計(jì)算積分失敗)
*/
? ? static void integral(custId, storeId, deviceId, OutputStream output, InputStream input) {
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}] integral "
? ? ? ? String objectsInJSON= readLine(input)
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Receive: ${objectsInJSON}"
? ? ? ? Type collectionType= new TypeToken>() {}.getType()
? ? ? ? def gson= createGson()
? ? ? ? List transactions= gson.fromJson(objectsInJSON, collectionType)
? ? ? ? if (transactions) {
? ? ? ? ? ? def connSrc= getDbConnection()
? ? ? ? ? ? String result= MemberUtil.integral(custId, storeId, transactions.get(0), connSrc)
? ? ? ? ? ? output<< "${result}"
? ? ? ? } else {
? ? ? ? ? ? output<< '0\n'
? ? ? ? }
}
? ? /**
* 積分抵扣
*? 接收
*? vipNo 會員號或手機(jī)號
*? inputMoney 輸入的抵扣金額
*? transactions 交易數(shù)據(jù)
*
*? 返回
*? ok 支付成功
*? ng 支付失敗?
*? noIntegral 積分不足
*/
? ? static void integralToMoney(custId, storeId, deviceId, vipNo, inputMoney, OutputStream output, InputStream input) {
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}] integralToMoney "
? ? ? ? String objectsInJSON= readLine(input)
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Receive: ${objectsInJSON}"
? ? ? ? Type collectionType= new TypeToken>() {}.getType()
? ? ? ? def gson= createGson()
? ? ? ? List transactions= gson.fromJson(objectsInJSON, collectionType)
? ? ? ? if (transactions) {
? ? ? ? ? ? def connSrc= getDbConnection()
? ? ? ? ? ? String result= MemberUtil.integralToMoney(custId, storeId, vipNo, inputMoney, transactions.get(0), connSrc)
? ? ? ? ? ? output<< "${result}"
? ? ? ? } else {
? ? ? ? ? ? output<< 'ng\n'
? ? ? ? }
}
? ? /**
* 獲取會員可退金額
*? 接收
*? idCode 卡識別卡號
*? eWalletType 錢包類型
*
*? 返回
*? ok_XX 獲取可退金額成功,XX表示可退金額
*? ng 獲取可退金額失敗,數(shù)據(jù)插入失敗
*
*/
? ? static void getReturnAmount(custId, storeId, deviceId, idCode, eWalletType, OutputStream output, InputStream input) {
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}] getReturnAmount ${idCode} ${eWalletType}"
? ? ? ? def connSrc= getDbConnection()
? ? ? ? String result= MemberUtil.getReturnAmount(custId, idCode, eWalletType, connSrc)
? ? ? ? output<< "${result}"
? ? }
? ? /**
* 通過交易號查詢會員充值憑證
*? 接收
*? flowNo 交易號
*
*? 返回
*? Voucher對象, Voucher對象中包含List
*/
? ? static void getVoucher(custId, storeId, deviceId, flowNo, OutputStream output, InputStream input) {
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Going to get getVoucher of ${flowNo}"
? ? ? ? def connSrc= getDbConnection()
? ? ? ? Voucher voucher= MemberDao.queryVoucherByFlowNo(custId, storeId, flowNo, connSrc)
? ? ? ? def gson= createGson()
? ? ? ? def json= gson.toJson(voucher)
? ? ? ? output<< json
output<< '\n'
? ? ? ? output.flush()
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Send ${Voucher.simpleName}: ${json}"
? ? ? ? def response= readLine(input)
? ? ? ? if (response)
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Client response: ${response}"
? ? ? ? else
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Client disconnected."
? ? }
? ? /**
* 會員充值/充值退款
*? 接收
*? idCode 卡識別卡號
*? eWalletType 錢包類型
*? planNo 充值方案編號,如果是手輸金額或退款,則填0即可
*? payment 支付代號:支付金額金額,多種支付方式用英文逗號隔開,例如【A:100,B:100】 退款時(shí)金額加負(fù)號
*? amount 充值總金額/充值總次數(shù)? 退款時(shí)金額加負(fù)號
*? unitPrice 計(jì)次錢包充值時(shí),帶上單價(jià),其它情況填0即可
*? flowNo pos交易序號
*
*? 返回
*? ok_XX 充值成功,XX表示充值憑證編號
*? ng 充值失敗,數(shù)據(jù)插入失敗
*? Member 充值失敗,找不到會員卡/會員錢包/錢包使用規(guī)則
*? charge 充值失敗,錢包不允許充值
*? cardStatus_XX 充值失敗,會員卡或會員錢包不可用, XX表示卡或錢包狀態(tài)
*/
? ? static void apply(custId, storeId, deviceId, idCode, eWalletType, planNo, payment, amount, unitPrice, cashierNumber, flowNo, OutputStream output, InputStream input) {
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}] apply ${idCode} ${eWalletType} ${planNo} ${amount} ${unitPrice} ${flowNo}"
? ? ? ? def connSrc= getDbConnection()
? ? ? ? String result= MemberUtil.apply(custId, storeId, deviceId, idCode, eWalletType, planNo, payment, amount, unitPrice, cashierNumber, flowNo, connSrc)
? ? ? ? output<< "${result}\n"
? ? }
? ? /**
* 會員充值退貨
*? 接收
*? payment 支付代號:支付金額金額,多種支付方式用英文逗號隔開,例如【A:100,B:100】 退款時(shí)金額加負(fù)號
*? amount 充值總金額/充值總次數(shù)? 退款時(shí)金額加負(fù)號
*? flowno 充值退貨的交易號
*? rtnFlowno 原充值交易號
*? 返回
*? ok_XX 充值退貨成功,XX表示充值憑證編號
*? ng 充值退貨失敗,數(shù)據(jù)插入失敗
*? Member 充值退貨失敗,找不到會員卡/會員錢包/錢包使用規(guī)則
*? Balance 充值退貨失敗,錢包余額不夠
*/
? ? static void applyReturn(custId, storeId, deviceId, payment, amount, cashierNumber, flowno, rtnFlowno, OutputStream output, InputStream input) {
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}] applyReturn ${payment}? ${amount} ${flowno} ${rtnFlowno}"
? ? ? ? def connSrc= getDbConnection()
? ? ? ? String result= MemberUtil.applyReturn(custId, storeId, deviceId, payment, amount,? cashierNumber,flowno, rtnFlowno, connSrc)
? ? ? ? output<< "${result}\n"
? ? }
? ? /**
* 獲取會員充值方案
*
*? 返回
*? List
*/
? ? static void getApplyPlan(custId, storeId, deviceId, OutputStream output, InputStream input) {
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}] getApplyPlan"
? ? ? ? def connSrc= getDbConnection()
? ? ? ? List applyPlanList= MemberDao.queryApplyPlan(custId, storeId, connSrc)
? ? ? ? def gson= createGson()
? ? ? ? def json= gson.toJson(applyPlanList)
? ? ? ? output<< json
output<< '\n'
? ? ? ? output.flush()
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Send ${MemberCard.simpleName}: ${json}"
? ? ? ? def response= readLine(input)
? ? ? ? if (response)
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Client response: ${response}"
? ? ? ? else
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Client disconnected."
? ? }
? ? /**
* 獲取積分兌換方案
*
*? 返回
*? List
*/
? ? static void getPointExItem(custId, storeId, deviceId, point, OutputStream output, InputStream input) {
? ? ? ? log.info"[${custId}_${storeId}_${deviceId} ${point}] getApplyPlan"
? ? ? ? def connSrc= getDbConnection()
? ? ? ? List pointExItem= MemberDao.queryPointExItem(Integer.valueOf(point), connSrc)
? ? ? ? def gson= createGson()
? ? ? ? def json= gson.toJson(pointExItem)
? ? ? ? output<< json
output<< '\n'
? ? ? ? output.flush()
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Send ${MemberCard.simpleName}: ${json}"
? ? ? ? def response= readLine(input)
? ? ? ? if (response)
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Client response: ${response}"
? ? ? ? else
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Client disconnected."
? ? }
? ? /**
* 會員換卡
*? 接收
*? oldIdCode 舊卡識別卡號
*? idCode? 新卡識別卡號
*
*? 返回
*? ok 換卡成功
*? password 換卡失敗,密碼錯(cuò)誤
*? ng 換卡失敗,數(shù)據(jù)插入失敗
*? OldMemberCard 換卡失敗,舊卡不存在
*? cardStatus_XX 換卡失敗,新會員卡已經(jīng)存在, XX表示卡狀態(tài)
*/
? ? static void changeMemberCard(custId, storeId, deviceId, oldIdCode, idCode, password, cashierNumber, OutputStream output, InputStream input) {
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]changeMemberCard ${oldIdCode} ${idCode} ${cashierNumber}"
? ? ? ? def connSrc= getDbConnection()
? ? ? ? //換卡
? ? ? ? int result= MemberUtil.changeMemberCard(custId, storeId, oldIdCode, idCode, password, cashierNumber, connSrc)
? ? ? ? if (result== 0) {
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}] changeMemberCard ok."
? ? ? ? ? ? output<< 'ok\n'
? ? ? ? } else if (result== -1) {
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}] changeMemberCard ng."
? ? ? ? ? ? output<< 'ng\n'
? ? ? ? } else if (result== -2) {
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}] changeMemberCard password error."
? ? ? ? ? ? output<< 'password\n'
? ? ? ? } else if (result== 1) {
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}] changeMemberCard old MemberCard null."
? ? ? ? ? ? output<< 'OldMemberCard\n'
? ? ? ? } else {
? ? ? ? ? ? int cardStatus= result- 2
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}] changeMemberCard new memberCard.cardStatus = ${cardStatus}."
? ? ? ? ? ? output<< "cardStatus_${result}\n"
? ? ? ? }
}
? ? /**
* 修改會員密碼
*? 接收
*? oldIdCode 舊卡識別卡號
*? newPwd? 新密碼
*
*? 返回
*? ok 修改成功
*? password 修改失敗,密碼錯(cuò)誤
*? ng 修改失敗,數(shù)據(jù)插入失敗
*? OldMemberCard 修改失敗,卡號不存在
*/
? ? static void updateVipPwd(custId, storeId, deviceId, oldIdCode, newPwd, password, cashierNumber, OutputStream output, InputStream input) {
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]updateVipPwd ${oldIdCode} ${newPwd} ${cashierNumber}"
? ? ? ? def connSrc= getDbConnection()
? ? ? ? //修改會員密碼
? ? ? ? int result= MemberUtil.updateVipPwd(custId, storeId, oldIdCode, newPwd, password, cashierNumber, connSrc)
? ? ? ? if (result== 0) {
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}] updateVipPwd ok."
? ? ? ? ? ? output<< 'ok\n'
? ? ? ? } else if (result== -1) {
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}] updateVipPwd ng."
? ? ? ? ? ? output<< 'ng\n'
? ? ? ? } else if (result== -2) {
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}] updateVipPwd password error."
? ? ? ? ? ? output<< 'password\n'
? ? ? ? } else {
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}] updateVipPwd old updateVipPwd null."
? ? ? ? ? ? output<< 'OldMemberCard\n'
? ? ? ? }
}
? ? /**
* 修改會員積分
*? 接收
*? oldIdCode 卡識別卡號
*
*? 返回
*? ok 修改成功
*? ng 修改失敗,數(shù)據(jù)插入失敗
*/
? ? static void updateMenberPoins(custId, storeId, deviceId, point, vipNo, cashierNumber, flowNo, OutputStream output, InputStream input) {
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]updateVipPwd ${point} ${vipNo} ${cashierNumber}"
? ? ? ? def connSrc= getDbConnection()
? ? ? ? //修改會員積分
? ? ? ? int result= MemberUtil.updateMenberPoins(custId, storeId, point, vipNo, cashierNumber, flowNo, connSrc)
? ? ? ? if (result== 0) {
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}] updateVipPwd ok."
? ? ? ? ? ? output<< 'ok\n'
? ? ? ? } else {
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}] updateVipPwd old updateVipPwd null."
? ? ? ? ? ? output<< 'ng\n'
? ? ? ? }
}
? ? /**
* 修改會員支付憑證
*? 接收
*? memberno 會員事情
*? memo4 支付憑證
*
*? 返回
*? ok 修改成功
*? ng 修改失敗,數(shù)據(jù)插入失敗
*
*/
? ? static void updateMemberMemo4(custId, storeId, deviceId, memberno, memo4, OutputStream output, InputStream input) {
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]updateMemberMemo4 ${memberno} ${memo4} "
? ? ? ? def connSrc= getDbConnection()
? ? ? ? MemberBase memberBase= MemberDao.queryMemberByMemberNo(custId, memberno, connSrc)
? ? ? ? if (memberBase) {
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]updateMemberMemo4? memberBase"
? ? ? ? ? ? memberBase.memo4= memo4
if (MemberDao.updateMemberIntegral(memberBase, connSrc)) {
? ? ? ? ? ? ? ? output<< 'ok\n'
? ? ? ? ? ? ? ? return
? ? ? ? ? ? }
}
? ? ? ? output<< 'ng\n'
? ? ? ? return
? ? }
? ? /**
* 微信會員開卡
*? 接收
*? memberno 會員ID(微信識別碼)
*? idCode 微信會員卡編號
*? chipNumber 微信會員卡code
*? telNo 聯(lián)系電話
*? memName 姓名
*? sex 性別
*? birthdate 生日
*
*? 返回
*? ok 開卡成功
*? ng 開卡失敗,數(shù)據(jù)插入失敗
*? EWallet 開卡失敗,后臺未設(shè)置錢包規(guī)則
*? cardStatus_XX 開卡失敗,會員卡已經(jīng)存在, XX表示卡狀態(tài)
*
*/
? ? static void weiXinOpenMemberCard(custId, storeno, memberno, idCode, chipNumber, telNo, memName, sex, birthdate, OutputStream output, InputStream input) {
? ? ? ? log.info"[${custId}_${storeno}_${memberno}]weiXinOpenMemberCard ${idCode} ${telNo} ${memName} ${sex} ${birthdate}"
? ? ? ? def connSrc= getDbConnection()
? ? ? ? //開卡
? ? ? ? def isDoubleMember= dbConf.isDoubleMember ?:'1'
? ? ? ? int result= MemberUtil.weiXinOpenMemberCard custId, storeno, memberno, idCode, chipNumber, telNo, memName, sex, birthdate, isDoubleMember, connSrc
if (result== 0) {
? ? ? ? ? ? log.info"[${custId}_${storeno}_${memberno}] weiXinOpenMemberCard ok."
? ? ? ? ? ? output<< 'ok\n'
? ? ? ? } else if (result== 1) {
? ? ? ? ? ? log.info"[${custId}_${storeno}_${memberno}] weiXinOpenMemberCard EWallet null."
? ? ? ? ? ? output<< 'EWallet\n'
? ? ? ? } else if (result== -2) {
? ? ? ? ? ? log.info"[${custId}_${storeno}_${memberno}] weiXinOpenMemberCard member exist."
? ? ? ? ? ? output<< 'exist\n'
? ? ? ? } else if (result== -1) {
? ? ? ? ? ? log.info"[${custId}_${storeno}_${memberno}] weiXinOpenMemberCard ng."
? ? ? ? ? ? output<< 'ng\n'
? ? ? ? } else {
? ? ? ? ? ? int cardStatus= result- 2
? ? ? ? ? ? log.info"[${custId}_${storeno}_${memberno}] weiXinOpenMemberCard memberCard.cardStatus = ${cardStatus}."
? ? ? ? ? ? output<< "cardStatus_${result}\n"
? ? ? ? }
}
? ? /**
* 綁定實(shí)體卡
*? 接收
*? idCode 微信會員卡號
*? memberno 會員號
*? custId 客戶號
*? storeno 店號
*
*? 返回
*? ok 綁定成功
*? ng 綁定失敗
*? noMemberCard 沒有找到會員卡
*? noMember 沒有找到會員
*? cardStatus_XX 會員卡狀態(tài)不正常, XX表示卡狀態(tài)
*? memberStatus_XX 會員狀態(tài)不正常, XX表示會員狀態(tài)
*
*/
? ? static void bindEntityCard(custId, storeno, memberno, idCode, OutputStream output, InputStream input) {
? ? ? ? log.info"[${custId}_${storeno}_${memberno}]bindEntityCard ${idCode}"
? ? ? ? def connSrc= getDbConnection()
? ? ? ? //綁定
? ? ? ? String result= MemberUtil.bindEntityCard custId, storeno, memberno, idCode, connSrc
output<< "${result}\n"
? ? }
? ? /**
* 注冊驗(yàn)證
*? 接收
*? code 剿干。蜂怎。(注冊)碼
*? custId 客戶號
*? storeno 店號
*? deviceId 機(jī)號
*
*? 返回
*? ok 驗(yàn)證成功
*? ng 驗(yàn)證失敗
*
*/
? ? static void registVerify(custId, storeId, deviceId, code, type, layoutCode, OutputStream output, InputStream input) {
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]registVerify ${code} ${type}"
? ? ? ? def connSrc= getDbConnection()
? ? ? ? //注冊申請
? ? ? ? if (type== '0') {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? def tDao= DaoManager.createDao(connSrc, Model注冊)
? ? ? ? ? ? ? ? List lists= tDao.queryBuilder().where().eq('custId', custId).and().eq('Warehouseid', storeId).and().eq('FSYSNO', deviceId).query()
? ? ? ? ? ? ? ? if (lists&& lists.size() > 0) {
? ? ? ? ? ? ? ? ? ? Model注冊 model注冊= lists.get(0)
? ? ? ? ? ? ? ? ? ? if (model注冊) {
? ? ? ? ? ? ? ? ? ? ? ? if (model注冊.FSYSID== code) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? output<< "ok\n"
? ? ? ? ? ? ? ? ? ? ? ? ? ? return
? ? ? ? ? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? ? ? ? ? output<< "ng\n"
? ? ? ? ? ? ? ? ? ? ? ? ? ? return
? ? ? ? ? ? ? ? ? ? ? ? }
}
}
? ? ? ? ? ? ? ? lists= tDao.queryBuilder().where().eq('FSYSID', code).query()
? ? ? ? ? ? ? ? if (lists&& lists.size() > 0) {
? ? ? ? ? ? ? ? ? ? Model注冊 model注冊= lists.get(0)
? ? ? ? ? ? ? ? ? ? if (model注冊) {
? ? ? ? ? ? ? ? ? ? ? ? if (model注冊.custId== custId&& model注冊.Warehouseid== storeId&& model注冊.FSYSNO== deviceId) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? output<< "ok\n"
? ? ? ? ? ? ? ? ? ? ? ? ? ? return
? ? ? ? ? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? ? ? ? ? output<< "ng\n"
? ? ? ? ? ? ? ? ? ? ? ? ? ? return
? ? ? ? ? ? ? ? ? ? ? ? }
}
}
? ? ? ? ? ? ? ? List list= tDao.queryForAll()
? ? ? ? ? ? ? ? int maxId= 0
? ? ? ? ? ? ? ? for (Model注冊 model注冊 : list) {
? ? ? ? ? ? ? ? ? ? if (model注冊.FSYSNUM> maxId) {
? ? ? ? ? ? ? ? ? ? ? ? maxId= model注冊.FSYSNUM
}
}
? ? ? ? ? ? ? ? maxId++
? ? ? ? ? ? ? ? Model注冊 model注冊= new Model注冊()
? ? ? ? ? ? ? ? model注冊.FSYSNUM= maxId
model注冊.FSYSNO= deviceId
model注冊.FSYSID= code
model注冊.FSYSTYPE= 1
? ? ? ? ? ? ? ? model注冊.FSYSFLAG= 0
? ? ? ? ? ? ? ? model注冊.FMEMO= layoutCode
model注冊.FPOSTYPE= layoutCode== 'ls_layout' ?1 :(layoutCode== 'coffe_table_layout' ?2 :(layoutCode== 'food_table_layout' ?3 :0))
? ? ? ? ? ? ? ? model注冊.FOPERATOR= ''
? ? ? ? ? ? ? ? model注冊.FUPDDATE= new Date()
? ? ? ? ? ? ? ? model注冊.custId= custId
model注冊.Warehouseid= storeId
tDao.create(model注冊)
? ? ? ? ? ? ? ? output<< "ok\n"
? ? ? ? ? ? } catch (Exception e){
? ? ? ? ? ? ? ? log.error('registVerify failed' , e)
? ? ? ? ? ? ? ? output<< "ng\n"
? ? ? ? ? ? ? ? if (e.getMessage().contains('maximum connections reached')) {
? ? ? ? ? ? ? ? ? ? System.exit(1)
? ? ? ? ? ? ? ? }
}
? ? ? ? } else {
? ? ? ? ? ? //注冊驗(yàn)證
? ? ? ? ? ? String result= MemberUtil.registVerify custId, storeId, deviceId, code,type, connSrc
output<< "${result}\n"
? ? ? ? }
}
? ? /**
* 會員開卡
*? 接收
*? idCode 識別卡號
*? telNo 聯(lián)系電話
*? cashierNumber 操作員
*? deposit 押金
*
*? 返回
*? ok 開卡成功
*? ng 開卡失敗,數(shù)據(jù)插入失敗
*? EWallet 開卡失敗,后臺未設(shè)置錢包規(guī)則
*? cardStatus_XX 開卡失敗,會員卡已經(jīng)存在, XX表示卡狀態(tài)
*
*/
? ? static void openMemberCard(custId, storeId, deviceId, idCode, telNo, deposit, cashierNumber, OutputStream output, InputStream input) {
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]createMemberCard ${idCode} ${telNo} ${cashierNumber}"
? ? ? ? def connSrc= getDbConnection()
? ? ? ? //開卡
? ? ? ? def isDoubleMember= dbConf.isDoubleMember ?:'1'
? ? ? ? int result= MemberUtil.openMemberCard custId, storeId, idCode, telNo, deposit, isDoubleMember, cashierNumber, connSrc
if (result== 0) {
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}] createMemberCard ok."
? ? ? ? ? ? output<< 'ok\n'
? ? ? ? } else if (result== 1) {
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}] createMemberCard EWallet null."
? ? ? ? ? ? output<< 'EWallet\n'
? ? ? ? } else if (result== -2) {
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}] createMemberCard member exist."
? ? ? ? ? ? output<< 'exist\n'
? ? ? ? } else if (result== -1) {
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}] createMemberCard ng."
? ? ? ? ? ? output<< 'ng\n'
? ? ? ? } else {
? ? ? ? ? ? int cardStatus= result- 2
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}] createMemberCard memberCard.cardStatus = ${cardStatus}."
? ? ? ? ? ? output<< "cardStatus_${result}\n"
? ? ? ? }
}
? ? /**
* 根據(jù)卡號查詢會員卡資料
*? 接收
*? idCode 卡片識別號
*
*? 返回
*? ? MemberCard對象, MemberCard中包含List
*/
? ? static void getMemberCard(custId, storeId, deviceId, idCode, OutputStream output, InputStream input) {
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Going to get MemberCard of ${idCode}"
? ? ? ? def connSrc= getDbConnection()
? ? ? ? MemberCard memberCard= MemberDao.queryMemberCardByIdCode2(custId, idCode, connSrc)
? ? ? ? def gson= createGson()
? ? ? ? def json= gson.toJson(memberCard)
? ? ? ? output<< json
output<< '\n'
? ? ? ? output.flush()
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Send ${MemberCard.simpleName}: ${json}"
? ? ? ? def response= readLine(input)
? ? ? ? if (response)
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Client response: ${response}"
? ? ? ? else
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Client disconnected."
? ? }
? ? /**
* 根據(jù)會員號或手機(jī)號查詢會員資料
*? 接收
*? data 會員號/手機(jī)號 三者一一對應(yīng)
*
*? 返回
*? MemberBase對象,MemberBase中包含List
*
*/
? ? static void getMember(custId, storeId, deviceId, data, OutputStream output, InputStream input) {
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Going to get MemberBase of ${data}"
? ? ? ? def connSrc= getDbConnection()
? ? ? ? MemberBase memberBase= MemberDao.queryMember(storeId, custId, data, connSrc)
? ? ? ? def gson= createGson()
? ? ? ? def json= gson.toJson(memberBase)
? ? ? ? output<< json
output<< '\n'
? ? ? ? output.flush()
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Send ${MemberBase.simpleName}: ${json}"
? ? ? ? def response= readLine(input)
? ? ? ? if (response)
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Client response: ${response}"
? ? ? ? else
? ? ? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Client disconnected."
? ? }
? ? static boolean doGetFile2(storeId, deviceId, OutputStream output, InputStream input) {
? ? ? ? def files= ("download/${deviceId}/${storeId}" as File)
? ? ? ? if (!files.exists()) {
? ? ? ? ? ? files.mkdirs()
? ? ? ? }
? ? ? ? def fs= files.listFiles()
? ? ? ? output<< "${fs.size()}\n"
? ? ? ? for (File getFile : fs) {
? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Send file size: ${getFile.length()}"
? ? ? ? ? ? output<< "${getFile.length()}\n"
? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Send file name: ${getFile.getName()}"
? ? ? ? ? ? output<< "${getFile.getName()}\n"
? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Send file content: $getFile"
? ? ? ? ? ? def getFileInputStream= null
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? getFileInputStream= new BufferedInputStream(new FileInputStream(getFile))
? ? ? ? ? ? ? ? copy storeId, deviceId, getFileInputStream, output
} catch (Exception e) {
? ? ? ? ? ? ? ? throw e
} finally {
? ? ? ? ? ? ? ? getFileInputStream?.close()
? ? ? ? ? ? }
}
? ? ? ? def response= readLine(input)
? ? ? ? if (response) {
? ? ? ? ? ? for (File getFile : fs) {
? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]delete file: ${getFile.getName()}"
? ? ? ? ? ? ? ? getFile.delete()
? ? ? ? ? ? }
? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Client response: ${response}"
? ? ? ? } else
? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Client disconnected."
? ? ? ? return true
? ? }
? ? /**
* Dump a database table.
*
* File format:
* column_name_1/column_type_1,column_name_2/column_type_2,column_name_3/column_type_3,...\n
* column_value_1,column_value_2,column_value_3,...\n
* column_value_1,column_value_2,column_value_3,...\n
* ...
*
* Field type:
* S: String, I: Integer, D: Date, F: Decimal
*/
? ? static File dumpTable(storeId, deviceId, String tableName) {
? ? ? ? Sql serverDb= getGroovySql()
? ? ? ? try {
? ? ? ? ? ? // Create temp file
? ? ? ? ? ? def tempFileDir= new File('tmp')
? ? ? ? ? ? tempFileDir.mkdir()
? ? ? ? ? ? def tempFile= File.createTempFile(tableName,'.sql', tempFileDir)
? ? ? ? ? ? tempFile.withWriter('UTF-8') { writer ->
// Table schema query
? ? ? ? ? ? ? ? def columnCount= 0
? ? ? ? ? ? ? ? def selectSql= dbType== 'MySQL' ?
"select * from ${tableName} limit 1".toString() :
"select top 1 * from ${TABLE_PREFIX}${tableName}".toString()
? ? ? ? ? ? ? ? def hasStoreIdColumn= false
? ? ? ? ? ? ? ? serverDb.query(selectSql) { ResultSet rs ->
columnCount= rs.metaData.columnCount
for (iin 1..columnCount) {
? ? ? ? ? ? ? ? ? ? ? ? def columnName= rs.metaData.getColumnName(i)
? ? ? ? ? ? ? ? ? ? ? ? if (columnName== 'store_id')
? ? ? ? ? ? ? ? ? ? ? ? ? ? hasStoreIdColumn= true
? ? ? ? ? ? ? ? ? ? ? ? writer<< columnName
writer<< '/'
? ? ? ? ? ? ? ? ? ? ? ? switch (rs.metaData.getColumnType(i)) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? case Types.CHAR:
case Types.VARCHAR:
case Types.NCHAR:
case Types.NVARCHAR:
writer<< 'S'
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? ? ? ? ? ? ? case Types.INTEGER:
case Types.BIGINT:
case Types.SMALLINT:
writer<< 'I'
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? ? ? ? ? ? ? case Types.DATE:
case Types.TIMESTAMP:
writer<< 'D'
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? ? ? ? ? ? ? case Types.DECIMAL:
case Types.FLOAT:
case Types.DOUBLE:
writer<< 'F'
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? ? ? ? ? ? ? default:
writer<< 'S'
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? if (i< columnCount)
? ? ? ? ? ? ? ? ? ? ? ? ? ? writer<< ','
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? writer<< '\n'
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? // Table content query
? ? ? ? ? ? ? ? def selectAll= "select * from ${TABLE_PREFIX}${tableName}"
? ? ? ? ? ? ? ? if (hasStoreIdColumn)
? ? ? ? ? ? ? ? ? ? selectAll+= " where store_id=${storeId}"
? ? ? ? ? ? ? ? serverDb.eachRow(selectAll.toString()) { row ->
for (iin 0..
? ? ? ? ? ? ? ? ? ? ? ? writer<< row[i]
? ? ? ? ? ? ? ? ? ? ? ? if (i< columnCount- 1) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? writer<< COLUMN_VALUE_SEPARATOR
}
}
? ? ? ? ? ? ? ? ? ? writer<< '\n'
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Table dump: $tempFilewas created"
? ? ? ? ? ? }
? ? ? ? ? ? return tempFile
} catch (Exception e) {
? ? ? ? ? ? log.error("[${storeId}_${deviceId}]doGetTable() failed", e)
? ? ? ? ? ? return null
? ? ? ? } finally {
? ? ? ? ? ? serverDb?.close()
? ? ? ? }
}
? ? static void doGetTable(storeId, deviceId, String columnName, String tablename, String keyName,
OutputStream output, InputStream input) {
? ? ? ? log.info"[${storeId}_${deviceId}]Going to get ${tablename} ${keyName}"
? ? ? ? def connSrc= getDbConnection()
? ? ? ? def tDao= DaoManager.createDao(connSrc, MposCashier)
? ? ? ? String sql= "select ${columnName} from ${tablename}"
? ? ? ? if (keyName!= '')
? ? ? ? ? ? sql+= " where ${keyName} = '${storeId}'"
? ? ? ? GenericRawResults rawResults= tDao.queryRaw(sql)
? ? ? ? List results= new ArrayList();
results.add(rawResults.getColumnNames())
? ? ? ? results.addAll(rawResults.getResults())
? ? ? ? def gson= createGson()
? ? ? ? def json= gson.toJson(results)
? ? ? ? output<< json
output<< '\n'
? ? ? ? output.flush()
? ? ? ? log.info"[${storeId}_${deviceId}]Send ${tablename}: ${results.size()}"
? ? }
? ? /**
* Server-side getTable protocol handler.
*
*? ? ? ? Server? ? ? ? ? ? ? ? Client
* --------------------? --------------------
*? ? ? ? ? "getTable {store_id}_{device_id}{table_name}\n"
*? ? ? ? ? <----------------------
*? ? ? ? ? ? "{file_size}\n" or -1 if rejected
*? ? ? ? ? ---------------------->
*? ? ? ? ? ? "{file content}"
*? ? ? ? ? ---------------------->
*? ? ? ? ? ? "ok\n" or "ng\n"
*? ? ? ? ? <----------------------
*
*/
? ? static boolean doGetTable(storeId, deviceId, String tableName, OutputStream output, InputStream input) {
? ? ? ? File tableFile
try {
? ? ? ? ? ? tableFile= dumpTable(storeId, deviceId, tableName)
? ? ? ? ? ? doGetFile(storeId, deviceId, tableFile, output, input)
? ? ? ? } finally {
? ? ? ? ? ? tableFile?.delete()
? ? ? ? ? ? if (tableFile)
? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Table dump: $tableFilewas deleted."
? ? ? ? }
}
? ? /**
* Server-side getFile protocol handler.
*
*? ? ? ? Server? ? ? ? ? ? ? ? Client
* --------------------? --------------------
*? ? ? ? ? "getFile {store_id}_{device_id}{file_name}\n"
*? ? ? ? ? <----------------------
*? ? ? ? ? ? "{file_size}\n" or -1 if rejected
*? ? ? ? ? ---------------------->
*? ? ? ? ? ? "{file content}"
*? ? ? ? ? ---------------------->
*? ? ? ? ? ? "ok\n" or "ng\n"
*? ? ? ? ? <----------------------
*
*/
? ? static boolean doGetFile(storeId, deviceId, File getFile, OutputStream output, InputStream input) {
? ? ? ? if (getFile.exists()) {
? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Send file size: ${getFile.length()}"
? ? ? ? ? ? output<< "${getFile.length()}\n"
? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Send file content: $getFile"
? ? ? ? ? ? def getFileInputStream= null
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? getFileInputStream= new BufferedInputStream(new FileInputStream(getFile))
? ? ? ? ? ? ? ? copy storeId, deviceId, getFileInputStream, output
} catch (Exception e) {
? ? ? ? ? ? ? ? // rethrow the exception to interrupt the whole process
? ? ? ? ? ? ? ? log.error(e)
? ? ? ? ? ? ? ? throw e
} finally {
? ? ? ? ? ? ? ? getFileInputStream?.close()
? ? ? ? ? ? }
? ? ? ? } else {
? ? ? ? ? ? output<< '0\n'
? ? ? ? }
? ? ? ? def response= readLine(input)
? ? ? ? if (response) {
? ? ? ? ? ? if (getFile.getName().endsWith('update.zip')) {
? ? ? ? ? ? ? ? getFile.delete()
? ? ? ? ? ? }
? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Client response: ${response}"
? ? ? ? } else
? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Client disconnected."
? ? ? ? return true
? ? }
? ? /**
* Server-side putFile protocol handler.
*
*? ? ? ? Server? ? ? ? ? ? ? ? Client
* --------------------? --------------------
*? ? ? ? ? "putFile {store_id}_{device_id}{file_name}\n"
*? ? ? ? ? <----------------------
*? ? ? ? ? ? "{file_size}\n"
*? ? ? ? ? <----------------------
*? ? ? ? ? ? "{file content}"
*? ? ? ? ? <----------------------
*? ? ? ? ? ? "ok\n" or "ng\n"
*? ? ? ? ? ---------------------->
*
*
* Upload the file and save it as "trans/{file}_{store id}_{device id}_{week}.db".
*/
? ? static void doPutFile(storeId, deviceId, File putFile, OutputStream output, InputStream input) {
? ? ? ? def putFileOutputStream= null
? ? ? ? try {
? ? ? ? ? ? def fileSize= readLine(input).toInteger()
? ? ? ? ? ? File transDir= new File(transDirInConf)
? ? ? ? ? ? transDir.mkdir()
? ? ? ? ? ? def weekName= String.format('%1$ta', Calendar.getInstance())
? ? ? ? ? ? File fileUpload= new File(transDir,"${putFile.name}_${storeId}_${deviceId}_${weekName}.db")
? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Receiving file: ${putFile.name} to ${fileUpload}, size: ${fileSize}"
? ? ? ? ? ? putFileOutputStream= new BufferedOutputStream(new FileOutputStream(fileUpload))
? ? ? ? ? ? copy storeId, deviceId, input, putFileOutputStream, fileSize
output<< 'ok\n'
? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Send ok."
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? log.warn"[${storeId}_${deviceId}]doPutFile failed", e
output<< 'ng\n'
? ? ? ? } finally {
? ? ? ? ? ? putFileOutputStream?.close()
? ? ? ? }
}
? ? /**
* Server-side doPutMasterVersion protocol handler.
*
*? ? ? ? Server? ? ? ? ? ? ? ? Client
* --------------------? --------------------
*? ? ? ? "doPutMasterVersion {store_id}_{device_id}\n"
*? ? ? ? ? <----------------------
*? ? ? ? ? ? "{json_file_size}\n"? or -1 if upload directory is not empty
*? ? ? ? ? ---------------------->
*? ? ? ? ? ? "{file content}"
*? ? ? ? ? ---------------------->
*? ? ? ? ? ? "ok\n" or "ng\n"
*? ? ? ? ? <----------------------
*
*/
? ? static void putFile2(storeId, deviceId, OutputStream output, InputStream input) {
? ? ? ? int filesize= Integer.valueOf(readLine(input))
? ? ? ? final ByteArrayOutputStream jsonBytes= new ByteArrayOutputStream()
? ? ? ? copy2(input, jsonBytes, filesize)
? ? ? ? final String objectsInJSON= jsonBytes.toString('UTF-8')
? ? ? ? jsonBytes.close()
? ? ? ? SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd-HH")
? ? ? ? Date date= new Date()
? ? ? ? String date2= sdf.format(date)
? ? ? ? if (!(['posLog'] as File).exists()) {
? ? ? ? ? ? (['posLog'] as File).mkdirs()
? ? ? ? }
? ? ? ? File[] files= (['posLog'] as File).listFiles()
? ? ? ? for (File file : files) {
? ? ? ? ? ? if(file.getName().startsWith(storeId.toString()+"_"+deviceId.toString())){
? ? ? ? ? ? ? ? file.delete()
? ? ? ? ? ? }
}
? ? ? ? def versionFile= ['posLog',"${storeId}_${deviceId}_${date2}.log"] as File
versionFile.text= objectsInJSON
output<< 'ok\n'
? ? }
? ? /**
* Copy fully {fileSize} bytes from input stream to output stream.
*/
? ? static void copy2(InputStream input, OutputStream output,int filesize)
? ? ? ? ? ? throws IOException{
? ? ? ? int totalLen= 0
? ? ? ? int length= 0
? ? ? ? try {
? ? ? ? ? ? byte[] buffer= new byte[1024]
? ? ? ? ? ? while (totalLen< filesize&& (length= input.read(buffer)) > 0) {
? ? ? ? ? ? ? ? output.write buffer,0, length
totalLen+= length
}
? ? ? ? ? ? output.flush()
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? log.info"Failed on copy: read=" + totalLen
throw e
}
}
? ? static void doPutObject2(storeId, deviceId, tableName, objectClass, length, OutputStream output, InputStream input) {
? ? ? ? log.info"[${storeId}_${deviceId}]Going to get ${objectClass.toString()}objects2"
? ? ? ? String objectsInJSON= readLine(input)
? ? ? ? def jdbcConn= (getDbConnection(false).getReadWriteConnection() as JdbcDatabaseConnection).getInternalConnection()
? ? ? ? jdbcConn.autoCommit= false;//設(shè)置不自動(dòng)提交
? ? ? ? Sql sql= new Sql(jdbcConn)
? ? ? ? List l= createGson().fromJson(objectsInJSON, List.class)//Json轉(zhuǎn)成String[]
? ? ? ? String name= l.get(0)
? ? ? ? for (int i= 1; i< l.size(); i++) {
? ? ? ? ? ? String value= ""
? ? ? ? ? ? String[] s= l.get(i)
? ? ? ? ? ? for (String s2 : s) {
? ? ? ? ? ? ? ? if (i== 0) {
? ? ? ? ? ? ? ? ? ? name+= ",${s2}"
? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? if (s2== null)
? ? ? ? ? ? ? ? ? ? ? ? value+= ",${s2}"
? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? value+= ",'${s2}'"
? ? ? ? ? ? ? ? }
}
? ? ? ? ? ? String sqlStr= "insert into ${tableName} (${name}) values (${value.substring(1)})"
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? sql.execute(sqlStr,new ArrayList())//插入
? ? ? ? ? ? } catch (Exception e) {
? ? ? ? ? ? ? ? //java.sql.SQLException: 違反了 PRIMARY KEY 約束 'PK_POS_TRANHEAD'。不能在對象 'dbo.POS_TRANHEAD' 中插入重復(fù)鍵置尔。
? ? ? ? ? ? ? ? if (e.message.contains("PRIMARY KEY")) {//重復(fù)插入跳過
? ? ? ? ? ? ? ? ? ? log.info(e.getMessage())
? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? log.info(sqlStr)
? ? ? ? ? ? ? ? ? ? log.error("insert into faild", e)
? ? ? ? ? ? ? ? ? ? output<< 'ng\n'
? ? ? ? ? ? ? ? ? ? jdbcConn.close()
? ? ? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Send: ng"
? ? ? ? ? ? ? ? ? ? return
? ? ? ? ? ? ? ? }
}
}
? ? ? ? log.info("${tableName} insert success count ${length- 1}")
? ? ? ? jdbcConn.commit()//最后一起提交
? ? ? ? jdbcConn.close()
? ? ? ? output<< 'ok\n'
? ? ? ? log.info"[${storeId}_${deviceId}]Send: ok"
? ? }
? ? /**
* Server-side putObject protocol handler.
*
* Protocols:
*? ? ? ? Server? ? ? ? ? ? ? ? Client
* --------------------? --------------------
*? "putObject {store_id}_{device_id}{class_name}{#_of_objects}\n"
*? ? ? ? ? <----------------------
*{JSON stream of the n objects}\n
*? ? ? ? ? <----------------------
*? ? ? ? ? ? "ok\n" or "ng\n"
*? ? ? ? ? ---------------------->
*
*/
? ? static void doPutObject(storeId, deviceId, objectClass, numOfObjects, OutputStream output, InputStream input) {
? ? ? ? log.info"[${storeId}_${deviceId}]Going to get ${numOfObjects} ${objectClass.toString()}objects"
? ? ? ? String objectsInJSON= readLine(input)
? ? ? ? log.info"[${storeId}_${deviceId}]Receive: ${objectsInJSON}"
? ? ? ? def gson= createGson()
//? ? ? ? output << 'stream_ok\n'
? ? ? ? if (objectClass== MposSalesOrder) { // 點(diǎn)餐數(shù)據(jù)上傳
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? boolean succeeded= processUploadedMposSalesOrders(gson, objectsInJSON, storeId, deviceId)
? ? ? ? ? ? ? ? if (!succeeded) {
? ? ? ? ? ? ? ? ? ? output<< 'ng\n'
? ? ? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Send: ng"
? ? ? ? ? ? ? ? ? ? return
? ? ? ? ? ? ? ? }
? ? ? ? ? ? } catch (Exception e) {
? ? ? ? ? ? ? ? output<< 'ng\n'
? ? ? ? ? ? ? ? log.error('processUploadedMposSalesOrders', e)
? ? ? ? ? ? ? ? if (e.getMessage().contains('maximum connections reached')) {
? ? ? ? ? ? ? ? ? ? System.exit(1)
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? return
? ? ? ? ? ? }
? ? ? ? } else if (objectClass== MposItemSet) { // 沽清數(shù)據(jù)上傳
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? def errorResponse= processUploadedMposItemSet(gson, objectsInJSON, storeId, deviceId)
? ? ? ? ? ? ? ? if (errorResponse) {
? ? ? ? ? ? ? ? ? ? output<< errorResponse+ "\n"
? ? ? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Send: $errorResponse"
? ? ? ? ? ? ? ? ? ? return
? ? ? ? ? ? ? ? }
? ? ? ? ? ? } catch (Exception e) {
? ? ? ? ? ? ? ? output<< 'ng\n'
? ? ? ? ? ? ? ? log.error('processUploadedMposItemSet', e)
? ? ? ? ? ? ? ? if (e.getMessage().contains('maximum connections reached')) {
? ? ? ? ? ? ? ? ? ? System.exit(1)
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? return
? ? ? ? ? ? }
? ? ? ? } else if (objectClass== MposDiningTable) { // 桌子狀態(tài)更新上傳
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? def errorResponse= processUploadedMposDiningTable(gson, objectsInJSON, storeId, deviceId)
? ? ? ? ? ? ? ? if (errorResponse) {
? ? ? ? ? ? ? ? ? ? output<< errorResponse+ "\n"
? ? ? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Send: $errorResponse"
? ? ? ? ? ? ? ? ? ? return
? ? ? ? ? ? ? ? }
? ? ? ? ? ? } catch (Exception e) {
? ? ? ? ? ? ? ? output<< 'ng\n'
? ? ? ? ? ? ? ? log.error('processUploadedMposDiningTable', e)
? ? ? ? ? ? ? ? if (e.getMessage().contains('maximum connections reached')) {
? ? ? ? ? ? ? ? ? ? System.exit(1)
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? return
? ? ? ? ? ? }
? ? ? ? } else if (objectClass== MposTransaction) { // 交易數(shù)據(jù)上傳
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? processUploadedMposTransaction objectsInJSON
} catch (Exception e) {
? ? ? ? ? ? ? ? output<< 'ng\n'
? ? ? ? ? ? ? ? log.error('processUploadedMposTransaction', e)
? ? ? ? ? ? ? ? if (e.getMessage().contains('maximum connections reached')) {
? ? ? ? ? ? ? ? ? ? System.exit(1)
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? return
? ? ? ? ? ? }
? ? ? ? } else if (objectClass== MposServerCommand) { // Server command
? ? ? ? ? ? def result= processServerCommand objectsInJSON
output<< result+ "\n"
? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Send: ${result}"
? ? ? ? ? ? return
? ? ? ? } else if (objectClass== MposShift) {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? proocessUploadedShift objectsInJSON
} catch (Exception e) {
? ? ? ? ? ? ? ? output<< 'ng\n'
? ? ? ? ? ? ? ? log.error('proocessUploadedShift', e)
? ? ? ? ? ? ? ? if (e.getMessage().contains('maximum connections reached')) {
? ? ? ? ? ? ? ? ? ? System.exit(1)
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? return
? ? ? ? ? ? }
? ? ? ? } else if (objectClass== MposShiftReport) {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? proocessUploadedPosShift objectsInJSON
} catch (Exception e) {
? ? ? ? ? ? ? ? output<< 'ng\n'
? ? ? ? ? ? ? ? log.error('proocessUploadedPosShift', e)
? ? ? ? ? ? ? ? if (e.getMessage().contains('maximum connections reached')) {
? ? ? ? ? ? ? ? ? ? System.exit(1)
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? return
? ? ? ? ? ? }
? ? ? ? } /*else if (objectClass == Pos_tranflow) {
proocessUploadedPosTranflow objectsInJSON
} else if (objectClass == Pos_tranhead) {
proocessUploadedPosTranhead objectsInJSON
? ? ? ? }*/ else {
? ? ? ? ? ? // Save to uploadDir: {object class name}_{device id}_{upload timestamp}.json
? ? ? ? ? ? def yyyymmddHHMMSS= String.format('%1$tY%1$tm%1$td%1$tH%1$tM%1$tS%1$tL',new Date())
? ? ? ? ? ? def saveFile= [uploadDir,"${objectClass.name}_${deviceId}_${yyyymmddHHMMSS}.json"] as File
saveFile.text= objectsInJSON
log.info"[${storeId}_${deviceId}]Create: $saveFile"
? ? ? ? }
? ? ? ? output<< 'ok\n'
? ? ? ? log.info"[${storeId}_${deviceId}]Send: ok"
? ? }
? ? static void proocessUploadedShift(String objectsInJSON) {
? ? ? ? Type collectionType= new TypeToken>() {}.getType()
? ? ? ? def gson= createGson()
? ? ? ? List modelShifts= gson.fromJson(objectsInJSON, collectionType)
? ? ? ? def connSrc= getDbConnection(false)
? ? ? ? def sDao= DaoManager.createDao(connSrc, MposShift)
? ? ? ? modelShifts.each{ shift ->
sDao.callBatchTasks{
? ? ? ? ? ? ? ? shift.with{
? ? ? ? ? ? ? ? ? ? fAccDate= new SimpleDateFormat("yyyy-MM-dd").parse(new SimpleDateFormat("yyyy-MM-dd").format(fAccDate))
? ? ? ? ? ? ? ? ? ? if (serverType== 'SC')
? ? ? ? ? ? ? ? ? ? ? ? fUploadFlag= 'N'? ? // Mark it uploaded
? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? fUploadFlag= 'Y'? ? // Mark it uploaded
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? def deleteBuilder= sDao.deleteBuilder()
? ? ? ? ? ? ? ? deleteBuilder.where().eq('Warehouseid', shift.warehouseid).and().eq('fPosNo', shift.fPosNo).and().eq('fShift', shift.fShift).and().eq('custId', shift.custId)
? ? ? ? ? ? ? ? def rows= deleteBuilder.delete()
? ? ? ? ? ? ? ? if (rows> 0)
? ? ? ? ? ? ? ? ? ? log.info"Delete existing $rows rows from Tc_Shift with fPosNo='${shift.fPosNo}' Warehouseid = '${shift.warehouseid}'"
? ? ? ? ? ? ? ? sDao.create shift
if (serverType!= 'SC')
? ? ? ? ? ? ? ? ? ? if (shift.fAccDate== getInitialDate() && shift.fState!= 1) {//如果營業(yè)日期是1970-01-01,則更新該班別的營業(yè)日期
? ? ? ? ? ? ? ? ? ? ? ? updateAccdate(getAccDate(shift.warehouseid), shift.fShift, shift.begFlowno ?:"", shift.endFlowno, shift.warehouseid, shift.custId)
? ? ? ? ? ? ? ? ? ? }
}
}
}
? ? static void proocessUploadedPosShift(String objectsInJSON) {
? ? ? ? Type collectionType= new TypeToken>() {}.getType()
? ? ? ? def gson= createGson()
? ? ? ? List modelShifts= gson.fromJson(objectsInJSON, collectionType)
? ? ? ? if (modelShifts.size() == 0)
? ? ? ? ? ? return
? ? ? ? def connSrc= getDbConnection(false)
? ? ? ? def sDao= DaoManager.createDao(connSrc, MposShiftReport)
? ? ? ? sDao.callBatchTasks{
? ? ? ? ? ? def deleteBuilder= sDao.deleteBuilder()
? ? ? ? ? ? modelShifts.each{ shift ->
deleteBuilder.where().eq('warehouseId', shift.warehouseId).and().eq('flowno', shift.flowno).and()
? ? ? ? ? ? ? ? ? ? ? ? .eq('custId', shift.custId).and().eq('payWay', shift.payWay)
? ? ? ? ? ? ? ? def rows= deleteBuilder.delete()
? ? ? ? ? ? ? ? if (rows> 0)
? ? ? ? ? ? ? ? ? ? log.info"Delete existing $rows rows from pos_shift with id='${modelShifts.flowno}'"
? ? ? ? ? ? ? ? shift.with{
? ? ? ? ? ? ? ? ? ? //id = 0
? ? ? ? ? ? ? ? ? ? if (serverType== 'SC')
? ? ? ? ? ? ? ? ? ? ? ? uploadFlag= 'N'? ? // Mark it uploaded
? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? uploadFlag= 'Y'? ? // Mark it uploaded
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? sDao.create shift
}
}
}
? ? static String processUploadedMposItemSet(Gson gson, String objectsInJSON, storeId, deviceId) {
? ? ? ? Type collectionType= new TypeToken>() {}.getType()
? ? ? ? List modelItemSet= gson.fromJson(objectsInJSON, collectionType)
? ? ? ? if (modelItemSet.size() == 0)
? ? ? ? ? ? return
? ? ? ? def connSrc= getDbConnection()
? ? ? ? def sDao= DaoManager.createDao(connSrc, MposItemSet)
? ? ? ? sDao.callBatchTasks{
? ? ? ? ? ? def deleteBuilder= sDao.deleteBuilder()
? ? ? ? ? ? deleteBuilder.where().eq('Warehouseid', storeId).and().eq('PosNO', deviceId)
? ? ? ? ? ? if(modelItemSet.get(0).tranType== 2){
? ? ? ? ? ? ? ? def rows= deleteBuilder.delete()
? ? ? ? ? ? ? ? if(rows){
? ? ? ? ? ? ? ? ? ? log.info"Delete existing $rows rows from tbl_itemset with Warehouseid='$storeId' and PosNo='$deviceId'"
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? def rows= deleteBuilder.delete()
? ? ? ? ? ? ? ? if(rows){
? ? ? ? ? ? ? ? ? ? log.info"Delete existing $rows rows from tbl_itemset with Warehouseid='$storeId' and PosNo='$deviceId'"
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? modelItemSet.each{ set ->
sDao.create set
log.info"tbl_itemset inserted (id=${set.id},tranType=${set.tranType},pluno=${set.pluno},foodName=${set.foodName}...)"
//? ? ? ? ? ? ? ? ? ? pushServer.pushString objectsInJSON
? ? ? ? ? ? ? ? }
}
}
}
? ? static synchronized String processUploadedMposDiningTable(Gson gson, String objectsInJSON, storeId, deviceId) {
? ? ? ? Type collectionType= new TypeToken>() {}.getType()
? ? ? ? List diningTables= gson.fromJson(objectsInJSON, collectionType)
? ? ? ? def connSrc= getDbConnection(false)
? ? ? ? def dao= DaoManager.createDao(connSrc, MposDiningTable)
? ? ? ? def errResponse= stateTransitionCheck(dao, diningTables)
? ? ? ? if (errResponse) {
? ? ? ? ? ? return errResponse
} else {
? ? ? ? ? ? for (diningTablein diningTables) {
? ? ? ? ? ? ? ? dao.update diningTable
log.info"[${storeId}_${deviceId}]Updated: $diningTable"
? ? ? ? ? ? ? ? // Push objectsInJSON
? ? ? ? ? ? ? ? pushServer.pushString objectsInJSON
}
? ? ? ? ? ? // 換桌需要調(diào)用后端存儲過程
? ? ? ? ? ? def changingDiningTable= diningTables.size() == 2
? ? ? ? ? ? if (changingDiningTable) {
? ? ? ? ? ? ? ? def targetDiningTable= diningTables[1]
? ? ? ? ? ? ? ? proccessChangingDiningTable targetDiningTable, diningTables[0], connSrc
}
? ? ? ? ? ? return null
? ? ? ? }
}
? ? static void proccessChangingDiningTable(MposDiningTable targetDiningTable, MposDiningTable diningTable, ConnectionSource connSrc) {
? ? ? ? def sdao= DaoManager.createDao(connSrc, MposDiffSalesOrder)
? ? ? ? List diffSalesOrderList= sdao.queryForEq("flowno", targetDiningTable.tranFlowno)
? ? ? ? diffSalesOrderList*.roomNo= targetDiningTable.roomNo
diffSalesOrderList*.deskNo= targetDiningTable.deskNo
diffSalesOrderList*.deskName= targetDiningTable.deskName
int allQty= 0
? ? ? ? diffSalesOrderList.each{
? ? ? ? ? ? it.roomNo= targetDiningTable.roomNo
it.deskNo= targetDiningTable.deskNo
it.deskName= targetDiningTable.deskName
it.message= "換桌? 原${diningTable.deskName} "
? ? ? ? ? ? allQty+= it.saleQty
sdao.update(it)
? ? ? ? }
? ? ? ? //打印控菜單
? ? ? ? if (dbConf.kitchen.printAll== 'Y') {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? lock.lock()
? ? ? ? ? ? ? ? diffSalesOrderList*.allQty= allQty
if (diffSalesOrderList.size() > 0) {
? ? ? ? ? ? ? ? ? ? PrintServer printServer= new PrintServer()
? ? ? ? ? ? ? ? ? ? printServer.printSaleOrder(diffSalesOrderList)
? ? ? ? ? ? ? ? }
? ? ? ? ? ? } catch (Exception e) {
? ? ? ? ? ? ? ? log.error(e)
? ? ? ? ? ? } finally {
? ? ? ? ? ? ? ? lock.unlock()
? ? ? ? ? ? }
}
}
? ? static synchronized boolean processUploadedMposSalesOrders(Gson gson, String objectsInJSON, storeId, deviceId) {
? ? ? ? Type collectionType= new TypeToken>() {}.getType()
? ? ? ? List salesOrders= gson.fromJson(objectsInJSON, collectionType)
? ? ? ? if (salesOrders) {
? ? ? ? ? ? log.info"Deserialized salesOrders: $salesOrders"
//? ? ? ? ? ? def connSrc = getDbConnection()
? ? ? ? ? ? def transConnSrc= getDbConnection(false)
? ? ? ? ? ? def tDao= DaoManager.createDao(transConnSrc, MposDiningTable)
? ? ? ? ? ? def sDao= DaoManager.createDao(transConnSrc, MposSalesOrder)
? ? ? ? ? ? def diffDao= DaoManager.createDao(transConnSrc, MposDiffSalesOrder)
? ? ? ? ? ? def diningTableId= salesOrders[0].diningTableId
def orderNumber= salesOrders[0].orderNumber
Map> diffSalesOrdersMap= [:]
? ? ? ? ? ? Map> diffSalesOrderCancelsMap= [:]
? ? ? ? ? ? boolean cancel= false
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? if (diningTableId) {
? ? ? ? ? ? ? ? ? ? def diningTable= tDao.queryForId(diningTableId)
? ? ? ? ? ? ? ? ? ? if (diningTable?.orderNumber!= null && diningTable?.orderNumber!= '' &&? diningTable?.orderNumber!= orderNumber) {
? ? ? ? ? ? ? ? ? ? ? ? log.info"processUploadedMposSalesOrders tableId = ${diningTableId} tableOrderNumber = ${diningTable?.orderNumber} orderNumber = $orderNumber"
? ? ? ? ? ? ? ? ? ? ? ? return false
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? diningTable.orderNumber= orderNumber//設(shè)置交易單號
? ? ? ? ? ? ? ? ? ? log.info"processUploadedMposSalesOrders tableId = ${diningTable} orderNumber = ${orderNumber}"
? ? ? ? ? ? ? ? ? ? tDao.update(diningTable)
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? tDao.callBatchTasks{
? ? ? ? ? ? ? ? ? ? // -> 手機(jī)下單時(shí)在發(fā)送sales orders之后杠步,也負(fù)責(zé)發(fā)送dining table狀態(tài)至后端(因?yàn)樾枰芨潞蠖俗雷拥?/p>
// 來客數(shù)、服務(wù)員、和備注等信息)幽歼。不過目前在結(jié)帳后的交易數(shù)據(jù)上傳后朵锣,仍由后端修改重置桌子為idle,
// 并push桌子信息甸私。
//def diningTable = tDao.queryForId(diningTableId)
//// 更新桌子對應(yīng)的點(diǎn)單號
//diningTable.orderNumber = orderNumber
//if (diningTable.state == 'N')
//? ? diningTable.createDate = new Date() // 開桌時(shí)間
//// 桌子狀態(tài)為被占用
//diningTable.state = 'Y'
//tDao.update(diningTable)
//List diffSalesOrderOrigs = mpos查詢某張桌子的點(diǎn)單差異表數(shù)據(jù)(connSrc, storeId, deviceId, diningTableId)
? ? ? ? ? ? ? ? ? ? List diffSalesOrderList= []
? ? ? ? ? ? ? ? ? ? int allQty= 0
? ? ? ? ? ? ? ? ? ? for (salesOrderin salesOrders) {
? ? ? ? ? ? ? ? ? ? ? ? if (salesOrder.sellWay!= 'A' && salesOrder.sellWay!= 'B' && salesOrder.sellWay!= 'S')
? ? ? ? ? ? ? ? ? ? ? ? ? ? continue
? ? ? ? ? ? ? ? ? ? ? ? if (salesOrder.id== 0) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? sDao.create salesOrder
log.info"Create: $salesOrder"
? ? ? ? ? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? ? ? ? ? sDao.update salesOrder
log.info"Update: $salesOrder"
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? if (!salesOrder.printName|| salesOrder.printFlag== 'N') {
? ? ? ? ? ? ? ? ? ? ? ? ? ? log.info"${salesOrder.pluName} ${salesOrder.pluno} ${salesOrder.printName}not print"
? ? ? ? ? ? ? ? ? ? ? ? ? ? continue
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? // 處理點(diǎn)單廚打表
? ? ? ? ? ? ? ? ? ? ? ? log.info"salesOrder.id=" + salesOrder.id+ ",saleQty=" +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? salesOrder.saleQty+ ",lastSaleQty=" + salesOrder.lastSaleQty
allQty+= salesOrder.saleQty
MposDiffSalesOrder diffSalesOrder= MposDiffSalesOrder.getAndCreateDiffSalesOrder(salesOrder)
? ? ? ? ? ? ? ? ? ? ? ? if (diffSalesOrder) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? // 處理下diffSalesOrder.id, 以便成功update----目前廚打表只做insert
? ? ? ? ? ? ? ? ? ? ? ? ? ? /*if (diffSalesOrderOrigs) {
for (diffSalesOrderOrig in diffSalesOrderOrigs) {
diffSalesOrderOrig = diffSalesOrderOrig as MposDiffSalesOrder
if (diffSalesOrderOrig.itemseq == salesOrder.lastItemseq
&& diffSalesOrderOrig.flowno == salesOrder.flowno
&& diffSalesOrderOrig.pluno == salesOrder.pluno) {
diffSalesOrder.id = diffSalesOrderOrig.id
}
}*/
? ? ? ? ? ? ? ? ? ? ? ? ? ? // 創(chuàng)建diffSalesOrder
? ? ? ? ? ? ? ? ? ? ? ? ? ? diffDao.create diffSalesOrder
//? ? ? ? ? ? ? ? ? ? ? ? ? ? if (diffSalesOrder.deskNo == null)
//? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? continue
? ? ? ? ? ? ? ? ? ? ? ? ? ? log.info"Create: $diffSalesOrder"
? ? ? ? ? ? ? ? ? ? ? ? ? ? salesOrder.lastSaleQty= salesOrder.saleQty
diffSalesOrderList.add(diffSalesOrder)
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? // -> 桌子狀態(tài)改為由手機(jī)端發(fā)送
//// Push table status back
//pushServer.pushString gson.toJson([diningTable])
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? //打印控菜單
? ? ? ? ? ? ? ? ? ? if (dbConf.kitchen.printAll== 'Y') {
? ? ? ? ? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? ? ? ? ? lock.lock()
? ? ? ? ? ? ? ? ? ? ? ? ? ? diffSalesOrderList*.allQty= allQty
if (diffSalesOrderList.size() > 0) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? PrintServer printServer= new PrintServer()
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? printServer.printSaleOrder(diffSalesOrderList)
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? } catch (Exception e) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? log.error(e)
? ? ? ? ? ? ? ? ? ? ? ? } finally {
? ? ? ? ? ? ? ? ? ? ? ? ? ? lock.unlock()
? ? ? ? ? ? ? ? ? ? ? ? }
}
? ? ? ? ? ? ? ? ? ? // 手機(jī)點(diǎn)單: 調(diào)用存儲過程:exec Proc_POS_APP 2,1,點(diǎn)單單號,''
//? ? ? ? ? ? ? ? ? ? callStoredProcedure(1, salesOrders[0].flowno)
// -> 桌子狀態(tài)改為由手機(jī)端發(fā)送
//// Push table status back
//pushServer.pushString gson.toJson([diningTable])
? ? ? ? ? ? ? ? }
? ? ? ? ? ? } catch (Exception e) {
? ? ? ? ? ? ? ? log.error'processUploadedMposSalesOrders() failed', e
return false
? ? ? ? ? ? }
}
? ? ? ? return true
? ? }
? ? static String stateTransitionCheck(Dao dao, List diningTables) {
? ? ? ? if (stlMap) {
? ? ? ? ? ? for (diningTablein diningTables) {
? ? ? ? ? ? ? ? def origDiningTable= dao.queryForId(diningTable.fId)
? ? ? ? ? ? ? ? def sourceState= (origDiningTable.state== '0' ?'N' : origDiningTable.state)
? ? ? ? ? ? ? ? def targetState= (diningTable.state== '0' ?'N' : diningTable.state)
? ? ? ? ? ? ? ? def expectedOldState= (diningTable.previousState== '0' ?'N' : diningTable.previousState)
? ? ? ? ? ? ? ? log.info"DiningTable.id=${diningTable.fId}: sourceState=$sourceState, expectedOldState=$expectedOldState, targetState=$targetState"
? ? ? ? ? ? ? ? if (sourceState!= expectedOldState|| // 狀態(tài)被別人搶先更新(optimistic lock)
? ? ? ? ? ? ? ? ? ? ? ? (sourceState!= targetState&& !stlMap[sourceState].contains(targetState))) {
? ? ? ? ? ? ? ? ? ? // reject the transition
? ? ? ? ? ? ? ? ? ? def response= "ng Reject the transition from $sourceState to $targetState"
? ? ? ? ? ? ? ? ? ? return response
}
}
}
? ? ? ? return null
? ? }
? ? static String processServerCommand(String objectsInJSON) {
? ? ? ? Type collectionType= new TypeToken>() {}.getType()
? ? ? ? def gson= createGson()
? ? ? ? List serverCommands= gson.fromJson(objectsInJSON, collectionType)
? ? ? ? for (serverCommandin serverCommands) {
? ? ? ? ? ? switch (serverCommand.command) {
? ? ? ? ? ? ? ? case 'refund':// 整筆退單
? ? ? ? ? ? ? ? ? ? def orderNumber= serverCommand.argument
callStoredProcedure5, orderNumber
def connSrc= getDbConnection(false)
? ? ? ? ? ? ? ? ? ? def hDao= DaoManager.createDao(connSrc, MposTransaction)
? ? ? ? ? ? ? ? ? ? MposTransaction transaction= hDao.queryForEq("RtnFlowNo", orderNumber).get(0)
? ? ? ? ? ? ? ? ? ? PrintServer.printTrans(transaction.flowno,'0', dbConf.PrintName,'','',1,false)
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? case 'reprint':// 小票重印
? ? ? ? ? ? ? ? ? ? def orderNumber= serverCommand.argument
callStoredProcedure4, orderNumber
PrintServer.printTrans(orderNumber,'1', dbConf.PrintName,'','',1,false)
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? case 'date'://date, 比對系統(tǒng)日期
? ? ? ? ? ? ? ? ? ? def clientDate= serverCommand.argument
def serverDate= new SimpleDateFormat("yyyy-MM-dd HH").format(new Date())
? ? ? ? ? ? ? ? ? ? if (clientDate== serverDate)
? ? ? ? ? ? ? ? ? ? ? ? return 'ok'
? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? return 'ng'
? ? ? ? ? ? ? ? ? ? break;
}
}
? ? ? ? return 'ok'
? ? }
? ? static void processUploadedMposTransaction(String objectsInJSON) {
? ? ? ? Type collectionType= new TypeToken>() {}.getType()
? ? ? ? def gson= createGson()
? ? ? ? List transactions= gson.fromJson(objectsInJSON, collectionType)
? ? ? ? log.info"Deserialized: $transactions"
? ? ? ? def connSrc= getDbConnection()
? ? ? ? def transConnSrc= getDbConnection(false)
? ? ? ? def hDao= DaoManager.createDao(transConnSrc, MposTransaction)
? ? ? ? def dDao= DaoManager.createDao(transConnSrc, MposLineItem)
? ? ? ? def pDao= DaoManager.createDao(transConnSrc, MposTransactionTender)
? ? ? ? def oDao= DaoManager.createDao(transConnSrc, MposO2oPayDtl)
? ? ? ? def cDao= DaoManager.createDao(transConnSrc, MposCardDtl)
? ? ? ? def tdDao= DaoManager.createDao(transConnSrc, MposTicketDtl)
? ? ? ? def todDao= DaoManager.createDao(transConnSrc, MposTakeOutTransaction)
? ? ? ? def tofdDao= DaoManager.createDao(transConnSrc, MposTakeOutTranflow)
? ? ? ? def tDao= DaoManager.createDao(transConnSrc, MposDiningTable)
? ? ? ? def tsDao= DaoManager.createDao(transConnSrc, MposTrantaste)
? ? ? ? transactions.each{ transaction ->
// 一筆交易的以下四張表的寫入在一個(gè)事務(wù)中
? ? ? ? ? ? hDao.callBatchTasks{
? ? ? ? ? ? ? ? def print= false
? ? ? ? ? ? ? ? if (transaction.flowno) {
? ? ? ? ? ? ? ? ? ? // Try to delete existing data that with the same order number
? ? ? ? ? ? ? ? ? ? def storeId= transaction.warehouseid
def orderNumber= transaction.flowno
def custId= transaction.custId
def deleteBuilder= pDao.deleteBuilder()
? ? ? ? ? ? ? ? ? ? deleteBuilder.where().eq('warehouseId', storeId).and().eq('flowno', orderNumber).and().eq('custId', custId)
? ? ? ? ? ? ? ? ? ? def rows= deleteBuilder.delete()
? ? ? ? ? ? ? ? ? ? if (rows> 0)
? ? ? ? ? ? ? ? ? ? ? ? log.info"Delete existing $rows rows from pos_tranpay with warehouseId='$storeId' and flowno='$orderNumber'"
? ? ? ? ? ? ? ? ? ? deleteBuilder= tsDao.deleteBuilder()
? ? ? ? ? ? ? ? ? ? deleteBuilder.where().eq('warehouseId', storeId).and().eq('flowno', orderNumber).and().eq('custId', custId)
? ? ? ? ? ? ? ? ? ? rows= deleteBuilder.delete()
? ? ? ? ? ? ? ? ? ? if (rows> 0)
? ? ? ? ? ? ? ? ? ? ? ? log.info"Delete existing $rows rows from pos_trantaste with warehouseId='$storeId' and flowno='$orderNumber'"
? ? ? ? ? ? ? ? ? ? deleteBuilder= dDao.deleteBuilder()
? ? ? ? ? ? ? ? ? ? deleteBuilder.where().eq('warehouseId', storeId).and().eq('flowno', orderNumber).and().eq('custId', custId)
? ? ? ? ? ? ? ? ? ? rows= deleteBuilder.delete()
? ? ? ? ? ? ? ? ? ? if (rows> 0)
? ? ? ? ? ? ? ? ? ? ? ? log.info"Delete existing $rows rows from pos_tranflow with warehouseId='$storeId' and flowno='$orderNumber'"
? ? ? ? ? ? ? ? ? ? deleteBuilder= oDao.deleteBuilder()
? ? ? ? ? ? ? ? ? ? deleteBuilder.where().eq('Warehouseid', storeId).and().eq('Flowno', orderNumber).and().eq('custId', custId)
? ? ? ? ? ? ? ? ? ? rows= deleteBuilder.delete()
? ? ? ? ? ? ? ? ? ? if (rows> 0)
? ? ? ? ? ? ? ? ? ? ? ? log.info"Delete existing $rows rows from pos_carddtl with warehouseId='$storeId' and flowno='$orderNumber'"
? ? ? ? ? ? ? ? ? ? deleteBuilder= cDao.deleteBuilder()
? ? ? ? ? ? ? ? ? ? deleteBuilder.where().eq('Warehouseid', storeId).and().eq('Flowno', orderNumber).and().eq('custId', custId)
? ? ? ? ? ? ? ? ? ? rows= deleteBuilder.delete()
? ? ? ? ? ? ? ? ? ? if (rows> 0)
? ? ? ? ? ? ? ? ? ? ? ? log.info"Delete existing $rows rows from pos_carddtl with warehouseId='$storeId' and flowno='$orderNumber'"
? ? ? ? ? ? ? ? ? ? deleteBuilder= hDao.deleteBuilder()
? ? ? ? ? ? ? ? ? ? deleteBuilder.where().eq('warehouseId', storeId).and().eq('flowno', orderNumber).and().eq('custId', custId)
? ? ? ? ? ? ? ? ? ? rows= deleteBuilder.delete()
? ? ? ? ? ? ? ? ? ? if (rows> 0)
? ? ? ? ? ? ? ? ? ? ? ? log.info"Delete existing $rows rows from pos_o2opaydtl with warehouseId='$storeId' and flowno='$orderNumber'"
? ? ? ? ? ? ? ? ? ? deleteBuilder= tdDao.deleteBuilder()
? ? ? ? ? ? ? ? ? ? deleteBuilder.where().eq('Warehouseid', storeId).and().eq('Flowno', orderNumber).and().eq('custId', custId)
? ? ? ? ? ? ? ? ? ? rows= deleteBuilder.delete()
? ? ? ? ? ? ? ? ? ? if (rows> 0)
? ? ? ? ? ? ? ? ? ? ? ? log.info"Delete existing $rows rows from pos_TicketDtl with warehouseId='$storeId' and Flowno='$orderNumber'"
? ? ? ? ? ? ? ? ? ? deleteBuilder= todDao.deleteBuilder()
? ? ? ? ? ? ? ? ? ? deleteBuilder.where().eq('Warehouseid', storeId).and().eq('posFlowno', orderNumber).and().eq('custId', custId)
? ? ? ? ? ? ? ? ? ? rows= deleteBuilder.delete()
? ? ? ? ? ? ? ? ? ? if (rows> 0)
? ? ? ? ? ? ? ? ? ? ? ? log.info"Delete existing $rows rows from takeOut_postranhead with warehouseId='$storeId' and posFlowno='$orderNumber'"
? ? ? ? ? ? ? ? ? ? if (transaction.deskNo) {
//? ? ? ? ? ? ? ? ? ? ? ? deleteBuilder = tDao.deleteBuilder()
//? ? ? ? ? ? ? ? ? ? ? ? deleteBuilder.where().eq('warehouseId', storeId).and().eq('tranFlowno', orderNumber).and().eq('custId', custId)
//? ? ? ? ? ? ? ? ? ? ? ? rows = deleteBuilder.delete()
//? ? ? ? ? ? ? ? ? ? ? ? if (rows > 0)
//? ? ? ? ? ? ? ? ? ? ? ? ? ? log.info "Delete existing $rows rows from pos_TicketDtl with warehouseId='$storeId' and flowno='$orderNumber'"
? ? ? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? ? ? print= true
? ? ? ? ? ? ? ? ? ? }
}
? ? ? ? ? ? ? ? transaction.with{
? ? ? ? ? ? ? ? ? ? //id = 0? ? ? ? ? ? ? // Don't use the ID on client-side
? ? ? ? ? ? ? ? ? ? if (serverType== 'SC')
? ? ? ? ? ? ? ? ? ? ? ? uploadFlag= 'N'? ? // Mark it uploaded
? ? ? ? ? ? ? ? ? ? else {
? ? ? ? ? ? ? ? ? ? ? ? uploadFlag= 'Y'? ? // Mark it uploaded
//更新桌邊點(diǎn)餐狀態(tài)
? ? ? ? ? ? ? ? ? ? ? ? if (transaction.jshopFlowno) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? def jDao= DaoManager.createDao(transConnSrc, MposJshopTransaction)
? ? ? ? ? ? ? ? ? ? ? ? ? ? UpdateBuilder updateBuilder= jDao.updateBuilder()
? ? ? ? ? ? ? ? ? ? ? ? ? ? updateBuilder.updateColumnValue('uploadFlag' ,'Y')
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .where().eq('flowNo', transaction.jshopFlowno).and().eq('warehouseid', transaction.warehouseid)
? ? ? ? ? ? ? ? ? ? ? ? ? ? updateBuilder.update()
? ? ? ? ? ? ? ? ? ? ? ? }
}
//? ? ? ? ? ? ? ? ? ? if (sellway == 'O' || sellway == 'F')? // 開班/交班交易诚些,手機(jī)端并沒有給交易單號,所以這里補(bǔ)填上
//? ? ? ? ? ? ? ? ? ? ? ? flowno = getNextOrderNumberOfDevice(connSrc, warehouseid, posNo)
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? hDao.create transaction
transaction.with{
? ? ? ? ? ? ? ? ? ? log.info"pos_tranhead inserted (id=$id,posNo=$posNo,flowno=$flowno,SellWay=$sellway,saleAmt=$saleAmt)"
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? transaction.details.each{ lineItem ->
//lineItem.id = 0
? ? ? ? ? ? ? ? ? ? if (serverType== 'SC')
? ? ? ? ? ? ? ? ? ? ? ? lineItem.uploadflag= 'N'? ? // Mark it uploaded
? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? lineItem.uploadflag= 'Y'? ? // Mark it uploaded
? ? ? ? ? ? ? ? ? ? dDao.create lineItem
log.info"pos_tranflow inserted (id=${lineItem.id})"
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? transaction.payments.each{ tender ->
//tender.id = 0
? ? ? ? ? ? ? ? ? ? if (serverType== 'SC')
? ? ? ? ? ? ? ? ? ? ? ? tender.uploadFlag= 'N'
? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? tender.uploadFlag= 'Y'
? ? ? ? ? ? ? ? ? ? pDao.create tender
log.info"pos_tranpay inserted (id=${tender.id})"
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? transaction.trantastes.each{ trantaste ->
trantaste.id= 0
? ? ? ? ? ? ? ? ? ? tsDao.create trantaste
log.info"pos_trantaste inserted (id=${trantaste.id})"
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? transaction.o2oPayDtls.each{ o2oPayDtl ->
o2oPayDtl.id= 0
? ? ? ? ? ? ? ? ? ? if (serverType== 'SC')
? ? ? ? ? ? ? ? ? ? ? ? o2oPayDtl.uploadFlag= 'N'
? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? o2oPayDtl.uploadFlag= 'Y'
? ? ? ? ? ? ? ? ? ? oDao.create o2oPayDtl
log.info"pos_o2opaydtl inserted (id=${o2oPayDtl.id})"
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? transaction.cardDtls.each{ cardDtl ->
cardDtl.id= 0
? ? ? ? ? ? ? ? ? ? if (serverType== 'SC')
? ? ? ? ? ? ? ? ? ? ? ? cardDtl.uploadFlag= 'N'
? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? cardDtl.uploadFlag= 'Y'
? ? ? ? ? ? ? ? ? ? cDao.create cardDtl
log.info"pos_carddtl inserted (id=${cardDtl.id})"
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? transaction.ticketDtls.each{ ticketDtls ->
if (serverType== 'SC')
? ? ? ? ? ? ? ? ? ? ? ? ticketDtls.uploadFlag= 'N'
? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ticketDtls.uploadFlag= 'Y'
? ? ? ? ? ? ? ? ? ? tdDao.create ticketDtls
log.info"pos_TicketDtl inserted (id=${ticketDtls.ticketNo})"
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? transaction.takeOutTrans.each{ takeOuttran ->
if (serverType== 'SC')
? ? ? ? ? ? ? ? ? ? ? ? takeOuttran.uploadFlag= 'N'
? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? takeOuttran.uploadFlag= 'Y'
? ? ? ? ? ? ? ? ? ? todDao.create takeOuttran
log.info"takeOut_postranhead inserted (id=${takeOuttran.posFlowno})"
? ? ? ? ? ? ? ? ? ? def deleteBuilder= tofdDao.deleteBuilder()
? ? ? ? ? ? ? ? ? ? deleteBuilder.where().eq('fmId', takeOuttran.fmId)
? ? ? ? ? ? ? ? ? ? int rows= deleteBuilder.delete()
? ? ? ? ? ? ? ? ? ? if (rows> 0)
? ? ? ? ? ? ? ? ? ? ? ? log.info"Delete existing $rows rows from takeOut_postranflow with fmId='$takeOuttran.fmId'"
? ? ? ? ? ? ? ? ? ? takeOuttran.tranflows.each{tranflow ->
tofdDao.create(tranflow)
? ? ? ? ? ? ? ? ? ? ? ? log.info"takeOut_postranflow inserted (id=${tranflow.fmId})"
? ? ? ? ? ? ? ? ? ? }
}
? ? ? ? ? ? ? ? if (transaction.deskNo&& serverType== 'SC') {
? ? ? ? ? ? ? ? ? ? def diningTable= tDao.queryBuilder().where().eq('deskNo', transaction.deskNo).queryForFirst()
? ? ? ? ? ? ? ? ? ? if (diningTable) {
? ? ? ? ? ? ? ? ? ? ? ? if (transaction.sellway!= 'B') { //退貨不改變桌子狀態(tài)
? ? ? ? ? ? ? ? ? ? ? ? ? ? diningTable.transferToIdleState()
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? tDao.update diningTable
log.info"pos_deskInfo of transaction.deskNo=${transaction.deskNo}is back to idle."
? ? ? ? ? ? ? ? ? ? ? ? // Push table status back
? ? ? ? ? ? ? ? ? ? ? ? pushServer.pushString gson.toJson([diningTable])
? ? ? ? ? ? ? ? ? ? }
}
? ? ? ? ? ? ? ? if (serverType== 'SC')
? ? ? ? ? ? ? ? ? ? callStoredProcedureForTransaction transaction
if (print)
? ? ? ? ? ? ? ? ? ? if (transaction.sellway== 'A' || transaction.sellway== 'B') {
? ? ? ? ? ? ? ? ? ? ? ? //TODO
//? ? ? ? ? ? ? ? ? ? ? ? PrintServer.printTrans(transaction.flowno, '0')
? ? ? ? ? ? ? ? ? ? }
}
}
}
? ? // 手機(jī) 交易類型 to 存儲過程參數(shù) map
? ? static spParamMap= [
? ? ? ? ? ? A:3,// 手機(jī)結(jié)賬? ? 調(diào)用存儲過程:exec Proc_POS_APP 2,3,交易單號,''
? ? ? ? ? ? C:2,// 交易取消? ? 調(diào)用存儲過程:exec Proc_POS_APP 2,2,點(diǎn)單單號,''
? ? ? ? ? ? B:5,// 整筆退餐? ? 調(diào)用存儲過程:exec Proc_POS_APP 2,5,交易單號,'
? ? ? ? ? ? O:3,// 開班
? ? ? ? ? ? F:3,// 交班
? ? ]
? ? // pc 交易類型 to 存儲過程參數(shù) map
? ? static sp2ParamMap= [
? ? ? ? ? ? A:6,// 手機(jī)結(jié)賬? ? 調(diào)用存儲過程:exec Proc_POS_APP 2,3,交易單號,''
? ? ? ? ? ? C:2,// 交易取消? ? 調(diào)用存儲過程:exec Proc_POS_APP 2,2,點(diǎn)單單號,''
? ? ? ? ? ? B:5,// 整筆退餐? ? 調(diào)用存儲過程:exec Proc_POS_APP 2,5,交易單號,'
? ? ? ? ? ? O:3,// 開班
? ? ? ? ? ? F:3,// 交班
? ? ]
? ? /**
* 調(diào)用存儲過程 for Transaction.
*/
? ? static void callStoredProcedureForTransaction(MposTransaction tran) {
? ? ? ? def param2= sp2ParamMap[tran.sellway]
? ? ? ? if (param2)
? ? ? ? ? ? callStoredProcedure(param2, tran.flowno)
//? ? ? ? if (tran.sellway == 'F') {
//? ? ? ? ? ? def connSrc = getDbConnection(false)
//? ? ? ? ? ? def dao = DaoManager.createDao(connSrc, MposShift)
//? ? ? ? ? ? def List shiftList = dao.queryBuilder().where()
//? ? ? ? ? ? ? ? ? ? .eq('fState', '2').and().eq('warehouseId', tran.warehouseid).and().eq("fPosNo", tran.posNo)
//? ? ? ? ? ? ? ? ? ? .query()
//? ? ? ? ? ? if (shiftList.size() > 0) {
//? ? ? ? ? ? ? ? def shiftNo = shiftList.get(shiftList.size() - 1)?.fShift
//? ? ? ? ? ? ? ? if (shiftNo) {
//? ? ? ? ? ? ? ? ? ? PrintServer.printShift(shiftNo, tran.posNo, dbConf.PrintName)
//? ? ? ? ? ? ? ? }
//? ? ? ? ? ? }
//? ? ? ? }
? ? }
? ? /**
* 調(diào)用存儲過程Proc_POS_APP皇型。
*
? ? * @param param2 操作動(dòng)作:
*
*? ? ?
1: 手機(jī)點(diǎn)單 *? ? ?
2: 交易取消 *? ? ?
3: 手機(jī)結(jié)賬 *? ? ?
4: 小票重印 *? ? ?
5: 整筆退單 *
? ? * @param flowno 交易單號
*/
? ? static void callStoredProcedure(int param2, String flowno) {
? ? ? ? def db= getDbConnection()
? ? ? ? if (dbType.contains("sqlite") || dbType== 'MySQL')
? ? ? ? ? ? return
? ? ? ? def dbConn
try {
? ? ? ? ? ? log.info"Call Proc_POS_APP(1, $param2, $flowno, '')"
? ? ? ? ? ? dbConn= db.getReadWriteConnection()
? ? ? ? ? ? def jdbcConn= (dbConnas JdbcDatabaseConnection).internalConnection
def sql= new Sql(jdbcConn)
? ? ? ? ? ? sql.call'{call dbo.Proc_POS_APP(?, ?, ?, ?)}',[1, param2, flowno,'']
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? e.printStackTrace()
? ? ? ? ? ? log.error"Call dbo.Proc_POS_APP(2, $param2, $flowno, '') failed", e
} finally {
? ? ? ? ? ? if (dbConn) db.releaseConnection dbConn
}
}
/*
static void doDeleteObject(storeId, deviceId, objectClass, numOfObjects, OutputStream output, InputStream input) {
log.info "[${storeId}_${deviceId}]Going to get ${numOfObjects} ${objectClass.toString()} objects"
String objectsInJSON = readLine(input)
log.info "[${storeId}_${deviceId}]Receive: ${objectsInJSON}"
if (objectClass == MposSalesOrder) { // 點(diǎn)餐數(shù)據(jù)交易取消
Type collectionType = new TypeToken>() {}.getType()
def gson = createGson()
List salesOrders = gson.fromJson(objectsInJSON, collectionType)
if (salesOrders) {
log.info "Deserialized salesOrders: $salesOrders"
def connSrc = getDbConnection()
def tDao = DaoManager.createDao(connSrc, MposDiningTable)
def sDao = DaoManager.createDao(connSrc, MposSalesOrder)
def diningTableId = salesOrders[0].diningTableId
def orderNumber = salesOrders[0].orderNumber
tDao.callBatchTasks {
def diningTable = tDao.queryForId(diningTableId)
try {
List objects = mpos查詢某張桌子的點(diǎn)單數(shù)據(jù)2(connSrc, storeId, deviceId, diningTableId)
for (salesOrder in objects) {
sDao.delete salesOrder
log.info "delete: $salesOrder"
}
System.out.println('salesOrders1.size=' + salesOrders.size())
objects ? System.out.println('objects.size=' + objects.size()) : System.out.println('objects is null')
} catch (Exception e) {
System.out.println('salesOrders2.size=' + salesOrders.size())
for (salesOrder in salesOrders) {
sDao.delete salesOrder
log.info "delete: $salesOrder"
}
}
// 清除桌子對應(yīng)的點(diǎn)單號
diningTable.orderNumber = ''
// 桌子狀態(tài)為被未占用
diningTable.state = 'N'
tDao.update(diningTable)
// Push table status back
pushServer.pushString gson.toJson([diningTable])
}
}
}
output << 'ok\n'
log.info "[${storeId}_${deviceId}]Send: ok"
}
*/
? ? /**
* Server-side getObject protocol handler.
*
* Protocols:
*? ? ? ? Server? ? ? ? ? ? ? ? Client
* --------------------? --------------------
*? "getObject {store_id}_{device_id}{class_name}\n"
*? ? ? ? ? <----------------------
*{JSON stream of objects}\n
*? ? ? ? ? ---------------------->
*? ? ? ? ? ? "ok\n" or "ng\n"
*? ? ? ? ? <----------------------
*
*/
? ? static void doGetObject(storeId, deviceId, Class objectClass, String argument,
OutputStream output, InputStream input) {
? ? ? ? log.info"[${storeId}_${deviceId}]Going to get ${objectClass.toString()}objects"
? ? ? ? //output.withWriter('UTF-8') { writer ->
? ? ? ? def connSrc= getDbConnection()
? ? ? ? def transConnSrc= getDbConnection(false)
? ? ? ? List objects
switch (objectClass) {
? ? ? ? ? ? case MposSalesOrder:// 查詢某張桌子的點(diǎn)單數(shù)據(jù)
? ? ? ? ? ? ? ? def diningTableId= argument.toInteger() // 參數(shù)會傳入桌子的id
? ? ? ? ? ? ? ? objects= mpos查詢某張桌子的點(diǎn)單數(shù)據(jù)(transConnSrc, storeId, deviceId, diningTableId)
? ? ? ? ? ? ? ? break
? ? ? ? ? ? case MposTransaction:// 如果要查詢歷史交易诬烹,參數(shù)會傳入桌子代號
? ? ? ? ? ? ? ? objects= queryTodayTransactionForDiningTable(transConnSrc, storeId, argument)
? ? ? ? ? ? ? ? break
? ? ? ? ? ? case MposShiftReport:// 如果要查詢交班報(bào)表,client端會帶上日期
? ? ? ? ? ? ? ? objects= queryShiftReportOfCertainDate(transConnSrc, storeId, argument)
? ? ? ? ? ? ? ? break
? ? ? ? ? ? case MposDiningArea://獲取桌子信息
? ? ? ? ? ? ? ? objects= queryDiningArea(connSrc, transConnSrc)
? ? ? ? ? ? ? ? break
? ? ? ? ? ? default:
def dao= DaoManager.createDao(connSrc, objectClass)
? ? ? ? ? ? ? ? objects= dao.queryForAll()
? ? ? ? }
//? ? ? ? queryOtherAssociatedData connSrc, objects, objectClass
? ? ? ? def gson= createGson()
? ? ? ? def json= gson.toJson(objects)
? ? ? ? output<< json
output<< '\n'
? ? ? ? output.flush()
? ? ? ? log.info"[${storeId}_${deviceId}]Send ${objectClass.simpleName}: ${json}"
? ? ? ? def response= readLine(input)
? ? ? ? if (response)
? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Client response: ${response}"
? ? ? ? else
? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Client disconnected."
? ? }
? ? /** 獲取桌子信息 并且將mater庫的桌子信息轉(zhuǎn)到trans庫里**/
? ? static List queryDiningArea(connSrc, transConnSrc) {
? ? ? ? def dao= DaoManager.createDao(connSrc, MposDiningArea)
? ? ? ? def dao2= DaoManager.createDao(transConnSrc, MposDiningArea)
? ? ? ? def tdao= DaoManager.createDao(connSrc, MposDiningTable)
? ? ? ? def tdao2= DaoManager.createDao(transConnSrc, MposDiningTable)
? ? ? ? if (masterVersion!= AppClient.masterVersion) {//當(dāng)主檔有更新時(shí)需要把master庫的區(qū)域表和桌子表轉(zhuǎn)到trans庫對應(yīng)的表中
? ? ? ? ? ? def areaList= dao.queryForAll()
? ? ? ? ? ? //2018-01-05 @pingping 將區(qū)域全刪除再插入
? ? ? ? ? ? dao2.deleteBuilder().delete()
? ? ? ? ? ? for (MposDiningArea areain areaList) {
//? ? ? ? ? ? List areaList2 = dao2.queryBuilder().where().eq("roomNo", area.roomNo).query()
//? ? ? ? ? ? if (!areaList2) {
? ? ? ? ? ? ? ? dao2.create(area)//桌子區(qū)域放到trans庫
//? ? ? ? ? ? } else {
//? ? ? ? ? ? ? ? if (areaList2.get(0).roomName != area.roomName) {
//? ? ? ? ? ? ? ? ? ? areaList2.get(0).roomName = area.roomName
//? ? ? ? ? ? ? ? ? ? dao2.update(areaList2.get(0))
//? ? ? ? ? ? ? ? }
//? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? def tableList= tdao.queryForAll()
? ? ? ? ? ? //2018-01-05 @pingping 先刪除未開桌的桌子弃鸦,再插入
? ? ? ? ? ? DeleteBuilder deleteBuilder= tdao2.deleteBuilder()
? ? ? ? ? ? deleteBuilder.where().ne("State","Y")
? ? ? ? ? ? deleteBuilder.delete()
? ? ? ? ? ? for (MposDiningTable table : tableList) {
? ? ? ? ? ? ? ? List list2= tdao2.queryBuilder().where().eq('fId', table.fId).query()
? ? ? ? ? ? ? ? if (list2) {
? ? ? ? ? ? ? ? ? ? if (list2.get(0).deskName!= table.deskName) {
? ? ? ? ? ? ? ? ? ? ? ? list2.get(0).deskName= table.deskName
tdao2.update(list2.get(0))
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? if (list2.get(0).roomNo!= table.roomNo) {
? ? ? ? ? ? ? ? ? ? ? ? list2.get(0).roomNo= table.roomNo
tdao2.update(list2.get(0))
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? if (list2.get(0).tranFlowno!= '' && list2.get(0).state!= 'Y') {
? ? ? ? ? ? ? ? ? ? ? ? list2.get(0).tranFlowno= table.tranFlowno
tdao2.update(list2.get(0))
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? tdao2.create(table)//桌子信息放到trans庫
? ? ? ? ? ? ? ? }
}
? ? ? ? ? ? masterVersion= AppClient.masterVersion
}
? ? ? ? def objects= dao2.queryForAll()//取trans庫的桌子區(qū)域
? ? ? ? for (MposDiningArea areain objects) {
? ? ? ? ? ? def list= tdao2.queryForEq('roomNo', area.roomNo)//取trans庫的桌子信息
? ? ? ? ? ? if (list.size() == 0)
? ? ? ? ? ? ? ? masterVersion= ""
? ? ? ? ? ? area.diningTables= list
}
? ? ? ? return objects
}
? ? /** 判斷交易是否已經(jīng)被退貨绞吁。 */
? ? static boolean isTransactonRefund(connSrc, storeId, deviceId, flowno) {
? ? ? ? def tDao= DaoManager.createDao(connSrc, MposTransaction)
? ? ? ? GenericRawResults rawResults= tDao.queryRaw(
? ? ? ? ? ? ? ? "select 1 from pos_tranhead where WarehouseID='${storeId}' and rtnflowno = '${flowno}'")
? ? ? ? List results= rawResults.getResults()
? ? ? ? if (results) {
? ? ? ? ? ? String[] resultArray= results.get(0)
? ? ? ? ? ? if (resultArray) {
? ? ? ? ? ? ? ? return true
? ? ? ? ? ? }
}
? ? ? ? return false
? ? }
? ? /** 求某個(gè)手機(jī)本日的下個(gè)交易單號。從pos_tranflowhd和pos_tranhead中取最大者+1唬格。 */
? ? static String getNextOrderNumberOfDevice(connSrc, storeId, deviceId) {
? ? ? ? def sDao= DaoManager.createDao(connSrc, MposSalesOrder)
? ? ? ? def yyyymmdd= String.format('%1$tY%1$tm%1$td',new Date())
? ? ? ? deviceId= String.format('%02d', deviceId.toInteger()) // two-digit device ID
? ? ? ? GenericRawResults rawResults= sDao.queryRaw(
? ? ? ? ? ? ? ? "select MAX(flowno) from pos_tranflowhd where WarehouseID='${storeId}' and flowno like '${deviceId}${yyyymmdd}%'")
? ? ? ? List results= rawResults.getResults()
? ? ? ? int maxSequence= 0
? ? ? ? if (results) {
? ? ? ? ? ? String[] resultArray= results.get(0)
? ? ? ? ? ? if (resultArray) {
? ? ? ? ? ? ? ? String maxOrderNumber= resultArray[0]
? ? ? ? ? ? ? ? maxSequence= (maxOrderNumber?.substring(10) ?:'0').toInteger()
? ? ? ? ? ? }
}
? ? ? ? maxSequence++
? ? ? ? rawResults= sDao.queryRaw(
? ? ? ? ? ? ? ? "select MAX(flowno) from pos_tranhead where WarehouseID='${storeId}' and flowno like '${deviceId}${yyyymmdd}%'")
? ? ? ? results= rawResults.getResults()
? ? ? ? if (results) {
? ? ? ? ? ? String[] resultArray= results.get(0)
? ? ? ? ? ? if (resultArray) {
? ? ? ? ? ? ? ? String maxOrderNumber= resultArray[0]
? ? ? ? ? ? ? ? maxSequence= Math.max((maxOrderNumber?.substring(10) ?:'0').toInteger() + 1, maxSequence)
? ? ? ? ? ? }
}
? ? ? ? def newSequence= String.format('%04d', maxSequence) // four-digit order number
? ? ? ? return "${deviceId}${yyyymmdd}${newSequence}"
? ? }
? ? /** 查詢本日某張桌子的交易家破。 */
? ? static List queryTodayTransactionForDiningTable(connSrc, storeId, diningTableCode) {
? ? ? ? def today= new SimpleDateFormat("yyyy-MM-dd").format(new Date())
? ? ? ? def dao= DaoManager.createDao(connSrc, MposTransaction)
? ? ? ? dao.queryBuilder().where()
? ? ? ? ? ? ? ? .eq('accdate', today).and().eq('deskNo', diningTableCode)
? ? ? ? ? ? ? ? .query()
? ? }
? ? static List queryShiftReportOfCertainDate(connSrc, storeId, date) {
? ? ? ? def dao= DaoManager.createDao(connSrc, MposShiftReport)
? ? ? ? dao.queryBuilder()
? ? ? ? ? ? ? ? .orderBy('flowno',false)
? ? ? ? ? ? ? ? .where().eq('warehouseId', storeId).and().eq('accdate', date)
? ? ? ? ? ? ? ? .query()
? ? }
? ? static List mpos查詢某張桌子的點(diǎn)單數(shù)據(jù)(transConnSrc, storeId, deviceId, diningTableId) {
? ? ? ? def tDao= DaoManager.createDao(transConnSrc, MposDiningTable)
? ? ? ? def diningTable= tDao.queryForId(diningTableId)
? ? ? ? def orderNo= diningTable.tranFlowno// 當(dāng)前對應(yīng)的點(diǎn)單號
? ? ? ? def sDao= DaoManager.createDao(transConnSrc, MposSalesOrder)
? ? ? ? List salesOrders
if (orderNo) {
? ? ? ? ? ? salesOrders= sDao.queryBuilder()
? ? ? ? ? ? ? ? ? ? .orderBy('id',true)
? ? ? ? ? ? ? ? ? ? .where().eq('flowno', orderNo)
? ? ? ? ? ? ? ? ? ? .query()
? ? ? ? }
? ? ? ? if (!salesOrders) { // 如果找不到這張桌子的任何點(diǎn)餐數(shù)據(jù),就生成一筆空記錄购岗,里面只包含了新的點(diǎn)單號
? ? ? ? ? ? def nextOrderNumber= getNextOrderNumberOfDevice(getDbConnection(false), storeId, deviceId)
? ? ? ? ? ? salesOrders= [new MposSalesOrder(flowno: nextOrderNumber, diningTableId: diningTableId)]
? ? ? ? } else {
? ? ? ? ? ? // Fill some non-database fields
? ? ? ? ? ? salesOrders.each{ MposSalesOrder salesOrder ->
salesOrder.diningTableId= diningTableId
salesOrder.lastSaleQty= salesOrder.saleQty.setScale(3,4)
? ? ? ? ? ? ? ? salesOrder.lastItemseq= salesOrder.itemseq.setScale(0)
? ? ? ? ? ? }
}
? ? ? ? return salesOrders
}
//? ? static List mpos查詢某張桌子的點(diǎn)單數(shù)據(jù)2(connSrc, storeId, deviceId, diningTableId) {
//? ? ? ? def tDao = DaoManager.createDao(connSrc, MposDiningTable)
//? ? ? ? def diningTable = tDao.queryForId(diningTableId)
//? ? ? ? def orderNo = diningTable.tranFlowno // 當(dāng)前對應(yīng)的點(diǎn)單號
//? ? ? ? def sDao = DaoManager.createDao(connSrc, MposSalesOrder)
//? ? ? ? List salesOrders
//? ? ? ? if (orderNo) {
//? ? ? ? ? ? salesOrders = sDao.queryBuilder()
//? ? ? ? ? ? ? ? ? ? .orderBy('itemseq', true)
//? ? ? ? ? ? ? ? ? ? .where().eq('flowno', orderNo)
//? ? ? ? ? ? ? ? ? ? .query()
//? ? ? ? }
//? ? ? ? if (!salesOrders) { // 如果找不到這張桌子的任何點(diǎn)餐數(shù)據(jù)汰聋,返回null
//? ? ? ? ? ? return salesOrders
//? ? ? ? } else {
//? ? ? ? ? ? // Fill some non-database fields
//? ? ? ? ? ? salesOrders.each { MposSalesOrder salesOrder ->
//? ? ? ? ? ? ? ? salesOrder.diningTableId = diningTableId
//? ? ? ? ? ? ? ? salesOrder.lastSaleQty = salesOrder.saleQty.setScale(0)
//? ? ? ? ? ? ? ? salesOrder.lastItemseq = salesOrder.itemseq.setScale(0)
//? ? ? ? ? ? }
//? ? ? ? }
//? ? ? ? return salesOrders
//? ? }
//? ? static List mpos查詢某張桌子的點(diǎn)單差異表數(shù)據(jù)(connSrc, storeId, deviceId, diningTableId) {
//? ? ? ? def tDao = DaoManager.createDao(connSrc, MposDiningTable)
//? ? ? ? def diningTable = tDao.queryForId(diningTableId)
//? ? ? ? def orderNo = diningTable.tranFlowno // 當(dāng)前對應(yīng)的點(diǎn)單號
//? ? ? ? def diffDao = DaoManager.createDao(connSrc, MposDiffSalesOrder)
//? ? ? ? List diffSalesOrders
//? ? ? ? if (orderNo) {
//? ? ? ? ? ? try {
//? ? ? ? ? ? ? ? diffSalesOrders = diffDao.queryBuilder()
//? ? ? ? ? ? ? ? ? ? ? ? .orderBy('itemseq', true)
//? ? ? ? ? ? ? ? ? ? ? ? .where().eq('flowno', orderNo)
//? ? ? ? ? ? ? ? ? ? ? ? .query()
//? ? ? ? ? ? } catch (Exception e) {
//? ? ? ? ? ? ? ? log.error e.message, e
//? ? ? ? ? ? }
//? ? ? ? }
//? ? ? ? return diffSalesOrders? // 如果找不到這張桌子的任何點(diǎn)餐數(shù)據(jù),返回null
//? ? ? ? // Fill some non-database fields
//? ? ? ? // diffSalesOrders.each { MposDiffSalesOrder diffSalesOrder ->
//? ? ? ? //? ? diffSalesOrder.diningTableId = diningTableId
//? ? ? ? // }
//? ? }
? ? static void queryOtherAssociatedData(ConnectionSource connSrc, List objects, Class objectClass) {
? ? ? ? if (objectClass== MposDiningArea) {
? ? ? ? ? ? def dao= DaoManager.createDao(connSrc, MposDiningTable)
? ? ? ? ? ? for (MposDiningArea areain objects) {
? ? ? ? ? ? ? ? area.diningTables= dao.queryForEq('roomNo', area.roomNo)
? ? ? ? ? ? ? ? if (!area.diningTables)
? ? ? ? ? ? ? ? ? ? continue
? ? ? ? ? ? ? ? // Fix table state if it is inconsistent with its order number
//? ? ? ? ? ? ? ? for (MposDiningTable table in area.diningTables) {
//? ? ? ? ? ? ? ? ? ? if (table.orderNumber && table.state != 'Y') {
//? ? ? ? ? ? ? ? ? ? ? ? table.state = 'Y'
//? ? ? ? ? ? ? ? ? ? ? ? dao.update table
//? ? ? ? ? ? ? ? ? ? } else if (!table.orderNumber && table.state != 'N') {
//? ? ? ? ? ? ? ? ? ? ? ? table.state = 'N'
//? ? ? ? ? ? ? ? ? ? ? ? dao.update table
//? ? ? ? ? ? ? ? ? ? }
//? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
}
}
? ? static void doGetApkVersion(storeId, deviceId, OutputStream output, InputStream input) {
? ? ? ? // Find latest apk's release note JSON file
? ? ? ? def fs= ('apk' as File).listFiles()?.sort()?.collect{ it.name}
? ? ? ? def jsonFile= fs ? fs[-1] :null
? ? ? ? log.info"[${storeId}_${deviceId}]The last file in apk/: ${jsonFile}"
? ? ? ? if (jsonFile?.endsWith('.json'))
? ? ? ? ? ? doGetFile storeId, deviceId,['apk', jsonFile] as File, output, input
else {
? ? ? ? ? ? log.info"[${deviceId}]Cannot find any latest apk version info."
? ? ? ? ? ? output<< '0\n'
? ? ? ? ? ? def response= readLine(input)
? ? ? ? ? ? if (response)
? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Client response: ${response}"
? ? ? ? ? ? else
? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Client disconnected."
? ? ? ? }
}
? ? /**
* Server-side getPosVersion protocol handler.
*
*? ? ? ? Server? ? ? ? ? ? ? ? Client
* --------------------? --------------------
*? ? ? ? "getPosVersion {store_id}_{device_id}\n"
*? ? ? ? ? <----------------------
*? ? ? ? ? ? "{json_file_size}\n"
*? ? ? ? ? ---------------------->
*? ? ? ? ? ? "{file content}"
*? ? ? ? ? ---------------------->
*? ? ? ? ? ? "ok\n" or "ng\n"
*? ? ? ? ? <----------------------
*
*/
? ? static void doGetPosVersion(storeId, deviceId, OutputStream output, InputStream input) {
? ? ? ? // Find latest pos's release note JSON file
? ? ? ? def fs= (('update/' + deviceId) as File).listFiles(new FilenameFilter() {
? ? ? ? ? ? @Override
boolean accept(File dir, String name) {
? ? ? ? ? ? ? ? log.info'===== ' + name
return name.lastIndexOf('.json') > 0
? ? ? ? ? ? }
? ? ? ? })?.sort()?.collect{ it.name}
? ? ? ? def jsonFile= fs ? fs[-1] :null
? ? ? ? log.info"[${storeId}_${deviceId}]The last file in pos/: ${jsonFile}"
? ? ? ? if (jsonFile?.endsWith('.json'))
? ? ? ? ? ? doGetFile storeId, deviceId,['update/' + deviceId, jsonFile] as File, output, input
else {
? ? ? ? ? ? log.info"[${deviceId}]Cannot find any latest pos version info."
? ? ? ? ? ? output<< '0\n'
? ? ? ? ? ? def response= readLine(input)
? ? ? ? ? ? if (response)
? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Client response: ${response}"
? ? ? ? ? ? else
? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Client disconnected."
? ? ? ? }
}
? ? static void upPosVersion(String custId, String storeId, String deviceId, String version, String type, String date, OutputStream output, InputStream input) {
? ? ? ? if (serverType== 'HQ') {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? def jdbcConn= (getDbConnection(false).getReadWriteConnection() as JdbcDatabaseConnection).getInternalConnection()
? ? ? ? ? ? ? ? Sql sql= new Sql(jdbcConn)
? ? ? ? ? ? ? ? SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String todayStr= sdf.format(new Date());
String sqlStr= "select id from pos_masterversion where custId='${custId}' and warehouseId='${storeId}' " +
? ? ? ? ? ? ? ? ? ? ? ? "and posNo='${deviceId}' and type='${type}'"
? ? ? ? ? ? ? ? log.info(sqlStr)
? ? ? ? ? ? ? ? def connSrc= getDbConnection()
? ? ? ? ? ? ? ? def sDao= DaoManager.createDao(connSrc, MposItemSet)
? ? ? ? ? ? ? ? GenericRawResults rawResults= sDao.queryRaw(sqlStr)
? ? ? ? ? ? ? ? if (rawResults.size() > 0) {
? ? ? ? ? ? ? ? ? ? sqlStr= "update pos_masterversion set version='${version}', updateTime='${todayStr}', memo = '${date ?:''}' " +
? ? ? ? ? ? ? ? ? ? ? ? ? ? "where custId='${custId}' and warehouseId='${storeId}' and posNo='${deviceId}' and type='${type}'"
? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? sqlStr= "insert into pos_masterversion values('${custId}','${storeId}','${deviceId}','${version}','${type}','${todayStr}','${date ?:''}')"
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? log.info(sqlStr)
? ? ? ? ? ? ? ? sql.execute(sqlStr)
? ? ? ? ? ? } catch (Exception e) {
? ? ? ? ? ? ? ? log.warn"[${storeId}_${deviceId}]upPosVersion failed", e
log.info(e.getMessage())
? ? ? ? ? ? ? ? if (e.getMessage().contains('maximum connections reached')) {
? ? ? ? ? ? ? ? ? ? System.exit(1)
? ? ? ? ? ? ? ? }
}
}
}
? ? /**
* Server-side getMasterVersion protocol handler.
*
*? ? ? ? Server? ? ? ? ? ? ? ? Client
* --------------------? --------------------
*? ? ? ? "getMasterVersion {store_id}_{device_id}\n"
*? ? ? ? ? <----------------------
*? ? ? ? ? ? "{json_file_size}\n"? or -1 if upload directory is not empty
*? ? ? ? ? ---------------------->
*? ? ? ? ? ? "{file content}"
*? ? ? ? ? ---------------------->
*? ? ? ? ? ? "ok\n" or "ng\n"
*? ? ? ? ? <----------------------
*
*/
? ? static void doGetMasterVersion(storeId, deviceId, OutputStream output, InputStream input) {
? ? ? ? // Find latest master's release note JSON file
? ? ? ? def dirStr= 'db'
? ? ? ? if (serverType== 'HQ')
? ? ? ? ? ? dirStr= "db/${deviceId}/${storeId}"
? ? ? ? def fs= (dirStras File).listFiles()?.sort()?.collect{ it.name}
? ? ? ? def jsonFile= fs ? fs[-1] :null
? ? ? ? if (jsonFile?.endsWith('.json'))
? ? ? ? ? ? doGetFile storeId, deviceId,[dirStr, jsonFile] as File, output, input
else {
? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Cannot find any latest master version info."
? ? ? ? ? ? output<< '0\n'
? ? ? ? ? ? def response= readLine(input)
? ? ? ? ? ? if (response)
? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Client response: ${response}"
? ? ? ? ? ? else
? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Client disconnected."
? ? ? ? }
}
? ? /**
* Server-side putFile protocol handler.
*
*? ? ? ? Server? ? ? ? ? ? ? ? Client
* --------------------? --------------------
*? ? ? ? ? "checkSellOff {store_id}_{device_id}{pluno}\n"
*? ? ? ? ? <----------------------
*? ? ? ? ? ? "ok\n" or "nofound\n" or "ng\n"
*? ? ? ? ? ---------------------->
*
*
*/
? ? static void checkSellOff(storeId, deviceId, String pluno, OutputStream output, InputStream input) {
? ? ? ? try {
? ? ? ? ? ? def connSrc= getDbConnection()
? ? ? ? ? ? def sDao= DaoManager.createDao(connSrc, MposItemSet)
? ? ? ? ? ? GenericRawResults rawResults= sDao.queryRaw(
? ? ? ? ? ? ? ? ? ? "select tranType from tbl_itemset where tranType=1 and pluno = '${pluno}'")
? ? ? ? ? ? List results= rawResults.getResults()
? ? ? ? ? ? if (results) {
? ? ? ? ? ? ? ? output<< 'off\n'
? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Send ok."
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? output<< 'ok\n'
? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Send nofound."
? ? ? ? ? ? }
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? log.warn"[${storeId}_${deviceId}]checkSellOff failed", e
output<< 'ng\n'
? ? ? ? }
? ? ? ? def response= readLine(input)
? ? ? ? if (response)
? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Client response: ${response}"
? ? ? ? else
? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Client disconnected."
? ? }
? ? /**
* Server-side getTransaction protocol handler.
*
*? ? ? ? Server? ? ? ? ? ? ? ? Client
* --------------------? --------------------
*? ? ? ? ? "getTransaction {store_id}_{device_id}{flowno}\n"
*? ? ? ? ? <----------------------
*? ? ? ? ? ? transaction / null
*? ? ? ? ? ---------------------->
*
*
*/
? ? static void getTransaction(storeId, deviceId, String flowno, OutputStream output, InputStream input) {
? ? ? ? try {
? ? ? ? ? ? def connSrc= getDbConnection(false)
? ? ? ? ? ? if (isTransactonRefund(connSrc, storeId,'', flowno)) {
? ? ? ? ? ? ? ? output<< 'ng refund\n'
? ? ? ? ? ? ? ? return
? ? ? ? ? ? }
? ? ? ? ? ? def hDao= DaoManager.createDao(connSrc, MposTransaction)
? ? ? ? ? ? def dDao= DaoManager.createDao(connSrc, MposLineItem)
? ? ? ? ? ? def pDao= DaoManager.createDao(connSrc, MposTransactionTender)
? ? ? ? ? ? def tDao= DaoManager.createDao(connSrc, MposTicketDtl)
? ? ? ? ? ? def oDao= DaoManager.createDao(connSrc, MposO2oPayDtl)
? ? ? ? ? ? def cDao= DaoManager.createDao(connSrc, MposCardDtl)
? ? ? ? ? ? List transactions= hDao.queryBuilder()
? ? ? ? ? ? ? ? ? ? .where().eq('warehouseId', storeId).and().eq('flowno', flowno)
? ? ? ? ? ? ? ? ? ? .query()
? ? ? ? ? ? MposTransaction transaction
if (transactions) {
? ? ? ? ? ? ? ? transaction= transactions[0]
? ? ? ? ? ? ? ? if (transaction.sellway!= 'A') {
? ? ? ? ? ? ? ? ? ? output<< 'ng sale\n'
? ? ? ? ? ? ? ? ? ? return
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? transaction.details= dDao.queryBuilder().where().eq('warehouseId', storeId).and().eq('flowno', flowno)
? ? ? ? ? ? ? ? ? ? ? ? .query()
? ? ? ? ? ? ? ? transaction.payments= pDao.queryBuilder().where().eq('warehouseId', storeId).and().eq('flowno', flowno)
? ? ? ? ? ? ? ? ? ? ? ? .query()
? ? ? ? ? ? ? ? transaction.o2oPayDtls= oDao.queryBuilder().where().eq('Warehouseid', storeId).and().eq('Flowno', flowno)
? ? ? ? ? ? ? ? ? ? ? ? .query()
? ? ? ? ? ? ? ? transaction.cardDtls= cDao.queryBuilder().where().eq('Warehouseid', storeId).and().eq('Flowno', flowno)
? ? ? ? ? ? ? ? ? ? ? ? .query()
? ? ? ? ? ? ? ? transaction.ticketDtls= tDao.queryBuilder().where().eq('WarehouseID', storeId).and().eq('Flowno', flowno)
? ? ? ? ? ? ? ? ? ? ? ? .query()
? ? ? ? ? ? }
? ? ? ? ? ? def objects= transaction ?[transaction] :[]
? ? ? ? ? ? def gson= createGson()
? ? ? ? ? ? def json= gson.toJson(objects)
? ? ? ? ? ? output<< json
output<< '\n'
? ? ? ? ? ? output.flush()
? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Send ${MposTransaction.simpleName}: ${json}"
? ? ? ? ? ? def response= readLine(input)
? ? ? ? ? ? if (response)
? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Client response: ${response}"
? ? ? ? ? ? else
? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Client disconnected."
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? log.warn"[${storeId}_${deviceId} ${flowno}]getTransaction failed", e
output<< 'ng\n'
? ? ? ? }
}
? ? /**
* Server-side getTransactionInfos protocol handler.
*
*? ? ? ? Server? ? ? ? ? ? ? ? Client
* --------------------? --------------------
*? ? ? ? ? "getTransactionInfos {store_id}_{device_id}{accday}\n"
*? ? ? ? ? <----------------------
*? ? ? ? ? ? transactions / null
*? ? ? ? ? ---------------------->
*
*
*/
? ? static void getTransactionInfos(storeId, deviceId, String diningTableCode, OutputStream output, InputStream input) {
? ? ? ? try {
? ? ? ? ? ? def connSrc= getDbConnection(false)
? ? ? ? ? ? def today= new SimpleDateFormat("yyyy-MM-dd").format(new Date())
? ? ? ? ? ? def dao= DaoManager.createDao(connSrc, MposTransaction)
? ? ? ? ? ? List transactions= dao.queryBuilder().where()
? ? ? ? ? ? ? ? ? ? .eq('accdate', today).and().eq('deskNo', diningTableCode)
? ? ? ? ? ? ? ? ? ? .and().in('sellway','A','B')
? ? ? ? ? ? ? ? ? ? .query()
? ? ? ? ? ? Map map= [:]
? ? ? ? ? ? transactions.each{
? ? ? ? ? ? ? ? map[it.flowno] = it
}
? ? ? ? ? ? GenericRawResults rawResults= dao.queryRaw(
? ? ? ? ? ? ? ? ? ? """select RtnFlowNo from pos_tranhead where RtnFlowNo in
(select flowno from pos_tranhead where Accdate='${today}' and Sellway = 'A')""")
? ? ? ? ? ? List results= rawResults.getResults()
? ? ? ? ? ? if (results) {
? ? ? ? ? ? ? ? results.each{ String[] rtnFlowNo ->
MposTransaction t= map[rtnFlowNo[0]]
? ? ? ? ? ? ? ? ? ? if (t)
? ? ? ? ? ? ? ? ? ? ? ? t.rtnFlowNo= 'Y'
? ? ? ? ? ? ? ? }
}
? ? ? ? ? ? def gson= createGson()
? ? ? ? ? ? def json= gson.toJson(transactions)
? ? ? ? ? ? output<< json
output<< '\n'
? ? ? ? ? ? output.flush()
? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Send ${MposTransaction.simpleName}: ${json}"
? ? ? ? ? ? def response= readLine(input)
? ? ? ? ? ? if (response)
? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Client response: ${response}"
? ? ? ? ? ? else
? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Client disconnected."
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? log.warn"[${storeId}_${deviceId} ${diningTableCode}]getTransactionInfos failed", e
output<< 'ng\n'
? ? ? ? }
}
? ? /**
* Server-side getTransactionsAndShifts protocol handler.
*
*? ? ? ? Server? ? ? ? ? ? ? ? Client
* --------------------? --------------------
*? ? ? ? ? "getTransactionsAndShifts ${storeId}_${posNo}_${custId} ${startDate} ${endDate}\n"
*? ? ? ? ? <----------------------
*? ? ? ? ? ? transactions / null
*? ? ? ? ? ---------------------->
*? ? ? ? ? shifts / null
*? ? ? ? ? ---------------------->
*? ? ? ? ? shiftReports / null
*? ? ? ? ? ---------------------->
*
*
*/
? ? static void getTransactionsAndShifts(custId, storeId, deviceId, startDate, endDate, OutputStream output, InputStream input) {
? ? ? ? try {
? ? ? ? ? ? SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date sDate= sdf.parse(startDate+' 00:00:00');
Date eDate= sdf.parse(endDate+' 23:59:59');
startDate= sdf.format(sDate)
? ? ? ? ? ? endDate= sdf.format(eDate)
? ? ? ? ? ? def connSrc= getDbConnection(false)
? ? ? ? ? ? def dao= DaoManager.createDao(connSrc, MposTransaction)
? ? ? ? ? ? def dDao= DaoManager.createDao(connSrc, MposLineItem)
? ? ? ? ? ? def pDao= DaoManager.createDao(connSrc, MposTransactionTender)
? ? ? ? ? ? def tDao= DaoManager.createDao(connSrc, MposTicketDtl)
? ? ? ? ? ? def oDao= DaoManager.createDao(connSrc, MposO2oPayDtl)
? ? ? ? ? ? def cDao= DaoManager.createDao(connSrc, MposCardDtl)
? ? ? ? ? ? def sDao= DaoManager.createDao(connSrc, MposShift)
? ? ? ? ? ? def srDao= DaoManager.createDao(connSrc, MposShiftReport)
? ? ? ? ? ? List transactions= dao.queryBuilder().where().eq('custId', custId).and()
? ? ? ? ? ? ? ? ? ? .eq('warehouseId', storeId).and().eq('PosNo', deviceId).and().between('OperDate', sDate, eDate)
//? ? ? ? ? ? ? ? ? ? .le('Accdate', endDate).and().ge('Accdate', startDate)
? ? ? ? ? ? ? ? ? ? .query()
? ? ? ? ? ? for (MposTransaction transaction : transactions) {
? ? ? ? ? ? ? ? transaction.details= dDao.queryBuilder().where().eq('warehouseId', storeId).and().eq('flowno', transaction.flowno)
? ? ? ? ? ? ? ? ? ? ? ? .query()
? ? ? ? ? ? ? ? transaction.payments= pDao.queryBuilder().where().eq('warehouseId', storeId).and().eq('flowno', transaction.flowno)
? ? ? ? ? ? ? ? ? ? ? ? .query()
? ? ? ? ? ? ? ? transaction.o2oPayDtls= oDao.queryBuilder().where().eq('Warehouseid', storeId).and().eq('Flowno', transaction.flowno)
? ? ? ? ? ? ? ? ? ? ? ? .query()
? ? ? ? ? ? ? ? transaction.cardDtls= cDao.queryBuilder().where().eq('Warehouseid', storeId).and().eq('Flowno', transaction.flowno)
? ? ? ? ? ? ? ? ? ? ? ? .query()
? ? ? ? ? ? ? ? transaction.ticketDtls= tDao.queryBuilder().where().eq('WarehouseID', storeId).and().eq('Flowno', transaction.flowno)
? ? ? ? ? ? ? ? ? ? ? ? .query()
? ? ? ? ? ? }
? ? ? ? ? ? List shifts= sDao.queryBuilder().where().eq('custId', custId).and()
? ? ? ? ? ? ? ? ? ? .eq('warehouseId', storeId).and().eq('fPosNo', deviceId).and().between('fBegDate', sDate, eDate)
//? ? ? ? ? ? ? ? ? ? .le('fAccdate', eDate).and().ge('fAccdate', sDate)
? ? ? ? ? ? ? ? ? ? .query()
? ? ? ? ? ? List shiftReports= srDao.queryBuilder().where().eq('custId', custId).and()
? ? ? ? ? ? ? ? ? ? .eq('warehouseId', storeId).and().eq('PosNo', deviceId).and().between('operDate', sDate, eDate)
//? ? ? ? ? ? ? ? ? ? .le('accdate', endDate).and().ge('accdate', startDate)
? ? ? ? ? ? ? ? ? ? .query()
? ? ? ? ? ? def gson= createGson()
? ? ? ? ? ? def json= gson.toJson(transactions)
? ? ? ? ? ? output<< json
output<< '\n'
? ? ? ? ? ? output.flush()
? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Send : ${json}"
? ? ? ? ? ? json= gson.toJson(shifts)
? ? ? ? ? ? output<< json
output<< '\n'
? ? ? ? ? ? output.flush()
? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Send : ${json}"
? ? ? ? ? ? json= gson.toJson(shiftReports)
? ? ? ? ? ? output<< json
output<< '\n'
? ? ? ? ? ? output.flush()
? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Send : ${json}"
? ? ? ? ? ? def response= readLine(input)
? ? ? ? ? ? if (response)
? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Client response: ${response}"
? ? ? ? ? ? else
? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Client disconnected."
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? log.warn"[${storeId}_${deviceId}]getTransactionInfos failed", e
output<< 'ng\n'
? ? ? ? }
}
? ? //獲取未打印的廚打
? ? static void getDiffSalesOrders(String posNo, String period, OutputStream output, InputStream input) {
? ? ? ? try {
? ? ? ? ? ? Date now= new Date();
Calendar calendar= Calendar.getInstance();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
String yesterdayStr= sdf.format(now);
Date yesterday= sdf.parse(yesterdayStr)
? ? ? ? ? ? calendar.setTime(now);
calendar.add(Calendar.SECOND,-Integer.parseInt(period));
Date before= calendar.getTime();
sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String beforeStr= sdf.format(before);
before= sdf.parse(beforeStr)
? ? ? ? ? ? def connSrc= getDbConnection(false)
? ? ? ? ? ? def dao= DaoManager.createDao(connSrc, MposDiffSalesOrder)
? ? ? ? ? ? List diffSalesOrders= dao.queryBuilder().where().eq('PrintFlag','N').and()
? ? ? ? ? ? ? ? ? ? .eq('PosNo', posNo).and().between('operDate', yesterday, before)
//? ? ? ? ? ? ? ? ? ? .le('Accdate', endDate).and().ge('Accdate', startDate)
? ? ? ? ? ? ? ? ? ? .query()
? ? ? ? ? ? def gson= createGson()
? ? ? ? ? ? def json= gson.toJson(diffSalesOrders)
? ? ? ? ? ? output<< json
output<< '\n'
? ? ? ? ? ? output.flush()
? ? ? ? ? ? log.info"Send : ${json}"
? ? ? ? ? ? def response= readLine(input)
? ? ? ? ? ? if (response)
? ? ? ? ? ? ? ? log.info"Client response: ${response}"
? ? ? ? ? ? else
? ? ? ? ? ? ? ? log.info"Client disconnected."
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? log.warn"getDiffSalesOrders failed", e
output<< 'ng\n'
? ? ? ? ? ? if (e.getMessage().contains('maximum connections reached')) {
? ? ? ? ? ? ? ? System.exit(1)
? ? ? ? ? ? }
}
}
? ? //獲取沽清商品
? ? static void getMposItemSets(String storeId, String posNo, String period, OutputStream output, InputStream input) {
? ? ? ? try {
? ? ? ? ? ? def connSrc= getDbConnection(false)
? ? ? ? ? ? def dao= DaoManager.createDao(connSrc, MposItemSet)
? ? ? ? ? ? List mposItemSet= dao.queryBuilder().where().eq('Warehouseid', storeId).and()
? ? ? ? ? ? ? ? ? ? .ne('PosNO', posNo).query()
//? ? ? ? ? ? ? ? ? ? .le('Accdate', endDate).and().ge('Accdate', startDate)
? ? ? ? ? ? def gson= createGson()
? ? ? ? ? ? def json= gson.toJson(mposItemSet)
? ? ? ? ? ? output<< json
output<< '\n'
? ? ? ? ? ? output.flush()
? ? ? ? ? ? log.info"Send : ${json}"
? ? ? ? ? ? def response= readLine(input)
? ? ? ? ? ? if (response)
? ? ? ? ? ? ? ? log.info"Client response: ${response}"
? ? ? ? ? ? else
? ? ? ? ? ? ? ? log.info"Client disconnected."
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? log.warn"getMposItemSets failed", e
output<< 'ng\n'
? ? ? ? ? ? if (e.getMessage().contains('maximum connections reached')) {
? ? ? ? ? ? ? ? System.exit(1)
? ? ? ? ? ? }
}
}
? ? //獲取未打印的廚打
? ? static void getPlatformOrders(String storeId, String uploadFlag, OutputStream output, InputStream input) {
? ? ? ? try {
? ? ? ? ? ? def connSrc= getDbConnection(false)
? ? ? ? ? ? def dao= DaoManager.createDao(connSrc, MposJshopTransaction)
? ? ? ? ? ? def fDao= DaoManager.createDao(connSrc, MposJshopTranflow)
? ? ? ? ? ? def pDao= DaoManager.createDao(connSrc, MposJshopTranpay)
? ? ? ? ? ? List diffSalesOrders= []
? ? ? ? ? ? List diffSalesOrders2= new ArrayList()
? ? ? ? ? ? Date date1= new Date()
? ? ? ? ? ? date1.setHours(0);
date1.setMinutes(0);
date1.setSeconds(0);
Calendar calendar= new GregorianCalendar();
calendar.setTime(date1);
calendar.add(calendar.DATE,1);//把日期往后增加一天.整數(shù)往后推,負(fù)數(shù)往前移動(dòng)
? ? ? ? ? ? Date date2= calendar.getTime();
if (uploadFlag== 'N') {
? ? ? ? ? ? ? ? diffSalesOrders= dao.queryBuilder().orderBy('operDate',true)
? ? ? ? ? ? ? ? ? ? ? ? .where().eq('uploadFlag','N').and().eq('warehouseid', storeId)
? ? ? ? ? ? ? ? ? ? ? ? .and().in('sellway','A','B').and().ge("operDate", date1)
? ? ? ? ? ? ? ? ? ? ? ? .and().le("operDate", date2).query()
? ? ? ? ? ? ? ? diffSalesOrders.each{
? ? ? ? ? ? ? ? ? ? diffSalesOrders2<< it
}
? ? ? ? ? ? ? ? for (MposJshopTransaction jshopTran : diffSalesOrders) {
? ? ? ? ? ? ? ? ? ? if (jshopTran.rtnFlowNo&& jshopTran.rtnFlowNo!= "") {
? ? ? ? ? ? ? ? ? ? ? ? for (MposJshopTransaction jshop : diffSalesOrders) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? if (jshopTran.rtnFlowNo== jshop.flowno) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? diffSalesOrders2.remove(jshopTran)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? diffSalesOrders2.remove(jshop)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
}
}
}
? ? ? ? ? ? } else if (uploadFlag== 'Y') {
? ? ? ? ? ? ? ? diffSalesOrders2= dao.queryBuilder().orderBy('operDate',false).where().eq('uploadFlag','Y').and()
? ? ? ? ? ? ? ? ? ? ? ? .eq('warehouseid', storeId).and().in('sellway','A','B').query()
? ? ? ? ? ? }
? ? ? ? ? ? for (MposJshopTransaction jTran : diffSalesOrders2) {
? ? ? ? ? ? ? ? jTran.tranflows= fDao.queryBuilder().orderBy("itemseq",true).where().eq('warehouseid', storeId).and().eq('flowno',jTran.flowno).query()
? ? ? ? ? ? }
? ? ? ? ? ? for (MposJshopTransaction jTran : diffSalesOrders2) {
? ? ? ? ? ? ? ? jTran.tranpays= pDao.queryBuilder().where().eq('warehouseid', storeId).and().eq('flowno',jTran.flowno).query()
? ? ? ? ? ? }
? ? ? ? ? ? def gson= createGson()
? ? ? ? ? ? def json= gson.toJson(diffSalesOrders2)
? ? ? ? ? ? output<< json
output<< '\n'
? ? ? ? ? ? output.flush()
? ? ? ? ? ? log.info"Send : ${json}"
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? log.warn"getPlatformOrders failed", e
output<< 'ng\n'
? ? ? ? }
}
? ? //獲取未打印的廚打
? ? static void platformOrderUpdate(String storeId, String flowno, String flag, OutputStream output, InputStream input) {
? ? ? ? try {
? ? ? ? ? ? def connSrc= getDbConnection(false)
? ? ? ? ? ? def dao= DaoManager.createDao(connSrc, MposJshopTransaction)
? ? ? ? ? ? dao.callBatchTasks{
? ? ? ? ? ? ? ? List diffSalesOrders= dao.queryBuilder().where().eq('flowno', flowno).and()
? ? ? ? ? ? ? ? ? ? ? ? .eq('warehouseid', storeId).query()
? ? ? ? ? ? ? ? MposJshopTransaction diff= diffSalesOrders ? diffSalesOrders[0] :null
? ? ? ? ? ? ? ? if (diff) {
? ? ? ? ? ? ? ? ? ? if (flag== 'S') {
? ? ? ? ? ? ? ? ? ? ? ? if (diff.uploadFlag== 'N') {
? ? ? ? ? ? ? ? ? ? ? ? ? ? diff.uploadFlag= 'S'
? ? ? ? ? ? ? ? ? ? ? ? ? ? dao.update(diff)
? ? ? ? ? ? ? ? ? ? ? ? ? ? output<< 'ok\n'
? ? ? ? ? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? ? ? ? ? output<< 'ng\n'
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? } else if (flag== 'Y') {
? ? ? ? ? ? ? ? ? ? ? ? diff.uploadFlag= 'Y'
? ? ? ? ? ? ? ? ? ? ? ? dao.update(diff)
? ? ? ? ? ? ? ? ? ? ? ? String sql= "update jshop_orderform set order_status = 30 where pos_sale_flowno = '${flowno}' and store_no = '${storeId}';"
? ? ? ? ? ? ? ? ? ? ? ? dao.queryRaw(sql)
? ? ? ? ? ? ? ? ? ? ? ? sql= "insert into jshop_order_log(addtime,deletestatus,log_info,of_id) select getdate(),0,'已出單',id " +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "from jshop_orderform where pos_sale_flowno = '${flowno}' and store_no = '${storeId}';"
? ? ? ? ? ? ? ? ? ? ? ? dao.queryRaw(sql)
? ? ? ? ? ? ? ? ? ? ? ? output<< 'ok\n'
? ? ? ? ? ? ? ? ? ? }
}
? ? ? ? ? ? ? ? output.flush()
? ? ? ? ? ? ? ? log.info"Send :"
? ? ? ? ? ? }
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? log.warn"platformOrderUpdate failed", e
output<< 'error\n'
? ? ? ? }
}
? ? //修改未打印的廚打?yàn)橐汛蛴?/p>
? ? static void kitchenPlayUpdate(id, output, input) {
? ? ? ? try {
? ? ? ? ? ? def connSrc= getDbConnection(false)
? ? ? ? ? ? def dao= DaoManager.createDao(connSrc, MposDiffSalesOrder)
? ? ? ? ? ? UpdateBuilder supdateBuilder= dao.updateBuilder()
? ? ? ? ? ? supdateBuilder.updateColumnValue('PrintFlag','Y').where().eq('id', id)
? ? ? ? ? ? int rows= supdateBuilder.update()
? ? ? ? ? ? output<< 'ok\n'
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? log.warn"kitchenPlayUpdate failed", e
output<< 'ng\n'
? ? ? ? }
}
? ? /**
* 獲取電子發(fā)票? 一定要填寫MposTransaction.eInvoice和MposTransaction.eInvoiceFlowNo
* 接收參數(shù)data 數(shù)據(jù)以【|】分隔 退貨才能用到
*? 第一段? 原發(fā)票代碼
*? 第二段? 原發(fā)票號碼
*
* 返回
*? ng? ? ? ? ? ? 失敗
*? eInvoiceSet? 電子發(fā)票未設(shè)定
*? 其它? ? ? ? ? 電子發(fā)票開票成功? 數(shù)據(jù)以【|】分隔? 說明如下:
*? ? 第一段? 發(fā)票流水號? ? 記錄到tranhead.EInvoiceFlowNo字段
*? ? 第二段? 發(fā)票代碼? ? ? 記錄到tranhead.EInvoiceFPDM字段
*? ? 第三段? 發(fā)票號碼? ? ? 記錄到tranhead.EInvoiceFPHM字段
*? ? 第四段? 發(fā)票下載URL? 記錄到tranhead.EInvoicePDFURL字段喊积,并將URL生成二維碼打印到小票上
*
*/
? ? static void getEInvoice(String custId, String storeId, String deviceId, String data, OutputStream output, InputStream input) {
? ? ? ? log.info("[${custId}_${storeId}_${deviceId}] data ${data}")
? ? ? ? String objectsInJSON= readLine(input)
? ? ? ? log.info"[${custId}_${storeId}_${deviceId}]Receive: ${objectsInJSON}"
? ? ? ? Type collectionType= new TypeToken>() {}.getType()
? ? ? ? def gson= createGson()
? ? ? ? List transactions= gson.fromJson(objectsInJSON, collectionType)
? ? ? ? if (transactions) {
? ? ? ? ? ? def connSrc= getDbConnection()
? ? ? ? ? ? String result= EInvoiceUtil.getDFXJ1001(transactions.get(0), data, custId, connSrc)
? ? ? ? ? ? output<< "${result}\n"
? ? ? ? } else {
? ? ? ? ? ? output<< 'ng\n'
? ? ? ? }
}
? ? /**
* 接收參數(shù)data 數(shù)據(jù)以【|】分隔
*? 第一段為類型? ? ? ? ? ? ? ? ? ? ? ? ? ? 13:微支付 28:支付寶
*? 第二段為類型? ? ? ? ? ? ? ? ? ? ? ? ? ? 1:消費(fèi) 2:查詢 3:撤銷 4:退貨
*? 第三段為訂單號? ? ? ? ? ? ? ? ? ? ? ? ? 唯一編號烹困,消費(fèi)/查詢/撤銷/退貨都要用到單號
*? 第四段為金額? ? ? ? ? ? ? ? ? ? ? ? ? ? 消費(fèi)/退貨時(shí)用到,金額都為正數(shù)
*? 第五段為消費(fèi)付款碼/退貨原訂單號? ? ? ? ? ? 消費(fèi)時(shí)傳付款碼乾吻,退貨時(shí)傳原訂單號
*? 第六段為消費(fèi)商品說明/退貨原接口交易流水號? 消費(fèi)時(shí)傳一個(gè)兩個(gè)商品名稱就可以了韭邓,退貨時(shí)傳接口返回的交易流水號
*? 第七段為退貨原接口非碼交易流水號? ? ? ? ? 退貨時(shí)傳接口返回的非碼交易流水號 ,只有非碼接口才有
*? 第八段為收銀員編號? ? ? ? ? ? ? ? ? ? ? 消費(fèi)/退貨(非碼)時(shí)用到
*
* 返回參數(shù)result 數(shù)據(jù)以【|】分隔
*? 第一段為狀態(tài)? ? ? ? ? ? ? ? ? ? ? ? ? ? 0:成功 1:失敗 2:等待付款(建議每53秒查詢一次)
*? 第二段為提示信息? ? ? ? ? ? ? ? ? ? ? ? 成功/失敗的文字說明
*? 第三段為接口返回的訂單號? ? ? ? ? ? ? ? ? 消費(fèi)/退貨成功時(shí)才返回
*? 第四段為接口返回的顧客賬號? ? ? ? ? ? ? ? 消費(fèi)成功時(shí)才返回
*? 第五段為接口返回的支付渠道(非碼)? ? ? ? ? 消費(fèi)成功時(shí)才返回
*? 第六段為接口返回的非碼支付流水號(非碼)? ? ? 消費(fèi)成功時(shí)才返回
*
*/
? ? static void getO2oPay(String custId, String storeId, String deviceId, String data, OutputStream output, InputStream input) {
? ? ? ? if (o2oPayMap.containsKey(data)) {
? ? ? ? ? ? String result= o2oPayMap.get(data)
? ? ? ? ? ? log.info("[${storeId}_${deviceId}_${custId}] retry ${result}")
? ? ? ? ? ? output<< "${result}\n"
? ? ? ? ? ? return
? ? ? ? }
? ? ? ? String result= PayUtil.getO2oPay(custId, storeId, deviceId, data, getDbConnection());
log.info("[${storeId}_${deviceId}_${custId}] ${result}")
? ? ? ? o2oPayMap.put(data, result)
? ? ? ? output<< "${result}\n"
? ? }
? ? static Map o2oPayMap= [:]
? ? static void getSalesOrders(storeId, deviceId, String diningTableIds, OutputStream output, InputStream input) {
? ? ? ? try {
//? ? ? ? ? ? def connSrc = getDbConnection()
? ? ? ? ? ? def transConnSrc= getDbConnection(false)
? ? ? ? ? ? def tDao= DaoManager.createDao(transConnSrc, MposDiningTable)
? ? ? ? ? ? String[] ids= diningTableIds.split('_')
? ? ? ? ? ? def diningTable= tDao.queryForId(ids[0])
? ? ? ? ? ? def orderNo= diningTable.tranFlowno// 當(dāng)前對應(yīng)的點(diǎn)單號
? ? ? ? ? ? def sDao= DaoManager.createDao(transConnSrc, MposSalesOrder)
? ? ? ? ? ? List salesOrders
if (orderNo) {
? ? ? ? ? ? ? ? salesOrders= sDao.queryBuilder()
? ? ? ? ? ? ? ? ? ? ? ? .orderBy('id',true)
? ? ? ? ? ? ? ? ? ? ? ? .where().eq('flowno', orderNo).and().ne("saleQty",new BigDecimal(0))
? ? ? ? ? ? ? ? ? ? ? ? .query()
? ? ? ? ? ? }
? ? ? ? ? ? if (!salesOrders) {
? ? ? ? ? ? ? ? salesOrders= []
? ? ? ? ? ? }
? ? ? ? ? ? def gson= createGson()
? ? ? ? ? ? def json= gson.toJson(salesOrders)
? ? ? ? ? ? output<< json
output<< '\n'
? ? ? ? ? ? output.flush()
? ? ? ? ? ? def response= readLine(input)
? ? ? ? ? ? if (response) {
? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Client response: ${response}"
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Client disconnected."
? ? ? ? ? ? ? ? return
? ? ? ? ? ? }
? ? ? ? ? ? diningTable= tDao.queryForId(ids[1])
? ? ? ? ? ? orderNo= diningTable.tranFlowno// 當(dāng)前對應(yīng)的點(diǎn)單號
? ? ? ? ? ? sDao= DaoManager.createDao(transConnSrc, MposSalesOrder)
? ? ? ? ? ? salesOrders= []
? ? ? ? ? ? if (orderNo) {
? ? ? ? ? ? ? ? salesOrders= sDao.queryBuilder()
? ? ? ? ? ? ? ? ? ? ? ? .orderBy('id',true)
? ? ? ? ? ? ? ? ? ? ? ? .where().eq('flowno', orderNo).and().ne("saleQty",new BigDecimal(0))
? ? ? ? ? ? ? ? ? ? ? ? .query()
? ? ? ? ? ? }
? ? ? ? ? ? if (!salesOrders) {
? ? ? ? ? ? ? ? salesOrders= []
? ? ? ? ? ? }
? ? ? ? ? ? json= gson.toJson(salesOrders)
? ? ? ? ? ? output<< json
output<< '\n'
? ? ? ? ? ? output.flush()
? ? ? ? ? ? response= readLine(input)
? ? ? ? ? ? if (response) {
? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Client response: ${response}"
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Client disconnected."
? ? ? ? ? ? ? ? return
? ? ? ? ? ? }
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? log.warn"[${storeId}_${deviceId} ${diningTableIds}]getTransactionInfos failed", e
output<< 'ng\n'
? ? ? ? }
}
? ? static void putCombineTable(storeId, deviceId, OutputStream output, InputStream input) {
? ? ? ? try {
? ? ? ? ? ? String objectsInJSON= readLine(input)
? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Receive: ${objectsInJSON}"
? ? ? ? ? ? def gson= createGson()
? ? ? ? ? ? Type collectionType= new TypeToken>() {}.getType()
? ? ? ? ? ? List diningTables= gson.fromJson(objectsInJSON, collectionType)
? ? ? ? ? ? String sourceTableCode= diningTables[0].deskNo
String targetTableCode= diningTables[1].deskNo
//? ? ? ? ? ? def connSrc = getDbConnection()
? ? ? ? ? ? def transConnSrc= getDbConnection(false)
? ? ? ? ? ? def dao= DaoManager.createDao(transConnSrc, MposDiningTable)
? ? ? ? ? ? def tdao= DaoManager.createDao(transConnSrc, MposSalesOrder)
? ? ? ? ? ? String sql= "select deskNo, tranFlowno from pos_deskInfo where deskNo = '${sourceTableCode}' or deskNo = '${targetTableCode}'"
? ? ? ? ? ? GenericRawResults rawResults= dao.queryRaw(sql)
? ? ? ? ? ? List results= rawResults.getResults()
? ? ? ? ? ? int targetTranFlowCount= 0
? ? ? ? ? ? String sourceFlowno= ''
? ? ? ? ? ? String targetFlowno= ''
? ? ? ? ? ? if (results) {
? ? ? ? ? ? ? ? results.each{ String[] resultArray ->
String deskNo= resultArray[0]
? ? ? ? ? ? ? ? ? ? if (deskNo== sourceTableCode) {
? ? ? ? ? ? ? ? ? ? ? ? sourceFlowno= resultArray[1]
? ? ? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? ? ? targetFlowno= resultArray[1]
? ? ? ? ? ? ? ? ? ? ? ? sql= "select COUNT(flowno) from pos_Tranflowhd where flowno = '${resultArray[1]}'"
? ? ? ? ? ? ? ? ? ? ? ? GenericRawResults rawResults1= tdao.queryRaw(sql)
? ? ? ? ? ? ? ? ? ? ? ? List results1= rawResults1.getResults()
? ? ? ? ? ? ? ? ? ? ? ? if (results)
? ? ? ? ? ? ? ? ? ? ? ? ? ? targetTranFlowCount= results1[0][0] as Integer
}
}
}
? ? ? ? ? ? sql= "update pos_tranflowhd set flowno = '${targetFlowno}', itemseq = itemseq + ${targetTranFlowCount} where WarehouseID='${storeId}' and flowno = '${sourceFlowno}'"
? ? ? ? ? ? tdao.updateRaw(sql)
? ? ? ? ? ? diningTables.each{
? ? ? ? ? ? ? ? dao.update it
}
? ? ? ? ? ? def sdao= DaoManager.createDao(transConnSrc, MposDiffSalesOrder)
? ? ? ? ? ? List diffSalesOrderList= sdao.queryForEq("flowno", diningTables[1].tranFlowno)
? ? ? ? ? ? diffSalesOrderList*.roomNo= diningTables[1].roomNo
diffSalesOrderList*.deskNo= diningTables[1].deskNo
diffSalesOrderList*.deskName= diningTables[1].deskName
int allQty= 0
? ? ? ? ? ? diffSalesOrderList.each{
? ? ? ? ? ? ? ? it.roomNo= diningTables[1].roomNo
it.deskNo= diningTables[1].deskNo
it.deskName= diningTables[1].deskName
it.message= "并桌? 原${diningTables[0].deskName} "
? ? ? ? ? ? ? ? allQty+= it.saleQty
sdao.update(it)
? ? ? ? ? ? }
? ? ? ? ? ? //打印控菜單
? ? ? ? ? ? if (dbConf.kitchen.printAll== 'Y') {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? lock.lock()
? ? ? ? ? ? ? ? ? ? diffSalesOrderList*.allQty= allQty
if (diffSalesOrderList.size() > 0) {
? ? ? ? ? ? ? ? ? ? ? ? PrintServer printServer= new PrintServer()
? ? ? ? ? ? ? ? ? ? ? ? printServer.printSaleOrder(diffSalesOrderList)
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? } catch (Exception e) {
? ? ? ? ? ? ? ? ? ? log.error(e)
? ? ? ? ? ? ? ? } finally {
? ? ? ? ? ? ? ? ? ? lock.unlock()
? ? ? ? ? ? ? ? }
}
? ? ? ? ? ? output<< 'ok\n'
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? log.warn"[${storeId}_${deviceId} combine table failed", e
output<< 'ng\n'
? ? ? ? }
}
? ? static void putSplitTable(storeId, deviceId, OutputStream output, InputStream input) {
? ? ? ? try {
? ? ? ? ? ? String objectsInJSON= readLine(input)
? ? ? ? ? ? log.info"[${storeId}_${deviceId}]Receive: ${objectsInJSON}"
? ? ? ? ? ? def gson= createGson()
? ? ? ? ? ? Type collectionType= new TypeToken>() {}.getType()
? ? ? ? ? ? List diningTables= gson.fromJson(objectsInJSON, collectionType)
//? ? ? ? ? ? def connSrc = getDbConnection()
? ? ? ? ? ? def transConnSrc= getDbConnection(false)
? ? ? ? ? ? def tDao= DaoManager.createDao(transConnSrc, MposDiningTable)
? ? ? ? ? ? def dDao= DaoManager.createDao(transConnSrc, MposSalesOrder)
? ? ? ? ? ? diningTables.each{ diningTable ->
tDao.callBatchTasks{
? ? ? ? ? ? ? ? ? ? String tranFlowno= diningTable.tranFlowno
if (tranFlowno) {
? ? ? ? ? ? ? ? ? ? ? ? def deleteBuilder= dDao.deleteBuilder()
? ? ? ? ? ? ? ? ? ? ? ? deleteBuilder.where().eq('warehouseId', storeId).and().eq('flowno', tranFlowno)
? ? ? ? ? ? ? ? ? ? ? ? int rows= deleteBuilder.delete()
? ? ? ? ? ? ? ? ? ? ? ? if (rows> 0)
? ? ? ? ? ? ? ? ? ? ? ? ? ? log.info"Delete existing $rows rows from pos_tranflowhd with warehouseId='$storeId' and flowno='$diningTable.tranFlowno'"
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? if (diningTable.salesOrders.size() > 0) {
? ? ? ? ? ? ? ? ? ? ? ? if (!tranFlowno) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? tranFlowno= getNextOrderNumberOfDevice(transConnSrc, storeId, deviceId)
? ? ? ? ? ? ? ? ? ? ? ? ? ? diningTable.tranFlowno= tranFlowno
}
? ? ? ? ? ? ? ? ? ? ? ? diningTable.salesOrders.each{ salesOrder ->
salesOrder.id= 0
? ? ? ? ? ? ? ? ? ? ? ? ? ? salesOrder.flowno= tranFlowno
dDao.create salesOrder
}
? ? ? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? ? ? diningTable.tranFlowno= ''
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? tDao.update diningTable
}
}
? ? ? ? ? ? output<< 'ok\n'
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? log.warn"[${storeId}_${deviceId} split table failed", e
output<< 'ng\n'
? ? ? ? }
}
? ? static void copy(storeId, deviceId, InputStream inputStream, OutputStream outputStream) {
? ? ? ? byte[] buffer= new byte[1024]
? ? ? ? int length
while ((length= inputStream.read(buffer)) > 0) {
? ? ? ? ? ? outputStream.write(buffer,0, length)
? ? ? ? }
? ? ? ? log.info"[${storeId}_${deviceId}]Write... end"
? ? ? ? outputStream.flush()
? ? }
? ? static void copy(storeId, deviceId, InputStream inputStream, OutputStream outputStream, size) {
? ? ? ? byte[] buffer= new byte[1024]
? ? ? ? int length
int lengthRead= 0
? ? ? ? while ((length= inputStream.read(buffer)) > 0) {
? ? ? ? ? ? outputStream.write(buffer,0, length)
? ? ? ? ? ? lengthRead+= length
if (lengthRead>= size)
? ? ? ? ? ? ? ? break;
}
? ? ? ? log.info"[${storeId}_${deviceId}]Write... end"
? ? ? ? outputStream.flush()
? ? }
? ? /**
* Read directory info from Groovy script: conf/db.properties.
*/
? ? static void getUploadDir2() {
? ? ? ? dbConf= new ConfigSlurper().parse(new File('conf/db.properties').toURI().toURL())
? ? ? ? uploadDir= dbConf.db.uploadDir ? dbConf.db.uploadDir :'inbox'
? ? ? ? log.info"uploadDir = ${uploadDir}"
? ? ? ? transDirInConf= dbConf.db.transDir ? dbConf.db.transDir :'trans'
? ? ? ? log.info"transDir = ${transDirInConf}"
? ? }
? ? /** Read database connection info from Groovy script:conf/db.properties, and create ORMLite connection source. */
? ? static ConnectionSource getDbConnection(boolean isMaster= true) {
? ? ? ? log.info("AppServer getDbConnection() isMaster = ${isMaster}")
? ? ? ? ConnectionSource db
if (isMaster) {
? ? ? ? ? ? db= DBUtil.getMasterDbConnection()
? ? ? ? } else {
? ? ? ? ? ? db= DBUtil.getTransDbConnection()
? ? ? ? }
? ? ? ? dbType= DBUtil.dbType
return db
}
? ? /** Read database connection info from Groovy script: conf/db.properties, and create Groovy Sql object. */
? ? static Sql getGroovySql() {
? ? ? ? dbConf= new ConfigSlurper().parse(new File('conf/db.properties').toURI().toURL())
? ? ? ? dbType= (dbConf.db.url.contains('mysql')) ?'MySQL' :
(dbConf.db.url.contains('sqlserver')) ?'SQLServer' :'Sybase'
? ? ? ? TABLE_PREFIX= (dbType== 'Sybase' ?'tab.' :'')
? ? ? ? Sql.newInstance(dbConf.db.url, dbConf.db.user, dbConf.db.password, dbConf.db.driverClass)
? ? }
? ? /** Load dining table state transition rules in STL (State Transition Language). */
? ? static void loadSTLMap() {
? ? ? ? stlMap.clear()
? ? ? ? dbConf= new ConfigSlurper().parse(new File('conf/db.properties').toURI().toURL())
? ? ? ? if (dbConf.stl) {
? ? ? ? ? ? def stl= dbConf.stl ?:'0空桌 -> 1點(diǎn)餐中 <-> 2已點(diǎn)餐 <-> 3結(jié)賬中 -> 4已結(jié)賬 & 清桌中 -> 0空桌'
? ? ? ? ? ? def tokens= stl.split(/(?<=(<->))|(?=(<->))/).collect{
? ? ? ? ? ? ? ? (it== '<->') ? it : it.split(/(?<=(->))|(?=(->))/)
? ? ? ? ? ? }.flatten()*.replaceAll(/^\s*/,'')*.trim()
? ? ? ? ? ? tokens.eachWithIndex{ token, idx ->
if (token== '->' || token== '<->') {
? ? ? ? ? ? ? ? ? ? def left= tokens[idx- 1][0]
? ? ? ? ? ? ? ? ? ? def right= tokens[idx+ 1][0]
? ? ? ? ? ? ? ? ? ? stlMap[left] = (stlMap[left] ?:'') + right
if (token== '<->')
? ? ? ? ? ? ? ? ? ? ? ? stlMap[right] = (stlMap[right] ?:'') + left
}
}
}
? ? ? ? //println stlMap
? ? }
? ? //獲取當(dāng)前門店?duì)I業(yè)日期
? ? static String getAccDate(String storeId) {
? ? ? ? ConnectionSource db= getDbConnection(false)
? ? ? ? Dao dao= DaoManager.createDao(db, MposTransaction)
? ? ? ? GenericRawResults rawResults1= dao.queryRaw("select faccdate from calendar where fOrgNo = ${storeId}")
? ? ? ? List results1= rawResults1.getResults()
? ? ? ? Date accdate= null
? ? ? ? if (results1) {
? ? ? ? ? ? String str= results1[0][0]
? ? ? ? ? ? if (str.length() > 10) {
? ? ? ? ? ? ? ? return str.substring(0,10)
? ? ? ? ? ? }
? ? ? ? ? ? accdate= new Date()
? ? ? ? }
? ? ? ? if (!accdate) {
? ? ? ? ? ? accdate= new Date()
? ? ? ? }
? ? ? ? SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd")
? ? ? ? return format.format(accdate)
? ? }
? ? /** Start method of Apache Commons Procrun. */
? ? static void start(String[] args) {
? ? ? ? main(null)
? ? }
? ? /** Stop method of Apache Commons Procrun. */
? ? static void stop(String[] args) {
? ? ? ? System.exit0
? ? }
? ? static void init() {
? ? ? ? try {
? ? ? ? ? ? ConnectionSource db= getDbConnection(false)
? ? ? ? ? ? log.info("init? getDbConnection .")
? ? ? ? ? ? // ['Tc_Shift', 'MposShift', '交班表'],
? ? ? ? ? ? TableUtils.createTableIfNotExists(db, MposShift.class)
? ? ? ? ? ? //['pos_tranflowhd', 'MposSalesOrder', '點(diǎn)單表'],
? ? ? ? ? ? TableUtils.createTableIfNotExists(db, MposSalesOrder.class)
? ? ? ? ? ? //廚打
? ? ? ? ? ? TableUtils.createTableIfNotExists(db, MposDiffSalesOrder.class)
? ? ? ? ? ? //['pos_tranhead', 'MposTransaction', '交易主表'],
? ? ? ? ? ? TableUtils.createTableIfNotExists(db, MposTransaction.class)
? ? ? ? ? ? //['pos_tranflow', 'MposLineItem', '交易明細(xì)'],
? ? ? ? ? ? TableUtils.createTableIfNotExists(db, MposLineItem.class)
? ? ? ? ? ? //['pos_tranpay', 'MposTransactionTender', '交易支付'],
? ? ? ? ? ? TableUtils.createTableIfNotExists(db, MposTransactionTender.class)
? ? ? ? ? ? //第三方支付明細(xì)
? ? ? ? ? ? TableUtils.createTableIfNotExists(db, MposO2oPayDtl.class)
? ? ? ? ? ? //禮券明細(xì)
? ? ? ? ? ? TableUtils.createTableIfNotExists(db, MposTicketDtl.class)
? ? ? ? ? ? //外賣平臺交易
? ? ? ? ? ? TableUtils.createTableIfNotExists(db, MposTakeOutTransaction.class)
? ? ? ? ? ? //外賣平臺交易明細(xì)
? ? ? ? ? ? TableUtils.createTableIfNotExists(db, MposTakeOutTranflow.class)
? ? ? ? ? ? //銀行支付明細(xì)
? ? ? ? ? ? TableUtils.createTableIfNotExists(db, MposCardDtl.class)
? ? ? ? ? ? TableUtils.createTableIfNotExists(db, MposDiningArea.class)
? ? ? ? ? ? TableUtils.createTableIfNotExists(db, MposDiningTable.class)
? ? ? ? ? ? TableUtils.createTableIfNotExists(db, MposShiftReport.class)
? ? ? ? ? ? TableUtils.createTableIfNotExists(db, MposTrantaste.class)
? ? ? ? ? ? log.info("Tables was created.")
? ? ? ? ? ? deleteHistoryData(dbConf.TransReserved ?:2)
? ? ? ? ? ? databaseCheck(db)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? log.error('AppServer', e)
? ? ? ? }
}
? ? static void deleteHistoryData(int month) {
? ? ? ? ConnectionSource db= getDbConnection(false)
? ? ? ? SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd")
? ? ? ? Calendar dueDate= Calendar.getInstance()
? ? ? ? dueDate.setTime(new Date())
? ? ? ? dueDate.add(Calendar.MONTH,-month)
? ? ? ? String dateStr= formatter.format(dueDate.getTime())
? ? ? ? //刪除禮券支付明細(xì)
? ? ? ? log.info("Remove pos_TicketDtl before " + dateStr)
? ? ? ? def tkDao= DaoManager.createDao(db, MposTicketDtl)
? ? ? ? DeleteBuilder db5= tkDao.deleteBuilder()
? ? ? ? db5.where().lt("Accdate", dateStr).and().ne('Accdate','1970-01-01')
? ? ? ? db5.delete()
? ? ? ? //刪除第三方式支付明細(xì)
? ? ? ? log.info("Remove pos_o2opaydtl before " + dateStr)
? ? ? ? def oDao= DaoManager.createDao(db, MposO2oPayDtl)
? ? ? ? DeleteBuilder db4= oDao.deleteBuilder()
? ? ? ? db4.where().lt("Accdate", dateStr).and().ne('Accdate','1970-01-01')
? ? ? ? db4.delete()
? ? ? ? //刪除銀聯(lián)支付明細(xì)
? ? ? ? log.info("Remove pos_carddtl before " + dateStr)
? ? ? ? def cDao= DaoManager.createDao(db, MposCardDtl)
? ? ? ? DeleteBuilder db10= cDao.deleteBuilder()
? ? ? ? db10.where().lt("Accdate", dateStr).and().ne('Accdate','1970-01-01')
? ? ? ? db10.delete()
? ? ? ? //刪除明細(xì)
? ? ? ? log.info("Remove pos_tranflow before " + dateStr)
? ? ? ? def dDao= DaoManager.createDao(db, MposLineItem)
? ? ? ? DeleteBuilder db2= dDao.deleteBuilder()
? ? ? ? db2.where().lt("AccDate", dateStr).and().ne('Accdate','1970-01-01')
? ? ? ? db2.delete()
? ? ? ? //刪除點(diǎn)餐明細(xì)
? ? ? ? log.info("Remove pos_tranflowhd before " + dateStr)
? ? ? ? def soDao= DaoManager.createDao(db, MposSalesOrder)
? ? ? ? DeleteBuilder db8= soDao.deleteBuilder()
? ? ? ? db8.where().lt("operDate", dueDate.getTime())
? ? ? ? db8.delete()
? ? ? ? //刪除廚打明細(xì)
? ? ? ? log.info("Remove pos_tranflowhd before " + dateStr)
? ? ? ? def dsDao= DaoManager.createDao(db, MposDiffSalesOrder)
? ? ? ? DeleteBuilder db9= dsDao.deleteBuilder()
? ? ? ? db9.where().lt("operDate", dueDate.getTime())
? ? ? ? db9.delete()
? ? ? ? //刪除支付明細(xì)
? ? ? ? log.info("Remove pos_tranpay before " + dateStr)
? ? ? ? def tDao= DaoManager.createDao(db, MposTransactionTender)
? ? ? ? DeleteBuilder db3= tDao.deleteBuilder()
? ? ? ? db3.where().lt("Accdate", dateStr).and().ne('Accdate','1970-01-01')
? ? ? ? db3.delete()
? ? ? ? //刪除頭表
? ? ? ? log.info("Remove pos_tranhead before " + dateStr)
? ? ? ? def hDao= DaoManager.createDao(db, MposTransaction)
? ? ? ? DeleteBuilder db1= hDao.deleteBuilder()
? ? ? ? db1.where().lt("AccDate", dateStr).and().ne('Accdate','1970-01-01')
? ? ? ? db1.delete()
? ? ? ? //刪除交班支付明細(xì)表
? ? ? ? log.info("Remove Tc_Shift before " + dateStr)
? ? ? ? def psDao= DaoManager.createDao(db, MposShiftReport)
? ? ? ? DeleteBuilder db7= psDao.deleteBuilder()
? ? ? ? db7.where().lt("Accdate", dateStr).and().ne('Accdate','1970-01-01')
? ? ? ? db7.delete()
? ? ? ? //刪除交班頭表
? ? ? ? log.info("Remove Tc_Shift before " + dateStr)
? ? ? ? def sDao= DaoManager.createDao(db, MposShift)
? ? ? ? DeleteBuilder db6= sDao.deleteBuilder()
? ? ? ? db6.where().lt("fAccDate", dueDate.getTime()).and().ne('fAccdate', getInitialDate())
? ? ? ? db6.delete()
? ? }
? ? static void version1_4_9(DatabaseConnection conn) {
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select elecDiscountAmt from pos_tranhead''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_tranhead add elecDiscountAmt decimal(12, 2); ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select elecIptNum from pos_TicketDtl''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_TicketDtl add elecIptNum VARCHAR(20); ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select ticketType from pos_TicketDtl''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_TicketDtl add ticketType VARCHAR(20); ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select type from pos_tranhead''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_tranhead add type VARCHAR(100); ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select AgeLevel from pos_tranhead''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_tranhead add AgeLevel int; ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select returnPartAmount from pos_carddtl''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_carddtl add returnPartAmount decimal(12, 2); ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select taste_nos from pos_tranhead''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_tranhead add taste_nos VARCHAR(100); ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select memo from pos_tranhead''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_tranhead add memo VARCHAR(100); ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select taste_nos from pos_TranflowhdPr''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_TranflowhdPr add taste_nos VARCHAR(100); ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select comment from pos_TranflowhdPr''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_TranflowhdPr add comment VARCHAR(100); ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select taste_nos from pos_tranflowhd''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_tranflowhd add taste_nos VARCHAR(100); ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select comment from pos_tranflowhd''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_tranflowhd add comment VARCHAR(100); ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select pcouponAmount from pos_o2opaydtl''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_o2opaydtl add pcouponAmount decimal(12, 2); ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select discountAcc from pos_tranhead''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_tranhead add discountAcc VARCHAR(20); ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select discountType from pos_tranhead''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_tranhead add discountType VARCHAR(10); ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select discountNum from pos_tranhead''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_tranhead add discountNum VARCHAR(20); ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select delivery_type from takeOut_postranhead''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table takeOut_postranhead add delivery_type int; ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select delivery_party from takeOut_postranhead''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table takeOut_postranhead add delivery_party VARCHAR(50); ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select package_amount from takeOut_postranhead''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table takeOut_postranhead add package_amount int; ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select GrosalAMT from takeOut_postranhead''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table takeOut_postranhead add GrosalAMT decimal(12, 2); ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select foodType from takeOut_postranflow''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table takeOut_postranflow add foodType VARCHAR(10); ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select discAmt from takeOut_postranflow''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table takeOut_postranflow add discAmt decimal(12, 2); ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select tranState from pos_o2opaydtl''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_o2opaydtl add tranState varchar(5); ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select origamt from pos_carddtl''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_carddtl add origamt decimal(12, 2); ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select mcouponamount from pos_carddtl''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_carddtl add mcouponamount decimal(12, 2); ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select pcouponAmount from pos_carddtl''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_carddtl add pcouponAmount decimal(12, 2); ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select point from pos_carddtl''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_carddtl add point decimal(12, 2); ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
}
? ? static void version1_4_2(DatabaseConnection conn) {
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select isEInvoice from pos_tranhead''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_tranhead add isEInvoice VARCHAR(10) ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select custNumber from pos_tranflowhd''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_tranflow add custNumber int default 1 ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select custNumber from pos_TranflowhdPr''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_TranflowhdPr add custNumber int default 1 ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select custNumber from pos_Tranflowhd''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_Tranflowhd add custNumber int default 1 ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
}
? ? static void version1_4_1(DatabaseConnection conn) {
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select EInvoiceContent from pos_tranhead''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_tranhead add EInvoiceContent varchar(200) ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select tariffNo from pos_tranflow''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_tranflow add tariffNo varchar(50) ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select tariffName from pos_tranflow''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_tranflow add tariffName varchar(100) ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select fClassStNo from pos_tranflow''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_tranflow add fClassStNo varchar(50) ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select EInvoiceFlowNo from pos_tranhead''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_tranhead add EInvoiceFlowNo varchar(20) ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select EInvoiceFPDM from pos_tranhead''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_tranhead add EInvoiceFPDM varchar(20) ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select EInvoiceFPHM from pos_tranhead''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_tranhead add EInvoiceFPHM varchar(20) ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select EInvoicePDFURL from pos_tranhead''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_tranhead add EInvoicePDFURL varchar(200) ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
}
? ? static void version1_4_0(DatabaseConnection conn) {
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select platformType from pos_tranhead''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_tranhead add platformType varchar(20) ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select jshopFlowno from pos_tranhead''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_tranhead add jshopFlowno varchar(50) ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select TaxId from pos_tranflow''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table pos_tranflow add TaxId decimal(12, 2) ''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select pointChange from tc_shift''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table Tc_Shift add pointChange int''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select point from tc_shift''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table Tc_Shift add point int''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select RefillAmt from tc_shift''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table tc_shift add RefillAmt decimal(12, 2)''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select ServiceAmt from tc_shift''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table tc_shift add ServiceAmt decimal(12, 2)''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select RefundAmt from tc_shift''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table tc_shift add RefundAmt RefundAmt(12, 2)''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select OverAmt from tc_shift''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table tc_shift add OverAmt RefundAmt(12, 2)''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select inAmt from tc_shift''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table tc_shift add inAmt RefundAmt(12, 2)''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? select outAmt from tc_shift''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? conn.executeStatement('''\
? ? ? ? ? ? ? ? ? ? alter table tc_shift add outAmt outAmt(12, 2)''', DatabaseConnection.DEFAULT_RESULT_FLAGS)
? ? ? ? }
}
? ? static databaseCheck(ConnectionSource sqlserverConn) {
? ? ? ? DatabaseConnection conn
try {
? ? ? ? ? ? conn= sqlserverConn.getReadWriteConnection()
? ? ? ? ? ? version1_4_0(conn)
? ? ? ? ? ? version1_4_1(conn)
? ? ? ? ? ? version1_4_2(conn)
? ? ? ? ? ? version1_4_9(conn)
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? log.error('Failed ', e)
? ? ? ? } finally {
? ? ? ? ? ? if (conn)
? ? ? ? ? ? ? ? sqlserverConn.releaseConnection conn
}
}
? ? static Date getInitialDate() {
? ? ? ? Date initDate= new Date(0);
int timeOffset= 0;
TimeZone timeZone= Calendar.getInstance().getTimeZone();
timeOffset= timeOffset- timeZone.getRawOffset();
initDate.setTime(timeOffset);
return initDate;
}
? ? /**
* Entry point of App Server.
*/
? ? static main(_) {
? ? ? ? // Help to find log4j.properties
? ? ? ? PropertyConfigurator.configure'conf/log4j.properties'
? ? ? ? log.info("AppServer is starting")
? ? ? ? // Remove log files one month ago
? ? ? ? Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate({
? ? ? ? ? ? def now= new Date()
? ? ? ? ? ? def dueDay= String.format('%1$tY-%1$tm-%1$td', now- 30)
? ? ? ? ? ? ('log' as File).eachFile{ logFile ->
def extension= logFile.name.split(/\./)[-1]
? ? ? ? ? ? ? ? if (extension==~ /2\d\d\d-\d\d-\d\d/ && extension< dueDay)
? ? ? ? ? ? ? ? ? ? logFile.delete()
? ? ? ? ? ? }
? ? ? ? },0,1, TimeUnit.HOURS)
? ? ? ? //半夜四點(diǎn)重啟系統(tǒng)
? ? ? Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate({
? ? ? ? ? def now= new Date()
? ? ? ? ? log.info("system exit")
? ? ? ? ? int hour= 4
? ? ? ? ? try {
? ? ? ? ? ? ? if (dbConf.rebootHour!= 4) {
? ? ? ? ? ? ? ? ? hour= Integer.valueOf(dbConf.rebootHour).intValue()
? ? ? ? ? ? ? }
? ? ? ? ? } catch (Exception e){}
? ? ? ? ? if (now.hours== hour) {
? ? ? ? ? ? ? log.info("system exit ${now.hours}")
? ? ? ? ? ? ? System.exit(0)
? ? ? ? ? }
? ? ? },30,40, TimeUnit.MINUTES)
? ? ? ? try {
? ? ? ? ? ? Thread.sleep(5000)
? ? ? ? } catch (Exception e){}
? ? ? ? loadSTLMap()
? ? ? ? //判斷是否啟動(dòng)廚打
? ? ? ? if (dbConf.kitchen.print!= 'N') {
//? ? ? ? ? ? PrintServer.lock = lock
? ? ? ? ? ? PrintServer.main(null)
? ? ? ? }
? ? ? ? APP_SERVER_PORT= dbConf.serverPort ? Integer.valueOf(dbConf.serverPort) : APP_SERVER_PORT
serverType= dbConf.serverType
try {
? ? ? ? ? ? log.info("PushServer start")
? ? ? ? ? ? pushServer= new PushServer()
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? log.error("AppServer PushServer error", e)
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? if (serverType== 'SC') {
? ? ? ? ? ? ? ? log.info("AppServer init()")
? ? ? ? ? ? ? ? init()
? ? ? ? ? ? ? ? if (dbConf.runType== '1')
? ? ? ? ? ? ? ? ? ? new Thread(new Runnable() {
? ? ? ? ? ? ? ? ? ? ? ? @Override
void run() {
? ? ? ? ? ? ? ? ? ? ? ? ? ? AppClient.main(['true', VERSION] as String[])
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }).start()
? ? ? ? ? ? } else if (serverType== 'HQ') {
? ? ? ? ? ? ? ? //自動(dòng)生成主檔
? ? ? ? ? ? ? ? Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate({
? ? ? ? ? ? ? ? ? ? def now= new Date()
? ? ? ? ? ? ? ? ? ? log.info("master copy ")
? ? ? ? ? ? ? ? ? ? int hour= 5
? ? ? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? ? ? if (dbConf.masterCopyHour!= 5) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? hour= (Integer.valueOf(dbConf.masterCopyHour).intValue())
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? } catch (Exception e){}
? ? ? ? ? ? ? ? ? ? if (now.hours== hour) {
? ? ? ? ? ? ? ? ? ? ? ? log.info("master copy ${now.hours}")
? ? ? ? ? ? ? ? ? ? ? ? MposMasterCopy.main("001_")
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? },0,40, TimeUnit.MINUTES)
? ? ? ? ? ? ? ? //HQ的通訊server啟動(dòng)時(shí)將非碼client啟動(dòng)
? ? ? ? ? ? ? ? if (dbConf.runFmClient!= 'N') {
? ? ? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? ? ? log.info("./FMClient/fmstart.bat")
? ? ? ? ? ? ? ? ? ? ? ? Runtime.runtime.exec("./FMClient/fmstart.bat")
? ? ? ? ? ? ? ? ? ? } catch (Exception e) {}
}
}
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? log.error("AppServer process serverType", e)
? ? ? ? }
? ? ? ? // Start server loop
? ? ? ? for (; ;) {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? serverLoop()
? ? ? ? ? ? } catch (BindException e) {
? ? ? ? ? ? ? ? log.warn'main> Server close', e
System.exit(0)
? ? ? ? ? ? ? ? return
? ? ? ? ? ? } catch (Exception e) {
? ? ? ? ? ? ? ? log.warn'main> Server failed', e
if (e.getMessage().contains('maximum connections reached')) {
? ? ? ? ? ? ? ? ? ? System.exit(1)
? ? ? ? ? ? ? ? }
? ? ? ? ? ? } finally {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? server?.close()
? ? ? ? ? ? ? ? ? ? server= null
? ? ? ? ? ? ? ? ? ? sleep2000
? ? ? ? ? ? ? ? } catch (Exception ignore) {
}
}
}
}
}
APPServer32類
package hyi.pos.appserver.server;
import org.boris.winrun4j.AbstractService;
import org.boris.winrun4j.EventLog;
import org.boris.winrun4j.ServiceException;
import java.io.File;
/**
* App server starter. It'll run as a Windows service.
*
* This class will be packaged as AppServerStarter.jar, and put it to SC's c:\AppServer directory.
*
* @author Bruce You
* @since 2013 Mar.
*/
public class AppServerStarter32 extends AbstractService {
? ? private static final String TAG = "AppServerStarter";
? ? //private static final String HOME_DIR = ".";
//創(chuàng)建一個(gè)進(jìn)程
? ? private Process appServerProcess;
? ? @Override
? ? public int serviceMain(String[] args) throws ServiceException {
? ? ? ? for (;;) {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? // Respawn AppServer.exe --
? ? ? ? ? ? ? ? ProcessBuilder pb = new ProcessBuilder(args.length > 0 ? args[0] : "AppServer32.exe");
? ? ? ? ? ? ? ? //pb.directory(new File(HOME_DIR));
? ? ? ? ? ? ? ? appServerProcess = pb.start();
? ? ? ? ? ? ? ? EventLog.report(TAG, EventLog.INFORMATION, "Start " + (args.length > 0 ? args[0] : "AppServer32.exe"));
? ? ? ? ? ? ? ? appServerProcess.waitFor();
? ? ? ? ? ? ? ? appServerProcess = null;
? ? ? ? ? ? } catch (Exception e) {
? ? ? ? ? ? ? ? EventLog.report(TAG, EventLog.WARNING, e.getMessage());
? ? ? ? ? ? }
}
}
? ? @Override
? ? public int serviceRequest(int control) throws ServiceException {
? ? ? ? super.serviceRequest(control);
? ? ? ? switch (control) {
? ? ? ? ? ? case SERVICE_CONTROL_STOP:
? ? ? ? ? ? case SERVICE_CONTROL_SHUTDOWN:
? ? ? ? ? ? ? ? if (appServerProcess != null)
? ? ? ? ? ? ? ? ? ? appServerProcess.destroy();
? ? ? ? ? ? ? ? System.exit(0);
? ? ? ? }
? ? ? ? return 0;
? ? }
}
AppServer64類:
package hyi.pos.appserver.server;
import org.boris.winrun4j.AbstractService;
import org.boris.winrun4j.EventLog;
import org.boris.winrun4j.ServiceException;
import java.io.File;
/**
* App server starter. It'll run as a Windows service.
*
* This class will be packaged as AppServerStarter.jar, and put it to SC's c:\AppServer directory.
*
* @author Bruce You
* @since 2013 Mar.
*/
public class AppServerStarter64 extends AbstractService {
? ? private static final String TAG = "AppServerStarter";
//? ? private static final String HOME_DIR = ".";
? ? private Process appServerProcess;
? ? @Override
? ? public int serviceMain(String[] args) throws ServiceException {
? ? ? ? for (;;) {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? // Respawn AppServer.exe --
//進(jìn)程建立
? ? ? ? ? ? ? ? ProcessBuilder pb = new ProcessBuilder(args.length > 0 ? args[0] : "AppServer64.exe");
//? ? ? ? ? ? ? ? pb.directory(new File(HOME_DIR));
? ? ? ? ? ? ? ? appServerProcess = pb.start();
? ? ? ? ? ? ? ? EventLog.report(TAG, EventLog.INFORMATION, "Start " + (args.length > 0 ? args[0] : "AppServer64.exe"));
? ? ? ? ? ? ? ? appServerProcess.waitFor();
? ? ? ? ? ? ? ? appServerProcess = null;
? ? ? ? ? ? } catch (Exception e) {
? ? ? ? ? ? ? ? EventLog.report(TAG, EventLog.WARNING, e.getMessage());
? ? ? ? ? ? }
}
}
? ? @Override
? ? public int serviceRequest(int control) throws ServiceException {
? ? ? ? super.serviceRequest(control);
? ? ? ? switch (control) {
? ? ? ? ? ? case SERVICE_CONTROL_STOP:
? ? ? ? ? ? case SERVICE_CONTROL_SHUTDOWN:
? ? ? ? ? ? ? ? if (appServerProcess != null)
? ? ? ? ? ? ? ? ? ? appServerProcess.destroy();
? ? ? ? ? ? ? ? System.exit(0);
? ? ? ? }
? ? ? ? return 0;
? ? }
}
官網(wǎng)解釋: