267 lines
9.2 KiB
C#
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; }
|
|
|
|
}
|
|
|
|
}
|
|
}
|