コード例 #1
0
        public List <UserDimensionScoreModel <decimal> > GetUsersDimensionScore(HttpContext context)
        {
            var grID           = Convert.ToInt32(Common.GetRequest("grID"));
            var amountCode     = "";
            var listStr        = MgrServices.GroupReportService.GetUserIDListAndAmountCode(grID); //根据GR_ID得到用户ID集合和量表Code
            var userIDListTemp = listStr[1];                                                      //用户ID集合字符串临时变量
            var ansIDListTemp  = listStr[2];

            amountCode = listStr[0];                                                                             //量表Code
            string[]      userIDListArray = userIDListTemp.Split(',');                                           //将用户ID集合字符串分割成用户ID数组
            string[]      ansIDListArray  = ansIDListTemp.Split(',');
            List <string> dimension       = MgrServices.GroupReportService.GetDimensionByAmountCode(amountCode); //根据量表Code得到维度
            List <UserDimensionScoreModel <decimal> > lus = new List <UserDimensionScoreModel <decimal> >();     //记录用户维度分数集合

            for (int i = 0; i < userIDListArray.Length; i++)
            {
                UserDimensionScoreModel <decimal> uds = new UserDimensionScoreModel <decimal>();
                if (!string.IsNullOrEmpty(userIDListArray[i]))
                {
                    var score = MgrServices.GroupReportService.GetScoreByAnswerID(Convert.ToInt32(Convert.ToInt32(ansIDListArray[i]))); //根据用户ID,量表Code得到答题记录
                    Dictionary <string, decimal> dimensionScore = new Dictionary <string, decimal>();                                   //记录录用户维度分数
                    dimensionScore.Add(dimension[0], score);
                    uds.DimensionAndScore = dimensionScore;
                    uds.UserID            = Convert.ToInt32(userIDListArray[i]);
                    var userBirth        = Convert.ToDateTime(MgrServices.UserAddService.GetEntitys(Convert.ToInt32(userIDListArray[i]))._u_birthday);
                    var reportCreateTime = MgrServices.DistributeRecordService.GetAnswerAddEntity(Convert.ToInt32(ansIDListArray[i]))._answer_createtime;
                    uds.UserAge = Common.CalculateAgeCorrect(userBirth, reportCreateTime);
                    lus.Add(uds);
                }
            }
            return(lus);
        }
コード例 #2
0
        public List <UserDimensionScoreModel <decimal> > GetUsersDimensionScore(HttpContext context)
        {
            var grID           = Convert.ToInt32(Common.GetRequest("grID"));
            var amountCode     = "";
            var listStr        = MgrServices.GroupReportService.GetUserIDListAndAmountCode(grID); //根据GR_ID得到用户ID集合和量表Code
            var userIDListTemp = listStr[1];                                                      //用户ID集合字符串临时变量
            var ansIDListTemp  = listStr[2];

            amountCode = listStr[0];                                                                                                                                      //量表Code
            string[]      userIDListArray = userIDListTemp.Split(',');                                                                                                    //将用户ID集合字符串分割成用户ID数组
            string[]      ansIDListArray  = ansIDListTemp.Split(',');
            List <string> dimension       = MgrServices.GroupReportService.GetDimensionByAmountCode(amountCode).Where(m => m.ToString() != "WD_14810164599358").ToList(); //根据量表Code得到维度
            List <UserDimensionScoreModel <decimal> > lus = new List <UserDimensionScoreModel <decimal> >();                                                              //记录用户维度分数集合

            for (int i = 0; i < userIDListArray.Length; i++)
            {
                UserDimensionScoreModel <decimal> uds = new UserDimensionScoreModel <decimal>();
                if (!string.IsNullOrEmpty(userIDListArray[i]))
                {
                    var answerRecord = MgrServices.GroupReportService.GetAnswerAddRecord(Convert.ToInt32(userIDListArray[i]), Convert.ToInt32(ansIDListArray[i]), amountCode); //根据用户ID,量表Code得到答题记录
                    Dictionary <string, string>  answerRecordDic = JsonConvert.DeserializeObject <Dictionary <string, string> >(answerRecord);                                 //将用户答题记录json字符串反序列为字典项键值对
                    Dictionary <string, decimal> dimensionScore  = new Dictionary <string, decimal>();                                                                         //记录录用户维度分数
                    for (int j = 0; j < dimension.Count; j++)
                    {
                        var           score        = 0;                                                                          //记录维度总分变量
                        var           scoreStr     = "";                                                                         //记录启用公式的维度公式算法变量
                        Calculate     cal          = new Calculate();
                        var           subjectCodes = MgrServices.GroupReportService.GetSubjectCodeByDimensionCode(dimension[j]); //根据维度获取题干Code
                        StringBuilder sb           = new StringBuilder();
                        sb.Append("(");
                        foreach (var item in answerRecordDic)
                        {
                            //判断出当前所有题干属于当前维度Code的题干

                            if (subjectCodes.Contains(item.Key))
                            {
                                sb.Append("'");
                                sb.Append(item.Value);
                                sb.Append("'");
                                sb.Append(",");
                            }
                        }
                        sb.Remove(sb.Length - 1, 1);
                        sb.Append(")");
                        score = Convert.ToInt32(MgrServices.GroupReportService.GetSingleScoreBySbjCodeAndOptCode(sb.ToString()));//分数累加

                        //判断是否启用公式计算
                        if (MgrServices.GroupReportService.GetScoreModel(dimension[j]) > 0)
                        {
                            scoreStr = MgrServices.GroupReportService.GetFormulaStrByDimensionCode(dimension[j]).Replace("Score", score.ToString());//将公式中的Score替换成总分
                            decimal        result;
                            Queue <string> qs = cal.SplitExpress(scoreStr);
                            List <string>  ls = cal.InorderToPostorder(qs);
                            cal.IsResult(ls, out result);
                            scoreStr = result.ToString();
                        }

                        if (!string.IsNullOrEmpty(scoreStr))
                        {
                            dimensionScore.Add(dimension[j], Convert.ToDecimal(scoreStr));
                        }
                        else
                        {
                            dimensionScore.Add(dimension[j], score);
                        }
                    }
                    uds.DimensionAndScore = dimensionScore;
                    uds.UserID            = Convert.ToInt32(userIDListArray[i]);
                    var userBirth        = Convert.ToDateTime(MgrServices.UserAddService.GetEntitys(Convert.ToInt32(userIDListArray[i]))._u_birthday);
                    var reportCreateTime = MgrServices.DistributeRecordService.GetAnswerAddEntity(Convert.ToInt32(ansIDListArray[i]))._answer_createtime;
                    //瑞文年龄计算代码
                    //if (amountCode == "LB_14814373314360")
                    //{
                    //    uds.UserAge = Common.CalculateAgeCorrectRW(userBirth, reportCreateTime);
                    //}
                    uds.UserAge = Common.CalculateAgeCorrect(userBirth, reportCreateTime);
                    lus.Add(uds);
                }
            }
            return(lus);
        }
コード例 #3
0
        public void InitiAverageStateTable(HttpContext context)
        {
            var grID = Convert.ToInt32(Common.GetRequest("grID"));

            lus = context.Session["UserDimensionScore_Autistic"] as List <UserDimensionScoreModel <string> >;
            if (lus == null)
            {
                lus = GetUsersDimensionScore(grID);//得到用户各维度分数(可能会含有四则运算的表达式)
                context.Session["UserDimensionScore_Autistic"] = lus;
            }
            List <UserDimensionScoreModel <string> > tranUsersDimensionScore = new List <UserDimensionScoreModel <string> >(); //声明使用四则运算的算法转化后的用户维度分数
            Dictionary <string, string> dimensionName          = new Dictionary <string, string>();                            //维度Code和维度名称
            Dictionary <string, string> explainName            = null;                                                         //维度Code和维度解释
            Dictionary <string, string> dimensionAverage       = new Dictionary <string, string>();                            //维度分数平均分
            Dictionary <string, string> dimensionMaxNum        = new Dictionary <string, string>();                            //维度分数最大值
            Dictionary <string, string> dimensionMinNum        = new Dictionary <string, string>();                            //维度分数最小值
            Dictionary <string, string> dimensionStandardMinus = new Dictionary <string, string>();                            //维度分数标准差
            Calculate cal = new Calculate();

            StringBuilder sb = new StringBuilder();//拼接维度Code字符串

            sb.Append("(");
            //获取维度Code和维度名称----维度Code和维度介绍字典项
            foreach (var item in lus[0].DimensionAndScore)
            {
                dimensionName.Add(item.Key, lus[0].DimensionName[item.Key]);
                sb.Append("'");
                sb.Append(item);
                sb.Append("'");
                sb.Append(",");
            }
            sb.Remove(sb.Length - 1, 1);
            sb.Append(")");

            explainName = MgrServices.GroupReportService.GetNormExplainByDimensionCodeList(sb.ToString());

            //将用户维度分数使用四则运算进行转化
            for (int i = 0; i < lus.Count; i++)
            {
                UserDimensionScoreModel <string> tranDimensionScoreModel = new UserDimensionScoreModel <string>();
                Dictionary <string, string>      tranDimensionScore      = new Dictionary <string, string>();
                foreach (var item in lus[i].DimensionAndScore)
                {
                    decimal        result;
                    Queue <string> qs = cal.SplitExpress(item.Value);

                    List <string> ls = cal.InorderToPostorder(qs);
                    cal.IsResult(ls, out result);
                    //瑞文量表代码
                    //if (amountCode == "LB_14814373314360")
                    //{
                    //    var tempTable = MgrServices.StatisticalService.GetAnalyBaseTemp("TSLBRW");
                    //    var referString = tempTable.Rows[0]["AnalyBaseMark"].ToString();
                    //    var referTable = JsonConvert.DeserializeObject<List<RWModel>>(referString);
                    //    for (int j = 0; j < referTable.Count; j++)
                    //    {
                    //        if(lus[i].UserAge>=17)
                    //        {
                    //            var tempReferList = referTable.Where(m=>m.ZZB==lus[i].UserAge).ToList();
                    //            for (int k = 0; k < tempReferList.Count; k++)
                    //            {


                    //            }
                    //        }
                    //    }
                    //}
                    if (amountCode == "LB_14809953564280" || amountCode == "LB_14809270976120" || amountCode == "LB_14810979035220")
                    {
                        tranDimensionScore.Add(item.Key, Math.Floor(result).ToString());
                    }
                    else
                    {
                        tranDimensionScore.Add(item.Key, Math.Round(result, 2).ToString());
                    }
                }
                tranDimensionScoreModel.DimensionAndScore = tranDimensionScore;
                tranDimensionScoreModel.UserID            = lus[i].UserID;
                tranUsersDimensionScore.Add(tranDimensionScoreModel);
            }
            //求平均值、最大值、最小值
            foreach (var item in tranUsersDimensionScore[0].DimensionAndScore)
            {
                decimal average    = 0;
                decimal maxNum     = Convert.ToDecimal(item.Value);
                decimal minNum     = Convert.ToDecimal(item.Value);
                decimal totalScore = Convert.ToDecimal(item.Value);
                for (int i = 1; i < tranUsersDimensionScore.Count; i++)
                {
                    foreach (var itemK in tranUsersDimensionScore[i].DimensionAndScore)
                    {
                        if (item.Key == itemK.Key)
                        {
                            totalScore += Convert.ToDecimal(itemK.Value);
                            if (maxNum < Convert.ToDecimal(itemK.Value))
                            {
                                maxNum = Convert.ToDecimal(itemK.Value);
                            }
                            if (minNum > Convert.ToDecimal(itemK.Value))
                            {
                                minNum = Convert.ToDecimal(itemK.Value);
                            }
                        }
                    }
                }

                average = Math.Round((decimal)totalScore / tranUsersDimensionScore.Count, 2, MidpointRounding.AwayFromZero);
                dimensionAverage.Add(item.Key, average.ToString());
                dimensionMaxNum.Add(item.Key, maxNum.ToString());
                dimensionMinNum.Add(item.Key, minNum.ToString());
            }
            //求标准差
            foreach (var item in dimensionAverage)
            {
                decimal scoreCount    = 0;
                decimal standardMinus = 0;
                for (int i = 0; i < tranUsersDimensionScore.Count; i++)
                {
                    foreach (var itemK in tranUsersDimensionScore[i].DimensionAndScore)
                    {
                        if (item.Key == itemK.Key)
                        {
                            scoreCount += (Convert.ToDecimal(item.Value) - Convert.ToDecimal(itemK.Value)) * (Convert.ToDecimal(item.Value) - Convert.ToDecimal(itemK.Value));
                        }
                    }
                }
                double result = Convert.ToDouble(scoreCount / tranUsersDimensionScore.Count);
                standardMinus = Math.Round(Convert.ToDecimal(Math.Sqrt(result)), 2, MidpointRounding.AwayFromZero);
                dimensionStandardMinus.Add(item.Key, standardMinus.ToString());
            }
            var           htmlContent = "";
            List <string> detailTable = new List <string>();

            foreach (var item in dimensionName)
            {
                detailTable.Add(item.Value);
                detailTable.Add(dimensionAverage[item.Key]);
                detailTable.Add(dimensionStandardMinus[item.Key]);
                detailTable.Add(dimensionMaxNum[item.Key]);
                detailTable.Add(dimensionMinNum[item.Key]);
                htmlContent += "<tr><td>" + item.Value + "</td><td>" + dimensionAverage[item.Key] + "</td><td>" + dimensionStandardMinus[item.Key] + "</td><td>" + dimensionMaxNum[item.Key] + "</td><td>" + dimensionMinNum[item.Key] + "</td></tr>";
            }
            context.Session["DetailTable"] = detailTable;
            //AverageState;Model am = new AverageStateModel()
            //{
            //    DimensionAverage = dimensionAverage,
            //    DimensionMaxNum = dimensionMaxNum,
            //    DimensionMinNum = dimensionMinNum,
            //    DimensionName = dimensionName,
            //    DimensionStandardMinus = dimensionStandardMinus,
            //    ExplainName = explainName,
            //    GrgodicCount =dimensionAverage.Count
            //};
            var    signCount = 0;
            string strCate   = "";

            foreach (var item in dimensionName)
            {
                signCount++;
                if (signCount == dimensionName.Count)
                {
                    strCate += item.Value;
                }
                else
                {
                    strCate += item.Value + ",";
                }
            }
            List <Decimal> ld = new List <decimal>();

            foreach (var item in dimensionAverage)
            {
                ld.Add(Convert.ToDecimal(item.Value));
            }
            AverageScoreChartModel asc = new AverageScoreChartModel();

            asc.name = strCate;
            asc.data = ld;
            context.Session["DimensionName"]          = dimensionName;
            context.Session["AverageScoreChartModel"] = asc;
            context.Response.Write(htmlContent);
        }
コード例 #4
0
        public List <UserDimensionScoreModel <string> > GetUsersDimensionScore(int grID)
        {
            var listStr = MgrServices.GroupReportService.GetUserIDListAndAmountCode(grID);//根据GR_ID得到用户ID集合和量表Code

            #region 声明变量

            string userIDListTemp;                                                                                     //用户ID集合,字符串
            string ansIDListTemp;                                                                                      //作答记录ID集合,字符串
            Dictionary <string, DataRow>        answerRecordListDic = null;                                            //实际作答记录字典, key:用户ID,value:数据行(作答记录ID,实际作答Json,创建时间,用户ID,用户年龄)
            Dictionary <string, string>         dimension;                                                             //维度集合
            Dictionary <string, List <string> > dimension_subjectCodesDic = new Dictionary <string, List <string> >(); //维度_题干集合字典
            Dictionary <string, string>         formulaStrDic;                                                         //公式字典:key:维度,value:公式字符串
            Dictionary <string, int>            scoreDic;                                                              //分数字典: key:题支,value:题支分数

            #endregion
            #region 第一步实现

            userIDListTemp = listStr[1]; //用户ID集合字符串临时变量
            ansIDListTemp  = listStr[2]; //作答记录ID集合字符串临时变量
            if (userIDListTemp[userIDListTemp.Length - 1] == ',')
            {
                userIDListTemp = userIDListTemp.Remove(userIDListTemp.Length - 1);
            }
            if (ansIDListTemp[ansIDListTemp.Length - 1] == ',')
            {
                ansIDListTemp = ansIDListTemp.Remove(ansIDListTemp.Length - 1);
            }

            amountCode = listStr[0];                              //量表Code
            string[] userIDListArray = userIDListTemp.Split(','); //将用户ID集合字符串分割成用户ID数组
            string[] ansIDListArray  = ansIDListTemp.Split(',');  //作答记录ID数组,与用户一一对应
            #endregion

            var maxScoreOptionArray = new string[] { "TZ_148111893927314", "TZ_148111893927824", "TZ_148111893928134", "TZ_148111893928444", "TZ_148111893928854", "TZ_148111893929164", "TZ_148111893929474", "TZ_148111893929884", "TZ_148111893930094", "TZ_1481118939303104", "TZ_1481118939307114", "TZ_1481118939311124", "TZ_1481118939314134", "TZ_1481118939317144", "TZ_1481118939320154" };
            #region 第二步实现
            System.Data.DataTable answerRecordTable = MgrServices.GroupReportService.GetAnswerAddRecordByAnsIDList(enterpriseCode, "(" + ansIDListTemp + ")");


            answerRecordListDic = answerRecordTable.AsEnumerable().Select(x => new { AnswerID = x["AnswerAdd_ID"].ToString(), DataRow = x })
                                  .ToDictionary(k => k.AnswerID, v => v.DataRow);//获取实际作答记录字典, key:用户ID,value:数据行(作答记录ID,实际作答Json,创建时间,用户ID,用户年龄)
            #endregion
            #region 第三步实现

            dimension = MgrServices.GroupReportService.GetDimensionByAmountCode_Name(amountCode).Where(m => m.Key != "WD_14810164599358").ToDictionary(x => x.Key, v => v.Value);//根据量表Code得到维度

            StringBuilder dimensionList = new StringBuilder();
            #region 组装维度List字符串
            dimensionList.Append("(");
            foreach (var item in dimension.Keys)
            {
                dimensionList.Append("'");
                dimensionList.Append(item);
                dimensionList.Append("'");
                dimensionList.Append(",");
            }
            dimensionList.Remove(dimensionList.Length - 1, 1);
            dimensionList.Append(")");

            #endregion

            System.Data.DataTable temp = MgrServices.GroupReportService.GetSubjectCodeByDimensionCodeList(dimensionList.ToString());//根据维度List获取题干Code集合

            foreach (var item in dimension.Keys)
            {
                dimension_subjectCodesDic[item] = temp.AsEnumerable().Where(x => x["DimensionCode"].ToString() == item).Select(x => x["SubjectCode"].ToString()).ToList();
            }

            System.Data.DataTable formulaStrTable = MgrServices.GroupReportService.GetFormulaStrByDimensionCodeList(dimensionList.ToString());

            formulaStrDic = formulaStrTable.AsEnumerable().Select(x => new { DimensionCode = x["DimensionCode"].ToString(), FormulaStr = x["FormulaStr"].ToString() })
                            .ToDictionary(k => k.DimensionCode, v => v.FormulaStr);//获取该量表下所有有公式的维度,key:维度code ;value:公式字符串

            System.Data.DataTable scoreTable = MgrServices.GroupReportService.GetScoreTableByAmount_Code(amountCode);

            scoreDic = scoreTable.AsEnumerable().Select(x => new { OperationCode = x["OperationCode"].ToString(), OperationFraction = x["OperationFraction"].ToString() })
                       .ToDictionary(k => k.OperationCode, v => int.Parse(v.OperationFraction));//获取该量表下所有题支的分数,key:题支code ;value:题支分数
            #endregion

            List <UserDimensionScoreModel <string> > lus = new List <UserDimensionScoreModel <string> >();//记录用户维度分数集合
            for (int i = 0; i < userIDListArray.Length; i++)
            {
                UserDimensionScoreModel <string> uds = new UserDimensionScoreModel <string>();
                var tempCount = 0;
                if (!string.IsNullOrEmpty(userIDListArray[i]))
                {
                    Dictionary <string, string> answerRecordDic = JsonConvert.DeserializeObject <Dictionary <string, string> >(answerRecordListDic[ansIDListArray[i]]["AnswerAdd_Record"].ToString()); //将用户答题记录json字符串反序列为字典项键值对
                    Dictionary <string, string> dimensionScore  = new Dictionary <string, string>();                                                                                                   //记录录用户维度分数
                    Dictionary <string, string> dimensionName   = new Dictionary <string, string>();                                                                                                   //记录维度名称
                    foreach (var dimensionKey in dimension.Keys)
                    {
                        var score        = 0;                                       //记录维度总分变量
                        var scoreStr     = "";                                      //记录启用公式的维度公式算法变量
                        var subjectCodes = dimension_subjectCodesDic[dimensionKey]; //根据维度获取题干Code

                        StringBuilder sb = new StringBuilder();
                        sb.Append("(");
                        foreach (var item in answerRecordDic)
                        {
                            //判断出当前所有题干属于当前维度Code的题干

                            if (subjectCodes.Contains(item.Key))
                            {
                                score += scoreDic[item.Value];
                            }
                            if (maxScoreOptionArray.Contains(item.Value))
                            {
                                tempCount++;
                            }
                        }

                        uds.MaxScoreOptionCount = tempCount;
                        //判断是否启用公式计算
                        if (formulaStrDic.Keys.Contains(dimensionKey))
                        {
                            scoreStr = formulaStrDic[dimensionKey].Replace("Score", score.ToString());//将公式中的Score替换成总分
                        }
                        if (!string.IsNullOrEmpty(scoreStr))
                        {
                            dimensionScore.Add(dimensionKey, scoreStr);
                        }
                        else
                        {
                            dimensionScore.Add(dimensionKey, score.ToString());
                        }
                        dimensionName.Add(dimensionKey, dimension[dimensionKey]);
                    }
                    if (amountCode == "LB_14811056565390")
                    {
                        var tempScore = Convert.ToDecimal(dimensionScore["WD_14811065403903"]) - Convert.ToDecimal(dimensionScore["WD_14811065528432"]) + Convert.ToDecimal(dimensionScore["WD_14811067041457"]) - Convert.ToDecimal(dimensionScore["WD_14811067223797"]);
                        dimensionScore["WD_14878397969252"] = tempScore.ToString();
                    }
                    if (amountCode == "LB_14808297050440")
                    {
                        var tempScore = 15 + 2 * Convert.ToDecimal(dimensionScore["WD_14808306722554"]) + 3 * Convert.ToDecimal(dimensionScore["WD_14808307493593"]) - Convert.ToDecimal(dimensionScore["WD_14808307873796"]) + 5 * Convert.ToDecimal(dimensionScore["WD_14808308367415"]) - Convert.ToDecimal(dimensionScore["WD_14808308810653"]);
                        dimensionScore["WD_14808306500643"] = tempScore.ToString();
                    }
                    uds.DimensionAndScore = dimensionScore;
                    uds.DimensionName     = dimensionName;
                    uds.UserID            = Convert.ToInt32(userIDListArray[i]);

                    var userBirth        = Convert.ToDateTime(answerRecordListDic[ansIDListArray[i]]["U_Birthday"].ToString());
                    var reportCreateTime = Convert.ToDateTime(answerRecordListDic[ansIDListArray[i]]["Answer_CreateTime"].ToString());
                    //瑞文年龄计算代码
                    //if (amountCode == "LB_14814373314360")
                    //{
                    //    uds.UserAge = Common.CalculateAgeCorrectRW(userBirth, reportCreateTime);
                    //}
                    uds.UserAge = Common.CalculateAgeCorrect(userBirth, reportCreateTime);
                    uds.UserSex = answerRecordListDic[ansIDListArray[i]]["U_Sex"].ToString();
                    lus.Add(uds);
                }
            }
            return(lus);
        }