GetBOMData.ashx 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
  1. <%@ WebHandler Language="C#" Class="GetBOMData" %>
  2. using System;
  3. using System.Data;
  4. using System.Linq;
  5. using System.Web;
  6. using System.Web.SessionState;
  7. using System.Web.Configuration;
  8. using System.Collections;
  9. using System.Collections.Generic;
  10. using System.Collections.Specialized;
  11. using System.Configuration;
  12. using Newtonsoft.Json;
  13. using Newtonsoft.Json.Linq;
  14. using Curtain.DataAccess;
  15. using Curtain.Log;
  16. using DK.XuWei.WebMes;
  17. /// <summary>
  18. /// 获取 预检数据
  19. /// xuwei 2020-06-11
  20. /// </summary>
  21. public class GetBOMData : IHttpHandler, IReadOnlySessionState
  22. {
  23. //SAP服务器配置参数
  24. public static string sapBOMUrl = ConfigurationManager.AppSettings["SapBOMUrl"].ToString();
  25. public static string sapUserInfo = ConfigurationManager.AppSettings["SapUserInfo"].ToString();
  26. public void ProcessRequest(HttpContext context)
  27. {
  28. DataRow[] rows = null;
  29. string datuv = System.DateTime.Now.Date.ToString("yyyyMMdd");
  30. using (IDataAccess conn = DataAccess.Create())
  31. {
  32. DataTable dtMatnr = conn.ExecuteDatatable(@"
  33. SELECT GDD.MATERIALCODE AS MATNR,
  34. DECODE(GDD.TESTMOULDFLAG, 0, 'C', 1, 'Y', '-') AS ZSCMS,
  35. CASE
  36. WHEN (INSTR(GDD.GROUTINGLINECODE, 'A') = 1 OR INSTR(GDD.GROUTINGLINECODE, 'D') = 1)
  37. AND INSTR(GT.GOODSTYPECODE, '001002') = 1 THEN
  38. 1
  39. WHEN (INSTR(GDD.GROUTINGLINECODE, 'B') = 1 OR INSTR(GDD.GROUTINGLINECODE, 'D') = 1)
  40. AND INSTR(GT.GOODSTYPECODE, '001001') = 1 THEN
  41. 2
  42. WHEN INSTR(GDD.GROUTINGLINECODE, 'C') = 1 THEN
  43. 3
  44. ELSE
  45. 9
  46. END AS WORKSHOP
  47. FROM TP_PM_GROUTINGDAILYDETAIL GDD
  48. INNER JOIN TP_MST_GOODS G
  49. ON G.GOODSID = GDD.GOODSID
  50. INNER JOIN TP_MST_GOODSTYPE GT
  51. ON GT.GOODSTYPEID = G.GOODSTYPEID
  52. WHERE GDD.BARCODE = @BARCODE@ ",
  53. new CDAParameter("BARCODE", context.Request["barCode"])
  54. );
  55. // 如果有logoid,就是换商标,重新查一下
  56. if (context.Request["logoId"] != null)
  57. {
  58. object newMatnr = conn.ExecuteScalar(@"
  59. SELECT T.MATERIALCODE
  60. FROM (SELECT G.GOODSID,
  61. G.LOGOID,
  62. G.MATERIALCODE
  63. FROM TP_MST_GOODS G
  64. UNION ALL
  65. SELECT S.GOODSID,
  66. S.LOGOID,
  67. S.MATERIALCODE
  68. FROM TP_MST_GOODSLOGOSAP S) T
  69. WHERE T.LOGOID = @LOGOID@
  70. AND EXISTS (SELECT 1
  71. FROM TP_PM_GROUTINGDAILYDETAIL G
  72. WHERE G.GOODSID = T.GOODSID
  73. AND G.BARCODE = @BARCODE@) ",
  74. new CDAParameter("LOGOID", context.Request["logoId"]),
  75. new CDAParameter("BARCODE", context.Request["barCode"])
  76. );
  77. dtMatnr.Rows[0]["MATNR"] = newMatnr;
  78. }
  79. object procedurename = conn.ExecuteScalar(@"
  80. SELECT PROCEDURENAME
  81. FROM TP_PC_PROCEDURE
  82. WHERE PROCEDUREID = @PROCEDUREID@ ",
  83. new CDAParameter("PROCEDUREID", context.Request["procedureId"])
  84. );
  85. #region 直接查bom
  86. //DataTable dtBOMDetail = conn.ExecuteDatatable(@"
  87. //SELECT PB.MATNR,
  88. // PBD.IDNRK,
  89. // PBD.NAME AS IDNRKNAME,
  90. // PBD.MEINS,
  91. // PBD.MENGE,
  92. // '9999' AS CHARG,
  93. // '2420' AS LGORT
  94. // FROM TP_MST_PACKINGBOMDETAIL PBD
  95. // INNER JOIN TP_MST_PACKINGBOM PB
  96. // ON PB.PACKINGBOMID = PBD.PACKINGBOMID
  97. // WHERE PB.VERID = 'V100'
  98. // AND PB.MATNR = @MATNR@ ",
  99. // new CDAParameter("MATNR", dtMatnr.Rows[0]["MATNR"])
  100. //);
  101. //context.Response.Write(new JsonResult() { success = true, message = "操作成功!", rows = dtBOMDetail }.ToJson());
  102. #endregion
  103. #region 调实时bom接口,查数据
  104. //Hashtable pars = new Hashtable();
  105. //pars.Add("MATNR", dtMatnr.Rows[0]["MATNR"]); // 物料
  106. //pars.Add("WERKS", "5000"); // 工厂
  107. //pars.Add("ZSCS", "T"); // 生产工艺
  108. //pars.Add("ZSCCJ", dtMatnr.Rows[0]["WORKSHOP"]); // 生产车间
  109. //pars.Add("ZSCMS", dtMatnr.Rows[0]["ZSCMS"]); // 生产模式
  110. //pars.Add("ZJDNU", "60"); // 节点
  111. //pars.Add("DATUV", datuv); // 查询日期
  112. //pars.Add("EMENG", 1); // 需求数量
  113. //Hashtable item = new Hashtable();
  114. //item.Add("item", pars);
  115. //Hashtable body = new Hashtable();
  116. //body.Add("T_INPUT", item);
  117. //string json = JsonConvert.SerializeObject(body);
  118. ////string url = "http://hgs4podev.hegii.com:50200/RESTAdapter/DKMES/ZPPFM039";// 测试
  119. ////string userName = "hgsapdk:Sapdk#240"; // 测试
  120. //string message = JsonClient.PostData2(sapBOMUrl, json, "POST", sapUserInfo);
  121. //JObject returnObj = JsonConvert.DeserializeObject<JObject>(message);
  122. //JObject output = returnObj["T_OUTPUT"] as JObject;
  123. //JArray array = output["item"] as JArray;
  124. //DataTable dtIdnrk = ConvertToDataTable(array);
  125. //if ("E".Equals(dtIdnrk.Rows[0]["ZTYPE"] + ""))
  126. //{
  127. // context.Response.Write(new JsonResult() { success = false, message = dtIdnrk.Rows[0]["MESSAGE"] + "" }.ToJson());
  128. // return;
  129. //}
  130. DataTable dtIdnrk = conn.ExecuteDatatable(@"
  131. SELECT P.MATNR,
  132. PD.IDNRK,
  133. PD.NAME AS MAKTX,
  134. PD.MENGE,
  135. PD.IDNRKTYPE,
  136. PD.MEINS
  137. FROM TP_MST_PACKINGBOM P
  138. INNER JOIN TP_MST_PACKINGBOMDETAIL PD
  139. ON PD.PACKINGBOMID = P.PACKINGBOMID
  140. WHERE INSTR(PD.NAME, '半成品') = 0
  141. AND P.MATNR = @MATNR@ ",
  142. new CDAParameter("MATNR", dtMatnr.Rows[0]["MATNR"])
  143. );
  144. // 过滤当前工序需要的组件
  145. DataTable dtIdnrkType = conn.ExecuteDatatable(@"
  146. SELECT IDNRKTYPE,SCANFLAG
  147. FROM TP_PC_PROCEDUREIDNRKTYPE
  148. WHERE PROCEDUREID = @PROCEDUREID@ ",
  149. new CDAParameter("PROCEDUREID", context.Request["procedureId"])
  150. );
  151. // 查询当前工序是否已经绑定过组件,并且不是上一道工序
  152. DataTable isIdnrkData = conn.ExecuteDatatable(@"
  153. SELECT DISTINCT PD.BARCODE FROM TP_PM_PRODUCTIONDATA PD
  154. LEFT JOIN TP_PM_INPRODUCTION I ON PD.GROUTINGDAILYDETAILID = I.GROUTINGDAILYDETAILID
  155. LEFT JOIN TP_PM_BARCODEIDNRKREL BI ON BI.BARCODE = PD.BARCODE AND BI.PROCEDUREID = PD.PROCEDUREID
  156. WHERE PD.BARCODE = @BARCODE@
  157. AND PD.PROCEDUREID = @PROCEDUREID@
  158. AND PD.VALUEFLAG = 1
  159. AND I.PROCEDUREID <> @PROCEDUREID@ ",
  160. new CDAParameter("PROCEDUREID", context.Request["procedureId"]),
  161. new CDAParameter("BARCODE", context.Request["barCode"])
  162. );
  163. dtIdnrk.DefaultView.RowFilter = "MAKTX NOT LIKE '%半成品%'";
  164. dtIdnrk = dtIdnrk.DefaultView.ToTable();
  165. // 如果包含其它,就不判断了
  166. if (dtIdnrkType.Select("IDNRKTYPE = '其它'").Length == 0)
  167. {
  168. string fifter = "";
  169. foreach (DataRow row in dtIdnrkType.Rows)
  170. {
  171. fifter += " IDNRKTYPE LIKE '%" + row["IDNRKTYPE"] + "%' OR";
  172. }
  173. // 如果没有条件,也不判断了
  174. if (fifter.Length > 0)
  175. {
  176. fifter = fifter.Substring(0, fifter.Length - 2);
  177. dtIdnrk.DefaultView.RowFilter = fifter;
  178. dtIdnrk = dtIdnrk.DefaultView.ToTable();
  179. }
  180. }
  181. // 过滤掉已安装的组件
  182. object idnrklist = conn.ExecuteScalar(@"
  183. SELECT LISTAGG(IDNRK, ''',''') WITHIN GROUP(ORDER BY IDNRK) AS IDNRKLIST
  184. FROM TP_PM_BARCODEIDNRKREL
  185. WHERE VALUEFLAG = '1'
  186. AND BARCODE = @BARCODE@ ",
  187. new CDAParameter("BARCODE", context.Request["barCode"])
  188. );
  189. if (idnrklist != null)
  190. {
  191. dtIdnrk.DefaultView.RowFilter = "IDNRK NOT IN ('" + idnrklist + "')";
  192. dtIdnrk = dtIdnrk.DefaultView.ToTable();
  193. }
  194. if (dtIdnrk.Rows.Count == 0 && (isIdnrkData == null || isIdnrkData.Rows.Count == 0))
  195. {
  196. context.Response.Write(new JsonResult() { success = false, message = "当前工序没有需要安装的组件。" }.ToJson());
  197. return;
  198. }
  199. // 加上需要的列
  200. dtIdnrk.Columns.Add("LGORT", typeof(string));
  201. dtIdnrk.Columns.Add("CHARG", typeof(string));
  202. dtIdnrk.Columns.Add("PROCEDURENAME", typeof(string));
  203. dtIdnrk.Columns.Add("CREATEUSERNAME", typeof(string));
  204. dtIdnrk.Columns.Add("CREATETIME", typeof(string));
  205. dtIdnrk.Columns.Add("IDNRKONLYCODE", typeof(string));
  206. dtIdnrk.Columns.Add("SCANFLAG", typeof(string));
  207. foreach (DataRow rows1 in dtIdnrk.Rows)
  208. {
  209. foreach (DataRow rows2 in dtIdnrkType.Rows)
  210. {
  211. if (rows1["IDNRKTYPE"].ToString().Contains(rows2["IDNRKTYPE"].ToString()))
  212. {
  213. rows1["SCANFLAG"] = rows2["SCANFLAG"];
  214. }
  215. }
  216. }
  217. //// 提取包材物料编码
  218. //List<string> matnrs = new List<string>();
  219. //foreach (DataRow row in dtIdnrk.Rows)
  220. //{
  221. // if (!matnrs.Contains(row["IDNRK"] + ""))
  222. // {
  223. // matnrs.Add(row["IDNRK"] + "");
  224. // }
  225. //}
  226. //string ZMSG = string.Empty;
  227. //// 获取SAP库存
  228. //DataTable dtSapInventory = SapApi.ZMM_WMS016("5000", matnrs, "", out ZMSG);
  229. //dtSapInventory.DefaultView.RowFilter = "LGORT IN('2420','2430','2440','2450','2460','2470','2480','2490')";
  230. //dtSapInventory = dtSapInventory.DefaultView.ToTable();
  231. ////if (dtSapInventory != null && dtSapInventory.Rows.Count > 0)
  232. //{
  233. // // 改名
  234. // dtSapInventory.Columns["MATNR"].ColumnName = "IDNRK";
  235. // // 判断是否缺库存
  236. // List<string> notEnoughIdnrks = new List<string>();
  237. // foreach (string idnrk in matnrs)
  238. // {
  239. // rows = dtSapInventory.Select("IDNRK = '" + idnrk + "'"); ;
  240. // if (rows.Length == 0)
  241. // {
  242. // notEnoughIdnrks.Add(idnrk);
  243. // }
  244. // }
  245. // //if (notEnoughIdnrks.Count > 0)
  246. // //{
  247. // // context.Response.Write(new JsonResult()
  248. // // {
  249. // // success = false,
  250. // // message = "以下组件在SAP系统中库存不足:\n" + string.Join(",", notEnoughIdnrks.ToArray())
  251. // // }.ToJson());
  252. // // return;
  253. // //}
  254. // // 库存数量要改为数字类型
  255. // dtSapInventory.Columns.Add("BALANCE", typeof(decimal));
  256. // decimal balance = 0;
  257. // foreach (DataRow row in dtSapInventory.Rows)
  258. // {
  259. // decimal.TryParse(row["KYKC"] + "", out balance);
  260. // row["BALANCE"] = balance;
  261. // }
  262. //}
  263. ////else
  264. //{
  265. // //context.Response.Write(new JsonResult()
  266. // //{
  267. // // success = false,
  268. // // message = "以下组件在SAP系统中库存不足:\n" + string.Join(",", matnrs.ToArray())
  269. // //}.ToJson());
  270. // //return;
  271. //}
  272. //dtSapInventory.DefaultView.RowFilter = "BALANCE <> 0";
  273. //dtSapInventory = dtSapInventory.DefaultView.ToTable();
  274. //dtSapInventory.DefaultView.Sort = "LGORT, CHARG";
  275. //dtSapInventory = dtSapInventory.DefaultView.ToTable();
  276. //DateTime now = DateTime.Now;
  277. //foreach (DataRow row in dtIdnrk.Rows)
  278. //{
  279. // //rows = dtSapInventory.Select("IDNRK = '" + row["IDNRK"] + "' AND BALANCE >= " + row["MENGE"]);
  280. // rows = dtSapInventory.Select("IDNRK = '" + row["IDNRK"] + "'");
  281. // if (rows.Length > 0)
  282. // {
  283. // row["LGORT"] = rows[0]["LGORT"];
  284. // row["CHARG"] = rows[0]["CHARG"];
  285. // row["PROCEDURENAME"] = procedurename;
  286. // row["CREATEUSERNAME"] = "";
  287. // //row["CREATETIME"] = now.ToString("yyyyy-MM-dd HH:mm:ss");
  288. // row["CREATETIME"] = "";
  289. // row["IDNRKONLYCODE"] = "";
  290. // }
  291. // else
  292. // {
  293. // //context.Response.Write(new JsonResult()
  294. // //{
  295. // // success = false,
  296. // // message = "以下组件在SAP系统中库存不足:" + row["IDNRK"]
  297. // //}.ToJson());
  298. // //return;
  299. // }
  300. //}
  301. //// 查当前组件的库存
  302. //foreach (DataRow row in dtIdnrk.Rows)
  303. //{
  304. // DataTable dtLgort = conn.ExecuteDatatable(@"
  305. // SELECT LGORT
  306. // FROM TP_PM_LGORTIDNRKTYPEREL LT
  307. // WHERE INSTR('合格证HC0979', IDNRKTYPE) > 0 ",
  308. // new CDAParameter("PROCEDUREID", context.Request["procedureId"])
  309. // );
  310. //}
  311. //dtIdnrk.DefaultView.RowFilter = "LGORT IS NOT NULL AND LGORT <> ''";
  312. //dtIdnrk = dtIdnrk.DefaultView.ToTable();
  313. foreach (DataRow row in dtIdnrk.Rows)
  314. {
  315. row["PROCEDURENAME"] = procedurename;
  316. row["CHARG"] = "";
  317. row["LGORT"] = "";
  318. row["CREATEUSERNAME"] = "";
  319. row["CREATETIME"] = "";
  320. row["IDNRKONLYCODE"] = "";
  321. }
  322. if (dtIdnrk.Rows.Count == 0 && (isIdnrkData == null || isIdnrkData.Rows.Count == 0))
  323. {
  324. context.Response.Write(new JsonResult() { success = false, message = "当前工序没有需要安装的组件。" }.ToJson());
  325. return;
  326. }
  327. else if (isIdnrkData != null && isIdnrkData.Rows.Count > 0)
  328. {
  329. context.Response.Write(new JsonResult() { success = false, message = "该工序已绑定组件" }.ToJson());
  330. return;
  331. }
  332. else
  333. {
  334. context.Response.Write(new JsonResult() { success = true, message = "操作成功!", rows = dtIdnrk }.ToJson());
  335. }
  336. #endregion
  337. }
  338. }
  339. /// <summary>
  340. /// JArray转DataTable
  341. /// </summary>
  342. /// <param name="dataArr"></param>
  343. /// <returns></returns>
  344. public static DataTable ConvertToDataTable(JArray dataArr)
  345. {
  346. if (dataArr == null || dataArr.Count <= 0)
  347. return null;
  348. DataTable result = new DataTable();
  349. var colnames = ((JObject)(dataArr.First)).Properties();
  350. List<string> columnNames = new List<string>();
  351. if (colnames == null || colnames.Count() <= 0)
  352. return null;
  353. foreach (var item in colnames)
  354. {
  355. if (!columnNames.Contains(item.Name))
  356. columnNames.Add(item.Name);
  357. result.Columns.Add(item.Name, typeof(string));
  358. }
  359. foreach (JObject data in dataArr)
  360. {
  361. JObject jo = JObject.Parse(data.ToString());
  362. DataRow row = result.NewRow();
  363. foreach (var columnName in columnNames)
  364. {
  365. if (jo.Property(columnName) == null)
  366. {
  367. data.Add(columnName, "");
  368. row[columnName] = data[columnName].ToString();
  369. }
  370. else
  371. {
  372. row[columnName] = data[columnName].ToString();
  373. }
  374. }
  375. result.Rows.Add(row);
  376. }
  377. return result;
  378. }
  379. public bool IsReusable
  380. {
  381. get
  382. {
  383. return false;
  384. }
  385. }
  386. }