index.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740
  1. <template>
  2. <div class="audit-container">
  3. <el-container class="audit-layout h-full">
  4. <!-- 左侧分类侧边栏 -->
  5. <el-aside width="250px" class="mr-4 h-full sidebar modern-card">
  6. <div class="sidebar-title">审核类型</div>
  7. <div class="p-4">
  8. <el-input v-model="filterText" placeholder="请输入" :prefix-icon="Search" />
  9. </div>
  10. <el-menu :default-active="activeMenu" class="border-none mt-2" @select="handleMenuSelect">
  11. <el-menu-item index="1" :class="{'menu-item-active': activeMenu === '1'}">
  12. <template #title>
  13. <el-icon><i-ep-operation /></el-icon>
  14. <span>招聘单位</span>
  15. </template>
  16. </el-menu-item>
  17. <el-menu-item index="2" :class="{'menu-item-active': activeMenu === '2'}">
  18. <template #title>
  19. <el-icon><i-ep-document /></el-icon>
  20. <span>岗位</span>
  21. </template>
  22. </el-menu-item>
  23. </el-menu>
  24. </el-aside>
  25. <!-- 右侧主体内容 -->
  26. <el-main class="h-full main-content p-0 modern-card">
  27. <!-- 搜索与头部区域 -->
  28. <div class="header-section">
  29. <div class="flex items-center mb-4">
  30. <el-input v-model="queryParams.applyNo" placeholder="请输入编号或关键词" style="width: 300px" clearable @keyup.enter="handleQuery">
  31. <template #append>
  32. <el-button type="primary" icon="Search" class="bg-blue-500 text-white search-btn" @click="handleQuery"></el-button>
  33. </template>
  34. </el-input>
  35. </div>
  36. <div class="flex justify-between items-center mb-4">
  37. <div class="tabs">
  38. <span class="tab-item" :class="{ active: queryParams.auditResult === undefined }" @click="handleTabClick(undefined)">全部</span>
  39. <span class="tab-item" :class="{ active: queryParams.auditResult === 1 }" @click="handleTabClick(1)">已审核</span>
  40. <span class="tab-item" :class="{ active: queryParams.auditResult === 0 }" @click="handleTabClick(0)">待审核</span>
  41. <span class="tab-item" :class="{ active: queryParams.auditResult === 2 }" @click="handleTabClick(2)">未通过</span>
  42. </div>
  43. <div>
  44. <el-button type="primary" plain class="batch-pass-btn" @click="handleBatchPass">批量通过</el-button>
  45. <el-button type="warning" plain class="batch-reject-btn">批量驳回</el-button>
  46. </div>
  47. </div>
  48. </div>
  49. <!-- 表格区域 -->
  50. <div class="table-section pb-4 px-4">
  51. <el-table v-loading="loading" :data="tableData" style="width: 100%" @selection-change="handleSelectionChange" header-cell-class-name="custom-header">
  52. <el-table-column type="selection" width="40" align="center" />
  53. <!-- 通用列:申请编号 -->
  54. <el-table-column prop="applyNo" label="编号" width="100" show-overflow-tooltip />
  55. <!-- 企业审核列 -->
  56. <template v-if="activeMenu === '1'">
  57. <el-table-column prop="companyName" label="公司名称" min-width="150" show-overflow-tooltip />
  58. <el-table-column prop="creditCode" label="统一社会信用代码" min-width="180" show-overflow-tooltip />
  59. </template>
  60. <!-- 岗位审核列 -->
  61. <template v-else>
  62. <el-table-column prop="companyName" label="公司名称" min-width="120" show-overflow-tooltip />
  63. <el-table-column prop="postName" label="岗位" min-width="100" show-overflow-tooltip />
  64. <el-table-column prop="postLevelName" label="岗位等级" width="90" align="center">
  65. <template #default="scope">
  66. <span>{{ scope.row.postLevelName || scope.row.postLevel || '-' }}</span>
  67. </template>
  68. </el-table-column>
  69. <el-table-column label="办公地点" min-width="120" show-overflow-tooltip>
  70. <template #default="scope">
  71. <span>{{ scope.row.workProvince || '' }} {{ scope.row.workCity || '' }}</span>
  72. </template>
  73. </el-table-column>
  74. </template>
  75. <el-table-column label="审核状态" width="90" align="center">
  76. <template #default="scope">
  77. <span :class="getAuditStatusClass(scope.row.auditResult)">{{ getAuditStatusLabel(scope.row.auditResult) }}</span>
  78. </template>
  79. </el-table-column>
  80. <el-table-column prop="auditRemark" label="备注" min-width="100" show-overflow-tooltip />
  81. <!-- 岗位审核特有列 -->
  82. <template v-if="activeMenu === '2'">
  83. <el-table-column prop="postTypeName" label="岗位类型" width="100" align="center">
  84. <template #default="scope">
  85. <span>{{ scope.row.postTypeName || scope.row.postType || '-' }}</span>
  86. </template>
  87. </el-table-column>
  88. <el-table-column prop="recruitNum" label="招聘人数" width="90" align="center">
  89. <template #default="scope">
  90. <span>{{ scope.row.recruitNum || '不限' }}</span>
  91. </template>
  92. </el-table-column>
  93. <el-table-column prop="salaryRange" label="薪资" width="120" align="center">
  94. <template #default="scope">
  95. <span>{{ scope.row.salaryRange || '-' }}</span>
  96. </template>
  97. </el-table-column>
  98. <el-table-column label="报名时间" min-width="160" align="center" show-overflow-tooltip>
  99. <template #default="scope">
  100. <span v-if="scope.row.registrationStartDate || scope.row.registrationEndDate">
  101. {{ scope.row.registrationStartDate }} 至 {{ scope.row.registrationEndDate }}
  102. </span>
  103. <span v-else>不限</span>
  104. </template>
  105. </el-table-column>
  106. </template>
  107. <!-- 企业审核特有列:审核时间 -->
  108. <el-table-column v-if="activeMenu === '1'" prop="auditTime" label="审核时间" width="160" align="center" show-overflow-tooltip />
  109. <el-table-column label="操作" width="120" align="center" fixed="right">
  110. <template #default="scope">
  111. <el-link type="primary" :underline="false" style="font-size: 13px" @click="handleView(scope.row)">查看</el-link>
  112. <el-button type="success" size="small" class="ml-2 audit-btn" v-if="scope.row.auditResult === 0" @click="handleOpenAudit(scope.row)">
  113. 审核
  114. </el-button>
  115. </template>
  116. </el-table-column>
  117. </el-table>
  118. <div class="pagination-wrapper mt-4">
  119. <pagination
  120. v-show="total > 0"
  121. :total="total"
  122. v-model:page="queryParams.pageNum"
  123. v-model:limit="queryParams.pageSize"
  124. @pagination="getList"
  125. />
  126. </div>
  127. </div>
  128. </el-main>
  129. </el-container>
  130. <!-- 审核说明弹窗 -->
  131. <el-dialog v-model="auditDialogVisible" width="700px" :show-close="true" custom-class="audit-dialog">
  132. <template #header>
  133. <div class="dialog-header-line">
  134. <span class="font-bold text-gray-800 text-base">审核说明</span>
  135. </div>
  136. </template>
  137. <div class="tabs-container">
  138. <el-tabs v-model="auditForm.result" class="audit-tabs">
  139. <el-tab-pane label="通过" name="pass" />
  140. <el-tab-pane label="驳回" name="reject" />
  141. </el-tabs>
  142. </div>
  143. <el-form :model="auditForm" label-width="80px" class="mt-6 px-4">
  144. <el-form-item label="结果:">
  145. <span class="text-gray-700 font-medium">{{ auditForm.result === 'pass' ? '通过' : '驳回' }}</span>
  146. </el-form-item>
  147. <!-- 岗位审核 - 通过时显示定金尾款和选择测评 -->
  148. <template v-if="activeMenu === '2' && auditForm.result === 'pass'">
  149. <el-form-item label="定金">
  150. <el-input-number v-model="auditForm.deposit" :precision="2" :step="100" :min="0" class="!w-64" />
  151. </el-form-item>
  152. <el-form-item label="尾款">
  153. <el-input-number v-model="auditForm.finalPayment" :precision="2" :step="100" :min="0" class="!w-64" />
  154. </el-form-item>
  155. <el-form-item label="选择测评">
  156. <el-select
  157. v-model="auditForm.evaluationId"
  158. placeholder="请选择测评"
  159. :loading="evalLoading"
  160. class="!w-64"
  161. @change="handleEvalChange"
  162. >
  163. <el-option
  164. v-for="item in evalOptions"
  165. :key="item.id"
  166. :label="item.evaluationName"
  167. :value="item.id"
  168. />
  169. </el-select>
  170. </el-form-item>
  171. <!-- 能力配置回显 -->
  172. <el-form-item v-if="selectedAbilityConfigs.length > 0" label="能力配置">
  173. <div class="ability-config-list">
  174. <div v-for="(ability, index) in selectedAbilityConfigs" :key="index" class="ability-config-card">
  175. <el-row :gutter="16" align="middle">
  176. <el-col :span="5">
  177. <div class="config-field">
  178. <label>能力名称</label>
  179. <el-input v-model="ability.abilityName" disabled size="small" />
  180. </div>
  181. </el-col>
  182. <el-col :span="6">
  183. <div class="config-field">
  184. <label>关联试卷</label>
  185. <el-input v-model="ability.thirdExamName" disabled size="small" />
  186. </div>
  187. </el-col>
  188. <el-col :span="4">
  189. <div class="config-field">
  190. <label>时长(分)</label>
  191. <el-input-number v-model="ability.thirdExamTime" :min="1" controls-position="right" style="width: 100%" size="small" />
  192. </div>
  193. </el-col>
  194. <el-col :span="4">
  195. <div class="config-field">
  196. <label>总分</label>
  197. <el-input-number v-model="ability.thirdExamTotalScore" :min="0" controls-position="right" style="width: 100%" size="small" />
  198. </div>
  199. </el-col>
  200. <el-col :span="5">
  201. <div class="config-field">
  202. <label>及格分</label>
  203. <el-input-number v-model="ability.thirdExamPassMark" :min="0" :max="ability.thirdExamTotalScore || 100" controls-position="right" style="width: 100%" size="small" />
  204. </div>
  205. </el-col>
  206. </el-row>
  207. </div>
  208. </div>
  209. </el-form-item>
  210. </template>
  211. <el-form-item>
  212. <template #label>
  213. <span v-if="auditForm.result === 'reject'" class="text-red-500 mr-1">*</span>
  214. 备注:
  215. </template>
  216. <el-input
  217. v-model="auditForm.remark"
  218. type="textarea"
  219. :rows="4"
  220. placeholder="请输入审核备注说明..."
  221. :class="{'reject-border': auditForm.result === 'reject'}"
  222. />
  223. </el-form-item>
  224. </el-form>
  225. <template #footer>
  226. <div class="dialog-footer-line flex justify-end">
  227. <el-button @click="auditDialogVisible = false">取消</el-button>
  228. <el-button type="primary" @click="confirmAudit" class="confirm-btn">确定</el-button>
  229. </div>
  230. </template>
  231. </el-dialog>
  232. </div>
  233. </template>
  234. <script setup lang="ts">
  235. import { ref, reactive, onMounted } from 'vue';
  236. import { useRouter } from 'vue-router';
  237. import { ElMessage, ElMessageBox } from 'element-plus';
  238. import { listAudit, auditPass, auditReject, delAudit } from '@/api/system/audit';
  239. import { listEvaluation, getEvaluation } from '@/api/main/evaluation';
  240. import { AuditVO, AuditQuery } from '@/api/system/audit/types';
  241. const router = useRouter();
  242. const loading = ref(true);
  243. const total = ref(0);
  244. const ids = ref<Array<string | number>>([]);
  245. const filterText = ref('');
  246. const activeMenu = ref('1');
  247. // 查询参数
  248. const queryParams = reactive<AuditQuery>({
  249. pageNum: 1,
  250. pageSize: 10,
  251. applyNo: undefined,
  252. auditType: '1',
  253. auditResult: undefined
  254. });
  255. /** 查询审核信息列表 */
  256. const getList = async () => {
  257. loading.value = true;
  258. const res = await listAudit(queryParams);
  259. tableData.value = res.rows;
  260. total.value = res.total;
  261. loading.value = false;
  262. };
  263. const handleMenuSelect = (index: string) => {
  264. activeMenu.value = index;
  265. queryParams.auditType = index;
  266. handleQuery();
  267. };
  268. /** 搜索按钮操作 */
  269. const handleQuery = () => {
  270. queryParams.pageNum = 1;
  271. getList();
  272. };
  273. /** 重置按钮操作 */
  274. const resetQuery = () => {
  275. queryParams.applyNo = undefined;
  276. handleQuery();
  277. };
  278. const tableData = ref<AuditVO[]>([]);
  279. /** 多选框选中数据 */
  280. const handleSelectionChange = (selection: AuditVO[]) => {
  281. ids.value = selection.map((item) => item.id);
  282. };
  283. const getAuditStatusClass = (status: number) => {
  284. const map: Record<number, string> = {
  285. 0: 'text-blue-500',
  286. 1: 'text-green-500',
  287. 2: 'text-red-500'
  288. };
  289. return map[status] || 'text-gray-500';
  290. };
  291. const getAuditStatusLabel = (status: number) => {
  292. const map: Record<number, string> = {
  293. 0: '待审核',
  294. 1: '已通过',
  295. 2: '未通过'
  296. };
  297. return map[status] || '未知';
  298. };
  299. const handleView = (row: AuditVO) => {
  300. if (activeMenu.value === '2') {
  301. router.push({ path: '/system/audit-hidden/job-detail', query: { id: row.id } });
  302. } else {
  303. router.push({ path: '/system/audit-hidden/detail', query: { id: row.id } });
  304. }
  305. };
  306. // 弹窗逻辑
  307. const auditDialogVisible = ref(false);
  308. const currentId = ref<string | number>('');
  309. const auditForm = reactive({
  310. result: 'pass',
  311. remark: '',
  312. deposit: 0,
  313. finalPayment: 0,
  314. evaluationId: undefined as number | undefined
  315. });
  316. // 测评下拉选项
  317. const evalLoading = ref(false);
  318. const evalOptions = ref<any[]>([]);
  319. // 测评选择相关
  320. const selectedEvaluation = ref<any>({});
  321. const selectedAbilityConfigs = ref<any[]>([]);
  322. const handleOpenAudit = (row: AuditVO) => {
  323. currentId.value = row.id;
  324. auditForm.result = 'pass';
  325. auditForm.remark = '';
  326. auditForm.deposit = 0;
  327. auditForm.finalPayment = 0;
  328. auditForm.evaluationId = undefined;
  329. selectedEvaluation.value = {};
  330. selectedAbilityConfigs.value = [];
  331. auditDialogVisible.value = true;
  332. // 获取测评选项列表
  333. getEvalList();
  334. };
  335. const handleAuditCommand = (cmd: string, row: AuditVO) => {
  336. currentId.value = row.id;
  337. auditForm.result = cmd;
  338. auditForm.remark = '';
  339. auditDialogVisible.value = true;
  340. };
  341. /** 确认审核 */
  342. const confirmAudit = async () => {
  343. if (auditForm.result === 'reject' && !auditForm.remark.trim()) {
  344. ElMessage.error('驳回时备注为必填项!');
  345. return;
  346. }
  347. // 岗位审核通过时,校验必须选择测评
  348. if (activeMenu.value === '2' && auditForm.result === 'pass' && !auditForm.evaluationId) {
  349. ElMessage.warning('请先选择测评');
  350. return;
  351. }
  352. try {
  353. if (auditForm.result === 'pass') {
  354. if (activeMenu.value === '2') {
  355. await auditPass(currentId.value, auditForm.remark, auditForm.evaluationId, auditForm.deposit, auditForm.finalPayment);
  356. } else {
  357. await auditPass(currentId.value, auditForm.remark);
  358. }
  359. } else {
  360. await auditReject(currentId.value, auditForm.remark);
  361. }
  362. ElMessage.success('审核操作成功');
  363. auditDialogVisible.value = false;
  364. getList();
  365. } catch (error) {
  366. ElMessage.error('审核操作失败');
  367. }
  368. };
  369. /** 获取测评列表(直接加载所有或前200条) */
  370. const getEvalList = async () => {
  371. evalLoading.value = true;
  372. try {
  373. const res: any = await listEvaluation({
  374. pageNum: 1,
  375. pageSize: 200
  376. });
  377. evalOptions.value = res.rows || [];
  378. } catch (error) {
  379. console.error('获取测评列表失败', error);
  380. } finally {
  381. evalLoading.value = false;
  382. }
  383. };
  384. /** 选择测评变更处理 */
  385. const handleEvalChange = async (val: number) => {
  386. if (!val) {
  387. selectedEvaluation.value = {};
  388. selectedAbilityConfigs.value = [];
  389. return;
  390. }
  391. try {
  392. const res: any = await getEvaluation(val);
  393. const data = res.data;
  394. selectedEvaluation.value = data;
  395. selectedAbilityConfigs.value = (data.abilityConfigs || []).map((item: any) => ({
  396. id: item.id,
  397. abilityName: item.abilityName || '',
  398. thirdExamInfoId: item.thirdExamInfoId || '',
  399. thirdExamName: item.thirdExamName || '',
  400. thirdExamTime: item.thirdExamTime || 60,
  401. thirdExamTotalScore: item.thirdExamTotalScore || 100,
  402. thirdExamPassMark: item.thirdExamPassMark || 60,
  403. thirdExamLink: item.thirdExamLink || ''
  404. }));
  405. } catch (error) {
  406. ElMessage.error('获取测评详情失败');
  407. }
  408. };
  409. /** 选择测评 */
  410. const selectEvaluation = async (evalRow: any) => {
  411. try {
  412. const res: any = await getEvaluation(evalRow.id);
  413. const data = res.data;
  414. selectedEvaluation.value = data;
  415. selectedAbilityConfigs.value = (data.abilityConfigs || []).map((item: any) => ({
  416. id: item.id,
  417. abilityName: item.abilityName || '',
  418. thirdExamInfoId: item.thirdExamInfoId || '',
  419. thirdExamName: item.thirdExamName || '',
  420. thirdExamTime: item.thirdExamTime || 60,
  421. thirdExamTotalScore: item.thirdExamTotalScore || 100,
  422. thirdExamPassMark: item.thirdExamPassMark || 60,
  423. thirdExamLink: item.thirdExamLink || ''
  424. }));
  425. evalDialog.value.visible = false;
  426. ElMessage.success('已选择测评:' + data.evaluationName);
  427. } catch (error) {
  428. ElMessage.error('获取测评详情失败');
  429. }
  430. };
  431. /** 批量通过 */
  432. const handleBatchPass = async () => {
  433. if (ids.value.length === 0) {
  434. ElMessage.warning('请选择要通过的数据');
  435. return;
  436. }
  437. await ElMessageBox.confirm('是否确认通过选中的数据?');
  438. try {
  439. for (const id of ids.value) {
  440. await auditPass(id, '批量审核通过');
  441. }
  442. ElMessage.success('批量操作成功');
  443. getList();
  444. } catch (error) {
  445. ElMessage.error('批量操作失败');
  446. }
  447. };
  448. /** 状态页签切换 */
  449. const handleTabClick = (status?: number) => {
  450. queryParams.auditResult = status;
  451. handleQuery();
  452. };
  453. onMounted(() => {
  454. getList();
  455. });
  456. </script>
  457. <style scoped lang="scss">
  458. .audit-container {
  459. padding: 20px;
  460. background-color: #f0f2f5;
  461. min-height: calc(100vh - 84px);
  462. height: calc(100vh - 84px);
  463. box-sizing: border-box;
  464. }
  465. .audit-layout {
  466. height: 100%;
  467. align-items: stretch;
  468. }
  469. .sidebar {
  470. border-radius: 4px;
  471. height: 100%;
  472. display: flex;
  473. flex-direction: column;
  474. :deep(.el-menu) {
  475. flex: 1;
  476. }
  477. .sidebar-title {
  478. padding: 20px;
  479. font-size: 16px;
  480. font-weight: 600;
  481. }
  482. .menu-item-active {
  483. background-color: #ecf5ff;
  484. color: #409eff;
  485. border-right: 2px solid #409eff;
  486. }
  487. }
  488. .main-content {
  489. border-radius: 4px;
  490. height: 100%;
  491. display: flex;
  492. flex-direction: column;
  493. }
  494. .header-section {
  495. padding: 20px;
  496. border-bottom: 1px solid #e5e6eb;
  497. .search-btn {
  498. border-radius: 0 4px 4px 0;
  499. }
  500. .tabs {
  501. display: flex;
  502. gap: 30px;
  503. font-size: 14px;
  504. color: #4e5969;
  505. .tab-item {
  506. cursor: pointer;
  507. position: relative;
  508. padding-bottom: 8px;
  509. &.active {
  510. color: #1d2129;
  511. font-weight: 600;
  512. &::after {
  513. content: '';
  514. position: absolute;
  515. bottom: 0;
  516. left: 0;
  517. width: 100%;
  518. height: 2px;
  519. background-color: #409eff;
  520. }
  521. }
  522. }
  523. }
  524. .batch-pass-btn { background-color: #e8f3ff; border-color: #e8f3ff; color: #165dff; }
  525. .batch-reject-btn { background-color: #fff7e8; border-color: #fff7e8; color: #ff7d00; }
  526. }
  527. .table-section {
  528. padding-top: 15px;
  529. flex: 1;
  530. min-height: 0;
  531. display: flex;
  532. flex-direction: column;
  533. }
  534. .table-section :deep(.el-table) {
  535. flex: 1;
  536. }
  537. ::deep(.custom-header th) {
  538. background-color: #f7f8fa !important;
  539. color: #4e5969;
  540. font-weight: 500;
  541. padding: 8px 0;
  542. }
  543. .cert-img {
  544. width: 50px;
  545. height: 35px;
  546. object-fit: cover;
  547. border: 1px solid #e5e6eb;
  548. border-radius: 2px;
  549. }
  550. .audit-btn {
  551. background-color: #8cde9f;
  552. border-color: #8cde9f;
  553. &:hover {
  554. background-color: #72cf88;
  555. }
  556. }
  557. .pagination-wrapper {
  558. display: flex;
  559. justify-content: flex-end;
  560. }
  561. /* 深色浮层菜单样式 */
  562. .dark-dropdown {
  563. background-color: #333333 !important;
  564. border: none !important;
  565. border-radius: 6px;
  566. padding: 5px 0;
  567. :deep(.el-dropdown-menu__item) {
  568. color: #fff;
  569. padding: 8px 16px;
  570. font-size: 13px;
  571. &:hover {
  572. background-color: #444444;
  573. color: #fff;
  574. }
  575. .el-icon {
  576. margin-right: 8px;
  577. font-size: 14px;
  578. }
  579. }
  580. /* 覆盖弹出框默认的白色箭头和样式 */
  581. &.el-popper {
  582. .el-popper__arrow::before {
  583. background: #333333 !important;
  584. border: none !important;
  585. }
  586. }
  587. }
  588. /* 弹窗样式优化 */
  589. .audit-dialog {
  590. :deep(.el-dialog__header) {
  591. margin-right: 0;
  592. padding: 20px 24px;
  593. border-bottom: 1px solid #f0f0f0;
  594. }
  595. :deep(.el-dialog__body) {
  596. padding: 0;
  597. }
  598. :deep(.el-dialog__footer) {
  599. padding: 20px 24px;
  600. border-top: 1px solid #f0f0f0;
  601. }
  602. }
  603. .tabs-container {
  604. padding: 0 24px;
  605. background-color: #fff;
  606. }
  607. .audit-tabs {
  608. :deep(.el-tabs__header) {
  609. margin: 0;
  610. }
  611. :deep(.el-tabs__nav-wrap::after) {
  612. height: 1px;
  613. background-color: #f0f0f0;
  614. }
  615. :deep(.el-tabs__item) {
  616. font-size: 15px;
  617. height: 50px;
  618. line-height: 50px;
  619. }
  620. }
  621. .confirm-btn {
  622. background-color: #409eff;
  623. border-color: #409eff;
  624. padding: 0 25px;
  625. }
  626. .reject-border {
  627. :deep(.el-textarea__inner) {
  628. border-color: #165dff !important;
  629. box-shadow: 0 0 0 1px #165dff inset !important;
  630. }
  631. }
  632. /* 取消输入框的圆角以符合UI */
  633. ::deep(.el-textarea__inner) {
  634. border-radius: 4px;
  635. }
  636. /* 能力配置卡片 */
  637. .ability-config-list {
  638. display: flex;
  639. flex-direction: column;
  640. gap: 10px;
  641. width: 100%;
  642. }
  643. .ability-config-card {
  644. background-color: #f7f8fa;
  645. border-radius: 4px;
  646. padding: 12px 16px;
  647. width: 100%;
  648. .config-field {
  649. label {
  650. display: block;
  651. font-size: 12px;
  652. color: #4e5969;
  653. margin-bottom: 4px;
  654. }
  655. :deep(.el-input-number) {
  656. width: 100%;
  657. }
  658. }
  659. }
  660. </style>