using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QMAPP.FJC.TRACING.DAInterface;
namespace QMAPP.FJC.TRACING.DataValidators
{
///
/// 生产计划验证
///
public class PlanValidator : IDataValidator
{
public ValidateResult Validate(DAObject data, Entity.QT.DAIValidation validOption)
{
//如果采集点不包含物料信息则不进行验证
if (string.IsNullOrWhiteSpace(data.MaterialCode))
{
return new ValidateResult(true, "");
}
DAL.ProductionPlan.WorkOrderDAL workorderdal = new DAL.ProductionPlan.WorkOrderDAL();
var workorderlist = new List();
//获取当前工位正在执行的派工单
var workorder= workorderdal.GetWorkingOrderInLoc(data.WorkLocState.WORKLOC_CODE,data.MouldCode);
//--------------------BC316总成装配工位----------------------------------------------------------
if (data.WorkLocState.WORKCELL_CODE == "ASSEMBLE_BC316" && !string.IsNullOrEmpty(data.WorkLocState.CurrentState.ORDERPLAN_PID))
{
//20220501 DQzhang 用pid 获取重新排序后的第一条派工单
workorder = workorderdal.GetNewFirstOrderInLoc(data.WorkLocState.CurrentState.ORDERPLAN_PID, data.MouldCode);
}
//-----------------------------------------------------------------------------------------------
//--------------------BC316帽檐超声波焊接工位----------------------------------------------------
if (data.WorkLocState.WORKCELL_CODE == "BRIM_WELDING_BC316")
{
//20230309 DQzhang 获取当前工位第一条派工单
workorder = workorderdal.GetFirstOrderInLoc(data.WorkLocState.WORKCELL_CODE, data.MouldCode);
}
//-----------------------------------------------------------------------------------------------
if (workorder == null) //不存在正在执行的派工单
{
//获取当前工序优先级最高的工单
workorderlist = workorderdal.GetMatchOrders(data.WorkLocState.WORKCELL_CODE);// data.WorkLocState.CurrentState.ORDERPLAN_PID);
}
else
{
workorderlist.Add(workorder);
}
if (workorderlist.Count == 0)
{
return new ValidateResult(false, "当前没有可执行的生产计划,请先下达生产计划!");
}
QMAPP.MD.DAL.PbomDAL bomdal = new QMAPP.MD.DAL.PbomDAL();
if (string.Equals(workorderlist[0].ORDER_TYPE, "aa0") || string.Equals(workorderlist[0].ORDER_TYPE, "aa2")) //如果为FIS工单
{
if (data.OrderPlan != null) //如果条码绑定了生产计划
{
if (data.OrderPlan.ORDER_TYPE == "1")
{
return new ValidateResult(false, string.Format("请优先完成FIS工单!", workorderlist[0].SEQ));
}
var inputSEQ = 0;
var correctSEQ = 0;
inputSEQ = int.Parse(data.OrderPlan.SEQ.Split('-', '_')[0]);
correctSEQ = int.Parse(workorderlist[0].SEQ.Split('-', '_')[0]);
if (inputSEQ > correctSEQ)
{
return new ValidateResult(false, string.Format("请按照FIS顺序生产!顺序号为“{0}”的工单尚未完成生产。", workorderlist[0].SEQ));
}
workorderlist = workorderlist.Where(p => p.ORDERPLANID == data.OrderPlan.PID).ToList();
}
var bomlist = bomdal.GetPbomByMaterialCode(data.MaterialCode);//或取与此当前输入物料相关的BOM
if (!bomlist.Exists(p => workorderlist.Exists(o => p.PBOM_CODE == o.PBOM_CODE))) //当前使用的物料与工单BOM不匹配
{
return new ValidateResult(false, "使用的物料不符合当前下达的生产计划要求!");
}
}
else //如果为建储工单
{
if (workorder == null)
{
//使用物料号和工序编码过滤工单
var order = workorderdal.GetFirstMatchOrder(data.WorkLocState.WORKCELL_CODE, data.MaterialCode, "");
if (order == null)//不存在则标示当前使用的物料不符合工单要求
{
return new ValidateResult(false, "使用的物料不符合当前下达的生产计划要求!");
}
}
else
{
if (data.OrderPlan != null) //如果条码绑定了生产计划
{
workorderlist = workorderlist.Where(p => p.PID == data.OrderPlan.PID).ToList();
}
//
if (data.WorkLocState.WORKCELL_CODE == "ASSEMBLE_BC316")
{
var bomlist = bomdal.GetPbomByMaterialCodeWithPlan(data.MaterialCode, workorder.PBOM_CODE);//或取与此当前输入物料相关的BOM
if (!bomlist.Exists(p => workorderlist.Exists(o => p.PBOM_CODE == o.PBOM_CODE))) //当前使用的物料与工单BOM不匹配
{
return new ValidateResult(false, "使用的物料不符合当前下达的生产计划要求!");
}
}
else
{
var bomlist = bomdal.GetPbomByMaterialCode(data.MaterialCode);//或取与此当前输入物料相关的BOM
if (!bomlist.Exists(p => workorderlist.Exists(o => p.PBOM_CODE == o.PBOM_CODE))) //当前使用的物料与工单BOM不匹配
{
return new ValidateResult(false, "使用的物料不符合当前下达的生产计划要求!");
}
}
}
}
return new ValidateResult(true, "");
}
}
}