|
@@ -4,8 +4,12 @@ using Microsoft.AspNetCore.Authorization;
|
|
|
using Microsoft.AspNetCore.Http;
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
+using Microsoft.EntityFrameworkCore.Query.SqlExpressions;
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
+using System.Data;
|
|
|
+using System.Diagnostics;
|
|
|
+using System.Dynamic;
|
|
|
using System.Linq;
|
|
|
using System.Linq.Expressions;
|
|
|
using System.Text.RegularExpressions;
|
|
@@ -252,9 +256,332 @@ namespace wispro.sp.api.Controllers
|
|
|
return Context.CaseInfos.Where(p => p.CaseNo == caseNo.Trim()).Count() > 0;
|
|
|
}
|
|
|
|
|
|
- public IList<Object> CalMean_Std(DateTime start,DateTime end)
|
|
|
+ /// <summary>
|
|
|
+ /// 计算案件的zScore
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="start">定稿日开始时间</param>
|
|
|
+ /// <param name="end">定稿日结束时间</param>
|
|
|
+ /// <param name="type">0:基于文本相似度计算,1:基于文本修改差异度计算</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public IList<Object> CalCustomer_mean(DateTime start,DateTime end,int type=0)
|
|
|
+ {
|
|
|
+ var caseList = Context.CaseInfos.Where<CaseInfo>(
|
|
|
+ p => p.FinalVersionDate >= start && p.FinalVersionDate <= end)
|
|
|
+ .Include(p=>p.Customer)
|
|
|
+ .Include(p=>p.Reviewer)
|
|
|
+ .Include(p=>p.DRRAbstract)
|
|
|
+ .Include(p => p.DRRAbstract)
|
|
|
+ .Include(p => p.DRRCalim)
|
|
|
+ .Include(p => p.DRRFulltext)
|
|
|
+ .Include(p => p.DRRAll)
|
|
|
+ .Include(p => p.RFRAbstract)
|
|
|
+ .Include(p => p.RFRCalim)
|
|
|
+ .Include(p => p.RFRFulltext)
|
|
|
+ .Include(p => p.RFRAll);
|
|
|
+
|
|
|
+ int iTotals = caseList.Count();
|
|
|
+ int iIndex = 0;
|
|
|
+
|
|
|
+ List<Object> retList = new List<Object>();
|
|
|
+
|
|
|
+ #region 计算客户相似度平均值和标准方差
|
|
|
+ List<CustomerAvg_Std> avg_std1 = new List<CustomerAvg_Std>();
|
|
|
+ List<CustomerAvg_Std> avg_std2 = new List<CustomerAvg_Std>();
|
|
|
+ foreach (var caseInfo in caseList)
|
|
|
+ {
|
|
|
+ iIndex++;
|
|
|
+ Debug.WriteLine($"{iIndex}/{iTotals}\t{caseInfo.CaseNo}\t{caseInfo.DRRAbstractId},{caseInfo.DRRCalimId},{caseInfo.DRRFulltextId},{caseInfo.DRRAllId},{caseInfo.RFRAbstractId},{caseInfo.RFRCalimId},{caseInfo.RFRFulltextId},{caseInfo.RFRAllId}");
|
|
|
+ string tmpCustomerName = "未知";
|
|
|
+ if(caseInfo.Customer!= null)
|
|
|
+ {
|
|
|
+ tmpCustomerName = caseInfo.Customer.Name;
|
|
|
+ }
|
|
|
+
|
|
|
+ var one = avg_std1.Where<CustomerAvg_Std>(p => p.Name == tmpCustomerName).FirstOrDefault();
|
|
|
+ if (one == null)
|
|
|
+ {
|
|
|
+ one = new CustomerAvg_Std() { Name = tmpCustomerName };
|
|
|
+ avg_std1.Add(one);
|
|
|
+ }
|
|
|
+ var two = avg_std2.Where<CustomerAvg_Std>(p => p.Name == tmpCustomerName).FirstOrDefault();
|
|
|
+ if (two == null)
|
|
|
+ {
|
|
|
+ two = new CustomerAvg_Std() { Name = tmpCustomerName };
|
|
|
+ avg_std2.Add(two);
|
|
|
+ }
|
|
|
+
|
|
|
+ double? oneTmp = getCalValue(caseInfo, type, 0);
|
|
|
+ if(oneTmp != null)
|
|
|
+ {
|
|
|
+ one.Sum += oneTmp.Value;
|
|
|
+ one.SquareSum += oneTmp.Value * oneTmp.Value;
|
|
|
+ one.count += 1;
|
|
|
+ }
|
|
|
+ double? twoTmp = getCalValue(caseInfo, type, 1);
|
|
|
+ if (twoTmp != null)
|
|
|
+ {
|
|
|
+ two.Sum += twoTmp.Value;
|
|
|
+ two.SquareSum += twoTmp.Value * twoTmp.Value;
|
|
|
+ two.count += 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ System.Data.DataTable dt = new System.Data.DataTable();
|
|
|
+ dt.Columns.Add("我方文号");
|
|
|
+ dt.Columns.Add("案件名称");
|
|
|
+ dt.Columns.Add("客户");
|
|
|
+ dt.Columns.Add("处理人");
|
|
|
+ dt.Columns.Add("核稿人");
|
|
|
+ dt.Columns.Add("内部核稿分数");
|
|
|
+ dt.Columns.Add("外部核稿分数");
|
|
|
+ dt.Columns.Add("备注");
|
|
|
+
|
|
|
+ foreach (var item in caseList)
|
|
|
+ {
|
|
|
+ string tmpCustomerName = "未知";
|
|
|
+ if (item.Customer != null)
|
|
|
+ {
|
|
|
+ tmpCustomerName = item.Customer.Name;
|
|
|
+ }
|
|
|
+ var one = avg_std1.Where<CustomerAvg_Std>(p => p.Name == tmpCustomerName).FirstOrDefault();
|
|
|
+ var two = avg_std2.Where<CustomerAvg_Std>(p => p.Name == tmpCustomerName).FirstOrDefault();
|
|
|
+
|
|
|
+ double? oneSim = getCalValue(item,type,0);
|
|
|
+ double? twoSim = getCalValue(item, type, 1); ;
|
|
|
+
|
|
|
+ if(oneSim == null)
|
|
|
+ {
|
|
|
+ oneSim = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (twoSim == null)
|
|
|
+ {
|
|
|
+ twoSim = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ DataRow row = dt.NewRow();
|
|
|
+ row["我方文号"] = item.CaseNo;
|
|
|
+ row["案件名称"] = item.CaseName;
|
|
|
+ row["客户"] = item.Customer?.Name;
|
|
|
+ row["核稿人"] = item.Reviewer?.Name;
|
|
|
+ row["处理人"] = item.Handlers;
|
|
|
+ var zScoreA = (oneSim -one.Average)/one.Std_Deviation;
|
|
|
+ row["内部核稿分数"] = zScoreA;
|
|
|
+ var zScoreB = (twoSim -two.Average)/two.Std_Deviation;
|
|
|
+ row["外部核稿分数"] = zScoreB;
|
|
|
+
|
|
|
+ var distince = Math.Sqrt(zScoreB.Value * zScoreB.Value + zScoreA.Value * zScoreA.Value);
|
|
|
+
|
|
|
+ if (type == 0 || type==2)
|
|
|
+ {
|
|
|
+ if (distince > 3)
|
|
|
+ {
|
|
|
+ if (zScoreA.Value > 0 && zScoreB.Value > 0)
|
|
|
+ {
|
|
|
+ row["备注"] = "内部核稿、外部核稿修改都较少![撰稿人给力或客户友好]";
|
|
|
+ }
|
|
|
+
|
|
|
+ if (zScoreA.Value > 0 && zScoreB.Value < 0)
|
|
|
+ {
|
|
|
+ row["备注"] = "内部核稿较少、外部核稿修改较多![核稿人没有尽责!]";
|
|
|
+ }
|
|
|
+
|
|
|
+ if (zScoreA.Value < 0 && zScoreB.Value > 0)
|
|
|
+ {
|
|
|
+ row["备注"] = "内部核稿较多、外部核稿修改都较少![核稿人给力]";
|
|
|
+ }
|
|
|
+
|
|
|
+ if (zScoreA.Value < 0 && zScoreB.Value < 0)
|
|
|
+ {
|
|
|
+ row["备注"] = "内部核稿和外部核稿修改都较多![案件沟通问题?]";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (distince > 3)
|
|
|
+ {
|
|
|
+ if (zScoreA.Value > 0 && zScoreB.Value > 0)
|
|
|
+ {
|
|
|
+ row["备注"] = "内部核稿和外部核稿修改都较多![案件沟通问题?]";
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if (zScoreA.Value > 0 && zScoreB.Value < 0)
|
|
|
+ {
|
|
|
+ row["备注"] = "内部核稿较多、外部核稿修改都较少![核稿人给力]";
|
|
|
+ }
|
|
|
+
|
|
|
+ if (zScoreA.Value < 0 && zScoreB.Value > 0)
|
|
|
+ {
|
|
|
+ row["备注"] = "内部核稿较少、外部核稿修改较多![核稿人没有尽责!]";
|
|
|
+ }
|
|
|
+
|
|
|
+ if (zScoreA.Value < 0 && zScoreB.Value < 0)
|
|
|
+ {
|
|
|
+ row["备注"] = "内部核稿、外部核稿修改都较少![撰稿人给力或客户友好]";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ dt.Rows.Add(row);
|
|
|
+
|
|
|
+ retList.Add(
|
|
|
+
|
|
|
+ new
|
|
|
+ {
|
|
|
+ Id = item.Id,
|
|
|
+ CaseNo = item.CaseNo,
|
|
|
+ CaseName = item.CaseName,
|
|
|
+ Customer = item.Customer,
|
|
|
+ Reviewer = item.Reviewer,
|
|
|
+ Handlers = item.Handlers,
|
|
|
+ zScoreA = (oneSim - one.Average) / one.Std_Deviation,
|
|
|
+ zScoreB = (twoSim - two.Average) / two.Std_Deviation
|
|
|
+ }
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ wispro.sp.utility.NPOIExcel.DataTableToExcel(dt,$"c:\\temp\\{DateTime.Now.ToString("yyyyMMdd")}-内部核稿外部核稿情况案件清单_{typeName(type)}.xlsx");
|
|
|
+ return retList;
|
|
|
+ }
|
|
|
+
|
|
|
+ private double? getCalValue(CaseInfo caseInfo,int type,int stage)
|
|
|
+ {
|
|
|
+ double? calValue = null;
|
|
|
+ switch (type)
|
|
|
+ {
|
|
|
+ case 0:
|
|
|
+ if(stage == 0)
|
|
|
+ {
|
|
|
+ if(caseInfo.DRRFulltext != null && caseInfo.DRRAbstract != null)
|
|
|
+ {
|
|
|
+ calValue = caseInfo.DRRAll.TextSimilarity;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(caseInfo.DRRCalim != null)
|
|
|
+ {
|
|
|
+ calValue = caseInfo.DRRCalim.TextSimilarity;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (caseInfo.RFRFulltext != null && caseInfo.RFRAbstract != null)
|
|
|
+ {
|
|
|
+ calValue = caseInfo.RFRAll.TextSimilarity;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (caseInfo.RFRCalim != null)
|
|
|
+ {
|
|
|
+ calValue = caseInfo.RFRCalim.TextSimilarity;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ if (stage == 0)
|
|
|
+ {
|
|
|
+ if (caseInfo.DRRFulltext != null && caseInfo.DRRAbstract != null)
|
|
|
+ {
|
|
|
+ calValue = caseInfo.DRRAll.diffRate;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (caseInfo.DRRCalim != null)
|
|
|
+ {
|
|
|
+ calValue = caseInfo.DRRCalim.diffRate;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (caseInfo.RFRFulltext != null && caseInfo.RFRAbstract != null)
|
|
|
+ {
|
|
|
+ calValue = caseInfo.RFRAll.diffRate;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (caseInfo.RFRCalim != null)
|
|
|
+ {
|
|
|
+ calValue = caseInfo.RFRCalim.diffRate;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ if (stage == 0)
|
|
|
+ {
|
|
|
+ if(caseInfo.DRRFulltext != null && caseInfo.DRRCalim!= null)
|
|
|
+ {
|
|
|
+ calValue = caseInfo.DRRCalim.TextSimilarity * 0.7 + caseInfo.DRRFulltext.TextSimilarity * 0.3;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if( caseInfo.DRRCalim != null)
|
|
|
+ {
|
|
|
+ calValue = caseInfo.DRRCalim.TextSimilarity;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(caseInfo.DRRAll != null)
|
|
|
+ {
|
|
|
+ calValue = caseInfo.DRRAll.TextSimilarity;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (caseInfo.RFRFulltext != null && caseInfo.RFRCalim != null)
|
|
|
+ {
|
|
|
+ calValue = caseInfo.RFRCalim.TextSimilarity * 0.7 + caseInfo.RFRFulltext.TextSimilarity * 0.3;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (caseInfo.RFRCalim != null)
|
|
|
+ {
|
|
|
+ calValue = caseInfo.RFRCalim.TextSimilarity;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (caseInfo.RFRAll != null)
|
|
|
+ {
|
|
|
+ calValue = caseInfo.RFRAll.TextSimilarity;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return calValue;
|
|
|
+ }
|
|
|
+
|
|
|
+ private string typeName(int type)
|
|
|
{
|
|
|
+ switch (type)
|
|
|
+ {
|
|
|
+ case 0:
|
|
|
+ return "文本相似度计算";
|
|
|
+ case 1:
|
|
|
+ return "字符修改计算";
|
|
|
+ case 2:
|
|
|
+ return "权要权重70说明书30";
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
+ public IList<Object> CalMean_Std(DateTime start,DateTime end)
|
|
|
+ {
|
|
|
double AverageA = Context.CaseInfos.Where<CaseInfo>(
|
|
|
p => p.FinalVersionDate >= start && p.FinalVersionDate <= end && p.DRRCalim!= null)
|
|
|
.Average(x=>x.DRRCalim.TextSimilarity);
|
|
@@ -289,7 +616,7 @@ namespace wispro.sp.api.Controllers
|
|
|
Reviewer = item.Reviewer,
|
|
|
Handlers = item.Handlers,
|
|
|
zScoreA = (item.DRRCalim?.TextSimilarity -AverageA)/stdA,
|
|
|
- zScoreB = (item.RFRAll?.TextSimilarity - AverageB) / stdB
|
|
|
+ zScoreB = (item.RFRAll?.TextSimilarity - AverageB) /stdB
|
|
|
}
|
|
|
);
|
|
|
}
|