Example #1
0
        public static void FinishProcessPrepare(PmTaskLine taskLine, List <MesProcessCtrol> processCtrols)
        {
            WcfClient <IPLMService> wsPLM = new WcfClient <IPLMService>(); //计划

            #region 更新任务状态

            if (taskLine.RUN_STATE == 0)
            {
                taskLine.RUN_STATE        = 1;
                taskLine.UPDATED_BY       = CBaseData.LoginName;
                taskLine.LAST_UPDATE_DATE = DateTime.Now;
                wsPLM.UseService(s => s.UpdatePmTaskLine(taskLine));
            }

            #endregion

            foreach (MesProcessCtrol process in processCtrols)
            {
                process.PKNO          = CBaseData.NewGuid();
                process.COMPANY_CODE  = "";
                process.CREATED_BY    = CBaseData.LoginName;
                process.CREATION_DATE = DateTime.Now;
                process.USE_FLAG      = 1;
                wsPLM.UseService(s => s.AddMesProcessCtrol(process));
            }
        }
Example #2
0
        private void cmbTask_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            cmbProduct.SelectedIndex     = -1;
            cmbRoutingMain.SelectedIndex = -1;

            cmbProduct.ItemsSource     = null;
            cmbRoutingMain.ItemsSource = null;

            //选择生产线 => 获取产品
            PmTaskLine taskLine = cmbTask.SelectedItem as PmTaskLine;

            if (taskLine == null)
            {
                return;
            }

            tbLiftQty.Text = (taskLine.TASK_QTY - taskLine.PREPARED_QTY).ToString();  //任务剩余数量

            tbTaskQty.Text = tbLiftQty.Text;

            cmbProduct.ItemsSource =
                wsPLM.UseService(s => s.GetPmTaskLines($"USE_FLAG = 1 AND TASK_PKNO = '{taskLine.TASK_PKNO}'"))
                .Join(wsRSM.UseService(s => s.GetRsItemMasters("USE_FLAG = 1")), c => c.ITEM_PKNO, d => d.PKNO,
                      (c, d) => new { d.PKNO, d.ITEM_NAME }).Distinct().ToList();

            if (cmbProduct.Items.Count > 0)
            {
                cmbProduct.SelectedIndex = 0;                             //选择第一个
            }
            if (cmbAssetInfo.Items.Count == 1)
            {
                cmbAssetInfo.SelectedIndex = 0;                                 //PLC
            }
        }
Example #3
0
 public PmTaskLine GetPmTaskLineById(string Id)
 {
     using (IPmTaskLineBLL PmTaskLineBLL = BLLContainer.Resolve <IPmTaskLineBLL>())
     {
         PmTaskLine model = PmTaskLineBLL.GetFirstOrDefault(Id);
         return(model);
     }
 }
Example #4
0
 public bool AddPmTaskLine(PmTaskLine mPmTaskLine)
 {
     if (mPmTaskLine == null)
     {
         return(false);
     }
     using (IPmTaskLineBLL PmTaskLineBLL = BLLContainer.Resolve <IPmTaskLineBLL>())
     {
         return(PmTaskLineBLL.Add(mPmTaskLine));
     }
 }
Example #5
0
 public bool DelPmTaskLine(string Id)
 {
     using (IPmTaskLineBLL PmTaskLineBLL = BLLContainer.Resolve <IPmTaskLineBLL>())
     {
         try
         {
             PmTaskLine item = PmTaskLineBLL.GetFirstOrDefault(Id);
             return(PmTaskLineBLL.Delete(item));
         }
         catch { return(false); }
     }
 }
Example #6
0
        private void cmbProduct_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            //选择产品 => 获取工艺路线

            if (cmbProduct.SelectedValue == null)
            {
                return;
            }

            string itemPKNO = cmbProduct.SelectedValue.ToString(); //产品

            if (string.IsNullOrEmpty(itemPKNO))
            {
                return;
            }

            PmTaskLine taskLine = cmbTask.SelectedItem as PmTaskLine;

            if (taskLine == null)
            {
                return;
            }

            cmbRoutingMain.ItemsSource =
                wsRSM.UseService(s => s.GetRsRoutingItems($"USE_FLAG = 1 AND ITEM_PKNO = '{itemPKNO}'"))
                .Join(wsRSM.UseService(s => s.GetRsRoutingHeads("USE_FLAG = 1")), c => c.ROUTING_PKNO,
                      d => d.PKNO, (c, d) => new { d.PKNO, d.ROUTING_NAME });

            //需增加状态表,已经完成准备的工序不再显示
            if (cmbRoutingMain.Items.Count > 0)
            {
                cmbRoutingMain.SelectedIndex = 0;                                 //选择第一个
            }
            MesJobOrder jobOrder =
                wsPLM.UseService(s =>
                                 s.GetMesJobOrders(
                                     $"LINE_TASK_PKNO = '{taskLine.PKNO}' AND USE_FLAG = 1 AND LINE_PKNO = '{CBaseData.CurLinePKNO}'"))
                .OrderByDescending(c => c.BATCH_NO)     //按照批次排序
                .FirstOrDefault();

            int batchIndex = 1;

            if (jobOrder != null)
            {
                int.TryParse(jobOrder.BATCH_NO, out batchIndex);
                batchIndex++;
            }

            lbBatchIndex.Content = batchIndex.ToString(); //批次
        }
Example #7
0
 public bool DelPmTaskLines(string[] Ids)
 {
     using (IPmTaskLineBLL PmTaskLineBLL = BLLContainer.Resolve <IPmTaskLineBLL>())
     {
         try
         {
             List <PmTaskLine> entitys = new List <PmTaskLine>();
             foreach (string id in Ids)
             {
                 PmTaskLine item = PmTaskLineBLL.GetFirstOrDefault(id);
                 entitys.Add(item);
             }
             return(PmTaskLineBLL.Delete(entitys));
         }
         catch { return(false); }
     }
 }
Example #8
0
        private void GetPage()
        {
            gridProcessInfo.ItemsSource = null;

            PmTaskLine taskLine = cmbTask.SelectedItem as PmTaskLine;

            if (taskLine == null)
            {
                return;
            }

            string itemPKNO = cmbProduct.SelectedValue.ToString();

            if (string.IsNullOrEmpty(itemPKNO))
            {
                return;                                 //产品
            }
        }
Example #9
0
        private void BtnAdd_Click(object sender, RoutedEventArgs e)
        {
            PmTaskMaster taskMaster = gridItem.SelectedItem as PmTaskMaster;

            if (taskMaster == null)
            {
                return;
            }

            #region

            //TODO: 校验

            #endregion

            PmTaskLine planLine = new PmTaskLine()
            {
                COMPANY_CODE     = "",
                TASK_PKNO        = taskMaster.PKNO,
                ITEM_PKNO        = taskMaster.ITEM_PKNO,
                TASK_NO          = TableNOHelper.GetNewNO("PmTaskLine.TASK_NO", "N"),
                TASK_START_TIME  = taskMaster.TASK_START_TIME,
                TASK_FINISH_TIME = taskMaster.TASK_FINISH_TIME,
                TASK_QTY         = taskMaster.TASK_QTY - taskMaster.LINE_QTY,
                PREPARED_QTY     = 0, //准备完成数量
                COMPLETE_QTY     = 0,
                ONLINE_QTY       = 0,
                ONCE_QTY         = 0,
                RUN_STATE        = 0,
                USE_FLAG         = 1, //启用
            };
            gbItem.DataContext = planLine;

            dictBasic.Header   = $"{HeaderName}  【分配产线】";
            gbItem.IsCollapsed = false;
            gbItem.Visibility  = Visibility.Visible;
        }
Example #10
0
 public static bool AutoFinishProcessPrepare(PmTaskLine taskLine, out string error)
 {
     error = "";
     return(true);
 }
Example #11
0
        private void bSave_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            if (cmbRoutingMain.SelectedValue == null)
            {
                return;
            }

            #region 创建生产过程

            //生产线数据
            PmTaskLine taskLine = cmbTask.SelectedItem as PmTaskLine;
            //产品数据
            string       itemPKNO = cmbProduct.SelectedValue.ToString();
            RsItemMaster product  = wsRSM.UseService(s => s.GetRsItemMasterById(itemPKNO));
            if (product == null)
            {
                MessageBox.Show("产品信息不存在,请核实.", "完成生产准备", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            //准备完成
            List <MesProcessCtrol> processCtrols    = new List <MesProcessCtrol>();
            List <RsRoutingDetail> rsRoutingDetails = gridProcessInfo.ItemsSource as List <RsRoutingDetail>;

            //已创建加工数量
            int     qty         = CheckPlanQTY(taskLine.TASK_NO);
            decimal preparedQty = 0;
            decimal.TryParse(tbTaskQty.Text.ToString(), out preparedQty);
            if (preparedQty <= 0)
            {
                MessageBox.Show("请输入正确的任务数量.", "完成生产准备", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            #region 判断加工数量

            if (tbTaskQty.Text.ToString() == "")
            {
                MessageBox.Show($"请输入数量", "未输入数量", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            if (int.Parse(tbTaskQty.Text.ToString()) + qty > taskLine.TASK_QTY)
            {
                MessageBox.Show($"输入数量超出订单加工数量", "数量超限", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            #endregion

            AmAssetMasterN mainDevice = cmbAssetInfo.SelectedItem as AmAssetMasterN;

            if (mainDevice == null)
            {
                MessageBox.Show("请选择主控PLC", "完成生产准备", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            #region 创建工单表

            MesJobOrder jobOrder = new MesJobOrder()
            {
                PKNO                = Guid.NewGuid().ToString("N"),
                COMPANY_CODE        = "",
                LINE_PKNO           = taskLine.LINE_PKNO, //产线信息
                LINE_TASK_PKNO      = taskLine.PKNO,
                ITEM_PKNO           = itemPKNO,
                JOB_ORDER_NO        = taskLine.TASK_NO + lbBatchIndex.Content.ToString(),
                BATCH_NO            = lbBatchIndex.Content.ToString(),
                ROUTING_DETAIL_PKNO = cmbRoutingMain.SelectedValue.ToString(),
                TASK_QTY            = preparedQty,
                COMPLETE_QTY        = 0,
                ONLINE_QTY          = 0,
                ONCE_QTY            = 0,
                RUN_STATE           = 1, //准备完成
                CREATION_DATE       = DateTime.Now,
                CREATED_BY          = CBaseData.LoginName,
                USE_FLAG            = 1,
                REMARK              = "",
            };

            #endregion

            List <MesProcessCtrol> newMesProcessCtrols = new List <MesProcessCtrol>();

            int iProcessIndex = 0;

            string DeviceInfos = "";
            string Programs    = "";

            #region 获取加工设备、程序号

            foreach (RsRoutingDetail item in rsRoutingDetails)
            {
                if (string.IsNullOrEmpty(item.WC_ABV))
                {
                    MessageBox.Show($"工序【{item.OP_NAME}】加工设备不能为空,请选择加工设备!",
                                    "完成生产准备", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return;
                }

                AmAssetMasterN device = wsEAM.UseService(s => s.GetAmAssetMasterNById(item.WC_ABV));
                if (device == null)
                {
                    MessageBox.Show($"工序【{item.OP_NAME}】加工设备,请选择加工设备!",
                                    "完成生产准备", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return;
                }

                DeviceInfos += device.ASSET_LABEL;  //设备
                Programs    += item.NC_PRO_NAME;    //程序号
            }

            #endregion

            wsPLM.UseService(s => s.AddMesJobOrder(jobOrder));  //添加工单

            #region 添加加工工序,共5步

            FmsActionControl ctrl1 =
                wsFMS.UseService(s => s.GetFmsActionControls($"ASSET_CODE = '{mainDevice.ASSET_CODE}' AND ACTION_NAME = '发送产品信息'"))
                .FirstOrDefault();      //
            FmsActionControl ctrl2 =
                wsFMS.UseService(s => s.GetFmsActionControls($"ASSET_CODE = '{mainDevice.ASSET_CODE}' AND ACTION_NAME = '发送数量'"))
                .FirstOrDefault();      //
            FmsActionControl ctrl3 =
                wsFMS.UseService(s => s.GetFmsActionControls($"ASSET_CODE = '{mainDevice.ASSET_CODE}' AND ACTION_NAME = '发送设备及程序号'"))
                .FirstOrDefault();      //
            FmsActionControl ctrl4 =
                wsFMS.UseService(s => s.GetFmsActionControls($"ASSET_CODE = '{mainDevice.ASSET_CODE}' AND ACTION_NAME = '订单确认'"))
                .FirstOrDefault();      //
            FmsActionControl ctrl5 =
                wsFMS.UseService(s => s.GetFmsActionControls($"ASSET_CODE = '{mainDevice.ASSET_CODE}' AND ACTION_NAME = '订单完成'"))
                .FirstOrDefault();      //

            #region 1.第一步发送产品信息

            MesProcessCtrol step1 = new MesProcessCtrol()
            {
                PKNO                        = CBaseData.NewGuid(),
                COMPANY_CODE                = "",
                JOB_ORDER_PKNO              = jobOrder.PKNO,
                JOB_ORDER                   = cmbTask.Text + lbBatchIndex.Content, //工单编号
                ITEM_PKNO                   = jobOrder.ITEM_PKNO,                  //产品PKNO
                SUB_JOB_ORDER_NO            = "",
                ROUTING_DETAIL_PKNO         = "",                                  //工序编号(工艺路线明细)为空,不按照工艺进行控制
                PROCESS_DEVICE_PKNO         = mainDevice.PKNO,                     //加工设备为 主控PLC
                PROCESS_INDEX               = 0,
                PROCESS_ACTION_TYPE         = 0,
                PROCESS_ACTION_PKNO         = (ctrl1 == null) ? "" : ctrl1.PKNO,
                PROCESS_ACTION_PARAM1_VALUE = product.ITEM_ABV, //产品简称
                PROCESS_ACTION_PARAM2_VALUE = "",
                CUR_PRODUCT_CODE_PKNO       = "",
                PROCESS_QTY                 = preparedQty,
                COMPLETE_QTY                = 0,
                QUALIFIED_QTY               = 0,
                PROCESS_STATE               = 1,
                CREATION_DATE               = DateTime.Now,
                CREATED_BY                  = CBaseData.LoginName,
                USE_FLAG                    = 1,
                REMARK                      = "系统自动形成",
            };

            #endregion end 1

            #region 2.第二步发送数量

            MesProcessCtrol step2 = new MesProcessCtrol()
            {
                PKNO                        = CBaseData.NewGuid(),
                COMPANY_CODE                = "",
                JOB_ORDER_PKNO              = jobOrder.PKNO,
                JOB_ORDER                   = cmbTask.Text + lbBatchIndex.Content, //工单编号
                ITEM_PKNO                   = jobOrder.ITEM_PKNO,                  //产品PKNO
                SUB_JOB_ORDER_NO            = "",
                ROUTING_DETAIL_PKNO         = "",                                  //工序编号(工艺路线明细)为空,不按照工艺进行控制
                PROCESS_DEVICE_PKNO         = mainDevice.PKNO,                     //加工设备为 主控PLC
                PROCESS_INDEX               = 1,
                PROCESS_ACTION_TYPE         = 0,
                PROCESS_ACTION_PKNO         = (ctrl2 == null) ? "" : ctrl2.PKNO,
                PROCESS_ACTION_PARAM1_VALUE = preparedQty.ToString(), //数量
                PROCESS_ACTION_PARAM2_VALUE = "",
                CUR_PRODUCT_CODE_PKNO       = "",
                PROCESS_QTY                 = preparedQty,
                COMPLETE_QTY                = 0,
                QUALIFIED_QTY               = 0,
                PROCESS_STATE               = 1,
                CREATION_DATE               = DateTime.Now,
                CREATED_BY                  = CBaseData.LoginName,
                USE_FLAG                    = 1,
                REMARK                      = "系统自动形成",
            };

            #endregion end 2

            #region 3.第三步发送设备及程序号

            MesProcessCtrol step3 = new MesProcessCtrol()
            {
                PKNO                        = CBaseData.NewGuid(),
                COMPANY_CODE                = "",
                JOB_ORDER_PKNO              = jobOrder.PKNO,
                JOB_ORDER                   = cmbTask.Text + lbBatchIndex.Content, //工单编号
                ITEM_PKNO                   = jobOrder.ITEM_PKNO,                  //产品PKNO
                SUB_JOB_ORDER_NO            = "",
                ROUTING_DETAIL_PKNO         = "",                                  //工序编号(工艺路线明细)为空,不按照工艺进行控制
                PROCESS_DEVICE_PKNO         = mainDevice.PKNO,                     //加工设备为 主控PLC
                PROCESS_INDEX               = 2,
                PROCESS_ACTION_TYPE         = 0,
                PROCESS_ACTION_PKNO         = (ctrl3 == null) ? "" : ctrl3.PKNO,
                PROCESS_ACTION_PARAM1_VALUE = DeviceInfos, //设备ID
                PROCESS_ACTION_PARAM2_VALUE = Programs,    //程序号
                CUR_PRODUCT_CODE_PKNO       = "",
                PROCESS_QTY                 = preparedQty,
                COMPLETE_QTY                = 0,
                QUALIFIED_QTY               = 0,
                PROCESS_STATE               = 1,
                CREATION_DATE               = DateTime.Now,
                CREATED_BY                  = CBaseData.LoginName,
                USE_FLAG                    = 1,
                REMARK                      = "系统自动形成",
            };

            #endregion end 3

            #region 4.第四步发送订单确认

            MesProcessCtrol step4 = new MesProcessCtrol()
            {
                PKNO                        = CBaseData.NewGuid(),
                COMPANY_CODE                = "",
                JOB_ORDER_PKNO              = jobOrder.PKNO,
                JOB_ORDER                   = cmbTask.Text + lbBatchIndex.Content, //工单编号
                ITEM_PKNO                   = jobOrder.ITEM_PKNO,                  //产品PKNO
                SUB_JOB_ORDER_NO            = "",
                ROUTING_DETAIL_PKNO         = "",                                  //工序编号(工艺路线明细)为空,不按照工艺进行控制
                PROCESS_DEVICE_PKNO         = mainDevice.PKNO,                     //加工设备为 主控PLC
                PROCESS_INDEX               = 3,
                PROCESS_ACTION_TYPE         = 0,
                PROCESS_ACTION_PKNO         = (ctrl4 == null) ? "" : ctrl4.PKNO,
                PROCESS_ACTION_PARAM1_VALUE = cmbTask.Text + lbBatchIndex.Content, //订单ID
                PROCESS_ACTION_PARAM2_VALUE = "",                                  //
                CUR_PRODUCT_CODE_PKNO       = "",
                PROCESS_QTY                 = preparedQty,
                COMPLETE_QTY                = 0,
                QUALIFIED_QTY               = 0,
                PROCESS_STATE               = 1,
                CREATION_DATE               = DateTime.Now,
                CREATED_BY                  = CBaseData.LoginName,
                USE_FLAG                    = 1,
                REMARK                      = "系统自动形成",
            };

            #endregion end 4

            #region 5.第五步订单完成

            MesProcessCtrol step5 = new MesProcessCtrol()
            {
                PKNO                        = CBaseData.NewGuid(),
                COMPANY_CODE                = "",
                JOB_ORDER_PKNO              = jobOrder.PKNO,
                JOB_ORDER                   = cmbTask.Text + lbBatchIndex.Content, //工单编号
                ITEM_PKNO                   = jobOrder.ITEM_PKNO,                  //产品PKNO
                SUB_JOB_ORDER_NO            = "",
                ROUTING_DETAIL_PKNO         = "",                                  //工序编号(工艺路线明细)为空,不按照工艺进行控制
                PROCESS_DEVICE_PKNO         = mainDevice.PKNO,                     //加工设备为 主控PLC
                PROCESS_INDEX               = 4,
                PROCESS_ACTION_TYPE         = 0,
                PROCESS_ACTION_PKNO         = (ctrl5 == null) ? "" : ctrl5.PKNO,
                PROCESS_ACTION_PARAM1_VALUE = "", //
                PROCESS_ACTION_PARAM2_VALUE = "", //
                CUR_PRODUCT_CODE_PKNO       = "",
                PROCESS_QTY                 = preparedQty,
                COMPLETE_QTY                = 0,
                QUALIFIED_QTY               = 0,
                PROCESS_STATE               = 1,
                CREATION_DATE               = DateTime.Now,
                CREATED_BY                  = CBaseData.LoginName,
                USE_FLAG                    = 1,
                REMARK                      = "系统自动形成",
            };

            #endregion end 5

            wsPLM.UseService(s => s.AddMesProcessCtrol(step1));
            wsPLM.UseService(s => s.AddMesProcessCtrol(step2));
            wsPLM.UseService(s => s.AddMesProcessCtrol(step3));
            wsPLM.UseService(s => s.AddMesProcessCtrol(step4));
            wsPLM.UseService(s => s.AddMesProcessCtrol(step5));

            #endregion

            #endregion

            //修改产线任务的完成数量
            taskLine.PREPARED_QTY += preparedQty;
            if (taskLine.RUN_STATE == 0)
            {
                taskLine.RUN_STATE = 1;
            }
            wsPLM.UseService(s => s.UpdatePmTaskLine(taskLine));

            cmbTask.ItemsSource =
                wsPLM.UseService(s => s.GetPmTaskLines("USE_FLAG = 1 AND RUN_STATE < 10 ")) //未完成的
                .Where(c => c.TASK_QTY > c.PREPARED_QTY)
                .OrderBy(c => c.CREATION_DATE)
                .ToList();     //生产线任务

            cmbTask.SelectedIndex       = -1;
            gridProcessInfo.ItemsSource = null;
        }
Example #12
0
        private void BtnSave_Click(object sender, RoutedEventArgs e)
        {
            //保存
            PmTaskLine taskLine = gbItem.DataContext as PmTaskLine;

            if (taskLine == null)
            {
                return;
            }

            PmTaskMaster taskMaster = gridItem.SelectedItem as PmTaskMaster;

            if (taskMaster == null)
            {
                return;
            }

            #region  TODO: 校验

            if (string.IsNullOrEmpty(taskLine.LINE_PKNO))
            {
                System.Windows.Forms.MessageBox.Show("请选择产线", "保存", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            if (string.IsNullOrEmpty(taskLine.TASK_NO))
            {
                System.Windows.Forms.MessageBox.Show("请输入相应的任务编号", "保存", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            if (taskMaster.TASK_QTY - taskMaster.LINE_QTY < taskLine.TASK_QTY)
            {
                System.Windows.Forms.MessageBox.Show("分配的数量大于剩余数量,请重新选择", "保存", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            #endregion

            taskMaster.LINE_QTY += taskLine.TASK_QTY;
            if (taskMaster.TASK_QTY <= taskMaster.LINE_QTY)
            {
                taskMaster.RUN_STATE = 2;
            }
            else
            {
                taskMaster.RUN_STATE = 1;
            }

            ws.UseService(s => s.UpdatePmTaskMaster(taskMaster));

            if (string.IsNullOrEmpty(taskLine.PKNO)) //新增
            {
                taskLine.PKNO             = Guid.NewGuid().ToString("N");
                taskLine.CREATED_BY       = CBaseData.LoginName;
                taskLine.CREATION_DATE    = DateTime.Now;
                taskLine.LAST_UPDATE_DATE = DateTime.Now; //最后修改日期

                ws.UseService(s => s.AddPmTaskLine(taskLine));
            }
            else  //修改
            {
                taskLine.UPDATED_BY       = CBaseData.LoginName;
                taskLine.LAST_UPDATE_DATE = DateTime.Now;
                ws.UseService(s => s.UpdatePmTaskLine(taskLine));
            }

            GetPage();  //重新刷新数据,根据需求是否进行刷新数据

            //保存成功
            gbItem.IsCollapsed = true;
            gbItem.Visibility  = Visibility.Collapsed;
        }
Example #13
0
        private void bSave_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            if (cmbRoutingMain.SelectedValue == null)
            {
                return;
            }

            #region 创建生产过程

            //生产线数据
            PmTaskLine taskLine = cmbTask.SelectedItem as PmTaskLine;
            //产品数据
            string itemPKNO = cmbProduct.SelectedValue.ToString();
            //准备完成
            List <MesProcessCtrol> processCtrols    = new List <MesProcessCtrol>();
            List <RsRoutingDetail> rsRoutingDetails = gridProcessInfo.ItemsSource as List <RsRoutingDetail>;

            //已创建加工数量
            int     qty         = CheckPlanQTY(taskLine.TASK_NO);
            decimal preparedQty = 0;
            decimal.TryParse(tbTaskQty.Text.ToString(), out preparedQty);
            if (preparedQty <= 0)
            {
                MessageBox.Show("请输入正确的任务数量.", "完成生产准备", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            #region 判断加工数量

            if (tbTaskQty.Text.ToString() == "")
            {
                MessageBox.Show($"请输入数量", "未输入数量", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            if (int.Parse(tbTaskQty.Text.ToString()) + qty > taskLine.TASK_QTY)
            {
                MessageBox.Show($"输入数量超出订单加工数量", "数量超限", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            #endregion

            MesJobOrder jobOrder = new MesJobOrder()
            {
                PKNO                = Guid.NewGuid().ToString("N"),
                COMPANY_CODE        = "",
                LINE_PKNO           = taskLine.LINE_PKNO, //产线信息
                LINE_TASK_PKNO      = taskLine.PKNO,
                ITEM_PKNO           = itemPKNO,
                JOB_ORDER_NO        = taskLine.TASK_NO + lbBatchIndex.Content.ToString(),
                BATCH_NO            = lbBatchIndex.Content.ToString(),
                ROUTING_DETAIL_PKNO = cmbRoutingMain.SelectedValue.ToString(),
                TASK_QTY            = preparedQty,
                COMPLETE_QTY        = 0,
                ONLINE_QTY          = 0,
                ONCE_QTY            = 0,
                RUN_STATE           = 1, //准备完成
                CREATION_DATE       = DateTime.Now,
                CREATED_BY          = CBaseData.LoginName,
                LAST_UPDATE_DATE    = DateTime.Now, //最后修改日期
                USE_FLAG            = 1,
                REMARK              = "",
            };

            List <MesProcessCtrol> newMesProcessCtrols = new List <MesProcessCtrol>();

            int iProcessIndex = 0;

            foreach (RsRoutingDetail item in rsRoutingDetails)
            {
                if (string.IsNullOrEmpty(item.WC_ABV))
                {
                    MessageBox.Show($"工序【{item.OP_NAME}】加工设备不能为空,请选择加工设备!",
                                    "完成生产准备", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return;
                }

                //if (string.IsNullOrEmpty(item.PROCESS_ACTION_PKNO))
                //{
                //    MessageBox.Show($"工序【{item.OP_NAME}】指令动作不能为空,请选择指令动作!",
                //        "完成生产准备", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                //    return;
                //}


                MesProcessCtrol mesProcess = new MesProcessCtrol();
                mesProcess.PKNO             = Guid.NewGuid().ToString("N");
                mesProcess.COMPANY_CODE     = "";
                mesProcess.ITEM_PKNO        = jobOrder.ITEM_PKNO;
                mesProcess.JOB_ORDER_PKNO   = jobOrder.PKNO;
                mesProcess.SUB_JOB_ORDER_NO = jobOrder.JOB_ORDER_NO + "-" + iProcessIndex;

                mesProcess.ROUTING_DETAIL_PKNO = item.PKNO;   //工序PKNO
                mesProcess.PROCESS_DEVICE_PKNO = item.WC_ABV; //设备信息
                mesProcess.PROCESS_INDEX       = iProcessIndex;

                mesProcess.PROCESS_ACTION_TYPE         = item.PROCESS_ACTION_TYPE;
                mesProcess.PROCESS_ACTION_PKNO         = item.PROCESS_ACTION_PKNO;
                mesProcess.PROCESS_ACTION_PARAM1_VALUE = item.PROCESS_ACTION_PARAM1_VALUE;   //控制参数1
                mesProcess.PROCESS_ACTION_PARAM2_VALUE = item.PROCESS_ACTION_PARAM2_VALUE;   //控制参数2

                mesProcess.PROCESS_QTY   = 0;
                mesProcess.COMPLETE_QTY  = 0;
                mesProcess.QUALIFIED_QTY = 0;
                mesProcess.PROCESS_STATE = 1;  //准备完成

                mesProcess.CREATED_BY       = CBaseData.LoginName;
                mesProcess.CREATION_DATE    = DateTime.Now;
                mesProcess.LAST_UPDATE_DATE = DateTime.Now;  //最后修改日期
                mesProcess.USE_FLAG         = 1;

                iProcessIndex++;
                newMesProcessCtrols.Add(mesProcess);
            }

            wsPLM.UseService(s => s.AddMesJobOrder(jobOrder));  //添加工单
            foreach (MesProcessCtrol mesProcessCtrol in newMesProcessCtrols)
            {
                wsPLM.UseService(s => s.AddMesProcessCtrol(mesProcessCtrol));  //添加具体工序
            }

            #endregion

            //修改产线任务的完成数量
            taskLine.PREPARED_QTY += preparedQty;
            if (taskLine.RUN_STATE == 0)
            {
                taskLine.RUN_STATE = 1;
            }
            wsPLM.UseService(s => s.UpdatePmTaskLine(taskLine));

            tbLiftQty.Text              = "";
            cmbTask.SelectedIndex       = -1;
            gridProcessInfo.ItemsSource = null;
            tbTaskQty.Text              = "";
            lbBatchIndex.Content        = "";
            if (System.Windows.Forms.MessageBox.Show($"确定生成质检计划吗?",
                                                     @"生成质检信息",
                                                     MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
            {
                QmsCheckParam qmsCheckParam = wsQMS.UseService(s =>
                                                               s.GetQmsCheckParams(" USE_FLAG = 1 AND ITEM_PKNO = " + taskLine.ITEM_PKNO + "")).FirstOrDefault();
                if (qmsCheckParam == null)
                {
                    return;
                }

                List <QmsRoutingCheck> qmsRoutingChecks = wsQMS.UseService(s =>
                                                                           s.GetQmsRoutingChecks(" USE_FLAG = 1 AND CHECK_PARAM_PKNO = " + qmsCheckParam.PKNO + ""));
                if (qmsRoutingChecks.Count <= 0)
                {
                    return;
                }
                foreach (var itemRoutingCheck in qmsRoutingChecks)
                {
                    //创建质检主表内容
                    if (itemRoutingCheck.CHK_MODE == "首检" || itemRoutingCheck.CHK_MODE == "尾检")//首尾检
                    {
                        QmsCheckMaster qmsCheckMaster = new QmsCheckMaster();
                        qmsCheckMaster.PKNO = Guid.NewGuid().ToString("N");
                        if (itemRoutingCheck.CHK_MODE == "首检")
                        {
                            qmsCheckMaster.CHECK_NO = "ZJ" + jobOrder.JOB_ORDER_NO + (1 * 1000).ToString("0000");
                        }
                        else
                        {
                            qmsCheckMaster.CHECK_NO = "ZJ" + jobOrder.JOB_ORDER_NO + (2 * 1000).ToString("0000");
                        }

                        qmsCheckMaster.CHECK_PARAM_PKNO   = itemRoutingCheck.CHECK_PARAM_PKNO;
                        qmsCheckMaster.ROUTING_CHECK_PKNO = itemRoutingCheck.PKNO;
                        qmsCheckMaster.CREATION_DATE      = DateTime.Now;
                        qmsCheckMaster.LAST_UPDATE_DATE   = DateTime.Now; //最后修改日期
                        qmsCheckMaster.USE_FLAG           = 1;
                        qmsCheckMaster.CHECK_STATUS       = "1";
                        qmsCheckMaster.TASKLINE_PKNO      = jobOrder.JOB_ORDER_NO;//以工单编号应用为关联
                        qmsCheckMaster.PROCESS_PKNO       = itemRoutingCheck.PROCESS_PKNO;
                        qmsCheckMaster.CHK_MODE           = itemRoutingCheck.CHK_MODE;
                        wsQMS.UseService(s => s.AddQmsCheckMaster(qmsCheckMaster));
                    }
                    else
                    {
                        //todo:未判断首尾检对批次检测影响
                        if (itemRoutingCheck.CHK_FREQ_VALUE == String.Empty)
                        {
                            return;
                        }
                        int count = int.Parse(jobOrder.TASK_QTY.ToString()) / int.Parse(itemRoutingCheck.CHK_FREQ_VALUE);
                        for (int i = 1; i <= count; i++)
                        {
                            QmsCheckMaster qmsCheckMaster = new QmsCheckMaster();
                            qmsCheckMaster.PKNO               = Guid.NewGuid().ToString("N");
                            qmsCheckMaster.CHECK_PARAM_PKNO   = itemRoutingCheck.CHECK_PARAM_PKNO;
                            qmsCheckMaster.ROUTING_CHECK_PKNO = itemRoutingCheck.PKNO;
                            qmsCheckMaster.CHECK_NO           = "ZJ" + jobOrder.JOB_ORDER_NO + ((3 * 1000) + i).ToString("0000"); //3为批次检测,抽检需要另外规则定制生成
                            qmsCheckMaster.CREATION_DATE      = DateTime.Now;
                            qmsCheckMaster.LAST_UPDATE_DATE   = DateTime.Now;                                                     //最后修改日期
                            qmsCheckMaster.USE_FLAG           = 1;
                            qmsCheckMaster.CHECK_STATUS       = "1";
                            qmsCheckMaster.TASKLINE_PKNO      = jobOrder.JOB_ORDER_NO;//以工单编号应用为关联
                            qmsCheckMaster.PROCESS_PKNO       = itemRoutingCheck.PROCESS_PKNO;
                            qmsCheckMaster.CHK_MODE           = itemRoutingCheck.CHK_MODE;
                            wsQMS.UseService(s => s.AddQmsCheckMaster(qmsCheckMaster));
                        }
                    }
                }
            }
            GetPage();
        }