index.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. <!--
  2. * @Author: zhanghaifeng
  3. * @Date: 2025-01-03 13:57:58
  4. * @LastEditors: zhanghaifeng
  5. * @LastEditTime: 2025-01-14 15:21:08
  6. * @Description: 指标数据
  7. * @FilePath: /hospital-project/src/views/indexData/index.vue
  8. -->
  9. <script setup>
  10. defineOptions({
  11. name: "IndexData"
  12. });
  13. import { ElMessage, ElMessageBox } from "element-plus";
  14. import { ref, reactive, onMounted } from "vue";
  15. import { Search } from "@element-plus/icons-vue";
  16. import dayjs from "dayjs";
  17. import IndexImport from "./components/indexImport.vue";
  18. import addDialog from "./components/addDialog.vue";
  19. import editDrawer from "./components/editDrawer.vue";
  20. import logDrawer from "./components/logDrawer.vue";
  21. import { getPageList, delListItemApi } from "@/api/indexData";
  22. // 状态
  23. const params = reactive({
  24. params: {
  25. pageNumber: 1,
  26. pageSize: 10,
  27. sourceValue: "",
  28. deptName: "",
  29. userName: ""
  30. },
  31. records: [],
  32. total: 0
  33. });
  34. // 获取列表数据
  35. const getList = async () => {
  36. const { code, data } = await getPageList(params.params);
  37. if (code === 200) {
  38. params.records = data.records;
  39. params.total = data.totalRow;
  40. }
  41. };
  42. const handleSizeChange = val => {
  43. params.params.pageSize = val;
  44. getList();
  45. };
  46. const handleCurrentChange = val => {
  47. params.params.pageNumber = val;
  48. getList();
  49. };
  50. onMounted(() => {
  51. getList();
  52. });
  53. // 批量导入
  54. const sizeImport = ref(false);
  55. const bulkImport = (type = "") => {
  56. sizeImport.value = !sizeImport.value;
  57. if (type && type === "success") {
  58. handleCurrentChange(1);
  59. }
  60. };
  61. // 添加
  62. const dialogShow = ref(null);
  63. const showAddData = () => {
  64. dialogShow.value && dialogShow.value.open();
  65. };
  66. // 编辑/详情
  67. const editdrawerShow = ref(null);
  68. const setEdit = row => {
  69. editdrawerShow.value && editdrawerShow.value.open(row);
  70. };
  71. // 删除
  72. const setDelete = row => {
  73. ElMessageBox.confirm("数据删除后将无法恢复", "确定要继续删除这项数据吗?", {
  74. confirmButtonText: "确认",
  75. cancelButtonText: "取消",
  76. type: "warning"
  77. })
  78. .then(async () => {
  79. const { code } = await delListItemApi({
  80. sourceDateId: row.id
  81. });
  82. if (code === 200) {
  83. ElMessage({
  84. type: "success",
  85. message: "删除成功"
  86. });
  87. getList();
  88. }
  89. })
  90. .catch(() => {
  91. ElMessage({
  92. type: "info",
  93. message: "已取消"
  94. });
  95. });
  96. };
  97. // 日志
  98. const logDrawerRef = ref(null);
  99. const showLogs = row => {
  100. logDrawerRef.value && logDrawerRef.value.open(row);
  101. };
  102. </script>
  103. <template>
  104. <div class="page-container">
  105. <!-- 批量导入 -->
  106. <IndexImport v-if="sizeImport" @handleImport="bulkImport" />
  107. <div v-else>
  108. <div class="w-[100%]">
  109. <div class="mb-2 flex gap-2 justify-between flex-wrap">
  110. <div class="flex mt-2">
  111. <div class="flex mr-2">
  112. <el-input
  113. v-model="params.params.sourceValue"
  114. style="width: 200px"
  115. :prefix-icon="Search"
  116. clearable
  117. placeholder="搜索指标名称"
  118. @change="getList"
  119. />
  120. </div>
  121. <!--暂时注释,产品说下一期迭代-->
  122. <!-- <div class="flex mr-2">
  123. <el-input v-model="params.params.deptName" style="width: 200px" :prefix-icon="Search" clearable
  124. placeholder="搜索部门名称" @change="getList" />
  125. </div>
  126. <div class="flex mr-2">
  127. <el-input v-model="params.params.userName" style="width: 200px" :prefix-icon="Search" clearable
  128. placeholder="搜索员工名称" @change="getList" />
  129. </div> -->
  130. </div>
  131. <div class="flex pt-2 mr-6">
  132. <Auth :value="['批量导入']">
  133. <el-button class="mr-2" @click="bulkImport">批量导入</el-button>
  134. </Auth>
  135. <Auth :value="['添加数据']">
  136. <el-button type="primary" class="mr-2" @click="showAddData">
  137. 添加数据
  138. </el-button>
  139. </Auth>
  140. </div>
  141. </div>
  142. </div>
  143. <div class="mt-8">
  144. <el-table :data="params.records" style="width: 100%">
  145. <el-table-column
  146. prop="sourceValue"
  147. label="指标名称"
  148. fixed
  149. width="200"
  150. show-overflow-tooltip
  151. />
  152. <el-table-column prop="deptName" label="部门名称" width="200" />
  153. <el-table-column prop="userName" label="员工名称" />
  154. <el-table-column prop="userId" label="工号" width="120" />
  155. <el-table-column prop="numerator" label="分子" />
  156. <el-table-column prop="denominator" label="分母" />
  157. <el-table-column prop="dataValue" label="值" />
  158. <el-table-column prop="specificTime" label="数据时间" width="120" />
  159. <el-table-column prop="updateTime" label="更新时间" width="200">
  160. <template #default="{ row }">
  161. {{
  162. row.updateTime
  163. ? dayjs(row.updateTime).format("YYYY-MM-DD HH:mm:ss")
  164. : "无效日期"
  165. }}
  166. </template>
  167. </el-table-column>
  168. <el-table-column prop="createUser" label="创建人" />
  169. <el-table-column label="操作" fixed="right" width="120">
  170. <template #default="{ row }">
  171. <el-dropdown trigger="click">
  172. <span class="el-dropdown-link navbar-bg-hover select-none pt-1">
  173. <el-icon @click="setEdit(row)">
  174. <Edit />
  175. </el-icon>
  176. </span>
  177. </el-dropdown>
  178. <el-dropdown class="ml-2" trigger="click">
  179. <span class="el-dropdown-link navbar-bg-hover select-none pt-1">
  180. <el-icon>
  181. <More />
  182. </el-icon>
  183. </span>
  184. <template #dropdown>
  185. <el-dropdown-menu class="setting">
  186. <Auth :value="['删除']">
  187. <el-dropdown-item @click="setDelete(row)">
  188. <el-text type="danger">删除</el-text>
  189. </el-dropdown-item>
  190. </Auth>
  191. <Auth :value="['日志']">
  192. <el-dropdown-item @click="showLogs(row)"
  193. >日志</el-dropdown-item
  194. >
  195. </Auth>
  196. </el-dropdown-menu>
  197. </template>
  198. </el-dropdown>
  199. </template>
  200. </el-table-column>
  201. </el-table>
  202. </div>
  203. <div class="flex justify-between item-center">
  204. <div class="float-left mt-5 ml-2 total">共{{ params.total }}条数据</div>
  205. <div class="float-right mt-5 mr-8">
  206. <el-pagination
  207. v-model:current-page="params.params.pageNumber"
  208. v-model:page-size="params.params.pageSize"
  209. background
  210. layout="prev, pager, next"
  211. :total="params.total"
  212. @size-change="handleSizeChange"
  213. @current-change="handleCurrentChange"
  214. />
  215. </div>
  216. </div>
  217. <!-- 编辑/详情 -->
  218. <editDrawer ref="editdrawerShow" @updateDialog="getList" />
  219. <!-- 新建 -->
  220. <addDialog ref="dialogShow" @updateDialog="getList" />
  221. <!-- 日志 -->
  222. <logDrawer ref="logDrawerRef" />
  223. </div>
  224. </div>
  225. </template>
  226. <style lang="scss" scoped>
  227. .total {
  228. font-size: 14px;
  229. font-weight: 400;
  230. line-height: 22px;
  231. color: #0009;
  232. letter-spacing: 0;
  233. }
  234. .header {
  235. display: flex;
  236. width: 100%;
  237. line-height: 100%;
  238. border: 1px solid red;
  239. }
  240. ::v-deep(.el-table .el-table__header th) {
  241. background-color: #f2f3f5;
  242. }
  243. .setting {
  244. font-size: 12px;
  245. }
  246. </style>