private void btnDo_Click(object sender, EventArgs e) { try { var dt = bindingSource1.DataSource as DataTable; if (dt == null) return; if (dt.Rows.Count <= 0) throw new Exception("表没有记录!"); btnDo.Enabled = false; var task = new SFG_ImportTask(dt); task.Do(); #region 显示提示窗体 using (var frm = new frmLongInvokeMonitor()) { ThreadPool.QueueUserWorkItem(o => { while (task._Status == ImportTaskStatus.Running) { #region 设置显示属性 SyncContext.Send(obj => { frm.progressBar1.Value =(int) task._Percent; frm.txtTips.Text = task._Tips; }, null); #endregion Thread.Sleep(500); } #region 关闭窗口 SyncContext.Send(obj => { if (task._Status == ImportTaskStatus.Fail) { ErrMsg(task._Tips); } else { try { sFGBOMBindingSource1.Clear(); sFGBOMBindingSource1.DataSource = task._TreeBomList; bindingSource2.Clear(); bindingSource2.DataSource = task._BomList; tabbedControlGroup1.SelectedTabPage = layoutControlGroup4; InfoMsg(string.Format("任务完成,上传了{0}个编码!", task._FGList.Count)); }catch(Exception ex) { ErrMsg(ex.Message); } } btnDo.Enabled = true; frm.Close(); }, null); #endregion }, null); frm.ShowDialog(); } #endregion } catch (Exception ex) { ErrMsg(ex.Message); } }
任务类实现:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Threading; using com.geelyhd.MFG.EFModel; using F.Studio.Infrastructure; using com.geelyhd.MFG.IService; namespace com.geelyhd.MFG.WR.UI.M3 { public enum ImportTaskStatus{Init=0,Running=3, Fail=5,Sucess=10} public class SFG_ImportTask { public String _Tips = ""; public double _Percent = 0; public ImportTaskStatus _Status = ImportTaskStatus.Init; public List<SFG_MM> _MMList = new List<SFG_MM>(); public List<SFG_BOM> _BomList = new List<SFG_BOM>(); public List<SFG_MM> _FGList = new List<SFG_MM>(); public List<SFG_BOMForTree> _TreeBomList = new List<SFG_BOMForTree>(); private DataTable _DT; public SFG_ImportTask(DataTable dt) { _DT = dt; } public void Do() { _Status = ImportTaskStatus.Running; ThreadPool.QueueUserWorkItem(o => { DoAction(); }, null); } private void DoAction() { #region 执行分解 var dt = _DT; try { #region 解析BOM Rpt("提取成品编码...", 1); ExtractFGList(dt); Rpt(string.Format("发现{0}个成品编码", _MMList.Count), 5); Rpt("校验成品管理权...", 6); VerifyFGAuth(); Rpt("校验完成", 8); Rpt("BOM结构解析...", 10); ExtractBOM(); Rpt("完成BOM结构解析", 50); #endregion #region 存档 Rpt("保存产品BOM...", 51); SaveBOM(); Rpt("完成保存产品BOM", 95); #endregion #region 构建显示结构 Rpt("构建显示结构...", 95); BuildShowTree(); Rpt("完成构建显示结构.", 99); #endregion Rpt("完成", 100); Thread.Sleep(1000); _Status = ImportTaskStatus.Sucess; } catch (Exception ex) { Rpt("错误:" + ex.Message); _Status = ImportTaskStatus.Fail; } finally { } #endregion } private void VerifyFGAuth() { var fgList = _FGList.Aggregate("", (s, e) => s += string.Format("'{0}',", e.MNo)).TrimEnd(",".ToArray()); var where = "it.MNo in{" + fgList + "}"; var list = ServiceLocator.Fetch<ISFG_MMService>().GetList(where, "it.RecId"); var exceptList= _FGList.Select(ent => ent.MNo).Except(list.Select(dbIt => dbIt.MNo)).ToList(); var exceptMsg = exceptList.Aggregate("", (s, e) => s += e + ",").TrimEnd(",".ToArray()); if (exceptList.Count > 0) throw new Exception(string.Format("物料主数据未创建: {0}" , exceptMsg)); foreach (var it in list) { if (string.Compare(it.AddEmpNo, UserSetting.UserName, true) != 0) { throw new Exception("成品:" + it.MNo + "属于用户:" + it.AddEmpNo); } } } private void CopyItem(SFG_BOM from, SFG_BOMForTree to) { to.AddEmpNo = from.AddEmpNo; to.AddTime = from.AddTime; to.Amount = from.Amount; to.BTime = from.BTime; to.ETime = from.ETime; to.Harness = from.Harness; to.IsScan = from.IsScan; to.MNo = from.MNo; to.PMNo = from.PMNo; } private void ExtractBOM() { var dt = _DT; var dic = new Dictionary<String, int>(); for (int row = 0; row < dt.Rows.Count; row++) { var dRow = dt.Rows[row]; var cMMStr = V(dRow.Field<String>("L1")); //是否包含复2层结构 bool hasCombination = !string.IsNullOrWhiteSpace(cMMStr); var sMMStr = V(dRow.Field<String>("L2")); if (string.IsNullOrWhiteSpace(sMMStr)) throw new Exception("L2列不能为空!"); foreach (var fgMM in _FGList) { #region 解析BOM var v = V(dRow.Field<String>(fgMM.MNo)); if (v == "1") { var bom = new SFG_BOM() { Amount = 1, Harness = fgMM.MNo, MNo = sMMStr, IsScan = true,AddEmpNo=UserSetting.UserName,AddTime=DateTime.Now }; if (hasCombination) //复合材料 { bom.PMNo = cMMStr; bom.IsScan = false; if (!dic.ContainsKey(bom.PMNo + "$" + bom.Harness)) { var cBom = new SFG_BOM() { Amount = 1, Harness = fgMM.MNo, MNo = bom.PMNo, IsScan = false, PMNo = fgMM.MNo, AddEmpNo = UserSetting.UserName, AddTime = DateTime.Now }; dic.Add(bom.PMNo + "$" + bom.Harness, 1); _BomList.Add(cBom); } } else { bom.PMNo = fgMM.MNo; } _BomList.Add(bom); } #endregion } //计算子进度 var subPercent = 40 / dt.Rows.Count; AddPercent( subPercent); } } private void SaveBOM() { var row = 0; var rowCount = _FGList.Count; foreach (var fgMM in _FGList) { //删除原有数据 ServiceLocator.Fetch<ISFG_MMService>().ExeSql(string.Format("delete from SFG_BOM where Harness='{0}'", fgMM.MNo)); ServiceLocator.Fetch<ISFG_BOMService>().AddList(_BomList.Where(ent=>ent.Harness==fgMM.MNo).ToList()); //计算子进度 row++; var subPercent = 45/ rowCount; AddPercent( subPercent); } } private void BuildShowTree() { foreach (var bom in _BomList) { var newEnt = new SFG_BOMForTree(); #region CopyItem(bom, newEnt); #endregion newEnt.MNo = newEnt.MNo + "_" + newEnt.Harness; if (newEnt.PMNo != newEnt.Harness && newEnt.IsScan == false) { newEnt.PMNo = newEnt.PMNo + "_" + newEnt.Harness; } _TreeBomList.Add(newEnt); } foreach (var fg in _FGList) { var newEnt = new SFG_BOMForTree(); newEnt.MNo = fg.MNo; newEnt.PMNo = ""; newEnt.Harness = fg.MNo; newEnt.IsScan = false; _TreeBomList.Add(newEnt); } } private void ExtractFGList(DataTable dt) { foreach (DataColumn c in dt.Columns) { if (c.Caption == "L1" || c.Caption == "L2") continue; var mno = c.Caption.Trim(); var ent = new SFG_MM(); ent.MNo = mno; ent.MType ="成品" ; ent.MUnit = "PC"; ent.Harness = mno; _MMList.Add(ent); } _FGList = _MMList.Where(ent => ent.MType == "成品").ToList(); if (_FGList.Count <= 0) throw new Exception("数据异常未提取到成品编号!"); } #region Help private void Rtp(int percent) { _Percent = percent; } private void Rpt(string tip) { _Tips = tip; } private void AddPercent(double addV) { _Percent += addV; } private void Rpt(string tip, int percent) { _Tips = tip; _Percent = percent; } private String V(string v) { if (string.IsNullOrWhiteSpace(v)) return string.Empty; return v.Trim(); } #endregion } }