public void AddShopOprLog <T, D>(int shopId, string objType, int objId, string operation, T beforeValue, D afterValue, string Remark)
            where T : class
            where D : class
        {
            ParameterChecker.CheckNullOrEmpty(objType, "objType");
            ParameterChecker.CheckNullOrEmpty(operation, "operation");

            var oprLog = new ShopEditOprLog();

            oprLog.ShopID         = shopId;
            oprLog.ObjectType     = objType;
            oprLog.ObjectID       = objId;
            oprLog.ChangeDatetime = DateTime.Now;
            oprLog.Operation      = operation;
            oprLog.Author         = ThreadIdentity.Operator.Name;
            oprLog.IPAddress      = ThreadIdentity.Operator.IPAddress;
            oprLog.Remark         = Remark;

            if (typeof(T) == typeof(string))
            {
                oprLog.BeforeValue = (string)(object)beforeValue;
            }
            else
            {
                if (beforeValue != null)
                {
                    var valueBuilder = new StringBuilder();
                    foreach (var property in typeof(T).GetProperties())
                    {
                        var value = property.GetValue(beforeValue, null);
                        valueBuilder.AppendFormat("{0} = {1}", property.Name, value ?? "NULL").AppendLine();
                    }
                    oprLog.BeforeValue = valueBuilder.ToString();
                }
            }
            if (typeof(D) == typeof(string))
            {
                oprLog.AfterValue = (string)(object)afterValue;
            }
            else
            {
                if (afterValue != null)
                {
                    var valueBuilder = new StringBuilder();
                    foreach (var property in typeof(D).GetProperties())
                    {
                        var value = property.GetValue(afterValue, null);
                        valueBuilder.AppendFormat("{0} = {1}", property.Name, value ?? "NULL").AppendLine();
                    }
                    oprLog.AfterValue = valueBuilder.ToString();
                }
            }

            dbManager.Execute(connection => DalOprLog.AddShopEditOprLog(connection, oprLog));
        }
        /// <summary>
        /// 拼接保养短信
        /// </summary>
        /// <param name="orderId"></param>
        /// <returns></returns>
        //public string GetBaoYangEmailProcess(int orderId)
        //{
        //    var bizOrder = dbManager.Execute(connection => DalOrder.SelectOrderByOrderId(connection, orderId));
        //    var orderHash =
        //              WebSecurity.Hash(string.Concat(bizOrder.Refno, bizOrder.UserId,
        //                  bizOrder.OrderDatetime.ToString("yyyy-MM-dd HH:mm")));
        //    var shortUrl =
        //        TuhuUtil.GetShortUrl(string.Format(ConfigurationManager.AppSettings["LongUrl"], orderId, orderHash));
        //    if (bizOrder.OrderChannel.Contains("天猫"))
        //    {
        //        bizOrder.OrderChannel = "天猫";
        //    }
        //    else
        //        if (bizOrder.OrderChannel.Contains("淘宝"))
        //        {
        //            bizOrder.OrderChannel = "淘宝";
        //        }
        //    string message = string.Format(ConfigurationManager.AppSettings["MaintainPackageMessage"], bizOrder.UserName, bizOrder.OrderChannel, bizOrder.Refno, shortUrl);
        //    //new JobServerManager().SendMaintainPackageMessage(item.OrderId, item.Refno, item.UserId.ToString(),
        //    //                        item.OrderDatetime, item.UserName, item.UserTel, item.OrderChannel);
        //    return message;
        //}

        ///// <summary>
        ///// 直接发短信
        ///// </summary>
        //public void SendMaintainPackageMessage(int orderId, BizEmailProcess bizEmailProcess)
        //{
        //    var item = dbManager.Execute(connection => DalOrder.SelectOrderByOrderId(connection, orderId));
        //    new JobServerManager().SendMaintainPackageMessage(item.OrderId, item.OrderNo, item.Refno, item.UserId.ToString(),
        //                            item.OrderDatetime, item.UserName, bizEmailProcess.ToMail, item.OrderChannel);
        //}



        #region 门店日志

        public void AddShopOprLog(ShopEditOprLog oprLog)
        {
            ParameterChecker.CheckNull(oprLog, "oprLog");

            if (string.IsNullOrEmpty(oprLog.Author))
            {
                oprLog.Author = ThreadIdentity.Operator.Name;
            }
            if (string.IsNullOrEmpty(oprLog.IPAddress))
            {
                oprLog.IPAddress = ThreadIdentity.Operator.IPAddress;
            }

            dbManager.Execute(connection => DalOprLog.AddShopEditOprLog(connection, oprLog));
        }
        public static void AddShopEditOprLog(ShopEditOprLog oprLog)
        {
            var parameters = new[]
            {
                new SqlParameter("@ShopID", oprLog.ShopID),
                new SqlParameter("@Author", oprLog.Author ?? string.Empty),
                new SqlParameter("@ObjectType", oprLog.ObjectType ?? string.Empty),
                new SqlParameter("@ObjectId", oprLog.ObjectID),
                new SqlParameter("@BeforeValue", oprLog.BeforeValue ?? string.Empty),
                new SqlParameter("@AfterValue", oprLog.AfterValue ?? string.Empty),
                new SqlParameter("@IpAddress", oprLog.IPAddress ?? string.Empty),
                new SqlParameter("@Operation", oprLog.Operation ?? string.Empty),
                new SqlParameter("@Remark", oprLog.Remark ?? string.Empty)
            };

            DbHelper.ExecuteNonQuery("Shop_AddShopEditOprLog", CommandType.StoredProcedure, parameters);
        }
        /// <summary>
        /// 拼接短信
        /// </summary>
        /// <param name="orderId"></param>
        /// <returns></returns>
        //public string GetBaoYangEmailProcess(int orderId)
        //{
        //    return handler.GetBaoYangEmailProcess(orderId);
        //}

        ///// <summary>
        ///// 发短信
        ///// </summary>
        ///// <param name="orderId"></param>
        //public void SendMaintainPackageMessage(int orderId, BizEmailProcess bizEmailProcess)
        //{
        //    handler.SendMaintainPackageMessage(orderId, bizEmailProcess);
        //}

        public void AddShopOprLog(ShopEditOprLog oprLog)
        {
            try
            {
                this.handler.AddShopOprLog(oprLog);
            }
            catch (TuhuBizException)
            {
                throw;
            }
            catch (Exception innerEx)
            {
                var exception = new OprLogException(BizErrorCode.SystemError, "添加门店操作日志出错", innerEx);
                logger.Log(Level.Error, exception, "Error occurred in adding  shop opr log.");

                throw exception;
            }
        }
        public void AddShopOprLog(int shopId, string objType, int objId, string beforeValue, string afterValue, string operation, string Remark)
        {
            var oprLog = new ShopEditOprLog();

            oprLog.ShopID      = shopId;
            oprLog.ObjectType  = objType;
            oprLog.ObjectID    = objId;
            oprLog.BeforeValue = beforeValue;
            oprLog.AfterValue  = afterValue;
            oprLog.Operation   = operation;
            oprLog.Author      = ThreadIdentity.Operator.Name;
            oprLog.IPAddress   = ThreadIdentity.Operator.IPAddress;
            oprLog.Remark      = Remark;
            if (!string.IsNullOrEmpty(afterValue))
            {
                string[] strs         = afterValue.Split(',');
                var      valueBuilder = new StringBuilder();
                for (int i = 0; i < strs.Length; i++)
                {
                    valueBuilder.AppendFormat(strs[i]).AppendLine();
                }
                oprLog.AfterValue = valueBuilder.ToString();
            }
            if (!string.IsNullOrEmpty(beforeValue))
            {
                string[] strs         = beforeValue.Split(',');
                var      valueBuilder = new StringBuilder();
                for (int i = 0; i < strs.Length; i++)
                {
                    valueBuilder.AppendFormat(strs[i]).AppendLine();
                }
                oprLog.BeforeValue = valueBuilder.ToString();
            }


            AddShopOprLog(oprLog);
        }