123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815 |
- using System;
- using System.Collections.Generic;
- using System.Data;
- using System.Linq;
- using System.Text;
- using NPOI.Util;
- using Newtonsoft.Json;
- using System.Threading.Tasks;
- using MainForm.ClassFile.XiaomiAPI;
- using MainForm.ClassFile.XiaomiAPI_MES;
- using static MainForm.ClassFile.XiaomiAPI.XiaomiMqttClient_Extend;
- using static MainForm.ClassFile.XiaomiAPI_MES.XiaomiMESHttp_StationInbound;
- using static MainForm.ClassFile.XiaomiAPI_MES.XiaomiMESHttp_StationOutbound;
- namespace MainForm
- {
- /// <summary>
- /// Form_Home类 - 保存数据
- /// 简单拆分Form_Home类
- /// </summary>
- public partial class Form_Home
- {
- #region 保存数据
- #region 进站数据
- /// <summary>
- /// 调用进站接口并保存进站数据
- /// </summary>
- /// <param name="stationNameStr">工站信息</param>
- /// <param name="workorder_code">工单号</param>
- /// <param name="mtltmrk">型号(物料号)</param>
- /// <param name="sn">产品SN</param>
- /// <param name="items">进站数据</param>
- /// <returns>1成功;5MES报警;6上位机报警</returns>
- public int SaveStationInData(string stationNameStr, string workorder_code, string mtltmrk, string sn, List<TestItem> items,out string msg)
- {
- int result = 0;
- msg = "";
- XmMES_StationInRequest_Body inRequest_Body = new XmMES_StationInRequest_Body();
- switch (stationNameStr)
- {
- case "[S1]Tray盘上料装备":
- inRequest_Body.machineId = GlobalContext.S1_MachineId; // 装备ID(可配置)
- inRequest_Body.stationId = GlobalContext.S1_StationId; // ⼯位ID(可配置)
- break;
- case "[S2]FCT":
- inRequest_Body.machineId = GlobalContext.S2_MachineId; // 装备ID(可配置)
- inRequest_Body.stationId = GlobalContext.S2_StationId; // ⼯位ID(可配置)
- break;
- case "[S3]值板机":
- inRequest_Body.machineId = GlobalContext.S3_MachineId; // 装备ID(可配置)
- inRequest_Body.stationId = GlobalContext.S3_StationId; // ⼯位ID(可配置)
- break;
- case "[S4_1]载具下线装备":
- inRequest_Body.machineId = GlobalContext.S4_MachineId; // 装备ID(可配置)
- inRequest_Body.stationId = GlobalContext.S4_StationId; // ⼯位ID(可配置)
- break;
- case "[S4_3]提升机1":
- //inRequest_Body.machineId = GlobalContext.S5_1_MachineId; // 装备ID(可配置)
- //inRequest_Body.stationId = GlobalContext.S5_1_StationId; // ⼯位ID(可配置)
- break;
- case "[S4_4]提升机2":
- //inRequest_Body.machineId = GlobalContext.S5_2_MachineId; // 装备ID(可配置)
- //inRequest_Body.stationId = GlobalContext.S5_2_StationId; // ⼯位ID(可配置)
- break;
- case "[S4_5]载具上线装备":
- inRequest_Body.machineId = GlobalContext.S6_MachineId; // 装备ID(可配置)
- inRequest_Body.stationId = GlobalContext.S6_StationId; // ⼯位ID(可配置)
- break;
- case "[S5]Tray盘下料装备":
- inRequest_Body.machineId = GlobalContext.S7_MachineId; // 装备ID(可配置)
- inRequest_Body.stationId = GlobalContext.S7_StationId; // ⼯位ID(可配置)
- break;
- default:
- break;
- }
- inRequest_Body.clientMac = GlobalContext.MacStr; // 客⼾端本机MAC地址,格式:XX-XX-XX-XX-XX-XX
- inRequest_Body.clientTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); // 客⼾端请求时间,格式yyyy-MM-dd HH:mm:ss.fff
- inRequest_Body.unitSn = sn; // 产品SN
- inRequest_Body.userId = GlobalContext.MESUserId; // 用户ID;非必填
- inRequest_Body.factoryId = GlobalContext.Factory_Code; // 工厂ID;非必填
- string json_Body = JsonConvert.SerializeObject(inRequest_Body);
- StationIn stationIn = new StationIn()
- {
- Workorder_code = workorder_code, // 车间订单号
- Mtltmrk = mtltmrk, // 产品型号(物料号)
- Sn = sn, // SN
- StationIn_body = json_Body, // 进站接口Json数据 - Body
- Parameter_values = items, // 进站数据
- Write_user = inRequest_Body.userId, // 员工Id
- Test_time = inRequest_Body.clientTime // 进站时间
- };
- // 本地数据
- string sql = stationIn.ToStringInsert(0);
- string ret = SQLHelper_New.ExecuteNonQuery(sql, null);
- result = ret == "成功" ? 1 : 6;
- msg = ret;
- AddMessage_Station(stationNameStr, LogType.Info, string.Concat(stationNameStr, "_保存本地进站数据---" + ret));
- //await Task.Delay(200);
- // 上传MES
- if (result == 1 && GlobalContext.IsSendStationIn)
- {
- try
- {
- XmMES_StationInResponse response = new XmMES_StationInResponse();
- string mesRet = string.Empty;
- int i = 0;
- while (i < 2) // 1009会多次尝试上传
- {
- response = XiaomiMESHttp_StationInbound.StationIn(inRequest_Body);
- if (response != null && response.header.code == "200")
- break;
- else if (response != null && response.header.code != "503") // 503是服务器报错
- i++;
- i++;
- mesRet = $"[{response?.header?.code}]{response?.header?.desc}";
- // 记录失败原因
- OnMessage(LogType.Error, "上传出站数据到MES服务器---失败!正在重新上传!接口报错信息:" + mesRet + "参数:" + json_Body);
- }
- AddMessage_Station(stationNameStr, LogType.Info, stationNameStr + "_上传进站数据到MES服务器---" + mesRet);
- if (response?.header?.code == "200")
- {
- string sql_Upd = stationIn.ToStringUpdateStatusByID(1);
- string ret_Upd = SQLHelper_New.ExecuteNonQuery(sql_Upd, null);
- result = ret_Upd == "成功" ? result : 6;
- msg = ret_Upd == "成功" ? msg : "更新【进站数据 id {stationIn.GUID}】上传状态---失败";
- AddMessage_Station(stationNameStr, LogType.Info, $"更新【进站数据 id {stationIn.GUID}】上传状态---" + ret_Upd);
- }
- else
- {
- result = 5;
- msg = "上传进站数据到MES服务器---失败!接口报错信息:" + mesRet + "参数:" + json_Body;
- OnMessage(LogType.Error, "上传进站数据到MES服务器---失败!接口报错信息:" + mesRet + "参数:" + json_Body);
- }
- }
- catch (Exception ex)
- {
- result = 6;
- string str = ex.StackTrace;
- msg = $"PLC上传进站数据MES报错!错误信息:" + ex.Message.ToString() + ";异常位置:" + str.Substring(str.LastIndexOf("\\") + 1, str.Length - str.LastIndexOf("\\") - 1);
- AddMessage_Station(stationNameStr, LogType.Error, $"PLC上传进站数据MES报错!错误信息:" + ex.Message.ToString() + ";异常位置:" + str.Substring(str.LastIndexOf("\\") + 1, str.Length - str.LastIndexOf("\\") - 1));
- }
- }
- return result;
- }
- #endregion 进站数据
- #region 出站数据
- /// <summary>
- /// 选择如何记录出站数据
- /// </summary>
- /// <param name="stationNameStr">工站信息</param>
- /// <param name="items">出站数据</param>
- /// <param name="equipmentCode">设备编号</param>
- /// <param name="processItem">测试项目</param>
- /// <param name="workorder_code">车间订单号</param>
- /// <param name="mtltmrk">型号</param>
- /// <param name="sn">产品序列号的</param>
- /// <param name="pass">产品结果</param>
- /// <param name="vehicleSn">载具SN</param>
- /// <param name="vehicleSlot">载具穴号</param>
- /// <returns>上位机发送1代表OK;2代表上传客户MES失败;3代表上位机保存数据失败;4代表上位机报警;</returns>
- private int SwitctProcessData(string stationNameStr, List<TestItem> items, string equipmentCode, string processItem,
- string workorder_code, string mtltmrk, string sn, bool pass, string vehicleSn, string vehicleSlot)
- {
- //if (DataSwitch == 1)
- //{
- return SaveProcessDataByDB(stationNameStr, items, equipmentCode, processItem, workorder_code, mtltmrk,
- sn, pass, vehicleSn, vehicleSlot);
- //}
- //else // 旧代码,废弃
- //{
- // return SaveProcessData(items, equipmentCode, processItem, sn_Number);
- //}
- }
- /// <summary>
- /// 添加出站数据(提交到MES+本地保存到数据库)
- /// </summary>
- /// <param name="stationNameStr">工站信息</param>
- /// <param name="items">出站数据</param>
- /// <param name="equipmentCode">设备编号</param>
- /// <param name="processItem">测试项目</param>
- /// <param name="workorder_code">车间订单号</param>
- /// <param name="mtltmrk">型号</param>
- /// <param name="sn">产品序列号</param>
- /// <param name="pass">产品结果</param>
- /// <param name="vehicleSn">载具SN</param>
- /// <param name="vehicleSlot">载具穴号</param>
- /// <returns>上位机发送1代表OK;2代表上传客户MES失败;3代表上位机保存数据失败;4代表上位机报警;</returns>
- public int SaveProcessDataByDB(string stationNameStr, List<TestItem> items, string equipmentCode,
- string processItem, string workorder_code, string mtltmrk, string sn,
- bool pass, string vehicleSn, string vehicleSlot)
- {
- int mesUpload = 0; // 0未上传或上传失败;1上传成功;2忽略
- int iotUpload = 0; // 0未上传或上传失败;1上传成功;2忽略
- ProcessData processData = new ProcessData()
- {
- Equipment_code = equipmentCode,
- Testitem = processItem,
- Workorder_code = workorder_code,
- //Batch_number = batch_num,
- Sn = sn, // SN
- Parameter_values = items,
- Write_user = GlobalContext.CurrentUser,
- Test_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")
- };
- // 本地数据
- string sql = processData.ToStringInsert(mesUpload, iotUpload);
- string ret = SQLHelper_New.ExecuteNonQuery(sql, null);
- AddMessage_Station(stationNameStr, LogType.Info, string.Concat("[[", equipmentCode, "]", stationNameStr, "]保存本地出站数据---" + ret));
- if (ret != "成功")
- return 3; // 3代表上位机保存数据失败
- //await Task.Delay(200);
- // 上传MES
- string mesJson = string.Empty;
- if (GlobalContext.IsSendProcessData)
- {
- try
- {
- string id = processData.ID;
- XmMES_StationOutRequest_Body outRequest_Body = new XmMES_StationOutRequest_Body();
- switch (stationNameStr)
- {
- case "[S1]Tray盘上料装备":
- outRequest_Body.machineId = GlobalContext.S1_MachineId; // 装备ID(可配置)
- outRequest_Body.stationId = GlobalContext.S1_StationId; // ⼯位ID(可配置)
- break;
- case "[S2]FCT":
- outRequest_Body.machineId = GlobalContext.S2_MachineId; // 装备ID(可配置)
- outRequest_Body.stationId = GlobalContext.S2_StationId; // ⼯位ID(可配置)
- break;
- case "[S3]值板机":
- outRequest_Body.machineId = GlobalContext.S3_MachineId; // 装备ID(可配置)
- outRequest_Body.stationId = GlobalContext.S3_StationId; // ⼯位ID(可配置)
- break;
- case "[S4_1]载具下线装备":
- outRequest_Body.machineId = GlobalContext.S4_MachineId; // 装备ID(可配置)
- outRequest_Body.stationId = GlobalContext.S4_StationId; // ⼯位ID(可配置)
- break;
- case "[S4_3]提升机1":
- //outRequest_Body.machineId = GlobalContext.S5_1_MachineId; // 装备ID(可配置)
- //outRequest_Body.stationId = GlobalContext.S5_1_StationId; // ⼯位ID(可配置)
- break;
- case "[S4_4]提升机2":
- //outRequest_Body.machineId = GlobalContext.S5_2_MachineId; // 装备ID(可配置)
- //outRequest_Body.stationId = GlobalContext.S5_2_StationId; // ⼯位ID(可配置)
- break;
- case "[S4_5]载具上线装备":
- outRequest_Body.machineId = GlobalContext.S6_MachineId; // 装备ID(可配置)
- outRequest_Body.stationId = GlobalContext.S6_StationId; // ⼯位ID(可配置)
- break;
- case "[S5]Tray盘下料装备":
- outRequest_Body.machineId = GlobalContext.S7_MachineId; // 装备ID(可配置)
- outRequest_Body.stationId = GlobalContext.S7_StationId; // ⼯位ID(可配置)
- break;
- default:
- break;
- }
- outRequest_Body.clientMac = GlobalContext.MacStr; // 客⼾端本机MAC地址,格式:XX-XX-XX-XX-XX-XX
- outRequest_Body.clientTime = processData.Test_time; // 客⼾端请求时间,格式yyyy-MM-dd HH:mm:ss.fff
- outRequest_Body.unitSn = sn; // 产品SN
- outRequest_Body.state = pass ? "PASS" : "FAIL"; // 出站条件 PASS或FAIL
- outRequest_Body.userId = GlobalContext.MESUserId; // ⽤⼾ID;非必填
- outRequest_Body.factoryId = GlobalContext.Factory_Code; // ⼯⼚id;非必填
- //outRequest_Body.unitData.vehicleData.Add(
- // new XmMES_StationOutRequest_Body.XmStationOut_VehicleData()
- // {
- // vehicleSn = vehicleSn,
- // vehicleType = string.Empty,
- // slot = vehicleSlot
- // }); // 设备数据 - 载具信息
- mesJson = JsonConvert.SerializeObject(outRequest_Body);
- XmMES_StationOutResponse response = new XmMES_StationOutResponse();
- string mesRet = string.Empty;
- int i = 0;
- while (i < 2) // 404等会多次尝试上传
- {
- response = XiaomiMESHttp_StationOutbound.StationOut(outRequest_Body);
- if (response != null && response.header.code == "200")
- break;
- else if (response != null && response.header.code != "503") // 503是服务器报错
- i++;
- i++;
- mesRet = $"[{response?.header?.code}]{response?.header?.desc}";
- // 记录失败原因
- OnMessage(LogType.Error, "上传出站数据到MES服务器---失败!正在重新上传!接口报错信息:" + mesRet + "参数:" + mesJson);
- }
- AddMessage_Station(stationNameStr, LogType.Info, "[" + processItem + "]上传出站数据到MES服务器---" + mesRet);
- if (response != null && response.header.code == "200")
- mesUpload = 1;
- else
- mesUpload = 0;
- }
- catch (Exception ex)
- {
- mesUpload = 0;
- string str = ex.StackTrace;
- AddMessage_Station(stationNameStr, LogType.Error, $"PLC上传出站数据MES报错!错误信息:" + ex.Message.ToString() + ";异常位置:" + str.Substring(str.LastIndexOf("\\") + 1, str.Length - str.LastIndexOf("\\") - 1));
- }
- }
- else
- mesUpload = 2;
- // 上传IOT
- string iotJson = string.Empty;
- if (GlobalContext.IsMqttSendProcessData)
- {
- try
- {
- string id = processData.ID;
- string guid = Guid.NewGuid().ToString();
- // 过站结果 0
- PassStationResultRequest passStaResultRequ = new PassStationResultRequest();
- passStaResultRequ.pass_station_id = guid; // 过站唯⼀标识(36位)
- passStaResultRequ.project_code = GlobalContext.Project_Code; // 项⽬编码
- passStaResultRequ.factory_code = GlobalContext.Factory_Code; // ⼯⼚Id
- passStaResultRequ.process_section_code = GlobalContext.Process_Section_Code; // ⼯段编码
- passStaResultRequ.line_code = GlobalContext.LineCode; // 线体编码
- switch (stationNameStr)
- {
- // [S1] Tray盘上料装备
- // [S2] FCT
- // [S3] 值板机
- // [S4_1] 载具下线装备 [S4_5] 载具上线装备
- // [S5] Tray盘下料装备
- case "[S1]Tray盘上料装备":
- passStaResultRequ.work_station = GlobalContext.S1_work_station; // ⼯站
- passStaResultRequ.device_code = GlobalContext.S1_device_code; // 装备编码
- passStaResultRequ.station = GlobalContext.S1_station; // ⼯位Id
- break;
- case "[S2]FCT":
- passStaResultRequ.work_station = GlobalContext.S2_work_station; // ⼯站
- passStaResultRequ.device_code = GlobalContext.S2_device_code; // 装备编码
- passStaResultRequ.station = GlobalContext.S2_station; // ⼯位Id
- break;
- case "[S3]值板机":
- passStaResultRequ.work_station = GlobalContext.S3_work_station; // ⼯站
- passStaResultRequ.device_code = GlobalContext.S3_device_code; // 装备编码
- passStaResultRequ.station = GlobalContext.S3_station; // ⼯位Id
- break;
- case "[S4_1]载具下线装备":
- passStaResultRequ.work_station = GlobalContext.S4_1_work_station; // ⼯站
- passStaResultRequ.device_code = GlobalContext.S4_1_device_code; // 装备编码
- passStaResultRequ.station = GlobalContext.S4_1_station; // ⼯位Id
- break;
- case "[S4_3]提升机1":
- passStaResultRequ.work_station = GlobalContext.S4_3_work_station; // ⼯站
- passStaResultRequ.device_code = GlobalContext.S4_3_device_code; // 装备编码
- passStaResultRequ.station = GlobalContext.S4_3_station; // ⼯位Id
- break;
- case "[S4_4]提升机2":
- passStaResultRequ.work_station = GlobalContext.S4_4_work_station; // ⼯站
- passStaResultRequ.device_code = GlobalContext.S4_4_device_code; // 装备编码
- passStaResultRequ.station = GlobalContext.S4_4_station; // ⼯位Id
- break;
- case "[S4_5]载具上线装备":
- passStaResultRequ.work_station = GlobalContext.S4_5_work_station; // ⼯站
- passStaResultRequ.device_code = GlobalContext.S4_5_device_code; // 装备编码
- passStaResultRequ.station = GlobalContext.S4_5_station; // ⼯位Id
- break;
- case "[S5]Tray盘下料装备":
- passStaResultRequ.work_station = GlobalContext.S5_work_station; // ⼯站
- passStaResultRequ.device_code = GlobalContext.S5_device_code; // 装备编码
- passStaResultRequ.station = GlobalContext.S5_station; // ⼯位Id
- break;
- default:
- break;
- }
- passStaResultRequ.process_time = processData.Test_time; // 过站时间
- passStaResultRequ.slot = "1"; // 槽位编码
- passStaResultRequ.sn = processData.Sn; // 产品SN
- passStaResultRequ.result = pass ? "PASS" : "FAIL"; // 过站结果
- passStaResultRequ.work_type = "OUT_STATION"; // 作业类型
- iotJson = JsonConvert.SerializeObject(passStaResultRequ);
- int result_Result = XiaomiMqttClient_Extend.Write_PassStationResult(passStaResultRequ);
- string result_ResultStr = string.Empty;
- var try1 = Enum.TryParse(result_Result.ToString(), out XiaomiMqttResponse_ErrCode errCode);
- if (try1)
- result_ResultStr = errCode.ToString();
- AddMessage_Station(stationNameStr, LogType.Info, "[" + processItem + $"]上传【过站结果 id {id}】到IOT服务器---[" + result_Result + "]" + result_ResultStr);
- iotUpload = result_Result == 0 ? 1 : 0;
- //// 过站数据 0
- int result_Log = 0;
- {
- //List<PassStationLogRequest> passStaLogRequs = new List<PassStationLogRequest>();
- //PassStationLogRequest passStaLogRequ = new PassStationLogRequest();
- //passStaLogRequ.pass_station_id = guid;
- //passStaLogRequ.sn = processData.Sn; // 产品SN
- //passStaLogRequ.slot ="1"; // 槽位
- //passStaLogRequ.test_item_num ="1"; // 测试项序号 1,2,递增
- //passStaLogRequ.function_name = "Machine_"+stationNameStr; // 功能名称
- //passStaLogRequ.test_item =""; // 测试项
- //passStaLogRequ.result_val =""; // 测试值/输出值
- //passStaLogRequ.hi_limit =""; // 上限值
- //passStaLogRequ.low_limit =""; // 下限值
- //passStaLogRequ.status =""; // 测试状态
- //passStaLogRequ.test_time =""; // 单项测试时间
- //passStaLogRequ.error_code =""; // 错误码
- //passStaLogRequ.project_code =""; // 描述
- //passStaLogRequs.Add(passStaLogRequ);
- //int result_Log = XiaomiMqttClient_Extend.Write_PassStationLog(passStaLogRequs);
- //if (result_Log == 0)
- //{
- // string sql_Upd = ProcessData.ToStringUpdateStatusByID(1, processData.ID);
- // string ret_Upd = string.Empty;
- // //ret_Upd = SQLHelper_New.ExecuteNonQuery(sql_Upd, null);
- // AddMessage_Station(stationNameStr, LogType.Info, $"更新【过站明细 id {processData.ID}】上传状态---" + ret_Upd);
- //}
- //else
- //{
- // OnMessage(LogType.Error, $"上传过站明细到MES服务器---失败!id {processData.ID}");
- //}
- }
- AddMessage_Station(stationNameStr, LogType.Info, "[" + processItem + $"]上传[{processData.Sn}]过站数据到IOT服务器---" + result_Result + "," + result_Log);
- }
- catch (Exception ex)
- {
- iotUpload = 0;
- string str = ex.StackTrace;
- AddMessage_Station(stationNameStr, LogType.Error, $"PLC上传过站数据IOT报错!错误信息:" + ex.Message.ToString() + ";异常位置:" + str.Substring(str.LastIndexOf("\\") + 1, str.Length - str.LastIndexOf("\\") - 1));
- }
- }
- else
- iotUpload = 2;
- // 更新上传状态
- int mesUpload1 = mesUpload;
- if (mesUpload1 == 2)
- mesUpload1 = 0;
- int iotUpload1 = iotUpload;
- if (iotUpload1 == 2)
- iotUpload1 = 0;
- string sql_Upd = ProcessData.ToStringUpdateStatusByID(mesJson, mesUpload1, iotJson, iotUpload1, processData.ID);
- string ret_Upd = SQLHelper_New.ExecuteNonQuery(sql_Upd, null);
- AddMessage_Station(stationNameStr, LogType.Info, $"更新【出站数据 id {processData.ID}】上传状态---" + ret_Upd);
- if (mesUpload == 2)
- mesUpload = 1;
- if (iotUpload == 2)
- iotUpload = 1;
- int result = (mesUpload == 1 && iotUpload == 1) ? 1 : 2;
- return result;
- }
- #endregion 出站数据
- #region 点检数据
- /// <summary>
- /// 选择如何记录点检数据
- /// </summary>
- /// <param name="names"></param>
- /// <param name="contents"></param>
- /// <param name="results"></param>
- /// <param name="equipmentCode"></param>
- /// <param name="stationNameStr"></param>
- private int SwitctOneCheckData(OneCheckData oneCheckData, string equipmentCode, string stationNameStr)
- {
- //if (DataSwitch == 1)
- //{
- return SaveOneCheckDataByDB(oneCheckData, equipmentCode, stationNameStr);
- //}
- //else // 废弃
- //{
- // SaveOneCheckData(names, contents, results, equipmentCode, stationNameStr);
- //}
- }
- /// <summary>
- /// 添加点检数据ByDB(本地保存;不提交到MES)
- /// </summary>
- /// <param name="oneCheckData">点检数据</param>
- /// <param name="equipmentCode">设备编号</param>
- /// <param name="stationNameStr">工站名称</param>
- public int SaveOneCheckDataByDB(OneCheckData oneCheckData, string equipmentCode, string stationNameStr)
- {
- int upload = 0;
- //本地数据保存
- string sql = oneCheckData.ToStringInsert(upload);
- string ret = SQLHelper_New.ExecuteNonQuery(sql, null);
- AddMessage_Station(stationNameStr, LogType.Info, string.Concat("[[", equipmentCode, "]", stationNameStr, "]保存本地点检数据---", ret));
- //Task.Run(() => // 上传mes-异步
- //{
- // //上传mes
- // string jsonstr = JsonConvert.SerializeObject(oneCheckData);
- // if (GlobalContext.IsSendCheckOneData)
- // {
- // string url = @"HTTP://" + GlobalContext.ServerHost + ":" + GlobalContext.ServerPort + @"/api/ProductionLine/OneCheckData";
- // string mesRet = HttpUitls.SubmitDataToMES(url, jsonstr);
- // AddMessage_Station(stationNameStr, LogType.Info, string.Concat("[[", equipmentCode, "]", stationNameStr, "]上传点检数据到MES---", mesRet));
- // if (mesRet == "成功")
- // {
- // // 更新上传状态
- // string sql_Upd = OneCheckData.ToStringUpdateStatusByID(1, oneCheckData.ID);
- // string ret_Upd = SQLHelper_New.ExecuteNonQuery(sql_Upd, null);
- // AddMessage_Station(stationNameStr, LogType.Info, $"更新【点检数据 id {oneCheckData.ID}】上传状态---" + ret_Upd);
- // }
- // }
- //});
- return ret == "成功" ? 1 : 0;
- }
- /// <summary>
- /// 提交点检数据到MES
- /// </summary>
- /// <param name="procedure_code">工序编号 = 设备编号</param>
- /// <param name="plcOrder">车间订单号</param>
- /// <returns></returns>
- public int SubmitToMESByDB(string procedure_code, string stationNameStr, string plcOrder)
- {
- // 获取今天的点检数据
- string querySQL_Today = new OneCheckData().ToQuerySQL_Today(procedure_code, plcOrder);
- DataSet ds = SQLHelper_New.Query(querySQL_Today, null);
- if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
- {
- // 拼接所有点检数据
- OneCheckData oneCheckDatas_MES = new OneCheckData()
- {
- ID = ds.Tables[0].Rows[0][0].ToString(),
- Line_code = ds.Tables[0].Rows[0][1].ToString(),
- Line_name = ds.Tables[0].Rows[0][2].ToString(),
- Equipment_code = ds.Tables[0].Rows[0][3].ToString(),
- Equipment_name = ds.Tables[0].Rows[0][4].ToString(),
- Workorder_code = ds.Tables[0].Rows[0][5].ToString(),
- Procedure_code = ds.Tables[0].Rows[0][6].ToString(),
- Procedure_name = ds.Tables[0].Rows[0][7].ToString(),
- Onecheck_empcode = ds.Tables[0].Rows[0][8].ToString(),
- Onecheck_empname = ds.Tables[0].Rows[0][9].ToString(),
- Onecheck_time = ds.Tables[0].Rows[0][10].ToString()
- };
- List<string> upd_Ids = new List<string>();
- foreach (DataRow row in ds.Tables[0].Rows)
- {
- var obj1 = row["Oneckeck_values"];
- if (obj1 != null)
- {
- upd_Ids.Add(row["ID"].ToString());
- List<OneCheckItem> item = JsonConvert.DeserializeObject<List<OneCheckItem>>(obj1.ToString());
- oneCheckDatas_MES.Oneckeck_values.AddRange(item);
- }
- }
- //上传mes
- string jsonstr = JsonConvert.SerializeObject(oneCheckDatas_MES);
- if (GlobalContext.IsSendCheckOneData)
- {
- string url = @"HTTP://" + GlobalContext.ServerHost + ":" + @"/api/ProductionLine/OneCheckData";
- string mesRet = HttpUitls.SubmitDataToMES(url, jsonstr);
- AddMessage_Station(stationNameStr, LogType.Info, string.Concat("[", stationNameStr, "]PLC通知上传点检数据到MES到---", mesRet));
- if (mesRet == "成功")
- {
- // 更新上传状态
- string sql_Upd = OneCheckData.ToStringUpdateStatusByIDs(1, upd_Ids);
- string ret_Upd = SQLHelper_New.ExecuteNonQuery(sql_Upd, null);
- AddMessage_Station(stationNameStr, LogType.Info, $"更新【点检数据 id [{string.Join("','", upd_Ids)}]】上传状态---" + ret_Upd);
- // 保存最新一条点检数据 到文件中
- StandardLibrary.IniFile.INIWriteValue(GlobalContext.CheckOneDataPath, "S" + procedure_code, "WorkOrderCode", GlobalContext.WorkOrderCode);
- StandardLibrary.IniFile.INIWriteValue(GlobalContext.CheckOneDataPath, "S" + procedure_code, "Oneckeck_values", JsonConvert.SerializeObject(oneCheckDatas_MES.Oneckeck_values));
- return ret_Upd == "成功" ? 1 : 0;
- }
- }
- }
- //else
- //{
- // AddMessage_Station(stationNameStr, LogType.Info, string.Concat("[", stationNameStr, "]PLC通知上传点检数据到MES---失败!今天还未点检。"));
- //}
- return 0;
- }
- /// <summary>
- /// 添加点检数据ByDB(本地保存 + 提交到MES)
- /// </summary>
- /// <param name="oneCheckData">点检数据</param>
- /// <param name="equipmentCode">设备编号</param>
- /// <param name="stationNameStr">工站名称</param>
- /// <returns></returns>
- public int SaveOneCheckDataByDBAndSubmit(OneCheckData oneCheckData, string equipmentCode, string stationNameStr)
- {
- int upload = 0;
- //本地数据保存
- string sql = oneCheckData.ToStringInsert(upload);
- string ret = SQLHelper_New.ExecuteNonQuery(sql, null);
- AddMessage_Station(stationNameStr, LogType.Info, string.Concat("[[", equipmentCode, "]", stationNameStr, "]保存本地点检数据---", ret));
- Task.Run(() => // 上传mes-异步
- {
- //上传mes
- string jsonstr = JsonConvert.SerializeObject(oneCheckData);
- string jsonItems = JsonConvert.SerializeObject(oneCheckData.Oneckeck_values);
- if (GlobalContext.IsSendCheckOneData)
- {
- string url = @"HTTP://" + GlobalContext.ServerHost + ":" + @"/api/ProductionLine/OneCheckData";
- string mesRet = HttpUitls.SubmitDataToMES(url, jsonstr);
- AddMessage_Station(stationNameStr, LogType.Info, string.Concat("[[", equipmentCode, "]", stationNameStr, "]上传点检数据到MES---", mesRet));
- if (mesRet == "成功")
- {
- // 更新上传状态
- string sql_Upd = OneCheckData.ToStringUpdateStatusByID(1, oneCheckData.ID);
- string ret_Upd = SQLHelper_New.ExecuteNonQuery(sql_Upd, null);
- AddMessage_Station(stationNameStr, LogType.Info, $"更新【点检数据 id {oneCheckData.ID}】上传状态---" + ret_Upd);
- // 保存最新一条点检数据 到文件中
- StandardLibrary.IniFile.INIWriteValue(GlobalContext.CheckOneDataPath, equipmentCode, "WorkOrderCode", GlobalContext.WorkOrderCode);
- StandardLibrary.IniFile.INIWriteValue(GlobalContext.CheckOneDataPath, equipmentCode, "Oneckeck_values", jsonItems);
- }
- }
- });
- return ret == "成功" ? 1 : 0;
- }
- /// <summary>
- /// 清空 点检数据 By 工序号、订单号
- /// </summary>
- /// <param name="procedure_code">工序号</param>
- /// <param name="stationNameStr">工站号</param>
- /// <param name="plcOrder">订单号</param>
- /// <returns></returns>
- /// <exception cref="NotImplementedException"></exception>
- private int ClearOneCheckDataByDB(string procedure_code, string stationNameStr, string plcOrder)
- {
- // 清空
- string sql_Det = OneCheckData.ToDeteleByProcedurecodeAndPlcOrder(procedure_code, plcOrder);
- string ret_Upd = SQLHelper_New.ExecuteNonQuery(sql_Det, null);
- AddMessage_Station(stationNameStr, LogType.Info, $"清空【工位编号{procedure_code}】【车间订单{plcOrder}】的点检项缓存 ---" + ret_Upd);
- return ret_Upd == "成功" ? 1 : 2;
- }
- /// <summary>
- /// 生产过程中,自动判断 是否 使用上次的点检数据
- /// 在工单加工第一个产品时触发该方法
- /// 如果工单是上次的点检工单则直接返回成功,工单不是上次的点检工单则使用上个工单的点检数据,上传点检信息
- /// </summary>
- /// <param name="stationNameStr"></param>
- /// <param name="equipmentCode">设备编号</param>
- /// <param name="accno">工序编号</param>
- /// <param name="processItem">点检数据</param>
- /// <returns></returns>
- private int SwitctOneCheckData_First(string stationNameStr, string equipmentCode, string accno, string processItem)
- {
- string WorkOrderCode = StandardLibrary.IniFile.INIGetStringValue(GlobalContext.CheckOneDataPath, equipmentCode, "WorkOrderCode", string.Empty);
- //如果当前工单和记录中的工单是一致,表示这个工单是需要点检的,跳过
- //如果当前工单和记录中的工单是不一致,表示这个工单和上个工单是同型号的,可以使用上个工单的点检数据
- if (GlobalContext.WorkOrderCode == WorkOrderCode)
- {
- return 1;
- }
- //点检数据
- string Oneckeck_values = StandardLibrary.IniFile.INIGetStringValue(GlobalContext.CheckOneDataPath, equipmentCode, "Oneckeck_values", string.Empty);
- List<OneCheckItem> items = new List<OneCheckItem>();
- try
- {
- items = JsonConvert.DeserializeObject<List<OneCheckItem>>(Oneckeck_values);
- }
- catch (Exception ex)
- {
- return 0;
- }
- // 拼接所有点检数据
- OneCheckData oneCheckDatas_MES = new OneCheckData()
- {
- ID = Guid.NewGuid().ToString(),
- Line_code = GlobalContext.LineCode,
- Line_name = GlobalContext.LineName,
- Equipment_code = equipmentCode,
- Equipment_name = equipmentCode,
- Workorder_code = GlobalContext.WorkOrderCode,
- Procedure_code = accno,
- Procedure_name = processItem,
- Onecheck_empcode = "",
- Onecheck_empname = "",
- Onecheck_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"),
- Oneckeck_values = items
- };
- // 本地保存 + 提交到MES
- return SaveOneCheckDataByDBAndSubmit(oneCheckDatas_MES, equipmentCode, stationNameStr);
- }
- #endregion 点检数据
- #region 报警数据
- /// <summary>
- /// 添加报警数据ByDB(提交到MES+本地保存)
- /// </summary>
- /// <param name="alarmData">数据</param>
- /// <param name="isUpd">更新而不是新增</param>
- public void SaveAlarmDataByDB(string stationNameStr, AlarmData alarmData, bool isUpd)
- {
- if (isUpd)
- {
- string sql = alarmData.ToStringUpdate();
- SQLHelper_New.ExecuteSQL(sql, null);
- AddMessage_Station(stationNameStr, LogType.Info, "消除报警[" + alarmData.LineName + "-" + alarmData.AlarmDesc + "]完毕!");
- }
- else
- {
- string sql = alarmData.ToStringInsert();
- SQLHelper_New.ExecuteSQL(sql, null);
- AddMessage_Station(stationNameStr, LogType.Info, "发生了报警[" + alarmData.LineName + "-" + alarmData.AlarmDesc + "]!");
- }
- }
- #endregion 报警数据
- #region 节拍数据
- /// <summary>
- /// 上传节拍数据
- /// </summary>
- /// <returns></returns>
- public (short, string) SaveOEEData(int plcNo, string stationNameStr, XiaomiDeviceOEE deviceOEE, string oEEPartNo, string oEEProductSN)
- {
- // 上传OEE
- if (GlobalContext.IsMqttStationInputBegin)
- {
- Task.Run(() =>
- {
- try
- {
- StationInputBeginRequest oee = new StationInputBeginRequest();
- oee.action = deviceOEE.ToString(); // 节拍动作(XiaomiDeviceOEE)
- oee.beat_tm = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); // 节拍发⽣时间
- oee.action_subject = oEEPartNo; // 该动作操作的⽬标对象(SN)
- oee.action_subject_parent = oEEProductSN; // ⼤板SN/载具SN
- oee.action_location = GlobalContext.S1_station; // 该动作的位置信息(⼯位、槽位),如:F06-GSTPLA11_01-SLOT-01
- switch (stationNameStr)
- {
- case "[S1]Tray盘上料装备":
- oee.action_location = GlobalContext.S1_station;
- break;
- case "[S2]FCT":
- oee.action_location = GlobalContext.S2_station;
- break;
- case "[S3]值板机":
- oee.action_location = GlobalContext.S3_station;
- break;
- case "[S4_1]载具下线装备":
- oee.action_location = GlobalContext.S4_1_station;
- break;
- case "[S4_3]提升机1":
- oee.action_location = GlobalContext.S4_3_station;
- break;
- case "[S4_4]提升机2":
- oee.action_location = GlobalContext.S4_4_station;
- break;
- case "[S4_5]载具上线装备":
- oee.action_location = GlobalContext.S4_5_station;
- break;
- case "[S5]Tray盘下料装备":
- oee.action_location = GlobalContext.S5_station;
- break;
- }
- oee.action_material = string.Empty; // 该动作的物料信息
- oee.extra = string.Empty; // 额外信息
- oee.class_level_1 = string.Empty; // 分类层级1
- oee.class_level_2 = string.Empty; // 分类层级2
- oee.class_level_3 = string.Empty; // 分类层级3
- int result = XiaomiMqttClient_Extend.Write_StationInputBegin(oee);
- string msg = $"[{result}]";
- bool errCodeParse = Enum.TryParse(result.ToString(), out XiaomiMqttResponse_ErrCode errCode);
- msg += errCodeParse ? errCode.ToString() : "ERR_UNKOWN";
- AddMessage(LogType.Info, stationNameStr + $"_异步上传节拍接口;接口结果:-- {msg}");
- }
- catch (Exception ex)
- {
- string str = ex.StackTrace;
- AddMessage(LogType.Error, $"PLC{plcNo}_{stationNameStr} 异步上传节拍接口出错!错误信息:" + ex.Message + "异常位置:" + str.Substring(str.LastIndexOf("\\") + 1, str.Length - str.LastIndexOf("\\") - 1));
- }
- });
- return ((short)1, "异步上传中!");
- }
- else
- return ((short)1, "未启用上传!");
- }
- #endregion 节拍数据
- #endregion 保存数据
- }
- }
|