/* *所有关于Dt_outboundorder_detail类的业务代码应在此处编写 *可使用repository.调用常用方法,获取EF/Dapper等信息 *如果需要事务请使用repository.DbContextBeginTransaction *也可使用DBServerProvider.手动获取数据库相关信息 *用户信息、权限、角色等使用UserContext.Current操作 *Dt_outboundorder_detailService对增、删、改查、导入、导出、审核业务代码扩展参照ServiceFunFilter */ using WIDESEA.Core.BaseProvider; using WIDESEA.Core.Extensions.AutofacManager; using WIDESEA.Entity.DomainModels; using System.Linq; using WIDESEA.Core.Utilities; using System.Linq.Expressions; using WIDESEA.Core.Extensions; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.AspNetCore.Http; using WIDESEA.Services.IRepositories; using System; using System.Collections.Generic; using WIDESEA.Common.CustomModels; namespace WIDESEA.Services.Services { public partial class Dt_outboundorder_detailService { private readonly IHttpContextAccessor _httpContextAccessor; private readonly IDt_outboundorder_detailRepository _repository;//访问数据库 [ActivatorUtilitiesConstructor] public Dt_outboundorder_detailService( IDt_outboundorder_detailRepository dbRepository, IHttpContextAccessor httpContextAccessor ) : base(dbRepository) { _httpContextAccessor = httpContextAccessor; _repository = dbRepository; //多租户会用到这init代码,其他情况可以不用 //base.Init(dbRepository); } /// /// 分配库存 /// /// public WebResponseContent AllocateInventory(List containers, decimal outneedQty) { WebResponseContent content = new WebResponseContent(); List respContainers = new List(); List countContainers = containers; try { containers = containers.OrderBy(x => x.InboundDatetime).ToList(); decimal sumqty = 0; int count = Convert.ToInt32(Math.Ceiling(outneedQty / 2500)); int outcount = count; int cunt = 1; foreach (var item in containers) { if (count <= outcount / 2) { LocationContainer Container = countContainers.OrderBy(x => Math.Abs((x.text1.GetValueOrDefault() + sumqty) - (outneedQty - sumqty))).FirstOrDefault(); respContainers.Add(Container); countContainers.Remove(Container); sumqty += Container.text1.GetValueOrDefault(); if (count == 1) { break; } count--; cunt++; } else { LocationContainer Container = countContainers.FirstOrDefault(); respContainers.Add(Container); countContainers.Remove(Container); sumqty += Container.text1.GetValueOrDefault(); count--; cunt++; } } content.OK(data: respContainers); } catch (Exception ex) { content.Error(ex.Message); } return content; } public WebResponseContent AllocateInventorys(List containers, decimal outneedQty) { WebResponseContent content = new WebResponseContent(); List respContainers = new List(); List countContainers = containers; try { containers = containers.OrderBy(x => x.InboundDatetime).ToList(); decimal sumqty = 0; int count = Convert.ToInt32(outneedQty / 2500); int outcount = count; int cunt = 1; #region //foreach (var item in containers) //{ // if (cunt > outcount / 2) // { // if (count < 2) // { // LocationContainer Container = countContainers.OrderBy(x => Math.Abs((x.text1.GetValueOrDefault() + sumqty) - outneedQty - 200)).FirstOrDefault(); // respContainers.Add(Container); // countContainers.Remove(Container); // sumqty += Container.text1.GetValueOrDefault(); // break; // } // else // { // LocationContainer Container = countContainers.OrderBy(x => x.text1.GetValueOrDefault()).FirstOrDefault(); // respContainers.Add(Container); // countContainers.Remove(Container); // sumqty += Container.text1.GetValueOrDefault(); // count--; // cunt++; // } // } // else // { // LocationContainer Container = countContainers.OrderByDescending(x => x.text1.GetValueOrDefault()).FirstOrDefault(); // respContainers.Add(Container); // countContainers.Remove(Container); // sumqty += Container.text1.GetValueOrDefault(); // count--; // cunt++; // } //} #endregion foreach (var item in containers) { if (count <= outcount / 2) { LocationContainer Container = countContainers.OrderBy(x => Math.Abs((x.text1.GetValueOrDefault() + sumqty) - (outneedQty - sumqty))).FirstOrDefault(); respContainers.Add(Container); countContainers.Remove(Container); sumqty += Container.text1.GetValueOrDefault(); if (count == 1) { break; } count--; cunt++; } else { LocationContainer Container = countContainers.FirstOrDefault(); respContainers.Add(Container); countContainers.Remove(Container); sumqty += Container.text1.GetValueOrDefault(); count--; cunt++; } } content.OK(data: respContainers); } catch (Exception ex) { content.Error(ex.Message); } return content; } public List numGroupRows(List arr, decimal sum, int start = 0) { List find = new List(); for (int i = start; i < arr.Count; i++) find.Add(arr[i]); find = find.FindAll(S => S == sum); bool flag = false; if (find.Count > 0) { find = new List { find[0] }; flag = true; return find; } else { for (int i = start; i < arr.Count; i++) { decimal qty = arr[i]; if (qty < sum) { find.Add(arr[i]); sum -= qty; } List findTem = numGroupRows(arr, sum, i + 1); if (findTem.Count > 0) { find.AddRange(findTem); } else { find.Remove(arr[i]); sum += qty; } if (flag) { break; } } } return find; } /// /// 货车分配 /// /// /// /// public List MC_combination(List args, decimal argsum) { #region List> list = new List>(); List result = new List(); List List2 = args; Console.WriteLine(123); for (int i = 0; i < List2.Count; i++) { List List3 = new List(); List3.Add(List2[i]); List2.RemoveAt(i); for (int j = 0; j < List2.Count; j++) { if ((decimal)List2[j] <= argsum - List3.Sum()) { List3.Add(List2[j]); List2.RemoveAt(j); j = -1; } } list.Add(List3); i = -1; } foreach (var item in list) { Console.WriteLine(item.Sum()); if (item.Sum() >= argsum - 500) { result = item; break; } } return result; #endregion } /// /// 集装箱分配 /// /// /// /// public List MC_combinationJ(List args, decimal argsum) { #region 获取数组中(多个数)相加和等于(<=)给定值的算法 List> list = new List>(); List result = new List(); List List2 = args;//整型数组转list for (int i = 0; i < List2.Count; i++) { List List3 = new List(); List3.Add(List2[i]); List2.RemoveAt(i); for (int j = 0; j < List2.Count; j++) { if ((decimal)List2[j] <= argsum - List3.Sum()) { List3.Add(List2[j]); List2.RemoveAt(j); j = -1; } } list.Add(List3); i = -1; } foreach (var item in list) { Console.WriteLine(item.Sum()); if (item.Sum() >= argsum - 1000) { result = item; break; } } return result; #endregion } private decimal ToTalNum = 0; public List MC_Hcombination(List containers, List totalContainers, decimal outneedQty, bool flag) { List locationContainers = totalContainers; List locations = containers.OrderBy(x => x.InboundDatetime).ToList(); int count = Convert.ToInt32(outneedQty / 2500); if (!flag) { for (int i = 0; i < count; i++) { locationContainers.Add(locations[0]); locations.Remove(locations[0]); } } decimal totalSum = locationContainers.Select(x => x.text1.GetValueOrDefault()).Sum(); if (totalSum == ToTalNum) { throw new Exception("分配出问题啦!"); } if (totalSum > outneedQty) { ToTalNum = locationContainers.Select(x => x.text1.GetValueOrDefault()).Sum(); List locations1 = locationContainers.OrderByDescending(x => x.text1.GetValueOrDefault()).ToList(); locations = locations.OrderBy(x => x.text1.GetValueOrDefault()).ToList(); LocationContainer bigcontainer = locations1[1]; LocationContainer smillcontainer = locations[1]; locationContainers.Remove(bigcontainer); locationContainers.Add(smillcontainer); locations.Remove(smillcontainer); locations.Add(bigcontainer); locationContainers = MC_Hcombination(locations, locationContainers, outneedQty, true); totalSum = locationContainers.Select(x => x.text1.GetValueOrDefault()).Sum(); ToTalNum = 0; } else if (totalSum < outneedQty - 500) { ToTalNum = locationContainers.Select(x => x.text1.GetValueOrDefault()).Sum(); List locations1 = locationContainers.OrderBy(x => x.text1.GetValueOrDefault()).ToList(); locations = locations.OrderByDescending(x => x.text1.GetValueOrDefault()).ToList(); LocationContainer smillcontainer = locations1[1]; LocationContainer bigcontainer = locations[1]; locationContainers.Add(bigcontainer); locationContainers.Remove(smillcontainer); locations.Add(smillcontainer); locations.Remove(bigcontainer); locationContainers = MC_Hcombination(locations, locationContainers, outneedQty, true); totalSum = locationContainers.Select(x => x.text1.GetValueOrDefault()).Sum(); ToTalNum = 0; } return locationContainers; } } }