| | |
| | | import { computed, onMounted, ref } from 'vue' |
| | | import { useRoute, useRouter } from 'vue-router' |
| | | import type { DataTableColumns } from 'naive-ui' |
| | | import { NButton, NInput, NTag, NTooltip, useDialog, useMessage } from 'naive-ui' |
| | | import Pagination from '@/components/common/Pagination.vue' |
| | | import { NButton, NInput, NTag, useDialog, useMessage } from 'naive-ui' |
| | | import AgreementVersionModal from './components/AgreementVersionModal.vue' |
| | | import type { AgreementVersionFormValue } from './components/AgreementVersionModal.vue' |
| | | import { |
| | | copyLoginAgreement, |
| | | deleteLoginAgreementVersion, |
| | | disableLoginAgreement, |
| | | enableLoginAgreement, |
| | | getLoginAgreementDetail, |
| | | getLoginAgreementLatestVersion, |
| | |
| | | return actionLoadingKey.value === `${action}_${row.id || row.version}` |
| | | } |
| | | |
| | | function getDisableConfirmText(row: AgreementVersionRow) { |
| | | const hasOtherPendingVersion = versionList.value.some(item => Number(item.status) === 0 && item.id !== row.id) |
| | | if (!hasOtherPendingVersion) |
| | | return '停用后乘客端将无协议展示,影响用户登录流程,是否确认停用?' |
| | | return '停用后该版本将失效,是否确认停用?' |
| | | } |
| | | |
| | | async function fetchVersionDetail(row: AgreementVersionRow) { |
| | | if (!row.id) { |
| | | return { |
| | |
| | | key: 'actions', |
| | | width: 120, |
| | | render: (row, index) => ( |
| | | <div class="flex items-center"> |
| | | <div class="flex items-center gap-12px"> |
| | | {isPendingStatus(row, index) |
| | | ? ( |
| | | <NButton text type="primary" loading={getActionLoadingValue(row, 'enable')} onClick={() => confirmEnableVersion(row)}> |
| | |
| | | : null} |
| | | {isPendingStatus(row, index) |
| | | ? ( |
| | | <NButton text type="primary" class="ml-12px" onClick={() => handleEditVersion(row, index)}> |
| | | <NButton text type="primary" onClick={() => handleEditVersion(row, index)}> |
| | | 编辑 |
| | | </NButton> |
| | | ) |
| | | : null} |
| | | <NButton text type="primary" class="ml-12px" onClick={() => handleViewVersion(row)}> |
| | | <NButton text type="primary" onClick={() => handleViewVersion(row)}> |
| | | 详情 |
| | | </NButton> |
| | | {(isEnabledStatus(row, index) || isInvalidStatus(row, index)) |
| | |
| | | <NButton |
| | | text |
| | | type="primary" |
| | | class="ml-12px" |
| | | loading={getActionLoadingValue(row, 'copy')} |
| | | onClick={() => handleCopyVersion(row)} |
| | | > |
| | |
| | | <NButton |
| | | text |
| | | type="primary" |
| | | class="ml-12px" |
| | | |
| | | loading={getActionLoadingValue(row, 'disable')} |
| | | onClick={() => confirmDisableVersion(row)} |
| | | > |
| | |
| | | function confirmDisableVersion(row: AgreementVersionRow) { |
| | | dialog.warning({ |
| | | title: '提示', |
| | | content: getDisableConfirmText(row), |
| | | content: '停用后乘客端将无协议展示,影响用户登录流程,是否确认停用?', |
| | | positiveText: '确认', |
| | | negativeText: '取消', |
| | | onPositiveClick: () => handleDisableVersion(row), |
| | |
| | | return |
| | | } |
| | | |
| | | const nameId = getAgreementNameId() |
| | | versionModalSaving.value = true |
| | | try { |
| | | const res = await saveLoginAgreement({ |
| | | id: payload.id, |
| | | nameId: payload.id ? undefined : (nameId || undefined), |
| | | name: agreementName.value.trim(), |
| | | content: payload.content, |
| | | type: agreementType.value, |
| | |
| | | status: 0, |
| | | }) |
| | | if (res?.code !== 200) { |
| | | message.error(res?.msg || '保存失败') |
| | | return |
| | | } |
| | | |
| | | const nameId = extractAgreementNameId(res.data) |
| | | const nextNameId = extractAgreementNameId(res.data) || nameId |
| | | message.success('保存成功') |
| | | showVersionModal.value = false |
| | | await syncPageModeAfterVersionSaved(nameId) |
| | | await syncPageModeAfterVersionSaved(nextNameId) |
| | | await loadVersionList() |
| | | } |
| | | finally { |
| | |
| | | router.back() |
| | | } |
| | | |
| | | function getSaveRows() { |
| | | return [...versionList.value] |
| | | .sort((a, b) => compareVersion(a.version, b.version)) |
| | | .map((item, index, list) => { |
| | | const rowIndex = list.length - index - 1 |
| | | return { |
| | | ...item, |
| | | sort: index + 1, |
| | | status: getStatusValue(item, rowIndex), |
| | | } |
| | | }) |
| | | } |
| | | |
| | | async function handleSave() { |
| | | if (!agreementName.value.trim()) { |
| | | message.warning('请输入协议名称') |
| | | return |
| | | } |
| | | if (versionList.value.length === 0) { |
| | | message.warning('请先新增版本') |
| | | |
| | | const nameId = getAgreementNameId() |
| | | if (!nameId) { |
| | | message.warning('当前协议缺少nameId,无法保存') |
| | | return |
| | | } |
| | | |
| | | saving.value = true |
| | | try { |
| | | for (const id of deletedIds.value) { |
| | | const deleteRes = await deleteLoginAgreementVersion(id) |
| | | if (deleteRes?.code !== 200) { |
| | | message.error(deleteRes?.msg || '删除版本失败') |
| | | return |
| | | } |
| | | const saveRes = await saveLoginAgreement({ |
| | | id: nameId, |
| | | name: agreementName.value.trim(), |
| | | type: agreementType.value, |
| | | }) |
| | | if (saveRes?.code !== 200) { |
| | | return |
| | | } |
| | | |
| | | const saveRows = getSaveRows() |
| | | for (const row of saveRows) { |
| | | const saveRes = await saveLoginAgreement({ |
| | | id: row.id, |
| | | name: agreementName.value.trim(), |
| | | content: row.content, |
| | | type: agreementType.value, |
| | | version: row.version, |
| | | status: row.status || 0, |
| | | sort: row.sort, |
| | | }) |
| | | if (saveRes?.code !== 200) { |
| | | message.error(saveRes?.msg || '保存失败') |
| | | return |
| | | } |
| | | } |
| | | |
| | | message.success('保存成功') |
| | | router.back() |
| | | } |
| | |
| | | <div class="table-toolbar-right"> |
| | | <div class="flex items-center justify-end"> |
| | | <NButton type="primary" secondary @click="handleAddVersion"> |
| | | 新增版本号 |
| | | 新增 |
| | | </NButton> |
| | | </div> |
| | | </div> |