You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

220 lines
6.2 KiB
C#

9 months ago
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using NLog;
using POSV.Common.Transport;
using POSV.Common.Util;
using JwKdsV.Entity.Product;
using JwKdsV.Core.MessageEvent;
using POSV.Service.Utils;
namespace JwKdsV.Core.Utils
{
public class SaleClearUtils
{
private static Logger logger = NLog.LogManager.GetCurrentClassLogger();
private static object _lock = new object();
private static SaleClearUtils _instance = null;
public static SaleClearUtils Instance
{
get
{
if (_instance == null)
{
lock (_lock)
{
_instance = new SaleClearUtils();
_instance.InitSaleClear();
}
}
return _instance;
}
}
private ObservableDictionary<string, SaleClear> _maps = null;
/// <summary>
/// 加载今日沽清数据
/// </summary>
public void InitSaleClear()
{
try
{
var data = this.GetAvailableSaleClearList();
List<SaleClear> rows = data.Item3;
this._maps = new ObservableDictionary<string, SaleClear>();
foreach (var row in rows)
{
row.Frozen = this.IsFrozen(row);
this._maps[row.ProductId] = row;
}
logger.Info("加载的沽清商品总数量<{0}>", this._maps.Count);
this._maps.CollectionChanged += OnCollectionChanged;
}
catch (Exception ex)
{
logger.Error(ex, "加载沽清数据异常");
}
}
/// <summary>
/// 加载沽清数据,区分本地数据和共享数据两种
/// </summary>
private Tuple<bool, string, List<SaleClear>> GetAvailableSaleClearList()
{
bool isSuccess = false;
string message = string.Empty;
List<SaleClear> rows = new List<SaleClear>();
try
{
//启用全局沽清,服务中心提供数据
logger.Info("获取服务中心的沽清数据");
var data = MessageCenterUtils.Instance.GetGlobalAvailableSaleClear();
isSuccess = data.Item1;
message = data.Item2;
rows = data.Item3;
}
catch (Exception ex)
{
isSuccess = false;
message = "沽清数据异常";
logger.Error(ex, message);
}
return new Tuple<bool, string, List<SaleClear>>(isSuccess, message, rows);
}
private void OnCollectionChanged(object sender, CollectionChangedEventArgs e)
{
logger.Info("操作沽清业务: {0}", e.Action);
if (e.NewItem != null && e.NewItem is KeyValuePair<string, SaleClear>)
{
var map = (KeyValuePair<string, SaleClear>)e.NewItem;
var saleClear = map.Value;
bool isSuccess = SaveSaleClear(saleClear);
if (isSuccess)
{
//发送沽清变动通知
MsgEvent.Send(Constant.SALE_CLEAR_CHANGED_NOTIFY, map.Value);
}
}
else
{
logger.Warn("沽清业务数据不合法!");
}
}
/// <summary>
/// 清理本地沽清数据
/// </summary>
public void Expired()
{
try
{
logger.Info("采用共享沽清模式,忽略本机清理操作....");
return;
}
catch (Exception ex)
{
logger.Error(ex, "清理过期沽清数据异常");
}
}
/// <summary>
/// 检测是否有可用的沽清记录存在
/// </summary>
/// <param name="saleClear"></param>
/// <returns></returns>
public bool CheckSaleClear(SaleClear saleClear)
{
return (saleClear != null && saleClear.StopFlag == 0 && !saleClear.Frozen);
}
/// <summary>
/// 沽清是否符合条件
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public bool IsFrozen(SaleClear entity)
{
//当前时间
DateTime dateTime = DateTime.Now;
//有效沽清时间
DateTime startTime = Convert.ToDateTime(entity.StartTime);
//结束时间
DateTime endTime = Convert.ToDateTime(entity.EndTime);
return (dateTime.CompareTo(startTime) < 0 || dateTime.CompareTo(endTime) > 0);
}
private bool SaveSaleClear(SaleClear saleClear)
{
bool isSuccess = true;
try
{
//更新剩余数量
saleClear.Quantity = saleClear.TotalQuantity - saleClear.SaleQuantity;
var transport = new TransportMessage<SaleClear>();
transport.MessageType = MessageType.ProxySaleClear;
transport.Data = saleClear;
MqttUtils.Instance.Publish(JsonUtils.Serialize(transport));
logger.Info("发布变动到消息中心<{0} - {1} = {2}>", saleClear.TotalQuantity, saleClear.SaleQuantity, saleClear.Quantity);
}
catch (Exception ex)
{
isSuccess = false;
logger.Error(ex, "本机保存沽清异常");
}
return isSuccess;
}
public bool SaveOrUpdateNoChanged(SaleClear saleClear)
{
bool isSuccess = true;
this._maps.SaveOrUpdateNoChanged(saleClear.ProductId, saleClear);
if (isSuccess)
{
//发送沽清变动通知
MsgEvent.Send(Constant.SALE_CLEAR_CHANGED_NOTIFY, saleClear);
}
return isSuccess;
}
public ObservableDictionary<string, SaleClear> Maps
{
get
{
return this._maps;
}
}
}
}