package com.poson.aspz;
import java.io.File;
import java.rmi.RemoteException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import org.apache.log4j.Logger;
import com.poson.aspz.db.TranContext;
import com.poson.aspz.util.Config;
import com.poson.aspz.util.Const;
import com.poson.aspz.util.MyLoger;
import com.poson.aspz.util.Util;
import java.net.MalformedURLException;
import ws.clinet.axis2.WebSoapBindingImplServiceCallbackHandler;
import ws.clinet.axis2.WebSoapBindingImplServiceStub;
import java.sql.Connection;
import java.sql.DriverManager;
public class OnTimeCreditIntf extends Thread
{
private boolean bSuperUser = false;
private boolean working = false;
private String planXMLFileFN = "";
private String path = "";
private String staffNo = "";
private String pswd = "";
private String staffId = "";
private String siteId = "";
private String areaId = "";
private TranContext myDBTrans = null;
private String curCreatePZDate = "";
protected Connection conn;
//private static Log log = LogFactory.getLog(Worker.class);
//private static MyLoger log = new MyLoger();
private Logger logger = Logger.getLogger(OnTimeCreditIntf.class);
public OnTimeCreditIntf()
{
}
public Connection getConnection() {
try {
conn = DriverManager.getConnection(Const.CONFIG_XML_DB_URL);
return conn;
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
/**
* 建立连接
* @param driver
* @param url
* @param user
* @param password
* @return
*/
public Connection getConnection(String driver, String url, String user, String password) {
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, user, password);
return conn;
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
public List getBJOnTimeCreditIntfSumbit() throws SQLException
{
ArrayList list = new ArrayList();
ResultSet rs = null;
StringBuffer strSql = new StringBuffer();
strSql.append(" SELECT TRIM(ORDER_SERIAL_NBR) ORDER_SERIAL_NBR, ");
strSql.append(" TRIM(OWE_BUSINESS_TYPE_ID) OWE_BUSINESS_TYPE_ID,TRIM(STAFF_ID) STAFF_ID, ");
strSql.append(" TRIM(SERV_ID) SERV_ID,TO_CHAR(CREATED_DATE, 'yyyymmddhhmmss') CREATED_DATE,TO_CHAR(COMPLETED_DATE, 'yyyymmddhhmmss') COMPLETED_DATE, ");
strSql.append(" TRIM(STATE) STATE,TO_CHAR(STATE_DATE, 'yyyymmddhhmmss') STATE_DATE,TRIM(PROCESS_COUNT) PROCESS_COUNT, ");
strSql.append(" TRIM(PRE_SERV_STATE) PRE_SERV_STATE,TRIM(REMARK) REMARK,TRIM(CHARGE) CHARGE,TRIM(BALANCE) BALANCE, ");
strSql.append(" TRIM(CREDIT) CREDIT,TRIM(OWE_TASK_ITEM_ID) OWE_TASK_ITEM_ID ");
strSql.append(" FROM A_WORK_ORDER ");
strSql.append(" WHERE STATE='P0C' AND ROWNUM<500 ORDER BY ORDER_SERIAL_NBR ");
rs = myDBTrans.executeQuery(strSql.toString());
while (rs.next())
{
HashMap planInfo = new HashMap();
planInfo.put("ORDER_SERIAL_NBR",rs.getString("ORDER_SERIAL_NBR"));
planInfo.put("OWE_BUSINESS_TYPE_ID",rs.getString("OWE_BUSINESS_TYPE_ID"));
planInfo.put("STAFF_ID",rs.getString("STAFF_ID"));
planInfo.put("SERV_ID",rs.getString("SERV_ID"));
planInfo.put("CREATED_DATE",rs.getString("CREATED_DATE"));
planInfo.put("COMPLETED_DATE",rs.getString("COMPLETED_DATE"));
planInfo.put("STATE",rs.getString("STATE"));
planInfo.put("STATE_DATE",rs.getString("STATE_DATE"));
planInfo.put("PROCESS_COUNT",rs.getString("PROCESS_COUNT"));
planInfo.put("PRE_SERV_STATE",rs.getString("PRE_SERV_STATE"));
planInfo.put("REMARK",rs.getString("REMARK"));
planInfo.put("CHARGE",rs.getString("CHARGE"));
planInfo.put("BALANCE",rs.getString("BALANCE"));
planInfo.put("CREDIT",rs.getString("CREDIT"));
planInfo.put("OWE_TASK_ITEM_ID",rs.getString("OWE_TASK_ITEM_ID"));
list.add(planInfo);
}
if (rs != null) {
rs.close();
rs = null;
}
return list;
}
// public void updateBJOnTimeCreditIntfPlan(String requestId,String serial) throws SQLException
// {
// ResultSet rs = null;
// StringBuffer strSql = new StringBuffer();
// strSql.append(" UPDATE A_WORK_ORDER SET STATE='P0P',REMARK='处理成功',SERIAL='" + serial + "'");
// strSql.append(" WHERE ORDER_SERIAL_NBR= " + requestId);
// rs = myDBTrans.executeQuery(strSql.toString());
// }
public void deleteBJOnTimeCreditIntfPlan(String requestId) throws SQLException
{
StringBuffer strSql = new StringBuffer();
strSql.append(" DELETE FROM A_WORK_ORDER ");
strSql.append(" WHERE ORDER_SERIAL_NBR= " + requestId);
myDBTrans.doBatch(strSql.toString());
}
public void insertBJOnTimeAWorkOrderLog(String requestId,String serial) throws SQLException
{
StringBuffer strSql = new StringBuffer();
strSql.append(" INSERT INTO A_WORK_ORDER_LOG (order_serial_nbr,owe_business_type_id,staff_id, ");
strSql.append(" serv_id,created_date,completed_date,state,state_date,process_count,pre_serv_state,remark,");
strSql.append(" tran_manual_date,hd_staff_id,charge,balance,credit,owe_task_item_id,SERIAL) ");
strSql.append(" select order_serial_nbr,owe_business_type_id,staff_id, " );
strSql.append(" serv_id,created_date,completed_date,'P0P',sysdate,process_count,pre_serv_state,remark,");
strSql.append(" null,null,charge,balance,credit,owe_task_item_id,'" +serial + "' from A_WORK_ORDER ");
strSql.append(" WHERE ORDER_SERIAL_NBR= " + requestId);
myDBTrans.doBatch(strSql.toString());
}
public void updateBJOnTimeCreditFailPlan(String requestId,String error, String serial) throws SQLException
{
StringBuffer strSql = new StringBuffer();
strSql.append(" UPDATE A_WORK_ORDER SET STATE='P0E',state_date=sysdate,REMARK='" + error + "',SERIAL='" + serial + "'");
strSql.append(" WHERE ORDER_SERIAL_NBR= " + requestId);
myDBTrans.doBatch(strSql.toString());
}
public OnTimeCreditIntf(String staffNo, String pswd, String path, String planXMLFileFN){
// if(this.conn == null) {
// this.conn = this.getConnection();
// this.conn.setAutoCommit(true);
// }
this.staffNo = staffNo;
this.pswd = pswd;
this.path = path;
this.planXMLFileFN = path + File.separator + planXMLFileFN;
// 启动数据库连接
myDBTrans = new TranContext();
}
public boolean isWorking() {
return working;
}
public void setWorking(boolean working) {
this.working = working;
}
public void run()
{
// 开始无限循环工作
long times = 0;
int sleepTime = 60;
while (working)
{
try
{
List curSubmitReport = getBJOnTimeCreditIntfSumbit();
String xmlFileName = Util.getAppTopFolderPath() + Const.CONFIG_XML_FILE_NAME;
Config config = new Config(xmlFileName);
sleepTime = config.sleep;
for (int n = 0; n < curSubmitReport.size(); n++)
{
try
{
Date curDate = new Date();
HashMap planInfo = (HashMap) curSubmitReport.get(n);
String requestId = (String) planInfo.get("ORDER_SERIAL_NBR");
String servId = (String) planInfo.get("SERV_ID");
String synType = (String) planInfo.get("OWE_BUSINESS_TYPE_ID");
String stateTime = (String) planInfo.get("STATE_DATE");
String curBalance = (String) planInfo.get("BALANCE");
String creditValue = (String) planInfo.get("CREDIT");
String random = String.valueOf(Math.random()).substring(2,10);
Date currentTime=new Date();
SimpleDateFormat formatter=new SimpleDateFormat("yyyyMMddHHmmss");
String time=formatter.format(currentTime);
String serial = time + random + "10" + "02";
WebSoapBindingImplServiceStub.OnTimeCreditControlReq onTimeCreditControlReq = new WebSoapBindingImplServiceStub.OnTimeCreditControlReq();
WebSoapBindingImplServiceStub.OnTimeCreditControl onTimeCreditControl = new WebSoapBindingImplServiceStub.OnTimeCreditControl();
onTimeCreditControlReq.setRequestId(serial);
onTimeCreditControlReq.setServId(servId);
onTimeCreditControlReq.setStateTime(stateTime);
onTimeCreditControlReq.setSynType(Integer.parseInt(synType));
onTimeCreditControlReq.setInterfaceId("");
onTimeCreditControlReq.setCurBalance(curBalance);
onTimeCreditControlReq.setCreditValue(creditValue);
onTimeCreditControl.setIn0(onTimeCreditControlReq);
logger.info("**OnTimeCreditControl**请求参数如下:"
+ "\n RequestId(请求流水): " + onTimeCreditControlReq.getRequestId()
+ "\n ServId(用户标识): " + onTimeCreditControlReq.getServId()
+ "\n SynType(同步类型): " + onTimeCreditControlReq.getSynType()
+ "\n curBalance(实时结余): " + onTimeCreditControlReq.getCurBalance()
+ "\n creditValue(用户信用度): " + onTimeCreditControlReq.getCreditValue()
+ "\n StateTime(状态时间): " + onTimeCreditControlReq.getStateTime());
String result = callOnTimeCreditIntfWebServices(onTimeCreditControl,config);
if("0".equals(result))
{
insertBJOnTimeAWorkOrderLog(requestId,serial);
deleteBJOnTimeCreditIntfPlan(requestId);
logger.info("=========OnTimeCreditControl successful,servId:"+servId+"=========");
}
else
{
myDBTrans.roolback();
updateBJOnTimeCreditFailPlan(requestId,result,serial);
logger.info("=========OnTimeCreditControl failure,servId:"+servId+"当前流水执行失败!!!" );
}
myDBTrans.commit();
// 关闭数据集
try
{
myDBTrans.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
catch (RuntimeException e)
{
logger.info("=========failure=========当前条目计划执行失败!!!" );
e.printStackTrace();
myDBTrans.roolback();
myDBTrans.close();
}
}
}
catch(Exception ex)
{
ex.printStackTrace();
Util.outPutInfo("未知错误发生" + ex.getMessage());
}
// 关闭数据集
try
{
myDBTrans.close();
}
catch (Exception e)
{
e.printStackTrace();
}
// 睡眠一段时间后再工作
try
{
sleep(sleepTime);
myDBTrans.freeCon();
myDBTrans.initConnection();
}
catch(InterruptedException e)
{
Util.outPutInfo("线程睡眠被打断,程序继续执行: " + e.getMessage());
e.printStackTrace();
}
}
}
private String callOnTimeCreditIntfWebServices(WebSoapBindingImplServiceStub.OnTimeCreditControl onTimeCreditControlReq,Config config)
{
try
{
WebSoapBindingImplServiceStub stub = new WebSoapBindingImplServiceStub(config.wsEndpoint);
WebSoapBindingImplServiceStub.OnTimeCreditControlResponse onTimeCreditControlResp = stub.onTimeCreditControl(onTimeCreditControlReq);
logger.info("result is: \n"+onTimeCreditControlResp.getOnTimeCreditControlReturn().getResult());
String result = onTimeCreditControlResp.getOnTimeCreditControlReturn().getResult();
if("0".equals(result)) return "0";
else return onTimeCreditControlResp.getOnTimeCreditControlReturn().getErrorMessage();
}
catch(Exception e)
{
e.printStackTrace();
return "5000";
}
}
public static void main(String[] args)
{
String path = Util.getAppTopFolderPath();
String user = "jlz";
String pswd = "1q2w3e4r";
Thread thread = new OnTimeCreditIntf(user, pswd, path, Const.SUBMIT_PLAN_XML_FILE_NAME);
thread.setDaemon(false);
((OnTimeCreditIntf) thread).setWorking(true);
thread.start();
// 主线程进入无限睡眠状态,其创建的子线程 thread 继续工作
try
{
Thread.sleep(Long.MAX_VALUE);
}
catch(InterruptedException e)
{
System.out.println("主线睡眠状态被打断,程序继续执行...\n" + e.getMessage());
}
// 当主线程睡眠被打断时,程序结束,并设置子线程状态,让其在完成必要工作后也结束
((OnTimeCreditIntf) thread).setWorking(false);
}
}