using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Models.Const; using Models.Models; using SamplePre.Common; using SamplePre.Models; using SamplePre.Models.Ext; using SamplePre.Models.Models; using SamplePre.ProcessBll.BLL; using SamplePre.ProcessBll.SampleSequence; using SamplePre.UIWpf.ParamManager.chirld; using SamplePre.UIWpf.SampleManager.chirld; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; using System.Windows; using static MaterialDesignThemes.Wpf.Theme.ToolBar; namespace SamplePreSystem.UI.ViewModel.SampleManager { public partial class SampleExecViewModel : ObservableObject { SampleSequenceBll sampleSequenceBll = new SampleSequenceBll(); CommunicationBll communicationBll = new CommunicationBll(); MonitorBll monitorBll = new MonitorBll(); // 关闭窗口的委托 public Action CloseAction { get; set; } public SampleExecViewModel() { } private tube_input _tubeInput = new tube_input(); /// /// 样品录入实体 /// public tube_input TubeInput { get { return _tubeInput; } set { SetProperty(ref _tubeInput, value); } } private List _sampleTypeDict; /// /// 样品类型字典 /// public List SampleTypeDict { get { return _sampleTypeDict; } set { SetProperty(ref _sampleTypeDict, value); } } /// /// 初始化绑定下拉框数据 /// public void InitComboxData() { //绑定样本类型 SampleTypeDict = SystemConst.dictDatas.Where(p => p.class_id == 3).ToList(); //二维码样本序号 string strdate = DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString("00") + DateTime.Now.Day.ToString("00"); TubeInput.qrcode = strdate + GetQrcode(); } private List _standardList = new List(); /// /// 执行标准列表 /// public List StandardList { get { return _standardList; } set { SetProperty(ref _standardList, value); } } private sys_standard _selectStandard; /// /// 选中的标准 /// public sys_standard SelectStandard { get { return _selectStandard; } set { SetProperty(ref _selectStandard, value); } } private sys_dict _selectSampleType; public sys_dict SelectSampleType { get { return _selectSampleType; } set { SetProperty(ref _selectSampleType, value); //绑定标准 BangdingComboxStandard(); } } /// /// 绑定执行标准下拉框 /// public void BangdingComboxStandard() { if (SelectSampleType == null) return; StandardList.Clear(); List templist = new List(); var standardList_temp = sampleSequenceBll.QuerySysStandards(SelectSampleType.id); foreach(var item in standardList_temp) { sys_standard_ext ext = new sys_standard_ext(); ext.id = item.id; ext.IsSelected = false; ext.standard_name = item.standard_name; ext.sample_id = item.sample_id; templist.Add(ext); } StandardList = templist; } /// /// 二维码编号 /// /// public string GetQrcode() { //string qrcode = dbHepler.QueryQrcode(); string qrcode = sampleSequenceBll.QueryQrcode(); if (string.IsNullOrEmpty(qrcode)) { MessageBox.Show("二维码编号获取失败!"); } return qrcode; } private List _tubeInputs = new List(); public List TubeInputs { get { return _tubeInputs; } set { SetProperty(ref _tubeInputs, value); } } /// /// 获取样品批次 /// /// public string GetBathNo() { //批次号 string bachNo = ""; if (TubeInputs == null || TubeInputs.Count <= 0) { //产生新的批次 bachNo = DateTime.Now.ToString("yyyyMMddHHmmss"); } else { bachNo = TubeInputs[0].bach_no; } //设置新的批次 TubeInput.bach_no = bachNo; return bachNo; } /// /// 保存样品 /// public bool SaveSample() { List tempList = new List(); ////二维码序号 int sqno = int.Parse(TubeInput.qrcode.Substring(8));// int.Parse(txtSampleSeqno2.Text); string strDate = TubeInput.qrcode.Substring(0, 8); for (int i = 0; i < TubeInput.tube_count; i++) { tube_input qRcode = new tube_input(); qRcode.qrcode = strDate + sqno.ToString(); //TubeInput.qrcode; qRcode.item_name = TubeInput.item_name; //qRcode.seqno = txtSampleSeqno.Text + txtSampleSeqno2.Text; //执行标准 //ComboBoxListItem item1 = SelectStandard.//cmbStrand.SelectedItem as ComboBoxListItem; List ids = new List(); List standNames = new List(); foreach (var item in StandardList) { if(item.IsSelected) { ids.Add(item.id); standNames.Add(item.standard_name); } } qRcode.standrad_id = string.Join(",", ids.ToArray()); qRcode.standrad = string.Join(",", standNames.ToArray()); qRcode.input_user = TubeInput.input_user; qRcode.input_date = DateTime.Now; //试管类型 //ComboBoxListItem item = cmbTubeType.SelectedItem as ComboBoxListItem; qRcode.bach_no = TubeInput.bach_no; //qRcode.weight = textBox5.Text; qRcode.tube_count = TubeInput.tube_count; //int.Parse(txtCount.Text); //保持数据库 sys_dict sys_Dict = new sys_dict(); //int sqno = int.Parse(txtSampleSeqno2.Text); sys_Dict.data_value = sqno.ToString(); sqno++; //放入list tempList.Add(qRcode); //保存数据,更新二维码编号 if (sampleSequenceBll.SaveDataAndQrcode(qRcode, sys_Dict) <= 0) { MessageBox.Show("保存失败!"); return false; } } //MessageBox.Show("保存成功!"); //合并已有数据 tempList.AddRange(TubeInputs); //通知更新 TubeInputs = tempList; return true; //this.DialogResult = DialogResult.OK; } private tube_input _selectSample; /// /// 选中的样品 /// public tube_input SelectSample { get { return _selectSample; } set { SetProperty(ref _selectSample, value); } } /// /// 删除样品 /// public void DeleSelectSample() { tube_input[] tube_Inputs = new tube_input[TubeInputs.Count]; TubeInputs.CopyTo(tube_Inputs); if (SelectSample != null) { if (MessageBox.Show($"确定删除:{SelectSample.qrcode}", "提示", MessageBoxButton.OKCancel) == MessageBoxResult.OK) { sampleSequenceBll.DelTubeInputByCode(SelectSample.qrcode); var tubes = tube_Inputs.ToList(); tubes.Remove(SelectSample); TubeInputs = tubes; } } } private List _cmdList = new List(); public List CmdList { get { return _cmdList; } set { SetProperty(ref _cmdList, value); } } /// /// 创建指令集合 /// public void CreateCmdList() { List temp_CmdList = new List(); //this.tubes = gridSamples.DataSource as List; var groups = TubeInputs.GroupBy(p => new { p.standrad_id, p.standrad }); foreach (var g in groups) { sample_exec_ext sampleCmdExec = new sample_exec_ext(); sampleCmdExec.id = Guid.NewGuid().ToString(); sampleCmdExec.standrad_id = g.Key.standrad_id; sampleCmdExec.standradName = g.Key.standrad; List details = new List(); foreach (var item in g) { sampleCmdExec.sample_count++; sampleCmdExec.qrcodes += item.qrcode + "|"; sample_exec_detail sample_Exec_Detail = new sample_exec_detail(); details.Add(new sample_exec_detail() { master_id = sampleCmdExec.id, qrcode = item.qrcode }); } sampleCmdExec.sampleExecDetails = details; sampleCmdExec.exec_state = "未执行"; temp_CmdList.Add(sampleCmdExec); } CmdList = temp_CmdList; //BadingSopData(cmds); } private sample_exec_ext _selectItemCmd; public sample_exec_ext SelectItemCmd { get { return _selectItemCmd; } set { SetProperty(ref _selectItemCmd,value); } } List sopList = new List(); /// /// 初始化指令集合 /// public void InitCmdData() { actionParmList.Clear(); sopList.Clear(); if (SelectItemCmd.standrad_id.Contains(",")) { string[] standradIds = SelectItemCmd.standrad_id.Split(','); sopList.AddRange(standradIds); foreach (var id in standradIds) { CreateData(id); } } else { sopList.Add(SelectItemCmd.standrad_id); CreateData(SelectItemCmd.standrad_id); } } public void CreateData(string standrad_id) { //查询标准下的动作 var standardActions = sampleSequenceBll.GetStrandActionByStrandId(standrad_id); //动作排序 standardActions = standardActions.OrderBy(p => p.process_no).ToList(); ; //查询动作参数 var sys_standard_process_parms = sampleSequenceBll.GetStrandActionParamByStrandId(standrad_id); if (sys_standard_process_parms.Count <= 0) { MessageBox.Show("没有流程数据!"); return; } GetData(standardActions, sys_standard_process_parms); } public void GetData(List actions, List standardProcessParmList) { foreach (var actionItem in actions) { //判断是否有重复的【进样】动作 if (actionItem.action_name == "进样" && actionParmList.Find(p => p.action_name == "进样") != null) { continue; //跳过 } //查询动作下的参数配置 var paramData = standardProcessParmList.Where(p => p.action_id == actionItem.process_id && p.action_seqno == actionItem.process_no).ToList(); if (paramData.Count <= 0) { sys_standard_action_parm_ext temp = new sys_standard_action_parm_ext(); temp.action_name = actionItem.action_name; temp.action_seqno = actionItem.process_no; temp.title = "无"; actionParmList.Add(temp); continue; } actionParmList.AddRange(paramData); } } private List actionParmList = new List(); public List ActionParmList { get { return actionParmList; } set { SetProperty(ref actionParmList, value); } } string sopStr = ""; public void CmdDo() { if (!CmdExec()) return; //保存下发记录 SelectItemCmd.exec_state = "执行中"; SelectItemCmd.cmd_content = sopStr; SelectItemCmd.exec_date = DateTime.Now; MessageBox.Show("下发成功!"); //保存主表 sampleSequenceBll.SaveCmdExec(SelectItemCmd); } /// /// 发送测试指令 /// /// /// private bool CmdExec() { //查询所有动作 List sysAction = sampleSequenceBll.QuerySysAction(); ////查询所有参数,及修改 List standardProcessParms = actionParmList;// GetEditVal(); if (standardProcessParms == null) { //MessageBox.Show("指令生成错误!"); return false; } sopStr = ""; //S7协议 List sop = sampleSequenceBll.CreateCmdBytes(sysAction, sopList, standardProcessParms); ////modbus协议 //List sop = this.sampleSequenceBll.CreateCmdUshorts(sysAction, standardActions, standardProcessParms); if (sop == null) { MessageBox.Show("指令生成错误!"); return false; } sopStr = string.Join("-", sop.ToArray()); //写入PLC bool val = communicationBll.WritePlcData(100, 0, sop.ToArray()); //bool val = monitorBll.WritePlcData(1, 0, sop.ToArray()); return val; } /// /// 总复位 /// [RelayCommand] public void InitPlcState() { Task.Run(() => { for (int i = 0; i < 3; i++) { int a = i+1; communicationBll.WriteSingleData("DB19.DBX0.0", true); Task.Delay(1000).Wait(); LoggerHelper.Logger.Error("发生复位指令"); } }); } ///// ///// 导入样品 ///// ///// //public void ImportSamples(List list) //{ // TubeInputs = list; //} /// /// 新增样品 /// [RelayCommand] public void BtnAddSampleClick() { GetBathNo(); InitComboxData(); NewSampleWindow frm = new NewSampleWindow(this); frm.ShowDialog(); } /// /// 删除样品 /// [RelayCommand] public void BtnDelSampleClick() { DeleSelectSample(); } /// /// 导入样品 /// [RelayCommand] public void BtnImportSampleClick() { ImportSampleWindow frm = new ImportSampleWindow(this); if (frm.ShowDialog() == true) { //ImportSamples(frm.samples); } } /// /// 创建指令 /// [RelayCommand] public void BtnCreateCmdClick() { CreateCmdList(); } /// /// 打开命令下发 /// [RelayCommand] public void RowDoubleClick() { ActionShowWindow frm = new ActionShowWindow(this); frm.ShowDialog(); } /// /// 命令下发 /// [RelayCommand] public void CmdDoClick() { CmdDo(); } /// /// 保存样本 /// [RelayCommand] public void BtnOKClick() { if (SaveSample()) { this.CloseAction?.Invoke(true); } } } }