using DataDAL; using DataDAL.DBContext; using Models.Models; using SamplePre.Common; using SamplePre.DAL; using SamplePre.DAL.DBContext; using SamplePre.Models.Ext; using SamplePre.Models.Models; using System; using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Data.Odbc; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SamplePre.ProcessBll.SampleSequence { /// /// 样本序列管理业务逻辑 /// public class SampleSequenceBll { SampleSequenceDal sampleSequenceDal = new SampleSequenceDal(); SOPDal sopDal = new SOPDal(); public List GetSampleType() { List data = DBFactory.Instance.Queryable().Where(p => p.class_id == 3).ToList(); return data; } /// /// 获取标准动作参数 /// /// /// public List GetStrandActionParamByStrandId(string standId) { var result = DBFactory.Instance.Queryable() .LeftJoin((a, b) => a.action_id == b.id) .LeftJoin((a, b, c) => a.parm_id == c.id) .LeftJoin((a, b, c,d) => a.standard_id == d.id) .Where((a, b, c, d) => a.standard_id == standId) .OrderBy((a, b, c, d) => a.action_seqno) .Select((a, b, c, d) => new sys_standard_action_parm_ext { id = a.id, standard_id = a.standard_id, action_id = a.action_id, action_seqno = a.action_seqno, parm_id = a.parm_id, parm_seqno = a.parm_seqno, standard_process_id = a.standard_process_id, data_value = a.data_value, action_name = b.action_name, title = c.title, unit = c.unit, data_type = c.data_type, plc_type = c.plc_type, actionAndseqno = $"{d.standard_name}: {a.action_seqno}{b.action_name}" }) .ToList(); //List datas = sopDal.GetStrandActionParamByStrandId(standId); return result; } public List QuerySysAction() { var result = DBFactory.Instance.Queryable() .LeftJoin((a, s) => a.action_unit == s.id) .Where((a, s) => s.class_id == 2) .Select((a, s) => new sys_action_ext { id = a.id, action_name = a.action_name, action_unit = a.action_unit, action_adress = a.action_adress, plc_type = a.plc_type, remark = a.remark, action_unitname = s.data_value }) .ToList(); //List sysActions = standardDal.QuerySysAction(); return result; } public int DelTubeInputByCode(string code) { int val = DBFactory.Instance.Deleteable().Where(p => p.qrcode == code).ExecuteCommand(); return val; } /// /// 保存下发命令记录 /// /// /// public int SaveCmdExec(sample_exec_ext cmdExec) { var _db = DBFactory.Instance; try { _db.BeginTran(); //主记录 int val = _db.Insertable(cmdExec).ExecuteCommand(); //明细 int val2 = _db.Insertable(cmdExec.sampleExecDetails).ExecuteCommand(); _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); LoggerHelper.Logger.Error(ex.Message); return -1; } return 1; } public List QuerySysStandards(string sampleId) { List data = DBFactory.Instance.Queryable().Where(p => p.sample_id == sampleId).ToList(); return data; } public string QueryQrcode() { string qrcode = ""; List data = DBFactory.Instance.Queryable().Where(p => p.class_id == 1).ToList(); if (data.Count > 0) { qrcode = (int.Parse(data[0].data_value) + 1).ToString("0000"); } return qrcode; } public int SaveDataAndQrcode(tube_input qRcode, sys_dict sys_Dict) { var _db = DBFactory.Instance; try { _db.BeginTran(); //保存样品记录 _db.Insertable(qRcode).ExecuteCommand(); //更新二维码 int val = _db.Updateable() .SetColumns(p => new sys_dict() { data_value = sys_Dict.data_value }) .Where(p => p.class_id == 1) .ExecuteCommand(); _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); LoggerHelper.Logger.Error(ex.Message); return -1; } return 1; } public List GetTubeData(DateTime dt1, DateTime dt2) { List data = DBFactory.Instance.Queryable().Where(p => p.input_date >= dt1 && p.input_date <= dt2).ToList(); return data;; } /// /// 生成指令字节数组byte /// /// /// /// public List CreateCmdBytes(List sysAction, List sopIds, List standardProcessParms) { string cmdReamrk = ""; List sop = new List(); try { //起始位 sop.Insert(0, 0xCC); cmdReamrk += $"【0 开始:{sop[0]}】 "; //插入总字节数-占位 sop.Insert(1, 0); //cmdReamrk += $"【1 总字节数:{Convert.ToByte(seq + 1)}】 "; //插入总动作数 sop.Insert(2, 0); //cmdReamrk += $"【2 总动作数:0】 "; int seq = 3; //总动作数 int actionCount = 0; //=============== foreach (string standrad_id in sopIds) { //查询标准下的动作 var standardActions = GetStrandActionByStrandId(standrad_id); //动作排序 standardActions = standardActions.OrderBy(p => p.process_no).ToList(); actionCount += standardActions.Count(); foreach (var actionItem in standardActions) { //int start = seq; //记录起始位置 //转换PLC映射名称 string action_plc = sysAction.FirstOrDefault(p => p.id == actionItem.process_id)?.plc_type; //动作类型(如:离心) byte action_byte = Convert.ToByte(action_plc); sop.Insert(seq, action_byte); cmdReamrk += $"【{seq} 动作:{sop[seq]}】 "; seq++; //查询动作下的参数 var paramData = standardProcessParms.Where(p => p.action_id == actionItem.process_id && p.action_seqno == actionItem.process_no && p.standard_id == standrad_id).ToList(); //插入动作字节长度 int actionLenth = (int)(paramData.Count() * 5 + 2); sop.Insert(seq, (byte)actionLenth); cmdReamrk += $"【{seq} 动作字节长度:{sop[seq]}】 "; seq++; foreach (var item in paramData) { //转换plc参数类型 string param_plc = item.plc_type;//parms.FirstOrDefault(p => p.title == item.title).plc_type; //参数类型(如:时间) byte parm_byte = Convert.ToByte(param_plc); sop.Insert(seq, parm_byte); cmdReamrk += $"【{seq} 参数类型:{sop[seq]}】 "; seq++; sys_standard_action_parm_ext actionParm = standardProcessParms.FirstOrDefault(p => p.title == item.title); string param_val = actionParm.data_value; if (actionParm.unit.ToUpper() == "ML") //都转换成最小单位ul { param_val = (float.Parse(param_val) * 1000).ToString(); } //参数值 float paramval = 0; paramval = float.Parse(param_val); cmdReamrk += $"【{seq} 参数值float:{paramval}】 "; byte[] paramval_bytes = BitConverter.GetBytes(paramval); sop.Insert(seq, paramval_bytes[0]); cmdReamrk += $"【{seq} 参数值byte:{sop[seq]}-"; seq++; sop.Insert(seq, paramval_bytes[1]); cmdReamrk += $"{sop[seq]}-"; seq++; sop.Insert(seq, paramval_bytes[2]); cmdReamrk += $"{sop[seq]}-"; seq++; sop.Insert(seq, paramval_bytes[3]); cmdReamrk += $"{sop[seq]}】 "; seq++; } } } //================= //结束 sop.Insert(seq, 0xEE); cmdReamrk += $"【{seq} 结束:{sop[seq]}-"; seq++; sop.Insert(seq, 0xEE); cmdReamrk += $"{sop[seq]}】 "; seq++; //修改总字节数 sop[1] = (byte)sop.Count; cmdReamrk += $"【1 总字节数:{sop[1]}】 "; //修改总动作数据 sop[2] = (byte)actionCount; cmdReamrk += $"【2 总动作数:{sop[2]}】 "; LoggerHelper.Logger.Info($"{cmdReamrk}"); return sop; } catch (Exception ex) { LoggerHelper.Logger.Error(ex.StackTrace); return null; } } /// /// 生成指令字节数组ushort /// /// /// /// public List CreateCmdUshorts(List sysAction, List standardActions, List standardProcessParms) { string cmdReamrk = ""; List sop = new List(); try { //起始位 sop.Insert(0, 0xCC); cmdReamrk += $"【0 开始:{sop[0]}】 "; //插入总字节数 sop.Insert(1, 0); //cmdReamrk += $"【1 总字节数:{0}】 "; //插入总动作数 sop.Insert(2, Convert.ToByte(standardActions.Count())); cmdReamrk += $"【2 总动作数:{Convert.ToByte(standardActions.Count())}】 "; int seq = 3; foreach (var actionItem in standardActions) { int start = seq; //记录起始位置 //转换PLC映射名称 string action_plc = sysAction.FirstOrDefault(p => p.id == actionItem.process_id)?.plc_type; //动作类型(如:离心) ushort action_byte = Convert.ToUInt16(action_plc); sop.Insert(seq, action_byte); cmdReamrk += $"【{seq} 动作:{sop[seq]}】 "; seq++; //查询动作下的参数 var paramData = standardProcessParms.Where(p => p.action_id == actionItem.process_id && p.action_seqno == actionItem.process_no).ToList(); //插入动作寄存器长度 int actionLenth = (int)(paramData.Count() * 3 + 2); sop.Insert(seq, (byte)actionLenth); cmdReamrk += $"【{seq} 动作长度:{sop[seq]}】 "; seq++; foreach (var item in paramData) { //转换plc参数类型 string param_plc = item.plc_type;//parms.FirstOrDefault(p => p.title == item.title).plc_type; //参数类型(如:时间) ushort parm_byte = Convert.ToUInt16(param_plc); sop.Insert(seq, parm_byte); cmdReamrk += $"【{seq} 参数类型:{sop[seq]}】 "; seq++; sys_standard_action_parm_ext actionParm = standardProcessParms.FirstOrDefault(p => p.title == item.title); string param_val = actionParm.data_value; if (actionParm.unit.ToUpper() == "ML") //都转换成最小单位ul { param_val = (float.Parse(param_val) * 1000).ToString(); } //参数值 float paramval = 0; paramval = float.Parse(param_val); cmdReamrk += $"【{seq} 参数值float:{paramval}】 "; //===float转ushort数组 byte[] bytes = BitConverter.GetBytes(paramval); var a = BitConverter.ToUInt16(new byte[] { bytes[0], bytes[1] }, 0); var b = BitConverter.ToUInt16(new byte[] { bytes[2], bytes[3] }, 0); ushort[] ushorts = { b, a }; sop.Insert(seq, ushorts[0]); cmdReamrk += $"【{seq} 参数值ushort:{sop[seq]}-"; seq++; sop.Insert(seq, ushorts[1]); cmdReamrk += $"{sop[seq]}】 "; seq++; //============ } } //结束 sop.Insert(seq, 0xEE); cmdReamrk += $"【{seq} 结束:{sop[seq]}-"; seq++; sop.Insert(seq, 0xEE); cmdReamrk += $"{sop[seq]}】 "; seq++; //修改总寄存器数量 sop[1] = (ushort)sop.Count; cmdReamrk += $"【1 总寄存器数:{sop[1]}】 "; LoggerHelper.Logger.Info($"{cmdReamrk}"); return sop; } catch (Exception ex) { LoggerHelper.Logger.Error(ex.StackTrace); return null; } } public List GetSampleExecDetails() { var result = DBFactory.Instance.Queryable() .LeftJoin((a, b) => a.master_id == b.id) .LeftJoin((a, b, c) => a.qrcode == c.qrcode) .Where((a, b, c) => b.exec_state == "执行中") .Select((a, b, c) => new sample_exec_detail_ext { id = a.id, master_id = a.master_id, qrcode = a.qrcode, exec_state = b.exec_state, item_name= c.item_name, standrad_id = c.standrad_id, standrad = c.standrad, input_date = c.input_date, input_user = c.input_user }) .ToList(); return result;// sampleSequenceDal.GetSampleExecDetails(); } public List QueryTubeInputByBachNo(string bachNo) { return DBFactory.Instance.Queryable().Where(p => p.bach_no == bachNo).ToList(); } public List GetStrandActionByStrandId(string standrad_id) { List data = DBFactory.Instance.Queryable() .LeftJoin((a, b) => a.process_id == b.id) .Where((a, b) => a.standard_id == standrad_id) .Select((a, b) => new sys_standard_action_ext { id = a.id, standard_id = a.standard_id, process_id = a.process_id, process_no = a.process_no, action_name = b.action_name, remark = b.remark }) .ToList(); return data; } } }