Ex_HGS3_QR.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. /*******************************************************************************
  2. * Copyright(c) 2014 DongkeSoft All rights reserved. / Confidential
  3. * 类的信息:
  4. * 1.程序名称:SmartDeviceService.cs
  5. * 2.功能描述:接收智能设备请求
  6. * 编辑履历:
  7. * 作者 日期 版本 修改内容
  8. * 陈晓野 2018/10/25 1.00 新建
  9. * 徐伟 2020/07/30 2.00 重组结构优化代码
  10. *******************************************************************************/
  11. using System;
  12. using System.Collections;
  13. using System.Data;
  14. using System.ServiceModel;
  15. using System.ServiceModel.Activation;
  16. using Curtain.DataAccess;
  17. using Dongke.IBOSS.PRD.Basics.BaseResources;
  18. using Dongke.IBOSS.PRD.Basics.DataAccess;
  19. using Dongke.IBOSS.PRD.Basics.Library;
  20. using Dongke.IBOSS.PRD.Service.DataModels;
  21. using Dongke.IBOSS.PRD.Service.PDAModuleLogic;
  22. using Dongke.IBOSS.PRD.Service.PMModuleLogic;
  23. using Dongke.IBOSS.PRD.Service.SmartDeviceService;
  24. using Dongke.IBOSS.PRD.WCF.DataModels;
  25. using Newtonsoft.Json.Linq;
  26. using Oracle.ManagedDataAccess.Client;
  27. namespace Dongke.IBOSS.PRD.WCF.ExHGS3QRS
  28. {
  29. /// <summary>
  30. /// 智能设备对接服务
  31. /// </summary>
  32. [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
  33. [ServiceBehavior(ConfigurationName = "ExHGS3QR",
  34. InstanceContextMode = InstanceContextMode.PerCall,
  35. ConcurrencyMode = ConcurrencyMode.Multiple,
  36. UseSynchronizationContext = false)]
  37. public class ExHGS3QR : IExHGS3QR
  38. {
  39. #region 恒洁三水三车间对接金马扫码
  40. public string AddWorkInfoHGS3_QR_TEST(string barcode, string procedure_no, int road_no, double weight)
  41. {
  42. return "{\"success\":true,\"message\":\"产品库位调度成功!\"}";
  43. }
  44. /// <summary>
  45. /// 恒洁三水三车间对接金马扫码
  46. /// TP_SYS_SMARTDEVICEPOINT
  47. /// 工序号 工序名 道口号
  48. /// 3_3_1 预干区(入) 1-8
  49. /// 3_3_2 烘干区(入) 1-8
  50. /// 3_3_3 干坏区(入)
  51. /// 3_2_1 毛坯区(入)
  52. /// 3_2_2 精坯库(入)
  53. /// 3_2_3 釉坯库(入)
  54. /// </summary>
  55. /// <param name="barcode">条码,多个条码以逗号分隔</param>
  56. /// <param name="procedure_no">工序号</param>
  57. /// <param name="road_no">道口号</param>
  58. /// <param name="rack">货架号</param>
  59. /// <param name="position">区域号</param>
  60. /// <param name="procedure_in">工序计件</param>
  61. /// <returns></returns>
  62. public string AddWorkInfoHGS3_QR(
  63. string barcode,
  64. string procedure_no,
  65. string road_no,
  66. string rack,
  67. string position,
  68. int procedure_in = 1)
  69. {
  70. //修正参数,去掉多余的特殊字符
  71. barcode = barCodeFix(barcode);
  72. road_no = roadNoFix(road_no);
  73. //返回JSON数据格式
  74. JObject returnMessage = new JObject(
  75. new JProperty("success", true),
  76. new JProperty("message", "产品库位调度成功!"),
  77. new JProperty("barcode", barcode)
  78. );
  79. string inputCode = $" barcode:{barcode} procedure_no:{procedure_no} road_no:{road_no} rack:{rack} position:{position} procedure_in:{procedure_in}";
  80. string[] barCodes = barcode.Split(',');
  81. try
  82. {
  83. #region 必须:读取设备对接点配置信息 TP_SYS_SMARTDEVICEPOINT
  84. DataTable smartDevicePoint = getSmartDevicePoint(procedure_no, road_no);
  85. if (smartDevicePoint.Rows.Count == 0)
  86. {
  87. OutputLog.TraceLog(LogPriority.Warning,
  88. this.ToString(),
  89. System.Reflection.MethodBase.GetCurrentMethod().Name,
  90. inputCode + "设备对接工序点未配置",
  91. LocalPath.LogExePath + "SmartDevice\\");
  92. returnMessage["success"] = false;
  93. returnMessage["message"] = "设备对接工序点未配置";
  94. return returnMessage.ToString();
  95. }
  96. #endregion
  97. #region 通用:procedure_in = 0 验证处理,支持多条码
  98. if (procedure_in == 0)
  99. {
  100. string msg = "";
  101. //标准验证是否可到达,支持多条码
  102. msg = checkBarcode(Convert.ToInt32(smartDevicePoint.Rows[0]["PROCEDUREID"]), barCodes);
  103. if (msg != "")
  104. {
  105. returnMessage["success"] = false;
  106. returnMessage["message"] = msg;
  107. return returnMessage.ToString();
  108. }
  109. else
  110. {
  111. returnMessage["success"] = true;
  112. returnMessage["message"] = "产品库位调度验证成功!";
  113. return returnMessage.ToString();
  114. }
  115. }
  116. #endregion
  117. #region 通用:procedure_in = 1 计件处理,支持多条码
  118. if (procedure_in == 1)
  119. {
  120. DataTable addWorkPiece = doAddWorkPiece(barCodes, smartDevicePoint);
  121. string out_msg = addWorkPiece?.Rows[0]["out_errMsg"].ToString();
  122. if (!string.IsNullOrWhiteSpace(out_msg))
  123. {
  124. OutputLog.TraceLog(LogPriority.Warning,
  125. this.ToString(),
  126. System.Reflection.MethodBase.GetCurrentMethod().Name,
  127. inputCode + JsonHelper.ToJson(addWorkPiece),
  128. LocalPath.LogExePath + "SmartDevice\\");
  129. returnMessage["success"] = false;
  130. returnMessage["message"] = out_msg;
  131. return returnMessage.ToString();
  132. }
  133. }
  134. #endregion
  135. //返回正常结果
  136. return returnMessage.ToString();
  137. }
  138. catch (Exception ex)
  139. {
  140. OutputLog.TraceLog(LogPriority.Error,
  141. this.ToString(),
  142. System.Reflection.MethodBase.GetCurrentMethod().Name,
  143. inputCode + ex.ToString(),
  144. LocalPath.LogExePath);
  145. returnMessage["success"] = false;
  146. returnMessage["message"] = "MES系统异常";
  147. return returnMessage.ToString();
  148. }
  149. }
  150. #region 通用私有方法
  151. /// <summary>
  152. /// 修正barcode,去掉barcode中的特殊字符 xuwei 2020-07-13
  153. /// </summary>
  154. /// <param name="barCode"></param>
  155. /// <returns></returns>
  156. private string barCodeFix(string barCode)
  157. {
  158. return barCode
  159. .Replace("%0a", "")
  160. .Replace("%0d", "")
  161. .Replace("\n", "")
  162. .Replace("\r", "");
  163. }
  164. /// <summary>
  165. /// 修正road_no值,为0时更新为1 xuwei 2020-07-13
  166. /// </summary>
  167. /// <param name="road_no"></param>
  168. /// <returns></returns>
  169. private string roadNoFix(string road_no)
  170. {
  171. if (road_no == "0")
  172. return "1";
  173. else
  174. return road_no;
  175. }
  176. /// <summary>
  177. /// 获取产品注浆信息
  178. /// </summary>
  179. /// <param name="barCode"></param>
  180. /// <returns></returns>
  181. private Hashtable getGroutingDailyDetail(string barCode)
  182. {
  183. Hashtable ht = new Hashtable();
  184. DataTable gdata = SmartDeviceLogic.GetGroutingdailydetail(barCode);
  185. if (gdata.Rows.Count > 0)
  186. {
  187. //产品等级 GOODSLEVELTYPEID
  188. //1良品 2返工 3废品 4正品 5副品 6重烧 7次品 8损坯 9干补
  189. //10丢失 11撤销装车 12撤销入窑 13不合格 14不合格(返) 15复检
  190. string level = gdata.Rows[0]["goodsleveltypeid"].ToString();
  191. switch (Convert.ToInt32(gdata.Rows[0]["goodsleveltypeid"]))
  192. {
  193. case 4:
  194. case 5:
  195. case 15:
  196. level = "1";
  197. break;
  198. case 6:
  199. level = "2";
  200. break;
  201. default:
  202. //2020-08-03 默认值改为1
  203. level = "1";
  204. break;
  205. }
  206. //条码
  207. ht["barcode"] = barCode;
  208. //产品编码
  209. ht["goodscode"] = gdata.Rows[0]["goodscode"];
  210. //产品分级
  211. ht["goodsleveltypeid"] = gdata.Rows[0]["goodsleveltypeid"];
  212. //SKU码
  213. ht["materialcode"] = gdata.Rows[0]["materialcode"];
  214. //结果
  215. ht["level"] = level;
  216. //智能
  217. ht["zhineng"] = (gdata.Rows[0]["goodstypeid"].ToString() == "18" || gdata.Rows[0]["goodstypeid"].ToString() == "19") ? "1" : "2";
  218. //高压
  219. ht["gaoya"] = (gdata.Rows[0]["goods_line_type"].ToString() == "1") ? "1" : "2";
  220. //成型线号 xuwei add 2021-1-12
  221. //ht["lineno"] = gdata.Rows[0]["GROUTINGLINENAME"];
  222. ht["lineno"] = gdata.Rows[0]["GROUTINGLINECODE"];
  223. }
  224. return ht;
  225. }
  226. /// <summary>
  227. /// 验证条码是否可到达
  228. /// </summary>
  229. /// <param name="conn"></param>
  230. /// <param name="procedureId"></param>
  231. /// <param name="barCode"></param>
  232. /// <returns></returns>
  233. private string checkBarcode(int procedureId, string[] barCodes)
  234. {
  235. IDBConnection conn = ClsDbFactory.CreateDBConnection(Basics.DataAccess.DataBaseType.ORACLE, DataManager.ConnectionString);
  236. string msg = "";
  237. try
  238. {
  239. conn.Open();
  240. for (int i = 0; i < barCodes.Length; i++)
  241. {
  242. // 工序可以多次扫码,条码所在工序与验证工序一致时,直接通过
  243. /*
  244. string sql = "select t.flowprocedureid from tp_pm_inproduction t where t.barcode = :in_barcode";
  245. OracleParameter[] para1 = new OracleParameter[]{
  246. new OracleParameter(":in_barcode",OracleDbType.Varchar2,barCodes[i],ParameterDirection.Input),
  247. };
  248. string pid = conn.GetSqlResultToStr(sql, para1);
  249. if (pid == procedureId + "")
  250. {
  251. continue;
  252. }*/
  253. OracleParameter[] para = new OracleParameter[]{
  254. new OracleParameter("in_procedureid",OracleDbType.Int32,procedureId,ParameterDirection.Input),
  255. new OracleParameter("in_barcode",OracleDbType.Varchar2,barCodes[i],ParameterDirection.Input),
  256. new OracleParameter("out_errMsg",OracleDbType.Varchar2,2000,"",ParameterDirection.Output),
  257. new OracleParameter("out_goodsID",OracleDbType.Int32,ParameterDirection.Output),
  258. new OracleParameter("out_goodsCode",OracleDbType.Varchar2,50,"",ParameterDirection.Output),
  259. new OracleParameter("out_goodsName",OracleDbType.Varchar2,50,"",ParameterDirection.Output),
  260. new OracleParameter("out_groutingUserCode",OracleDbType.NVarchar2,50,null,ParameterDirection.Output),
  261. new OracleParameter("out_errMsg_Status",OracleDbType.Varchar2,50,"",ParameterDirection.Output),
  262. };
  263. conn.ExecStoredProcedure("PRO_PM_CheckBarcode", para);
  264. msg += para[2].Value.ToString().Replace("\\n\\r", "").Replace("null", "");
  265. }
  266. //conn.Close();
  267. }
  268. catch (Exception ex)
  269. {
  270. throw ex;
  271. }
  272. finally
  273. {
  274. conn.Close();
  275. }
  276. return msg;
  277. }
  278. /// <summary>
  279. /// 获取设备对接点配置数据
  280. /// </summary>
  281. /// <param name="conn"></param>
  282. /// <param name="procedureNo"></param>
  283. /// <param name="roadNo"></param>
  284. /// <returns></returns>
  285. private DataTable getSmartDevicePoint(string procedureNo, string roadNo)
  286. {
  287. using (IDataAccess conn = DataAccess.Create())
  288. {
  289. DataTable dt = conn.ExecuteDatatable(@"
  290. SELECT
  291. SDP.PROCEDUREID,
  292. SDP.USERID,
  293. U.USERCODE,
  294. U.USERNAME
  295. FROM
  296. TP_SYS_SMARTDEVICEPOINT SDP
  297. LEFT JOIN TP_MST_USER U ON U.USERID = SDP.USERID
  298. WHERE
  299. SDP.POINTCODE = @POINTCODE@
  300. AND SDP.ROADNO = @ROADNO@
  301. ",
  302. new CDAParameter("POINTCODE", procedureNo),
  303. new CDAParameter("ROADNO", roadNo)
  304. );
  305. return dt;
  306. }
  307. }
  308. /// <summary>
  309. /// 通用计件方法
  310. /// </summary>
  311. /// <param name="barCodes"></param>
  312. /// <param name="smartDevicePoint"></param>
  313. /// <returns></returns>
  314. private DataTable doAddWorkPiece(string[] barCodes, DataTable smartDevicePoint)
  315. {
  316. int procedureID = 0;
  317. int.TryParse(smartDevicePoint.Rows[0]["ProcedureID"] + "", out procedureID);
  318. if (procedureID > 0)
  319. {
  320. //初始条码信息
  321. DataTable barcodeTable = new DataTable();
  322. barcodeTable.Columns.Add("LogoID");
  323. barcodeTable.Columns.Add("BarCode");
  324. barcodeTable.Columns.Add("Remarks");
  325. barcodeTable.Columns.Add("UserID");
  326. barcodeTable.Columns.Add("UserCode");
  327. barcodeTable.Columns.Add("UserName");
  328. barcodeTable.Columns.Add("GroutingUserCode");
  329. //初始化用户信息
  330. SUserInfo sUserInfo = new SUserInfo();
  331. sUserInfo.AccountID = 1;
  332. sUserInfo.AccountCode = "dongke";
  333. sUserInfo.UserID = Convert.ToInt32(smartDevicePoint.Rows[0]["UserID"]);
  334. sUserInfo.UserCode = smartDevicePoint.Rows[0]["UserCode"].ToString();
  335. // 工序可以多次扫码,条码所在工序与验证工序一致时,直接通过
  336. using (IDataAccess conn = DataAccess.Create())
  337. {
  338. string sql = "select t.flowprocedureid from tp_pm_inproduction t where t.barcode = @barcode@";
  339. //支持多条码
  340. for (int i = 0; i < barCodes.Length; i++)
  341. {
  342. //条码为空的不计件 xuwei add 2022-04-13
  343. if (barCodes[i].ToString() == "" || barCodes[i].ToString() == "0")
  344. {
  345. continue;
  346. }
  347. //相同工序的不调用
  348. string pid = conn.ExecuteScalar(sql, new CDAParameter("barcode", barCodes[i])) + "";
  349. if (pid == procedureID + "")
  350. {
  351. continue;
  352. }
  353. //验证不通过的不调用 xuwei add 2022-04-13
  354. string[] temp = new string[1];
  355. temp[0] = barCodes[i];
  356. string msg = checkBarcode(procedureID, temp);
  357. if (msg != "")
  358. {
  359. continue;
  360. }
  361. //重复条码不要加进去,处在首节点会报错
  362. barcodeTable.PrimaryKey = new DataColumn[] { barcodeTable.Columns["BarCode"] };
  363. if (barcodeTable.Rows.Contains(barCodes[i]))
  364. {
  365. continue;
  366. }
  367. //记录可以计件的条码
  368. DataRow dr = barcodeTable.NewRow();
  369. dr["BarCode"] = barCodes[i];
  370. dr["UserID"] = Convert.ToInt32(smartDevicePoint.Rows[0]["UserID"]);
  371. dr["UserCode"] = smartDevicePoint.Rows[0]["UserCode"] + "";
  372. dr["UserName"] = smartDevicePoint.Rows[0]["UserName"] + "";
  373. //fly add 2022-05-10 交坯节点必须有这个参数
  374. dr["GroutingUserCode"] = conn.ExecuteScalar(@"
  375. SELECT
  376. P.USERCODE
  377. FROM
  378. TP_PM_GROUTINGDAILYDETAIL P
  379. WHERE
  380. P.BARCODE = @barcode@
  381. AND P.VALUEFLAG = '1'
  382. ",
  383. new CDAParameter("barcode", barCodes[i])
  384. );
  385. barcodeTable.Rows.Add(dr);
  386. }
  387. }
  388. if (barcodeTable.Rows.Count > 0)
  389. {
  390. //调用通用计件方法
  391. ProcedureEntity procedureInfo = null;
  392. return PMModuleLogicDAL.AddWorkPiece(procedureID, barcodeTable, sUserInfo, out procedureInfo);
  393. }
  394. }
  395. return null;
  396. }
  397. #endregion
  398. #endregion
  399. }
  400. }