//检验Job数据
        static ILE.IResult CheckJob(ILE.IJob job, string strStrict)
        {
            ILE.IResult res = new ILE.LEResult();
            using (var context = LEDAO.APIGateWay.GetEntityContext())
            {
                LEDAO.P_Result va = context.sp_CheckJobSumit(job.FlowCode, job.ProcessCode, job.StationCode, job.SFC, job.EmpCode, job.RouteType, job.Result == true ? "OK" : "NG", strStrict).First();

                res.ExtMessage = va.ExtMessage;
                res.Result     = va.Result == "true" ? true : false;
                return(res);
            }
        }
Exemple #2
0
 public ILE.IResult DoWork(ILE.IJob jobModel, string val)
 {
     jobModel.StepList[jobModel.StepIdx].StepValue  = val;
     jobModel.StepList[jobModel.StepIdx].Completed  = true;
     jobModel.StepList[jobModel.StepIdx].StepDetail = new List <ILE.StepData>();
     ILE.StepData stepdata = new ILE.StepData();
     stepdata.InPutDate = DateTime.Now;
     stepdata.StepVal   = val;
     jobModel.StepList[jobModel.StepIdx].StepDetail.Add(stepdata);
     ILE.IResult res = new ILE.LEResult();
     res.Result = true;
     return(res);
 }
 public MachinePanel(string machine_name, int _state, string _machine_code, string _model, ILE.IJob _job, Main _main, List <V_Station_Shop> list)
 {
     InitializeComponent();
     this.label1.Text = machine_name;
     machine_code     = _machine_code;
     machine_state    = _state;
     model            = _model;
     _machine_name    = machine_name;
     main             = _main;
     job  = _job;
     List = list;
     initImage(machine_state);
 }
        public static ILE.IFormProperty PopUpLoad(ILE.IJob job, string val)
        {
            string[] strTriger = job.StepList[job.StepIdx].Triger.Split(',');
            string   path      = System.IO.Directory.GetCurrentDirectory() + "\\" + "DP_WinForm" + ".dll";

            try
            {
                string            strClass = "DP_WinForm" + "." + strTriger[1];
                Assembly          ass      = Assembly.LoadFrom(path);
                Type              type     = ass.GetType(strClass);
                ILE.IFormProperty obj      = (ILE.IFormProperty)Activator.CreateInstance(type);
                obj.Job = job;
                obj.Val = val;
                obj.Run();
                return(obj);
            }
            catch (Exception)
            {
                throw;
            }
        }
        public static ILE.IResult JobUpload(ILE.IJob job)
        {
            string Pid    = job.Pid.ToString();
            string Strict = Tools.ServiceReferenceManager.GetClient().RunServerAPI("BLL.Process", "GetStrict", Pid);
            string strJob = JsonConvert.SerializeObject(job);

            try
            {
                string       strResult = Tools.ServiceReferenceManager.GetClient().RunServerAPI("BLL.JobSubmit", "JobUpload", strJob + "|" + Strict);
                ILE.LEResult result    = JsonConvert.DeserializeObject <ILE.LEResult>(strResult);
                return(result);
            }
            catch (Exception)
            {
                //throw;
                ILE.IResult res = new ILE.LEResult();
                res.ExtMessage = "";
                res.Result     = false;
                return(res);
            }
        }
        public static string JobUpload(string json)
        {
            string[] str1      = json.Split('|');
            string   strJson   = str1[0];
            string   strStrict = str1[1];
            string   strRes;

            ILE.IJob job = JsonConvert.DeserializeObject <ILE.Model.Job>(strJson);

            ILE.IResult res = CheckJob(job, strStrict);
            if (!res.Result)
            {
                strRes = JsonConvert.SerializeObject(res);
                return(strRes);
            }

            try
            {
                #region 数据提交

                using (var context = LEDAO.APIGateWay.GetEntityContext())
                {
                    //用于删除
                    //var context1 = LEDAO.APIGateWay.GetEntityContext();
                    //结果
                    string strResult      = job.Result == true ? "OK" : "NG";
                    string strProcessCode = job.ProcessCode;
                    string strSFC         = job.SFC;
                    //工艺流程
                    B_Process_Flow_Detail flowDetail = context.B_Process_Flow_Detail.Where(c => c.process_from == strProcessCode && c.flow_code == job.FlowCode && c.process_result == strResult).First();
                    //提交时间
                    DateTime?newDate = context.NewDate().First();
                    //判断是否为最后一步工艺流程
                    bool BEnd = flowDetail.process_next == "END" ? true : false;
                    //查询SFC状态
                    List <LEDAO.P_SFC_State> sfcList = context.P_SFC_State.Where(c => c.SFC == strSFC).ToList();
                    //获取班别
                    List <B_WorkGroup_Class> Class_codeList = context.sp_Count_Class(job.group_code).ToList();
                    string Class_Code = string.Empty;
                    if (Class_codeList.Count != 0)
                    {
                        Class_Code = Class_codeList[0].class_code.ToString();
                    }
                    else
                    {
                        Class_Code = "";
                    }
                    //获取P_Date
                    List <sp_Count_PDate_Result> P_Date1 = context.sp_Count_PDate(job.group_code).ToList();
                    DateTime P_Date = Convert.ToDateTime(P_Date1[0].P_date);

                    //根据工单号获取父工单及主工单
                    P_WorkOrder ListOrder = context.P_WorkOrder.Where(c => c.order_no == job.OrderNO).First();
                    //根据Product_code获取mat_code
                    //V_Bom_Detail ListBom_Detail = context.V_Bom_Detail.Where(c => c.product_code == job.Product).First();

                    //SFC状态P_SFC_STATE
                    LEDAO.P_SFC_State sfcstate;
                    if (sfcList.Count > 0)
                    {
                        sfcstate = sfcList.First();
                        //流程NG
                        if (strResult == "NG")
                        {
                            sfcstate.fail_times++;
                        }
                        //工艺是否结束
                        if (BEnd && job.Result)
                        {
                            sfcstate.state    = 2;
                            sfcstate.end_time = newDate;
                            sfcstate.end_Date = P_Date;
                        }
                        sfcstate.from_process = sfcstate.now_process;
                        sfcstate.now_process  = flowDetail.process_next;
                        sfcstate.process_time = newDate;
                        context.ObjectStateManager.ChangeObjectState(sfcstate, System.Data.EntityState.Modified);
                    }
                    else
                    {
                        sfcstate              = new LEDAO.P_SFC_State();
                        sfcstate.order_no     = job.OrderNO;
                        sfcstate.SFC          = job.SFC;
                        sfcstate.initqty      = job.QTY;
                        sfcstate.qty          = job.QTY;
                        sfcstate.is_tray      = job.IsPack;
                        sfcstate.fail_times   = strResult == "OK" ? 0 : 1;
                        sfcstate.state        = 1;
                        sfcstate.from_process = job.ProcessCode;
                        sfcstate.now_process  = flowDetail.process_next;
                        //车间别
                        sfcstate.workshop = job.workshop;
                        //班别,P_Date
                        sfcstate.begin_classcode = Class_Code;
                        sfcstate.begin_Date      = P_Date;
                        sfcstate.end_classcode   = Class_Code;
                        sfcstate.end_Date        = P_Date;
                        //父工单及主工单
                        sfcstate.parent_order = ListOrder.parent_order;
                        sfcstate.main_order   = ListOrder.main_order;
                        //mat_code
                        sfcstate.mat_code = ListOrder.product_code;  //ListBom_Detail.mat_code;

                        //工艺是否结束
                        if (BEnd && job.Result)
                        {
                            sfcstate.state    = 2;
                            sfcstate.end_time = newDate;
                            sfcstate.end_Date = P_Date;
                            #region
                            //P_WorkOrder orderlst = context.P_WorkOrder.Where(c => c.order_no == job.OrderNO).FirstOrDefault();
                            //decimal orderCount = 0; //工单总完成数
                            //var lst = context.P_GetOrderCompCount(job.OrderNO).FirstOrDefault();
                            //if (lst!=null)
                            //{
                            //    orderCount = (decimal)(lst.qty);
                            //}
                            //if (orderlst!=null)
                            //{
                            //    if (orderlst.qty <= orderCount + job.QTY)
                            //    {
                            //        orderlst.state = 2;
                            //        //context.ObjectStateManager.ChangeObjectState(orderlst, System.Data.EntityState.Modified);
                            //    }
                            //}
                            #endregion
                        }

                        else
                        {
                            sfcstate.state = 1;
                        }
                        sfcstate.input_station = job.StationCode;
                        //sfcstate.begin_time = newDate;
                        sfcstate.begin_time   = job.start_time;
                        sfcstate.process_time = newDate;
                        context.P_SFC_State.AddObject(sfcstate);
                    }


                    //过站记录
                    P_SFC_Process_IOLog sfcIOLog;
                    int max = context.P_SFC_Process_IOLog.Where(c => c.SFC == strSFC && c.process_code == job.ProcessCode && c.output_time != null).Count();
                    List <LEDAO.P_SFC_Process_IOLog> sfcIOLogList1 = context.P_SFC_Process_IOLog.Where(c => c.SFC == strSFC && c.process_code == job.ProcessCode && c.output_time == null).ToList();
                    if (sfcIOLogList1.Count > 0)
                    {
                        //将station_code 和 output_time为NULL 的数据删掉(next站记录)
                        var var = from u in context.P_SFC_Process_IOLog where u.station_code == null && u.output_time == null && u.SFC == job.SFC select u;
                        foreach (var del in var)
                        {
                            context.P_SFC_Process_IOLog.DeleteObject(del);
                            //context.SaveChanges();
                        }
                    }
                    List <LEDAO.P_SFC_Process_IOLog> sfcIOLogList2 = context.P_SFC_Process_IOLog.Where(c => c.SFC == strSFC && c.output_time != null).ToList();
                    List <LEDAO.P_SFC_Process_IOLog> sfcIOLogList  = context.P_SFC_Process_IOLog.Where(c => c.SFC == strSFC && c.process_code == job.ProcessCode && c.output_time != null).ToList();
                    if (sfcIOLogList.Count > 0)
                    {
                        #region
                        //sfcIOLog = sfcIOLogList.First();
                        //sfcIOLog.fail_times = sfcstate.fail_times;
                        //sfcIOLog.pass = max + 1;
                        //sfcIOLog.output_time = newDate;
                        //sfcIOLog.station_code = job.StationCode;
                        //sfcIOLog.emp_code = job.EmpCode;
                        //context.ObjectStateManager.ChangeObjectState(sfcIOLog, System.Data.EntityState.Modified);
                        #endregion
                        //将station_code 和 output_time为NULL 的数据删掉
                        var var = from u in context.P_SFC_Process_IOLog where u.station_code == null && u.output_time == null && u.SFC == job.SFC select u;
                        foreach (var del in var)
                        {
                            context.P_SFC_Process_IOLog.DeleteObject(del);
                        }
                        //context.SaveChanges();

                        List <P_SFC_Process_IOLog> modle = context.P_SFC_Process_IOLog.Where(X => X.station_code != null && X.output_time != null && X.SFC == job.SFC && X.process_code == job.ProcessCode).ToList();
                        foreach (var mod in modle)
                        {
                            sfcIOLog      = mod;
                            sfcIOLog.pass = sfcIOLog.pass - 1;
                            context.ObjectStateManager.ChangeObjectState(sfcIOLog, System.Data.EntityState.Modified);
                        }
                        sfcIOLog              = new P_SFC_Process_IOLog();
                        sfcIOLog.order_no     = job.OrderNO;
                        sfcIOLog.SFC          = job.SFC;
                        sfcIOLog.initqty      = job.QTY; // 需要验证数据正确性
                        sfcIOLog.qty          = job.QTY;
                        sfcIOLog.fail_times   = sfcstate.fail_times;
                        sfcIOLog.group_code   = flowDetail.process_from_group;
                        sfcIOLog.process_code = job.ProcessCode;
                        sfcIOLog.station_code = job.StationCode;
                        if (sfcIOLogList2.Count > 0)
                        {
                            sfcIOLog.input_time = sfcIOLogList2[sfcIOLogList2.Count - 1].output_time;
                        }
                        else
                        {
                            sfcIOLog.input_time = newDate;
                        }
                        sfcIOLog.output_time = newDate;
                        sfcIOLog.emp_code    = job.EmpCode;
                        //sfcIOLog.pass = max + 1;
                        sfcIOLog.pass = 1;
                        //车间别
                        sfcIOLog.workshop   = job.workshop;
                        sfcIOLog.class_code = Class_Code;
                        sfcIOLog.p_date     = P_Date;
                        sfcIOLog.start_time = job.start_time;
                        //sfcIOLog.p_date 没确定
                        context.P_SFC_Process_IOLog.AddObject(sfcIOLog);
                    }
                    else
                    {
                        //SFC记录
                        sfcIOLog              = new P_SFC_Process_IOLog();
                        sfcIOLog.order_no     = job.OrderNO;
                        sfcIOLog.SFC          = job.SFC;
                        sfcIOLog.initqty      = job.QTY;
                        sfcIOLog.qty          = job.QTY;
                        sfcIOLog.fail_times   = sfcstate.fail_times;
                        sfcIOLog.group_code   = flowDetail.process_from_group;
                        sfcIOLog.process_code = job.ProcessCode;
                        sfcIOLog.station_code = job.StationCode;
                        if (sfcIOLogList2.Count > 0)
                        {
                            sfcIOLog.input_time = sfcIOLogList2[sfcIOLogList2.Count - 1].output_time;
                        }
                        else
                        {
                            sfcIOLog.input_time = job.start_time;
                        }
                        sfcIOLog.output_time = newDate;
                        sfcIOLog.emp_code    = job.EmpCode;
                        sfcIOLog.pass        = 1;
                        //车间别
                        sfcIOLog.workshop   = job.workshop;
                        sfcIOLog.class_code = Class_Code;
                        sfcIOLog.p_date     = P_Date;
                        sfcIOLog.start_time = job.start_time;
                        //sfcIOLog.p_date 没确定
                        context.P_SFC_Process_IOLog.AddObject(sfcIOLog);
                    }

                    //传建下一个过站记录
                    P_SFC_Process_IOLog sfcIOLogNext;
                    if (!string.IsNullOrEmpty(flowDetail.process_next) && flowDetail.process_next != "END")
                    {
                        //SFC记录
                        sfcIOLogNext              = new P_SFC_Process_IOLog();
                        sfcIOLogNext.order_no     = job.OrderNO;
                        sfcIOLogNext.SFC          = job.SFC;
                        sfcIOLogNext.qty          = job.QTY;
                        sfcIOLogNext.group_code   = flowDetail.process_next_group;
                        sfcIOLogNext.process_code = flowDetail.process_next;
                        sfcIOLogNext.fail_times   = sfcstate.fail_times;
                        sfcIOLogNext.pass         = 0;
                        sfcIOLogNext.input_time   = newDate;
                        //车间别
                        sfcIOLogNext.workshop   = job.workshop;
                        sfcIOLogNext.class_code = Class_Code;
                        sfcIOLogNext.p_date     = P_Date;
                        sfcIOLogNext.start_time = job.start_time;
                        context.P_SFC_Process_IOLog.AddObject(sfcIOLogNext);
                    }


                    //工步字段
                    LEDAO.P_SFC_ProcessData    sfcdata;
                    LEDAO.P_Mat_WIP_Seed       wip_seed;
                    LEDAO.P_Material_WIP       material_wip;
                    LEDAO.P_SFC_ProcessSonData processSonData;
                    LEDAO.P_SFC_Jude           sfc_jude;
                    for (int i = job.IndexBack; i < job.StepList.Count; i++)
                    {
                        ILE.Step step = job.StepList[i];
                        if (step.IsRecord != 1 | step.StepDetail == null)
                        {
                            continue;
                        }
                        //保存子工步数据
                        if (step.IsRecord != 1 | step.StepSonDetail != null)
                        {
                            foreach (var stepd in step.StepSonDetail)
                            {
                                processSonData              = new P_SFC_ProcessSonData();
                                processSonData.orderno      = job.OrderNO;
                                processSonData.sfc          = job.SFC;
                                processSonData.stepid       = stepd.stepsoncode;
                                processSonData.stepval      = stepd.StepVal;
                                processSonData.steppre      = stepd.stepSonPre;
                                processSonData.parentstepid = step.StepCode;
                                processSonData.stepconclude = stepd.stepconclude;
                                processSonData.isfedbatch   = 0;
                                processSonData.inputtime    = DateTime.Now;
                                context.P_SFC_ProcessSonData.AddObject(processSonData);
                            }
                        }
                        //手动耗料
                        string lot_no   = job.StepList[i].StepValue;
                        string mat_code = job.StepList[i].Matcode;
                        string product  = job.Product;
                        string drive    = job.StepList[i].DriveName;
                        var    res2     = (from a in context.P_Material_WIP.Where(X => X.lot_no == lot_no) select new { lot_no = a.lot_no }).ToList();
                        if (drive == "DP_Expend" && res2.Count != 0)
                        {
                            //如果所消耗物料是单件,把WIP表中此批次的STATE改为2
                            var    res1   = (from a in context.V_ProductMaterial.Where(X => X.p_code == mat_code) select new { product_code = a.p_code, max_qty = a.max_qty }).ToList();
                            string maxqty = res1[0].max_qty.ToString();
                            if (maxqty == "1.000")
                            {
                                var model = context.P_Material_WIP.Where(X => X.lot_no == lot_no).FirstOrDefault();
                                model.state = 2;
                            }
                        }


                        string flowcode = job.FlowCode;


                        var res3 = (from a in context.B_Process_Flow.Where(X => X.flow_code == flowcode) select new { flow_name = a.flow_name, bom_id = a.bom_id }).ToList();

                        int bomid = Convert.ToInt32(res3[0].bom_id);

                        var res4 = (from a in context.B_Bom.Where(X => X.bom_id == bomid) select new { bom_code = a.bom_code }).ToList();

                        string bomcode = res4[0].bom_code;

                        var bom_detail = (from a in context.V_Bom_Detail.Where(X => X.mat_code == mat_code && X.product_code == product && X.bom_code == bomcode) select new { qty = a.qty, baseqty = a.base_qty }).ToList();


                        decimal mat_qty = 0;
                        int     baseqty = 0;
                        if (bom_detail != null && bom_detail.Count > 0)
                        {
                            for (int m = 0; m < bom_detail.Count; m++)
                            {
                                mat_qty = (decimal)(bom_detail[m].qty);
                                baseqty = (int)bom_detail[m].baseqty;
                            }
                        }
                        else
                        {
                            mat_qty = 1;
                            baseqty = 1;
                        }
                        float   percentum = job.StepList[i].consume_percent;
                        decimal qty       = job.QTY * (mat_qty / baseqty) * Convert.ToDecimal(percentum);
                        foreach (var stepdata in step.StepDetail)
                        {
                            #region 扣料
                            //自动投料时扣料
                            if (stepdata.seed_id != "" && !string.IsNullOrEmpty(stepdata.seed_id))
                            {
                                string Usedqty = "0";
                                //int seed_id = 0;
                                int     seed_id    = Convert.ToInt32(stepdata.seed_id.ToString());
                                decimal lot_qty    = decimal.Parse((stepdata.lotqty).ToString());
                                decimal surplusqty = 0;
                                if (step.StepDetail.Count > 1)
                                {
                                    //1:平均消耗 2:顺序消耗
                                    if (stepdata.consume_type == 1)
                                    {
                                        List <ILE.StepData> stepDetail = new List <ILE.StepData>();
                                        bool    isPositive             = false;;
                                        decimal qtySum = 0;
                                        foreach (var stepdata2 in step.StepDetail)
                                        {
                                            if (stepdata2.lotqty > 0 && stepdata2 == step.StepDetail[step.StepDetail.Count - 1])
                                            {
                                                isPositive = true;
                                                break;
                                            }
                                        }
                                        if (isPositive)
                                        {
                                            foreach (var stepdata3 in step.StepDetail)
                                            {
                                                if (stepdata3.lotqty > 0)
                                                {
                                                    stepDetail.Add(stepdata3);
                                                }
                                            }
                                            foreach (var stepdata1 in stepDetail)
                                            {
                                                qtySum += Math.Abs(decimal.Parse((stepdata1.lotqty).ToString()));
                                            }
                                        }
                                        else
                                        {
                                            foreach (var stepdata1 in step.StepDetail)
                                            {
                                                qtySum += Math.Abs(decimal.Parse((stepdata1.lotqty).ToString()));
                                            }
                                        }
                                        Usedqty = (lot_qty * (qty / qtySum)).ToString("#0.0000");
                                    }
                                    else if (stepdata.consume_type == 2)
                                    {
                                        if (lot_qty > 0)
                                        {
                                            surplusqty = (qty - Math.Abs(lot_qty));
                                        }
                                        else
                                        {
                                            surplusqty = qty;
                                        }
                                        if (surplusqty >= 0)
                                        {
                                            Usedqty = lot_qty.ToString();
                                            if (lot_qty > 0)
                                            {
                                                qty -= Math.Abs(lot_qty);
                                            }
                                            else
                                            {
                                                qty = qty;
                                            }
                                        }
                                        if (stepdata != step.StepDetail[step.StepDetail.Count - 1] && (decimal.Parse(Usedqty) < 0 || decimal.Parse(Usedqty) == 0))
                                        {
                                            Usedqty = "0";
                                        }
                                        //允许超越时算法(做的多,投的料少,且允许超越)
                                        if (stepdata == step.StepDetail[step.StepDetail.Count - 1] && surplusqty > 0)
                                        {
                                            //Usedqty = (Math.Abs(surplusqty)).ToString();
                                            Usedqty = ((job.QTY * (mat_qty / baseqty))).ToString();
                                        }
                                        //做的少,投的料多,最后一个批次扣料算法
                                        if (surplusqty < 0 && qty != 0)
                                        {
                                            Usedqty = (lot_qty - Math.Abs(surplusqty)).ToString();
                                            qty     = 0;
                                        }
                                    }
                                }
                                else
                                {
                                    Usedqty = (job.QTY * (mat_qty / baseqty) * Convert.ToDecimal(percentum)).ToString();
                                }
                                List <P_Mat_WIP_Seed> modle = context.P_Mat_WIP_Seed.Where(X => X.wip_id == seed_id && X.station_code == job.StationCode).ToList();
                                foreach (var mod in modle)
                                {
                                    wip_seed = mod;
                                    if (stepdata == step.StepDetail[step.StepDetail.Count - 1] && (stepdata.lotqty < 0 || stepdata.lotqty == 0) && stepdata.consume_type == 2)
                                    {
                                        wip_seed.lot_qty -= (job.QTY * (mat_qty / baseqty)) * decimal.Parse(percentum.ToString());
                                    }
                                    else
                                    {
                                        if (stepdata == step.StepDetail[step.StepDetail.Count - 1] && surplusqty > 0 && stepdata.consume_type == 2)
                                        {
                                            wip_seed.lot_qty -= decimal.Parse(Usedqty) * decimal.Parse(percentum.ToString());
                                        }
                                        else
                                        {
                                            wip_seed.lot_qty -= Math.Abs(decimal.Parse(Usedqty));
                                        }
                                    }
                                    context.ObjectStateManager.ChangeObjectState(wip_seed, System.Data.EntityState.Modified);
                                }
                            }

                            //手动投料时扣料
                            if (stepdata.wip_id != "" && !string.IsNullOrEmpty(stepdata.wip_id))
                            {
                                decimal usedqty             = job.QTY * (mat_qty / baseqty);
                                int     wip_id              = Convert.ToInt32(stepdata.wip_id);
                                List <P_Material_WIP> modle = context.P_Material_WIP.Where(X => X.id == wip_id).ToList();
                                foreach (var mod in modle)
                                {
                                    material_wip          = mod;
                                    material_wip.lot_qty -= decimal.Parse(usedqty.ToString()) * decimal.Parse(percentum.ToString());
                                    context.ObjectStateManager.ChangeObjectState(material_wip, System.Data.EntityState.Modified);
                                }
                            }
                            #endregion

                            #region 保存待判数据
                            string lot_sfc = stepdata.StepVal.ToString();
                            List <LEDAO.P_SFC_Jude> Listjude = context.P_SFC_Jude.Where(c => c.sfc == lot_sfc && c.state == 0).ToList();
                            if (Listjude != null)
                            {
                                foreach (var jude in Listjude)
                                {
                                    sfc_jude           = new P_SFC_Jude();
                                    sfc_jude.jude_code = jude.jude_code;
                                    sfc_jude.jude_name = jude.jude_name;
                                    sfc_jude.sfc       = job.SFC;
                                    sfc_jude.state     = 0;
                                    context.P_SFC_Jude.AddObject(sfc_jude);
                                }
                            }
                            #endregion

                            //保存P_SFC_ProcessData
                            int stepid = Convert.ToInt32(job.StepList[i].StepID);
                            List <LEDAO.P_SFC_ProcessData> sfcDataList = context.P_SFC_ProcessData.Where(c => c.SFC == job.SFC && c.step_id == stepid).ToList();
                            if (sfcDataList.Count > 0)
                            {
                                #region
                                List <P_SFC_ProcessData> model = context.P_SFC_ProcessData.Where(c => c.SFC == job.SFC && c.step_id == stepid).ToList();
                                foreach (var mod in model)
                                {
                                    sfcdata      = mod;
                                    sfcdata.pass = sfcdata.pass - 1;
                                    context.ObjectStateManager.ChangeObjectState(sfcdata, System.Data.EntityState.Modified);
                                }
                                #endregion

                                //判断当前数据库中有几条数据,pass则+1
                                sfcdata              = new LEDAO.P_SFC_ProcessData();
                                sfcdata.idx          = step.Idx;
                                sfcdata.order_no     = job.OrderNO;
                                sfcdata.pid          = job.Pid;
                                sfcdata.step_id      = step.StepID;
                                sfcdata.SFC          = job.SFC;
                                sfcdata.step_type    = step.StepType;
                                sfcdata.station_code = job.StationCode;
                                sfcdata.fail_times   = sfcstate.fail_times;
                                sfcdata.mat_code     = stepdata.matCode;
                                //sfcdata.pass = sfcDataList.Count + 1;
                                sfcdata.pass       = 1;
                                sfcdata.qty        = stepdata.qty;
                                sfcdata.val        = stepdata.StepVal;
                                sfcdata.input_time = stepdata.InPutDate;
                                sfcdata.unit       = step.Unit;
                                //车间别
                                sfcstate.workshop  = job.workshop;
                                sfcdata.class_code = Class_Code;
                                sfcdata.P_Date     = P_Date;
                                sfcdata.emp_code   = job.EmpCode;
                                context.P_SFC_ProcessData.AddObject(sfcdata);
                            }
                            else
                            {
                                sfcdata              = new LEDAO.P_SFC_ProcessData();
                                sfcdata.idx          = step.Idx;
                                sfcdata.order_no     = job.OrderNO;
                                sfcdata.pid          = job.Pid;
                                sfcdata.step_id      = step.StepID;
                                sfcdata.SFC          = job.SFC;
                                sfcdata.step_type    = step.StepType;
                                sfcdata.station_code = job.StationCode;
                                sfcdata.fail_times   = sfcstate.fail_times;
                                sfcdata.mat_code     = stepdata.matCode;
                                //sfcdata.pass = sfcIOLog.pass;
                                sfcdata.pass       = 1;
                                sfcdata.qty        = stepdata.qty;
                                sfcdata.val        = stepdata.StepVal;
                                sfcdata.input_time = stepdata.InPutDate;
                                sfcdata.unit       = step.Unit;
                                sfcdata.emp_code   = job.EmpCode;
                                //车间别
                                sfcdata.workshop   = job.workshop;
                                sfcdata.class_code = Class_Code;
                                sfcdata.P_Date     = P_Date;
                                context.P_SFC_ProcessData.AddObject(sfcdata);
                            }
                        }
                    }

                    if (job.QTYOrder + job.QTY >= job.MaxQTYOrder)
                    {
                        LEDAO.P_WorkOrder order = context.P_WorkOrder.Where(c => c.order_no == job.OrderNO).First();
                        order.state = 2;
                        context.ObjectStateManager.ChangeObjectState(order, System.Data.EntityState.Modified);
                    }
                    LEDAO.P_Material_WIP wip;
                    if (BEnd && job.Result)
                    {
                        try
                        {
                            List <LEDAO.P_Material_WIP> wip1 = context.P_Material_WIP.Where(c => c.lot_no == job.SFC && c.workshop == job.workshop && c.mat_code == job.Product).ToList();
                            if (wip1.Count < 1)
                            {
                                wip                = new P_Material_WIP();
                                wip.lot_no         = job.SFC;
                                wip.input_qty      = job.QTY;
                                wip.lot_qty        = job.QTY;
                                wip.mat_code       = job.Product;
                                wip.input_time     = newDate;
                                wip.Parent_order   = job.FatherOrderNO;
                                wip.order_no       = job.OrderNO;
                                wip.bill_no        = job.OrderNO;
                                wip.parent_station = job.StationCode;
                                wip.state          = 0;
                                //车间别
                                wip.workshop = job.workshop;
                                context.P_Material_WIP.AddObject(wip);
                            }
                        }
                        catch
                        {
                        }
                    }

                    //LEDAO.P_FailLog failLog;
                    //LEDAO.P_Fail_Detail failDetail;
                    //if (job.NGPheno.Count > 0)
                    //{
                    //    failLog = new P_FailLog();
                    //    failLog.fail_times = sfcstate.fail_times;
                    //    failLog.from_emp = job.EmpCode;
                    //    failLog.from_process = job.ProcessCode;
                    //    failLog.from_station = job.StationCode;
                    //    failLog.input_time = newDate;
                    //    failLog.order_no = job.OrderNO;
                    //    failLog.sfc = job.SFC;
                    //    failLog.state = job.Result ? 0 : 1;
                    //    failLog.Disposal_Process = flowDetail.disposal_code;
                    //    failLog.process_code = flowDetail.process_next;
                    //    failLog.fguid = System.Guid.NewGuid().ToString();
                    //    context.P_FailLog.AddObject(failLog);

                    //    for (int i = 0; i < job.NGPheno.Count; i++)
                    //    {
                    //        failDetail = new P_Fail_Detail();
                    //        failDetail.fguid = failLog.fguid;
                    //        failDetail.input_time = newDate;
                    //        failDetail.ng_code = job.NGPheno[i];
                    //        failDetail.order_no = job.OrderNO;
                    //        failDetail.sfc = job.SFC;
                    //        context.P_Fail_Detail.AddObject(failDetail);
                    //    }
                    //}
                    context.SaveChanges();
                }
                #endregion

                res.ExtMessage = "提交完成";
                res.Result     = true;
                strRes         = JsonConvert.SerializeObject(res);
                return(strRes);
            }
            catch (Exception exc)
            {
                res.ExtMessage = "提交异常:" + exc.Message;
                res.Result     = false;
                strRes         = JsonConvert.SerializeObject(res);
                return(strRes);
            }
        }
Exemple #7
0
        /// <summary>
        /// 手动耗料驱动
        /// </summary>
        /// <param name="jobModel"></param>
        /// <param name="val"></param>
        /// <returns></returns>
        public ILE.IResult DoWork(ILE.IJob jobModel, string val)
        {
            ILE.LEResult result = new ILE.LEResult();
            try
            {
                ServiceReference.ServiceClient clien = new ServiceReference.ServiceClient();
                string orderon      = jobModel.OrderNO;
                string matCode      = jobModel.StepList[jobModel.StepIdx].Matcode;
                string Station      = jobModel.StationCode;
                string Workshop     = jobModel.workshop;
                string lot          = val;
                string product_code = jobModel.Product;
                string flow_code    = jobModel.FlowCode.ToString();
                //根据工艺查找bom_id
                int   bom_id          = int.Parse(clien.RunServerAPI("BLL.Product", "GetBomByFlow", flow_code));
                float consume_percent = jobModel.StepList[jobModel.StepIdx].consume_percent;
                int   enable          = int.Parse(clien.RunServerAPI("BLL.Product", "GetMatIsEnable", matCode + "," + product_code + "," + bom_id.ToString()));
                int   baseqty         = int.Parse(clien.RunServerAPI("BLL.Bom", "GetBomDetailBaseQty", matCode + "," + product_code));
                //为了提示清晰,分三步验证
                //第一次验证,判断该物料存在
                string json       = orderon + "," + matCode + "," + Station + "," + lot;
                string ResultJson = clien.RunServerAPI("BLL.SFCConsume", "GetMaterialConsumptionManual", json);
                result = JsonConvert.DeserializeObject <ILE.LEResult>(ResultJson);
                //第二次验证,判断该物料是否已被使用
                if (result.Result)
                {
                    string ResultJson1 = clien.RunServerAPI("BLL.SFCConsume", "GetMaterialConsumptionManual1", json);
                    result = JsonConvert.DeserializeObject <ILE.LEResult>(ResultJson1);
                }
                //第三次验证,判断该物料是否存在于该车间
                if (result.Result)
                {
                    string json1       = orderon + "," + matCode + "," + Station + "," + lot + "," + Workshop;
                    string ResultJson2 = clien.RunServerAPI("BLL.SFCConsume", "GetMaterialConsumptionManual2", json1);
                    result = JsonConvert.DeserializeObject <ILE.LEResult>(ResultJson2);
                }

                if (result.Result)
                {
                    List <LEDAO.P_GetMaterialConsumption_Result> strList = JsonConvert.DeserializeObject <List <LEDAO.P_GetMaterialConsumption_Result> >(result.obj.ToString());
                    jobModel.StepList[jobModel.StepIdx].StepDetail = new List <ILE.StepData>();
                    List <ILE.StepData> stepDetail = new List <ILE.StepData>();

                    string flowcode = jobModel.FlowCode;

                    string processFlow = clien.RunServerAPI("BLL.ProcessFlow", "GetProcessFlow", flowcode);
                    List <B_Process_Flow> processFlowList = JsonConvert.DeserializeObject <List <B_Process_Flow> >(processFlow);
                    string bomid = Convert.ToString(processFlowList[0].bom_id);


                    string       bom      = clien.RunServerAPI("BLL.Bom", "GetBomById", bomid);
                    List <B_Bom> bomList  = JsonConvert.DeserializeObject <List <B_Bom> >(bom);
                    string       bom_code = bomList[0].bom_code;

                    string Bom_detail = clien.RunServerAPI("BLL.Bom", "GetBomDetail", matCode + "," + product_code + "," + bom_code);
                    List <V_Bom_Detail> Bom_Detail = JsonConvert.DeserializeObject <List <V_Bom_Detail> >(Bom_detail);
                    decimal             _qty       = 0;
                    if (Bom_detail != null)
                    {
                        _qty = (decimal)Bom_Detail[0].qty;
                    }
                    foreach (LEDAO.P_GetMaterialConsumption_Result item in strList)
                    {
                        if (enable == 1)
                        {
                            //允许超越不做任何管控,随便
                        }
                        else
                        {
                            //判断该批次物料是否已经被耗完
                            if (item.lot_qty < jobModel.QTY * (_qty / baseqty) * Convert.ToDecimal(consume_percent))
                            {
                                result.ExtMessage = "该批次物料剩余不足";
                                result.Result     = false;
                                return(result);
                            }
                            if (decimal.Parse((item.lot_qty).ToString()) < 0)
                            {
                                result.ExtMessage = "该批次物料已用完";
                                result.Result     = false;
                                return(result);
                            }
                        }
                        #region
                        if (item.input_hour != null &&
                            (decimal)item.input_hour > 0)
                        {
                            if (item.input_hour < (decimal)item.currinput_hour)
                            {
                                //当前投入时间差大于设置时间(分钟)
                                DialogResult dr = MessageBox.Show("当前投入时间差大于设置时间,确认是否继续?", "提示", MessageBoxButtons.OKCancel);
                                if (dr == DialogResult.OK)
                                {
                                    //用户选择确认的操作
                                    //MessageBox.Show("您选择的是【确认】");
                                }
                                else if (dr == DialogResult.Cancel)
                                {
                                    //用户选择取消的操作
                                    //MessageBox.Show("您选择的是【取消】");
                                    result.ExtMessage = "当前投入时间差大于设置时间";
                                    result.Result     = false;
                                    return(result);
                                }
                            }
                        }
                        if (item.feed_hour != null &&
                            (decimal)item.feed_hour > 0)
                        {
                            if (item.feed_hour < (decimal)item.currfeed_hour)
                            {
                                //当前耗料时间差大于设置时间(分钟)
                                DialogResult dr = MessageBox.Show("当前耗料时间差大于设置时间,确认是否继续?", "提示", MessageBoxButtons.OKCancel);
                                if (dr == DialogResult.OK)
                                {
                                    //用户选择确认的操作
                                    //MessageBox.Show("您选择的是【确认】");
                                }
                                else if (dr == DialogResult.Cancel)
                                {
                                    //用户选择取消的操作
                                    //MessageBox.Show("您选择的是【取消】");
                                    result.ExtMessage = "当前耗料时间差大于设置时间";
                                    result.Result     = false;
                                    return(result);
                                }
                            }
                        }
                        #endregion

                        ILE.StepData stepd = new ILE.StepData();
                        stepd.wip_id    = item.wip_id.ToString();
                        stepd.lotqty    = item.lot_qty;
                        stepd.StepVal   = item.lot_no;
                        stepd.matCode   = item.mat_code;
                        stepd.qty       = 1;
                        stepd.InPutDate = DateTime.Now;
                        stepDetail.Add(stepd);
                    }
                    jobModel.StepList[jobModel.StepIdx].StepValue = val;
                    jobModel.StepList[jobModel.StepIdx].StepDetail.AddRange(stepDetail);
                    jobModel.StepList[jobModel.StepIdx].Completed = true;
                    //循环stepList,判断该物料在数据保存之前是否已经扫描
                    string mbm = clien.RunServerAPI("BLL.SFCConsume", "GetMaterialOrProductMbm", matCode);
                    if (mbm == "1")
                    {
                        for (int i = jobModel.IndexBack; i < jobModel.StepIdx; i++)
                        {
                            if (jobModel.StepList[jobModel.StepIdx].StepValue == jobModel.StepList[i].StepValue)
                            {
                                result.ExtMessage = "该物料[" + jobModel.StepList[jobModel.StepIdx].StepValue + "]已扫描,不可重复扫描";
                                result.Result     = false;
                                return(result);
                            }
                        }
                    }
                    result.obj = null;
                }
                return(result);
            }
            catch (Exception ex)
            {
                result.ExtMessage = ex.Message;
                result.Result     = false;
                return(result);
            }
        }
Exemple #8
0
        /// <summary>
        /// 自动耗料驱动
        /// </summary>
        /// <param name="jobModel"></param>
        /// <returns></returns>
        public ILE.IResult DoWork(ILE.IJob jobModel)
        {
            ILE.LEResult result = new ILE.LEResult();
            try
            {
                ServiceReference.ServiceClient clien = new ServiceReference.ServiceClient();
                string orderon      = jobModel.OrderNO;                            //工单
                string matCode      = jobModel.StepList[jobModel.StepIdx].Matcode; //物料
                string Station      = jobModel.StationCode;                        //工位
                string product_code = jobModel.Product;
                string flow_code    = jobModel.FlowCode.ToString();
                //根据工艺查找bom_id
                int bom_id = int.Parse(clien.RunServerAPI("BLL.Product", "GetBomByFlow", flow_code));

                int    enable     = int.Parse(clien.RunServerAPI("BLL.Product", "GetMatIsEnable", matCode + "," + product_code + "," + bom_id.ToString()));
                string json       = orderon + "," + matCode + "," + Station;
                string ResultJson = clien.RunServerAPI("BLL.SFCConsume", "GetMaterialConsumptionAuto", json);
                result = JsonConvert.DeserializeObject <ILE.LEResult>(ResultJson);
                int baseqty = int.Parse(clien.RunServerAPI("BLL.Bom", "GetBomDetailBaseQty", matCode + "," + product_code));
                if (result.Result)
                {
                    List <LEDAO.P_GetMaterialConsumption_Result> strList1 = JsonConvert.DeserializeObject <List <LEDAO.P_GetMaterialConsumption_Result> >(result.obj.ToString());
                    //将获取的物料批次按时间顺序升序排列
                    var strList = strList1.OrderBy(x => x.feel_time).ToList();

                    jobModel.StepList[jobModel.StepIdx].StepDetail = new List <ILE.StepData>();
                    List <ILE.StepData> stepDetail = new List <ILE.StepData>();


                    string flowcode = jobModel.FlowCode;

                    string processFlow = clien.RunServerAPI("BLL.ProcessFlow", "GetProcessFlow", flowcode);
                    List <B_Process_Flow> processFlowList = JsonConvert.DeserializeObject <List <B_Process_Flow> >(processFlow);
                    string bomid = Convert.ToString(processFlowList[0].bom_id);


                    string       bom      = clien.RunServerAPI("BLL.Bom", "GetBomById", bomid);
                    List <B_Bom> bomList  = JsonConvert.DeserializeObject <List <B_Bom> >(bom);
                    string       bom_code = bomList[0].bom_code;


                    string Bom_detail = clien.RunServerAPI("BLL.Bom", "GetBomDetail", matCode + "," + product_code + "," + bom_code);
                    List <V_Bom_Detail> Bom_Detail = JsonConvert.DeserializeObject <List <V_Bom_Detail> >(Bom_detail);
                    decimal             _qty       = 0;
                    if (Bom_detail != null)
                    {
                        _qty = (decimal)Bom_Detail[0].qty;
                    }
                    //判断该物料是否允许超越
                    if (enable == 1)
                    {
                        //允许超越随便
                    }
                    else
                    {
                        decimal sumqty = 0;
                        //float consume_percent = jobModel.StepList[jobModel.StepIdx].consume_percent;
                        float consume_percent = 0;
                        for (int index = jobModel.IndexBack; index < jobModel.StepList.Count; index++)
                        {
                            if (jobModel.StepList[index].Matcode == matCode)
                            {
                                consume_percent += jobModel.StepList[index].consume_percent;
                            }
                        }
                        foreach (LEDAO.P_GetMaterialConsumption_Result item in strList)
                        {
                            if (item.lot_qty > 0)
                            {
                                sumqty += decimal.Parse((item.lot_qty).ToString());
                            }
                            else
                            {
                                sumqty += 0;
                            }
                        }
                        if (sumqty < jobModel.QTY * (_qty / baseqty) * (decimal)consume_percent)
                        {
                            result.ExtMessage = "剩余物料不足生产,请投料";
                            result.Result     = false;
                            return(result);
                        }
                        if (sumqty <= 0)
                        {
                            result.ExtMessage = "物料已用完,请投料";
                            result.Result     = false;
                            return(result);
                        }
                    }

                    decimal lot_qty = 0;
                    foreach (LEDAO.P_GetMaterialConsumption_Result item in strList)
                    {
                        #region
                        if (item.input_hour != null &&
                            (decimal)item.input_hour > 0)
                        {
                            if (item.input_hour < (decimal)item.currinput_hour)
                            {
                                //当前投入时间差大于设置时间(分钟)
                                DialogResult dr = MessageBox.Show("当前投入时间差大于设置时间,确认是否继续?", "提示", MessageBoxButtons.OKCancel);
                                if (dr == DialogResult.OK)
                                {
                                    //用户选择确认的操作
                                    //MessageBox.Show("您选择的是【确认】");
                                }
                                else if (dr == DialogResult.Cancel)
                                {
                                    //用户选择取消的操作
                                    //MessageBox.Show("您选择的是【取消】");
                                    result.ExtMessage = "当前投入时间差大于设置时间";
                                    result.Result     = false;
                                    return(result);
                                }
                            }
                        }
                        if (item.feed_hour != null &&
                            (decimal)item.feed_hour > 0)
                        {
                            if (item.feed_hour < (decimal)item.currfeed_hour)
                            {
                                //当前耗料时间差大于设置时间(分钟)
                                DialogResult dr = MessageBox.Show("当前耗料时间差大于设置时间,确认是否继续?", "提示", MessageBoxButtons.OKCancel);
                                if (dr == DialogResult.OK)
                                {
                                    //用户选择确认的操作
                                    //MessageBox.Show("您选择的是【确认】");
                                }
                                else if (dr == DialogResult.Cancel)
                                {
                                    //用户选择取消的操作
                                    //MessageBox.Show("您选择的是【取消】");
                                    result.ExtMessage = "当前耗料时间差大于设置时间";
                                    result.Result     = false;
                                    return(result);
                                }
                            }
                        }
                        #endregion

                        ILE.StepData stepd = new ILE.StepData();
                        if (jobModel.StepList[jobModel.StepIdx].consume_type == 1) //平均消耗
                        {
                            stepd.StepVal      = item.lot_no;
                            stepd.lotqty       = item.lot_qty;
                            stepd.seed_id      = item.wip_id.ToString();
                            stepd.matCode      = item.mat_code;
                            stepd.consume_type = jobModel.StepList[jobModel.StepIdx].consume_type;
                            stepd.qty          = 1;
                            stepd.InPutDate    = DateTime.Now;
                            stepDetail.Add(stepd);
                        }
                        if (jobModel.StepList[jobModel.StepIdx].consume_type == 2) //顺序消耗
                        {
                            decimal qty = jobModel.QTY * (_qty / baseqty);
                            if (item.lot_qty > 0)
                            {
                                lot_qty += Math.Abs((decimal)(item.lot_qty));
                            }
                            else
                            {
                                lot_qty += 0;
                            }
                            if (item != strList[strList.Count - 1] && (item.lot_qty) <= 0)
                            {
                                continue;
                            }

                            stepd.StepVal      = item.lot_no;
                            stepd.lotqty       = item.lot_qty;
                            stepd.seed_id      = item.wip_id.ToString();
                            stepd.matCode      = item.mat_code;
                            stepd.consume_type = jobModel.StepList[jobModel.StepIdx].consume_type;
                            stepd.qty          = 1;
                            stepd.InPutDate    = DateTime.Now;
                            stepDetail.Add(stepd);

                            if (lot_qty > qty)
                            {
                                break;
                            }
                        }
                    }
                    jobModel.StepList[jobModel.StepIdx].StepValue = "";//随便赋值,使其不为null
                    jobModel.StepList[jobModel.StepIdx].StepDetail.AddRange(stepDetail);
                    jobModel.StepList[jobModel.StepIdx].Completed = true;
                    //jobModel.start_time=date
                    result.obj = null;
                }
                return(result);
            }
            catch (Exception ex)
            {
                result.ExtMessage = ex.Message;
                result.Result     = false;
                return(result);
            }
        }