define.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. <script setup lang="ts">
  2. defineOptions({
  3. name: "IndexChildrenDefine"
  4. });
  5. import { ref, reactive, markRaw, onMounted, computed } from "vue";
  6. import dialogVue from "./components/dialog.vue";
  7. import editDrawer from "./components/editDrawer.vue";
  8. import logDrawer from "./components/logDrawer.vue";
  9. import IndexDefineImport from "./import/index.vue";
  10. import { Edit, More } from "@element-plus/icons-vue";
  11. import { ElMessage, ElMessageBox } from "element-plus";
  12. import { Delete, Check } from "@element-plus/icons-vue";
  13. import { Search } from "@element-plus/icons-vue";
  14. import { getSelectDictListtApi, select } from "@/api/select";
  15. import { getQuotaPageList, delQuota, postUpdateDept } from "@/api/indexDefine";
  16. import { getStateData, getStateType } from "@/config/tag";
  17. import dayjs from "dayjs";
  18. const value = ref("");
  19. const dialogShow = ref();
  20. const EditdrawerShow = ref();
  21. const EditshowDrawer = ref(false);
  22. // 日志
  23. const logDrawerRef = ref();
  24. const logDrawerShow = ref(false);
  25. onMounted(() => {
  26. getSelectDictListtApi();
  27. });
  28. const options = [
  29. {
  30. value: "0",
  31. label: "草 稿"
  32. },
  33. {
  34. value: "1",
  35. label: "已上架"
  36. },
  37. {
  38. value: "2",
  39. label: "已下架"
  40. }
  41. ];
  42. const currentPage4 = ref(5);
  43. const pageSize4 = ref(100);
  44. const params = reactive({
  45. params: {
  46. pageNumber: 1,
  47. pageSize: 10,
  48. param: null,
  49. categoryName: null,
  50. statue: null,
  51. orderField: "updateTime",
  52. orderType: null
  53. },
  54. records: [],
  55. total: 0
  56. });
  57. // 分页
  58. const getQuotaPageListApi = async () => {
  59. const { code, data } = await getQuotaPageList(params.params);
  60. if (code === 200) {
  61. params.records = data.records;
  62. params.total = data.totalRow;
  63. }
  64. };
  65. getQuotaPageListApi();
  66. const handleSizeChange = (val: number) => {
  67. params.params.pageSize = val;
  68. getQuotaPageListApi();
  69. };
  70. const handleCurrentChange = (val: number) => {
  71. params.params.pageNumber = val;
  72. getQuotaPageListApi();
  73. };
  74. const showDialog = ref(false);
  75. const newAddIndex = () => {
  76. showDialog.value = true;
  77. dialogShow.value.open();
  78. };
  79. const close = () => {
  80. showDialog.value = false;
  81. getQuotaPageListApi();
  82. };
  83. // 编辑
  84. const setEdit = row => {
  85. EditshowDrawer.value = true;
  86. EditdrawerShow.value.open(row);
  87. };
  88. // 删除
  89. const delQuotaApi = async row => {
  90. const { code } = await delQuota(row.id);
  91. if (code === 200) {
  92. ElMessage({
  93. type: "success",
  94. message: "删除成功"
  95. });
  96. getQuotaPageListApi();
  97. }
  98. };
  99. const setDelete = row => {
  100. ElMessageBox.confirm("指标删除后无法恢复", "确定要删除这项指标吗", {
  101. confirmButtonText: "确认",
  102. cancelButtonText: "取消",
  103. type: "warning"
  104. })
  105. .then(() => {
  106. delQuotaApi(row);
  107. })
  108. .catch(() => {
  109. ElMessage({
  110. type: "info",
  111. message: "已取消"
  112. });
  113. });
  114. };
  115. // 批量导入
  116. const sizeImport = ref(false);
  117. const GoSizeImport = () => {
  118. sizeImport.value = !sizeImport.value;
  119. };
  120. // 日志
  121. const logs = row => {
  122. logDrawerRef.value.open(row);
  123. logDrawerShow.value = true;
  124. };
  125. // 发布
  126. const release = row => {
  127. row.statue = 1;
  128. postUpdateDeptApi(row, "发布");
  129. // ElMessageBox.confirm("确定要发布这项指标吗", "", {
  130. // confirmButtonText: "确认",
  131. // cancelButtonText: "取消",
  132. // type: "warning"
  133. // })
  134. // .then(() => {
  135. // })
  136. // .catch(() => {
  137. // ElMessage({
  138. // type: "info",
  139. // message: "已取消"
  140. // });
  141. // });
  142. };
  143. // 下架
  144. const offShelf = row => {
  145. row.statue = 2;
  146. postUpdateDeptApi(row, "下架");
  147. // ElMessageBox.confirm("确定要下架这项指标吗", "", {
  148. // confirmButtonText: "确认",
  149. // cancelButtonText: "取消",
  150. // type: "warning"
  151. // })
  152. // .then(() => {
  153. // })
  154. // .catch(() => {
  155. // ElMessage({
  156. // type: "info",
  157. // message: "已取消"
  158. // });
  159. // });
  160. };
  161. // 修改信息
  162. const postUpdateDeptApi = async (row, state) => {
  163. const res = await postUpdateDept(row);
  164. if (res.code == 200) {
  165. ElMessage({
  166. type: "success",
  167. message: `${state}成功`
  168. });
  169. getQuotaPageListApi();
  170. }
  171. };
  172. // 更新时间返回值
  173. const formattedTime = time => {
  174. if (time) {
  175. return dayjs(time).format("YYYY-MM-DD HH:mm:ss");
  176. } else {
  177. return "无效日期";
  178. }
  179. };
  180. const changeSort = ({ column, prop, order }) => {
  181. if (order === "ascending") {
  182. params.params.orderType = "升序";
  183. getQuotaPageListApi();
  184. } else if (order === "descending") {
  185. params.params.orderType = "降序";
  186. getQuotaPageListApi();
  187. }
  188. };
  189. </script>
  190. <template>
  191. <div>
  192. <!-- 批量导入 -->
  193. <IndexDefineImport v-if="sizeImport" @handleImport="GoSizeImport" />
  194. <div v-else>
  195. <!-- 指标详情 -->
  196. <editDrawer
  197. ref="EditdrawerShow"
  198. v-model:drawerValue="EditshowDrawer"
  199. @closeEditDialog="getQuotaPageListApi"
  200. />
  201. <!-- 新建 -->
  202. <dialogVue
  203. ref="dialogShow"
  204. v-model:modelValue="showDialog"
  205. @closeDialog="close"
  206. />
  207. <!-- 日志 -->
  208. <logDrawer ref="logDrawerRef" v-model="logDrawerShow" />
  209. <div class="w-[100%]">
  210. <div class="mb-2 flex gap-2 justify-between flex-wrap">
  211. <div class="flex mt-2">
  212. <div class="flex mr-2">
  213. <div class="text-sm leading-8 mr-3">指标分类</div>
  214. <el-select
  215. v-model="params.params.categoryName"
  216. clearable
  217. filterable
  218. placeholder="请选择"
  219. style="width: 150px"
  220. @change="getQuotaPageListApi"
  221. >
  222. <el-option
  223. v-for="(item, index) in select"
  224. :key="index"
  225. :label="item.dictValue"
  226. :value="item.dictValue"
  227. />
  228. </el-select>
  229. </div>
  230. <div class="flex mr-2">
  231. <div class="text-sm leading-8 mr-3">状态</div>
  232. <el-select
  233. v-model="params.params.statue"
  234. clearable
  235. filterable
  236. placeholder="请选择"
  237. style="width: 150px"
  238. @change="getQuotaPageListApi"
  239. >
  240. <el-option
  241. v-for="item in options"
  242. :key="item.value"
  243. :label="item.label"
  244. :value="item.value"
  245. />
  246. </el-select>
  247. </div>
  248. <div class="flex mr-2">
  249. <el-input
  250. v-model="params.params.param"
  251. style="width: 300px"
  252. :prefix-icon="Search"
  253. clearable
  254. placeholder="搜索指标名称、编码、口径、定义"
  255. @change="getQuotaPageListApi"
  256. />
  257. </div>
  258. </div>
  259. <div class="flex pt-2 mr-6">
  260. <Auth :value="['批量导入']">
  261. <el-button class="mr-2" @click="GoSizeImport">批量导入</el-button>
  262. </Auth>
  263. <Auth :value="['创建指标']">
  264. <el-button type="primary" class="mr-2" @click="newAddIndex"
  265. >创建指标</el-button
  266. >
  267. </Auth>
  268. </div>
  269. </div>
  270. </div>
  271. <div class="mt-8">
  272. <el-table
  273. :data="params.records"
  274. style="z-index: 0; width: 100%"
  275. @sort-change="changeSort"
  276. >
  277. <el-table-column
  278. prop="id"
  279. label="指标编号"
  280. width="100"
  281. show-overflow-tooltip
  282. />
  283. <el-table-column prop="name" label="指标名称" show-overflow-tooltip />
  284. <el-table-column
  285. prop="categoryName"
  286. label="指标分类"
  287. show-overflow-tooltip
  288. />
  289. <el-table-column prop="address" label="状态">
  290. <template #default="{ row }">
  291. <el-tag :type="getStateType(row.statue)">
  292. {{ getStateData(row.statue) }}
  293. </el-tag>
  294. </template>
  295. </el-table-column>
  296. <el-table-column
  297. prop="define"
  298. label="指标定义"
  299. show-overflow-tooltip
  300. />
  301. <el-table-column
  302. prop="caliber"
  303. label="指标口径"
  304. show-overflow-tooltip
  305. />
  306. <el-table-column
  307. prop="source"
  308. label="数据来源"
  309. show-overflow-tooltip
  310. />
  311. <el-table-column prop="updateTime" label="更新时间" sortable="custom">
  312. <template #default="{ row }">
  313. {{ formattedTime(row.updateTime) }}
  314. <!-- {{ dayjs(row.updateTime).format("YYYY-MM-DD HH:mm:ss") }} -->
  315. </template>
  316. </el-table-column>
  317. <el-table-column label="操作">
  318. <template #default="{ row }">
  319. <!-- <el-button link :icon="Edit" /> -->
  320. <Auth :value="['编辑']">
  321. <el-dropdown trigger="click">
  322. <span
  323. class="el-dropdown-link navbar-bg-hover select-none pt-1"
  324. >
  325. <!-- <el-text type="primary" @click="setEdit(row)">编辑</el-text>-->
  326. <el-icon @click="setEdit(row)">
  327. <Edit />
  328. </el-icon>
  329. </span>
  330. </el-dropdown>
  331. </Auth>
  332. <el-dropdown class="ml-2" trigger="click">
  333. <span class="el-dropdown-link navbar-bg-hover select-none pt-1">
  334. <!--<el-text type="primary">更多</el-text>-->
  335. <el-icon>
  336. <More />
  337. </el-icon>
  338. </span>
  339. <template #dropdown>
  340. <el-dropdown-menu class="setting">
  341. <Auth :value="['删除']">
  342. <el-dropdown-item @click="setDelete(row)">
  343. <el-text type="danger">删除</el-text>
  344. </el-dropdown-item>
  345. </Auth>
  346. <el-dropdown-item
  347. v-if="row.statue != 1"
  348. @click="release(row)"
  349. >
  350. 发布
  351. </el-dropdown-item>
  352. <el-dropdown-item
  353. v-if="row.statue != 2"
  354. @click="offShelf(row)"
  355. >
  356. 下架
  357. </el-dropdown-item>
  358. <el-dropdown-item @click="logs(row)">
  359. 日志
  360. </el-dropdown-item>
  361. </el-dropdown-menu>
  362. </template>
  363. </el-dropdown>
  364. </template>
  365. </el-table-column>
  366. </el-table>
  367. </div>
  368. <div class="flex justify-between item-center">
  369. <div class="float-left mt-5 ml-2 total">共{{ params.total }}条数据</div>
  370. <div class="float-right mt-5 mr-8">
  371. <el-pagination
  372. v-model:current-page="params.params.pageNumber"
  373. v-model:page-size="params.params.pageSize"
  374. background
  375. layout="prev, pager, next"
  376. :total="params.total"
  377. @size-change="handleSizeChange"
  378. @current-change="handleCurrentChange"
  379. />
  380. </div>
  381. </div>
  382. </div>
  383. </div>
  384. </template>
  385. <style lang="scss" scoped>
  386. .total {
  387. font-size: 14px;
  388. // font-family: PingFangSC-Regular;
  389. font-weight: 400;
  390. line-height: 22px;
  391. color: #0009;
  392. letter-spacing: 0;
  393. }
  394. .header {
  395. display: flex;
  396. width: 100%;
  397. line-height: 100%;
  398. border: 1px solid red;
  399. }
  400. ::v-deep .el-table .el-table__header th {
  401. background-color: #f2f3f5;
  402. /* 设置背景色 */
  403. }
  404. ::v-deep .el-table .el-table__cell {
  405. z-index: 99;
  406. // background-color: #f2f3f5; /* 设置背景色 */
  407. }
  408. .setting {
  409. font-size: 12px;
  410. }
  411. </style>