線程的例子

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章