锐腾搅拌上料功能
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.

471 lines
17 KiB

5 months ago
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Data.Linq;
  6. using System.Linq;
  7. using System.Drawing;
  8. using System.Text;
  9. using System.Windows.Forms;
  10. using DevExpress.XtraEditors;
  11. using DevExpress.XtraGrid.Views.BandedGrid;
  12. using DevExpress.XtraGrid.Columns;
  13. using DevExpress.XtraGrid;
  14. using System.IO;
  15. using System.Threading;
  16. using ICSSoft.Base.Language.Tool;
  17. using ICSSoft.Base.Config.AppConfig;
  18. using ICSSoft.Base.UserControl.MessageControl;
  19. using ICSSoft.Base.Config.DBHelper;
  20. using ICSSoft.Base.Report.Filter;
  21. using ICSSoft.Base.UserControl.FormControl;
  22. using ICSSoft.Base.Report.GridReport;
  23. using ICSSoft.Base.ReferForm.AppReferForm;
  24. using ICSSoft.Frame.Data.BLL;
  25. namespace ICSSoft.Frame.APP
  26. {
  27. public partial class FormMatterShow : DevExpress.XtraEditors.XtraForm
  28. {
  29. public DataTable dt = null;
  30. public DataTable dTL = null;
  31. public DataTable DTable = null;
  32. public int i = 1, x = 0;
  33. string where = "";
  34. string sql = "";
  35. string sqlText = "";
  36. #region 构造函数
  37. public FormMatterShow(DataTable ds)
  38. {
  39. InitializeComponent();
  40. this.MaximumSize = new Size(Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height);
  41. this.WindowState = FormWindowState.Maximized;
  42. this.dt = null;
  43. this.dTL = null;
  44. this.DTable = null;
  45. x = ds.Rows.Count;
  46. where = @"
  47. where y.Num between {0} and {1}
  48. order by y.MTIME";
  49. this.loadData();
  50. }
  51. public FormMatterShow()
  52. {
  53. InitializeComponent();
  54. this.MaximumSize = new Size(Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height);
  55. this.WindowState = FormWindowState.Maximized;
  56. this.dt = null;
  57. this.dTL = null;
  58. this.DTable = null;
  59. this.tRoll.Enabled = true;
  60. where = @"
  61. where y.Num between {0} and {1}
  62. order by y.MTIME";
  63. this.loadData();
  64. }
  65. #endregion
  66. #region 操作权限
  67. public DataTable RightOfExute()
  68. {
  69. DataTable rData = new DataTable();
  70. rData.Columns.Add("BtnName");
  71. rData.Columns.Add("ActionName");
  72. //查看权限(必须有)
  73. DataRow seeRow = rData.NewRow();
  74. seeRow["BtnName"] = "see";
  75. seeRow["ActionName"] = "查看";
  76. rData.Rows.Add(seeRow);
  77. List<Control> ControlList = new List<Control>();
  78. foreach (Control ctr in ControlList)
  79. {
  80. if (ctr.GetType() == typeof(SimpleButton))
  81. {
  82. DataRow dr = rData.NewRow();
  83. dr["BtnName"] = ctr.Name;
  84. dr["ActionName"] = ctr.Text;
  85. rData.Rows.Add(dr);
  86. }
  87. }
  88. rData.AcceptChanges();
  89. return rData;
  90. }
  91. public DataTable RightOfData()// 数据权限
  92. {
  93. DataTable rData = new DataTable();
  94. rData.Columns.Add("BodyName");
  95. rData.Columns.Add("ControlName");
  96. rData.Columns.Add("ControlCaption");
  97. rData.AcceptChanges();
  98. return rData;
  99. }
  100. #endregion
  101. #region 退出
  102. private void btnClose_Click(object sender, EventArgs e)
  103. {
  104. AppConfig.CloseFormShow(this.Text);
  105. this.Close();
  106. }
  107. #endregion
  108. private void FormMatterShow_FormClosing(object sender, FormClosingEventArgs e)
  109. {
  110. }
  111. private void FormMatterShow_Load(object sender, EventArgs e)
  112. {
  113. this.tRoll.Interval = 30 * 1000;
  114. this.tRefresh.Interval = 24 * 60 * 60 * 1000;
  115. this.tRoll.Enabled = true;
  116. this.tRefresh.Enabled = false;
  117. }
  118. public void loadData()
  119. {
  120. try
  121. {
  122. this.DTable = null;
  123. sql = @"
  124. select * from (select Num=row_number() over(order by MTIME),* from (select distinct
  125. c.LotNO,
  126. d.WHCode,
  127. e.StorageName,
  128. d.BinCode,
  129. f.StackName,
  130. a.INVCODE,
  131. b.INVNAME,
  132. b.INVDESC,
  133. b.INVUOM,
  134. d.LotQty,
  135. a.EATTRIBUTE1,
  136. case when isnull(d.MTIME,0)=0 then '' when isnull(a.EATTRIBUTE1,0) = 0 then d.MTIME ELSE DATEADD(day,cast(a.EATTRIBUTE1 as int),d.MTIME)
  137. end as daytime,
  138. d.MTIME
  139. FROM dbo.ICSWareHouseLotInfo d
  140. inner join ICSITEMLot c on c.LotNO = d.LotNO
  141. inner join dbo.ICSINVInfo a on a.INVCODE = d.INVCODE
  142. inner join ICSINVENTORY b on a.INVCODE = b.INVCODE
  143. LEFT JOIN dbo.ICSStorage e ON d.WHCode = e.StorageCode
  144. left JOIN dbo.ICSStack f ON d.BinCode = f.StackCode
  145. where 1=1 and a.INVCODE<> '' and c.LotNO <> '' and d.WHCode = '0300' and d.LotQty > '0.00') X) Y";
  146. sql = string.Format(sql);
  147. dt = DBHelper.ExecuteDataset(AppConfig.AppConnectString.ToString(), CommandType.Text, sql).Tables[0];
  148. if (dt.Rows.Count > 18)
  149. {
  150. x = dt.Rows.Count;
  151. sqlText = sql + where;
  152. sqlText = string.Format(sqlText, i, i + 17);
  153. DTable = DBHelper.ExecuteDataset(AppConfig.AppConnectString.ToString(), CommandType.Text, sqlText).Tables[0];
  154. grdDetail.DataSource = DTable;
  155. grvDetail.BestFitColumns();
  156. i = i + 18;
  157. x = x - 18;
  158. }
  159. else
  160. {
  161. sqlText = sql + where;
  162. sqlText = string.Format(sqlText, i, dt.Rows.Count);
  163. DTable = DBHelper.ExecuteDataset(AppConfig.AppConnectString.ToString(), CommandType.Text, sqlText).Tables[0];
  164. grdDetail.DataSource = DTable;
  165. grvDetail.BestFitColumns();
  166. }
  167. }
  168. catch
  169. {
  170. }
  171. }
  172. private void tRefresh_Tick(object sender, EventArgs e)
  173. {
  174. this.DTable = null;
  175. try
  176. {
  177. sql = @"
  178. select * from (select Num=row_number() over(order by MTIME),* from (select distinct
  179. c.LotNO,
  180. d.WHCode,
  181. e.StorageName,
  182. d.BinCode,
  183. f.StackName,
  184. a.INVCODE,
  185. b.INVNAME,
  186. b.INVDESC,
  187. b.INVUOM,
  188. d.LotQty,
  189. a.EATTRIBUTE1,
  190. case when isnull(d.MTIME,0)=0 then '' when isnull(a.EATTRIBUTE1,0) = 0 then d.MTIME ELSE DATEADD(day,cast(a.EATTRIBUTE1 as int),d.MTIME)
  191. end as daytime,
  192. d.MTIME
  193. FROM dbo.ICSWareHouseLotInfo d
  194. inner join ICSITEMLot c on c.LotNO = d.LotNO
  195. inner join dbo.ICSINVInfo a on a.INVCODE = d.INVCODE
  196. inner join ICSINVENTORY b on a.INVCODE = b.INVCODE
  197. LEFT JOIN dbo.ICSStorage e ON d.WHCode = e.StorageCode
  198. left JOIN dbo.ICSStack f ON d.BinCode = f.StackCode
  199. where 1=1 and a.INVCODE<> '' and c.LotNO <> '' and d.WHCode = '0300' and d.LotQty > '0.00') X) Y";
  200. sql = string.Format(sql);
  201. dTL = DBHelper.ExecuteDataset(AppConfig.AppConnectString.ToString(), CommandType.Text, sql).Tables[0];
  202. if (dt != dTL)
  203. {
  204. dt = dTL;
  205. if (dt.Rows.Count > 18)
  206. {
  207. sqlText = sql + where;
  208. sqlText = string.Format(sqlText, i, i + 17);
  209. DTable = DBHelper.ExecuteDataset(AppConfig.AppConnectString.ToString(), CommandType.Text, sqlText).Tables[0];
  210. grdDetail.DataSource = DTable;
  211. grvDetail.BestFitColumns();
  212. i = i + 18;
  213. x = x - 18;
  214. }
  215. else
  216. {
  217. sqlText = sql + where;
  218. sqlText = string.Format(sqlText, i, dt.Rows.Count);
  219. DTable = DBHelper.ExecuteDataset(AppConfig.AppConnectString.ToString(), CommandType.Text, sqlText).Tables[0];
  220. grdDetail.DataSource = DTable;
  221. grvDetail.BestFitColumns();
  222. i = 1;
  223. }
  224. }
  225. }
  226. catch
  227. {
  228. }
  229. }
  230. private void tRoll_Tick(object sender, EventArgs e)
  231. {
  232. try
  233. {
  234. string str1 = DateTime.Now.ToString("yyyyMMdd") + "000000";
  235. string str2 = DateTime.Now.ToString("yyyyMMdd") + "000100";
  236. IFormatProvider format = new System.Globalization.CultureInfo("zh-CN");
  237. string TarStr = "yyyyMMddHHmmss"; //注意这里用到HH
  238. DateTime MyDate1 = DateTime.ParseExact(str1, TarStr, format);
  239. DateTime MyDate2 = DateTime.ParseExact(str2, TarStr, format);
  240. if (MyDate1 < DateTime.Now && DateTime.Now < MyDate2)
  241. {
  242. this.tRoll.Enabled = false;
  243. this.Close();
  244. }
  245. else
  246. {
  247. sql = @"
  248. select * from (select Num=row_number() over(order by MTIME),* from (select distinct
  249. c.LotNO,
  250. d.WHCode,
  251. e.StorageName,
  252. d.BinCode,
  253. f.StackName,
  254. a.INVCODE,
  255. b.INVNAME,
  256. b.INVDESC,
  257. b.INVUOM,
  258. d.LotQty,
  259. a.EATTRIBUTE1,
  260. case when isnull(d.MTIME,0)=0 then '' when isnull(a.EATTRIBUTE1,0) = 0 then d.MTIME ELSE DATEADD(day,cast(a.EATTRIBUTE1 as int),d.MTIME)
  261. end as daytime,
  262. d.MTIME
  263. FROM dbo.ICSWareHouseLotInfo d
  264. inner join ICSITEMLot c on c.LotNO = d.LotNO
  265. inner join dbo.ICSINVInfo a on a.INVCODE = d.INVCODE
  266. inner join ICSINVENTORY b on a.INVCODE = b.INVCODE
  267. LEFT JOIN dbo.ICSStorage e ON d.WHCode = e.StorageCode
  268. left JOIN dbo.ICSStack f ON d.BinCode = f.StackCode
  269. where 1=1 and a.INVCODE<> '' and c.LotNO <> '' and d.WHCode = '0300' and d.LotQty > '0.00') X) Y";
  270. sql = string.Format(sql);
  271. dTL = DBHelper.ExecuteDataset(AppConfig.AppConnectString.ToString(), CommandType.Text, sql).Tables[0];
  272. if (DataTableTheSame(dt, dTL))
  273. {
  274. if (x > 18)
  275. {
  276. sqlText = sql + where;
  277. sqlText = string.Format(sqlText, i, i + 17);
  278. DTable = DBHelper.ExecuteDataset(AppConfig.AppConnectString.ToString(), CommandType.Text, sqlText).Tables[0];
  279. //grdDetail.DataSource = DTable;
  280. this.grdDetailData(DTable);
  281. grvDetail.BestFitColumns();
  282. x = x - 18;
  283. i = i + 18;
  284. }
  285. else
  286. {
  287. sqlText = sql + where;
  288. sqlText = string.Format(sqlText, i, i + x - 1);
  289. DTable = DBHelper.ExecuteDataset(AppConfig.AppConnectString.ToString(), CommandType.Text, sqlText).Tables[0];
  290. //grdDetail.DataSource = DTable;
  291. this.grdDetailData(DTable);
  292. grvDetail.BestFitColumns();
  293. i = 1;
  294. x = dt.Rows.Count;
  295. }
  296. }
  297. else
  298. {
  299. i = 1;
  300. x = dTL.Rows.Count;
  301. if (x > 18)
  302. {
  303. sqlText = sql + where;
  304. sqlText = string.Format(sqlText, i, i + 17);
  305. DTable = DBHelper.ExecuteDataset(AppConfig.AppConnectString.ToString(), CommandType.Text, sqlText).Tables[0];
  306. //grdDetail.DataSource = DTable;
  307. this.grdDetailData(DTable);
  308. grvDetail.BestFitColumns();
  309. x = x - 18;
  310. i = i + 18;
  311. }
  312. else
  313. {
  314. sqlText = sql + where;
  315. sqlText = string.Format(sqlText, i, i + x - 1);
  316. DTable = DBHelper.ExecuteDataset(AppConfig.AppConnectString.ToString(), CommandType.Text, sqlText).Tables[0];
  317. //grdDetail.DataSource = DTable;
  318. this.grdDetailData(DTable);
  319. grvDetail.BestFitColumns();
  320. i = 1;
  321. x = dt.Rows.Count;
  322. }
  323. }
  324. }
  325. }
  326. catch
  327. {
  328. }
  329. }
  330. private void grvDetail_RowStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowStyleEventArgs e)
  331. {
  332. int hand = e.RowHandle;
  333. if (hand < 0) return;
  334. DataRow dr = this.grvDetail.GetDataRow(hand);
  335. if (dr == null) return;
  336. if (((DateTime)dr["daytime"] - DateTime.Now).Days <= 3)
  337. {
  338. e.Appearance.BackColor = Color.Red;// 改变行背景颜色
  339. //根据需求
  340. }
  341. else if (((DateTime)dr["daytime"] - DateTime.Now).Days <= 7)
  342. {
  343. e.Appearance.BackColor = Color.Yellow;// 改变行背景颜色
  344. //根据需求
  345. }
  346. }
  347. private delegate void grdDetail_Data(DataTable dt);
  348. private void grdDetailData(DataTable dt)
  349. {
  350. grdDetail_Data grdData = new grdDetail_Data(grdDetailData);
  351. if (grdDetail.InvokeRequired)
  352. {
  353. grdDetail.Invoke(grdData, new object[] { dt });
  354. }
  355. else
  356. {
  357. grdDetail.DataSource = dt;
  358. }
  359. }
  360. #region 判断两个DataTable是否相同
  361. /// <summary>
  362. /// 比较两个DataTable内容是否相等,先是比数量,数量相等就比内容
  363. /// </summary>
  364. /// <param name= "dtA "> </param>
  365. /// <param name= "dtB "> </param>
  366. private bool CompareDataTable(DataTable dtA, DataTable dtB)
  367. {
  368. if (dtA.Rows.Count == dtB.Rows.Count)
  369. {
  370. if (CompareColumn(dtA.Columns, dtB.Columns))
  371. {
  372. //比内容
  373. for (int i = 0; i < dtA.Rows.Count; i++)
  374. {
  375. for (int j = 0; j < dtA.Columns.Count; j++)
  376. {
  377. if (!dtA.Rows[i][j].Equals(dtB.Rows[i][j]))
  378. {
  379. return false;
  380. }
  381. }
  382. }
  383. return true;
  384. }
  385. else
  386. {
  387. return false;
  388. }
  389. }
  390. else
  391. {
  392. return false;
  393. }
  394. }
  395. /// <summary>
  396. /// 比较两个字段集合是否名称,数据类型一致
  397. /// </summary>
  398. /// <param name= "dcA "> </param>
  399. /// <param name= "dcB "> </param>
  400. /// <returns> </returns>
  401. private bool CompareColumn(System.Data.DataColumnCollection dcA, System.Data.DataColumnCollection dcB)
  402. {
  403. if (dcA.Count == dcB.Count)
  404. {
  405. foreach (DataColumn dc in dcA)
  406. {
  407. //找相同字段名称
  408. if (dcB.IndexOf(dc.ColumnName) > -1)
  409. {
  410. //测试数据类型
  411. if (dc.DataType != dcB[dcB.IndexOf(dc.ColumnName)].DataType)
  412. {
  413. return false;
  414. }
  415. }
  416. else
  417. {
  418. return false;
  419. }
  420. }
  421. return true;
  422. }
  423. else
  424. {
  425. return false;
  426. }
  427. }
  428. public bool DataTableTheSame(DataTable Table1, DataTable Table2)
  429. {
  430. if (Table1 == null || Table2 == null)
  431. {
  432. return false;
  433. }
  434. if (Table1.Rows.Count != Table2.Rows.Count)
  435. {
  436. return false;
  437. }
  438. if (Table1.Columns.Count != Table2.Columns.Count)
  439. {
  440. return false;
  441. }
  442. for (int i = 0; i < Table1.Rows.Count; i++)
  443. {
  444. for (int j = 0; j < Table1.Columns.Count; j++)
  445. {
  446. if (Table1.Rows[i][j].ToString() != Table2.Rows[i][j].ToString())
  447. {
  448. return false;
  449. }
  450. }
  451. }
  452. return true;
  453. }
  454. #endregion
  455. }
  456. }