/// <summary> /// 创建缩略图。 /// </summary> /// <param name="store"></param> /// <param name="ls"></param> /// <param name="wf"></param> /// <param name="w"></param> /// <param name="h"></param> /// <returns></returns> public static Image CreateThumbnail(LocalStudentWorkStore store, LocalStudent ls, LocalStudentWorkFile wf, int w, int h) { if (store != null && ls != null && wf != null) { try { string root = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures) + "\\SFIT_TeaClient\\" + store.TeacherID + "_" + store.CatalogID; if (!Directory.Exists(root)) Directory.CreateDirectory(root); string path = Path.GetFullPath(string.Format("{0}\\{1}_{2}_{3}x{4}.jpg", root, ls.StudentID, wf.FileID, w, h)); if (File.Exists(path)) return Image.FromFile(path); if (DefaultThumbnailFormat.IsExistThumbnailFormat(wf.FileExt)) { string source = ls.Work.StudentWorkFilePath(store, ls, wf); if (File.Exists(source)) { Image img = ImageHelper.MakeThumbnail(Image.FromFile(source), w, h); if (img != null) { img.Save(path, System.Drawing.Imaging.ImageFormat.Jpeg); return img; } } } } catch (Exception e) { UtilTools.OnExceptionRecord(e, typeof(ThumbnailsHelpers)); } } return null; }
/// <summary> /// /// </summary> /// <param name="store"></param> /// <param name="handler"></param> public void Issue(LocalStudentWorkStore store,RaiseChangedHandler handler) { lock (this) { if (store == null || store.Students == null) { this.RaiseChanged(handler, "没有作品分发!"); MessageBox.Show("没有作品分发!"); return; } else if(this.netService != null && this.panelWork != null && this.panelWork.Controls != null) { bool flag = false; for (int i = 0; i < this.panelWork.Controls.Count; i++) { StudentControl sc = this.panelWork.Controls[i] as StudentControl; if (sc != null && sc.UserInfo != null && ((sc.State & StudentControl.EnumStudentState.Online) == StudentControl.EnumStudentState.Online)) { flag = true; this.IssueWorkData(store,store.Students[sc.UserInfo.UserID], handler); } } if (!flag) { string msg = "没有在线学生可分发作品数据!"; this.RaiseChanged(handler, msg); MessageBox.Show(msg); } } } }
/// <summary> /// /// </summary> /// <param name="service"></param> /// <param name="store"></param> /// <param name="students"></param> public BatchUploadWaitWindow(ICoreService service, LocalStudentWorkStore store, LocalStudents students) : base(service) { this.store = store; this.students = students; InitializeComponent(); }
/// <summary> /// /// </summary> /// <param name="store"></param> /// <param name="ls"></param> public MouseThumbnailWindow(LocalStudentWorkStore store, LocalStudent ls, Point point) { this.store = store; this.ls = ls; this.point = point; InitializeComponent(); }
/// <summary> /// 获取评阅数据。 /// </summary> /// <param name="store"></param> /// <param name="cbb"></param> /// <param name="txtSubjectiveReviews"></param> /// <returns></returns> public static LocalWorkReview GetEvaluateFromWin(LocalStudentWorkStore store, ComboBox cbb, TextBox txtSubjectiveReviews) { if (store != null && cbb != null && txtSubjectiveReviews != null) { LocalWorkReview result = new LocalWorkReview(); result.TeacherID = store.TeacherID; result.TeacherName = store.TeacherName; result.SubjectiveReviews = txtSubjectiveReviews.Text.Trim(); if (store.Evaluate.Type == EnumEvaluateType.Hierarchy) { result.ReviewValue = string.Format("{0}", cbb.SelectedValue); } else { int val = -1; if (int.TryParse(cbb.Text, out val)) { if (val < store.Evaluate.MinValue || val > store.Evaluate.MaxValue) { MessageBox.Show(string.Format("评阅分数无效,须在[{0}-{1}]之间!", store.Evaluate.MinValue, store.Evaluate.MaxValue)); } } if (val < store.Evaluate.MinValue) { val = store.Evaluate.MinValue; } result.ReviewValue = string.Format("{0}", val); } if (!string.IsNullOrEmpty(result.ReviewValue)) { return result; } } return null; }
/// <summary> /// 构造函数。 /// </summary> /// <param name="service"></param> /// <param name="store"></param> /// <param name="studentIDs"></param> public WorkUploadToServer(ICoreService service, LocalStudentWorkStore store,string[] studentIDs) : base(service) { this.Store = store; InitializeComponent(); this.LoadControls(studentIDs); }
/// <summary> /// 构造函数。 /// </summary> /// <param name="service"></param> /// <param name="store"></param> /// <param name="students"></param> /// <param name="studentID"></param> public ModifyWorkDetailsWindow(ICoreService service, LocalStudentWorkStore store, string studentID) : base(service) { this.pluginService = new LoadingPluginService(service, this); //及时加载作业索引文件,同步修改信息。 this.store = LocalStudentWorkStore.DeSerializer(store.FileSavePath()); this.localStudentCollection = this.store.HasWorks(); if (this.localStudentCollection != null && this.localStudentCollection.Count > 0 && !string.IsNullOrEmpty(studentID)) { this.index = this.localStudentCollection.FindIndex(studentID); } this.InitializeComponent(); }
/// <summary> /// 创建缩略图。 /// </summary> /// <param name="store"></param> /// <param name="studentID"></param> /// <param name="w"></param> /// <param name="h"></param> /// <returns></returns> public static Image[] CreateThumbnails(LocalStudentWorkStore store, string studentID, int w, int h) { List<Image> list = new List<Image>(); if (store != null && store.Students != null && !string.IsNullOrEmpty(studentID)) { LocalStudentWork lsw = null; LocalStudent ls = store.Students[studentID]; if (ls != null && ((lsw = ls.Work) != null) && (lsw.WorkFiles != null && lsw.WorkFiles.Count > 0)) { foreach (LocalStudentWorkFile wf in lsw.WorkFiles) { Image img = CreateThumbnail(store, ls, wf, w, h); if (img != null) { list.Add(img); } } } } if (list.Count == 0) return new Image[] { LoadDefaultNULLImage(w, h) }; return list.ToArray(); }
private void uploadWorks(LocalStudentWorkStore store, LocalStudents students, out int success,out int failure, out List<string> listFailure) { success = 0; failure = 0; listFailure = new List<string>(); ///TODO:老师上传作业。 //if (store != null && store.Students != null && store.Students.Count > 0 && students != null && students.Count > 0) //{ // string storeFielPath = store.FileSavePath(); // using (TeaClientServicePoxyFactory factory = TeaClientServicePoxyFactory.Instance(this.CoreService, new RaiseChangedHandler(delegate(string content) // { // this.OnChanged(content); // }))) // { // bool complete = false; // for (int i = 0; i < students.Count; i++) // { // LocalStudent ls = this.students[i]; // #region 处理作品。 // ls = this.store.Students[ls.StudentID]; // if (ls != null && ls.Works != null && ls.Works.Count > 0) // { // if (((ls.Works[0].Status & EnumWorkStatus.Review) == EnumWorkStatus.Review)) // { // if ((ls.Works[0].Status & EnumWorkStatus.Upload) != EnumWorkStatus.Upload) // { // this.OnChanged(string.Format("开始上传:[{0},{1}]作品[{2}]...", ls.StudentName, ls.StudentCode, ls.Works[0].WorkName)); // string content = null; // if (complete = factory.UploadStudentWorks(ref this.store, ref ls, out content)) // { // success++; // ls.Works[0].Status |= EnumWorkStatus.Upload; // WorkStoreHelper.UpdateWorkStatusToQueueStore(new WorkStoreHelper.WorkReviewQueueEntity(ls.StudentID, ls.Works[0].WorkID, ls.Works[0].Status, null, storeFielPath)); // } // else // { // failure++; // listFailure.Add(string.Format("[{0},{1}] {2} {3}", ls.StudentName, ls.StudentCode, ls.Works[0].WorkName, content)); // } // this.OnChanged(string.Format("上传:[{0},{1}]作品[{2}] {3}", ls.StudentName, ls.StudentCode, ls.Works[0].WorkName, complete ? "成功" : "失败")); // } // else // { // this.OnChanged(string.Format("已上传:[{0},{1}]作品[{2}]", ls.StudentName, ls.StudentCode, ls.Works[0].WorkName)); // } // } // else // { // failure++; // listFailure.Add(string.Format("[{0},{1}] {2} {3}", ls.StudentName, ls.StudentCode, ls.Works[0].WorkName, "未批阅")); // this.OnChanged(string.Format("不能上传:[{0},{1}]作品[{2}],{3}", ls.StudentName, ls.StudentCode, ls.Works[0].WorkName, "未批阅!")); // } // } // #endregion // } // } //} }
/// <summary> /// 加载数据。 /// </summary> /// <param name="teacherID"></param> /// <param name="catalogID"></param> /// <param name="classID"></param> private void LoadData(string teacherID,string catalogID, string classID) { if (!string.IsNullOrEmpty(teacherID) && !string.IsNullOrEmpty(catalogID) && !string.IsNullOrEmpty(classID)) { this.store = LocalStudentWorkStore.DeSerializer(teacherID, catalogID, classID); if ((this.btnSave.Enabled = (this.store != null))) { Tools.SetEvaluateToWin(this.cbbReviewValue, this.store.Evaluate, new ToolTipHandler(delegate(Control ctrl, string tooltip) { this.OnToolTipEvent(ctrl, tooltip); })); this.thumbnailsControls = BuildThumbnails(this.store, new EventHandler(delegate(object sender, EventArgs e) { ThumbnailsControl tc = sender as ThumbnailsControl; if (tc != null && this.store != null) { ModifyWorkDetailsWindow mw = new ModifyWorkDetailsWindow(this.CoreService, this.store, tc.StudentID); mw.StartPosition = FormStartPosition.CenterParent; UserInfo info = this.UserInfo; if (mw.ShowDialog(this) == DialogResult.OK && info != null) { this.LoadData(info.UserID, this.catalogID, this.classID); } } })); if (this.thumbnailsControls != null) ThumbnailsDrawToPanel(this.thumbnailsControls, this.panelWork); } } }
/// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnSave_Click(object sender, EventArgs e) { Button btn = sender as Button; string btnStr = string.Empty; try { if (btn != null) { btnStr = btn.Text; btn.Text = "处理中..."; btn.Enabled = false; } string[] checkStudentWorks = GetSelectedThumbnails(this.panelWork); if (checkStudentWorks == null || checkStudentWorks.Length == 0) { this.OnMessageEvent(MessageType.Normal | MessageType.PopupInfo, "请选中学生作业后方可保存!"); btn.Text = btnStr; btn.Enabled = true; return; } LocalWorkReview teaReview = Tools.GetEvaluateFromWin(this.store, this.cbbReviewValue, this.txtSubjectiveReviews); if (teaReview == null) { this.OnMessageEvent(MessageType.Normal | MessageType.PopupInfo, "请评阅后方可保存!"); btn.Text = btnStr; btn.Enabled = true; return; } btn.Text = "保存中.."; bool bPublish = this.chkPublish.Checked, bUpload = this.chkUpload.Checked; this.store = LocalStudentWorkStore.DeSerializer(this.store.FileSavePath()); for (int i = 0; i < checkStudentWorks.Length; i++) { LocalStudent ls = this.store.Students[checkStudentWorks[i]]; if (ls != null && ls.Work != null) { WorkStoreHelper.WorkReviewQueueEntity entity = new WorkStoreHelper.WorkReviewQueueEntity(ls.StudentID, ls.Work.WorkID, bPublish ? (EnumWorkStatus.Review | EnumWorkStatus.Release) : EnumWorkStatus.Review, teaReview, this.store.FileSavePath()); entity.Changed += new RaiseChangedHandler(delegate(string msg) { this.OnMessageEvent(MessageType.Normal, msg); }); //添加到保存队列。 WorkStoreHelper.ReviewWorkToQueueStore(entity); this.OnMessageEvent(MessageType.Normal, string.Format("开始保存[{0},{1}]作业批阅...",ls.StudentName, ls.Work.WorkName)); } } if (bUpload) { btn.Text = "上传中..."; WorkUploadToServer win = new WorkUploadToServer(this.CoreService, this.store, checkStudentWorks); win.StartPosition = FormStartPosition.CenterParent; win.Changed += new RaiseChangedHandler(delegate(string msg) { this.OnMessageEvent(MessageType.Normal, msg); }); win.ShowDialog(this); } btn.Text = "刷新状态..."; //刷新学生作品评阅状态。 for (int i = 0; i < checkStudentWorks.Length; i++) { StudentEx stuEx = Program.STUDENTS != null ? Program.STUDENTS[checkStudentWorks[i]] : null; if (stuEx != null && ((stuEx.Status & StudentControl.EnumStudentState.Review) != StudentControl.EnumStudentState.Review)) { stuEx.Status |= StudentControl.EnumStudentState.Review; if (this.NetService != null) this.NetService.OnUpdateControls(stuEx); } } // this.DialogResult = DialogResult.OK; this.Close(); } catch (Exception ex) { Program.GlobalExceptionHandler(ex); this.OnMessageEvent(MessageType.Normal, "发生异常:" + ex.Message); } finally { if (btn != null) { btn.Text = btnStr; btn.Enabled = true; } } }
/// <summary> /// /// </summary> /// <param name="storage"></param> /// <param name="handler"></param> private void ImportWorkData(StudentWorkTeaStorage storage,RaiseChangedHandler handler) { lock (this) { if (string.IsNullOrEmpty(this.teacherID) || string.IsNullOrEmpty(this.teacherName)) { return; } if (this.zipFile != null && storage != null && !string.IsNullOrEmpty(storage.CatalogID) && !string.IsNullOrEmpty(storage.ClassID) && (storage.Student != null) && !string.IsNullOrEmpty(storage.Student.StudentID)) { LocalStudentWorkStore store = LocalStudentWorkStore.DeSerializer(this.teacherID, storage.CatalogID, storage.ClassID); #region 初始化数据。 if (store == null) { store = new LocalStudentWorkStore(); store.TeacherID = this.teacherID; store.TeacherName = this.teacherName; store.GradeID = storage.GradeID; store.GradeName = null; store.CatalogID = storage.CatalogID; store.CatalogName = storage.CatalogName; store.ClassID = storage.ClassID; store.ClassName = null; store.Evaluate = null; } #endregion if (store.Students == null) { store.Students = new LocalStudents(); } LocalStudent ls = store.Students[storage.Student.StudentID]; if (ls == null) { ls = new LocalStudent(); ls.StudentID = storage.Student.StudentID; ls.StudentCode = storage.Student.StudentCode; ls.StudentName = storage.Student.StudentName; store.Students.Add(ls); } if (ls.Work == null) ls.Work = new LocalStudentWork(); ls.Work.WorkID = storage.WorkID; ls.Work.WorkName = storage.WorkName; ls.Work.UploadIP = storage.UploadIP; ls.Work.Type = storage.Type; ls.Work.Time = storage.Time; ls.Work.Status = storage.Status; if (storage.Review != null) { ls.Work.Review = new LocalWorkReview(); ls.Work.Review.ReviewValue = storage.Review.ReviewValue; ls.Work.Review.SubjectiveReviews = storage.Review.SubjectiveReviews; ls.Work.Review.TeacherID = storage.Review.TeacherID; ls.Work.Review.TeacherName = storage.Review.TeacherName; } ls.Work.FileExt = storage.FileExt; ls.Work.Description = storage.Description; //ls.Work.CheckCode = storage.CheckCode; this.RaiseChanged(handler, string.Format("导入[{0},{1}]作品数据...", ls.StudentName, ls.StudentCode)); if (this.isImportFile && !string.IsNullOrEmpty(storage.WorkPath)) { //导入文件。 ls.Work.WorkFiles = new LocalStudentWorkFiles(); this.ImportWorkFiles(storage.WorkPath, store, ls, ls.Work, handler); } //序列化保存。 WorkStoreHelper.Serializer(ref store); } } }
/// <summary> /// 获取学生作品路径。 /// </summary> /// <param name="store"></param> /// <param name="ls"></param> /// <param name="workFile"></param> /// <returns></returns> public string StudentWorkFilePath(LocalStudentWorkStore store, LocalStudent ls, LocalStudentWorkFile workFile) { if (store != null && ls != null && workFile != null) { string rootDir = store.RootDir(); if (!string.IsNullOrEmpty(rootDir) && Directory.Exists(rootDir)) { string dir = Path.GetFullPath(string.Format("{0}/{1}", rootDir, ls.StudentID)); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } return Path.GetFullPath(string.Format("{0}/{1}{2}", dir, workFile.FileID, workFile.FileExt)); } } return null; }
/// <summary> /// 删除作业文件。 /// </summary> /// <param name="store"></param> /// <param name="ls"></param> public bool DeleteFiles(LocalStudentWorkStore store, LocalStudent ls) { if (store == null || ls == null) return false; if (this.WorkFiles == null || this.WorkFiles.Count == 0) return true; for (int i = 0; i < this.WorkFiles.Count; i++) { try { string path = this.StudentWorkFilePath(store, ls, this.WorkFiles[i]); if (File.Exists(path)) { File.Delete(path); this.WorkFiles.Remove(this.WorkFiles[i]); } } catch (Exception e) { UtilTools.OnExceptionRecord(e, this.GetType()); return false; } } return true; }
/// <summary> /// /// </summary> /// <param name="store"></param> public void Add(LocalStudentWorkStore store) { if (store != null) { LocalStudentWorkStore lss = store; this.queue.Enqueue(lss); if (!this.timer.Enabled && !this.isRuning) { this.timer.Start(); } } }
/// <summary> /// 创建缩略图。 /// </summary> /// <param name="store"></param> /// <param name="studentID"></param> /// <param name="w"></param> /// <param name="h"></param> /// <returns></returns> public static Image CreateThumbnailFrist(LocalStudentWorkStore store, string studentID, int w, int h) { if (store != null && !string.IsNullOrEmpty(studentID) && store.Students != null) { LocalStudentWork lsw = null; LocalStudent ls = store.Students[studentID]; if (ls != null && ((lsw = ls.Work) != null) && (lsw.WorkFiles != null && lsw.WorkFiles.Count > 0)) { foreach (LocalStudentWorkFile wf in lsw.WorkFiles) { Image img = CreateThumbnail(store, ls, wf, w, h); if (img != null) { return img; } } return LoadDefaultNULLImage(w, h); } } return null; }
/// <summary> /// 查询数据。 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnQuery_Click(object sender, EventArgs e) { string catalogID = null, classID = null; TreeNode node = this.treeView.SelectedNode; if (node == null || string.IsNullOrEmpty(classID = this.LeftTreeNodeValue(node, "ClassID"))) { return; } catalogID = this.LeftTreeNodeValue(node.Parent, "CatalogID"); this.store = LocalStudentWorkStore.DeSerializer(this.userInfo.UserID, catalogID, classID); #region 查询数据。 if (this.store != null && this.store.Students != null) { string workName = this.txtWorkName.Text.Trim(); string studentName = this.txtStudentName.Text.Trim(); EnumWorkStatus status = EnumWorkStatus.None; if (this.chkReview.Checked) { status |= EnumWorkStatus.Review; } if (this.chkUpload.Checked) { status |= EnumWorkStatus.Upload; } if (this.chkRelease.Checked) { status |= EnumWorkStatus.Release; } if (status != EnumWorkStatus.None) { status &= ~EnumWorkStatus.None; } this.students = this.store.HasWorks(); if (!string.IsNullOrEmpty(studentName)) { this.students = this.students.FindStudents(studentName); } if (!string.IsNullOrEmpty(workName) || (status != EnumWorkStatus.None)) { this.students = this.students.FindStudents(workName, status); } #region 未批阅。 if (this.chkNoReview.Checked && this.students != null && this.students.Count > 0) {//未批阅。 List<LocalStudent> list = new List<LocalStudent>(); for (int i = 0; i < this.students.Count; i++) { LocalStudent ls = this.students[i]; if (ls.HasWork() && ((ls.Work.Status & EnumWorkStatus.Review) == EnumWorkStatus.Review)) { list.Add(ls); } } if (list.Count > 0) { this.students.Remove(list.ToArray()); } } #endregion #region 未上传。 if (this.chkNoUpload.Checked && this.students != null && this.students.Count > 0) {//未上传。 List<LocalStudent> list = new List<LocalStudent>(); for (int i = 0; i < this.students.Count; i++) { LocalStudent ls = this.students[i]; if (ls.HasWork() && ((ls.Work.Status & EnumWorkStatus.Upload) == EnumWorkStatus.Upload)) { list.Add(ls); } } if (list.Count > 0) { this.students.Remove(list.ToArray()); } } #endregion } #endregion; #region 绘制数据。 this.listView.BeginUpdate(); this.listView.Items.Clear(); if (this.store != null && this.students != null && this.students.Count > 0) { ImageList images = ThumbnailsHelpers.ThumbnailImageList(this.store, this.students, this.components, 100, 75); this.listView.LargeImageList = images; this.listView.SmallImageList = images; List<ListViewItem> items = new List<ListViewItem>(); for (int i = 0; i < this.students.Count; i++) { LocalStudent ls = this.students[i]; if (ls.Work != null) { ListViewItem item = new ListViewItem(ls.StudentName, ls.StudentID); item.Tag = ls.StudentID; item.ToolTipText = ls.Work.Description; item.SubItems.Add(ls.Work.WorkName); item.SubItems.Add(EnumWorkStatusOperaTools.GetStatusName(ls.Work.Status)); item.SubItems.Add(string.Format("{0:yyyy-MM-dd HH:mm:ss}", ls.Work.Time)); if (ls.Work.Review != null) { item.SubItems.Add(string.Format("评阅:{0}", ls.Work.Review.ReviewValue)); } item.SubItems.Add(ls.Work.Description); items.Add(item); } } this.listView.Items.AddRange(items.ToArray()); } this.listView.EndUpdate(); #endregion }
/// <summary> /// 恢复作业关联。 /// </summary> public static void RecoveryWorkAssociation(ref LocalStudentWorkStore store, string studentId) { if (store == null || store.Students == null || store.Students.Count == 0 || string.IsNullOrEmpty(studentId)) return; LocalStudent ls = store.Students[studentId]; if (ls == null || ls.HasWork()) return; string dir = Path.GetFullPath(string.Format("{0}/{1}", store.RootDir(), ls.StudentID)); if (!Directory.Exists(dir)) return; FileInfo[] files = new DirectoryInfo(dir).GetFiles(); if (files == null || files.Length == 0) return; ls.Work = new LocalStudentWork(); ls.Work.WorkID = Guid.NewGuid().ToString().Replace("-", ""); ls.Work.WorkName = store.CatalogName; ls.Work.UploadIP = "127.0.0.1"; ls.Work.Type = EnumWorkType.Public; ls.Work.Time = DateTime.Now; ls.Work.Status = EnumWorkStatus.Recive | EnumWorkStatus.Submit; ls.Work.Description = new CDATA(); ls.Work.WorkFiles = new LocalStudentWorkFiles(); for (int i = 0; i < files.Length; i++) { if (files[i].Exists) { LocalStudentWorkFile file = new LocalStudentWorkFile(); file.FileID = Path.GetFileNameWithoutExtension(files[i].Name); file.FileName = ls.Work.WorkName + "_" + (i + 1); file.FileExt = files[i].Extension; file.Size = files[i].Length; if (ls.Work.FileExt == null) ls.Work.FileExt = file.FileExt; else if (ls.Work.FileExt.IndexOf(file.FileExt) == -1) ls.Work.FileExt += string.Format("|{0}", file.FileExt); ls.Work.WorkFiles.Add(file); } } }
/// <summary> /// 构造函数。 /// </summary> /// <param name="store"></param> /// <param name="ls"></param> public StudentWorkUpload(LocalStudentWorkStore store, LocalStudent ls) { this.Status = 0; this.Store = store; this.Student = ls; this.Number = 1; }
protected void LoadControls(string[] studentIDs) { this.btnStartUpload.Enabled = false; string err = null; if (studentIDs == null || studentIDs.Length == 0) { this.btnStartUpload.Enabled = true; this.OnChanged(err = "未选择上传作业的学生!"); MessageBox.Show(err); return; } this.Store = LocalStudentWorkStore.DeSerializer(this.Store.FileSavePath()); if (this.Store == null || this.Store.Students == null || this.Store.Students.Count == 0) { this.btnStartUpload.Enabled = true; this.OnChanged(err = "加载作业存储索引文件失败或索引中没有学生作业数据!"); MessageBox.Show(err); return; } this.uploadStudents = new List<StudentWorkUpload>(); for (int i = 0; i < studentIDs.Length; i++) { LocalStudent ls = this.Store.Students[studentIDs[i]]; if (ls != null && ls.HasWork()) { this.uploadStudents.Add(new StudentWorkUpload(this.Store, ls)); } } if (this.uploadStudents.Count == 0) { this.btnStartUpload.Enabled = true; this.OnChanged(err = "没有找到学生的作业数据!"); MessageBox.Show(err); return; } this.uploadFailureQueue.Clear(); this.SuspendLayout(); this.panel.SuspendLayout(); int w = this.panel.Width - 5; for (int i = 0; i < this.uploadStudents.Count; i++) { StudentWorkUpload swp = this.uploadStudents[i]; WorkUploadProgress workProgress = new WorkUploadProgress(string.Format("{0}.{1}", i + 1, swp.Title)); workProgress.Width = w; workProgress.Margin = new Padding(3); workProgress.Location = new Point(0, workProgress.Height * i + 3); this.panel.Controls.Add(swp.Progress = workProgress); } this.panel.ResumeLayout(true); this.ResumeLayout(true); this.btnStartUpload.Enabled = true; }
/// <summary> /// 创建学生作业缩略图集合。 /// </summary> /// <param name="store"></param> /// <param name="localStudents"></param> /// <param name="container"></param> /// <param name="w"></param> /// <param name="h"></param> /// <returns></returns> public static ImageList ThumbnailImageList(LocalStudentWorkStore store, LocalStudents students, IContainer container, int w, int h) { if (store == null || students == null || students.Count == 0) return null; ImageList imgList = container == null ? new ImageList() : new ImageList(container); imgList.ImageSize = new Size(w, h); imgList.TransparentColor = Color.Transparent; foreach (LocalStudent ls in students) { Image img = CreateThumbnailFrist(store, ls.StudentID, w, h); if (img != null) { imgList.Images.Add(ls.StudentID, img); } } return imgList; }
/// <summary> /// /// </summary> /// <param name="store"></param> /// <param name="ls"></param> /// <param name="handler"></param> private void IssueWorkData(LocalStudentWorkStore store,LocalStudent ls, RaiseChangedHandler handler) { lock (this) { if (store != null && ls != null && ls.HasWork()) { LocalStudentWork lsw = ls.Work; int len = 0; if (lsw.WorkFiles != null && (len = lsw.WorkFiles.Count) > 0) { this.RaiseChanged(handler, string.Format("下发[{0},{1}]作品数据{2}", ls.StudentName, ls.StudentCode, lsw.WorkName)); string[] filePaths = new string[len]; for (int i = 0; i < len; i++) { filePaths[i] = lsw.StudentWorkFilePath(store, ls, lsw.WorkFiles[i]); } byte[] data = ZipUtils.Zip(filePaths); if (data != null && data.Length > 0) { IssueWorkFile issue = new IssueWorkFile(); issue.StudentID = ls.StudentID; issue.WorkName = lsw.WorkName; issue.UID = store.TeacherID; issue.Time = DateTime.Now; issue.Data = data; this.netService.SendIssueWork(issue); } else { this.RaiseChanged(handler, string.Format("压缩数据文件失败![{0},{1}]", ls.StudentName, lsw.WorkName)); } } } } }
/// <summary> /// 保存数据。 /// </summary> /// <param name="store">学生作品存储。</param> /// <param name="ls">学生信息。</param> /// <param name="files">文件数据。</param> public void SaveFiles(LocalStudentWorkStore store, LocalStudent ls, StudentWorkFiles files) { if (store != null && ls != null && files != null && files.Count > 0) { if (this.WorkFiles == null) this.WorkFiles = new LocalStudentWorkFiles(); else this.WorkFiles.Clear(); for (int i = 0; i < files.Count; i++) { StudentWorkFile swf = files[i]; if (swf.Data != null && swf.Data.Length > 0) { LocalStudentWorkFile file = new LocalStudentWorkFile(); file.FileID = swf.FileID; file.FileName = Path.GetFileNameWithoutExtension(swf.FileName); file.FileExt = swf.FileExt; file.Size = swf.Size > 0 ? swf.Size : swf.Data.Length; if (this.FileExt == null) this.FileExt = file.FileExt; else if (this.FileExt.IndexOf(file.FileExt) == -1) this.FileExt += string.Format("|{0}", file.FileExt); string path = this.StudentWorkFilePath(store, ls, file); if (!string.IsNullOrEmpty(path)) { using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write)) { fs.Write(swf.Data, 0, swf.Data.Length); } this.WorkFiles.Add(file); } } } } }
/// <summary> /// 修正作业文件后缀。 /// </summary> private void CorrectWorkFileSuffix(LocalStudentWorkStore store) { if (store != null && store.Students != null && store.Students.Count > 0) { for (int i = 0; i < store.Students.Count; i++) { LocalStudent ls = store.Students[i]; if (ls != null && ls.HasWork()) { LocalStudentWork lsw = ls.Work; if (lsw != null && lsw.WorkFiles != null && lsw.WorkFiles.Count > 0) { for (int k = 0; k < lsw.WorkFiles.Count; k++) { LocalStudentWorkFile lswf = lsw.WorkFiles[k]; if (lswf != null) { lswf.FileName = Path.GetFileNameWithoutExtension(lswf.FileName); } } } } } } }
/// <summary> /// 启动侦听。 /// </summary> /// <param name="students"></param> public void StartListen(StudentsEx students) { if (students == null) { throw new ArgumentNullException("students", "学生未准备就绪"); } students.SetOfflineStatus(); #region 初始化学生作品存储。 if (this.userInfo != null && this.sci != null) { lock (this) { this.classId = this.sci.ClassInfo.ClassID; LocalStudentWorkStore store = LocalStudentWorkStore.DeSerializer(this.userInfo.UserID, this.sci.CatalogInfo.CatalogID, this.sci.ClassInfo.ClassID); #region 初始化。 if (store == null) { store = new LocalStudentWorkStore(); store.TeacherID = this.userInfo.UserID; store.GradeID = this.sci.GradeID; store.CatalogID = this.sci.CatalogInfo.CatalogID; store.ClassID = this.sci.ClassInfo.ClassID; store.Evaluate = this.sci.Evaluate; } #endregion #region 更新。 store.TeacherName = this.userInfo.UserName; store.GradeName = this.sci.GradeName; store.CatalogName = this.sci.CatalogInfo.CatalogName; store.ClassName = this.sci.ClassInfo.ClassName; store.Evaluate = this.sci.Evaluate; #endregion #region 更新学生信息。 if (students != null && students.Count > 0) { if (store.Students == null) store.Students = new LocalStudents(); string sId = null; for (int i = 0; i < students.Count; i++) { sId = students[i].StudentID; if (!string.IsNullOrEmpty(sId)) { LocalStudent ls = store.Students[sId]; if (ls == null) { ls = new LocalStudent(students[i]); store.Students.Add(ls); } //恢复关联。 Tools.RecoveryWorkAssociation(ref store, ls.StudentID); if (ls.HasWork()) { students[i].Status |= StudentControl.EnumStudentState.Upload; if ((ls.Work.Status & EnumWorkStatus.Review) == EnumWorkStatus.Review) { students[i].Status |= StudentControl.EnumStudentState.Review; } } } } } #endregion //序列化数据。 if (!WorkStoreHelper.Serializer(ref store)) { throw new Exception("生成索引文件失败(索引文件被占用),请稍后重试!"); } //设置当前班级学生。 Program.STUDENTS = students; } } #endregion this.RaiseChanged("开启端口监听..."); this.udpSocket.Start(); this.RaiseChanged("打开文件上传端口侦听..."); this.workUpTcpService.StartListen(); }
/// <summary> /// 加载数据。 /// </summary> /// <param name="index">学生索引。</param> private void LoadData(int index) { lock (this) { if (this.store == null) return; this.isDialogResult = false; this.store = LocalStudentWorkStore.DeSerializer(this.store.FileSavePath()); if (this.store.Students != null && this.localStudentCollection != null) { this.Tag = null; int count = this.localStudentCollection.Count; this.isPrevEnabled = this.btnPrev.Enabled = (index > 0); this.isNextEnabled = this.btnNext.Enabled = (index < (count - 1)); if ((index > -1) && (index < count)) { LocalStudent ls = this.localStudentCollection[index]; if (ls != null) { ls = this.store.Students[ls.StudentID]; if (ls != null) { this.Tag = ls; #region 填充数据。 LocalStudentWork lsw = ls.Work; this.linkDownloadWork.Tag = ls.StudentID; if (lsw != null) { this.Title = this.txtWorkName.Text = lsw.WorkName; this.txtWorkstatusName.Text = EnumWorkStatusOperaTools.GetStatusName(lsw.Status); this.txtUploadIP.Text = lsw.UploadIP; this.chkPublic.Checked = (lsw.Type == EnumWorkType.Public); this.txtTime.Text = string.Format("{0:yyyy-MM-dd HH:mm:ss}", lsw.Time); //this.txtCheckCode.Text = lsw.CheckCode; this.txtDescription.Text = lsw.Description == null ? new CDATA() : lsw.Description; this.chkPublish.Checked = ((lsw.Status & EnumWorkStatus.Release) == EnumWorkStatus.Release); } else { this.Title = this.txtWorkName.Text = string.Empty; this.txtWorkstatusName.Text = string.Empty; this.txtUploadIP.Text = string.Empty; this.chkPublic.Checked = false; this.txtTime.Text = string.Empty; //this.txtCheckCode.Text = string.Empty; this.txtDescription.Text = string.Empty; this.chkPublish.Checked = false; } this.OnToolTipEvent(this.txtWorkName, string.Format("所属科目:{0}", this.store.CatalogName)); this.txtStudentName.Text = string.Format("{0}[{1}]", ls.StudentName, ls.StudentCode); this.OnToolTipEvent(this.txtStudentName, string.Format("所属年级:{0},所属班级:{1}", this.store.GradeName, this.store.ClassName)); #endregion #region 加载缩略图。 int len = 0; if (lsw.WorkFiles != null && (len = lsw.WorkFiles.Count) > 0) { this.pictureBox.Image = ThumbnailsHelpers.CreateThumbnailFrist(this.store, ls.StudentID, 200, 150); this.pictureBox.Tag = ls; this.OnToolTipEvent(this.pictureBox, "学生作品缩略图,双击将查看作品文件!"); } else { this.pictureBox.Image = null; } #endregion this.linkDownloadWork.Text = string.Format(this.linkDownloadWork.Text, len); #region 加载评阅信息。 this.cbbReviewValue.SelectedIndex = -1; this.txtSubjectiveReviews.Text = string.Empty; if (this.store.Evaluate != null && lsw.Review != null) { this.txtSubjectiveReviews.Text = lsw.Review.SubjectiveReviews; if (this.store.Evaluate.Type == EnumEvaluateType.Hierarchy) { if (!string.IsNullOrEmpty(lsw.Review.ReviewValue)) { this.cbbReviewValue.SelectedValue = lsw.Review.ReviewValue; } } else { this.cbbReviewValue.Text = lsw.Review.ReviewValue; } } #endregion } else { this.OnMessageEvent(MessageType.PopupInfo, "该学生或被删除,请刷新界面或重新查询!"); this.btnClose_Click(this.btnClose, null); } } } this.btnDelete.Enabled = this.btnSave.Enabled = (this.Tag != null); } } }
private static ThumbnailsControl BuildThumbnail(LocalStudentWorkStore store, LocalStudent ls) { if (store == null || ls == null) return null; if (ls.Work != null) { ThumbnailsControl control = new ThumbnailsControl(); Image img = ThumbnailsHelpers.CreateThumbnailFrist(store, ls.StudentID, control.Width, control.Height); if (img != null) { control.WorkID = ls.Work.WorkID; control.StudentID = ls.StudentID; control.Text = ls.Work.WorkName; control.StudentName = ls.StudentName; control.Time = ls.Work.Time; control.ToolTip = string.Format("学生姓名:{0}\r\n作品名称:{1}\r\n目录名称:{2}\r\n作品状态:{3}\r\n作品类型:{4}\r\n描述:{5}\r\n提交时间:{6:yyyy-MM-dd HH:mm:ss}", ls.StudentName, ls.Work.WorkName, store.CatalogName, EnumWorkStatusOperaTools.GetStatusName(ls.Work.Status), EnumWorkTypeOperaTools.GetTypeName(ls.Work.Type), ls.Work.Description, ls.Work.Time); control.Thumbnails = img; return control; } } return null; }
private static ThumbnailsControls BuildThumbnails(LocalStudentWorkStore store, EventHandler doubleClickHandler) { if (store != null && store.Students != null && store.Students.Count > 0) { ThumbnailsControls thumbnails = new ThumbnailsControls(); for (int i = 0; i < store.Students.Count; i++) { ThumbnailsControl tc = BuildThumbnail(store, store.Students[i]); if (tc != null) { tc.Cursor = Cursors.Hand; if (doubleClickHandler != null) tc.DoubleClick += doubleClickHandler; thumbnails.Add(tc); } } return thumbnails; } return null; }
/// <summary> /// /// </summary> /// <param name="store"></param> /// <param name="students"></param> /// <param name="dir"></param> /// <param name="zipFile"></param> /// <param name="handler"></param> private void ImportWorkFiles(LocalStudentWorkStore store, LocalStudents students, string dir, ZipFile zipFile, RaiseChangedHandler handler) { if (store != null && students != null && students.Count > 0 && zipFile != null) { foreach (LocalStudent ls in students) { if (ls.HasWork()) { LocalStudentWork lsw = ls.Work; if (lsw.WorkFiles != null && lsw.WorkFiles.Count > 0) { string zipDir = string.Format("{0}{1}{2}{1}", dir, Path.DirectorySeparatorChar, ls.StudentID); this.RaiseChanged(handler, string.Format("导入[{0},{1}]作品数据...", ls.StudentName, ls.StudentCode)); foreach (LocalStudentWorkFile lswf in lsw.WorkFiles) { string sPath = string.Format("{0}{1}{2}", zipDir, lswf.FileID, lswf.FileExt); try { using (Stream stream = ZipUtils.ZipFileData(zipFile, sPath)) { if (stream != null) { this.RaiseChanged(handler, string.Format("导入作品{0}{1}...", lswf.FileName, lswf.FileExt)); using (FileStream fs = new FileStream(lsw.StudentWorkFilePath(store, ls, lswf), FileMode.Create, FileAccess.Write)) { byte[] buf = new byte[512]; int len = 0; while ((len = stream.Read(buf, 0, buf.Length)) > 0) { fs.Write(buf, 0, len); } } } } } catch (Exception x) { Exception t = new Exception(string.Format("[{0},{1}]{2}{3}:{4}", ls.StudentName, ls.StudentCode, lswf.FileName, lswf.FileExt, sPath), x); UtilTools.OnExceptionRecord(t, typeof(ImportWorkUtils)); } } } } } } }
/// <summary> /// /// </summary> /// <param name="zipWorkPath"></param> /// <param name="store"></param> /// <param name="ls"></param> /// <param name="lsw"></param> /// <param name="handler"></param> private void ImportWorkFiles(string zipWorkPath, LocalStudentWorkStore store, LocalStudent ls, LocalStudentWork lsw, RaiseChangedHandler handler) { if (this.zipFile != null && !string.IsNullOrEmpty(zipWorkPath)) { Stream stream = stream = ZipUtils.ZipFileData(this.zipFile, zipWorkPath); if (stream != null) { if (string.Equals(Path.GetExtension(zipWorkPath), ".zip", StringComparison.InvariantCultureIgnoreCase)) { #region 压缩文件解压。 using (ZipInputStream zipStream = new ZipInputStream(stream)) { if (zipStream == null) { return; } ZipEntry entry = null; while ((entry = zipStream.GetNextEntry()) != null) { if (entry != null && entry.IsFile && !string.IsNullOrEmpty(entry.Name)) { LocalStudentWorkFile lswf = new LocalStudentWorkFile(); lswf.FileID = string.Format("{0}", Guid.NewGuid()).Replace("-", string.Empty); lswf.FileExt = Path.GetExtension(entry.Name); lswf.FileName = Path.GetFileNameWithoutExtension(entry.Name); if (string.IsNullOrEmpty(lsw.FileExt)) { lsw.FileExt = lswf.FileExt; } else if (lsw.FileExt.IndexOf(lswf.FileExt) == -1) { lsw.FileExt += "|" + lswf.FileExt; } lswf.Size = entry.Size; lsw.WorkFiles.Add(lswf); this.RaiseChanged(handler, string.Format("导入作品{0}{1}...", lswf.FileName, lswf.FileExt)); using (FileStream fs = new FileStream(lsw.StudentWorkFilePath(store, ls, lswf), FileMode.Create, FileAccess.Write)) { byte[] buf = new byte[512]; int len = 0; while ((len = zipStream.Read(buf, 0, buf.Length)) > 0) { fs.Write(buf, 0, len); } } } } } #endregion } else { #region 导入单独文件。 LocalStudentWorkFile lswf = new LocalStudentWorkFile(); lswf.FileID = string.Format("{0}", Guid.NewGuid()).Replace("-", string.Empty); lswf.FileName = lsw.WorkName; lswf.FileExt = Path.GetExtension(zipWorkPath); if (string.IsNullOrEmpty(lsw.FileExt)) { lsw.FileExt = lswf.FileExt; } else if (lsw.FileExt.IndexOf(lswf.FileExt) == -1) { lsw.FileExt += "|" + lswf.FileExt; } lswf.Size = stream.Length; lsw.WorkFiles.Add(lswf); this.RaiseChanged(handler, string.Format("导入作品{0}{1}...", lswf.FileName, lswf.FileExt)); using (FileStream fs = new FileStream(lsw.StudentWorkFilePath(store, ls, lswf), FileMode.Create, FileAccess.Write)) { byte[] buf = new byte[512]; StreamUtils.Copy(stream, fs, buf); } #endregion } } } }