using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Web.Mvc; using System.Xml.Serialization; using DSWeb.SoftMng.BLL; using DSWeb.SoftMng.DBUtility; using DSWeb.SoftMng.Model; using DSWeb.SoftMng.Filter; using DSWeb.Areas.SoftMng.DB; using Newtonsoft.Json; using System.Web; using System.Threading; using System.IO; using DSWeb.Areas.Dispatch.Helper; using System.Configuration; // ReSharper disable once CheckNamespace namespace DSWeb.SoftMng.Controllers { public class CustomerController : Controller { private readonly FeedbackBLL _bll = new FeedbackBLL(); private readonly FeedbackInfoBLL _fbll = new FeedbackInfoBLL(); private DsDataContext dsData = new DsDataContext(); #region View /// /// 首页 /// /// public ActionResult Index(string projectId = "") { Session["FilterCustomerProjectId"] = projectId; if (Session["CODENAME"] == null) Response.Redirect("/login.aspx"); ViewData["CODENAME"] = Session["CODENAME"]; ViewData["SHOWNAME"] = Session["SHOWNAME"]; //查询用户(并安客户名称拼音排序) userBLL ibll = new userBLL(); StringBuilder where = new StringBuilder(); where.Append("ISDELETED = 0 and isdisable=0"); where.Append(" and (select value from user_userattribute where userid=[user].gid and attributeid='D4BF2204-F0AC-4F12-B02C-6520D57BF806')='true'"); //是客服 where.Append(" and (select value from user_userattribute where userid=[user].gid and attributeid='D4BF2204-F0AC-4F12-B02C-6520D57BF800')='false'"); //未停用 where.Append(" order by SHOWNAME collate Chinese_PRC_CS_AS_KS_WS"); var list = ibll.GetModelList(where.ToString()); Dictionary dict = new Dictionary(); foreach (var item in list) dict.Add(item.SHOWNAME, item.SHOWNAME); ViewData["proMasterOption"] = dict; tSysEnumValueBLL tbll = new tSysEnumValueBLL(); StringBuilder where1 = new StringBuilder(); where1.Append("EnumtypeID = 99990 order by EnumValueID"); var list1 = tbll.GetModelList(where1.ToString()); Dictionary dict1 = new Dictionary(); foreach (var item in list1) dict1.Add(item.EnumValueID, item.EnumValueName); ViewData["feedbackTypeOption"] = dict1; var listActOpts = tbll.GetModelList("EnumtypeID = 99991 order by EnumValueID"); Dictionary dicActOpts = new Dictionary(); foreach (var item in listActOpts) dicActOpts.Add(item.EnumValueID, item.EnumValueName); ViewData["actionOption"] = dicActOpts; return View(); } #endregion #region Handler /// /// 懒加载客户信息 /// /// /// /// /// public JsonResult GetInfoClientList(int pageIndex, int pageSize, string query) { info_clientBLL ibll = new info_clientBLL(); StringBuilder where = new StringBuilder(); if (!String.IsNullOrEmpty(query)) where.Append(string.Format("CODENAME LIKE '%{0}%' OR SHORTNAME LIKE '%{0}%' OR DESCRIPTION LIKE '%{0}%'", query)); var list = ibll.GetModelList(pageIndex, pageSize, where.ToString(), "SHORTNAME collate Chinese_PRC_CS_AS_KS_WS"); var total = ibll.GetRecordCount(where.ToString()); var result = from p in list select new { id = "{Key:'" + p.GID + "', Value:'" + p.SHORTNAME + "'}", text = p.SHORTNAME }; return Json(new { data = result, total }, JsonRequestBehavior.AllowGet); } public JsonResult GetInfoClientListEasy(int pageIndex, int pageSize, string query) { info_clientBLL ibll = new info_clientBLL(); StringBuilder where = new StringBuilder(); if (!String.IsNullOrEmpty(query)) where.Append(string.Format("CODENAME LIKE '%{0}%' OR SHORTNAME LIKE '%{0}%' OR DESCRIPTION LIKE '%{0}%'", query)); var list = ibll.GetModelList(pageIndex, pageSize, where.ToString(), "SHORTNAME collate Chinese_PRC_CS_AS_KS_WS"); var total = ibll.GetRecordCount(where.ToString()); var result = from p in list select new { id = p.SHORTNAME, text = p.SHORTNAME }; return Json(new { data = result, total }, JsonRequestBehavior.AllowGet); } /// /// 懒加载项目信息 /// /// /// /// /// public JsonResult GetInfoProjectList(int pageIndex, int pageSize, string query) { op_softprojectBLL ibll = new op_softprojectBLL(); StringBuilder where = new StringBuilder(); if (!String.IsNullOrEmpty(query)) where.Append(string.Format("BSNO LIKE '%{0}%' OR PROJECTNAME LIKE '%{0}%'", query)); var list = ibll.GetModelList(pageIndex, pageSize, where.ToString(), "PROJECTNAME collate Chinese_PRC_CS_AS_KS_WS"); var total = ibll.GetRecordCount(where.ToString()); var result = from p in list select new { id = "{Key:'" + p.GID + "', Value:'" + p.PROJECTNAME + "'}", text = p.PROJECTNAME }; return Json(new { data = result, total }, JsonRequestBehavior.AllowGet); } /// /// 主列表 /// /// 开始索引 /// 分页大小 /// 搜索框的值 /// 排序字段 /// 排序方式 /// 处理情况 /// 当前角色 /// 反馈编号 /// 客户 /// 项目编号 /// 处理客服 /// 问题描述 /// [SqlKeyWordsFilter(Type = "Action")]//sql 防注入过滤器 public JsonResult GetList(int startIndex, int limit, string search, string sortName, string sortOrder, string status, string character, string feedbackId, string companyId, string project, string proMaster, string question) { if (Session["FilterCustomerProjectId"] != null && !string.IsNullOrWhiteSpace(Session["FilterCustomerProjectId"].ToString())) { project = Session["FilterCustomerProjectId"].ToString(); } StringBuilder where = new StringBuilder(); where.Append("isDelete = 0"); if (!(String.IsNullOrEmpty(search) || String.IsNullOrWhiteSpace(search))) where.Append(" And (question like '%" + search + "%' Or companyID like '{%Value:''%" + search + "%''}' Or createUser like '%" + search + "%')");//客户要正则匹配 if (!String.IsNullOrEmpty(character)) where.Append(string.Format(" And proMaster = '{0}'", character)); //高级查询 if (!(String.IsNullOrEmpty(companyId) || String.IsNullOrWhiteSpace(companyId))) where.Append(" And companyID like '{%Value:''%" + companyId + "%''}'");//正则匹配 if (!(String.IsNullOrEmpty(feedbackId) || String.IsNullOrWhiteSpace(feedbackId))) where.Append(string.Format(" And feedbackID like '%{0}%'", feedbackId)); if (!(String.IsNullOrEmpty(project) || String.IsNullOrWhiteSpace(project))) where.Append(string.Format(" And project like '%{0}%'", project)); if (!(String.IsNullOrEmpty(proMaster) || String.IsNullOrWhiteSpace(proMaster))) where.Append(string.Format(" And proMaster like '%{0}%'", proMaster)); if (!(String.IsNullOrEmpty(question) || String.IsNullOrWhiteSpace(question))) where.Append(string.Format(" And question like '%{0}%'", question)); if (!String.IsNullOrEmpty(Request["beginDate_1"])) where.Append(string.Format(" And beginDate >= '{0}'", Request["beginDate_1"] + " 00:00")); if (!String.IsNullOrEmpty(Request["beginDate_2"])) where.Append(string.Format(" And beginDate <= '{0}'", Request["beginDate_2"] + " 23:59")); //单独查询 各类别数量 Dictionary dict = new Dictionary(); string[] arr = { "", "-1", "0", "1", "2", "3" }; for (int i = 0; i < arr.Length; i++) dict.Add(i.ToString(), _bll.GetRecordCount(where + (arr[i] == "" ? "" : string.Format(" And status = {0}", arr[i])))); if (!String.IsNullOrEmpty(status)) where.Append(string.Format(" And status = {0}", status)); var list = _bll.GetModelList(startIndex, limit, where.ToString(), String.Format("{0} {1}", sortName, sortOrder)); var count = _bll.GetRecordCount(where.ToString());//总数 return Json(new { total = count, groupTotal = dict, rows = list }); } /// /// 详细列表 /// /// public JsonResult GetDetailList(string parentId, string search) { StringBuilder where = new StringBuilder(); where.Append(string.Format("isDelete = 0 And feedbackID='{0}'", parentId)); if (!(String.IsNullOrEmpty(search) || String.IsNullOrWhiteSpace(search))) where.Append(string.Format(" And (replyMsg like '%{0}%' Or replyUser like '%{0}%')", search)); var list = _fbll.GetModelList(where.ToString()); return Json(new { total = list.Count, rows = list }); } /// /// 保存主实例 /// /// /// public JsonResult Save(Model.Feedback model) { bool result; var nowDate = DateTime.Now; var compObj = JsonConvert.DeserializeAnonymousType(model.companyID, new { Key = "", Value = "" }); if (model.id == 0) { int num = _bll.GetRecordCount("") + 1; //编号 model.feedbackID = "WH" + nowDate.ToString("yy") + num.ToString().PadLeft(6, '0'); model.createUser = Session["SHOWNAME"].ToString(); model.createDate = nowDate; model.modifyUser = Session["SHOWNAME"].ToString(); model.modifyDate = nowDate; model.isDelete = false; if (model.status==null) model.status = 0; model.COMPANY_NAME = compObj.Value; result = _bll.Add(model) > 0; } //新增 else { //获取原数据 var oldModel = _bll.GetModel(model.id); //类反射 Type type = typeof(Model.Feedback); PropertyInfo[] piArr = type.GetProperties(); foreach (var pi in piArr) { if (Array.IndexOf(Request.Params.AllKeys, pi.Name) < 0) pi.SetValue(model, pi.GetValue(oldModel, null), null); } model.modifyUser = Session["SHOWNAME"].ToString(); model.modifyDate = nowDate; model.COMPANY_NAME = compObj.Value; if (model.status == -1) //待接入的变为处理中 { model.status = 0; } result = _bll.Update(model) > 0; } //修改 //反写网站用户的客户简称 var wsUser = dsData.WebsiteUsers.FirstOrDefault(u => u.MOBILE == model.CUST_MOBILE); if (wsUser != null && string.IsNullOrEmpty(wsUser.CUST_JSON)) { wsUser.CUST_JSON = model.companyID; wsUser.CUST_NAME = JsonConvert.DeserializeAnonymousType(wsUser.CUST_JSON, new { Key = "", Value = "" }).Value; dsData.SaveChanges(); } //处理消息 if (dsData.FeedbackMessages.Count(f => f.Type == FeedbackMessage.FeedbackMessageTypeProcess && f.FeedbackId == model.feedbackID) == 0) { tSysEnumValueBLL tbll = new tSysEnumValueBLL(); var listTypes = tbll.GetModelList("EnumtypeID = 99990"); tSysEnumValue tp = null; if (model.feedbackType.HasValue) { string strType = model.feedbackType.Value.ToString(); tp = listTypes.FirstOrDefault(t => t.EnumValueID == strType); } FeedbackMessage feedbackMessage = new FeedbackMessage() { Type = FeedbackMessage.FeedbackMessageTypeProcess, Title = "售后工程师:尊敬的用户您好,根据您的反馈,我们将问题类型定义如下:", Body = $"问题类型:{(tp == null ? "" : tp.EnumValueName)}\r\n接下来,我们将对上述问题进行分析排查,请客户耐心等待,如下为处理过程:\r\n{model.PROCESS_RESULT}", CreateTime = DateTime.Now, FeedbackId = model.feedbackID }; if (wsUser != null && !string.IsNullOrEmpty(wsUser.OPENID2)) { List> valList = new List>(); valList.Add(new Tuple("first", "您的工单有最新进展:", "#FF0000")); valList.Add(new Tuple("keyword1", model.feedbackID, "")); valList.Add(new Tuple("keyword2", GetFeedbackQuestionType(model.feedbackType), "")); valList.Add(new Tuple("keyword3", GetFeedbackStatus(model.status.Value), "")); valList.Add(new Tuple("keyword4", model.proMaster, "")); valList.Add(new Tuple("remark", "详情请登录网站查看", "")); string mess = string.Empty; bool succ = false; succ = TemplateMessageHelper.SendTemplateMessage(ConfigurationManager.AppSettings["DSServiceAppId"], "6vXDozXvYveyuRKwr16mH-4atzCWHhYaV2yDPMUaRpE", valList, wsUser.OPENID2, "", out mess); } dsData.FeedbackMessages.Add(feedbackMessage); dsData.SaveChanges(); } return Json(new { success = result, message = result ? "操作成功" : "操作失败" }); } /// /// 保存从实例 /// /// /// public JsonResult SaveDetail(Model.FeedbackInfo model) { bool result; var nowDate = DateTime.Now; if (model.id == 0) { model.replyUser = Session["SHOWNAME"].ToString(); model.replyUserID = Session["CODENAME"].ToString(); model.replyDate = nowDate; model.isDelete = false; result = _fbll.Add(model) > 0; } //新增 else { //获取原数据 var oldModel = _fbll.GetModel(model.id); //类反射 Type type = typeof(Model.FeedbackInfo); PropertyInfo[] piArr = type.GetProperties(); foreach (var pi in piArr) { if (Array.IndexOf(Request.Params.AllKeys, pi.Name) < 0) pi.SetValue(model, pi.GetValue(oldModel, null), null); } model.replyUser = Session["SHOWNAME"].ToString(); model.replyUserID = Session["CODENAME"].ToString(); model.replyDate = nowDate; result = _fbll.Update(model) > 0; } //修改 return Json(new { success = result, message = result ? "操作成功" : "操作失败" }); } /// /// 删除主表(isDelete = 1) /// /// /// public JsonResult Delete(string ids) { StringBuilder strSql = new StringBuilder(); strSql.Append(string.Format("Update Feedback Set isDelete = 1 Where id in({0})", ids)); bool result = DbHelperSQL.ExecuteSql(strSql.ToString()) > 0; return Json(new { success = result, message = result ? "操作成功" : "操作失败" }); } /// /// 删除子表(isDelete = 1) /// /// /// public JsonResult DeleteDetail(string ids) { StringBuilder strSql = new StringBuilder(); strSql.Append(string.Format("Update FeedbackInfo Set isDelete = 1 Where id in({0})", ids)); bool result = DbHelperSQL.ExecuteSql(strSql.ToString()) > 0; return Json(new { success = result, message = result ? "操作成功" : "操作失败" }); } /// /// 根据客户gid获取关联信息 /// /// 客户gid /// public JsonResult GetInfoClient(string gid) { StringBuilder where = new StringBuilder(); where.Append(string.Format("LINKGID='{0}'", gid)); user_baseinfo dirModel = new user_baseinfo(); info_clientBLL ibll = new info_clientBLL(); var obj = ibll.GetModel(gid); string dirMaster = obj == null ? "" : obj.DOC;//直属客服 if (!String.IsNullOrEmpty(dirMaster)) { StringBuilder where1 = new StringBuilder(); where1.Append(string.Format("SHOWNAME='{0}'", dirMaster)); userBLL ubll = new userBLL(); user_baseinfoBLL ubbll = new user_baseinfoBLL(); var umodel = ubll.GetModelList(where1.ToString()).FirstOrDefault(); if (umodel != null) { StringBuilder where2 = new StringBuilder(); where2.Append(string.Format("USERID='{0}'", umodel.GID)); dirModel = ubbll.GetModelList(where2.ToString()).FirstOrDefault() ?? new user_baseinfo();//客服信息 } dirModel.USERID = dirMaster; } return Json(new { actionType = obj == null ? "无匹配项" : obj.STLNAME, dirModel, proModel = dirModel }); } /// /// 根据前端客户选择验收 /// /// 反馈ID /// public JsonResult Checked(string sFeedBackID) { StringBuilder strSql = new StringBuilder(); strSql.Append(string.Format("update feedback set status = '3' where feedbackid ='" + sFeedBackID + "'")); bool result = DbHelperSQL.ExecuteSql(strSql.ToString()) > 0; var feedback = dsData.Feedbacks.AsNoTracking().FirstOrDefault(f => f.feedbackID == sFeedBackID); tSysEnumValueBLL tbll = new tSysEnumValueBLL(); var listTypes = tbll.GetModelList("EnumtypeID = 99990"); tSysEnumValue tp = null; if (feedback.feedbackType.HasValue) { string strType = feedback.feedbackType.Value.ToString(); tp = listTypes.FirstOrDefault(t => t.EnumValueID == strType); } FeedbackMessage feedbackMessage = new FeedbackMessage() { Type = FeedbackMessage.FeedbackMessageTypeFinish, Title = $"售后工程师:尊敬的用户您好,上述问题“{(tp == null ? "" : tp.EnumValueName)}”已为您处理完成,请核实。", Body = "", CreateTime = DateTime.Now, FeedbackId = feedback.feedbackID }; dsData.FeedbackMessages.Add(feedbackMessage); dsData.SaveChanges(); WS_USER wsUser = dsData.WebsiteUsers.FirstOrDefault(u => u.MOBILE == feedback.CUST_MOBILE); if (wsUser != null && !string.IsNullOrEmpty(wsUser.OPENID2)) { List> valList = new List>(); valList.Add(new Tuple("first", "您的工单有最新进展:", "#FF0000")); valList.Add(new Tuple("keyword1", feedback.feedbackID, "")); valList.Add(new Tuple("keyword2", GetFeedbackQuestionType(feedback.feedbackType), "")); valList.Add(new Tuple("keyword3", GetFeedbackStatus(feedback.status.Value), "")); valList.Add(new Tuple("keyword4", feedback.proMaster, "")); valList.Add(new Tuple("remark", "详情请登录网站查看", "")); string mess = string.Empty; bool succ = false; succ = TemplateMessageHelper.SendTemplateMessage(ConfigurationManager.AppSettings["DSServiceAppId"], "6vXDozXvYveyuRKwr16mH-4atzCWHhYaV2yDPMUaRpE", valList, wsUser.OPENID2, "", out mess); } return Json(new { success = result, message = result ? "验收成功" : "验收失败" }); } /// /// 工单接入 /// /// 反馈ID /// public JsonResult Accept(string sFeedBackID) { //StringBuilder strSql = new StringBuilder(); //strSql.Append(string.Format("update feedback set status = '0',ACCEPT_TIME=getdate() where feedbackid ='" + sFeedBackID + "'")); //bool result = DbHelperSQL.ExecuteSql(strSql.ToString()) > 0; var feedback = dsData.Feedbacks.FirstOrDefault(f => f.feedbackID == sFeedBackID); feedback.status = 0; FeedbackMessage feedbackMessage = new FeedbackMessage() { Type = FeedbackMessage.FeedbackMessageTypeAccept, Title = "售后工程师:您好,我们已经收到您提交的问题,正在为您查看,请稍等", Body = "", CreateTime = DateTime.Now, FeedbackId = sFeedBackID }; dsData.FeedbackMessages.Add(feedbackMessage); dsData.SaveChanges(); WS_USER wsUser = dsData.WebsiteUsers.FirstOrDefault(u => u.MOBILE == feedback.CUST_MOBILE); if (wsUser != null && !string.IsNullOrEmpty(wsUser.OPENID2)) { List> valList = new List>(); valList.Add(new Tuple("first", "您的工单有最新进展:", "#FF0000")); valList.Add(new Tuple("keyword1", feedback.feedbackID, "")); valList.Add(new Tuple("keyword2", GetFeedbackQuestionType(feedback.feedbackType), "")); valList.Add(new Tuple("keyword3", GetFeedbackStatus(feedback.status.Value), "")); valList.Add(new Tuple("keyword4", feedback.proMaster, "")); valList.Add(new Tuple("remark", "详情请登录网站查看", "")); string mess = string.Empty; bool succ = false; succ = TemplateMessageHelper.SendTemplateMessage(ConfigurationManager.AppSettings["DSServiceAppId"], "6vXDozXvYveyuRKwr16mH-4atzCWHhYaV2yDPMUaRpE", valList, wsUser.OPENID2, "", out mess); } return Json(new { success = true, message = "接入成功" }); } private string GetFeedbackStatus(int status) { switch (status) { case -1: return "待接入"; case 0: return "处理中"; case 1: return "待验收"; case 2: return "客户取消"; case 3: return "已验收"; } return ""; } private string GetFeedbackQuestionType(int? type) { if (!type.HasValue) { return ""; } tSysEnumValueBLL tbll = new tSysEnumValueBLL(); var list = tbll.GetModelList($"EnumtypeID = 99990 and enumvalueid={type.Value}"); if (list.Count > 0) { return list[0].EnumValueName; } return ""; } #endregion #region 追加问题 [HttpPost] public ActionResult GetFeedbackSubList(string feedbackId) { var list = dsData.FeedbackSubs.Where(s => s.feedbackID == feedbackId).ToList(); return Json(list); } [HttpPost] public ActionResult SaveFeedbackSub(FeedbackSubSaveModel model) { FeedbackSub feedbackSub = new FeedbackSub() { feedbackID = model.feedbackID, description = model.description, attachMent = model.attachMent, createDate = DateTime.Now }; dsData.FeedbackSubs.Add(feedbackSub); dsData.SaveChanges(); return Json(new { success = true, message = "保存成功" }); } #endregion #region 网站用户绑定公司 [HttpGet] public ActionResult WSUserList() { return View(); } [HttpPost] public ActionResult WSUserData(string keyword, int offset, int limit) { var query = dsData.WebsiteUsers.AsNoTracking().Where(u => true); if (!string.IsNullOrWhiteSpace(keyword)) { query = query.Where(u => u.NAME.IndexOf(keyword) > -1 || u.COMPANY_NAME.IndexOf(keyword) > -1); } int count = query.Count(); var list = query.OrderByDescending(u => u.CREATE_TIME).Skip(offset).Take(limit).ToList(); return Json(new { Total = count, Data = list }); } [HttpPost] public ActionResult BindCompany(string uid, string cid) { var user = dsData.WebsiteUsers.FirstOrDefault(u => u.GID == uid); var infoClient = dsData.InfoClients.FirstOrDefault(c => c.GID == cid); user.CUST_JSON = JsonConvert.SerializeObject(new { Key = infoClient.GID, Value = infoClient.SHORTNAME }); user.CUST_NAME = infoClient.SHORTNAME; dsData.SaveChanges(); return Json(new { Success = true, Message = "操作成功" }); } [HttpGet] public ActionResult GetBindCompanyList(string keyword) { var query = dsData.InfoClients.AsNoTracking().Where(c => true); if (!string.IsNullOrWhiteSpace(keyword)) { query = query.Where(c => c.CODENAME.IndexOf(keyword) > -1 || c.SHORTNAME.IndexOf(keyword) > -1); } var list = query.ToList().Select(c => new { c.GID, c.CODENAME, c.SHORTNAME }); return Json(new { value = list }, JsonRequestBehavior.AllowGet); } #endregion } }