99 lines
3.7 KiB
C#
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; }
|
|
}
|
|
} |