public override void ReceivedData(AxKHOpenAPILib.AxKHOpenAPI axKHOpenAPI, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveTrDataEvent e) { FileLog.PrintF("ReceivedData OPTKWFID"); //try { /* * sScrNo – 화면번호 * sRQName – 사용자구분 명 * sTrCode – Tran 명 * sRecordName – Record 명 * sPreNext – 연속조회 유무 */ String 종목코드 = "XXXX"; int nCnt = axKHOpenAPI.GetRepeatCnt(e.sTrCode, e.sRQName); String keyStockCodeLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}"; String keyStockCode = String.Format(keyStockCodeLayout , e.sRQName , e.sTrCode , e.sScrNo ); 종목코드 = AppLib.getClass1Instance().getStockCode(keyStockCode); String keyLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}|stockCode:{3}"; String key = String.Format(keyLayout , e.sRQName , e.sTrCode , e.sScrNo , 종목코드 ); spell = AppLib.getClass1Instance().getSpell(key).ShallowCopy(); List <TB_OPTKWFID> lst = new List <TB_OPTKWFID>(); if (nCnt > 0) { for (int i = 0; i < nCnt; i++) { /* * FileLog.PrintF("OPTKWFID ReceivedData 종목코드 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "종목코드").Trim());//[1] * FileLog.PrintF("OPTKWFID ReceivedData 종목명 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "종목명").Trim());//[2] * FileLog.PrintF("OPTKWFID ReceivedData 현재가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "현재가").Trim());//[3] * FileLog.PrintF("OPTKWFID ReceivedData 기준가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "기준가").Trim());//[4] * FileLog.PrintF("OPTKWFID ReceivedData 전일대비 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "전일대비").Trim());//[5] * FileLog.PrintF("OPTKWFID ReceivedData 전일대비기호 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "전일대비기호").Trim());//[6] * FileLog.PrintF("OPTKWFID ReceivedData 등락율 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "등락율").Trim());//[7] * FileLog.PrintF("OPTKWFID ReceivedData 거래량 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "거래량").Trim());//[8] * FileLog.PrintF("OPTKWFID ReceivedData 거래대금 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "거래대금").Trim());//[9] * FileLog.PrintF("OPTKWFID ReceivedData 체결량 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "체결량").Trim());//[10] * FileLog.PrintF("OPTKWFID ReceivedData 체결강도 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "체결강도").Trim());//[11] * FileLog.PrintF("OPTKWFID ReceivedData 전일거래량대비 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "전일거래량대비").Trim());//[12] * FileLog.PrintF("OPTKWFID ReceivedData 매도호가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매도호가").Trim());//[13] * FileLog.PrintF("OPTKWFID ReceivedData 매수호가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매수호가").Trim());//[14] * FileLog.PrintF("OPTKWFID ReceivedData 매도1차호가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매도1차호가").Trim());//[15] * FileLog.PrintF("OPTKWFID ReceivedData 매도2차호가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매도2차호가").Trim());//[16] * FileLog.PrintF("OPTKWFID ReceivedData 매도3차호가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매도3차호가").Trim());//[17] * FileLog.PrintF("OPTKWFID ReceivedData 매도4차호가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매도4차호가").Trim());//[18] * FileLog.PrintF("OPTKWFID ReceivedData 매도5차호가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매도5차호가").Trim());//[19] * FileLog.PrintF("OPTKWFID ReceivedData 매수1차호가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매수1차호가").Trim());//[20] * FileLog.PrintF("OPTKWFID ReceivedData 매수2차호가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매수2차호가").Trim());//[21] * FileLog.PrintF("OPTKWFID ReceivedData 매수3차호가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매수3차호가").Trim());//[22] * FileLog.PrintF("OPTKWFID ReceivedData 매수4차호가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매수4차호가").Trim());//[23] * FileLog.PrintF("OPTKWFID ReceivedData 매수5차호가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매수5차호가").Trim());//[24] * FileLog.PrintF("OPTKWFID ReceivedData 상한가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "상한가").Trim());//[25] * FileLog.PrintF("OPTKWFID ReceivedData 하한가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "하한가").Trim());//[26] * FileLog.PrintF("OPTKWFID ReceivedData 시가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "시가").Trim());//[27] * FileLog.PrintF("OPTKWFID ReceivedData 고가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "고가").Trim());//[28] * FileLog.PrintF("OPTKWFID ReceivedData 저가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "저가").Trim());//[29] * FileLog.PrintF("OPTKWFID ReceivedData 종가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "종가").Trim());//[30] * FileLog.PrintF("OPTKWFID ReceivedData 체결시간 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "체결시간").Trim());//[31] * FileLog.PrintF("OPTKWFID ReceivedData 예상체결가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "예상체결가").Trim());//[32] * FileLog.PrintF("OPTKWFID ReceivedData 예상체결량 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "예상체결량").Trim());//[33] * FileLog.PrintF("OPTKWFID ReceivedData 자본금 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "자본금").Trim());//[34] * FileLog.PrintF("OPTKWFID ReceivedData 액면가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "액면가").Trim());//[35] * FileLog.PrintF("OPTKWFID ReceivedData 시가총액 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "시가총액").Trim());//[36] * FileLog.PrintF("OPTKWFID ReceivedData 주식수 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "주식수").Trim());//[37] * FileLog.PrintF("OPTKWFID ReceivedData 호가시간 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "호가시간").Trim());//[38] * FileLog.PrintF("OPTKWFID ReceivedData 일자 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "일자").Trim());//[39] * FileLog.PrintF("OPTKWFID ReceivedData 우선매도잔량 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "우선매도잔량").Trim());//[40] * FileLog.PrintF("OPTKWFID ReceivedData 우선매수잔량 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "우선매수잔량").Trim());//[41] * FileLog.PrintF("OPTKWFID ReceivedData 우선매도건수 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "우선매도건수").Trim());//[42] * FileLog.PrintF("OPTKWFID ReceivedData 우선매수건수 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "우선매수건수").Trim());//[43] * FileLog.PrintF("OPTKWFID ReceivedData 총매도잔량 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "총매도잔량").Trim());//[44] * FileLog.PrintF("OPTKWFID ReceivedData 총매수잔량 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "총매수잔량").Trim());//[45] * FileLog.PrintF("OPTKWFID ReceivedData 총매도건수 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "총매도건수").Trim());//[46] * FileLog.PrintF("OPTKWFID ReceivedData 총매수건수 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "총매수건수").Trim());//[47] * FileLog.PrintF("OPTKWFID ReceivedData 패리티 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "패리티").Trim());//[48] * FileLog.PrintF("OPTKWFID ReceivedData 기어링 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "기어링").Trim());//[49] * FileLog.PrintF("OPTKWFID ReceivedData 손익분기 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "손익분기").Trim());//[50] * FileLog.PrintF("OPTKWFID ReceivedData ELW행사가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "ELW행사가").Trim());//[51] * FileLog.PrintF("OPTKWFID ReceivedData 전환비율 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "전환비율").Trim());//[52] * FileLog.PrintF("OPTKWFID ReceivedData ELW만기일 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "ELW만기일").Trim());//[53] * FileLog.PrintF("OPTKWFID ReceivedData 미결제약정 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "미결제약정").Trim());//[54] * FileLog.PrintF("OPTKWFID ReceivedData 미결제전일대비 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "미결제전일대비").Trim());//[55] * FileLog.PrintF("OPTKWFID ReceivedData 이론가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "이론가").Trim());//[56] * FileLog.PrintF("OPTKWFID ReceivedData 내재변동성 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "내재변동성").Trim());//[57] * FileLog.PrintF("OPTKWFID ReceivedData 델타 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "델타").Trim());//[58] * FileLog.PrintF("OPTKWFID ReceivedData 감마 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "감마").Trim());//[59] * FileLog.PrintF("OPTKWFID ReceivedData 세타 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "세타").Trim());//[60] * FileLog.PrintF("OPTKWFID ReceivedData 베가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "베가").Trim());//[61] * FileLog.PrintF("OPTKWFID ReceivedData 로 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "로").Trim());//[62] */ /* *[2020-04-18 00:45:39]OPTKWFID ReceivedData 종목코드 =>000390 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 종목명 =>삼화페인트 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 현재가 =>+5110 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 기준가 =>5040 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 전일대비 =>+70 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 전일대비기호 =>2 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 등락율 =>+1.39 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 거래량 =>50291 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 거래대금 =>256 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 체결량 =>+1 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 체결강도 =>108.71 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 전일거래량대비 =>+283.20 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 매도호가 =>+5120 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 매수호가 =>+5110 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 매도1차호가 =>+5120 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 매도2차호가 =>+5130 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 매도3차호가 =>+5140 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 매도4차호가 =>+5150 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 매도5차호가 =>+5160 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 매수1차호가 =>+5110 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 매수2차호가 =>+5100 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 매수3차호가 =>+5090 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 매수4차호가 =>+5080 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 매수5차호가 =>+5070 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 상한가 =>+6550 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 하한가 =>-3530 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 시가 =>5040 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 고가 =>+5170 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 저가 =>5040 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 종가 =>+5110 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 체결시간 =>155926 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 예상체결가 =>+5110 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 예상체결량 =>334 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 자본금 =>132 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 액면가 =>500 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 시가총액 =>1351 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 주식수 =>26439 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 호가시간 =>160000 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 일자 =>20200417 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 우선매도잔량 =>270 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 우선매수잔량 =>117 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 우선매도건수 => * [2020-04-18 00:45:39]OPTKWFID ReceivedData 우선매수건수 => * [2020-04-18 00:45:39]OPTKWFID ReceivedData 총매도잔량 =>7991 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 총매수잔량 =>12270 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 총매도건수 =>-1000 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 총매수건수 => * [2020-04-18 00:45:39]OPTKWFID ReceivedData 패리티 =>0.00 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 기어링 =>0.00 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 손익분기 =>0.00 * [2020-04-18 00:45:39]OPTKWFID ReceivedData ELW행사가 =>0 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 전환비율 =>0.0000 * [2020-04-18 00:45:39]OPTKWFID ReceivedData ELW만기일 =>00000000 * [2020-04-18 00:45:39]OPTKWFID ReceivedData 미결제약정 => * [2020-04-18 00:45:39]OPTKWFID ReceivedData 미결제전일대비 => * [2020-04-18 00:45:39]OPTKWFID ReceivedData 이론가 => * [2020-04-18 00:45:39]OPTKWFID ReceivedData 내재변동성 => * [2020-04-18 00:45:39]OPTKWFID ReceivedData 델타 => * [2020-04-18 00:45:39]OPTKWFID ReceivedData 감마 => * [2020-04-18 00:45:39]OPTKWFID ReceivedData 세타 => * [2020-04-18 00:45:39]OPTKWFID ReceivedData 베가 => * [2020-04-18 00:45:39]OPTKWFID ReceivedData 로 => */ TB_OPTKWFID tb_optkwfid = new TB_OPTKWFID(); tb_optkwfid.stock_cd = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "종목코드").Trim(); //[0] tb_optkwfid.stock_nm = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "종목명").Trim(); //[1] int 현재가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "현재가").Trim(), out 현재가); tb_optkwfid.curr_amt = 현재가; int 기준가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "기준가").Trim(), out 기준가); tb_optkwfid.yesterday_amt = 기준가; int 전일대비 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "전일대비").Trim(), out 전일대비); tb_optkwfid.contrast_yesterday = 전일대비; int 전일대비기호 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "전일대비기호").Trim(), out 전일대비기호); tb_optkwfid.contrast_yesterday_symbol = 전일대비기호; float 등락율 = 0; float.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "등락율").Trim(), out 등락율); tb_optkwfid.fluctuation_rt = 등락율; int 거래량 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "거래량").Trim(), out 거래량); tb_optkwfid.trade_qty = 거래량; int 거래대금 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "거래대금").Trim(), out 거래대금); tb_optkwfid.trade_amt = 거래대금; int 체결량 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "체결량").Trim(), out 체결량); tb_optkwfid.contract_qty = 체결량; float 체결강도 = 0; float.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "체결강도").Trim(), out 체결강도); tb_optkwfid.contract_strength = 체결강도; float 전일거래량대비 = 0; float.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "전일거래량대비").Trim(), out 전일거래량대비); tb_optkwfid.yesterday_contrast_trade_rt = 전일거래량대비; int 매도호가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매도호가").Trim(), out 매도호가); tb_optkwfid.offered_amt = 매도호가; int 매수호가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매수호가").Trim(), out 매수호가); tb_optkwfid.bid_amt = 매수호가; int 매도1차호가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매도1차호가").Trim(), out 매도1차호가); tb_optkwfid.offered_amt_one = 매도1차호가; int 매도2차호가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매도2차호가").Trim(), out 매도2차호가); tb_optkwfid.offered_amt_two = 매도2차호가; int 매도3차호가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매도3차호가").Trim(), out 매도3차호가); tb_optkwfid.offered_amt_three = 매도3차호가; int 매도4차호가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매도4차호가").Trim(), out 매도4차호가); tb_optkwfid.offered_amt_four = 매도4차호가; int 매도5차호가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매도5차호가").Trim(), out 매도5차호가); tb_optkwfid.offered_amt_five = 매도5차호가; int 매수1차호가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매수1차호가").Trim(), out 매수1차호가); tb_optkwfid.bid_amt_one = 매수1차호가; int 매수2차호가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매수2차호가").Trim(), out 매수2차호가); tb_optkwfid.bid_amt_two = 매수2차호가; int 매수3차호가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매수3차호가").Trim(), out 매수3차호가); tb_optkwfid.bid_amt_three = 매수3차호가; int 매수4차호가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매수4차호가").Trim(), out 매수4차호가); tb_optkwfid.bid_amt_four = 매수4차호가; int 매수5차호가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매수5차호가").Trim(), out 매수5차호가); tb_optkwfid.bid_amt_five = 매수5차호가; int 상한가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "상한가").Trim(), out 상한가); tb_optkwfid.upper_amt_lmt = 상한가; int 하한가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "하한가").Trim(), out 하한가); tb_optkwfid.lower_amt_lmt = 하한가; int 시작가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "시작가").Trim(), out 시작가); tb_optkwfid.start_amt = 시작가; int 고가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "고가").Trim(), out 고가); tb_optkwfid.high_amt = 고가; int 저가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "저가").Trim(), out 저가); tb_optkwfid.low_amt = 저가; int 종가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "종가").Trim(), out 종가); tb_optkwfid.clsg_amt = 종가; tb_optkwfid.contract_time = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "체결시간").Trim();//[1] int 예상체결가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "예상체결가").Trim(), out 예상체결가); tb_optkwfid.expectation_contract_amt = 예상체결가; int 예상체결수량 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "예상체결수량").Trim(), out 예상체결수량); tb_optkwfid.expectation_contract_qty = 예상체결수량; int 자본금 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "자본금").Trim(), out 자본금); tb_optkwfid.capital_amt = 자본금; int 액면가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "액면가").Trim(), out 액면가); tb_optkwfid.face_amt = 액면가; int 시가총액 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "시가총액").Trim(), out 시가총액); tb_optkwfid.total_mrkt_amt = 시가총액; int 상장주식수 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "상장주식수").Trim(), out 상장주식수); tb_optkwfid.stock_cnt = 상장주식수; tb_optkwfid.hoga_time = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "호가시간").Trim(); //[1] tb_optkwfid.stock_dt = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "일자").Trim(); //[1] int 우선매도잔량 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "우선매도잔량").Trim(), out 우선매도잔량); tb_optkwfid.fst_offered_balance = 우선매도잔량; int 우선매수잔량 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "우선매수잔량").Trim(), out 우선매수잔량); tb_optkwfid.fst_bid_balance = 우선매수잔량; int 우선매도건수 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "우선매도건수").Trim(), out 우선매도건수); tb_optkwfid.fst_offered_qty = 우선매도건수; int 우선매수건수 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "우선매수건수").Trim(), out 우선매수건수); tb_optkwfid.fst_bid_qty = 우선매수건수; int 총매도잔량 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "총매도잔량").Trim(), out 총매도잔량); tb_optkwfid.tot_offered_balance = 총매도잔량; int 총매수잔량 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "총매수잔량").Trim(), out 총매수잔량); tb_optkwfid.tot_bid_balance = 총매수잔량; int 총매도건수 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "총매도건수").Trim(), out 총매도건수); tb_optkwfid.tot_offered_qty = 총매도건수; int 총매수건수 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "총매수건수").Trim(), out 총매수건수); tb_optkwfid.tot_bid_qty = 총매수건수; float 패리티 = 0; float.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "패리티").Trim(), out 패리티); tb_optkwfid.parity_rt = 패리티; float 기어링 = 0; float.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "기어링").Trim(), out 기어링); tb_optkwfid.gearing = 기어링; float 손익분기 = 0; float.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "손익분기").Trim(), out 손익분기); tb_optkwfid.break_even_point = 기어링; int ELW행사가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "ELW행사가").Trim(), out ELW행사가); tb_optkwfid.elw_strike_amt = ELW행사가; float 전환비율 = 0; float.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "전환비율").Trim(), out 전환비율); tb_optkwfid.conversion_rt = 전환비율; tb_optkwfid.elw_expiry_dt = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "ELW만기일").Trim();//[1] int 미결제약정 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "미결제약정").Trim(), out 미결제약정); tb_optkwfid.open_interest = 미결제약정; int 미결제전일대비 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "미결제전일대비").Trim(), out 미결제전일대비); tb_optkwfid.contrast_open_interest = 미결제전일대비; int 이론가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "이론가").Trim(), out 이론가); tb_optkwfid.theorist_amt = 이론가; int 내재변동성 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "내재변동성").Trim(), out 내재변동성); tb_optkwfid.implied_volatility = 내재변동성; int 델타 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "델타").Trim(), out 델타); tb_optkwfid.delta = 델타; int 감마 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "감마").Trim(), out 감마); tb_optkwfid.gamma = 감마; int 세타 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "세타").Trim(), out 세타); tb_optkwfid.theta = 세타; int 베가 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "베가").Trim(), out 베가); tb_optkwfid.vega = 베가; int 로 = 0; int.TryParse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "로").Trim(), out 로); tb_optkwfid.lo = 로; //(8025-8089)/8089*100 //24005=23775+160+70 //24005-24575=-570 //24805 lst.Add(tb_optkwfid); } } //이것은 연속적이지 않기 때문에 바로 제거 한다. AppLib.getClass1Instance().removeSpellDictionary(spell.key); int position = spell.key.LastIndexOf("|"); String key1 = spell.key.Substring(0, position); AppLib.getClass1Instance().removeStockCodeDictionary(key1); //래치를 호출해서 잠김을 제거한다.--래치 일단 제거 호출하는데도 제거 했다. 1초에 5번 호출 규칙만 적용해보자. AppLib.getClass1Instance().setOpt10081(spell.sTrCode); DailyData dd = new DailyData(); dd.insertOptkwfid(lst); }
private void createDishesCanvas() { // РАЗМЕРЫ ПАНЕЛИ БЛЮД double dishesPanelWidth = (double)AppLib.GetAppGlobalValue("dishesPanelWidth"); double dishPanelLeftMargin = (double)AppLib.GetAppGlobalValue("dishPanelLeftMargin"); double dishPanelWidth = (double)AppLib.GetAppGlobalValue("dishPanelWidth"); int dColCount = AppLib.GetAppGlobalValue("dishesColumnsCount").ToString().ToInt(); int iRowsCount = 0; if (mItem.Dishes.Count > 0) { iRowsCount = ((mItem.Dishes.Count - 1) / dColCount) + 1; } DishItem dish; int iRow, iCol; double leftPos, topPos; for (int i = 0; i < mItem.Dishes.Count; i++) { dish = mItem.Dishes[i]; // размеры канвы с панелями блюд bool isExistGarnishes = (dish.Garnishes != null); double currentPanelHeight = (isExistGarnishes) ? (double)AppLib.GetAppGlobalValue("dishPanelHeightWithGarnish") : (double)AppLib.GetAppGlobalValue("dishPanelHeight"); if (double.IsNaN(base.Width) || (base.Width == 0)) { base.Width = dishesPanelWidth; base.Height = iRowsCount * currentPanelHeight; } // положение панели блюда iRow = i / dColCount; iCol = i % dColCount; leftPos = (dishPanelLeftMargin + iCol * dishPanelWidth); topPos = iRow * currentPanelHeight; MainMenuDishPanel dishPanel = new MainMenuDishPanel(dish, leftPos, topPos); base.Children.Add(dishPanel); } // for dishes //base.Background = Brushes.Gold; //base.Background = new SolidColorBrush(new Color() { R = (byte)rnd.Next(0,254), G= (byte)rnd.Next(0, 254), B= (byte)rnd.Next(0, 254), A=0xFF }); } // method
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { string retVal = null; if (parameter == null) { retVal = AppLib.GetLangText((Dictionary <string, string>)value); if (IsUpper == true) { retVal = retVal.ToUpper(culture); } if (IsLower == true) { retVal = retVal.ToLower(culture); } } else { string mode = (string)parameter; int i1 = mode.IndexOf('.'); if (i1 > -1) { string key = mode.Substring(0, i1); string val = mode.Substring(i1 + 1); if (key == "appSet") { Dictionary <string, string> lDict = (Dictionary <string, string>)AppLib.GetAppGlobalValue(val); retVal = AppLib.GetLangText(lDict); if (IsUpper == true) { retVal = retVal.ToUpper(culture); } if (IsLower == true) { retVal = retVal.ToLower(culture); } } } } return(retVal); }
private void txtBuildingFund_PreviewTextInput(object sender, TextCompositionEventArgs e) { AppLib.CheckIsNumeric(e); }
//************************************** // ГЛАВНАЯ ПРОЦЕДУРА ОБНОВЛЕНИЯ ЗАКАЗОВ // здесь пишем в лог при включенном флаге TraceOrdersDetails // возвращает текст ошибки //************************************** public string UpdateOrders() { string sLog = ""; #region автосброс вчерашних заказов if (_changeStatusYesterdayOrdersCfg) { if (_changeStatusYesterdayOrdersCurrent) { if (updateYesterdayOrdersStatus()) { // для одноразового прохода в течение дня _changeStatusYesterdayOrdersCurrent = false; if (_currentDate != DateTime.Today) { _currentDate = DateTime.Today; } } } // текущий флаг обновления вчерашних заказов сброшен и переползли в новые сутки else if (_currentDate != DateTime.Today) { // устанавливаем флажок, чтобы при следующем проходе, попытаться обновить статус вчерашних заказов _changeStatusYesterdayOrdersCurrent = true; } } #endregion AppLib.WriteLogOrderDetails("GET ORDERS FROM DB - START"); Console.Write("getting orders ..."); DebugTimer.Init(" - get orders from DB", false); // получить заказы из БД string errMsg = null; try { DBOrderHelper.LoadDBOrders(); errMsg = DBOrderHelper.ErrorMessage; } catch (Exception ex) { errMsg = ErrorHelper.GetShortErrMessage(ex); } if (errMsg != null) { return(errMsg); } // получено заказов из БД if (_isLogOrderDetails) { string ids = (_dbOrders.Count > 50) ? "> 50" : getOrdersLogString(_dbOrders); AppLib.WriteLogOrderDetails(" - from DB {0} id/Num/dishes: {1}", _dbOrders.Count, ids); } // цикл по полученным из БД заказам if (_dbOrders != null) { #region *** ОБНОВЛЕНИЕ ВНУТРЕННЕГО СЛОВАРЯ ЗАКАЗОВ _orders коллекцией из БД _dbOrders *** // 1. удалить из _orders те заказы, который уже нет в БД, кроме заблокированных int[] delIds = _orders.Keys .Except(_dbOrders.Select(o => o.Id)) .Except(OrderLocker.GetLockedOrders()) .ToArray(); if (_isLogOrderDetails) { string s1 = ""; if (delIds.Length > 0) { s1 = string.Join(",", delIds); } if (s1 != "") { AppLib.WriteLogOrderDetails(" appModel: remove order Ids {0}", s1); } } foreach (int id in delIds) { _orders[id].Dispose(); _orders.Remove(id); } // 2. обновить или добавить int iCnt = 0; foreach (Order dbOrder in _dbOrders) { iCnt++; // пропустить, если заказ заблокирован от изменений по таймеру при длительных операциях чтения из БД if (OrderLocker.IsLockOrder(dbOrder.Id)) { AppLib.WriteLogOrderDetails(" appModel: locked order Id " + dbOrder.Id.ToString()); // если заказ стал неотображаемый, то удалить его из коллекции if (_orders.ContainsKey(dbOrder.Id)) { OrderModel om = _orders[dbOrder.Id]; if (_allowedKDSStatuses.Contains(om.OrderStatusId) == false) { _orders.Remove(dbOrder.Id); AppLib.WriteLogOrderDetails(" remove from appModel set"); } } continue; } if (_orders.ContainsKey(dbOrder.Id)) { //sLog = string.Format(" appModel: update {0}/{1}", dbOrder.Id, dbOrder.Number); //AppEnv.WriteLogOrderDetails(sLog + " - START"); //_tmpDT = DateTime.Now; try { _orders[dbOrder.Id].UpdateFromDBEntity(dbOrder); } catch (Exception ex) { AppLib.WriteLogErrorMessage("Ошибка обновления служебного словаря для OrderId = {1}: {0}", ex.ToString(), dbOrder.Id); } //AppEnv.WriteLogOrderDetails(sLog + " - FINISH - " + _tmpPeriod()); } // добавление заказа в словарь else { sLog = string.Format(" appModel: add new {0}/{1}", dbOrder.Id, dbOrder.Number); AppLib.WriteLogOrderDetails(sLog + " - START"); _tmpDT = DateTime.Now; try { OrderModel newOrder = new OrderModel(dbOrder); _orders.Add(dbOrder.Id, newOrder); } catch (Exception ex) { AppLib.WriteLogErrorMessage("Ошибка добавления заказа в служебный словарь: {0}", ex.ToString()); } AppLib.WriteLogOrderDetails(sLog + " - FINISH - " + _tmpPeriod()); } //curOrder } // foreach #endregion #region обновить словарь блюд с их количеством, которые ожидают готовки или уже готовятся sLog = " updateDishesQuantityDict()..."; AppLib.WriteLogOrderDetails(sLog); try { updateDishesQuantityDict(_orders); if (_isLogOrderDetails) { AppLib.WriteLogOrderDetails(" - result (depId/count): " + getDishesQtyString()); } // проверяем условие автоматического перехода в режим приготовления checkAutoStartCooking(_orders); } catch (Exception ex) { if (_isLogOrderDetails) { AppLib.WriteLogOrderDetails(" error: " + ex.ToString()); } else { AppLib.WriteLogErrorMessage("Ошибка обновления словаря количества готовящихся блюд по цехам: " + ex.ToString()); } } #endregion } if (_isLogOrderDetails) { string ids = (_dbOrders.Count > 50) ? "> 50" : getOrdersLogString(_orders.Values); AppLib.WriteLogOrderDetails(" - to clients {0} id/Num/dishes: {1}", _orders.Count, ids); } AppLib.WriteLogOrderDetails("get orders from DB - FINISH" + " - " + DebugTimer.GetInterval()); Console.WriteLine(" - " + _orders.Count.ToString() + " " + DebugTimer.GetInterval()); return(null); } // method
// из обработчика MouseUp объектов DishPanel и OrderPanelHeader internal static void OpenStateChangeWindow(OrderViewModel orderModel, OrderDishViewModel dishModel) { if ((orderModel == null) && (dishModel == null)) { return; } // из РАЗРЕШЕННЫХ переходов выбрать переходы, ДОСТУПНЫЕ для текущего состояния OrderStatusEnum currentState = (OrderStatusEnum)((dishModel == null) ? orderModel.OrderStatusId : dishModel.DishStatusId); KDSModeEnum kdsMode = KDSModeHelper.CurrentKDSMode; // текущий режим КДС List <KeyValuePair <OrderStatusEnum, OrderStatusEnum> > allowedActions = KDSModeHelper.DefinedKDSModes[kdsMode].AllowedActions; if (allowedActions != null) { List <OrderStatusEnum> allowedStates = allowedActions.Where(p => (p.Key == currentState)).Select(p => p.Value).ToList(); // при клике по ЗАКАЗУ проверить статус отображаемых на данном КДСе позиций if (dishModel == null) { OrderStatusEnum statAllDishes = (OrderStatusEnum)(int)orderModel.StatusAllowedDishes; //AppLib.GetStatusAllDishes(orderModel.Dishes); if (orderModel.StatusAllowedDishes != StatusEnum.None) { currentState = statAllDishes; // текущее состояние - по блюдам! // и, если в разрешенных переходах есть пары с таким ключем, т.е. ВСЕ блюда находятся в состоянии, которое есть в разрешенных переходах var tmpList = allowedActions.Where(s => s.Key == statAllDishes).ToList(); // то отображаем эти переходы, а не переходы из состояния заказа! if (tmpList != null) { allowedStates = tmpList.Select(p => p.Value).ToList(); } } } StringBuilder sb = new StringBuilder(); allowedStates.ForEach(status => sb.Append(status.ToString())); AppLib.WriteLogClientAction("Open StateChange win, allowedStates: " + sb.ToString()); // открываем окно изменения статуса if (allowedStates.Count != 0) { StateChange win = (StateChange)WpfHelper.GetAppGlobalValue("StateChangeWindow"); win.CurrentState = currentState; win.Order = orderModel; win.Dish = dishModel; win.AllowedStates = allowedStates; WpfHelper.SetWinSizeToMainWinSize(win); win.ShowDialog(); AppLib.WriteLogClientAction("Close StateChange win, result: {0}", win.CurrentState.ToString()); // изменить статус AppDataProvider dataProvider = (AppDataProvider)WpfHelper.GetAppGlobalValue("AppDataProvider"); OrderStatusEnum newState = win.CurrentState; if ((newState != OrderStatusEnum.None) && (newState != currentState) && (dataProvider != null)) { string sLogMsg; bool result = false; bool finReady = getFinReadyValue(newState); // флаг терминального окончания готовки #region изменение статуса try { // проверить set-канал if (!dataProvider.EnableSetChannel) { dataProvider.CreateSetChannel(); } if (!dataProvider.EnableSetChannel) { dataProvider.CreateSetChannel(); } // изменение состояния БЛЮДА и разрешенных ингредиентов (2017-07-26) if (dishModel != null) { sLogMsg = string.Format("orderId {0} (num {1}) for change status dishId {2} ({3}) to {4}", orderModel.Id, orderModel.Number, dishModel.Id, dishModel.DishName, newState.ToString()); DateTime dtTmr = DateTime.Now; if (dataProvider.LockOrder(orderModel.Id)) { AppLib.WriteLogClientAction("lock " + sLogMsg + ": success"); OrderStatusEnum preState = dishModel.Status; // изменить статус блюда с ингредиентами result = changeStatusDishWithIngrs(dataProvider, orderModel, dishModel, newState); string sBuf = "delock " + sLogMsg + " - " + (DateTime.Now - dtTmr).ToString(); if (dataProvider.DelockOrder(orderModel.Id)) { AppLib.WriteLogClientAction(sBuf + ": success"); } else { AppLib.WriteLogClientAction(sBuf + ": NOT success"); } } else { AppLib.WriteLogClientAction("lock " + sLogMsg + ": NOT success"); } } // изменение состояния ЗАКАЗА, то изменяем все равно поблюдно else if (dishModel == null) { sLogMsg = string.Format("orderId {0} (num {1}) for change order status to {2}", orderModel.Id, orderModel.Number, newState.ToString()); DateTime dtTmr = DateTime.Now; if (dataProvider.LockOrder(orderModel.Id)) { AppLib.WriteLogClientAction("lock " + sLogMsg + ": success"); List <int> dishIds = new List <int>(); // dishes id has changed // меняем статус БЛЮД в заказе, если блюдо разрешено для данного КДСа foreach (OrderDishViewModel item in orderModel.Dishes.Where(d => d.ParentUID.IsNull())) { if (DishesFilter.Instance.Checked(item)) { // изменить статус блюда с ингредиентами result = changeStatusDishWithIngrs(dataProvider, orderModel, item, newState); if (result) { dishIds.Add(item.Id); } } } // foreach string sBuf = "delock " + sLogMsg + " - " + (DateTime.Now - dtTmr).ToString(); if (dataProvider.DelockOrder(orderModel.Id)) { AppLib.WriteLogClientAction(sBuf + ": success"); } else { AppLib.WriteLogClientAction(sBuf + ": NOT success"); } } else { AppLib.WriteLogClientAction("lock " + sLogMsg + ": NOT success"); } } // order status } catch (Exception ex) { AppLib.WriteLogErrorMessage(ex.ToString()); MessageBox.Show("Ошибка изменения состояния. Попробуйте еще раз.", "Ошибка записи нового состояния", MessageBoxButton.OK); } #endregion } } // if (allowedStates.Count != 0) } // if (allowedActions != null) } // method
private void txtPhoneNo_TextInput(object sender, TextCompositionEventArgs e) { AppLib.CheckIsNumeric(e); }
public void ResetLangName() { _tbGarnishName.Text = (string)AppLib.GetLangText((Dictionary <string, string>)_garnItem.langNames); }
private void MainMenuGarnish_PreviewMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) { if (AppLib.IsDrag) { return; } _isSelected = !_isSelected; setSelectionMode(); // передать уведомление в панель блюда if (SelectGarnish != null) { SelectGarnish(this, new SelectGarnishEventArgs(_isSelected, _garnIndex, AppLib.GetLangText(_garnItem.langDishDescr))); } }
public override void ReceivedData(AxKHOpenAPILib.AxKHOpenAPI axKHOpenAPI, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveTrDataEvent e) { FileLog.PrintF("ReceivedData OPT10015"); try { /* * sScrNo – 화면번호 * sRQName – 사용자구분 명 * sTrCode – Tran 명 * sRecordName – Record 명 * sPreNext – 연속조회 유무 */ List <TB_OPT10015> lst = new List <TB_OPT10015>(); String 종목코드 = "XXXX"; int nCnt = axKHOpenAPI.GetRepeatCnt(e.sTrCode, e.sRQName); String keyStockCodeLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}"; String keyStockCode = String.Format(keyStockCodeLayout , e.sRQName , e.sTrCode , e.sScrNo ); 종목코드 = AppLib.getClass1Instance().getStockCode(keyStockCode); String keyLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}|stockCode:{3}"; String key = String.Format(keyLayout , e.sRQName , e.sTrCode , e.sScrNo , 종목코드 ); spell = AppLib.getClass1Instance().getSpell(key).ShallowCopy(); String startDate = spell.startDate; String lastStockDate = ""; int startDate일자 = 0; if (!int.TryParse(startDate, out startDate일자)) { startDate일자 = 0; } if (nCnt > 0) {//시작일자에 내림차순으로 들어온다. for (int i = 0; i < nCnt; i++) { int 일자 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "일자").Trim());//[0] lastStockDate = 일자.ToString(); if (startDate != null) { if (!(일자 >= startDate일자)) { //입력받은 20200301 을 정수로 바꾼 strartDAte일자 //데이터로 받을 "일자" 가 이것보다 큰것만 가져온다. //명령을 넣을때 실제로 시작일자는 ui상에서 종료일자가 들어간다.\ // api는 시작일자를 기준으로 내림차순으로 하기 때문이다. //내림차순으로 받은거에서 끊는 역할을 해준다. break; } } int 종가 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "종가").Trim()); //[1] int 전일대비기호 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "전일대비기호").Trim()); //[2] int 전일대비 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "전일대비").Trim()); //[3] float 등락율 = float.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "등락율").Trim()); //[4] int 거래량 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "거래량").Trim()); //[5] int 거래대금 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "거래대금").Trim()); //[6] int 장전거래량 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "장전거래량").Trim()); //[7] float 장전거래비중 = float.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "장전거래비중").Trim()); //[8] int 장중거래량 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "장중거래량").Trim()); //[9] float 장중거래비중 = float.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "장중거래비중").Trim()); //[10] int 장후거래량 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "장후거래량").Trim()); //[11] float 장후거래비중 = float.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "장후거래비중").Trim()); //[12] int 기간중거래량 = Int32.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "기간중거래량").Trim()); //[14] TB_OPT10015 tmp = new TB_OPT10015(); tmp.stock_cd = 종목코드; tmp.stock_dt = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "일자").Trim(); tmp.curr_amt = 종가; tmp.contrast_yesterday_symbol = 전일대비기호; tmp.contrast_yesterday = 전일대비; tmp.fluctuation_rt = 등락율; tmp.trade_qty = 거래량; tmp.trade_amt = 거래대금; tmp.before_market_trade_qty = 장전거래량; tmp.before_market_trade_rt = 장전거래비중; tmp.market_trade_qty = 장중거래량; tmp.market_trade_rt = 장중거래비중; tmp.after_market_trade_qty = 장후거래량; tmp.after_market_trade_rt = 장후거래비중; tmp.between_trade_qty = 기간중거래량; tmp.prev_next = e.sPrevNext; lst.Add(tmp); } } else { 종목코드 = "00000"; } if (lst.Count() > 0) { DailyData dd = new DailyData(); dd.insertOpt10015(lst); } int prevNext = 0; int.TryParse(e.sPrevNext, out prevNext); //ScreenNumber.getClass1Instance().DisconnectRealData(e.sScrNo); //ScreenNumber.getClass1Instance().SetRealRemove("ALL", "ALL"); //래치를 호출해서 잠김을 제거한다.--래치 일단 제거 호출하는데도 제거 했다. 1초에 5번 호출 규칙만 적용해보자. AppLib.getClass1Instance().setOpt10081(spell.sTrCode); //2020년03월29일 확인 내용 //nprevNext가 0이면 종료고 2이면 진행으로 알고 있었다. //그런데 어느시점이 지나가면 그게 아닌것 같다. //이걸 확인하려면 디비에 이걸 넣어야한다. //2012년까지 정상동작하고 이전데이터는 무조건 prev_next를 0을 리턴한다. //이건 수동으로 봐야겠다. 끝. if (startDate.Equals("ZERO") || (startDate.Length == 8 && startDate.CompareTo(lastStockDate) >= 0) || prevNext == 0) //ZERO면 한번만 호출이다. 또는 시작일과 마지막 리턴일이 같다면 종료되어야한다. { AppLib.getClass1Instance().removeSpellDictionary(spell.key); int position = spell.key.LastIndexOf("|"); String key1 = spell.key.Substring(0, position); //래치를 호출해서 잠김을 제거한다.--래치 일단 제거 호출하는데도 제거 했다. 1초에 5번 호출 규칙만 적용해보자. } else if (prevNext > 0) { //putReceivedQueueAndsetNextSpell(key, prevNext, lastStockDate); OpenApi.Spell.SpellOpt tmp = spell.ShallowCopy(); tmp.nPrevNext = prevNext; tmp.lastStockDate = lastStockDate; AppLib.getClass1Instance().removeSpellDictionary(key); AppLib.getClass1Instance().AddSpellDictionary(key, tmp); AppLib.getClass1Instance().EnqueueByOrderQueue(tmp); //주문을 다시 넣는다. } } catch (Exception ex) { FileLog.PrintF("[ALERT-ReceivedData-OPT10015]Exception ex=" + ex.Message); } }
private void createGarnishButton() { base.Height = _height; base.Width = _width; // подложка кнопки Path _pathBase = getGarnPath(_width, _height); //if (_garnItem.Image == null) //{ // _pathBase.Fill = _notSelectBrush; //} //else //{ _pathBase.Fill = new ImageBrush() { ImageSource = _garnItem.Image }; _pathBase.Stretch = Stretch.UniformToFill; string sVal = (string)AppLib.GetAppGlobalValue("dishPanelGarnishBrightness"); _pathBase.Opacity = (sVal == null) ? 1.0 : sVal.ToDouble(); //} base.Children.Add(_pathBase); // выделение кнопки _pathSelected = getGarnPath(_width, _height); Color c = ((SolidColorBrush)AppLib.GetAppGlobalValue("appSelectedItemColor")).Color; Color c1 = new Color(); c1.A = 0xAA; c1.R = c.R; c1.G = c.G; c1.B = c.B; _pathSelected.Fill = new SolidColorBrush(c1); _pathSelected.Visibility = Visibility.Collapsed; base.Children.Add(_pathSelected); double dMarg = 0.05 * _width; string grnText = (string)AppLib.GetLangText((Dictionary <string, string>)_garnItem.langNames); _tbGarnishName = new TextBlock() { Text = grnText, Width = _width - (2 * dMarg), TextWrapping = TextWrapping.Wrap, VerticalAlignment = VerticalAlignment.Top, TextAlignment = TextAlignment.Center, FontSize = _fontSize, Margin = new Thickness(dMarg), Foreground = _notSelectTextBrush }; base.Children.Add(_tbGarnishName); string grnPrice = string.Format((string)AppLib.GetAppResource("priceFormatString"), _garnItem.Price); _tbGarnishPrice = new TextBlock() { Text = grnPrice, Width = _width, VerticalAlignment = VerticalAlignment.Bottom, TextAlignment = TextAlignment.Center, FontSize = _fontSize, FontWeight = FontWeights.Bold, Foreground = Brushes.Black }; base.Children.Add(_tbGarnishPrice); }
/// <summary> ///[101] 설명 주식 일일 데이터를 주식이 생성된 일부터 받아온다. ///입력값 ///strCode : 종목코드 ///stockDate: YYYYMMDD 문자열 ex)20160122 ////반환값 /// 성공유무 데이터는 onReceived쪽에서 soap로 쏴줌 /// </summary> /// /// spell 은 내가 만든 속성 api가 너무 과거거 까지 다가져오므로 /// START_STOCK_DATE 로 넘어오면 START_STOCK_DATE 부터 stockDate 까지 가져오기 형식은 'YYYYMMDD' /// ZERO 으로 나오면 한번 받아올수있는 제한까지만 받아오기. /// TWO로 넘어오면 처음 부터 지정한 stockDate까지 nPreNext를 받는쪽에서 2로 지정해서 다받아올수있게 하기. public String GetOpt10081(String strCode, String startDate, String endDate) { //String stockDate = DateTime.Today.ToString("yyyyMMdd"); //음 nPreNext 를 처음 할때는 0으로 놓고 했는데.. // 그럼 과거 몇개랑 현재까지 보이고.. // 받아온것을 nPreNext 2로 하면 이어서 받아오게 되는데.. // qna 게시판 일어보니 1로 넣으면 그날만 가져온다는 것 같다. //해보자. /* * 1. 고객님께서 작성하신 로직상 CommRqData가 전송횟수제한 오류 발생없이 모두 전송되고 있다면 무리가 없습니다. * 2. 2값은 조회하신 기준으로 그 이전의 값을 의미하고, 1값은 조회하신 기준으로 그 이후 연속데이터를 의미합니다. 1 값은 현재 시점 기준이 아닌 특정 일자를 입력하여 조회하는 성격의 TR서비스에서 사용됩니다. */ //그런데 1로 해도 0이랑했을때랑 차이가 없다. ㅠㅠ //결국엔 당일것만 가져오고 싶으면 내가 적절히 짤라 줘야한다.. //그러기 위해서 명령어를 담아두었다가 receive가 되었을때 비교 해서 적절하게 짤라줄 명령어를 담는 저장공간이 필요하겠다. //HashTable이 괜찮겠네... //전역으로 읽을 수 있어야 하니까 공간은 Class1 //내가 마음대로 조절할수있는것은. sRQName, sScreenNo 두개네... /* * 이런 난 수정주가 구분이 1로 고정인지 알았는데 qna를 보니 그게 아닌것 같다.. * * 문의 내용중이런것이 있다));; * OPT10081 에서 * 수정주가구분 = 0 or 1 * 이것을 변경해도 동일한 값이 나옵니다. * * 테스트 조건 * SetInputValue("종목코드" , "002990"); * SetInputValue("기준일자" , "20121228"); * SetInputValue("수정주가구분" , "0"); * * SetInputValue("종목코드" , "002990"); * SetInputValue("기준일자" , "20121228"); * SetInputValue("수정주가구분" , "1"); * * 두개 모두 2012년 12월 28일 현재가가 1555원 표시됩니다. * * 해당 종목은 감자가 있었기 때문에 * 차트에서 * 수정주가 적용시 : 10892원 * 수정주가 미적용시 : 1555원 * 이렇게 표시됩니다. * * 기타 다른 답변으로는 * 차트조회시 수정주가 구분값(0:권리락 적용안됨.1:권리락 적용됨)을 넣어서 조회하시면 됩니다. * 권리락이라는게 뭘까?? * * 권리락 중 "권리" 에 의미는 유상증장 및 무상증자와 배당에 참여할 수 있는 자격 또는 권리를 의미하며, * 곧 주식 권리락이란 위에 해당하는 권리를 받을 수 있는 자격이 없어진다는 이야기입니다. * 다시 말하면 증자를 통하여 얻게 되는 이익에 비례하여 주가를 떨어뜨립니다. * * * 유상증자에서의 권리락 * 말그대로 기존 주주들에게 유상으로(돈을 지불하여) 현 시점의 주가보다 저렴하게 주식을 살 수 있게 권리를 주게 되며, * 이 때문에 생기는 시세차이로 인하여 권리락이 발생하게 됩니다. * 무상증자 * 주주들이 지불 없이 더 많은 주식을 받게 됩니다. 회사 입장에서는 주주들에게 지불받는 금액이 없으나 주식수는 늘어나게 됩니다. * 무상증자가 일어나면 주주는 더 많은 주식을 갖게 되지만 주가는 그에 비례하여 하락을 하게 되기 때문에 * 결론적으로는 값이 동일해집니다. * 하지만, 대부분 무상증자 시 주가는 기존 값으로 회귀를 하는 경우가 많고, 시장에서 호재로 여겨지는 부분임. * 그냥 1로 표시하자... 골치 아프다.. */ /* * 큐를 받아두었다가 처리하는건.. 약간 위험한듯.. * 그것보다 여기에서 지연이 생길수있도록 하는게 맞는것같다. * 시스템 성능 만큼 여기서 지연이 일어나야한다.. * 이미 HashTable를 사용해서 여기 넣은 명령어가 received이벤트가 발생할 때 읽을 수있도록 했다.. * 그리고 그걸 큐에 담아서 soap으로 전송할때 사용했었다.. * 큐하고 hashtable 두개를 쓰던걸 hashtable 하나로 바꾸고 * 실제로 soap 요청이 완료되면 hashtable에서 그 키값을 바꾸도록 해야겠다. * 그런데 soap 전송에서 key값을 어떻게 알수 있을까??? * 음 hashtable에 순서가 있어서 처음들어온것을 빠질수있게 하면 되겠다.. * 그런데 hashtable에는 순서가 없네... * 큐에 Dinary를 담자.. * ㅋㅋ 그러면 되겠다... * 아 dictionary를 담으려고 보니까.. 너무 낭비인것 같다. * 클래스를 하나만들자.. * 아 생각해보니까. 하나 만들어둔게 있었다.. * ReceiveTrData.class * 아 젠장 큐가 recevie에서 만드니까.. 여기 서 막을 방법이 없네.. * 여기서 막으면 행이 걸리는데.. 행이걸리는게 맞긴 한것 같은데.. * 행이 오래걸리면 타임아웃이 걸리텐데... * 그럼 다시 원점인데.. 여기다 가 큐를 만들어야하는데.. * * * 여기 쓰레드 큐가 하나 있어야 하고 * 그 쓰레드는 이벤트에 큐가 쌓였을때 * 하나씩 실행되어야 해.. 그래야 맞는것 같아.. * 하나는 신문을 넣고 하나는 출판을 하는 그 걸 써야 하는게 맞는것 같은데.. * https://msdn.microsoft.com/ko-kr/library/yy12yx1f%28v=vs.90%29.aspx * * 오호 이게 맞는것 같은데.. * http://www.csharpstudy.com//Threads/autoresetevent.aspx * 이아저씨는 천제인가.. * 그런데 이건 한번 다 돌고 그다음 다른거 돌고 그런식이네... * 이렇게 구현하면 명령어가 행이 걸릴수도 있겠는데.. * 한쪽에서 계속 받아서 쌓이면... * 그리고 나중에 실행되고 그런식 아닐까... * * 음 입력이 불특정으로 일어나니까 쌓이는것도 불특정으로 쌓여서 흐름이 되겠다. * 나쁘지 않다... * 쓰레드 돌리는걸 생각해보았는데.. 생각보다 위험하다.. * kiwoom api가 객체를 여러개 생성하는게 아니라 하나로 쓰는거랑 * 변수가 바뀌지 않을꺼라는 보장이 없다.. * * 델레케이트 풀이 가능 할까??? * * * * * 이게 맞는것 같은데 이해를 못하고 있으니... * 음 이건 큐가 하나네.. 그런데 내꺼는 큐하나로 못하는데.. * 쓰레드 큐가 있어야 하네... * 큐를 넣으면 반환값이 없어지네.. 큐하면 안되겠다 앞에 링크중 * 앞에 그냥 1초 걸자.. 아 일이 진행이 안되네... * * 그래서 멈추는걸 로 해서 아래처럼 했느데.. 쓸데없이 뒤에서 보내고 다시 조회하고 그러는데 시간이 딜레이가 걸린다... * 큐에서 3개정도 있고 recevie가 동작을 했으면 좋겠다... * 그렇게 하려면 * 큐 크기를 조사해서 3보다 작으면 웨이트가 걸리고 3보다 크면 웹이트가 풀리고.. OK?? * */ //Class1.getClass1Instance().waitOneOpt10081();// 멈추기.. String sScreenNo = ScreenNumber.getClass1Instance().GetEosScrNum(); String sRQName = "주식일봉차트조회"; String sTrCode = "OPT10081"; int nPrevNext = 0; String keyStockCodeLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}"; String keyStockCode = String.Format(keyStockCodeLayout , sRQName , sTrCode , sScreenNo ); String keyLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}|stockCode:{3}"; String key = String.Format(keyLayout , sRQName , sTrCode , sScreenNo , strCode ); FileLog.PrintF("keyStockCode ==" + keyStockCode); FileLog.PrintF("key ==" + key); OpenApi.Spell.SpellOpt spellOpt10081 = new OpenApi.Spell.SpellOpt(); spellOpt10081.sRQNAME = sRQName; spellOpt10081.sTrCode = sTrCode; spellOpt10081.stockCode = strCode; spellOpt10081.startDate = startDate; spellOpt10081.endDate = endDate; spellOpt10081.nPrevNext = nPrevNext; spellOpt10081.sScreenNo = sScreenNo; //음 받는쪽에서 일자하고 nPrevNext를 알수가 없어서..키로 쓸수가 없다... //종목코드로도 찾을 수가 없네 종목코드도 지우자. //spell="" AppLib.getClass1Instance().AddStockCodeDictionary(keyStockCode, strCode); AppLib.getClass1Instance().AddSpellDictionary(key, spellOpt10081); axKHOpenAPI.SetInputValue("종목코드", strCode); axKHOpenAPI.SetInputValue("기준일자", endDate); axKHOpenAPI.SetInputValue("수정주가구분", "1"); int nRet = axKHOpenAPI.CommRqData(sRQName, sTrCode, nPrevNext, sScreenNo); if (Error.IsError(nRet)) { return("[OPT10081][OK]:" + Error.GetErrorMessage()); } else { return("[OPT10081][NOK]:" + Error.GetErrorMessage()); } }
private void GetDetails() { DataTable dt = new DataTable(); dtEXBANK.Rows.Clear(); dtEXNUBE.Rows.Clear(); DateTime dtfirstDayOfNextMonth = new DateTime(Convert.ToDateTime(dtpDOB.SelectedDate).Year, Convert.ToDateTime(dtpDOB.SelectedDate).Month, 1).AddMonths(1); string dateMonth = string.Format("{0:MMyyyy}", dtpDOB.SelectedDate.Value); //if (dtpDOB.SelectedDate > Convert.ToDateTime("28/FEB/2018").Date) //{ using (SqlConnection con = new SqlConnection(AppLib.connStr)) { con.Open(); string sWhere = ""; if (!string.IsNullOrEmpty(cmbBankName.Text)) { sWhere = " AND BB.NUBE_BRANCH_CODE=" + cmbBankName.SelectedValue; } else { sWhere = ""; } if (!string.IsNullOrEmpty(cmbBank.Text)) { sWhere = sWhere + " AND MB.BANK_NAME='" + cmbBank.Text + "'"; } if (!string.IsNullOrEmpty(cmbBranch.Text)) { sWhere = sWhere + " AND BB.BANKBRANCH_NAME='" + cmbBranch.Text + "'"; } if (Convert.ToInt32(cmbBankName.SelectedValue) == 11) { if (chkMelaka.IsChecked == true && chkNegeriSembilan.IsChecked == false) { sWhere = sWhere + " AND (MS.STATE_NAME LIKE '%MELAKA%') "; } else if (chkMelaka.IsChecked == false && chkNegeriSembilan.IsChecked == true) { sWhere = sWhere + " AND (MS.STATE_NAME NOT LIKE '%MELAKA%') "; } } DateTime dtSelect = dtpDOB.SelectedDate.Value; dtSelect = new DateTime(dtSelect.Year, dtSelect.Month, 1); Qry = string.Format(" SELECT ISNULL(NB.NUBE_BRANCH_NAME,'') AS NUBE_BRANCH_NAME,ISNULL(MB.BANK_NAME,'') AS BANK_NAME, \r" + " ISNULL(MB.BANK_USERCODE, '') + '_' + ISNULL(BB.BANKBRANCH_USERCODE, '') AS BANKBRANCH, \r" + " ISNULL(MM.SEX, '') AS SEX, ISNULL(MM.RACE_CODE, 0) AS RACE_CODE, \r" + " (CASE WHEN ST.STATUS_CODE = 1 THEN 1.0 ELSE 2.0 END) STATUS \r" + " FROM MemberMonthEndStatus ST(NOLOCK)\r" + " LEFT JOIN MASTERMEMBER MM(NOLOCK) ON MM.MEMBER_CODE = ST.MEMBER_CODE \r" + " LEFT JOIN MASTERBANK MB(NOLOCK) ON MB.BANK_CODE = ST.BANK_CODE \r" + " LEFT JOIN MASTERBANKBRANCH BB(NOLOCK) ON BB.BANKBRANCH_CODE = ST.BRANCH_CODE \r" + " LEFT JOIN MASTERNUBEBRANCH NB(NOLOCK) ON NB.NUBE_BRANCH_CODE = BB.NUBE_BRANCH_CODE \r" + " LEFT JOIN MASTERSTATE MS(NOLOCK) ON MS.STATE_CODE = BB.BANKBRANCH_STATE_CODE \r" + " WHERE ST.StatusMonth = '{0:yyyy/MM/dd}' and ST.STATUS_CODE IN(1,2) " + sWhere + " \r ORDER BY NB.NUBE_BRANCH_NAME ", dtSelect); //if ((Convert.ToDateTime(dtpDOB.SelectedDate).Year >= 2016 && Convert.ToDateTime(dtpDOB.SelectedDate).Month > 3) || Convert.ToDateTime(dtpDOB.SelectedDate).Year > 2016) //{ // Qry = string.Format(" SELECT ISNULL(NB.NUBE_BRANCH_NAME,'') AS NUBE_BRANCH_NAME,ISNULL(MB.BANK_NAME,'') AS BANK_NAME, \r" + // " ISNULL(MB.BANK_USERCODE, '') + '_' + ISNULL(BB.BANKBRANCH_USERCODE, '') AS BANKBRANCH, \r" + // " ISNULL(MM.SEX, '') AS SEX, ISNULL(MM.RACE_CODE, 0) AS RACE_CODE, \r" + // " (CASE WHEN ST.STATUS_CODE = 1 THEN 1.0 ELSE 2.0 END) STATUS \r" + // " FROM NUBESTATUS..STATUS{0:MMyyyy} ST(NOLOCK)\r" + // " LEFT JOIN MASTERMEMBER MM(NOLOCK) ON MM.MEMBER_CODE = ST.MEMBER_CODE \r" + // " LEFT JOIN MASTERBANK MB(NOLOCK) ON MB.BANK_CODE = ST.BANK_CODE \r" + // " LEFT JOIN MASTERBANKBRANCH BB(NOLOCK) ON BB.BANKBRANCH_CODE = ST.BRANCH_CODE \r" + // " LEFT JOIN MASTERNUBEBRANCH NB(NOLOCK) ON NB.NUBE_BRANCH_CODE = st.NUBE_BRANCH_CODE \r" + // " LEFT JOIN MASTERSTATE MS(NOLOCK) ON MS.STATE_CODE = BB.BANKBRANCH_STATE_CODE \r" + // " WHERE ST.STATUS_CODE IN(1,2) " + sWhere + " \r ORDER BY NB.NUBE_BRANCH_NAME ", dtpDOB.SelectedDate); //} //else //{ // Qry = string.Format(" SELECT ISNULL(NB.NUBE_BRANCH_NAME,'') AS NUBE_BRANCH_NAME,ISNULL(MB.BANK_NAME,'') AS BANK_NAME, \r" + // " ISNULL(MB.BANK_USERCODE, '') + '_' + ISNULL(BB.BANKBRANCH_USERCODE, '') AS BANKBRANCH, \r" + // " ISNULL(MM.SEX, '') AS SEX, ISNULL(MM.RACE_CODE, 0) AS RACE_CODE, \r" + // " (CASE WHEN ST.STATUS_CODE=1 THEN 1.0 ELSE 2.0 END) STATUS \r" + // " FROM NUBESTATUS..STATUS{0:MMyyyy} ST(NOLOCK)\r" + // " LEFT JOIN MASTERMEMBER MM(NOLOCK) ON MM.MEMBER_CODE=ST.MEMBER_CODE \r" + // " LEFT JOIN MASTERBANK MB(NOLOCK) ON MB.BANK_CODE=ST.BANK_CODE \r" + // " LEFT JOIN MASTERBANKBRANCH BB(NOLOCK) ON BB.BANKBRANCH_CODE=ST.BRANCH_CODE \r" + // " LEFT JOIN MASTERNUBEBRANCH NB(NOLOCK) ON NB.NUBE_BRANCH_CODE=ST.NUBE_BRANCH_CODE \r" + // " LEFT JOIN MASTERSTATE MS(NOLOCK) ON MS.STATE_CODE = BB.BANKBRANCH_STATE_CODE \r" + // " WHERE ST.STATUS_CODE IN(1,2) " + sWhere + " \r ORDER BY NB.NUBE_BRANCH_NAME ", dtpDOB.SelectedDate); //} SqlCommand cmd = new SqlCommand(Qry, con); SqlDataAdapter sdp = new SqlDataAdapter(cmd); sdp.SelectCommand.CommandTimeout = 0; sdp.Fill(dt); } if (dt.Rows.Count > 0) { var datas = (from DataRow row in dt.Rows select new { Bank_Name = (string)(row["BANK_NAME"] ?? ""), Nube_branch_code = (string)(row["NUBE_BRANCH_NAME"] ?? ""), Branch_Code = (string)(row["BANKBRANCH"] ?? ""), SEX = (string)(row["SEX"] ?? ""), RACE_CODE = (decimal)(row["RACE_CODE"]), MEMBERTYPE_CODE = (decimal)(row["STATUS"]) }).ToList(); var BankBranchDatas1 = datas.GroupBy(x => x.Branch_Code).ToList(); var BankBranchdatas2 = BankBranchDatas1.Select(x => new branchStatistics { BranchCode = x.Key.ToString(), CMM = x.Where(y => y.SEX == "Male" && y.RACE_CODE == 1 && y.MEMBERTYPE_CODE == 1).Count(), CMI = x.Where(y => y.SEX == "Male" && y.RACE_CODE == 2 && y.MEMBERTYPE_CODE == 1).Count(), CMC = x.Where(y => y.SEX == "Male" && y.RACE_CODE == 3 && y.MEMBERTYPE_CODE == 1).Count(), CMO = x.Where(y => y.SEX == "Male" && y.RACE_CODE == 4 && y.MEMBERTYPE_CODE == 1).Count(), CFM = x.Where(y => y.SEX == "Female" && y.RACE_CODE == 1 && y.MEMBERTYPE_CODE == 1).Count(), CFI = x.Where(y => y.SEX == "Female" && y.RACE_CODE == 2 && y.MEMBERTYPE_CODE == 1).Count(), CFC = x.Where(y => y.SEX == "Female" && y.RACE_CODE == 3 && y.MEMBERTYPE_CODE == 1).Count(), CFO = x.Where(y => y.SEX == "Female" && y.RACE_CODE == 4 && y.MEMBERTYPE_CODE == 1).Count(), NFM = x.Where(y => y.SEX == "Female" && y.RACE_CODE == 1 && y.MEMBERTYPE_CODE == 2).Count(), NFI = x.Where(y => y.SEX == "Female" && y.RACE_CODE == 2 && y.MEMBERTYPE_CODE == 2).Count(), NFC = x.Where(y => y.SEX == "Female" && y.RACE_CODE == 3 && y.MEMBERTYPE_CODE == 2).Count(), NFO = x.Where(y => y.SEX == "Female" && y.RACE_CODE == 4 && y.MEMBERTYPE_CODE == 2).Count(), NMM = x.Where(y => y.SEX == "Male" && y.RACE_CODE == 1 && y.MEMBERTYPE_CODE == 2).Count(), NMI = x.Where(y => y.SEX == "Male" && y.RACE_CODE == 2 && y.MEMBERTYPE_CODE == 2).Count(), NMC = x.Where(y => y.SEX == "Male" && y.RACE_CODE == 3 && y.MEMBERTYPE_CODE == 2).Count(), NMO = x.Where(y => y.SEX == "Male" && y.RACE_CODE == 4 && y.MEMBERTYPE_CODE == 2).Count() }); var BankBranchDatas3 = BankBranchdatas2.Select(x => new branchStatistics { BranchCode = x.BranchCode, CMM = x.CMM, CMI = x.CMI, CMC = x.CMC, CMO = x.CMO, CMSTOT = x.CMM + x.CMI + x.CMC + x.CMO, CFC = x.CFC, CFI = x.CFI, CFM = x.CFM, CFO = x.CFO, CFSTOT = x.CFO + x.CFM + x.CFI + x.CFC, CTOTAL = x.CMM + x.CMI + x.CMC + x.CMO + x.CFO + x.CFM + x.CFI + x.CFC, NMM = x.NMM, NMI = x.NMI, NMO = x.NMO, NMC = x.NMC, NMSTOT = x.NMM + x.NMI + x.NMO + x.NMC, NFC = x.NFC, NFM = x.NFM, NFI = x.NFI, NFO = x.NFO, NFSTOT = x.NFC + x.NFM + x.NFI + x.NFO, NTOTAL = x.NMM + x.NMI + x.NMO + x.NMC + x.NFC + x.NFM + x.NFI + x.NFO, GTOTAL = x.CMM + x.CMI + x.CMC + x.CMO + x.CFO + x.CFM + x.CFI + x.CFC + x.NMM + x.NMI + x.NMO + x.NMC + x.NFC + x.NFM + x.NFI + x.NFO }).ToList(); dgvBankStatistics.ItemsSource = BankBranchDatas3; dtEXBANK = AppLib.LINQResultToDataTable(BankBranchDatas3); MemberReport.Reset(); if (dtEXBANK.Rows.Count > 0) { ReportDataSource masterData = new ReportDataSource("BANKBRANCHSTATISTICAL", dtEXBANK); MemberReport.LocalReport.DataSources.Add(masterData); MemberReport.LocalReport.ReportEmbeddedResource = "Nube.Reports.rptBranchStaticsReport.rdlc"; ReportParameter[] NB = new ReportParameter[2]; NB[0] = new ReportParameter("Month", string.Format("{0:MMM - yyyy}", dtpDOB.SelectedDate)); if (!string.IsNullOrEmpty(cmbBank.Text)) { NB[1] = new ReportParameter("ReportName", "NUBE BRANCH - " + cmbBank.Text.ToString()); } else { NB[1] = new ReportParameter("ReportName", "OVER ALL BANK BRANCH"); } MemberReport.LocalReport.SetParameters(NB); MemberReport.RefreshReport(); //using (SqlConnection con = new SqlConnection(AppLib.connStr)) //{ // SqlCommand cmd; // string str = ""; // if (!string.IsNullOrEmpty(cmbBank.Text)) // { // str = ""; // } // else // { // } // cmd = new SqlCommand("SELECT ST.MEMBERTYPE_NAME,COUNT(*) TOTAL \r" + // " FROM TEMPVIEWMASTERMEMBER ST(NOLOCK)\r" + // " WHERE ST.MEMBERSTATUSCODE IN(1,2) AND ST.DATEOFJOINING < '2017-03-01' AND--ST.NUBEBANCHCODE = 11\r" + // " GROUP BY ST.MEMBERTYPE_NAME\r" + // " ORDER BY ST.MEMBERTYPE_NAME", con); //} } //dgvBranch var NubeBranchDatas1 = datas.GroupBy(x => x.Nube_branch_code).ToList(); var NubeBranchdatas2 = NubeBranchDatas1.Select(x => new branchStatistics { BranchCode = x.Key.ToString(), CMM = x.Where(y => y.SEX == "Male" && y.RACE_CODE == 1 && y.MEMBERTYPE_CODE == 1).Count(), CMI = x.Where(y => y.SEX == "Male" && y.RACE_CODE == 2 && y.MEMBERTYPE_CODE == 1).Count(), CMC = x.Where(y => y.SEX == "Male" && y.RACE_CODE == 3 && y.MEMBERTYPE_CODE == 1).Count(), CMO = x.Where(y => y.SEX == "Male" && y.RACE_CODE == 4 && y.MEMBERTYPE_CODE == 1).Count(), CFM = x.Where(y => y.SEX == "Female" && y.RACE_CODE == 1 && y.MEMBERTYPE_CODE == 1).Count(), CFI = x.Where(y => y.SEX == "Female" && y.RACE_CODE == 2 && y.MEMBERTYPE_CODE == 1).Count(), CFC = x.Where(y => y.SEX == "Female" && y.RACE_CODE == 3 && y.MEMBERTYPE_CODE == 1).Count(), CFO = x.Where(y => y.SEX == "Female" && y.RACE_CODE == 4 && y.MEMBERTYPE_CODE == 1).Count(), NFM = x.Where(y => y.SEX == "Female" && y.RACE_CODE == 1 && y.MEMBERTYPE_CODE == 2).Count(), NFI = x.Where(y => y.SEX == "Female" && y.RACE_CODE == 2 && y.MEMBERTYPE_CODE == 2).Count(), NFC = x.Where(y => y.SEX == "Female" && y.RACE_CODE == 3 && y.MEMBERTYPE_CODE == 2).Count(), NFO = x.Where(y => y.SEX == "Female" && y.RACE_CODE == 4 && y.MEMBERTYPE_CODE == 2).Count(), NMM = x.Where(y => y.SEX == "Male" && y.RACE_CODE == 1 && y.MEMBERTYPE_CODE == 2).Count(), NMI = x.Where(y => y.SEX == "Male" && y.RACE_CODE == 2 && y.MEMBERTYPE_CODE == 2).Count(), NMC = x.Where(y => y.SEX == "Male" && y.RACE_CODE == 3 && y.MEMBERTYPE_CODE == 2).Count(), NMO = x.Where(y => y.SEX == "Male" && y.RACE_CODE == 4 && y.MEMBERTYPE_CODE == 2).Count() }); var NubeBranchDatas3 = NubeBranchdatas2.Select(x => new branchStatistics { BranchCode = x.BranchCode, CMM = x.CMM, CMI = x.CMI, CMC = x.CMC, CMO = x.CMO, CMSTOT = x.CMM + x.CMI + x.CMC + x.CMO, CFC = x.CFC, CFI = x.CFI, CFM = x.CFM, CFO = x.CFO, CFSTOT = x.CFO + x.CFM + x.CFI + x.CFC, CTOTAL = x.CMM + x.CMI + x.CMC + x.CMO + x.CFO + x.CFM + x.CFI + x.CFC, NMM = x.NMM, NMI = x.NMI, NMO = x.NMO, NMC = x.NMC, NMSTOT = x.NMM + x.NMI + x.NMO + x.NMC, NFC = x.NFC, NFM = x.NFM, NFI = x.NFI, NFO = x.NFO, NFSTOT = x.NFC + x.NFM + x.NFI + x.NFO, NTOTAL = x.NMM + x.NMI + x.NMO + x.NMC + x.NFC + x.NFM + x.NFI + x.NFO, GTOTAL = x.CMM + x.CMI + x.CMC + x.CMO + x.CFO + x.CFM + x.CFI + x.CFC + x.NMM + x.NMI + x.NMO + x.NMC + x.NFC + x.NFM + x.NFI + x.NFO }).ToList(); dgvNubeStatistics.ItemsSource = NubeBranchDatas3; dtEXNUBE = AppLib.LINQResultToDataTable(NubeBranchDatas3); MemberReport2.Reset(); if (dtEXNUBE.Rows.Count > 0) { ReportDataSource masterData = new ReportDataSource("NUBEBRANCHSTATISTICAL", dtEXNUBE); MemberReport2.LocalReport.DataSources.Add(masterData); MemberReport2.LocalReport.ReportEmbeddedResource = "Nube.Reports.rptBranchStaticsReportNubeBranch.rdlc"; ReportParameter[] NB2 = new ReportParameter[2]; NB2[0] = new ReportParameter("Month", string.Format("{0:MMM - yyyy}", dtpDOB.SelectedDate)); if (!string.IsNullOrEmpty(cmbBank.Text)) { NB2[1] = new ReportParameter("ReportName", "NUBE BRANCH - " + cmbBank.Text.ToString()); } else { NB2[1] = new ReportParameter("ReportName", "OVER ALL - NUBE BRANCH"); } MemberReport2.LocalReport.SetParameters(NB2); MemberReport2.RefreshReport(); } //Bank var BankDatas1 = datas.GroupBy(x => x.Bank_Name).ToList(); var BankDatas2 = BankDatas1.Select(x => new branchStatistics { Bank = x.Key.ToString(), CMM = x.Where(y => y.SEX == "Male" && y.MEMBERTYPE_CODE == 1).Count(), CFM = x.Where(y => y.SEX == "Female" && y.MEMBERTYPE_CODE == 1).Count(), NFM = x.Where(y => y.SEX == "Female" && y.MEMBERTYPE_CODE == 2).Count(), NMM = x.Where(y => y.SEX == "Male" && y.MEMBERTYPE_CODE == 2).Count(), }); var BankDatas3 = BankDatas2.Select(x => new branchStatistics { Bank = x.Bank, CMM = x.CMM, CFM = x.CFM, NMM = x.NMM, NFM = x.NFM, GTOTAL = x.CMM + x.CFM + x.NMM + x.NFM }).ToList(); dgvBankList.ItemsSource = BankDatas3; } else { MessageBox.Show("No Records Found!"); } //} //else //{ // MessageBox.Show("No Records Found!"); //} }
private void btnSave_Click(object sender, RoutedEventArgs e) { try { if (cmbBankName.Text == "") { MessageBox.Show("Enter Bank..", "Information"); txtBranchName.Focus(); } else if (txtBranchCode.Text == "") { MessageBox.Show("Enter Branchcode..", "Information"); txtBranchCode.Focus(); } else if (txtBranchName.Text == "") { MessageBox.Show("Enter Branchname..", "Information"); } else { if (MessageBox.Show("Do you want to save this record?", "SAVE", MessageBoxButton.YesNo) == MessageBoxResult.Yes) { if (ID != 0) { decimal id = (decimal)ID; var s = cmbBankName.Text.ToString(); MASTERBANKBRANCH mb = db.MASTERBANKBRANCHes.Where(x => x.BANKBRANCH_CODE == id).FirstOrDefault(); //var OldData = new JSonHelper().ConvertObjectToJSon(mb); mb.BANK_CODE = Convert.ToDecimal(cmbBankName.SelectedValue); mb.BANKBRANCH_NAME = txtBranchName.Text; mb.BANKBRANCH_USERCODE = txtBranchCode.Text; mb.BANKBRANCH_ADDRESS1 = txtAddress1.Text; mb.BANKBRANCH_ADDRESS2 = txtAddress2.Text; mb.BANKBRANCH_ADDRESS3 = txtAddress3.Text; mb.BANKBRANCH_CITY_CODE = Convert.ToDecimal(cmbCity.SelectedValue); mb.BANKBRANCH_COUNTRY = (cmbCountry.Text.ToString() == null ? "" : cmbCountry.Text.ToString()); mb.BANKBRANCH_EMAIL = txtEmail.Text; mb.BANKBRANCH_PHONE1 = txtMobile.Text; mb.BANKBRANCH_PHONE2 = txtPhone.Text; mb.BANKBRANCH_STATE_CODE = Convert.ToDecimal(cmbState.SelectedValue); mb.BANKBRANCH_ZIPCODE = txtPostalCode.Text; mb.NUBE_BRANCH_CODE = Convert.ToDecimal(cmbNUBEBranch.SelectedValue); mb.HEAD_QUARTERS = Convert.ToDecimal(ckbHeadOffice.IsChecked); db.SaveChanges(); AppLib.lstMASTERBANKBRANCH = db.MASTERBANKBRANCHes.OrderBy(x => x.BANKBRANCH_NAME).ToList(); //var NewData = new JSonHelper().ConvertObjectToJSon(mb); //AppLib.EventHistory(this.Tag.ToString(), 1, OldData, NewData, "MASTERBANKBRANCH"); MessageBox.Show("Saved Successfully", "Saved"); ClearForm(); } else { MASTERBANKBRANCH mb = new MASTERBANKBRANCH(); mb.BANK_CODE = Convert.ToDecimal(cmbBankName.SelectedValue); mb.BANKBRANCH_NAME = txtBranchName.Text; mb.BANKBRANCH_USERCODE = txtBranchCode.Text; mb.BANKBRANCH_ADDRESS1 = txtAddress1.Text; mb.BANKBRANCH_ADDRESS2 = txtAddress2.Text; mb.BANKBRANCH_ADDRESS3 = txtAddress3.Text; mb.BANKBRANCH_CITY_CODE = Convert.ToDecimal(cmbCity.SelectedValue); mb.BANKBRANCH_COUNTRY = (cmbCountry.Text.ToString() == null ? "" : cmbCountry.Text.ToString()); mb.BANKBRANCH_EMAIL = txtEmail.Text; mb.BANKBRANCH_PHONE1 = txtMobile.Text; mb.BANKBRANCH_PHONE2 = txtPhone.Text; mb.BANKBRANCH_STATE_CODE = Convert.ToDecimal(cmbState.SelectedValue); mb.BANKBRANCH_ZIPCODE = txtPostalCode.Text; mb.NUBE_BRANCH_CODE = Convert.ToDecimal(cmbNUBEBranch.SelectedValue); mb.HEAD_QUARTERS = Convert.ToDecimal(ckbHeadOffice.IsChecked); db.MASTERBANKBRANCHes.Add(mb); db.SaveChanges(); AppLib.lstMASTERBANKBRANCH = db.MASTERBANKBRANCHes.OrderBy(x => x.BANKBRANCH_NAME).ToList(); var NewData = new JSonHelper().ConvertObjectToJSon(mb); AppLib.EventHistory(this.Tag.ToString(), 0, "", NewData, "MASTERBANKBRANCH"); MessageBox.Show("Saved Successfully!", "Saved"); ClearForm(); } } } } catch (Exception ex) { Nube.ExceptionLogging.SendErrorToText(ex); } }
public override void ReceivedData(AxKHOpenAPILib.AxKHOpenAPI axKHOpenAPI, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveTrDataEvent e) { FileLog.PrintF("ReceivedData OPT10075"); //try { /* * sScrNo – 화면번호 * sRQName – 사용자구분 명 * sTrCode – Tran 명 * sRecordName – Record 명 * sPreNext – 연속조회 유무 */ String 계좌번호 = "XXXXXXXXXX"; int nCnt = axKHOpenAPI.GetRepeatCnt(e.sTrCode, e.sRQName); String keyStockCodeLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}"; String keyStockCode = String.Format(keyStockCodeLayout , e.sRQName , e.sTrCode , e.sScrNo ); 계좌번호 = AppLib.getClass1Instance().getStockCode(keyStockCode); String keyLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}|accountNum:{3}"; String key = String.Format(keyLayout , e.sRQName , e.sTrCode , e.sScrNo , 계좌번호 ); List <OPT10075_Data> OPT10075_DataList = new List <OPT10075_Data>(); if (nCnt > 0) { for (int i = 0; i < nCnt; i++) { FileLog.PrintF("OPT10075 ReceivedData 계좌번호 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "계좌번호").ToString().Trim()); //[0] FileLog.PrintF("OPT10075 ReceivedData 주문번호 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "주문번호").ToString().Trim()); //[1] FileLog.PrintF("OPT10075 ReceivedData 관리사번 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "관리사번").ToString().Trim()); //[2] FileLog.PrintF("OPT10075 ReceivedData 종목코드 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "종목코드").ToString().Trim()); //[3] FileLog.PrintF("OPT10075 ReceivedData 업무구분 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "업무구분").ToString().Trim()); //[4] FileLog.PrintF("OPT10075 ReceivedData 주문상태 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "주문상태").ToString().Trim()); //[5] FileLog.PrintF("OPT10075 ReceivedData 종목명 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "종목명").ToString().Trim()); //[6] FileLog.PrintF("OPT10075 ReceivedData 주문수량 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "주문수량").ToString().Trim()); //[7] FileLog.PrintF("OPT10075 ReceivedData 주문가격 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "주문가격").ToString().Trim()); //[8] FileLog.PrintF("OPT10075 ReceivedData 미체결수량 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "미체결수량").ToString().Trim()); //[9] FileLog.PrintF("OPT10075 ReceivedData 체결누적금액 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "체결누적금액").ToString().Trim()); //[10] FileLog.PrintF("OPT10075 ReceivedData 원주문번호 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "원주문번호").ToString().Trim()); //[11] FileLog.PrintF("OPT10075 ReceivedData 주문구분 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "주문구분").ToString().Trim()); //[12] FileLog.PrintF("OPT10075 ReceivedData 매매구분 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매매구분").ToString().Trim()); //[13] FileLog.PrintF("OPT10075 ReceivedData 시간 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "시간").ToString().Trim()); //[14] FileLog.PrintF("OPT10075 ReceivedData 체결번호 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "체결번호").ToString().Trim()); //[15] FileLog.PrintF("OPT10075 ReceivedData 체결가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "체결가").ToString().Trim()); //[16] FileLog.PrintF("OPT10075 ReceivedData 체결량 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "체결량").ToString().Trim()); //[17] FileLog.PrintF("OPT10075 ReceivedData 현재가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "현재가").ToString().Trim()); //[18] FileLog.PrintF("OPT10075 ReceivedData 매도호가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매도호가").ToString().Trim()); //[19] FileLog.PrintF("OPT10075 ReceivedData 매수호가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매수호가").ToString().Trim()); //[20] FileLog.PrintF("OPT10075 ReceivedData 단위체결가 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "단위체결가").ToString().Trim()); //[21] FileLog.PrintF("OPT10075 ReceivedData 단위체결량 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "단위체결량").ToString().Trim()); //[22] FileLog.PrintF("OPT10075 ReceivedData 당일매매수수료 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "당일매매수수료").ToString().Trim()); //[23] FileLog.PrintF("OPT10075 ReceivedData 단일매매세금 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "단일매매세금").ToString().Trim()); //[24] FileLog.PrintF("OPT10075 ReceivedData 개인투자자 =>" + axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "개인투자자").ToString().Trim()); //[25] OPT10075_Data opt10075_Data = new OPT10075_Data(); String 현재일자 = DateTime.Now.ToString("yyyy-MM-dd"); String 체결시간TMP = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "시간").ToString().Trim(); //[14] //체결시간이 6자리이므로 HHMMSS ==> HH:MM:SS로 바꿔야한다. String 체결시간 = 체결시간TMP.Substring(0, 2) + ":" + 체결시간TMP.Substring(2, 2) + ":" + 체결시간TMP.Substring(4, 2); opt10075_Data.체결시간 = 현재일자 + " " + 체결시간; opt10075_Data.계좌번호 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "계좌번호").ToString().Trim(); //[0] opt10075_Data.주문번호 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "주문번호").ToString().Trim(); //[1] opt10075_Data.관리사번 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "관리사번").ToString().Trim(); //[2] opt10075_Data.종목코드 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "종목코드").ToString().Trim(); //[3] opt10075_Data.업무구분 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "업무구분").ToString().Trim(); //[4] opt10075_Data.주문상태 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "주문상태").ToString().Trim(); //[5] opt10075_Data.종목명 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "종목명").ToString().Trim(); //[6] opt10075_Data.주문수량 = int.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "주문수량").ToString().Trim()); //[7] opt10075_Data.주문가격 = int.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "주문가격").ToString().Trim()); //[8] opt10075_Data.미체결수량 = int.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "미체결수량").ToString().Trim()); //[9] opt10075_Data.체결누계금액 = int.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "체결누계금액").ToString().Trim()); //[10] opt10075_Data.원주문번호 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "원주문번호").ToString().Trim(); //[11] opt10075_Data.주문구분 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "주문구분").ToString().Trim(); //[12] opt10075_Data.매매구분 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매매구분").ToString().Trim(); //[13] opt10075_Data.체결번호 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "체결번호").ToString().Trim(); //[15] opt10075_Data.체결가 = int.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "체결가").ToString().Trim()); //[16] opt10075_Data.체결량 = int.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "체결량").ToString().Trim()); //[17] opt10075_Data.현재가 = int.Parse(axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "현재가").ToString().Trim()); //[18] String str매도호가 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매도호가").ToString().Trim(); //[19] opt10075_Data.매도호가 = 0; if (!str매도호가.Equals("")) { opt10075_Data.매도호가 = int.Parse(str매도호가); } String str매수호가 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "매수호가").ToString().Trim(); //[20] opt10075_Data.매수호가 = 0; if (!str매수호가.Equals("")) { opt10075_Data.매수호가 = int.Parse(str매수호가); } String str단위체결가 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "단위체결가").ToString().Trim(); //[21] opt10075_Data.단위체결가 = 0; if (!str단위체결가.Equals("")) { opt10075_Data.단위체결가 = int.Parse(str단위체결가); } String str단위체결량 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "단위체결량").ToString().Trim(); //[22] opt10075_Data.단위체결량 = 0; if (!str단위체결량.Equals("")) { opt10075_Data.단위체결량 = int.Parse(str단위체결량); } String str당일매매수수료 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "당일매매수수료").ToString().Trim(); //[23] opt10075_Data.당일매매수수료 = 0; if (!str당일매매수수료.Equals("")) { opt10075_Data.당일매매수수료 = int.Parse(str당일매매수수료); } String str당일매매세금 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "당일매매세금").ToString().Trim(); //[24] opt10075_Data.당일매매세금 = 0; if (!str당일매매세금.Equals("")) { opt10075_Data.당일매매세금 = int.Parse(str당일매매세금); } opt10075_Data.개인투자자 = axKHOpenAPI.CommGetData(e.sTrCode, "", e.sRQName, i, "개인투자자").ToString().Trim(); //[25] //(8025-8089)/8089*100 //24005=23775+160+70 //24005-24575=-570 //24805 OPT10075_DataList.Add(opt10075_Data); } } //이것은 연속적이지 않기 때문에 바로 제거 한다. AppLib.getClass1Instance().removeSpellDictionary(spell.key); int position = spell.key.LastIndexOf("|"); String key1 = spell.key.Substring(0, position); AppLib.getClass1Instance().removeStockCodeDictionary(key1); //래치를 호출해서 잠김을 제거한다.--래치 일단 제거 호출하는데도 제거 했다. 1초에 5번 호출 규칙만 적용해보자. AppLib.getClass1Instance().setOpt10081(spell.sTrCode); //DailyData dd = new DailyData(); //dd.insertOpt10001(tmp); }
/// <summary> /// Создает и размещает на одной странице панели заказов (тип OrderPanel). /// </summary> /// <param name="orders">Список заказов (тип OrderViewModel)</param> /// <param name="orderIndex">Индекс заказа, начиная с которого будут строиться панели</param> /// <param name="dishIndex">Индекс блюда, начиная с которогу будут строиться панели</param> /// <param name="isPanelsForward">Признак того, что коллекция orders будет листаться вперед, от стартовой позиции к концу набора</param> /// <returns></returns> internal void DrawOrderPanelsOnPage(List <OrderViewModel> orders, int orderStartIndex, int dishStartIndex, bool isPanelsForward, bool keepSplitOrderOnLastColumnByForward) { _canvas.Children.Clear(); if (orders == null) { return; } if (orderStartIndex >= orders.Count) { return; } if (orders.Count == 0) { return; } OrderViewModel orderModel; _shiftForward = isPanelsForward; _pageBreak = false; int dishIdxFrom = -1, dishIdxTo = -1; bool bSplit = false; // инициализация переменных размещения if (_shiftForward) { curColIndex = 1; curTopValue = 0; } else { curColIndex = _pageColsCount; curTopValue = _colHeight; } double freeHeight = getFreeHeight(); if (orderStartIndex < 0) { orderStartIndex = 0; } // цикл по заказам for (int iOrd = orderStartIndex; ((_shiftForward) ? iOrd < orders.Count : iOrd >= 0) && (!_pageBreak); iOrd += (_shiftForward) ? 1 : -1) { // текущий заказ orderModel = orders[iOrd]; bSplit = false; // 1. создать панель заказа со всеми блюдами и разделителями подач #region текущие начальный и конечный индексы БЛЮД // для последующих заказов - все блюда if (dishStartIndex < 0) { dishIdxFrom = 0; dishIdxTo = orderModel.Dishes.Count - 1; } // для первого заказа - часть блюд else { if (_shiftForward) { dishIdxFrom = dishStartIndex; dishIdxTo = orderModel.Dishes.Count - 1; } else { dishIdxFrom = 0; dishIdxTo = dishStartIndex; // в обратном порядке с непоследнего, поэтому добавляется разделитель переноса if (dishIdxTo < (orderModel.Dishes.Count - 1)) { bSplit = true; } } } #endregion DateTime dtTmr = DateTime.Now; OrderPanel ordPanel = createOrderPanel(orderModel, dishIdxFrom, dishIdxTo, bSplit); AppLib.WriteScreenDrawDetails($" - create order panel N {orderModel.Number} - {(DateTime.Now - dtTmr).ToString()}"); dishStartIndex = -1; // для последующих заказов - все блюда if (ordPanel == null) { continue; } // получить реальные размеры панели заказа dtTmr = DateTime.Now; if (_shiftForward) { _canvas.Children.Add(ordPanel); } else { _canvas.Children.Insert(0, ordPanel); } dtTmr = DateTime.Now; #if fromActualHeight ordPanel.UpdateLayout(); // тяжелая операция AppLib.WriteLogTraceMessage(" - measure size by UpdateLayout, panel N {0} - {1}", orderModel.Number, (DateTime.Now - dtTmr).ToString()); #else // get DesiredSize ordPanel.Measure(_sizeMeasure); // немного легче, чем UpdateLayout AppLib.WriteScreenDrawDetails($" - measure size by Measure/DesiredSize, panel N {orderModel.Number} - {(DateTime.Now - dtTmr).ToString()}"); #endif // 2. Размещение панели на странице // помещается ли вся панель заказа без разрывов в свободное место if (ordPanel.PanelHeight < freeHeight) { setLastPanelPosition(ordPanel); } // надо разбивать панель else { dtTmr = DateTime.Now; _canvas.Children.Remove(ordPanel); splitOrderViewPanels(ordPanel, keepSplitOrderOnLastColumnByForward); AppLib.WriteScreenDrawDetails(" - split order to some columns - " + (DateTime.Now - dtTmr).ToString()); } freeHeight = getFreeHeight(); } } // DrawOrderPanelsOnPage
public static void Main(string[] args) { // splash Splasher.Splash = new SplashScreen(); Splasher.ShowSplash(); //for (int i = 0; i < 5000; i += 1) //{ // MessageListener.Instance.ReceiveMessage(string.Format("Load module {0}", i)); // Thread.Sleep(1); //} // таймаут запуска приложения string cfgValue = CfgFileHelper.GetAppSetting("StartTimeout"); int startTimeout = 0; if (cfgValue != null) { startTimeout = cfgValue.ToInt(); } if (startTimeout != 0) { for (int i = startTimeout; i > 0; i--) { MessageListener.Instance.ReceiveMessage($"Таймаут запуска приложения - {i} секунд."); System.Threading.Thread.Sleep(1000); } } // текст в MessageListener.Instance прибинден к текстовому полю на сплэше MessageListener.Instance.ReceiveMessage("Инициализация журнала событий..."); AppLib.InitAppLogger(); AppLib.WriteLogInfoMessage("************ Start KDS Client (WPF) *************"); // установить текущий каталог на папку с приложением string curDir = System.IO.Directory.GetCurrentDirectory(); if (curDir.Last() != '\\') { curDir += "\\"; } string appDir = AppEnvironment.GetAppDirectory(); if (curDir != appDir) { AppLib.WriteLogInfoMessage("Текущий каталог изменен на папку приложения: " + appDir); System.IO.Directory.SetCurrentDirectory(appDir); } // защита PSW-файлом MessageListener.Instance.ReceiveMessage("Проверка лицензии..."); bool isLoyalClient = false; //isLoyalClient = ((args != null) && args.Contains("-autoGenLicence")); // ключ реестра HKLM\Software\Integra\autoGenLicence = 01 (binary) if (isLoyalClient == false) { isLoyalClient = RegistryHelper.IsExistsAutoGenLicenceKey(); } pswLib.CheckProtectedResult checkProtectedResult; if (pswLib.Hardware.IsCurrentAppProtected("KDSWPFClient", out checkProtectedResult, null, isLoyalClient) == false) { string errMsg = string.Format("{0}{1}{1}{2}", checkProtectedResult.LogMessage, Environment.NewLine, checkProtectedResult.CustomMessage); appExit(2, errMsg); } MessageListener.Instance.ReceiveMessage("Получение версии приложения..."); AppLib.WriteLogInfoMessage("Инициализация KDS-клиента..."); // проверка наличия уникального имени клиента в конфиг-файле cfgValue = CfgFileHelper.GetAppSetting("KDSClientName"); if (cfgValue.IsNull() == true) { cfgValue = "Не указано имя КДС-клиента в файле AppSettings.config."; appExit(3, cfgValue); } if (cfgValue.Equals("uniqClientName", StringComparison.OrdinalIgnoreCase)) { #if (Release == false) && (DEBUG == false) cfgValue = "Измените имя КДС-клиента в файле AppSettings.config"; appExit(3, cfgValue); #endif } KDSWPFClient.App app = new KDSWPFClient.App(); WpfHelper.SetAppGlobalValue("KDSClientName", cfgValue); App.ClientName = System.Convert.ToString(WpfHelper.GetAppGlobalValue("KDSClientName")); AppLib.WriteLogInfoMessage(" - имя КДС-клиента: {0}", App.ClientName); // информация о файлах и сборках AppLib.WriteLogInfoMessage(" - файл: {0}, Version {1}", AppEnvironment.GetAppFullFile(), AppEnvironment.GetAppVersion()); ITSAssemblyInfo asmInfo = new ITSAssemblyInfo("IntegraLib"); AppLib.WriteLogInfoMessage(" - Integra lib: '{0}', Version {1}", asmInfo.FullFileName, asmInfo.Version); asmInfo = new ITSAssemblyInfo("IntegraWPFLib"); AppLib.WriteLogInfoMessage(" - Integra WPF lib: '{0}', Version {1}", asmInfo.FullFileName, asmInfo.Version); MessageListener.Instance.ReceiveMessage("Получение параметров окружения..."); AppLib.WriteLogInfoMessage(AppEnvironment.GetEnvironmentString()); getAppLayout(); // настройка приложения MessageListener.Instance.ReceiveMessage("Получение параметров приложения..."); #if !DEBUG System.Threading.Thread.Sleep(500); #endif app.InitializeComponent(); // определенные в app.xaml setAppGlobalValues(); // для хранения в свойствах приложения (из config-файла или др.) AppLib.WriteLogInfoMessage("App settings from config file: " + CfgFileHelper.GetAppSettingsFromConfigFile()); // создать каналы AppLib.WriteLogInfoMessage("Создаю клиента для работы со службой KDSService - START"); AppDataProvider dataProvider = new AppDataProvider(); try { MessageListener.Instance.ReceiveMessage("Создание канала получения данных..."); #if !DEBUG System.Threading.Thread.Sleep(1000); #endif dataProvider.CreateGetChannel(); MessageListener.Instance.ReceiveMessage("Создание канала установки данных..."); #if !DEBUG System.Threading.Thread.Sleep(1000); #endif dataProvider.CreateSetChannel(); AppLib.WriteLogInfoMessage("Создаю клиента для работы со службой KDSService - FINISH"); } catch (Exception) { AppLib.WriteLogErrorMessage("Data provider error: " + dataProvider.ErrorMessage); } // и получить словари и настройки от службы MessageListener.Instance.ReceiveMessage("Получаю словари и настройки от службы KDSService..."); #if !DEBUG System.Threading.Thread.Sleep(500); #endif AppLib.WriteLogInfoMessage("Получаю словари и настройки от службы KDSService - START"); if (dataProvider.SetDictDataFromService() == false) { // КДСы могут быть уже запущены, а служба еще нет! AppLib.WriteLogErrorMessage("Data provider error: " + dataProvider.ErrorMessage); //if (splashScreen != null) splashScreen.Close(TimeSpan.FromMinutes(10)); //MessageBox.Show("Ошибка получения словарей от службы KDSService:" + Environment.NewLine + dataProvider.ErrorMessage, "АВАРИЙНОЕ ЗАВЕРШЕНИЕ ПРИЛОЖЕНИЯ", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK); //Environment.Exit(2); } else { AppLib.WriteLogInfoMessage("Получаю словари и настройки от службы KDSService - FINISH"); } WpfHelper.SetAppGlobalValue("AppDataProvider", dataProvider); // прочитать из config-а и сохранить в свойствах приложения режим КДС MessageListener.Instance.ReceiveMessage("Получаю из config-файла режим работы КДС..."); #if !DEBUG System.Threading.Thread.Sleep(500); #endif KDSModeHelper.Init(); // создать и сохранить в свойствах приложения служебные окна (ColorLegend, StateChange) MessageListener.Instance.ReceiveMessage("Создаю служебные окна..."); #if !DEBUG System.Threading.Thread.Sleep(500); #endif WpfHelper.SetAppGlobalValue("ColorLegendWindow", new ColorLegend()); // окно легенды // окно изменения статуса WpfHelper.SetAppGlobalValue("StateChangeWindow", new StateChange()); // основное окно приложения MessageListener.Instance.ReceiveMessage("Инициализация окна приложения..."); #if !DEBUG System.Threading.Thread.Sleep(1000); #endif MainWindow mainWindow = new MainWindow(args); app.MainWindow = mainWindow; app.Run(mainWindow); if (dataProvider != null) { dataProvider.Dispose(); dataProvider = null; } AppLib.WriteLogInfoMessage("************ End KDS Client (WPF) *************"); } // Main()
// ctor // ДЛЯ НОВОГО БЛЮДА public OrderDishModel(OrderDish dbDish, OrderModel modelOrder) { _modelOrder = modelOrder; Id = dbDish.Id; Uid = dbDish.UID; DepartmentId = dbDish.DepartmentId; CreateDate = dbDish.CreateDate; Name = dbDish.DishName; FilingNumber = dbDish.FilingNumber; ParentUid = dbDish.ParentUid; Comment = dbDish.Comment; Quantity = dbDish.Quantity; DelayedStartTime = dbDish.DelayedStartTime; UID1C = dbDish.UID1C; // свойства объекта с зависимыми полями EstimatedTime = dbDish.EstimatedTime; _tsCookingEstimated = TimeSpan.FromSeconds(this.EstimatedTime); DishStatusId = dbDish.DishStatusId; Status = AppLib.GetStatusEnumFromNullableInt(dbDish.DishStatusId); // получить запись из таблицы состояний _dbRunTimeRecord = getOrderDishRunTimeRecord(dbDish.Id); _isDish = ParentUid.IsNull(); _isUseReadyConfirmed = AppProperties.GetBoolProperty("UseReadyConfirmedState"); _autoGotoReadyConfirmPeriod = AppProperties.GetIntProperty("AutoGotoReadyConfirmPeriod"); // словарь дат входа в состояние _dtEnterStatusDict = new Dictionary <OrderStatusEnum, DateTime>(); foreach (var item in Enum.GetValues(typeof(OrderStatusEnum))) { _dtEnterStatusDict.Add((OrderStatusEnum)item, DateTime.MinValue); } // создать словарь накопительных счетчиков _tsTimersDict = new Dictionary <OrderStatusEnum, TimeCounter>(); // таймер ожидания начала приготовления _tsTimersDict.Add(OrderStatusEnum.WaitingCook, new TimeCounter() { Name = OrderStatusEnum.WaitingCook.ToString() }); // таймер времени приготовления _tsTimersDict.Add(OrderStatusEnum.Cooking, new TimeCounter() { Name = OrderStatusEnum.Cooking.ToString() }); // таймер времени ожидания выдачи, нахождение в состоянии Готов _tsTimersDict.Add(OrderStatusEnum.Ready, new TimeCounter() { Name = OrderStatusEnum.Ready.ToString() }); if (_isUseReadyConfirmed) { _tsTimersDict.Add(OrderStatusEnum.ReadyConfirmed, new TimeCounter() { Name = OrderStatusEnum.ReadyConfirmed.ToString() }); } // таймер времени ожидания фиксации заказа, нахождение в состоянии Выдано _tsTimersDict.Add(OrderStatusEnum.Took, new TimeCounter() { Name = OrderStatusEnum.Took.ToString() }); // таймер нахождения в состоянии отмены _tsTimersDict.Add(OrderStatusEnum.Cancelled, new TimeCounter() { Name = OrderStatusEnum.Cancelled.ToString() }); // отмененное блюдо/ингредиент // для новой записи сразу сохраняем в БД if (Quantity < 0) { if (Status != OrderStatusEnum.Cancelled) { UpdateStatus(OrderStatusEnum.Cancelled); } else { startStatusTimerAtFirst(); } } else { UpdateFromDBEntity(dbDish); // для новой записи DTS не сохранен startStatusTimerAtFirst(); } } // constructor
static void MemberInitScanByBankCode(decimal BANK_CODE) { try { AppLib.WriteLogFileName = "NUBE_" + "MemberInitScanByBankCode"; AppLib.WriteLogDT("START:"); AppLib.WriteLog("MemberInitScanByBankCode"); AppLib.WriteLog("------------------------"); AppLib.WriteLog(""); AppLib.WriteLog(""); var bank = db.MASTERBANKs.FirstOrDefault(x => x.BANK_CODE == BANK_CODE); if (bank != null) { AppLib.WriteLog("Bank Id: {0}, Bank Code : {1}, Bank Name : {2}", bank.BANK_CODE, bank.BANK_USERCODE, bank.BANK_NAME); AppLib.DisplayClear(); int i = 1; AppLib.WriteLog("{0,5} {1,-10} {2,-10} {3,-50} {4,-15} {5,-15} {6,-10} {7,-10} {8,-10} {9,-10} {10,-10} {11,-10} {12,-10} {13,-10} {14,-10} {15,-10} {16,-10} {17,-10} {18,-10} {19,-10} {20,-10} {21,-10} {22,-10} {23,-10} {24,-10}", "SNo", "Code", "MemberNo", "Member Name", "IC Old", "IC New", "DOB", "DOJ", "MEND", "LPAID", "SUBSAMT", "TSUBSAMT", "ACCSUBS", "SUBSDUE", "BFAMT", "TBFAMT", "ACCBF", "BFDUE", "TOTMNTS", "TOTMNTSPAD", "TOTMNTSDUE", "STATUSCDE", "RESIGNED", "STRUCKOFF", "STATUS"); var lstMember = db.MASTERMEMBERs.Where(x => x.BANK_CODE == BANK_CODE).OrderBy(x => x.DATEOFJOINING).Select(x => x.MEMBER_CODE).ToList(); foreach (var mmCode in lstMember) { AppLib.DisplayMsg(1, 1, string.Format("[ {0,10} - {1} ]", i, bank.MASTERMEMBERs.Count())); var mm = db.MASTERMEMBERs.FirstOrDefault(x => x.MEMBER_CODE == mmCode); var Status = db.MemberMonthEndStatus.Where(x => x.MEMBER_CODE == mm.MEMBER_CODE).OrderBy(x => x.StatusMonth).FirstOrDefault(); string statusMsg = ""; if (Status == null) { Status = new MemberMonthEndStatu(); statusMsg = "Status Record not Found"; } else { decimal Subs = Status.MEMBERTYPE_CODE == 1 ? (mm.REJOINED == 0 ? 8 : 32) : (mm.REJOINED == 0 ? 4 : 16); decimal BFs = 3; if (mm.DATEOFJOINING >= new DateTime(2005, 9, 1)) { if (Status.SUBSCRIPTION_AMOUNT != Subs) { statusMsg += "SUBSCRIPTION_AMOUNT MISMATCH, "; } if (Status.TOTALSUBCRP_AMOUNT != Subs) { statusMsg += "TOTALSUBCRP_AMOUNT MISMATCH, "; } if (Status.ACCSUBSCRIPTION != Subs) { statusMsg += "ACCSUBSCRIPTION MISMATCH, "; } if (Status.SUBSCRIPTIONDUE != 0) { statusMsg += "SUBSCRIPTIONDUE MISMATCH, "; } if (Status.BF_AMOUNT != BFs) { statusMsg += "BF_AMOUNT MISMATCH, "; } if (Status.TOTALBF_AMOUNT != BFs) { statusMsg += "TOTALBF_AMOUNT MISMATCH, "; } if (Status.ACCBF != BFs) { statusMsg += "ACCBF MISMATCH, "; } if (Status.BFDUE != 0) { statusMsg += "BFDUE MISMATCH, "; } if (Status.TOTAL_MONTHS != 1) { statusMsg += "TOTAL_MONTHS MISMATCH, "; } if (Status.TOTALMONTHSPAID != 1) { statusMsg += "TOTALMONTHSPAID MISMATCH, "; } if (Status.TOTALMONTHSDUE != 0) { statusMsg += "TOTALMONTHSDUE MISMATCH, "; } if (Status.STATUS_CODE != 1 && Status.STATUS_CODE != 5) { statusMsg += "Status Coce Mismatch, "; } if (Status.STRUCKOFF == 1) { statusMsg += "Struckoff Mismatch, "; } if (Status.RESIGNED == 1) { statusMsg += "Resigned Mismatch, "; } if (mm.DATEOFJOINING.Value.Year != Status.LASTPAYMENTDATE.Value.Year || mm.DATEOFJOINING.Value.Month != Status.LASTPAYMENTDATE.Value.Month) { statusMsg += "Last payment Date Mismatch, "; } if (mm.DATEOFJOINING.Value.Year != Status.StatusMonth.Value.Year || mm.DATEOFJOINING.Value.Month != Status.StatusMonth.Value.Month) { statusMsg += "Status Month Date Mismatch, "; } } else { if (Status.StatusMonth.Value.Year != 2005 || Status.StatusMonth.Value.Month != 09) { statusMsg += "Status Month Date Mismatch, "; } var ts = DateTimeSpan.CompareDates(mm.DATEOFJOINING.Value, new DateTime(2005, 9, 1)); if ((Status.TOTALMONTHSPAID + Status.TOTALMONTHSDUE) != ((ts.Years * 12) + ts.Months) + 2) { statusMsg += "Total Month Mismatch, "; } if (Status.ACCBF != (Status.TOTALMONTHSPAID * BFs)) { statusMsg += "Acc BF Mismatch, "; } if (Status.BFDUE != (Status.TOTALMONTHSDUE * BFs)) { statusMsg += "Due BF Mismatch, "; } } } if (!string.IsNullOrWhiteSpace(statusMsg)) { //try //{ // MemberMonthEndErrorLog d = new MemberMonthEndErrorLog() // { // Member_Code = mm.MEMBER_CODE, // YY = mm.DATEOFJOINING.Value.Year, // MM = mm.DATEOFJOINING.Value.Month, // ErrorMsg = "Member_Init" + statusMsg // }; //} //catch (Exception ex) { AppLib.WriteLog(ex); } statusMsg = " Error=> " + statusMsg; } AppLib.WriteLog("{0,5} {1,-10} {2,-10} {3,-50} {4,-15} {5,-15} {6:dd/MM/yyyy} {7:dd/MM/yyyy} {8:dd/MM/yyyy} {9:dd/MM/yyyy} {10,-10} {11,-10} {12,-10} {13,-10} {14,-10} {15,-10} {16,-10} {17,-10} {18,-10} {19,-10} {20,-10} {21,-10} {22,-10} {23,-10} {24,-10}", i++, mm.MEMBER_CODE, mm.MEMBER_ID, mm.MEMBER_NAME, mm.ICNO_OLD, mm.ICNO_NEW, mm.DATEOFBIRTH, mm.DATEOFJOINING, Status.LASTPAYMENTDATE, Status.StatusMonth, Status.SUBSCRIPTION_AMOUNT, Status.TOTALSUBCRP_AMOUNT, Status.ACCSUBSCRIPTION, Status.SUBSCRIPTIONDUE, Status.BF_AMOUNT, Status.TOTALBF_AMOUNT, Status.ACCBF, Status.BFDUE, Status.TOTAL_MONTHS, Status.TOTALMONTHSPAID, Status.TOTALMONTHSPAID, Status.STATUS_CODE, Status.RESIGNED, Status.STRUCKOFF, statusMsg); } } else { AppLib.WriteLog("Bank Code {0} is not found", BANK_CODE); } AppLib.WriteLogDT("END:"); } catch (Exception ex) { AppLib.WriteLog(ex); } }
// обновить из БД internal void UpdateFromDBEntity(OrderDish dbDish) { lock (this) { // и для блюда, и для ингредиента if (DepartmentId != dbDish.DepartmentId) { DepartmentId = dbDish.DepartmentId; } if (Uid != dbDish.UID) { Uid = dbDish.UID; } if (CreateDate != dbDish.CreateDate) { CreateDate = dbDish.CreateDate; } if (Name != dbDish.DishName) { Name = dbDish.DishName; } if (FilingNumber != dbDish.FilingNumber) { FilingNumber = dbDish.FilingNumber; } if (ParentUid != dbDish.ParentUid) { ParentUid = dbDish.ParentUid; } if (Comment != dbDish.Comment) { Comment = dbDish.Comment; } if (Quantity != dbDish.Quantity) { Quantity = dbDish.Quantity; } // ожидаемое время начала приготовления для автоматического перехода в состояние приготовления if (DelayedStartTime != dbDish.DelayedStartTime) { DelayedStartTime = dbDish.DelayedStartTime; } // время приготовления if (EstimatedTime != dbDish.EstimatedTime) { EstimatedTime = dbDish.EstimatedTime; _tsCookingEstimated = TimeSpan.FromSeconds(EstimatedTime); } // автоматическая установка состояний OrderStatusEnum newStatus = AppLib.GetStatusEnumFromNullableInt(dbDish.DishStatusId); // отмененное блюдо/ингредиент if ((Quantity < 0) && (newStatus != OrderStatusEnum.Cancelled)) { newStatus = OrderStatusEnum.Cancelled; } // автоматический переход из Готово в ПодтвГотово else if ((_isUseReadyConfirmed == true) && (_autoGotoReadyConfirmPeriod > 0) && (newStatus == OrderStatusEnum.Ready) && (_dtReadyStatusInput.IsZero() == false) && ((DateTime.Now - _dtReadyStatusInput).TotalSeconds >= _autoGotoReadyConfirmPeriod) ) { _dtReadyStatusInput.SetZero(); newStatus = OrderStatusEnum.ReadyConfirmed; } UpdateStatus(newStatus); } // lock } // method
private void txtEntranceFeed_PreviewTextInput(object sender, TextCompositionEventArgs e) { AppLib.CheckIsNumeric(e); }
} // method // ****************************************** // ОСНОВНАЯ ПРОЦЕДУРА БИЗНЕС-ЛОГИКИ // ПРИ ИЗМЕНЕНИИ СТАТУСА БЛЮДА или НЕЗАВИСИМОГО ИНГРЕДИЕНТА // ****************************************** // команды на изменение статуса блюда могут приходить как от КДС, так и из FrontOffice (при чтении из БД) // состояния и даты сохраняются в БД при каждом изменении // isUpdateParentOrder = true, если запрос на изменение состояния пришел от КДС, иначе запрос из внутренней логики, напр. автоматическое изменение статуса из ожидания в готовку public bool UpdateStatus(OrderStatusEnum newStatus, DateTime dtEnterState = default(DateTime), int preStateTS = 0, string machineName = null) { // если статус не поменялся для существующей записи, то ничего не делать if (this.Status == newStatus) { return(false); } // автоматический переход из Готово в ПодтвГотово: вход в режим отслеживания нахождения в состоянии Готов if ((_isUseReadyConfirmed == true) && (_autoGotoReadyConfirmPeriod > 0) && (newStatus == OrderStatusEnum.Ready) && (this.Status != OrderStatusEnum.Ready)) { _dtReadyStatusInput = DateTime.Now; } string sLogMsg = string.Format(" - DISH.UpdateStatus() Id {0}/{1}, from {2} to {3}", this.Id, this.Name, this.Status.ToString(), newStatus.ToString()); DateTime dtTmr = DateTime.Now; if (machineName == null) { AppLib.WriteLogOrderDetails(sLogMsg + " - START"); } else { AppLib.WriteLogClientAction(machineName, sLogMsg + " - START"); } bool isUpdSuccess = false; // здесь тоже лочить, т.к. вызовы могут быть как циклческие (ингр.для блюд), так и из заказа / КДС-а lock (this) { // время нахождения в ПРЕДЫДУЩЕМ состоянии, в секундах int secondsInPrevState = 0; if (_curTimer != null) // если есть таймер предыдущего состояния { _curTimer.Stop(); // остановить таймер состояния // получить время нахождения в состоянии с момента последнего входа secondsInPrevState = _curTimer.IncrementTS; // Debug.Print("secondsInPrevState {0}", secondsInPrevState); } if (preStateTS != 0) { secondsInPrevState = preStateTS; } // дата входа в новое состояние: или то, что передано, или текущую DateTime dtEnterToNewStatus = DateTime.Now; // если переданы данные из родительского объекта (заказ или блюдо для ингредиентов) if (!dtEnterState.IsZero()) { dtEnterToNewStatus = dtEnterState; } // сохранить новый статус ОБЪЕКТА в БД if (saveStatusToDB(newStatus, machineName)) { // изменить статус в ОБЪЕКТЕ OrderStatusEnum preStatus = this.Status; this.Status = newStatus; this.DishStatusId = (int)newStatus; // **** запись или в RunTimeRecord или в ReturnTable StatusDTS statusDTS = getStatusRunTimeDTS(this.Status); if (statusDTS.DateEntered.IsZero()) { // сохраняем дату входа в новое состояние setStatusRunTimeDTS(this.Status, dtEnterToNewStatus, -1); // сохраняем в записи RunTimeRecord время нахождения в предыдущем состоянии setStatusRunTimeDTS(preStatus, DateTime.MinValue, secondsInPrevState); saveRunTimeRecord(); } // возврат в предыдущие состояния, создать новую запись в Return table else { saveReturnTimeRecord(preStatus, newStatus, dtEnterToNewStatus, secondsInPrevState); // при возврате из Ready в Cooking обнулять в RunTime-record дату входа в состояние Ready // чтобы при следующем входе в Ready таймер ожидания выноса начал считаться с периода ExpectedTake if (!_isUseReadyConfirmed && (preStatus == OrderStatusEnum.Ready) && (newStatus == OrderStatusEnum.Cooking)) { _dbRunTimeRecord.ReadyDate = DateTime.MinValue; } if (_isUseReadyConfirmed && (preStatus == OrderStatusEnum.ReadyConfirmed) && ((newStatus == OrderStatusEnum.Cooking) || (newStatus == OrderStatusEnum.Ready))) { _dbRunTimeRecord.ReadyConfirmedDate = DateTime.MinValue; } } // запуск таймера для нового состояния statusDTS = getStatusRunTimeDTS(this.Status); startStatusTimer(statusDTS); // попытка обновить статус ЗАКАЗА проверкой состояний всех блюд/ингредиентов _modelOrder.UpdateStatusByVerificationDishes(); isUpdSuccess = true; } } sLogMsg += " - FINISH - " + (DateTime.Now - dtTmr).ToString(); if (machineName == null) { AppLib.WriteLogOrderDetails(sLogMsg); } else { AppLib.WriteLogClientAction(machineName, sLogMsg); } return(isUpdSuccess); } // method UpdateStatus
private void txtSubscription_PreviewTextInput(object sender, TextCompositionEventArgs e) { AppLib.CheckIsNumeric(e); }
// ОБНОВИТЬ СТАТУС "ВЧЕРАШНИХ" ЗАКАЗОВ // "вчерашние" заказы - это заказы, у которых CreateDate меньше начала текущего дня (полночь) // минус смещение от полуночи назад (MidnightShiftShowYesterdayOrders) // "Вчерашним" заказам статус устанавливается в 9 и они НЕ будут отображаться на КДСе. private bool updateYesterdayOrdersStatus() { // дата/время, КОГДА необходимо обновить статус вчерашних заказов DateTime dtUpdate = _currentDate.Add(AppLib.TimeOfAutoCloseYesterdayOrders); if (DateTime.Now < dtUpdate) { return(false); } AppLib.WriteLogOrderDetails(" - обновить статус вчерашних заказов... - START"); _tmpDT = DateTime.Now; // дата/время, С КОТОРОГО заказы считаются "сегодяшними" double d1 = AppProperties.GetDoubleProperty("MidnightShiftShowYesterdayOrders"); dtUpdate = DateTime.Today.AddHours(-d1); string sqlText = null; int cntDishes = 0, cntOrders = 0, iAffected; bool retVal = false; try { using (DBContext db = new DBContext()) { sqlText = string.Format("SELECT Id FROM [Order] WHERE (OrderStatusId < 3) AND (CreateDate < {0})", dtUpdate.ToSQLExpr()); DataTable dt = db.GetQueryTable(sqlText); if (dt != null) { int orderId; foreach (DataRow dtRow in dt.Rows) { orderId = System.Convert.ToInt32(dtRow[0]); if (orderId > 0) { // обновить статус блюд sqlText = $"UPDATE [OrderDish] SET DishStatusId = 9 WHERE (OrderId={orderId.ToString()})"; iAffected = db.ExecuteCommand(sqlText); cntDishes += iAffected; // обновить статус заказа sqlText = $"UPDATE [Order] SET OrderStatusId = 9, QueueStatusId = 9 WHERE (Id={orderId.ToString()})"; iAffected = db.ExecuteCommand(sqlText); cntOrders += iAffected; } } dt.Dispose(); } } retVal = true; } catch (Exception ex) { AppLib.WriteLogErrorMessage(" - ошибка обновления заказов: {0} ({1})", ErrorHelper.GetShortErrMessage(ex), sqlText); } AppLib.WriteLogOrderDetails(" - обновлено заказов {0} (блюд {1}) - FINISH - {2}", cntOrders, cntDishes, _tmpPeriod()); return(retVal); }