zhuangpei-mesbackend/DOAN.Service/MES/mm/MmRequirePlanService.cs
2024-12-10 09:13:15 +08:00

438 lines
17 KiB
C#

using System;
using System.Linq;
using SqlSugar;
using Infrastructure.Attribute;
using Infrastructure.Extensions;
using DOAN.Model;
using DOAN.Model.Dto;
using DOAN.Repository;
using DOAN.Model.MES.mm.Dto;
using DOAN.Model.MES.mm;
using DOAN.Service.group.IService;
using SqlSugar.Extensions;
using DOAN.Model.MES.product;
using DOAN.Model.MES.base_;
using Microsoft.Extensions.Logging;
using NPOI;
using DOAN.Model.MES.ERP;
using DOAN.Service.MES.mm.IService;
using Mapster;
using Microsoft.AspNetCore.Http.HttpResults;
using Infrastructure.Converter;
namespace DOAN.Service.MES.mm
{
/// <summary>
/// 物料需求计划Service业务层处理
/// </summary>
[AppService(ServiceType = typeof(IMmRequirePlanService), ServiceLifetime = LifeTime.Transient)]
public class MmRequirePlanService : BaseService<MmRequirePlan>, IMmRequirePlanService
{
private readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
/// <summary>
/// 生成物料需求计划
/// </summary>
/// <param name="plan_date"></param>
/// <param name="name"></param>
/// <returns></returns>
public int GenerateMmRequirePlan(DateTime plan_date, string name)
{
int result = 0;
plan_date = plan_date.ToLocalTime().Date;
Dictionary<string, float> need_Materials = new Dictionary<string, float>();
Dictionary<string, HashSet<string>> need_Materials_workOrder = new Dictionary<string, HashSet<string>>();
List<MmRequirePlan> mmRequirePlans = new List<MmRequirePlan>();
//获取当天所有工单
List<ProWorkorder> ProWorkorderList = Context.Queryable<ProWorkorder>().Where(it => it.WorkorderDate == plan_date).ToList();
//优化获取BOM
List<BaseMaterialBom> boms_All = Context.Queryable<BaseMaterialBom>().Where(it => SqlFunc.Subqueryable<ProWorkorder>().Where(pw => pw.ProductionCode == it.InvCode).Any()).ToList();
if (ProWorkorderList != null && ProWorkorderList.Count > 0)
{
foreach (var workorder_item in ProWorkorderList)
{
//遍历每个工单的产品
if (!string.IsNullOrEmpty(workorder_item.ProductionCode))
{
//每个产品的原材料 BOM
//var query= Context.Queryable<BaseMaterialBom>().Where(it => it.InvCode == workorder_item.ProductionCode);
List<BaseMaterialBom> boms = boms_All.Where(it => it.InvCode == workorder_item.ProductionCode).ToList();
if (boms != null && boms.Count > 0)
{
//遍历所有子件
foreach (var item in boms)
{
float need_num = (workorder_item.DeliveryNum ?? 1) * (float.Parse(item.Iusequantity));
if (need_Materials.ContainsKey(item.SubInvCode))
{
float pre_num = need_Materials[item.SubInvCode];
need_Materials[item.SubInvCode] = pre_num + need_num;
}
else
{
need_Materials.Add(item.SubInvCode, need_num);
}
if (need_Materials_workOrder.ContainsKey(item.SubInvCode))
{
need_Materials_workOrder[item.SubInvCode].Add(workorder_item.Workorder);
}
else
{
need_Materials_workOrder.Add(item.SubInvCode, new HashSet<string>() { workorder_item.Workorder });
}
}
}
}
}
}
if (need_Materials.Count > 0)
{
string[] SubInvCode = need_Materials.Keys.ToArray();
List<BaseMaterialList> baseMaterialList = Context.Queryable<BaseMaterialList>().Where(it => SubInvCode.Contains(it.Code)).ToList();
if (baseMaterialList != null && baseMaterialList.Count() > 0)
{
string[] search_codes = baseMaterialList.Select(it => it.Code).ToArray();
var childDb = Context.AsTenant().GetConnectionWithAttr<CustDevMesCurrentStock>();
var search_code_List = childDb.Queryable<CustDevMesCurrentStock>().Where(it => search_codes.Contains(it.InvCode)).ToList();
foreach (var item in baseMaterialList)
{
decimal IQuantity = search_code_List.Where(it => it.InvCode == item.Code).Select(it => it.IQuantity).FirstOrDefault();
MmRequirePlan mmRequirePlan = new MmRequirePlan();
mmRequirePlan.Id = XueHua;
mmRequirePlan.MaterialCode = item.Code;
mmRequirePlan.MaterialName = item.Name;
mmRequirePlan.RequireNum = (decimal)(need_Materials.TryGetValue(item.Code, out float value) ? value : default(float));
mmRequirePlan.WhQuantity = IQuantity;
mmRequirePlan.RequireDate = plan_date;
if (mmRequirePlan.RequireNum > mmRequirePlan.WhQuantity)
{
mmRequirePlan.IsSufficient = 1;
}
else
{
mmRequirePlan.IsSufficient = 2;
}
mmRequirePlan.CreatedBy = name;
mmRequirePlan.CreatedTime = DateTime.Now;
if (need_Materials_workOrder.ContainsKey(item.Code))
{
mmRequirePlan.WorkorderArray = String.Join(", ", need_Materials_workOrder[item.Code].ToArray());
}
mmRequirePlans.Add(mmRequirePlan);
}
}
}
if (mmRequirePlans.Count > 0)
{
UseTran2(() =>
{
Context.Deleteable<MmRequirePlan>().Where(it => it.RequireDate == plan_date).ExecuteCommand();
result = Context.Insertable(mmRequirePlans).ExecuteCommand();
});
}
return result;
}
/// <summary>
/// 查询物料需求计划列表
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
public PagedInfo<MmRequirePlanDto> GetList(MmRequirePlanQueryDto parm)
{
var predicate = Expressionable.Create<MmRequirePlan>()
.AndIF(!string.IsNullOrEmpty(parm.MaterialCode), it => it.MaterialCode.Contains(parm.MaterialCode))
.AndIF(!string.IsNullOrEmpty(parm.MaterialName), it => it.MaterialName.Contains(parm.MaterialName))
.AndIF(parm.RequireDate != null && parm.RequireDate > DateTime.MinValue, it => it.RequireDate == parm.RequireDate.Value.ToLocalTime().Date)
;
var response = Queryable()
.Where(predicate.ToExpression())
.ToPage<MmRequirePlan, MmRequirePlanDto>(parm);
if (response != null && response.Result != null && response.Result.Count > 0)
{
foreach (var item in response.Result)
{
item.LackQuantity = (item.RequireNum - item.WhQuantity) > 0 ? (item.RequireNum - item.WhQuantity) : 0;
}
}
return response;
}
/// <summary>
/// 获取详情
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
public MmRequirePlan GetInfo(string Id)
{
var response = Queryable()
.Where(x => x.Id == Id)
.First();
return response;
}
/// <summary>
/// 添加物料需求计划
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public MmRequirePlan AddMmRequirePlan(MmRequirePlan model)
{
model.Id = XueHua;
model.RequireDate = model.RequireDate.Value.Date;
return Context.Insertable(model).ExecuteReturnEntity();
}
/// <summary>
/// 修改物料需求计划
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public int UpdateMmRequirePlan(MmRequirePlan model)
{
//var response = Update(w => w.Id == model.Id, it => new MmRequirePlan()
//{
// MaterialCode = model.MaterialCode,
// MaterialName = model.MaterialName,
// RequireNum = model.RequireNum,
// RequireDate = model.RequireDate,
// IsSufficient = model.IsSufficient,
// SufficientTime = model.SufficientTime,
// CreatedBy = model.CreatedBy,
// CreatedTime = model.CreatedTime,
// UpdatedBy = model.UpdatedBy,
// UpdatedTime = model.UpdatedTime,
// Name = model.Name,
//});
//return response;
return Update(model, true);
}
/// <summary>
/// 更新物料状态
/// </summary>
/// <param name="id"></param>
/// <param name="status"></param>
/// <param name="name"></param>
/// <returns></returns>
public int UpdateMaterialStatus(string id, int status, string name)
{
return Context.Updateable<MmRequirePlan>().SetColumns(it => it.IsSufficient == status)
.SetColumns(it => it.UpdatedBy == name)
.SetColumns(it => it.UpdatedTime == DateTime.Now)
.Where(it => it.Id == id)
.ExecuteCommand();
}
public int AllUpdateMaterialStatus(DateTime? handledate, int status, string name)
{
return Context.Updateable<MmRequirePlan>().SetColumns(it => it.IsSufficient == status)
.SetColumns(it => it.UpdatedBy == name)
.SetColumns(it => it.UpdatedTime == DateTime.Now)
.Where(it => it.RequireDate == handledate.Value.ToLocalTime())
.ExecuteCommand();
}
/// <summary>
/// 检测是否可以和ERP库存通讯
/// </summary>
/// <returns></returns>
public bool CheckCommunicationERPInventory()
{
var childDb = Context.AsTenant().GetConnectionWithAttr<CustDevMesCurrentStock>();
return childDb.Queryable<CustDevMesCurrentStock>().Any();
}
/// <summary>
/// 根据产线和日期生成物料需求计划
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
public int GenerateMaterialRequirePlanByline(MmRequirePlanQueryDto2 parm, string CreatedBy)
{
//查询当日线下所有工单
parm.RequireDate = DOANConvertDateTime.ConvertLocalDate(parm.RequireDate);
int result = 0;
Dictionary<string, float> need_Materials = new Dictionary<string, float>();
Dictionary<string, HashSet<string>> need_Materials_workOrder = new Dictionary<string, HashSet<string>>();
List<MmRequirePlanByline> mmRequirePlans = new List<MmRequirePlanByline>();
//获取当天所有工单
List<ProWorkorder> ProWorkorderList = Context.Queryable<ProWorkorder>().Where(it => it.LineCode == parm.line_code)
.Where(it => it.WorkorderDate == parm.RequireDate).ToList();
if (ProWorkorderList != null && ProWorkorderList.Count > 0)
{
foreach (var workorder_item in ProWorkorderList)
{
//遍历每个工单的产品
if (!string.IsNullOrEmpty(workorder_item.ProductionCode))
{
//每个产品的原材料 BOM
//var query= Context.Queryable<BaseMaterialBom>().Where(it => it.InvCode == workorder_item.ProductionCode);
List<BaseMaterialBom> boms = Context.Queryable<BaseMaterialBom>().Where(it => it.InvCode == workorder_item.ProductionCode).ToList();
if (boms != null && boms.Count > 0)
{
//遍历所有子件
foreach (var item in boms)
{
float need_num = (workorder_item.DeliveryNum ?? 1) * (float.Parse(item.Iusequantity));
if (need_Materials.ContainsKey(item.SubInvCode))
{
float pre_num = need_Materials[item.SubInvCode];
need_Materials[item.SubInvCode] = pre_num + need_num;
if (need_Materials.ContainsKey("20102806-Y73-01"))
{
Console.WriteLine("子20102806-Y73-01--" + workorder_item.ProductionCode+"--"+need_Materials["20102806-Y73-01"]);
}
}
else
{
need_Materials.Add(item.SubInvCode, need_num);
if (need_Materials.ContainsKey("20102806-Y73-01"))
{
Console.WriteLine("子20102806-Y73-01--" + workorder_item.ProductionCode + "--" + "init" +need_Materials["20102806-Y73-01"]);
}
}
}
}
}
}
}
//20102901
if (need_Materials.Count > 0)
{
string[] SubInvCode = need_Materials.Keys.ToArray();
List<BaseMaterialList> baseMaterialList = Context.Queryable<BaseMaterialList>().Where(it => SubInvCode.Contains(it.Code)).ToList();
if (baseMaterialList != null && baseMaterialList.Count() > 0)
{
string[] search_codes = baseMaterialList.Select(it => it.Code).ToArray();
foreach (var item in baseMaterialList)
{
MmRequirePlanByline mmRequirePlan = new MmRequirePlanByline();
mmRequirePlan.Id = XueHua;
mmRequirePlan.MaterialCode = item.Code;
mmRequirePlan.MaterialName = item.Name;
mmRequirePlan.RequireNum = (decimal)(need_Materials.TryGetValue(item.Code, out float value) ? value : default(float));
mmRequirePlan.RequireDate = parm.RequireDate;
mmRequirePlan.LineCode = parm.line_code;
mmRequirePlan.Color = item.Color;
mmRequirePlan.Specification = item.Specification;
mmRequirePlan.Unit = item.Unit;
mmRequirePlan.CreatedBy = CreatedBy;
mmRequirePlan.CreatedTime = DateTime.Now;
mmRequirePlans.Add(mmRequirePlan);
}
}
}
if (mmRequirePlans.Count > 0)
{
UseTran2(() =>
{
Context.Deleteable<MmRequirePlanByline>().Where(it => it.RequireDate == parm.RequireDate).WhereIF(!string.IsNullOrEmpty(parm.line_code),it => it.LineCode == parm.line_code).ExecuteCommand();
result = Context.Insertable(mmRequirePlans).ExecuteCommand();
});
}
return result;
}
public PagedInfo<MmRequirePlanByline> GetMaterialRequirePlanByline(MmRequirePlanQueryDto2 parm)
{
var predicate = Expressionable.Create<MmRequirePlanByline>()
.AndIF(!string.IsNullOrEmpty(parm.MaterialCode), it => it.MaterialCode.Contains(parm.MaterialCode))
.AndIF(!string.IsNullOrEmpty(parm.MaterialName), it => it.MaterialName.Contains(parm.MaterialName))
.AndIF(parm.RequireDate != null && parm.RequireDate > DateTime.MinValue, it => it.RequireDate == parm.RequireDate.ToLocalTime().Date)
.AndIF(!string.IsNullOrEmpty(parm.line_code), it => it.LineCode == parm.line_code)
;
var response = Context.Queryable<MmRequirePlanByline>()
.Where(predicate.ToExpression())
.ToPage<MmRequirePlanByline, MmRequirePlanByline>(parm);
return response;
}
}
}