/// <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)); } }
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)); }
/// <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)); } }
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)); }
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)); } }
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)); } }
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)); } }
/// <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)); }
/// <summary> /// 完成支付. /// (这里只是用于测试的, 实际操作中, 是后台收到支付回调的时候,进行处理, 而不是简单前端调用) /// </summary> /// <param name="id"></param> /// <returns></returns> public JsonResult OrderPayed(long id) { CommonServiceResult <CommodityDetail> result = this._BuyingService.OrderPayed(id); return(Json(result)); }
/// <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)); }
/// <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)); } }
/// <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)); } }
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); }
public void TestCreateCommodityDetailByTemplate() { string batch = DateTime.Today.ToString("MMdd"); CommonServiceResult result = this.commodityService.CreateCommodityDetailByTemplate("TEST", batch); }
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); }
/// <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)); }