package com.im.component.ptc.trade.auction;
import java.net.*;
import java.io.*;
import java.util.*;
import com.im.component.ptc.config.model.*;
import com.im.component.ptc.trade.auction.model.*;
import com.im.component.ptc.*;
import com.im.util.encrypt.DesEncrypt;
import com.im.util.Debug;
import com.im.util.utils.*;
import com.im.util.Debug;
import com.im.util.model.*;
import com.im.util.log.LogContentModel;
import com.im.component.ptc.report.model.SumModel;
public class AuctionEngine extends Thread {
private List processors = new ArrayList();
public void run() {
ModelList auctions = null;
PageRequest pageRequest = new PageRequest();
pageRequest.setRecordsPerPage(-1);
pageRequest.setCurrentPage(-1);
while (true) {
try {
sleep(30000);
/////////////////////// 當前系統日期和時間////////////////////////////////////////
java.util.Date currentDate = new java.util.Date(System.currentTimeMillis());
/////////////////////// 上午交易開始時間:09:30 /////////////////////////////
java.util.Date AMBidTimeBeginDate = new java.util.Date(System.currentTimeMillis());
ConfigModel AMConf = ConfigBO.getConfig("TRD", "AMBidTimeBegin");//上午交易開始時間'093000'
String AMBidTimeBegin = AMConf.getValue();
int AMhour = Integer.parseInt(AMBidTimeBegin.substring(0, 2));
int AMminutes = Integer.parseInt(AMBidTimeBegin.substring(2, 4));
int AMsecond = Integer.parseInt(AMBidTimeBegin.substring(4));
AMBidTimeBeginDate.setHours(AMhour);
AMBidTimeBeginDate.setMinutes(AMminutes);
AMBidTimeBeginDate.setSeconds(AMsecond);
///////////////////////// 下午交易結束時間:15:00 /////////////////////////////
java.util.Date PMBidTimeEndDate = new java.util.Date(System.currentTimeMillis());
ConfigModel PMConf = ConfigBO.getConfig("TRD", "PMBidTimeEnd");//下午交易結束時間'150000'
String PMBidTimeEnd = PMConf.getValue();
int PMhour = Integer.parseInt(PMBidTimeEnd.substring(0, 2));
int PMminutes = Integer.parseInt(PMBidTimeEnd.substring(2, 4));
int PMsecond = Integer.parseInt(PMBidTimeEnd.substring(4));
PMBidTimeEndDate.setHours(PMhour);
PMBidTimeEndDate.setMinutes(PMminutes);
PMBidTimeEndDate.setSeconds(PMsecond);
//////////// 前臺拍賣處理必須在開市時間( 9:30--15:00)期間 2006-04-18 ///////////
if ( currentDate.after(AMBidTimeBeginDate) && currentDate.before(PMBidTimeEndDate) ) {
// Debug.println("開市時間,允許處理拍賣 "+AMBidTimeBeginDate+" < "+currentDate +" <"+PMBidTimeEndDate) ;
//處理已經審覈的拍賣項目 // A20-已經審覈產權凍結完成
auctions = AuctionBO.getAuctionList(AuctionModel.AUCTION_STATUS_STOCK_FROZEN, pageRequest);
ProcessStockFrozen(auctions);
//處理正在進行的拍賣項目 // A30-正在拍賣
auctions = AuctionBO.getAuctionList(AuctionModel.AUCTION_STATUS_EXCUTING, pageRequest);
ProcessExcuting(auctions);
//處理已經結束的拍賣項目 // A40-拍賣結束
auctions = AuctionBO.getAuctionList(AuctionModel.AUCTION_STATUS_AUCTION_FINISHED, pageRequest);
ProcessFinished(auctions);
//處理已經結束的拍賣項目
//auctions = AuctionBO.getAuctionList(AuctionModel.AUCTION_STATUS_CLEARING, pageRequest);
//startAuctionProcessors(auctions);
//處理支付餘款失敗的項目
//auctions = AuctionBO.getAuctionList(AuctionModel.AUCTION_STATUS_PAY_REMAIN_FAILED, pageRequest);
//startAuctionProcessors(auctions);
}
// else{
// Debug.println("筆市時間,不允許處理拍賣 "+AMBidTimeBeginDate+" 》"+currentDate +" 》"+PMBidTimeEndDate) ;
// }
} catch (Exception e) {
}
this.yield();
}
}
public void destroy() {
}
/**
* 1.處理已經審覈的拍賣項目 A20
* @param auctions
*/
private synchronized void ProcessStockFrozen(ModelList auctions) {
if (auctions == null || auctions.size() <= 0) return;
for (int i = 0; i < auctions.size(); i++) {
AuctionModel auction = (AuctionModel) auctions.get(i);
if (auction.getAuctionNo()==null || auction.getAuctionNo().trim().equals("")) continue;
LogContentModel log = new LogContentModel();
Date currentDate = new Date(System.currentTimeMillis());
try {
if (auction.getStartDate().before(currentDate)) {
auction.setStatus(auction.AUCTION_STATUS_EXCUTING); // A30-正在拍賣
AuctionBO.updateAuction(auction, log);
}
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
/**
* 2.處理正在拍賣的項目 A30
* @param auctions
*/
private synchronized void ProcessExcuting(ModelList auctions) {
if (auctions == null || auctions.size() <= 0) return;
for (int i = 0; i < auctions.size(); i++) {
AuctionModel auction = (AuctionModel) auctions.get(i);
if (auction.getAuctionNo()==null || auction.getAuctionNo().trim().equals("")) continue;
LogContentModel log = new LogContentModel();
Date currentDate = new Date(System.currentTimeMillis()); //當前系統時間
try {
////////////////////////////////////////////////////////////////////////
Date expiredDate = new Date(auction.getExpiredDate().getTime()); //拍賣截止時間
Date currentFinishDate = new Date(System.currentTimeMillis()); //當天下午拍賣結束時間
ConfigModel conf = ConfigBO.getConfig("TRD", "PMBidTimeEnd"); //下午交易結束時間
String finishTime= conf.getValue();
int hour = Integer.parseInt(finishTime.substring(0, 2));
int minutes = Integer.parseInt(finishTime.substring(2, 4));
int second = Integer.parseInt(finishTime.substring(4));
currentFinishDate.setHours(hour);
currentFinishDate.setMinutes(minutes);
currentFinishDate.setSeconds(second);
expiredDate.setHours(hour);
expiredDate.setMinutes(minutes);
expiredDate.setSeconds(second);
//拍賣截止時間
long lExpiredDate = expiredDate.getTime() + auction.AUCTION_DELAY_INTERVAL; //30s
if (currentDate.before(expiredDate)) continue; //還沒到拍賣結束時間
//-------------解凍抵押金和產權已經有單獨的操作界面,但是需要判斷是流拍還是有人竟買,一此改拍賣狀態-----------
// 2006-06-02 yhxie
ModelList orders = AuctionBO.getBidOrderList(auction);//取所有出價人(biddorder表)
long delaytmp = (86279999+auction.AUCTION_DELAY_INTERVAL)/1000;//一天,即24小時
if (orders == null || orders.size() == 0) { //沒有出價人--流拍,修改狀態爲 A81
//start
//沒有競標紀錄,解凍抵押金,解凍股票
//if (AuctionBO.rollgagy(auction) == -1) {
/*
//如果沒有抵押金需要解凍則直接解凍股票
AuctionBO.unfreezeStock(auction);
*/
// }
//AuctionBO.unfreezeStock(auction); //新版本2006-05-09,從上面拿到該處
//end
auction.setStatus(auction.AUCTION_STATUS_FAILED); // A81-流拍(處理完成、解凍產權完成)
AuctionBO.updateAuction(auction, log);
//當天下午交易結束時間-拍賣截止時間>24小時,拍賣結束,有人竟標
} else if (((currentFinishDate.getTime()-lExpiredDate)/1000) > delaytmp) {
//如果最後期限超過1天,則拍賣結束
auction.setStatus(auction.AUCTION_STATUS_AUCTION_FINISHED); // A40-拍賣結束
AuctionBO.updateAuction(auction, log);
} else if (currentDate.after(currentFinishDate)){
//如果當前時間大於當天結束時間,根據最後竟標時間判斷是否結束拍賣
long lCurrentDate = System.currentTimeMillis(); //當前系統時間
long lLastBidTime = 0;
BidOrderModel order = (BidOrderModel) orders.get(0); //最後一標出價時間
Date lastBidTime = new Date(0);
String sLastBidTime = order.getOrderTime();
lastBidTime.setYear(Integer.parseInt(sLastBidTime.substring(0,4))-1900);
lastBidTime.setMonth(Integer.parseInt(sLastBidTime.substring(5, 7))-1);
lastBidTime.setDate(Integer.parseInt(sLastBidTime.substring(8,10)));
lastBidTime.setHours(Integer.parseInt(sLastBidTime.substring(11,13)));
lastBidTime.setMinutes(Integer.parseInt(sLastBidTime.substring(14, 16)));
lastBidTime.setSeconds(Integer.parseInt(sLastBidTime.substring(17)));
lLastBidTime = lastBidTime.getTime();
//如果當前時間減最後一標的時間當大於50秒,則結束拍賣
//Debug.print("currentFinishDate.getTime()-lExpiredDate"+Long.toString(lCurrentDate-lLastBidTime));
//
if ((lCurrentDate-lLastBidTime)>auction.AUCTION_DELAY_INTERVAL) {
auction.setStatus(auction.AUCTION_STATUS_AUCTION_FINISHED); // A40-拍賣結束
AuctionBO.updateAuction(auction, log);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 3.處理已經結束的拍賣項目
* @param auctions
*/
private synchronized void ProcessFinished(ModelList auctions) {
if (auctions == null || auctions.size() <= 0) return;
for (int i = 0; i < auctions.size(); i++) {
AuctionModel auction = (AuctionModel) auctions.get(i);
if (auction.getAuctionNo()==null || auction.getAuctionNo().trim().equals("")) continue;
LogContentModel log = new LogContentModel();
Date currentDate = new Date(System.currentTimeMillis());
try {
//計算手續費
if (auction.getCharge()<=0) {
ChargesModel charge = null;
double bestBid = 0.0;
double dCharge = 0.0;
String auctionType = (StringUtil.addZero(auction.getAuctionType(), 2)).trim();
charge = ConfigBO.getCharge(auction.getRegCode(), auction.getStockType(), auctionType);
//權益拍賣的話,數量按1計算
long orderVolume = auction.getOrderVolume();
if (auction.getAuctionType().equals("3"))
orderVolume = 1;
bestBid = (auction.getBestPrice()*orderVolume);
dCharge = charge.calculateCharge(bestBid, orderVolume); //手續費等
auction.setCharge(dCharge);
AuctionBO.updateAuction(auction, log);
}
//處理餘款未付情況
if (auction.getAllowPay().equals("N")) {
//start //沒有投標人或者唯一投標人,解凍股票
// if (AuctionBO.rollgagy(auction) == -1) {
/*
//如果沒有抵押金需要解凍則直接解凍股票
AuctionBO.unfreezeStock(auction);
*/
// }
// AuctionBO.unfreezeStock(auction);////新版本2006-05-09,從上面拿到該處
///end
auction.setStatus(auction.AUCTION_STATUS_PAY_REMAIN_FAILED); // A71-餘款支付失敗
AuctionBO.updateAuction(auction, log);
}
else
{
SumModel sm = new SumModel();
FundBO fund =new FundBO();
try{
sm=fund.getSumCharges(auction.getAuctionNo(),"sell");
if(sm.equals("FAILED") || sm.equals(null)){
FundBO.saveCharge(auction,log);
}
}catch(Exception e){
FundBO.saveCharge(auction,log);
}
// if(fund.getSumCharges(auction.getAuctionNo(),"buy").equals(null) && fund.getSumCharges(auction.getAuctionNo(),"sell").equals(null))
// FundBO.saveCharge(auction,log);
}
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
}