using System;
using System.Collections.Generic;
using System.Data;
using Curtain.DataAccess;
///
/// 自动生成下月计划
///
public class CreateMonthPlan
{
///
/// 自动生成下月计划
///
///
public static string CreateNextMonthPlan(DateTime accountdatebegin)
{
string accountMonth = accountdatebegin.ToString("yyyy-MM");
DateTime accountdateend = accountdatebegin.AddMonths(1).AddDays(-1);
int accountID = 1, userID = 2; // 账套、用户ID
int result = 0;
using (IDataAccess conn = DataAccess.Create())
{
conn.BeginTransaction();
try
{
object isExists = conn.ExecuteScalar(@"
SELECT 1
FROM TP_PC_MONTHPLAN
WHERE ACCOUNTMONTH = @ACCOUNTMONTH@ ",
new CDAParameter("ACCOUNTMONTH", accountMonth)
);
if (isExists != null)
{
return "已经生成";
}
// 获取采购订单
DataTable dtPMCOrder = conn.ExecuteDatatable(@"
SELECT I.EBELN,
I.EBELP,
P.ETENR,
I.MATNR,
P.MENGE
FROM TP_SAP_ITEM I
INNER JOIN TP_SAP_PLAN P
ON P.EBELP = I.EBELP
AND P.EBELN = I.EBELN
WHERE P.VALUEFLAG = '1'
-- AND I.PLANFLAG = '1'
AND P.EINDT >= @EINDTBEGIN@
AND P.EINDT <= @EINDTEND@ ",
new CDAParameter("EINDTBEGIN", accountdatebegin),
new CDAParameter("EINDTEND", accountdateend)
);
/*************************************************** 建包装计划begin *************************************************/
object primaryKeyBZ = conn.GetSequenceNextval("SEQ_PC_MONTHPLAN");
result += conn.ExecuteNonQuery(@"
INSERT INTO TP_PC_MONTHPLAN (
MONTHPLANID,
ACCOUNTMONTH,
MONTHPLANNAME,
PROCEDUREID,
SAPDATEBEGIN,
SAPDATEEND,
ACCOUNTID,
CREATEUSERID,
UPDATEUSERID
) VALUES (
@MONTHPLANID@,
@ACCOUNTMONTH@,
@MONTHPLANNAME@,
107,
@SAPDATEBEGIN@,
@SAPDATEEND@,
@ACCOUNTID@,
@USERID@,
@USERID@) ",
new CDAParameter("MONTHPLANID", primaryKeyBZ),
new CDAParameter("ACCOUNTMONTH", accountMonth),
new CDAParameter("MONTHPLANNAME", "包装计划" + accountMonth),
new CDAParameter("SAPDATEBEGIN", accountdatebegin),
new CDAParameter("SAPDATEEND", accountdateend),
new CDAParameter("ACCOUNTID", accountID),
new CDAParameter("USERID", userID)
);
string sqlIniMonthPlanDetail = @"
INSERT INTO TP_PC_MONTHPLANDETAIL (
MONTHPLANID,
MATNR,
MENGE,
PMCORDERNO,
EBELP,
ACCOUNTID,
CREATEUSERID,
UPDATEUSERID)
VALUES (
@MONTHPLANID@,
@MATNR@,
@MENGE@,
@PMCORDERNO@,
@EBELP@,
@ACCOUNTID@,
@USERID@,
@USERID@) ";
foreach (DataRow drPMCOrder in dtPMCOrder.Rows)
{
result += conn.ExecuteNonQuery(sqlIniMonthPlanDetail,
new CDAParameter("MONTHPLANID", primaryKeyBZ),
new CDAParameter("MATNR", drPMCOrder["MATNR"]),
new CDAParameter("MENGE", drPMCOrder["MENGE"]),
new CDAParameter("PMCORDERNO", drPMCOrder["EBELN"]),
new CDAParameter("EBELP", drPMCOrder["EBELP"]),
new CDAParameter("ACCOUNTID", accountID),
new CDAParameter("USERID", userID)
);
}
/*************************************************** 建包装计划end ***************************************************/
/*************************************************** 建成检计划begin *************************************************/
object primaryKeyCJ = conn.GetSequenceNextval("SEQ_PC_MONTHPLAN");
result += conn.ExecuteNonQuery(@"
INSERT INTO TP_PC_MONTHPLAN (
MONTHPLANID,
ACCOUNTMONTH,
MONTHPLANNAME,
PROCEDUREID,
TODAILYFLAG,
ACCOUNTID,
CREATEUSERID,
UPDATEUSERID
) VALUES (
@MONTHPLANID@,
@ACCOUNTMONTH@,
@MONTHPLANNAME@,
104,
'1',
@ACCOUNTID@,
@USERID@,
@USERID@
) ",
new CDAParameter("MONTHPLANID", primaryKeyCJ),
new CDAParameter("ACCOUNTMONTH", accountMonth),
new CDAParameter("MONTHPLANNAME", "成检计划" + accountMonth),
new CDAParameter("ACCOUNTID", accountID),
new CDAParameter("USERID", userID)
);
result += conn.ExecuteNonQuery(@"
INSERT INTO TP_PC_MONTHPLANDETAIL
(MONTHPLANID,
MATNR,
MENGE,
ACCOUNTID,
CREATEUSERID,
UPDATEUSERID)
SELECT @MONTHPLANID@,
MATNR,
SUM(MENGE),
@ACCOUNTID@,
@USERID@,
@USERID@
FROM TP_PC_MONTHPLANDETAIL
WHERE MONTHPLANID = @MONTHPLANIDBZ@
GROUP BY MATNR ",
new CDAParameter("MONTHPLANID", primaryKeyCJ),
new CDAParameter("ACCOUNTID", accountID),
new CDAParameter("USERID", userID),
new CDAParameter("MONTHPLANIDBZ", primaryKeyBZ)
);
DataTable dtCJMonthPlanDetail = conn.ExecuteDatatable(@"
SELECT MPD.DETAILID
,PB.GOODSID
,MPD.MENGE
FROM TP_PC_MONTHPLANDETAIL MPD
LEFT JOIN TP_MST_PACKINGBOM PB
ON PB.MATNR = MPD.MATNR
WHERE MPD.MONTHPLANID = @MONTHPLANID@ ",
new CDAParameter("MONTHPLANID", primaryKeyCJ)
);
string sqlUpdate = @"
UPDATE TP_PC_MONTHPLANDETAIL
SET OUTQUANTITY = @OUTQUANTITY@
,QUALIFIEDPERCENT = @QUALIFIEDPERCENT@
WHERE DETAILID = @DETAILID@ ";
// 获取合格率
DataTable dtQualifiedPercent = QualifiedPercent.GetQualifiedPercent(conn, accountdatebegin);
DataRow[] rows;
decimal planquantity;
foreach (DataRow item in dtCJMonthPlanDetail.Rows)
{
// 数量
decimal.TryParse(item["MENGE"] + "", out planquantity);
decimal outquantity = planquantity;
rows = dtQualifiedPercent.Select("GOODSID = " + item["GOODSID"]);
decimal qualifiedpercent = 1;
if (rows.Length > 0)
{
qualifiedpercent = Convert.ToDecimal(rows[0]["QUALIFIEDPERCENT"]);
outquantity = Math.Floor(planquantity / qualifiedpercent);
}
result = conn.ExecuteNonQuery(sqlUpdate,
new CDAParameter("OUTQUANTITY", outquantity, DataType.Int32),
new CDAParameter("QUALIFIEDPERCENT", qualifiedpercent * 100, DataType.Decimal),
new CDAParameter("DETAILID", item["DETAILID"])
);
}
/*************************************************** 生成成检日计划begin **********************************************/
DataTable dtMonthPlanDetail = conn.ExecuteDatatable(@"
SELECT MPD.DETAILID,
MPD.MATNR,
PB.GOODSID,
PB.LOGOID,
MPD.MENGE
FROM TP_PC_MONTHPLANDETAIL MPD
LEFT JOIN (SELECT PB.MATNR,
GOODSID,
LOGOID
FROM TP_MST_PACKINGBOM PB
GROUP BY PB.MATNR,
GOODSID,
LOGOID) PB
ON PB.MATNR = MPD.MATNR
WHERE MPD.MONTHPLANID = @MONTHPLANID@ ",
new CDAParameter("MONTHPLANID", primaryKeyCJ)
);
DataRow[] drMonthPlanDetails = dtMonthPlanDetail.Select("GOODSID IS NULL OR LOGOID IS NULL");
if (drMonthPlanDetails.Length > 0)
{
string message = string.Empty;
foreach (DataRow row in drMonthPlanDetails)
{
message += row["MATNR"] + ",";
}
return "存在无法绑定产品的物料编码:" + message;
}
DateTime begindate = Convert.ToDateTime(accountMonth + "-01");
DateTime enddate = begindate.AddMonths(1).AddDays(-1);
// 获取合格率
TimeSpan sp = enddate.Subtract(begindate);
int days = sp.Days;
if (days > 0)
{
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,
MONTHPLANDETAILID,
MATNR,
GOODSID,
LOGOID,
OUTQUANTITY,
PLANQUANTITY,
QUALIFIEDPERCENT,
ACCOUNTID,
CREATEUSERID,
UPDATEUSERID)
VALUES
(@DAILYPLANID@,
@MONTHPLANDETAILID@,
@MATNR@,
@GOODSID@,
@LOGOID@,
@OUTQUANTITY@,
@PLANQUANTITY@,
@QUALIFIEDPERCENT@,
@ACCOUNTID@,
@USERID@,
@USERID@) ";
rows = null;
for (int i = 0; i <= days; i++)
{
//获取日计划主键
object dailyPlanID = conn.GetSequenceNextval("SEQ_PC_DAILYPLAN");
DateTime dailyAccountDate = begindate.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 dtMonthPlanDetail.Rows)
{
// 日均值,向下取整
decimal avgquantity = Math.Floor(Convert.ToDecimal(drMonthPlanDetail["MENGE"]) / (days + 1));
planquantity = avgquantity;
if (i == days)
{
planquantity = Convert.ToDecimal(drMonthPlanDetail["MENGE"]) - 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("MONTHPLANDETAILID", drMonthPlanDetail["DETAILID"], DataType.Int32),
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)
);
}
}
}
/*************************************************** 生成成检日计划end ***************************************************/
/*************************************************** 更新成检月计划出窑量begin ********************************************/
result += conn.ExecuteNonQuery(@"
UPDATE TP_PC_MONTHPLANDETAIL T
SET (T.OUTQUANTITY, T.QUALIFIEDPERCENT) =
(SELECT SUM(DPD.OUTQUANTITY),
MAX(QUALIFIEDPERCENT)
FROM TP_PC_DAILYPLANDETAIL DPD
WHERE DPD.MONTHPLANDETAILID = T.DETAILID)
WHERE T.MONTHPLANID = @MONTHPLANID@ ",
new CDAParameter("MONTHPLANID", primaryKeyCJ)
);
/*************************************************** 更新成检月计划出窑量end ***********************************************/
List ebelns = new List();
// 更新采购订单明细生成标识
foreach (DataRow row in dtPMCOrder.Rows)
{
string order = row["EBELN"] + "";
if (!ebelns.Contains(order))
{
ebelns.Add(order);
}
result += conn.ExecuteNonQuery(@"
UPDATE TP_SAP_PLAN T
SET T.MONTHPLANFLAG = '1'
WHERE T.EBELN = @EBELN@
AND T.EBELP = @EBELP@
AND T.ETENR = @ETENR@ ",
new CDAParameter("EBELN", order),
new CDAParameter("EBELP", row["EBELP"]),
new CDAParameter("ETENR", row["ETENR"])
);
}
// 更新采购订单总表生成标识
foreach (string order in ebelns)
{
result += conn.ExecuteNonQuery(@"
UPDATE TP_SAP_HEAD
SET CREATEFLAG =
(SELECT DECODE(COUNT(1), 0, '2', '1')
FROM TP_SAP_PLAN P
WHERE P.MONTHPLANFLAG = '0'
AND P.EBELN = @EBELN@)
WHERE EBELN = @EBELN@ ",
new CDAParameter("EBELN", order)
);
}
//提交数据
if (result > 0)
{
conn.Commit();
return "生成成功";
}
else
{
conn.Rollback();
return "生成失败";
}
}
catch (Exception e)
{
conn.Rollback();
return "操作失败:" + e.Message;
}
}
}
}