4e06bf62 by lihua

提交规范校验规则

1 parent 79dca67c
...@@ -288,8 +288,8 @@ const getMsgCnt = () => { ...@@ -288,8 +288,8 @@ const getMsgCnt = () => {
288 } 288 }
289 289
290 onMounted(() => { 290 onMounted(() => {
291 getMsgCnt(); 291 //getMsgCnt();
292 createServerConnect(); 292 //createServerConnect();
293 }); 293 });
294 294
295 </script> 295 </script>
......
...@@ -129,6 +129,27 @@ watch(() => props.largeCategoryList, (val) => { ...@@ -129,6 +129,27 @@ watch(() => props.largeCategoryList, (val) => {
129 /** 规范性检验规则 */ 129 /** 规范性检验规则 */
130 const checkRulesList: any = ref([]); 130 const checkRulesList: any = ref([]);
131 131
132 /** 根据不同的数据类型显示对应的规则 */
133 const rulesListByType: any = computed(() => {
134 if (!checkRulesList.value.length) {
135 return {};
136 }
137 return {
138 char: checkRulesList.value.filter(r => r.paramValue == 'length_rule' || r.paramValue == 'ch_rule' || r.paramValue == 'en_rule' || r.paramValue == 'num_value_rule' || r.paramValue == 'custom_regular_rule'),
139 varchar: checkRulesList.value.filter(r => r.paramValue == 'length_rule' || r.paramValue == 'id_card_rule' || r.paramValue == 'phone_number_rule' || r.paramValue == 'ch_rule' || r.paramValue == 'en_rule' || r.paramValue == 'num_value_rule' || r.paramValue == 'custom_regular_rule'),
140 int: checkRulesList.value.filter(r => r.paramValue == 'length_rule' || r.paramValue == 'num_value_rule' || r.paramValue == 'custom_regular_rule'),
141 date: checkRulesList.value.filter(r => r.paramValue == 'date_format_rule' || r.paramValue == 'custom_regular_rule'),
142 datetime: checkRulesList.value.filter(r => r.paramValue == 'date_format_rule' || r.paramValue == 'custom_regular_rule'),
143 timestamp: checkRulesList.value.filter(r => r.paramValue == 'custom_regular_rule' || r.paramValue == 'custom_regular_rule'),
144 // text: checkRulesList.value.filter(r => r.paramValue == ''),
145 decimal: checkRulesList.value.filter(r => r.paramValue == 'length_rule' || r.paramValue == 'precision_rule' || r.paramValue == 'num_value_rule' || r.paramValue == 'custom_regular_rule'),
146 // json: checkRulesList.value.filter(r => r.paramValue == ''),
147 tinyint: checkRulesList.value.filter(r => r.paramValue == 'length_rule' || r.paramValue == 'num_value_rule' || r.paramValue == 'custom_regular_rule'),
148 time: checkRulesList.value.filter(r => r.paramValue == 'custom_regular_rule'),
149 bit: checkRulesList.value.filter(r => r.paramValue == 'ch_rule' || r.paramValue == 'en_rule' || r.paramValue == 'custom_regular_rule'),
150 }
151 });
152
132 onBeforeMount(() => { 153 onBeforeMount(() => {
133 if (props.ruleTypeList?.length) { 154 if (props.ruleTypeList?.length) {
134 if (props.ruleTypeValue) { 155 if (props.ruleTypeValue) {
...@@ -166,6 +187,7 @@ onBeforeMount(() => { ...@@ -166,6 +187,7 @@ onBeforeMount(() => {
166 getCheckRulesList().then((res: any) => { 187 getCheckRulesList().then((res: any) => {
167 if (res.code == proxy.$passCode) { 188 if (res.code == proxy.$passCode) {
168 checkRulesList.value = res.data || []; 189 checkRulesList.value = res.data || [];
190
169 } else { 191 } else {
170 ElMessage.error(res.msg); 192 ElMessage.error(res.msg);
171 } 193 }
...@@ -766,7 +788,7 @@ const formBtnClick = (btn) => { ...@@ -766,7 +788,7 @@ const formBtnClick = (btn) => {
766 normCheckDialogVisible.value = true; 788 normCheckDialogVisible.value = true;
767 tableListInfo.value.data = props.toSubjectTables; 789 tableListInfo.value.data = props.toSubjectTables;
768 dialogSelectSubjectTable.value = props.toSubjectTables[0]; 790 dialogSelectSubjectTable.value = props.toSubjectTables[0];
769 let defaultValue = panelList.value[12].defaultValue; 791 let defaultValue = panelList.value[14].defaultValue;
770 normCheckTableListData.value[dialogSelectSubjectTable.value.enName] = []; 792 normCheckTableListData.value[dialogSelectSubjectTable.value.enName] = [];
771 if (props.toSubjectTables[0]?.guid) { 793 if (props.toSubjectTables[0]?.guid) {
772 normCheckTableListLoading.value[dialogSelectSubjectTable.value.enName] = true; 794 normCheckTableListLoading.value[dialogSelectSubjectTable.value.enName] = true;
...@@ -781,7 +803,14 @@ const formBtnClick = (btn) => { ...@@ -781,7 +803,14 @@ const formBtnClick = (btn) => {
781 let fIndex = data.findIndex(d => d.enName == field.enName); 803 let fIndex = data.findIndex(d => d.enName == field.enName);
782 if (fIndex > -1) { 804 if (fIndex > -1) {
783 let f = normCheckTableListData.value[dialogSelectSubjectTable.value.enName][fIndex]; 805 let f = normCheckTableListData.value[dialogSelectSubjectTable.value.enName][fIndex];
784 Object.assign(f, field); 806 f.checkRule = field.checkRule;
807 f.configValue = field.configValue;
808 if (f.checkRule == 'length_rule') {
809 let vSplit = f.configValue.split('#');
810 f.operator = vSplit[0];
811 f.value = vSplit[1];
812 f.value1 = vSplit[2];
813 }
785 } 814 }
786 }); 815 });
787 } 816 }
...@@ -938,6 +967,22 @@ const setPanelListValue = (item, isSelectChange = false, init = false, radioGrou ...@@ -938,6 +967,22 @@ const setPanelListValue = (item, isSelectChange = false, init = false, radioGrou
938 p.default = ''; 967 p.default = '';
939 p.defaultValue = {}; 968 p.defaultValue = {};
940 } 969 }
970 } else if (ruleCode == 'norm_check' && p.field == 'ruleSettings-norm-check') {
971 if (!init) {
972 p.default = val[field];
973 return;
974 }
975 if (val.ruleField?.length) {
976 p.default = val.ruleField?.map(f => f.enName)?.join(';');
977 let ruleFields = {};
978 ruleFields[val.subjectName] = val.ruleField || [];
979 p.defaultValue = {
980 ruleFields: ruleFields
981 }
982 } else {
983 p.default = '';
984 p.defaultValue = {};
985 }
941 } else if (p.field == 'largeCategory') { 986 } else if (p.field == 'largeCategory') {
942 /** 此处有歧义,若是切换规则类型,修改默认值,可能会出现,用户先修改了规则大类,但是切换类型之后,被我还原了。 */ 987 /** 此处有歧义,若是切换规则类型,修改默认值,可能会出现,用户先修改了规则大类,但是切换类型之后,被我还原了。 */
943 if (radioGroupChange && !init) { 988 if (radioGroupChange && !init) {
...@@ -1127,6 +1172,42 @@ const listItemClick = (data) => { ...@@ -1127,6 +1172,42 @@ const listItemClick = (data) => {
1127 ElMessage.error(res.msg); 1172 ElMessage.error(res.msg);
1128 } 1173 }
1129 }) 1174 })
1175 } else if (ruleType.value == 'norm_check') {
1176 if (normCheckTableListData.value[dialogSelectSubjectTable.value.enName]?.length) {
1177 return;
1178 }
1179 let defaultValue = panelList.value[14].defaultValue;
1180 normCheckTableListLoading.value[dialogSelectSubjectTable.value.enName] = true;
1181 getSubjectFields(data.guid).then((res: any) => {
1182 normCheckTableListLoading.value[dialogSelectSubjectTable.value.enName] = false;
1183 if (res.code == proxy.$passCode) {
1184 let data = res.data || [];
1185 normCheckTableListData.value[dialogSelectSubjectTable.value.enName] = data;
1186 let valueFields = defaultValue.ruleFields?.[dialogSelectSubjectTable.value.enName] || [];
1187 if (valueFields.length) {
1188 valueFields.forEach(field => {
1189 let fIndex = data.findIndex(d => d.enName == field.enName);
1190 if (fIndex > -1) {
1191 let f = normCheckTableListData.value[dialogSelectSubjectTable.value.enName][fIndex];
1192 if (field.checkRule) {
1193 f.checkRule = field.dataRange;
1194 f.configValue = field.configValue;
1195 if (field.checkRule == 'length_rule') {
1196 let vLen = f.configValue?.split('#');
1197 if (vLen?.length > 1) {
1198 f.operator = vLen[0];
1199 f.value = vLen[1];
1200 f.value1 = vLen[2]
1201 }
1202 }
1203 }
1204 }
1205 });
1206 }
1207 } else {
1208 ElMessage.error(res.msg);
1209 }
1210 })
1130 } 1211 }
1131 } 1212 }
1132 1213
...@@ -1634,6 +1715,8 @@ const valueRangeTableListLoading = ref({}); ...@@ -1634,6 +1715,8 @@ const valueRangeTableListLoading = ref({});
1634 1715
1635 const valueRangeTableListData = ref({}); 1716 const valueRangeTableListData = ref({});
1636 1717
1718 const valueCheckFormListRef = ref();
1719
1637 const cancelValueRangeDialog = () => { 1720 const cancelValueRangeDialog = () => {
1638 valueRangeDialogVisible.value = false; 1721 valueRangeDialogVisible.value = false;
1639 } 1722 }
...@@ -1649,26 +1732,27 @@ const submitValueRange = () => { ...@@ -1649,26 +1732,27 @@ const submitValueRange = () => {
1649 let ruleFields: any = [] 1732 let ruleFields: any = []
1650 for (const field of valueTableFields) { 1733 for (const field of valueTableFields) {
1651 if (field.startValue != null && field.endValue == null || (field.endValue != null && field.startValue == null)) { 1734 if (field.startValue != null && field.endValue == null || (field.endValue != null && field.startValue == null)) {
1735 if (dialogSelectSubjectTable.value.enName != table) {
1736 valueCheckFormListRef.value.setSelectList(table, 'enName');
1737 }
1652 ElMessage.error(`表【${table}】的字段【${field.enName}】设置了值域,但范围未填写完整`); 1738 ElMessage.error(`表【${table}】的字段【${field.enName}】设置了值域,但范围未填写完整`);
1653 return; 1739 return;
1654 } 1740 }
1655 if (field.startValue) { 1741 if (field.startValue) {
1656 ruleFields.push(field); 1742 ruleFields.push(field);
1657 } 1743 } else if (field.dataRange) {
1658 if (field.dataRange) {
1659 ruleFields.push(field); 1744 ruleFields.push(field);
1660 } 1745 } else if (field.dateValueRange?.length > 0) {
1661 if (field.dateValueRange?.length > 0) {
1662 field.startValue = field.dateValueRange[0]; 1746 field.startValue = field.dateValueRange[0];
1663 field.endValue = field.dateValueRange[1]; 1747 field.endValue = field.dateValueRange[1];
1664 ruleFields.push(field); 1748 ruleFields.push(field);
1665 } 1749 }
1750 }
1666 if (ruleFields.length) { 1751 if (ruleFields.length) {
1667 v.push(table); 1752 v.push(table);
1668 ruleFieldsJson[table] = ruleFields; 1753 ruleFieldsJson[table] = ruleFields;
1669 } 1754 }
1670 } 1755 }
1671 }
1672 if (!v.length) { 1756 if (!v.length) {
1673 ElMessage.error('当前未给表字段设置值域!'); 1757 ElMessage.error('当前未给表字段设置值域!');
1674 return; 1758 return;
...@@ -1792,12 +1876,97 @@ const normCheckTableListLoading = ref({}); ...@@ -1792,12 +1876,97 @@ const normCheckTableListLoading = ref({});
1792 1876
1793 const normCheckTableListData = ref({}); 1877 const normCheckTableListData = ref({});
1794 1878
1879 const normCheckFormListRef = ref();
1880
1795 const cancelNormCheckDialog = () => { 1881 const cancelNormCheckDialog = () => {
1796 normCheckDialogVisible.value = false; 1882 normCheckDialogVisible.value = false;
1797 } 1883 }
1798 1884
1799 const submitNormCheck = () => { 1885 const submitNormCheck = () => {
1800 1886 let v: any = [];
1887 let ruleFieldsJson: any = {};
1888 for (const table in normCheckTableListData.value) {
1889 if (!normCheckTableListData.value[table]?.length) {
1890 continue;
1891 }
1892 let valueTableFields = normCheckTableListData.value[table];
1893 let ruleFields: any = []
1894 for (const field of valueTableFields) {
1895 if (!field.checkRule) {
1896 continue;
1897 }
1898 if ((field.checkRule == 'custom_regular_rule' || field.checkRule == 'precision_rule' || field.checkRule == 'date_format_rule') && field.configValue == null) {
1899 if (dialogSelectSubjectTable.value.enName != table) {
1900 normCheckFormListRef.value.setSelectList(table, 'enName');
1901 }
1902 ElMessage.error(`表【${table}】的字段【${field.enName}】设置了校验规则,但未填写配置项`);
1903 return;
1904 }
1905 if (field.checkRule == 'length_rule') {
1906 if (!field.operator) {
1907 if (dialogSelectSubjectTable.value.enName != table) {
1908 normCheckFormListRef.value.setSelectList(table, 'enName');
1909 }
1910 ElMessage.error(`表【${table}】的字段【${field.enName}】设置了长度检验,但未选择操作符`);
1911 return;
1912 }
1913 if (!field.value) {
1914 if (dialogSelectSubjectTable.value.enName != table) {
1915 normCheckFormListRef.value.setSelectList(table, 'enName');
1916 }
1917 ElMessage.error(`表【${table}】的字段【${field.enName}】设置了长度检验,但未填写长度值`);
1918 return;
1919 }
1920 if (field.operator == 'between') {
1921 if (!field.value1) {
1922 if (dialogSelectSubjectTable.value.enName != table) {
1923 normCheckFormListRef.value.setSelectList(table, 'enName');
1924 }
1925 ElMessage.error(`表【${table}】的字段【${field.enName}】设置了长度检验,但长度值未填写完整`);
1926 return;
1927 }
1928 if (parseInt(field.value) >= parseInt(field.value1)) {
1929 if (dialogSelectSubjectTable.value.enName != table) {
1930 normCheckFormListRef.value.setSelectList(table, 'enName');
1931 }
1932 ElMessage.error(`表【${table}】的字段【${field.enName}】设置了长度检验,介于操作符对应的数值需符合后者大于前者`);
1933 return;
1934 }
1935 field.configValue = field.operator + '#' + field.value + '#' + field.value1;
1936 } else {
1937 field.configValue = field.operator + '#' + field.value;
1938 }
1939 }
1940 ruleFields.push(field);
1941 }
1942 if (ruleFields.length) {
1943 v.push(table);
1944 ruleFieldsJson[table] = ruleFields;
1945 }
1946 }
1947 if (!v.length) {
1948 ElMessage.error('当前未给表字段设置规范检验规则!');
1949 return;
1950 }
1951 let index = 14;
1952 panelList.value[index].defaultValue = {
1953 ruleFields: ruleFieldsJson
1954 };
1955 let str = "";
1956 for (const key in ruleFieldsJson) {
1957 let field = ruleFieldsJson[key];
1958 str = str + (str ? ';' : '') + field.map(f => f.enName).join(',');;
1959 }
1960 let formInline = oldOriginValue.value = Object.assign({
1961 qualityModelGuids: props.toSubjectTables.map(s => s.guid),
1962 parity: 1,
1963 compareWay: 1,
1964 jointly: 'N',
1965 bizState: 'Y'
1966 }, oldOriginValue.value, ruleFormRef.value.formInline);
1967 formInline[`${panelList.value[index].field}`] = str;
1968 setPanelListValue(formInline);
1969 normCheckDialogVisible.value = false;
1801 } 1970 }
1802 1971
1803 const getFormInfo = () => { 1972 const getFormInfo = () => {
...@@ -1836,8 +2005,7 @@ const getFormInfo = () => { ...@@ -1836,8 +2005,7 @@ const getFormInfo = () => {
1836 } else if (formInline.ruleCode == 'value_of_range') { 2005 } else if (formInline.ruleCode == 'value_of_range') {
1837 let v = panelList.value[12].defaultValue; 2006 let v = panelList.value[12].defaultValue;
1838 return Object.assign({}, formInline, v, { 2007 return Object.assign({}, formInline, v, {
1839 ruleName: ruleName, 2008 ruleName: ruleName
1840 ruleFields: v
1841 }); 2009 });
1842 } else if (formInline.ruleCode == 'ref_integrality') { 2010 } else if (formInline.ruleCode == 'ref_integrality') {
1843 let v = panelList.value[13].defaultValue; 2011 let v = panelList.value[13].defaultValue;
...@@ -1845,6 +2013,11 @@ const getFormInfo = () => { ...@@ -1845,6 +2013,11 @@ const getFormInfo = () => {
1845 ruleName: ruleName, 2013 ruleName: ruleName,
1846 ruleFields: v 2014 ruleFields: v
1847 }); 2015 });
2016 } else if (formInline.ruleCode == 'norm_check') {
2017 let v = panelList.value[14].defaultValue;
2018 return Object.assign({}, formInline, v, {
2019 ruleName: ruleName
2020 });
1848 } 2021 }
1849 } 2022 }
1850 2023
...@@ -1984,8 +2157,9 @@ defineExpose({ ...@@ -1984,8 +2157,9 @@ defineExpose({
1984 </div> 2157 </div>
1985 <div class="table-field-right"> 2158 <div class="table-field-right">
1986 <div class="left-title">字段列表详情</div> 2159 <div class="left-title">字段列表详情</div>
1987 <el-table ref="rowTableRef" :data="valueRangeTableListData[dialogSelectSubjectTable.enName]" height="100%" :highlight-current-row="true" stripe 2160 <el-table ref="rowTableRef" :data="valueRangeTableListData[dialogSelectSubjectTable.enName]" height="100%"
1988 v-loading="valueRangeTableListLoading[dialogSelectSubjectTable.enName]" tooltip-effect="light" border 2161 :highlight-current-row="true" stripe v-loading="valueRangeTableListLoading[dialogSelectSubjectTable.enName]"
2162 tooltip-effect="light" border
1989 :style="{ height: 'calc(100% - 32px)', width: '100%', display: 'inline-block' }"> 2163 :style="{ height: 'calc(100% - 32px)', width: '100%', display: 'inline-block' }">
1990 <el-table-column prop="enName" label="字段名" width="140px" align="left" show-overflow-tooltip> 2164 <el-table-column prop="enName" label="字段名" width="140px" align="left" show-overflow-tooltip>
1991 </el-table-column> 2165 </el-table-column>
...@@ -1998,26 +2172,24 @@ defineExpose({ ...@@ -1998,26 +2172,24 @@ defineExpose({
1998 </el-table-column> 2172 </el-table-column>
1999 <el-table-column label="值域" width="280px" align="left" fixed="right"> 2173 <el-table-column label="值域" width="280px" align="left" fixed="right">
2000 <template #default="scope"> 2174 <template #default="scope">
2001 <span v-if="scope.row.dataType == 'json' || scope.row.dataType == 'text' || !scope.row.dataType || scope.row.dataType == 'string'">--</span> 2175 <span
2176 v-if="scope.row.dataType == 'json' || scope.row.dataType == 'text' || !scope.row.dataType || scope.row.dataType == 'string'">--</span>
2002 <template v-else> 2177 <template v-else>
2003 <el-input v-show="scope.row.dataType == 'varchar' || scope.row.dataType == 'char' || scope.row.dataType == 'bit'" v-model.trim="scope.row.dataRange" clearable placeholder="多值按照分号;分隔"> </el-input> 2178 <el-input
2179 v-show="scope.row.dataType == 'varchar' || scope.row.dataType == 'char' || scope.row.dataType == 'bit'"
2180 v-model.trim="scope.row.dataRange" clearable placeholder="多值按照分号;分隔"> </el-input>
2004 <div class="range-sum" v-show="scope.row.dataType == 'datetime' || scope.row.dataType == 'date'"> 2181 <div class="range-sum" v-show="scope.row.dataType == 'datetime' || scope.row.dataType == 'date'">
2005 <el-date-picker 2182 <el-date-picker v-model="scope.row.dateValueRange" type="daterange" range-separator="至"
2006 v-model="scope.row.dateValueRange" 2183 start-placeholder="开始日期" end-placeholder="结束日期" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
2007 type="daterange" 2184 :unlink-panels="false" :disabled="props.readonly" />
2008 range-separator="至"
2009 start-placeholder="开始日期"
2010 end-placeholder="结束日期"
2011 format="YYYY-MM-DD"
2012 value-format="YYYY-MM-DD"
2013 :unlink-panels="false"
2014 :disabled="props.readonly"
2015 />
2016 </div> 2185 </div>
2017 <div class="range-sum" v-show="scope.row.dataType == 'int' || scope.row.dataType == 'decimal' || scope.row.dataType == 'tinyint' || scope.row.dataType == 'timestamp' || scope.row.dataType == 'time'"> 2186 <div class="range-sum"
2018 <el-input :disabled="props.readonly" v-model.trim="scope.row.startValue" placeholder="请输入" clearable> </el-input> 2187 v-show="scope.row.dataType == 'int' || scope.row.dataType == 'decimal' || scope.row.dataType == 'tinyint' || scope.row.dataType == 'timestamp' || scope.row.dataType == 'time'">
2188 <el-input :disabled="props.readonly" v-model.trim="scope.row.startValue" placeholder="请输入" clearable>
2189 </el-input>
2019 <span class="text"></span> 2190 <span class="text"></span>
2020 <el-input :disabled="props.readonly" v-model.trim="scope.row.endValue" placeholder="请输入" clearable> </el-input> 2191 <el-input :disabled="props.readonly" v-model.trim="scope.row.endValue" placeholder="请输入" clearable>
2192 </el-input>
2021 </div> 2193 </div>
2022 </template> 2194 </template>
2023 </template> 2195 </template>
...@@ -2035,15 +2207,16 @@ defineExpose({ ...@@ -2035,15 +2207,16 @@ defineExpose({
2035 </el-dialog> 2207 </el-dialog>
2036 2208
2037 <!-- 引用完整性 --> 2209 <!-- 引用完整性 -->
2038 <el-dialog v-model="tableRefIntegralityDialogVisible" title="规则设置" width="750" :modal="true" :close-on-click-modal="false" 2210 <el-dialog v-model="tableRefIntegralityDialogVisible" title="规则设置" width="750" :modal="true"
2039 destroy-on-close align-center> 2211 :close-on-click-modal="false" destroy-on-close align-center>
2040 <div class="row-dialog-content"> 2212 <div class="row-dialog-content">
2041 <el-table ref="rowTableRef" :data="tableRefIntegralityRulesData" height="100%" :highlight-current-row="true" stripe 2213 <el-table ref="rowTableRef" :data="tableRefIntegralityRulesData" height="100%" :highlight-current-row="true"
2042 v-loading="tableRefIntegralityRulesDataLoading" tooltip-effect="light" border 2214 stripe v-loading="tableRefIntegralityRulesDataLoading" tooltip-effect="light" border
2043 :style="{ height: 'calc(100% - 28px)', width: 'auto', 'max-width': '100%', display: 'inline-block' }"> 2215 :style="{ height: 'calc(100% - 28px)', width: 'auto', 'max-width': '100%', display: 'inline-block' }">
2044 <el-table-column prop="mainTable" label="选择主表" width="180px" align="left" show-overflow-tooltip> 2216 <el-table-column prop="mainTable" label="选择主表" width="180px" align="left" show-overflow-tooltip>
2045 <template #default="scope"> 2217 <template #default="scope">
2046 <el-select v-if="!props.readonly" v-model="scope.row['mainTable']" placeholder="请选择" @change="tableInteMainSelectChange"> 2218 <el-select v-if="!props.readonly" v-model="scope.row['mainTable']" placeholder="请选择"
2219 @change="tableInteMainSelectChange">
2047 <el-option v-for="opt in toSubjectTables" :key="opt['guid']" :label="opt['label']" :value="opt['guid']" /> 2220 <el-option v-for="opt in toSubjectTables" :key="opt['guid']" :label="opt['label']" :value="opt['guid']" />
2048 </el-select> 2221 </el-select>
2049 <span v-else>{{ scope.row['mainTableName'] + `(${scope.row['mainTableZhName']})` }}</span> 2222 <span v-else>{{ scope.row['mainTableName'] + `(${scope.row['mainTableZhName']})` }}</span>
...@@ -2051,17 +2224,20 @@ defineExpose({ ...@@ -2051,17 +2224,20 @@ defineExpose({
2051 </el-table-column> 2224 </el-table-column>
2052 <el-table-column prop="mainTableField" label="选择主表字段" width="180px" align="left" show-overflow-tooltip> 2225 <el-table-column prop="mainTableField" label="选择主表字段" width="180px" align="left" show-overflow-tooltip>
2053 <template #default="scope"> 2226 <template #default="scope">
2054 <el-select v-if="!props.readonly" v-model="scope.row['mainTableField']" placeholder="请选择" filterable clearable> 2227 <el-select v-if="!props.readonly" v-model="scope.row['mainTableField']" placeholder="请选择" filterable
2055 <el-option v-for="opt in (scope.row.mainTable ? mainTableFields[scope.row.mainTable] : [])" :key="opt['enName']" :label="opt['label']" :value="opt['enName']" /> 2228 clearable>
2229 <el-option v-for="opt in (scope.row.mainTable ? mainTableFields[scope.row.mainTable] : [])"
2230 :key="opt['enName']" :label="opt['label']" :value="opt['enName']" />
2056 </el-select> 2231 </el-select>
2057 <span v-else>{{ scope.row['mainTableField'] + `(${scope.row['mainTableFieldZhName']})` }}</span> 2232 <span v-else>{{ scope.row['mainTableField'] + `(${scope.row['mainTableFieldZhName']})` }}</span>
2058 </template> 2233 </template>
2059 </el-table-column> 2234 </el-table-column>
2060 <el-table-column prop="compareTableGuid" label="选择对比表" width="180px" align="left" show-overflow-tooltip> 2235 <el-table-column prop="compareTableGuid" label="选择对比表" width="180px" align="left" show-overflow-tooltip>
2061 <template #default="scope"> 2236 <template #default="scope">
2062 <el-tree-select v-if="!props.readonly" ref="compareTreeSelectRef" filterable clearable @change="tableInteCompareSelectChange" 2237 <el-tree-select v-if="!props.readonly" ref="compareTreeSelectRef" filterable clearable
2063 v-model="scope.row['compareTableGuid']" node-key="guid" :data="contrastSubjects" placeholder="请选择" lazy 2238 @change="tableInteCompareSelectChange" v-model="scope.row['compareTableGuid']" node-key="guid"
2064 :load="(node, resolve) => treeSelectLoad(node, resolve)" :default-expanded-keys="contrastSubjects?.length ? [contrastSubjects.find(c => c.children?.some(cc => cc.guid == scope.row['compareSubjectDomainGuid'])).guid, scope.row.compareSubjectDomainGuid] : []" 2239 :data="contrastSubjects" placeholder="请选择" lazy :load="(node, resolve) => treeSelectLoad(node, resolve)"
2240 :default-expanded-keys="contrastSubjects?.length ? [contrastSubjects.find(c => c.children?.some(cc => cc.guid == scope.row['compareSubjectDomainGuid'])).guid, scope.row.compareSubjectDomainGuid] : []"
2065 :auto-expand-parent="true" :default-checked-keys="[scope.row['compareTableGuid']]" 2241 :auto-expand-parent="true" :default-checked-keys="[scope.row['compareTableGuid']]"
2066 :filter-node-method="contrastSubjectInputFilterMethod" :props="{ 2242 :filter-node-method="contrastSubjectInputFilterMethod" :props="{
2067 value: 'guid', 2243 value: 'guid',
...@@ -2075,8 +2251,11 @@ defineExpose({ ...@@ -2075,8 +2251,11 @@ defineExpose({
2075 </el-table-column> 2251 </el-table-column>
2076 <el-table-column prop="compareEnName" label="选择对比字段" width="180px" align="left" show-overflow-tooltip> 2252 <el-table-column prop="compareEnName" label="选择对比字段" width="180px" align="left" show-overflow-tooltip>
2077 <template #default="scope"> 2253 <template #default="scope">
2078 <el-select v-if="!props.readonly" v-model="scope.row['compareEnName']" placeholder="请选择" filterable clearable> 2254 <el-select v-if="!props.readonly" v-model="scope.row['compareEnName']" placeholder="请选择" filterable
2079 <el-option v-for="opt in (scope.row.compareTableGuid ? compareTableFields[scope.row.compareTableGuid] : [])" :key="opt['enName']" :label="opt['label']" :value="opt['enName']" /> 2255 clearable>
2256 <el-option
2257 v-for="opt in (scope.row.compareTableGuid ? compareTableFields[scope.row.compareTableGuid] : [])"
2258 :key="opt['enName']" :label="opt['label']" :value="opt['enName']" />
2080 </el-select> 2259 </el-select>
2081 <span v-else>{{ scope.row['compareEnName'] + `(${scope.row['compareZhName']})` }}</span> 2260 <span v-else>{{ scope.row['compareEnName'] + `(${scope.row['compareZhName']})` }}</span>
2082 </template> 2261 </template>
...@@ -2088,8 +2267,7 @@ defineExpose({ ...@@ -2088,8 +2267,7 @@ defineExpose({
2088 </el-table-column> 2267 </el-table-column>
2089 </el-table> 2268 </el-table>
2090 <div class="row-add-btn" v-if="!props.readonly"> 2269 <div class="row-add-btn" v-if="!props.readonly">
2091 <el-button link @click="addIntegralityRules" 2270 <el-button link @click="addIntegralityRules" :icon="CirclePlus" v-preReClick>添加规则</el-button>
2092 :icon="CirclePlus" v-preReClick>添加规则</el-button>
2093 </div> 2271 </div>
2094 </div> 2272 </div>
2095 2273
...@@ -2111,10 +2289,11 @@ defineExpose({ ...@@ -2111,10 +2289,11 @@ defineExpose({
2111 </div> 2289 </div>
2112 <div class="table-field-right"> 2290 <div class="table-field-right">
2113 <div class="left-title">字段列表详情</div> 2291 <div class="left-title">字段列表详情</div>
2114 <el-table ref="rowTableRef" :data="normCheckTableListData[dialogSelectSubjectTable.enName]" height="100%" :highlight-current-row="true" stripe 2292 <el-table ref="rowTableRef" :data="normCheckTableListData[dialogSelectSubjectTable.enName]" height="100%"
2115 v-loading="normCheckTableListLoading[dialogSelectSubjectTable.enName]" tooltip-effect="light" border 2293 :highlight-current-row="true" stripe v-loading="normCheckTableListLoading[dialogSelectSubjectTable.enName]"
2294 tooltip-effect="light" border
2116 :style="{ height: 'calc(100% - 32px)', width: '100%', display: 'inline-block' }"> 2295 :style="{ height: 'calc(100% - 32px)', width: '100%', display: 'inline-block' }">
2117 <el-table-column prop="enName" label="字段名" width="140px" align="left" show-overflow-tooltip> 2296 <el-table-column prop="enName" label="字段名" width="140px" align="left" show-overflow-tooltip fixed>
2118 </el-table-column> 2297 </el-table-column>
2119 <el-table-column prop="chName" label="注释" width="120px" align="left" show-overflow-tooltip> 2298 <el-table-column prop="chName" label="注释" width="120px" align="left" show-overflow-tooltip>
2120 </el-table-column> 2299 </el-table-column>
...@@ -2125,34 +2304,46 @@ defineExpose({ ...@@ -2125,34 +2304,46 @@ defineExpose({
2125 </el-table-column> 2304 </el-table-column>
2126 <el-table-column prop="checkRule" label="选择检验规则" width="150px" align="left" show-overflow-tooltip> 2305 <el-table-column prop="checkRule" label="选择检验规则" width="150px" align="left" show-overflow-tooltip>
2127 <template #default="scope"> 2306 <template #default="scope">
2128 <el-select v-if="!props.readonly" v-model="scope.row['checkRule']" placeholder="请选择" filterable clearable> 2307 <el-select v-if="!props.readonly || (scope.row.dataType == 'text' || scope.row.dataType == 'json')"
2129 <el-option v-for="opt in checkRulesList" :key="opt['paramValue']" :label="opt['paramName']" :value="opt['paramValue']" /> 2308 v-model="scope.row['checkRule']" placeholder="请选择" filterable clearable>
2309 <el-option v-for="opt in rulesListByType[scope.row.dataType]" :key="opt['paramValue']"
2310 :label="opt['paramName']" :value="opt['paramValue']" />
2130 </el-select> 2311 </el-select>
2131 <span v-else>{{ scope.row.checkRuleName ?? '--' }}</span> 2312 <span v-else>{{ scope.row.checkRuleName ?? '--' }}</span>
2132 </template> 2313 </template>
2133 </el-table-column> 2314 </el-table-column>
2134 <el-table-column label="填写配置项" width="200px" align="left"> 2315 <el-table-column label="填写配置项" width="200px" align="left">
2135 <template #default="scope"> 2316 <template #default="scope">
2136 <span v-if="!scope.row.checkRule">--</span> 2317 <span v-if="props.readonly">{{ scope.row.configValue ?? '--' }}</span>
2318 <span
2319 v-else-if="!scope.row.checkRule || ['id_card_rule', 'phone_number_rule', 'en_rule', 'ch_rule', 'num_value_rule'].includes(scope.row.checkRule)">--</span>
2137 <template v-else> 2320 <template v-else>
2138 <el-input v-show="scope.row.dataType == 'varchar' || scope.row.dataType == 'char' || scope.row.dataType == 'bit'" v-model.trim="scope.row.dataRange" clearable placeholder="多值按照分号;分隔"> </el-input> 2321 <el-input v-show="scope.row.checkRule == 'custom_regular_rule'" v-model.trim="scope.row.configValue"
2139 <div class="range-sum" v-show="scope.row.dataType == 'datetime' || scope.row.dataType == 'date'"> 2322 clearable placeholder="请输入"> </el-input>
2140 <el-date-picker 2323 <el-input v-show="scope.row.checkRule == 'precision_rule'" v-model.trim="scope.row.configValue"
2141 v-model="scope.row.dateValueRange" 2324 clearable placeholder="请输入" @input="(val) => scope.row.configValue = val.replace(/\D/g, '')">
2142 type="daterange" 2325 </el-input>
2143 range-separator="至" 2326 <el-select v-show="scope.row.checkRule == 'date_format_rule'" v-model="scope.row.configValue"
2144 start-placeholder="开始日期" 2327 placeholder="请选择" filterable clearable>
2145 end-placeholder="结束日期" 2328 <el-option
2146 format="YYYY-MM-DD" 2329 v-for="opt in scope.row.dataType == 'date' ? [{ value: 'YYYY-MM-DD' }, { value: 'YYYY/MM/DD' }] : [{ value: 'YYYY-MM-DD HH:MM:SS' }, { value: 'YYYY-MM-DD HH:MM:SS.SSS' }]"
2147 value-format="YYYY-MM-DD" 2330 :value="opt['value']" />
2148 :unlink-panels="false" 2331 </el-select>
2149 :disabled="props.readonly" 2332 <div class="range-sum" v-show="scope.row.checkRule == 'length_rule'">
2150 /> 2333 <el-select v-model="scope.row.operator" placeholder="请选择" filterable clearable
2151 </div> 2334 :style="{ width: scope.row.operator == 'between' ? 'calc(33% - 2px)' : 'calc(50% - 4px)' }">
2152 <div class="range-sum" v-show="scope.row.dataType == 'int' || scope.row.dataType == 'decimal' || scope.row.dataType == 'tinyint' || scope.row.dataType == 'timestamp' || scope.row.dataType == 'time'"> 2335 <el-option
2153 <el-input :disabled="props.readonly" v-model.trim="scope.row.startValue" placeholder="请输入" clearable> </el-input> 2336 v-for="opt in [{ value: '=' }, { value: '>' }, { value: '<' }, { value: '>=' }, { value: '<=' }, { value: 'between', label: '介于' }]"
2154 <span class="text"> </span> 2337 :key="opt['value']" :label="opt['label']" :value="opt['value']" />
2155 <el-input :disabled="props.readonly" v-model.trim="scope.row.endValue" placeholder="请输入" clearable> </el-input> 2338 </el-select>
2339 <el-input :disabled="props.readonly" v-model.trim="scope.row.value" placeholder="请输入" clearable
2340 :style="{ width: scope.row.operator == 'between' ? 'calc(33% - 2px)' : 'calc(50% - 4px)' }"
2341 @input="(val) => scope.row.value = val.replace(/\D/g, '')">
2342 </el-input>
2343 <el-input v-show="scope.row.operator == 'between'" :disabled="props.readonly"
2344 v-model.trim="scope.row.value1" placeholder="请输入" clearable :style="{ width: 'calc(33% - 2px)' }"
2345 @input="(val) => scope.row.value1 = val.replace(/\D/g, '')">
2346 </el-input>
2156 </div> 2347 </div>
2157 </template> 2348 </template>
2158 </template> 2349 </template>
...@@ -2288,6 +2479,7 @@ defineExpose({ ...@@ -2288,6 +2479,7 @@ defineExpose({
2288 width: 100%; 2479 width: 100%;
2289 display: inline-flex; 2480 display: inline-flex;
2290 align-items: center; 2481 align-items: center;
2482 justify-content: SPACE-BETWEEN;
2291 2483
2292 .text { 2484 .text {
2293 margin: 0px 4px; 2485 margin: 0px 4px;
......
...@@ -332,6 +332,33 @@ const transformRulesInfo = (info: any) => { ...@@ -332,6 +332,33 @@ const transformRulesInfo = (info: any) => {
332 })] 332 })]
333 })); 333 }));
334 } 334 }
335 } else if (info.ruleCode == 'norm_check') {
336 let subjectTables = toSubjectTables.value;
337 for (const ds in info.ruleFields) {
338 let fields = info.ruleFields[ds];
339 let tableInfo = subjectTables.find(t => t.enName === ds);
340 modelRules.push(Object.assign({}, {
341 modelGroupGuid: modelGroupGuid.value,
342 name: tableInfo.chName,
343 subjectName: tableInfo.enName,
344 subjectGuid: tableInfo.guid,
345 dataSourceGuid: tableInfo.dataSourceGuid,
346 databaseName: tableInfo.dataServerName,
347 modelRuleConfList: [Object.assign({}, info, {
348 ruleField: fields.map(f => {
349 return {
350 guid: f.guid,
351 enName: f.enName,
352 chName: f.chName,
353 dataType: f.dataType,
354 checkRule: f.checkRule,
355 configValue: f.configValue
356 }
357 }),
358 ruleFields: ''
359 })]
360 }));
361 }
335 } else if (info.ruleCode == 'ref_integrality') { 362 } else if (info.ruleCode == 'ref_integrality') {
336 let subjectTables = toSubjectTables.value; 363 let subjectTables = toSubjectTables.value;
337 info.ruleFields.forEach(row => { 364 info.ruleFields.forEach(row => {
......
...@@ -140,6 +140,25 @@ const transformRulesInfo = (info: any) => { ...@@ -140,6 +140,25 @@ const transformRulesInfo = (info: any) => {
140 }), 140 }),
141 ruleFields: '' 141 ruleFields: ''
142 }); 142 });
143 } else if (info.ruleCode == 'norm_check') {
144 let subjectName = detailInfo.value.subjectName;
145 let fields = info.ruleFields[subjectName];
146 return Object.assign({}, info, {
147 guid: ruleGuid,
148 qualityModelGuid: detailInfo.value.qualityModelGuid,
149 ruleCode: detailInfo.value.ruleCode,
150 ruleField: fields.map(f => {
151 return {
152 guid: f.guid,
153 enName: f.enName,
154 chName: f.chName,
155 dataType: f.dataType,
156 checkRule: f.checkRule,
157 configValue: f.configValue
158 }
159 }),
160 ruleFields: ''
161 });
143 } else if (info.ruleCode == 'ref_integrality') { 162 } else if (info.ruleCode == 'ref_integrality') {
144 return Object.assign({}, info, { 163 return Object.assign({}, info, {
145 guid: ruleGuid, 164 guid: ruleGuid,
......
...@@ -135,6 +135,24 @@ const transformRulesInfo = (info) => { ...@@ -135,6 +135,24 @@ const transformRulesInfo = (info) => {
135 }), 135 }),
136 ruleFields: '' 136 ruleFields: ''
137 }); 137 });
138 } else if (info.ruleCode == 'norm_check') {
139 let subjectName = modelDetailInfo.value.subjectName;
140 let fields = info.ruleFields[subjectName];
141 return Object.assign({}, info, {
142 qualityModelGuid: modelGuid,
143 ruleCode: info.ruleCode,
144 ruleField: fields.map(f => {
145 return {
146 guid: f.guid,
147 enName: f.enName,
148 chName: f.chName,
149 dataType: f.dataType,
150 checkRule: f.checkRule,
151 configValue: f.configValue
152 }
153 }),
154 ruleFields: ''
155 });
138 } else if (info.ruleCode == 'ref_integrality') { 156 } else if (info.ruleCode == 'ref_integrality') {
139 return Object.assign({}, info, { 157 return Object.assign({}, info, {
140 qualityModelGuid: modelGuid, 158 qualityModelGuid: modelGuid,
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!