Merge branch 'S01-轨迹中台' of http://192.168.80.50:3000/Dotnet/SJZY.Track.Api into S01-轨迹中台

This commit is contained in:
moyongzhen 2024-02-28 16:22:01 +08:00
commit 87cc34b6b0
10 changed files with 148 additions and 50 deletions

View File

@ -3,6 +3,7 @@
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<NoWarn>$(NoWarn);CS1591;CS0436;NU1803</NoWarn>
<!-- <WarningsAsErrors>Nullable</WarningsAsErrors>--> <!-- <WarningsAsErrors>Nullable</WarningsAsErrors>-->
</PropertyGroup> </PropertyGroup>
</Project> </Project>

View File

@ -1,6 +1,5 @@
using SJZY.Expand.ABP.Core.Localization; using SJZY.Expand.ABP.Core.Localization;
using SJZY.Track.Application.Localization; using SJZY.Track.Application.Localization;
using SJZY.Track.Domain;
using SJZY.UserCenter.Contracts; using SJZY.UserCenter.Contracts;
using SJZY.UserCenter.SharedModel; using SJZY.UserCenter.SharedModel;
using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc;
@ -26,14 +25,11 @@ namespace SJZY.Track.Application
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
var configuration = context.Services.GetConfiguration(); var configuration = context.Services.GetConfiguration();
Configure<AbpAutoMapperOptions>(options => Configure<AbpAutoMapperOptions>(options => { options.AddMaps<ApplicationModule>(true); });
{
options.AddMaps<ApplicationModule>(true);
});
Configure<AbpAspNetCoreMvcOptions>(options => Configure<AbpAspNetCoreMvcOptions>(options =>
{ {
options.ConventionalControllers.Create(typeof(ApplicationModule).Assembly);//创建动态api options.ConventionalControllers.Create(typeof(ApplicationModule).Assembly); //创建动态api
}); });
//添加虚拟文件系统 //添加虚拟文件系统
@ -60,7 +56,6 @@ namespace SJZY.Track.Application
var configuration = context.Services.GetConfiguration(); var configuration = context.Services.GetConfiguration();
PreConfigure<AbpHttpClientBuilderOptions>(options => PreConfigure<AbpHttpClientBuilderOptions>(options =>
{ {
options.ProxyClientActions.Add(async (remoteName, serviceProvider, httpClient) => options.ProxyClientActions.Add(async (remoteName, serviceProvider, httpClient) =>
{ {
//如果设置Token,前端需要传入Token 否则引发异常 //如果设置Token,前端需要传入Token 否则引发异常
@ -70,6 +65,5 @@ namespace SJZY.Track.Application
}); });
}); });
} }
} }
} }

View File

@ -1,15 +1,31 @@
using SJZY.Track.Domain.Aggregates.OrderAggregate; using System.ComponentModel.DataAnnotations;
namespace SJZY.Track.Application.Dtos.ProvideServices; namespace SJZY.Track.Application.Dtos.ProvideServices;
public class LinkOrderInput public class LinkOrderInput
{ {
/// <summary> /// <summary>
/// false解绑,true关联,必填 /// false解绑,true关联
/// </summary> /// </summary>
[Required]
public bool IsLink { get; set; } public bool IsLink { get; set; }
public NoInfo NoInfo { get; set; } /// <summary>
/// 订单类型,必填
/// </summary>
[Required]
public int OrderType { get; set; }
public List<NoInfo> LinkedOrderInfos { get; set; } /// <summary>
/// 订单号,必填
/// </summary>
[Required]
public string OrderNo { get; set; }
[Required] public int LinkOrderType { get; set; }
/// <summary>
/// 关联的单号
/// </summary>
public List<string> LinkOrderNos { get; set; } = new();
} }

View File

@ -0,0 +1,3 @@
// Global using directives
global using SJZY.Track.Domain;

View File

@ -0,0 +1,84 @@
using SJZY.Track.Application.Dtos.ProvideServices;
using SJZY.Track.Domain.Aggregates.OrderAggregate;
namespace SJZY.Track.Application.Services.ProvideServices;
/// <summary>
/// 订单关联服务
/// </summary>
[ApiExplorerSettings(GroupName = "提供接口")]
public class OrderLinkService
{
private readonly IOrderRepository _orderRepository;
private readonly IBasicQuery<OrderLinkEntity> _orderLinkQuery;
public OrderLinkService(IBasicQuery<OrderLinkEntity> orderLinkQuery, IOrderRepository orderRepository)
{
_orderLinkQuery = orderLinkQuery;
_orderRepository = orderRepository;
}
/// <summary>
/// 关联订单
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("Order/Link")]
public async Task<bool> LinkOrderAsync(LinkOrderInput input)
{
if (!await _orderRepository.IsAnyAsync(x => x.OrderType == input.OrderType && x.OrderNo == input.OrderNo))
{
throw new BusinessException(message: $"单号:{input.OrderNo}不存在");
}
if (input.LinkOrderNos.Count < 1 || input.LinkOrderType == 0) return true;
// 单号去重
input.LinkOrderNos = input.LinkOrderNos.Distinct().ToList();
// 解绑
if (!input.IsLink) return await UnLinkOrderAsync(input);
// 关联订单
return await DoLinkOrderAsync(input);
}
private async Task<bool> DoLinkOrderAsync(LinkOrderInput input)
{
// 获取已关联的订单
var linkOrderNos = await _orderLinkQuery.GetListAsync(x =>
x.OrderType == input.OrderType && x.OrderNo == input.OrderNo && x.LinkOrderType == input.LinkOrderType,
x => x.LinkOrderNo);
// 计算出未关联的订单
var noLinkOrderNos = input.LinkOrderNos.Except(linkOrderNos);
// 过滤掉不存在的订单
var canLinkOrderNos = await _orderRepository.GetListAsync(x =>
x.OrderType == input.LinkOrderType && noLinkOrderNos.Contains(x.OrderNo),
x => x.OrderNo);
await _orderRepository.LinkOrderAsync(canLinkOrderNos.Select(x => new OrderLinkEntity
{
OrderNo = input.OrderNo,
OrderType = input.OrderType,
LinkOrderNo = x,
LinkOrderType = input.LinkOrderType
}).ToList());
return true;
}
private async Task<bool> UnLinkOrderAsync(LinkOrderInput input)
{
var unLinkIds = await _orderLinkQuery.GetListAsync(x =>
x.OrderType == input.OrderType && x.OrderNo == input.OrderNo &&
x.LinkOrderType == input.LinkOrderType && input.LinkOrderNos.Contains(x.LinkOrderNo),
x => x.Id);
// real del
await _orderRepository.UnLinkByIdsAsync(unLinkIds);
return true;
}
}

View File

@ -1,6 +1,5 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using SJZY.Track.Application.Dtos.ProvideServices; using SJZY.Track.Application.Dtos.ProvideServices;
using SJZY.Track.Domain;
using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.UserCenter.HttpApi.Services; using SJZY.UserCenter.HttpApi.Services;
@ -13,12 +12,10 @@ namespace SJZY.Track.Application.Services.ProvideServices;
public class OrderService : ApplicationService public class OrderService : ApplicationService
{ {
private readonly IOrderRepository _orderRepository; private readonly IOrderRepository _orderRepository;
private readonly IBasicQuery<OrderLinkEntity> _orderLinkQuery;
public OrderService(IOrderRepository orderRepository, IBasicQuery<OrderLinkEntity> orderLinkQuery) public OrderService(IOrderRepository orderRepository)
{ {
_orderRepository = orderRepository; _orderRepository = orderRepository;
_orderLinkQuery = orderLinkQuery;
} }
/// <summary> /// <summary>
@ -62,34 +59,4 @@ public class OrderService : ApplicationService
return true; return true;
} }
/// <summary>
/// 关联订单
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("Order/Link")]
public async Task<bool> LinkOrderAsync(LinkOrderInput input)
{
//todo:去重
var distinctOrderInfos = input.LinkedOrderInfos.Distinct().ToList();
if (await _orderRepository.IsAnyAsync(x => x.IsEqual(input.NoInfo)))
{
}
// var links = input.LinkedOrderInfos.Select(x => new OrderLinkEntity
// {
// OrderNo = x.OrderNo,
// OrderType = x.NoType
// }).ToList();
//
// foreach (var link in links)
// {
// if (await _orderLinkQuery.IsAnyAsync(x => x.))
// }
// _orderRepository.LinkOrderAsync();
return true;
}
} }

View File

@ -17,4 +17,18 @@ public interface IOrderRepository : IBasicRepository<OrderEntity>
/// <param name="templateEntities"></param> /// <param name="templateEntities"></param>
/// <returns></returns> /// <returns></returns>
Task CreateOrderTemplatesAsync(List<OrderTemplateEntity> templateEntities); Task CreateOrderTemplatesAsync(List<OrderTemplateEntity> templateEntities);
/// <summary>
/// 关联订单
/// </summary>
/// <param name="orderLinkEntities"></param>
/// <returns></returns>
Task LinkOrderAsync(List<OrderLinkEntity> orderLinkEntities);
/// <summary>
/// 解除订单关联关系
/// </summary>
/// <param name="linkIds"></param>
/// <returns></returns>
Task UnLinkByIdsAsync(List<int> linkIds);
} }

View File

@ -89,4 +89,15 @@ public struct NoInfo
[Required] [Required]
[MaxLength(100)] [MaxLength(100)]
public string OrderNo { get; set; } public string OrderNo { get; set; }
public NoInfo(int noType, string orderNo)
{
NoType = noType;
OrderNo = orderNo;
}
public override string ToString()
{
return $"[订单类型: {NoType}, 订单号: {OrderNo}]";
}
} }

View File

@ -18,4 +18,14 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
{ {
await Context.Insertable(templateEntities).ExecuteCommandAsync(); await Context.Insertable(templateEntities).ExecuteCommandAsync();
} }
public async Task LinkOrderAsync(List<OrderLinkEntity> orderLinkEntities)
{
await Context.Insertable(orderLinkEntities).ExecuteCommandAsync();
}
public async Task UnLinkByIdsAsync(List<int> linkIds)
{
await Context.Deleteable(linkIds).ExecuteCommandAsync();
}
} }

View File

@ -1,9 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<Import Project="../../common.props"/>
<PropertyGroup> <PropertyGroup>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<GenerateDocumentationFile>True</GenerateDocumentationFile> <GenerateDocumentationFile>True</GenerateDocumentationFile>
</PropertyGroup> </PropertyGroup>