using System; using System.Collections.Generic; using System.Data; using System.Linq; using SuperMap.RealEstate.ServiceModel; using COMB = SuperMap.RealEstate.Coop.Merchant.Business; using ESCom = EShang.Common; using Newtonsoft.Json.Linq; using Newtonsoft.Json; using HZQR.Common; namespace YFBusinessApi.Helper { /// /// 移动支付相关方法 /// public class MobilePayHelper { #region 方法 -> 差异流水(按结账单的口径产生的移动支付差异流水) /// /// 差异流水(按结账单的口径产生的移动支付差异流水) /// /// 事务管理器 /// 省份编码 /// 服务区编码 /// 门店编码 /// 机器编码 /// 开始时间 /// 结束时间 /// public static List GetMobilePayContrast(Transaction _Transaction, string ProvinceCode, string ServerPart_Code, string ServerPartShop_Code, string MachineCode, string beginDate, string endDate) { List mobilePayList = new List(); #region 通过接口获取收银机端流水 string _BaseUrl = ESCom.Config.AppSettings.GetWebApiUrls(ProvinceCode); string PostStr = string.Format("Start_Date={0}&End_Date={1}&ServerPart_Code={2}&ServerPartShop_Code={3}&MachineCode={4}", beginDate, endDate, ServerPart_Code, ServerPartShop_Code, MachineCode); string RequestUrl = _BaseUrl + "?action_type=GetMobilePay&" + PostStr; string format = "application/json;charset=UTF-8"; string val = ESCom.HttpUtil.HttpUrlPost(PostStr, RequestUrl, format, 0); JObject _JObject = JObject.Parse(val); if (_JObject["Result_Data"] != null && _JObject["Result_Data"]["List"] != null) { mobilePayList = Newtonsoft.Json.JsonConvert.DeserializeObject>( _JObject["Result_Data"]["List"].ToString()); } #endregion #region 获取通道传输的流水 string sql = string.Format(@" SELECT A.TICKET_CODE,A.TICKET_AMOUNT,A.ORDER_DATE, A.SERVERPART_CODE,A.SERVERPARTSHOP_CODE,A.MACHINECODE FROM HIGHWAY_SELLDATA.T_MOBILEPAYMENT_RECORDS A WHERE A.ORDER_DATE >= TO_DATE('{0}','YYYY-MM-DD HH24:MI:SS') AND A.ORDER_DATE <= TO_DATE('{1}','YYYY-MM-DD HH24:MI:SS') AND A.SERVERPART_CODE='{2}' AND A.SERVERPARTSHOP_CODE='{3}' AND A.MACHINECODE=LPAD('{4}',4,'0')", beginDate, endDate, ServerPart_Code, ServerPartShop_Code, MachineCode); DataTable dtMobilePay = new COMB.BRAND(_Transaction).ExecuteDataTable(sql); #endregion List listMobilePay = new List(); foreach (Models.MobilePayModel result in mobilePayList) { DataRow[] drs = dtMobilePay.Select("TICKET_CODE='" + result.Ticket_Code + "'"); //收银端失败,通道有流水,则标识收银机端有误 if (result.Mobilepay_Result == 0 && drs.Length > 0) { result.Mobilepay_Result_Text = GetResultText(result.Mobilepay_Result);//收银机端失败 result.Factual_Mobilepay_Result = 9;//通道支付成功 result.Factual_Mobilepay_Result_Text = GetResultText(9);//通道支付成功 listMobilePay.Add(result); } else if (result.Mobilepay_Result != 0 && drs.Length == 0) { result.Mobilepay_Result = result.Mobilepay_Result == 5 ? 9 : result.Mobilepay_Result; result.Mobilepay_Result_Text = GetResultText(result.Mobilepay_Result); result.Factual_Mobilepay_Result_Text = GetResultText(result.Factual_Mobilepay_Result); listMobilePay.Add(result); } } return mobilePayList; } public static string GetResultText(int Mobilepay_Result) { string Mobilepay_Result_Text = ""; switch (Mobilepay_Result) { case 0: Mobilepay_Result_Text = "支付失败"; break; case 1: Mobilepay_Result_Text = "人工确认"; break; case 5: case 9: Mobilepay_Result_Text = "支付成功"; break; default: break; } return Mobilepay_Result_Text; } #endregion #region 方法 -> 银行到账(按自然日的口径统计移动支付交易金额) /// /// 银行到账(按自然日的口径统计移动支付交易金额) /// /// 事务管理器 /// 商家会员内码 /// 开始时间 /// 结束时间 /// public static List GetRevenueByDay(Transaction _Transaction, int membershipId, string beginDate, string endDate) { List BankAccountList = new List(); string provinceCode = "", serverPartShopCode = ""; ESCom.BusinessMan.GetUserServerPartShop(membershipId, _Transaction, ref provinceCode, ref serverPartShopCode); if (!string.IsNullOrEmpty(serverPartShopCode)) { string sql = string.Format(@" SELECT A.SERVERPART_NAME,A.SERVERPARTSHOP_NAME,A.MACHINECODE,A.ORDER_DATE,A.TICKET_AMOUNT,A.TAXFEE_AMOUNT, B.BANK_NAME,B.BANK_LOG,B.BANK_ACCOUNT,B.RECKONER_NAME FROM HIGHWAY_SELLDATA.T_REVENUE_NATURALDAY A LEFT JOIN ( SELECT B.PROVINCE_CODE,B.SERVERPART_ID,B.SERVERPARTSHOP_ID,B.BANK_NAME,C.BANK_LOG,B.BANK_ACCOUNT, B.RECKONER_NAME FROM COOP_MERCHANT.T_BUSINESSSHOPCODE B, COOP_MERCHANT.T_BANK C WHERE B.BUSINESSSHOPCODE_STATE = 1 AND B.BANK_NAME = C.BANK_NAME GROUP BY B.PROVINCE_CODE,B.SERVERPART_ID,B.SERVERPARTSHOP_ID,B.BANK_NAME,C.BANK_LOG,B.BANK_ACCOUNT, B.RECKONER_NAME) B ON A.PROVINCE_CODE = B.PROVINCE_CODE AND A.SERVERPART_ID = B.SERVERPART_ID AND A.SERVERPARTSHOP_ID = B.SERVERPARTSHOP_ID WHERE A.SERVERPART_CODE || A.SERVERPARTSHOP_CODE IN ('{0}') AND ORDER_DATE >= TO_DATE('{1}','YYYY/MM/DD') AND ORDER_DATE < TO_DATE('{2}','YYYY/MM/DD') + 1", serverPartShopCode.Replace(",", "','"), beginDate, endDate); DataTable dtRevenue = new COMB.BRAND(_Transaction).ExecuteDataTable(sql); dtRevenue.DefaultView.Sort = "ORDER_DATE desc"; dtRevenue = dtRevenue.DefaultView.ToTable(); if (dtRevenue.Rows.Count > 0) { var list = from t in dtRevenue.AsEnumerable() group t by new { t1 = t.Field("ORDER_DATE").ToShortDateString(), } into p select new { Order_Date = p.Key.t1, Sum_TaxfeeAmount = p.Sum(n => n.Field("TAXFEE_AMOUNT")), Sum_Amount = p.Sum(n => n.Field("TICKET_AMOUNT")),//交易金额 Sum_TicketAmount = p.Sum(n => n.Field("TICKET_AMOUNT")) - p.Sum(n => n.Field("TAXFEE_AMOUNT")),//到账金额 BankList = from t in dtRevenue.AsEnumerable().Where( o => o.Field("ORDER_DATE").ToShortDateString() == p.Key.t1) group t by new { t1 = t.Field("BANK_NAME"), t2 = t.Field("BANK_LOG"), t3 = t.Field("BANK_ACCOUNT"), t4 = t.Field("RECKONER_NAME") } into s select new { Bank_Name = s.Key.t1.TryParseToString(), Bank_Log = !string.IsNullOrEmpty(s.Key.t2) ? ESCom.Config.AppSettings.CoopMerchantUrls + s.Key.t2 : "", Bank_Account = s.Key.t3.TryParseToString(), Reckoner_Name = s.Key.t4.TryParseToString(), Sum_TaxfeeAmount = s.Sum(n => n.Field("TAXFEE_AMOUNT")), Sum_Amount = s.Sum(n => n.Field("TICKET_AMOUNT")),//交易金额 Sum_TicketAmount = (s.Sum(n => n.Field("TICKET_AMOUNT")) - s.Sum(n => n.Field("TAXFEE_AMOUNT"))),//到账金额 ServerPartList = from t in dtRevenue.AsEnumerable().Where(o => o.Field("ORDER_DATE").ToShortDateString() == p.Key.t1 && o.Field("BANK_ACCOUNT") == s.Key.t3) group t by new { t1 = t.Field("SERVERPART_NAME"), } into h select new { Serverpart_Name = h.Key.t1, Sum_TaxfeeAmount = h.Sum(n => n.Field("TAXFEE_AMOUNT")), Sum_Amount = h.Sum(n => n.Field("TICKET_AMOUNT")),//交易金额 Sum_TicketAmount = (h.Sum(n => n.Field("TICKET_AMOUNT")) - h.Sum(n => n.Field("TAXFEE_AMOUNT"))),//到账金额 Revenue_List = dtRevenue.AsEnumerable().Select(o => new { Order_Date = Convert.ToDateTime(o.Field("ORDER_DATE")).ToShortDateString(), ServerPart_Name = o.Field("SERVERPART_NAME"), ServerPartShop_Name = o.Field("SERVERPARTSHOP_NAME"), MachineCode = o.Field("MACHINECODE"), TaxfeeAmount = o.Field("TAXFEE_AMOUNT"), Amount = o.Field("TAXFEE_AMOUNT"), TicketAmount = o.Field("TICKET_AMOUNT") - o.Field("TAXFEE_AMOUNT"), BANK_ACCOUNT = o.Field("BANK_ACCOUNT") }).Where(l => l.ServerPart_Name == h.Key.t1 && l.Order_Date == p.Key.t1 && l.BANK_ACCOUNT == s.Key.t3) } } }; string resultstr = JsonConvert.SerializeObject(list.ToList()); BankAccountList = QRWL.Common.JsonHelper.JSONStringToList(resultstr); } } return BankAccountList; } #endregion #region 方法 -> 获取实时移动支付流水 /// /// 获取实时移动支付流水 /// /// 事务管理器 /// 商家会员内码 /// 门店编码集合 /// 统计开始时间,格式如2021-10-01 00:00:00 /// 统计结束时间,格式如2021-10-01 23:59:59 /// 显示行数 /// 订单编号 /// public static List GetCurTrade(Transaction _Transaction, string membershipId, string serverpartShopCode, string beginDate, string endDate, int showCount, string orderno = "") { List MobilePayDataList = new List(); //获取商户门店权限集合 string provinceCode = "", serverpartShopCodes = ""; if (!string.IsNullOrWhiteSpace(serverpartShopCode)) { //若传入服务区门店编码,则直接按传入的参数获取 serverpartShopCodes = serverpartShopCode; } else { //若未传入服务区门店编码,则根据商户权限获取服务区门店编码集合 ESCom.BusinessMan.GetUserServerPartShop(membershipId.TryParseToInt(), _Transaction, ref provinceCode, ref serverpartShopCodes); } //根据门店权限获取移动支付商户号信息 List BusinessShopCodeList = ESCom.BusinessMan.GetMerchantCodeList(_Transaction, serverpartShopCodes); //查询实时移动支付交易流水 if (BusinessShopCodeList.Count > 0) { //将统计时间转换成yyyy-MM-dd HH:mm:ss格式 string starTime = Convert.ToDateTime(beginDate).ToString("yyyy-MM-dd HH:mm:ss"); string endTime = Convert.ToDateTime(endDate).ToString("yyyy-MM-dd HH:mm:ss"); //根据支付渠道和商户号查询移动支付流水 var BusinessCodeList = from x in BusinessShopCodeList group x by new { //移动支付商户号 t1 = x.Business_Code, //移动支付渠道 t2 = x.Transaction_Trench } into m select new { //移动支付商户号 Business_Code = m.Key.t1, //移动支付渠道 Transaction_Trench = m.Key.t2 }; foreach (var item in BusinessCodeList.ToList()) { switch (item.Transaction_Trench) { //客无忧 case 1005: #region 请求客无忧数据 if (item.Business_Code.Replace(",", ",").Contains(",")) { //如果当前配置的商户号是多个,则逐个进行查询 foreach (string _s_busi_id in item.Business_Code.Replace(",", ",").Split(',')) { List _ilist = ESCom.Revenue.GetKWYTotalList(_Transaction, starTime, endTime, _s_busi_id, "", BusinessShopCodeList, showCount.ToString(), orderno); MobilePayDataList = MobilePayDataList.Concat(_ilist).ToList(); } } else { List _ilist = ESCom.Revenue.GetKWYTotalList(_Transaction, starTime, endTime, item.Business_Code.Trim(), "", BusinessShopCodeList, showCount.ToString(), orderno); MobilePayDataList = MobilePayDataList.Concat(_ilist).ToList(); } #endregion break; } } MobilePayDataList.OrderByDescending(o => o.begin_time); MobilePayDataList = MobilePayDataList.GetRange(0, showCount); } return MobilePayDataList; } #endregion } }