2025-03-28 09:49:56 +08:00

322 lines
19 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
{
/// <summary>
/// 移动支付相关方法
/// </summary>
public class MobilePayHelper
{
#region ->
/// <summary>
/// 差异流水(按结账单的口径产生的移动支付差异流水)
/// </summary>
/// <param name="_Transaction">事务管理器</param>
/// <param name="ProvinceCode">省份编码</param>
/// <param name="ServerPart_Code">服务区编码</param>
/// <param name="ServerPartShop_Code">门店编码</param>
/// <param name="MachineCode">机器编码</param>
/// <param name="beginDate">开始时间</param>
/// <param name="endDate">结束时间</param>
/// <returns></returns>
public static List<Models.MobilePayModel> GetMobilePayContrast(Transaction _Transaction, string ProvinceCode,
string ServerPart_Code, string ServerPartShop_Code, string MachineCode, string beginDate, string endDate)
{
List<Models.MobilePayModel> mobilePayList = new List<Models.MobilePayModel>();
#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<List<Models.MobilePayModel>>(
_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<Models.MobilePayModel> listMobilePay = new List<Models.MobilePayModel>();
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 ->
/// <summary>
/// 银行到账(按自然日的口径统计移动支付交易金额)
/// </summary>
/// <param name="_Transaction">事务管理器</param>
/// <param name="membershipId">商家会员内码</param>
/// <param name="beginDate">开始时间</param>
/// <param name="endDate">结束时间</param>
/// <returns></returns>
public static List<Models.BankAccountModel> GetRevenueByDay(Transaction _Transaction, int membershipId, string beginDate, string endDate)
{
List<Models.BankAccountModel> BankAccountList = new List<Models.BankAccountModel>();
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<DateTime>("ORDER_DATE").ToShortDateString(),
}
into p
select new
{
Order_Date = p.Key.t1,
Sum_TaxfeeAmount = p.Sum(n => n.Field<decimal>("TAXFEE_AMOUNT")),
Sum_Amount = p.Sum(n => n.Field<decimal>("TICKET_AMOUNT")),//交易金额
Sum_TicketAmount = p.Sum(n => n.Field<decimal>("TICKET_AMOUNT")) -
p.Sum(n => n.Field<decimal>("TAXFEE_AMOUNT")),//到账金额
BankList = from t in dtRevenue.AsEnumerable().Where(
o => o.Field<DateTime>("ORDER_DATE").ToShortDateString() == p.Key.t1)
group t by new
{
t1 = t.Field<string>("BANK_NAME"),
t2 = t.Field<string>("BANK_LOG"),
t3 = t.Field<string>("BANK_ACCOUNT"),
t4 = t.Field<string>("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<decimal>("TAXFEE_AMOUNT")),
Sum_Amount = s.Sum(n => n.Field<decimal>("TICKET_AMOUNT")),//交易金额
Sum_TicketAmount = (s.Sum(n => n.Field<decimal>("TICKET_AMOUNT")) -
s.Sum(n => n.Field<decimal>("TAXFEE_AMOUNT"))),//到账金额
ServerPartList = from t in dtRevenue.AsEnumerable().Where(o =>
o.Field<DateTime>("ORDER_DATE").ToShortDateString() == p.Key.t1 &&
o.Field<string>("BANK_ACCOUNT") == s.Key.t3)
group t by new
{
t1 = t.Field<string>("SERVERPART_NAME"),
}
into h
select new
{
Serverpart_Name = h.Key.t1,
Sum_TaxfeeAmount = h.Sum(n => n.Field<decimal>("TAXFEE_AMOUNT")),
Sum_Amount = h.Sum(n => n.Field<decimal>("TICKET_AMOUNT")),//交易金额
Sum_TicketAmount = (h.Sum(n => n.Field<decimal>("TICKET_AMOUNT")) -
h.Sum(n => n.Field<decimal>("TAXFEE_AMOUNT"))),//到账金额
Revenue_List = dtRevenue.AsEnumerable().Select(o => new
{
Order_Date = Convert.ToDateTime(o.Field<DateTime>("ORDER_DATE")).ToShortDateString(),
ServerPart_Name = o.Field<string>("SERVERPART_NAME"),
ServerPartShop_Name = o.Field<string>("SERVERPARTSHOP_NAME"),
MachineCode = o.Field<string>("MACHINECODE"),
TaxfeeAmount = o.Field<decimal>("TAXFEE_AMOUNT"),
Amount = o.Field<decimal>("TAXFEE_AMOUNT"),
TicketAmount = o.Field<decimal>("TICKET_AMOUNT") -
o.Field<decimal>("TAXFEE_AMOUNT"),
BANK_ACCOUNT = o.Field<string>("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<Models.BankAccountModel>(resultstr);
}
}
return BankAccountList;
}
#endregion
#region ->
/// <summary>
/// 获取实时移动支付流水
/// </summary>
/// <param name="_Transaction">事务管理器</param>
/// <param name="membershipId">商家会员内码</param>
/// <param name="serverpartShopCode">门店编码集合</param>
/// <param name="beginDate">统计开始时间格式如2021-10-01 00:00:00</param>
/// <param name="endDate">统计结束时间格式如2021-10-01 23:59:59</param>
/// <param name="showCount">显示行数</param>
/// <param name="orderno">订单编号</param>
/// <returns></returns>
public static List<ESCom.Model.MobilePayData> GetCurTrade(Transaction _Transaction, string membershipId,
string serverpartShopCode, string beginDate, string endDate, int showCount, string orderno = "")
{
List<ESCom.Model.MobilePayData> MobilePayDataList = new List<ESCom.Model.MobilePayData>();
//获取商户门店权限集合
string provinceCode = "", serverpartShopCodes = "";
if (!string.IsNullOrWhiteSpace(serverpartShopCode))
{
//若传入服务区门店编码,则直接按传入的参数获取
serverpartShopCodes = serverpartShopCode;
}
else
{
//若未传入服务区门店编码,则根据商户权限获取服务区门店编码集合
ESCom.BusinessMan.GetUserServerPartShop(membershipId.TryParseToInt(),
_Transaction, ref provinceCode, ref serverpartShopCodes);
}
//根据门店权限获取移动支付商户号信息
List<ESCom.Model.BusinessShopCode> 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<ESCom.Model.MobilePayData> _ilist = ESCom.Revenue.GetKWYTotalList(_Transaction,
starTime, endTime, _s_busi_id, "", BusinessShopCodeList, showCount.ToString(), orderno);
MobilePayDataList = MobilePayDataList.Concat(_ilist).ToList();
}
}
else
{
List<ESCom.Model.MobilePayData> _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
}
}