|
|
|
|
using Admin.Core.IRepository;
|
|
|
|
|
using Admin.Core.IService;
|
|
|
|
|
using Admin.Core.Model;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System;
|
|
|
|
|
using Admin.Core.Model.ViewModels;
|
|
|
|
|
using log4net;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using Microsoft.Data.SqlClient;
|
|
|
|
|
using Admin.Core.PlcServer;
|
|
|
|
|
|
|
|
|
|
namespace Admin.Core.Service
|
|
|
|
|
{
|
|
|
|
|
public class Hw_WarehouseServices : BaseServices<Hw_Warehouse>, IHw_WarehouseServices
|
|
|
|
|
{
|
|
|
|
|
private static readonly log4net.ILog log = LogManager.GetLogger(typeof(Hw_WarehouseServices));
|
|
|
|
|
private readonly IBaseRepository<Hw_Warehouse> _dal;
|
|
|
|
|
private readonly IHw_WarehouseRepository _wareHouse;
|
|
|
|
|
private readonly IHw_WareHouse_SubRepository _wareHouse_Sub;
|
|
|
|
|
private readonly IHw_FeedReportRepository _feed;
|
|
|
|
|
private readonly IHw_BarrelRepository _barrel;
|
|
|
|
|
private readonly Ixl_materialRepository _materialRepository;
|
|
|
|
|
private readonly Ixl_recipeRepository _recipeRepository;
|
|
|
|
|
private readonly ILR_weighRepository _lrWeighRepository;
|
|
|
|
|
|
|
|
|
|
public Hw_WarehouseServices(IBaseRepository<Hw_Warehouse> dal, IHw_WarehouseRepository wareHouse,
|
|
|
|
|
IHw_WareHouse_SubRepository wareHouse_Sub, IHw_FeedReportRepository feed,
|
|
|
|
|
IHw_BarrelRepository barrel, Ixl_materialRepository materialRepository,
|
|
|
|
|
Ixl_recipeRepository recipeRepository, ILR_weighRepository lrWeighRepository)
|
|
|
|
|
{
|
|
|
|
|
this._dal = dal;
|
|
|
|
|
base.BaseDal = dal;
|
|
|
|
|
_wareHouse = wareHouse;
|
|
|
|
|
_wareHouse_Sub = wareHouse_Sub;
|
|
|
|
|
_feed = feed;
|
|
|
|
|
_barrel = barrel;
|
|
|
|
|
_materialRepository = materialRepository;
|
|
|
|
|
_recipeRepository = recipeRepository;
|
|
|
|
|
_lrWeighRepository = lrWeighRepository;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#region 扫描桶二维码,获取绑定的小料配方物料
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 扫描桶二维码,获取绑定的小料配方
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="code">桶条码</param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
/// <exception cref="NotImplementedException"></exception>
|
|
|
|
|
public async Task<BarrelView> GetXlInfo(string kettleBarCode, string planId, string code)
|
|
|
|
|
{
|
|
|
|
|
List<MaterialView> list = new List<MaterialView>();
|
|
|
|
|
List<MaterialView> materList = new List<MaterialView>();
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
Hw_Barrel hw = await _barrel.FirstAsync(d => d.IsEnable == "是" && d.BarCode == code);
|
|
|
|
|
if (hw == null) { return null; }
|
|
|
|
|
var recipe = await _recipeRepository.FirstAsync(d => d.Recipe_Verify == 1 && d.Recipe_Code == hw.MaterialID);
|
|
|
|
|
if (recipe == null) { return null; }
|
|
|
|
|
var materialList = await _lrWeighRepository.QueryAsync(d => d.Plan_ID == hw.PlanId && d.Recipe_ID == recipe.ID);
|
|
|
|
|
if (materialList.Count() == 0) { return null; }
|
|
|
|
|
|
|
|
|
|
foreach (var material in materialList)
|
|
|
|
|
{
|
|
|
|
|
MaterialView childView = new MaterialView();
|
|
|
|
|
childView.MaterialID = material.Material_ID;
|
|
|
|
|
var mat = await _materialRepository.FirstAsync(d => d.ID.Equals(material.Material_ID));
|
|
|
|
|
if (materialList == null) { continue; }
|
|
|
|
|
childView.MaterialBarCode = mat.Material_code;
|
|
|
|
|
childView.MaterialName = material.Material_Name;
|
|
|
|
|
childView.Weight = material.Real_Weight;
|
|
|
|
|
childView.Error = material.Real_Error;
|
|
|
|
|
childView.MatchOrNot = 0;
|
|
|
|
|
list.Add(childView);
|
|
|
|
|
}
|
|
|
|
|
var kettle = await _dal.FirstAsync(d => d.BarCode.Equals(kettleBarCode));
|
|
|
|
|
var subList = await _wareHouse_Sub.QueryAsync(d => d.MainId == kettle.ID && d.PId.Equals(planId) &&d.MaterialType.Contains("尾料"));
|
|
|
|
|
foreach (var check in list)
|
|
|
|
|
{
|
|
|
|
|
MaterialView childView = new MaterialView();
|
|
|
|
|
childView.MaterialID = check.MaterialID;
|
|
|
|
|
var mat = await _materialRepository.FirstAsync(d => d.ID.Equals(check.MaterialID));
|
|
|
|
|
childView.MaterialBarCode = mat.Material_code;
|
|
|
|
|
childView.MaterialName = check.MaterialName;
|
|
|
|
|
var pList = subList.Where(d => d.Material_Code.Equals(check.MaterialBarCode));
|
|
|
|
|
if (pList == null)
|
|
|
|
|
{
|
|
|
|
|
childView.MatchOrNot = 0;
|
|
|
|
|
materList.Add(childView);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
foreach (var item in pList)
|
|
|
|
|
{
|
|
|
|
|
decimal? maxValue = item.SetWeight + item.SetError;
|
|
|
|
|
decimal? minValue = item.SetWeight - item.SetError;
|
|
|
|
|
if (minValue <= check.Weight && check.Weight <= maxValue)
|
|
|
|
|
{
|
|
|
|
|
childView.Weight = check.Weight;
|
|
|
|
|
childView.Error = check.Error;
|
|
|
|
|
childView.MatchOrNot = 1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
childView.Weight = check.Weight;
|
|
|
|
|
childView.Error = check.Error;
|
|
|
|
|
childView.MatchOrNot = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
materList.Add(childView);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BarrelView view = new BarrelView()
|
|
|
|
|
{
|
|
|
|
|
BarrelID = hw.BarrelID,
|
|
|
|
|
BarrelName = hw.BarrelName,
|
|
|
|
|
BarCode = hw.BarCode,
|
|
|
|
|
child = materList
|
|
|
|
|
};
|
|
|
|
|
return view;
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
log.Error(ex.Message);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 根据传入的二维码、计划Id 查询反应釜下所有的物料
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 根据传入的二维码、计划Id 查询反应釜下所有的物料
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="code">反应釜二维码</param>
|
|
|
|
|
/// <param name="planId">计划Id</param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public async Task<WarehouseView> QueryByCode(string code, string planId)
|
|
|
|
|
{
|
|
|
|
|
List<HwWareHouseSubView> list = new List<HwWareHouseSubView>();
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
Hw_Warehouse wh = await _wareHouse.FirstAsync(d => d.BarCode == code);
|
|
|
|
|
if (wh == null) return null;
|
|
|
|
|
var sub = await _wareHouse_Sub.QueryAsync(d => d.MainId == wh.ID&& d.PId== planId&&(d.MaterialType.Contains("整包")|| d.MaterialType.Contains("尾料")));
|
|
|
|
|
if (sub.Count == 0) return null;
|
|
|
|
|
sub.ForEach(sub =>
|
|
|
|
|
{
|
|
|
|
|
HwWareHouseSubView view = new HwWareHouseSubView();
|
|
|
|
|
view.ID = sub.ID;
|
|
|
|
|
view.MainId = sub.MainId;
|
|
|
|
|
view.PId = sub.PId;
|
|
|
|
|
view.ProductName = sub.ProductName;
|
|
|
|
|
view.MaterialID = sub.MaterialID;
|
|
|
|
|
view.Material_Code = sub.Material_Code;
|
|
|
|
|
view.MaterialName = sub.MaterialName;
|
|
|
|
|
view.BinId = sub.BinId;
|
|
|
|
|
view.MaterialType = sub.MaterialType;
|
|
|
|
|
view.SetWeight = sub.SetWeight;
|
|
|
|
|
view.SetError = sub.SetError;
|
|
|
|
|
list.Add(view);
|
|
|
|
|
});
|
|
|
|
|
WarehouseView warehouseView = new WarehouseView()
|
|
|
|
|
{
|
|
|
|
|
ID = wh.ID,
|
|
|
|
|
Name = wh.Name,
|
|
|
|
|
BarCode = wh.BarCode,
|
|
|
|
|
Children = list
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return warehouseView;
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
log.Error(ex.Message);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 更新PLC状态
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 更新PLC状态
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="view">本次验证状态 1开启;0关闭</param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public async Task<bool> UpdatePlcState(KettleView view)
|
|
|
|
|
{
|
|
|
|
|
List<Hw_WareHouse_Sub> subList = null;
|
|
|
|
|
List<Hw_FeedReport> report = new List<Hw_FeedReport>();
|
|
|
|
|
Hw_Warehouse wh = null;
|
|
|
|
|
string message = string.Empty;
|
|
|
|
|
string name = string.Empty;
|
|
|
|
|
|
|
|
|
|
#region 反应釜工位信号
|
|
|
|
|
//反应釜工位报警
|
|
|
|
|
switch (view.Station)
|
|
|
|
|
{
|
|
|
|
|
case 1:
|
|
|
|
|
name = "DB109.DBW4.0";
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
name = "DB109.DBW10.0";
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
name = "DB109.DBW16.0";
|
|
|
|
|
break;
|
|
|
|
|
case 4:
|
|
|
|
|
name = "DB109.DBW22.0";
|
|
|
|
|
break;
|
|
|
|
|
case 5:
|
|
|
|
|
name = "DB109.DBW28.0";
|
|
|
|
|
break;
|
|
|
|
|
case 6:
|
|
|
|
|
name = "DB109.DBW34.0";
|
|
|
|
|
break;
|
|
|
|
|
case 7:
|
|
|
|
|
name = "DB109.DBW40.0";
|
|
|
|
|
break;
|
|
|
|
|
case 8:
|
|
|
|
|
name = "DB109.DBW46.0";
|
|
|
|
|
break;
|
|
|
|
|
case 9:
|
|
|
|
|
name = "DB109.DBW52.0";
|
|
|
|
|
break;
|
|
|
|
|
case 10:
|
|
|
|
|
name = "DB109.DBW58.0";
|
|
|
|
|
break;
|
|
|
|
|
case 11:
|
|
|
|
|
name = "DB109.DBW64.0";
|
|
|
|
|
break;
|
|
|
|
|
case 12:
|
|
|
|
|
name = "DB109.DBW70.0";
|
|
|
|
|
break;
|
|
|
|
|
case 13:
|
|
|
|
|
name = "DB109.DBW76.0";
|
|
|
|
|
break;
|
|
|
|
|
case 14:
|
|
|
|
|
name = "DB109.DBW82.0";
|
|
|
|
|
break;
|
|
|
|
|
case 15:
|
|
|
|
|
name = "DB109.DBW88.0";
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
//log.Info("开始");
|
|
|
|
|
var solventPlc = PlcHelper.siemensList.SingleOrDefault(d => d.EquipName.Equals("溶剂PLC"));
|
|
|
|
|
log.Info($"PLC状态:{solventPlc.plc.IsConnected}");
|
|
|
|
|
if (solventPlc.plc.IsConnected)
|
|
|
|
|
{
|
|
|
|
|
#region 记录数据
|
|
|
|
|
//同时记录该扫码到数据库中
|
|
|
|
|
wh = await _wareHouse.FirstAsync(d => d.BarCode == view.KCode);
|
|
|
|
|
if (wh == null) return false;
|
|
|
|
|
subList = await _wareHouse_Sub.QueryAsync(d => d.MainId == wh.ID);
|
|
|
|
|
if (subList.Count == 0) return false;
|
|
|
|
|
log.Info("开启模式");
|
|
|
|
|
if (view.State == 1)
|
|
|
|
|
{
|
|
|
|
|
message = "开启";
|
|
|
|
|
}
|
|
|
|
|
if (view.State == 0)
|
|
|
|
|
{
|
|
|
|
|
message = "关闭";
|
|
|
|
|
}
|
|
|
|
|
if (string.IsNullOrEmpty(message))
|
|
|
|
|
{
|
|
|
|
|
log.Error("传递状态为空!");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
foreach (var item in view.Child)
|
|
|
|
|
{
|
|
|
|
|
Hw_FeedReport hw = new Hw_FeedReport()
|
|
|
|
|
{
|
|
|
|
|
WID = wh.ID,
|
|
|
|
|
PlanId = view.PlanId,
|
|
|
|
|
WName = wh.Name,
|
|
|
|
|
WCode = wh.BarCode,
|
|
|
|
|
MaterialId = item.MatCode,
|
|
|
|
|
MaterialName = item.MatName,
|
|
|
|
|
MCode = item.MatCode,
|
|
|
|
|
MType = item.MatType,
|
|
|
|
|
IsTrue = message,
|
|
|
|
|
CreateTime = DateTime.Now,
|
|
|
|
|
WholePackage = item.WholePackage.Trim()
|
|
|
|
|
};
|
|
|
|
|
report.Add(hw);
|
|
|
|
|
}
|
|
|
|
|
await _feed.AddAsync(report);
|
|
|
|
|
|
|
|
|
|
if (string.IsNullOrEmpty(name))
|
|
|
|
|
{
|
|
|
|
|
log.Error("点位名称为空!");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
bool result = solventPlc.plc.WriteInt16(name, view.State.ToString());//反应釜点位
|
|
|
|
|
if (result)
|
|
|
|
|
{
|
|
|
|
|
if (view.State == 1)
|
|
|
|
|
{
|
|
|
|
|
await _feed.AddAsync(report);
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
log.Error("写入点位失败!");
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
log.Info("异常:"+ex.Message);
|
|
|
|
|
log.Error(ex.Message);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 获取所有计划号
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 获取所有计划号
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public async Task<List<string>> GetWarehousePlan(string code)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
Hw_Warehouse wh = await _wareHouse.FirstAsync(d=>d.BarCode== code.Trim());
|
|
|
|
|
if (wh==null) return null;
|
|
|
|
|
var list = await _wareHouse_Sub.QueryAsync(d=>d.MainId== wh.ID);
|
|
|
|
|
var planList = (from d in list
|
|
|
|
|
select d.PId).Distinct();
|
|
|
|
|
return planList.ToList();
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
}
|