上传
This commit is contained in:
@@ -49,3 +49,8 @@ export const getOpearateRecord = async (params) => {
|
|||||||
export const getPublicClue = async (data) => {
|
export const getPublicClue = async (data) => {
|
||||||
return await request.put({ url: '/admin-api/crm/sch-clue/public/save', data })
|
return await request.put({ url: '/admin-api/crm/sch-clue/public/save', data })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获得线索跟进用户信息
|
||||||
|
export const getFollowUserList = async (params) => {
|
||||||
|
return await request.get({ url: '/admin-api/crm/sch-clue/get-follow-user', params })
|
||||||
|
}
|
||||||
|
|||||||
16
src/api/clue/payment.js
Normal file
16
src/api/clue/payment.js
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import request from '@/config/axios'
|
||||||
|
|
||||||
|
// 查询(精简)列表
|
||||||
|
export const getPaymentList = async (params) => {
|
||||||
|
return await request.get({ url: '/admin-api/crm/sign-pay-record/list', params })
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增
|
||||||
|
export const createPayment = async (data) => {
|
||||||
|
return await request.post({ url: '/admin-api/crm/sign-pay-record/create', data })
|
||||||
|
}
|
||||||
|
|
||||||
|
// 审核
|
||||||
|
export const auditPayment = async (data) => {
|
||||||
|
return await request.post({ url: '/admin-api/crm/sign-pay-record/check', data })
|
||||||
|
}
|
||||||
@@ -27,7 +27,8 @@ const props = defineProps({
|
|||||||
data: {
|
data: {
|
||||||
type: Object as PropType<any>,
|
type: Object as PropType<any>,
|
||||||
default: () => ({})
|
default: () => ({})
|
||||||
}
|
},
|
||||||
|
defaultShow: propTypes.bool.def(true)
|
||||||
})
|
})
|
||||||
|
|
||||||
const { getPrefixCls } = useDesign()
|
const { getPrefixCls } = useDesign()
|
||||||
@@ -57,7 +58,7 @@ const getBindItemValue = (item: DescriptionsSchema) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 折叠
|
// 折叠
|
||||||
const show = ref(true)
|
const show = ref(props.defaultShow)
|
||||||
|
|
||||||
const toggleClick = () => {
|
const toggleClick = () => {
|
||||||
if (props.collapse) {
|
if (props.collapse) {
|
||||||
|
|||||||
150
src/views/Clue/Order/Comp/AfterSales.vue
Normal file
150
src/views/Clue/Order/Comp/AfterSales.vue
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<el-form :model="searchForm" label-width="0" inline>
|
||||||
|
<el-form-item>
|
||||||
|
<el-input v-model="searchForm.signId" placeholder="成交单号" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-input v-model="searchForm.name" placeholder="线索名称" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-select v-model="searchForm.dealUser" placeholder="登记人" clearable filterable>
|
||||||
|
<el-option
|
||||||
|
v-for="item in userOptions"
|
||||||
|
:key="item.id"
|
||||||
|
:label="item.nickname"
|
||||||
|
:value="item.id"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-date-picker
|
||||||
|
v-model="searchForm.dealDate"
|
||||||
|
type="daterange"
|
||||||
|
range-separator="-"
|
||||||
|
start-placeholder="登记日期"
|
||||||
|
end-placeholder="登记日期"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-select v-model="searchForm.createUser" placeholder="申请人" clearable filterable>
|
||||||
|
<el-option
|
||||||
|
v-for="item in userOptions"
|
||||||
|
:key="item.id"
|
||||||
|
:label="item.nickname"
|
||||||
|
:value="item.id"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-date-picker
|
||||||
|
v-model="searchForm.createDate"
|
||||||
|
type="daterange"
|
||||||
|
range-separator="-"
|
||||||
|
start-placeholder="申请日期"
|
||||||
|
end-placeholder="申请日期"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button @click="handleSearch">查询</el-button>
|
||||||
|
<el-button @click="handleReset">重置</el-button>
|
||||||
|
<el-button @click="batchAudit">批量审核</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
|
||||||
|
<el-table :data="tableList" border>
|
||||||
|
<el-table-column prop="signId" label="成交单号" width="150px" />
|
||||||
|
<el-table-column prop="name" label="线索名称" width="120px" />
|
||||||
|
<el-table-column prop="phone" label="联系方式" width="150px" />
|
||||||
|
<el-table-column prop="signId" label="售后原因" width="150px" />
|
||||||
|
<el-table-column prop="signId" label="退款金额" width="90px" />
|
||||||
|
<el-table-column prop="signId" label="是否退货" width="90px" />
|
||||||
|
<el-table-column prop="signId" label="解决方案" width="150px" />
|
||||||
|
<el-table-column prop="signId" label="备注" width="200px" />
|
||||||
|
<el-table-column prop="signId" label="登记人" />
|
||||||
|
<el-table-column prop="signId" label="登记时间" width="150px" />
|
||||||
|
<el-table-column prop="signId" label="申请人" />
|
||||||
|
<el-table-column prop="signId" label="申请时间" width="150px" />
|
||||||
|
<el-table-column prop="signId" label="审核状态" fixed="right" width="90px" />
|
||||||
|
<el-table-column label="操作" width="150px" fixed="right">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-button type="primary" style="padding: 0" text @click="handleDetail(row.id)">
|
||||||
|
详情
|
||||||
|
</el-button>
|
||||||
|
<el-button type="primary" style="padding: 0" text @click="handleCancel(row.id)">
|
||||||
|
撤销
|
||||||
|
</el-button>
|
||||||
|
<el-button type="primary" style="padding: 0" text @click="handleAudit(row.id)">
|
||||||
|
审核
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<Pagination
|
||||||
|
v-model:limit="searchForm.pageSize"
|
||||||
|
v-model:page="searchForm.pageNo"
|
||||||
|
:total="total"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup name="AfterSales">
|
||||||
|
const searchForm = ref({
|
||||||
|
signId: undefined,
|
||||||
|
name: undefined,
|
||||||
|
dealDate: [],
|
||||||
|
dealUser: undefined,
|
||||||
|
createDate: [],
|
||||||
|
createUser: undefined,
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 20
|
||||||
|
})
|
||||||
|
|
||||||
|
const userOptions = ref([])
|
||||||
|
|
||||||
|
const tableList = ref([])
|
||||||
|
const total = ref(0)
|
||||||
|
|
||||||
|
function handleSearch() {
|
||||||
|
searchForm.value.pageNo = 1
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleReset() {
|
||||||
|
searchForm.value = {
|
||||||
|
signId: undefined,
|
||||||
|
name: undefined,
|
||||||
|
dealDate: [],
|
||||||
|
dealUser: undefined,
|
||||||
|
createDate: [],
|
||||||
|
createUser: undefined,
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 20
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getList() {
|
||||||
|
tableList.value = [{ name: '测试' }]
|
||||||
|
}
|
||||||
|
|
||||||
|
function batchAudit() {
|
||||||
|
console.log(123)
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleDetail(id) {
|
||||||
|
console.log(id)
|
||||||
|
}
|
||||||
|
function handleCancel(id) {
|
||||||
|
console.log(id)
|
||||||
|
}
|
||||||
|
function handleAudit(id) {
|
||||||
|
console.log(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
handleSearch()
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped></style>
|
||||||
0
src/views/Clue/Order/Comp/Delivery.vue
Normal file
0
src/views/Clue/Order/Comp/Delivery.vue
Normal file
107
src/views/Clue/Order/Comp/DialogOrder.vue
Normal file
107
src/views/Clue/Order/Comp/DialogOrder.vue
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
<template>
|
||||||
|
<Dialog title="成交详情" v-model="show" width="800px">
|
||||||
|
<el-tabs v-model="tabName">
|
||||||
|
<el-tab-pane label="线索信息" name="clueInfo">
|
||||||
|
<Descriptions :data="clueInfo" :schema="clueSchema" :columns="2" labelWidth="130px" />
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane label="成交信息" name="orderInfo">
|
||||||
|
<Descriptions :data="orderInfo" :schema="orderSchema" :columns="2" labelWidth="130px" />
|
||||||
|
<el-divider direction="horizontal" content-position="left">额外支出</el-divider>
|
||||||
|
<el-table :data="orderInfo.extraPay" border stripe>
|
||||||
|
<el-table-column type="index" width="50" />
|
||||||
|
<el-table-column prop="extraPayType" label="额外支出项" />
|
||||||
|
<el-table-column prop="extraPayMoney" label="支出金额" />
|
||||||
|
<el-table-column prop="remark" label="备注" />
|
||||||
|
</el-table>
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane label="回款记录" name="returnRecord">
|
||||||
|
<el-table :data="returnRecord" border stripe>
|
||||||
|
<el-table-column type="index" width="50" />
|
||||||
|
<el-table-column prop="money" label="回款金额" />
|
||||||
|
<el-table-column prop="" label="回款日期" />
|
||||||
|
<el-table-column prop="" label="是否结清" />
|
||||||
|
<el-table-column prop="remark" label="备注" />
|
||||||
|
<el-table-column prop="" label="审核状态" />
|
||||||
|
</el-table>
|
||||||
|
</el-tab-pane>
|
||||||
|
</el-tabs>
|
||||||
|
<div class="mb-15px"></div>
|
||||||
|
</Dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup name="DialogOrder">
|
||||||
|
import * as ClueApi from '@/api/clue'
|
||||||
|
import * as OrderApi from '@/api/clue/sign'
|
||||||
|
import { getSimpleFieldList as getClueFieldList } from '@/api/clue/clueField'
|
||||||
|
import { getSimpleFieldList as getOrderFieldList } from '@/api/clue/orderField'
|
||||||
|
import { getPaymentList } from '@/api/clue/payment'
|
||||||
|
|
||||||
|
import { formatDate } from '@/utils/formatTime'
|
||||||
|
|
||||||
|
const tabName = ref('clueInfo')
|
||||||
|
const show = ref(false)
|
||||||
|
const clueInfo = ref({})
|
||||||
|
const orderInfo = ref({})
|
||||||
|
const returnRecord = ref([])
|
||||||
|
|
||||||
|
function open(clueId, orderId) {
|
||||||
|
try {
|
||||||
|
show.value = true
|
||||||
|
tabName.value = 'clueInfo'
|
||||||
|
getFields()
|
||||||
|
ClueApi.getClue(clueId).then((data) => {
|
||||||
|
clueInfo.value = { ...data, ...data.diyParams }
|
||||||
|
})
|
||||||
|
OrderApi.getSign(orderId).then((data) => {
|
||||||
|
orderInfo.value = { ...data, ...data.diyParams }
|
||||||
|
orderInfo.value.dealDate = formatDate(orderInfo.value.dealDate, 'YYYY-MM-DD HH:mm')
|
||||||
|
})
|
||||||
|
getPaymentList({ signId: orderId }).then((data) => {
|
||||||
|
returnRecord.value = data
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const clueSchema = ref([])
|
||||||
|
const orderSchema = ref([])
|
||||||
|
function getFields() {
|
||||||
|
getClueFieldList().then((data) => {
|
||||||
|
const arr = useCrudSchemas(data).allSchemas.detailSchema
|
||||||
|
clueSchema.value = [
|
||||||
|
...arr,
|
||||||
|
{
|
||||||
|
field: 'requirement',
|
||||||
|
label: '诉求',
|
||||||
|
span: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
field: 'remark',
|
||||||
|
label: '备注',
|
||||||
|
span: 2,
|
||||||
|
isEditor: true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
|
||||||
|
getOrderFieldList().then((data) => {
|
||||||
|
const arr = useCrudSchemas(data).allSchemas.detailSchema
|
||||||
|
orderSchema.value = [
|
||||||
|
...arr,
|
||||||
|
{
|
||||||
|
field: 'remark',
|
||||||
|
label: '备注',
|
||||||
|
span: 2,
|
||||||
|
isEditor: true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
open
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped></style>
|
||||||
335
src/views/Clue/Order/Comp/OrderList.vue
Normal file
335
src/views/Clue/Order/Comp/OrderList.vue
Normal file
@@ -0,0 +1,335 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<!-- 搜索工作栏 -->
|
||||||
|
<div>
|
||||||
|
<el-form :model="searchForm" ref="moreSearchRef" inline label-width="0">
|
||||||
|
<template v-if="appStore.getAppInfo?.instanceType == 1">
|
||||||
|
<el-form-item>
|
||||||
|
<el-select
|
||||||
|
v-model="searchForm.signSchool"
|
||||||
|
placeholder="选择驾校"
|
||||||
|
filterable
|
||||||
|
clearable
|
||||||
|
@change="changeSchool"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="item in schoolOptions"
|
||||||
|
:key="item.schoolId"
|
||||||
|
:label="item.schoolName"
|
||||||
|
:value="item.schoolId"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-select
|
||||||
|
v-model="searchForm.signPlace"
|
||||||
|
placeholder="选择场地"
|
||||||
|
filterable
|
||||||
|
clearable
|
||||||
|
:disabled="!searchForm.signSchool"
|
||||||
|
@change="changePlace"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="item in placeOptions"
|
||||||
|
:key="item.placeId"
|
||||||
|
:label="item.name"
|
||||||
|
:value="item.placeId"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-select
|
||||||
|
v-model="searchForm.signClass"
|
||||||
|
:disabled="!searchForm.signPlace"
|
||||||
|
placeholder="选择班型"
|
||||||
|
filterable
|
||||||
|
clearable
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="item in classOptions"
|
||||||
|
:key="item.typeId"
|
||||||
|
:label="item.typeName"
|
||||||
|
:value="item.typeId"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="appStore.getAppInfo?.instanceType == 2">
|
||||||
|
<el-form-item>
|
||||||
|
<el-select
|
||||||
|
v-model="searchForm.signProduct"
|
||||||
|
placeholder="选择成交产品"
|
||||||
|
filterable
|
||||||
|
@change="searchForm.specsId = undefined"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="item in prodOptions"
|
||||||
|
:key="item.productId"
|
||||||
|
:label="item.productName"
|
||||||
|
:value="item.productId"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-select
|
||||||
|
v-model="searchForm.specsId"
|
||||||
|
placeholder="选择规格"
|
||||||
|
filterable
|
||||||
|
:disabled="!searchForm.signProduct"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="item in specsOptions(searchForm.signProduct)"
|
||||||
|
:key="item.specsId"
|
||||||
|
:label="item.specsName"
|
||||||
|
:value="item.specsId"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-form>
|
||||||
|
<Search v-if="!loading" ref="searchRef" :schema="allSchemas.searchSchema" labelWidth="0">
|
||||||
|
<template #actionMore>
|
||||||
|
<el-button @click="getTableList" v-hasPermi="['clue:order:search']"> 搜索 </el-button>
|
||||||
|
<el-button @click="resetQuery" v-hasPermi="['clue:order:reset']"> 重置 </el-button>
|
||||||
|
</template>
|
||||||
|
</Search>
|
||||||
|
</div>
|
||||||
|
<!-- 列表 -->
|
||||||
|
<SSTable
|
||||||
|
v-if="!loading"
|
||||||
|
class="mt-20px"
|
||||||
|
v-model:tableObject="tableObject"
|
||||||
|
:tableColumns="allSchemas.tableColumns"
|
||||||
|
@get-list="getTableList"
|
||||||
|
>
|
||||||
|
<el-table-column
|
||||||
|
v-for="item in allSchemas.tableColumns"
|
||||||
|
:key="item.field"
|
||||||
|
:prop="item.field"
|
||||||
|
:label="item.label"
|
||||||
|
min-width="120px"
|
||||||
|
/>
|
||||||
|
<el-table-column label="操作" width="200px" fixed="right">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
class="mr-10px"
|
||||||
|
link
|
||||||
|
style="padding: 0; margin-left: 0"
|
||||||
|
v-hasPermi="['clue:order:detail']"
|
||||||
|
@click="handleDetail(scope.row)"
|
||||||
|
>
|
||||||
|
详情
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
class="mr-10px"
|
||||||
|
link
|
||||||
|
style="padding: 0; margin-left: 0"
|
||||||
|
v-hasPermi="['clue:order:after-sale']"
|
||||||
|
@click="sellAfter(scope.row)"
|
||||||
|
>
|
||||||
|
售后
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
class="mr-10px"
|
||||||
|
link
|
||||||
|
style="padding: 0; margin-left: 0"
|
||||||
|
v-hasPermi="['clue:order:after-sale-audit']"
|
||||||
|
>
|
||||||
|
售后审核
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
class="mr-10px"
|
||||||
|
link
|
||||||
|
v-if="appStore.getAppInfo?.instanceType == 2"
|
||||||
|
style="padding: 0; margin-left: 0"
|
||||||
|
v-hasPermi="['clue:order:send']"
|
||||||
|
>
|
||||||
|
发货
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
class="mr-10px"
|
||||||
|
link
|
||||||
|
style="padding: 0; margin-left: 0"
|
||||||
|
v-hasPermi="['clue:order:return']"
|
||||||
|
@click="feeBack(scope.row)"
|
||||||
|
>
|
||||||
|
回款
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
class="mr-10px"
|
||||||
|
link
|
||||||
|
style="padding: 0; margin-left: 0"
|
||||||
|
v-hasPermi="['clue:order:return-audit']"
|
||||||
|
>
|
||||||
|
回款确认
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</SSTable>
|
||||||
|
|
||||||
|
<!-- 详情 -->
|
||||||
|
<DialogOrder ref="orderDetailDialog" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup name="ClueOrderList">
|
||||||
|
import { getSimpleFieldList } from '@/api/clue/orderField'
|
||||||
|
import * as SignApi from '@/api/clue/sign'
|
||||||
|
import { getSimpleUserList as getUserOption } from '@/api/system/user'
|
||||||
|
import { getPlaceList } from '@/api/school/place'
|
||||||
|
import { getClassTypePage } from '@/api/school/class'
|
||||||
|
import { getSimpleProductList } from '@/api/mall/product'
|
||||||
|
|
||||||
|
import DialogOrder from './DialogOrder.vue'
|
||||||
|
|
||||||
|
import { removeNullField } from '@/utils'
|
||||||
|
import { useAppStore } from '@/store/modules/app'
|
||||||
|
|
||||||
|
const appStore = useAppStore()
|
||||||
|
|
||||||
|
const allSchemas = ref({})
|
||||||
|
|
||||||
|
const orderDetailDialog = ref()
|
||||||
|
const searchRef = ref()
|
||||||
|
const schoolOptions = ref([])
|
||||||
|
const allPlaceOptions = ref([])
|
||||||
|
const prodOptions = ref([])
|
||||||
|
|
||||||
|
const specsOptions = computed({
|
||||||
|
get() {
|
||||||
|
return (prodId) => {
|
||||||
|
if (prodId) {
|
||||||
|
return prodOptions.value.find((it) => it.productId == prodId).productSpecList
|
||||||
|
}
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const searchForm = ref({
|
||||||
|
signSchool: undefined,
|
||||||
|
signPlace: undefined,
|
||||||
|
signClass: undefined,
|
||||||
|
signProduct: undefined
|
||||||
|
})
|
||||||
|
|
||||||
|
const tableObject = ref({
|
||||||
|
tableList: [],
|
||||||
|
loading: false,
|
||||||
|
total: 1,
|
||||||
|
pageSize: 20,
|
||||||
|
currentPage: 1
|
||||||
|
})
|
||||||
|
|
||||||
|
const placeOptions = computed(() => {
|
||||||
|
return allPlaceOptions.value.filter((it) => it.schoolId == searchForm.value.signSchool)
|
||||||
|
})
|
||||||
|
|
||||||
|
function resetQuery() {
|
||||||
|
searchForm.value = {
|
||||||
|
signSchool: undefined,
|
||||||
|
signPlace: undefined,
|
||||||
|
signClass: undefined,
|
||||||
|
signProduct: undefined
|
||||||
|
}
|
||||||
|
searchRef.value.reset()
|
||||||
|
tableObject.value.currentPage = 1
|
||||||
|
getTableList()
|
||||||
|
}
|
||||||
|
// 查询
|
||||||
|
async function getTableList() {
|
||||||
|
// 查询
|
||||||
|
tableObject.value.loading = true
|
||||||
|
try {
|
||||||
|
const queryParams = await searchRef.value.getFormModel()
|
||||||
|
const params = {
|
||||||
|
...queryParams,
|
||||||
|
...searchForm.value,
|
||||||
|
pageNo: tableObject.value.currentPage,
|
||||||
|
pageSize: tableObject.value.pageSize
|
||||||
|
}
|
||||||
|
const data = await SignApi.getSignPage(removeNullField(params))
|
||||||
|
tableObject.value.tableList = data.list.map((it) => ({ ...it, ...it.diyParams }))
|
||||||
|
tableObject.value.total = data.total
|
||||||
|
} finally {
|
||||||
|
tableObject.value.loading = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const loading = ref(true)
|
||||||
|
async function getCurdSchemas() {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const data = await getSimpleFieldList()
|
||||||
|
data.forEach((elem) => {
|
||||||
|
if (elem.field == 'createUser') {
|
||||||
|
elem.search.options = userOptions.value
|
||||||
|
}
|
||||||
|
})
|
||||||
|
allSchemas.value = useCrudSchemas(data).allSchemas
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
nextTick(() => {
|
||||||
|
getTableList()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 详情
|
||||||
|
function handleDetail(row) {
|
||||||
|
orderDetailDialog.value.open(row.clueId, row.signId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 售后
|
||||||
|
function sellAfter() {
|
||||||
|
// 方法体
|
||||||
|
}
|
||||||
|
|
||||||
|
function changeSchool() {
|
||||||
|
searchForm.value.signPlace = undefined
|
||||||
|
searchForm.value.signClass = undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
function changePlace() {
|
||||||
|
searchForm.value.signClass = undefined
|
||||||
|
getClassTypeOptions()
|
||||||
|
}
|
||||||
|
|
||||||
|
const classOptions = ref([])
|
||||||
|
async function getClassTypeOptions() {
|
||||||
|
const data = await getClassTypePage({ placeId: searchForm.value.signPlace })
|
||||||
|
classOptions.value = data.list
|
||||||
|
}
|
||||||
|
|
||||||
|
function getOptions() {
|
||||||
|
if (appStore.getAppInfo?.instanceType == 1) {
|
||||||
|
// 驾校
|
||||||
|
getPlaceList().then((data) => {
|
||||||
|
schoolOptions.value = data.schoolList
|
||||||
|
allPlaceOptions.value = data.placeList
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
// 产品
|
||||||
|
getSimpleProductList().then((data) => {
|
||||||
|
prodOptions.value = data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const userOptions = ref([])
|
||||||
|
onMounted(() => {
|
||||||
|
getUserOption().then((data) => {
|
||||||
|
userOptions.value = data
|
||||||
|
getCurdSchemas()
|
||||||
|
})
|
||||||
|
getOptions()
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped></style>
|
||||||
148
src/views/Clue/Order/Comp/Reback.vue
Normal file
148
src/views/Clue/Order/Comp/Reback.vue
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<el-form :model="searchForm" label-width="0" inline>
|
||||||
|
<el-form-item>
|
||||||
|
<el-input v-model="searchForm.signId" placeholder="成交单号" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-input v-model="searchForm.name" placeholder="线索名称" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-select v-model="searchForm.dealUser" placeholder="登记人" clearable filterable>
|
||||||
|
<el-option
|
||||||
|
v-for="item in userOptions"
|
||||||
|
:key="item.id"
|
||||||
|
:label="item.nickname"
|
||||||
|
:value="item.id"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-date-picker
|
||||||
|
v-model="searchForm.dealDate"
|
||||||
|
type="daterange"
|
||||||
|
range-separator="-"
|
||||||
|
start-placeholder="登记日期"
|
||||||
|
end-placeholder="登记日期"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-select v-model="searchForm.createUser" placeholder="申请人" clearable filterable>
|
||||||
|
<el-option
|
||||||
|
v-for="item in userOptions"
|
||||||
|
:key="item.id"
|
||||||
|
:label="item.nickname"
|
||||||
|
:value="item.id"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-date-picker
|
||||||
|
v-model="searchForm.createDate"
|
||||||
|
type="daterange"
|
||||||
|
range-separator="-"
|
||||||
|
start-placeholder="申请日期"
|
||||||
|
end-placeholder="申请日期"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button @click="handleSearch">查询</el-button>
|
||||||
|
<el-button @click="handleReset">重置</el-button>
|
||||||
|
<el-button @click="batchAudit">批量审核</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
|
||||||
|
<el-table :data="tableList" border>
|
||||||
|
<el-table-column prop="signId" label="成交单号" width="150px" />
|
||||||
|
<el-table-column prop="name" label="线索名称" />
|
||||||
|
<el-table-column prop="phone" label="联系方式" width="150px" />
|
||||||
|
<el-table-column prop="signId" label="回款金额" />
|
||||||
|
<el-table-column prop="signId" label="是否结清" />
|
||||||
|
<el-table-column prop="signId" label="备注" width="200px" />
|
||||||
|
<el-table-column prop="signId" label="登记人" />
|
||||||
|
<el-table-column prop="signId" label="登记时间" width="150px" />
|
||||||
|
<el-table-column prop="signId" label="申请人" />
|
||||||
|
<el-table-column prop="signId" label="申请时间" width="150px" />
|
||||||
|
<el-table-column prop="signId" label="审核状态" fixed="right" />
|
||||||
|
<el-table-column label="操作" width="150px" fixed="right">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-button type="primary" style="padding: 0" text @click="handleDetail(row.id)"
|
||||||
|
>详情</el-button
|
||||||
|
>
|
||||||
|
<el-button type="primary" style="padding: 0" text @click="handleCancel(row.id)"
|
||||||
|
>撤销</el-button
|
||||||
|
>
|
||||||
|
<el-button type="primary" style="padding: 0" text @click="handleAudit(row.id)"
|
||||||
|
>审核</el-button
|
||||||
|
>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<Pagination
|
||||||
|
v-model:limit="searchForm.pageSize"
|
||||||
|
v-model:page="searchForm.pageNo"
|
||||||
|
:total="total"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup name="Reback">
|
||||||
|
const searchForm = ref({
|
||||||
|
signId: undefined,
|
||||||
|
name: undefined,
|
||||||
|
dealDate: [],
|
||||||
|
dealUser: undefined,
|
||||||
|
createDate: [],
|
||||||
|
createUser: undefined,
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 20
|
||||||
|
})
|
||||||
|
|
||||||
|
const userOptions = ref([])
|
||||||
|
|
||||||
|
const tableList = ref([])
|
||||||
|
const total = ref(0)
|
||||||
|
|
||||||
|
function handleSearch() {
|
||||||
|
searchForm.value.pageNo = 1
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleReset() {
|
||||||
|
searchForm.value = {
|
||||||
|
signId: undefined,
|
||||||
|
name: undefined,
|
||||||
|
dealDate: [],
|
||||||
|
dealUser: undefined,
|
||||||
|
createDate: [],
|
||||||
|
createUser: undefined,
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 20
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getList() {
|
||||||
|
tableList.value = [{ name: '测试' }]
|
||||||
|
}
|
||||||
|
|
||||||
|
function batchAudit() {
|
||||||
|
console.log(123)
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleDetail(id) {
|
||||||
|
console.log(id)
|
||||||
|
}
|
||||||
|
function handleCancel(id) {
|
||||||
|
console.log(id)
|
||||||
|
}
|
||||||
|
function handleAudit(id) {
|
||||||
|
console.log(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
handleSearch()
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped></style>
|
||||||
@@ -1,146 +1,28 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<el-tabs v-model="tabName">
|
||||||
<!-- 搜索工作栏 -->
|
<el-tab-pane label="成交列表" name="list">
|
||||||
<Search v-if="!loading" ref="searchRef" :schema="allSchemas.searchSchema" labelWidth="0">
|
<OrderList v-if="tabName == 'list'" />
|
||||||
<template #actionMore>
|
</el-tab-pane>
|
||||||
<el-button @click="getTableList" v-hasPermi="['clue:order:search']"> 搜索 </el-button>
|
<el-tab-pane label="回款申请" name="commission">
|
||||||
<el-button @click="resetQuery" v-hasPermi="['clue:order:reset']"> 重置 </el-button>
|
<Reback v-if="tabName == 'commission'" />
|
||||||
</template>
|
</el-tab-pane>
|
||||||
</Search>
|
<el-tab-pane label="售后申请" name="aftersale">
|
||||||
<!-- 列表 -->
|
<AfterSales v-if="tabName == 'aftersale'" />
|
||||||
<SSTable
|
</el-tab-pane>
|
||||||
v-if="!loading"
|
<el-tab-pane label="发货列表" name="delivery" v-if="appStore.getAppInfo?.instanceType == 2">
|
||||||
class="mt-20px"
|
<OrderList v-if="tabName == 'delivery'" />
|
||||||
v-model:tableObject="tableObject"
|
</el-tab-pane>
|
||||||
:tableColumns="allSchemas.tableColumns"
|
</el-tabs>
|
||||||
@get-list="getTableList"
|
|
||||||
>
|
|
||||||
<el-table-column
|
|
||||||
v-for="item in allSchemas.tableColumns"
|
|
||||||
:key="item.field"
|
|
||||||
:prop="item.field"
|
|
||||||
:label="item.label"
|
|
||||||
min-width="120px"
|
|
||||||
/>
|
|
||||||
<el-table-column label="操作" width="200px" fixed="right">
|
|
||||||
<template #default="scope">
|
|
||||||
<el-button
|
|
||||||
type="primary"
|
|
||||||
class="mr-10px"
|
|
||||||
link
|
|
||||||
style="padding: 0; margin-left: 0"
|
|
||||||
v-hasPermi="['clue:order:after-sale']"
|
|
||||||
@click="sellAfter(scope.row)"
|
|
||||||
>
|
|
||||||
售后
|
|
||||||
</el-button>
|
|
||||||
<el-button
|
|
||||||
type="primary"
|
|
||||||
class="mr-10px"
|
|
||||||
link
|
|
||||||
style="padding: 0; margin-left: 0"
|
|
||||||
v-hasPermi="['clue:order:after-sale-audit']"
|
|
||||||
>
|
|
||||||
售后审核
|
|
||||||
</el-button>
|
|
||||||
<el-button
|
|
||||||
type="primary"
|
|
||||||
class="mr-10px"
|
|
||||||
link
|
|
||||||
style="padding: 0; margin-left: 0"
|
|
||||||
v-hasPermi="['clue:order:send']"
|
|
||||||
>
|
|
||||||
发货(进销存)
|
|
||||||
</el-button>
|
|
||||||
<el-button
|
|
||||||
type="primary"
|
|
||||||
class="mr-10px"
|
|
||||||
link
|
|
||||||
style="padding: 0; margin-left: 0"
|
|
||||||
v-hasPermi="['clue:order:return']"
|
|
||||||
@click="feeBack(scope.row)"
|
|
||||||
>
|
|
||||||
回款
|
|
||||||
</el-button>
|
|
||||||
<el-button
|
|
||||||
type="primary"
|
|
||||||
class="mr-10px"
|
|
||||||
link
|
|
||||||
style="padding: 0; margin-left: 0"
|
|
||||||
v-hasPermi="['clue:order:return-audit']"
|
|
||||||
>
|
|
||||||
回款确认
|
|
||||||
</el-button>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</SSTable>
|
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup name="ClueOrder">
|
<script setup name="ClueOrder">
|
||||||
import { getSimpleFieldList } from '@/api/clue/orderField'
|
import { useAppStore } from '@/store/modules/app'
|
||||||
import * as SignApi from '@/api/clue/sign'
|
import OrderList from './Comp/OrderList.vue'
|
||||||
|
import Reback from './Comp/Reback.vue'
|
||||||
|
import AfterSales from './Comp/AfterSales.vue'
|
||||||
|
|
||||||
import { removeNullField } from '@/utils'
|
const appStore = useAppStore()
|
||||||
|
const tabName = ref('list')
|
||||||
const allSchemas = ref({})
|
|
||||||
|
|
||||||
const searchRef = ref()
|
|
||||||
|
|
||||||
const tableObject = ref({
|
|
||||||
tableList: [],
|
|
||||||
loading: false,
|
|
||||||
total: 1,
|
|
||||||
pageSize: 20,
|
|
||||||
currentPage: 1
|
|
||||||
})
|
|
||||||
|
|
||||||
function resetQuery() {
|
|
||||||
searchRef.value.reset()
|
|
||||||
tableObject.value.currentPage = 1
|
|
||||||
getTableList()
|
|
||||||
}
|
|
||||||
// 查询
|
|
||||||
async function getTableList() {
|
|
||||||
// 查询
|
|
||||||
tableObject.value.loading = true
|
|
||||||
try {
|
|
||||||
const queryParams = await searchRef.value.getFormModel()
|
|
||||||
const params = {
|
|
||||||
...queryParams,
|
|
||||||
pageNo: tableObject.value.currentPage,
|
|
||||||
pageSize: tableObject.value.pageSize
|
|
||||||
}
|
|
||||||
const data = await SignApi.getSignPage(removeNullField(params))
|
|
||||||
tableObject.value.tableList = data.list.map((it) => ({ ...it, ...it.diyParams }))
|
|
||||||
tableObject.value.total = data.total
|
|
||||||
} finally {
|
|
||||||
tableObject.value.loading = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const loading = ref(true)
|
|
||||||
async function getCurdSchemas() {
|
|
||||||
loading.value = true
|
|
||||||
try {
|
|
||||||
const data = await getSimpleFieldList()
|
|
||||||
allSchemas.value = useCrudSchemas(data).allSchemas
|
|
||||||
} finally {
|
|
||||||
loading.value = false
|
|
||||||
nextTick(() => {
|
|
||||||
getTableList()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 售后
|
|
||||||
function sellAfter() {
|
|
||||||
// 方法体
|
|
||||||
}
|
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
getCurdSchemas()
|
|
||||||
})
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped></style>
|
<style lang="scss" scoped></style>
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
<template>
|
<template>
|
||||||
<Dialog title="成交登记" v-model="show" width="820px">
|
<Dialog title="成交登记" v-model="show" width="820px">
|
||||||
<Descriptions
|
<Descriptions
|
||||||
title="线索信息"
|
:title="`线索信息-${info.name}`"
|
||||||
:data="info"
|
:data="info"
|
||||||
:schema="showSchema"
|
:schema="showSchema"
|
||||||
:columns="2"
|
:columns="2"
|
||||||
labelWidth="130px"
|
labelWidth="130px"
|
||||||
|
:defaultShow="false"
|
||||||
/>
|
/>
|
||||||
<el-form :model="form" ref="formRef" :rules="rules" label-width="80px" class="mt-20px">
|
<el-form :model="form" ref="formRef" :rules="rules" label-width="80px" class="mt-20px">
|
||||||
<el-row :gutter="20">
|
<el-row :gutter="20">
|
||||||
|
|||||||
@@ -31,10 +31,10 @@
|
|||||||
<!-- 基础信息 -->
|
<!-- 基础信息 -->
|
||||||
<el-skeleton :loading="loading" animated>
|
<el-skeleton :loading="loading" animated>
|
||||||
<el-table :data="followList" size="small" border class="mt-10px">
|
<el-table :data="followList" size="small" border class="mt-10px">
|
||||||
<el-table-column prop="name" label="跟进人" />
|
<el-table-column prop="userName" label="跟进人" />
|
||||||
<el-table-column prop="latestFollowTime" label="最新跟进时间" />
|
<el-table-column prop="followTime" label="最新跟进时间" :formatter="dateFormatter" />
|
||||||
<el-table-column prop="nextFollowTime" label="下次跟进时间" />
|
<el-table-column prop="nextFollowTime" label="下次跟进时间" />
|
||||||
<el-table-column prop="saleStatus" label="成交状态" />
|
<el-table-column prop="signSate" label="成交状态" />
|
||||||
</el-table>
|
</el-table>
|
||||||
</el-skeleton>
|
</el-skeleton>
|
||||||
<el-divider direction="horizontal" />
|
<el-divider direction="horizontal" />
|
||||||
@@ -124,7 +124,7 @@ import { getPlaceList } from '@/api/school/place'
|
|||||||
|
|
||||||
import DialogFollow from './DialogFollow.vue'
|
import DialogFollow from './DialogFollow.vue'
|
||||||
import AMapLoader from '@amap/amap-jsapi-loader'
|
import AMapLoader from '@amap/amap-jsapi-loader'
|
||||||
import { formatDate } from '@/utils/formatTime'
|
import { formatDate, dateFormatter } from '@/utils/formatTime'
|
||||||
|
|
||||||
import ImgPostion from '@/assets/imgs/flag/position_blue.png'
|
import ImgPostion from '@/assets/imgs/flag/position_blue.png'
|
||||||
import FlagRed from '@/assets/imgs/flag/flag_red.png'
|
import FlagRed from '@/assets/imgs/flag/flag_red.png'
|
||||||
@@ -165,20 +165,7 @@ const showSchema = computed(() => {
|
|||||||
return [...props.schema, ...arr]
|
return [...props.schema, ...arr]
|
||||||
})
|
})
|
||||||
|
|
||||||
const followList = ref([
|
const followList = ref([])
|
||||||
{
|
|
||||||
name: '李四',
|
|
||||||
latestFollowTime: '2024-02-01',
|
|
||||||
nextFollowTime: '2024-04-01',
|
|
||||||
saleStatus: '未成交'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '王二',
|
|
||||||
latestFollowTime: '2024-03-01',
|
|
||||||
nextFollowTime: '2024-04-11',
|
|
||||||
saleStatus: '已成交'
|
|
||||||
}
|
|
||||||
])
|
|
||||||
|
|
||||||
const followRecordList = ref([])
|
const followRecordList = ref([])
|
||||||
const operateRecordList = ref([])
|
const operateRecordList = ref([])
|
||||||
@@ -201,9 +188,16 @@ function getFollowList() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getFollowUsers(id) {
|
||||||
|
ClueApi.getFollowUserList({ id }).then((data) => {
|
||||||
|
followList.value = data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
async function open(id) {
|
async function open(id) {
|
||||||
clueId.value = id
|
clueId.value = id
|
||||||
try {
|
try {
|
||||||
|
getFollowUsers(id)
|
||||||
getFollowList()
|
getFollowList()
|
||||||
ClueApi.getOpearateRecord({ clueId: id }).then((data) => {
|
ClueApi.getOpearateRecord({ clueId: id }).then((data) => {
|
||||||
operateRecordList.value = data.map((item) => ({
|
operateRecordList.value = data.map((item) => ({
|
||||||
|
|||||||
@@ -147,11 +147,11 @@
|
|||||||
<DrawerClue
|
<DrawerClue
|
||||||
v-if="!loading"
|
v-if="!loading"
|
||||||
ref="drawerRef"
|
ref="drawerRef"
|
||||||
:schema="allSchemas.formSchema"
|
:schema="allSchemas.detailSchema"
|
||||||
@get-list="getTableList"
|
@get-list="getTableList"
|
||||||
@update="handleEdit"
|
@update="handleEdit"
|
||||||
/>
|
/>
|
||||||
<DialogSuccess ref="successRef" :schema="allSchemas.formSchema" @success="getTableList" />
|
<DialogSuccess ref="successRef" :schema="allSchemas.detailSchema" @success="getTableList" />
|
||||||
<DialogFollow ref="followRef" @success="getTableList" />
|
<DialogFollow ref="followRef" @success="getTableList" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -11,9 +11,7 @@
|
|||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" @click="handleQuery" v-hasPermi="['clue:skill:search']">
|
<el-button @click="handleQuery" v-hasPermi="['clue:skill:search']">搜索</el-button>
|
||||||
搜索
|
|
||||||
</el-button>
|
|
||||||
<el-button @click="resetQuery" v-hasPermi="['clue:skill:reset']">重置</el-button>
|
<el-button @click="resetQuery" v-hasPermi="['clue:skill:reset']">重置</el-button>
|
||||||
<el-button type="primary" plain @click="handleAdd" v-hasPermi="['clue:skill:add']">
|
<el-button type="primary" plain @click="handleAdd" v-hasPermi="['clue:skill:add']">
|
||||||
新增
|
新增
|
||||||
|
|||||||
Reference in New Issue
Block a user