Browse Source

采购

updatebug
shanji 2 years ago
parent
commit
2f1c2b1b0f
  1. 1
      BBWYB.Common/BBWYB.Common.csproj
  2. 2
      BBWYB.Common/Extensions/DateTimeExtension.cs
  3. 2
      BBWYB.Common/Extensions/MapperExtension.cs
  4. 2
      BBWYB.Common/Extensions/StartupExtension.cs
  5. 2
      BBWYB.Common/Http/HttpDownloader.cs
  6. 4
      BBWYB.Common/Http/RestAPIService.cs
  7. 2
      BBWYB.Common/Models/ApiResponse.cs
  8. 2
      BBWYB.Common/Models/BusinessException.cs
  9. 2
      BBWYB.Common/Models/IDenpendency.cs
  10. 2
      BBWYB.Common/TaskSchedulers/DelayTrigger.cs
  11. 6
      BBWYB.Server.API/BBWYB.Server.API.csproj
  12. 15
      BBWYB.Server.API/Controllers/BaseApiController.cs
  13. 72
      BBWYB.Server.API/Controllers/PurchaseSchemeController.cs
  14. 33
      BBWYB.Server.API/Controllers/WeatherForecastController.cs
  15. 121
      BBWYB.Server.API/Program.cs
  16. 9
      BBWYB.Server.API/appsettings.json
  17. 7
      BBWYB.Server.Business/BBWYB.Server.Business.csproj
  18. 18
      BBWYB.Server.Business/BaseBusiness.cs
  19. 246
      BBWYB.Server.Business/PurchaseScheme/PurchaseSchemeBusiness.cs
  20. 18
      BBWYB.Server.Business/TaskSchedulerManager.cs
  21. 9
      BBWYB.Server.Model/BBWYB.Server.Model.csproj
  22. 56
      BBWYB.Server.Model/Db/PurchaseScheme/PurchaseScheme.cs
  23. 39
      BBWYB.Server.Model/Db/PurchaseScheme/Purchaser.cs
  24. 53
      BBWYB.Server.Model/Db/PurchaseScheme/Purchaseschemeproduct.cs
  25. 51
      BBWYB.Server.Model/Db/PurchaseScheme/Purchaseschemeproductsku.cs
  26. 17
      BBWYB.Server.Model/Dto/Request/PurchaseScheme/BatchCURDSchemeRequest.cs
  27. 9
      BBWYB.Server.Model/Dto/Request/PurchaseScheme/DeletePurchaseSchemeRequest.cs
  28. 7
      BBWYB.Server.Model/Dto/Request/PurchaseScheme/EditPurchaseSchemeRequest.cs
  29. 15
      BBWYB.Server.Model/Dto/Request/PurchaseScheme/InputPurchaseSchemeProductRequest.cs
  30. 15
      BBWYB.Server.Model/Dto/Request/PurchaseScheme/InputPurchaseSchemeProductSkuRequest.cs
  31. 34
      BBWYB.Server.Model/Dto/Request/PurchaseScheme/InputPurchaseSchemeRequest.cs
  32. 26
      BBWYB.Server.Model/Dto/Request/PurchaseScheme/QuerySchemeRequest.cs
  33. 16
      BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeProductResponse.cs
  34. 10
      BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeProductSkuResponse.cs
  35. 18
      BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeResponse.cs
  36. 259
      BBWYB.Server.Model/Enums.cs
  37. 2
      BBWYB.Server.Model/_MDS重新生成.bat
  38. 2
      BBWYB.Server.Model/__重新生成.bat

1
BBWYB.Common/BBWYB.Common.csproj

@ -10,6 +10,7 @@
<PackageReference Include="AutoMapper" Version="12.0.1" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="6.0.2-mauipre.1.22102.15" />
<PackageReference Include="Microsoft.Extensions.Http" Version="6.0.2-mauipre.1.22102.15" />
<PackageReference Include="NLog" Version="5.1.2" />
<PackageReference Include="Swifter.Json" Version="1.6.0.6" />
</ItemGroup>

2
BBWYB.Common/Extensions/DateTimeExtension.cs

@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
namespace BBWY.Common.Extensions
namespace BBWYB.Common.Extensions
{
public static class DateTimeExtension
{

2
BBWYB.Common/Extensions/MapperExtension.cs

@ -1,7 +1,7 @@
using AutoMapper;
using Microsoft.Extensions.DependencyInjection;
namespace BBWY.Common.Extensions
namespace BBWYB.Common.Extensions
{
public static class MapperExtension
{

2
BBWYB.Common/Extensions/StartupExtension.cs

@ -4,7 +4,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace BBWY.Common.Extensions
namespace BBWYB.Common.Extensions
{
public static class StartupExtension
{

2
BBWYB.Common/Http/HttpDownloader.cs

@ -4,7 +4,7 @@ using System.Net;
using System.Net.Http;
using System.Threading;
namespace BBWY.Common.Http
namespace BBWYB.Common.Http
{
/// <summary>
/// Http下载器

4
BBWYB.Common/Http/RestAPIService.cs

@ -1,10 +1,10 @@
using BBWY.Common.Extensions;
using BBWYB.Common.Extensions;
using Swifter.Json;
using System.Net;
using System.Net.Http.Headers;
using System.Text;
namespace BBWY.Common.Http
namespace BBWYB.Common.Http
{
public class RestApiService
{

2
BBWYB.Common/Models/ApiResponse.cs

@ -1,6 +1,6 @@
using System;
namespace BBWY.Common.Models
namespace BBWYB.Common.Models
{
public class ApiResponse<T>
{

2
BBWYB.Common/Models/BusinessException.cs

@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Text;
namespace BBWY.Common.Models
namespace BBWYB.Common.Models
{
/// <summary>
/// 业务异常

2
BBWYB.Common/Models/IDenpendency.cs

@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Text;
namespace BBWY.Common.Models
namespace BBWYB.Common.Models
{
public interface IDenpendency
{

2
BBWYB.Common/TaskSchedulers/DelayTrigger.cs

@ -2,7 +2,7 @@
using System.Threading;
using System.Threading.Tasks;
namespace BBWY.Common.Trigger
namespace BBWYB.Common.Trigger
{
/// <summary>
/// 延迟触发组件

6
BBWYB.Server.API/BBWYB.Server.API.csproj

@ -4,14 +4,20 @@
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<GenerateDocumentationFile>True</GenerateDocumentationFile>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="FreeSql" Version="3.2.690" />
<PackageReference Include="FreeSql.Provider.MySql" Version="3.2.690" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.14" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
<PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\BBWYB.Common\BBWYB.Common.csproj" />
<ProjectReference Include="..\BBWYB.Server.Business\BBWYB.Server.Business.csproj" />
</ItemGroup>
</Project>

15
BBWYB.Server.API/Controllers/BaseApiController.cs

@ -0,0 +1,15 @@
using Microsoft.AspNetCore.Mvc;
namespace BBWYB.Server.API.Controllers
{
[Produces("application/json")]
[Route("Api/[Controller]/[Action]")]
[ApiController]
public class BaseApiController : ControllerBase
{
protected IHttpContextAccessor httpContextAccessor;
public BaseApiController(IHttpContextAccessor httpContextAccessor)
{
this.httpContextAccessor = httpContextAccessor;
}
}
}

72
BBWYB.Server.API/Controllers/PurchaseSchemeController.cs

@ -0,0 +1,72 @@
using BBWYB.Server.Business;
using BBWYB.Server.Model.Db;
using BBWYB.Server.Model.Dto;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace BBWYB.Server.API.Controllers
{
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public class PurchaseSchemeController : BaseApiController
{
private PurchaseSchemeBusiness purchaseSchemeBusiness;
public PurchaseSchemeController(PurchaseSchemeBusiness purchaseSchemeBusiness, IHttpContextAccessor httpContextAccessor) : base(httpContextAccessor)
{
this.purchaseSchemeBusiness = purchaseSchemeBusiness;
}
/// <summary>
/// 添加/编辑采购商
/// </summary>
/// <param name="batchCURDSchemeRequest"></param>
[HttpPost]
public void EditPurchaseScheme([FromBody] BatchCURDSchemeRequest batchCURDSchemeRequest)
{
purchaseSchemeBusiness.EditPurchaseScheme(batchCURDSchemeRequest);
}
/// <summary>
/// 根据产品Id批量查询采购商列表
/// </summary>
/// <param name="querySchemeRequest"></param>
/// <returns></returns>
[HttpPost]
public IList<PurchaseSchemeResponse> GetPurchaseSchemeList([FromBody] QuerySchemeRequest querySchemeRequest)
{
return purchaseSchemeBusiness.GetPurchaseSchemeList(querySchemeRequest);
}
/// <summary>
/// 删除采购商
/// </summary>
/// <param name="deletePurchaseSchemeRequest"></param>
[HttpDelete]
public void DeletePurchaser([FromBody] DeletePurchaseSchemeRequest deletePurchaseSchemeRequest)
{
purchaseSchemeBusiness.DeletePurchaser(deletePurchaseSchemeRequest);
}
/// <summary>
/// 删除采购方案
/// </summary>
/// <param name="schemeId"></param>
[HttpDelete("{schemeId}")]
public void DeletePurchaseScheme([FromRoute] long schemeId)
{
purchaseSchemeBusiness.DeletePurchaseScheme(schemeId);
}
/// <summary>
/// 查询共有采购商
/// </summary>
/// <param name="querySchemeRequest"></param>
/// <returns></returns>
[HttpPost]
public IList<Purchaser> GetSharePurchaser([FromBody] QuerySchemeRequest querySchemeRequest)
{
return purchaseSchemeBusiness.GetSharePurchaser(querySchemeRequest);
}
}
}

33
BBWYB.Server.API/Controllers/WeatherForecastController.cs

@ -1,33 +0,0 @@
using Microsoft.AspNetCore.Mvc;
namespace BBWYB.Server.API.Controllers
{
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}
}

121
BBWYB.Server.API/Program.cs

@ -1,25 +1,124 @@
using BBWYB.Common.Http;
using BBWYB.Common.Log;
using BBWYB.Server.Business;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using System.Reflection;
using System.Text;
using Yitter.IdGenerator;
var builder = WebApplication.CreateBuilder(args);
var services = builder.Services;
var configuration = builder.Configuration;
services.AddMemoryCache();
var idOption = new IdGeneratorOptions(1);
var idGenerator = new DefaultIdGenerator(idOption);
services.AddSingleton(typeof(IIdGenerator), idGenerator);
// Add services to the container.
//var fsql = new FreeSql.FreeSqlBuilder().UseConnectionString(FreeSql.DataType.MySql, configuration.GetConnectionString("DB")).Build();
//services.AddSingleton(typeof(IFreeSql), fsql);
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
services.AddSingleton<NLogManager>();
services.AddSingleton<RestApiService>();
services.AddSingleton<TaskSchedulerManager>();
services.AddMemoryCache();
services.AddControllers();
services.AddHttpContextAccessor();
services.AddHttpClient();
services.AddCors(options =>
{
options.AddPolicy("cors", p =>
{
p.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
});
});
services.AddControllers();
services.AddEndpointsApiExplorer();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo
{
Version = "v1.0.0",
Title = "步步为盈B端API",
Description = "注意事项\r\n1.返回参数名称采用大驼峰命名\r\n2.ApiResponse为基础返回对象(Code,Data,Message),接口中所有的返回值均属于Data属性\r\n3.正常返回Code=200"
});
//JWT认证
c.AddSecurityDefinition(JwtBearerDefaults.AuthenticationScheme, new OpenApiSecurityScheme
{
Scheme = JwtBearerDefaults.AuthenticationScheme,
BearerFormat = "JWT",
Type = SecuritySchemeType.ApiKey,
Name = "Authorization",
In = ParameterLocation.Header,
Description = "Authorization:Bearer {your JWT token}<br/>",
});
c.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme{Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = JwtBearerDefaults.AuthenticationScheme
}
},
new string[] { }
}
});
var executingAssembly = Assembly.GetExecutingAssembly();
var assemblyNames = executingAssembly.GetReferencedAssemblies().Union(new AssemblyName[] { executingAssembly.GetName() }).ToArray();
Array.ForEach(assemblyNames, (assemblyName) =>
{
//var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlFile = $"{assemblyName.Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
if (!File.Exists(xmlPath))
return;
c.IncludeXmlComments(xmlPath, true);
});
});
var secret = configuration.GetSection("Secret").Value;
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, x =>
{
x.SaveToken = true;
x.RequireHttpsMetadata = false;
x.TokenValidationParameters = new TokenValidationParameters()
{
ClockSkew = TimeSpan.Zero,
ValidateIssuerSigningKey = true,
ValidateIssuer = false,
ValidateAudience = false,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret)),
//ValidIssuer = issuer,
//ValidAudience = audience,
//ValidateLifetime = true
};
});
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
//yunDingBusiness.RefreshKey();
var isAllowedSwagger = configuration.GetValue<bool>("AllowedSwagger");
if (isAllowedSwagger)
{
app.UseSwagger();
app.UseSwaggerUI();
app.UseSwagger(c => c.SerializeAsV2 = true)
.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "BBWYB API");
c.RoutePrefix = string.Empty;
});
}
app.UseHttpsRedirection();
//app.UseHttpsRedirection();
app.UseRouting();
app.UseCors("cors");
app.UseAuthorization();
app.MapControllers();
app.Run();

9
BBWYB.Server.API/appsettings.json

@ -5,5 +5,12 @@
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
"AllowedHosts": "*",
"ConnectionStrings": {
//"DB": "data source=rm-bp1508okrh23710yfao.mysql.rds.aliyuncs.com;port=3306;user id=qyroot;password=kaicn1132+-;initial catalog=bbwy;charset=utf8;sslmode=none;"
"DB": "data source=rm-bp1508okrh23710yfao.mysql.rds.aliyuncs.com;port=3306;user id=qyroot;password=kaicn1132+-;initial catalog=bbwy_test;charset=utf8;sslmode=none;",
"MDSDB": "data source=rm-bp1508okrh23710yfao.mysql.rds.aliyuncs.com;port=3306;user id=qyroot;password=kaicn1132+-;initial catalog=mds;charset=utf8;sslmode=none;"
},
"AllowedSwagger": true,
"Secret": "D96BFA5B-F2AF-45BC-9342-5A55C3F9BBB0"
}

7
BBWYB.Server.Business/BBWYB.Server.Business.csproj

@ -4,8 +4,15 @@
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<GenerateDocumentationFile>True</GenerateDocumentationFile>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="FreeSql" Version="3.2.690" />
<PackageReference Include="FreeSql.Provider.MySql" Version="3.2.690" />
<PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\BBWYB.Common\BBWYB.Common.csproj" />
<ProjectReference Include="..\BBWYB.Server.Model\BBWYB.Server.Model.csproj" />

18
BBWYB.Server.Business/BaseBusiness.cs

@ -0,0 +1,18 @@
using BBWYB.Common.Log;
using Yitter.IdGenerator;
namespace BBWYB.Server.Business
{
public class BaseBusiness
{
protected IFreeSql fsql;
protected NLogManager nLogManager;
protected IIdGenerator idGenerator;
public BaseBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator)
{
this.fsql = fsql;
this.nLogManager = nLogManager;
this.idGenerator = idGenerator;
}
}
}

246
BBWYB.Server.Business/PurchaseScheme/PurchaseSchemeBusiness.cs

@ -0,0 +1,246 @@
using BBWYB.Common.Extensions;
using BBWYB.Common.Log;
using BBWYB.Common.Models;
using BBWYB.Server.Model.Db;
using BBWYB.Server.Model.Dto;
using Yitter.IdGenerator;
namespace BBWYB.Server.Business
{
public class PurchaseSchemeBusiness : BaseBusiness, IDenpendency
{
public PurchaseSchemeBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator) : base(fsql, nLogManager, idGenerator) { }
private void ExtractNewPurchaser<T>(IList<T> purchaserSchemeList, IList<Purchaser> addPurchaserList) where T : InputPurchaseSchemeRequest
{
var reqeustPurchaserIdList = purchaserSchemeList.Select(s => s.PurchaserId).Distinct().ToList();
var existPurchaserIdList = fsql.Select<Purchaser>().Where(p => reqeustPurchaserIdList.Contains(p.Id)).ToList(p => p.Id);
var newPurchaserIdList = reqeustPurchaserIdList.Except(existPurchaserIdList);
foreach (var scheme in purchaserSchemeList)
{
if (newPurchaserIdList.Any(p => p == scheme.PurchaserId) && !addPurchaserList.Any(p => p.Id == scheme.PurchaserId))
{
addPurchaserList.Add(new Purchaser()
{
Id = scheme.PurchaserId,
Name = scheme.PurchaserName,
Location = scheme.PurchaserLocation,
Platform = scheme.PurchasePlatform
});
}
}
}
public void EditPurchaseScheme(BatchCURDSchemeRequest batchCURDSchemeRequest)
{
if (batchCURDSchemeRequest.EditPurchaseSchemeList.Count == 0 && batchCURDSchemeRequest.AddPurchaseSchemeList.Count == 0)
throw new BusinessException("非法参数");
if (batchCURDSchemeRequest.AddPurchaseSchemeList.Any(p => string.IsNullOrEmpty(p.PurchaserId) ||
string.IsNullOrEmpty(p.PurchaserName)))
throw new BusinessException("新增方案中有采购商Id/Name/Location为空");
if (batchCURDSchemeRequest.AddPurchaseSchemeList.Any(p => string.IsNullOrEmpty(p.PurchaserId) ||
string.IsNullOrEmpty(p.PurchaserName)))
throw new BusinessException("编辑方案中有采购商Id/Name/Location为空");
List<PurchaseScheme> addPurchaseSchemeList = null;
List<PurchaseSchemeProduct> addPurchaseSchemeProductList = new List<PurchaseSchemeProduct>();
List<PurchaseSchemeProductSku> addPurchaseSchemeProductSkuList = new List<PurchaseSchemeProductSku>();
List<Purchaser> newPurchaserList = new List<Purchaser>();
List<long> deletePurchaseSchemeIdList = new List<long>();
#region 新增采购方案
if (batchCURDSchemeRequest.AddPurchaseSchemeList.Count > 0)
{
ExtractNewPurchaser(batchCURDSchemeRequest.AddPurchaseSchemeList, newPurchaserList);
addPurchaseSchemeList = batchCURDSchemeRequest.AddPurchaseSchemeList.Map<List<PurchaseScheme>>();
foreach (var scheme in addPurchaseSchemeList)
{
scheme.Id = idGenerator.NewLong();
scheme.CreateTime = DateTime.Now;
foreach (var purchaseProduct in scheme.PurchaseSchemeProductList)
{
purchaseProduct.Id = idGenerator.NewLong();
purchaseProduct.CreateTime = DateTime.Now;
purchaseProduct.SkuPurchaseSchemeId = scheme.Id;
foreach (var purchaseProductSku in purchaseProduct.PurchaseSchemeProductSkuList)
{
purchaseProductSku.Id = idGenerator.NewLong();
purchaseProductSku.CreateTime = DateTime.Now;
purchaseProductSku.SkuPurchaseSchemeId = scheme.Id;
}
addPurchaseSchemeProductSkuList.AddRange(purchaseProduct.PurchaseSchemeProductSkuList);
}
addPurchaseSchemeProductList.AddRange(scheme.PurchaseSchemeProductList);
}
}
#endregion
#region 更新采购方案
if (batchCURDSchemeRequest.EditPurchaseSchemeList.Count > 0)
{
//ExtractNewPurchaser(batchCURDSchemeRequest.EditPurchaseSchemeList, newPurchaserList);
deletePurchaseSchemeIdList.AddRange(batchCURDSchemeRequest.EditPurchaseSchemeList.Select(ps => ps.Id));
var editPurchaseSchemeList = batchCURDSchemeRequest.EditPurchaseSchemeList.Map<List<Model.Db.PurchaseScheme>>();
foreach (var scheme in editPurchaseSchemeList)
{
foreach (var purchaseProduct in scheme.PurchaseSchemeProductList)
{
purchaseProduct.Id = idGenerator.NewLong();
purchaseProduct.CreateTime = DateTime.Now;
purchaseProduct.SkuPurchaseSchemeId = scheme.Id;
foreach (var purchaseProductSku in purchaseProduct.PurchaseSchemeProductSkuList)
{
purchaseProductSku.Id = idGenerator.NewLong();
purchaseProductSku.CreateTime = DateTime.Now;
purchaseProductSku.SkuPurchaseSchemeId = scheme.Id;
}
addPurchaseSchemeProductSkuList.AddRange(purchaseProduct.PurchaseSchemeProductSkuList);
}
addPurchaseSchemeProductList.AddRange(scheme.PurchaseSchemeProductList);
}
}
#endregion
fsql.Transaction(() =>
{
if (newPurchaserList.Count > 0)
fsql.Insert(newPurchaserList).ExecuteAffrows();
//更新,删除已存在的采购方案商品和Sku
if (deletePurchaseSchemeIdList.Count > 0)
{
fsql.Delete<PurchaseSchemeProduct>().Where(p => deletePurchaseSchemeIdList.Contains(p.SkuPurchaseSchemeId)).ExecuteAffrows();
fsql.Delete<PurchaseSchemeProductSku>().Where(p => deletePurchaseSchemeIdList.Contains(p.SkuPurchaseSchemeId)).ExecuteAffrows();
}
//新增
if (addPurchaseSchemeList != null && addPurchaseSchemeList.Count > 0)
fsql.Insert(addPurchaseSchemeList).ExecuteAffrows();
if (addPurchaseSchemeProductList.Count > 0)
fsql.Insert(addPurchaseSchemeProductList).ExecuteAffrows();
if (addPurchaseSchemeProductSkuList.Count > 0)
fsql.Insert(addPurchaseSchemeProductSkuList).ExecuteAffrows();
});
}
/// <summary>
/// 获取采购方案
/// </summary>
/// <param name="querySchemeRequest"></param>
/// <returns></returns>
public IList<PurchaseSchemeResponse> GetPurchaseSchemeList(QuerySchemeRequest querySchemeRequest)
{
var select = fsql.Select<PurchaseScheme, Purchaser>().InnerJoin((ps, p) => ps.PurchaserId == p.Id);
if (querySchemeRequest.SchemeId != null && querySchemeRequest.SchemeId != 0)
select = select.Where((ps, p) => ps.Id == querySchemeRequest.SchemeId);
else
{
select = select.WhereIf(querySchemeRequest.ShopId != null && querySchemeRequest.ShopId != 0, (ps, p) => ps.ShopId == querySchemeRequest.ShopId)
.WhereIf(querySchemeRequest.SkuIdList != null && querySchemeRequest.SkuIdList.Count() > 0, (ps, p) => querySchemeRequest.SkuIdList.Contains(ps.SkuId))
.WhereIf(!string.IsNullOrEmpty(querySchemeRequest.PurchaserId), (ps, p) => ps.PurchaserId == querySchemeRequest.PurchaserId)
.WhereIf(querySchemeRequest.PurchasePlatform != null, (ps, p) => ps.PurchasePlatform == querySchemeRequest.PurchasePlatform);
}
var purchaseSchemeList = select.ToList((ps, p) => new PurchaseSchemeResponse
{
Id = ps.Id,
ProductId = ps.ProductId,
SkuId = ps.SkuId,
ShopId = ps.ShopId,
PurchaserId = p.Id,
PurchaserName = p.Name,
PurchaserLocation = p.Location,
DefaultCost = ps.DefaultCost,
RealCost = ps.RealCost,
CreateTime = ps.CreateTime,
PurchasePlatform = ps.PurchasePlatform
});
if (purchaseSchemeList.Count > 0)
{
var purchaseSchemeIdList = purchaseSchemeList.Select(p => p.Id).ToList();
var purchaseSchemeProductList = fsql.Select<PurchaseSchemeProduct>().Where(p => purchaseSchemeIdList.Contains(p.SkuPurchaseSchemeId))
.ToList().Map<List<PurchaseSchemeProductResponse>>();
var purchaseSchemeProductSkuList = fsql.Select<PurchaseSchemeProductSku>().Where(p => purchaseSchemeIdList.Contains(p.SkuPurchaseSchemeId))
.ToList().Map<List<PurchaseSchemeProductSkuResponse>>();
foreach (var scheme in purchaseSchemeList)
{
var schemeProductList = purchaseSchemeProductList.Where(ps => ps.SkuPurchaseSchemeId == scheme.Id);
if (schemeProductList.Count() > 0)
{
scheme.PurchaseSchemeProductList.AddRange(schemeProductList);
foreach (var schemeProduct in schemeProductList)
{
var schemeProductSkuList = purchaseSchemeProductSkuList.Where(psk => psk.SkuPurchaseSchemeId == scheme.Id &&
psk.PurchaseProductId == schemeProduct.PurchaseProductId);
if (schemeProductSkuList.Count() > 0)
schemeProduct.PurchaseSchemeProductSkuList.AddRange(schemeProductSkuList);
}
}
}
}
return purchaseSchemeList;
}
/// <summary>
/// 获取共同拥有的采购商
/// </summary>
/// <param name="querySchemeRequest"></param>
/// <returns></returns>
public IList<Purchaser> GetSharePurchaser(QuerySchemeRequest querySchemeRequest)
{
var skuCount = querySchemeRequest.SkuIdList.Count();
var purchaseSchemeList = fsql.Select<PurchaseScheme, Purchaser>().InnerJoin((ps, p) => ps.PurchaserId == p.Id)
.Where((ps, p) => ps.ShopId == querySchemeRequest.ShopId)
.Where((ps, p) => querySchemeRequest.SkuIdList.Contains(ps.SkuId))
.ToList();
if (purchaseSchemeList.Count() == 0)
return null;
var group = purchaseSchemeList.GroupBy(p => p.PurchaserId);
var sharePurchaserIdList = new List<string>();
foreach (var g in group)
{
if (g.Count() == skuCount)
sharePurchaserIdList.Add(g.Key);
}
if (sharePurchaserIdList.Count == 0)
return null;
return fsql.Select<Purchaser>().Where(p => sharePurchaserIdList.Contains(p.Id)).ToList();
}
public void DeletePurchaser(DeletePurchaseSchemeRequest deletePurchaseSchemeRequest)
{
var purchaseSchemeIdList = fsql.Select<PurchaseScheme>().Where(ps => ps.ProductId == deletePurchaseSchemeRequest.ProductId &&
ps.PurchaserId == deletePurchaseSchemeRequest.PurchaserId).ToList(ps => ps.Id);
fsql.Transaction(() =>
{
fsql.Delete<PurchaseScheme>(purchaseSchemeIdList).ExecuteAffrows();
fsql.Delete<PurchaseSchemeProduct>().Where(psp => purchaseSchemeIdList.Contains(psp.SkuPurchaseSchemeId)).ExecuteAffrows();
fsql.Delete<PurchaseSchemeProductSku>().Where(psps => purchaseSchemeIdList.Contains(psps.SkuPurchaseSchemeId)).ExecuteAffrows();
});
}
public void DeletePurchaseScheme(long schemeId)
{
fsql.Transaction(() =>
{
fsql.Delete<PurchaseScheme>(schemeId).ExecuteAffrows();
fsql.Delete<PurchaseSchemeProduct>().Where(p => p.SkuPurchaseSchemeId == schemeId).ExecuteAffrows();
fsql.Delete<PurchaseSchemeProductSku>().Where(p => p.SkuPurchaseSchemeId == schemeId).ExecuteAffrows();
});
}
}
}

18
BBWYB.Server.Business/TaskSchedulerManager.cs

@ -0,0 +1,18 @@
using System.Threading.Tasks.Schedulers;
namespace BBWYB.Server.Business
{
public class TaskSchedulerManager
{
public LimitedConcurrencyLevelTaskScheduler SyncOrderTaskScheduler { get; private set; }
public LimitedConcurrencyLevelTaskScheduler PurchaseOrderCallbackTaskScheduler { get; private set; }
public TaskSchedulerManager()
{
SyncOrderTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(10);
PurchaseOrderCallbackTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(10);
}
}
}

9
BBWYB.Server.Model/BBWYB.Server.Model.csproj

@ -4,6 +4,15 @@
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<GenerateDocumentationFile>True</GenerateDocumentationFile>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="FreeSql" Version="3.2.690" />
</ItemGroup>
<ItemGroup>
<Folder Include="Db\MDS\" />
</ItemGroup>
</Project>

56
BBWYB.Server.Model/Db/PurchaseScheme/PurchaseScheme.cs

@ -0,0 +1,56 @@
using FreeSql.DataAnnotations;
using System;
using System.Collections.Generic;
namespace BBWYB.Server.Model.Db
{
/// <summary>
/// Sku采购方案表
/// </summary>
[Table(Name = "purchasescheme", DisableSyncStructure = true)]
public partial class PurchaseScheme
{
/// <summary>
/// Sku采购方案Id
/// </summary>
[Column(IsPrimary = true)]
public long Id { get; set; }
[Column(DbType = "datetime")]
public DateTime? CreateTime { get; set; }
/// <summary>
/// 采购默认成本
/// </summary>
public decimal DefaultCost { get; set; } = 0.0M;
[Column(StringLength = 50, IsNullable = false)]
public string ProductId { get; set; }
/// <summary>
/// 采购商Id
/// </summary>
[Column(StringLength = 20)]
public string PurchaserId { get; set; }
/// <summary>
/// 采购实际成本
/// </summary>
public decimal RealCost { get; set; } = 0.0M;
[Column(StringLength = 50, IsNullable = false)]
public string SkuId { get; set; }
public long ShopId { get; set; }
[Column(MapType = typeof(int), DbType = "int(1)")]
public Enums.Platform PurchasePlatform { get; set; }
[Column(IsIgnore = true)]
public List<PurchaseSchemeProduct> PurchaseSchemeProductList { get; set; }
}
}

39
BBWYB.Server.Model/Db/PurchaseScheme/Purchaser.cs

@ -0,0 +1,39 @@
using FreeSql.DataAnnotations;
namespace BBWYB.Server.Model.Db
{
/// <summary>
/// 采购商表
/// </summary>
[Table(Name = "purchaser", DisableSyncStructure = true)]
public partial class Purchaser
{
/// <summary>
/// 采购商Id
/// </summary>
[Column(StringLength = 20, IsPrimary = true, IsNullable = false)]
public string Id { get; set; }
/// <summary>
/// 采购商名称
/// </summary>
[Column(StringLength = 50)]
public string Name { get; set; }
/// <summary>
/// 发货地
/// </summary>
[Column(StringLength = 50)]
public string Location { get; set; }
/// <summary>
/// 采购平台
/// </summary>
[Column(MapType = typeof(int?))]
public Enums.Platform? Platform { get; set; }
}
}

53
BBWYB.Server.Model/Db/PurchaseScheme/Purchaseschemeproduct.cs

@ -0,0 +1,53 @@
using FreeSql.DataAnnotations;
using System;
using System.Collections.Generic;
namespace BBWYB.Server.Model.Db
{
/// <summary>
/// 采购方案商品表
/// </summary>
[Table(Name = "purchaseschemeproduct", DisableSyncStructure = true)]
public partial class PurchaseSchemeProduct
{
/// <summary>
/// 采购商品和采购方案的关系Id
/// </summary>
[Column(IsPrimary = true)]
public long Id { get; set; }
[Column(DbType = "datetime")]
public DateTime? CreateTime { get; set; }
[Column(StringLength = 50, IsNullable = false)]
public string ProductId { get; set; }
/// <summary>
/// 采购商品Id
/// </summary>
[Column(StringLength = 50, IsNullable = false)]
public string PurchaseProductId { get; set; }
/// <summary>
/// 采购商品链接
/// </summary>
[Column(StringLength = 100)]
public string PurchaseUrl { get; set; }
[Column(StringLength = 50, IsNullable = false)]
public string SkuId { get; set; }
/// <summary>
/// Sku采购方案Id
/// </summary>
public long SkuPurchaseSchemeId { get; set; }
[Column(IsIgnore = true)]
public List<PurchaseSchemeProductSku> PurchaseSchemeProductSkuList { get; set; }
}
}

51
BBWYB.Server.Model/Db/PurchaseScheme/Purchaseschemeproductsku.cs

@ -0,0 +1,51 @@
using FreeSql.DataAnnotations;
using System;
namespace BBWYB.Server.Model.Db
{
[Table(Name = "purchaseschemeproductsku", DisableSyncStructure = true)]
public partial class PurchaseSchemeProductSku
{
/// <summary>
/// 采购商品的SKU和采购方案的关系Id
/// </summary>
[Column(IsPrimary = true)]
public long Id { get; set; }
[Column(DbType = "datetime")]
public DateTime? CreateTime { get; set; }
[Column(StringLength = 50, IsNullable = false)]
public string ProductId { get; set; }
/// <summary>
/// 采购商品Id
/// </summary>
[Column(StringLength = 50, IsNullable = false)]
public string PurchaseProductId { get; set; }
/// <summary>
/// 采购商品的SkuId
/// </summary>
[Column(StringLength = 50)]
public string PurchaseSkuId { get; set; }
/// <summary>
/// 采购商品Sku的SpecId
/// </summary>
[Column(StringLength = 50)]
public string PurchaseSkuSpecId { get; set; }
[Column(StringLength = 50, IsNullable = false)]
public string SkuId { get; set; }
/// <summary>
/// Sku采购方案Id
/// </summary>
public long SkuPurchaseSchemeId { get; set; }
}
}

17
BBWYB.Server.Model/Dto/Request/PurchaseScheme/BatchCURDSchemeRequest.cs

@ -0,0 +1,17 @@
using System.Collections.Generic;
namespace BBWYB.Server.Model.Dto
{
public class BatchCURDSchemeRequest
{
/// <summary>
/// 需要修改的采购方案
/// </summary>
public IList<EditPurchaseSchemeRequest> EditPurchaseSchemeList { get; set; }
/// <summary>
/// 需要新增的采购方案
/// </summary>
public IList<InputPurchaseSchemeRequest> AddPurchaseSchemeList { get; set; }
}
}

9
BBWYB.Server.Model/Dto/Request/PurchaseScheme/DeletePurchaseSchemeRequest.cs

@ -0,0 +1,9 @@
namespace BBWYB.Server.Model.Dto
{
public class DeletePurchaseSchemeRequest
{
public string ProductId { get; set; }
public string PurchaserId { get; set; }
}
}

7
BBWYB.Server.Model/Dto/Request/PurchaseScheme/EditPurchaseSchemeRequest.cs

@ -0,0 +1,7 @@
namespace BBWYB.Server.Model.Dto
{
public class EditPurchaseSchemeRequest: InputPurchaseSchemeRequest
{
public long Id { get; set; }
}
}

15
BBWYB.Server.Model/Dto/Request/PurchaseScheme/InputPurchaseSchemeProductRequest.cs

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace BBWYB.Server.Model.Dto
{
public class InputPurchaseSchemeProductRequest
{
public string ProductId { get; set; }
public string SkuId { get; set; }
public string PurchaseProductId { get; set; }
public string PurchaseUrl { get; set; }
public IList<InputPurchaseSchemeProductSkuRequest> PurchaseSchemeProductSkuList { get; set; }
}
}

15
BBWYB.Server.Model/Dto/Request/PurchaseScheme/InputPurchaseSchemeProductSkuRequest.cs

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace BBWYB.Server.Model.Dto
{
public class InputPurchaseSchemeProductSkuRequest
{
public string ProductId { get; set; }
public string SkuId { get; set; }
public string PurchaseProductId { get; set; }
public string PurchaseSkuId { get; set; }
public string PurchaseSkuSpecId { get; set; }
}
}

34
BBWYB.Server.Model/Dto/Request/PurchaseScheme/InputPurchaseSchemeRequest.cs

@ -0,0 +1,34 @@
using System.Collections.Generic;
namespace BBWYB.Server.Model.Dto
{
public class InputPurchaseSchemeRequest
{
public string ShopId { get; set; }
public string ProductId { get; set; }
public string SkuId { get; set; }
/// <summary>
/// 采购默认成本
/// </summary>
public decimal? DefaultCost { get; set; }
/// <summary>
/// 采购实际成本
/// </summary>
public decimal? RealCost { get; set; }
/// <summary>
/// 采购商Id
/// </summary>
public string PurchaserId { get; set; }
public string PurchaserName { get; set; }
/// <summary>
/// 采购商发货地
/// </summary>
public string PurchaserLocation { get; set; }
/// <summary>
/// 采购平台
/// </summary>
public Enums.Platform PurchasePlatform { get; set; } = Enums.Platform.;
public IList<InputPurchaseSchemeProductRequest> PurchaseSchemeProductList { get; set; }
}
}

26
BBWYB.Server.Model/Dto/Request/PurchaseScheme/QuerySchemeRequest.cs

@ -0,0 +1,26 @@
using System.Collections.Generic;
namespace BBWYB.Server.Model.Dto
{
public class QuerySchemeRequest
{
/// <summary>
/// 采购方案Id
/// </summary>
public long? SchemeId { get; set; }
public long? ShopId { get; set; }
public IList<string> SkuIdList { get; set; }
/// <summary>
/// 采购商Id, 可空
/// </summary>
public string PurchaserId { get; set; }
/// <summary>
/// 采购平台
/// </summary>
public Enums.Platform? PurchasePlatform { get; set; }
}
}

16
BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeProductResponse.cs

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace BBWYB.Server.Model.Dto
{
public class PurchaseSchemeProductResponse : Model.Db.PurchaseSchemeProduct
{
public new List<PurchaseSchemeProductSkuResponse> PurchaseSchemeProductSkuList { get; set; }
public PurchaseSchemeProductResponse()
{
PurchaseSchemeProductSkuList = new List<PurchaseSchemeProductSkuResponse>();
}
}
}

10
BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeProductSkuResponse.cs

@ -0,0 +1,10 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace BBWYB.Server.Model.Dto
{
public class PurchaseSchemeProductSkuResponse : Model.Db.PurchaseSchemeProductSku
{
}
}

18
BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeResponse.cs

@ -0,0 +1,18 @@
using System.Collections.Generic;
namespace BBWYB.Server.Model.Dto
{
public class PurchaseSchemeResponse : Model.Db.PurchaseScheme
{
public string PurchaserName { get; set; }
public string PurchaserLocation { get; set; }
public new List<PurchaseSchemeProductResponse> PurchaseSchemeProductList { get; set; }
public PurchaseSchemeResponse()
{
PurchaseSchemeProductList = new List<PurchaseSchemeProductResponse>();
}
}
}

259
BBWYB.Server.Model/Enums.cs

@ -0,0 +1,259 @@
namespace BBWYB.Server.Model
{
public class Enums
{
/// <summary>
/// 电商平台
/// </summary>
public enum Platform
{
= 0,
= 1,
= 2,
= 3,
= 4,
= 10
}
/// <summary>
/// 采购方式
/// </summary>
public enum PurchaseMethod
{
线 = 0,
线 = 1
}
/// <summary>
/// 采购单模式
/// </summary>
public enum PurchaseOrderMode
{
= 0,
= 1
}
/// <summary>
/// 仓储类型
/// </summary>
public enum StorageType
{
= 0,
= 1,
= 2,
= 3,
SD = 4
}
/// <summary>
/// 订单类型
/// </summary>
public enum OrderType
{
#region JD订单类型
SOP = 22,
LOC = 75,
FBP = 21
#endregion
}
/// <summary>
/// 支付方式
/// </summary>
public enum PayType
{
= 1,
= 2,
= 3,
线 = 4,
= 5,
= 6
}
/// <summary>
/// 订单状态
/// </summary>
public enum OrderState
{
= 0,
= 1,
= 2,
= 3,
= 4,
= 5,
= 6,
= 7,
退 = 8
}
/// <summary>
/// 刷单类型
/// </summary>
public enum SDType
{
= 0,
= 1,
= 2,
= 3
}
/// <summary>
/// 订单同步任务状态
/// </summary>
public enum OrderSyncState
{
Running = 0,
End = 1
}
public enum PayChannelType
{
= 0,
= 1,
= 2
}
/// <summary>
/// 服务单处理结果
/// </summary>
public enum ServiceResult
{
退 = 0,
= 1,
= 2,
线 = 3,
= 4,
= 5,
退 = 6,
SD退货 = 7
}
/// <summary>
/// 商品处理方式
/// </summary>
public enum ProductResult
{
_退 = 0,
退 = 1,
退 = 2,
退 = 3,
退 = 4
}
/// <summary>
/// 商品情况
/// </summary>
public enum ProductHealth
{
= 0,
_ = 1,
退退 = 2,
退 = 3,
= 4
}
/// <summary>
/// 排序时间类型
/// </summary>
public enum SortTimeType
{
ModifyTime = 0, StartTime = 1
}
/// <summary>
/// 支付账单类型
/// </summary>
public enum PayBillType
{
= 0,
= 1,
= 2
}
/// <summary>
/// 资金类型
/// </summary>
public enum AuditCapitalType
{
= 0,
退 = 1,
= 2,
退 = 3,
= 4,
= 5,
= 6,
= 7,
= 8,
= 9,
e赊还款 = 10,
= 11,
= 12,
= 13,
= 14,
= 15,
= 16,
= 17,
= 18,
= 19
}
/// <summary>
/// 京东仓库类型 1商家仓 2京东仓
/// </summary>
public enum StockType
{
= 1, = 2
}
/// <summary>
/// 仓库状态 0暂停,1使用
/// </summary>
public enum StockStatus
{
= 0, 使 = 1
}
/// <summary>
/// SKU库存周期 暂无周期=0,增长期=1,稳定期=2,衰退期=3
/// </summary>
public enum SkuStockNumCycleType
{
= 0,
= 1,
= 2,
退 = 3
}
/// <summary>
/// 司南周期 暂无周期 = -1,成长加速期 = 0,成熟利润期 = 1,稳定日销期 = 2,策马奔腾期 = 3
/// </summary>
public enum SiNanCycleType
{
= -1,
= 0,
= 1,
= 2,
= 3
}
/// <summary>
/// 促销任务状态 等待 = 0,进行中 = 1,已完成 = 2, 已停止 = 3
/// </summary>
public enum PromitionTaskStatus
{
= 0,
= 1,
= 2,
= 3
}
/// <summary>
/// AppKey类型 全类型 = 0, 订单管理 = 1, 商品管理 = 2
/// </summary>
public enum AppKeyType
{
= 0, = 1, = 2
}
}
}

2
BBWYB.Server.Model/_MDS重新生成.bat

@ -0,0 +1,2 @@
FreeSql.Generator -Razor 1 -NameOptions 1,0,0,0 -NameSpace BBWYB.Server.Model.Db -DB "MySql,data source=rm-bp1508okrh23710yfao.mysql.rds.aliyuncs.com;port=3306;user id=qyroot;password=kaicn1132+-;initial catalog=mds;charset=utf8;sslmode=none;" -FileName "{name}.cs"

2
BBWYB.Server.Model/__重新生成.bat

@ -0,0 +1,2 @@
FreeSql.Generator -Razor 1 -NameOptions 1,0,0,0 -NameSpace BBWYB.Server.Model.Db -DB "MySql,data source=rm-bp1508okrh23710yfao.mysql.rds.aliyuncs.com;port=3306;user id=qyroot;password=kaicn1132+-;initial catalog=bbwyb;charset=utf8;sslmode=none;" -FileName "{name}.cs"
Loading…
Cancel
Save