Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
H
horse
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
向伟
horse
Commits
a927beb9
Commit
a927beb9
authored
Dec 16, 2021
by
罗超
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
1
parent
ad9716dc
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
723 additions
and
396 deletions
+723
-396
dept-superior.png
src/assets/images/tip/dept-superior.png
+0
-0
editCustomerLibModule.ts
src/module/customer/editor/editCustomerLibModule.ts
+129
-0
editRuleModule.ts
src/module/customer/editor/editRuleModule.ts
+0
-0
CustomerLibrary.vue
...customerManage/customerSet/components/CustomerLibrary.vue
+129
-40
CustomerOperation.vue
...stomerManage/customerSet/components/CustomerOperation.vue
+28
-17
Abandon.vue
...merSet/components/CustomerOperationComponents/Abandon.vue
+23
-6
clueRule.vue
src/pages/customerManage/customerSet/components/clueRule.vue
+304
-331
editCustomerLib.vue
src/pages/customerManage/editor/editCustomerLib.vue
+104
-0
editRule.vue
src/pages/customerManage/editor/editRule.vue
+1
-1
routes.ts
src/router/routes.ts
+5
-1
No files found.
src/assets/images/tip/dept-superior.png
0 → 100644
View file @
a927beb9
90 KB
src/module/customer/editor/editCustomerLibModule.ts
0 → 100644
View file @
a927beb9
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
src/module/editor/editRuleModule.ts
→
src/module/
customer/
editor/editRuleModule.ts
View file @
a927beb9
File moved
src/pages/customerManage/customerSet/components/CustomerLibrary.vue
View file @
a927beb9
<
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
>
src/pages/customerManage/customerSet/components/CustomerOperation.vue
View file @
a927beb9
...
@@ -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
}
}
}
}
})
})
...
...
src/pages/customerManage/customerSet/components/CustomerOperationComponents/Abandon.vue
View file @
a927beb9
...
@@ -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
>
src/pages/customerManage/customerSet/components/clueRule.vue
View file @
a927beb9
<
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
:
-19
px
;
top
:
-8
px
;
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
>
src/pages/customerManage/editor/editCustomerLib.vue
0 → 100644
View file @
a927beb9
<
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
>
src/pages/customerManage/editor/editRule.vue
View file @
a927beb9
...
@@ -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
:
{
...
...
src/router/routes.ts
View file @
a927beb9
...
@@ -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'
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment