Commit a4129a2c by 陶然

更新

parent a5ce2103
......@@ -21,6 +21,55 @@ namespace Com.Bocom.OpenApi
{
public static class Extension
{
/// <summary>
/// 获取扫码支付账户
/// </summary>
private static Dictionary<string, Account> _depositAccounts = new Dictionary<string, Account>();
public static Account GetBocomAccount(this CurrencyUnit currency)
{
(currency == CurrencyUnit.Unsupported).ThrowIfTrue("不支持的货币单位!");
var key = KiviiContext.GetUrnKey($"{currency}{Configs.mer_ptc_id}");
//var key = KiviiContext.GetUrnKey(currency.ToString());
//如果包含这个币种,直接返回
if (_depositAccounts.ContainsKey(key))
{
return _depositAccounts[key];
}
var conn = KiviiContext.GetOpenedDbConnection<Account>();
//得到所有平衡帐户,并赋值给静态变量,减少数据库操作
var depositAccount = conn.Single<Account>(o => o.Type == AccountType.Deposit && o.Currency == currency && o.SerialNumber == Configs.mer_ptc_id);
if (depositAccount != null) _depositAccounts[key] = depositAccount;
//如果从数据库中得到了,直接返回
if (_depositAccounts.ContainsKey(key))
{
return _depositAccounts[key];
}
var depositKvid = Guid.NewGuid();//new Guid($"BA1A0CE0-{currencyString}-0000-0000-000000000000");
Account rtns = new Account();
rtns.Kvid = depositKvid;
rtns.Type = AccountType.Deposit;
rtns.Currency = currency;
rtns.OwnerKvid = KiviiContext.CurrentMember.OrganizationKvid;
rtns.OwnerName = KiviiContext.CurrentMember.OrganizationName;
rtns.Name = "扫码支付账户";
rtns.SerialNumber = Configs.mer_ptc_id;
rtns.CreditLine = 999999999;
rtns.Amount = 0;
rtns.Summary = "系统扫码支付账户,自动创建,禁止操作";
rtns.Remark = "";
if (conn.Insert(rtns) == 1)
{
_depositAccounts[key] = rtns;
return rtns;
}
throw new Exception("系统创建扫码支付账户失败,请联系系统管理员。");
}
public static AddContractOrderResponseV2 RequestAddContractOrderV2(Settlement settlement, out string err)
{
if (settlement == null)
......@@ -193,7 +242,6 @@ namespace Com.Bocom.OpenApi
}
}
public static MPNG210001ResponseV1 GenerateReceiveCode(List<Settlement> settlements, string uniqueCode = null)
{
if (settlements.IsNullOrEmpty()) return null;
......@@ -332,5 +380,67 @@ namespace Com.Bocom.OpenApi
throw ex;
}
}
/// <summary>
/// 收款码支付完成,自动核销对应结算单信息
/// </summary>
/// <param name="receiveCode"></param>
public static void ReceiveCodePaied(this ReceiveCode receiveCode)
{
receiveCode.ThrowIfNull("支付信息不能为空!");
var connR = KiviiContext.GetOpenedDbConnection<ReceiveCodeDetail>();
var query = connR.From<ReceiveCodeDetail>();
query.Where(o => o.ReceiveCodeKvid == receiveCode.Kvid);
query.Select(o => new { o.BizKvid });
var bizKvids = connR.Select<Guid>(query);
if (bizKvids.IsNullOrEmpty()) return;
var conn = KiviiContext.GetOpenedDbConnection<Settlement>();
var settlements = conn.Select<Settlement>(o => Sql.In(o.Kvid, bizKvids));
if(settlements.IsNullOrEmpty()) return;
if (settlements.Exists(o => o.OffsetKvid != Guid.Empty)) return;
if (settlements.Sum(o => o.AmountPayment) >= settlements.Sum(o => o.Amount)) return;
var amountSettlement = settlements.Sum(o => o.Amount);
//var amountSettlementPlan = settlements.Sum(o => o.AmountPlan);
var amountPayed = settlements.Sum(o => o.AmountPayment);
var amountTotal = decimal.Parse(receiveCode.total_amount);
if (amountTotal != amountSettlement - amountPayed) return;
var account = CurrencyUnit.CNY.GetBocomAccount();
var accountBiz = CurrencyUnit.CNY.GetBizAccount();
var accountDetails = settlements.Paying(account, accountBiz, out var pays, amountTotal);
var trans = conn.OpenTransaction();
try
{
foreach (var item in pays)
{
conn.Insert(item);
}
accountDetails.ForEach(o => o.Insert(conn));//创建账户明细
#region 同步更新泛型Settlement表中数据
foreach (var item in settlements)
{
if (!item.OnlyProperties.IsNullOrEmpty())
{
item.Category = "扫码支付";
item.AddOnlyProperties(o => o.Category);
item.Metadata["ReceiveCode"] = receiveCode.pay_mer_tran_no;
item.AddOnlyProperties(o => o.Metadata);
conn.UpdateOnly(item);//更新了Paykvid和AmountPayment
}
}
#endregion
trans.Commit();
}
catch (Exception ex)
{
trans.Rollback();
throw ex;
}
}
}
}
......@@ -157,6 +157,11 @@ namespace Njzj.Bocoms.Openapis
if (existCode.tran_state.ToUpper() == "SUCCESS")//查出来已经成功付款了 直接返回
{
rtns.Results.Add(existCode);
var th = KiviiContext.NewThread(() =>
{
existCode.ReceiveCodePaied();
});
th.Start();
}
else//如果查出来并不是成功付款,就去调用交行接口查看返回值情况,根据返回值选择性更新当前订单信息或者订单超时支付等一些问题就要从系统中删除
{
......@@ -181,6 +186,12 @@ namespace Njzj.Bocoms.Openapis
existCode.AddOnlyProperties(o => o.tran_content);
conn.UpdateOnly(existCode);
existCode.RemoveAllOnlyProperties();
var th = KiviiContext.NewThread(() =>
{
existCode.ReceiveCodePaied();
});
th.Start();
}
else if (order.rsp_body.tran_state.ToUpper() == "PROCESS")//仍然在操作中的情况
{
......
......@@ -53,7 +53,7 @@ namespace Com.Bocom.OpenApi
/// 支付账户类型 </summary>
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @JsonProperty("account_type") private String accountType;
internal string accountType;
//internal string accountType;
public string account_type { get; set; }
/// <summary>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment