using Tiger.Model; using SqlSugar; using System; using System.Collections.Generic; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; using Rhea.Common; using System.Net; using System.Linq; using Newtonsoft.Json; using Tiger.IBusiness; using Tiger.Model.Entitys.MES.Position; using Tiger.Business.MES.Transaction; namespace Tiger.Business { /// /// 工步 /// public partial class WorkStep : IWorkStep { public WorkStep(IWorkStep.NodeTypes type, IPosition position) { NodeType = type; CurPosition = position; } #region Propertys & Variables public string ID { get; set; } = Guid.NewGuid().ToString("N"); public string Name { get; set; } private DateTime BeginAt; private DateTime EndAt; public TimeSpan ElapsedTime => EndAt - BeginAt; public IWorkStep.NodeTypes NodeType { get; set; } public MES_WO_NODE Node { get; set; } public MES_WO_OPER OperSetting { get; set; } public MES_WO_NODE_ACT NodeAct { get; set; } public MES_WO_ACTION ActSetting { get; set; } public IPosition CurPosition { get; set; } public IWorkAction CurAction { get; set; } public Dictionary ActionDic { get; set; } = new(); public int Sequence { get; set; } public List PrepNodeIDs { get; set; } = new(); public string NodeID => NodeType == IWorkStep.NodeTypes.Action ? NodeAct.ID : Node.ID; private bool _IsActive = true; public bool IsActive { get => NodeType == IWorkStep.NodeTypes.Action ? ActSetting.IS_ACTIVE == "Y" : _IsActive; set { _IsActive = value; } } private bool _IsFinished = false; public bool IsFinished { get => NodeType == IWorkStep.NodeTypes.Action ? CurAction.IsFinished : _IsFinished; set { _IsFinished = value; } } public StepStatus Status { get; set; } = StepStatus.Normal; //public bool IsFinished => Status == StepStatus.Finished; private Locale _Message; public Locale Message { get => _Message; set { _MsgHistory.Add(_Message = value); } } private List _MsgHistory = new(); public List MsgHistory => _MsgHistory; public Action DBSubmitAction { get; set; } = () => { }; #endregion #region Functions /// /// 初始化工步 /// /// public void Init() { CurAction = DI.Resolve(NodeAct.Definition.SERVICE_TYPE) as IWorkAction; //CurAction = DI.Resolve("Tiger.IBusiness.IPrintLabel,Tiger.IBusiness") as IWorkAction; //设置行为字典 ActionDic = NodeAct.Variables.ToDictionary(k => k.VAR_CODE, v => v.DEFAULT); CurAction.Init(this, CurPosition, NodeAct, ActSetting); } /// /// 尝试开始执行工步 /// /// public ApiAction TryBegin(SubmitInput input) { BeginAt = DateTime.Now; //工步行为启用则正常执行 if (IsActive) { UpdateActionDic(input.ActionDic); return ResetActionDic(CurAction.TryBegin(input)); } //工步行为不启用,否则工步默认完成 else { CurAction.IsFinished = true; var action = new ApiAction(new SubmitOutput()); this.Message = Biz.L($"行为未启用"); this.Status = StepStatus.InActive; action.Data.ShortMsg = new($"行为未启用", ShortMessage.Types.Success); //action.LocaleMsg = new($"{0}行为未启用"); action.LocaleMsg = new("MES.WorkAction.NotActive", NodeAct.ACT_NAME); return action; } } /// /// 获取行为开始的提示信息 /// /// public Locale GetBeginMsg() { return CurAction.GetBeginMsg(); } /// /// 工步提交数据 /// /// /// public ApiAction Submit(SubmitInput input) { UpdateActionDic(input.ActionDic); return ResetActionDic(CurAction.Submit(input)); } /// /// 结束工步执行 /// /// public ApiAction End(SubmitInput input) { UpdateActionDic(input.ActionDic); var result = CurAction.End(input); EndAt = DateTime.Now; return ResetActionDic(result); } /// /// 获取工步当前耗时 /// /// public void UpdateActionDic(Dictionary newDic) { foreach (var item in newDic ?? new()) { if (ActionDic.ContainsKey(item.Key)) { ActionDic[item.Key] = item.Value; } else { ActionDic.Add(item.Key, item.Value); } } } /// /// 获取工步当前耗时 /// /// public ApiAction ResetActionDic(ApiAction output) { output.Data.ActionDic = ActionDic; return output; } /// /// 获取工步当前耗时 /// /// public TimeSpan GetElapsedTime() { return DateTime.Now - BeginAt; } /// /// 设置工步状态和消息 /// /// public void SetStatusMessage(StepStatus status, Locale msg) { Message = msg; Status = status; } /// /// 获取当前工步的信息 /// /// public WorkStepInfo GetInfo(string locale) { return new WorkStepInfo() { ID = ID, Name = Name, Sequence = Sequence, NodeID = NodeID, NodeType = NodeType.ToString(), Node = Node, OperSetting = OperSetting, NodeAct = NodeAct, ActSetting = ActSetting, Status = Status.ToString(), Message = Message.IsNullOrEmpty() ? "" : Biz.T(Message, locale), }; } #endregion } }