salary
qsh 5 months ago
parent 1c37dbc5f8
commit e3c85cbaae
  1. 5
      src/api/clue/index.js
  2. 16
      src/api/clue/payment.js
  3. 5
      src/components/Descriptions/src/Descriptions.vue
  4. 150
      src/views/Clue/Order/Comp/AfterSales.vue
  5. 0
      src/views/Clue/Order/Comp/Delivery.vue
  6. 107
      src/views/Clue/Order/Comp/DialogOrder.vue
  7. 335
      src/views/Clue/Order/Comp/OrderList.vue
  8. 148
      src/views/Clue/Order/Comp/Reback.vue
  9. 158
      src/views/Clue/Order/index.vue
  10. 3
      src/views/Clue/Pool/Comp/DialogSuccess.vue
  11. 30
      src/views/Clue/Pool/Comp/DrawerClue.vue
  12. 4
      src/views/Clue/Pool/index.vue
  13. 4
      src/views/Clue/Skill/index.vue

@ -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 })
}

@ -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) {

@ -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,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>

@ -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>

@ -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 { removeNullField } from '@/utils' import AfterSales from './Comp/AfterSales.vue'
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(() => { const appStore = useAppStore()
getCurdSchemas() const tabName = ref('list')
})
</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']">
新增 新增

Loading…
Cancel
Save