Browse Source

同上

master
me 1 week ago
parent
commit
360871a237
  1. 162
      API/TaskManager.Contracts/Dtos/10_17/SUPPLIER_SINV_DATA_DTO.cs
  2. 97
      API/TaskManager.Contracts/Dtos/Dtos.cs
  3. 5
      API/TaskManager.EntityFramework/IRepository/IRepository.cs
  4. 44
      API/TaskManager.EntityFramework/Repository/Repository.cs
  5. 2
      API/Wood.Service/Controllers/CheryRecurringJobBaseController.cs
  6. 111
      API/Wood.Service/Controllers/CheryRecurringJobInputPageController.cs
  7. 193
      API/Wood.Service/Controllers/CheryRecurringJobOutPageController.cs
  8. 70
      API/Wood.Service/Controllers/CherySupplierConDateService.cs
  9. 70
      API/Wood.Service/Controllers/CherySupplierConMmrpService.cs
  10. 76
      API/Wood.Service/Controllers/CherySupplierConPoService.cs
  11. 4
      API/Wood.Service/Controllers/CherySupplierDelStateService.cs
  12. 5
      API/Wood.Service/Controllers/CherySupplierInvDataService.cs
  13. 67
      API/Wood.Service/Controllers/CherySupplierMrpDataService.cs
  14. 15
      API/Wood.Service/Controllers/CherySupplierMrpMonthService.cs
  15. 5
      API/Wood.Service/Controllers/CherySupplierMrpService.cs
  16. 4
      API/Wood.Service/Controllers/CherySupplierMrpWarningService.cs
  17. 62
      API/Wood.Service/Controllers/CherySupplierPoService.cs
  18. 5
      API/Wood.Service/Controllers/CherySupplierPorHSCHEDULService.cs
  19. 3
      API/Wood.Service/Controllers/CherySupplierProCSCHEDULService.cs
  20. 3
      API/Wood.Service/Controllers/CherySupplierProPlanService.cs
  21. 5
      API/Wood.Service/Controllers/CherySupplierProTSCHEDULService.cs
  22. 5
      API/Wood.Service/Controllers/CherySupplierReturnService.cs
  23. 2
      API/Wood.Service/Controllers/CherySupplierSinvDataService.cs
  24. 156
      API/Wood.Service/Controllers/NormalBaseController.cs
  25. 6
      API/Wood.Service/Controllers/SupplierPoService.cs
  26. 4
      API/Wood.Service/Controllers/TaskConifgureController.cs
  27. 112
      API/Wood.Util/EntityHelper.cs
  28. 13
      API/Wood.Util/Filters/Condition.cs
  29. 69
      API/Wood.Util/Filters/EnumFilterAction.cs
  30. 21
      API/Wood.Util/Filters/EnumFilterLogic.cs
  31. 48
      API/Wood.Util/Filters/Filter.cs
  32. 337
      API/Wood.Util/Filters/FilterExtensions.cs
  33. 23
      API/Wood.Util/Filters/RequestInputBase.cs

162
API/TaskManager.Contracts/Dtos/10_17/SUPPLIER_SINV_DATA_DTO.cs

@ -5,86 +5,86 @@ namespace TaskManager.Entity
/// <summary>
/// 供应商共享库存
/// </summary>
public class SUPPLIER_SINV_DATA_DTO
{
/// <summary>
/// 供应商代码
/// </summary>
[ExporterHeader(DisplayName = "供应商代码")]
[ImporterHeader(Name = "供应商代码")]
public string SupplierCode { get; set; }
/// <summary>
/// 供应商名称
/// </summary>
[ExporterHeader(DisplayName = "供应商名称")]
[ImporterHeader(Name = "供应商名称")]
public string SupplierName { get; set; }
/// <summary>
/// 零件号
/// </summary>
[ExporterHeader(DisplayName = "零件号")]
[ImporterHeader(Name = "零件号")]
public string MaterialCode { get; set; }
/// <summary>
/// 零件名称
/// </summary>
[ExporterHeader(DisplayName = "零件名称")]
[ImporterHeader(Name = "零件名称")]
public string MaterialDescription { get; set; }
/// <summary>
/// 物料类型(成品,半成品,原材料)
/// </summary>
[ExporterHeader(DisplayName = "物料类型")]
[ImporterHeader(Name = "物料类型")]
public string MaterialType { get; set; }
/// <summary>
/// 当前库存数量
/// </summary>
[ExporterHeader(DisplayName = "当前库存数量")]
[ImporterHeader(Name = "当前库存数量")]
public decimal QuantityCurrent { get; set; }
/// <summary>
/// 原材料在途数量
/// </summary>
[ExporterHeader(DisplayName = "原材料在途数量")]
[ImporterHeader(Name = "原材料在途数量")]
public decimal QuantityPlan { get; set; }
/// <summary>
/// 库存状态(生产件,呆滞件,备件,KD件)
/// </summary>
[ExporterHeader(DisplayName = "库存状态")]
[ImporterHeader(Name = "库存状态")]
public string InventoryStatus { get; set; }
/// <summary>
/// 安全库存
/// </summary>
[ExporterHeader(DisplayName = "安全库存")]
[ImporterHeader(Name = "安全库存")]
public decimal SafetyStock { get; set; }
/// <summary>
/// 生产/采购周期:成品即半成品为生产周期(天),原材料为采购周期(天)
/// </summary>
[ExporterHeader(DisplayName = "生产/采购周期")]
[ImporterHeader(Name = "生产/采购周期")]
public string ProductionCycle { get; set; }
/// <summary>
/// 库存更新时间-格式:yyyy-MM-ddHH:mm:ss
/// </summary>
[ExporterHeader(DisplayName = "库存更新时间")]
[ImporterHeader(Name = "库存更新时间")]
public string DataUpdateTime { get; set; }
/// <summary>
/// 批次
/// </summary>
[ExporterHeader(DisplayName = "批次")]
[ImporterHeader(Name = "批次")]
public string? SupplierBatch { get; set; }
/// <summary>
/// 有效期截止日期 非必填
/// </summary>
[ExporterHeader(DisplayName = "有效期截止日期")]
[ImporterHeader(Name = "有效期截止日期")]
public string? SupplieryxqDate { get; set; }
}
//public class SUPPLIER_SINV_DATA_DTO
//{
// /// <summary>
// /// 供应商代码
// /// </summary>
// [ExporterHeader(DisplayName = "供应商代码")]
// [ImporterHeader(Name = "供应商代码")]
// public string SupplierCode { get; set; }
// /// <summary>
// /// 供应商名称
// /// </summary>
// [ExporterHeader(DisplayName = "供应商名称")]
// [ImporterHeader(Name = "供应商名称")]
// public string SupplierName { get; set; }
// /// <summary>
// /// 零件号
// /// </summary>
// [ExporterHeader(DisplayName = "零件号")]
// [ImporterHeader(Name = "零件号")]
// public string MaterialCode { get; set; }
// /// <summary>
// /// 零件名称
// /// </summary>
// [ExporterHeader(DisplayName = "零件名称")]
// [ImporterHeader(Name = "零件名称")]
// public string MaterialDescription { get; set; }
// /// <summary>
// /// 物料类型(成品,半成品,原材料)
// /// </summary>
// [ExporterHeader(DisplayName = "物料类型")]
// [ImporterHeader(Name = "物料类型")]
// public string MaterialType { get; set; }
// /// <summary>
// /// 当前库存数量
// /// </summary>
// [ExporterHeader(DisplayName = "当前库存数量")]
// [ImporterHeader(Name = "当前库存数量")]
// public decimal QuantityCurrent { get; set; }
// /// <summary>
// /// 原材料在途数量
// /// </summary>
// [ExporterHeader(DisplayName = "原材料在途数量")]
// [ImporterHeader(Name = "原材料在途数量")]
// public decimal QuantityPlan { get; set; }
// /// <summary>
// /// 库存状态(生产件,呆滞件,备件,KD件)
// /// </summary>
// [ExporterHeader(DisplayName = "库存状态")]
// [ImporterHeader(Name = "库存状态")]
// public string InventoryStatus { get; set; }
// /// <summary>
// /// 安全库存
// /// </summary>
// [ExporterHeader(DisplayName = "安全库存")]
// [ImporterHeader(Name = "安全库存")]
// public decimal SafetyStock { get; set; }
// /// <summary>
// /// 生产/采购周期:成品即半成品为生产周期(天),原材料为采购周期(天)
// /// </summary>
// [ExporterHeader(DisplayName = "生产/采购周期")]
// [ImporterHeader(Name = "生产/采购周期")]
// public string ProductionCycle { get; set; }
// /// <summary>
// /// 库存更新时间-格式:yyyy-MM-ddHH:mm:ss
// /// </summary>
// [ExporterHeader(DisplayName = "库存更新时间")]
// [ImporterHeader(Name = "库存更新时间")]
// public string DataUpdateTime { get; set; }
// /// <summary>
// /// 批次
// /// </summary>
// [ExporterHeader(DisplayName = "批次")]
// [ImporterHeader(Name = "批次")]
// public string? SupplierBatch { get; set; }
// /// <summary>
// /// 有效期截止日期 非必填
// /// </summary>
// [ExporterHeader(DisplayName = "有效期截止日期")]
// [ImporterHeader(Name = "有效期截止日期")]
// public string? SupplieryxqDate { get; set; }
//}
}

97
API/TaskManager.Contracts/Dtos/Dtos.cs

@ -1493,19 +1493,90 @@ public class SUPPLIER_MRP_WARNING_DETAIL_DTO : CherryReadBaseEntityDto
public class SUPPLIER_SINV_DATA_DETAIL_DTO:CherryReadBaseEntityDto
{
public string SupplierCode { get; set; }
public string SupplierName { get; set; }
public string MaterialCode { get; set; }
public string MaterialDescription { get; set; }
public string MaterialType { get; set; }
public int QuantityCurrent { get; set; }
public int QuantityPlan { get; set; }
public string InventoryStatus { get; set; }
public int SafetyStock { get; set; }
public string ProductionCycle { get; set; }
public string DataUpdateTime { get; set; }
public string SupplierBatch { get; set; }
public string SupplieryxqDate { get; set; }
/// <summary>
/// 供应商共享库存
/// </summary>
public class SUPPLIER_SINV_DATA_DTO
{
/// <summary>
/// 供应商代码
/// </summary>
[ExporterHeader(DisplayName = "供应商代码")]
[ImporterHeader(Name = "供应商代码")]
public string SupplierCode { get; set; }
/// <summary>
/// 供应商名称
/// </summary>
[ExporterHeader(DisplayName = "供应商名称")]
[ImporterHeader(Name = "供应商名称")]
public string SupplierName { get; set; }
/// <summary>
/// 零件号
/// </summary>
[ExporterHeader(DisplayName = "零件号")]
[ImporterHeader(Name = "零件号")]
public string MaterialCode { get; set; }
/// <summary>
/// 零件名称
/// </summary>
[ExporterHeader(DisplayName = "零件名称")]
[ImporterHeader(Name = "零件名称")]
public string MaterialDescription { get; set; }
/// <summary>
/// 物料类型(成品,半成品,原材料)
/// </summary>
[ExporterHeader(DisplayName = "物料类型")]
[ImporterHeader(Name = "物料类型")]
public string MaterialType { get; set; }
/// <summary>
/// 当前库存数量
/// </summary>
[ExporterHeader(DisplayName = "当前库存数量")]
[ImporterHeader(Name = "当前库存数量")]
public decimal QuantityCurrent { get; set; }
/// <summary>
/// 原材料在途数量
/// </summary>
[ExporterHeader(DisplayName = "原材料在途数量")]
[ImporterHeader(Name = "原材料在途数量")]
public decimal QuantityPlan { get; set; }
/// <summary>
/// 库存状态(生产件,呆滞件,备件,KD件)
/// </summary>
[ExporterHeader(DisplayName = "库存状态")]
[ImporterHeader(Name = "库存状态")]
public string InventoryStatus { get; set; }
/// <summary>
/// 安全库存
/// </summary>
[ExporterHeader(DisplayName = "安全库存")]
[ImporterHeader(Name = "安全库存")]
public decimal SafetyStock { get; set; }
/// <summary>
/// 生产/采购周期:成品即半成品为生产周期(天),原材料为采购周期(天)
/// </summary>
[ExporterHeader(DisplayName = "生产/采购周期")]
[ImporterHeader(Name = "生产/采购周期")]
public string ProductionCycle { get; set; }
/// <summary>
/// 库存更新时间-格式:yyyy-MM-ddHH:mm:ss
/// </summary>
[ExporterHeader(DisplayName = "库存更新时间")]
[ImporterHeader(Name = "库存更新时间")]
public string DataUpdateTime { get; set; }
/// <summary>
/// 批次
/// </summary>
[ExporterHeader(DisplayName = "批次")]
[ImporterHeader(Name = "批次")]
public string? SupplierBatch { get; set; }
/// <summary>
/// 有效期截止日期 非必填
/// </summary>
[ExporterHeader(DisplayName = "有效期截止日期")]
[ImporterHeader(Name = "有效期截止日期")]
public string? SupplieryxqDate { get; set; }
}
}
public class SUPPLIER_SINV_DATA_DTO

5
API/TaskManager.EntityFramework/IRepository/IRepository.cs

@ -7,6 +7,7 @@ using System.Text;
using System.Threading.Tasks;
using TaskManager.Entity;
using TaskManager.EntityFramework.Repository;
using Wood.Util.Filters;
namespace TaskManager.EntityFramework
{
@ -25,5 +26,9 @@ namespace TaskManager.EntityFramework
Expression<Func<TEntity, bool>> filter = null,
PagingParams pagingParams = null);
Task<PagedResult<TEntity>> GetDataPagedAsync(
Expression<Func<TEntity, bool>> filter = null,
PagingParams pagingParams = null,Condition condition = null);
}
}

44
API/TaskManager.EntityFramework/Repository/Repository.cs

@ -10,6 +10,7 @@ using System.Threading.Tasks;
using TaskManager.Entity;
using TaskManager.EntityFramework;
using Wood.Util;
using Wood.Util.Filters;
namespace TaskManager.EntityFramework.Repository
{
@ -82,7 +83,7 @@ namespace TaskManager.EntityFramework.Repository
// 应用动态过滤
if (pagingParams?.Filters != null && pagingParams.Filters.Any())
{
query = query.ApplyFilters(pagingParams.Filters);
query = query.ApplyFilters(pagingParams.Filters);
}
// 应用分页和排序
@ -94,6 +95,36 @@ namespace TaskManager.EntityFramework.Repository
return page;
}
public async Task<PagedResult<TEntity>> GetDataPagedAsync(
Expression<Func<TEntity, bool>> filter = null,
PagingParams pagingParams = null,Condition condition = null)
{
IQueryable<TEntity> query = _dbSet.AsNoTracking();
// 应用过滤条件
if (filter != null)
{
query = query.Where(filter);
}
// 应用动态过滤
if (condition?.Filters != null && condition.Filters.Any())
{
query = query.ApplyConditionFilters(condition);
}
// 应用分页和排序
pagingParams ??= new PagingParams();
var page = await query.ToPagedListAsync(pagingParams);
return page;
}
}
public class PagedResult<T>
{
@ -181,9 +212,18 @@ namespace TaskManager.EntityFramework.Repository
return query;
}
public static IQueryable<T> ApplyConditionFilters<T>(this IQueryable<T> query, Condition condition)
{
if (condition.Filters == null || !condition.Filters.Any()) return query;
query = query.Where(condition.Filters.ToLambda<T>());
return query;
}
public static IQueryable<T> ApplyStringFilter<T>(this IQueryable<T> query,
public static IQueryable<T> ApplyStringFilter<T>(this IQueryable<T> query,
string propertyName, string value)
{
var property = typeof(T).GetProperty(propertyName,

2
API/Wood.Service/Controllers/CheryRecurringJobBaseController.cs

@ -30,7 +30,7 @@ namespace TaskManager.Controllers
protected string appSecret = "48edc4425647425d87f806a1ba492580";
protected readonly HttpClient _httpClient;
protected readonly JobDbContext _jobDbContext;
protected string Client { set; get; } = "Wood";
protected string Client { set; get; } = "Chery";
protected string Path { set; get; } = "/v2/get/supplierProPlaning";
protected string Url { set; get; } = "/v2/get/supplierProPlaning";
protected virtual string TaskName { set; get; } = "SupplierProPlaning";

111
API/Wood.Service/Controllers/CheryRecurringJobInputPageController.cs

@ -19,6 +19,7 @@ using TaskManager.Contracts.Dtos;
using TaskManager.Entity;
using TaskManager.EntityFramework;
using TaskManager.EntityFramework.Repository;
using Wood.Util.Filters;
using static Dapper.SqlMapper;
namespace TaskManager.Controllers
@ -145,13 +146,13 @@ namespace TaskManager.Controllers
await _logger.AddError("任务名称或客户端不能为空",taskName);
return;
}
var sublist = _jobDbContext.TaskSub.Where(p => p.TaskName == taskName && p.WriteState == false && p.Subscriber == client).ToList();
var sublist = _jobDbContext.TaskSub.Where(p => p.TaskName == taskName && p.WriteState == false && p.Subscriber == client ).ToList();
int pageSize = 1000;
if (!sublist.Any())
{
foreach (var sub in sublist)
{
string querystr = $"select * from {sub.TableName} where TaskId='{sub.TaskId}' and WriteState=0 order by uid";//任务表
string querystr = $"select * from {sub.TableName} where TaskId='{sub.TaskId}' and WriteState=0 and ReadState=1 order by uid";//任务表
var entites = _jobDbContext.Database.GetDbConnection().Query<T>(querystr);//明细表
if (entites.Any())
@ -164,7 +165,7 @@ namespace TaskManager.Controllers
var records = entites.Skip((i - 1) * pageSize)
.Take(pageSize).ToList();
#region dto转换作为参数发给
#region dto转换作为参数发给客户API 因为实体比DTO字段多
List<TDTO> dtos = new List<TDTO>();
foreach (var itm in records)
{
@ -254,54 +255,106 @@ namespace TaskManager.Controllers
await _repository.DeleteAsync(id);
return new JsonResult(new { Code = 200, Message = "删除成功!" }); ;
}
[HttpGet]
public async Task<ActionResult> GetPaged(
[FromQuery] int pageNumber = 1,
[FromQuery] int pageSize = 10,
[FromQuery] string sortBy = "",
[FromQuery] bool isAscending = true,
[FromQuery] Dictionary<string, string> filters = null)
//[HttpGet]
//public async Task<ActionResult> GetPaged(
//[FromQuery] int pageNumber = 1,
//[FromQuery] int pageSize = 10,
//[FromQuery] string sortBy = "",
//[FromQuery] bool isAscending = true,
//[FromQuery] Dictionary<string, string> filters = null)
//{
// var pagingParams = new PagingParams
// {
// PageNumber = pageNumber,
// PageSize = pageSize,
// SortBy = sortBy,
// IsAscending = isAscending,
// Filters = filters
// };
// // 可以在这里构建表达式树过滤条件
// Expression<Func<T, bool>> filter = null;
// var pagedResult = await _repository.GetPagedAsync(filter, pagingParams);
// return Ok(pagedResult);
//}
/// <summary>
/// 分页New
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
public async Task<ActionResult<PagedResult<T>>> GetDataPaged(RequestInputBase input)
{
var pagingParams = new PagingParams
{
PageNumber = pageNumber,
PageSize = pageSize,
SortBy = sortBy,
IsAscending = isAscending,
Filters = filters
PageNumber = input.pageNumber,
PageSize = input.pageSize,
SortBy = input.sortBy,
IsAscending = input.isAscending,
};
// 可以在这里构建表达式树过滤条件
Expression<Func<T, bool>> filter = null;
var pagedResult = await _repository.GetPagedAsync(filter, pagingParams);
var pagedResult = await _repository.GetDataPagedAsync(filter, pagingParams, input.Condition);
return Ok(pagedResult);
}
[HttpGet]
public async Task<FileStreamResult> Export([FromQuery] int pageNumber = 1,
[FromQuery] int pageSize = 10,
[FromQuery] string sortBy = "",
[FromQuery] bool isAscending = true,
[FromQuery] Dictionary<string, string> filters = null)
/// <summary>
/// 导出New
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
public async Task<FileStreamResult> ExportData(RequestInputBase input)
{
var pagingParams = new PagingParams
{
PageNumber = pageNumber,
PageSize = pageSize,
SortBy = sortBy,
IsAscending = isAscending,
Filters = filters
PageNumber = input.pageNumber,
PageSize = input.pageSize,
SortBy = input.sortBy,
IsAscending = input.isAscending,
};
// 可以在这里构建表达式树过滤条件
//Expression<Func<T, bool>> filter = null;
var pagedResult = await _repository.GetPagedAsync(null, pagingParams);
var pagedResult = await _repository.GetDataPagedAsync(null, pagingParams, input.Condition);
return await ExportFile(pagedResult.Data, Guid.NewGuid().ToString() + ".xlsx");
}
}
// [HttpGet]
// public async Task<FileStreamResult> Export([FromQuery] int pageNumber = 1,
//[FromQuery] int pageSize = 10,
//[FromQuery] string sortBy = "",
//[FromQuery] bool isAscending = true,
//[FromQuery] Dictionary<string, string> filters = null)
// {
// var pagingParams = new PagingParams
// {
// PageNumber = pageNumber,
// PageSize = pageSize,
// SortBy = sortBy,
// IsAscending = isAscending,
// Filters = filters
// };
// // 可以在这里构建表达式树过滤条件
// //Expression<Func<T, bool>> filter = null;
// var pagedResult = await _repository.GetPagedAsync(null, pagingParams);
// return await ExportFile(pagedResult.Data, Guid.NewGuid().ToString() + ".xlsx");
// }
protected async Task<FileStreamResult> ExportFile(ICollection<T> dtos, string fileName)
{
var excelExporter = HttpContext.RequestServices.GetRequiredService<IExcelExporter>();

193
API/Wood.Service/Controllers/CheryRecurringJobOutPageController.cs

@ -1,8 +1,4 @@
using System.Data;
using System.Linq.Expressions;
using System.Text.Json;
using System.Text.Json.Serialization;
using Magicodes.ExporterAndImporter.Core.Extension;
using Magicodes.ExporterAndImporter.Core.Extension;
using Magicodes.ExporterAndImporter.Excel;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
@ -11,14 +7,21 @@ using Microsoft.AspNetCore.Http.HttpResults;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.Extensions.DependencyInjection;
using Omu.ValueInjecter;
using System.Data;
using System.Data.Common;
using System.Linq.Expressions;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using TaskManager.Contracts.Dtos;
using TaskManager.Controllers;
using TaskManager.Entity;
using TaskManager.EntityFramework;
using TaskManager.EntityFramework.Repository;
using Wood.Util.Filters;
namespace TaskManager.Controllers
{
@ -31,10 +34,34 @@ namespace TaskManager.Controllers
{
_repository = repository;
}
protected virtual async Task CreateTaskAsync(List<T> plist,JobDbContext dbContext)
protected virtual async Task ConfirmDataInsertAsync(List<T> plist,JobDbContext dbContext, DbTransaction dbTransaction)
{
}
private async Task InsertDataAsync(List<T> list)
{
if (list.Any())
{
using (var transaction = await _jobDbContext.Database.BeginTransactionAsync())
{
var tran = transaction.GetDbTransaction();
try
{
_jobDbContext.BulkInsert(list);
await ConfirmDataInsertAsync(list, _jobDbContext, tran);
// 提交事务
await transaction.CommitAsync();
}
catch (Exception ex)
{
await transaction.RollbackAsync();
new JsonResult(new { Code = 400, Message = ex.Message });
}
}
}
}
[NonAction]
public async Task<List<ToutputDetial>> FetchAllDataAsync(string inputdate)
@ -57,11 +84,11 @@ namespace TaskManager.Controllers
}
if (firstResponse.Data.Total == "0")
{
await _logger.AddError("首次请求失败,Total为0是否已经全部读取过。", TaskName);
await _logger.AddInfo("首次请求失败,Total为0是否已经全部读取过。", TaskName);
return allData;
}
if (readedcount != int.Parse(firstResponse.Data.Total))//记录数不相等
{
var ids = _jobDbContext.Set<T>().Where(p => p.RequestDate == inputdate).Select(p => p.Id).ToList();//已经同步的ID
@ -93,8 +120,10 @@ namespace TaskManager.Controllers
}
}
_jobDbContext.BulkInsert(pagefirstList);
await CreateTaskAsync(pagefirstList,_jobDbContext);
if (pagefirstList.Any())
{
await InsertDataAsync(pagefirstList);
}
// 计算总页数
@ -110,7 +139,6 @@ namespace TaskManager.Controllers
if (pageResponse?.Data.Rows != null && pageResponse.Data.Rows.Count > 0)
{
List<T> pageList = new List<T>();
if (readedcount > 0)
{
var listrows = pageResponse.Data.Rows.Where(p => !ids.Contains(p.Id));
@ -121,12 +149,10 @@ namespace TaskManager.Controllers
entity.CreationTime = DateTime.Now;
pageList.Add(entity);
allData.Add(itm);
}
}
else
{
foreach (var itm in pageResponse.Data.Rows)
{
T entity = new T();
@ -136,25 +162,22 @@ namespace TaskManager.Controllers
allData.Add(itm);
}
}
_jobDbContext.BulkInsert(pageList);
await CreateTaskAsync(pageList, _jobDbContext);
await _logger.AddInfo($"成功获取 {pageResponse.Data.Rows.Count} 条记录", TaskName);
if (pageList.Any())
{
await InsertDataAsync(pageList);
}
}
else
{
await _logger.AddError($"第 {currentPage} 页未返回数据", TaskName);
await _logger.AddInfo($"第 {currentPage} 页未返回数据", TaskName);
}
// 简单的请求间隔,避免过于频繁
await Task.Delay(200);
}
await _logger.AddInfo($"所有数据获取完成,总共获取了 {allData.Count} 条记录", TaskName);
}
}
else
{
@ -191,7 +214,6 @@ namespace TaskManager.Controllers
}
else
{
foreach (var itm in firstResponse.Data.Rows)
{
T entity = new T();
@ -201,8 +223,10 @@ namespace TaskManager.Controllers
allData.Add(itm);
}
}
_jobDbContext.BulkInsert(pagefirstList);
await CreateTaskAsync(pagefirstList, _jobDbContext);
if (pagefirstList.Any())
{
await InsertDataAsync(pagefirstList);
}
//Console.WriteLine($"总记录数: {totalItems}, 每页大小: {pageSize}");
// 计算总页数
int totalPages = (int)Math.Ceiling((double)totalItems / pageSize);
@ -231,7 +255,6 @@ namespace TaskManager.Controllers
}
else
{
foreach (var itm in pageResponse.Data.Rows)
{
T entity = new T();
@ -241,9 +264,12 @@ namespace TaskManager.Controllers
allData.Add(itm);
}
}
_jobDbContext.BulkInsert(pageList);
await CreateTaskAsync(pageList, _jobDbContext);
await _logger.AddInfo($"成功获取 {pageResponse.Data.Rows.Count} 条记录", TaskName);
if (pageList.Any())
{
await InsertDataAsync(pageList);
}
//await _logger.AddInfo($"成功获取 {pageResponse.Data.Rows.Count} 条记录", TaskName);
}
else
{
@ -256,11 +282,8 @@ namespace TaskManager.Controllers
}
}
// 首次请求获取总条数和分页信息
return allData;
}
@ -403,30 +426,54 @@ namespace TaskManager.Controllers
/// <param name="isAscending">正序还是倒序</param>
/// <param name="filters">过滤条件</param>
/// <returns></returns>
[HttpGet]
public async Task<ActionResult> GetPaged(
[FromQuery] int pageNumber = 1,
[FromQuery] int pageSize = 10,
[FromQuery] string sortBy = "",
[FromQuery] bool isAscending = true,
[FromQuery] Dictionary<string, string> filters = null)
//[HttpGet]
//public async Task<ActionResult> GetPaged(
//[FromQuery] int pageNumber = 1,
//[FromQuery] int pageSize = 10,
//[FromQuery] string sortBy = "",
//[FromQuery] bool isAscending = true,
//[FromQuery] Dictionary<string, string> filters = null)
//{
// var pagingParams = new PagingParams
// {
// PageNumber = pageNumber,
// PageSize = pageSize,
// SortBy = sortBy,
// IsAscending = isAscending,
// Filters = filters
// };
// // 可以在这里构建表达式树过滤条件
// Expression<Func<T, bool>> filter = null;
// var pagedResult = await _repository.GetPagedAsync(filter, pagingParams);
// return Ok(pagedResult);
//}
/// <summary>
/// 分页New
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
public async Task<ActionResult<PagedResult<T>>> GetDataPaged(RequestInputBase input)
{
var pagingParams = new PagingParams
{
PageNumber = pageNumber,
PageSize = pageSize,
SortBy = sortBy,
IsAscending = isAscending,
Filters = filters
PageNumber = input.pageNumber,
PageSize = input.pageSize,
SortBy = input.sortBy,
IsAscending = input.isAscending,
};
// 可以在这里构建表达式树过滤条件
Expression<Func<T, bool>> filter = null;
var pagedResult = await _repository.GetPagedAsync(filter, pagingParams);
return Ok(pagedResult);
var pagedResult = await _repository.GetDataPagedAsync(filter, pagingParams, input.Condition);
return Ok(pagedResult);
}
/// <summary>
/// 导出
/// </summary>
@ -437,30 +484,56 @@ namespace TaskManager.Controllers
/// <param name="filters">过滤条件</param>
/// <returns></returns>
[HttpGet]
public async Task<FileStreamResult> Export([FromQuery] int pageNumber = 1,
[FromQuery] int pageSize = 10,
[FromQuery] string sortBy = "",
[FromQuery] bool isAscending = true,
[FromQuery] Dictionary<string, string> filters = null)
// [HttpGet]
// public async Task<FileStreamResult> Export([FromQuery] int pageNumber = 1,
//[FromQuery] int pageSize = 10,
//[FromQuery] string sortBy = "",
//[FromQuery] bool isAscending = true,
//[FromQuery] Dictionary<string, string> filters = null)
// {
// var pagingParams = new PagingParams
// {
// PageNumber = pageNumber,
// PageSize = pageSize,
// SortBy = sortBy,
// IsAscending = isAscending,
// Filters = filters
// };
// // 可以在这里构建表达式树过滤条件
// //Expression<Func<T, bool>> filter = null;
// var pagedResult = await _repository.GetPagedAsync(null, pagingParams);
// return await ExportFile(pagedResult.Data, Guid.NewGuid().ToString() + ".xlsx");
// }
/// <summary>
/// 导出New
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
public async Task<FileStreamResult> ExportData(RequestInputBase input)
{
var pagingParams = new PagingParams
{
PageNumber = pageNumber,
PageSize = pageSize,
SortBy = sortBy,
IsAscending = isAscending,
Filters = filters
PageNumber = input.pageNumber,
PageSize = input.pageSize,
SortBy = input.sortBy,
IsAscending = input.isAscending,
};
// 可以在这里构建表达式树过滤条件
//Expression<Func<T, bool>> filter = null;
var pagedResult = await _repository.GetPagedAsync(null, pagingParams);
var pagedResult = await _repository.GetDataPagedAsync(null, pagingParams, input.Condition);
return await ExportFile(pagedResult.Data, Guid.NewGuid().ToString() + ".xlsx");
}
protected async Task<FileStreamResult> ExportFile(ICollection<T> dtos, string fileName)
{
var excelExporter = HttpContext.RequestServices.GetRequiredService<IExcelExporter>();

70
API/Wood.Service/Controllers/CherySupplierConDateService.cs

@ -1,15 +1,77 @@
using TaskManager.Contracts.Dtos;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore.Storage;
using TaskManager.Contracts.Dtos;
using TaskManager.Entity;
using TaskManager.Entity.Entitys;
using TaskManager.EntityFramework;
namespace TaskManager.Controllers
{
public class SupplierConDateService : CheryRecurringJobInputPageController<SUPPLIER_CON_DATE, SUPPLIER_CON_DATE_DETAIL_DTO>
/// <summary>
/// 日物料需求计划风险确认
/// </summary>
public class CherySupplierConDateService : CheryRecurringJobInputPageController<SUPPLIER_CON_DATE, SUPPLIER_CON_DATE_DETAIL_DTO>
{
public SupplierConDateService(HttpClient httpClient, JobDbContext jobDbContext, LogController log, IRepository<SUPPLIER_CON_DATE> repository) : base(httpClient, jobDbContext, log, repository)
public CherySupplierConDateService(HttpClient httpClient, JobDbContext jobDbContext, LogController log, IRepository<SUPPLIER_CON_DATE> repository) : base(httpClient, jobDbContext, log, repository)
{
}
/// <summary>
/// 确认提交
/// </summary>
/// <param name="entites"></param>
/// <returns></returns>
[HttpPost]
public async Task<ActionResult> Confirm([FromBody] List<SUPPLIER_CON_DATE> entites)
{
var taskId = Guid.NewGuid();
var task = new TaskSub();
task.TaskId = taskId;
task.TaskName = "采购订单风险确认";
task.Subscriber = Client;
task.TableName = "SUPPLIER_CON_DATE";
task.DataCount = entites.Count;
task.Domain = "1";
task.Site = "1";
task.FailedCount = 0;
task.CreateTime = DateTime.Now;
task.CreateUser = "admin";
task.CreationTime = DateTime.Now;
task.SyncedPageCount = 0;
entites.ForEach(p =>
{
p.ReadState = true;
p.TaskId = taskId;
});
using (var transaction = await _jobDbContext.Database.BeginTransactionAsync())
{
var tran = transaction.GetDbTransaction();
try
{
await _jobDbContext.BulkUpdateAsync(entites, options => { options.Transaction = tran; });
await _jobDbContext.AddAsync(task);
_jobDbContext.SaveChanges();
// 提交事务
await transaction.CommitAsync();
}
catch (Exception ex)
{
await transaction.RollbackAsync();
return new JsonResult(new { Code = 400, Message = ex.Message });
}
}
return new JsonResult(new { Code = 200, Message = "修改成功!" });
}
}

70
API/Wood.Service/Controllers/CherySupplierConMmrpService.cs

@ -1,12 +1,80 @@
using TaskManager.Entity.Entitys;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using Org.BouncyCastle.Bcpg.Sig;
using SkiaSharp;
using System.Xml;
using TaskManager.Entity;
using TaskManager.Entity.Entitys;
using TaskManager.EntityFramework;
namespace TaskManager.Controllers
{
/// <summary>
/// M+6月物料需求计划风险确认
/// </summary>
public class CherySupplierConMmrpService : CheryRecurringJobInputPageController<SUPPLIER_CON_MMRP, SUPPLIER_CON_MMRP_DTO>
{
public CherySupplierConMmrpService(HttpClient httpClient, JobDbContext jobDbContext, LogController log, IRepository<SUPPLIER_CON_MMRP> repository) : base(httpClient, jobDbContext, log, repository)
{
}
/// <summary>
/// 审批通过
/// </summary>
/// <param name="entites"></param>
/// <returns></returns>
public async Task<ActionResult> Confirm([FromBody] List<SUPPLIER_CON_MMRP> entites)
{
var taskId = Guid.NewGuid();
var task = new TaskSub();
task.TaskId = taskId;
task.TaskName = "";
task.Subscriber = Client;
task.TableName = "SUPPLIER_CON_MMRP";
task.DataCount = entites.Count;
task.Domain = "1";
task.Site = "1";
task.FailedCount = 0;
task.CreateTime = DateTime.Now;
task.CreateUser = "admin";
task.CreationTime = DateTime.Now;
task.SyncedPageCount = 0;
entites.ForEach(p =>
{
p.ReadState = true;
p.TaskId = taskId;
});
using (var transaction = await _jobDbContext.Database.BeginTransactionAsync())
{
var tran = transaction.GetDbTransaction();
try
{
await _jobDbContext.BulkUpdateAsync(entites, options => { options.Transaction = tran; });
await _jobDbContext.AddAsync(task);
_jobDbContext.SaveChanges();
// 提交事务
await transaction.CommitAsync();
}
catch (Exception ex)
{
await transaction.RollbackAsync();
return new JsonResult(new { Code = 400, Message = ex.Message });
}
}
return new JsonResult(new { Code = 200, Message = "修改成功!" });
}
}
}

76
API/Wood.Service/Controllers/CherySupplierConPoService.cs

@ -0,0 +1,76 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore.Storage;
using TaskManager.Contracts.Dtos;
using TaskManager.Entity;
using TaskManager.Entity.Entitys;
using TaskManager.EntityFramework;
namespace TaskManager.Controllers
{
/// <summary>
/// 采购订单风险确认
/// </summary>
public class CherySupplierConPoService : CheryRecurringJobInputPageController<SUPPLIER_CON_PO, SUPPLIER_CON_PO_DETAIL_DTO>
{
public CherySupplierConPoService(HttpClient httpClient, JobDbContext jobDbContext, LogController log, IRepository<SUPPLIER_CON_PO> repository) : base(httpClient, jobDbContext, log, repository)
{
}
/// <summary>
/// 确认提交
/// </summary>
/// <param name="entites"></param>
/// <returns></returns>
[HttpPost]
public async Task<ActionResult> Confirm([FromBody] List<SUPPLIER_CON_PO> entites)
{
var taskId = Guid.NewGuid();
var task = new TaskSub();
task.TaskId = taskId;
task.TaskName = TaskName;
task.Subscriber = Client;
task.TableName = "SUPPLIER_CON_PO";
task.DataCount = entites.Count;
task.Domain = "1";
task.Site = "1";
task.FailedCount = 0;
task.CreateTime = DateTime.Now;
task.CreateUser = "admin";
task.CreationTime = DateTime.Now;
task.SyncedPageCount = 0;
entites.ForEach(p =>
{
p.ReadState = true;
p.TaskId = taskId;
});
using (var transaction = await _jobDbContext.Database.BeginTransactionAsync())
{
var tran = transaction.GetDbTransaction();
try
{
await _jobDbContext.BulkUpdateAsync(entites, options => { options.Transaction = tran; });
await _jobDbContext.AddAsync(task);
_jobDbContext.SaveChanges();
// 提交事务
await transaction.CommitAsync();
}
catch (Exception ex)
{
await transaction.RollbackAsync();
return new JsonResult(new { Code = 400, Message = ex.Message });
}
}
return new JsonResult(new { Code = 200, Message = "修改成功!" });
}
}
}

4
API/Wood.Service/Controllers/CherySupplierDelStateService.cs

@ -6,7 +6,9 @@ using TaskManager.EntityFramework;
namespace TaskManager.Controllers
{
//看板配送单
/// <summary>
/// 看板送货单
/// </summary>
public class CherySupplierDelStateService : CheryRecurringJobOutPageController<SUPPLIER_DEL_STATE, SUPPLIER_DEL_STATE_DETAIL_DTO>
{
public CherySupplierDelStateService(HttpClient httpClient, JobDbContext jobDbContext, LogController log, IRepository<SUPPLIER_DEL_STATE> repository) : base(httpClient, jobDbContext, log, repository)

5
API/Wood.Service/Controllers/CherySupplierInvDataService.cs

@ -6,7 +6,10 @@ using TaskManager.EntityFramework;
namespace TaskManager.Controllers
{
//奇瑞RDC共享库存
/// <summary>
/// 奇瑞RDC共享库存
/// </summary>
public class SupplierInvDataService : CheryRecurringJobOutPageController<SUPPLIER_INV_DATA, SUPPLIER_INV_DATA_DETAIL_DTO>
{
public SupplierInvDataService(HttpClient httpClient, JobDbContext jobDbContext, LogController log, IRepository<SUPPLIER_INV_DATA> repository) : base(httpClient, jobDbContext, log, repository)

67
API/Wood.Service/Controllers/CherySupplierMrpDataService.cs

@ -1,16 +1,79 @@
using TaskManager.Contracts.Dtos;
using System.Data.Common;
using TaskManager.Contracts.Dtos;
using TaskManager.Controllers;
using TaskManager.Entity;
using TaskManager.Entity.Entitys;
using TaskManager.EntityFramework;
using TaskManager.EntityFramework;
namespace TaskManager.Controllers
{
//日物料需求计划
/// <summary>
/// 日物料需求计划
/// </summary>
public class CherySupplierMrpDataService : CheryRecurringJobOutPageController<SUPPLIER_MRP_DATE, SUPPLIER_MRP_DATE_DETAIL_DTO>
{
public CherySupplierMrpDataService(HttpClient httpClient, JobDbContext jobDbContext, LogController log, IRepository<SUPPLIER_MRP_DATE> repository) : base(httpClient, jobDbContext, log, repository)
{
}
protected override async Task ConfirmDataInsertAsync(List<SUPPLIER_MRP_DATE> plist, JobDbContext dbContext, DbTransaction dbTransaction)
{
if (plist.Count > 0)
{
List<SUPPLIER_CON_DATE> list = new List<SUPPLIER_CON_DATE>();
plist.ForEach(p =>
{
var con = new SUPPLIER_CON_DATE();
con.SupplierCode = "8EG";
con.ReleaseEdition = p.ReleaseEdition;
con.MaterialCode = p.MaterialCode;
con.PlantId = p.PlantId;
con.FeedbackResults = "";
con.VentureType = "";
con.VentureSpecific = "";
con.Measures = "";
con.StartDate = p.StartDate.ToString();
con.QuantityMeet1 =p.QuantityDemand1 ;
con.QuantityMeet2 =p.QuantityDemand2 ;
con.QuantityMeet3 =p.QuantityDemand3 ;
con.QuantityMeet4 =p.QuantityDemand4 ;
con.QuantityMeet5 =p.QuantityDemand5 ;
con.QuantityMeet6 =p.QuantityDemand6 ;
con.QuantityMeet7 =p.QuantityDemand7 ;
con.QuantityMeet8 =p.QuantityDemand8 ;
con.QuantityMeet9 =p.QuantityDemand9 ;
con.QuantityMeet10 =p.QuantityDemand10 ;
con.QuantityMeet11 =p.QuantityDemand11 ;
con.QuantityMeet12 =p.QuantityDemand12 ;
con.QuantityMeet13 =p.QuantityDemand13 ;
con.QuantityMeet14 =p.QuantityDemand14 ;
con.QuantityMeet15 =p.QuantityDemand15 ;
con.QuantityMeet16 =p.QuantityDemand16 ;
con.QuantityMeet17 =p.QuantityDemand17 ;
con.QuantityMeet18 =p.QuantityDemand18 ;
con.QuantityMeet19 =p.QuantityDemand19 ;
con.QuantityMeet20 =p.QuantityDemand20 ;
con.QuantityMeet21 =p.QuantityDemand21 ;
con.QuantityMeet22 =p.QuantityDemand22 ;
con.QuantityMeet23 =p.QuantityDemand23 ;
con.QuantityMeet24 =p.QuantityDemand24 ;
con.QuantityMeet25 =p.QuantityDemand25 ;
con.QuantityMeet26 =p.QuantityDemand26 ;
con.QuantityMeet27 =p.QuantityDemand27 ;
con.QuantityMeet28 =p.QuantityDemand28 ;
con.QuantityMeet29 =p.QuantityDemand29 ;
con.QuantityMeet30 =p.QuantityDemand30 ;
con.QuantityMeet31 = p.QuantityDemand31;
list.Add(con);
});
await dbContext.BulkInsertAsync(list, options => { options.Transaction = dbTransaction; options.UseTableLock = false; });
}
return;
}
}
}

15
API/Wood.Service/Controllers/CherySupplierMrpMonthService.cs

@ -1,4 +1,5 @@
using Magicodes.ExporterAndImporter.Core;
using System.Data.Common;
using TaskManager.Contracts.Dtos;
using TaskManager.Controllers;
using TaskManager.Entity;
@ -18,15 +19,10 @@ namespace TaskManager.Controllers
public CherySupplierMrpMonthService(HttpClient httpClient, JobDbContext jobDbContext, LogController log, IRepository<SUPPLIER_MRP_MONTH> repository) : base(httpClient, jobDbContext, log, repository)
{
}
protected override async Task CreateTaskAsync(List<SUPPLIER_MRP_MONTH> plist, JobDbContext dbContext)
protected override async Task ConfirmDataInsertAsync(List<SUPPLIER_MRP_MONTH> plist, JobDbContext dbContext, DbTransaction dbTransaction)
{
var taskId = Guid.NewGuid();
var task = new TaskSub();
task.TaskId = taskId;
task.TaskName = TaskName;
task.Subscriber = Client;
task.TableName = "SUPPLIER_CON_MMRP";
if (plist.Count > 0)
{
List<SUPPLIER_CON_MMRP> list = new List<SUPPLIER_CON_MMRP>();
@ -56,9 +52,12 @@ namespace TaskManager.Controllers
con.QuantityMeet12 = p.QuantityDemand12;
list.Add(con);
});
dbContext.BulkInsert(list, new BulkOperationOptions<SUPPLIER_CON_MMRP>() { UseTableLock = false });
await dbContext.BulkInsertAsync(list, options=> { options.Transaction = dbTransaction; options.UseTableLock = false; });
}
return;
}
}
}

5
API/Wood.Service/Controllers/CherySupplierMrpService.cs

@ -6,7 +6,10 @@ using TaskManager.EntityFramework;
namespace TaskManager.Controllers
{
//日MRP状态监控
/// <summary>
/// 日MRP状态监控
/// </summary>
public class CherySupplierMrpService : CheryRecurringJobOutPageController<SUPPLIER_MRP_STATE, SUPPLIER_MRP_STATE_DETIAL_DTO>
{
public CherySupplierMrpService(HttpClient httpClient, JobDbContext jobDbContext, LogController log, IRepository<SUPPLIER_MRP_STATE> repository) : base(httpClient, jobDbContext, log, repository)

4
API/Wood.Service/Controllers/CherySupplierMrpWarningService.cs

@ -7,6 +7,10 @@ using TaskManager.EntityFramework;
namespace TaskManager.Controllers
{
//日MRP预警推移
/// <summary>
/// 日MRP预警推移
/// </summary>
public class CherySupplierMrpWarningService : CheryRecurringJobOutPageController<SUPPLIER_MRP_WARNING, SUPPLIER_MRP_WARNING_DETAIL_DTO>
{
public CherySupplierMrpWarningService(HttpClient httpClient, JobDbContext jobDbContext, LogController log, IRepository<SUPPLIER_MRP_WARNING> repository) : base(httpClient, jobDbContext, log, repository)

62
API/Wood.Service/Controllers/CherySupplierPoService.cs

@ -1,15 +1,75 @@
using TaskManager.Contracts.Dtos;
using System.Data.Common;
using TaskManager.Contracts.Dtos;
using TaskManager.Controllers;
using TaskManager.Entity;
using TaskManager.Entity.Entitys;
using TaskManager.EntityFramework;
namespace TaskManager.Controllers
{
/// <summary>
/// 采购订单
/// </summary>
public class CherySupplierPoService : CheryRecurringJobOutPageController<SUPPLIER_PO, SUPPLIER_PO_DETAIL_DTO>
{
public CherySupplierPoService(HttpClient httpClient, JobDbContext jobDbContext, LogController log, IRepository<SUPPLIER_PO> repository) : base(httpClient, jobDbContext, log, repository)
{
}
protected override async Task ConfirmDataInsertAsync(List<SUPPLIER_PO> plist, JobDbContext dbContext, DbTransaction dbTransaction)
{
if (plist.Count > 0)
{
List<SUPPLIER_CON_PO> list = new List<SUPPLIER_CON_PO>();
plist.ForEach(p =>
{
var con = new SUPPLIER_CON_PO();
con.SupplierCode = "8EG";
con.PurchaseOrder =p.PurchaseOrder ;
con.SerialNumber =p.SerialNumber ;
con.QuantityMeet =p.QuantityDelivery ;
con.FeedbackResults ="" ;
con.VentureType ="" ;
con.VentureSpecific ="" ;
con.Measures ="";
//con.SupplierCode = "8EG";
//con.ReleaseEdition = p.ReleaseEdition;
//con.MaterialCode = p.MaterialCode;
//con.PlantId = p.PlantId;
//con.FeedbackResults = "0";
//con.VentureType = "1";
//con.VentureSpecific = "1";
//con.Measures = "1";
//con.StartMonth = p.StartMonth;
//con.QuantityMeet1 = p.QuantityDemand1;
//con.QuantityMeet2 = p.QuantityDemand2;
//con.QuantityMeet3 = p.QuantityDemand3;
//con.QuantityMeet4 = p.QuantityDemand4;
//con.QuantityMeet5 = p.QuantityDemand5;
//con.QuantityMeet6 = p.QuantityDemand6;
//con.QuantityMeet7 = p.QuantityDemand7;
//con.QuantityMeet8 = p.QuantityDemand8;
//con.QuantityMeet9 = p.QuantityDemand9;
//con.QuantityMeet10 = p.QuantityDemand10;
//con.QuantityMeet11 = p.QuantityDemand11;
//con.QuantityMeet12 = p.QuantityDemand12;
list.Add(con);
});
await dbContext.BulkInsertAsync(list, options => { options.Transaction = dbTransaction; options.UseTableLock = false; });
}
return;
}
}
}

5
API/Wood.Service/Controllers/CherySupplierPorHSCHEDULService.cs

@ -5,7 +5,10 @@ using TaskManager.EntityFramework;
namespace TaskManager.Controllers
{
//过焊装未过总装
/// <summary>
/// 过焊装未过总装
/// </summary>
public class CherySupplierPorHSCHEDULService : CheryRecurringJobOutPageController<SUPPLIER_PRO_HSCHEDUL, SUPPLIER_PRO_HSCHEDUL_DETAIL_DTO>
{
public CherySupplierPorHSCHEDULService(HttpClient httpClient, JobDbContext jobDbContext, LogController log, IRepository<SUPPLIER_PRO_HSCHEDUL> repository) : base(httpClient, jobDbContext, log, repository)

3
API/Wood.Service/Controllers/CherySupplierProCSCHEDULService.cs

@ -6,6 +6,9 @@ using TaskManager.EntityFramework;
namespace TaskManager.Controllers
{
/// <summary>
/// 排序供货
/// </summary>
public class CherySupplierProCSCHEDULService : CheryRecurringJobOutPageController<SUPPLIER_PRO_CSCHEDUL, SUPPLIER_PRO_CSCHEDUL_DETAIL_DTO>
{
public CherySupplierProCSCHEDULService(HttpClient httpClient, JobDbContext jobDbContext, LogController log, IRepository<SUPPLIER_PRO_CSCHEDUL> repository) : base(httpClient, jobDbContext, log, repository)

3
API/Wood.Service/Controllers/CherySupplierProPlanService.cs

@ -6,6 +6,9 @@ using TaskManager.EntityFramework;
namespace TaskManager.Controllers
{
//整车月度生产计划
/// <summary>
/// 整车月度生产计划
/// </summary>
public class SupplierProPlaningService : CheryRecurringJobOutPageController<SUPPLIER_PRO_PLANING, SUPPLIER_PRO_PLANING_DETIAL_DTO>
{
public SupplierProPlaningService(HttpClient httpClient, JobDbContext jobDbContext, LogController log, IRepository<SUPPLIER_PRO_PLANING> repository) : base(httpClient, jobDbContext, log, repository)

5
API/Wood.Service/Controllers/CherySupplierProTSCHEDULService.cs

@ -5,7 +5,10 @@ using TaskManager.EntityFramework;
namespace TaskManager.Controllers
{
//过涂装未过总装
/// <summary>
/// 过涂装未过总装
/// </summary>
public class CherySupplierProTSCHEDULService : CheryRecurringJobOutPageController<SUPPLIER_PRO_TSCHEDUL, SUPPLIER_PRO_TSCHEDUL_DETAIL_DTO>
{
public CherySupplierProTSCHEDULService(HttpClient httpClient, JobDbContext jobDbContext, LogController log, IRepository<SUPPLIER_PRO_TSCHEDUL> repository) : base(httpClient, jobDbContext, log, repository)

5
API/Wood.Service/Controllers/CherySupplierReturnService.cs

@ -5,7 +5,10 @@ using TaskManager.EntityFramework;
namespace TaskManager.Controllers
{
//退货单
/// <summary>
/// 退货单
/// </summary>
public class CherySupplierReturnService : CheryRecurringJobOutPageController<SUPPLIER_RETURN, SUPPLIER_RETURN_DETAIL_DTO>
{
public CherySupplierReturnService(HttpClient httpClient, JobDbContext jobDbContext, LogController log, IRepository<SUPPLIER_RETURN> repository) : base(httpClient, jobDbContext, log, repository)

2
API/Wood.Service/Controllers/CherySupplierSinvDataService.cs

@ -6,7 +6,7 @@ using TaskManager.EntityFramework;
namespace TaskManager.Controllers
{
public class CherySupplierSinvDataService : CheryRecurringJobOutPageController<SUPPLIER_SINV_DATA, SUPPLIER_SINV_DATA_DETAIL_DTO>
public class CherySupplierSinvDataService : CheryRecurringJobInputPageController<SUPPLIER_SINV_DATA, SUPPLIER_SINV_DATA_DTO>
{
public CherySupplierSinvDataService(HttpClient httpClient, JobDbContext jobDbContext, LogController log, IRepository<SUPPLIER_SINV_DATA> repository) : base(httpClient, jobDbContext, log, repository)
{

156
API/Wood.Service/Controllers/NormalBaseController.cs

@ -1,12 +1,4 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Magicodes.ExporterAndImporter.Core;
using Magicodes.ExporterAndImporter.Core;
using Magicodes.ExporterAndImporter.Core.Extension;
using Magicodes.ExporterAndImporter.Excel;
using Microsoft.AspNetCore.Authorization;
@ -14,11 +6,20 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using TaskManager.Entity;
using TaskManager.EntityFramework;
using TaskManager.EntityFramework.Repository;
using Wood.Entity;
using Wood.Util;
using Wood.Util.Filters;
namespace Wood.Service.Controllers
@ -49,7 +50,7 @@ namespace Wood.Service.Controllers
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}")]
public virtual async Task<ActionResult<T>> GetById(int id)
public async Task<ActionResult<T>> GetById(int id)
{
var entity = await _repository.GetByIdAsync(id);
if (entity == null) return NotFound();
@ -62,7 +63,7 @@ namespace Wood.Service.Controllers
/// <param name="entity"></param>
/// <returns></returns>
[HttpPost]
public virtual async Task<ActionResult<T>> Create(T entity)
public async Task<ActionResult<T>> Create(T entity)
{
entity.CreationTime = DateTime.Now;
var createdEntity = await _repository.AddAsync(entity);
@ -74,7 +75,7 @@ namespace Wood.Service.Controllers
/// <param name="entity"></param>
/// <returns></returns>
[HttpPut("{id}")]
public virtual async Task<IActionResult> Update(T entity)
public async Task<IActionResult> Update(T entity)
{
var _first = await _repository.GetByIdAsync(entity.UId);
if (_first == null)
@ -92,82 +93,131 @@ namespace Wood.Service.Controllers
/// <param name="id"></param>
/// <returns></returns>
[HttpDelete("{id}")]
public virtual async Task<IActionResult> Delete(int id)
public async Task<IActionResult> Delete(int id)
{
await _repository.DeleteAsync(id);
return new JsonResult(new { Code = 200, Message = "删除成功!" }); ;
}
///// <summary>
///// 分页
///// </summary>
///// <param name="pageNumber"></param>
///// <param name="pageSize"></param>
///// <param name="sortBy"></param>
///// <param name="isAscending"></param>
///// <param name="filters"></param>
///// <returns></returns>
//[HttpGet]
//public async Task<ActionResult> GetPaged(
//[FromQuery] int pageNumber = 1,
//[FromQuery] int pageSize = 10,
//[FromQuery] string sortBy = "",
//[FromQuery] bool isAscending = true,
//[FromQuery] Dictionary<string, string> filters = null)
//{
// var pagingParams = new PagingParams
// {
// PageNumber = pageNumber,
// PageSize = pageSize,
// SortBy = sortBy,
// IsAscending = isAscending,
// Filters = filters
// };
// // 可以在这里构建表达式树过滤条件
// Expression<Func<T, bool>> filter = null;
// var pagedResult = await _repository.GetPagedAsync(filter, pagingParams);
// return Ok(pagedResult);
//}
/// <summary>
/// 分页
/// 分页New
/// </summary>
/// <param name="pageNumber"></param>
/// <param name="pageSize"></param>
/// <param name="sortBy"></param>
/// <param name="isAscending"></param>
/// <param name="filters"></param>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet]
public virtual async Task<ActionResult> GetPaged(
[FromQuery] int pageNumber = 1,
[FromQuery] int pageSize = 10,
[FromQuery] string sortBy = "",
[FromQuery] bool isAscending = true,
[FromQuery] Dictionary<string, string> filters = null)
[HttpPost]
public async Task<ActionResult<PagedResult<T>>> GetDataPaged(RequestInputBase input)
{
var pagingParams = new PagingParams
{
PageNumber = pageNumber,
PageSize = pageSize,
SortBy = sortBy,
IsAscending = isAscending,
Filters = filters
PageNumber = input.pageNumber,
PageSize = input.pageSize,
SortBy = input.sortBy,
IsAscending = input.isAscending,
};
// 可以在这里构建表达式树过滤条件
Expression<Func<T, bool>> filter = null;
var pagedResult = await _repository.GetPagedAsync(filter, pagingParams);
var pagedResult = await _repository.GetDataPagedAsync(filter, pagingParams, input.Condition);
return Ok(pagedResult);
}
/// <summary>
/// 导出
/// 导出New
/// </summary>
/// <param name="pageNumber"></param>
/// <param name="pageSize"></param>
/// <param name="sortBy"></param>
/// <param name="isAscending"></param>
/// <param name="filters"></param>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet]
public virtual async Task<FileStreamResult> Export([FromQuery] int pageNumber = 1,
[FromQuery] int pageSize = 10,
[FromQuery] string sortBy = "",
[FromQuery] bool isAscending = true,
[FromQuery] Dictionary<string, string> filters = null)
[HttpPost]
public async Task<FileStreamResult> ExportData(RequestInputBase input)
{
var pagingParams = new PagingParams
{
PageNumber = pageNumber,
PageSize = pageSize,
SortBy = sortBy,
IsAscending = isAscending,
Filters = filters
PageNumber = input.pageNumber,
PageSize = input.pageSize,
SortBy = input.sortBy,
IsAscending = input.isAscending,
};
// 可以在这里构建表达式树过滤条件
//Expression<Func<T, bool>> filter = null;
var pagedResult = await _repository.GetPagedAsync(null, pagingParams);
var pagedResult = await _repository.GetDataPagedAsync(null, pagingParams, input.Condition);
return await ExportFile(pagedResult.Data, Guid.NewGuid().ToString() + ".xlsx");
}
}
// /// <summary>
// /// 导出
// /// </summary>
// /// <param name="pageNumber"></param>
// /// <param name="pageSize"></param>
// /// <param name="sortBy"></param>
// /// <param name="isAscending"></param>
// /// <param name="filters"></param>
// /// <returns></returns>
// [HttpGet]
// public async Task<FileStreamResult> Export([FromQuery] int pageNumber = 1,
//[FromQuery] int pageSize = 10,
//[FromQuery] string sortBy = "",
//[FromQuery] bool isAscending = true,
//[FromQuery] Dictionary<string, string> filters = null)
// {
// var pagingParams = new PagingParams
// {
// PageNumber = pageNumber,
// PageSize = pageSize,
// SortBy = sortBy,
// IsAscending = isAscending,
// Filters = filters
// };
// // 可以在这里构建表达式树过滤条件
// //Expression<Func<T, bool>> filter = null;
// var pagedResult = await _repository.GetPagedAsync(null, pagingParams);
// return await ExportFile(pagedResult.Data, Guid.NewGuid().ToString() + ".xlsx");
// }
protected async Task<FileStreamResult> ExportFile(ICollection<T> dtos, string fileName)
{
var excelExporter = HttpContext.RequestServices.GetRequiredService<IExcelExporter>();

6
API/Wood.Service/Controllers/SupplierPoService.cs

@ -1,6 +0,0 @@
namespace TaskManager.Controllers
{
public class SupplierPoService
{
}
}

4
API/Wood.Service/Controllers/TaskConifgureController.cs

@ -529,7 +529,7 @@ namespace TaskManager.Controllers
);
break;
case "日物料需求计划风险确认":
RecurringJob.AddOrUpdate<SupplierConDateService>(
RecurringJob.AddOrUpdate<CherySupplierConDateService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client),
task.Corn,
@ -537,7 +537,7 @@ namespace TaskManager.Controllers
);
break;
case "采购订单风险确认":
RecurringJob.AddOrUpdate<SupplierPoService>(
RecurringJob.AddOrUpdate<CherySupplierConPoService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client),
task.Corn,

112
API/Wood.Util/EntityHelper.cs

@ -13,62 +13,62 @@ using System.Text.RegularExpressions;
namespace Wood.Util
{
public class PagedResult<T>
{
public List<T> Items { get; set; }
public int TotalItems { get; set; }
public int PageNumber { get; set; }
public int PageSize { get; set; }
public int TotalPages => (int)Math.Ceiling(TotalItems / (double)PageSize);
public bool HasPreviousPage => PageNumber > 1;
public bool HasNextPage => PageNumber < TotalPages;
public PagedResult()
{
Items = new List<T>();
}
}
public static class QueryableExtensions
{
public static PagedResult<T> ToPagedResult<T>(this IQueryable<T> query, int pageNumber, int pageSize)
{
var result = new PagedResult<T>
{
PageNumber = pageNumber,
PageSize = pageSize,
TotalItems = query.Count()
};
result.Items = query
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize)
.ToList();
return result;
}
public static IQueryable<T> ApplySorting<T>(this IQueryable<T> query, string sortField, string sortDirection)
{
if (string.IsNullOrEmpty(sortField))
return query;
var parameter = Expression.Parameter(typeof(T), "x");
var property = Expression.Property(parameter, sortField);
var lambda = Expression.Lambda(property, parameter);
string methodName = sortDirection?.ToLower() == "desc" ? "OrderByDescending" : "OrderBy";
var resultExpression = Expression.Call(
typeof(Queryable),
methodName,
new[] { typeof(T), property.Type },
query.Expression,
Expression.Quote(lambda));
return query.Provider.CreateQuery<T>(resultExpression);
}
}
//public class PagedResult<T>
//{
// public List<T> Items { get; set; }
// public int TotalItems { get; set; }
// public int PageNumber { get; set; }
// public int PageSize { get; set; }
// public int TotalPages => (int)Math.Ceiling(TotalItems / (double)PageSize);
// public bool HasPreviousPage => PageNumber > 1;
// public bool HasNextPage => PageNumber < TotalPages;
// public PagedResult()
// {
// Items = new List<T>();
// }
//}
//public static class QueryableExtensions
//{
// public static PagedResult<T> ToPagedResult<T>(this IQueryable<T> query, int pageNumber, int pageSize)
// {
// var result = new PagedResult<T>
// {
// PageNumber = pageNumber,
// PageSize = pageSize,
// TotalItems = query.Count()
// };
// result.Items = query
// .Skip((pageNumber - 1) * pageSize)
// .Take(pageSize)
// .ToList();
// return result;
// }
// public static IQueryable<T> ApplySorting<T>(this IQueryable<T> query, string sortField, string sortDirection)
// {
// if (string.IsNullOrEmpty(sortField))
// return query;
// var parameter = Expression.Parameter(typeof(T), "x");
// var property = Expression.Property(parameter, sortField);
// var lambda = Expression.Lambda(property, parameter);
// string methodName = sortDirection?.ToLower() == "desc" ? "OrderByDescending" : "OrderBy";
// var resultExpression = Expression.Call(
// typeof(Queryable),
// methodName,
// new[] { typeof(T), property.Type },
// query.Expression,
// Expression.Quote(lambda));
// return query.Provider.CreateQuery<T>(resultExpression);
// }
//}
//public static class DataTableHelper

13
API/Wood.Util/Filters/Condition.cs

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Wood.Util.Filters
{
public class Condition
{
public ICollection<Filter> Filters { get; set; } = new List<Filter>();
}
}

69
API/Wood.Util/Filters/EnumFilterAction.cs

@ -0,0 +1,69 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Wood.Util.Filters
{
/// <summary>
/// 过滤条件
/// </summary>
public enum EnumFilterAction
{
/// <summary>
/// equal
/// </summary>
[Description("等于")] Equal = 0,
/// <summary>
/// Not equal
/// </summary>
[Description("不等于")] NotEqual = 1,
/// <summary>
/// Bigger
/// </summary>
[Description("大于")] BiggerThan = 2,
/// <summary>
/// Smaller
/// </summary>
[Description("小于")] SmallThan = 3,
/// <summary>
/// Bigger or equal
/// </summary>
[Description("大于等于")] BiggerThanOrEqual = 4,
/// <summary>
/// Small or equal
/// </summary>
[Description("小于等于")] SmallThanOrEqual = 5,
/// <summary>
/// Like
/// </summary>
[Description("类似于")] Like = 6,
/// <summary>
/// Not like
/// </summary>
[Description("不类似于")] NotLike = 7,
/// <summary>
/// Contained in
/// List<string > items = new List<string>();
/// string value = JsonSerializer.Serialize(items);//转成Json字符串
///FilterCondition filterCondition = new FilterCondition() { Column = "Name", Value = value, Action = EnumFilterAction.In, Logic = EnumFilterLogic.And };
/// </summary>
[Description("包含于")] In = 8,
/// <summary>
/// Not contained in
/// </summary>
[Description("不包含于")] NotIn = 9,
}
}

21
API/Wood.Util/Filters/EnumFilterLogic.cs

@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Wood.Util.Filters
{
public enum EnumFilterLogic
{
/// <summary>
/// 与
/// </summary>
And = 0,
/// <summary>
/// 或
/// </summary>
Or = 1
}
}

48
API/Wood.Util/Filters/Filter.cs

@ -0,0 +1,48 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Wood.Util.Filters
{
public class Filter
{
public Filter()
{
Logic = "And";
}
public Filter(string column, string value,
string action = "==",
string logic = "And")
{
Column = column;
Action = action;
Value = value;
Logic = logic;
}
/// <summary>
/// 过滤条件之间的逻辑关系:AND和OR
/// </summary>
public string Logic { get; set; } = "And";
/// <summary>
/// 过滤条件中使用的数据列
/// </summary>
public string Column { get; set; }
/// <summary>
/// 过滤条件中的操作:==,!=,>,<,>=,<=,In,NotIn,Like,NotLike
/// Equal、NotEqual、BiggerThan、SmallThan、BiggerThanOrEqual、SmallThanOrEqual、In、NotIn
/// </summary>
public string Action { get; set; } = "==";
/// <summary>
/// 过滤条件中的操作的值
/// </summary>
public string Value { get; set; }
}
}

337
API/Wood.Util/Filters/FilterExtensions.cs

@ -0,0 +1,337 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
namespace Wood.Util.Filters
{
public static class FilterExtensions
{
public static Expression<Func<T, bool>> ToLambda<T>(this string jsonFilter)
{
if (string.IsNullOrWhiteSpace(jsonFilter))
{
return p => true;
}
var filterConditions = JsonSerializer.Deserialize<List<Filter>>(jsonFilter);
return filterConditions.ToLambda<T>();
}
public static Expression<Func<T, bool>> ToLambda<T>(this Filter filter)
{
var filterConditions = new List<Filter> { filter };
return filterConditions.ToLambda<T>();
}
public static Expression<Func<T, bool>> ToLambda<T>(this ICollection<Filter> filterConditionList)
{
Expression<Func<T, bool>> condition = null;
try
{
if (!filterConditionList.Any())
{
//创建默认表达式
return p => true;
}
foreach (var filterCondition in filterConditionList)
{
var tempCondition = CreateLambda<T>(filterCondition);
if (condition == null)
{
condition = tempCondition;
}
else
{
condition = filterCondition.Logic switch
{
"And" => condition.And(tempCondition),
"Or" => condition.Or(tempCondition),
_ => condition
};
}
}
}
catch (Exception ex)
{
throw new Exception($"获取筛选条件异常:{ex.Message}");
}
return condition;
}
private static Expression<Func<T, bool>> CreateLambda<T>(Filter filter)
{
Expression<Func<T, bool>> expression = p => false;
try
{
var parameter = Expression.Parameter(typeof(T), "p"); //创建参数p
var member = Expression.PropertyOrField(parameter, filter.Column); //创建表达式中的属性或字段
// var propertyType = member.Type; //取属性类型,常量constant按此类型进行转换
//var constant = Expression.Constant(filterCondition.Value);//创建常数
ConstantExpression constant = null;
if (filter.Action != "In" && filter.Action != "NotIn")
{
constant = CreateConstantExpression(member.Type, filter.Value);
}
switch (filter.Action.ToLower())
{
case "==":
expression = Expression.Lambda<Func<T, bool>>(Expression.Equal(member, constant), parameter);
break;
case "!=":
expression = Expression.Lambda<Func<T, bool>>(Expression.NotEqual(member, constant), parameter);
break;
case ">":
expression = Expression.Lambda<Func<T, bool>>(Expression.GreaterThan(member, constant), parameter);
break;
case "<":
expression = Expression.Lambda<Func<T, bool>>(Expression.LessThan(member, constant), parameter);
break;
case ">=":
expression = Expression.Lambda<Func<T, bool>>(Expression.GreaterThanOrEqual(member, constant), parameter);
break;
case "<=":
expression = Expression.Lambda<Func<T, bool>>(Expression.LessThanOrEqual(member, constant), parameter);
break;
case "like":
expression = GetExpressionLikeMethod<T>("Contains", filter);
break;
case "notlike":
expression = GetExpressionNotLikeMethod<T>("Contains", filter);
break;
case "in":
expression = GetExpressionInMethod<T>("Contains", member.Type, filter);
break;
case "notin":
expression = GetExpressionNotInMethod<T>("Contains", member.Type, filter);
break;
default:
break;
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
return expression;
}
/// <summary>
///
/// </summary>
/// <param name="propertyType"></param>
/// <param name="value"></param>
/// <returns></returns>
private static ConstantExpression CreateConstantExpression(Type propertyType, string value)
{
ConstantExpression constant;
try
{
if (propertyType.IsGenericType &&
propertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
{
var objValue = Convert.ChangeType(value, propertyType.GetGenericArguments()[0], CultureInfo.InvariantCulture);
constant = Expression.Constant(objValue);
}
else if (propertyType.IsEnum)
{
var enumValue = (Enum)Enum.Parse(propertyType, value, true);
constant = Expression.Constant(enumValue);
}
else
{
constant = propertyType.Name switch
{
"Guid" => Expression.Constant(Guid.Parse(value)),
_ => Expression.Constant(Convert.ChangeType(value, propertyType, CultureInfo.InvariantCulture))
};
}
}
catch (Exception ex)
{
throw new Exception($"获取ConstantExpression异常:{ex.Message}");
}
return constant;
}
private static Expression<Func<T, bool>> GetExpressionLikeMethod<T>(string methodName, Filter filter)
{
var parameterExpression = Expression.Parameter(typeof(T), "p");
// MethodCallExpression methodExpression = GetMethodExpression(methodName, filterCondition.Column, filterCondition.Value, parameterExpression);
var methodExpression = GetMethodExpression(methodName, filter.Column, filter.Value,
parameterExpression);
return Expression.Lambda<Func<T, bool>>(methodExpression, parameterExpression);
}
private static Expression<Func<T, bool>> GetExpressionNotLikeMethod<T>(string methodName, Filter filter)
{
var parameterExpression = Expression.Parameter(typeof(T), "p");
var methodExpression = GetMethodExpression(methodName, filter.Column, filter.Value,
parameterExpression);
var notMethodExpression = Expression.Not(methodExpression);
return Expression.Lambda<Func<T, bool>>(notMethodExpression, parameterExpression);
}
/// <summary>
/// 生成guidList.Contains(p=>p.GUId);
/// 除String类型,其他类型涉及到类型转换.如GUID
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="methodName">Contains</param>
/// <param name="propertyType">PropertyType/typeof(GUId)</param>
/// <param name="filter">PropertyName/PropertyValue</param>
/// <returns></returns>
private static Expression<Func<T, bool>> GetExpressionInMethod<T>(string methodName, Type propertyType, Filter filter)
{
var parameterExpression = Expression.Parameter(typeof(T), "p");
Type lstType = typeof(List<>).MakeGenericType(propertyType);
//转换枚举
//if (propertyType.IsEnum)
//{
// var valueArrayStrings = JsonSerializer.Deserialize<List<string>>(filter.Value);
// List<object> newValues = new List<object>();
// var enumValues = propertyType.GetEnumValues();
// foreach (var valueArray in valueArrayStrings)
// {
// foreach (var enumValue in enumValues)
// {
// if (enumValue.ToString() == valueArray)
// {
// newValues.Add(enumValue);
// break;
// }
// }
// }
// var newValue = JsonSerializer.Serialize(newValues);
// filter.Value = newValue;
//}
object propertyValue = JsonSerializer.Deserialize(filter.Value, lstType);
if (propertyValue != null)
{
var methodExpression = GetListMethodExpression(methodName, propertyType, filter.Column, propertyValue, parameterExpression);
var expression = Expression.Lambda<Func<T, bool>>(methodExpression, parameterExpression);
return expression;
}
else
{
return p => false;
}
}
private static Expression<Func<T, bool>> GetExpressionNotInMethod<T>(string methodName, Type propertyType, Filter filter)
{
var parameterExpression = Expression.Parameter(typeof(T), "p");
Type lstType = typeof(List<>).MakeGenericType(propertyType);
object propertyValue = JsonSerializer.Deserialize(filter.Value, lstType);
if (propertyValue != null)
{
var methodExpression = GetListMethodExpression(methodName, propertyType, filter.Column, propertyValue, parameterExpression);
var notMethodExpression = Expression.Not(methodExpression);
return Expression.Lambda<Func<T, bool>>(notMethodExpression, parameterExpression);
}
else
{
return p => false;
}
}
private static MethodCallExpression GetListMethodExpression(string methodName, Type propertyType, string propertyName, object propertyValue, ParameterExpression parameterExpression)
{
var propertyExpression = Expression.Property(parameterExpression, propertyName); //p.GUID
Type type = typeof(List<>).MakeGenericType(propertyType);
var method = type.GetMethod(methodName);//获取 List.Contains()
var someValue = Expression.Constant(propertyValue);//Value
return Expression.Call(someValue, method, propertyExpression);
}
/// <summary>
/// 生成类似于p=>p.Code.Contains("xxx");的lambda表达式
/// parameterExpression标识p,propertyName表示values,propertyValue表示"Code",methodName表示Contains
/// 仅处理p的属性类型为string这种情况
/// </summary>
/// <param name="methodName"></param>
/// <param name="propertyName"></param>
/// <param name="propertyValue"></param>
/// <param name="parameterExpression"></param>
/// <returns></returns>
private static MethodCallExpression GetMethodExpression(string methodName, string propertyName,
string propertyValue, ParameterExpression parameterExpression)
{
var propertyExpression = Expression.Property(parameterExpression, propertyName);
var method = typeof(string).GetMethod(methodName, new[] { typeof(string) });
var someValue = Expression.Constant(propertyValue, typeof(string));
return Expression.Call(propertyExpression, method, someValue);
}
/// <summary>
/// 默认True条件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static Expression<Func<T, bool>> True<T>()
{
return f => true;
}
/// <summary>
/// 默认False条件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static Expression<Func<T, bool>> False<T>()
{
return f => false;
}
/// <summary>
/// 拼接 OR 条件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="exp"></param>
/// <param name="condition"></param>
/// <returns></returns>
private static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> exp, Expression<Func<T, bool>> condition)
{
var inv = Expression.Invoke(condition, exp.Parameters);
return Expression.Lambda<Func<T, bool>>(Expression.Or(exp.Body, inv), exp.Parameters);
}
/// <summary>
/// 拼接And条件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="exp"></param>
/// <param name="condition"></param>
/// <returns></returns>
private static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> exp, Expression<Func<T, bool>> condition)
{
var inv = Expression.Invoke(condition, exp.Parameters);
return Expression.Lambda<Func<T, bool>>(Expression.And(exp.Body, inv), exp.Parameters);
}
}
}

23
API/Wood.Util/Filters/RequestInputBase.cs

@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Wood.Util.Filters
{
public class RequestInputBase
{
public int pageNumber { get; set; }
public int pageSize { get; set; }
public string sortBy { get; set; }
public bool isAscending { get; set; }
/// <summary>
/// 条件
/// </summary>
public Condition Condition { get; set; } = new();
}
}
Loading…
Cancel
Save