华恒Mes鼎捷代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

586 lines
23 KiB

5 months ago
  1. using ICSSoft.Base.Config.AppConfig;
  2. using ICSSoft.Base.Config.DBHelper;
  3. using ICSSoft.Frame.Common;
  4. using ICSSoft.Frame.Data.Entity;
  5. using Newtonsoft.Json;
  6. using Newtonsoft.Json.Linq;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Data;
  10. using System.Linq;
  11. using System.Text;
  12. namespace ICSSoft.Frame.Data.DAL
  13. {
  14. public class ICSAGVDAL
  15. {
  16. public static string CreateAGVTaskJJorBack(List<AGVCreateTaskModel> Model_List, List<ICSAGVTASKLOG> Log_List ,string Appconstr, string workpoint)
  17. {
  18. StringBuilder RtnMes = new StringBuilder("");
  19. AGVCreateTaskReturnModel rr = new AGVCreateTaskReturnModel();
  20. try
  21. {
  22. string CreateTaskUrl = "";
  23. //获取URL地址
  24. string sql = @" select vv.define1 from Sys_EnumValues vv
  25. inner join Sys_Enumkey kk on kk.WorkPointCode=vv.WorkPointCode and kk.EnumKey=vv.EnumKey
  26. where kk.enumname='AGV管控'
  27. and vv.EnumText='CreateTaskUrl'
  28. and kk.WorkPointCode ='" + workpoint + "'";
  29. DataTable dt = DBHelper.ExecuteDataset(Appconstr, CommandType.Text, sql).Tables[0];
  30. if (dt == null || dt.Rows.Count == 0)
  31. {
  32. throw new Exception("请联系管理员,在自定义档案中维护信息:AGV管控-CreateTaskUrl");
  33. }
  34. CreateTaskUrl = dt.Rows[0]["define1"].ToString();
  35. for (int i = 0; i < Model_List.Count; i++)
  36. {
  37. var Model = Model_List[i];
  38. var Log = Log_List[i];
  39. try
  40. {
  41. string ReturnStr = CustWebRequest.WorkDayPostData(CreateTaskUrl, JsonConvert.SerializeObject(Model), "application/json;charset=UTF-8");
  42. StringBuilder str = new StringBuilder();
  43. str.AppendLine("创建AGV接口(CreateAGVTask):" + Model.trackingNumber);
  44. str.AppendLine("接口传入数据:" + JsonConvert.SerializeObject(Model));
  45. str.AppendLine("接口返回数据:" + ReturnStr);
  46. ICSMO2UserDAL.WriteLogFile(str.ToString(), "AGV接口");
  47. if (string.IsNullOrEmpty(ReturnStr))
  48. {
  49. throw new Exception("调用接口返回信息为空");
  50. }
  51. JObject obj = new JObject();
  52. obj = JObject.Parse(ReturnStr);
  53. if (obj["code"] == null)
  54. {
  55. throw new Exception("接口返回数据异常:数据内容:" + ReturnStr);
  56. }
  57. else if (obj["code"].ToString() != "200")
  58. {
  59. throw new Exception("接口返回数据异常:异常信息:" + obj["msg"].ToString());
  60. }
  61. try
  62. {
  63. rr = JsonConvert.DeserializeObject<AGVCreateTaskReturnModel>(ReturnStr);
  64. }
  65. catch (Exception ex)
  66. {
  67. throw new Exception("解析接口返回数据失败:数据内容:" + ReturnStr + Environment.NewLine +
  68. "失败原因:" + ex.Message);
  69. }
  70. Log.ParamsMes = JsonConvert.SerializeObject(Model);
  71. Log.ReturnMes = ReturnStr;
  72. Log.Eattribute2 = rr.data.id; //AGV任务编号,后续如果要回写小车到位状态,用此编号查询
  73. WriteMesAgvLog(Log);
  74. }
  75. catch (Exception ex)
  76. {
  77. RtnMes.Append("条码:"+Log.Lotno+",工序:"+Log.Opcode+",点位:"+Log.LocationCode+",区域:"+Log.Area+" 子件物料:"+Log.MaterialCode+":"+ex.Message+","+Log.TaskType+"失败,已跳过!\r\n");
  78. continue;
  79. }
  80. }
  81. return RtnMes.ToString();
  82. }
  83. catch (Exception ex)
  84. {
  85. throw ex;
  86. }
  87. }
  88. public static void AgvAreaToArea(AgvAreaToAreaModel Model, ICSAGVTASKLOG log, string Appconstr, string workpoint) {
  89. try
  90. {
  91. string Url = "";
  92. //获取URL地址
  93. string sql = @" select vv.define1 from Sys_EnumValues vv
  94. inner join Sys_Enumkey kk on kk.WorkPointCode=vv.WorkPointCode and kk.EnumKey=vv.EnumKey
  95. where kk.enumname='AGV管控'
  96. and vv.EnumText='regionalMoveUrl'
  97. and kk.WorkPointCode ='" + workpoint + "'";
  98. DataTable dt = DBHelper.ExecuteDataset(Appconstr, CommandType.Text, sql).Tables[0];
  99. if (dt == null || dt.Rows.Count == 0)
  100. {
  101. throw new Exception("请联系管理员,在自定义档案中维护信息:AGV管控-regionalMoveUrl");
  102. }
  103. Url = dt.Rows[0]["define1"].ToString();
  104. string ReturnStr = CustWebRequest.WorkDayPostData(Url, JsonConvert.SerializeObject(Model), "application/json;charset=UTF-8");
  105. StringBuilder str = new StringBuilder();
  106. str.AppendLine("创建AGV接口(regionalMove):" + Model.trackingNumber+" "+log.Opcode);
  107. str.AppendLine("接口传入数据:" + JsonConvert.SerializeObject(Model));
  108. str.AppendLine("接口返回数据:" + ReturnStr);
  109. ICSMO2UserDAL.WriteLogFile(str.ToString(), "AGV接口");
  110. if (string.IsNullOrEmpty(ReturnStr))
  111. {
  112. throw new Exception("调用接口返回信息为空");
  113. }
  114. JObject obj = new JObject();
  115. obj = JObject.Parse(ReturnStr);
  116. if (obj["code"] == null)
  117. {
  118. throw new Exception("接口返回数据异常:数据内容:" + ReturnStr);
  119. }
  120. else if (obj["code"].ToString() != "200")
  121. {
  122. throw new Exception("接口返回数据异常:异常信息:" + obj["msg"].ToString());
  123. }
  124. log.ParamsMes = JsonConvert.SerializeObject(Model);
  125. log.ReturnMes = ReturnStr;
  126. WriteMesAgvLog(log);
  127. }
  128. catch (Exception ex)
  129. {
  130. throw ex;
  131. }
  132. }
  133. public static string AgvPointToPoint(List<PointToPointModel> Model_List, List<ICSAGVTASKLOG> Log_List, string Appconstr, string workpoint)
  134. {
  135. StringBuilder RtnMes = new StringBuilder("");
  136. try
  137. {
  138. string CreateTaskUrl = "";
  139. //获取URL地址
  140. string sql = @" select vv.define1 from Sys_EnumValues vv
  141. inner join Sys_Enumkey kk on kk.WorkPointCode=vv.WorkPointCode and kk.EnumKey=vv.EnumKey
  142. where kk.enumname='AGV管控'
  143. and vv.EnumText='PointToPointUrl'
  144. and kk.WorkPointCode ='" + workpoint + "'";
  145. DataTable dt = DBHelper.ExecuteDataset(Appconstr, CommandType.Text, sql).Tables[0];
  146. if (dt == null || dt.Rows.Count == 0)
  147. {
  148. throw new Exception("请联系管理员,在自定义档案中维护信息:AGV管控-PointToPointUrl");
  149. }
  150. CreateTaskUrl = dt.Rows[0]["define1"].ToString();
  151. for (int i = 0; i < Model_List.Count; i++)
  152. {
  153. var Model = Model_List[i];
  154. var Log = Log_List[i];
  155. try
  156. {
  157. string ReturnStr = CustWebRequest.WorkDayPostData(CreateTaskUrl, JsonConvert.SerializeObject(Model), "application/json;charset=UTF-8");
  158. StringBuilder str = new StringBuilder();
  159. str.AppendLine("创建AGV接口(PointToPointUrl):" +Log.Lotno);
  160. str.AppendLine("接口传入数据:" + JsonConvert.SerializeObject(Model));
  161. str.AppendLine("接口返回数据:" + ReturnStr);
  162. ICSMO2UserDAL.WriteLogFile(str.ToString(), "AGV接口");
  163. if (string.IsNullOrEmpty(ReturnStr))
  164. {
  165. throw new Exception("调用接口返回信息为空");
  166. }
  167. JObject obj = new JObject();
  168. obj = JObject.Parse(ReturnStr);
  169. if (obj["code"] == null)
  170. {
  171. throw new Exception("接口返回数据异常:数据内容:" + ReturnStr);
  172. }
  173. else if (obj["code"].ToString() != "200")
  174. {
  175. throw new Exception("接口返回数据异常:异常信息:" + obj["msg"].ToString());
  176. }
  177. Log.ParamsMes = JsonConvert.SerializeObject(Model);
  178. Log.ReturnMes = ReturnStr;
  179. WriteMesAgvLog(Log);
  180. }
  181. catch (Exception ex)
  182. {
  183. RtnMes.Append("条码:" + Log.Lotno + ",工序:" + Log.Opcode + ",起始点位:" + Log.LocationCode + ",结束点位:" + Log.EndLocation + " :" + ex.Message + "," + Log.TaskType + "失败,已跳过!\r\n");
  184. continue;
  185. }
  186. }
  187. return RtnMes.ToString();
  188. }
  189. catch (Exception ex)
  190. {
  191. throw ex;
  192. }
  193. }
  194. public static AGVCancelTaskReturnModel CancelAGVTask(AGVCancelTaskModel Model, string Appconstr, string workpoint)
  195. {
  196. AGVCancelTaskReturnModel rr = new AGVCancelTaskReturnModel();
  197. try
  198. {
  199. string CreateTaskUrl = "";
  200. //获取URL地址
  201. string sql = @" select vv.define1 from Sys_EnumValues vv
  202. inner join Sys_Enumkey kk on kk.WorkPointCode=vv.WorkPointCode and kk.EnumKey=vv.EnumKey
  203. where kk.enumname='AGV管控'
  204. and vv.EnumText='CancelTaskUrl'
  205. and kk.WorkPointCode ='" + workpoint + "'";
  206. DataTable dt = DBHelper.ExecuteDataset(Appconstr, CommandType.Text, sql).Tables[0];
  207. if (dt == null || dt.Rows.Count == 0)
  208. {
  209. throw new Exception("请联系管理员,在自定义档案中维护信息:AGV管控-CancelTaskUrl");
  210. }
  211. CreateTaskUrl = dt.Rows[0]["define1"].ToString();
  212. string ReturnStr = CustWebRequest.WorkDayPostData(CreateTaskUrl, JsonConvert.SerializeObject(Model), "application/json;charset=UTF-8");
  213. StringBuilder str = new StringBuilder();
  214. str.AppendLine("创建AGV接口(CancelAGVTask):" );
  215. str.AppendLine("接口传入数据:" + JsonConvert.SerializeObject(Model));
  216. str.AppendLine("接口返回数据:" + ReturnStr);
  217. ICSMO2UserDAL.WriteLogFile(str.ToString(), "AGV接口");
  218. if (string.IsNullOrEmpty(ReturnStr))
  219. {
  220. throw new Exception("调用接口返回信息为空");
  221. }
  222. JObject obj = new JObject();
  223. obj = JObject.Parse(ReturnStr);
  224. if (obj.Property("message") == null || obj.Property("result") == null)
  225. {
  226. throw new Exception("接口返回数据异常:数据内容:" + ReturnStr);
  227. }
  228. try
  229. {
  230. rr = JsonConvert.DeserializeObject<AGVCancelTaskReturnModel>(ReturnStr);
  231. }
  232. catch (Exception ex)
  233. {
  234. throw new Exception("解析接口返回数据失败:数据内容:" + ReturnStr + Environment.NewLine +
  235. "失败原因:" + ex.Message);
  236. }
  237. return rr;
  238. }
  239. catch (Exception ex)
  240. {
  241. rr.result = null;
  242. rr.message = ex.Message;
  243. return rr;
  244. }
  245. }
  246. public static bool IsCanToAGV(string Lotno,string Opcode,string Type, string Appconstr, string workpoint)
  247. {
  248. try
  249. {
  250. //获取URL地址
  251. string sql = @" select vv.define1 from Sys_EnumValues vv
  252. inner join Sys_Enumkey kk on kk.WorkPointCode=vv.WorkPointCode and kk.EnumKey=vv.EnumKey
  253. where kk.enumname='AGV管控'
  254. and vv.EnumText='" + Type + @"'
  255. and kk.WorkPointCode ='" + workpoint+@"'
  256. Select SEGCODE FROM ICSMO2USER WHERE lotno='"+Lotno+"' and opcode='"+Opcode+@"'
  257. ";
  258. DataSet set = DBHelper.ExecuteDataset(Appconstr, CommandType.Text, sql);
  259. DataTable dt = set.Tables[0];
  260. DataTable dt1 = set.Tables[1];
  261. if (dt != null && dt.Rows.Count > 0)
  262. {
  263. if (dt.Rows[0]["define1"].ToString() == "是"&& dt1.Rows[0]["SEGCODE"].ToString()=="1")
  264. {
  265. return true;
  266. }
  267. else
  268. {
  269. return false;
  270. }
  271. }
  272. else
  273. {
  274. throw new Exception("请联系管理员,在自定义档案中维护信息:AGV管控-" + Type);
  275. }
  276. }
  277. catch (Exception ex)
  278. {
  279. throw new Exception(ex.Message);
  280. }
  281. }
  282. public static List<MaterialItem> GetOPBOM(string LotNo, string opcode, string Appconstr, string workpoint)
  283. {
  284. List<MaterialItem> List = new List<MaterialItem>();
  285. try
  286. {
  287. string sql = @"
  288. IF EXISTS ( SELECT * FROM tempdb..sysobjects WHERE id = object_id( 'tempdb..#TEMP_MODD' ) )
  289. DROP TABLE #TEMP_MODD
  290. IF EXISTS ( SELECT * FROM tempdb..sysobjects WHERE id = object_id( 'tempdb..#TEMP_MONewbom' ) )
  291. DROP TABLE #TEMP_MONewbom
  292. SELECT
  293. lot.lotqty, mo.itemcode, rr.routecode, mo.workpoint
  294. INTO #TEMP_MODD
  295. FROM
  296. icsitemlot lot
  297. LEFT JOIN icsmo mo ON mo.mocode= lot.TransNO
  298. AND mo.moseq= lot.TransLine
  299. AND mo.workpoint= lot.workpoint
  300. LEFT JOIN ICSMO2ROUTE rr ON rr.mocode= mo.mocode
  301. AND rr.moid= mo.id
  302. AND rr.workpoint= mo.workpoint
  303. WHERE
  304. lot.lotno= '" + LotNo + @"'
  305. AND mo.workpoint= '" + workpoint + @"'
  306. SELECT
  307. itemcode, SBOMVER, workpoint INTO #TEMP_MONewbom
  308. FROM
  309. (
  310. SELECT
  311. MM.itemcode ,
  312. mm.SBOMVER ,
  313. MM.workpoint,
  314. row_number ( ) OVER ( partition BY MM.itemcode ORDER BY mm.SBOMVER DESC ) rn
  315. FROM
  316. ICSSBOM MM
  317. WHERE
  318. EXISTS ( SELECT 1 FROM #TEMP_MODD DD WHERE MM.ITEMCODE= DD.ITEMCODE AND MM.workpoint= dd.workpoint )
  319. ) gg
  320. WHERE
  321. rn = 1
  322. SELECT
  323. ll.obitemcode, ll.obitemqty* dd.lotqty obitemqty
  324. FROM
  325. ICSOPBOMDETAIL ll
  326. INNER JOIN #TEMP_MONewbom bb ON bb.itemcode= ll.itemcode
  327. AND bb.WorkPoint= ll.workpoint
  328. INNER JOIN #TEMP_MODD dd ON dd.routecode= ll.obcode
  329. WHERE ll.opcode= '" + opcode + @"'
  330. IF EXISTS ( SELECT * FROM tempdb..sysobjects WHERE id = object_id( 'tempdb..#TEMP_MODD' ) )
  331. DROP TABLE #TEMP_MODD
  332. IF EXISTS ( SELECT * FROM tempdb..sysobjects WHERE id = object_id( 'tempdb..#TEMP_MONewbom' ) )
  333. DROP TABLE #TEMP_MONewbom
  334. ";
  335. DataTable dt = DBHelper.ExecuteDataset(Appconstr, CommandType.Text, sql).Tables[0];
  336. if (dt != null && dt.Rows.Count > 0)
  337. {
  338. foreach (DataRow dr in dt.Rows)
  339. {
  340. MaterialItem mm = new MaterialItem();
  341. mm.materialCode = dr["obitemcode"].ToString();
  342. mm.qty = Convert.ToInt32(Convert.ToDouble(dr["obitemqty"].ToString()));
  343. List.Add(mm);
  344. }
  345. }
  346. }
  347. catch (Exception ex)
  348. {
  349. throw new Exception(ex.Message);
  350. }
  351. return List;
  352. }
  353. public static bool IsFirstOP(string LOTNO, string opcode, string Appconstr, string workpoint)
  354. {
  355. try
  356. {
  357. string sql = @"
  358. SELECT opcode FROM ICSITEMROUTE2OPLOT WHERE LOTNO='" + LOTNO + @"' ORDER BY OPSEQ
  359. ";
  360. DataTable dt = DBHelper.ExecuteDataset(Appconstr, CommandType.Text, sql).Tables[0];
  361. if (dt != null && dt.Rows.Count > 0)
  362. {
  363. if (opcode == dt.Rows[0]["opcode"].ToString())
  364. {
  365. return true;
  366. }
  367. else
  368. {
  369. return false;
  370. }
  371. }
  372. else
  373. {
  374. throw new Exception("查询工艺路线数据异常");
  375. }
  376. }
  377. catch (Exception ex)
  378. {
  379. throw new Exception(ex.Message);
  380. }
  381. }
  382. public static bool IsLastOP(string LOTNO, string opcode, string Appconstr, string workpoint)
  383. {
  384. try
  385. {
  386. string sql = @"
  387. SELECT opcode FROM ICSITEMROUTE2OPLOT WHERE LOTNO='" + LOTNO+@"' ORDER BY OPSEQ DESC
  388. ";
  389. DataTable dt = DBHelper.ExecuteDataset(Appconstr, CommandType.Text, sql).Tables[0];
  390. if (dt != null && dt.Rows.Count > 0)
  391. {
  392. if (opcode == dt.Rows[0]["opcode"].ToString())
  393. {
  394. return true;
  395. }
  396. else
  397. {
  398. return false;
  399. }
  400. }
  401. else
  402. {
  403. throw new Exception("查询工艺路线数据异常");
  404. }
  405. }
  406. catch (Exception ex)
  407. {
  408. throw new Exception(ex.Message);
  409. }
  410. }
  411. public static bool NextOPisWW(string LOTNO, string opcode, string Appconstr, string workpoint)
  412. {
  413. try
  414. {
  415. string sql = @"
  416. SELECT TOP 1 A.OPCODE,OPSEQ,C.EATTRIBUTE1 FROM ICSITEMROUTE2OPLOT A
  417. LEFT JOIN ICSMO2USER C ON C.LOTNO=A.LOTNO AND C.OPCODE=A.OPCODE
  418. WHERE A.LOTNO='"+LOTNO+@"'
  419. AND OPSEQ>(SELECT OPSEQ FROM ICSITEMROUTE2OPLOT B WHERE B.LotNo=A.LotNo AND B.OPCODE='"+opcode+@"') ORDER BY A.OPSEQ
  420. ";
  421. DataTable dt = DBHelper.ExecuteDataset(Appconstr, CommandType.Text, sql).Tables[0];
  422. if (dt != null && dt.Rows.Count > 0)
  423. {
  424. if (String.IsNullOrEmpty(dt.Rows[0]["EATTRIBUTE1"].ToString())|| dt.Rows[0]["EATTRIBUTE1"].ToString()=="0")
  425. {
  426. return false;
  427. }
  428. else
  429. {
  430. return true;
  431. }
  432. }
  433. else
  434. {
  435. return false;
  436. }
  437. }
  438. catch (Exception ex)
  439. {
  440. throw new Exception(ex.Message);
  441. }
  442. }
  443. public static bool NextOPisWG(string LOTNO, string opcode, string Appconstr, string workpoint)
  444. {
  445. try
  446. {
  447. string sql = @"
  448. SELECT ACTIONRESULT FROM ICSLOTONWIP WHERE LOTNO='"+LOTNO+@"' AND OPCODE IN
  449. (SELECT TOP 1 A.OPCODE FROM ICSITEMROUTE2OPLOT A
  450. LEFT JOIN ICSMO2USER C ON C.LOTNO=A.LOTNO AND C.OPCODE=A.OPCODE
  451. WHERE A.LOTNO='" + LOTNO + @"'
  452. AND OPSEQ>(SELECT OPSEQ FROM ICSITEMROUTE2OPLOT B WHERE B.LotNo=A.LotNo AND B.OPCODE='" + opcode + @"') ORDER BY A.OPSEQ );
  453. ";
  454. DataTable dt = DBHelper.ExecuteDataset(Appconstr, CommandType.Text, sql).Tables[0];
  455. if (dt != null && dt.Rows.Count > 0)
  456. {
  457. if (dt.Rows[0]["ACTIONRESULT"].ToString()== "COLLECT_END")
  458. {
  459. return true;
  460. }
  461. else
  462. {
  463. return false;
  464. }
  465. }
  466. else
  467. {
  468. return false;
  469. }
  470. }
  471. catch (Exception ex)
  472. {
  473. throw new Exception(ex.Message);
  474. }
  475. }
  476. public static string GetAreaCode(string enumkey, string EnumValue, string Appconstr, string workpoint) {
  477. try
  478. {
  479. string sql = "select ENUMTEXT,DEFINE1,DEFINE2,DEFINE3 FROM Sys_EnumValues WHERE EnumKey='{0}' AND ENUMVALUE='{1}' and workpointcode='{2}'";
  480. sql = string.Format(sql, enumkey, EnumValue,workpoint);
  481. var reader = DBHelper.ExecuteReader(Appconstr, CommandType.Text, sql);
  482. string returnmes = "";
  483. while (reader.Read())
  484. {
  485. returnmes = reader.GetString(0) + ":" + reader.GetString(1)+"@"+ reader.GetString(2)+":"+ reader.GetString(3);
  486. }
  487. return returnmes;
  488. }
  489. catch (Exception ex) {
  490. throw ex;
  491. }
  492. }
  493. public static void WriteMesAgvLog(ICSAGVTASKLOG log)
  494. {
  495. FramDataContext db = new FramDataContext(AppConfig.AppConnectString);
  496. db.Connection.Open();
  497. db.Transaction = db.Connection.BeginTransaction();
  498. try
  499. {
  500. db.ICSAGVTASKLOG.InsertOnSubmit(log);
  501. db.SubmitChanges();
  502. db.Transaction.Commit();
  503. }
  504. catch (Exception ex)
  505. {
  506. db.Transaction.Rollback();
  507. throw ex;
  508. }
  509. finally
  510. {
  511. db.Connection.Close();
  512. }
  513. }
  514. }
  515. }