Пример #1
0
        private static string f_GetElementParamValue(object value)
        {
            if (value == null)
            {
                return("");
            }

            Cl_ElementParam group = value as Cl_ElementParam;

            return(group.p_Value);
        }
        /// <summary>Добавление блока в формулу</summary>
        /// <param name="a_Block">Блок</param>
        /// <returns></returns>
        private bool f_AppendBlock(Cl_FormulaConditionBlock a_Block)
        {
            if (a_Block == null)
            {
                return(false);
            }

            if (a_Block.p_Object is string)
            {
                string txt = a_Block.p_Object.ToString();
                if (m_Blocks.Count < 2)
                {
                    return(false);
                }
                Cl_Element el = m_Blocks[m_Blocks.Count - 2].p_Object as Cl_Element;
                if (el == null || el.p_IsNumber)
                {
                    return(false);
                }
                Cl_ElementParam prm = el.p_NormValues.FirstOrDefault(val => val.p_Value == txt);
                if (prm != null)
                {
                    a_Block.p_Object = prm;
                }
                else
                {
                    prm = el.p_PatValues.FirstOrDefault(val => val.p_Value == txt);
                    if (prm != null)
                    {
                        a_Block.p_Object = prm;
                    }
                    else
                    {
                        return(false);
                    }
                }
            }

            string text = a_Block.f_GetTextFromBlock();

            if (string.IsNullOrWhiteSpace(text))
            {
                return(false);
            }
            ctrlRTBFormula.SelectionStart  = ctrlRTBFormula.TextLength;
            ctrlRTBFormula.SelectionLength = 0;
            ctrlRTBFormula.SelectionColor  = a_Block.f_GetColorBlock();
            ctrlRTBFormula.AppendText(text);
            ctrlRTBFormula.SelectionColor = ctrlRTBFormula.ForeColor;
            m_Blocks.Add(a_Block);
            return(true);
        }
        /// <summary>Получение блоков формулы отображения элемента</summary>
        /// <param name="a_Elements">Список элементов</param>
        /// <param name="a_Formula">Формула</param>
        public Cl_FormulaConditionBlock[] f_GetConditionsBlocks(Cl_Element[] a_Elements, string a_Formula)
        {
            string formula = a_Formula;
            var    blocks  = new List <Cl_FormulaConditionBlock>();

            while (!string.IsNullOrWhiteSpace(formula))
            {
                Cl_FormulaConditionBlock block = f_GetFirstConditionBlockFromText(a_Elements, formula);
                if (block != null)
                {
                    if (block.p_Object is string)
                    {
                        string txt = block.p_Object.ToString();
                        if (blocks.Count < 2)
                        {
                            return(null);
                        }
                        Cl_Element el = blocks[blocks.Count - 2].p_Object as Cl_Element;
                        if (el == null || el.p_IsNumber)
                        {
                            return(null);
                        }
                        if (el.p_Tag == "gender")
                        {
                            Cl_User.E_Sex gender;
                            if (Enum.TryParse(block.p_Object.ToString(), true, out gender))
                            {
                                block.p_Object = gender;
                            }
                            else
                            {
                                return(null);
                            }
                        }
                        else
                        {
                            Cl_ElementParam prm = el.p_NormValues.FirstOrDefault(val => val.p_Value == txt);
                            if (prm != null)
                            {
                                block.p_Object = prm;
                            }
                            else
                            {
                                prm = el.p_PatValues.FirstOrDefault(val => val.p_Value == txt);
                                if (prm != null)
                                {
                                    block.p_Object = prm;
                                }
                                else
                                {
                                    return(null);
                                }
                            }
                        }
                    }
                    blocks.Add(block);
                    string txtBlock = block.f_GetTextFromBlock();
                    formula = formula.Substring(txtBlock.Length);
                }
                else
                {
                    return(null);
                }
            }
            return(blocks.ToArray());
        }
        public void f_TestElementVisibleFromFormula()
        {
            //tag_one = "pat2"; tag_dva = 11; tag_tri = 5
            var record = new Cl_Record()
            {
                p_Title = "Тест проверки формул"
            };
            var medicalCard = new Cl_MedicalCard();

            medicalCard.p_PatientSex       = Core.Permision.Cl_User.E_Sex.Man;
            medicalCard.p_PatientDateBirth = new DateTime(1981, 4, 1);
            record.p_MedicalCard           = medicalCard;
            record.p_Values = new List <Cl_RecordValue>();

            var template = new Cl_Template()
            {
                p_Name = "Тест проверки формул", p_Type = Cl_Template.E_TemplateType.Template
            };
            var elements = new List <Cl_TemplateElement>();
            var element  = new Cl_Element()
            {
                p_ID   = 1,
                p_Name = "Формула 1",
                p_Tag  = "one"
            };

            element.p_ParamsValues = new List <Cl_ElementParam>();
            for (int i = 1; i < 4; i++)
            {
                element.p_ParamsValues.Add(new Cl_ElementParam()
                {
                    p_Element = element, p_TypeParam = Cl_ElementParam.E_TypeParam.NormValues, p_Value = "norm" + i.ToString()
                });
                var ep = new Cl_ElementParam()
                {
                    p_Element = element, p_TypeParam = Cl_ElementParam.E_TypeParam.PatValues, p_Value = "pat" + i.ToString()
                };
                if (i == 2)
                {
                    record.p_Values.Add(new Cl_RecordValue()
                    {
                        p_ElementID = element.p_ID,
                        p_Element   = element,
                        p_Params    = new List <Cl_RecordParam>()
                        {
                            new Cl_RecordParam()
                            {
                                p_ElementParam = ep
                            }
                        }
                    });
                }
                element.p_ParamsValues.Add(ep);
            }
            elements.Add(new Cl_TemplateElement()
            {
                p_Template = template, p_ChildElement = element, p_Index = 0
            });

            element = new Cl_Element()
            {
                p_ID          = 2,
                p_Name        = "Формула 2",
                p_Tag         = "dva",
                p_IsNumber    = true,
                p_NumberRound = 2
            };
            element.p_ParamsValues = new List <Cl_ElementParam>();
            for (int i = 1; i < 4; i++)
            {
                element.p_ParamsValues.Add(new Cl_ElementParam()
                {
                    p_Element = element, p_TypeParam = Cl_ElementParam.E_TypeParam.NormValues, p_Value = i.ToString()
                });
                element.p_ParamsValues.Add(new Cl_ElementParam()
                {
                    p_Element = element, p_TypeParam = Cl_ElementParam.E_TypeParam.PatValues, p_Value = i.ToString()
                });
            }
            record.p_Values.Add(new Cl_RecordValue()
            {
                p_ElementID = element.p_ID, p_Element = element, p_ValueUser = "******"
            });
            elements.Add(new Cl_TemplateElement()
            {
                p_Template = template, p_ChildElement = element, p_Index = 1
            });

            element = new Cl_Element()
            {
                p_ID          = 3,
                p_Name        = "Формула 3",
                p_Tag         = "tri",
                p_IsNumber    = true,
                p_NumberRound = 2
            };
            element.p_ParamsValues = new List <Cl_ElementParam>();
            for (int i = 1; i < 4; i++)
            {
                element.p_ParamsValues.Add(new Cl_ElementParam()
                {
                    p_Element = element, p_TypeParam = Cl_ElementParam.E_TypeParam.NormValues, p_Value = i.ToString()
                });
                element.p_ParamsValues.Add(new Cl_ElementParam()
                {
                    p_Element = element, p_TypeParam = Cl_ElementParam.E_TypeParam.PatValues, p_Value = i.ToString()
                });
            }
            record.p_Values.Add(new Cl_RecordValue()
            {
                p_ElementID = element.p_ID, p_Element = element, p_ValueUser = "******"
            });
            elements.Add(new Cl_TemplateElement()
            {
                p_Template = template, p_ChildElement = element, p_Index = 2
            });

            template.p_TemplateElements = elements;
            record.f_SetTemplate(template);

            bool actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_one = \"pat2\"");

            Assert.AreEqual(true, actual);
            actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_one = tag_one");
            Assert.AreEqual(true, actual);

            actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_dva > 10");
            Assert.AreEqual(true, actual);
            actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_dva < 15");
            Assert.AreEqual(true, actual);
            actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_dva = 11");
            Assert.AreEqual(true, actual);
            actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_dva > 14");
            Assert.AreEqual(false, actual);
            actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_dva < 11");
            Assert.AreEqual(false, actual);

            actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_one = \"pat2\" И tag_dva > 10 ИЛИ tag_tri = 3");
            Assert.AreEqual(true, actual);
            actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_one = \"pat2\" И tag_dva < 12 ИЛИ tag_tri = 3");
            Assert.AreEqual(true, actual);
            actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_one = \"pat2\" И tag_dva = 11 ИЛИ tag_tri = 3");
            Assert.AreEqual(true, actual);
            actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_one = \"pat2\" И tag_dva = 13 ИЛИ tag_tri = 5");
            Assert.AreEqual(true, actual);
            actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_one = \"pat2\" И tag_dva = 13 ИЛИ tag_tri > 4");
            Assert.AreEqual(true, actual);
            actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_one = \"pat2\" И tag_dva = 13 ИЛИ tag_tri < 6");
            Assert.AreEqual(true, actual);
            actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_one = \"pat2\" И tag_dva = 13 ИЛИ tag_tri < tag_dva");
            Assert.AreEqual(true, actual);

            actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_one = \"pat2\" И tag_dva = 13 ИЛИ tag_tri > tag_dva");
            Assert.AreEqual(false, actual);
            actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_one = \"pat2\" И tag_dva = 13 ИЛИ tag_tri = 6");
            Assert.AreEqual(false, actual);
            actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_one = \"pat2\" И tag_dva = 13");
            Assert.AreEqual(false, actual);
            actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_one = \"pat2\" И tag_dva > 11");
            Assert.AreEqual(false, actual);
            actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_one = \"pat2\" И tag_dva < 11");
            Assert.AreEqual(false, actual);
            actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_one = \"pat3\" И tag_dva = 11");
            Assert.AreEqual(false, actual);
            actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_one = \"\" И tag_dva = 11");
            Assert.AreEqual(false, actual);

            actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_gender = man И tag_age > 10");
            Assert.AreEqual(true, actual);
            actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_gender = man И tag_age > 40");
            Assert.AreEqual(false, actual);
            actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_gender = female И tag_age > 10");
            Assert.AreEqual(false, actual);
            actual = Cl_RecordsFacade.f_GetInstance().f_GetElementVisible(record, "tag_gender = female");
            Assert.AreEqual(false, actual);
        }