Commit a927beb9 authored by 罗超's avatar 罗超

1

parent ad9716dc
import { ref, reactive } from 'vue'
import customerSetService from '@/api/customerSet'
import customerService from '@/api/customer'
import router from '@/router/index'
import message from '@/utils/message'
const msg = () => {
const curQueryId = Number(router.currentRoute.value.query.Id)
return {
RuleId: curQueryId
}
}
const condition = ref<any>(null)
const data = reactive<any>({
step:1
})
const jumpBeforePage = () => {
router.push({
path: '/customerSetup',
query: {
type: 'lib'
}
})
}
const editRuleModule = () => {
//获取分配客户条件
const getCondition = val => {
data.editMsg.ConditionList = [...val]
}
//获取已选部门成员
const getdpt = val => {
data.showDialog = false
data.editMsg.DeptList = []
data.editMsg.EmpList = []
val.map(e => {
if (e.Id.slice(0, 1) == 1) {
data.editMsg.DeptList.push({
DeptId: e.Id.slice(2),
DeptName: e.Name
})
} else {
data.editMsg.EmpList.push({
Id: e.Id.slice(2),
EmployeeName: e.Name
})
}
})
console.log(val, 'dpt')
}
//获取已选人数
const getNum = n => {
data.peopleNum = n
}
//获取线索详情
const getDetail = () => {
customerSetService.getCustomerClueRuleDetail(msg()).then(res => {
const d = res.data.Data
data.editMsg.DeptList = d.DeptList
data.editMsg.EmpList = d.EmpList
data.editMsg.ConditionList = d.ConditionList
data.defaultConditionList = d.ConditionList
data.editMsg.RuleAllotWay = d.RuleAllotWay
data.editMsg.RuleSelectType = d.RuleSelectType
const Dep = d.DeptList.map(e => {
return '1-' + e.DeptId
})
const Emp = d.EmpList.map(e => {
return '2-' + e.Id
})
data.defaultArray = [...Dep, ...Emp]
})
}
//获取部门数据
const getEmployeeData = () => {
customerService.getEmployeeData({}).then(res => {
console.log(res.data.Data, '部门')
data.dataTree = res.data.Data
// 重组唯一id
if (data.dataTree.length == 0) return
data.dataTree.forEach(x => {
x.newId = x.DataType + '-' + x.DeptId
if (x.ChildList && x.ChildList.length > 0) {
getChildList(x.ChildList)
}
})
})
}
const getChildList = (ChildList: Array<any>) => {
ChildList.forEach(x => {
x.newId = x.DataType + '-' + x.DeptId
if (x.ChildList && x.ChildList.length > 0) {
getChildList(x.ChildList)
}
})
}
// 新增,修改
const setCustomerClueRuleInfo = () => {
customerSetService.setCustomerClueRuleInfo(data.editMsg).then(res => {
message.successMsg(res.data.Message)
setTimeout(() => {
router.push({
path: '/customerSetup',
query: {
type: 'clue'
}
})
}, 2000)
})
}
return {
msg,
condition,
data,
getDetail,
getEmployeeData,
jumpBeforePage,
setCustomerClueRuleInfo,
getCondition,
getdpt,
getNum,
}
}
export default editRuleModule
<template> <template>
<div class="q-pa-md"> <div class="q-pa-md customerLib">
<div class="q-py-md"> <div class="q-py-md">
<div class="flex justify-between q-mb-md"> <div class="flex justify-between q-mb-md">
<div> <div>
<q-btn color="primary" unelevated label="+新增客户库" class="q-mr-md" /> <q-btn color="primary" unelevated label="+新增客户库" class="q-mr-md" @click="jumpPage('/editor/editCustomerLib')"/>
<span>了解多客户库的好处</span> <n-popover trigger="hover" :width="620" placement="right">
<template #trigger>
<span>了解多客户库的好处</span>
</template>
<div class="q-pa-md">
<div class="tip-title">
有效实现业务独立,提高管理效率,降低客户资源浪费
</div>
<div class="tip-content">
<div class="tip-header">
多公海
</div>
<div class="tip-text">
每个客户库都有自己独立的公海,对本客户库外的数据隔离,有效提高线索流转的效率。
</div>
<div class="tip-list-text">
<div style="white-space:nowrap">
例如:
</div>
<div>
场景一:设置“北京客户库”、“南京客户库” 保持业务的独立性;<br/>
场景二:设置“市场客户库”、“电销客户库”、“面销客户库”,区分客户的流转阶段/属性;
</div>
</div>
</div>
<div class="tip-content">
<div class="tip-header">
多规则
</div>
<div class="tip-text">
每个客户库都有自己独立的规则,不同部门之间可能存在不同的规则:
</div>
<div class="tip-list-text">
<div style="white-space:nowrap">
例如:
</div>
<div>
回收客户的规则:不同的部门/员工,可设置不同的客户回收规则,合理利用资源;<br/>
员工的客户上限:不同的部门/员工,设置不同的客户上限,降低资源浪费的可能;<br/>
录入客户的标准:有的部门支持创建重复客户,有的部门则不支持;
</div>
</div>
</div>
</div>
</n-popover>
</div> </div>
<q-btn text-color="accent" outline unelevated label="设置查重规则" @click="showRuleDig=true" /> <q-btn text-color="accent" outline unelevated label="设置查重规则" @click="showRuleDig=true" />
</div> </div>
...@@ -39,6 +82,7 @@ ...@@ -39,6 +82,7 @@
</template> </template>
</q-table> </q-table>
</div> </div>
<!-- 查重规则弹窗 --> <!-- 查重规则弹窗 -->
<q-dialog v-model="showRuleDig" full-height maximized position="right" transition-show="slide-left"> <q-dialog v-model="showRuleDig" full-height maximized position="right" transition-show="slide-left">
<q-card> <q-card>
...@@ -49,44 +93,46 @@ ...@@ -49,44 +93,46 @@
</q-card-section> </q-card-section>
<q-card-section> <q-card-section>
<div style="width:750px"> <div style="width:750px">
<q-item tag="label" > <q-item tag="label">
<q-item-section avatar top> <q-item-section avatar top>
<q-radio v-model="LookRepeat" :val="1" color="primary" /> <q-radio v-model="LookRepeat" :val="1" color="primary" />
</q-item-section> </q-item-section>
<q-item-section> <q-item-section>
<div class="ruleset-title" style="color:#858598"><span style="color:#606266">全局查重</span> (一个客户在<span style="color:#f00">整个企业</span>内,只允许被一个员工跟进)</div> <div class="ruleset-title" style="color:#858598"><span style="color:#606266">全局查重</span> (一个客户在<span
style="color:#f00">整个企业</span>内,只允许被一个员工跟进)</div>
<div class="ruleset-box"> <div class="ruleset-box">
<div class="ruleset-txt"> <div class="ruleset-txt">
一个客户,在整个企业内查重(整个企业不允许创建重复客户) 一个客户,在整个企业内查重(整个企业不允许创建重复客户)
</div> </div>
<div class="ruleset-img"> <div class="ruleset-img">
<img src="@/assets/images/customer/customerSet/rule1.jpg"/> <img src="@/assets/images/customer/customerSet/rule1.jpg" />
</div> </div>
</div> </div>
</q-item-section> </q-item-section>
</q-item> </q-item>
<q-item tag="label" > <q-item tag="label">
<q-item-section avatar top> <q-item-section avatar top>
<q-radio v-model="LookRepeat" :val="2" color="primary" /> <q-radio v-model="LookRepeat" :val="2" color="primary" />
</q-item-section> </q-item-section>
<q-item-section> <q-item-section>
<div class="ruleset-title" style="color:#858598"><span style="color:#606266">客户库查重</span> (一个客户在<span style="color:#f00">单个客户库</span>内,只允许被一个员工跟进)</div> <div class="ruleset-title" style="color:#858598"><span style="color:#606266">客户库查重</span> (一个客户在<span
style="color:#f00">单个客户库</span>内,只允许被一个员工跟进)</div>
<div class="ruleset-box"> <div class="ruleset-box">
<div class="ruleset-txt"> <div class="ruleset-txt">
一个客户,在整个企业内查重(整个企业不允许创建重复客户) 一个客户,在整个企业内查重(整个企业不允许创建重复客户)
</div> </div>
<div class="ruleset-img"> <div class="ruleset-img">
<img src="@/assets/images/customer/customerSet/rule2.jpg"/> <img src="@/assets/images/customer/customerSet/rule2.jpg" />
</div> </div>
</div> </div>
</q-item-section> </q-item-section>
</q-item> </q-item>
</div> </div>
</q-card-section> </q-card-section>
<q-card-actions align="left" class="bg-white text-teal"> <q-card-actions align="left" class="bg-white text-teal">
<q-btn color="primary" unelevated label="确定" class="q-ml-lg" @click="setLookRepeatRule"/> <q-btn color="primary" unelevated label="确定" class="q-ml-lg" @click="setLookRepeatRule" />
</q-card-actions> </q-card-actions>
</q-card> </q-card>
</q-dialog> </q-dialog>
...@@ -103,10 +149,7 @@ ...@@ -103,10 +149,7 @@
// import { Dialog } from 'quasar' // import { Dialog } from 'quasar'
import message from '@/utils/message' import message from '@/utils/message'
import customerSetService from '@/api/customerSet'; import customerSetService from '@/api/customerSet';
// import router from '@/router/index' import router from '@/router/index'
export default defineComponent({ export default defineComponent({
setup() { setup() {
...@@ -170,7 +213,15 @@ ...@@ -170,7 +213,15 @@
const setLookRepeatRule = () => { const setLookRepeatRule = () => {
customerSetService.setCustomerLibraryLookRepeat(LookRepeatMsg).then(res => { customerSetService.setCustomerLibraryLookRepeat(LookRepeatMsg).then(res => {
message.successMsg(res.data.Message) message.successMsg(res.data.Message)
data.showRuleDig=false data.showRuleDig = false
})
}
const jumpPage = (url: string, Id = 0) => {
router.push({
path: url,
query: {
Id
}
}) })
} }
onMounted(() => { onMounted(() => {
...@@ -180,32 +231,70 @@ ...@@ -180,32 +231,70 @@
return { return {
...toRefs(data), ...toRefs(data),
...toRefs(LookRepeatMsg), ...toRefs(LookRepeatMsg),
setLookRepeatRule setLookRepeatRule,
jumpPage
} }
} }
}) })
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.ruleset-title{ .ruleset-title {
line-height: 40px; line-height: 40px;
} }
.ruleset-box{
.ruleset-box {
width: 606px; width: 606px;
align-items: center; align-items: center;
color: #333; color: #333;
padding: 30px 0 42px 0; padding: 30px 0 42px 0;
margin: 10px 0 ; margin: 10px 0;
border-radius: 8px; border-radius: 8px;
border: 1px solid #ccc; border: 1px solid #ccc;
.ruleset-txt{
text-align: center; .ruleset-txt {
text-align: center;
} }
.ruleset-img{
margin-top: 24px; .ruleset-img {
display: flex; margin-top: 24px;
justify-content: center; display: flex;
justify-content: center;
} }
} }
.tip-title {
font-size: 18px;
margin-bottom: 15px;
font-weight: bolder;
}
.tip-content {
background-color: #f4f4f6;
padding: 30px;
border-radius: 10px;
margin-bottom: 15px;
}
.tip-header {
color: var(--q-accent);
font-size: 18px;
font-weight: bolder;
margin-bottom: 15px;
}
.tip-text {
font-size: 14px;
margin-bottom: 5px;
}
.tip-list-text {
color: var(--q-accent);
font-size: 12px;
display: flex;
align-items: baseline;
justify-content: flex-start;
font-weight: 500;
line-height:22px;
}
</style> </style>
...@@ -11,7 +11,16 @@ ...@@ -11,7 +11,16 @@
<div class="col-10"> <div class="col-10">
<div class="flex items-center"> <div class="flex items-center">
<q-toggle v-model="data.IsPublicAudit" :true-value="1" :false-value="2" /> <q-toggle v-model="data.IsPublicAudit" :true-value="1" :false-value="2" />
开启后,员工领取公海客户时需要企微端设置的部门上级审批,审批同意后才可领取 开启后,员工领取公海客户时需要企微端设置的部门上级审批,审批同意后才可领取。
<n-popover trigger="hover" placement="right-start">
<template #trigger>
<q-icon name="help" size="xs" color="grey-4" />
</template>
<div class="tipBox">
<div class="text-center q-mb-xs">部门上级:指在【企业微信后台】-【通讯录】设置的部门上级</div>
<img src="@/assets/images/tip/dept-superior.png" style="width: 450px" />
</div>
</n-popover>
</div> </div>
<div class="flex items-center"> <div class="flex items-center">
<q-toggle v-model="PublicGetDeptState" @update:model-value="ChangePublicGetDeptState" />以下部门允许领取公海客户 <q-toggle v-model="PublicGetDeptState" @update:model-value="ChangePublicGetDeptState" />以下部门允许领取公海客户
...@@ -19,10 +28,10 @@ ...@@ -19,10 +28,10 @@
@click="checkedPublicGetDept" /> @click="checkedPublicGetDept" />
</div> </div>
<div v-if="PublicGetDeptState"> <div v-if="PublicGetDeptState">
<div v-for="(item,index) in PublicGetDeptNameList" :key="index" class="dept-item"> <div v-for="(item, index) in PublicGetDeptNameList" :key="index" class="dept-item">
<div class="flex justify-center items-center"> <div class="flex justify-center items-center">
<q-icon name="work" color="primary" v-if="item.Type==1" /> <q-icon name="work" color="primary" v-if="item.Type == 1" />
<q-icon name="person" color="primary" v-if="item.Type==2" /> <q-icon name="person" color="primary" v-if="item.Type == 2" />
<span class="q-ml-sm">{{ item.DeptName }}</span> <span class="q-ml-sm">{{ item.DeptName }}</span>
</div> </div>
</div> </div>
...@@ -157,13 +166,13 @@ ...@@ -157,13 +166,13 @@
defineComponent, defineComponent,
onMounted, onMounted,
provide, provide,
watch, watch
} from 'vue' } from 'vue'
import message from '@/utils/message' import message from '@/utils/message'
import customerSetService from '@/api/customerSet' import customerSetService from '@/api/customerSet'
import customerService from '@/api/customer' import customerService from '@/api/customer'
import departmentStaff from '@/components/common/departmentStaff.vue' import departmentStaff from '@/components/common/departmentStaff.vue'
import Abandon from "./CustomerOperationComponents/Abandon.vue" import Abandon from './CustomerOperationComponents/Abandon.vue'
interface dataParams { interface dataParams {
data: { data: {
AbandonReasonList: string[] AbandonReasonList: string[]
...@@ -222,12 +231,12 @@ ...@@ -222,12 +231,12 @@
PublicGetDept: -1, PublicGetDept: -1,
AbandonType: 1, AbandonType: 1,
AbandonAudit: 0, AbandonAudit: 0,
AbandonReasonList: [], AbandonReasonList: []
}, },
PublicGetDeptState: false, //以下部门允许领取公海客户 PublicGetDeptState: false, //以下部门允许领取公海客户
PublicGetDeptNameList: [], //允许领取公海客户列表 PublicGetDeptNameList: [], //允许领取公海客户列表
showDptDialog: false, showDptDialog: false,
DptDataTreeDefault: [], //部门默认值 DptDataTreeDefault: [] //部门默认值
}) })
provide('DptDataTree', DptDataTree) provide('DptDataTree', DptDataTree)
provide('data', data) provide('data', data)
...@@ -252,7 +261,7 @@ ...@@ -252,7 +261,7 @@
e.Type = 2 e.Type = 2
return e return e
}) })
data.PublicGetDeptNameList=[...PublicGetDeptList,...PublicGetEmpList] data.PublicGetDeptNameList = [...PublicGetDeptList, ...PublicGetEmpList]
}) })
} }
const getDptTree = () => { const getDptTree = () => {
...@@ -290,7 +299,6 @@ ...@@ -290,7 +299,6 @@
} else if (curItem.value === 2) { } else if (curItem.value === 2) {
// data.DptDataTreeDefault = data.data.AbandonDept.split(',') // data.DptDataTreeDefault = data.data.AbandonDept.split(',')
} }
} }
const getdpt = val => { const getdpt = val => {
data.showDptDialog = false data.showDptDialog = false
...@@ -307,17 +315,20 @@ ...@@ -307,17 +315,20 @@
console.log('dpt', dept) console.log('dpt', dept)
} }
//以下部门允许领取公海客户 //以下部门允许领取公海客户
const ChangePublicGetDeptState = (val) => { const ChangePublicGetDeptState = val => {
if (!val) { if (!val) {
data.data.PublicGetDept = '-1' data.data.PublicGetDept = '-1'
} }
} }
watch(() => data.data, val => { watch(
console.log('watch', val) () => data.data,
}, { val => {
deep: true console.log('watch', val)
}) }, {
deep: true
}
)
onMounted(() => { onMounted(() => {
getDptTree() getDptTree()
...@@ -332,7 +343,7 @@ ...@@ -332,7 +343,7 @@
getdpt, getdpt,
checkedPublicGetDept, checkedPublicGetDept,
setCustomerConfig, setCustomerConfig,
ChangePublicGetDeptState, ChangePublicGetDeptState
} }
} }
}) })
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
<q-radio v-model="Type" :val="2" @update:model-value="changeAbandonType" label="部分客户" /> <q-radio v-model="Type" :val="2" @update:model-value="changeAbandonType" label="部分客户" />
</div> </div>
<div v-if="Type == 2"> <div v-if="Type == 2">
<requestGroup v-model:addCondition="SelectType" :defaultData="AbandonKHSelect" @change="getCondition"/> <requestGroup v-model:addCondition="SelectType" :defaultData="AbandonKHSelect" @change="getCondition" />
</div> </div>
</div> </div>
</div> </div>
...@@ -36,7 +36,19 @@ ...@@ -36,7 +36,19 @@
<div class="col-10"> <div class="col-10">
<div class="flex items-center"> <div class="flex items-center">
<q-toggle v-model="Audit" :true-value="1" :false-value="2" @update:model-value="ChangeAbandonAuditState" /> <q-toggle v-model="Audit" :true-value="1" :false-value="2" @update:model-value="ChangeAbandonAuditState" />
开启后,员工放弃客户时需要企微端设置的部门上级审批,审批同意后才可放弃。</div> 开启后,员工放弃客户时需要企微端设置的部门上级审批,审批同意后才可放弃。
<n-popover trigger="hover" placement="right-start">
<template #trigger>
<q-icon name="help" size="xs" color="grey-4" />
</template>
<div class="tipBox">
<div class="text-center q-mb-xs">
部门上级:指在【企业微信后台】-【通讯录】设置的部门上级
</div>
<img src="@/assets/images/tip/dept-superior.png" style="width:450px" />
</div>
</n-popover>
</div>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
...@@ -179,7 +191,7 @@ ...@@ -179,7 +191,7 @@
const emp = props.AbandonEmpList.map((e: any) => '2-' + e.DeptId) const emp = props.AbandonEmpList.map((e: any) => '2-' + e.DeptId)
const empName = props.AbandonEmpList.map((e: any) => { const empName = props.AbandonEmpList.map((e: any) => {
e.Type = 2 e.Type = 2
return e return e
}) })
DptDataDefault.value = [...dept, ...emp] DptDataDefault.value = [...dept, ...emp]
data.AbandonDeptNameList = [...deptName, ...empName] data.AbandonDeptNameList = [...deptName, ...empName]
...@@ -241,14 +253,14 @@ ...@@ -241,14 +253,14 @@
const changeAbandonType = (val: number) => { const changeAbandonType = (val: number) => {
ctx.emit('update:AabandonType', val) ctx.emit('update:AabandonType', val)
} }
const getCondition=(val)=>{ const getCondition = (val) => {
FaData.data.AbandonKHSelect=JSON.parse(JSON.stringify(val)) FaData.data.AbandonKHSelect = JSON.parse(JSON.stringify(val))
} }
return { return {
Type: ref(props.AabandonType), Type: ref(props.AabandonType),
Audit: ref(props.AbandonAudit), Audit: ref(props.AbandonAudit),
SelectType: ref(props.AbandonSelectType), SelectType: ref(props.AbandonSelectType),
AbandonKHSelect:ref(FaData.data.AbandonKHSelect), AbandonKHSelect: ref(FaData.data.AbandonKHSelect),
ReasonList, ReasonList,
DptDataTree, DptDataTree,
...toRefs(data), ...toRefs(data),
...@@ -305,4 +317,9 @@ ...@@ -305,4 +317,9 @@
margin: 6px; margin: 6px;
} }
.tipBox {
font-size: 12px;
line-height: 1.8;
}
</style> </style>
<template> <template>
<div class="q-pa-md"> <div class="q-pa-md">
<div class="q-gutter-lg"> <div class="q-gutter-lg">
<q-radio <q-radio v-model="configMsg.ClueType" :val="2" @update:model-value="configChange"> 自动分配
v-model="configMsg.ClueType" <n-popover trigger="hover" placement="right-start">
:val="2" <template #trigger>
label="自动分配" <q-icon name="help" size="xs" color="grey-4" />
@update:model-value="configChange" </template>
></q-radio> <div class="tipBox">
<q-radio 场景一:线索认定有效后,流转至待分配客户库,进行自动分配;<br />
v-model="configMsg.ClueType" 场景二:将客户导入到待分配客户库,进行自动分配;
:val="1" </div>
label="手动分配" </n-popover>
@update:model-value="configChange" </q-radio>
></q-radio> <q-radio v-model="configMsg.ClueType" :val="1" @update:model-value="configChange">手动分配
</div> <n-popover trigger="hover" placement="right-start">
<div class="q-pa-md" v-if="configMsg.ClueType === 1"> <template #trigger>
<div class="aoto-matic-header"> <q-icon name="help" size="xs" color="grey-4" />
若客户满足多条规则,会优先按照编号顺序执行规则 </template>
<q-btn <div class="tipBox">
color="primary" 在线索库或待分配客户库,可以进行手动分配
label="+新增规则" </div>
style="margin-left: 10px;" </n-popover>
@click="jumpPage('/editor/editRule')" </q-radio>
/> </div>
</div> <div class="q-pa-md" v-if="configMsg.ClueType === 2">
<table class="payTable"> <div class="aoto-matic-header">
<thead> 若客户满足多条规则,会优先按照编号顺序执行规则
<tr> <q-btn color="primary" label="+新增规则" style="margin-left: 10px;" @click="jumpPage('/editor/editRule')" />
<th>排序</th> </div>
<!-- <th>查询类型</th> --> <table class="payTable">
<th>规则</th> <thead>
<th>部门列表</th> <tr>
<th>人员列表</th> <th>排序</th>
<th>分配方式</th> <!-- <th>查询类型</th> -->
<th width="10%">编辑</th> <th>规则</th>
<th width="5%"></th> <th>部门列表</th>
</tr> <th>人员列表</th>
</thead> <th>分配方式</th>
<tr v-if="data.length == 0 && defaultData.length == 0"> <th width="10%">编辑</th>
<td :colspan="9" align="center">暂无数据</td> <th width="5%"></th>
</tr> </tr>
<template v-if="defaultData.length > 0"> </thead>
<tr v-for="(item,index) in defaultData" :key="index"> <tr v-if="data.length == 0 && defaultData.length == 0">
<td></td> <td :colspan="9" align="center">暂无数据</td>
<!-- <td> </tr>
<template v-if="defaultData.length > 0">
<tr v-for="(item,index) in defaultData" :key="index">
<td></td>
<!-- <td>
<span v-if="item.RuleSelectType === 1">并且</span> <span v-if="item.RuleSelectType === 1">并且</span>
<span v-if="item.RuleSelectType === 2">或者</span> <span v-if="item.RuleSelectType === 2">或者</span>
</td>--> </td>-->
<td> <td>
<div v-if="item.ConditionStrList.length > 0"> <div v-if="item.ConditionStrList.length > 0">
<div v-for="(e,i) in item.ConditionStrList" :key="i">{{ e }}</div> <div v-for="(e,i) in item.ConditionStrList" :key="i">{{ e }}</div>
</div> </div>
<div v-else>未匹配设定规则的客户</div> <div v-else>未匹配设定规则的客户</div>
</td> </td>
<td> <td>
<div v-if="item.DeptList.length > 0"> <div v-if="item.DeptList.length > 0">
<div v-for="(e) in item.DeptList" :key="e.DeptId">{{ e.DeptName }}</div> <div v-for="(e) in item.DeptList" :key="e.DeptId">{{ e.DeptName }}</div>
</div> </div>
<div v-else>-</div> <div v-else>-</div>
</td> </td>
<td> <td>
<div v-if="item.EmpList.length > 0"> <div v-if="item.EmpList.length > 0">
<div v-for="(e) in item.EmpList" :key="e.Id">{{ e.EmployeeName }}</div> <div v-for="(e) in item.EmpList" :key="e.Id">{{ e.EmployeeName }}</div>
</div> </div>
<div v-else>-</div> <div v-else>-</div>
</td> </td>
<td> <td>
<span v-if="item.RuleAllotWay === 1">依次轮流</span> <span v-if="item.RuleAllotWay === 1">依次轮流</span>
<span v-if="item.RuleAllotWay === 2">随机分配</span> <span v-if="item.RuleAllotWay === 2">随机分配</span>
</td> </td>
<td> <td>
<q-btn <q-btn flat size="xs" icon="edit" style="font-weight:400;color: #3FC4FF" class="q-mr-xs" label="编辑"
flat @click="jumpPage('/editor/editRule', item.Id)" />
size="xs" </td>
icon="edit" <td></td>
style="font-weight:400;color: #3FC4FF" </tr>
class="q-mr-xs" </template>
label="编辑" <draggable v-model="data" tag="tbody" item-key="Id" @update="datadragEnd" v-if="data.length > 0"
@click="jumpPage('/editor/editRule', item.Id)" :move="getDragId">
/> <template #item="{ element, index }">
</td> <tr>
<td></td> <td>
</tr> <span style="color:#606266">{{ index + 1 }}</span>
</template> </td>
<draggable <!-- <td>
v-model="data"
tag="tbody"
item-key="Id"
@update="datadragEnd"
v-if="data.length > 0"
:move="getDragId"
>
<template #item="{ element, index }">
<tr>
<td>
<span style="color:#606266">{{ index + 1 }}</span>
</td>
<!-- <td>
<span v-if="element.RuleSelectType === 1">并且</span> <span v-if="element.RuleSelectType === 1">并且</span>
<span v-if="element.RuleSelectType === 2">或者</span> <span v-if="element.RuleSelectType === 2">或者</span>
</td>--> </td>-->
<td> <td>
<div v-if="element.ConditionStrList.length > 0"> <div v-if="element.ConditionStrList.length > 0">
<div v-for="(e,i) in element.ConditionStrList" :key="i">{{ e }}</div> <div v-for="(e,i) in element.ConditionStrList" :key="i">{{ e }}</div>
</div> </div>
<div v-else>未匹配设定规则的客户</div> <div v-else>未匹配设定规则的客户</div>
</td> </td>
<td> <td>
<div v-if="element.DeptList.length > 0"> <div v-if="element.DeptList.length > 0">
<div <div v-for="(e) in element.DeptList" :key="e.DeptId">{{ e.DeptName }}</div>
v-for="(e) in element.DeptList" </div>
:key="e.DeptId"
>{{ e.DeptName }}</div>
</div>
<div v-else>-</div> <div v-else>-</div>
</td> </td>
<td> <td>
<div v-if="element.EmpList.length > 0"> <div v-if="element.EmpList.length > 0">
<div <div v-for="(e) in element.EmpList" :key="e.Id">{{ e.EmployeeName }}</div>
v-for="(e) in element.EmpList" </div>
:key="e.Id"
>{{ e.EmployeeName }}</div>
</div>
<div v-else>-</div> <div v-else>-</div>
</td> </td>
<td> <td>
<span v-if="element.RuleAllotWay === 1">依次轮流</span> <span v-if="element.RuleAllotWay === 1">依次轮流</span>
<span v-if="element.RuleAllotWay === 2">随机分配</span> <span v-if="element.RuleAllotWay === 2">随机分配</span>
</td> </td>
<td> <td>
<q-btn <q-btn flat size="xs" icon="edit" style="font-weight:400;color: #3FC4FF" class="q-mr-xs" label="编辑"
flat @click="jumpPage('/editor/editRule', element.Id)" />
size="xs" <q-btn v-if="element.IsDefault != 1" flat size="xs" icon="delete" color="negative" class="q-mr-xs"
icon="edit" label="删除" @click="del(element.Id)" />
style="font-weight:400;color: #3FC4FF" </td>
class="q-mr-xs" <td>
label="编辑" <i class="iconfont icon-drag" style="font-size: 20px;color: #777;"></i>
@click="jumpPage('/editor/editRule', element.Id)" </td>
/> </tr>
<q-btn </template>
v-if="element.IsDefault != 1" </draggable>
flat </table>
size="xs" </div>
icon="delete" <div class="q-pa-md manual" v-if="configMsg.ClueType === 1">
color="negative" <div class="box-manual" :class="{ 'checked-border': configMsg.ClueAllotWay == 1 }"
class="q-mr-xs" @click="configMsg.ClueAllotWay = 1; configChange()">
label="删除" <q-icon name="autorenew" size="lg" />
@click="del(element.Id)" <div>按已选员工顺序依次轮流分配</div>
/> <div class="right" v-if="configMsg.ClueAllotWay == 1">
</td> <q-icon name="check" class="check-icon" />
<td>
<i class="iconfont icon-drag" style="font-size: 20px;color: #777;"></i>
</td>
</tr>
</template>
</draggable>
</table>
</div> </div>
<div class="q-pa-md manual" v-if="configMsg.ClueType === 2"> </div>
<div <div class="box-manual" :class="{ 'checked-border': configMsg.ClueAllotWay == 2 }"
class="box-manual" @click="configMsg.ClueAllotWay = 2; configChange()">
:class="{ 'checked-border': configMsg.ClueAllotWay == 1 }" <q-icon name="shuffle" size="lg" />
@click="configMsg.ClueAllotWay = 1; configChange()" <div>按已选员工随机分配</div>
> <div class="right" v-if="configMsg.ClueAllotWay == 2">
<q-icon name="autorenew" size="lg" /> <q-icon name="check" class="check-icon" />
<div>按已选员工顺序依次轮流分配</div>
<div class="right" v-if="configMsg.ClueAllotWay == 1">
<q-icon name="check" class="check-icon" />
</div>
</div>
<div
class="box-manual"
:class="{ 'checked-border': configMsg.ClueAllotWay == 2 }"
@click="configMsg.ClueAllotWay = 2; configChange()"
>
<q-icon name="shuffle" size="lg" />
<div>按已选员工随机分配</div>
<div class="right" v-if="configMsg.ClueAllotWay == 2">
<q-icon name="check" class="check-icon" />
</div>
</div>
</div> </div>
</div>
</div> </div>
</div>
</template> </template>
<script lang="ts"> <script lang="ts">
import { import {
ref, ref,
defineComponent, defineComponent,
reactive, reactive,
onMounted onMounted
} from 'vue' } from 'vue'
import draggable from "vuedraggable"; import draggable from "vuedraggable";
import { Dialog } from 'quasar' import {
import message from '@/utils/message' Dialog
import customerSetService from '@/api/customerSet'; } from 'quasar'
import router from '@/router/index' import message from '@/utils/message'
import customerSetService from '@/api/customerSet';
import router from '@/router/index'
interface dataType { interface dataType {
Id: number, Id: number,
RuleSelectType: number, RuleSelectType: number,
IsDefault: number, IsDefault: number,
DeptList: Array<any>, DeptList: Array < any > ,
EmpList: Array<any>, EmpList: Array < any > ,
RuleAllotWay: number, RuleAllotWay: number,
ConditionList: Array<any>, ConditionList: Array < any > ,
ConditionStrList: Array<string>, ConditionStrList: Array < string > ,
Sort: number Sort: number
} }
interface dataConfigType { interface dataConfigType {
Id?: number, Id ? : number,
ClueType: number, ClueType: number,
ClueAllotWay: number ClueAllotWay: number
} }
export default defineComponent({ export default defineComponent({
components: { components: {
draggable, draggable,
}, },
setup() { setup() {
let defaultData = ref<Array<dataType>>([]) let defaultData = ref < Array < dataType >> ([])
let data = ref<Array<dataType>>([]) let data = ref < Array < dataType >> ([])
let dragId = ref(0) let dragId = ref(0)
const getDragId = (e: any) => { const getDragId = (e: any) => {
dragId.value = e.draggedContext.element.Id dragId.value = e.draggedContext.element.Id
}
const datadragEnd = (e: any) => {
let olddragId = 0
if (e.newIndex > 0) {
olddragId = data.value[e.newIndex - 1].Id
} else {
olddragId = 0
}
let msg = {
RuleId: dragId.value,
Type: 1,
TargetId: olddragId,
} }
const datadragEnd = (e: any) => { setState(msg)
let olddragId = 0 }
if (e.newIndex > 0) { const getClueList = () => {
olddragId = data.value[e.newIndex - 1].Id defaultData.value = []
data.value = []
customerSetService.getCustomerClueRuleList({}).then(res => {
res.data.Data.map((item: dataType) => {
if (item.IsDefault === 1) {
defaultData.value.push(item)
} else { } else {
olddragId = 0 data.value.push(item)
} }
let msg = { })
RuleId: dragId.value,
Type: 1,
TargetId: olddragId,
}
setState(msg)
}
const getClueList = () => {
defaultData.value = []
data.value = []
customerSetService.getCustomerClueRuleList({}).then(res => {
res.data.Data.map((item: dataType) => {
if (item.IsDefault === 1) {
defaultData.value.push(item)
} else {
data.value.push(item)
}
})
})
}
let configMsg = reactive<dataConfigType>({
ClueType: 1,// 1手动分配 2自动分配
ClueAllotWay: 1,// 1依次轮流 2随机分配
}) })
const getCustomerClueRuleConfig = () => { }
customerSetService.getCustomerClueRuleConfig({}).then(res => { let configMsg = reactive < dataConfigType > ({
let data = res.data.Data ClueType: 1, // 1手动分配 2自动分配
configMsg.ClueType = data.ClueType ClueAllotWay: 1, // 1依次轮流 2随机分配
configMsg.ClueAllotWay = data.ClueAllotWay })
}) const getCustomerClueRuleConfig = () => {
} customerSetService.getCustomerClueRuleConfig({}).then(res => {
const jumpPage = (url: string, Id = 0) => { let data = res.data.Data
router.push({ configMsg.ClueType = data.ClueType
path: url, configMsg.ClueAllotWay = data.ClueAllotWay
query: { })
Id }
} const jumpPage = (url: string, Id = 0) => {
}) router.push({
} path: url,
const del = (id) => { query: {
Dialog.create({ Id
title: "提示", }
message: "确认删除?", })
cancel: '取消', }
ok: "确认" const del = (id) => {
}).onOk(() => { Dialog.create({
console.log('>>>> OK', id) title: "提示",
let msg = { message: "确认删除?",
RuleId: id, cancel: '取消',
Type: 2, ok: "确认"
} }).onOk(() => {
setState(msg) console.log('>>>> OK', id)
}) let msg = {
} RuleId: id,
const configChange = () => { Type: 2,
customerSetService.setCustomerClueRuleConfig(configMsg).then(res => { }
console.log(228, res.data) setState(msg)
}) })
} }
const configChange = () => {
customerSetService.setCustomerClueRuleConfig(configMsg).then(res => {
console.log(228, res.data)
})
}
const setState = (msg) => { const setState = (msg) => {
customerSetService.setCustomerClueRuleState(msg).then(res => { customerSetService.setCustomerClueRuleState(msg).then(res => {
message.successMsg(res.data.Message) message.successMsg(res.data.Message)
if (msg.Type == 2) { if (msg.Type == 2) {
getClueList() getClueList()
} }
})
}
onMounted(() => {
getClueList();
getCustomerClueRuleConfig();
}) })
return { }
getDragId, onMounted(() => {
configChange, getClueList();
defaultData, getCustomerClueRuleConfig();
data, })
datadragEnd, return {
jumpPage, getDragId,
configMsg, configChange,
del defaultData,
} data,
datadragEnd,
jumpPage,
configMsg,
del
}
} }
}) })
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.payTable { .payTable {
width: 100%; width: 100%;
border-collapse: collapse; border-collapse: collapse;
} }
.payTable tr th { .payTable tr th {
background: #fff; background: #fff;
height: 60px; height: 60px;
font-size: 12px; font-size: 12px;
font-weight: bold; font-weight: bold;
color: #2d2d2d; color: #2d2d2d;
background: #dddee0; background: #dddee0;
} }
.payTable tr { .payTable tr {
background: #fff; background: #fff;
text-align: center; text-align: center;
height: 60px; height: 60px;
} }
.payTable tr td { .payTable tr td {
font-size: 13px; font-size: 13px;
text-align: center; text-align: center;
color: #2d2d2d; color: #2d2d2d;
...@@ -347,9 +313,9 @@ export default defineComponent({ ...@@ -347,9 +313,9 @@ export default defineComponent({
padding: 10px; padding: 10px;
font-weight: bold; font-weight: bold;
border-bottom: 1px solid #e5e5e5; border-bottom: 1px solid #e5e5e5;
} }
.aoto-matic-header { .aoto-matic-header {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: flex-end; justify-content: flex-end;
...@@ -357,9 +323,9 @@ export default defineComponent({ ...@@ -357,9 +323,9 @@ export default defineComponent({
margin-left: 2px; margin-left: 2px;
color: #858598; color: #858598;
font-size: 14px; font-size: 14px;
} }
.manual { .manual {
height: 100%; height: 100%;
display: flex; display: flex;
margin: 0 auto; margin: 0 auto;
...@@ -368,43 +334,50 @@ export default defineComponent({ ...@@ -368,43 +334,50 @@ export default defineComponent({
margin-top: 191px; margin-top: 191px;
.box-manual { .box-manual {
cursor: pointer; cursor: pointer;
width: 311px; width: 311px;
height: 198px; height: 198px;
background: #f9f9f9; background: #f9f9f9;
border-radius: 5px; border-radius: 5px;
display: flex; display: flex;
justify-content: center; justify-content: center;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
position: relative; position: relative;
.right { .right {
position: absolute; position: absolute;
right: -20px; right: -20px;
bottom: -20px; bottom: -20px;
display: block; display: block;
width: 0; width: 0;
height: 0; height: 0;
transform: rotate(45deg); transform: rotate(45deg);
border: 20px solid transparent; border: 20px solid transparent;
border-left: 20px solid #3470ff; border-left: 20px solid #3470ff;
.check-icon {
position: absolute; .check-icon {
top: -8px; position: absolute;
left: -19px; top: -8px;
transform: rotate(-45deg); left: -19px;
font-size: 14px; transform: rotate(-45deg);
font-weight: 700; font-size: 14px;
color: #fff; font-weight: 700;
} color: #fff;
} }
}
} }
} }
.checked-border { .checked-border {
background-color: #edf2fd !important; background-color: #edf2fd !important;
border: 2px solid #3470ff !important; border: 2px solid #3470ff !important;
color: #3470ff; color: #3470ff;
} }
.tipBox {
font-size: 12px;
line-height: 1.8;
}
</style> </style>
<template>
<div class="page">
<div class="q-pa-md q-gutter-sm navbar">
<q-breadcrumbs>
<q-breadcrumbs-el label="返回" icon="navigate_before" @click="jumpBeforePage" />
<q-breadcrumbs-el label="编辑" />
</q-breadcrumbs>
<q-btn color="primary" label="完成" @click="setCustomerClueRuleInfo" />
</div>
<div class="container">
<q-stepper v-model="step" vertical color="primary" animated flat class="step-container">
<q-step :name="1" title="基础设置" icon="settings" :done="step > 1" style="height: 100px;">
</q-step>
<q-step :name="2" title="公海设置" icon="settings" :done="step > 2" style="height: 100px;">
</q-step>
<q-step :name="3" title="私库规则" icon="settings" :done="step = 3" style="height: 100px;">
</q-step>
</q-stepper>
</div>
<departmentStaff v-model="showDialog" :defaultArray="defaultArray" nodeKey="newId" labelKey="DeptName"
childrenKey="ChildList" strategy="leaf" :treeData="dataTree" @select="getdpt" @getNum="getNum" />
</div>
</template>
<script lang="ts">
import {
defineComponent,
toRefs,
onMounted
} from 'vue'
import departmentStaff from '@/components/common/departmentStaff.vue'
import editRuleModule from '@/module/customer/editor/editCustomerLibModule'
export default defineComponent({
components: {
departmentStaff,
},
setup() {
let {
jumpBeforePage,
msg,
data,
condition,
getDetail,
getEmployeeData,
setCustomerClueRuleInfo,
getCondition,
getdpt,
getNum,
} = editRuleModule();
onMounted(() => {
if (msg().RuleId > 0) {
// data.editMsg.Id = msg().RuleId
getDetail()
}
getEmployeeData()
})
return {
jumpBeforePage,
condition,
...toRefs(data),
setCustomerClueRuleInfo,
getCondition,
getdpt,
getNum,
}
}
})
</script>
<style lang="scss" scoped>
.page {
height: 100vh;
background-color: #f4f4f6;
}
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
height: 70px;
padding-left: 24px;
font-size: 16px;
border-bottom: 1px solid #d7d7d7;
background-color: #fff;
}
.container {
.step-container {
width: 200px;
height:calc(100vh - 70px);
padding: 40px;
flex-shrink: 0;
border-right: 1px solid #d7d7d7;
overflow-x: hidden;
}
}
</style>
...@@ -80,7 +80,7 @@ import { ...@@ -80,7 +80,7 @@ import {
} from 'vue' } from 'vue'
import requestGroup from '@/components/customer/request-group.vue' import requestGroup from '@/components/customer/request-group.vue'
import departmentStaff from '@/components/common/departmentStaff.vue' import departmentStaff from '@/components/common/departmentStaff.vue'
import editRuleModule from '@/module/editor/editRuleModule' import editRuleModule from '@/module/customer/editor/editRuleModule'
// import where from '@/components/common/customWhere/where.vue' // import where from '@/components/common/customWhere/where.vue'
export default defineComponent({ export default defineComponent({
components: { components: {
......
...@@ -49,7 +49,11 @@ const routes: RouteRecordRaw[] = [ ...@@ -49,7 +49,11 @@ const routes: RouteRecordRaw[] = [
path: '/editor/createStageRange', path: '/editor/createStageRange',
component: () => import('@/pages/customerManage/editor/createStageRange.vue') component: () => import('@/pages/customerManage/editor/createStageRange.vue')
}, },
// 编辑客户库
{
path: '/editor/editCustomerLib',
component: () => import('@/pages/customerManage/editor/editCustomerLib.vue')
},
{ {
path: '/auth/login', path: '/auth/login',
component: () => import('@/pages/auth/login.vue') component: () => import('@/pages/auth/login.vue')
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment