/// <summary> /// wait client feedback /// </summary> /// <param name="fe"></param> public void SendEmailtoClientForFeedBack(FeedBacksEntity fe) { string contentTemplete = GetEmailExecuter("SendEmailToClientForFeedBack.txt"); string from = Config.DefaultSendEmail; string to = ""; TicketsEntity te = ticketsRpst.Get(fe.TicketID); var creators = ticketsUserRpst.GetTicketUser(fe.TicketID, TicketUsersType.Create); var creator = creators != null && creators.Count > 0 ? creators[0] : null; if (creator != null) { var user = userRpst.Get(creator.UserID); to = user.Email; string subject = string.Format("Ticket #{0} {1} needs your feedback.", te.TicketCode, te.Title); string content = string.Empty; if (!string.IsNullOrEmpty(contentTemplete.Trim())) { content = contentTemplete.Trim(); content = content.Replace("[ClientName]", user.FirstAndLastName); content = content.Replace("[PmName]", GetUnameByRoleTypeAndTicketId(te.TicketID, TicketUsersType.PM)); } emailSender.SendMail(to, @from, subject, content.ToString()); } }
private FeedBacksEntity GetFeedbacksEntity(int ticketID, string content, bool isPublic, bool isWaitClient, bool isWaitPM) { FeedBacksEntity feedbacksEntity = new FeedBacksEntity(); feedbacksEntity.IsDelete = false; feedbacksEntity.TicketID = ticketID; feedbacksEntity.Title = string.Empty; feedbacksEntity.Description = content; //content.NoHTML(); feedbacksEntity.CreatedBy = UserInfo.UserID; feedbacksEntity.CreatedOn = DateTime.Now; feedbacksEntity.ModifiedOn = DateTime.Now; feedbacksEntity.WaitClientFeedback = isWaitClient ? FeedbackReplyStatus.Requested : FeedbackReplyStatus.Normal; feedbacksEntity.WaitPMFeedback = isWaitPM ? FeedbackReplyStatus.Requested : FeedbackReplyStatus.Normal; if (UserInfo.Role == RolesEnum.CLIENT || isWaitClient) { feedbacksEntity.IsPublic = true; } else { feedbacksEntity.IsPublic = isPublic; } return(feedbacksEntity); }
/// <summary> /// Add a record /// </summary> public int Insert(FeedBacksEntity model) { StringBuilder strSql = new StringBuilder(); strSql.Append("set @Order = [dbo].[GetFeedbackIndexByTicket] (@TicketID);insert into FeedBacks("); strSql.Append("TicketID,Title,Description,CreatedBy,CreatedOn,IsDelete,IsPublic,WaitClientFeedback,WaitPMFeedback,[Order])"); strSql.Append(" values ("); strSql.Append(@"@TicketID,@Title,@Description,@CreatedBy,@CreatedOn,@IsDelete,@IsPublic,@WaitClientFeedback,@WaitPMFeedback,@Order)"); strSql.Append(";select ISNULL( SCOPE_IDENTITY(),0);"); Database db = DatabaseFactory.CreateDatabase(); using (DbCommand dbCommand = db.GetSqlStringCommand(strSql.ToString())) { db.AddInParameter(dbCommand, "TicketID", DbType.Int32, model.TicketID); db.AddInParameter(dbCommand, "Title", DbType.String, model.Title); db.AddInParameter(dbCommand, "Description", DbType.String, model.Description); db.AddInParameter(dbCommand, "CreatedBy", DbType.Int32, model.CreatedBy); db.AddInParameter(dbCommand, "CreatedOn", DbType.DateTime, model.CreatedOn); db.AddInParameter(dbCommand, "IsDelete", DbType.Boolean, model.IsDelete); db.AddInParameter(dbCommand, "IsPublic", DbType.Boolean, model.IsPublic); db.AddInParameter(dbCommand, "WaitClientFeedback", DbType.Int32, (int)model.WaitClientFeedback); db.AddInParameter(dbCommand, "WaitPMFeedback", DbType.Int32, (int)model.WaitPMFeedback); db.AddOutParameter(dbCommand, "Order", DbType.Int32, 8); int result; object obj = db.ExecuteScalar(dbCommand); if (!int.TryParse(obj.ToString(), out result)) { return(0); } model.Order = int.Parse("0" + db.GetParameterValue(dbCommand, "Order").ToString()); return(result); } }
private string FormatOrder(FeedBacksEntity feedback) { var templates = new Dictionary <int, string>(); templates.Add((int)FeedbackReplyStatus.Requested, "<span title='{0}' class='feedback_waiting'>#{1}</span>"); templates.Add((int)FeedbackReplyStatus.Replied, "<span title='{0}' class='feedback_writed'>#{1}</span>"); var clientStatusTexts = new Dictionary <int, string>(); clientStatusTexts.Add((int)FeedbackReplyStatus.Requested, "Waiting for Client feedback"); clientStatusTexts.Add((int)FeedbackReplyStatus.Replied, "Replied"); var sunnetStatusTexts = new Dictionary <int, string>(); sunnetStatusTexts.Add((int)FeedbackReplyStatus.Requested, "Waiting Sunnet feedback"); sunnetStatusTexts.Add((int)FeedbackReplyStatus.Replied, "Replied"); if (feedback.WaitClientFeedback != FeedbackReplyStatus.Normal) { return(string.Format(templates[(int)feedback.WaitClientFeedback], clientStatusTexts[(int)feedback.WaitClientFeedback], feedback.Order)); } if (feedback.WaitPMFeedback != FeedbackReplyStatus.Normal) { return(string.Format(templates[(int)feedback.WaitPMFeedback], sunnetStatusTexts[(int)feedback.WaitPMFeedback], feedback.Order)); } return(string.Format("#{0}", feedback.Order)); }
protected string ShowReply(object feedbackId, object ticketId, object WaitClientFeedback, object WaitPMFeedback) { FeedBacksEntity entity = fbApp.GetFeedBacksEntity((int)feedbackId); if (((entity.CreatedBy == UserInfo.UserID) || (UserInfo.UserType == "SUNNET" || ticketEntity(ticketId).CompanyID == UserInfo.CompanyID)) && ticketEntity(ticketId).Status != TicketsState.Completed && ticketEntity(ticketId).Status != TicketsState.Cancelled) { if (UserInfo.Role == RolesEnum.CLIENT && (int)WaitClientFeedback == 1) { return(string.Format("<a href=\"###\" onclick=\"OpenReplyFeedBackDialog({0},{1})\" title=\"Need FeedBack\"><img src=\"/icons/needReply.gif\" alt=\"Need FeedBack\" /></a>" , feedbackId, ticketId)); } else if (UserInfo.Role == RolesEnum.PM && (int)WaitPMFeedback == 1) { return(string.Format("<a href=\"###\" onclick=\"OpenReplyFeedBackDialog({0},{1})\" title=\"Need FeedBack\"><img src=\"/icons/needReply.gif\" alt=\"Need FeedBack\" /></a>" , feedbackId, ticketId)); } else if ((int)WaitClientFeedback != 1 && (int)WaitPMFeedback != 1) { return(string.Format("<a href=\"###\" onclick=\"OpenReplyFeedBackDialog({0},{1})\" title=\"Reply FeedBack\"><img src=\"/icons/reply.gif\" alt=\"Reply FeedBack\" /></a>" , feedbackId, ticketId)); } } return(""); }
public List <FeedBacksEntity> GetFeedBackListByTicketId(int tid, bool isSunnet, bool isSunneter , bool isPM, bool isSupervisor) { List <FeedBacksEntity> list = new List <FeedBacksEntity>(); StringBuilder strSql = new StringBuilder(); strSql.Append("select * from feedbacks A inner join users B ") .Append(" on A.CreatedBy=B.userID") .Append(" where TicketID = @TicketID "); if (isSunnet && !isSunneter) //Client 只能看pm和client的feedback { strSql.Clear(); strSql.Append("select * from feedbacks A inner join users B ") .Append(" inner join Roles C on B.RoleID=C.RoleID ") .Append(" on A.CreatedBy=B.userID") .Append(" where TicketID = @TicketID ") .Append(" and (C.RoleName='PM' or C.RoleName='Client' or C.RoleName='Sales')") .Append(" and IsPublic = 1"); } if (isSupervisor) //Supervisor 只能看pm和Supervisor的feedback { strSql.Clear(); strSql.Append("select * from feedbacks A inner join users B ") .Append(" inner join Roles C on B.RoleID=C.RoleID ") .Append(" on A.CreatedBy=B.userID") .Append(" where TicketID = @TicketID ") .Append(" and (C.RoleName='PM' or C.RoleName='Supervisor')"); } strSql.Append(" order by FeedBackID asc "); Database db = DatabaseFactory.CreateDatabase(); using (DbCommand dbCommand = db.GetSqlStringCommand(strSql.ToString())) { try { db.AddInParameter(dbCommand, "TicketID", DbType.Int32, tid); using (IDataReader dataReader = db.ExecuteReader(dbCommand)) { while (dataReader.Read()) { list.Add(FeedBacksEntity.ReaderBind(dataReader)); } } } catch (Exception ex) { WebLogAgent.Write(string.Format("[SQLText:{0},{1}Messages:\r\n{2}]", strSql.ToString() , base.FormatParameters(dbCommand.Parameters), ex.Message)); return(null); } } return(list); }
protected void Page_Load(object sender, EventArgs e) { int tid = QS("tid", 0); int feedbackId = QS("feedbackId", 0); if (tid == 0 && feedbackId == 0) { this.ShowArgumentErrorMessageToClient(); return; } #region role FeedBacksEntity entity = new FeedBacksEntity(); if (feedbackId > 0) { entity = fbAPP.GetFeedBacksEntity(feedbackId); if (!CheckSecurity(entity.TicketID)) { this.ShowArgumentErrorMessageToClient(); return; } entity.Title = string.Format("<strong>Re:{0}</strong>", entity.Title.Replace("<strong>", "").Replace("</strong>", "")); AddFeedBack1.IsReply = true; Page.Title = "Reply Feedback"; } else { if (!CheckSecurity(tid)) { this.ShowArgumentErrorMessageToClient(); return; } if (UserInfo.Role == RolesEnum.PM || UserInfo.Role == RolesEnum.ADMIN || UserInfo.Role == RolesEnum.CLIENT) { entity.IsPublic = true; } else { entity.IsPublic = false; } entity.TicketID = tid; Page.Title = "Add FeedBacks"; } ProjectIDResponse = ticketsApp.GetProjectIdAndUserID(entity.TicketID); if (null != ProjectIDResponse) { this.AddFeedBack1.ProjectID = ProjectIDResponse.ProjectId; } this.AddFeedBack1.FeedBacksEntityInfo = entity; #endregion }
public string DeleteFeedback(int userID, int feedbackID, int ticketID) { if (userID != UserID) { return(ResponseMessage.GetResponse(false, "Unauthorized operation.", 0)); } if (feedbackID == 0) { return(ResponseMessage.GetResponse(false, "Arguments error.", 0)); } FeedBackApplication feedBackApplication = new FeedBackApplication(); //先判定feedback是不是public然后判断是不是wait client==1或waitpm ==1如果是并且ticket状态不为normal则改为normal FeedBacksEntity feedBacksEntity = feedBackApplication.GetFeedBacksEntity(feedbackID); if (feedBacksEntity.WaitClientFeedback == FeedbackReplyStatus.Requested) { ticketApp.ClearWaitingByType(ticketID, TicketUsersType.Create, TicketUsersType.Client, TicketUsersType.PM); ticketApp.DeleteUserFromTicket(ticketID, TicketUsersType.Client); } if (feedBacksEntity.WaitPMFeedback == FeedbackReplyStatus.Requested) { var ticketEntity = ticketApp.GetTickets(ticketID); var projectEntity = projectApp.Get(ticketEntity.ProjectID); if (ticketApp.UpdateTicketStatus(ticketID, UserTicketStatus.Normal, TicketUsersType.PM, TicketUsersType.Create, TicketUsersType.Client)) { ticketEntity.ResponsibleUser = PmReplyClient(projectEntity, ticketEntity); ticketApp.UpdateTickets(ticketEntity, false); } } //再删除feedbackmessage,并且feedback状态不为normal则改为normal bool result = feedBackApplication.DeleteFeedback(feedbackID); if (result) { return(ResponseMessage.GetResponse(true)); } else { var tmpMessage = feedBackApplication.BrokenRuleMessages != null && feedBackApplication.BrokenRuleMessages.Count > 0 ? feedBackApplication.BrokenRuleMessages[0].Message : ""; return(ResponseMessage.GetResponse(false, tmpMessage)); } }
private FeedBacksEntity GetFeedbacksEntity() { var feedbacksEntity = new FeedBacksEntity { IsDelete = false, TicketID = TicketID, Title = string.Empty, Description = txtDescription.Text, CreatedBy = UserInfo.UserID, CreatedOn = DateTime.Now, ModifiedOn = DateTime.Now, IsPublic = false, WaitClientFeedback = FeedbackReplyStatus.Normal, WaitPMFeedback = FeedbackReplyStatus.Normal }; return(feedbacksEntity); }
public FeedBacksEntity GetFeedBacksEntity(int id) { this.ClearBrokenRuleMessages(); if (id <= 0) { return(null); } FeedBacksEntity entity = repository.Get(id); if (entity == null) { this.AddBrokenRuleMessages(mgr.BrokenRuleMessages); return(null); } return(entity); }
public void SendEmailtoPMForFeedBack(FeedBacksEntity fe) { string to = ""; TicketsEntity te = ticketsRpst.Get(fe.TicketID); te.Status = TicketsState.Submitted; to = SendEmailByTicketState(te);//get pm's email //xml 发送邮件 XElement xmlInvoice1 = XElement.Load(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "Template/SendEmailToPmForFeedBack.xml"); emailBody = xmlInvoice1.Element("email").Elements("content").First().Value; emailSubject = xmlInvoice1.Element("email").Elements("subject").First().Value .Replace("{TicketID}", te.TicketID.ToString()) .Replace("{TicketTitle}", te.Title); emailBody = emailBody.Replace("{TicketID}", te.TicketID.ToString()) .Replace("{userName}", GetNameById(fe.CreatedBy)); SFConfig.Components.EmailSender.SendMail(to, emailSubject, emailBody, true, MailPriority.Normal); }
public int AddFeedBacks(FeedBacksEntity entity) { this.ClearBrokenRuleMessages(); BaseValidator <FeedBacksEntity> validator = new AddFeedBacksValidator(); if (!validator.Validate(entity)) { this.AddBrokenRuleMessages(validator.BrokenRuleMessages); return(0); } int result = repository.Insert(entity); if (result <= 0) { this.AddBrokenRuleMessage(); return(0); } return(result); }
/// <summary> /// Get an object entity /// </summary> public FeedBacksEntity Get(int FeedBackID) { StringBuilder strSql = new StringBuilder(); strSql.Append("select * from FeedBacks "); strSql.Append(" where FeedBackID=@FeedBackID"); Database db = DatabaseFactory.CreateDatabase(); using (DbCommand dbCommand = db.GetSqlStringCommand(strSql.ToString())) { db.AddInParameter(dbCommand, "FeedBackID", DbType.Int32, FeedBackID); FeedBacksEntity model = null; using (IDataReader dataReader = db.ExecuteReader(dbCommand)) { if (dataReader.Read()) { model = FeedBacksEntity.ReaderBind(dataReader); } } return(model); } }
protected void btnSave_Click(object sender, EventArgs e) { int tmpState = int.Parse(ddlStatus.SelectedValue); TicketsState selectState = (TicketsState)tmpState; if (rdoAccounting.SelectedValue == "1") { //int wid = int.Parse(ddl_Proposal.SelectedValue); int wid = int.Parse(hid_Proposal.Value); ProposalTrackerRelationEntity model = wrApp.GetProposalTrackerByTid(ticketID); if (model == null || model.ID == 0) { model.CreatedBy = IdentityContext.UserID; model.TID = ticketID; model.WID = wid; wrApp.AddProposalTrackerRelation(model); } else { if (model.TID != ticketID || model.WID != wid) { model.TID = ticketID; model.WID = wid; wrApp.UpdateProposalByProposal(model); } } } else { ProposalTrackerRelationEntity model = wrApp.GetProposalTrackerByTid(ticketID); if (model != null || model.ID > 0) { wrApp.DelProposalTrackerRelationByID(model.ID); } } bool result = false; //指定初次估时者 int estimationUserID = 0; bool isEstimation = rdoEstimationYes.Checked; if (isEstimation && selectState == TicketsState.PM_Reviewed) { if (!int.TryParse(QF(ddlEstUser.UniqueID), out estimationUserID)) { ShowFailMessageToClient("Invalid extimation user."); return; } } //选择accounting string accounting = (rdoAccounting.SelectedValue == "" ? "0" : rdoAccounting.SelectedValue); ticketsEntity.Accounting = (AccountingState)int.Parse(accounting); //指派最终确认估时者 int confirmEstmateUserId = 0; if (selectState == TicketsState.Waiting_Confirm) { if (!int.TryParse(QF(ddlConfirmEstmateUserId.UniqueID), out confirmEstmateUserId)) { ShowFailMessageToClient("Invalid Waiting Confirm user."); return; } } decimal initialtionHours; //初次估时 if (!decimal.TryParse(txtInitialTime.Text, out initialtionHours)) { ShowFailMessageToClient("Invalid extimation hour."); return; } decimal extimationHours; ///最终估时 if (!decimal.TryParse(txtBoxExtimationHours.Text, out extimationHours)) { ShowFailMessageToClient("Invalid extimation hour."); return; } ///没有达到预期要求 if (((TicketsState)int.Parse(ddlStatus.SelectedValue)) == TicketsState.PM_Deny) { HttpFileCollection files = Request.Files; string fileuploadErrMsg = string.Empty; for (int i = 0; i < files.Count; i++) { if (files[i].ContentLength > 0 || txtBoxDenyReason.Text.Trim().Length > 0) { FeedBacksEntity feedbacksEntity = GetFeedbacksEntity(); feedbacksEntity.ID = fbAPP.AddFeedBacks(feedbacksEntity); result = feedbacksEntity.ID > 0; if (!result) { ShowFailMessageToClient(fbAPP.BrokenRuleMessages); return; } if (files[i].ContentLength > 0 && IsValidFile(files[i].FileName)) { if (!InsertFile(files[i], ticketsEntity.ProjectID, false, feedbacksEntity.ID)) { fileuploadErrMsg += files[i].FileName + " Upload failed."; result = false; } } } } } if (selectState == TicketsState.Estimation_Approved) { ticketsEntity.ProprosalName = txtProprosalName.Text; ticketsEntity.WorkPlanName = txtWorkPlanName.Text; ticketsEntity.WorkScope = txtWorkScope.Text; ticketsEntity.Invoice = txtInvoice.Text; } int responsibleUserId; int.TryParse(QF(ddlResponsibleUser.UniqueID), out responsibleUserId); int oldResponsibleUserId = ticketsEntity.ResponsibleUser; ticketsEntity.ResponsibleUser = responsibleUserId; ProjectsEntity projectEntity = projApp.Get(ticketsEntity.ProjectID); int newClientId = -1; if (ddlClient.Visible == true) { if (ddlClient.SelectedValue != "-1") { newClientId = int.Parse(ddlClient.SelectedValue); } } result = ticketApp.PMReview(ticketsEntity, UserInfo, rdoRequestYes.Checked, ddlStatus.SelectedValue, isEstimation, estimationUserID, confirmEstmateUserId, initialtionHours, extimationHours , ticketUsersView.GetSelectedUserList(), txtBoxConvertDescr.Text, txtBoxDenyReason.Text.Trim(), projectEntity.PMID, newClientId); if (ddlClient.Visible == true) { if (ddlClient.SelectedValue != "-1") { ticketApp.UpdateCreateUser(int.Parse(ddlClient.SelectedValue), ticketsEntity.TicketID); } } if (result) { //sent email to responsible user 2017/10/23 if (oldResponsibleUserId != ticketsEntity.ResponsibleUser) { ticketApp.SendEmailToResponsibile(ticketsEntity, UserInfo); } // 更新所有相关人员的WorkingOn状态 ticketApp.UpdateWorkingOnStatus(ticketID, selectState); Redirect(EmptyPopPageUrl, false, true); } else { ShowFailMessageToClient(); } }
public bool Update(FeedBacksEntity entity) { throw new NotImplementedException(); }
public string AddFeedback(int projectID, int ticketID, string content, bool isPublic, bool isWaitClient, bool isWaitSunnetFeedback, string file, string clientsIds, HttpServerUtility Server) { try { ProjectsEntity ProjectEntity = projectApp.Get(projectID); FeedBacksEntity feedbacksEntity = GetFeedbacksEntity(ticketID, content, isPublic, isWaitClient, isWaitSunnetFeedback); TicketsEntity ticket = ticketApp.GetTickets(ticketID); var canAddWaiting = ticketApp.CanFeedbackWaiting(ticketID); if (!canAddWaiting) { feedbacksEntity.WaitPMFeedback = feedbacksEntity.WaitClientFeedback = FeedbackReplyStatus.Normal; } string fileuploadErrMsg = string.Empty; feedbacksEntity.ID = fbAPP.AddFeedBacks(feedbacksEntity); if (feedbacksEntity.ID <= 0) { var msg = fbAPP.BrokenRuleMessages != null && fbAPP.BrokenRuleMessages.Count > 0 ? fbAPP.BrokenRuleMessages[0].Message : ""; return(ResponseMessage.GetResponse(false, msg)); } // 产生气泡提示 if (UserInfo.Role == RolesEnum.CLIENT || isPublic) { ticketApp.CreateNotification(ticketID, UserInfo.UserID, false); } else { ticketApp.CreateNotification(ticketID, UserInfo.UserID); } var extraStatus = new Dictionary <string, bool>(); // 在添加FeedbackMessage时要更新Ticket 对相关人员的状态, 并且不能覆盖状态 if (ticket.Status != TicketsState.Wait_Sunnet_Feedback && ticket.Status != TicketsState.Wait_Client_Feedback && canAddWaiting) { if ((UserInfo.Role == RolesEnum.PM || UserInfo.Role == RolesEnum.Sales) && isWaitClient) { ticketApp.UpdateTicketStatus(ticketID, UserTicketStatus.WaitClientFeedback, UserID); extraStatus.Add("waitSunnet", ticketApp.UpdateTicketStatus(ticketID, UserTicketStatus.WaitClientFeedback, TicketUsersType.Create)); new SendHandler(() => ticketStatusMgr.SendEmailtoClientForFeedBack(feedbacksEntity)) .BeginInvoke(null, null); ProcessOtherClients(clientsIds, ticketID); } else if (UserInfo.Role == RolesEnum.CLIENT) { if (isWaitSunnetFeedback) { ticketApp.UpdateTicketStatus(ticketID, UserTicketStatus.WaitSunnetFeedback, UserID); extraStatus.Add("waitClient", ticketApp.UpdateTicketStatus(ticketID, UserTicketStatus.WaitSunnetFeedback, TicketUsersType.PM)); } new SendHandler(() => ticketStatusMgr.SendEmailtoPMForFeedBack(feedbacksEntity)) .BeginInvoke(null, null); } } else { // 相关状态人员可以通过回复清除自己的状态标识 if ((UserInfo.Role == RolesEnum.PM || UserInfo.Role == RolesEnum.Sales) && ticket.Status == TicketsState.Wait_Sunnet_Feedback && isPublic) { // Sunnet 直接清除PM的标识 if (ticketApp.UpdateTicketStatus(ticketID, UserTicketStatus.Normal, TicketUsersType.PM) && fbAPP.ReplyFeedback(ticketID, true, false)) { ticketApp.UpdateTicketStatus(ticketID, UserTicketStatus.Normal, TicketUsersType.Create, TicketUsersType.Client); ticket.ResponsibleUser = PmReplyClient(ProjectEntity, ticket); extraStatus.Add("clearSunnet", true); var createrId = ticketApp.GetTicketCreateUser(ticketID); var creater = _userApp.GetUser(createrId.UserID); new SendHandler(() => ticketStatusMgr.SendEmailFeedbackReplied(UserInfo, creater, ticketID)) .BeginInvoke(null, null); } } if (UserInfo.Role == RolesEnum.CLIENT && ticket.Status == TicketsState.Wait_Client_Feedback) { // 客户方面只能清除自己的标识,因为可能需要多个客户回复 if (ticketApp.TryClearWaiting(ticketID, UserID, TicketUsersType.Create, TicketUsersType.Client) && fbAPP.ReplyFeedback(ticketID, false, true)) { ticketApp.UpdateTicketStatus(ticketID, UserTicketStatus.Normal, TicketUsersType.PM); extraStatus.Add("clearClient", true); var pmId = ticketApp.GetTicketPM(ticketID); var pm = _userApp.GetUser(pmId.UserID); new SendHandler(() => ticketStatusMgr.SendEmailFeedbackReplied(UserInfo, pm, ticketID)) .BeginInvoke(null, null); ticketApp.DeleteUserFromTicket(ticketID, TicketUsersType.Client); } } } ticket.ModifiedOn = DateTime.Now; if (UserInfo.Role == RolesEnum.CLIENT && isWaitSunnetFeedback) { ChangeResponsUserToProjectManager(ProjectEntity, ticket); } ticketApp.UpdateTickets(ticket, false); #region add file int fileID = 0; string realFileName = ""; string[] files = file.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); Dictionary <string, int> uploadedFiles = new Dictionary <string, int>(); foreach (var f in files) { if ((fileID = InsertFile(f, ProjectEntity.ProjectID, ticketID, feedbacksEntity.IsPublic, feedbacksEntity.ID, Server, out realFileName)) < 1) { fileuploadErrMsg += realFileName + " Upload failed."; } uploadedFiles.Add(realFileName, fileID); } #endregion if (string.IsNullOrEmpty(fileuploadErrMsg)) { ResponseMessage response = new ResponseMessage(); response.Success = true; object attachement = null; object attachementBasicInfo = null; if (uploadedFiles.Count > 0) { attachement = uploadedFiles; string[] imgFormat = ".gif,.jpg,.jpeg,.bmp,.png,.svg,.raw".Split(new char[] { ',' }); attachementBasicInfo = uploadedFiles.Select(it => new { Key = it.Key, Value = imgFormat.Any(format => format == Path.GetExtension(it.Key.ToLower())) ? fileApp.Get(it.Value).FilePath : "/Images/icons/file.png" }).ToDictionary(it => it.Key, it => it.Value); } feedbacksEntity.Description = new HtmlHelper().ReplaceUrl(feedbacksEntity.Description); response.Data = new { content = feedback.FormatHTML(feedbacksEntity.Description, Server).Replace("\n", "<br/>"), id = feedbacksEntity.ID, date = feedbacksEntity.CreatedOn.ToString("MM/dd/yyyy"), time = feedbacksEntity.CreatedOn.ToString("hh:mm tt"), order = feedbacksEntity.Order, createdBy = feedbacksEntity.CreatedBy, firstname = UserInfo.FirstName, lastname = UserInfo.LastName, file = attachement, basicInfo = attachementBasicInfo, extraStatus = extraStatus, tdCss = feedbacksEntity.IsPublic && UserInfo.Role == RolesEnum.PM ? "fdcontentBox3" : "fdcontentBox2" }; return(response.ToString()); } else { return(ResponseMessage.GetResponse(false, fileuploadErrMsg)); } } catch (Exception ex) { WebLogAgent.Write(string.Format("Error Ascx:FeedbackList.ascx Messages:\r\n{0}", ex)); return(ResponseMessage.GetResponse(false, ex.Message)); } }
protected void Page_Load(object sender, EventArgs e) { int tid = QS("tid", 0); int feedbackId = QS("feedbackId", 0); if (tid == 0 && feedbackId == 0) { this.ShowArgumentErrorMessageToClient(); return; } GetProjectIdAndUserIDResponse projectidanduseridResponse = new GetProjectIdAndUserIDResponse(); if (!IsPostBack) { #region role if (feedbackId > 0) //回复 { FeedBacksEntity entity = fbAPP.GetFeedBacksEntity(feedbackId); projectidanduseridResponse = ticketsApp.GetProjectIdAndUserID(entity.TicketID); if (!CheckSecurity(projectidanduseridResponse)) { this.ShowArgumentErrorMessageToClient(); return; } txtTitle.Value = string.Format("Re:{0}", entity.Title); Page.Title = "Reply Note"; bannerTitle.Text = "Reply Note"; trOthers.Visible = false; trOriDesc.Visible = true; trOriFile.Visible = true; trOriDate.Visible = true; lblDate.InnerText = entity.CreatedOn.ToString("MM/dd/yyyy"); txtOriginalContent.Attributes["readonly"] = "readonly"; this.txtOriginalContent.Value = entity.Description; this.lblFiles.InnerHtml = ShowImageList(entity.FeedBackID); hdTicketID.Value = entity.TicketID.ToString(); } else //添加 { hdTicketID.Value = QS("tid"); if (UserInfo.Role == RolesEnum.CLIENT) { if (!string.IsNullOrEmpty(QS("deny"))) { Page.Title = "Add Reason"; bannerTitle.Text = "Add Reason"; txtTitle.Value = "Deny Reason"; } trOthers.Visible = false; } else { trOthers.Visible = true; this.ckIsPublic.Visible = true; this.ckIsPublic.Checked = true; this.chkIsWaitClientFeedback.Visible = true; } projectidanduseridResponse = ticketsApp.GetProjectIdAndUserID(tid); } hdProjectID.Value = projectidanduseridResponse.ProjectId.ToString(); } #endregion }
protected void btnSubmit_Click(object sender, EventArgs e) { //添加ticket的Rating, 和Feedback int star; if (!int.TryParse(hdStar.Value, out star)) { star = 0; } int ticketID = QS("tid", 0); if (ticketID != 0) { TicketsApplication ticketsApplication = new TicketsApplication(); if (ticketsApplication.UpdateTicketStar(ticketID, star)) { //添加Feedback bool isSuccess = UpdateTicketStatusToApprove(ticketID); if (isSuccess) { if (txtFeedback.Text.Trim() != string.Empty) { FeedBacksEntity feedbacksEntity = new FeedBacksEntity(); feedbacksEntity.IsDelete = false; feedbacksEntity.TicketID = ticketID; feedbacksEntity.Title = ""; feedbacksEntity.Description = txtFeedback.Text.NoHTML(); feedbacksEntity.CreatedBy = UserInfo.UserID; feedbacksEntity.CreatedOn = DateTime.Now; feedbacksEntity.ModifiedOn = DateTime.Now; feedbacksEntity.IsPublic = true; feedbacksEntity.WaitClientFeedback = FeedbackReplyStatus.Normal; feedbacksEntity.WaitPMFeedback = FeedbackReplyStatus.Normal; feedbacksEntity.ID = fbAPP.AddFeedBacks(feedbacksEntity); if (feedbacksEntity.ID <= 0) { ShowFailMessageToClient(); return; } ticketStatusMgr.SendEmailtoPMForFeedBack(feedbacksEntity);//状态更新,不进行刷新气泡 //if (ticketAPP.CreateNotification(ticketID,UserInfo.UserID)) //{ // //发邮件给PM // ticketStatusMgr.SendEmailtoPMForFeedBack(feedbacksEntity); //} } string returnurl = Request.QueryString["returnurl"]; if (string.IsNullOrEmpty(returnurl)) { Redirect(Request.RawUrl, false, true); } else { ParentToUrl(returnurl); } } else { ShowFailMessageToClient("Update ticket’s status fail."); } } } else { ShowFailMessageToClient("Update ticket’s status fail."); } }
protected void btnSubmit_Click(object sender, EventArgs e) { //保存状态。 //如果需要估时则保存估时 bool result = true; if (IsETA) { decimal etahours = 0; if (decimal.TryParse(txtBoxExtimationHours.Text, out etahours)) { _ticketEntity.InitialTime = etahours; } } if (!result) { ShowFailMessageToClient(ticketApp.BrokenRuleMessages); return; } var currentState = ddlStatus.SelectedValue.ToEnum <TicketsState>(); _ticketEntity.Status = currentState; _ticketEntity.ModifiedBy = UserInfo.UserID; _ticketEntity.ModifiedOn = DateTime.Now; int oldResponsibleUserId = _ticketEntity.ResponsibleUser; ProjectsEntity projectEntity = projectApp.Get(_ticketEntity.ProjectID); _ticketEntity.ResponsibleUser = int.Parse(ddlResponsibleUser.SelectedValue); result = ticketApp.UpdateTickets(_ticketEntity); if (result) { //sent email to responsible user 2017/10/23 if (oldResponsibleUserId != _ticketEntity.ResponsibleUser) { ticketApp.SendEmailToResponsibile(_ticketEntity, UserInfo); } } if (!result) { ShowFailMessageToClient(ticketApp.BrokenRuleMessages); return; } if (!IsETA && (currentState == TicketsState.Tested_Fail_On_Local || currentState == TicketsState.Tested_Fail_On_Client)) { FilesEntity fileEntity = new FilesEntity(); HttpFileCollection files = Request.Files; string fileuploadErrMsg = string.Empty; for (int i = 0; i < files.Count; i++) { if (files[i].ContentLength > 0 || txtDescription.Text.Trim().Length > 0 && IsValidFile(files[i].FileName)) { FeedBacksEntity feedbacksEntity = GetFeedbacksEntity(); feedbacksEntity.ID = fbAPP.AddFeedBacks(feedbacksEntity); result = feedbacksEntity.ID > 0; if (!result) { ShowFailMessageToClient(fbAPP.BrokenRuleMessages); return; } if (files[i].ContentLength > 0 && IsValidFile(files[i].FileName)) { if (!InsertFile(files[i], _ticketEntity.ProjectID, feedbacksEntity.IsPublic, feedbacksEntity.ID)) { fileuploadErrMsg += files[i].FileName + " Upload failed."; result = false; } } } } if (!result) { ShowFailMessageToClient(fileuploadErrMsg); return; } } if (result) { Redirect(EmptyPopPageUrl, false, true); } else { ShowFailMessageToClient(ticketApp.BrokenRuleMessages); } }
protected void btnSubmit_Click(object sender, EventArgs e) { int ticketID = QS("tid", 0); if (ticketID != 0) { bool isSuccess = UpdateTicketStatusToDeny(ticketID); if (isSuccess) { if (txtDescription.Text.Trim() != "" || (Request.Files.Count > 0 && Request.Files[0].ContentLength > 0)) { FeedBacksEntity feedbacksEntity = new FeedBacksEntity(); feedbacksEntity.IsDelete = false; feedbacksEntity.TicketID = ticketID; feedbacksEntity.Title = ""; feedbacksEntity.Description = txtDescription.Text.Trim().NoHTML(); feedbacksEntity.CreatedBy = UserInfo.UserID; feedbacksEntity.CreatedOn = DateTime.Now; feedbacksEntity.ModifiedOn = DateTime.Now; feedbacksEntity.IsPublic = true; feedbacksEntity.WaitClientFeedback = FeedbackReplyStatus.Normal; feedbacksEntity.WaitPMFeedback = FeedbackReplyStatus.Normal; feedbacksEntity.ID = fbAPP.AddFeedBacks(feedbacksEntity); if (feedbacksEntity.ID <= 0) { ShowFailMessageToClient(); return; } ticketStatusMgr.SendEmailtoPMForFeedBack(feedbacksEntity);//状态更新不进行跟新气泡,by dave 2017/09/22 //if (ticketAPP.CreateNotification(ticketID,UserInfo.UserID)) //{ // //发邮件给PM // ticketStatusMgr.SendEmailtoPMForFeedBack(feedbacksEntity); //} HttpFileCollection files = Request.Files; string fileuploadErrMsg = string.Empty; TicketsEntity ticketsEntity = new TicketsApplication().GetTickets(feedbacksEntity.TicketID); for (int i = 0; i < files.Count; i++) { if (files[i].ContentLength > 0 && IsValidFile(files[i].FileName)) { if (!InsertFile(files[i], ticketsEntity.ProjectID, feedbacksEntity.TicketID, feedbacksEntity.IsPublic, feedbacksEntity.ID)) { fileuploadErrMsg += files[i].FileName + " Upload failed."; } } } if (!string.IsNullOrEmpty(fileuploadErrMsg)) { ShowFailMessageToClient(fileuploadErrMsg); return; } } string returnurl = Request.QueryString["returnurl"]; if (string.IsNullOrEmpty(returnurl)) { Redirect(Request.RawUrl, false, true); } else { ParentToUrl(returnurl); } } else { ShowFailMessageToClient("Update ticket’s status fail."); } } else { ShowFailMessageToClient("Update ticket’s status fail."); } }
protected void btnSave_Click(object sender, EventArgs e) { FeedBacksEntity feedbacksEntity = new FeedBacksEntity(); feedbacksEntity.IsDelete = false; feedbacksEntity.TicketID = int.Parse(hdTicketID.Value); feedbacksEntity.Title = NoHTML(txtTitle.Value); feedbacksEntity.Description = txtContent.Value; feedbacksEntity.CreatedBy = UserInfo.UserID; feedbacksEntity.CreatedOn = DateTime.Now; feedbacksEntity.ModifiedOn = DateTime.Now; //如果是Client则IsPublic为true, 否则就看IsPublic Checkbox是否有选中。 feedbacksEntity.IsPublic = UserInfo.Role == RolesEnum.CLIENT ? true : ckIsPublic.Checked; feedbacksEntity.WaitClientFeedback = chkIsWaitClientFeedback.Checked ? 1 : 0; feedbacksEntity.WaitPMFeedback = 0; if (feedbacksEntity.WaitClientFeedback > 0) { feedbacksEntity.IsPublic = true; } feedbacksEntity.ID = fbAPP.AddFeedBacks(feedbacksEntity); if (feedbacksEntity.ID <= 0) { ShowFailMessageToClient(); return; } if (QS("feedbackId", 0) > 0) //回复 { FeedBacksEntity entity = fbAPP.GetFeedBacksEntity(QS("feedbackId", 0)); if (entity.WaitClientFeedback == 1) //删除通知Client回复的消息,并且将 需要回复的 Feedbacks标记为已回复 { fbmApp.DeleteClientFeedback(feedbacksEntity.CreatedBy, entity.TicketID, entity.FeedBackID); } } if (fbmApp.Add(feedbacksEntity)) //feedbackmessages { if (feedbacksEntity.WaitClientFeedback > 0 || (feedbacksEntity.WaitClientFeedback <= 0 && feedbacksEntity.IsPublic)) //发邮件通知 PM { //发邮件给PM ticketStatusMgr.SendEmailtoPMForFeedBack(feedbacksEntity); } } if (fileUpload.PostedFile.ContentLength > 0) { string FolderName = string.Empty; FolderName = hdProjectID.Value; string filderPath = System.Configuration.ConfigurationManager.AppSettings["FolderPath"]; //~/path string savepath = Server.MapPath(filderPath) + FolderName; string filename = fileUpload.PostedFile.FileName; string fileExtension = Path.GetExtension(filename); if (!Directory.Exists(savepath)) { Directory.CreateDirectory(savepath); } string sNewFileName = string.Format("{0}_{1}{2}", feedbacksEntity.ID, DateTime.Now.ToString("yyMMddssmm"), fileExtension); fileUpload.PostedFile.SaveAs(savepath + @"\" + sNewFileName); FilesEntity fileEntity = new FilesEntity(); fileEntity.ContentType = fileExtension.ToLower(); fileEntity.CreatedBy = UserInfo.UserID; fileEntity.FilePath = filderPath.Substring(2) + FolderName + @"/" + sNewFileName; fileEntity.FileSize = fileUpload.PostedFile.ContentLength; fileEntity.FileTitle = filename.Substring(0, filename.LastIndexOf('.')); fileEntity.IsPublic = true; fileEntity.ProjectId = int.Parse(hdProjectID.Value); fileEntity.TicketId = int.Parse(hdTicketID.Value); fileEntity.CreatedOn = DateTime.Now.Date; fileEntity.FeedbackId = feedbacksEntity.ID; fileEntity.SourceType = (int)FileSourceType.FeedBack; fileEntity.ThumbPath = ""; fileEntity.CompanyID = ticketsApp.GetCompanyIdByTicketId(int.Parse(hdTicketID.Value)); int response = new FileApplication().AddFile(fileEntity); } ShowSuccessMessageToClient(true, true); }