SyncWMS.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using Curtain.DataAccess;
  5. /// <summary>
  6. /// 同步WMS系统条码
  7. /// </summary>
  8. public class SyncWMS
  9. {
  10. /// <summary>
  11. /// 同步WMS系统条码到产成品表
  12. /// </summary>
  13. /// <returns></returns>
  14. public static string SyncWMSToFinishedProduct(DateTime dateBegin, DateTime dateEnd)
  15. {
  16. DateTime beginMonthDate = dateBegin.AddDays(1 - dateBegin.Day); // 月初
  17. DateTime endMonthDate = beginMonthDate.AddMonths(1).AddDays(-1); // 月末
  18. DataTable dtWMS = null;
  19. int result = 0;
  20. /******************************************************* 调WMS系统,查里面有的条码begin **************************************/
  21. string connStr = @"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.17.193.152)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=wmsdpdb.hegii.com)));User Id=wms_dkselect;Password=Wmshgdk0815";
  22. using (IDataAccess connWMS = DataAccess.CreateByString(DataBaseType.Oracle, connStr))
  23. {
  24. string sqlStringWMS = @"
  25. SELECT T.*
  26. FROM (SELECT DAS.SERIALNO,
  27. MIN(DAS.SCANTIME) AS SCANTIME
  28. FROM WMS_HG.DOC_ASN_SERIALNO DAS
  29. LEFT JOIN WMS_HG.BAS_ZTBARCODE BZ
  30. ON DAS.SERIALNO = BZ.SERIALNO
  31. WHERE BZ.SPS in ( '5000', '5020')
  32. AND DAS.SCANTIME >= @DATEBEGIN@
  33. AND DAS.SCANTIME < @DATEEND@
  34. GROUP BY DAS.SERIALNO) T
  35. ORDER BY T.SCANTIME ";
  36. dtWMS = connWMS.ExecuteDatatable(sqlStringWMS,
  37. new CDAParameter("DATEBEGIN", dateBegin, DataType.Date),
  38. new CDAParameter("DATEEND", dateEnd.AddDays(1), DataType.Date)
  39. );
  40. }
  41. using (IDataAccess connFinishedProductWMS = DataAccess.Create())
  42. {
  43. if (dtWMS != null && dtWMS.Rows.Count > 0)
  44. {
  45. // 更新条码上的同步WMS标识语句
  46. string updateFinishedProductIsWMSFlag = @"
  47. UPDATE TP_PM_FINISHEDPRODUCT FP
  48. SET FP.ISWMSFLAG = '1',
  49. FP.SCANTIME = @SCANTIME@
  50. WHERE EXISTS (SELECT 1
  51. FROM TP_PM_GROUTINGDAILYDETAIL GDD
  52. WHERE GDD.GROUTINGDAILYDETAILID = FP.GROUTINGDAILYDETAILID
  53. AND GDD.OUTLABELCODE = @OUTLABELCODE@) ";
  54. foreach (DataRow row in dtWMS.Rows)
  55. {
  56. // 更新条码上的同步WMS标识
  57. result += connFinishedProductWMS.ExecuteNonQuery(updateFinishedProductIsWMSFlag,
  58. new CDAParameter("SCANTIME", row["SCANTIME"]),
  59. new CDAParameter("OUTLABELCODE", row["SERIALNO"])
  60. );
  61. }
  62. }
  63. }
  64. /******************************************************* 调WMS系统,查里面有的条码end *****************************************/
  65. using (IDataAccess conn = DataAccess.Create())
  66. {
  67. try
  68. {
  69. // 开启事务
  70. conn.BeginTransaction();
  71. /*************************************************** 获取需要同步的sap采购订单明细begin ************************************/
  72. // 采购订单交货日期都是月末,要查出本月所有订单
  73. string sqlString = @"
  74. SELECT I.EBELP,
  75. I.EBELN,
  76. I.MATNR,
  77. P.MENGE,
  78. 0 AS ZYSSL
  79. FROM TP_SAP_ITEM I
  80. INNER JOIN TP_SAP_PLAN P
  81. ON P.EBELP = I.EBELP
  82. AND P.EBELN = I.EBELN
  83. WHERE P.EINDT >= @EINDTBEGIN@
  84. AND P.EINDT <= @EINDTEND@
  85. ORDER BY P.EINDT DESC,
  86. I.EBELN DESC ";
  87. DataTable dtSapOrderDetail = conn.ExecuteDatatable(sqlString,
  88. new CDAParameter("EINDTBEGIN", beginMonthDate, DataType.Date),
  89. new CDAParameter("EINDTEND", endMonthDate, DataType.Date)
  90. );
  91. // 调SAP接口,查完工数量
  92. if (dtSapOrderDetail != null && dtSapOrderDetail.Rows.Count > 0)
  93. {
  94. // 提取采购订单编码
  95. List<string> ebelns = new List<string>();
  96. foreach (DataRow row in dtSapOrderDetail.Rows)
  97. {
  98. if (!ebelns.Contains(row["EBELN"] + ""))
  99. {
  100. ebelns.Add(row["EBELN"] + "");
  101. }
  102. }
  103. // 查完工量
  104. DataTable dtSapOrder = null;
  105. DataTable dtTemp = null;
  106. string ZTYPE;
  107. string ZMSG;
  108. foreach (string ebeln in ebelns)
  109. {
  110. dtTemp = SapApi.ZMMFM_MES_POCX(ebeln, out ZTYPE, out ZMSG);
  111. if (dtSapOrder == null)
  112. {
  113. dtSapOrder = dtTemp;
  114. }
  115. else
  116. {
  117. dtSapOrder.Merge(dtTemp);
  118. }
  119. }
  120. // 更新同步时的完工数量语句
  121. string updateSapOrder = @"
  122. UPDATE TP_SAP_ITEM
  123. SET FINISHMENGE = @FINISHMENGE@
  124. WHERE EBELP = @EBELP@
  125. AND EBELN = @EBELN@";
  126. if (dtSapOrder.Rows.Count > 0)
  127. {
  128. DataRow[] drs = null;
  129. decimal finishmenge = 0;
  130. foreach (DataRow row in dtSapOrderDetail.Rows)
  131. {
  132. drs = dtSapOrder.Select("EBELN = '" + row["EBELN"] + "' AND EBELP = '" + row["EBELP"] + "'");
  133. if (drs.Length > 0)
  134. {
  135. decimal.TryParse(drs[0]["ZYSSL"] + "", out finishmenge);
  136. row["ZYSSL"] = finishmenge;
  137. // 更新同步时的完工数量语句
  138. result += conn.ExecuteNonQuery(updateSapOrder,
  139. new CDAParameter("FINISHMENGE", finishmenge),
  140. new CDAParameter("EBELP", row["EBELP"]),
  141. new CDAParameter("EBELN", row["EBELN"])
  142. );
  143. }
  144. }
  145. }
  146. }
  147. /*************************************************** 获取需要同步的sap采购订单明细end **************************************/
  148. /*************************************************** 获取这段时间交接的条码begin ******************************************/
  149. // 先更掉不是WMS系统的
  150. string updateNotWMS = @"
  151. UPDATE TP_PM_FINISHEDPRODUCT FP
  152. SET FP.EBELN = NULL,
  153. FP.EBELP = NULL
  154. WHERE FP.ISWMSFLAG = '0'
  155. AND FP.EBELN IS NOT NULL
  156. AND EXISTS (SELECT 1
  157. FROM TP_SAP_ITEM I
  158. WHERE I.EBELN = FP.EBELN
  159. AND I.EBELP = FP.EBELP
  160. -- AND I.PLANFLAG = '1'
  161. AND I.EINDT >= @EINDTBEGIN@
  162. AND I.EINDT < @EINDTEND@) ";
  163. // 更新条码上的采购订单号和销售行号
  164. result += conn.ExecuteNonQuery(updateNotWMS,
  165. new CDAParameter("EINDTBEGIN", beginMonthDate, DataType.Date),
  166. new CDAParameter("EINDTEND", endMonthDate, DataType.Date)
  167. );
  168. // 取本月有差额的订单明细
  169. sqlString = @"
  170. SELECT T2.*,
  171. T2.FINISHMENGE - T2.CC AS DIFFER
  172. FROM (SELECT I.EBELN,
  173. I.EBELP,
  174. I.MATNR,
  175. I.FINISHMENGE,
  176. NVL(T.CC, 0) AS CC
  177. FROM TP_SAP_ITEM I
  178. LEFT JOIN (SELECT EBELN,
  179. EBELP,
  180. COUNT(1) AS CC
  181. FROM TP_PM_FINISHEDPRODUCT
  182. WHERE EBELN IS NOT NULL
  183. GROUP BY EBELN,
  184. EBELP) T
  185. ON T.EBELN = I.EBELN
  186. AND T.EBELP = I.EBELP
  187. WHERE I.EINDT >= @EINDTBEGIN@
  188. AND I.EINDT <= @EINDTEND@) T2
  189. WHERE T2.FINISHMENGE <> T2.CC ";
  190. DataTable dtDifferOrder = conn.ExecuteDatatable(sqlString,
  191. new CDAParameter("EINDTBEGIN", beginMonthDate, DataType.Date),
  192. new CDAParameter("EINDTEND", endMonthDate, DataType.Date)
  193. );
  194. /*************************************************** 获取这段时间交接的条码end ********************************************/
  195. string updateFinishedProduct = @"
  196. UPDATE TP_PM_FINISHEDPRODUCT F
  197. SET F.EBELN = @EBELN@,
  198. F.EBELP = @EBELP@
  199. WHERE F.EBELN IS NULL
  200. AND EXISTS
  201. (SELECT 1
  202. FROM (SELECT T2.BARCODE
  203. FROM (SELECT ROWNUM AS CC,
  204. T.BARCODE
  205. FROM (SELECT FP.BARCODE
  206. FROM TP_PM_FINISHEDPRODUCT FP
  207. INNER JOIN TP_PM_GROUTINGDAILYDETAIL GDD
  208. ON GDD.GROUTINGDAILYDETAILID = FP.GROUTINGDAILYDETAILID
  209. WHERE FP.ISWMSFLAG = '1'
  210. AND FP.EBELN IS NULL
  211. AND GDD.MATERIALCODE = @MATNR@
  212. ORDER BY FP.SCANTIME DESC) T) T2
  213. WHERE T2.CC <= @DIFFER@) T3
  214. WHERE T3.BARCODE = F.BARCODE) ";
  215. string updateFinishedProduct2 = @"
  216. UPDATE TP_PM_FINISHEDPRODUCT F
  217. SET F.EBELN = @EBELN@,
  218. F.EBELP = @EBELP@
  219. WHERE F.EBELN IS NULL
  220. AND EXISTS
  221. (SELECT 1
  222. FROM (SELECT T2.BARCODE
  223. FROM (SELECT ROWNUM AS CC,
  224. T.BARCODE
  225. FROM (SELECT FP.BARCODE
  226. FROM TP_PM_FINISHEDPRODUCT FP
  227. INNER JOIN TP_PM_GROUTINGDAILYDETAIL GDD
  228. ON GDD.GROUTINGDAILYDETAILID = FP.GROUTINGDAILYDETAILID
  229. WHERE FP.ISWMSFLAG = '0'
  230. AND FP.EBELN IS NULL
  231. AND GDD.MATERIALCODE = @MATNR@
  232. ORDER BY FP.CREATETIME DESC) T) T2
  233. WHERE T2.CC <= @DIFFER@) T3
  234. WHERE T3.BARCODE = F.BARCODE) ";
  235. int executeRows, differ, differ2;
  236. foreach (DataRow drSapOrderDetail in dtDifferOrder.Rows)
  237. {
  238. int.TryParse(drSapOrderDetail["DIFFER"] + "", out differ);
  239. // 更新条码上的采购订单号和销售行号
  240. executeRows = conn.ExecuteNonQuery(updateFinishedProduct,
  241. new CDAParameter("EBELN", drSapOrderDetail["EBELN"]),
  242. new CDAParameter("EBELP", drSapOrderDetail["EBELP"]),
  243. new CDAParameter("MATNR", drSapOrderDetail["MATNR"]),
  244. new CDAParameter("DIFFER", differ)
  245. );
  246. if (executeRows < differ)
  247. {
  248. differ2 = differ - executeRows;
  249. executeRows = conn.ExecuteNonQuery(updateFinishedProduct2,
  250. new CDAParameter("EBELN", drSapOrderDetail["EBELN"]),
  251. new CDAParameter("EBELP", drSapOrderDetail["EBELP"]),
  252. new CDAParameter("MATNR", drSapOrderDetail["MATNR"]),
  253. new CDAParameter("DIFFER", differ2)
  254. );
  255. }
  256. }
  257. /*************************************************** 更新条码上的采购订单号和销售行号begin **********************************/
  258. //decimal zyssl = 0;
  259. //decimal differ = 0;
  260. //DataRow[] rows = null;
  261. //// 更新条码上的采购订单号和销售行号语句
  262. //string updateFinishedProduct = @"
  263. //UPDATE TP_PM_FINISHEDPRODUCT
  264. // SET EBELN = @EBELN@,
  265. // EBELP = @EBELP@
  266. // WHERE BARCODE = @BARCODE@ ";
  267. //// 循环采购订单明细
  268. //foreach (DataRow drSapOrderDetail in dtSapOrderDetail.Rows)
  269. //{
  270. // // 达成数
  271. // decimal.TryParse(drSapOrderDetail["ZYSSL"] + "", out zyssl);
  272. // // 当前订单明细的所有条码
  273. // rows = dtFinishedProduct.Select("EBELN = '" + drSapOrderDetail["EBELN"] + "' AND EBELP = '" + drSapOrderDetail["EBELP"] + "'");
  274. // // 如果条码数大于等于达成数,就不用同步了,跳出当前行,执行下一行
  275. // if (rows.Length >= zyssl)
  276. // {
  277. // continue;
  278. // }
  279. // // 达成数与条码数的差额
  280. // differ = zyssl - rows.Length;
  281. // // 筛选出当前物料编码,还没同步的条码
  282. // rows = dtFinishedProduct.Select("EBELN IS NULL AND EBELP IS NULL AND MATERIALCODE = '" + drSapOrderDetail["MATNR"] + "'", "SCANTIME DESC");
  283. // for (int i = 0; i < differ; i++)
  284. // {
  285. // // 如果条码不够了,就跳出当前循环
  286. // if (rows.Length <= i)
  287. // {
  288. // break;
  289. // }
  290. // rows[i]["EBELN"] = drSapOrderDetail["EBELN"];
  291. // rows[i]["EBELP"] = drSapOrderDetail["EBELP"];
  292. // // 更新条码上的采购订单号和销售行号
  293. // result += conn.ExecuteNonQuery(updateFinishedProduct,
  294. // new CDAParameter("EBELN", drSapOrderDetail["EBELN"]),
  295. // new CDAParameter("EBELP", drSapOrderDetail["EBELP"]),
  296. // new CDAParameter("BARCODE", rows[i]["BARCODE"])
  297. // );
  298. // }
  299. //}
  300. /*************************************************** 更新条码上的采购订单号和销售行号end ************************************/
  301. if (result > 0)
  302. {
  303. conn.Commit();
  304. return "操作成功";
  305. }
  306. else
  307. {
  308. conn.Rollback();
  309. return "操作失败";
  310. }
  311. }
  312. catch (Exception e)
  313. {
  314. conn.Rollback();
  315. return "操作失败:" + e.Message;
  316. }
  317. }
  318. }
  319. }