using Aucma.Scada.Model.domain; using HighWayIot.Config; using HighWayIot.Log4net; using HighWayIot.Repository.service; using System; using System.Collections.Generic; using System.Linq; namespace Aucma.Scada.Business { /// /// 组装计划业务逻辑 /// public sealed class AssemblyPlanBusiness { #region 单例实现 private static readonly Lazy lazy = new Lazy(() => new AssemblyPlanBusiness()); public static AssemblyPlanBusiness Instance { get { return lazy.Value; } } #endregion #region 对象引用 private LogHelper logHelper = LogHelper.Instance; private AppConfig appConfig = AppConfig.Instance; private RegisterServices registerServices = RegisterServices.Instance; #endregion #region 接口引用 /// /// 生产计划 /// private IProductPlanInfoService _productPlanInfoService; /// /// 执行计划 /// private IExecutePlanInfoService _executePlanInfoService; #endregion #region 委托事件 /// /// 刷新执行计划 /// /// public delegate void RefreshExecutePlanInfo(List executePlanInfos); public event RefreshExecutePlanInfo RefreshExecutePlanInfoEvent; /// /// 下传执行计划 /// /// public delegate void NextPassExecutePlanInfo(ExecutePlanInfo planInfo, BaseSpaceInfo spaceInfo = null); public event NextPassExecutePlanInfo NextPassExecutePlanInfoEvent; /// /// 弹框提示 /// /// public delegate void PrintMessage(string log); public event PrintMessage PrintMessageEvent; /// /// 找出库货道 /// /// public delegate BaseSpaceInfo GetSpaceInfoByMaterialType(string storeCode, string materialType); public event GetSpaceInfoByMaterialType GetSpaceInfoByMaterialTypeEvent; #endregion private AssemblyPlanBusiness() { _productPlanInfoService = registerServices.GetService(); _executePlanInfoService = registerServices.GetService(); } /// /// 根据产线工位编号获取生产计划 /// /// /// public List GetProductPlanInfosByProductLineCode() { List productPlanInfos = null; try { productPlanInfos = _productPlanInfoService.GetProductPlanInfosByProductLineCode(appConfig.stationCode); } catch (Exception ex) { logHelper.Error("根据产线工位编号获取生产计划异常", ex); } return productPlanInfos; } /// /// 根据产线工位编号获取执行计划 /// /// public List GetEexecutePlanInfosByProductLineCode() { List planInfos = null; try { planInfos = _executePlanInfoService.GetExecutePlanInfosByProductLineCode(appConfig.stationCode).OrderBy(x => x.executeOrder).ToList(); if (planInfos != null) { //for(int i = 0; i < planInfos.Count; i++) //{ // planInfos[i].executeOrder = i + 1; //} //_executePlanInfoService.UpdateRangeExecutePlanInfo(planInfos); planInfos = planInfos.Where(x => x.executeStatus != 3).ToList(); RefreshExecutePlanInfoEvent?.Invoke(planInfos); } } catch (Exception ex) { logHelper.Error("根据产线工位编号获取执行计划异常", ex); } return planInfos; } /// /// 根据生产计划下达执行计划 /// /// /// public bool PlanTransmitByProductPlan(string productPlanCode, int transmitAmount, BaseSpaceInfo spaceInfo = null) { bool result = false; try { // 先删除多余未完成的组装执行计划 List exePlans = _executePlanInfoService.GetExecutePlanInfosByProductLineCode(appConfig.stationCode, true); if (exePlans != null && exePlans.Count > 5) { exePlans = exePlans.OrderBy(x => x.createdTime).ToList(); List tempList = exePlans.Take(exePlans.Count - 5).ToList(); foreach (var exePlan in tempList) { _executePlanInfoService.DeleteExecutePlanInfoByPlanCode(exePlan.executePlanCode); } } var productPlanInfo = _productPlanInfoService.GetProductPlanByPlanCode(productPlanCode); if (productPlanInfo != null) { ExecutePlanInfo executePlanInfo = new ExecutePlanInfo(); executePlanInfo.executePlanCode = System.Guid.NewGuid().ToString("N"); executePlanInfo.productPlanCode = productPlanInfo.planCode; executePlanInfo.productLineCode = productPlanInfo.productLineCode; executePlanInfo.orderCode = productPlanInfo.orderCode; executePlanInfo.materialCode = productPlanInfo.materialCode; executePlanInfo.materialName = productPlanInfo.materialName; executePlanInfo.executeOrder = _executePlanInfoService.GetExecuteOrderByProductLineCode(appConfig.stationCode); if (spaceInfo == null) {//下总装计划 筛选货道 spaceInfo = GetSpaceInfoByMaterialTypeEvent?.Invoke(appConfig.foamStoreCode, executePlanInfo.materialCode); if (transmitAmount > spaceInfo.spaceStock) { //弹框提示 PrintMessageEvent?.Invoke($"收到出库计划数:{transmitAmount},匹配到货道:{spaceInfo.spaceCode},库存数:{spaceInfo.spaceStock},已自动将计划数改为库存!"); executePlanInfo.planAmount = spaceInfo.spaceStock; } else { executePlanInfo.planAmount = transmitAmount; } } else // 手动出一个或者整道出 { executePlanInfo.planAmount = transmitAmount; } executePlanInfo.executeStatus = 1; executePlanInfo.createdTime = DateTime.Now; result = _executePlanInfoService.InsertExecutePlanInfo(executePlanInfo); if (result) { GetEexecutePlanInfosByProductLineCode(); // 直接下达 2023-12-20 ExecutePlanInfo_NextPass(executePlanInfo.executePlanCode, "", spaceInfo); } } } catch (Exception ex) { logHelper.Error("根据生产计划下达执行计划异常", ex); } return result; } /// /// 执行计划上移 /// /// public void ExecutePlanInfo_MoveUp(List executePlanInfos, string executePlanCode) { List executePlans = new List(); if (executePlanInfos != null) { ExecutePlanInfo planInfo = executePlanInfos.Where(x => x.executePlanCode == executePlanCode).First(); int executeOrder = planInfo.executeOrder; int planIndex = executePlanInfos.IndexOf(planInfo); if (planIndex != -1 && planIndex != 0) { var lastPlanInfo = executePlanInfos[planIndex - 1]; planInfo.executeOrder = lastPlanInfo.executeOrder; lastPlanInfo.executeOrder = executeOrder; executePlans.Add(planInfo); executePlans.Add(lastPlanInfo); var result = _executePlanInfoService.UpdateRangeExecutePlanInfo(executePlans); if (result) { GetEexecutePlanInfosByProductLineCode(); } } } } /// /// 执行计划下移 /// /// public void ExecutePlanInfo_MoveDown(List executePlanInfos, string executePlanCode) { List executePlans = new List(); if (executePlanInfos != null) { ExecutePlanInfo planInfo = executePlanInfos.Where(x => x.executePlanCode == executePlanCode).First(); int executeOrder = planInfo.executeOrder; int planIndex = executePlanInfos.IndexOf(planInfo); if (planIndex != executePlanInfos.Count - 1) { var lastPlanInfo = executePlanInfos[planIndex + 1]; planInfo.executeOrder = lastPlanInfo.executeOrder; lastPlanInfo.executeOrder = executeOrder; executePlans.Add(planInfo); executePlans.Add(lastPlanInfo); var result = _executePlanInfoService.UpdateRangeExecutePlanInfo(executePlans); if (result) { GetEexecutePlanInfosByProductLineCode(); } } } } /// /// 根据执行计划编号删除执行计划 /// /// /// public bool ExecutePlanInfo_Delete(string planCode) { bool result = _executePlanInfoService.DeleteExecutePlanInfoByPlanCode(planCode); if (result) { GetEexecutePlanInfosByProductLineCode(); } return result; } /// /// 下传计划 /// /// public ExecutePlanInfo ExecutePlanInfo_NextPass(string planCode, string nowPlanCode, BaseSpaceInfo spaceInfo = null) { ExecutePlanInfo planInfo = null; try { List planInfos = new List(); if (!string.IsNullOrEmpty(nowPlanCode)) { ExecutePlanInfo nowPlanInfo = _executePlanInfoService.GetExecutePlanInfoByPlanCode(nowPlanCode); if (nowPlanInfo != null) { nowPlanInfo.executeStatus = 1; planInfos.Add(nowPlanInfo); } } //获取执行计划 planInfo = _executePlanInfoService.GetExecutePlanInfoByPlanCode(planCode); if (planInfo != null) { //传给出库 NextPassExecutePlanInfoEvent?.Invoke(planInfo, spaceInfo); planInfo.executeStatus = 2; planInfo.beginTime = DateTime.Now; planInfos.Add(planInfo); } else { logHelper.Info($"执行计划下传失败,执行计划编号:{planCode}未获取到执行计划"); return planInfo; } if (planInfos.Count > 0) { var result = _executePlanInfoService.UpdateRangeExecutePlanInfo(planInfos); if (result) { GetEexecutePlanInfosByProductLineCode(); } } } catch (Exception ex) { logHelper.Error("计划下传异常", ex); } return planInfo; } /// /// 获取小时产量 /// /// public List GetHourAmount() { return _executePlanInfoService.GetStationHourAmount(appConfig.stationCode); } /// /// 获取物料型号统计 /// /// public List GetMaterialStats() { return _executePlanInfoService.GetStationMaterialStats(appConfig.stationCode); } } }