CreateMonthPlan.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using Curtain.DataAccess;
  5. /// <summary>
  6. /// 自动生成下月计划
  7. /// </summary>
  8. public class CreateMonthPlan
  9. {
  10. /// <summary>
  11. /// 自动生成下月计划
  12. /// </summary>
  13. /// <returns></returns>
  14. public static string CreateNextMonthPlan(DateTime accountdatebegin)
  15. {
  16. string accountMonth = accountdatebegin.ToString("yyyy-MM");
  17. DateTime accountdateend = accountdatebegin.AddMonths(1).AddDays(-1);
  18. int accountID = 1, userID = 2; // 账套、用户ID
  19. int result = 0;
  20. using (IDataAccess conn = DataAccess.Create())
  21. {
  22. conn.BeginTransaction();
  23. try
  24. {
  25. object isExists = conn.ExecuteScalar(@"
  26. SELECT 1
  27. FROM TP_PC_MONTHPLAN
  28. WHERE ACCOUNTMONTH = @ACCOUNTMONTH@ ",
  29. new CDAParameter("ACCOUNTMONTH", accountMonth)
  30. );
  31. if (isExists != null)
  32. {
  33. return "已经生成";
  34. }
  35. // 获取采购订单
  36. DataTable dtPMCOrder = conn.ExecuteDatatable(@"
  37. SELECT I.EBELN,
  38. I.EBELP,
  39. P.ETENR,
  40. I.MATNR,
  41. P.MENGE
  42. FROM TP_SAP_ITEM I
  43. INNER JOIN TP_SAP_PLAN P
  44. ON P.EBELP = I.EBELP
  45. AND P.EBELN = I.EBELN
  46. WHERE P.VALUEFLAG = '1'
  47. -- AND I.PLANFLAG = '1'
  48. AND P.EINDT >= @EINDTBEGIN@
  49. AND P.EINDT <= @EINDTEND@ ",
  50. new CDAParameter("EINDTBEGIN", accountdatebegin),
  51. new CDAParameter("EINDTEND", accountdateend)
  52. );
  53. /*************************************************** 建包装计划begin *************************************************/
  54. object primaryKeyBZ = conn.GetSequenceNextval("SEQ_PC_MONTHPLAN");
  55. result += conn.ExecuteNonQuery(@"
  56. INSERT INTO TP_PC_MONTHPLAN (
  57. MONTHPLANID,
  58. ACCOUNTMONTH,
  59. MONTHPLANNAME,
  60. PROCEDUREID,
  61. SAPDATEBEGIN,
  62. SAPDATEEND,
  63. ACCOUNTID,
  64. CREATEUSERID,
  65. UPDATEUSERID
  66. ) VALUES (
  67. @MONTHPLANID@,
  68. @ACCOUNTMONTH@,
  69. @MONTHPLANNAME@,
  70. 107,
  71. @SAPDATEBEGIN@,
  72. @SAPDATEEND@,
  73. @ACCOUNTID@,
  74. @USERID@,
  75. @USERID@) ",
  76. new CDAParameter("MONTHPLANID", primaryKeyBZ),
  77. new CDAParameter("ACCOUNTMONTH", accountMonth),
  78. new CDAParameter("MONTHPLANNAME", "包装计划" + accountMonth),
  79. new CDAParameter("SAPDATEBEGIN", accountdatebegin),
  80. new CDAParameter("SAPDATEEND", accountdateend),
  81. new CDAParameter("ACCOUNTID", accountID),
  82. new CDAParameter("USERID", userID)
  83. );
  84. string sqlIniMonthPlanDetail = @"
  85. INSERT INTO TP_PC_MONTHPLANDETAIL (
  86. MONTHPLANID,
  87. MATNR,
  88. MENGE,
  89. PMCORDERNO,
  90. EBELP,
  91. ACCOUNTID,
  92. CREATEUSERID,
  93. UPDATEUSERID)
  94. VALUES (
  95. @MONTHPLANID@,
  96. @MATNR@,
  97. @MENGE@,
  98. @PMCORDERNO@,
  99. @EBELP@,
  100. @ACCOUNTID@,
  101. @USERID@,
  102. @USERID@) ";
  103. foreach (DataRow drPMCOrder in dtPMCOrder.Rows)
  104. {
  105. result += conn.ExecuteNonQuery(sqlIniMonthPlanDetail,
  106. new CDAParameter("MONTHPLANID", primaryKeyBZ),
  107. new CDAParameter("MATNR", drPMCOrder["MATNR"]),
  108. new CDAParameter("MENGE", drPMCOrder["MENGE"]),
  109. new CDAParameter("PMCORDERNO", drPMCOrder["EBELN"]),
  110. new CDAParameter("EBELP", drPMCOrder["EBELP"]),
  111. new CDAParameter("ACCOUNTID", accountID),
  112. new CDAParameter("USERID", userID)
  113. );
  114. }
  115. /*************************************************** 建包装计划end ***************************************************/
  116. /*************************************************** 建成检计划begin *************************************************/
  117. object primaryKeyCJ = conn.GetSequenceNextval("SEQ_PC_MONTHPLAN");
  118. result += conn.ExecuteNonQuery(@"
  119. INSERT INTO TP_PC_MONTHPLAN (
  120. MONTHPLANID,
  121. ACCOUNTMONTH,
  122. MONTHPLANNAME,
  123. PROCEDUREID,
  124. TODAILYFLAG,
  125. ACCOUNTID,
  126. CREATEUSERID,
  127. UPDATEUSERID
  128. ) VALUES (
  129. @MONTHPLANID@,
  130. @ACCOUNTMONTH@,
  131. @MONTHPLANNAME@,
  132. 104,
  133. '1',
  134. @ACCOUNTID@,
  135. @USERID@,
  136. @USERID@
  137. ) ",
  138. new CDAParameter("MONTHPLANID", primaryKeyCJ),
  139. new CDAParameter("ACCOUNTMONTH", accountMonth),
  140. new CDAParameter("MONTHPLANNAME", "成检计划" + accountMonth),
  141. new CDAParameter("ACCOUNTID", accountID),
  142. new CDAParameter("USERID", userID)
  143. );
  144. result += conn.ExecuteNonQuery(@"
  145. INSERT INTO TP_PC_MONTHPLANDETAIL
  146. (MONTHPLANID,
  147. MATNR,
  148. MENGE,
  149. ACCOUNTID,
  150. CREATEUSERID,
  151. UPDATEUSERID)
  152. SELECT @MONTHPLANID@,
  153. MATNR,
  154. SUM(MENGE),
  155. @ACCOUNTID@,
  156. @USERID@,
  157. @USERID@
  158. FROM TP_PC_MONTHPLANDETAIL
  159. WHERE MONTHPLANID = @MONTHPLANIDBZ@
  160. GROUP BY MATNR ",
  161. new CDAParameter("MONTHPLANID", primaryKeyCJ),
  162. new CDAParameter("ACCOUNTID", accountID),
  163. new CDAParameter("USERID", userID),
  164. new CDAParameter("MONTHPLANIDBZ", primaryKeyBZ)
  165. );
  166. DataTable dtCJMonthPlanDetail = conn.ExecuteDatatable(@"
  167. SELECT MPD.DETAILID
  168. ,PB.GOODSID
  169. ,MPD.MENGE
  170. FROM TP_PC_MONTHPLANDETAIL MPD
  171. LEFT JOIN TP_MST_PACKINGBOM PB
  172. ON PB.MATNR = MPD.MATNR
  173. WHERE MPD.MONTHPLANID = @MONTHPLANID@ ",
  174. new CDAParameter("MONTHPLANID", primaryKeyCJ)
  175. );
  176. string sqlUpdate = @"
  177. UPDATE TP_PC_MONTHPLANDETAIL
  178. SET OUTQUANTITY = @OUTQUANTITY@
  179. ,QUALIFIEDPERCENT = @QUALIFIEDPERCENT@
  180. WHERE DETAILID = @DETAILID@ ";
  181. // 获取合格率
  182. DataTable dtQualifiedPercent = QualifiedPercent.GetQualifiedPercent(conn, accountdatebegin);
  183. DataRow[] rows;
  184. decimal planquantity;
  185. foreach (DataRow item in dtCJMonthPlanDetail.Rows)
  186. {
  187. // 数量
  188. decimal.TryParse(item["MENGE"] + "", out planquantity);
  189. decimal outquantity = planquantity;
  190. rows = dtQualifiedPercent.Select("GOODSID = " + item["GOODSID"]);
  191. decimal qualifiedpercent = 1;
  192. if (rows.Length > 0)
  193. {
  194. qualifiedpercent = Convert.ToDecimal(rows[0]["QUALIFIEDPERCENT"]);
  195. outquantity = Math.Floor(planquantity / qualifiedpercent);
  196. }
  197. result = conn.ExecuteNonQuery(sqlUpdate,
  198. new CDAParameter("OUTQUANTITY", outquantity, DataType.Int32),
  199. new CDAParameter("QUALIFIEDPERCENT", qualifiedpercent * 100, DataType.Decimal),
  200. new CDAParameter("DETAILID", item["DETAILID"])
  201. );
  202. }
  203. /*************************************************** 生成成检日计划begin **********************************************/
  204. DataTable dtMonthPlanDetail = conn.ExecuteDatatable(@"
  205. SELECT MPD.DETAILID,
  206. MPD.MATNR,
  207. PB.GOODSID,
  208. PB.LOGOID,
  209. MPD.MENGE
  210. FROM TP_PC_MONTHPLANDETAIL MPD
  211. LEFT JOIN (SELECT PB.MATNR,
  212. GOODSID,
  213. LOGOID
  214. FROM TP_MST_PACKINGBOM PB
  215. GROUP BY PB.MATNR,
  216. GOODSID,
  217. LOGOID) PB
  218. ON PB.MATNR = MPD.MATNR
  219. WHERE MPD.MONTHPLANID = @MONTHPLANID@ ",
  220. new CDAParameter("MONTHPLANID", primaryKeyCJ)
  221. );
  222. DataRow[] drMonthPlanDetails = dtMonthPlanDetail.Select("GOODSID IS NULL OR LOGOID IS NULL");
  223. if (drMonthPlanDetails.Length > 0)
  224. {
  225. string message = string.Empty;
  226. foreach (DataRow row in drMonthPlanDetails)
  227. {
  228. message += row["MATNR"] + ",";
  229. }
  230. return "存在无法绑定产品的物料编码:" + message;
  231. }
  232. DateTime begindate = Convert.ToDateTime(accountMonth + "-01");
  233. DateTime enddate = begindate.AddMonths(1).AddDays(-1);
  234. // 获取合格率
  235. TimeSpan sp = enddate.Subtract(begindate);
  236. int days = sp.Days;
  237. if (days > 0)
  238. {
  239. string sqlIniDailyPlan = @"
  240. INSERT INTO TP_PC_DAILYPLAN
  241. (DAILYPLANID,
  242. DAILYPLANNAME,
  243. MONTHPLANID,
  244. ACCOUNTDATE,
  245. ACCOUNTID,
  246. CREATEUSERID,
  247. UPDATEUSERID)
  248. VALUES
  249. (@DAILYPLANID@,
  250. @DAILYPLANNAME@,
  251. @MONTHPLANID@,
  252. @ACCOUNTDATE@,
  253. @ACCOUNTID@,
  254. @USERID@,
  255. @USERID@) ";
  256. string sqlIniDailyPlanDetail = @"
  257. INSERT INTO TP_PC_DAILYPLANDETAIL
  258. (DAILYPLANID,
  259. MONTHPLANDETAILID,
  260. MATNR,
  261. GOODSID,
  262. LOGOID,
  263. OUTQUANTITY,
  264. PLANQUANTITY,
  265. QUALIFIEDPERCENT,
  266. ACCOUNTID,
  267. CREATEUSERID,
  268. UPDATEUSERID)
  269. VALUES
  270. (@DAILYPLANID@,
  271. @MONTHPLANDETAILID@,
  272. @MATNR@,
  273. @GOODSID@,
  274. @LOGOID@,
  275. @OUTQUANTITY@,
  276. @PLANQUANTITY@,
  277. @QUALIFIEDPERCENT@,
  278. @ACCOUNTID@,
  279. @USERID@,
  280. @USERID@) ";
  281. rows = null;
  282. for (int i = 0; i <= days; i++)
  283. {
  284. //获取日计划主键
  285. object dailyPlanID = conn.GetSequenceNextval("SEQ_PC_DAILYPLAN");
  286. DateTime dailyAccountDate = begindate.AddDays(i);
  287. //新建日计划总单
  288. result += conn.ExecuteNonQuery(sqlIniDailyPlan,
  289. new CDAParameter("DAILYPLANID", dailyPlanID),
  290. new CDAParameter("DAILYPLANNAME", "成检日计划" + dailyAccountDate.ToString("yyyy-MM-dd")),
  291. new CDAParameter("MONTHPLANID", primaryKeyCJ),
  292. new CDAParameter("ACCOUNTDATE", dailyAccountDate),
  293. new CDAParameter("ACCOUNTID", accountID),
  294. new CDAParameter("USERID", userID)
  295. );
  296. //新建日计划明细
  297. foreach (DataRow drMonthPlanDetail in dtMonthPlanDetail.Rows)
  298. {
  299. // 日均值,向下取整
  300. decimal avgquantity = Math.Floor(Convert.ToDecimal(drMonthPlanDetail["MENGE"]) / (days + 1));
  301. planquantity = avgquantity;
  302. if (i == days)
  303. {
  304. planquantity = Convert.ToDecimal(drMonthPlanDetail["MENGE"]) - days * avgquantity;
  305. }
  306. // 出窑数量
  307. decimal outquantity = planquantity;
  308. rows = dtQualifiedPercent.Select("GOODSID = " + drMonthPlanDetail["GOODSID"]);
  309. decimal qualifiedpercent = 1;
  310. if (rows.Length > 0)
  311. {
  312. qualifiedpercent = Convert.ToDecimal(rows[0]["QUALIFIEDPERCENT"]);
  313. outquantity = Math.Floor(planquantity / qualifiedpercent);
  314. }
  315. result = conn.ExecuteNonQuery(sqlIniDailyPlanDetail,
  316. new CDAParameter("DAILYPLANID", dailyPlanID),
  317. new CDAParameter("MONTHPLANDETAILID", drMonthPlanDetail["DETAILID"], DataType.Int32),
  318. new CDAParameter("MATNR", drMonthPlanDetail["MATNR"], DataType.NVarChar),
  319. new CDAParameter("GOODSID", drMonthPlanDetail["GOODSID"], DataType.Int32),
  320. new CDAParameter("LOGOID", drMonthPlanDetail["LOGOID"], DataType.Int32),
  321. new CDAParameter("OUTQUANTITY", outquantity, DataType.Int32),
  322. new CDAParameter("PLANQUANTITY", planquantity, DataType.Int32),
  323. new CDAParameter("QUALIFIEDPERCENT", qualifiedpercent * 100, DataType.Decimal),
  324. new CDAParameter("ACCOUNTID", accountID),
  325. new CDAParameter("USERID", userID)
  326. );
  327. }
  328. }
  329. }
  330. /*************************************************** 生成成检日计划end ***************************************************/
  331. /*************************************************** 更新成检月计划出窑量begin ********************************************/
  332. result += conn.ExecuteNonQuery(@"
  333. UPDATE TP_PC_MONTHPLANDETAIL T
  334. SET (T.OUTQUANTITY, T.QUALIFIEDPERCENT) =
  335. (SELECT SUM(DPD.OUTQUANTITY),
  336. MAX(QUALIFIEDPERCENT)
  337. FROM TP_PC_DAILYPLANDETAIL DPD
  338. WHERE DPD.MONTHPLANDETAILID = T.DETAILID)
  339. WHERE T.MONTHPLANID = @MONTHPLANID@ ",
  340. new CDAParameter("MONTHPLANID", primaryKeyCJ)
  341. );
  342. /*************************************************** 更新成检月计划出窑量end ***********************************************/
  343. List<string> ebelns = new List<string>();
  344. // 更新采购订单明细生成标识
  345. foreach (DataRow row in dtPMCOrder.Rows)
  346. {
  347. string order = row["EBELN"] + "";
  348. if (!ebelns.Contains(order))
  349. {
  350. ebelns.Add(order);
  351. }
  352. result += conn.ExecuteNonQuery(@"
  353. UPDATE TP_SAP_PLAN T
  354. SET T.MONTHPLANFLAG = '1'
  355. WHERE T.EBELN = @EBELN@
  356. AND T.EBELP = @EBELP@
  357. AND T.ETENR = @ETENR@ ",
  358. new CDAParameter("EBELN", order),
  359. new CDAParameter("EBELP", row["EBELP"]),
  360. new CDAParameter("ETENR", row["ETENR"])
  361. );
  362. }
  363. // 更新采购订单总表生成标识
  364. foreach (string order in ebelns)
  365. {
  366. result += conn.ExecuteNonQuery(@"
  367. UPDATE TP_SAP_HEAD
  368. SET CREATEFLAG =
  369. (SELECT DECODE(COUNT(1), 0, '2', '1')
  370. FROM TP_SAP_PLAN P
  371. WHERE P.MONTHPLANFLAG = '0'
  372. AND P.EBELN = @EBELN@)
  373. WHERE EBELN = @EBELN@ ",
  374. new CDAParameter("EBELN", order)
  375. );
  376. }
  377. //提交数据
  378. if (result > 0)
  379. {
  380. conn.Commit();
  381. return "生成成功";
  382. }
  383. else
  384. {
  385. conn.Rollback();
  386. return "生成失败";
  387. }
  388. }
  389. catch (Exception e)
  390. {
  391. conn.Rollback();
  392. return "操作失败:" + e.Message;
  393. }
  394. }
  395. }
  396. }