using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using PMS.BusinessModels.Problem; using QWPlatform.IService; using QWPlatform.SystemLibrary; using QWPlatform.SystemLibrary.LogManager; using PMS.EntityModels.Product; using PMS.BusinessModels.Account; using QWPlatform.DataIntface; using PMS.BusinessModels.MobileProblem; using System.Configuration; using PMS.Plugins.Common; namespace PMS.DBService.Problems { /// /// 查询问题的数据服务 /// public class QueryDBService : DataServiceBase { public static string IsMainMontrol = ConfigurationManager.AppSettings["IsMainMontrol"].ToStringEx();// 是否启用维保控制1启用 0停用 #region 问题记录查询 /// /// 综合查询并返回结果 /// /// 查询模型 /// public DataTable Query(QueryModel queryModel, out int total) { //是否跨渠道查询 var iscoll = 0; var number = this.SqlBuilder.SqlText(@"SELECT count(1) FROM 人员信息,渠道人员共享 WHERE 人员信息.ID =:人员ID AND 人员信息.渠道id = 渠道人员共享.共享渠道ID") .Parameters("人员ID", queryModel.currentUserID).Select(); if(number>0) { iscoll = 1; } total = 0; var sql = ""; if (String.IsNullOrEmpty(queryModel.text)) { sql = @"select ID,编号, 解决版本, 是否终止, 是否验证, 是否解决, 是否回退, 紧急代码, 是否受理, 问题性质, 问题类型, 问题标题, 解决版本状态,紧急补丁时间, 解决版本ID, (select count(1) from 产品问题版本 jj where jj.问题id=t.id) as 是否加入版本, 研发处理人ID,测试处理人ID,研发处理人, 测试处理人, (select 联系电话 from 人员信息 where id=t.登记人ID) as 联系电话, (select 名称||'['||编码||']' from 问题分值管理 where id=t.技术支持分类ID) as 技术支持分类, (select 编号 from 问题记录 where id=t.关联id and 是否删除=0 and 是否终止=0 and 是否回退=0) as 关联编号, (select 关联数量 from 问题记录 where id=t.id and 是否删除 = 0 and 是否终止 = 0 and 是否回退 = 0) as 关联数量, 0 as 重复次数, ( SELECT MAX(x.服务结束时间) 服务结束时间 FROM ZLDMS.项目维保记录 x,zldms.项目产品模块 c WHERE c.项目ID=x.项目ID AND x.项目产品模块ID=c.id AND c.项目ID= t.项目ID and c.产品ID=t.产品ID)服务结束时间, --(select count(1) from 问题记录 where 重复问题ID=t.重复问题id and 是否删除=0 and 是否终止=0 and 是否回退=0) as 重复次数, (select 最后提交人 from (select 姓名 as 最后提交人, 问题id from ( select r.姓名, g.问题id from 问题记录过程 g, 人员信息 r,系统账户 zh,系统角色关系 js where g.状态 = 5 and g.当前流程id in (4, 9, 14, 20, 23) and r.id = g.记录人id and r.id=zh.人员id and zh.id=js.账户id and js.角色id in (5,6,11) order by 记录时间 desc ) ) where 问题id =t.id and rownum = 1) as 最后提交人,"; if (queryModel.type == 0) { sql += "问题描述,"; } if (IsMainMontrol == "1")//是否开启脱保参数管理 { sql += "( SELECT x.应用状态 FROM ZLDMS.项目产品模块 x WHERE x.项目ID= t.项目ID and x.产品ID=t.产品ID ) as 应用状态,"; } else//不管控 { sql += " 1 as 应用状态,"; } //技术支持导出excel时增加【项目最后提交时间】和【技术支持最后受理时间】 if (queryModel.type == 3) { sql += @" (select 记录时间 from ( select 问题id,记录时间 from (select row_number() over(partition by g.问题id order by g.记录时间 desc) s,g.问题id,g.记录时间 from 问题记录过程 g , 人员信息 x where g.记录人id = x.id and x.职务 = 12 and g.状态 = 8) t where t.s=1) js where js.问题id=t.id) as 技术支持最后受理时间, (select 记录时间 from ( select 问题id,记录时间 from (select row_number() over(partition by g.问题id order by g.记录时间 desc) s,g.问题id,g.记录时间 from 问题记录过程 g , 人员信息 x where g.记录人id = x.id and x.职务 != 10 and x.职务 != 11 and x.职务 != 12 and x.职务 != 113 and g.状态 = 5) t where t.s=1) js where js.问题id=t.id) as 项目最后提交时间,"; } sql += @"(select 名称 from 渠道信息 where id = t.渠道id) as 渠道, (select 名称 from 项目信息 where id = t.项目ID) as 项目, (select 名称 from 站点信息 where id = t.机构id) as 机构, (select 名称 from 产品系统配置 where id = t.产品id) as 产品, (select 名称 from 产品模块功能 where id = t.模块id) as 模块, 产品id, 版本号, (select 显示名 from 基础编码 where 分类id = '2DDA172A-499A-40CC-BA6A-29AB0FAEEDCB' and 代码= t.来源代码) as 来源, 登记人, 反馈人, 登记日期, 紧急描述, 要求时间, (select 名称 from 问题流程环节 where id = t.环节id ) as 当前环节, 环节ID, 受理人, 受理人ID, 受理时间, 指派人, 指派时间, (case 是否解决 when 1 then (select ROUND(max(记录时间)-t.登记日期,2)*24 from 问题记录过程 c where t.Id =c.问题id ) when 0 then (select ROUND(sysdate - t.登记日期,2)*24 from dual) end ) as 总耗时, (case when t.是否解决=0 and t.是否终止=0 Then (select ROUND(sysdate-max(ss.记录时间),2)*24 from 问题记录过程 ss where ss.问题ID=t.ID) Else 0 end ) as 滞留时间, (select count(1) from 产品问题附件 where 问题ID = t.Id) as 附件数量, (select 姓名 from 人员信息 where ID=t.验证人ID) as 验证人姓名, (select 名称 from 问题分值管理 where ID=t.分类ID) as 问题分类 from 问题记录 t where t.是否删除=0 "; } else { sql = "select "; Array arry = queryModel.text.Split(','); foreach (string item in arry) { switch (item) { case "编号": sql += "编号,"; break; case "是否终止": sql += "是否终止,"; break; case "是否验证": sql += "是否验证,"; break; case "是否解决": sql += "是否解决,"; break; case "是否回退": sql += "是否回退,"; break; case "紧急代码": sql += "紧急代码,"; break; case "是否受理": sql += "是否受理,"; break; case "问题性质": sql += "问题性质,"; break; case "问题类型": sql += "问题类型,"; break; case "问题标题": sql += "问题标题,"; break; case "问题描述": sql += "问题描述,"; break; case "渠道": sql += "(select 名称 from 渠道信息 where id = t.渠道id) as 渠道,"; break; case "项目": sql += "(select 名称 from 项目信息 where id = t.项目ID) as 项目,"; break; case "机构": sql += "(select 名称 from 站点信息 where id = t.机构id) as 机构,"; break; case "产品": sql += "(select 名称 from 产品系统配置 where id = t.产品id) as 产品,"; break; case "模块": sql += "(select 名称 from 产品模块功能 where id = t.模块id) as 模块,"; break; case "版本号": sql += "版本号,"; break; case "来源": sql += "(select 显示名 from 基础编码 where 分类id = '2DDA172A-499A-40CC-BA6A-29AB0FAEEDCB' and 代码= t.来源代码) as 来源,"; break; case "登记人": sql += "登记人,"; break; case "反馈人": sql += "反馈人,"; break; case "登记日期": sql += "登记日期,"; break; case "紧急描述": sql += "紧急描述,"; break; case "要求时间": sql += "要求时间,"; break; case "当前环节": sql += "(select 名称 from 问题流程环节 where id = t.环节id ) as 当前环节,"; break; case "环节ID": sql += "环节ID,"; break; case "受理人": sql += "受理人,"; break; case "受理人ID": sql += "受理人ID,"; break; case "受理时间": sql += "受理时间,"; break; case "指派人": sql += "指派人,"; break; case "指派时间": sql += "指派时间,"; break; case "总耗时": sql += @"(case 是否解决 when 1 then (select ROUND(max(记录时间)-t.登记日期,2)*24 from 问题记录过程 c where t.Id =c.问题id ) when 0 then(select ROUND(sysdate - t.登记日期, 2) * 24 from dual) end ) as 总耗时,"; break; case "滞留时间": sql += @"(case when t.是否解决=0 and t.是否终止=0 Then (select ROUND(sysdate-max(ss.记录时间),2)*24 from 问题记录过程 ss where ss.问题ID=t.ID) Else 0 end ) as 滞留时间,"; break; case "附件数量": sql += "(select count(1) from 产品问题附件 where 问题ID = t.Id) as 附件数量,"; break; case "验证人姓名": sql += "(select 姓名 from 人员信息 where ID=t.验证人ID) as 验证人姓名,"; break; case "问题分类": sql += "(select 名称 from 问题分值管理 where ID=t.分类ID) as 问题分类,"; break; case "解决方案": sql += "解决方案,"; break; case "解决版本": sql += "解决版本,"; break; } } sql = sql.Substring(0, sql.Length - 1) + " from 问题记录 t where t.是否删除 = 0 "; } var sqlbuilder = this.SqlBuilder; //若没有勾选包含查询条件 if (!queryModel.IncludeSearchContent) { if (!string.IsNullOrEmpty(queryModel.queryText)) { var numberCode = 0; if (int.TryParse(queryModel.queryText.Trim(), out numberCode)) {//按编号查询 sql += " And (t.编号 = :编号)"; sqlbuilder.Parameters("编号", numberCode); } else {//按标题查询 sql += " And (t.问题标题 like '%'||:查询关键字||'%' or t.问题描述 like '%'||:查询关键字||'%' or t.解决方案 like'%'||:查询关键字||'%' or t.回退说明 like'%'||:查询关键字||'% ' or t.终止说明 like'%'||:查询关键字||'%' )"; sqlbuilder.Parameters("查询关键字", queryModel.queryText.Trim()); } } } //直接根据快速查询条件查询(其他不包含条件) else { if (!string.IsNullOrEmpty(queryModel.queryText)) { var numberCode = 0; if (int.TryParse(queryModel.queryText.Trim(), out numberCode)) {//按编号查询 sql += " And (t.编号 = :编号)"; sqlbuilder.Parameters("编号", numberCode); } else {//按标题查询 sql += " And (t.问题标题 like '%'||:查询关键字||'%' or t.问题描述 like '%'||:查询关键字||'%' or t.解决方案 like'%'||:查询关键字||'%' or t.回退说明 like'%'||:查询关键字||'% ' or t.终止说明 like'%'||:查询关键字||'%' )"; sqlbuilder.Parameters("查询关键字", queryModel.queryText.Trim()); } } if (!string.IsNullOrEmpty(queryModel.companyId)) {//渠道ID sql += " And t.渠道ID =:渠道ID"; sqlbuilder.Parameters("渠道ID", queryModel.companyId); } if (!string.IsNullOrEmpty(queryModel.projectId)) {//项目ID sql += " And t.项目ID =:项目ID"; sqlbuilder.Parameters("项目ID", queryModel.projectId); } if (!string.IsNullOrEmpty(queryModel.orgId)) {//机构ID sql += " And t.机构ID =:机构ID"; sqlbuilder.Parameters("机构ID", queryModel.orgId); } if (!string.IsNullOrEmpty(queryModel.productId) || !string.IsNullOrEmpty(queryModel.productModuleId)) { sql += " And ( "; //产品ID不为空,则需要根据产品来过滤 if (!string.IsNullOrEmpty(queryModel.productId)) { sql += " 产品ID in (Select Column_Value From Table(f_Split_String(:产品ID, ','))) or"; sqlbuilder.Parameters("产品ID", queryModel.productId); } if (!string.IsNullOrEmpty(queryModel.productModuleId)) {//模块ID不为空 sql += " 模块ID in (Select Column_Value From Table(f_Split_String(:模块ID, ','))) "; sqlbuilder.Parameters("模块ID", queryModel.productModuleId); } else { sql = sql.Substring(0, sql.Length - 2); } sql += " )"; } if (queryModel.property > 0) {//问题性质 sql += " And t.问题性质 =:问题性质"; sqlbuilder.Parameters("问题性质", queryModel.property); } if (queryModel.priority > 0) {//紧急程度 sql += " And t.紧急代码 =:紧急代码"; sqlbuilder.Parameters("紧急代码", queryModel.priority); } if (!string.IsNullOrEmpty(queryModel.workflowNode)) {//环节ID sql += " And t.环节ID in (Select Column_Value From Table(f_Split_String(:环节ID, ',')))"; sqlbuilder.Parameters("环节ID", queryModel.workflowNode); //2024-02-04 调整维保过期,项目可以看,技术和产品不允许显示 if(IsMainMontrol=="1") { if (queryModel.workflowNode == "4"|| queryModel.workflowNode == "5")//技术和产品 { sql += " And exists (select 1 from 项目产品模块 p where p.项目ID = t.项目ID and t.产品ID= p.产品ID And p.应用状态=1)"; } } } if (!string.IsNullOrEmpty(queryModel.DealPerson)) {//问题处理人 sql += " And t.受理人 like '%' || :受理人 || '%' "; sqlbuilder.Parameters("受理人", queryModel.DealPerson); } if (!string.IsNullOrEmpty(queryModel.RegistPerson)) {//问题登记人 sql += " And t.登记人 like '%' || :登记人 || '%' "; sqlbuilder.Parameters("登记人", queryModel.RegistPerson); } if (!string.IsNullOrEmpty(queryModel.DistributePerson)) {//问题指派人 sql += " And t.指派人 like '%' || :指派人 || '%' "; sqlbuilder.Parameters("指派人", queryModel.DistributePerson); } if (!string.IsNullOrEmpty(queryModel.myProblemCombox) || queryModel.myProblem) { sql += " And ("; //与我相关 if (queryModel.myProblem) { sql += " (t.受理人ID =:用户ID or t.指派人ID = :用户ID ) or"; } //我登记/指派/提交的问题,【,】分割 if (!string.IsNullOrEmpty(queryModel.myProblemCombox)) { sql += @" (t.ID in (select distinct(s.问题id) from 问题记录过程 s where s.记录人ID=:用户ID and s.状态 in (Select Column_Value From Table(f_Split_String(:myProblemCombox, ',')))))"; } else { sql = sql.Substring(0, sql.Length - 2); } sql += " )"; sqlbuilder.Parameters("用户ID", queryModel.currentUserID); sqlbuilder.Parameters("myProblemCombox", queryModel.myProblemCombox); } if (queryModel.isend) { sql += " And t.是否解决 = 1"; } else if (!queryModel.showCloseProblem && queryModel.zzstartDate == DateTime.MinValue && queryModel.zzendDate == DateTime.MinValue) { //只看终止问题 if (queryModel.showTerminIssues) { sql += " And t.是否终止 = 1"; } else { //不需要显示已解决与已关闭的问题(只显示正常处理的问题) sql += " And t.是否终止 = 0 And t.是否解决 = 0"; } } if (queryModel.startDate != DateTime.MinValue) { sql += " And t.登记日期 >=:开始日期"; sqlbuilder.Parameters("开始日期", queryModel.startDate); } //登记结束日期 if (queryModel.endDate != DateTime.MinValue) { queryModel.endDate = queryModel.endDate.AddDays(1); sql += " And t.登记日期 <=:结束日期"; sqlbuilder.Parameters("结束日期", queryModel.endDate); } //解决/终止开始日期 if (queryModel.zzstartDate != DateTime.MinValue) { sql += " And (t.终止日期 >=:开始日期 or (select to_date(to_char(记录时间,'yyyy-mm-dd'),'yyyy-mm-dd') 记录时间 from 问题记录过程 where 问题ID=t.id and 状态=7 and rownum=1 ) >=:开始日期 )"; sqlbuilder.Parameters("开始日期", queryModel.zzstartDate); } //解决/终止结束日期 if (queryModel.zzendDate != DateTime.MinValue) { sql += " And (t.终止日期 <=:结束日期 or (select to_date(to_char(记录时间,'yyyy-mm-dd'),'yyyy-mm-dd') 记录时间 from 问题记录过程 where 问题ID=t.id and 状态=7 and rownum=1 ) <=:结束日期 )"; sqlbuilder.Parameters("结束日期", queryModel.zzendDate); } //只显示已受理的问题 if (queryModel.showReceiveProblem) { sql += " And t.是否受理 = 1"; } //迭代 if (!string.IsNullOrEmpty(queryModel.lteration)) { sql += " And t.迭代ID=:DDID"; sqlbuilder.Parameters("DDID", queryModel.lteration); } //登记版本 if (!string.IsNullOrEmpty(queryModel.version)) { sql += " And t.版本号=:BBH"; sqlbuilder.Parameters("BBH", queryModel.version); } //研发处理人 if (!string.IsNullOrEmpty(queryModel.YFCLRID)) { sql += " And t.研发处理人ID=:YFCLRID"; sqlbuilder.Parameters("YFCLRID", queryModel.YFCLRID); } //测试处理人 if (!string.IsNullOrEmpty(queryModel.CSCLRID)) { sql += " And t.测试处理人ID=:CSCLRID"; sqlbuilder.Parameters("CSCLRID", queryModel.CSCLRID); } //受理人id if (!string.IsNullOrEmpty(queryModel.SLRID)) { sql += " And t.受理人ID=:SLRID"; sqlbuilder.Parameters("SLRID", queryModel.SLRID); } //解决版本 0:未指定 1:指定 2:全部 if (queryModel.whether != 2) { if (queryModel.whether == 0) { sql += " And t.解决版本 is null"; } else { //是否指定解决版本 if (!string.IsNullOrEmpty(queryModel.solutionversion)) { sql += " And t.解决版本=:JJBBH"; sqlbuilder.Parameters("JJBBH", queryModel.solutionversion); } else { sql += " And t.解决版本 is not null"; } } } //解决版本状态 if (!string.IsNullOrEmpty(queryModel.JJBBZT)) { sql += " And t.解决版本状态=:JJBBZT"; sqlbuilder.Parameters("JJBBZT", queryModel.JJBBZT); } } //根据人员性质,加载允许的权限数据(中联性质的人员可以查询全部) //(1-中联;2-中联渠道;3-客户;4-医院管理员;5-卫计委管理员) if (queryModel.currentUserProperty == 2) { //中联渠道人员,允许查询渠道内的问题 if (!string.IsNullOrWhiteSpace(queryModel.queryText)) { //放开权限 sql += @" And exists (select 1 from 人员信息 where ID = :人员ID)"; } else { //未放开权限 if (queryModel.myProblem || !string.IsNullOrEmpty(queryModel.myProblemCombox) || !queryModel.projectId.IsNullOrEmpty()|| iscoll==0)//勾上待我处理、我登记、我分配,只看我自己机构的问题,不看其他渠道问题 { sql += @" And exists (select 1 from 人员信息 where (人员信息.ID = :人员ID and t.渠道id = 人员信息.渠道id ) ) "; } else { sql += @" And exists (select 1 from 人员信息 where (人员信息.ID = :人员ID and t.渠道id = 人员信息.渠道id ) ) or exists (select 1 from 人员信息,渠道人员共享 where (人员信息.ID =:人员ID and 人员信息.渠道id=渠道人员共享.共享渠道ID and t.渠道id = 渠道人员共享.渠道id ) ) "; } } sqlbuilder.Parameters("人员ID", queryModel.currentUserID); } else if (queryModel.currentUserProperty == 3) {//客户操作人员(只看自己的) sql += " And t.登记人ID = :登记人ID"; sqlbuilder.Parameters("登记人ID", queryModel.currentUserID); } else if (queryModel.currentUserProperty == 4) {//机构管理员,只看本机构的 sql += @" And exists (select 1 from 人员信息 p where ID = :人员ID and t.渠道id= p.渠道id And t.机构id = p.站点id)"; sqlbuilder.Parameters("人员ID", queryModel.currentUserID); } else if (queryModel.currentUserProperty == 5) {//卫计委管理员,允许查看该项目下的问题 sql += @" And exists (select 1 from 人员信息 p where ID = :人员ID and t.渠道id= p.渠道id )"; sqlbuilder.Parameters("人员ID", queryModel.currentUserID); } // 是否显示内部产品问题 if (!queryModel.insideProblem) { sql += " And t.内部产品问题=0"; } //自定义排序 sql += queryModel.oderBy; if (queryModel.page > 0 && queryModel.rows > 0) { return sqlbuilder.SqlText(sql) .Paging(queryModel.page, queryModel.rows) .Select(out total); } else { return sqlbuilder.SqlText(sql).Select(); } } /// /// 重复问题列表所用的数据 /// /// /// public DataTable AllProList(UserInfo userInfo) { string sql = "select ID,编号,问题标题, '[' ||编号||']'||问题标题 as 显示名称 from 问题记录 where 是否删除=0 and 是否回退=0 and 是否终止=0"; return SqlBuilder.SqlText(sql).Select(); } //受理该问题(如果已处理返回false) public bool ReceiveProblem(string id, string userid, string name) { var sql = @"update 问题记录 set 受理人 = :受理人, 受理人ID=:受理人ID, 是否受理 = 1, 受理时间=sysdate where ID = :ID and ( 是否受理 = 0 or 受理人ID=:受理人ID or 指派人ID=:指派人ID)"; return this.SqlBuilder.SqlText(sql) .Parameters("受理人", name) .Parameters("受理人ID", userid) .Parameters("指派人ID", userid) .Parameters("ID", id) .Execute() > 0; //return this.UpdateBuilder // .Column("受理人", name) // .Column("受理人ID", userid) // .Column("受理时间", this.DataBaseBuilder.GetDateTime) // .Column("是否受理", 1) // .Update("问题记录") // .Where("ID", id) // .Where("是否受理", 0) // .Execute() > 0; } /// /// 判断问题是否被他人受理 /// /// /// /// public int IsReceive(string id, string userid) { var status = 0; var sql = @"select t.ID from 问题记录 t where t.ID=:id and t.是否受理 = 1 "; if (!String.IsNullOrEmpty(this.SqlBuilder.SqlText(sql).Parameters("id", id).Select())) { //如果已受理,判断是否为我受理 sql += " and ( t.受理人ID=:userid or t.指派人ID=:userid )"; var t = this.SqlBuilder.SqlText(sql).Parameters("id", id).Parameters("userid", userid).Select(); if (!String.IsNullOrEmpty(t)) { status = 2; } else { status = 1; } } return status; } //强制受理这个问题 public bool TryReceiveProblem(string id, string userid, string name) { return this.UpdateBuilder .Column("受理人", name) .Column("受理人ID", userid) .Column("受理时间", this.DataBaseBuilder.GetDateTime) .Column("是否受理", 1) .Update("问题记录") .Where("ID", id) .Execute() > 0; } //获取最近处理描述 public ProblemDealMessage GetRecentlyDetail(string ProblemId) { try { return new ProblemDealMessage { DealDetail = this.SqlBuilder.SqlText("select * from (select 描述 from 问题记录过程 where 问题ID= :ProblemId and 状态=6 order by 记录时间 desc) where rownum=1").Parameters("ProblemId", ProblemId).Select(), SolveDetail = this.SqlBuilder.SqlText("select * from (select 描述 from 问题记录过程 where 问题ID= :ProblemId and 状态=7 order by 记录时间 desc) where rownum=1").Parameters("ProblemId", ProblemId).Select() }; } catch (Exception ex) { Logger.Instance.Error("调用GetRecentlyDetail出错", ex); return new ProblemDealMessage(); } } //取消受理问题 public bool CancelReceiveProblem(string id, string PersonId) { using (var tran = this.DBTransaction.BeginTrans()) { try { var up = this.UpdateBuilder .Column("是否受理", 0) .Column("受理人", DBNull.Value) .Column("受理人ID", DBNull.Value) .Column("受理时间", DBNull.Value) .Update("问题记录") .Where("ID", id) .Execute(tran); var dt = this.SqlBuilder.SqlText("Select * from (Select 当前流程ID,记录时间 from 问题记录过程 where 问题ID=:id order by 记录时间 desc) where rownum=1") .Parameters("id", id).Select(); var ProcessId = dt.Rows[0].GetValueByName("当前流程ID"); //计算耗时 var ProcessTime = dt.Rows[0].GetValueByName("记录时间"); DateTime CurrentTime = this.DataBaseBuilder.GetDateTime; TimeSpan time = CurrentTime - ProcessTime; var PassTime = time.TotalMinutes / 60; //添加过程 var inserProcess = this.InsertBuilder .Column("ID", Guid.NewGuid().ToString()) .Column("问题ID", id) .Column("记录人ID", PersonId) .Column("记录时间", CurrentTime) .Column("当前流程ID", ProcessId) .Column("状态", 9) .Column("来源流程ID", ProcessId) .Column("耗时", PassTime) .Insert("问题记录过程") .Execute(tran); tran.CommitTrans(); return (up > 0 && inserProcess > 0); } catch (Exception ex) { tran.Rollback(); Logger.Instance.Error("取消受理失败", ex); return false; } } } //查询用户信息 public DataTable QueryUserInfo(string uid) { var sql = "select 性质,职务 from 人员信息 where ID=:ID"; return this.SqlBuilder.SqlText(sql) .Parameters("ID", uid) .Select(); } /// /// 查询需要处理的问题列表 /// /// 1:技术支持,2:研发处理 /// 输出总记录数量 /// 返回json数据 public DataTable QueryNeedProccessList(int type, string productid, string productModuleId, int page, int rows, out int total) { total = 0; var sqlbuilder = this.SqlBuilder; var sql = @"select ID,编号,紧急代码,问题标题,问题性质,登记人,反馈人,登记日期, (select 名称 from 渠道信息 where ID = 问题记录.渠道id) as 渠道, (select 名称 from 产品系统配置 where id = 问题记录.产品id) as 产品, (select count(1) from 产品问题附件 where 问题id = 问题记录.id) as 附件数量 from 问题记录 where 是否删除 = 0 And 是否终止 = 0 And 是否解决 = 0 And 是否受理 = 0"; if (1 == type) {//技术支持(只显示技术支持需要处理的问题) sql += " And 环节ID=4"; } else if (2 == type) {//研发支持(只显示研发需要处理的) sql += " And 环节ID=5"; } else {//查询类型不明确 return null; } if (!string.IsNullOrEmpty(productid) || !string.IsNullOrEmpty(productModuleId)) { sql += " And ( "; //产品ID不为空,则需要根据产品来过滤 if (!string.IsNullOrEmpty(productid)) { sql += " 产品ID in (Select Column_Value From Table(f_Split_String(:产品ID, ','))) or"; sqlbuilder.Parameters("产品ID", productid); } if (!string.IsNullOrEmpty(productModuleId)) {//模块ID不为空 sql += " 模块ID in (Select Column_Value From Table(f_Split_String(:模块ID, ','))) "; sqlbuilder.Parameters("模块ID", productModuleId); } else { sql = sql.Substring(0, sql.Length - 2); } sql += " )"; } sql += " Order By 编号 DESC"; return sqlbuilder .SqlText(sql) .Paging(page, rows) .Select(out total); } //处理问题时更新的问题附加信息 public bool UpdateProblemInfo(ProblemProcessModel model, UserInfo user) { bool result; using (ITransaction transaction = base.DBTransaction.BeginTrans()) { try { WTJLModel model2 = this.GetModel(model.ProblemID); bool identify = model.Identify; if (identify) { base.InsertBuilder.Insert("项目个性化").Column("ID", Guid.NewGuid().ToString()).Column("项目ID", model2.XMID).Column("产品ID", model2.CPID).Column("修改人", user.Name).Column("修改时间", base.DataBaseBuilder.GetDateTime).Column("名称", model2.WTBT).Column("修改性质", (user.JobCode.ToInt32() == 10 || user.JobCode.ToInt32() == 11) ? 1 : ((user.JobCode.ToInt32() == 7 || user.JobCode.ToInt32() == 12 || user.JobCode.ToInt32() == 13) ? 2 : 3)).Column("状态", 1).Column("来源问题", model2.BH).Column("修改说明", (model2.XGSM == null) ? model.ProcessRemark : model2.XGSM).Execute(); } else { base.SqlBuilder.SqlText("update 项目个性化 set 状态=2 where 来源问题=:BH").Parameters("BH", model2.BH).Execute(); } base.UpdateBuilder.Update("问题记录").Column("红黑榜", model.RedBlack).Column("红黑榜理由", model.RedBlackContent).Column("黑榜问题描述", model2.WTMS) .Column("问题类型", model.IsItem ? 1 : 2).Column("解决版本", model.SolveVersion.IsNullOrEmpty()?model2.JJBB: model.SolveVersion).Column("解决版本状态", model.SolveVersionstate).Column("BH版本", model.BHVersion).Column("BH编号", model.BHNumber).Column("常见问题", model.IsOften ? 1 : 0).Column("修改说明", model.AlterRemark).Column("升级说明", model.UpgrateRemark).Column("是否发布", model.IsRelease ? 1 : 0).Column("需要培训", model.IsTrain ? 1 : 0).Where("ID", model.ProblemID).Execute(); transaction.CommitTrans(); result = true; } catch (Exception ex) { transaction.Rollback(); Logger.Instance.Error("处理问题操作的更新问题附加信息时失败,方法UpdateProblemInfo", ex); result = false; } } return result; } //根据过程ID查询出相应的过程详细信息 public dynamic QueryProcessInfo(string pid) { var sql = @"select t.编号,t.问题标题,t.ID, (select p.姓名 from 人员信息 p where p.Id =r.记录人id ) as 处理人, r.记录时间, r.描述, decode(r.状态,1,'登记',2,'回退',3,'终止',4,'分配',5,'提交',6,'处理',7,'完成',8,'受理') as 状态, (Select Wm_Concat(附件id || '|' || 类型) From 产品问题附件 Where 过程ID = r.Id) As 附件 from 问题记录过程 r, 问题记录 t where r.ID = :过程ID and r.问题id = t.Id"; var dt = this.SqlBuilder.SqlText(sql) .Parameters("过程ID", pid) .Select(); var list = dt.ToList(); if (list != null && list.Count > 0) { return list[0]; } return null; } //查询问题记录 public EntityModels.Product.WTJLModel GetModel(string id) { EntityModels.Product.WTJLModel model = new EntityModels.Product.WTJLModel(this.DataFactoryObject); model.ID = id; model.Select(); return model; } //获取问题记录datatable public DataTable GetProblemById(string id) { return this.SqlBuilder.SqlText("Select 是否终止,是否解决,环节ID,编号,ID from 问题记录 where ID=:id").Parameters("id", id).Select(); } public string GetWTID(string Processid) { return this.SqlBuilder.SqlText("Select 问题ID from 问题记录过程 where ID=:id").Parameters("id", Processid).Select(); } //撤消问题 public int UndoProblem(string id) { return this.UpdateBuilder .Column("是否终止", 0) .Column("是否解决", 0) .Update("问题记录") .Where("ID", id) .Execute(); } public string CheckUpdateProcess(string ProcessId, string UserId) { var sql = @"select ID,记录人ID from 问题记录过程 where 问题ID=(select 问题ID from 问题记录过程 where ID=:id) order by 记录时间 desc"; var dt = this.SqlBuilder.SqlText(sql).Parameters("id", ProcessId).Select(); var CurrentProcess = dt.Rows[0].GetValueByName("ID"); var CurrenUserId = dt.Rows[0].GetValueByName("记录人ID"); if (CurrentProcess != ProcessId) { return "1"; //只能修改最新的流程 } if (CurrenUserId != UserId) { return "2"; //只能修改自己提交的过程 } else { return "3"; } } public int UpdateProblemProcess(EntityModels.Product.WTJLGCModel model) { return this.UpdateBuilder.Column("描述", model.MS).Update("问题记录过程").Where("ID", model.ID).Execute(); } //登记问题时获取推送人 public List GetPushPerson(string ProblemId) { try { var list = new List(); //获取问题信息 var ProblemModel = GetModel(ProblemId); //如果为项目环节,通知项目服务人员 if (ProblemModel.HJID <= 3) { //获取项目服务人员 var ProjectPerson = this.SqlBuilder.SqlText("select 人员ID from 项目服务人员 where 项目ID=:id").Parameters("id", ProblemModel.XMID).Select(); //如果不为空则通知维护的项目人员 if (ProjectPerson != null && ProjectPerson.Rows.Count > 0) { foreach (DataRow row in ProjectPerson.Rows) { list.Add(row.GetValueByName("人员ID")); } } else { //通知渠道下所有人员 var ProjectPersonAll = this.SqlBuilder.SqlText("select ID from 人员信息 where 渠道ID=:id and 是否删除=0 and 性质=2").Parameters("id", ProblemModel.QDID).Select(); if (ProjectPersonAll != null && ProjectPersonAll.Rows.Count > 0) { foreach (DataRow row in ProjectPersonAll.Rows) { list.Add(row.GetValueByName("ID")); } } } } else if (ProblemModel.HJID == 4) { //如果模块ID不为空 if (!string.IsNullOrEmpty(ProblemModel.MKID)) { //获取测试人ID var TestPerson = this.SqlBuilder.SqlText("select 测试人IDNEW from 产品模块功能 where ID=:id and 测试人IDNEW is not null").Parameters("id", ProblemModel.MKID).Select(); if (!string.IsNullOrEmpty(TestPerson)) { var listAll = TestPerson.Split(','); foreach (string item in listAll) { list.Add(item); } } else { //如果不存在测试人则通知所有总部人员 var SurpportPerson = this.SqlBuilder.SqlText("select ID from 人员信息 where 性质='1' and 是否删除=0 and 职务='12'").Select(); if (SurpportPerson != null && SurpportPerson.Rows.Count > 0) { foreach (DataRow row in SurpportPerson.Rows) { list.Add(row.GetValueByName("ID")); } } } } else { //如果不存在模块则通知所有总部人员技术支持 var SurpportPerson = this.SqlBuilder.SqlText("select ID from 人员信息 where 性质='1' and 是否删除=0 and 职务='12'").Select(); if (SurpportPerson != null && SurpportPerson.Rows.Count > 0) { foreach (DataRow row in SurpportPerson.Rows) { list.Add(row.GetValueByName("ID")); } } } } return list; } catch (Exception ex) { Logger.Instance.Error("获取推送人发送错误,", ex); return new List(); } } //获取问题流程的主流程 public List GetMainProcess(string ProblemId) { try { var list = new List(); var mainSql = @"select ID,是否验证,环节ID,流程ID,登记人,登记日期,是否终止,终止日期,是否解决,指派人,指派时间, decode(环节ID,0,'已登记',1,'机构处理',2,'卫计委处理',3,'项目处理',4,'技术支持处理',5,'研发处理') as 环节名, (select decode(t.性质,1,'总部',2,'渠道人员',3,'客户',4,'医院管理员',5,'卫计委管理员') as 职务 from 人员信息 t where t.ID=登记人ID) as 职务, (select decode(s.性质,1,'总部',2,'渠道人员',3,'客户',4,'医院管理员',5,'卫计委管理员') as 指派人职务 from 人员信息 s where s.ID=指派人ID) as 指派人职务 from 问题记录 where ID=:id"; var CurrentDt = this.SqlBuilder.SqlText(mainSql).Parameters("id", ProblemId).Select(); //添加登记过程 var RegistPerson = CurrentDt.Rows[0].GetValueByName("登记人");//登记人 var AssigneePerson = CurrentDt.Rows[0].GetValueByName("指派人"); var AssigneeTime = CurrentDt.Rows[0].GetValueByName("指派时间"); list.Add(new MainProcessModel { StatusID = 1, LinkId = 0, LinkName = "登记", LinkUserName = RegistPerson, LinkTime = CurrentDt.Rows[0].GetValueByName("登记日期"), job = CurrentDt.Rows[0].GetValueByName("职务") }); //获取当前环节 var CurrentLink = CurrentDt.Rows[0].GetValueByName("环节ID"); if (CurrentLink > 0) { for (var i = 1; i <= CurrentLink; i++) { var sql = @"select * from (select s.当前流程ID,t.姓名, decode(:CurrentLink,0,'已登记',1,'机构处理',2,'卫计委处理',3,'项目处理',4,'技术支持处理',5,'研发处理') as 环节名, s.记录时间,s.描述,s.ID,s.状态, decode(t.性质,1,'总部',2,'渠道人员',3,'客户',4,'医院管理员',5,'卫计委管理员') as 职务 from 问题记录过程 s,人员信息 t where s.当前流程ID in (select ID from 问题工作流程 where 环节ID=:CurrentLink) and s.记录人ID= t.ID and s.问题ID=:ProblemId and s.状态!= 1 order by s.记录时间 desc) where rownum=1"; var processDt = this.SqlBuilder.SqlText(sql).Parameters("CurrentLink", i).Parameters("ProblemId", ProblemId).Select(); if (processDt != null && processDt.Rows.Count > 0) { var CurrentRegisName = processDt.Rows[0].GetValueByName("姓名"); var CurrentRegisJob = processDt.Rows[0].GetValueByName("职务"); var Status = processDt.Rows[0].GetValueByName("状态"); var CurrentRegislist = new MainProcessModel { LinkId = i, LinkName = processDt.Rows[0].GetValueByName("环节名") }; ///如果不为提交或回退、指派 if (Status != 2 && Status != 5 && Status != 9 && Status != 10 & Status != 4) { CurrentRegislist.LinkUserName = CurrentRegisName; CurrentRegislist.job = CurrentRegisJob; CurrentRegislist.LinkTime = processDt.Rows[0].GetValueByName("记录时间"); CurrentRegislist.LinkDeatil = processDt.Rows[0].GetValueByName("描述"); CurrentRegislist.ProcessId = processDt.Rows[0].GetValueByName("ID"); } else { if (Status == 5 && i == CurrentLink && !string.IsNullOrEmpty(AssigneePerson)) { CurrentRegislist.LinkUserName = "提交给→" + AssigneePerson; CurrentRegislist.job = CurrentRegisJob; CurrentRegislist.LinkTime = AssigneeTime; } //指派 if (Status == 4) { CurrentRegislist.LinkUserName = "处理人变更→" + AssigneePerson; CurrentRegislist.job = CurrentRegisJob; CurrentRegislist.LinkTime = AssigneeTime; CurrentRegislist.ProcessId = processDt.Rows[0].GetValueByName("ID"); } } list.Add(CurrentRegislist); } } //是否终止 if (CurrentDt.Rows[0].GetValueByName("是否终止") == 1) { list.Add(new MainProcessModel { StatusID = 3, LinkName = "已终止", LinkTime = CurrentDt.Rows[0].GetValueByName("终止日期") }); } //是否完成 if (CurrentDt.Rows[0].GetValueByName("是否解决") == 1) {//是否验证 if (CurrentDt.Rows[0].GetValueByName("是否验证") == 1) { list.Add(new MainProcessModel { StatusID = 11, LinkName = "已验证" }); } else { list.Add(new MainProcessModel { StatusID = 7, LinkName = "已完成" }); } } } return list; } catch (Exception ex) { Logger.Instance.Error("获取问题流程的主流程失败,原因:" + ex); return new List(); } } #endregion #region 其他操作 /// /// 判断是否处理过该问题 /// /// /// public bool IsDealed(string id, string PersonId) { return this.SqlBuilder.SqlText("select ID from 问题记录过程 where 问题ID=:id and 记录人ID=:PersonId").Parameters("id", id).Parameters("PersonId", PersonId).Exists(); } /// /// 判断问题是否完结并处理推送评价 /// /// /// /// public bool IsConfirmClosing(string id, string PersonId) { var state= this.SqlBuilder.SqlText("select ID from 问题记录 where id=:id and 登记人ID=:PersonId and (是否解决=1 or 是否终止=1 )").Parameters("id", id).Parameters("PersonId", PersonId).Exists(); if(state) { //UpdateBuilder.Update("问题记录").Column("").Where("id", id).Execute(); } return state; } /// /// 问题归类 /// /// /// public bool DoClassifi(string id, string ClssID,int nature, UserInfo user) { if (user.PersonProperty == 1) { return (base.UpdateBuilder.Update("问题记录").Where("ID", id).Column("技术支持分类ID", ClssID).Column("问题性质", nature).Execute() > 0); } else { return (base.UpdateBuilder.Update("问题记录").Where("ID", id).Column("分类ID", ClssID).Column("问题性质", nature).Execute() > 0); } } #endregion #region 超时推送 /// /// 是否开启超时推送 /// /// /// public bool GetIsOverTime(UserInfo user) { var sqlbulider = this.SqlBuilder; var sql = @"select b.ID from 问题流程环节 b where b.人员性质=:PersonProperty and b.超时启用=1 "; sqlbulider.Parameters("PersonProperty", user.PersonProperty); ///如果为本部人员 if (user.PersonProperty == 1) { sql += @" and Exists (select column_value from table(Select f_Split_String(x.职务代码1, ',') from 问题流程环节 x where id = b.Id) where Column_Value =:Job) "; sqlbulider.Parameters("Job", Convert.ToInt32(user.JobCode)); } return sqlbulider.SqlText(sql).Exists(); } /// /// 获取受理超时 /// /// /// /// public DataTable GetAcceptOverTime(UserInfo user) { try { //获取推送人所在环节 var sqlbulider = this.SqlBuilder; var sql = @"select b.ID from 问题流程环节 b where b.人员性质=:PersonProperty "; sqlbulider.Parameters("PersonProperty", user.PersonProperty); ///如果为本部人员 if (user.PersonProperty == 1) { sql += @" and Exists (select column_value from table(Select f_Split_String(x.职务代码1, ',') from 问题流程环节 x where id = b.Id) where Column_Value =:Job) "; sqlbulider.Parameters("Job", Convert.ToInt32(user.JobCode)); } var LinkId = sqlbulider.SqlText(sql).Select(); //如果不存在 if (LinkId <= 0) { return new DataTable(); } //获取超时的问题 var sql2 = @"select a.ID ,a.编号 from 问题记录 a,问题流程环节 b where a.环节ID=b.ID and a.是否受理=0 and a.是否终止=0 and a.是否解决=0 and a.是否删除=0 and b.ID=:LinkId and b.超时启用=1 and (select ROUND(sysdate-max(ss.记录时间),3)*24*60 from 问题记录过程 ss where ss.问题ID=a.ID)>b.受理时间 order by a.编号 desc"; var ProblemDt = this.SqlBuilder.SqlText(sql2).Parameters("LinkId", LinkId).Select(); return ProblemDt; } catch (Exception ex) { Logger.Instance.Error("超时推送调用GetAcceptOverTime出错,原因:", ex); return new DataTable(); } } /// /// 获取处理超时 /// /// public DataTable GetDealOverTime(UserInfo user) { try { //获取推送人所在环节 var sqlbulider = this.SqlBuilder; var sql = @"select b.ID from 问题流程环节 b where b.人员性质=:PersonProperty "; sqlbulider.Parameters("PersonProperty", user.PersonProperty); ///如果为本部人员 if (user.PersonProperty == 1) { sql += @" and Exists (select column_value from table(Select f_Split_String(x.职务代码1, ',') from 问题流程环节 x where id = b.Id) where Column_Value =:Job) "; sqlbulider.Parameters("Job", Convert.ToInt32(user.JobCode)); } var LinkId = sqlbulider.SqlText(sql).Select(); //如果不存在 if (LinkId <= 0) { return new DataTable(); } //获取超时的问题 var sql2 = @"select a.ID ,a.编号 from 问题记录 a,问题流程环节 b where a.环节ID=b.ID and a.是否受理=1 and a.是否终止=0 and a.是否解决=0 and a.是否删除=0 and (a.受理人ID=:PersonId or a.指派人ID=:PersonId) and b.ID=:LinkId and b.超时启用=1 and (select ROUND(sysdate-max(ss.记录时间),3)*24*60 from 问题记录过程 ss where ss.问题ID=a.ID)>b.处理时间 order by a.编号 desc"; var ProblemDt = this.SqlBuilder.SqlText(sql2).Parameters("LinkId", LinkId).Parameters("PersonId", user.PersonID).Select(); return ProblemDt; } catch (Exception ex) { Logger.Instance.Error("超时推送调用GetDealOverTime出错,原因:", ex); return new DataTable(); } } #endregion #region 首页查询使用 /// /// 首页查询统计数量 /// /// 用户id /// 用户性质 /// 渠道ID /// 项目ID /// 机构ID /// 返回数据表 public DataTable QueryNotFinishProblem(string uid, int userprop, string companyid, string projectid, string orgid) { var sqlbuilder = this.SqlBuilder; var sql = @"with tab as (select * from 问题记录 t where 是否解决 = 0 and 是否终止= 0 and 是否删除 = 0 "; if (userprop == 2) {//人员性质2:渠道人员,查看当前渠道未解决的问题 sql += " And 渠道ID = :渠道ID"; sqlbuilder.Parameters("渠道ID", companyid); } else if (userprop == 3) {//客户人员:只看自己登记未解决的问题 sql += " And 登记人 = :登记人ID"; sqlbuilder.Parameters("登记人ID", uid); } else if (userprop == 4) {//医院管理员:查看自己机构问题 sql += " And 机构ID = :机构ID"; if (!string.IsNullOrEmpty(orgid)) { sqlbuilder.Parameters("机构ID", orgid); } else { Logger.Instance.Warn("当前人员未设置机构ID"); } } else if (userprop == 5) {//卫计委人员 sql += " And 项目ID = :项目ID"; sqlbuilder.Parameters("项目ID", projectid); } sql += ")"; sql += @"select '未解决的BUG' as 类型, sum(1) as 数量 from tab where tab.问题性质 = 1 union select '未完成的任务',sum(1) from tab where tab.问题性质 = 4 union select '待完成的需求',sum(1) from tab where tab.问题性质 = 3 union select '未回复的咨询',sum(1) from tab where tab.问题性质 = 2 union select '指派给我的问题',sum(1) from tab where tab.指派人ID =:人员ID"; sqlbuilder.Parameters("人员ID", uid); //返回查询的表结果 return sqlbuilder.SqlText(sql) .Select(); } public DataTable NotFinishProblemList(string uid, int userprop, string companyid, string projectid, string orgid, int Type, int page, int rows, out int total) { var sqlbuilder = this.SqlBuilder; var sql = @" select t.编号,t.问题性质,t.问题标题,t.登记日期,t.受理人,t.登记人,t.指派人,t.ID, (select 名称 from 问题流程环节 where id = t.环节id ) as 当前环节, (select 名称 from 渠道信息 where id = t.渠道id) as 渠道, (select 名称 from 项目信息 where id = t.项目ID) as 项目, (select 名称 from 站点信息 where id = t.机构id) as 机构, (select 名称 from 产品系统配置 where id = t.产品id) as 产品, (case t.是否解决 when 1 then (select ROUND(max(记录时间)-t.登记日期,2)*24 from 问题记录过程 c where t.Id =c.问题id ) when 0 then (select ROUND(sysdate - t.登记日期,2)*24 from dual) end ) as 总耗时 from 问题记录 t where t.是否解决 = 0 and t.是否终止= 0 and t.是否删除 = 0 "; if (userprop == 2) {//人员性质2:渠道人员,查看当前渠道未解决的问题 sql += " And t.渠道ID = :渠道ID"; sqlbuilder.Parameters("渠道ID", companyid); } else if (userprop == 3) {//客户人员:只看自己登记未解决的问题 sql += " And t.登记人 = :登记人ID"; sqlbuilder.Parameters("登记人ID", uid); } else if (userprop == 4) {//医院管理员:查看自己机构问题 sql += " And t.机构ID = :机构ID"; if (!string.IsNullOrEmpty(orgid)) { sqlbuilder.Parameters("机构ID", orgid); } else { Logger.Instance.Warn("当前人员未设置机构ID"); } } else if (userprop == 5) {//卫计委人员 sql += " And t.项目ID = :项目ID "; sqlbuilder.Parameters("项目ID", projectid); } if (Type != 5) { sql += " And t.问题性质 =:Type"; sqlbuilder.Parameters("Type", Type); } else { sql += $" And t.指派人ID ='{uid}'"; } sql += " order by t.编号 desc"; //返回查询的表结果 return sqlbuilder.SqlText(sql).Paging(page, rows) .Select(out total); } /// /// 查询各渠道的问题总数 /// /// public DataTable QueryCompanyProblemCount() { var sql = @"Select 名称, (Select Count(1) From 问题记录 Where 渠道id = t.Id And 问题性质 = 1 and 是否删除 = 0 and 是否解决 = 0 and 是否终止 = 0) As Bug, (Select Count(1) From 问题记录 Where 渠道id = t.Id And 问题性质 = 2 and 是否删除 = 0 and 是否解决 = 0 and 是否终止 = 0) As 任务, (Select Count(1) From 问题记录 Where 渠道id = t.Id And 问题性质 = 3 and 是否删除 = 0 and 是否解决 = 0 and 是否终止 = 0) As 需求, (Select Count(1) From 问题记录 Where 渠道id = t.Id And 问题性质 = 4 and 是否删除 = 0 and 是否解决 = 0 and 是否终止 = 0) As 咨询 From 渠道信息 t Where t.状态=1"; return this.SqlBuilder.SqlText(sql) .Select(); } public DataTable QueryOrgProblemCount(string companyid) { var sql = @"select 名称, (select count(1) from 问题记录 where 机构id = t.id and 问题性质 = 1) as Bug, (select count(1) from 问题记录 where 机构id = t.id and 问题性质 = 2) as 任务, (select count(1) from 问题记录 where 机构id = t.id and 问题性质 = 3) as 需求, (select count(1) from 问题记录 where 机构id = t.id and 问题性质 = 4) as 咨询 from 站点信息 t where id in( select 机构ID from 问题记录 where 渠道id = :渠道ID group by 机构ID)"; return this.SqlBuilder.Parameters("渠道ID", companyid) .SqlText(sql) .Select(); } //根据机构ID,查询出该机构下人员提出的问题 public DataTable QueryOrgPersonProblemCount(string orgid) { var sql = @"select 姓名 as 名称, (select count(1) from 问题记录 where 登记人ID = t.id and 问题性质 = 1) as Bug, (select count(1) from 问题记录 where 登记人ID = t.id and 问题性质 = 2) as 任务, (select count(1) from 问题记录 where 登记人ID = t.id and 问题性质 = 3) as 需求, (select count(1) from 问题记录 where 登记人ID = t.id and 问题性质 = 4) as 咨询 from 人员信息 t where id in( select 登记人ID from 问题记录 where 机构ID =:机构ID group by 登记人ID) "; return this.SqlBuilder.Parameters("机构ID", orgid) .SqlText(sql) .Select(); } //查询与我相关的问题 public DataTable QueryMyProblemList(string userid) { var sql = @"Select * from (Select ID, 编号, 问题性质, (Select 名称 From 问题流程环节 Where ID = t.环节id) As 当前环节, 问题标题, 登记人, 问题描述, 登记日期, 指派时间 From 问题记录 t Where (登记人id = :人员ID Or 指派人id = :人员ID or 受理人id =:人员ID) And t.是否删除 = 0 and t.是否解决=0 and t.是否终止=0 order by 编号 desc) where rownum <=5 "; return this.SqlBuilder.SqlText(sql) .Parameters("人员ID", userid) .Select(); } //查询常见问题 public DataTable QueryOftenProblemList() { var sql = @"select ID,编号,问题标题,版本号,登记日期,登记人,问题描述 from 问题记录 t where 常见问题= 1 and 是否删除=0 and rownum <=5"; return this.SqlBuilder.SqlText(sql) .Select(); } //查询出问题所停留的环节 public DataTable QueryAllProblemStopWorkFlow(int personProp, string companyid, string orgid, string userid) { var sql = @"Select 名称, (Select Count(1) From 问题记录 r Where r.环节id = t.Id And r.是否终止 = 0 And r.是否解决 = 0 And r.是否删除 = 0 "; var sqlbuilder = this.SqlBuilder; if (personProp == 2 || personProp == 5) {//渠道(项目人员,卫计委显示该渠道下的问题数量) sql += @" And r.渠道ID = :渠道ID "; sqlbuilder.Parameters("渠道ID", companyid); } else if (personProp == 3) {//客户显示自己提交的问题 sql += @" And r.登记人ID = :登记人ID "; sqlbuilder.Parameters("登记人ID", userid); } else if (personProp == 4) {//医院管理员 sql += @" And r.机构ID = :机构ID "; sqlbuilder.Parameters("机构ID", orgid); } sql += @" ) As 数量 From 问题流程环节 t Order By 序号"; return sqlbuilder.SqlText(sql).Select(); } #endregion #region 版本问题查询 public DataTable GetVersionProblem(string SearchText, string ProductId, string VersionId,string projectId, string AcceptedId, string sort, string order, int page, int rows, out int total) { var sql = @"select a.编号,a.问题性质,a.问题标题,a.ID,a.问题描述,s.ID as 产品问题版本ID,s.是否紧急,s.紧急补丁时间, (select decode(性质,1,'中联本部',2,'中联渠道',3,'客户',4,'医院管理员',5,'卫计委') from 人员信息 where ID=a.登记人ID ) as 性质, (select 版本号 from 产品版本配置 where ID=s.版本ID) as 版本, (select 名称 from 产品系统配置 where id = s.产品id) as 产品, (select 名称 from 产品模块功能 where id = a.模块id) as 模块, s.说明,a.登记人,a.登记日期,a.受理人, decode(a.解决版本状态,1,'登记',2,'修改',3,'测试',4,'待发布',5,'终止') 解决版本状态, (select 名称 from 渠道信息 where id = a.渠道id) as 渠道, (select 名称 from 项目信息 where id = a.项目ID) as 项目, (select 名称 from 站点信息 where id = a.机构id) as 机构 from 问题记录 a,产品问题版本 s where a.ID = s.问题ID "; var sqlbuilder = this.SqlBuilder; if (!string.IsNullOrEmpty(ProductId)) { sql += " and s.产品ID in (Select Column_Value From Table(f_Split_String(:ProductId, ','))) "; sqlbuilder.Parameters("ProductId", ProductId); } if (!string.IsNullOrEmpty(AcceptedId))//受理人id { sql += " and a.受理人ID= :AcceptedId "; sqlbuilder.Parameters("AcceptedId", AcceptedId); } if (!string.IsNullOrEmpty(VersionId)) { sql += " and s.版本ID=:VersionId "; sqlbuilder.Parameters("VersionId", VersionId); } if (!string.IsNullOrEmpty(SearchText)) { sql += " and (a.问题标题 like '%'||:查询关键字||'%' or a.编号 like '%'||:查询关键字||'%' ) "; sqlbuilder.Parameters("查询关键字", SearchText); } if (!string.IsNullOrEmpty(projectId)) {//项目ID sql += " And a.项目ID =:项目ID"; sqlbuilder.Parameters("项目ID", projectId); } var orders = sort + order; var orderBy = " order by a.编号 desc"; switch (orders) { case "编号asc": orderBy = " order by a.编号 asc"; break; case "编号desc": orderBy = " order by a.编号 desc"; break; case "受理人asc": orderBy = " order by a.受理人 asc"; break; case "受理人desc": orderBy = " order by a.受理人 desc"; break; case "解决版本状态asc": orderBy = " order by a.解决版本状态 asc"; break; case "解决版本状态desc": orderBy = " order by a.解决版本状态 desc"; break; case "登记日期asc": orderBy = " order by a.登记日期 asc"; break; case "登记日期desc": orderBy = " order by a.登记日期 desc"; break; case "项目asc": orderBy = " order by a.项目ID asc"; break; case "项目desc": orderBy = " order by a.项目ID desc"; break; } sql += orderBy; return sqlbuilder.SqlText(sql).Paging(page, rows) .Select(out total); } /// /// 添加备注 /// /// /// public string AddNotes(SubmitProblemFormModel model) { try { var ProcessId = String.Empty; //var t = UpdateBuilder.Update("问题记录").Where("ID", model.ProblemId).Column("解决版本状态", model.解决版本状态) .Execute(); var dt = this.SqlBuilder.SqlText("select ID,当前流程ID,来源流程ID from 问题记录过程 where 问题ID=:id and 状态=1") .Parameters("id", model.ProblemId).Select(); var CurrenProcessId = dt.Rows[0].GetValueByName("当前流程ID"); InsertBuilder.Insert("问题记录过程").Column("ID", Guid.NewGuid().ToString()) .Column("问题ID", model.ProblemId) .Column("记录人ID", model.registrantID) .Column("记录时间", this.DataBaseBuilder.GetDateTime) .Column("当前流程ID", CurrenProcessId) .Column("状态", model.Status) .Column("来源流程ID", CurrenProcessId) .Column("描述", model.DealDetail) .Execute(); ProcessId = dt.Rows[0].GetValueByName("ID"); return ProcessId; } catch (Exception ex) { Logger.Instance.Error("添加备注失败失败" + ex); return ""; } } #endregion } }