/// <summary>
        /// 入队列.
        /// </summary>
        /// <param name="buyingData"></param>
        /// <returns></returns>
        public CommonServiceResult <int> Enqueue(BuyingData buyingData)
        {
            if (logger.IsDebugEnabled)
            {
                logger.DebugFormat("入队列: {0}", buyingData);
            }

            lock (locker)
            {
                if (this.userCodeSet.Contains(buyingData.BuyerCode))
                {
                    CommonServiceResult <int> errorResult = new CommonServiceResult <int>()
                    {
                        ResultCode    = "BUYER_CODE_HAD_EXISTS",
                        ResultMessage = "用户代码已经存在于队列中",
                    };
                    return(errorResult);
                }

                this.userCodeSet.Add(buyingData.BuyerCode);
                this.userCodeQueue.Enqueue(buyingData);

                var queueCount = this.userCodeQueue.Count();

                // 通知 其他等待的线程
                Monitor.Pulse(locker);

                return(CommonServiceResult <int> .CreateDefaultSuccessResult(queueCount));
            }
        }
        CommonServiceResult IJobProcessService.ExecuteJob(Job job)
        {
            try
            {
                using (SqlConnection conn = new SqlConnection(job.JobSetting))
                {
                    conn.Open();

                    // 创建一个 Command.
                    SqlCommand sqlCommand = conn.CreateCommand();

                    // 创建DataSet,用于存储数据.
                    DataSet resultDataSet = new DataSet();

                    // 创建一个适配器
                    SqlDataAdapter adapter = new SqlDataAdapter(job.JobCommand, conn);
                    // 执行查询,并将数据导入DataSet.
                    adapter.Fill(resultDataSet, "result_data");

                    // 取得 DataTable.
                    DataTable dt = resultDataSet.Tables["result_data"];

                    string json = JsonConvert.SerializeObject(dt);

                    // 将 DataTable 返回出去.
                    return(CommonServiceResult.CreateDefaultSuccessResult(json));
                }
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message, ex);
                return(new CommonServiceResult(ex));
            }
        }
示例#3
0
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            var context = actionExecutedContext.Response.Content;

            // 如果返回的结果,是通用的服务结果.
            if (context is ObjectContent <CommonServiceResult> )
            {
                // 结果转换.
                ObjectContent <CommonServiceResult> result = (ObjectContent <CommonServiceResult>)context;

                // 获取结果数据.
                CommonServiceResult resultData = (CommonServiceResult)result.Value;

                if (!resultData.IsSuccess)
                {
                    // 仅仅在失败的情况下, 才尝试从资源文件中获取错误信息.

                    // 获取客户端的语言请求.
                    CultureInfo cultureInfo = GetCultureInfo(actionExecutedContext.Request);

                    // 设置错误信息.
                    resultData.ResultMessage = MyResource.ResourceManager.GetString(resultData.ResultCode, cultureInfo);
                }
            }


            base.OnActionExecuted(actionExecutedContext);
        }
        CommonServiceResult IJobProcessService.ExecuteJob(Job job)
        {
            try
            {
                using (SqlConnection conn = new SqlConnection(job.JobSetting))
                {
                    conn.Open();

                    // 创建一个 Command.
                    SqlCommand sqlCommand = conn.CreateCommand();

                    // 定义需要执行的SQL语句.
                    sqlCommand.CommandText = job.JobCommand;

                    // ExecuteNonQuery 方法,表明本次操作,不是一个查询的操作。将没有结果集合返回.
                    // 返回的数据,将是 被影响的记录数.
                    int rowCount = sqlCommand.ExecuteNonQuery();

                    // 将更新行数返回出去.
                    return(CommonServiceResult.CreateDefaultSuccessResult(rowCount));
                }
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message, ex);
                return(new CommonServiceResult(ex));
            }
        }
        /// <summary>
        /// 获取可购买的数据.
        /// </summary>
        /// <param name="id"></param>
        /// <param name="batch"></param>
        /// <returns></returns>
        public JsonResult GetBuyableDetail(string id, string batch, string userID)
        {
            if (logger.IsDebugEnabled)
            {
                logger.DebugFormat("GetBuyableDetail ( {0}, {1}, {2}  ) Start", id, batch, userID);
            }

            BuyingData buyingData = new BuyingData()
            {
                CommodityMasterCode = id,
                Batch     = batch,
                BuyerCode = userID
            };


            // 这里是 入队列后, 立即返回。
            // 后续客户端通过调用 IsInQueue, 来判断请求是否还在队列里面。
            // 当队列中没有请求的时候, 说明请求已经被处理,通过调用 GetServiceResult 获取执行的结果。

            // 这种处理方式
            // 优点是 客户端不卡, 可以做到 先到先得。
            // 缺点是 客户端/服务端代码量,稍微增加一些。
            CommonServiceResult <int> result = buyerQueueManager.Enqueue(buyingData);

            if (logger.IsDebugEnabled)
            {
                logger.DebugFormat("GetBuyableDetail ( {0}, {1}, {2}  ) Result: {3}", id, batch, userID, result);
            }

            return(Json(result));
        }
示例#6
0
        /// <summary>
        /// 获取可购买的数据.
        /// </summary>
        /// <param name="id"></param>
        /// <param name="batch"></param>
        /// <returns></returns>
        public JsonResult GetBuyableDetail(string id, string batch, string userID)
        {
            if (logger.IsDebugEnabled)
            {
                logger.DebugFormat("GetBuyableDetail ( {0}, {1}, {2}  ) Start", id, batch, userID);
            }


            // 注意:
            // 这种操作方式, 是通过 锁定一个对象,来避免 一个商品, 被多个人抢购到。

            // 存在的问题:
            // 1. 用户多的情况下,会卡得一塌糊涂。 (当然和这里 lock 里面休眠 5秒有关系)
            // 2. 无法确保先到先得。

            lock (_Locker)
            {
                // 为了测试多人同时抢购的操作.
                // 这里休眠5秒.
                Thread.Sleep(5000);

                CommonServiceResult <long> result = this._BuyingService.GetFirstBuyableCommodityDetail(id, batch, userID);


                logger.DebugFormat("GetBuyableDetail ( {0}, {1}, {2}  ) Finish, Result = {3}", id, batch, userID, result);

                return(Json(result));
            }
        }
示例#7
0
        public CommonServiceResult <long> GetFirstBuyableCommodityDetail(string commodityMasterCode, string batchCode, string buyerCode)
        {
            try
            {
                using (MyBuyingContext context = new MyBuyingContext())
                {
                    CommodityDetail detail = context.CommodityDetails.FirstOrDefault(p =>
                                                                                     p.CommodityMasterCode == commodityMasterCode &&
                                                                                     p.BatchCode == batchCode &&
                                                                                     p.CommodityStatus == CommodityDetail.COMMODITY_STATUS_IS_CREATED);

                    if (detail == null)
                    {
                        // 数据不存在.
                        return(CommonServiceResult <long> .DataNotFoundResult);
                    }

                    // 修改状态.
                    detail.CommodityStatus = CommodityDetail.COMMODITY_STATUS_IS_LOCKED;

                    // 购买人.
                    detail.BuyerCode = buyerCode;

                    context.SaveChanges();

                    return(CommonServiceResult <long> .CreateDefaultSuccessResult(detail.CommodityDetailID));
                }
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message, ex);
                return(new CommonServiceResult <long>(ex));
            }
        }
 /// <summary>
 /// 获取服务结果.
 /// </summary>
 /// <param name="userCode"></param>
 /// <returns></returns>
 public CommonServiceResult <long> GetServiceResult(string userCode)
 {
     lock (resultLocker)
     {
         if (this.serviceResult.ContainsKey(userCode))
         {
             CommonServiceResult <long> result = this.serviceResult[userCode];
             this.serviceResult.Remove(userCode);
             return(result);
         }
         return(CommonServiceResult <long> .DataNotFoundResult);
     }
 }
 /// <summary>
 /// 显示作业执行结果.
 /// </summary>
 /// <param name="result"></param>
 private void ShowJobReult(CommonServiceResult result)
 {
     if (this.JobFinish != null)
     {
         // 定义了 委派 的情况下, 执行委派.
         this.JobFinish(this._Job, result);
     }
     else
     {
         // 未定义的情况下, 简单显示.
         Console.WriteLine("Job Result = {0}", result);
     }
 }
        private void DequeueService()
        {
            while (true)
            {
                BuyingData buyingData;
                lock (locker)
                {
                    if (this.userCodeSet.Count == 0)
                    {
                        // 队列中无数据.
                        // 等待通知.
                        if (logger.IsDebugEnabled)
                        {
                            logger.DebugFormat("队列中无数据,等待通知。");
                        }
                        Monitor.Wait(locker);
                    }



                    buyingData = this.userCodeQueue.Dequeue();
                }


                if (logger.IsDebugEnabled)
                {
                    logger.DebugFormat("出队列,数据处理:{0}", buyingData);
                }


                // 为了测试队列中等待的效果, 这里休眠5秒.
                Thread.Sleep(5000);

                CommonServiceResult <long> result = this._BuyingService.GetFirstBuyableCommodityDetail(buyingData.CommodityMasterCode, buyingData.Batch, buyingData.BuyerCode);

                lock (locker)
                {
                    this.userCodeSet.Remove(buyingData.BuyerCode);
                }
                lock (resultLocker)
                {
                    if (!this.serviceResult.ContainsKey(buyingData.BuyerCode))
                    {
                        this.serviceResult.Add(buyingData.BuyerCode, result);
                    }
                }
            }
        }
        /// <summary>
        /// 完成作业的处理.
        /// </summary>
        public void DoJob()
        {
            // 作业不存在.
            if (this._Job == null)
            {
                ShowJobReult(CommonServiceResult.DataNotFoundResult);
                return;
            }

            while (!done)
            {
                // 运行时间.
                DateTime runTime;

                if (this._Job.NextRunTime != null)
                {
                    // 作业中指定了 下次运行时间.
                    runTime = this._Job.NextRunTime.Value;
                }
                else
                {
                    // 作业中未指定 下次运行时间. 需要通过 配置进行计算.
                    DateTime?nextRunTime = this._Job.GetNextRunTime();
                    if (nextRunTime == null)
                    {
                        // 未得到计算结果.
                        ShowJobReult(CommonServiceResult.DataNotFoundResult);
                    }
                    // 得到计算结果.
                    runTime = nextRunTime.Value;
                }

                if (runTime > DateTime.Now)
                {
                    // 时间未到,需要等待.
                    var timeSpan = runTime - DateTime.Now;
                    // await Task.Delay(timeSpan);
                    Thread.Sleep(timeSpan);
                }

                // 获取处理器.
                IJobProcessService jobProcesser = JobProcessFactory.GetJobProcesser(this._Job.JobTypeData);
                // 处理.
                CommonServiceResult processResult = jobProcesser.ExecuteJob(this._Job);
                // 显示作业处理结果.
                ShowJobReult(processResult);
            }
        }
        /// <summary>
        /// 是否在队列.
        /// </summary>
        /// <param name="userID"></param>
        /// <returns></returns>
        public JsonResult IsInQueue(string userID)
        {
            if (logger.IsDebugEnabled)
            {
                logger.DebugFormat("IsInQueue ( {0}  ) Start", userID);
            }

            CommonServiceResult result = buyerQueueManager.IsInQueue(userID);


            if (logger.IsDebugEnabled)
            {
                logger.DebugFormat("IsInQueue ( {0}  ) Result: {1}", userID, result);
            }

            return(Json(result));
        }
示例#13
0
        public CommonServiceResult CommodityDetailUsedByCode(string commodityMasterCode, string batchCode, string commodityDetailCode)
        {
            try
            {
                using (MyBuyingContext context = new MyBuyingContext())
                {
                    CommodityDetail detail = context.CommodityDetails.FirstOrDefault(p =>
                                                                                     p.CommodityMasterCode == commodityMasterCode &&
                                                                                     p.BatchCode == batchCode &&
                                                                                     p.CommodityDetailCode == commodityDetailCode);

                    if (detail == null)
                    {
                        // 数据不存在.
                        return(CommonServiceResult.DataNotFoundResult);
                    }

                    if (detail.CommodityStatus != CommodityDetail.COMMODITY_STATUS_IS_PAYED)
                    {
                        CommonServiceResult errorResult = new CommonServiceResult()
                        {
                            ResultCode    = "COMMODITY_STATUS_ERROR",
                            ResultMessage = "状态数据无效!",
                        };
                        return(errorResult);
                    }

                    // 修改状态.
                    detail.CommodityStatus = CommodityDetail.COMMODITY_STATUS_IS_USED;

                    context.SaveChanges();
                }

                return(CommonServiceResult.DefaultSuccessResult);
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message, ex);
                return(new CommonServiceResult(ex));
            }
        }
示例#14
0
        public CommonServiceResult CreateOrder(long commodityDetailID, string buyerCode)
        {
            try
            {
                using (MyBuyingContext context = new MyBuyingContext())
                {
                    CommodityDetail detail = context.CommodityDetails.Find(commodityDetailID);
                    if (detail == null)
                    {
                        // 数据不存在.
                        return(CommonServiceResult.DataNotFoundResult);
                    }

                    if (detail.CommodityStatus != CommodityDetail.COMMODITY_STATUS_IS_LOCKED)
                    {
                        CommonServiceResult errorResult = new CommonServiceResult()
                        {
                            ResultCode    = "COMMODITY_STATUS_ERROR",
                            ResultMessage = "状态数据无效!",
                        };
                        return(errorResult);
                    }

                    // 修改状态.
                    detail.CommodityStatus = CommodityDetail.COMMODITY_STATUS_IS_PAYING;

                    // 购买人.
                    detail.BuyerCode = buyerCode;

                    context.SaveChanges();
                }

                return(CommonServiceResult.DefaultSuccessResult);
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message, ex);
                return(new CommonServiceResult(ex));
            }
        }
示例#15
0
        public CommonServiceResult <CommodityDetail> OrderPayed(long commodityDetailID)
        {
            try
            {
                using (MyBuyingContext context = new MyBuyingContext())
                {
                    CommodityDetail detail = context.CommodityDetails.Find(commodityDetailID);
                    if (detail == null)
                    {
                        // 数据不存在.
                        return(CommonServiceResult <CommodityDetail> .DataNotFoundResult);
                    }

                    if (detail.CommodityStatus != CommodityDetail.COMMODITY_STATUS_IS_PAYING)
                    {
                        CommonServiceResult <CommodityDetail> errorResult = new CommonServiceResult <CommodityDetail>()
                        {
                            ResultCode    = "COMMODITY_STATUS_ERROR",
                            ResultMessage = "状态数据无效!",
                        };
                        return(errorResult);
                    }

                    // 修改状态.
                    detail.CommodityStatus = CommodityDetail.COMMODITY_STATUS_IS_PAYED;

                    context.SaveChanges();


                    return(CommonServiceResult <CommodityDetail> .CreateDefaultSuccessResult(detail));
                }
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message, ex);
                return(new CommonServiceResult <CommodityDetail>(ex));
            }
        }
示例#16
0
        /// <summary>
        /// 获取可购买的数据.
        /// </summary>
        /// <param name="id"></param>
        /// <param name="batch"></param>
        /// <returns></returns>
        public JsonResult GetBuyableDetail(string id, string batch, string userID)
        {
            CommonServiceResult <long> result = this._BuyingService.GetFirstBuyableCommodityDetail(id, batch, userID);

            return(Json(result));
        }
示例#17
0
        /// <summary>
        /// 完成支付.
        /// (这里只是用于测试的, 实际操作中, 是后台收到支付回调的时候,进行处理, 而不是简单前端调用)
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public JsonResult OrderPayed(long id)
        {
            CommonServiceResult <CommodityDetail> result = this._BuyingService.OrderPayed(id);

            return(Json(result));
        }
示例#18
0
        /// <summary>
        /// 代码使用
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public JsonResult CodeUsed(string id, string batch, string userCode)
        {
            CommonServiceResult result = this._BuyingService.CommodityDetailUsedByCode(id, batch, userCode);

            return(Json(result));
        }
示例#19
0
        /// <summary>
        /// 简单创建商品明细
        /// </summary>
        /// <param name="commodityMasterCode"></param>
        /// <param name="batchCode"></param>
        /// <param name="count"></param>
        /// <returns></returns>
        public CommonServiceResult CreateCommodityDetail(string commodityMasterCode, string batchCode, int count)
        {
            try
            {
                using (MyBuyingContext context = new MyBuyingContext())
                {
                    // 先查询 商品主表是否存在.
                    CommodityMaster commodityMaster = context.CommodityMasters.Find(commodityMasterCode);
                    if (commodityMaster == null)
                    {
                        // 数据不存在.
                        return(CommonServiceResult.DataNotFoundResult);
                    }

                    // 再查询, 相同的商品主表代码+批次, 是否已存在有数据.
                    int dbDataCount = context.CommodityDetails.Count(p => p.CommodityMasterCode == commodityMasterCode && p.BatchCode == batchCode);
                    if (dbDataCount > 0)
                    {
                        // 数据已存在.
                        return(CommonServiceResult.DataHadExistsResult);
                    }

                    if (count <= 0)
                    {
                        CommonServiceResult errorResult = new CommonServiceResult()
                        {
                            ResultCode    = "COUNT_MUST_MORE_THAN_ZERO",
                            ResultMessage = "数量必须大于零。",
                        };
                        return(errorResult);
                    }


                    HashSet <int> resultCodes = new HashSet <int>();
                    Random        random      = new Random();

                    while (resultCodes.Count < count)
                    {
                        int num = random.Next(1, 99999999);
                        if (!resultCodes.Contains(num))
                        {
                            resultCodes.Add(num);
                        }
                    }

                    foreach (int num in resultCodes)
                    {
                        CommodityDetail commodityDetail = new CommodityDetail()
                        {
                            // 主表代码.
                            CommodityMasterCode = commodityMasterCode,
                            // 批次.
                            BatchCode = batchCode,
                            // 明细代码.
                            CommodityDetailCode = num.ToString("00000000"),

                            // 商品状态 : 可用.
                            CommodityStatus = CommodityDetail.COMMODITY_STATUS_IS_CREATED,
                        };

                        context.CommodityDetails.Add(commodityDetail);
                    }

                    context.SaveChanges();
                }


                return(CommonServiceResult.DefaultSuccessResult);
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message, ex);
                return(new CommonServiceResult(ex));
            }
        }
示例#20
0
        /// <summary>
        /// 根据模板创建商品明细
        /// </summary>
        /// <param name="commodityMasterCode"></param>
        /// <param name="batchCode"></param>
        /// <returns></returns>
        public CommonServiceResult CreateCommodityDetailByTemplate(string commodityMasterCode, string batchCode)
        {
            try
            {
                using (MyBuyingContext context = new MyBuyingContext())
                {
                    // 先查询 商品主表是否存在.
                    CommodityMaster commodityMaster = context.CommodityMasters.Find(commodityMasterCode);
                    if (commodityMaster == null)
                    {
                        // 数据不存在.
                        return(CommonServiceResult.DataNotFoundResult);
                    }

                    // 再获取模板数据.
                    List <CommodityDetailTemplate> templateDataList = context.CommodityDetailTemplates.Where(p => p.CommodityMasterCode == commodityMasterCode).ToList();
                    if (templateDataList.Count == 0)
                    {
                        CommonServiceResult errorResult = new CommonServiceResult()
                        {
                            ResultCode    = "WITHOUT_TEMPLATE_DATA",
                            ResultMessage = "未查询到模板数据",
                        };
                        return(errorResult);
                    }

                    // 再查询, 相同的商品主表代码+批次, 是否已存在有数据.
                    int dbDataCount = context.CommodityDetails.Count(p => p.CommodityMasterCode == commodityMasterCode && p.BatchCode == batchCode);
                    if (dbDataCount > 0)
                    {
                        // 数据已存在.
                        return(CommonServiceResult.DataHadExistsResult);
                    }


                    HashSet <int> resultCodes = new HashSet <int>();
                    Random        random      = new Random();

                    while (resultCodes.Count < templateDataList.Count)
                    {
                        int num = random.Next(1, 99999999);
                        if (!resultCodes.Contains(num))
                        {
                            resultCodes.Add(num);
                        }
                    }

                    // 索引.
                    var index = 0;
                    foreach (int num in resultCodes)
                    {
                        CommodityDetail commodityDetail = new CommodityDetail()
                        {
                            // 主表代码.
                            CommodityMasterCode = commodityMasterCode,
                            // 批次.
                            BatchCode = batchCode,
                            // 明细代码.
                            CommodityDetailCode = num.ToString("00000000"),

                            // 商品状态 : 可用.
                            CommodityStatus = CommodityDetail.COMMODITY_STATUS_IS_CREATED,

                            // 附加数据.
                            CommodityDetailExpData = templateDataList[index].CommodityDetailExpData,
                        };

                        context.CommodityDetails.Add(commodityDetail);
                        index++;
                    }

                    context.SaveChanges();
                }


                return(CommonServiceResult.DefaultSuccessResult);
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message, ex);
                return(new CommonServiceResult(ex));
            }
        }
示例#21
0
 public static void ShowResult(Job job, CommonServiceResult result)
 {
     //Console.WriteLine("### TestClient1 - Result : {0}", result);
     Console.WriteLine("### {0:yyyy-MM-dd HH:mm:ss} TestClient1 - Result Data: {1}", DateTime.Now, result.ResultData);
 }
示例#22
0
 public void TestCreateCommodityDetailByTemplate()
 {
     string batch = DateTime.Today.ToString("MMdd");
     CommonServiceResult result = this.commodityService.CreateCommodityDetailByTemplate("TEST", batch);
 }
示例#23
0
 public void TestCreateCommodityDetail()
 {
     string batch = DateTime.Today.ToString("MMdd");
     CommonServiceResult result  = this.commodityService.CreateCommodityDetail("TEST2", batch, 5);
     CommonServiceResult result2 = this.commodityService.CreateCommodityDetail("TEST3", String.Empty, 5);
 }
示例#24
0
        /// <summary>
        /// 创建订单 (购买操作)
        /// </summary>
        /// <param name="id"></param>
        /// <param name="userID"></param>
        /// <returns></returns>
        public JsonResult CreateOrder(long id, string userID)
        {
            CommonServiceResult result = this._BuyingService.CreateOrder(id, userID);

            return(Json(result));
        }