|
|
|
|
@ -1,168 +1,63 @@
|
|
|
|
|
<template>
|
|
|
|
|
<div v-loading="loading" class="qcc-enterprise-account">
|
|
|
|
|
<lx-header icon="md-business" :text="$route.meta.title || '企查查企业户准入'" style="margin: 15px 0 10px; border: 0">
|
|
|
|
|
<div slot="content">
|
|
|
|
|
<el-alert
|
|
|
|
|
title="平台确认企业户后不可撤销。请以统一社会信用代码为准入依据,状态未知时只能对账,不可重复提交。"
|
|
|
|
|
type="warning"
|
|
|
|
|
:closable="false"
|
|
|
|
|
show-icon
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
<lx-header icon="md-business" :text="$route.meta.title || '企查查企业户标注'" style="margin: 15px 0 10px; border: 0">
|
|
|
|
|
<div slot="content"><el-alert title="纳入候选池不会调用企查查。首次调用明确成功后即标记为已占额且不可撤销;状态未知时需先人工确认。" type="warning" :closable="false" show-icon /></div>
|
|
|
|
|
</lx-header>
|
|
|
|
|
|
|
|
|
|
<el-tabs v-model="activeTab" @tab-click="handleTabChange">
|
|
|
|
|
<el-tab-pane label="准入申请" name="apply">
|
|
|
|
|
<el-tabs v-model="activeTab">
|
|
|
|
|
<el-tab-pane label="候选企业" name="candidates">
|
|
|
|
|
<div class="toolbar">
|
|
|
|
|
<el-input v-model.trim="candidateQuery.keyword" clearable placeholder="企业名称或统一社会信用代码" style="width: 280px" @keyup.enter.native="searchCandidates" />
|
|
|
|
|
<el-button type="primary" size="small" @click="searchCandidates">查询企业库</el-button>
|
|
|
|
|
<el-button type="primary" size="small" :disabled="selectedCandidates.length === 0" @click="openSubmitDialog">发起准入申请</el-button>
|
|
|
|
|
<el-input v-model.trim="candidateQuery.keyword" clearable placeholder="企业名称或统一社会信用代码" style="width: 280px" @keyup.enter.native="loadCandidates" />
|
|
|
|
|
<el-select v-model="candidateQuery.status" clearable placeholder="企业户状态" style="width: 150px"><el-option label="未纳入" value="none" /><el-option label="候选" value="selected" /><el-option label="已占额" value="occupied" /><el-option label="待人工确认" value="unknown" /></el-select>
|
|
|
|
|
<el-button type="primary" size="small" @click="resetCandidatePage">查询</el-button>
|
|
|
|
|
<el-button type="primary" size="small" :disabled="selectedCompanies.length === 0" @click="selectCompanies">纳入候选池</el-button>
|
|
|
|
|
</div>
|
|
|
|
|
<el-table :data="candidates" border stripe @selection-change="selectedCandidates = $event">
|
|
|
|
|
<el-table-column type="selection" width="50" />
|
|
|
|
|
<el-table :data="candidateList" border stripe @selection-change="selectedCompanies = $event">
|
|
|
|
|
<el-table-column type="selection" width="50" :selectable="isSelectable" />
|
|
|
|
|
<el-table-column prop="company_name" label="企业名称" min-width="220" />
|
|
|
|
|
<el-table-column prop="credit_code" label="统一社会信用代码" width="200">
|
|
|
|
|
<template slot-scope="scope">
|
|
|
|
|
<span :class="{ 'missing-credit-code': !scope.row.credit_code }">{{ scope.row.credit_code || '缺失,不能提交' }}</span>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column prop="qcc_account_status_text" label="当前企业户状态" width="150">
|
|
|
|
|
<template slot-scope="scope"><status-tag :status="scope.row.qcc_account_status" :text="scope.row.qcc_account_status_text" /></template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column prop="credit_code" label="统一社会信用代码" width="210"><template slot-scope="scope"><span :class="{ 'missing-credit-code': !scope.row.credit_code }">{{ scope.row.credit_code || '缺失,不能纳入' }}</span></template></el-table-column>
|
|
|
|
|
<el-table-column label="企业户状态" width="130"><template slot-scope="scope"><el-tag :type="statusType(accountStatus(scope.row))" size="mini">{{ statusLabel(accountStatus(scope.row)) }}</el-tag></template></el-table-column>
|
|
|
|
|
<el-table-column prop="updated_at" label="企业信息更新时间" width="180" />
|
|
|
|
|
<el-table-column label="操作" width="120" fixed="right"><template slot-scope="scope"><el-button v-if="accountStatus(scope.row) === 'selected'" type="text" @click="cancelCandidate(scope.row.qcc_account.id)">取消候选</el-button><el-button v-else-if="accountStatus(scope.row) === 'unknown'" type="text" @click="openUnknownConfirm(scope.row.qcc_account)">人工确认</el-button></template></el-table-column>
|
|
|
|
|
</el-table>
|
|
|
|
|
<el-pagination class="pagination" background layout="total, prev, pager, next" :current-page="candidateQuery.page" :page-size="candidateQuery.page_size" :total="candidateTotal" @current-change="changeCandidatePage" />
|
|
|
|
|
</el-tab-pane>
|
|
|
|
|
|
|
|
|
|
<el-tab-pane label="准入任务与对账" name="tasks">
|
|
|
|
|
<task-list v-if="activeTab === 'tasks'" :statuses="['approved', 'submitting', 'pending', 'unknown']" empty-text="暂无待处理的准入任务" @reconcile="reconcileEnrollment" />
|
|
|
|
|
</el-tab-pane>
|
|
|
|
|
|
|
|
|
|
<el-tab-pane label="已确认企业户" name="confirmed">
|
|
|
|
|
<task-list v-if="activeTab === 'confirmed'" :statuses="['confirmed']" empty-text="暂无已确认企业户" :readonly="true" />
|
|
|
|
|
</el-tab-pane>
|
|
|
|
|
|
|
|
|
|
<el-tab-pane label="异常处理" name="exceptions">
|
|
|
|
|
<task-list v-if="activeTab === 'exceptions'" :statuses="['rejected', 'conflict', 'unknown']" empty-text="暂无异常准入记录" @reconcile="reconcileEnrollment" />
|
|
|
|
|
</el-tab-pane>
|
|
|
|
|
<el-tab-pane label="已占额企业" name="occupied"><account-list v-if="activeTab === 'occupied'" status="occupied" empty-text="暂无已占额企业" /></el-tab-pane>
|
|
|
|
|
<el-tab-pane label="待人工确认" name="unknown"><account-list v-if="activeTab === 'unknown'" ref="unknownList" status="unknown" empty-text="暂无待人工确认企业" @confirm="openUnknownConfirm" /></el-tab-pane>
|
|
|
|
|
</el-tabs>
|
|
|
|
|
|
|
|
|
|
<el-dialog title="确认发起企业户准入" :visible.sync="submitDialogVisible" width="620px" :close-on-click-modal="false">
|
|
|
|
|
<el-alert title="提交后将通知企查查平台(可能经元禾接口穿透)。平台确认成功后不可撤销。" type="error" :closable="false" show-icon />
|
|
|
|
|
<el-table :data="validCandidates" max-height="250" style="margin-top: 16px">
|
|
|
|
|
<el-table-column prop="company_name" label="企业名称" />
|
|
|
|
|
<el-table-column prop="credit_code" label="统一社会信用代码" width="200" />
|
|
|
|
|
</el-table>
|
|
|
|
|
<el-form label-width="90px" style="margin-top: 18px">
|
|
|
|
|
<el-form-item label="准入用途" required><el-input v-model.trim="submitForm.business_category" maxlength="100" placeholder="例如:企查查企业户准入" /></el-form-item>
|
|
|
|
|
<el-form-item label="备注"><el-input v-model.trim="submitForm.remark" type="textarea" :rows="3" maxlength="500" show-word-limit /></el-form-item>
|
|
|
|
|
<el-dialog title="确认未知状态" :visible.sync="confirmDialogVisible" width="560px" :close-on-click-modal="false">
|
|
|
|
|
<el-alert title="请先通过企查查其他操作界面核验。确认“已占额”后不可撤销。" type="warning" :closable="false" show-icon />
|
|
|
|
|
<el-form label-width="100px" style="margin-top: 18px">
|
|
|
|
|
<el-form-item label="确认结论" required><el-radio-group v-model="confirmForm.decision"><el-radio label="retry">确认未成功</el-radio><el-radio label="occupied">确认已占额</el-radio></el-radio-group></el-form-item>
|
|
|
|
|
<el-form-item label="核验依据" required><el-input v-model.trim="confirmForm.evidence" type="textarea" :rows="4" maxlength="2000" show-word-limit placeholder="填写企查查操作记录号、截图编号或核验说明" /></el-form-item>
|
|
|
|
|
</el-form>
|
|
|
|
|
<div slot="footer">
|
|
|
|
|
<el-button @click="submitDialogVisible = false">取消</el-button>
|
|
|
|
|
<el-button type="danger" :loading="submitting" :disabled="validCandidates.length === 0" @click="submitEnrollments">确认提交</el-button>
|
|
|
|
|
</div>
|
|
|
|
|
<div slot="footer"><el-button @click="confirmDialogVisible = false">取消</el-button><el-button type="primary" :loading="confirming" @click="confirmUnknown">确认</el-button></div>
|
|
|
|
|
</el-dialog>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
import { candidates, index, submit, reconcile } from '@/api/qccEnterpriseAccount/index'
|
|
|
|
|
|
|
|
|
|
const statusMap = {
|
|
|
|
|
draft: ['info', '草稿'], approved: ['warning', '待提交'], submitting: ['warning', '提交中'],
|
|
|
|
|
pending: ['warning', '平台处理中'], confirmed: ['success', '已确认'], rejected: ['danger', '已拒绝'],
|
|
|
|
|
conflict: ['danger', '数据冲突'], unknown: ['danger', '状态未知']
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const StatusTag = {
|
|
|
|
|
props: { status: String, text: String },
|
|
|
|
|
computed: {
|
|
|
|
|
type() { return (statusMap[this.status] || ['info'])[0] },
|
|
|
|
|
label() { return this.text || (statusMap[this.status] || ['info', '-'])[1] }
|
|
|
|
|
},
|
|
|
|
|
template: '<el-tag :type="type" size="mini">{{ label }}</el-tag>'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const TaskList = {
|
|
|
|
|
components: { StatusTag },
|
|
|
|
|
props: { statuses: Array, emptyText: String, readonly: Boolean },
|
|
|
|
|
data() { return { list: [], total: 0, page: 1, loading: false } },
|
|
|
|
|
watch: { statuses: { immediate: true, handler() { this.page = 1; this.load() } }},
|
|
|
|
|
methods: {
|
|
|
|
|
async load() {
|
|
|
|
|
this.loading = true
|
|
|
|
|
try {
|
|
|
|
|
const res = await index({ statuses: this.statuses, page: this.page, page_size: 10 })
|
|
|
|
|
this.list = res.data || []
|
|
|
|
|
this.total = res.total || 0
|
|
|
|
|
} finally { this.loading = false }
|
|
|
|
|
},
|
|
|
|
|
changePage(page) { this.page = page; this.load() }
|
|
|
|
|
},
|
|
|
|
|
template: `
|
|
|
|
|
<div v-loading="loading">
|
|
|
|
|
<el-table :data="list" border stripe empty-text="暂无数据">
|
|
|
|
|
<el-table-column prop="company_name" label="企业名称" min-width="200" />
|
|
|
|
|
<el-table-column prop="credit_code" label="统一社会信用代码" width="200" />
|
|
|
|
|
<el-table-column label="真实状态" width="130"><template slot-scope="scope"><status-tag :status="scope.row.status" :text="scope.row.status_text" /></template></el-table-column>
|
|
|
|
|
<el-table-column prop="external_request_id" label="平台请求号" min-width="180" />
|
|
|
|
|
<el-table-column prop="submitted_at" label="提交时间" width="180" />
|
|
|
|
|
<el-table-column prop="confirmed_at" label="确认时间" width="180" />
|
|
|
|
|
<el-table-column v-if="!readonly" label="操作" width="120" fixed="right"><template slot-scope="scope"><el-button v-if="scope.row.status !== 'rejected'" type="primary" size="mini" @click="$emit('reconcile', scope.row)">查询真实状态</el-button></template></el-table-column>
|
|
|
|
|
</el-table>
|
|
|
|
|
<el-pagination class="pagination" background layout="total, prev, pager, next" :current-page="page" :page-size="10" :total="total" @current-change="changePage" />
|
|
|
|
|
</div>`
|
|
|
|
|
}
|
|
|
|
|
import { candidates, select, cancel, unknownConfirm } from '@/api/qccEnterpriseAccount/index'
|
|
|
|
|
import AccountList from './components/AccountList'
|
|
|
|
|
|
|
|
|
|
const statusMap = { none: ['info', '未纳入'], selected: ['warning', '候选'], occupied: ['success', '已占额'], unknown: ['danger', '待人工确认'] }
|
|
|
|
|
export default {
|
|
|
|
|
name: 'QccEnterpriseAccount',
|
|
|
|
|
components: { StatusTag, TaskList },
|
|
|
|
|
data() {
|
|
|
|
|
return {
|
|
|
|
|
activeTab: 'apply', loading: false, candidates: [], candidateTotal: 0, selectedCandidates: [],
|
|
|
|
|
candidateQuery: { keyword: '', page: 1, page_size: 10 }, submitDialogVisible: false, submitting: false,
|
|
|
|
|
submitForm: { business_category: '', remark: '' }
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
computed: {
|
|
|
|
|
validCandidates() { return this.selectedCandidates.filter(item => item.credit_code && item.qcc_account_status !== 'confirmed') }
|
|
|
|
|
},
|
|
|
|
|
created() {
|
|
|
|
|
if (this.$route.query.company_id) this.candidateQuery.company_id = this.$route.query.company_id
|
|
|
|
|
this.searchCandidates()
|
|
|
|
|
},
|
|
|
|
|
name: 'QccEnterpriseAccount', components: { AccountList },
|
|
|
|
|
data() { return { activeTab: 'candidates', loading: false, candidateList: [], candidateTotal: 0, selectedCompanies: [], candidateQuery: { keyword: '', status: '', page: 1, page_size: 20 }, confirmDialogVisible: false, confirming: false, confirmForm: { id: '', decision: 'retry', evidence: '' }} },
|
|
|
|
|
created() { this.loadCandidates() },
|
|
|
|
|
methods: {
|
|
|
|
|
async searchCandidates() {
|
|
|
|
|
this.loading = true
|
|
|
|
|
try {
|
|
|
|
|
const res = await candidates(this.candidateQuery)
|
|
|
|
|
this.candidates = res.data || []
|
|
|
|
|
this.candidateTotal = res.total || 0
|
|
|
|
|
} finally { this.loading = false }
|
|
|
|
|
},
|
|
|
|
|
changeCandidatePage(page) { this.candidateQuery.page = page; this.searchCandidates() },
|
|
|
|
|
handleTabChange() {},
|
|
|
|
|
openSubmitDialog() {
|
|
|
|
|
if (this.validCandidates.length !== this.selectedCandidates.length) this.$message.warning('已自动排除缺少信用代码或已确认的企业')
|
|
|
|
|
if (!this.validCandidates.length) return
|
|
|
|
|
this.submitDialogVisible = true
|
|
|
|
|
},
|
|
|
|
|
async submitEnrollments() {
|
|
|
|
|
if (!this.submitForm.business_category) return this.$message.warning('请填写准入用途')
|
|
|
|
|
this.submitting = true
|
|
|
|
|
try {
|
|
|
|
|
await submit({ company_ids: this.validCandidates.map(item => item.id), business_category: this.submitForm.business_category, remark: this.submitForm.remark })
|
|
|
|
|
this.$message.success('已创建准入任务,请在“准入任务与对账”中查询平台真实状态')
|
|
|
|
|
this.submitDialogVisible = false
|
|
|
|
|
this.selectedCandidates = []
|
|
|
|
|
this.searchCandidates()
|
|
|
|
|
this.activeTab = 'tasks'
|
|
|
|
|
} finally { this.submitting = false }
|
|
|
|
|
},
|
|
|
|
|
async reconcileEnrollment(enrollment) {
|
|
|
|
|
await reconcile({ id: enrollment.id })
|
|
|
|
|
this.$message.success('已发起真实状态查询,请稍后刷新任务列表')
|
|
|
|
|
}
|
|
|
|
|
accountStatus(company) { return company.qcc_account ? company.qcc_account.status : 'none' },
|
|
|
|
|
statusType(status) { return (statusMap[status] || statusMap.none)[0] },
|
|
|
|
|
statusLabel(status) { return (statusMap[status] || statusMap.none)[1] },
|
|
|
|
|
isSelectable(row) { return Boolean(row.credit_code) && this.accountStatus(row) === 'none' },
|
|
|
|
|
async loadCandidates() { this.loading = true; this.selectedCompanies = []; try { const res = await candidates(this.candidateQuery); this.candidateList = res.data || []; this.candidateTotal = res.total || 0 } finally { this.loading = false } },
|
|
|
|
|
resetCandidatePage() { this.candidateQuery.page = 1; this.loadCandidates() },
|
|
|
|
|
changeCandidatePage(page) { this.candidateQuery.page = page; this.loadCandidates() },
|
|
|
|
|
async selectCompanies() { await select({ company_ids: this.selectedCompanies.map(item => item.id) }); this.$message.success('已纳入候选池,尚未发生外部调用'); this.selectedCompanies = []; this.loadCandidates() },
|
|
|
|
|
async cancelCandidate(id) { await this.$confirm('仅候选状态可取消,确认继续吗?', '取消候选', { type: 'warning' }); await cancel({ id }); this.$message.success('已取消候选关系'); this.loadCandidates() },
|
|
|
|
|
openUnknownConfirm(account) { this.confirmForm = { id: account.id, decision: 'retry', evidence: '' }; this.confirmDialogVisible = true },
|
|
|
|
|
async confirmUnknown() { if (!this.confirmForm.evidence) return this.$message.warning('请填写核验依据'); if (this.confirmForm.decision === 'occupied') await this.$confirm('确认已占额后不可撤销,确认继续吗?', '不可撤销确认', { type: 'warning' }); this.confirming = true; try { await unknownConfirm(this.confirmForm); this.$message.success('状态已确认'); this.confirmDialogVisible = false; if (this.$refs.unknownList) this.$refs.unknownList.load(); this.loadCandidates() } finally { this.confirming = false } }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</script>
|
|
|
|
|
|