using System; using System.Data; using System.Text; using Curtain.DataAccess; /// /// 生成滚动日计划 /// public class RollingDailyPlan { /// /// 生成滚动日计划 /// /// public static string RollingNewDailyPlan(DateTime today) { int accountID, userID; // 账套、用户ID DateTime yesterday = today.AddDays(-1); // 昨天 int yesterdayDay = yesterday.Day; // 昨天日期号 int monthDays = DateTime.DaysInMonth(yesterday.Year, yesterday.Month); // 昨天所在月份的日数 int result = 0; using (IDataAccess conn = DataAccess.Create()) { conn.BeginTransaction(); try { // 如果做了成检数结转,先清掉 result += conn.ExecuteNonQuery(@" DELETE FROM TP_PC_CJDAILY WHERE ACCOUNTDATE = @YESTERDAY@ ", new CDAParameter("YESTERDAY", yesterday, DataType.Date) ); // 插入新的成检数结转 result += conn.ExecuteNonQuery(@" INSERT INTO TP_PC_CJDAILY (ACCOUNTDATE ,MATNR ,CJQUANTITY) SELECT TRUNC(T.CREATETIME) AS SJ ,T.MATERIALCODE ,NVL(SUM(DECODE(T.GOODSLEVELTYPEID, 0, 1, 0)), 0) NUM2 FROM (SELECT 0 GOODSLEVELTYPEID ,GDD.MATERIALCODE ,PD.GOODSID ,PD.CREATETIME FROM TP_PM_PRODUCTIONDATA PD INNER JOIN TP_PM_GROUTINGDAILYDETAIL GDD ON GDD.GROUTINGDAILYDETAILID = PD.GROUTINGDAILYDETAILID WHERE ((PD.PROCEDUREID <> 104 AND PD.VALUEFLAG = '1') OR (PD.PROCEDUREID = 104 AND PD.CHECKFLAG = '1')) AND (11 IS NULL OR ((11 = 11 AND ((PD.PROCEDUREID = 11) OR (PD.PROCEDUREID = 104 AND PD.ISREFIRE = '0'))) OR (11 = 58 AND ((PD.PROCEDUREID = 58) OR (PD.PROCEDUREID = 104 AND PD.ISREFIRE = '6'))) OR (11 NOT IN (11, 58) AND PD.PROCEDUREID = 11))) AND (NULL IS NULL OR INSTR(',' || NULL || ',', ',' || PD.PROCEDUREID || ',') > 0) AND PD.ACCOUNTID = 1 AND PD.CREATETIME >= @YESTERDAY@ AND PD.CREATETIME < TRUNC(@YESTERDAY@) + 1 UNION ALL SELECT PD.GOODSLEVELTYPEID ,GDD.MATERIALCODE ,PD.GOODSID ,PD.CREATETIME FROM TP_PM_PRODUCTIONDATA PD INNER JOIN TP_PM_GROUTINGDAILYDETAIL GDD ON GDD.GROUTINGDAILYDETAILID = PD.GROUTINGDAILYDETAILID WHERE PD.VALUEFLAG = '1' AND PD.MODELTYPE = -1 AND PD.ACCOUNTID = 1 AND LENGTH(PD.KILNCARBATCHNO) > 0 AND PD.CREATETIME >= @YESTERDAY@ AND PD.CREATETIME < TRUNC(@YESTERDAY@) + 1 AND PD.ISREFIRE = '0') T INNER JOIN TP_MST_GOODS MSTGOODS ON MSTGOODS.GOODSID = T.GOODSID INNER JOIN TP_MST_GOODSTYPE MSTGOODSTYPE ON MSTGOODSTYPE.GOODSTYPEID = MSTGOODS.GOODSTYPEID WHERE MSTGOODSTYPE.GOODSTYPECODE LIKE '001001%' GROUP BY TRUNC(T.CREATETIME) ,T.MATERIALCODE ORDER BY TRUNC(T.CREATETIME) ,T.MATERIALCODE ", new CDAParameter("YESTERDAY", yesterday, DataType.Date) ); // 更新昨日成检数到日计划 result += conn.ExecuteNonQuery(@" UPDATE (SELECT DPD.DETAILID ,DP.ACCOUNTDATE ,DPD.MATNR ,DPD.CJQUANTITY FROM TP_PC_DAILYPLANDETAIL DPD INNER JOIN TP_PC_DAILYPLAN DP ON DP.DAILYPLANID = DPD.DAILYPLANID WHERE DP.ACCOUNTDATE = @YESTERDAY@) T1 SET T1.CJQUANTITY = (SELECT CJ.CJQUANTITY FROM TP_PC_CJDAILY CJ WHERE CJ.MATNR = T1.MATNR AND CJ.ACCOUNTDATE = T1.ACCOUNTDATE) WHERE EXISTS (SELECT 1 FROM TP_PC_CJDAILY CJ WHERE CJ.MATNR = T1.MATNR AND CJ.ACCOUNTDATE = T1.ACCOUNTDATE) ", new CDAParameter("YESTERDAY", yesterday, DataType.Date) ); // 查询未完成的计划量 // (packingbom不存在goodsid时,先给个固定值) DataTable dtNoFinish = conn.ExecuteDatatable(@" SELECT T1.MONTHPLANID ,T1.MATNR ,NVL(PB.GOODSID, 1) AS GOODSID ,NVL(PB.LOGOID, 15) AS LOGOID ,T1.MENGE ,NVL(T2.CJQUANTITY, 0) AS CJQUANTITY ,T1.MENGE - NVL(T2.CJQUANTITY, 0) AS DIFFER ,T1.ACCOUNTID ,T1.CREATEUSERID FROM (SELECT MP.MONTHPLANID ,MP.ACCOUNTID ,MP.CREATEUSERID ,MPD.MATNR ,SUM(MPD.MENGE) AS MENGE FROM TP_PC_MONTHPLANDETAIL MPD INNER JOIN TP_PC_MONTHPLAN MP ON MP.MONTHPLANID = MPD.MONTHPLANID WHERE MP.PROCEDUREID = 104 AND MP.ACCOUNTMONTH = TO_CHAR(TRUNC(@YESTERDAY@), 'YYYY-MM') GROUP BY MP.MONTHPLANID ,MP.ACCOUNTID ,MP.CREATEUSERID ,MPD.MATNR) T1 INNER JOIN TP_MST_PACKINGBOM PB ON PB.MATNR = T1.MATNR LEFT JOIN (SELECT DPD.MATNR ,SUM(DPD.CJQUANTITY) AS CJQUANTITY FROM TP_PC_DAILYPLANDETAIL DPD INNER JOIN TP_PC_DAILYPLAN DP ON DP.DAILYPLANID = DPD.DAILYPLANID WHERE DP.ACCOUNTDATE >= TRUNC(ADD_MONTHS(LAST_DAY(@YESTERDAY@), -1) + 1) AND DP.ACCOUNTDATE < TRUNC(@YESTERDAY@) + 1 GROUP BY DPD.MATNR) T2 ON T2.MATNR = T1.MATNR WHERE T1.MENGE > NVL(T2.CJQUANTITY, 0) ", new CDAParameter("YESTERDAY", yesterday, DataType.Date) ); if (dtNoFinish.Rows.Count == 0) { return "月计划均已达成,没有需要生成的日计划"; } // 如果昨天不是最后一天 if (yesterdayDay != monthDays) { int primaryKeyCJ = Convert.ToInt32(dtNoFinish.Rows[0]["MONTHPLANID"]); accountID = Convert.ToInt32(dtNoFinish.Rows[0]["ACCOUNTID"]); userID = Convert.ToInt32(dtNoFinish.Rows[0]["CREATEUSERID"]); // 本月最后一天 DateTime enddate = Convert.ToDateTime(today.AddMonths(1).ToString("yyyy-MM-01")).AddDays(-1); TimeSpan sp = enddate.Subtract(today); int days = sp.Days; // 获取合格率 DataTable dtQualifiedPercent = QualifiedPercent.GetQualifiedPercent(conn, today); // 删除之后的日计划 result += conn.ExecuteNonQuery(@" DELETE FROM TP_PC_DAILYPLANDETAIL DPD WHERE DPD.DAILYPLANID IN (SELECT DP.DAILYPLANID FROM TP_PC_DAILYPLAN DP WHERE DP.ACCOUNTDATE > @YESTERDAY@ AND DP.ACCOUNTDATE <= LAST_DAY(@YESTERDAY@)) ", new CDAParameter("YESTERDAY", yesterday, DataType.Date) ); result += conn.ExecuteNonQuery(@" DELETE FROM TP_PC_DAILYPLAN DP WHERE DP.ACCOUNTDATE > @YESTERDAY@ AND DP.ACCOUNTDATE <= LAST_DAY(@YESTERDAY@) ", new CDAParameter("YESTERDAY", yesterday, DataType.Date) ); string sqlIniDailyPlan = @" INSERT INTO TP_PC_DAILYPLAN (DAILYPLANID, DAILYPLANNAME, MONTHPLANID, ACCOUNTDATE, ACCOUNTID, CREATEUSERID, UPDATEUSERID) VALUES (@DAILYPLANID@, @DAILYPLANNAME@, @MONTHPLANID@, @ACCOUNTDATE@, @ACCOUNTID@, @USERID@, @USERID@) "; string sqlIniDailyPlanDetail = @" INSERT INTO TP_PC_DAILYPLANDETAIL (DAILYPLANID, MATNR, GOODSID, LOGOID, OUTQUANTITY, PLANQUANTITY, QUALIFIEDPERCENT, ACCOUNTID, CREATEUSERID, UPDATEUSERID) VALUES (@DAILYPLANID@, @MATNR@, @GOODSID@, @LOGOID@, @OUTQUANTITY@, @PLANQUANTITY@, @QUALIFIEDPERCENT@, @ACCOUNTID@, @USERID@, @USERID@) "; DataRow[] rows = null; for (int i = 0; i <= days; i++) { //获取日计划主键 object dailyPlanID = conn.GetSequenceNextval("SEQ_PC_DAILYPLAN"); DateTime dailyAccountDate = today.AddDays(i); //新建日计划总单 result += conn.ExecuteNonQuery(sqlIniDailyPlan, new CDAParameter("DAILYPLANID", dailyPlanID), new CDAParameter("DAILYPLANNAME", "成检日计划" + dailyAccountDate.ToString("yyyy-MM-dd")), new CDAParameter("MONTHPLANID", primaryKeyCJ), new CDAParameter("ACCOUNTDATE", dailyAccountDate), new CDAParameter("ACCOUNTID", accountID), new CDAParameter("USERID", userID) ); //新建日计划明细 foreach (DataRow drMonthPlanDetail in dtNoFinish.Rows) { // 日均值,向下取整 decimal avgquantity = Math.Floor(Convert.ToDecimal(drMonthPlanDetail["DIFFER"]) / (days + 1)); decimal planquantity = avgquantity; if (i == days) { planquantity = Convert.ToDecimal(drMonthPlanDetail["DIFFER"]) - days * avgquantity; } // 出窑数量 decimal outquantity = planquantity; rows = dtQualifiedPercent.Select("GOODSID = " + drMonthPlanDetail["GOODSID"]); decimal qualifiedpercent = 1; if (rows.Length > 0) { qualifiedpercent = Convert.ToDecimal(rows[0]["QUALIFIEDPERCENT"]); outquantity = Math.Floor(planquantity / qualifiedpercent); } result += conn.ExecuteNonQuery(sqlIniDailyPlanDetail, new CDAParameter("DAILYPLANID", dailyPlanID), new CDAParameter("MATNR", drMonthPlanDetail["MATNR"], DataType.NVarChar), new CDAParameter("GOODSID", drMonthPlanDetail["GOODSID"], DataType.Int32), new CDAParameter("LOGOID", drMonthPlanDetail["LOGOID"], DataType.Int32), new CDAParameter("OUTQUANTITY", outquantity, DataType.Int32), new CDAParameter("PLANQUANTITY", planquantity, DataType.Int32), new CDAParameter("QUALIFIEDPERCENT", qualifiedpercent * 100, DataType.Decimal), new CDAParameter("ACCOUNTID", accountID), new CDAParameter("USERID", userID) ); } } } if (result > 0) { conn.Commit(); return "操作成功"; } else { conn.Rollback(); return "操作失败"; } } catch (Exception e) { conn.Rollback(); return "操作失败:" + e.Message; } } } /// /// 生成领料计划(按领料计划设置) /// /// public static string AutoMateriaPlanOut() { int result = 0; int autoid = 0; string ZMSG = null; string msg = ""; //List matnrs = new List(); //matnrs.Add(""); DataTable dtInventory = new DataTable("T"); dtInventory.Columns.Add("IDNRK"); dtInventory.Columns.Add("POSITION"); dtInventory.Rows.Add("", "1001"); dtInventory.Rows.Add("", "1002"); dtInventory.Rows.Add("", "1003"); dtInventory.Rows.Add("", "1004"); dtInventory.Rows.Add("", "1005"); dtInventory.Rows.Add("", "1006"); //DataTable dtSapInventory = SapApi.ZMM_WMS016("5000", dtInventory, out ZMSG); //dtSapInventory.DefaultView.RowFilter = "LGORT IN('1001','1002','1003','1004','1005','1006')"; //dtSapInventory = dtSapInventory.DefaultView.ToTable(); /* string tmp_sql = @" insert into tmp_ZMM_WMS016 (WERKS, MATNR, LGORT, CHARG, LABST, GYSKC, KALAB, KYKC, SPEME, VBELN, POSNR, SOBKZ, SSNUM, WMSNUM, LIFNR, SPEME_103) values (@WERKS@, @MATNR@, @LGORT@, @CHARG@, @LABST@, @GYSKC@, @KALAB@, @KYKC@, @SPEME@, @VBELN@, @POSNR@, @SOBKZ@, @SSNUM@, @WMSNUM@, @LIFNR@, @SPEME_103@) ";*/ using (IDataAccess conn = DataAccess.Create()) { conn.BeginTransaction(); try { CDAParameter aid = new CDAParameter("@in_accountid@", 1); CDAParameter aoid = new CDAParameter("@rs_result@", 0, DataType.Int32, ParameterDirection.Output); result = conn.ExecuteSPNonQuery("pro_auto_pc_materiaplan_check", aid, aoid); autoid =Convert.ToInt32(((Oracle.ManagedDataAccess.Types.OracleDecimal)(aoid.Value)).Value); msg += " 【pro_auto_pc_materiaplan_check】操作成功 [" + autoid + "]"; } catch (Exception e) { autoid = 0; msg += " 【pro_auto_pc_materiaplan_check】操作失败:" + e.Message; } if (autoid == 0) { return msg; } /* 线边仓库存,暂不启用,目前领料不用这个自动生成的单子 try { DataTable dtSapInventory = SapApi.ZMM_WMS016("5000", dtInventory, out ZMSG); if (dtSapInventory != null && dtSapInventory.Rows.Count > 0) { //dtSapInventory.DefaultView.RowFilter = "LGORT IN('1001','1002','1003','1004','1005','1006')"; //dtSapInventory.TableName = "TMP_ZMM_WMS016"; //CDASqlStrParameter[] cpp = new CDASqlStrParameter[] //{ // CDASqlStrParameter.ForInsert("WERKS", null, DataType.NVarChar), // CDASqlStrParameter.ForInsert("MATNR", null, DataType.NVarChar), // CDASqlStrParameter.ForInsert("LGORT", null, DataType.NVarChar), // CDASqlStrParameter.ForInsert("CHARG", null, DataType.NVarChar), // CDASqlStrParameter.ForInsert("LABST", null, DataType.Decimal), // CDASqlStrParameter.ForInsert("GYSKC", null, DataType.Decimal), // CDASqlStrParameter.ForInsert("KALAB", null, DataType.Decimal), // CDASqlStrParameter.ForInsert("KYKC", null, DataType.Decimal), // CDASqlStrParameter.ForInsert("SPEME", null, DataType.Decimal), // CDASqlStrParameter.ForInsert("VBELN", null, DataType.NVarChar), // CDASqlStrParameter.ForInsert("POSNR", null, DataType.Decimal), // CDASqlStrParameter.ForInsert("SOBKZ", null, DataType.NVarChar), // CDASqlStrParameter.ForInsert("SSNUM", null, DataType.NVarChar), // CDASqlStrParameter.ForInsert("WMSNUM", null, DataType.NVarChar), // CDASqlStrParameter.ForInsert("LIFNR", null, DataType.NVarChar), // CDASqlStrParameter.ForInsert("SPEME_103", null, DataType.Decimal), //}; //result = conn.InsertForeach(dtSapInventory, cpp); StringBuilder tmp_sql = new StringBuilder(" insert all "); tmp_sql.AppendLine(); foreach (DataRow item in dtSapInventory.Rows) { tmp_sql.Append("into tmp_ZMM_WMS016 (WERKS, MATNR, LGORT, CHARG, LABST, GYSKC, KALAB, KYKC, SPEME, VBELN, POSNR, SOBKZ, SSNUM, WMSNUM, LIFNR, SPEME_103) values ("); tmp_sql.Append(GetDbValue(item["WERKS"])); tmp_sql.Append(","); tmp_sql.Append(GetDbValue(item["MATNR"])); tmp_sql.Append(","); tmp_sql.Append(GetDbValue(item["LGORT"])); tmp_sql.Append(","); tmp_sql.Append(GetDbValue(item["CHARG"])); tmp_sql.Append(","); tmp_sql.Append(GetDbValue(Convert.ToDecimal(item["LABST"]))); tmp_sql.Append(","); tmp_sql.Append(GetDbValue(Convert.ToDecimal(item["GYSKC"]))); tmp_sql.Append(","); tmp_sql.Append(GetDbValue(Convert.ToDecimal(item["KALAB"]))); tmp_sql.Append(","); tmp_sql.Append(GetDbValue(Convert.ToDecimal(item["KYKC"]))); tmp_sql.Append(","); tmp_sql.Append(GetDbValue(Convert.ToDecimal(item["SPEME"]))); tmp_sql.Append(","); tmp_sql.Append(GetDbValue(item["VBELN"])); tmp_sql.Append(","); tmp_sql.Append(GetDbValue(Convert.ToDecimal(item["POSNR"]))); tmp_sql.Append(","); tmp_sql.Append(GetDbValue(item["SOBKZ"])); tmp_sql.Append(","); tmp_sql.Append(GetDbValue(item["SSNUM"])); tmp_sql.Append(","); tmp_sql.Append(GetDbValue(item["WMSNUM"])); tmp_sql.Append(","); tmp_sql.Append(GetDbValue(item["LIFNR"])); tmp_sql.Append(","); tmp_sql.Append(GetDbValue(Convert.ToDecimal(item["SPEME_103"]))); tmp_sql.AppendLine(")"); } tmp_sql.AppendLine("select 1 from dual"); result = conn.ExecuteNonQuery(tmp_sql.ToString()); msg += " 【TMP_ZMM_WMS016】操作成功"; } } catch (Exception e) { //conn.Rollback(); msg += " 【TMP_ZMM_WMS016】操作失败:" + e.Message; } */ try { result += conn.ExecuteSPNonQuery("pro_auto_pc_materiaplan_out", new CDAParameter("@in_accountid@", 1), new CDAParameter("@in_autoid@", autoid)); conn.Commit(); msg += " 【pro_auto_pc_materiaplan_out】操作成功"; } catch (Exception e) { conn.Rollback(); msg += " 【pro_auto_pc_materiaplan_out】操作失败:" + e.Message; } } return msg; } private static string GetDbValue(object value) { if (value == null || value == DBNull.Value) { return "null"; } if (value is string) { return "'" + value+ "'"; } if (value is DateTime) { return "'" + (value as DateTime?).Value.ToString("yyyy-MM-dd hh:mm:ss.ssssss") + "'"; } else { return value + ""; } } }