Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
P
project
Project
Project
Details
Activity
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
高宇
project
Commits
99747fd6
Commit
99747fd6
authored
Apr 11, 2019
by
高宇
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
调整批注为滑入层;
parent
295de0f0
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
955 additions
and
53 deletions
+955
-53
index.ejs
index.ejs
+4
-4
api.js
src/api.js
+2
-1
sales.js
src/apis/sales.js
+62
-0
schedulePagenation.vue
src/components/common/schedulePagenation.vue
+0
-0
list.vue
src/components/project/list.vue
+16
-9
addProject.vue
src/components/project/operation/addProject.vue
+4
-4
editProject.vue
src/components/project/operation/editProject.vue
+4
-9
operationAnnotation.vue
src/components/project/operation/operationAnnotation.vue
+20
-21
projectOfClient.vue
src/components/project/projectOfClient/projectOfClient.vue
+8
-4
scheduleItem.vue
src/components/project/scheduleItem.vue
+0
-0
list.vue
src/components/sales/list.vue
+232
-0
addSales.vue
src/components/sales/operation/addSales.vue
+21
-0
editSales.vue
src/components/sales/operation/editSales.vue
+21
-0
operationSales.vue
src/components/sales/operation/operationSales.vue
+21
-0
salesListForm.vue
src/components/sales/salesListForm.vue
+224
-0
scheduleItem.vue
src/components/sales/scheduleItem.vue
+276
-0
salesView.vue
src/components/sales/view/salesView.vue
+21
-0
route.js
src/route.js
+6
-1
salesOrders.js
src/routes/salesOrders.js
+13
-0
No files found.
index.ejs
View file @
99747fd6
...
...
@@ -28,11 +28,11 @@
"url"
:
"/project"
},
{
"icon"
:
"fa-b
ook
"
,
"icon"
:
"fa-b
lack-tie
"
,
"isRouteShow"
:
1
,
"title"
:
"
test
"
,
"appName"
:
portalName
,
"url"
:
"/
test
"
"title"
:
"
销售记录
"
,
"appName"
:
'salesOrders'
,
"url"
:
"/
salesOrder
"
}
],
homePage
:
{
...
...
src/api.js
View file @
99747fd6
import
ElementApi
from
'./apis/project'
import
sales
from
'./apis/sales'
const
usingJSONP
=
process
.
env
.
NODE_ENV
!==
'production'
const
API_HOST
=
process
.
env
.
API_HOST
const
API_PORT
=
process
.
env
.
API_PORT
...
...
@@ -24,7 +25,7 @@ const option = {
let
apis
=
{}
apis
=
Object
.
assign
(
apis
,
ElementApi
)
apis
=
Object
.
assign
(
apis
,
sales
)
export
default
{
option
,
...
apis
...
...
src/apis/sales.js
0 → 100644
View file @
99747fd6
export
default
{
// 获取销售记录筛选
getSalesFilter
:
{
url
:
'/vue/sales-order/get-filter'
},
// 获取销售记录列表
getSalesList
:
{
url
:
'/vue/sales-order/list'
},
// 获取客户销售记录列表
getSalesClient
:
{
url
:
'/vue/sales-order/of-client'
},
// 销售记录条目列表
getSalesListItem
:
{
url
:
'/vue/sales-order/list-item'
},
// 获取新建销售记录 option
getSalesNewOptions
:
{
url
:
'/vue/sales-order/get-new'
},
// 获取销售记录条目新建
getSalesNewItem
:
{
url
:
'/vue/sales-order/get-new-item'
},
// 获取销售记录编辑信息
getSalesEdit
:
{
url
:
'/vue/sales-order/get-edit'
},
// 获取销售记录条目编辑信息
getSalesEditItem
:
{
url
:
'/vue/sales-order/get-edit-item'
},
// 保存销售记录编辑
saveSalesEdit
:
{
url
:
'/vue/sales-order/save-edit'
},
// 保存销售记录新建
saveSalesAdd
:
{
url
:
'/vue/sales-order/save-new'
},
// 保存销售记录条目编辑
saveSalesEditItem
:
{
url
:
'/vue/sales-order/save-edit-item'
},
// 保存销售记录条目新建
saveSalesAddItem
:
{
url
:
'/vue/sales-order/save-new-item'
},
// 删除销售记录
delSales
:
{
url
:
'/vue/sales-order/delete'
},
// 删除销售记录条目
delSalesItem
:
{
url
:
'/vue/sales-order/delete-item'
},
// 获取产品类别
getSalesComponent
:
{
url
:
'/vue/sales-order/get-product-component'
}
}
src/components/
project
/schedulePagenation.vue
→
src/components/
common
/schedulePagenation.vue
View file @
99747fd6
File moved
src/components/project/list.vue
View file @
99747fd6
...
...
@@ -74,30 +74,30 @@
v-click-outside=
"lmClose"
ref=
"leaveMessage"
:lmTemplate=
"lmTemplate"
:type=
"
1
"
>
:type=
"
6
"
>
</leave-message>
</div>
</div>
<side-popup
ref=
"sidePopup"
:title=
"operationTitle"
>
<component
:is=
"operationPage"
:ref=
"operationPage"
@
close=
"
close
"
></component>
<component
:is=
"operationPage"
:ref=
"operationPage"
@
close=
"
getList =>
{close(getList)}
">
</component>
</side-popup>
<operation-annotation
ref=
"operationAnnotation"
@
update:list=
"getList()"
></operation-annotation>
</section>
</
template
>
<
script
>
import
ScheduleItem
from
'.
./common
/scheduleItem'
import
Pagenation
from
'./schedulePagenation'
import
ScheduleItem
from
'./scheduleItem'
import
Pagenation
from
'.
./common
/schedulePagenation'
import
clientHeader
from
'../common/clientHeader'
import
clientForm
from
'./projectListForm'
import
clickOutside
from
'@/lib/bind'
import
addProject
from
'./operation/addProject'
import
editProject
from
'./operation/editProject'
import
operationAnnotation
from
'./operation/operationAnnotation'
import
{
requestAPI
,
api
}
from
'@/lib/commonMixin'
import
operationAnnotation
from
'./operation/operationAnnotation'
export
default
{
name
:
''
,
components
:
{
...
...
@@ -190,7 +190,12 @@
},
methods
:
{
editAnnotation
(
item
)
{
this
.
$refs
.
operationAnnotation
.
show
(
item
)
this
.
operationPage
=
'operationAnnotation'
this
.
operationTitle
=
'编辑商机批注'
// this.$refs.operationAnnotation.show(item)
this
.
$nextTick
(()
=>
{
this
.
$refs
.
sidePopup
.
show
(
this
.
$refs
[
this
.
operationPage
].
init
(
item
))
})
},
leaveMessageSch
(
item
)
{
this
.
$refs
.
leaveMessage
.
btnShow
(
item
)
...
...
@@ -274,9 +279,11 @@
this
.
filter
=
res
})
},
close
()
{
close
(
getList
)
{
this
.
$refs
.
sidePopup
.
close
()
this
.
getList
()
if
(
getList
)
{
this
.
getList
()
}
}
},
created
()
{
...
...
src/components/project/operation/addProject.vue
View file @
99747fd6
...
...
@@ -6,7 +6,7 @@
:error-data=
"errorData"
>
<span
slot=
"operationBtn"
>
<el-button
type=
"primary"
@
click=
"saveProject"
size=
"mini"
>
保存
</el-button>
<el-button
@
click=
"close"
size=
"mini"
>
关闭
</el-button>
<el-button
@
click=
"close
()
"
size=
"mini"
>
关闭
</el-button>
</span>
</operation-project>
</section>
...
...
@@ -40,15 +40,15 @@
message
:
'保存成功!'
,
type
:
'success'
})
this
.
close
()
this
.
close
(
true
)
},
error
=>
{
error
.
msg
.
forEach
(
item
=>
{
this
.
$set
(
this
.
errorData
,
item
.
name
,
item
.
error
)
})
})
},
close
()
{
this
.
$emit
(
'close'
)
close
(
getList
)
{
this
.
$emit
(
'close'
,
getList
)
},
init
()
{
this
.
$refs
.
operationProject
.
initAdd
()
...
...
src/components/project/operation/editProject.vue
View file @
99747fd6
...
...
@@ -6,7 +6,7 @@
:error-data=
"errorData"
>
<span
slot=
"operationBtn"
>
<el-button
type=
"primary"
@
click=
"saveProject"
size=
"mini"
>
保存
</el-button>
<el-button
@
click=
"close"
size=
"mini"
>
关闭
</el-button>
<el-button
@
click=
"close
()
"
size=
"mini"
>
关闭
</el-button>
</span>
</operation-project>
</section>
...
...
@@ -40,24 +40,19 @@
message
:
'保存成功!'
,
type
:
'success'
})
this
.
close
()
this
.
close
(
true
)
},
error
=>
{
error
.
msg
.
forEach
(
item
=>
{
this
.
$set
(
this
.
errorData
,
item
.
name
,
item
.
error
)
})
})
},
close
()
{
this
.
$emit
(
'close'
)
close
(
getList
)
{
this
.
$emit
(
'close'
,
getList
)
},
init
(
id
,
clientId
)
{
this
.
$refs
.
operationProject
.
initEdit
(
id
,
clientId
)
}
},
created
()
{
},
mounted
()
{
// this.$refs.operationProject.initEdit()
}
}
</
script
>
...
...
src/components/project/operation/operationAnnotation.vue
View file @
99747fd6
<
template
>
<section>
<el-dialog
title=
"编辑商机批注"
:visible
.
sync=
"formVisible"
:modal-append-to-body=
"false"
:close=
"cancel
"
>
<el-
form
ref=
"form"
:model=
"model"
label-width=
"0"
>
<el-input
v-model=
"model.comment"
type=
"textarea"
:rows=
"15"
placeholder=
"请输入商机批注"
></el-input
>
</el-for
m>
<div
slot=
"footer"
class=
"text-center"
>
<el-button
size=
"small"
@
click=
"formVisible = false"
>
取消
</el-button>
<!--确定
-->
<el-button
size=
"small"
type=
"primary"
@
click=
"submit"
>
保存
</el-button>
<!--取 消
-->
</div
>
</el-dialog
>
</section>
<section>
<el-form
ref=
"form"
:model=
"model"
label-width=
"0"
>
<el-form-item>
<el-input
v-model=
"model.comment"
type=
"textarea"
:rows=
"15"
placeholder=
"请输入商机批注"
></el-input>
</el-form-item>
<el-form-item
style=
"text-align: center
"
>
<el-
button
type=
"primary"
@
click=
"submit"
size=
"mini"
>
保存
</el-button
>
<el-button
@
click=
"close()"
size=
"mini"
>
关闭
</el-button
>
</el-form-ite
m>
</el-form
>
<!--
<div
slot=
"footer"
class=
"text-center"
>
-->
<!--
<el-button
size=
"small"
@
click=
"formVisible = false"
>
关闭
</el-button>
<
!
–
确定
–>
-->
<!--
<el-button
size=
"small"
type=
"primary"
@
click=
"submit"
>
保存
</el-button>
<
!
–
取 消
–>
--
>
<!--
</div>
--
>
</section>
</
template
>
<
script
>
...
...
@@ -35,10 +35,12 @@
}
},
methods
:
{
cancel
()
{
close
(
getList
)
{
console
.
log
(
getList
)
Object
.
keys
(
this
.
model
).
forEach
(
item
=>
{
this
.
model
[
item
]
=
''
})
this
.
$emit
(
'close'
,
getList
)
},
submit
()
{
// console.log(this.model.comment.replace(/\n/g, '\r\n'))
...
...
@@ -55,18 +57,15 @@
type
:
'success'
})
this
.
formVisible
=
false
this
.
$emit
(
'update:list'
)
this
.
close
(
true
)
},
()
=>
{
this
.
$message
.
error
(
'保存失败!'
)
})
},
show
(
model
)
{
console
.
log
(
model
)
init
(
model
)
{
Object
.
keys
(
this
.
model
).
forEach
(
item
=>
{
console
.
log
(
this
.
model
[
item
])
this
.
model
[
item
]
=
model
[
item
]
})
this
.
formVisible
=
true
}
},
created
()
{
...
...
src/components/project/projectOfClient/projectOfClient.vue
View file @
99747fd6
...
...
@@ -73,7 +73,6 @@
<side-popup
ref=
"sidePopup"
:title=
"operationTitle"
>
<component
:is=
"operationPage"
:ref=
"operationPage"
@
close=
"close"
></component>
</side-popup>
<operation-annotation
ref=
"operationAnnotation"
@
update:list=
"getList()"
></operation-annotation>
</section>
</
template
>
...
...
@@ -82,9 +81,9 @@
requestAPI
,
api
}
from
'@/lib/commonMixin'
import
ScheduleItem
from
'../
../common/
scheduleItem'
import
ScheduleItem
from
'../scheduleItem'
import
clientHeader
from
'../../common/clientHeader'
import
Pagenation
from
'../schedulePagenation'
import
Pagenation
from
'../
../common/
schedulePagenation'
import
clickOutside
from
'@/lib/bind'
import
addProject
from
'../operation/addProject'
import
editProject
from
'../operation/editProject'
...
...
@@ -182,7 +181,12 @@
},
methods
:
{
editAnnotation
(
item
)
{
this
.
$refs
.
operationAnnotation
.
show
(
item
)
this
.
operationPage
=
'operationAnnotation'
this
.
operationTitle
=
'编辑商机批注'
// this.$refs.operationAnnotation.show(item)
this
.
$nextTick
(()
=>
{
this
.
$refs
.
sidePopup
.
show
(
this
.
$refs
[
this
.
operationPage
].
init
(
item
))
})
},
leaveMessageSch
(
item
)
{
this
.
$refs
.
leaveMessage
.
btnShow
(
item
)
...
...
src/components/
common
/scheduleItem.vue
→
src/components/
project
/scheduleItem.vue
View file @
99747fd6
File moved
src/components/sales/list.vue
0 → 100644
View file @
99747fd6
<
template
>
<section>
<div
class=
"content"
>
<client-header
ref=
"clientHeader"
title=
"销售记录"
:title-span=
"6"
:model=
"form"
search-key=
"SalesOrderSearch"
key-code=
"keyword"
type=
"keyword"
button-title=
"新建销售记录 "
:add-new-user=
"addNewSales"
:search-keyword=
"searchKeyword"
></client-header>
<client-form
ref=
"clientForm"
:filter=
"filter"
@
update:clientList=
"form =>
{ updateForm(form)}"
:form-search-key="formSearchKey">
</client-form>
<div
class=
"page-body-content"
>
<div
v-loading=
"loading"
>
<ScheduleItem
v-for=
"(item, key) in result.list"
:item=
"item"
:key=
"key"
@
update:image=
"imgs =>
{setImage(imgs)}">
<span
slot=
"opearate"
>
<el-button
class=
"pull-right"
type=
"primary"
size=
"mini"
:disabled=
"!item.can_delete"
@
click=
"delProject(item.id)"
>
<i
class=
"fa fa-trash-o faa-shake"
></i>
删除
</el-button>
<el-button
class=
"pull-right"
type=
"primary"
size=
"mini"
:disabled=
"!item.can_update"
@
click=
"editProject(item)"
>
<i
class=
"fa fa-edit"
></i>
编辑
</el-button>
<el-button
class=
"pull-right"
type=
"primary"
size=
"mini"
@
click
.
prevent
.
stop=
"leaveMessageSch(item)"
>
<span
:class=
"['badge',
{'badge-unread': item.unread > 0}]"
v-if="item.commentCount">
{{
item
.
commentCount
.
comment
}}
</span>
<i
class=
"fa fa-commenting"
></i>
留言
</el-button>
</span>
</ScheduleItem>
<div
v-if=
"result.list.length === 0"
>
<el-card
class=
"box-card"
>
未查询到数据!
</el-card>
</div>
</div>
<Pagenation
@
update:pager=
"pager =>
{updatePage(pager)}"
:pager.sync="pagenation"
:total="totalcount">
</Pagenation>
<leave-message
v-click-outside=
"lmClose"
ref=
"leaveMessage"
:lmTemplate=
"lmTemplate"
:type=
"1"
>
</leave-message>
</div>
</div>
</section>
</
template
>
<
script
>
import
clientHeader
from
'../common/clientHeader'
import
clickOutside
from
'@/lib/bind'
import
Pagenation
from
'../common/schedulePagenation'
import
clientForm
from
'./salesListForm'
import
ScheduleItem
from
'./scheduleItem'
import
{
requestAPI
,
api
}
from
'@/lib/commonMixin'
export
default
{
name
:
''
,
components
:
{
clientHeader
,
clientForm
,
Pagenation
,
ScheduleItem
},
directives
:
{
clickOutside
},
data
()
{
return
{
lmTemplate
:
[
{
name
:
'客户名称'
,
value
:
'client.name'
,
default
:
''
},
{
name
:
'销售日期'
,
value
:
'sales_date'
,
default
:
''
},
{
name
:
'备注'
,
value
:
'description'
,
default
:
''
},
{
name
:
'客户经理'
,
value
:
'salesRep.name'
,
default
:
''
},
{
name
:
'录入人'
,
value
:
'createdBy.name'
,
default
:
''
},
{
name
:
'创建时间'
,
value
:
'created_at'
,
default
:
''
}
],
operationPage
:
''
,
operationTitle
:
''
,
result
:
{
list
:
[]
},
form
:
{
'SalesOrderSearch[keyword]'
:
''
},
filter
:
[],
pagenation
:
{
page
:
1
},
totalcount
:
0
,
loading
:
false
,
formSearchKey
:
'SalesOrder'
}
},
methods
:
{
leaveMessageSch
(
item
)
{
this
.
$refs
.
leaveMessage
.
btnShow
(
item
)
},
lmClose
()
{
this
.
$refs
.
leaveMessage
&&
this
.
$refs
.
leaveMessage
.
btnClose
()
},
addNewSales
()
{
},
searchKeyword
(
search
)
{
this
.
updateForm
(
search
)
},
updateForm
(
form
)
{
Object
.
assign
(
this
.
form
,
form
)
this
.
getList
()
},
getList
()
{
if
(
this
.
loading
)
{
return
}
this
.
loading
=
true
requestAPI
(
api
.
getSalesList
,
{
data
:
{
...
this
.
form
,
page
:
this
.
pagenation
.
page
}
}).
then
(
res
=>
{
this
.
result
.
list
=
res
.
list
// this.pagenation.page = res.pagenation.thispage
this
.
totalcount
=
res
.
pagenation
.
totalcount
// this.totalcount = 8
this
.
$el
.
querySelector
(
'.page-body-content'
).
scrollTo
(
0
,
0
)
}).
finally
(
_
=>
{
this
.
loading
=
false
})
},
getFilter
()
{
requestAPI
(
api
.
getSalesFilter
).
then
(
res
=>
{
this
.
filter
=
res
})
}
},
created
()
{
this
.
getFilter
()
this
.
$nextTick
(()
=>
{
this
.
getList
()
})
}
}
</
script
>
<
style
scoped
lang=
"scss"
>
@include
c
(
'schedule-right'
)
{
>
.el-row
{
>
.el-col
{
margin-bottom
:
4px
;
.el-button
{
margin
:
0
2px
;
padding
:
7px
;
}
.date-time
{
color
:
#649FD7
;
}
}
}
.badge
{
border-radius
:
2px
;
color
:
#333744
;
background
:
#ffffff
;
vertical-align
:
baseline
;
display
:
inline
;
padding
:
2px
6px
;
}
span
.badge-unread
{
&
:hover
{
border-color
:
#de321d
}
color
:
#fff
;
background-color
:
#e54c3a
;
border-color
:
#a32516
}
}
</
style
>
src/components/sales/operation/addSales.vue
0 → 100644
View file @
99747fd6
<
template
>
<div>
</div>
</
template
>
<
script
>
export
default
{
name
:
''
,
data
()
{
return
{}
},
methods
:
{},
created
()
{
}
}
</
script
>
<
style
scoped
>
</
style
>
src/components/sales/operation/editSales.vue
0 → 100644
View file @
99747fd6
<
template
>
<div>
</div>
</
template
>
<
script
>
export
default
{
name
:
''
,
data
()
{
return
{}
},
methods
:
{},
created
()
{
}
}
</
script
>
<
style
scoped
>
</
style
>
src/components/sales/operation/operationSales.vue
0 → 100644
View file @
99747fd6
<
template
>
<div>
</div>
</
template
>
<
script
>
export
default
{
name
:
''
,
data
()
{
return
{}
},
methods
:
{},
created
()
{
}
}
</
script
>
<
style
scoped
>
</
style
>
src/components/sales/salesListForm.vue
0 → 100644
View file @
99747fd6
<
template
>
<div>
<el-row
class=
"form-content"
>
<el-form
size=
"mini"
:model=
"clientForm"
label-width=
"0"
label-position=
"top"
>
<el-col
:span=
"4"
v-for=
"(item, key) in filter"
:key=
"key"
>
<el-form-item>
<span
slot=
"label"
v-if=
"item.key !== 'Filter[sort]'"
>
<a
@
click
.
prevent=
"timeSort"
v-if=
"item.key === 'Filter[name]'"
>
{{
item
.
name
}}
<i
:class=
"['fa', setSortIcon()]"
></i>
</a>
<span
v-else
>
{{
item
.
name
}}
</span>
</span>
<el-select
clearable
v-model=
"clientForm[item.key]"
placeholder=
"请选择"
v-if=
"!item.itemKey && item.key !== 'Filter[sort]'"
size=
"mini"
>
<el-option
v-for=
"(option, optKey) in item.value"
:key=
"optKey"
:label=
"option.name"
:value=
"option.key"
>
<span
style=
"font-size: 12px;"
>
{{
option
.
name
}}
</span>
</el-option>
</el-select>
<el-cascader
:ref=
"'elCasc' + key"
v-model=
"item.cascader"
:props=
"props"
clearable
change-on-select
v-if=
"item.itemKey"
:options=
"item.value"
@
change=
"setCascader(item, key)"
></el-cascader>
</el-form-item>
</el-col>
</el-form>
</el-row>
</div>
</
template
>
<
script
>
import
{
findWhere
}
from
'../../lib/viewHelper'
import
$
from
'jquery'
const
timeItem
=
[
'period'
]
export
default
{
name
:
'client-form'
,
data
()
{
return
{
clientTimeForm
:
{},
clientTimeRange
:
{
from
:
''
,
to
:
''
},
clientForm
:
{},
props
:
{
label
:
'name'
,
value
:
'key'
,
children
:
'child'
}
}
},
props
:
[
'filter'
,
'formSearchKey'
],
methods
:
{
setCascader
(
item
,
key
)
{
if
(
item
.
cascader
.
length
===
1
)
{
this
.
clientForm
[
item
.
key
]
=
item
.
cascader
[
0
]
this
.
clientForm
[
item
.
itemKey
]
=
''
}
else
if
(
item
.
cascader
.
length
===
2
)
{
this
.
clientForm
[
item
.
itemKey
]
=
item
.
cascader
[
0
]
this
.
clientForm
[
item
.
key
]
=
item
.
cascader
[
1
]
}
else
{
this
.
clientForm
[
item
.
itemKey
]
=
''
this
.
clientForm
[
item
.
key
]
=
''
}
},
setDefault
(
filter
)
{
filter
.
forEach
(
item
=>
{
if
(
item
.
default
)
{
let
keys
=
findWhere
(
item
.
value
,
item
.
default
,
'key'
)
if
(
keys
.
node
)
{
if
(
keys
.
parentNode
)
{
this
.
clientForm
[
item
.
itemKey
]
=
keys
.
parentNode
.
key
this
.
clientForm
[
item
.
key
]
=
keys
.
node
.
key
item
.
cascader
=
[
keys
.
parentNode
.
key
,
keys
.
node
.
key
]
}
else
{
this
.
clientForm
[
item
.
itemKey
]
=
''
this
.
clientForm
[
item
.
key
]
=
keys
.
node
.
key
item
.
cascader
=
[
keys
.
node
.
key
]
}
}
}
})
},
init
(
isCascader
)
{
this
.
$watch
(
'clientForm'
,
(
val
)
=>
{
this
.
$emit
(
'update:clientList'
,
Object
.
assign
({},
val
,
this
.
clientTimeForm
))
},
{
deep
:
true
})
this
.
$watch
(
'clientTimeForm'
,
(
val
)
=>
{
let
perid
=
val
[
this
.
formSearchKey
+
'[period]'
]
this
.
$emit
(
'update:clientList'
,
Object
.
assign
({},
{[
this
.
formSearchKey
+
'[period]'
]:
perid
},
this
.
clientForm
))
},
{
deep
:
true
})
let
_this
=
this
if
(
isCascader
)
{
$
(
document
).
ready
(()
=>
{
$
(
document
).
on
(
'mouseleave'
,
'.el-cascader-menus'
,
()
=>
{
Object
.
keys
(
_this
.
$refs
).
forEach
(
item
=>
{
_this
.
$refs
[
item
][
0
].
menuVisible
=
false
})
})
})
}
},
setSortIcon
()
{
if
(
this
.
clientForm
[
'Filter[sort]'
]
===
''
)
{
return
'fa-sort-amount-desc'
}
else
if
(
this
.
clientForm
[
'Filter[sort]'
]
===
'DESC'
)
{
return
'fa-sort-amount-desc'
}
else
{
return
'fa-sort-amount-asc'
}
},
timeSort
()
{
if
(
this
.
clientForm
[
'Filter[sort]'
]
===
''
)
{
this
.
clientForm
[
'Filter[sort]'
]
=
'ASC'
}
else
if
(
this
.
clientForm
[
'Filter[sort]'
]
===
'ASC'
)
{
this
.
clientForm
[
'Filter[sort]'
]
=
'DESC'
}
else
{
this
.
clientForm
[
'Filter[sort]'
]
=
'ASC'
}
},
setSearchTime
()
{
let
from
=
this
.
clientTimeRange
.
from
let
to
=
this
.
clientTimeRange
.
to
this
.
$emit
(
'update:clientList'
,
Object
.
assign
({},
{
[
this
.
formSearchKey
+
'[from]'
]:
from
,
[
this
.
formSearchKey
+
'[to]'
]:
to
},
this
.
clientTimeForm
,
this
.
clientForm
))
}
},
mounted
()
{
},
watch
:
{
'clientTimeRange.from'
(
val
)
{
if
(
new
Date
(
val
)
>=
new
Date
(
this
.
clientTimeRange
.
to
))
{
this
.
clientTimeRange
.
to
=
val
}
},
'clientTimeRange.to'
(
val
)
{
if
(
new
Date
(
val
)
<=
new
Date
(
this
.
clientTimeRange
.
from
))
{
this
.
clientTimeRange
.
from
=
val
}
},
'filter'
(
val
)
{
let
isCascader
=
false
val
.
forEach
(
item
=>
{
if
(
item
.
itemKey
)
{
this
.
$set
(
this
.
clientForm
,
item
.
itemKey
,
''
)
this
.
$set
(
item
,
'cascader'
,
[])
isCascader
=
true
}
this
.
$set
(
this
.
clientForm
,
item
.
key
,
''
)
})
this
.
$nextTick
(()
=>
{
this
.
init
(
isCascader
)
this
.
setDefault
(
val
)
})
},
'formSearchKey'
:
{
handler
(
val
)
{
if
(
val
!==
''
)
{
timeItem
.
forEach
(
item
=>
{
this
.
$set
(
this
.
clientTimeForm
,
val
+
'['
+
item
+
']'
,
''
)
})
}
},
immediate
:
true
}
}
}
</
script
>
<
style
scoped
>
.form-content-time-top
{
background
:
#FFF
;
}
.form-content-time-top
.el-form-item
{
margin
:
7px
0
9px
;
}
.form-content-time-top
.el-col
{
padding
:
0
15px
;
}
</
style
>
<
style
>
.form-content-time-top
.el-form-item__label
{
font-size
:
.875rem
;
font-weight
:
normal
;
padding
:
0
2px
0
0
;
}
.form-content-time-top
.el-radio-button__orig-radio
:checked
+
.el-radio-button__inner
{
color
:
#fff
!important
;
background-color
:
#333744
!important
;
border-color
:
#282b35
!important
;
box-shadow
:
-1px
0
0
0
#282b35
;
}
.form-content-time-top
.el-radio-button
:first-child
.el-radio-button__inner
{
border-left
:
1px
solid
#DCDFE6
;
}
.form-content-time-top
.el-radio-button__inner
:hover
{
border-color
:
#DCDFE6
!important
;
}
.form-content-time-top
.form-content-time-range
.el-form-item
.el-form-item__content
{
display
:
flex
;
font-size
:
12px
;
}
</
style
>
src/components/sales/scheduleItem.vue
0 → 100644
View file @
99747fd6
<
template
>
<section
class=
"client-schedule-item"
>
<el-row
class=
"client-schedule-row"
>
<el-col
:span=
"4"
:xs=
"24"
class=
"client-schedule-left"
:style=
"
{'background-color': item.bgcolor}">
<el-row
:gutter=
"10"
>
<el-col
:span=
"24"
class=
"entity-name"
>
<i
class=
"fa fa-star"
aria-hidden=
"true"
></i>
<router-link
:to=
"toView(item)"
v-if=
"Object.keys(item.client).length > 0"
>
{{
item
.
client
.
name
}}
</router-link>
<span
v-else
>
客户名称
{{
noneText
}}
</span>
</el-col>
<el-col
:span=
"24"
class=
"entity-name"
>
<i
class=
"fa fa-th-list"
aria-hidden=
"true"
></i>
<span
v-if=
"Object.keys(item.project).length > 0"
>
{{
item
.
project
.
name
}}
</span>
<span
v-else
>
{{
noneText
}}
</span>
</el-col>
<el-col
:span=
"12"
class=
"entity-name"
>
<img
class=
"user-avatar rounded-circle"
:src=
"item.createdBy.avatar.name"
>
<span
class=
"black"
>
{{
item
.
createdBy
.
name
}}
</span>
</el-col>
</el-row>
</el-col>
<el-col
:span=
"20"
:xs=
"24"
class=
"client-schedule-right"
>
<el-row
:gutter=
"10"
>
<el-col
:span=
"6"
:xs=
"24"
class=
"show-picture"
>
销售日期:
<span
class=
"date-time"
>
<router-link
:to=
"
{}">
{{
item
.
sales_date
!==
''
?
item
.
sales_date
:
noneText
}}
</router-link>
</span>
</el-col>
<el-col
:span=
"6"
:xs=
"24"
>
客户经理:
<span
v-if=
"Object.keys(item.salesRep).length > 0"
>
{{
item
.
salesRep
.
name
}}
</span><span
v-else
>
{{
noneText
}}
</span>
</el-col>
<el-col
:span=
"6"
:xs=
"24"
>
录入人:
<span
v-if=
"Object.keys(item.createdBy).length > 0"
>
{{
item
.
createdBy
.
name
}}
</span><span
v-else
>
{{
noneText
}}
</span>
</el-col>
<el-col
:span=
"6"
:xs=
"24"
>
创建时间:
<span
class=
"date-time"
>
{{
item
.
created_at
!==
''
?
item
.
created_at
:
noneText
}}
</span>
</el-col>
</el-row>
<el-row
:gutter=
"10"
>
<el-col
:span=
"6"
:xs=
"24"
>
<span
class=
"border border-danger text-danger rounded px-1"
>
服务截止日期
</span>
:
<span>
{{
item
.
expire_date
!==
''
?
item
.
expire_date
:
noneText
}}
</span>
</el-col>
</el-row>
<el-row
:gutter=
"10"
>
<el-col
:span=
"12"
:xs=
"24"
>
<span
class=
"border border-danger text-danger rounded px-1"
>
备注
</span>
:
<span
v-html=
"setBr(item.description)"
></span>
</el-col>
<el-col
:span=
"12"
:xs=
"24"
>
<slot
name=
"opearate"
>
</slot>
</el-col>
</el-row>
</el-col>
</el-row>
</section>
</
template
>
<
script
>
export
default
{
name
:
'scheduleItem'
,
props
:
{
item
:
Object
},
data
()
{
return
{
noneText
:
'(未设置)'
}
},
methods
:
{
setBr
(
text
)
{
if
(
text
===
''
)
{
return
this
.
noneText
}
else
{
return
text
.
replace
(
/
\n
/g
,
'<br />'
)
}
},
toView
(
item
)
{
let
obj
=
{
app
:
'project'
,
name
:
'ofClient'
,
params
:
{
id
:
item
.
client_id
}
}
return
obj
},
showImageViewer
(
images
)
{
this
.
$emit
(
'update:image'
,
images
.
map
(
i
=>
'https://beta.jinchangxiao.com'
+
i
.
attachment
.
name
))
// this.$emit('update:image', ['https://beta.jinchangxiao.com/files/protected/a57be577deb434/2019/03/34cf2b53-3959-33fe-93af-98a50fd18c11.jpg'])
}
},
computed
:
{
isNullClient
()
{
return
!
this
.
item
.
client
},
isPublic
()
{
return
!!
this
.
item
.
is_public
}
},
mounted
()
{
}
}
</
script
>
<
style
scoped
lang=
"scss"
>
.text-info
{
color
:
#17a2b8
!
important
;
}
.border-info
{
border-color
:
#17a2b8
!
important
;
}
.colRed
{
color
:
red
;
border
:
1px
solid
red
;
}
.colGreen
{
color
:
green
;
border
:
1px
solid
green
;
}
.colRed
,
.colGreen
,
.col
{
border-radius
:
.25rem
;
padding
:
0
.25rem
;
}
.rounded-circle
{
border-radius
:
50%
!
important
;
}
.user-avatar
{
width
:
16px
;
max-width
:
16px
;
height
:
16px
;
max-height
:
16px
;
}
@include
c
(
'schedule-item'
)
{
margin-bottom
:
10px
;
font-size
:
12px
;
.border
{
border
:
1px
solid
#dee2e6
;
}
.border-success
{
border-color
:
#28a745
!
important
;
}
.border-danger
{
border-color
:
#dc3545
;
}
.text-success
{
color
:
#28a745
!
important
;
}
.text-danger
{
color
:
#E45744
;
}
.rounded
{
border-radius
:
.25rem
!
important
;
}
.px-1
{
padding
:
0
.25rem
;
}
}
@include
c
(
'schedule-item:first-child'
)
{
.client-schedule-left
{
border-radius
:
5px
0
0
0
;
}
}
@include
c
(
'schedule-row'
)
{
background-color
:
white
;
display
:
flex
;
flex-wrap
:
wrap
;
}
@include
c
(
'schedule-left'
)
{
background-color
:
#FF6A6A
;
min-height
:
100%
;
padding
:
10px
15px
6px
;
>
.el-row
{
>
.el-col
{
margin-bottom
:
4px
;
}
}
.el-row
div
:first-child
,
.el-row
div
:first-child
a
,
.entity-name
,
.entity-name
a
{
color
:
white
;
}
.entity-name
.black
{
color
:
#000000
;
}
span
{
display
:
inline-block
;
padding-left
:
3px
;
}
span
.np
{
padding-left
:
0
;
}
@include
e
(
'private'
)
{
display
:
inline-block
;
// border: 1px solid black;
padding-right
:
5px
;
border-radius
:
5px
;
width
:
40px
;
height
:
20px
;
}
}
@include
c
(
'schedule-right'
)
{
height
:
100%
;
padding
:
10px
15px
6px
;
>
.el-row
{
>
.el-col
{
margin-bottom
:
4px
;
.el-button
{
margin
:
0
2px
;
padding
:
7px
;
}
.date-time
,
.show-picture
{
color
:
#649FD7
;
}
.show-picture
{
cursor
:
pointer
;
}
}
}
.badge
{
border-radius
:
2px
;
color
:
#333744
;
background
:
#ffffff
;
vertical-align
:
baseline
;
display
:
inline
;
padding
:
2px
6px
;
text-align
:
center
;
}
span
.badge-unread
{
&
:hover
{
border-color
:
#de321d
}
color
:
#fff
;
background-color
:
#e54c3a
;
border-color
:
#a32516
}
@include
e
(
'item'
)
{
display
:
flex
;
flex-direction
:
column
;
justify-content
:
space-around
;
padding
:
5px
0
5px
5px
;
flex
:
1
;
}
@include
e
(
'status'
)
{
color
:
red
;
}
@include
e
(
'content'
)
{
display
:
inline-block
;
border
:
1px
solid
red
;
border-radius
:
5px
;
height
:
20px
;
padding
:
0
5px
0
5px
;
color
:
red
;
}
}
</
style
>
src/components/sales/view/salesView.vue
0 → 100644
View file @
99747fd6
<
template
>
<div>
</div>
</
template
>
<
script
>
export
default
{
name
:
''
,
data
()
{
return
{}
},
methods
:
{},
created
()
{
}
}
</
script
>
<
style
scoped
>
</
style
>
src/route.js
View file @
99747fd6
import
portal
from
'vis-portal'
import
ElementRoute
from
'./routes/project'
import
salesOrder
from
'./routes/salesOrders'
let
routes
=
[]
let
salesRours
=
[]
const
appName
=
'project'
routes
=
[].
concat
(
ElementRoute
)
salesRours
=
[].
concat
(
salesOrder
)
let
RouterInit
=
()
=>
{
portal
.
createApp
(
appName
,
{},
app
=>
{
app
.
mapRoute
(
routes
)
})
portal
.
createApp
(
'salesOrders'
,
{},
app
=>
{
app
.
mapRoute
(
salesRours
)
})
}
export
default
RouterInit
src/routes/salesOrders.js
0 → 100644
View file @
99747fd6
import
salesList
from
'../components/sales/list'
const
projectTitle
=
'金畅逍BMS - '
const
routes
=
[
{
path
:
'/salesOrder'
,
name
:
'salesOrder'
,
component
:
salesList
,
meta
:
{
title
:
projectTitle
+
'销售记录'
}
}
]
export
default
routes
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