DialogRegisterData.vue 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. <template>
  2. <div>
  3. <el-dialog title="" v-model="dialogVisible">
  4. <div>
  5. <div class="flex justify-between mb-3">
  6. <h3 class="flex items-center">
  7. 本次数据集共包含
  8. <h2 style="color: #f56c6c; font-size: 30px">
  9. {{ state.dataCount.total }}
  10. </h2>
  11. 的数据,已注册
  12. <h2 style="color: #f56c6c; font-size: 30px">
  13. {{ state.dataCount.registered }}
  14. </h2>
  15. ,未注册
  16. <h2 style="color: #f56c6c; font-size: 30px">
  17. {{ state.dataCount.notRegistered }}
  18. </h2>
  19. </h3>
  20. <el-button type="primary" plain @click="getDataCount">刷新</el-button>
  21. </div>
  22. <div class="mt-2" style="width: 500px">
  23. <el-input
  24. v-model="state.query.key"
  25. placeholder="请输入搜索内容"
  26. class="input-with-select"
  27. >
  28. <template #prepend>
  29. <el-select
  30. v-model="state.query.type"
  31. placeholder="请选择"
  32. style="width: 115px"
  33. clearable
  34. >
  35. <el-option
  36. :label="item.name"
  37. :value="item.key"
  38. v-for="item in keyList"
  39. :key="item.type"
  40. />
  41. </el-select>
  42. </template>
  43. <template #append>
  44. <el-button
  45. :icon="Search"
  46. @click="
  47. () => {
  48. state.query.page = 1;
  49. getUserList();
  50. }
  51. "
  52. >搜索</el-button
  53. >
  54. </template>
  55. </el-input>
  56. </div>
  57. <el-table
  58. :data="state.tableData"
  59. ref="multipleTableRef"
  60. @selection-change="handleSelectionChange"
  61. class="w-full mt-4"
  62. >
  63. <el-table-column type="selection" width="55" />
  64. <el-table-column prop="name" label="姓名"></el-table-column>
  65. <el-table-column prop="gender" label="性别"></el-table-column>
  66. <el-table-column label="检查时年龄 " prop="age"></el-table-column>
  67. <el-table-column label="ID " prop="userId"></el-table-column>
  68. <el-table-column label="手机号" prop="mobile"></el-table-column>
  69. <el-table-column label="身份证号" prop="IDCard"></el-table-column>
  70. <el-table-column label="注册状态" #default="{ row }">
  71. <span :class="reportDataStatus[row.registerStatus]?.class">{{
  72. reportDataStatus[row.registerStatus].label
  73. }}</span>
  74. </el-table-column>
  75. <el-table-column label="档案号" #default="{ row }">
  76. <el-tag
  77. class="cursor-copy"
  78. size="large"
  79. v-copy:click="row.archiveId"
  80. v-if="row.archiveId"
  81. >
  82. <span class="align-middle select-none">{{ row.archiveId }}</span>
  83. <CopyDocument class="inline-block align-middle ml-2 w-4 h-4" />
  84. </el-tag>
  85. <span v-else>-</span>
  86. </el-table-column>
  87. </el-table>
  88. <el-pagination
  89. class="justify-end mt-4"
  90. :current-page="state.query.page"
  91. :page-size="state.query.pageSize"
  92. :total="state.count"
  93. background
  94. layout="total, prev, pager, next, jumper"
  95. @current-change="
  96. page => {
  97. state.query.page = page;
  98. getUserList();
  99. }
  100. "
  101. ></el-pagination>
  102. </div>
  103. <template #footer>
  104. <div>
  105. <el-button @click="dialogVisible = false">取 消</el-button>
  106. <el-button
  107. type="primary"
  108. @click="handleSubmit"
  109. :disabled="
  110. state.tableData.filter(v => v.registerStatus == 1).length
  111. "
  112. >确认注册</el-button
  113. >
  114. </div>
  115. </template>
  116. </el-dialog>
  117. </div>
  118. </template>
  119. <script lang="ts" setup>
  120. import {
  121. ref,
  122. computed,
  123. defineProps,
  124. defineEmits,
  125. watch,
  126. reactive,
  127. h
  128. } from "vue";
  129. import { Search } from "@element-plus/icons-vue";
  130. import { request } from "@/utils";
  131. import { ElMessage, ElMessageBox } from "element-plus";
  132. import { nextTick, title } from "process";
  133. const props = defineProps({
  134. show: {
  135. type: Boolean,
  136. default: false
  137. },
  138. id: {
  139. type: [Number, String]
  140. }
  141. });
  142. const emits = defineEmits(["update:show", "success"]);
  143. const dialogVisible = computed({
  144. get() {
  145. return props.show;
  146. },
  147. set(n) {
  148. emits("update:show", n);
  149. }
  150. });
  151. watch(
  152. () => dialogVisible.value,
  153. n => {
  154. if (n) {
  155. initData();
  156. } else {
  157. }
  158. }
  159. );
  160. const state = reactive({
  161. query: {
  162. key: "",
  163. value: "",
  164. page: 1,
  165. pageSize: 15
  166. },
  167. tableData: [],
  168. count: 0,
  169. dataCount: {},
  170. multipleSelection: []
  171. });
  172. const keyList = [
  173. {
  174. key: "name",
  175. name: "姓名"
  176. },
  177. {
  178. key: "user_id",
  179. name: "ID"
  180. },
  181. {
  182. key: "mobile",
  183. name: "手机号"
  184. },
  185. {
  186. key: "id_card",
  187. name: "身份证号"
  188. }
  189. ];
  190. const reportDataStatus = {
  191. 0: {
  192. label: "未注册",
  193. class: "text-yellow-500"
  194. },
  195. 1: {
  196. label: "注册成功",
  197. class: "text-green-500"
  198. },
  199. 2: {
  200. label: "注册失败",
  201. class: "text-red-500"
  202. }
  203. };
  204. const multipleTableRef = ref();
  205. const getUserList = () => {
  206. request
  207. .get("/dataService/dataParse/mechanism/parsed/users", {
  208. params: { ...state.query, dataId: props.id }
  209. })
  210. .then(resp => {
  211. let responseList = resp.data.list;
  212. state.tableData = responseList;
  213. state.count = resp.data.total;
  214. nextTick(() => {
  215. // 默认全选
  216. responseList.map(v => {
  217. if (v.registerStatus != 1) {
  218. multipleTableRef.value!.toggleRowSelection(v);
  219. }
  220. });
  221. });
  222. });
  223. };
  224. const getDataCount = () => {
  225. request
  226. .get("/dataService/dataParse/mechanism/parsed/users/count", {
  227. params: { dataId: props.id }
  228. })
  229. .then(resp => {
  230. state.dataCount = resp.data;
  231. });
  232. };
  233. const handleSelectionChange = val => {
  234. state.multipleSelection = val;
  235. };
  236. const handleSubmit = async () => {
  237. if (!state.multipleSelection.length) {
  238. return ElMessage.error("请勾选要注册的数据");
  239. }
  240. let excludeIds = state.tableData
  241. .filter(v => !state.multipleSelection.map(v => v.id)?.includes(v.id))
  242. .map(v => v.id);
  243. await ElMessageBox.confirm(
  244. `本次数据集未注册数据<span style="color: #F56C6C">${state.dataCount.notRegistered}人</span>,已选择数据<span style="color: #F56C6C">${state.multipleSelection.length}人</span>,确定无误吗`,
  245. "提示",
  246. {
  247. dangerouslyUseHTMLString: true
  248. }
  249. );
  250. request
  251. .post("/dataService/dataParse/mechanism/parsed/register", {
  252. dataId: props.id,
  253. excludeIds: excludeIds
  254. })
  255. .then(resp => {
  256. ElMessage.success(resp.message);
  257. dialogVisible.value = false;
  258. emits("success");
  259. });
  260. };
  261. const initData = () => {
  262. getUserList();
  263. getDataCount();
  264. };
  265. </script>