using System; using System.Collections.Generic; using System.Data; using Curtain.DataAccess; /// /// 同步WMS系统条码 /// public class SyncWMS { /// /// 同步WMS系统条码到产成品表 /// /// public static string SyncWMSToFinishedProduct(DateTime dateBegin, DateTime dateEnd) { DateTime beginMonthDate = dateBegin.AddDays(1 - dateBegin.Day); // 月初 DateTime endMonthDate = beginMonthDate.AddMonths(1).AddDays(-1); // 月末 DataTable dtWMS = null; int result = 0; /******************************************************* 调WMS系统,查里面有的条码begin **************************************/ 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"; using (IDataAccess connWMS = DataAccess.CreateByString(DataBaseType.Oracle, connStr)) { string sqlStringWMS = @" SELECT T.* FROM (SELECT DAS.SERIALNO, MIN(DAS.SCANTIME) AS SCANTIME FROM WMS_HG.DOC_ASN_SERIALNO DAS LEFT JOIN WMS_HG.BAS_ZTBARCODE BZ ON DAS.SERIALNO = BZ.SERIALNO WHERE BZ.SPS in ( '5000', '5020') AND DAS.SCANTIME >= @DATEBEGIN@ AND DAS.SCANTIME < @DATEEND@ GROUP BY DAS.SERIALNO) T ORDER BY T.SCANTIME "; dtWMS = connWMS.ExecuteDatatable(sqlStringWMS, new CDAParameter("DATEBEGIN", dateBegin, DataType.Date), new CDAParameter("DATEEND", dateEnd.AddDays(1), DataType.Date) ); } using (IDataAccess connFinishedProductWMS = DataAccess.Create()) { if (dtWMS != null && dtWMS.Rows.Count > 0) { // 更新条码上的同步WMS标识语句 string updateFinishedProductIsWMSFlag = @" UPDATE TP_PM_FINISHEDPRODUCT FP SET FP.ISWMSFLAG = '1', FP.SCANTIME = @SCANTIME@ WHERE EXISTS (SELECT 1 FROM TP_PM_GROUTINGDAILYDETAIL GDD WHERE GDD.GROUTINGDAILYDETAILID = FP.GROUTINGDAILYDETAILID AND GDD.OUTLABELCODE = @OUTLABELCODE@) "; foreach (DataRow row in dtWMS.Rows) { // 更新条码上的同步WMS标识 result += connFinishedProductWMS.ExecuteNonQuery(updateFinishedProductIsWMSFlag, new CDAParameter("SCANTIME", row["SCANTIME"]), new CDAParameter("OUTLABELCODE", row["SERIALNO"]) ); } } } /******************************************************* 调WMS系统,查里面有的条码end *****************************************/ using (IDataAccess conn = DataAccess.Create()) { try { // 开启事务 conn.BeginTransaction(); /*************************************************** 获取需要同步的sap采购订单明细begin ************************************/ // 采购订单交货日期都是月末,要查出本月所有订单 string sqlString = @" SELECT I.EBELP, I.EBELN, I.MATNR, P.MENGE, 0 AS ZYSSL FROM TP_SAP_ITEM I INNER JOIN TP_SAP_PLAN P ON P.EBELP = I.EBELP AND P.EBELN = I.EBELN WHERE P.EINDT >= @EINDTBEGIN@ AND P.EINDT <= @EINDTEND@ ORDER BY P.EINDT DESC, I.EBELN DESC "; DataTable dtSapOrderDetail = conn.ExecuteDatatable(sqlString, new CDAParameter("EINDTBEGIN", beginMonthDate, DataType.Date), new CDAParameter("EINDTEND", endMonthDate, DataType.Date) ); // 调SAP接口,查完工数量 if (dtSapOrderDetail != null && dtSapOrderDetail.Rows.Count > 0) { // 提取采购订单编码 List ebelns = new List(); foreach (DataRow row in dtSapOrderDetail.Rows) { if (!ebelns.Contains(row["EBELN"] + "")) { ebelns.Add(row["EBELN"] + ""); } } // 查完工量 DataTable dtSapOrder = null; DataTable dtTemp = null; string ZTYPE; string ZMSG; foreach (string ebeln in ebelns) { dtTemp = SapApi.ZMMFM_MES_POCX(ebeln, out ZTYPE, out ZMSG); if (dtSapOrder == null) { dtSapOrder = dtTemp; } else { dtSapOrder.Merge(dtTemp); } } // 更新同步时的完工数量语句 string updateSapOrder = @" UPDATE TP_SAP_ITEM SET FINISHMENGE = @FINISHMENGE@ WHERE EBELP = @EBELP@ AND EBELN = @EBELN@"; if (dtSapOrder.Rows.Count > 0) { DataRow[] drs = null; decimal finishmenge = 0; foreach (DataRow row in dtSapOrderDetail.Rows) { drs = dtSapOrder.Select("EBELN = '" + row["EBELN"] + "' AND EBELP = '" + row["EBELP"] + "'"); if (drs.Length > 0) { decimal.TryParse(drs[0]["ZYSSL"] + "", out finishmenge); row["ZYSSL"] = finishmenge; // 更新同步时的完工数量语句 result += conn.ExecuteNonQuery(updateSapOrder, new CDAParameter("FINISHMENGE", finishmenge), new CDAParameter("EBELP", row["EBELP"]), new CDAParameter("EBELN", row["EBELN"]) ); } } } } /*************************************************** 获取需要同步的sap采购订单明细end **************************************/ /*************************************************** 获取这段时间交接的条码begin ******************************************/ // 先更掉不是WMS系统的 string updateNotWMS = @" UPDATE TP_PM_FINISHEDPRODUCT FP SET FP.EBELN = NULL, FP.EBELP = NULL WHERE FP.ISWMSFLAG = '0' AND FP.EBELN IS NOT NULL AND EXISTS (SELECT 1 FROM TP_SAP_ITEM I WHERE I.EBELN = FP.EBELN AND I.EBELP = FP.EBELP -- AND I.PLANFLAG = '1' AND I.EINDT >= @EINDTBEGIN@ AND I.EINDT < @EINDTEND@) "; // 更新条码上的采购订单号和销售行号 result += conn.ExecuteNonQuery(updateNotWMS, new CDAParameter("EINDTBEGIN", beginMonthDate, DataType.Date), new CDAParameter("EINDTEND", endMonthDate, DataType.Date) ); // 取本月有差额的订单明细 sqlString = @" SELECT T2.*, T2.FINISHMENGE - T2.CC AS DIFFER FROM (SELECT I.EBELN, I.EBELP, I.MATNR, I.FINISHMENGE, NVL(T.CC, 0) AS CC FROM TP_SAP_ITEM I LEFT JOIN (SELECT EBELN, EBELP, COUNT(1) AS CC FROM TP_PM_FINISHEDPRODUCT WHERE EBELN IS NOT NULL GROUP BY EBELN, EBELP) T ON T.EBELN = I.EBELN AND T.EBELP = I.EBELP WHERE I.EINDT >= @EINDTBEGIN@ AND I.EINDT <= @EINDTEND@) T2 WHERE T2.FINISHMENGE <> T2.CC "; DataTable dtDifferOrder = conn.ExecuteDatatable(sqlString, new CDAParameter("EINDTBEGIN", beginMonthDate, DataType.Date), new CDAParameter("EINDTEND", endMonthDate, DataType.Date) ); /*************************************************** 获取这段时间交接的条码end ********************************************/ string updateFinishedProduct = @" UPDATE TP_PM_FINISHEDPRODUCT F SET F.EBELN = @EBELN@, F.EBELP = @EBELP@ WHERE F.EBELN IS NULL AND EXISTS (SELECT 1 FROM (SELECT T2.BARCODE FROM (SELECT ROWNUM AS CC, T.BARCODE FROM (SELECT FP.BARCODE FROM TP_PM_FINISHEDPRODUCT FP INNER JOIN TP_PM_GROUTINGDAILYDETAIL GDD ON GDD.GROUTINGDAILYDETAILID = FP.GROUTINGDAILYDETAILID WHERE FP.ISWMSFLAG = '1' AND FP.EBELN IS NULL AND GDD.MATERIALCODE = @MATNR@ ORDER BY FP.SCANTIME DESC) T) T2 WHERE T2.CC <= @DIFFER@) T3 WHERE T3.BARCODE = F.BARCODE) "; string updateFinishedProduct2 = @" UPDATE TP_PM_FINISHEDPRODUCT F SET F.EBELN = @EBELN@, F.EBELP = @EBELP@ WHERE F.EBELN IS NULL AND EXISTS (SELECT 1 FROM (SELECT T2.BARCODE FROM (SELECT ROWNUM AS CC, T.BARCODE FROM (SELECT FP.BARCODE FROM TP_PM_FINISHEDPRODUCT FP INNER JOIN TP_PM_GROUTINGDAILYDETAIL GDD ON GDD.GROUTINGDAILYDETAILID = FP.GROUTINGDAILYDETAILID WHERE FP.ISWMSFLAG = '0' AND FP.EBELN IS NULL AND GDD.MATERIALCODE = @MATNR@ ORDER BY FP.CREATETIME DESC) T) T2 WHERE T2.CC <= @DIFFER@) T3 WHERE T3.BARCODE = F.BARCODE) "; int executeRows, differ, differ2; foreach (DataRow drSapOrderDetail in dtDifferOrder.Rows) { int.TryParse(drSapOrderDetail["DIFFER"] + "", out differ); // 更新条码上的采购订单号和销售行号 executeRows = conn.ExecuteNonQuery(updateFinishedProduct, new CDAParameter("EBELN", drSapOrderDetail["EBELN"]), new CDAParameter("EBELP", drSapOrderDetail["EBELP"]), new CDAParameter("MATNR", drSapOrderDetail["MATNR"]), new CDAParameter("DIFFER", differ) ); if (executeRows < differ) { differ2 = differ - executeRows; executeRows = conn.ExecuteNonQuery(updateFinishedProduct2, new CDAParameter("EBELN", drSapOrderDetail["EBELN"]), new CDAParameter("EBELP", drSapOrderDetail["EBELP"]), new CDAParameter("MATNR", drSapOrderDetail["MATNR"]), new CDAParameter("DIFFER", differ2) ); } } /*************************************************** 更新条码上的采购订单号和销售行号begin **********************************/ //decimal zyssl = 0; //decimal differ = 0; //DataRow[] rows = null; //// 更新条码上的采购订单号和销售行号语句 //string updateFinishedProduct = @" //UPDATE TP_PM_FINISHEDPRODUCT // SET EBELN = @EBELN@, // EBELP = @EBELP@ // WHERE BARCODE = @BARCODE@ "; //// 循环采购订单明细 //foreach (DataRow drSapOrderDetail in dtSapOrderDetail.Rows) //{ // // 达成数 // decimal.TryParse(drSapOrderDetail["ZYSSL"] + "", out zyssl); // // 当前订单明细的所有条码 // rows = dtFinishedProduct.Select("EBELN = '" + drSapOrderDetail["EBELN"] + "' AND EBELP = '" + drSapOrderDetail["EBELP"] + "'"); // // 如果条码数大于等于达成数,就不用同步了,跳出当前行,执行下一行 // if (rows.Length >= zyssl) // { // continue; // } // // 达成数与条码数的差额 // differ = zyssl - rows.Length; // // 筛选出当前物料编码,还没同步的条码 // rows = dtFinishedProduct.Select("EBELN IS NULL AND EBELP IS NULL AND MATERIALCODE = '" + drSapOrderDetail["MATNR"] + "'", "SCANTIME DESC"); // for (int i = 0; i < differ; i++) // { // // 如果条码不够了,就跳出当前循环 // if (rows.Length <= i) // { // break; // } // rows[i]["EBELN"] = drSapOrderDetail["EBELN"]; // rows[i]["EBELP"] = drSapOrderDetail["EBELP"]; // // 更新条码上的采购订单号和销售行号 // result += conn.ExecuteNonQuery(updateFinishedProduct, // new CDAParameter("EBELN", drSapOrderDetail["EBELN"]), // new CDAParameter("EBELP", drSapOrderDetail["EBELP"]), // new CDAParameter("BARCODE", rows[i]["BARCODE"]) // ); // } //} /*************************************************** 更新条码上的采购订单号和销售行号end ************************************/ if (result > 0) { conn.Commit(); return "操作成功"; } else { conn.Rollback(); return "操作失败"; } } catch (Exception e) { conn.Rollback(); return "操作失败:" + e.Message; } } } }