|
|
using log4net;
|
|
|
using Newtonsoft.Json;
|
|
|
using Newtonsoft.Json.Linq;
|
|
|
using Quartz;
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Data;
|
|
|
using System.Data.SqlClient;
|
|
|
using System.IO;
|
|
|
using System.Linq;
|
|
|
using System.Text;
|
|
|
|
|
|
namespace JobCreateFee
|
|
|
{
|
|
|
public class JobD7DjyFee : IJob
|
|
|
{
|
|
|
private ILog log = LogManager.GetLogger(typeof(JobD7DjyFee));
|
|
|
|
|
|
public void Execute(IJobExecutionContext context)
|
|
|
{
|
|
|
log.Debug($"Execute开始");
|
|
|
try
|
|
|
{
|
|
|
string connStr = context.JobDetail.JobDataMap.GetString("ConnectString");
|
|
|
string reqUrl = context.JobDetail.JobDataMap.GetString("DjyReqFeeUrl");
|
|
|
string ENTEROPERATOR = context.JobDetail.JobDataMap.GetString("ENTEROPERATOR");
|
|
|
|
|
|
string companyCode = context.JobDetail.JobDataMap.GetString("DjyFeeCompanyCode");
|
|
|
string returnUrl = context.JobDetail.JobDataMap.GetString("DjyReturnFeeUrl");
|
|
|
|
|
|
int reqTimeout = Convert.ToInt32(context.JobDetail.JobDataMap.GetString("RequestTimeout"));
|
|
|
long ts = DataTableToJsonHelper.ConvertDateTimeToInt(DateTime.Now);
|
|
|
|
|
|
string KFCUSTCODE = context.JobDetail.JobDataMap.GetString("KFCUSTCODE");
|
|
|
string KFCUSTKEY = context.JobDetail.JobDataMap.GetString("KFCUSTKEY");
|
|
|
string KFUSERID = context.JobDetail.JobDataMap.GetString("KFUSERID");
|
|
|
string KFURL = context.JobDetail.JobDataMap.GetString("KFURL");
|
|
|
|
|
|
|
|
|
|
|
|
Dictionary<string, string> dicData = new Dictionary<string, string>();
|
|
|
dicData.Add("compid", companyCode);
|
|
|
|
|
|
log.Debug($"获取数据");
|
|
|
|
|
|
//发送请求数据
|
|
|
string rtn = WebRequestHelper.DoPost(reqUrl, dicData, reqTimeout * 1000);
|
|
|
//var objRtn = JsonConvert.DeserializeAnonymousType(rtn, new { status = "", message = "" });
|
|
|
log.Debug($"数据返回:{rtn}");
|
|
|
var parseJsonObj = JsonConvert.DeserializeObject<List<JsonFeeResponse>>(rtn);
|
|
|
if (parseJsonObj != null && parseJsonObj.Count > 0)
|
|
|
{
|
|
|
var returnlist = parseJsonObj;
|
|
|
var feebacklist = new List<feeback>();
|
|
|
string sql = "";
|
|
|
try
|
|
|
{
|
|
|
using (SqlConnection dbcon = new SqlConnection(connStr))
|
|
|
{
|
|
|
dbcon.Open();
|
|
|
foreach (var returndata in returnlist)
|
|
|
{
|
|
|
var BS = GETBSNO(returndata.MBLNO, dbcon);
|
|
|
if (BS.BSNO != "" && !BS.FEESTATUS)
|
|
|
{
|
|
|
//if (GETCARRIERFEEUSD(BS.BSNO, dbcon))
|
|
|
//{
|
|
|
// var feeback = new feeback();
|
|
|
// feeback.ReceiveId = returndata.ReceiveId;
|
|
|
// feeback.Success = false;
|
|
|
// feeback.Reason = "船公司费用已提交";
|
|
|
// feebacklist.Add(feeback);
|
|
|
|
|
|
//}
|
|
|
//else
|
|
|
//{
|
|
|
|
|
|
if (!string.IsNullOrEmpty(returndata.CANCEL_NO))
|
|
|
{
|
|
|
|
|
|
if (GETFEEISUSE(returndata.CANCEL_NO, dbcon))
|
|
|
{
|
|
|
var feeback = new feeback();
|
|
|
feeback.ReceiveId = returndata.ReceiveId;
|
|
|
feeback.Success = false;
|
|
|
feeback.Reason = "费用已结算或申请";
|
|
|
feebacklist.Add(feeback);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
var feelist = GetFeeList(" DELIVERYNO='" + returndata.CANCEL_NO + "'", dbcon);
|
|
|
|
|
|
foreach (var fee in feelist)
|
|
|
{
|
|
|
sql = "DELETE FROM ch_fee where GID=" + fee.ch_id;
|
|
|
SqlCommand cmd = new SqlCommand(sql, dbcon);
|
|
|
cmd.ExecuteNonQuery();
|
|
|
}
|
|
|
var feeback = new feeback();
|
|
|
feeback.ReceiveId = returndata.ReceiveId;
|
|
|
feeback.Success = true;
|
|
|
feeback.Reason = "";
|
|
|
feebacklist.Add(feeback);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if (!GETINVNOISUSE(BS.BSNO, returndata.INVOICE_NO, dbcon))
|
|
|
{
|
|
|
|
|
|
var FeeList = returndata.DATA;
|
|
|
foreach (var feedata in FeeList)
|
|
|
{
|
|
|
if (Convert.ToDecimal(feedata.AMOUNT.Trim()) > 0)
|
|
|
{
|
|
|
var price = feedata.RATE;
|
|
|
if (price == "") price = "0";
|
|
|
var curr = feedata.CURRENCY;
|
|
|
if (curr == "CNY") curr = "RMB";
|
|
|
var FEENAME = GETFEENAME(feedata.FEECODE.Replace("'", "").Replace(",", "").Replace(".", ""), dbcon, curr);
|
|
|
decimal exrate = 1;
|
|
|
var AMOUNT = feedata.AMOUNT;
|
|
|
var COUNT = feedata.COUNT;
|
|
|
if (curr != "RMB")
|
|
|
{
|
|
|
if (curr != "USD") {
|
|
|
if (!string.IsNullOrEmpty(feedata.AMOUNT_USD) && feedata.AMOUNT_USD != "0")
|
|
|
{
|
|
|
AMOUNT = feedata.AMOUNT_USD;
|
|
|
curr = "USD";
|
|
|
COUNT = "1";
|
|
|
price = AMOUNT;
|
|
|
}
|
|
|
}
|
|
|
exrate = GetUsdExrate(dbcon, curr);
|
|
|
}
|
|
|
price = price.Replace(",", "");
|
|
|
|
|
|
sql = "INSERT INTO ch_fee(GID, BSNO, FEETYPE, FEENAME,CUSTOMERTYPE, CUSTOMERNAME, UNIT, UNITPRICE, QUANTITY, AMOUNT, CURRENCY,";
|
|
|
sql = sql + "EXCHANGERATE, REASON, REMARK, COMMISSIONRATE,ENTEROPERATOR, ENTERDATE,ISOPEN, ISADVANCEDPAY, SORT, FEESTATUS, FEEFRT,CARGO_GID,";
|
|
|
sql = sql + "TAXRATE,NOTAXAMOUNT,ACCTAXRATE,LINENUM,TAXUNITPRICE,MODIFIEDUSER,MODIFIEDTIME,WMSOUTBSNO,PREAMOUNT,ISINVOICE,INPUTMODE,LOCALCURR,MANAGER,ISACC,FEEDESCRIPTION,DELIVERYNO,SETTLEMENT,INVOICE,ORDERAMOUNT,ORDERINVOICE,ORDERSETTLEMENT,ORDERINVSETTLEMENT)";
|
|
|
sql = sql + "VALUES ";
|
|
|
sql = sql + "('"+ Guid.NewGuid().ToString()+ "','" + BS.BSNO + "',2,'" + FEENAME.Replace(",", "") + "','船公司','CMA','" + GETUNIT(feedata.UNIT.Replace(",", ""), feedata.CTNALL.Replace(",", "")) + "'";
|
|
|
sql = sql + "," + price + "," + COUNT.Replace(",", "") + "," + AMOUNT.Replace(",", "") + ",'" + curr + "'," + exrate.ToString() + ",'','',0";
|
|
|
sql = sql + ",'"+ ENTEROPERATOR + "',GETDATE(),0,0,10,1,'',''";
|
|
|
sql = sql + ",0,"+ AMOUNT.Replace(",", "") + ",0,0," + price + ","+ ENTEROPERATOR + ",GETDATE(),'',0,0,'','RMB','',0,'" + feedata.FEECODE.Replace(",", "").Replace(".", "") + "'";
|
|
|
sql = sql + ",'" + returndata.INVOICE_NO + "',0,0,0,0,0,0)";
|
|
|
// log.Debug($"更新语句:{sql}");
|
|
|
SqlCommand cmd = new SqlCommand(sql, dbcon);
|
|
|
cmd.ExecuteNonQuery();
|
|
|
|
|
|
}
|
|
|
}
|
|
|
var feeback = new feeback();
|
|
|
feeback.ReceiveId = returndata.ReceiveId;
|
|
|
feeback.Success = true;
|
|
|
feeback.Reason = "";
|
|
|
feebacklist.Add(feeback);
|
|
|
string guid = Guid.NewGuid().ToString();
|
|
|
DeductionFee(guid, returndata.MBLNO,KFCUSTCODE,KFCUSTKEY,KFUSERID,KFURL);
|
|
|
|
|
|
}
|
|
|
}
|
|
|
//}
|
|
|
}
|
|
|
else {
|
|
|
var feeback = new feeback();
|
|
|
feeback.ReceiveId = returndata.ReceiveId;
|
|
|
feeback.Success = false;
|
|
|
feeback.Reason = "费用状态已锁定 不允许插入费用!";
|
|
|
feebacklist.Add(feeback);
|
|
|
log.Debug($"提单号:{returndata.MBLNO},编号:{BS.BSNO},费用状态:{BS.FEESTATUS} 未插入");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
dbcon.Close();
|
|
|
}
|
|
|
|
|
|
if (feebacklist.Count != 0) {
|
|
|
log.Debug($"上传数据:{JsonConvert.SerializeObject(feebacklist.ToList())}");
|
|
|
string rtn2 = WebRequestHelper.DoPost(returnUrl, JsonConvert.SerializeObject(feebacklist.ToList()), reqTimeout * 1000);
|
|
|
log.Debug($"数据返回2:{rtn2}");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
}
|
|
|
catch (Exception e) {
|
|
|
log.Debug($"记录插入错误:{e.Message}" + sql);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
}
|
|
|
else {
|
|
|
log.Debug($"数据返回错误:{parseJsonObj}");
|
|
|
}
|
|
|
|
|
|
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
log.Error(ex.Message);
|
|
|
log.Error(ex.StackTrace);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
static public D7OPSEAE GETBSNO(string MBLNO, SqlConnection dbcon)
|
|
|
{
|
|
|
var OPSEAE = new D7OPSEAE();
|
|
|
|
|
|
var strSql = new StringBuilder();
|
|
|
strSql.Append("SELECT BSNO,BSSTATUS,FEESTATUS from op_seae where MBLNO='" + MBLNO + "'");
|
|
|
SqlDataAdapter adapter = new SqlDataAdapter(strSql.ToString(), dbcon);
|
|
|
DataTable table = new DataTable();
|
|
|
adapter.Fill(table);
|
|
|
var BSNO = "";
|
|
|
if (table.Rows.Count > 0)
|
|
|
{
|
|
|
foreach (DataRow row in table.Rows)
|
|
|
{
|
|
|
OPSEAE.BSNO = row["BSNO"].ToString();
|
|
|
OPSEAE.FEESTATUS = Convert.ToBoolean(row["FEESTATUS"].ToString());
|
|
|
OPSEAE.BSSTATUS = Convert.ToBoolean(row["BSSTATUS"].ToString());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
return OPSEAE;
|
|
|
}
|
|
|
//static public bool GETCARRIERFEEUSD(string BSNO, SqlConnection dbcon)
|
|
|
//{
|
|
|
// var result = false;
|
|
|
// var strSql = new StringBuilder();
|
|
|
// strSql.Append("SELECT COUNT(1) CT from ch_fee where 费用状态<>'录入状态' AND 类型='付' and 结算单位='船公司' and 费用名称<>'提箱小票费' and 编号='" + BSNO + "'");
|
|
|
// SqlDataAdapter adapter = new SqlDataAdapter(strSql.ToString(), dbcon);
|
|
|
// DataTable table = new DataTable();
|
|
|
// adapter.Fill(table);
|
|
|
|
|
|
// if (table.Rows.Count > 0)
|
|
|
// {
|
|
|
// foreach (DataRow row in table.Rows)
|
|
|
// {
|
|
|
// if (Convert.ToInt32(row["CT"].ToString())!=0)
|
|
|
// result = true;
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// return result;
|
|
|
//}
|
|
|
|
|
|
static public bool GETINVNOISUSE(string BSNO,string INVNO, SqlConnection dbcon)
|
|
|
{
|
|
|
var result = false;
|
|
|
var strSql = new StringBuilder();
|
|
|
strSql.Append("SELECT COUNT(1) CT from ch_fee where BSNO='" + BSNO + "' AND DELIVERYNO='" + INVNO + "'");
|
|
|
SqlDataAdapter adapter = new SqlDataAdapter(strSql.ToString(), dbcon);
|
|
|
DataTable table = new DataTable();
|
|
|
adapter.Fill(table);
|
|
|
|
|
|
if (table.Rows.Count > 0)
|
|
|
{
|
|
|
foreach (DataRow row in table.Rows)
|
|
|
{
|
|
|
if (Convert.ToInt32(row["CT"].ToString()) != 0)
|
|
|
result = true;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
static public bool GETFEEISUSE(string INVNO, SqlConnection dbcon)
|
|
|
{
|
|
|
var result =false;
|
|
|
var strSql = new StringBuilder();
|
|
|
strSql.Append("SELECT COUNT(1) CT from ch_fee where DELIVERYNO='" + INVNO + "' ");
|
|
|
strSql.Append(" AND (ISNULL(SETTLEMENT,0)<>0 OR ISNULL(INVOICE,0)<>0 OR ISNULL(ORDERAMOUNT,0)<>0 OR ISNULL(ORDERINVOICE,0)<>0 ) ");
|
|
|
SqlDataAdapter adapter = new SqlDataAdapter(strSql.ToString(), dbcon);
|
|
|
DataTable table = new DataTable();
|
|
|
adapter.Fill(table);
|
|
|
if (table.Rows.Count > 0)
|
|
|
{
|
|
|
foreach (DataRow row in table.Rows)
|
|
|
{
|
|
|
result = Convert.ToInt16(row["CT"].ToString())>0;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
static public string GETUNIT(string UNIT,string CTNALL)
|
|
|
{
|
|
|
var BSNO = UNIT;
|
|
|
if (BSNO == "FIX") BSNO = "单票";
|
|
|
if (BSNO == "UNI") BSNO = CTNALL;
|
|
|
|
|
|
return BSNO.Replace("'", "''");
|
|
|
}
|
|
|
|
|
|
static public string GETFEENAME(string FEECODE, SqlConnection dbcon, string curr)
|
|
|
{
|
|
|
|
|
|
var strSql = new StringBuilder();
|
|
|
strSql.Append("select top 1 [FEENAME] from code_fee_edi where [FEEENAME]='" + FEECODE + "'");
|
|
|
SqlDataAdapter adapter = new SqlDataAdapter(strSql.ToString(), dbcon);
|
|
|
DataTable table = new DataTable();
|
|
|
adapter.Fill(table);
|
|
|
var FEENAME = "";
|
|
|
if (table.Rows.Count > 0)
|
|
|
{
|
|
|
foreach (DataRow row in table.Rows)
|
|
|
{
|
|
|
FEENAME = row["FEENAME"].ToString();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
if (string.IsNullOrEmpty(FEENAME))
|
|
|
{
|
|
|
//if (curr == "USD")
|
|
|
//{
|
|
|
// FEENAME = "海运费";
|
|
|
//} else
|
|
|
FEENAME = FEECODE;
|
|
|
}
|
|
|
return FEENAME;
|
|
|
}
|
|
|
|
|
|
static public string GETCUSTNAME(string CUSTCODE, SqlConnection dbcon, string curr)
|
|
|
{
|
|
|
|
|
|
var strSql = new StringBuilder();
|
|
|
strSql.Append("select top 1 [CUST] from code_cust_edi where [EDICODE]='" + CUSTCODE + "'");
|
|
|
SqlDataAdapter adapter = new SqlDataAdapter(strSql.ToString(), dbcon);
|
|
|
DataTable table = new DataTable();
|
|
|
adapter.Fill(table);
|
|
|
var FEENAME = "";
|
|
|
if (table.Rows.Count > 0)
|
|
|
{
|
|
|
foreach (DataRow row in table.Rows)
|
|
|
{
|
|
|
FEENAME = row["CUST"].ToString();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
if (string.IsNullOrEmpty(FEENAME))
|
|
|
{
|
|
|
//if (curr == "USD")
|
|
|
//{
|
|
|
// FEENAME = "海运费";
|
|
|
//} else
|
|
|
FEENAME = CUSTCODE;
|
|
|
}
|
|
|
return FEENAME;
|
|
|
}
|
|
|
|
|
|
|
|
|
static public List<jffee> GetFeeList(string constr, SqlConnection dbcon) {
|
|
|
var feelist = new List<jffee>();
|
|
|
var strSql = new StringBuilder();
|
|
|
strSql.Append("select GID,BSNO from ch_fee where " + constr);
|
|
|
SqlDataAdapter adapter = new SqlDataAdapter(strSql.ToString(), dbcon);
|
|
|
DataTable table = new DataTable();
|
|
|
adapter.Fill(table);
|
|
|
if (table.Rows.Count > 0)
|
|
|
{
|
|
|
foreach (DataRow row in table.Rows)
|
|
|
{
|
|
|
var fee = new jffee();
|
|
|
fee.ch_id = row["GID"].ToString();
|
|
|
fee.bsno = row["BSNO"].ToString();
|
|
|
feelist.Add(fee);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return feelist;
|
|
|
}
|
|
|
|
|
|
|
|
|
static public decimal GetUsdExrate(SqlConnection dbcon,string curr)
|
|
|
{
|
|
|
decimal usdexrate = 0;
|
|
|
if (curr == "USD")
|
|
|
{
|
|
|
var strSql = new StringBuilder();
|
|
|
strSql.Append("select VALUE from currency_exchange where STARTTIME<=GETDATE() and ENDTIME>=GETDATE()");
|
|
|
strSql.Append(" and CURRENCYID in (select GID from code_currency where CODENAME='"+curr+"') ");
|
|
|
SqlDataAdapter adapter = new SqlDataAdapter(strSql.ToString(), dbcon);
|
|
|
DataTable table = new DataTable();
|
|
|
adapter.Fill(table);
|
|
|
if (table.Rows.Count > 0)
|
|
|
{
|
|
|
foreach (DataRow row in table.Rows)
|
|
|
{
|
|
|
usdexrate = Convert.ToDecimal(row["VALUE"].ToString());
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
if (usdexrate == 0)
|
|
|
{
|
|
|
SqlDataAdapter adapter2 = new SqlDataAdapter("select DEFAULTRATE from code_currency where CODENAME='" + curr + "'", dbcon);
|
|
|
DataTable table2 = new DataTable();
|
|
|
adapter2.Fill(table2);
|
|
|
if (table2.Rows.Count > 0)
|
|
|
{
|
|
|
foreach (DataRow row in table2.Rows)
|
|
|
{
|
|
|
usdexrate = Convert.ToDecimal(row["DEFAULTRATE"].ToString());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
return usdexrate;
|
|
|
}
|
|
|
|
|
|
|
|
|
public bool DeductionFee(string _Guid, string _MBLNO, string custname, string custkey, string userid, string djyurl, string bsType = "7")
|
|
|
{
|
|
|
|
|
|
var seconds = DateTime.Now.ToTimeStamp();
|
|
|
var runId = Guid.NewGuid().ToString();
|
|
|
var srcBeforMD5 = $"{runId}{custname}expend{bsType}0{_Guid}{_MBLNO}{seconds}{custkey}";
|
|
|
//调用扣费接口
|
|
|
var postObj = new
|
|
|
{
|
|
|
runId,
|
|
|
userId = custname,
|
|
|
module = "expend",//固定
|
|
|
bsType = bsType,
|
|
|
sendType = "0",
|
|
|
timestamp = seconds,//秒级时间戳
|
|
|
md5 = srcBeforMD5.ToMd5(),// 加密字符串小写 RunId + UserId + Module + BsType + SendType+Timestamp+ Key
|
|
|
Data = new
|
|
|
{
|
|
|
BSNO = _Guid,
|
|
|
MBLNO = _MBLNO,
|
|
|
CtnrInfo = "",
|
|
|
CtnrCount = 1,
|
|
|
IsCredit = 1,//是否是信用支付 1 信用支付 0不允许信用支付默认值为0
|
|
|
LURURENID = userid,///当前登录人id
|
|
|
SENDUSERID = userid
|
|
|
}
|
|
|
};
|
|
|
var apiJson = JsonConvert.SerializeObject(postObj);
|
|
|
var apiRtn = WebRequestHelper.DoPost(djyurl, apiJson);
|
|
|
var jobjApiRtn = JObject.Parse(apiRtn);
|
|
|
var code = Convert.ToInt32(jobjApiRtn.GetValue("code").ToString());
|
|
|
if (code == 200 || code == 450)
|
|
|
{
|
|
|
return true;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
log.Debug($"扣费失败提醒,执行扣费失败!");
|
|
|
|
|
|
}
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//public class JsonFeeResponse
|
|
|
//{
|
|
|
// public string ReceiveId { get; set; }
|
|
|
// public string MBLNO { get; set; }
|
|
|
// public string INVOICE_NO { get; set; }
|
|
|
// public string CANCEL_NO { get; set; }
|
|
|
// public string TOTAL_AMOUNT { get; set; }
|
|
|
// public List<DJYFEE> DATA { get; set; }
|
|
|
//}
|
|
|
//public class DJYFEE
|
|
|
//{
|
|
|
// public string FEECODE { get; set; }
|
|
|
// public string AMOUNT { get; set; }
|
|
|
// public string AMOUNT_USD { get; set; }
|
|
|
// public string CURRENCY { get; set; }
|
|
|
// public string CTNALL { get; set; }
|
|
|
// public string TAX { get; set; }
|
|
|
// public string COUNT { get; set; }
|
|
|
// public string UNIT { get; set; }
|
|
|
// public string RATE { get; set; }
|
|
|
|
|
|
|
|
|
//}
|
|
|
|
|
|
public class D7OPSEAE
|
|
|
{
|
|
|
public string BSNO { get; set; }
|
|
|
public bool FEESTATUS { get; set; }
|
|
|
public bool BSSTATUS { get; set; }
|
|
|
|
|
|
}
|
|
|
//public class feeback
|
|
|
//{
|
|
|
// public string ReceiveId { get; set; }
|
|
|
// public bool Success { get; set; }
|
|
|
// public string Reason { get; set; }
|
|
|
|
|
|
//}
|
|
|
//public class jffee
|
|
|
//{
|
|
|
// public string ch_id { get; set; }
|
|
|
// public string bsno { get; set; }
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
}
|