/// <summary>
 /// 构造函数
 /// </summary>
 /// <param name="connection">数据连接</param>
 public BForkliftTaskBC(SqlConnection connection)
 {
     this.connection = connection;
     this.forkliftTaskBB = new BForkliftTaskBB(this.connection);
     this.errorDiaryBB = new SErrorDiaryBB(this.connection);
     this.operatDiaryBB = new SOperatDiaryBB(this.connection);
 }
 /// <summary>
 /// 构造函数
 /// </summary>
 public BForkliftTaskBC()
 {
     this.selfConn = true;
     this.connection = new SqlConnection(HS.Config.SqlDataObject.GetSqlConnectionString);
     this.connection.Open();
     this.forkliftTaskBB = new BForkliftTaskBB(this.connection);
     this.errorDiaryBB = new SErrorDiaryBB(this.connection);
     this.operatDiaryBB = new SOperatDiaryBB(this.connection);
 }
        /// <summary>
        /// 保存非标准箱从质检区入库信息
        /// </summary>
        /// <param name="strPalletNo">托盘条码号</param>
        /// <param name="strNextWareNo">目的库区编码</param>
        /// <param name="strNextWareLocatorNo">目的库位编码</param>
        /// <returns></returns>
        public bool SaveNoStandBoxInStockInfo(string strPalletNo, string strNextWareNo, string strNextWareLocatorNo)
        {
            bool ret = false;
            SqlTransaction trans = null;
            SCommBB commBB = new SCommBB(this.connection);
            BTallyBillBB tallyBillBB = new BTallyBillBB(this.connection);
            BArrangeBillBoxBB arrangeBillBoxBB = new BArrangeBillBoxBB(this.connection);
            BForkliftTaskBB forkliftTaskBB = new BForkliftTaskBB(this.connection);

            try
            {
                if (this.transaction == null)
                {
                    trans = this.connection.BeginTransaction("TransSave");
                    this.tallyBillDetailBB.Transaction = trans;
                    commBB.Transaction = trans;
                    tallyBillBB.Transaction = trans;
                    arrangeBillBoxBB.Transaction = trans;
                    forkliftTaskBB.Transaction = trans;
                }
                else
                {
                    this.tallyBillDetailBB.Transaction = this.transaction;
                    commBB.Transaction = this.transaction;
                    tallyBillBB.Transaction = this.transaction;
                    arrangeBillBoxBB.Transaction = this.transaction;
                    forkliftTaskBB.Transaction = this.transaction;
                }

                int mainId = 0;
                StringBuilder strSql = new StringBuilder();
                DataTable dtArrangeBillBox = new DataTable();
                BTallyBillData tallyBillModel = new BTallyBillData();
                BTallyBillDetailData tallyBillDetailModel = new BTallyBillDetailData();
                BForkliftTaskData forkliftTaskModel = new BForkliftTaskData();

                //保存理货信息
                tallyBillModel = new BTallyBillData();

                tallyBillModel.palletNo = strPalletNo;//托盘条码号
                tallyBillModel.isInStock = false;//是否入库
                tallyBillModel.isrtDt = System.DateTime.Now.ToString();//添加时间
                tallyBillModel.isrtEmpId = this.empId;//添加人
                tallyBillModel.instantState = "02";//理货完成

                mainId = tallyBillBB.AddRecord(tallyBillModel);//称重理货单ID赋值

                dtArrangeBillBox = arrangeBillBoxBB.GetList("palletNo='" + strPalletNo + "' and isnull(wareNo,'')<>''").Tables[0];
                foreach (DataRow row in dtArrangeBillBox.Rows)
                {
                    //保存称重理货明细数据
                    tallyBillDetailModel = new BTallyBillDetailData();

                    tallyBillDetailModel.mainId = mainId.ToString();//称重理货单ID
                    tallyBillDetailModel.region = "0";//区域ID
                    tallyBillDetailModel.oldPalletNo = strPalletNo;//原托盘号
                    tallyBillDetailModel.boxNo = row["boxNo"].ToString();//箱号
                    tallyBillDetailModel.isrtDt = System.DateTime.Now.ToString();//添加时间
                    tallyBillDetailModel.isrtEmpId = this.empId;//添加人

                    tallyBillDetailBB.AddRecord(tallyBillDetailModel);
                }

                //生成叉车任务
                if (dtArrangeBillBox.Rows.Count > 0)
                {
                    forkliftTaskModel = new BForkliftTaskData();

                    forkliftTaskModel.taskType = "11";//任务类型为:从质检区到正式区
                    forkliftTaskModel.palletNo = strPalletNo;//托盘号
                    forkliftTaskModel.preWareNo = dtArrangeBillBox.Rows[0]["wareNo"].ToString();//源库区
                    forkliftTaskModel.preLocatorNo = dtArrangeBillBox.Rows[0]["wareLocatorNo"].ToString();//源库位
                    forkliftTaskModel.nextWareNo = strNextWareNo;//目的库区
                    forkliftTaskModel.nextLocatorNo = strNextWareLocatorNo;//目的库位
                    forkliftTaskModel.effectDt = System.DateTime.Now.ToString();//生效时间
                    forkliftTaskModel.isDeal = false;//是否处理

                    forkliftTaskBB.AddRecord(forkliftTaskModel);

                    //更新目的库区占用状态
                    if (strNextWareLocatorNo != "")
                    {
                        //更改库位的使用状态
                        commBB.ExecuteSql("update dbo.LWareLocator set isUsing=1 where wareLocatorNo='"
                            + strNextWareLocatorNo + "'");
                    }
                }

                if (this.transaction == null) trans.Commit();
                ret = true;
            }
            catch (Exception ex)
            {
                if (this.transaction == null) trans.Rollback("TransSave");
                throw ex;
            }
            finally
            {
                commBB.Dispose();
                tallyBillBB.Dispose();
                arrangeBillBoxBB.Dispose();
                forkliftTaskBB.Dispose();
            }

            return ret;
        }
        //*****************************************************************************
        //do it later      do it later      do it later
        //*****************************************************************************
        /// <summary>
        /// 保存排托收货单信息
        /// </summary>
        /// <param name="strArrangeBillNo">排托单号</param>
        /// <param name="strArriveBillNo">到货单号</param>
        /// <param name="strFinanceBillNos">采购订单编号组合</param>
        /// <param name="strPalletIndex">托盘序号</param>
        /// <param name="strPalletNo">托盘号</param>
        /// <param name="isrtEmpId">添加人</param>
        /// <param name="updtEmpId">修改人</param>
        /// <param name="strInstantState">状态:01 收货单,02 收货已完成</param>
        /// <returns></returns>
        public bool SaveRecord(string strArrangeBillNo, string strArriveBillNo,string strFinanceBillNos,
        string strPalletIndex, string strPalletNo, int isrtEmpId, int updtEmpId, string strInstantState)
        {
            bool ret = false;
            SqlTransaction trans = null;
            SCommBB commBB = new SCommBB(this.connection);
            BForkliftTaskBB forkliftTaskBB = new BForkliftTaskBB(this.connection);
            BArrangeBillBoxBB arrangeBillBoxBB = new BArrangeBillBoxBB(this.connection);

            try
            {
                if (this.transaction == null)
                {
                    trans = this.connection.BeginTransaction("TransSave");
                    this.arrangeBillFactBB.Transaction = trans;
                    commBB.Transaction = trans;
                    forkliftTaskBB.Transaction = trans;
                    arrangeBillBoxBB.Transaction = trans;
                }
                else
                {
                    this.arrangeBillFactBB.Transaction = this.transaction;
                    commBB.Transaction = this.transaction;
                    forkliftTaskBB.Transaction = this.transaction;
                    arrangeBillBoxBB.Transaction = this.transaction;
                }

                DataSet ds = new DataSet();
                BArrangeBillFactData arrangeBillFactModel = new BArrangeBillFactData();

                #region 维护排托收货单信息

                foreach (string strFinanceBillNo in strFinanceBillNos.Split(','))
                {
                    //维护排托收货单信息
                    ds = arrangeBillFactBB.GetList("arrangeBillNo='" + strArrangeBillNo
                        + "' and palletIndex='" + strPalletIndex + "' and financeBillNo='" + strFinanceBillNo + "'");//添加物料编号
                    if (ds.Tables[0].Rows.Count == 0)
                    {
                        arrangeBillFactModel = new BArrangeBillFactData();

                        arrangeBillFactModel.arrangeBillNo = strArrangeBillNo;//排托单号
                        arrangeBillFactModel.arriveBillNo = strArriveBillNo;//到货单号
                        arrangeBillFactModel.financeBillNo = strFinanceBillNo;//采购订单号
                        arrangeBillFactModel.palletIndex = strPalletIndex;//托盘序号
                        arrangeBillFactModel.palletNo = strPalletNo;//托盘条码号
                        arrangeBillFactModel.isTally = false;//是否已理货
                        arrangeBillFactModel.isrtEmpId = isrtEmpId;//添加人
                        arrangeBillFactModel.isrtDt = System.DateTime.Now.ToString();//添加时间
                        arrangeBillFactModel.instantState = strInstantState;//状态

                        arrangeBillFactBB.AddRecord(arrangeBillFactModel);
                    }
                    else
                    {
                        arrangeBillFactModel = arrangeBillFactBB.GetModel(Convert.ToInt32(ds.Tables[0].Rows[0]["id"]));

                        if (strPalletNo != "")//如果托盘号不为空,更改托盘号
                        {
                            arrangeBillFactModel.palletNo = strPalletNo;//托盘条码号
                        }
                        else
                        {
                            strPalletNo = ds.Tables[0].Rows[0]["palletNo"].ToString();//获取托盘条码
                        }

                        arrangeBillFactModel.updtDt = System.DateTime.Now.ToString();//修改时间
                        arrangeBillFactModel.updtEmpId = updtEmpId;//修改人
                        arrangeBillFactModel.instantState = strInstantState;//状态

                        arrangeBillFactBB.ModifyRecord(arrangeBillFactModel);
                    }
                }

                #endregion 维护排托收货单信息

                #region 更改状态

                //更改状态
                if (strInstantState == "01")//排托中
                {
                    //更改排托单明细状态为“02 排托中”
                    commBB.ExecuteSql("update dbo.BArrangeBillDetail set instantState='02' where arriveBillNo='"
                        + strArriveBillNo + "' and palletIndex='" + strPalletIndex + "'");

                    //更改排托单状态为“03 排托中”
                    commBB.ExecuteSql("update dbo.BArrangeBill set instantState='03' where arriveBillNo='"
                        + strArriveBillNo + "'");

                    //更改到货单状态为“04 排托中”
                    commBB.ExecuteSql("update dbo.BArriveBill set instantState='04' where billNo='"
                        + strArriveBillNo + "'");
                }
                else if (strInstantState == "02")//排托已完成
                {
                    #region 更改单据状态

                    //更改排托单明细状态为“03 排托已完成”
                    commBB.ExecuteSql("update dbo.BArrangeBillDetail set instantState='03' where arriveBillNo='"
                        + strArriveBillNo + "' and palletIndex='" + strPalletIndex + "'");

                    //如果排托单明细全部排托已完成,更改排托单状态为“排托已完成”
                    commBB.ExecuteSql("update dbo.BArrangeBill set instantState='04' where arriveBillNo='" + strArriveBillNo
                        + "' and not exists (select 1 from dbo.BArrangeBillDetail where dbo.BArrangeBill.arriveBillNo=dbo.BArrangeBillDetail.arriveBillNo and isnull(dbo.BArrangeBillDetail.instantState,'')<>'03')");

                    //如果排托单明细全部排托已完成,更改到货单状态为“排托已完成”
                    commBB.ExecuteSql(@"update dbo.BArriveBill set instantState='05' where billNo='" + strArriveBillNo
                        + "' and not exists (select 1 from dbo.BArrangeBillDetail where dbo.BArriveBill.billNo=dbo.BArrangeBillDetail.arriveBillNo and isnull(dbo.BArrangeBillDetail.instantState,'')<>'03')");

                    #endregion 更改单据状态

                    #region 生成叉车任务

                    //首先判断当前托盘存在未执行的叉车任务
                    DataTable dtForkliftTask = new DataTable();

                    dtForkliftTask = forkliftTaskBB.GetList("palletNo='" + strPalletNo + "' and isDeal=0").Tables[0];
                    if (dtForkliftTask.Rows.Count == 0)
                    {
                        BForkliftTaskData forkliftTaskModel = new BForkliftTaskData();
                        DataSet dsArrangeBillBox = new DataSet();

                        dsArrangeBillBox = arrangeBillBoxBB.GetVList("arriveBillNo='" + strArriveBillNo
                            + "' and palletNo='" + strPalletNo + "' and isnull(wareNo,'')<>''");

                        if (dsArrangeBillBox.Tables[0].Rows.Count > 0)
                        {
                            forkliftTaskModel = new BForkliftTaskData();

                            forkliftTaskModel.taskType = "01";//任务类型为:从排托区到质检区
                            forkliftTaskModel.palletNo = strPalletNo;//托盘号
                            forkliftTaskModel.preWareNo = dsArrangeBillBox.Tables[0].Rows[0]["wareNo"].ToString();//源库区
                            forkliftTaskModel.preLocatorNo = dsArrangeBillBox.Tables[0].Rows[0]["wareLocatorNo"].ToString();//源库位
                            forkliftTaskModel.effectDt = System.DateTime.Now.ToString();//生效时间
                            forkliftTaskModel.isDeal = false;//是否处理
                            forkliftTaskModel.isrtDt = System.DateTime.Now.ToString();//添加时间
                            forkliftTaskModel.isrtEmpId = isrtEmpId;//添加人

                            forkliftTaskBB.AddRecord(forkliftTaskModel);
                        }
                    }

                    #endregion 生成叉车任务
                }

                #endregion 更改状态

                if (this.transaction == null) trans.Commit();
                ret = true;
            }
            catch (Exception ex)
            {
                if (this.transaction == null) trans.Rollback("TransSave");
                throw ex;
            }
            finally
            {
                commBB.Dispose();
                forkliftTaskBB.Dispose();
                arrangeBillBoxBB.Dispose();
            }

            return ret;
        }
        /// <summary>
        /// 保存非标准箱入质检区信息
        /// </summary>
        /// <param name="strPalletNo">托盘号</param>
        /// <returns></returns>
        public bool SaveNoStandBoxInCheckInfo(string strPalletNo)
        {
            bool ret = false;
            SqlTransaction trans = null;
            SCommBB commBB = new SCommBB(this.connection);
            BForkliftTaskBB forkliftTaskBB = new BForkliftTaskBB(this.connection);
            BArrangeBillBoxBB arrangeBillBoxBB = new BArrangeBillBoxBB(this.connection);
            BArrangeBillFactDetailBB arrangeBillFactDetailBB = new BArrangeBillFactDetailBB(this.connection);

            try
            {
                if (this.transaction == null)
                {
                    trans = this.connection.BeginTransaction("TransSave");
                    this.arrangeBillFactBB.Transaction = trans;
                    commBB.Transaction = trans;
                    forkliftTaskBB.Transaction = trans;
                    arrangeBillBoxBB.Transaction = trans;
                    arrangeBillFactDetailBB.Transaction = trans;
                }
                else
                {
                    this.arrangeBillFactBB.Transaction = this.transaction;
                    commBB.Transaction = this.transaction;
                    forkliftTaskBB.Transaction = this.transaction;
                    arrangeBillBoxBB.Transaction = this.transaction;
                    arrangeBillFactDetailBB.Transaction = this.transaction;
                }

                DataTable dtArrangeBillBox = new DataTable();
                string strArriveBillNo = "", strFinanceBillNo = "";
                BArrangeBillFactData arrangeBillFactModel = new BArrangeBillFactData();
                BArrangeBillFactDetailData arrangeBillFactDetailModel = new BArrangeBillFactDetailData();
                BArrangeBillBoxData arrangeBillBoxModel = new BArrangeBillBoxData();
                int mainId = 0;

                //获取到货箱信息
                dtArrangeBillBox = arrangeBillBoxBB.GetList("palletNo='" + strPalletNo + "' and isnull(wareNo,'')<>''").Tables[0];
                if (dtArrangeBillBox.Rows.Count > 0)
                {
                    strArriveBillNo = dtArrangeBillBox.Rows[0]["arriveBillNo"].ToString();//到货单号
                    strFinanceBillNo = dtArrangeBillBox.Rows[0]["financeBillNo"].ToString();//采购单号
                }

                #region 维护排托收货单信息

                //维护排托收货单信息
                arrangeBillFactModel.arrangeBillNo = "PT" + strArriveBillNo;//排托单号
                arrangeBillFactModel.arriveBillNo = strArriveBillNo;//到货单号
                arrangeBillFactModel.financeBillNo = strFinanceBillNo;//采购订单号
                arrangeBillFactModel.palletIndex = "0";//托盘序号
                arrangeBillFactModel.palletNo = strPalletNo;//托盘条码号
                arrangeBillFactModel.isTally = false;//是否已理货
                arrangeBillFactModel.isrtEmpId = this.empId;//添加人
                arrangeBillFactModel.isrtDt = System.DateTime.Now.ToString();//添加时间
                arrangeBillFactModel.instantState = "02";//状态

                mainId = arrangeBillFactBB.AddRecord(arrangeBillFactModel);

                #endregion 维护排托收货单信息

                #region 维护排托箱信息

                foreach (DataRow row in dtArrangeBillBox.Rows)
                {
                    //保存排托收货单明细信息
                    arrangeBillFactDetailModel = new BArrangeBillFactDetailData();

                    arrangeBillFactDetailModel.mainId = mainId.ToString();//排托收货单ID
                    arrangeBillFactDetailModel.boxNo = row["boxNo"].ToString();//箱号
                    arrangeBillFactDetailModel.region = "0";//区域
                    arrangeBillFactDetailModel.isrtEmpId = this.empId;
                    arrangeBillFactDetailModel.isrtDt = System.DateTime.Now.ToString();

                    arrangeBillFactDetailBB.AddRecord(arrangeBillFactDetailModel);

                    //更改到货箱排托标志
                    commBB.ExecuteSql("update dbo.BArrangeBillBox set isBoxArrange=1 where boxNo='" + row["boxNo"].ToString() + "'");
                }

                #endregion 维护排托箱信息

                #region 生成叉车任务

                BForkliftTaskData forkliftTaskModel = new BForkliftTaskData();

                if (dtArrangeBillBox.Rows.Count > 0)
                {
                    forkliftTaskModel = new BForkliftTaskData();

                    forkliftTaskModel.taskType = "10";//任务类型为:从收货区到质检区
                    forkliftTaskModel.palletNo = strPalletNo;//托盘号
                    forkliftTaskModel.preWareNo = dtArrangeBillBox.Rows[0]["wareNo"].ToString();//源库区
                    forkliftTaskModel.preLocatorNo = dtArrangeBillBox.Rows[0]["wareLocatorNo"].ToString();//源库位
                    forkliftTaskModel.effectDt = System.DateTime.Now.ToString();//生效时间
                    forkliftTaskModel.isDeal = false;//是否处理

                    forkliftTaskBB.AddRecord(forkliftTaskModel);
                }

                #endregion 生成叉车任务

                if (this.transaction == null) trans.Commit();
                ret = true;
            }
            catch (Exception ex)
            {
                if (this.transaction == null) trans.Rollback("TransSave");
                throw ex;
            }
            finally
            {
                commBB.Dispose();
                forkliftTaskBB.Dispose();
                arrangeBillBoxBB.Dispose();
                arrangeBillFactDetailBB.Dispose();
            }

            return ret;
        }