using System.Collections.Concurrent; using System.Text.Json; using AutoMapper; using Web.Core.Common.Attributes; using Web.Core.Common.Dapper; using Web.Core.IServices.WeChatMiniPrograms; using Web.Core.Model.DTO; using Web.Core.Model.Entity; namespace Web.Core.Services.WeChatMiniPrograms; public class WeChatMiniProgramsServices : IWeChatMiniProgramsServices { private readonly IDapperHelper _db; private readonly IMapper _mapper; public WeChatMiniProgramsServices(IMapper mapper, IDapperHelper dapperHelper) { _mapper = mapper; _db = dapperHelper; } [Caching(AbsoluteExpiration = 7200)] //缓存秒数 public async Task SellOrderProcessQuerryAsync(string BillCoding) { var sql1 = @"SELECT a.InvoiceNo,a.BillCoding,LTRIM(RTRIM(b.NCodeName)) AS CustomerNCodeName,ISNULL(a.DispatchAddress,'') AS UserAddress,'' AS PlanDispatchDate FROM dbo.SMInvoiceHeader a INNER JOIN dbo.BDCustomer b ON b.NCodeItemID = a.CustomerNCodeID WHERE a.BDBillClassID=11 AND a.BillCoding=@BillCoding"; var fi1 = await _db.QueryFirstOrDefaultAsync(DapperHelper.SysName.PRO, sql1, new { BillCoding }); if (fi1 == null) return new SellOrderProcessDTO(); var sql2 = @"SELECT a.InvoiceDetailID,ISNULL(b.ProductionTaskNo,0) AS ProductionTaskNo FROM dbo.SMInvoiceDetail a LEFT JOIN dbo.PTProductionTask b ON b.InvoiceDetailID = a.InvoiceDetailID WHERE a.InvoiceNo=@InvoiceNo"; var TarList = await _db.QueryAsync(DapperHelper.SysName.PRO, sql2, new { fi1.InvoiceNo }); if (!TarList.Any()) return new SellOrderProcessDTO(); var fi2 = new ConcurrentBag(); //引入并行计算 await Parallel.ForEachAsync(TarList, async (tar, token) => { if (tar is { InvoiceDetailID: > 0, ProductionTaskNo: 0 }) { var temp = await SellOrderProcessCommitFuncAsync(tar.InvoiceDetailID, 0); fi2.Add(_mapper.Map(temp)); } else { var temp = await SellOrderProcessCommitFuncAsync(0, tar.ProductionTaskNo); fi2.Add(_mapper.Map(temp)); } }); var sub = fi2.ToList(); var MaxPlanEndDate = sub.Max(p => p.PlanEndDate); fi1.produceOrders = sub.OrderBy(x => x.ProductionTaskName == "" ? 1 : 0) .ThenBy(x => GetSortByProductionTaskName(x.ProductionTaskName.AsSpan())).ToList(); //已派单的在前面 fi1.PlanDispatchDate = MaxPlanEndDate >= new DateTime(2060, 12, 31) ? "" : MaxPlanEndDate.AddDays(1).ToString("yyyy-MM-dd"); //求最大日期+1天作为最终可发货日期 return fi1; } private async Task SellOrderProcessCommitFuncAsync(int InvoiceDetailID, int ProductionTaskNo) { var jsonstr = await _db.QueryFirstOrDefaultAsync(DapperHelper.SysName.PRO, "EXEC dbo.PrideUserproc_OrderProcessPushMDB @InvoiceDetailID,@ProductionTaskNo,0", new { InvoiceDetailID, ProductionTaskNo }); return jsonstr == null ? new MDB_ProduceOrder { InvoiceDetailID = 0 } : JsonSerializer.Deserialize(jsonstr); } private int GetSortByProductionTaskName(ReadOnlySpan span) { var sortBy = 0; var a = span.IndexOf("-"); if (a > 0) int.TryParse(span.Slice(a + 1), out sortBy); return sortBy; } public class InvoiceDetailIDList { public int InvoiceDetailID { get; set; } public int ProductionTaskNo { get; set; } } }