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().Where(d=>d.auditstatus==1 && d.paydate d.orderid != null).GroupBy(d => d.orderid.Value).ToDictionary(d=>d.Key,d=>d.ToList()); ConcurrentDictionary depositkvs = new ConcurrentDictionary(); foreach (var deposit in depositlist) { depositkvs.TryAdd(deposit.id, deposit.payprice); } var payclesrlist= InitDB.auditDb.Queryable().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 paykvs = new ConcurrentDictionary(); 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().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 mls=new List(); List pls = new List(); List ls = new List(); List< DepositCheck > dcks=new List(); foreach (var item in depositlist) { if(item.id== 20099045) { } var depositCheck = new DepositCheck() { ids=new List(), usepriceids=new List() }; 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(); 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(); 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)},"); } } /// /// 查找关联id /// /// /// /// /// public static void getorderis(Dictionary> plistgroup, Dictionary> plistByorderid, Dictionary> depositlistgroup, ref DepositCheck depositCheck ) { var orderids = SerializeHelper.ToJson(depositCheck.usepriceids); var ids = SerializeHelper.ToJson(depositCheck.ids); foreach (var item in depositCheck.ids) { List wx_Szzyorderpays = new List(); 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_Szzyorderdeposits = new List(); 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_Szzyorderpays = new List(); 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 depositChecks) { List check_Deposit = new List(); 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 ids { get; set; } public decimal payprice { get; set; } public List usepriceids { get; set; } public decimal useprice { get; set; } } } }