ExternalAPI_NET8/Web.Core.Services/WeChatMiniPrograms/WeChatMiniProgramsServices.cs
2026-05-21 17:23:36 +08:00

99 lines
3.7 KiB
C#

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<SellOrderProcessDTO> 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<SellOrderProcessDTO>(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<InvoiceDetailIDList>(DapperHelper.SysName.PRO, sql2, new { fi1.InvoiceNo });
if (!TarList.Any())
return new SellOrderProcessDTO();
var fi2 = new ConcurrentBag<ProduceOrderDTO>();
//引入并行计算
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<ProduceOrderDTO>(temp));
}
else
{
var temp = await SellOrderProcessCommitFuncAsync(0, tar.ProductionTaskNo);
fi2.Add(_mapper.Map<ProduceOrderDTO>(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<MDB_ProduceOrder> SellOrderProcessCommitFuncAsync(int InvoiceDetailID, int ProductionTaskNo)
{
var jsonstr = await _db.QueryFirstOrDefaultAsync<string>(DapperHelper.SysName.PRO,
"EXEC dbo.PrideUserproc_OrderProcessPushMDB @InvoiceDetailID,@ProductionTaskNo,0",
new { InvoiceDetailID, ProductionTaskNo });
return jsonstr == null
? new MDB_ProduceOrder { InvoiceDetailID = 0 }
: JsonSerializer.Deserialize<MDB_ProduceOrder>(jsonstr);
}
private int GetSortByProductionTaskName(ReadOnlySpan<char> 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; }
}
}