public static string AddSubDeliveryBack(SubDeliveryBack model, List<SubDeliveryBackDetail> modelList, Hashtable htExtAttr)
        {
            //定义返回变量
            string res = string.Empty;
            /* 
             * 定义日志内容变量 
             * 增删改相关的日志,需要输出操作日志,该类型日志插入到数据库
             * 其他的 如出现异常时,需要输出系统日志,该类型日志保存到日志文件
             */
            //获取当前用户信息
            UserInfoUtil userInfo = (UserInfoUtil)SessionUtil.Session["UserInfo"];

            //执行操作
            try
            {
                //执行操作
                res = XBase.Data.Office.LogisticsDistributionManager.SubDeliveryBackDBHelper.AddSubDeliveryBack(model, modelList, htExtAttr);
            }
            catch (Exception ex)
            {
                //输出日志
                WriteSystemLog(userInfo, ex);
            }
            //定义变量
            string remark;
            //成功时
            if (res != string.Empty)
            {
                //设置操作成功标识
                remark = ConstUtil.LOG_PROCESS_SUCCESS;
            }
            else
            {
                //设置操作成功标识 
                remark = ConstUtil.LOG_PROCESS_FAILED;
            }
            //操作日志
            LogInfoModel logModel = InitLogInfo(model.BackNo);
            //涉及关键元素 这个需要根据每个页面具体设置,本页面暂时设置为空
            logModel.Element = ConstUtil.LOG_PROCESS_INSERT; ;

            //设置操作成功标识
            logModel.Remark = remark;

            //登陆日志
            LogDBHelper.InsertLog(logModel);

            return res;
        }
        /// <summary>
        /// 扩展属性保存操作
        /// </summary>
        /// <returns></returns>
        private static void GetExtAttrCmd(SubDeliveryBack model, Hashtable htExtAttr, SqlCommand cmd)
        {
            try
            {
                string strSql = string.Empty;

                strSql = "UPDATE officedba.SubDeliveryBack set ";
                foreach (DictionaryEntry de in htExtAttr)// fileht为一个Hashtable实例
                {
                    strSql += de.Key.ToString().Trim() + "=@" + de.Key.ToString().Trim() + ",";
                    cmd.Parameters.AddWithValue("@" + de.Key.ToString().Trim(), de.Value.ToString().Trim());
                }
                int iLength = strSql.Length - 1;
                strSql = strSql.Substring(0, iLength);
                strSql += " where CompanyCD = @CompanyCD  AND BackNo = @BackNo";
                cmd.Parameters.AddWithValue("@CompanyCD", model.CompanyCD);
                cmd.Parameters.AddWithValue("@BackNo", model.BackNo);
                cmd.CommandText = strSql;
            }
            catch (Exception)
            { }


        }
        public static bool SubDeliveryBackIn(SubDeliveryBack model, List<SubDeliveryBackDetail> modelList)
        {
            ArrayList SqlList = new ArrayList();

            #region 更新配送单信息
            StringBuilder sbMainSql = new StringBuilder();
            sbMainSql.Append("UPDATE officedba.SubDeliveryBack SET InUserID=@InUserID , InDate=@InDate ,BusiStatus=@BusiStatus ");
            sbMainSql.Append(" where ID=@ID");
            SqlParameter[] MainParas = { 
                                           new SqlParameter("@InUserID",SqlDbType.Int),
                                           new SqlParameter("@InDate",SqlDbType.DateTime),
                                           new SqlParameter("@BusiStatus",SqlDbType.VarChar),
                                           new SqlParameter("@ID",SqlDbType.Int)};
            MainParas[0].Value = model.InUserID;
            MainParas[1].Value = model.InDate;
            MainParas[2].Value = model.BusiStatus;
            MainParas[3].Value = model.ID;
            SqlCommand SqlMainCmd = new SqlCommand() { CommandText = sbMainSql.ToString() };
            SqlMainCmd.Parameters.AddRange(MainParas);
            SqlList.Add(SqlMainCmd);
            #endregion

            StringBuilder sbSubDelSql = new StringBuilder();
            sbSubDelSql.Append("DELETE officedba.SubDeliveryBackDetail WHERE   ");
            sbSubDelSql.Append(" BackNo=@BackNo AND CompanyCD=@CompanyCD ");
            SqlParameter[] delParas = { 
                                          new SqlParameter("@BackNo",SqlDbType.VarChar),
                                          new SqlParameter("@CompanyCD",SqlDbType.VarChar)};
            delParas[0].Value = model.BackNo;
            delParas[1].Value = model.CompanyCD;
            SqlCommand sqlDelCmd = new SqlCommand() { CommandText = sbSubDelSql.ToString() };
            sqlDelCmd.Parameters.AddRange(delParas);
            SqlList.Add(sqlDelCmd);


            /*如果单据有源单 则回写源单退货数量*/
            if (model.SendID > 0)
            {
                StringBuilder sbSetSendSql = new StringBuilder();
                sbSetSendSql.Append("UPDATE officedba.SubDeliverySend SET BackCount=(isnull(BackCount,0)+@BackCount)  ");
                sbSetSendSql.Append(" where ID=@ID");
                SqlParameter[] setSendParas = { 
                                                  new SqlParameter("@BackCount",SqlDbType.Decimal),
                                                  new SqlParameter("@ID",SqlDbType.Int)};
                setSendParas[0].Value = model.BackCount;
                setSendParas[1].Value = model.SendID;

                SqlCommand sqlSetSendCmd = new SqlCommand() { CommandText = sbSetSendSql.ToString() };
                sqlSetSendCmd.Parameters.AddRange(setSendParas);
                SqlList.Add(sqlSetSendCmd);
            }

            foreach (SubDeliveryBackDetail m in modelList)
            {
                SqlList.Add(GetSaveDetail(m));

                #region 添加门店库存流水帐
                XBase.Model.Office.StorageManager.StorageAccountModel sModel = new XBase.Model.Office.StorageManager.StorageAccountModel();
                sModel.BatchNo = m.BackBatchNo;
                sModel.BillNo = m.BackNo;
                sModel.BillType = 20;
                sModel.CompanyCD = m.CompanyCD;
                sModel.StorageID = m.StorageID.Value;
                sModel.ProductID = m.ProductID.Value;
                sModel.Creator = model.Creator.Value;
                sModel.HappenDate = DateTime.Now;
                sModel.Price = m.BackPrice.Value;
                sModel.HappenCount = m.BackCount.Value;
                sModel.PageUrl = model.Remark;
                SqlList.Add(XBase.Data.Office.StorageManager.StorageAccountDBHelper.InsertStorageAccountCommand(sModel, "0"));
                #endregion

                #region 入库操作
                SqlList.Add(XBase.Data.Office.StorageManager.StorageSearchDBHelper.UpdateProductCount(m.CompanyCD, m.ProductID.ToString(), m.StorageID.ToString(), m.BackBatchNo, m.BackCount.Value));
                #endregion

            }
            return SqlHelper.ExecuteTransWithArrayList(SqlList);
        }
        public static bool SubDeliveryBackOut(SubDeliveryBack model)
        {
            StringBuilder sbSql = new StringBuilder();
            sbSql.Append("SELECT * FROM officedba.SubDeliveryBackDetail  ");
            sbSql.Append(" WHERE CompanyCD=@CompanyCD and BackNo=@BackNo");

            SqlParameter[] paras = { 
                                   new SqlParameter("@CompanyCD",SqlDbType.VarChar),
                                   new SqlParameter("@BackNo",SqlDbType.VarChar)};
            paras[0].Value = model.CompanyCD;
            paras[1].Value = model.BackNo;

            DataTable dtBack = SqlHelper.ExecuteSql(sbSql.ToString(), paras);
            ArrayList SqlList = new ArrayList();

            if (dtBack != null && dtBack.Rows.Count > 0)
            {

                #region 更新单据
                StringBuilder sbMainSql = new StringBuilder();
                sbMainSql.Append("UPDATE  officedba.SubDeliveryBack SET OutUserID=@OutUserID,OutDate=@OutDate,BusiStatus=@BusiStatus ");
                sbMainSql.Append(" WHERE ID=@ID ");
                SqlParameter[] MainParas = { 
                                           new SqlParameter("@OutUserID",SqlDbType.Int),
                                           new SqlParameter("@OutDate",SqlDbType.DateTime),
                                           new SqlParameter("@BusiStatus",SqlDbType.VarChar),
                                           new SqlParameter("@ID",SqlDbType.Int)
                                       };
                MainParas[0].Value = model.OutUserID;
                MainParas[1].Value = model.OutDate;
                MainParas[2].Value = model.BusiStatus;
                MainParas[3].Value = model.ID;

                SqlCommand sqlMainCmd = new SqlCommand() { CommandText = sbMainSql.ToString() };
                sqlMainCmd.Parameters.AddRange(MainParas);
                SqlList.Add(sqlMainCmd);
                #endregion

                int id = 0;
                decimal count = 0m;
                foreach (DataRow row in dtBack.Rows)
                {
                    #region 添加门店库存流水帐
                    SubStorageAccountModel aModel = new SubStorageAccountModel();
                    aModel.BatchNo = row["SendBatchNo"].ToString();
                    aModel.BillNo = model.BackNo;
                    aModel.BillType = 7;
                    aModel.CompanyCD = model.CompanyCD;
                    aModel.Creator = model.Creator;
                    aModel.DeptID = model.ApplyDeptID;
                    aModel.HappenDate = DateTime.Now;
                    if (int.TryParse(row["ProductID"].ToString(), out id))
                    {
                        aModel.ProductID = id;
                    }
                    if (decimal.TryParse(row["BackPrice"].ToString(), out count))
                    {
                        aModel.Price = count;
                    }
                    if (decimal.TryParse(row["BackCount"].ToString(), out count))
                    {
                        aModel.HappenCount = -count;
                    }
                    aModel.PageUrl = model.Remark;
                    SqlList.Add(XBase.Data.Office.SubStoreManager.SubStorageAccountDBHelper.GetCountAndInsertCommand(aModel));
                    #endregion
                    // 更新库存
                    SqlList.Add(XBase.Data.Office.LogisticsDistributionManager.StorageProductQueryDBHelper.UpdateProductCount(model.CompanyCD
                                , row["ProductID"].ToString(), model.ApplyDeptID.ToString(), row["SendBatchNo"].ToString(), -count));

                }

                bool res = SqlHelper.ExecuteTransWithArrayList(SqlList);
                return res;

            }
            else
                return false;

        }
        /*打印使用*/
        public static DataTable GetSubDeliveryBackInfoPrint(SubDeliveryBack model)
        {
            StringBuilder sbSql = new StringBuilder();
            sbSql.AppendLine("  SELECT     ID, CompanyCD, BackNo, SendID, Title, ApplyUserID, ApplyDeptID, OutDeptID,BackReason, BusiStatus, ");
            sbSql.AppendLine("   OutUserID, convert(varchar(10),OutDate,120)OutDate, InUserID, convert(varchar(10),InDate,120)InDate, Remark, Creator, convert(varchar(10),CreateDate,120)CreateDate, BillStatus, Confirmor, convert(varchar(10),ConfirmDate,120)ConfirmDate, Closer, convert(varchar(10),CloseDate,120)CloseDate, convert(varchar(10),ModifiedDate,120)ModifiedDate, ExtField1,");
            sbSql.AppendLine("ExtField2,ExtField3,ExtField4,ExtField5,ExtField6,ExtField7,ExtField8,ExtField9,ExtField10");
            sbSql.AppendLine("  ,CONVERT(NUMERIC(12,2),ISNULL(BackPrice,0)) BackPrice");
            sbSql.AppendLine("  ,CONVERT(NUMERIC(12,2),ISNULL(BackFeeSum,0)) BackFeeSum");
            sbSql.AppendLine("  ,CONVERT(NUMERIC(12,2),ISNULL(BackCount,0)) BackCount");
            sbSql.AppendLine("  ,ModifiedUserID,  ");
            sbSql.AppendLine("  (CASE sds.BusiStatus WHEN '1' THEN '退货申请' WHEN '2' THEN '退货出库' WHEN '3' THEN '验收入库' WHEN '4' THEN '退货完成' END) ");
            sbSql.AppendLine("  AS BusiStatusText, (CASE sds.BillStatus WHEN '1' THEN '制单' WHEN '2' THEN '执行' WHEN '4' THEN '手工结单' WHEN '5' THEN '自动结单' END)   ");
            sbSql.AppendLine("   AS BillStatusText,  ");
            sbSql.AppendLine("   (SELECT     SendNo  ");
            sbSql.AppendLine("  FROM          officedba.SubDeliverySend AS s  ");
            sbSql.AppendLine("  WHERE      (ID = sds.SendID)) AS SendNo,  ");
            sbSql.AppendLine("   (SELECT     EmployeeName  ");
            sbSql.AppendLine("  FROM          officedba.EmployeeInfo AS ei1  ");
            sbSql.AppendLine("   WHERE      (ID = sds.ApplyUserID)) AS ApplyUserIDName,  ");
            sbSql.AppendLine("  (SELECT     DeptName  ");
            sbSql.AppendLine("  FROM          officedba.DeptInfo AS di2  ");
            sbSql.AppendLine("  WHERE      (ID = sds.ApplyDeptID)) AS ApplyDeptIDName,  ");
            sbSql.AppendLine("  (SELECT     EmployeeName  ");
            sbSql.AppendLine("  FROM          officedba.EmployeeInfo AS ei2  ");
            sbSql.AppendLine("  WHERE      (ID = sds.OutUserID)) AS OutUserIDName,  ");
            sbSql.AppendLine("  (SELECT     EmployeeName  ");
            sbSql.AppendLine("  FROM          officedba.EmployeeInfo AS ei3  ");
            sbSql.AppendLine("   WHERE      (ID = sds.InUserID)) AS InUserIDName,  ");
            sbSql.AppendLine("  (SELECT     EmployeeName  ");
            sbSql.AppendLine("  FROM          officedba.EmployeeInfo AS ei4  ");
            sbSql.AppendLine("  WHERE      (ID = sds.Creator)) AS CreatorName,  ");
            sbSql.AppendLine("  (SELECT     EmployeeName  ");
            sbSql.AppendLine("  FROM          officedba.EmployeeInfo AS ei5  ");
            sbSql.AppendLine("  WHERE      (ID = sds.Confirmor)) AS ConfirmorName,  ");
            sbSql.AppendLine("  (SELECT     EmployeeName  ");
            sbSql.AppendLine("   FROM          officedba.EmployeeInfo AS ei6  ");
            sbSql.AppendLine("   WHERE      (ID = sds.Closer)) AS CloserName  ");
            sbSql.AppendLine("  FROM         officedba.SubDeliveryBack AS sds  ");
            sbSql.AppendLine("  where sds.CompanyCD=@CompanyCD AND sds.ID=@ID ");
            SqlParameter[] Paras = { 
                                   new SqlParameter("@CompanyCD",SqlDbType.VarChar),
                                   new SqlParameter("@ID",SqlDbType.Int)};
            Paras[0].Value = model.CompanyCD;
            Paras[1].Value = model.ID;

            return SqlHelper.ExecuteSql(sbSql.ToString(), Paras);
        }
        public static DataTable GetSubDeliveryBackInfo(SubDeliveryBack model)
        {
            StringBuilder sbSql = new StringBuilder();
            sbSql.Append("SELECT sds.* ,");
            sbSql.Append("(SELECT s.SendNo from officedba.SubDeliverySend  as s where s.ID=sds.SendID) AS SendNo ,");
            sbSql.Append(" (select ei1.EmployeeName from officedba.EmployeeInfo  as ei1  where ei1.ID=sds.ApplyUserID) as ApplyUserIDName,");
            sbSql.Append("(select di2.DeptName from officedba.DeptInfo as di2 where di2.ID=sds.ApplyDeptID) as ApplyDeptIDName,");
            sbSql.Append("(select ei2.EmployeeName from officedba.EmployeeInfo  as ei2 where ei2.ID=sds.OutUserID) as OutUserIDName,");
            sbSql.Append("(select ei3.EmployeeName from officedba.EmployeeInfo  as ei3 where ei3.ID=sds.InUserID) as InUserIDName,");
            sbSql.Append("(select ei4.EmployeeName from officedba.EmployeeInfo  as ei4 where ei4.ID=sds.Creator) as CreatorName,");
            sbSql.Append("(select ei5.EmployeeName from officedba.EmployeeInfo  as ei5 where ei5.ID=sds.Confirmor) as ConfirmorName,");
            sbSql.Append("(select ei6.EmployeeName from officedba.EmployeeInfo  as ei6 where ei6.ID=sds.Closer) as CloserName ");
            sbSql.Append(" from officedba.SubDeliveryBack as sds where sds.CompanyCD=@CompanyCD AND sds.ID=@ID");

            SqlParameter[] Paras = { 
                                   new SqlParameter("@CompanyCD",SqlDbType.VarChar),
                                   new SqlParameter("@ID",SqlDbType.Int)};
            Paras[0].Value = model.CompanyCD;
            Paras[1].Value = model.ID;

            return SqlHelper.ExecuteSql(sbSql.ToString(), Paras);
        }
        public static bool UpdateSubDeliverySend(SubDeliveryBack model, List<SubDeliveryBackDetail> modelList, Hashtable htExtAttr)
        {

            ArrayList SqlList = new ArrayList();
            #region 配送单
            StringBuilder strSql = new StringBuilder();
            strSql.Append("update officedba.SubDeliveryBack set ");
            strSql.Append("SendID=@SendID,");
            strSql.Append("Title=@Title,");
            strSql.Append("ApplyUserID=@ApplyUserID,");
            strSql.Append("ApplyDeptID=@ApplyDeptID,");
            strSql.Append("BackPrice=@BackPrice,");
            strSql.Append("BackFeeSum=@BackFeeSum,");
            strSql.Append("BackCount=@BackCount,");
            strSql.Append("BackReason=@BackReason,");
            strSql.Append("Remark=@Remark,");
            strSql.Append("ModifiedDate=@ModifiedDate,");
            strSql.Append("ModifiedUserID=@ModifiedUserID");
            strSql.Append(" where ID=@ID ");
            SqlParameter[] parameters = {
					new SqlParameter("@ID", SqlDbType.Int,4),
					new SqlParameter("@SendID", SqlDbType.Int,4),
					new SqlParameter("@Title", SqlDbType.VarChar,100),
					new SqlParameter("@ApplyUserID", SqlDbType.Int,4),
					new SqlParameter("@ApplyDeptID", SqlDbType.Int,4),
					new SqlParameter("@BackPrice", SqlDbType.Decimal,9),
					new SqlParameter("@BackFeeSum", SqlDbType.Decimal,9),
					new SqlParameter("@BackCount", SqlDbType.Decimal,9),
					new SqlParameter("@BackReason", SqlDbType.VarChar,1024),
					new SqlParameter("@Remark", SqlDbType.VarChar,800),
					new SqlParameter("@ModifiedDate", SqlDbType.DateTime),
					new SqlParameter("@ModifiedUserID", SqlDbType.VarChar,50)};
            parameters[0].Value = model.ID;
            parameters[1].Value = model.SendID;
            parameters[2].Value = model.Title;
            parameters[3].Value = model.ApplyUserID;
            parameters[4].Value = model.ApplyDeptID;
            parameters[5].Value = model.BackPrice;
            parameters[6].Value = model.BackFeeSum;
            parameters[7].Value = model.BackCount;
            parameters[8].Value = model.BackReason;
            parameters[9].Value = model.Remark;
            parameters[10].Value = model.ModifiedDate;
            parameters[11].Value = model.ModifiedUserID;

            SqlCommand SqlCmd = new SqlCommand { CommandText = strSql.ToString() };
            SqlCmd.Parameters.AddRange(parameters);
            SqlList.Add(SqlCmd);

            #endregion

            #region 拓展属性
            SqlCommand cmd = new SqlCommand();
            GetExtAttrCmd(model, htExtAttr, cmd);
            if (htExtAttr.Count > 0)
                SqlList.Add(cmd);
            #endregion


            #region 配送明细单
            StringBuilder sbDel = new StringBuilder();
            sbDel.Append("DELETE officedba.SubDeliveryBackDetail WHERE CompanyCD=@CompanyCD AND BackNo=@BackNo");
            SqlParameter[] delParas = { 
                                          new SqlParameter("@CompanyCD",SqlDbType.VarChar),
                                          new SqlParameter("@BackNo",SqlDbType.VarChar)
                                      };
            delParas[0].Value = model.CompanyCD;
            delParas[1].Value = model.BackNo;
            SqlCommand sqlDelCmd = new SqlCommand { CommandText = sbDel.ToString() };
            sqlDelCmd.Parameters.AddRange(delParas);
            SqlList.Add(sqlDelCmd);

            foreach (SubDeliveryBackDetail m in modelList)
            {
                SqlList.Add(GetSaveDetail(m));
            }
            #endregion

            bool result = SqlHelper.ExecuteTransWithArrayList(SqlList);
            return result;

        }
        public static bool UpdateStatus(SubDeliveryBack model, int stype)
        {
            if (stype == 1)
            {
                #region 确认单据
                StringBuilder strSql = new StringBuilder();
                strSql.Append("update officedba.SubDeliveryBack set ");
                strSql.Append("BusiStatus=@BusiStatus,");
                strSql.Append("BillStatus=@BillStatus,");
                strSql.Append("Confirmor=@Confirmor,");
                strSql.Append("ConfirmDate=@ConfirmDate,");
                strSql.Append("ModifiedDate=@ModifiedDate,");
                strSql.Append("ModifiedUserID=@ModifiedUserID");
                strSql.Append(" where ID=@ID ");
                SqlParameter[] parameters = {
					new SqlParameter("@ID", SqlDbType.Int,4),
					new SqlParameter("@BusiStatus", SqlDbType.Char,1),
					new SqlParameter("@BillStatus", SqlDbType.Char,1),
					new SqlParameter("@Confirmor", SqlDbType.Int,4),
					new SqlParameter("@ConfirmDate", SqlDbType.DateTime),
					new SqlParameter("@ModifiedDate", SqlDbType.DateTime),
					new SqlParameter("@ModifiedUserID", SqlDbType.VarChar,50)};
                parameters[0].Value = model.ID;
                parameters[1].Value = model.BusiStatus;
                parameters[2].Value = model.BillStatus;
                parameters[3].Value = model.Confirmor;
                parameters[4].Value = model.ConfirmDate;
                parameters[5].Value = model.ModifiedDate;
                parameters[6].Value = model.ModifiedUserID;

                if (SqlHelper.ExecuteTransSql(strSql.ToString(), parameters) > 0)
                    return true;
                else
                    return false;
                #endregion
            }
            else if (stype == 3 || stype == 4)
            {
                #region 取消结单
                StringBuilder strSql = new StringBuilder();
                strSql.Append("update officedba.SubDeliveryBack set ");
                strSql.Append("BillStatus=@BillStatus,");
                strSql.Append("ModifiedDate=@ModifiedDate,");
                strSql.Append("ModifiedUserID=@ModifiedUserID,");
                strSql.Append("BusiStatus=@BusiStatus ");
                strSql.Append(" where ID=@ID ");
                SqlParameter[] parameters = {
					new SqlParameter("@ID", SqlDbType.Int,4),
					new SqlParameter("@BillStatus", SqlDbType.Char,1),
					new SqlParameter("@ModifiedDate", SqlDbType.DateTime),
					new SqlParameter("@ModifiedUserID", SqlDbType.VarChar,50),
                    new SqlParameter("BusiStatus",SqlDbType.VarChar)};
                parameters[0].Value = model.ID;
                parameters[1].Value = model.BillStatus;
                parameters[2].Value = model.ModifiedDate;
                parameters[3].Value = model.ModifiedUserID;
                parameters[4].Value = model.BusiStatus;
                SqlCommand SqlMainCmd = new SqlCommand() { CommandText = strSql.ToString() };
                SqlMainCmd.Parameters.AddRange(parameters);

                List<SqlCommand> SqlCmdList = new List<SqlCommand>();
                SqlCmdList.Add(SqlMainCmd);


                /*追加取消确认的SqlCommond*/
                if (stype == 4)
                {
                    IList<SqlCommand> tempList = Data.Common.FlowDBHelper.GetCancelConfirmSqlCommond(model.CompanyCD, Convert.ToInt32(ConstUtil.TYPEFLAG_LogisticsDistribution_NO), Convert.ToInt32(ConstUtil.TYPECODE_SubDeliveryBack_NO), model.ID, model.ModifiedUserID);
                    foreach (SqlCommand scmd in tempList)
                    {
                        SqlCmdList.Add(scmd);
                    }
                }



                if (SqlHelper.ExecuteTransWithCollections(SqlCmdList))
                    return true;
                else
                    return false;
                #endregion
            }
            else if (stype == 2)
            {
                #region 结单
                StringBuilder strSql = new StringBuilder();
                strSql.Append("update officedba.SubDeliveryBack set ");
                strSql.Append("BillStatus=@BillStatus,");
                strSql.Append("Closer=@Closer,");
                strSql.Append("CloseDate=@CloseDate,");
                strSql.Append("ModifiedDate=@ModifiedDate,");
                strSql.Append("ModifiedUserID=@ModifiedUserID");
                strSql.Append(" where ID=@ID ");
                SqlParameter[] parameters = {
					new SqlParameter("@ID", SqlDbType.Int,4),
					new SqlParameter("@BillStatus", SqlDbType.Char,1),
					new SqlParameter("@Closer", SqlDbType.Int,4),
					new SqlParameter("@CloseDate", SqlDbType.DateTime),
					new SqlParameter("@ModifiedDate", SqlDbType.DateTime),
					new SqlParameter("@ModifiedUserID", SqlDbType.VarChar,50)};
                parameters[0].Value = model.ID;
                parameters[1].Value = model.BillStatus;
                parameters[2].Value = model.Closer;
                parameters[3].Value = model.CloseDate;
                parameters[4].Value = model.ModifiedDate;
                parameters[5].Value = model.ModifiedUserID;
                if (SqlHelper.ExecuteTransSql(strSql.ToString(), parameters) > 0)
                    return true;
                else
                    return false;
                #endregion

            }
            else
            {
                return false;
            }
        }
        public static string AddSubDeliveryBack(SubDeliveryBack model, List<SubDeliveryBackDetail> modelList, Hashtable htExtAttr)
        {
            ArrayList SqlList = new ArrayList();

            #region 构造退货单主表
            StringBuilder strSql = new StringBuilder();
            strSql.Append("insert into officedba.SubDeliveryBack(");
            strSql.Append("CompanyCD,BackNo,SendID,Title,ApplyUserID,ApplyDeptID,OutDeptID,BackPrice,BackFeeSum,BackCount,BackReason,BusiStatus,Remark,Creator,CreateDate,BillStatus,ModifiedDate,ModifiedUserID)");
            strSql.Append(" values (");
            strSql.Append("@CompanyCD,@BackNo,@SendID,@Title,@ApplyUserID,@ApplyDeptID,@OutDeptID,@BackPrice,@BackFeeSum,@BackCount,@BackReason,@BusiStatus,@Remark,@Creator,@CreateDate,@BillStatus,@ModifiedDate,@ModifiedUserID)");
            strSql.Append(";select @ID=@@IDENTITY");
            SqlParameter[] parameters = {
					new SqlParameter("@CompanyCD", SqlDbType.VarChar,8),
					new SqlParameter("@BackNo", SqlDbType.VarChar,50), 
					new SqlParameter("@SendID", SqlDbType.Int,4),
					new SqlParameter("@Title", SqlDbType.VarChar,100),
					new SqlParameter("@ApplyUserID", SqlDbType.Int,4),
					new SqlParameter("@ApplyDeptID", SqlDbType.Int,4),
					new SqlParameter("@OutDeptID", SqlDbType.Int,4),
					new SqlParameter("@BackPrice", SqlDbType.Decimal,9),
					new SqlParameter("@BackFeeSum", SqlDbType.Decimal,9),
					new SqlParameter("@BackCount", SqlDbType.Decimal,9),
					new SqlParameter("@BackReason", SqlDbType.VarChar,1024),
					new SqlParameter("@BusiStatus", SqlDbType.Char,1),
					new SqlParameter("@Remark", SqlDbType.VarChar,800),
					new SqlParameter("@Creator", SqlDbType.Int,4),
					new SqlParameter("@CreateDate", SqlDbType.DateTime),
					new SqlParameter("@BillStatus", SqlDbType.Char,1),
					new SqlParameter("@ModifiedDate", SqlDbType.DateTime),
					new SqlParameter("@ModifiedUserID", SqlDbType.VarChar,50),
                    new SqlParameter("@ID",SqlDbType.Int)};
            parameters[0].Value = model.CompanyCD;
            parameters[1].Value = model.BackNo;
            parameters[2].Value = model.SendID;
            parameters[3].Value = model.Title;
            parameters[4].Value = model.ApplyUserID;
            parameters[5].Value = model.ApplyDeptID;
            if (model.OutDeptID.HasValue)
            {
                parameters[6].Value = model.OutDeptID;
            }
            else
            {
                parameters[6].Value = DBNull.Value;
            }
            parameters[7].Value = model.BackPrice;
            parameters[8].Value = model.BackFeeSum;
            parameters[9].Value = model.BackCount;
            parameters[10].Value = model.BackReason;
            parameters[11].Value = model.BusiStatus;
            parameters[12].Value = model.Remark;
            parameters[13].Value = model.Creator;
            parameters[14].Value = model.CreateDate;
            parameters[15].Value = model.BillStatus;
            parameters[16].Value = model.ModifiedDate;
            parameters[17].Value = model.ModifiedUserID;
            parameters[18].Direction = ParameterDirection.Output;

            SqlCommand sqlMainCmd = new SqlCommand() { CommandText = strSql.ToString() };
            sqlMainCmd.Parameters.AddRange(parameters);
            SqlList.Add(sqlMainCmd);
            #endregion


            #region 拓展属性
            SqlCommand cmd = new SqlCommand();
            GetExtAttrCmd(model, htExtAttr, cmd);
            if (htExtAttr.Count > 0)
                SqlList.Add(cmd);
            #endregion

            #region 构造明细表
            foreach (SubDeliveryBackDetail m in modelList)
            {
                SqlList.Add(GetSaveDetail(m));
            }
            #endregion

            bool result = SqlHelper.ExecuteTransWithArrayList(SqlList);
            if (result)
            {
                return ((SqlCommand)SqlList[0]).Parameters["@ID"].Value.ToString();
            }
            else
                return string.Empty;
        }
        public static bool UpdateStatus(SubDeliveryBack model, int stype)
        {
            //定义返回变量
            bool res = false;
            /* 
             * 定义日志内容变量 
             * 增删改相关的日志,需要输出操作日志,该类型日志插入到数据库
             * 其他的 如出现异常时,需要输出系统日志,该类型日志保存到日志文件
             */
            //获取当前用户信息
            UserInfoUtil userInfo = (UserInfoUtil)SessionUtil.Session["UserInfo"];

            //执行操作
            try
            {
                //执行操作
                res = XBase.Data.Office.LogisticsDistributionManager.SubDeliveryBackDBHelper.UpdateStatus(model, stype);
            }
            catch (Exception ex)
            {
                //输出日志
                WriteSystemLog(userInfo, ex);
            }
            //定义变量
            string remark;
            //成功时
            if (res)
            {
                //设置操作成功标识
                remark = ConstUtil.LOG_PROCESS_SUCCESS;
            }
            else
            {
                //设置操作成功标识 
                remark = ConstUtil.LOG_PROCESS_FAILED;
            }
            //操作日志
            LogInfoModel logModel = InitLogInfo(model.BackNo);
            //涉及关键元素 这个需要根据每个页面具体设置,本页面暂时设置为空

            string msg = string.Empty;
            switch (stype)
            {
                case 1:
                    /*确认*/
                    msg = ConstUtil.LOG_PROCESS_CONFIRM;
                    break;
                case 2:
                    /*结单*/
                    msg = ConstUtil.LOG_PROCESS_COMPLETE;
                    break;
                case 3:
                    /*取消结单*/
                    msg = ConstUtil.LOG_PROCESS_CONCELCOMPLETE;
                    break;
                case 4:
                    /*取消确认*/
                    msg = ConstUtil.LOG_PROCESS_UNCONFIRM;
                    break;
            }
            logModel.Element = msg;

            //设置操作成功标识
            logModel.Remark = remark;

            //登陆日志
            LogDBHelper.InsertLog(logModel);

            return res;
        }
 /*打印使用*/
 public static DataTable GetSubDeliveryBackInfoPrint(SubDeliveryBack model)
 {
     return XBase.Data.Office.LogisticsDistributionManager.SubDeliveryBackDBHelper.GetSubDeliveryBackInfoPrint(model);
 }