/******************************************************************************* * Copyright(c) 2014 DongkeSoft All rights reserved. / Confidential * 类的信息: * 1.程序名称:SmartDeviceService.cs * 2.功能描述:接收智能设备请求 * 编辑履历: * 作者 日期 版本 修改内容 * 陈晓野 2018/10/25 1.00 新建 * 徐伟 2020/07/30 2.00 重组结构优化代码 *******************************************************************************/ using System; using System.Collections; using System.Data; using System.ServiceModel; using System.ServiceModel.Activation; using Curtain.DataAccess; using Dongke.IBOSS.PRD.Basics.BaseResources; using Dongke.IBOSS.PRD.Basics.DataAccess; using Dongke.IBOSS.PRD.Basics.Library; using Dongke.IBOSS.PRD.Service.DataModels; using Dongke.IBOSS.PRD.Service.PDAModuleLogic; using Dongke.IBOSS.PRD.Service.PMModuleLogic; using Dongke.IBOSS.PRD.Service.SmartDeviceService; using Dongke.IBOSS.PRD.WCF.DataModels; using Newtonsoft.Json.Linq; using Oracle.ManagedDataAccess.Client; namespace Dongke.IBOSS.PRD.WCF.ExHGS3QRS { /// /// 智能设备对接服务 /// [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] [ServiceBehavior(ConfigurationName = "ExHGS3QR", InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)] public class ExHGS3QR : IExHGS3QR { #region 恒洁三水三车间对接金马扫码 public string AddWorkInfoHGS3_QR_TEST(string barcode, string procedure_no, int road_no, double weight) { return "{\"success\":true,\"message\":\"产品库位调度成功!\"}"; } /// /// 恒洁三水三车间对接金马扫码 /// TP_SYS_SMARTDEVICEPOINT /// 工序号 工序名 道口号 /// 3_3_1 预干区(入) 1-8 /// 3_3_2 烘干区(入) 1-8 /// 3_3_3 干坏区(入) /// 3_2_1 毛坯区(入) /// 3_2_2 精坯库(入) /// 3_2_3 釉坯库(入) /// /// 条码,多个条码以逗号分隔 /// 工序号 /// 道口号 /// 货架号 /// 区域号 /// 工序计件 /// public string AddWorkInfoHGS3_QR( string barcode, string procedure_no, string road_no, string rack, string position, int procedure_in = 1) { //修正参数,去掉多余的特殊字符 barcode = barCodeFix(barcode); road_no = roadNoFix(road_no); //返回JSON数据格式 JObject returnMessage = new JObject( new JProperty("success", true), new JProperty("message", "产品库位调度成功!"), new JProperty("barcode", barcode) ); string inputCode = $" barcode:{barcode} procedure_no:{procedure_no} road_no:{road_no} rack:{rack} position:{position} procedure_in:{procedure_in}"; string[] barCodes = barcode.Split(','); try { #region 必须:读取设备对接点配置信息 TP_SYS_SMARTDEVICEPOINT DataTable smartDevicePoint = getSmartDevicePoint(procedure_no, road_no); if (smartDevicePoint.Rows.Count == 0) { OutputLog.TraceLog(LogPriority.Warning, this.ToString(), System.Reflection.MethodBase.GetCurrentMethod().Name, inputCode + "设备对接工序点未配置", LocalPath.LogExePath + "SmartDevice\\"); returnMessage["success"] = false; returnMessage["message"] = "设备对接工序点未配置"; return returnMessage.ToString(); } #endregion #region 通用:procedure_in = 0 验证处理,支持多条码 if (procedure_in == 0) { string msg = ""; //标准验证是否可到达,支持多条码 msg = checkBarcode(Convert.ToInt32(smartDevicePoint.Rows[0]["PROCEDUREID"]), barCodes); if (msg != "") { returnMessage["success"] = false; returnMessage["message"] = msg; return returnMessage.ToString(); } else { returnMessage["success"] = true; returnMessage["message"] = "产品库位调度验证成功!"; return returnMessage.ToString(); } } #endregion #region 通用:procedure_in = 1 计件处理,支持多条码 if (procedure_in == 1) { DataTable addWorkPiece = doAddWorkPiece(barCodes, smartDevicePoint); string out_msg = addWorkPiece?.Rows[0]["out_errMsg"].ToString(); if (!string.IsNullOrWhiteSpace(out_msg)) { OutputLog.TraceLog(LogPriority.Warning, this.ToString(), System.Reflection.MethodBase.GetCurrentMethod().Name, inputCode + JsonHelper.ToJson(addWorkPiece), LocalPath.LogExePath + "SmartDevice\\"); returnMessage["success"] = false; returnMessage["message"] = out_msg; return returnMessage.ToString(); } } #endregion //返回正常结果 return returnMessage.ToString(); } catch (Exception ex) { OutputLog.TraceLog(LogPriority.Error, this.ToString(), System.Reflection.MethodBase.GetCurrentMethod().Name, inputCode + ex.ToString(), LocalPath.LogExePath); returnMessage["success"] = false; returnMessage["message"] = "MES系统异常"; return returnMessage.ToString(); } } #region 通用私有方法 /// /// 修正barcode,去掉barcode中的特殊字符 xuwei 2020-07-13 /// /// /// private string barCodeFix(string barCode) { return barCode .Replace("%0a", "") .Replace("%0d", "") .Replace("\n", "") .Replace("\r", ""); } /// /// 修正road_no值,为0时更新为1 xuwei 2020-07-13 /// /// /// private string roadNoFix(string road_no) { if (road_no == "0") return "1"; else return road_no; } /// /// 获取产品注浆信息 /// /// /// private Hashtable getGroutingDailyDetail(string barCode) { Hashtable ht = new Hashtable(); DataTable gdata = SmartDeviceLogic.GetGroutingdailydetail(barCode); if (gdata.Rows.Count > 0) { //产品等级 GOODSLEVELTYPEID //1良品 2返工 3废品 4正品 5副品 6重烧 7次品 8损坯 9干补 //10丢失 11撤销装车 12撤销入窑 13不合格 14不合格(返) 15复检 string level = gdata.Rows[0]["goodsleveltypeid"].ToString(); switch (Convert.ToInt32(gdata.Rows[0]["goodsleveltypeid"])) { case 4: case 5: case 15: level = "1"; break; case 6: level = "2"; break; default: //2020-08-03 默认值改为1 level = "1"; break; } //条码 ht["barcode"] = barCode; //产品编码 ht["goodscode"] = gdata.Rows[0]["goodscode"]; //产品分级 ht["goodsleveltypeid"] = gdata.Rows[0]["goodsleveltypeid"]; //SKU码 ht["materialcode"] = gdata.Rows[0]["materialcode"]; //结果 ht["level"] = level; //智能 ht["zhineng"] = (gdata.Rows[0]["goodstypeid"].ToString() == "18" || gdata.Rows[0]["goodstypeid"].ToString() == "19") ? "1" : "2"; //高压 ht["gaoya"] = (gdata.Rows[0]["goods_line_type"].ToString() == "1") ? "1" : "2"; //成型线号 xuwei add 2021-1-12 //ht["lineno"] = gdata.Rows[0]["GROUTINGLINENAME"]; ht["lineno"] = gdata.Rows[0]["GROUTINGLINECODE"]; } return ht; } /// /// 验证条码是否可到达 /// /// /// /// /// private string checkBarcode(int procedureId, string[] barCodes) { IDBConnection conn = ClsDbFactory.CreateDBConnection(Basics.DataAccess.DataBaseType.ORACLE, DataManager.ConnectionString); string msg = ""; try { conn.Open(); for (int i = 0; i < barCodes.Length; i++) { // 工序可以多次扫码,条码所在工序与验证工序一致时,直接通过 /* string sql = "select t.flowprocedureid from tp_pm_inproduction t where t.barcode = :in_barcode"; OracleParameter[] para1 = new OracleParameter[]{ new OracleParameter(":in_barcode",OracleDbType.Varchar2,barCodes[i],ParameterDirection.Input), }; string pid = conn.GetSqlResultToStr(sql, para1); if (pid == procedureId + "") { continue; }*/ OracleParameter[] para = new OracleParameter[]{ new OracleParameter("in_procedureid",OracleDbType.Int32,procedureId,ParameterDirection.Input), new OracleParameter("in_barcode",OracleDbType.Varchar2,barCodes[i],ParameterDirection.Input), new OracleParameter("out_errMsg",OracleDbType.Varchar2,2000,"",ParameterDirection.Output), new OracleParameter("out_goodsID",OracleDbType.Int32,ParameterDirection.Output), new OracleParameter("out_goodsCode",OracleDbType.Varchar2,50,"",ParameterDirection.Output), new OracleParameter("out_goodsName",OracleDbType.Varchar2,50,"",ParameterDirection.Output), new OracleParameter("out_groutingUserCode",OracleDbType.NVarchar2,50,null,ParameterDirection.Output), new OracleParameter("out_errMsg_Status",OracleDbType.Varchar2,50,"",ParameterDirection.Output), }; conn.ExecStoredProcedure("PRO_PM_CheckBarcode", para); msg += para[2].Value.ToString().Replace("\\n\\r", "").Replace("null", ""); } //conn.Close(); } catch (Exception ex) { throw ex; } finally { conn.Close(); } return msg; } /// /// 获取设备对接点配置数据 /// /// /// /// /// private DataTable getSmartDevicePoint(string procedureNo, string roadNo) { using (IDataAccess conn = DataAccess.Create()) { DataTable dt = conn.ExecuteDatatable(@" SELECT SDP.PROCEDUREID, SDP.USERID, U.USERCODE, U.USERNAME FROM TP_SYS_SMARTDEVICEPOINT SDP LEFT JOIN TP_MST_USER U ON U.USERID = SDP.USERID WHERE SDP.POINTCODE = @POINTCODE@ AND SDP.ROADNO = @ROADNO@ ", new CDAParameter("POINTCODE", procedureNo), new CDAParameter("ROADNO", roadNo) ); return dt; } } /// /// 通用计件方法 /// /// /// /// private DataTable doAddWorkPiece(string[] barCodes, DataTable smartDevicePoint) { int procedureID = 0; int.TryParse(smartDevicePoint.Rows[0]["ProcedureID"] + "", out procedureID); if (procedureID > 0) { //初始条码信息 DataTable barcodeTable = new DataTable(); barcodeTable.Columns.Add("LogoID"); barcodeTable.Columns.Add("BarCode"); barcodeTable.Columns.Add("Remarks"); barcodeTable.Columns.Add("UserID"); barcodeTable.Columns.Add("UserCode"); barcodeTable.Columns.Add("UserName"); barcodeTable.Columns.Add("GroutingUserCode"); //初始化用户信息 SUserInfo sUserInfo = new SUserInfo(); sUserInfo.AccountID = 1; sUserInfo.AccountCode = "dongke"; sUserInfo.UserID = Convert.ToInt32(smartDevicePoint.Rows[0]["UserID"]); sUserInfo.UserCode = smartDevicePoint.Rows[0]["UserCode"].ToString(); // 工序可以多次扫码,条码所在工序与验证工序一致时,直接通过 using (IDataAccess conn = DataAccess.Create()) { string sql = "select t.flowprocedureid from tp_pm_inproduction t where t.barcode = @barcode@"; //支持多条码 for (int i = 0; i < barCodes.Length; i++) { //条码为空的不计件 xuwei add 2022-04-13 if (barCodes[i].ToString() == "" || barCodes[i].ToString() == "0") { continue; } //相同工序的不调用 string pid = conn.ExecuteScalar(sql, new CDAParameter("barcode", barCodes[i])) + ""; if (pid == procedureID + "") { continue; } //验证不通过的不调用 xuwei add 2022-04-13 string[] temp = new string[1]; temp[0] = barCodes[i]; string msg = checkBarcode(procedureID, temp); if (msg != "") { continue; } //重复条码不要加进去,处在首节点会报错 barcodeTable.PrimaryKey = new DataColumn[] { barcodeTable.Columns["BarCode"] }; if (barcodeTable.Rows.Contains(barCodes[i])) { continue; } //记录可以计件的条码 DataRow dr = barcodeTable.NewRow(); dr["BarCode"] = barCodes[i]; dr["UserID"] = Convert.ToInt32(smartDevicePoint.Rows[0]["UserID"]); dr["UserCode"] = smartDevicePoint.Rows[0]["UserCode"] + ""; dr["UserName"] = smartDevicePoint.Rows[0]["UserName"] + ""; //fly add 2022-05-10 交坯节点必须有这个参数 dr["GroutingUserCode"] = conn.ExecuteScalar(@" SELECT P.USERCODE FROM TP_PM_GROUTINGDAILYDETAIL P WHERE P.BARCODE = @barcode@ AND P.VALUEFLAG = '1' ", new CDAParameter("barcode", barCodes[i]) ); barcodeTable.Rows.Add(dr); } } if (barcodeTable.Rows.Count > 0) { //调用通用计件方法 ProcedureEntity procedureInfo = null; return PMModuleLogicDAL.AddWorkPiece(procedureID, barcodeTable, sUserInfo, out procedureInfo); } } return null; } #endregion #endregion } }