index.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. <template>
  2. <div class="app-container">
  3. <el-row :gutter="10" class="mb8">
  4. <el-col :span="18">
  5. <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="0"
  6. @submit.native.prevent>
  7. <el-form-item label="" prop="metricsName" style="margin-right:10px">
  8. <el-input
  9. v-model="queryParams.metricsName"
  10. placeholder="请输入指标名称"
  11. clearable
  12. @keyup.enter.native="handleQuery"
  13. />
  14. </el-form-item>
  15. <el-form-item label="" prop="metricsTypes" style="margin-right:10px">
  16. <el-select v-model="queryParams.category" clearable placeholder="请选择指标分类">
  17. <el-option :label="item.typeName" :value="item.typeId" v-for="item in typeListData" :key="item.typeId"/>
  18. </el-select>
  19. </el-form-item>
  20. <el-form-item label="" prop="metricsType" style="margin-right:10px">
  21. <el-select v-model="queryParams.metricsType" clearable placeholder="请选择指标类型">
  22. <el-option
  23. v-for="dict in metrics_category"
  24. :key="dict.value"
  25. :label="dict.label"
  26. :value="dict.value"
  27. ></el-option>
  28. </el-select>
  29. </el-form-item>
  30. <el-form-item>
  31. <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
  32. <el-button icon="Refresh" @click="resetQuery">重置</el-button>
  33. </el-form-item>
  34. </el-form>
  35. </el-col>
  36. <el-col :span="6" style="text-align: right">
  37. <el-button
  38. type="primary"
  39. plain
  40. icon="Plus"
  41. @click="handleAdd"
  42. v-hasPermi="['metrics:def:add']"
  43. >新增
  44. </el-button>
  45. </el-col>
  46. </el-row>
  47. <el-table v-loading="loading" :data="defList" border>
  48. <el-table-column label="指标ID" align="center" prop="metricsId" width="80"/>
  49. <el-table-column label="指标名称" align="left" prop="metricsName"/>
  50. <el-table-column label="指标分类" align="left" width="150">
  51. <template #default="scope">
  52. <span v-for="(item,i) in scope.row.metricsTypes" :key="`${scope.$index}_${item}`">
  53. {{ item.typeName }}<span v-if="i!==scope.row.metricsTypes.length-1">、</span>
  54. </span>
  55. </template>
  56. </el-table-column>
  57. <el-table-column label="指标类型" align="left" prop="metricsType" width="150">
  58. <template #default="scope">
  59. <dict-tag :options="metrics_category" :value="scope.row.metricsType"/>
  60. </template>
  61. </el-table-column>
  62. <el-table-column label="指标编码" align="left" prop="metricsCode" width="160"/>
  63. <el-table-column label="指标获取公式" align="left" prop="metricsExp" width="330"/>
  64. <el-table-column label="更新时间" align="center" prop="updateTime" width="180">
  65. <template #default="scope">
  66. <span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d} {h}:{mi}:{s}') }}</span>
  67. </template>
  68. </el-table-column>
  69. <el-table-column label="操作" align="left" class-name="small-padding fixed-width" width="200">
  70. <template #default="scope">
  71. <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['metrics:def:edit']">
  72. 修改
  73. </el-button>
  74. <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
  75. v-hasPermi="['metrics:def:remove']">删除
  76. </el-button>
  77. </template>
  78. </el-table-column>
  79. </el-table>
  80. <pagination
  81. v-show="total>0"
  82. :total="total"
  83. v-model:page="queryParams.pageNum"
  84. v-model:limit="queryParams.pageSize"
  85. @pagination="getList"
  86. />
  87. <!-- 添加或修改指标定义对话框 -->
  88. <el-dialog :title="title" v-model="open" width="800px" append-to-body>
  89. <el-form ref="defRef" :model="form" :rules="rules" label-width="120px">
  90. <el-form-item label="指标类型" prop="metricsType">
  91. <el-select v-model="form.metricsType" placeholder="请选择指标类型">
  92. <el-option
  93. v-for="dict in metrics_category"
  94. :key="dict.value"
  95. :label="dict.label"
  96. :value="dict.value"
  97. ></el-option>
  98. </el-select>
  99. </el-form-item>
  100. <el-form-item label="指标名称" prop="metricsName">
  101. <el-input v-model="form.metricsName" placeholder="请输入指标名称"/>
  102. </el-form-item>
  103. <el-form-item label="指标编码" v-if="form.metricsCode">
  104. <!-- <el-input v-model="form.metricsCode" placeholder="请输入指标编码"/>-->
  105. {{form.metricsCode}}
  106. </el-form-item>
  107. <el-form-item label="指标分类" prop="metricsTypes">
  108. <el-checkbox-group v-model="form.metricsTypes">
  109. <el-checkbox :label="item.typeName" v-for="item in typeListData" :key="item.typeId"/>
  110. </el-checkbox-group>
  111. </el-form-item>
  112. <el-form-item label="指标获取公式" prop="metricsExp">
  113. <el-input v-model="form.metricsExp" type="textarea" placeholder="请输入内容"/>
  114. </el-form-item>
  115. <el-form-item label="告警-低" prop="alarmLow">
  116. <el-input v-model="form.alarmLow" placeholder="请输入告警-低数值"/>
  117. </el-form-item>
  118. <el-form-item label="告警-中" prop="alarmMid">
  119. <el-input v-model="form.alarmMid" placeholder="请输入告警-中数值"/>
  120. </el-form-item>
  121. <el-form-item label="告警-高" prop="alarmHigh">
  122. <el-input v-model="form.alarmHigh" placeholder="请输入告警-高数值"/>
  123. </el-form-item>
  124. <el-form-item label="备注">
  125. <el-input v-model="form.remark" type="textarea" placeholder="请输入备注" :autosize="{maxRows:6,minRows:3}" maxlength="300" show-word-limit/>
  126. </el-form-item>
  127. </el-form>
  128. <template #footer>
  129. <div class="dialog-footer">
  130. <el-button type="primary" @click="submitForm">确 定</el-button>
  131. <el-button @click="cancel">取 消</el-button>
  132. </div>
  133. </template>
  134. </el-dialog>
  135. </div>
  136. </template>
  137. <script setup name="Def">
  138. import {addDef, delDef, getDef, listDef, updateDef} from "@/api/metrics/def";
  139. import {listType} from "@/api/metrics/type";
  140. import {onMounted} from "vue";
  141. const {proxy} = getCurrentInstance();
  142. const {metrics_category} = proxy.useDict('metrics_category');
  143. const defList = ref([]);
  144. const open = ref(false);
  145. const loading = ref(true);
  146. const showSearch = ref(true);
  147. const ids = ref([]);
  148. const single = ref(true);
  149. const multiple = ref(true);
  150. const total = ref(0);
  151. const title = ref("");
  152. const daterangeCreateTime = ref([]);
  153. const daterangeUpdateTime = ref([]);
  154. const typeListData = ref([])
  155. const data = reactive({
  156. form: {},
  157. queryParams: {
  158. pageNum: 1,
  159. pageSize: 10,
  160. metricsName: null,
  161. metricsCode: null,
  162. metricsType: null,
  163. createBy: null,
  164. createTime: null,
  165. updateBy: null,
  166. updateTime: null,
  167. remark: null,
  168. category: null,
  169. },
  170. rules: {
  171. metricsName: [
  172. {required: true, message: "指标名称不能为空", trigger: "blur"}
  173. ],
  174. metricsExp: [
  175. {required: true, message: "指标公式不能为空", trigger: "blur"}
  176. ],
  177. metricsType: [
  178. {required: true, message: "指标类型不能为空", trigger: "change"}
  179. ],
  180. metricsTypes: [
  181. {required: true, message: "指标分类不能为空", trigger: "change"}
  182. ]
  183. }
  184. });
  185. const {queryParams, form, rules} = toRefs(data);
  186. /** 查询指标定义列表 */
  187. function getList() {
  188. loading.value = true;
  189. queryParams.value.params = {};
  190. if (null != daterangeCreateTime && '' != daterangeCreateTime) {
  191. queryParams.value.params["beginCreateTime"] = daterangeCreateTime.value[0];
  192. queryParams.value.params["endCreateTime"] = daterangeCreateTime.value[1];
  193. }
  194. if (null != daterangeUpdateTime && '' != daterangeUpdateTime) {
  195. queryParams.value.params["beginUpdateTime"] = daterangeUpdateTime.value[0];
  196. queryParams.value.params["endUpdateTime"] = daterangeUpdateTime.value[1];
  197. }
  198. listDef(queryParams.value).then(response => {
  199. defList.value = response.rows;
  200. total.value = response.total;
  201. loading.value = false;
  202. });
  203. }
  204. // 取消按钮
  205. function cancel() {
  206. open.value = false;
  207. reset();
  208. }
  209. onMounted(() => {
  210. listType({pageNum: 1, pageSize: 20}).then(res => {
  211. typeListData.value = res.rows;
  212. });
  213. })
  214. // 表单重置
  215. function reset() {
  216. form.value = {
  217. metricsId: null,
  218. metricsName: null,
  219. metricsCode: null,
  220. metricsExp: null,
  221. metricsType: null,
  222. createBy: null,
  223. createTime: null,
  224. updateBy: null,
  225. updateTime: null,
  226. remark: null,
  227. alarmHigh: null,
  228. alarmLow: null,
  229. alarmMid: null,
  230. metricsTypes: []
  231. };
  232. proxy.resetForm("defRef");
  233. }
  234. /** 搜索按钮操作 */
  235. function handleQuery() {
  236. queryParams.value.pageNum = 1;
  237. getList();
  238. }
  239. /** 重置按钮操作 */
  240. function resetQuery() {
  241. daterangeCreateTime.value = [];
  242. daterangeUpdateTime.value = [];
  243. proxy.resetForm("queryRef");
  244. handleQuery();
  245. }
  246. /** 新增按钮操作 */
  247. function handleAdd() {
  248. reset();
  249. open.value = true;
  250. title.value = "添加指标定义";
  251. }
  252. /** 修改按钮操作 */
  253. function handleUpdate(row) {
  254. reset();
  255. const _metricsId = row.metricsId || ids.value
  256. getDef(_metricsId).then(response => {
  257. form.value = response.data;
  258. form.value.metricsTypes = form.value.metricsTypes.map(p => p.typeName)
  259. open.value = true;
  260. title.value = "修改指标定义";
  261. });
  262. }
  263. /** 提交按钮 */
  264. function submitForm() {
  265. proxy.$refs["defRef"].validate(valid => {
  266. if (valid) {
  267. const pDate = {...form.value}
  268. let metricsTypesIds = []
  269. typeListData.value.forEach(item => {
  270. if (pDate.metricsTypes.includes(item.typeName)) {
  271. metricsTypesIds.push(item)
  272. }
  273. })
  274. pDate.metricsTypes = metricsTypesIds
  275. if (form.value.metricsId != null) {
  276. updateDef(pDate).then(response => {
  277. proxy.$modal.msgSuccess("修改成功");
  278. open.value = false;
  279. getList();
  280. });
  281. } else {
  282. addDef(pDate).then(response => {
  283. proxy.$modal.msgSuccess("新增成功");
  284. open.value = false;
  285. getList();
  286. });
  287. }
  288. }
  289. });
  290. }
  291. /** 删除按钮操作 */
  292. function handleDelete(row) {
  293. const _metricsIds = row.metricsId || ids.value;
  294. proxy.$modal.confirm('是否确认删除指标定义编号为"' + _metricsIds + '"的数据项?').then(function () {
  295. return delDef(_metricsIds);
  296. }).then(() => {
  297. getList();
  298. proxy.$modal.msgSuccess("删除成功");
  299. }).catch(() => {
  300. });
  301. }
  302. getList();
  303. </script>