锐腾搅拌上料功能
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

477 lines
16 KiB

5 months ago
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using DevExpress.XtraEditors;
  9. using ICSSoft.Frame.User.BLL;
  10. using ICSSoft.Base.Language.Tool;
  11. using ICSSoft.Base.UserControl.MessageControl;
  12. using ICSSoft.Frame.Data.BLL;
  13. using System.Data.SqlClient;
  14. using ICSSoft.Base.Config.AppConfig;
  15. using ICSSoft.Frame.Data.Entity;
  16. using ICSSoft.Base.Report.Filter;
  17. using ICSSoft.Base.Config.DBHelper;
  18. using ICSSoft.Base.UserControl.FormControl;
  19. using ICSSoft.Base.ReferForm.AppReferForm;
  20. using ICSSoft.Frame.APP;
  21. using System.Text.RegularExpressions;
  22. namespace ICSSoft.Frame.APP
  23. {
  24. public partial class FormICSReports1 : DevExpress.XtraEditors.XtraForm
  25. {
  26. private DataTable dataSource = null;
  27. private DataTable dataHeader = null;
  28. string MOCODE = "";
  29. #region 构造函数
  30. public FormICSReports1()
  31. {
  32. InitializeComponent();
  33. this.MaximumSize = new Size(Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height);
  34. this.WindowState = FormWindowState.Maximized;
  35. }
  36. #endregion
  37. #region 移动窗体
  38. private const int WM_NCHITTEST = 0x84;
  39. private const int HTCLIENT = 0x1;
  40. private const int HTCAPTION = 0x2;
  41. //首先必须了解Windows的消息传递机制,当有鼠标活动消息时,
  42. //系统发送WM_NCHITTEST 消息给窗体作为判断消息发生地的根据。 nchittest
  43. //假如你点击的是标题栏,窗体收到的消息值就是 HTCAPTION ,
  44. //同样地,若接受到的消息是 HTCLIENT,说明用户点击的是客户区,也就是鼠标消息发生在客户区。
  45. //重写窗体,使窗体可以不通过自带标题栏实现移动
  46. protected override void WndProc(ref Message m)
  47. {
  48. //当重载窗体的 WndProc 方法时,可以截获 WM_NCHITTEST 消息并改些该消息,
  49. //当判断鼠标事件发生在客户区时,改写改消息,发送 HTCAPTION 给窗体,
  50. //这样,窗体收到的消息就时 HTCAPTION ,在客户区通过鼠标来拖动窗体就如同通过标题栏来拖动一样。
  51. //注意:当你重载 WndProc 并改写鼠标事件后,整个窗体的鼠标事件也就随之改变了。
  52. switch (m.Msg)
  53. {
  54. case WM_NCHITTEST:
  55. base.WndProc(ref m);
  56. if ((int)m.Result == HTCLIENT)
  57. m.Result = (IntPtr)HTCAPTION;
  58. return;
  59. }
  60. //拦截双击标题栏、移动窗体的系统消息
  61. if (m.Msg != 0xA3)
  62. {
  63. base.WndProc(ref m);
  64. }
  65. }
  66. #endregion
  67. #region SystemOptition
  68. /// <summary>
  69. /// 操作权限
  70. /// </summary>
  71. /// <returns></returns>
  72. public DataTable RightOfExute()
  73. {
  74. DataTable rData = new DataTable();
  75. rData.Columns.Add("BtnName");
  76. rData.Columns.Add("ActionName");
  77. //查看权限(必须有)
  78. DataRow seeRow = rData.NewRow();
  79. seeRow["BtnName"] = "see";
  80. seeRow["ActionName"] = "查看";
  81. rData.Rows.Add(seeRow);
  82. List<Control> ControlList = new List<Control>();
  83. //ControlList.Add(btnSelect);
  84. //ControlList.Add(btnCanSelect);
  85. //ControlList.Add(btnAdd);
  86. //ControlList.Add(btnEdit);
  87. //ControlList.Add(btnDelLable);
  88. ControlList.Add(btnOutPut);
  89. foreach (Control ctr in ControlList)
  90. {
  91. if (ctr.GetType() == typeof(SimpleButton))
  92. {
  93. DataRow dr = rData.NewRow();
  94. dr["BtnName"] = ctr.Name;
  95. dr["ActionName"] = ctr.Text;
  96. rData.Rows.Add(dr);
  97. }
  98. }
  99. rData.AcceptChanges();
  100. return rData;
  101. }
  102. /// <summary>
  103. /// 数据权限
  104. /// </summary>
  105. /// <returns></returns>
  106. public DataTable RightOfData()
  107. {
  108. DataTable rData = new DataTable();
  109. rData.Columns.Add("BodyName");
  110. rData.Columns.Add("ControlName");
  111. rData.Columns.Add("ControlCaption");
  112. rData.AcceptChanges();
  113. return rData;
  114. }
  115. #endregion
  116. #region 退出
  117. private void btnClose_Click(object sender, EventArgs e)
  118. {
  119. AppConfig.CloseFormShow(this.Text);
  120. this.Close();
  121. }
  122. private void btnExit_Click(object sender, EventArgs e)
  123. {
  124. AppConfig.CloseFormShow(this.Text);
  125. this.Close();
  126. }
  127. #endregion
  128. #region 分页
  129. private void rptPage_PageIndexChanged(object Sender, EventArgs e)
  130. {
  131. DataTable data = AppConfig.GetPageData(dataSource, rptPage.PageIndex, rptPage.PageSize).Copy();
  132. //DataTable data = AppConfig.GetPageDataByDb(tempTableName, "pagerowindex", rptPage.PageSize, rptPage.PageIndex, dataSource.Rows.Count);
  133. grdDetail.DataSource = data;
  134. }
  135. #endregion
  136. #region 列表
  137. private void grvDetail_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventArgs e)
  138. {
  139. if (e.Info.IsRowIndicator && e.RowHandle >= 0)
  140. e.Info.DisplayText = (e.RowHandle + 1).ToString();
  141. }
  142. #endregion
  143. #region 导出
  144. private void btnOutput_Click(object sender, EventArgs e)
  145. {
  146. FormOutExcel foe = new FormOutExcel(this.Tag.ToString(), grdDetail);
  147. foe.ShowDialog();
  148. }
  149. #endregion
  150. private void txtMOCODE_KeyDown(object sender, KeyEventArgs e)
  151. {
  152. if (e.KeyCode != Keys.Enter)
  153. {
  154. return;
  155. }
  156. txtMOCODE.Enabled = false;
  157. MOCODE = txtMOCODE.Text = txtMOCODE.Text.Trim().ToUpper();
  158. if (MOCODE == "")
  159. {
  160. return;
  161. }
  162. try
  163. {
  164. if (!Regex.IsMatch(MOCODE, "^[0-9A-Z_]+$"))
  165. {
  166. throw new Exception("输入错误");
  167. }
  168. string sql = @"SELECT MOCODE,MOSEQ FROM dbo.ICSMO WITH(NOLOCK) WHERE WorkPoint='{0}' AND MOCODE='{1}' ORDER BY MOSEQ";
  169. sql = string.Format(sql, AppConfig.WorkPointCode, MOCODE);
  170. DataTable dt = DBHelper.ExecuteDataset(AppConfig.AppConnectString, CommandType.Text, sql).Tables[0];
  171. if (dt.Rows.Count == 0)
  172. {
  173. throw new Exception("工单不存在");
  174. }
  175. cboMOSEQ.Items.Clear();
  176. cboMOSEQ.SelectedIndex = -1;
  177. foreach (DataRow dr in dt.Rows)
  178. {
  179. cboMOSEQ.Items.Add(dr["MOSEQ"]);
  180. }
  181. cboMOSEQ.SelectedIndex = 0;
  182. }
  183. catch (Exception ex)
  184. {
  185. ICSBaseSimpleCode.AppshowMessageBox(ex.Message);
  186. }
  187. finally
  188. {
  189. txtMOCODE.Enabled = true;
  190. }
  191. }
  192. private void cboMOSEQ_SelectedIndexChanged(object sender, EventArgs e)
  193. {
  194. if (MOCODE == "" || cboMOSEQ.SelectedIndex == -1)
  195. {
  196. return;
  197. }
  198. //string sqlx = @"
  199. //SELECT
  200. // A.MOCODE,
  201. // A.MOSEQ,
  202. // A.ITEMCODE,
  203. // A.MOPLANQTY,
  204. // A.MOPLANSTARTDATE,
  205. // A.MOPLANENDDATE,
  206. // B.INVNAME AS ITEMDESC,
  207. // B.INVSTD,
  208. // B.INVShelfLife AS LIFT,
  209. // B.INVGROUP AS LVL,
  210. // B.INVTYPE,
  211. // B.INVMODELGROUP AS cITEMCODE,
  212. // B.INVMODELCODE
  213. //FROM dbo.ICSMO A
  214. //LEFT JOIN dbo.ICSINVENTORY B ON B.INVCODE=A.ITEMCODE AND B.WorkPoint=A.WorkPoint
  215. //WHERE A.WorkPoint='{0}' AND A.MOCODE='{1}' AND A.MOSEQ='{2}'
  216. //
  217. //SELECT
  218. // A.TransNO AS 工单号,
  219. // A.TransLine AS 工单行,
  220. // A.LOTNO 跟踪单号,
  221. // ISNULL(A.EATTRIBUTE2,A.LOTQTY+CONVERT(DECIMAL,ISNULL(A.EATTRIBUTE6,0))) 父数量,
  222. // D.LOTQTY 作业数量,
  223. // A.LOTQTY 现数量,
  224. // A.TYPE 来源,
  225. // B.OPSEQ 工序次序,
  226. // B.OPCODE 工序代码,
  227. // B.OPAttr AS 工序属性,
  228. // B.CtrlType 控制方式,
  229. // CONVERT(BIT,CASE WHEN C.ID IS NULL THEN 0 ELSE 1 END) AS 派工,
  230. // CONVERT(BIT,CASE WHEN D.ID IS NULL THEN 0 ELSE 1 END) AS 报工,
  231. // CASE WHEN D.ACTIONRESULT='COLLECT_BEGIN' THEN '开工' WHEN D.ACTIONRESULT='COLLECT_END' THEN '完工' ELSE '' END AS 工序状态,
  232. // D.GOODQTY 工序报工数量,
  233. // D.BeginTime 工序开工,
  234. // D.EndTime 工序完工,
  235. // chk.Status 检验状态,
  236. // --chk.Enable,
  237. // chk.OKQuantity 检验OK,
  238. // chk.NGQuantity 检验NG,
  239. // chk.BeginDateTime 检验开始,
  240. // chk.EndDateTime 检验结束,
  241. // ncr.NCRNo NCR单号,
  242. // ncr.Status NCR状态,
  243. // CONVERT(BIT,ISNULL(ncr.IsInput,0)) 结算
  244. //FROM dbo.ICSITEMLot A WITH(NOLOCK)
  245. //LEFT JOIN dbo.ICSITEMROUTE2OPLot B WITH(NOLOCK) ON B.LotNo=A.LotNO
  246. //LEFT JOIN dbo.ICSMO2User C WITH(NOLOCK) ON C.LOTNO=B.LotNo AND C.OPCODE=B.OPCODE
  247. //LEFT JOIN dbo.ICSLOTONWIP D WITH(NOLOCK) ON D.LOTNO=C.LOTNO AND D.OPCODE=C.OPCODE
  248. //LEFT JOIN dbo.ICSLOTONWIPCheck chk WITH(NOLOCK) ON chk.FORTRANID=D.ID AND chk.Enable=1
  249. //LEFT JOIN dbo.ICSLOTONWIPCheckNCR ncr WITH(NOLOCK) ON ncr.CheckID=chk.ID
  250. //WHERE A.WorkPoint='{0}' AND A.TransNO='{1}' AND A.TransLine='{2}'
  251. //ORDER BY a.TransLine,A.LotNO,B.OPSEQ
  252. //";
  253. DevExpress.Utils.WaitDialogForm _wait = new DevExpress.Utils.WaitDialogForm("正在查找...请稍等...");
  254. try
  255. {
  256. string sql = sqlx;
  257. _wait.Show();
  258. sql = string.Format(sql, AppConfig.WorkPointCode, MOCODE, cboMOSEQ.SelectedItem.ToString());
  259. DataSet ds = DBHelper.ExecuteDataset(AppConfig.AppConnectString, CommandType.Text, sql);
  260. dataHeader = ds.Tables[0];
  261. DataRow drHeadr = dataHeader.Rows[0];
  262. txtITEMCODE.Text = drHeadr["ITEMCODE"].ToString();
  263. txtITEMDESC.Text = drHeadr["ITEMDESC"].ToString();
  264. txtCITEMCODE.Text = drHeadr["cITEMCODE"].ToString();
  265. txtMOQTY.Text = drHeadr["MOPLANQTY"].ToString();
  266. txtINVSTD.Text = drHeadr["INVSTD"].ToString();
  267. txtLIFT.Text = drHeadr["LIFT"].ToString();
  268. txtLVL.Text = drHeadr["LVL"].ToString();
  269. txtINVTYPE.Text = drHeadr["INVTYPE"].ToString();
  270. txtJYOK.Text = Convert.ToDecimal(drHeadr["完工JYOK"]).ToString("f0");
  271. txtSJNG.Text = Convert.ToDecimal(drHeadr["SJNG"]).ToString();
  272. dataSource = ds.Tables[1];
  273. grdDetail.DataSource = dataSource;
  274. grvDetail.BestFitColumns();
  275. rptPage.PageSize = 200;
  276. rptPage.PageIndex = 1;
  277. rptPage.ReLoad();
  278. }
  279. catch (Exception ex)
  280. {
  281. ICSBaseSimpleCode.AppshowMessageBox(ex.Message);
  282. }
  283. finally
  284. {
  285. _wait.Close();
  286. }
  287. }
  288. string sqlx = @"
  289. --
  290. SELECT
  291. A.MOCODE,
  292. A.MOSEQ,
  293. A.ITEMCODE,
  294. A.MOPLANQTY,
  295. A.MOPLANSTARTDATE,
  296. A.MOPLANENDDATE,
  297. B.INVNAME AS ITEMDESC,
  298. B.INVSTD,
  299. B.INVShelfLife AS LIFT,
  300. B.INVGROUP AS LVL,
  301. B.INVTYPE,
  302. B.INVMODELGROUP AS cITEMCODE,
  303. B.INVMODELCODE,
  304. LOT.LOTNO,
  305. LOT.EATTRIBUTE2,
  306. LOT.LOTQTY,
  307. LOT.EATTRIBUTE6,
  308. LOT.TYPE,
  309. L2.OPSEQ AS MAXOPSEQ,
  310. L1.OPSEQ,
  311. L1.OPCODE,
  312. L1.OPAttr,
  313. L1.CtrlType
  314. INTO #T1
  315. FROM dbo.ICSMO A WITH(NOLOCK)
  316. LEFT JOIN dbo.ICSINVENTORY B WITH(NOLOCK) ON B.INVCODE=A.ITEMCODE AND B.WorkPoint=A.WorkPoint
  317. LEFT JOIN dbo.ICSITEMLot LOT WITH(NOLOCK) ON LOT.TransNO=A.MOCODE AND LOT.TransLine=A.MOSEQ AND LOT.WorkPoint=A.WorkPoint
  318. LEFT JOIN dbo.ICSITEMROUTE2OPLot L1 WITH(NOLOCK) ON L1.LotNo=LOT.LotNO
  319. LEFT JOIN dbo.ICSITEMROUTE2OPLot L2 WITH(NOLOCK) ON L2.LotNo=LOT.LotNO AND L2.OPSEQ=(SELECT MAX(OPSEQ) FROM ICSITEMROUTE2OPLot WHERE LotNo=LOT.LotNO )
  320. WHERE A.WorkPoint='{0}' AND A.MOCODE='{1}' AND A.MOSEQ='{2}'
  321. ---
  322. SELECT
  323. A.MOCODE,
  324. A.MOSEQ,
  325. A.LOTNO,
  326. A.OPCODE,
  327. A.OPSEQ,
  328. SUM(CASE WHEN ncr.Status<>'' THEN chk.OKQuantity ELSE chk.OKQuantity+chk.NGQuantity END) OK,
  329. SUM(CASE WHEN ncr.Status<>'' THEN 0 ELSE chk.NGQuantity END) NG,
  330. AA.OPSEQ MAXOPSEQ
  331. INTO #T2
  332. FROM dbo.ICSLOTONWIP A
  333. LEFT JOIN dbo.ICSLOTONWIP AA ON AA.LOTNO=A.LOTNO AND AA.OPSEQ=(SELECT MAX(OPSEQ) FROM dbo.ICSLOTONWIP WHERE LOTNO=A.LOTNO)
  334. LEFT JOIN dbo.ICSLOTONWIPDetail B WITH(NOLOCK) ON B.LOTNO=A.LOTNO AND B.OPCODE=A.OPCODE AND A.WorkPoint=B.WorkPoint
  335. LEFT JOIN dbo.ICSLOTONWIPInspection C WITH(NOLOCK) ON C.DetailID=B.ID AND C.IsCalc=1
  336. LEFT JOIN dbo.ICSLOTONWIPCheck chk WITH(NOLOCK) ON chk.FORTRANID=C.ID AND chk.Enable=1
  337. LEFT JOIN dbo.ICSLOTONWIPCheckNCR ncr WITH(NOLOCK) ON ncr.CheckID=chk.ID
  338. WHERE A.WorkPoint='{0}' AND A.MOCODE='{1}' AND A.MOSEQ='{2}'
  339. GROUP BY
  340. A.MOCODE,
  341. A.MOSEQ,
  342. A.LOTNO,
  343. AA.OPSEQ,
  344. A.OPCODE,
  345. A.OPSEQ
  346. --/
  347. SELECT
  348. A.LOTNO,
  349. ISNULL(A.EATTRIBUTE2,A.LOTQTY+CONVERT(DECIMAL,ISNULL(A.EATTRIBUTE6,0))) ,
  350. A.LOTQTY ,
  351. D.LOTQTY ,
  352. A.TYPE ,
  353. A.OPSEQ,
  354. A.OPCODE ,
  355. A.OPAttr AS ,
  356. A.CtrlType ,
  357. CASE WHEN C.EATTRIBUTE1=1 THEN '' WHEN C.EATTRIBUTE1=0 THEN '' ELSE '' END ,
  358. CONVERT(BIT,CASE WHEN C.ID IS NULL THEN 0 ELSE 1 END) AS ,
  359. CONVERT(BIT,CASE WHEN D.ID IS NULL THEN 0 ELSE 1 END) AS ,
  360. CASE WHEN D.ACTIONRESULT='COLLECT_BEGIN' THEN '' WHEN D.ACTIONRESULT='COLLECT_END' THEN '' ELSE '' END AS ,
  361. D.GOODQTY ,
  362. D.BeginTime ,
  363. D.EndTime ,
  364. chk.Status ,
  365. --chk.Enable,
  366. chk.OKQuantity OK,
  367. chk.NGQuantity NG,
  368. chk.BeginDateTime ,
  369. chk.EndDateTime ,
  370. ncr.NCRNo NCR单号,
  371. ncr.Status NCR状态,
  372. CONVERT(BIT,ISNULL(ncr.IsInput,0))
  373. INTO #T3
  374. FROM #T1 A
  375. LEFT JOIN dbo.ICSMO2User C WITH(NOLOCK) ON C.LOTNO=A.LotNo AND C.OPCODE=A.OPCODE
  376. LEFT JOIN dbo.ICSLOTONWIP D WITH(NOLOCK) ON D.LOTNO=C.LOTNO AND D.OPCODE=C.OPCODE
  377. LEFT JOIN dbo.ICSLOTONWIPCheck chk WITH(NOLOCK) ON chk.FORTRANID=D.ID AND chk.Enable=1
  378. LEFT JOIN dbo.ICSLOTONWIPCheckNCR ncr WITH(NOLOCK) ON ncr.CheckID=chk.ID
  379. ORDER BY A.MOCODE,A.LotNO,A.OPSEQ
  380. --
  381. SELECT
  382. A.MOCODE,
  383. A.MOSEQ,
  384. A.ITEMCODE,
  385. A.MOPLANQTY,
  386. A.MOPLANSTARTDATE,
  387. A.MOPLANENDDATE,
  388. A.ITEMDESC,
  389. A.INVSTD,
  390. A.LIFT,
  391. A.LVL,
  392. A.INVTYPE,
  393. A.cITEMCODE,
  394. A.INVMODELCODE,
  395. --SUM(CASE WHEN B.OPSEQ=A.MAXOPSEQ THEN B.OK ELSE 0 END) SJOK,
  396. --SUM(CASE WHEN B.OPSEQ=A.MAXOPSEQ THEN B.NG ELSE 0 END) SJNG,
  397. SUM(CASE WHEN B.OPSEQ=B.MAXOPSEQ THEN B.NG ELSE 0 END) SJNG,
  398. SUM(CASE WHEN B.OPSEQ=B.MAXOPSEQ THEN B.OK ELSE 0 END) SJOK,
  399. SUM(CASE WHEN C.OPSEQ=A.MAXOPSEQ THEN (CASE WHEN C.NCR状态<>'' THEN ISNULL(C.OK,0) ELSE C.OK+C.NG END) ELSE 0 END) JYOK,
  400. SUM(CASE WHEN C.OPSEQ=A.MAXOPSEQ THEN (CASE WHEN C.NCR状态<>'' THEN ISNULL(C.NG,0) ELSE 0 END) ELSE 0 END) JYNG
  401. FROM #T1 A
  402. LEFT JOIN #T2 B ON B.LOTNO=A.LOTNO AND B.OPSEQ=A.OPSEQ
  403. LEFT JOIN #T3 C ON C.LOTNO=A.LOTNO AND C.OPSEQ=A.OPSEQ
  404. GROUP BY
  405. A.MOCODE,
  406. A.MOSEQ,
  407. A.ITEMCODE,
  408. A.MOPLANQTY,
  409. A.MOPLANSTARTDATE,
  410. A.MOPLANENDDATE,
  411. A.ITEMDESC,
  412. A.INVSTD,
  413. A.LIFT,
  414. A.LVL,
  415. A.INVTYPE,
  416. A.cITEMCODE,
  417. A.INVMODELCODE
  418. --,
  419. SELECT
  420. A.LOTNO ,
  421. A.OPSEQ ,
  422. A.OPCODE ,
  423. A.OK,
  424. A.NG,
  425. B.,
  426. B.,
  427. B.,
  428. B.,
  429. B.,
  430. B.,
  431. B.,
  432. B.,
  433. B.,
  434. B.,
  435. B.,
  436. B.,
  437. B.,
  438. B.,
  439. B.OK,
  440. B.NG,
  441. B.,
  442. B.,
  443. B.NCR单号,
  444. B.NCR状态,
  445. B.
  446. FROM #T2 A
  447. LEFT JOIN #T3 B ON B.LOTNO=A.LOTNO AND B.OPSEQ=A.OPSEQ
  448. ";
  449. }
  450. }