SACenter/SA.AppDomain/SHCheck/CheckDeposit.cs

267 lines
9.2 KiB
C#

using SA.Core.Init;
using SA.Core.Util;
using SA.Entity.zxdcrm_audit_Models;
using SqlSugar;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
namespace SA.AppDomain.SHCheck
{
public class CheckDeposit
{
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
public static void Check()
{
wx_szzyorderdeposit wx_Szzyorderdeposit = new wx_szzyorderdeposit();
var depositlist= InitDB.auditDb.Queryable<wx_szzyorderdeposit>().Where(d=>d.auditstatus==1 && d.paydate<DateTime.Parse("2022-08-01")).ToList();
var depositlistgroup = depositlist.Where(d => d.orderid != null).GroupBy(d => d.orderid.Value).ToDictionary(d=>d.Key,d=>d.ToList());
ConcurrentDictionary<int, decimal> depositkvs = new ConcurrentDictionary<int, decimal>();
foreach (var deposit in depositlist)
{
depositkvs.TryAdd(deposit.id, deposit.payprice);
}
var payclesrlist= InitDB.auditDb.Queryable<wx_order_payclear>().Where(d => d.usedate < DateTime.Parse("2022-08-01")).GroupBy(d=>d.orderid).
Select(d=>new Pays { orderid=d.orderid.Value,payprice=SqlFunc.AggregateSum(d.useprice.Value)}).ToList();
ConcurrentDictionary<int, decimal> paykvs = new ConcurrentDictionary<int, decimal>();
logger.Debug($"payclesrlist:{payclesrlist.Count},{payclesrlist.Sum(d=>d.payprice)}");
foreach (var item in payclesrlist)
{
paykvs.TryAdd(item.orderid, item.payprice);
}
var paylist = InitDB.auditDb.Queryable<wx_szzyorderpay>().Where(d => d.auditstatus == 1&&d.depositid!=null).ToList();
var plistgroup = paylist.GroupBy(d => d.depositid.Value).ToDictionary(d => d.Key, d=>d.ToList());
var plistByorderid= paylist.GroupBy(d => d.orderid).ToDictionary(d => d.Key, d => d.ToList());
List<wx_szzyorderdeposit> mls=new List<wx_szzyorderdeposit>();
List<wx_szzyorderdeposit> pls = new List<wx_szzyorderdeposit>();
List<wx_szzyorderdeposit> ls = new List<wx_szzyorderdeposit>();
List< DepositCheck > dcks=new List<DepositCheck>();
foreach (var item in depositlist)
{
if(item.id== 20099045)
{
}
var depositCheck = new DepositCheck()
{
ids=new List<int>(),
usepriceids=new List<int>()
};
decimal p1 = 0m;
if (depositkvs.TryRemove(item.id, out p1))
{
depositCheck.ids.Add(item.id);
depositCheck.payprice = p1;
}
else
{
continue;
}
if (item.orderid.HasValue)
{
depositCheck.usepriceids.Add(item.orderid.Value);
}
depositCheck.usepriceids.Add(item.id);
getorderis(plistgroup, plistByorderid,depositlistgroup, ref depositCheck);
depositCheck.usepriceids.AddRange(depositCheck.ids);
var useids = new List<int>();
foreach (var id in depositCheck.usepriceids)
{
var amount = 0m;
if(paykvs.TryRemove(id, out amount))
{
depositCheck.useprice += amount;
useids.Add(id);
}
}
depositCheck.usepriceids = useids;
var ids = new List<int>();
ids.Add(item.id);
foreach (var deposit in depositCheck.ids)
{
decimal p2 = 0m;
if (depositkvs.TryRemove(deposit, out p2))
{
depositCheck.payprice += p2;
ids.Add(deposit);
}
}
depositCheck.ids = ids;
dcks.Add(depositCheck);
if(depositCheck.payprice== depositCheck.useprice)
{
logger.Debug($"相等:{SerializeHelper.ToJson(depositCheck)},");
}
else if (depositCheck.payprice> depositCheck.useprice)
{
logger.Debug($"剩余:{SerializeHelper.ToJson(depositCheck)},");
}
else if (depositCheck.payprice < depositCheck.useprice)
{
logger.Debug($"超出:{SerializeHelper.ToJson(depositCheck)},");
}
}
var payprice = dcks.Sum(d => d.payprice);
var useprice = dcks.Sum(d => d.useprice);
var surlist=dcks.Where(d=>d.payprice>d.useprice).ToList();
var surprice = surlist.Sum(d => d.payprice - d.useprice);
logger.Debug($"剩余结果:{SerializeHelper.ToJson(surlist)},");
var outlist= dcks.Where(d => d.payprice < d.useprice).ToList();
var outprice = outlist.Sum(d => d.useprice - d.payprice);
SaveCheckeDeposit(dcks);
foreach (var item in paykvs)
{
logger.Debug($"未匹配到:{SerializeHelper.ToJson(item)},");
}
}
/// <summary>
/// 查找关联id
/// </summary>
/// <param name="plistgroup"></param>
/// <param name="plistByorderid"></param>
/// <param name="depositlistgroup"></param>
/// <param name="depositCheck"></param>
public static void getorderis(Dictionary<int,List<wx_szzyorderpay>> plistgroup, Dictionary<int, List<wx_szzyorderpay>> plistByorderid, Dictionary<int, List<wx_szzyorderdeposit>> depositlistgroup, ref DepositCheck depositCheck )
{
var orderids = SerializeHelper.ToJson(depositCheck.usepriceids);
var ids = SerializeHelper.ToJson(depositCheck.ids);
foreach (var item in depositCheck.ids)
{
List<wx_szzyorderpay> wx_Szzyorderpays = new List<wx_szzyorderpay>();
if (plistgroup.TryGetValue(item, out wx_Szzyorderpays))
{
foreach (var pay in wx_Szzyorderpays)
{
depositCheck.usepriceids.Add(pay.orderid);
}
}
}
foreach (var item in depositCheck.usepriceids)
{
List<wx_szzyorderdeposit> wx_Szzyorderdeposits = new List<wx_szzyorderdeposit>();
if (depositlistgroup.TryGetValue(item, out wx_Szzyorderdeposits))
{
foreach (var deposit in wx_Szzyorderdeposits)
{
depositCheck.ids.Add(deposit.id);
}
}
}
foreach (var item in depositCheck.usepriceids)
{
List<wx_szzyorderpay> wx_Szzyorderpays = new List<wx_szzyorderpay>();
if (plistByorderid.TryGetValue(item, out wx_Szzyorderpays))
{
foreach (var pay in wx_Szzyorderpays)
{
if (pay.depositid.HasValue)
{
depositCheck.ids.Add(pay.depositid.Value);
}
}
}
}
depositCheck.ids = depositCheck.ids.Distinct().ToList();
depositCheck.usepriceids = depositCheck.usepriceids.Distinct().ToList();
if (ids == SerializeHelper.ToJson(depositCheck.ids) && orderids == SerializeHelper.ToJson(depositCheck.usepriceids)) return;
getorderis(plistgroup, plistByorderid, depositlistgroup, ref depositCheck);
}
public static void SaveCheckeDeposit(List<DepositCheck> depositChecks)
{
List<check_deposit> check_Deposit = new List<check_deposit>();
foreach (var item in depositChecks)
{
check_deposit deposit = new check_deposit()
{
depositid = item.ids.Max(),
depositids = String.Join(',', item.ids.ToArray()),
amount = item.payprice - item.useprice,
orderids = String.Join(',', item.usepriceids.ToArray()),
payamount = item.payprice,
useamount = item.useprice
};
check_Deposit.Add(deposit);
}
InitDB.auditDb.Insertable(check_Deposit).ExecuteCommand();
}
public class Pays
{
public int orderid { get; set; }
public decimal payprice { get; set; }
}
public class DepositCheck
{
public List<int> ids { get; set; }
public decimal payprice { get; set; }
public List<int> usepriceids { get; set; }
public decimal useprice { get; set; }
}
}
}