/// <summary> /// 扫描一个更新redis中的实收数量+1 /// </summary> /// <param name="OrderNumber"></param> /// <param name="SKU"></param> /// <param name="Location"></param> /// <returns></returns> public JsonResult UpdateOrderDetailQtyRedis(string OrderNumber, string SKU, string Location) { List <OrderDetailForRedisRF> Lists = new List <OrderDetailForRedisRF>(); try { if (RCommon.RedisOperation.Exists(OrderNumber)) { Lists = RCommon.RedisOperation.GetList <List <OrderDetailForRedisRF> >(OrderNumber); using (var cslock = new CSRedisClientLock() { Name = "CSRedisClientLock:OSL" + OrderNumber + SKU + Location, _client = RCommon.RedisOperation.cs }) { if (RCommon.RedisOperation.Lock("OSL" + OrderNumber + SKU + Location, 5) != null) { foreach (var item in Lists.Where(c => c.SKU == SKU && c.Location == Location)) { item.QtyPicked = item.QtyPicked + 1; item.Picker = Session["Name"].ToString(); item.PickTime = DateTime.Now; RCommon.RedisOperation.SetList(OrderNumber, Lists); return(Json(new { Code = "1", data = Lists.Where(c => c.Location == Location && c.SKU == SKU) })); } } } } } catch (Exception ex) { return(Json(new { Code = "-1", data = Lists.Where(c => c.Location == Location && c.SKU == SKU) })); } return(Json(new { Code = "0", data = Lists.Where(c => c.Location == Location && c.SKU == SKU) })); }
/// <summary> /// 锁定DB进行数据操作。 /// </summary> /// <typeparam name="TOut"></typeparam> /// <param name="client"></param> /// <param name="cacheKey"></param> /// <param name="func"></param> /// <returns></returns> private TOut LockDb <TOut>(CSRedisClient client, string cacheKey, Func <TOut> func) { var token = Guid.NewGuid().ToString(); var lockKey = $"{cacheKey}:LOCK_TOKEN"; CSRedisClientLock locker = null; while ((locker = client.Lock(lockKey, 10)) == null) { ; } var result = func(); locker.Dispose(); return(result); }
/// <summary> /// 查询该订单所有SKU是否已扫完 /// </summary> /// <param name="OrderNumber"></param> /// <returns></returns> public string CheckOrderDetailQtyPickRedisAll(string OrderNumber) { string response = ""; try { List <OrderDetailForRedisRF> Lists = new List <OrderDetailForRedisRF>(); if (RCommon.RedisOperation.Exists("Check:" + OrderNumber)) { Lists = RCommon.RedisOperation.GetList <List <OrderDetailForRedisRF> >("Check:" + OrderNumber); using (var cslock = new CSRedisClientLock() { Name = "CSRedisClientLock:O" + OrderNumber, _client = RCommon.RedisOperation.cs }) { if (RCommon.RedisOperation.Lock("O" + OrderNumber, 5) != null) { foreach (var item in Lists) { if (item.Qty != item.QtyPicked) { response = "1"; return(response); } } } } } else { response = "3"; } } catch (Exception ex) { response = ex.Message; } return(response); }
/// <summary> /// 数量回车更新redis中的实收数量 /// </summary> /// <param name="OrderNumber"></param> /// <param name="SKU"></param> /// <param name="Location"></param> /// <param name="Qty"></param> /// <returns></returns> public string UpdateOrderDetailQtyRedisByQtyScan(string OrderNumber, string SKU, string Location, string Qty) { string response = ""; try { List <OrderDetailForRedisRF> Lists = new List <OrderDetailForRedisRF>(); if (RCommon.RedisOperation.Exists(OrderNumber)) { Lists = RCommon.RedisOperation.GetList <List <OrderDetailForRedisRF> >(OrderNumber); using (var cslock = new CSRedisClientLock() { Name = "CSRedisClientLock:OSL" + OrderNumber + SKU + Location, _client = RCommon.RedisOperation.cs }) { if (RCommon.RedisOperation.Lock("OSL" + OrderNumber + SKU + Location, 5) != null) { foreach (var item in Lists.Where(c => c.SKU == SKU && c.Location == Location)) { if (item.Qty < item.QtyPicked + Convert.ToDecimal(Qty)) { response = "1"; } else { item.QtyPicked = item.QtyPicked + Convert.ToDecimal(Qty); } } RCommon.RedisOperation.Del(OrderNumber); RCommon.RedisOperation.SetList(OrderNumber, Lists); } } } } catch (Exception ex) { response = ex.Message; } return(response); }
/// <summary> /// 查询当前SKU是否已经扫描完成 /// </summary> /// <param name="OrderNumber"></param> /// <param name="SKU"></param> /// <param name="Location"></param> /// <returns></returns> public string CheckOrderDetailQtyPickRedis(string OrderNumber, string SKU, string Location) { string response = ""; try { List <OrderDetailForRedisRF> Lists = new List <OrderDetailForRedisRF>(); if (RCommon.RedisOperation.Exists(OrderNumber)) { Lists = RCommon.RedisOperation.GetList <List <OrderDetailForRedisRF> >(OrderNumber); using (var cslock = new CSRedisClientLock() { Name = "CSRedisClientLock:OSL" + OrderNumber + SKU + Location, _client = RCommon.RedisOperation.cs }) { if (RCommon.RedisOperation.Lock("OSL" + OrderNumber + SKU + Location, 5) != null) { foreach (var item in Lists.Where(c => c.SKU == SKU && c.Location == Location)) { if (item.Qty <= item.QtyPicked) { response = "1"; } } } } } else { response = "2"; } } catch (Exception ex) { response = ex.Message; } return(response); }