Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
J
jilinzhongdianrenqun-web
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Members
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
吴超
jilinzhongdianrenqun-web
Commits
8978ca8c
Commit
8978ca8c
authored
Nov 25, 2025
by
wangchunyang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
1、统计颜色按标准指定红、黄、绿颜色显示;
2、评分时增加多附件上传 3、双属地增加通讯录 4、双属地增加预警,推送后24小时后,若未接收,显示在预警 5、统计调整,双属地统计时,去除原属地统计数量
parent
0f723ce8
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
463 行增加
和
19 行删除
+463
-19
src/api/key-person.js
+24
-0
src/view/key-person/index.vue
+6
-6
src/view/key-person/key-person-dual/index.vue
+251
-10
src/view/key-person/key-person-rating/keyPersonRatingDetails.vue
+182
-3
没有找到文件。
src/api/key-person.js
View file @
8978ca8c
...
...
@@ -329,6 +329,30 @@ export const getDualDetail = (param) => {
})
}
export
const
getDualWarnPushList
=
(
param
)
=>
{
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyPersonRatingDual/selectDualWarnPushList'
,
method
:
'post'
,
data
:
param
})
}
export
const
getDualPhoneList
=
(
param
)
=>
{
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyPersonRatingDual/selectDualPhoneList'
,
method
:
'post'
,
data
:
param
})
}
export
const
saveDualPhone
=
(
param
)
=>
{
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyPersonRatingDual/saveDualPhone'
,
method
:
'post'
,
data
:
param
})
}
// ===== 回访记录办理 =====
// 查询回访记录列表
export
const
findVisitRecordList
=
(
param
)
=>
{
...
...
src/view/key-person/index.vue
View file @
8978ca8c
...
...
@@ -515,7 +515,7 @@ export default {
legend
:
{
top
:
'bottom'
,
textStyle
:
{
color
:
[
'#
ff9c9c'
,
'#ffe757'
,
'#65c1ff
'
]
// 图例文字颜色
color
:
[
'#
b63636'
,
'#ffe757'
,
'#90EE90
'
]
// 图例文字颜色
}
},
title
:
{
...
...
@@ -527,7 +527,7 @@ export default {
// fontSize: 14
// }
},
color
:
[
'#
ff9c9c'
,
'#ffe757'
,
'#65c1ff
'
],
color
:
[
'#
b63636'
,
'#ffe757'
,
'#90EE90
'
],
series
:
chartData
.
map
(
function
(
data
,
idx
)
{
var
top
=
idx
*
33.3
console
.
log
(
'data'
,
data
)
...
...
@@ -624,7 +624,7 @@ export default {
legend
:
{
top
:
'bottom'
,
textStyle
:
{
color
:
[
'#
ff9c9c'
,
'#ffe757'
,
'#65c1ff
'
]
// 图例文字颜色
color
:
[
'#
b63636'
,
'#ffe757'
,
'#90EE90
'
]
// 图例文字颜色
}
},
title
:
{
...
...
@@ -636,7 +636,7 @@ export default {
// fontSize: 14
// }
},
color
:
[
'#
ff9c9c'
,
'#ffe757'
,
'#65c1ff
'
],
color
:
[
'#
b63636'
,
'#ffe757'
,
'#90EE90
'
],
series
:
chartData
.
map
(
function
(
data
,
idx
)
{
var
top
=
idx
*
33.3
console
.
log
(
'data'
,
data
)
...
...
@@ -733,7 +733,7 @@ export default {
legend
:
{
top
:
'bottom'
,
textStyle
:
{
color
:
[
'#
ff9c9c'
,
'#ffe757'
,
'#65c1ff
'
]
// 图例文字颜色
color
:
[
'#
b63636'
,
'#ffe757'
,
'#90EE90
'
]
// 图例文字颜色
}
},
title
:
{
...
...
@@ -745,7 +745,7 @@ export default {
// fontSize: 14
// }
},
color
:
[
'#
ff9c9c'
,
'#ffe757'
,
'#65c1ff
'
],
color
:
[
'#
b63636'
,
'#ffe757'
,
'#90EE90
'
],
series
:
chartData
.
map
(
function
(
data
,
idx
)
{
var
top
=
idx
*
33.3
console
.
log
(
'data'
,
data
)
...
...
src/view/key-person/key-person-dual/index.vue
View file @
8978ca8c
...
...
@@ -343,6 +343,118 @@
@
on-page-size-change=
"sizeChange('forward', $event)"
/>
</TabPane>
<TabPane
:label=
"getWarnPushTitle()"
name=
"warnPush"
>
<div
class=
"search-div"
>
<Row
type=
"flex"
:gutter=
"16"
class=
""
>
<Col
span=
"4"
>
<span>
姓名:
</span>
<Input
v-model=
"filters.warnPush.name"
placeholder=
"请输入"
style=
"width: 65%"
/>
</Col>
<Col
span=
"4"
>
<span>
身份证号:
</span>
<Input
v-model=
"filters.warnPush.card_no"
placeholder=
"请输入"
style=
"width: 55%"
/>
</Col>
<Col
span=
"4"
>
<span>
选择市:
</span>
<Select
v-model=
"filters.warnPush.city_id"
clearable
style=
"width: 55%"
@
on-change=
"handleFilterCascade('push', 'city', $event)"
>
<Option
v-for=
"c in cityOptions"
:key=
"c.parent_id"
:value=
"c.parent_id"
>
{{ c.name }}
</Option>
</Select>
</Col>
<Col
span=
"4"
>
<span>
选择区:
</span>
<Select
v-model=
"filters.warnPush.area_id"
clearable
style=
"width: 55%"
@
on-change=
"handleFilterCascade('push', 'area', $event)"
>
<Option
v-for=
"c in areaState.push.areaList"
:key=
"c.parent_id"
:value=
"c.parent_id"
>
{{ c.name }}
</Option>
</Select>
</Col>
<Col
span=
"4"
>
<span>
选择街道:
</span>
<Select
v-model=
"filters.warnPush.street_id"
clearable
style=
"width: 55%"
@
on-change=
"handleFilterCascade('push', 'street', $event)"
>
<Option
v-for=
"c in areaState.push.streetList"
:key=
"c.parent_id"
:value=
"c.parent_id"
>
{{ c.name }}
</Option>
</Select>
</Col>
<Col
span=
"4"
>
<span>
选择社区:
</span>
<Select
v-model=
"filters.warnPush.community_id"
clearable
style=
"width: 55%"
>
<Option
v-for=
"c in areaState.push.communityList"
:key=
"c.parent_id"
:value=
"c.parent_id"
>
{{ c.name }}
</Option>
</Select>
</Col>
</Row>
<Row
type=
"flex"
:gutter=
"16"
class=
"mbt15"
>
<Col
span=
"24"
class=
"text-right"
>
<Button
type=
"primary"
class=
"mr10"
@
click=
"handleSearch('warnPush')"
>
搜索
</Button>
<Button
class=
"mr10"
@
click=
"handleReset('warnPush')"
>
重置
</Button>
</Col>
</Row>
</div>
<Table
border
:loading=
"loading.push"
:columns=
"warnPushColumns"
:data=
"tables.warnPush"
>
<
template
slot=
"push_status"
slot-scope=
"{ row }"
>
<span>
{{
renderPushStatus
(
row
.
push_status
)
}}
</span>
</
template
>
<
template
slot=
"warnPushAction"
slot-scope=
"{ row }"
>
<Button
size=
"small"
@
click=
"openDetail(row)"
>
详情
</Button>
</
template
>
</Table>
<Page
class=
"page_style"
:total=
"pagers.push.totalRecord"
:current=
"pagers.push.pageNo"
:page-size=
"pagers.push.pageSize"
show-total
show-sizer
@
on-change=
"pageChange('push', $event)"
@
on-page-size-change=
"sizeChange('push', $event)"
/>
</TabPane>
<TabPane
label=
"通讯录"
name=
"phone"
>
<div
class=
"search-div"
>
<Row
type=
"flex"
:gutter=
"16"
class=
""
>
<Col
span=
"4"
>
<span>
选择市:
</span>
<Select
v-model=
"filters.phone.city_id"
clearable
style=
"width: 55%"
@
on-change=
"handleFilterCascade('phone', 'city', $event)"
>
<Option
v-for=
"c in cityOptions"
:key=
"c.parent_id"
:value=
"c.parent_id"
>
{{ c.name }}
</Option>
</Select>
</Col>
<Col
span=
"4"
>
<span>
选择区:
</span>
<Select
v-model=
"filters.phone.area_id"
clearable
style=
"width: 55%"
@
on-change=
"handleFilterCascade('phone', 'area', $event)"
>
<Option
v-for=
"c in areaState.phone.areaList"
:key=
"c.parent_id"
:value=
"c.parent_id"
>
{{ c.name }}
</Option>
</Select>
</Col>
<Col
span=
"4"
>
<span>
选择街道:
</span>
<Select
v-model=
"filters.phone.street_id"
clearable
style=
"width: 55%"
@
on-change=
"handleFilterCascade('phone', 'street', $event)"
>
<Option
v-for=
"c in areaState.phone.streetList"
:key=
"c.parent_id"
:value=
"c.parent_id"
>
{{ c.name }}
</Option>
</Select>
</Col>
<!-- <Col span="4">
<span>选择社区:</span>
<Select v-model="filters.phone.community_id" clearable style="width: 55%">
<Option v-for="c in areaState.phone.communityList" :key="c.parent_id" :value="c.parent_id">{{ c.name }}</Option>
</Select>
</Col> -->
<Col
span=
"8"
class=
"text-right"
>
<Button
type=
"primary"
class=
"mr10"
@
click=
"handleSearch('phone')"
>
搜索
</Button>
<Button
@
click=
"handleReset('phone')"
>
重置
</Button>
</Col>
</Row>
</div>
<Table
border
:loading=
"loading.phone"
:columns=
"phoneColumns"
:data=
"tables.phone"
>
<
template
slot=
"phoneAction"
slot-scope=
"{ row }"
>
<Button
size=
"small"
type=
"primary"
@
click=
"openPhoneModal(row)"
v-if=
"phoneEdit(row)"
>
编辑
</Button>
</
template
>
</Table>
<Page
class=
"page_style"
:total=
"pagers.phone.totalRecord"
:current=
"pagers.phone.pageNo"
:page-size=
"pagers.phone.pageSize"
show-total
show-sizer
@
on-change=
"pageChange('phone', $event)"
@
on-page-size-change=
"sizeChange('phone', $event)"
/>
</TabPane>
</Tabs>
<!-- 推送弹窗 -->
...
...
@@ -432,6 +544,9 @@
<Option
v-for=
"c in forwardModal.areaState.streetList"
:key=
"c.parent_id"
:value=
"c.parent_id"
>
{{ c.name }}
</Option>
</Select>
</FormItem>
<FormItem
label=
"转发负责人电话"
required
>
<Input
type=
"text"
v-model=
"forwardModal.form.push_duty_phone"
placeholder=
"请输入转发负责人电话"
/>
</FormItem>
<FormItem
label=
"转发原因"
required
>
<Input
type=
"textarea"
:rows=
"3"
v-model=
"forwardModal.form.push_reason"
placeholder=
"请输入转发原因"
/>
</FormItem>
...
...
@@ -546,6 +661,22 @@
<Button
type=
"primary"
@
click=
"detailModal.visible=false"
>
关闭
</Button>
</div>
</Modal>
<!-- 通讯录编辑 -->
<Modal
v-model=
"phoneModal.visible"
title=
"编辑联系电话"
width=
"520"
:mask-closable=
"false"
>
<Form
:label-width=
"120"
>
<FormItem
label=
"所属区域"
>
<span>
{{ formatArea(phoneModal.record.city_name, phoneModal.record.area_name, phoneModal.record.street_name, phoneModal.record.community_name) }}
</span>
</FormItem>
<FormItem
label=
"联系电话"
required
>
<Input
type=
"text"
v-model=
"phoneModal.form.phone_number"
placeholder=
"请输入联系电话"
/>
</FormItem>
</Form>
<div
slot=
"footer"
>
<Button
@
click=
"phoneModal.visible=false"
>
取消
</Button>
<Button
type=
"primary"
:loading=
"phoneModal.submitting"
@
click=
"submitPhoneEdit"
>
保存
</Button>
</div>
</Modal>
</div>
</template>
...
...
@@ -563,7 +694,10 @@ import {
rejectDualPush
,
returnDualPerson
,
getDualDetail
,
selectCurrentUserInfo
selectCurrentUserInfo
,
getDualWarnPushList
,
//
getDualPhoneList
,
saveDualPhone
}
from
'@/api/key-person'
import
{
selectCityList
}
from
'@/api/contradiction'
import
{
getDictList
}
from
'@/api/common'
...
...
@@ -573,7 +707,9 @@ const buildFilters = {
received
:
()
=>
({
name
:
''
,
card_no
:
''
,
city_id
:
''
,
area_id
:
''
,
street_id
:
''
,
community_id
:
''
}),
pending
:
()
=>
({
name
:
''
,
card_no
:
''
,
city_id
:
''
,
area_id
:
''
,
street_id
:
''
,
community_id
:
''
,
push_status
:
''
}),
push
:
()
=>
({
name
:
''
,
card_no
:
''
,
city_id
:
''
,
area_id
:
''
,
street_id
:
''
,
community_id
:
''
,
push_status
:
''
}),
forward
:
()
=>
({
name
:
''
,
card_no
:
''
,
city_id
:
''
,
area_id
:
''
,
street_id
:
''
,
community_id
:
''
,
push_status
:
''
})
forward
:
()
=>
({
name
:
''
,
card_no
:
''
,
city_id
:
''
,
area_id
:
''
,
street_id
:
''
,
community_id
:
''
,
push_status
:
''
}),
warnPush
:
()
=>
({
name
:
''
,
card_no
:
''
,
city_id
:
''
,
area_id
:
''
,
street_id
:
''
,
community_id
:
''
,
push_status
:
''
}),
phone
:
()
=>
({
name
:
''
,
card_no
:
''
,
city_id
:
''
,
area_id
:
''
,
street_id
:
''
,
community_id
:
''
})
}
// 身份证号统一转码、规整(去除所有空白并大写),避免查询、筛选不生效
...
...
@@ -604,35 +740,45 @@ export default {
received
:
buildFilters
.
received
(),
pending
:
buildFilters
.
pending
(),
push
:
buildFilters
.
push
(),
forward
:
buildFilters
.
forward
()
forward
:
buildFilters
.
forward
(),
warnPush
:
buildFilters
.
warnPush
(),
phone
:
buildFilters
.
phone
()
},
areaState
:
{
receiving
:
{
areaList
:
[],
streetList
:
[],
communityList
:
[]
},
received
:
{
areaList
:
[],
streetList
:
[],
communityList
:
[]
},
pending
:
{
areaList
:
[],
streetList
:
[],
communityList
:
[]
},
push
:
{
areaList
:
[],
streetList
:
[],
communityList
:
[]
},
forward
:
{
areaList
:
[],
streetList
:
[],
communityList
:
[]
}
forward
:
{
areaList
:
[],
streetList
:
[],
communityList
:
[]
},
warnPush
:
{
areaList
:
[],
streetList
:
[],
communityList
:
[]
},
phone
:
{
areaList
:
[],
streetList
:
[],
communityList
:
[]
}
},
tables
:
{
receiving
:
[],
received
:
[],
pending
:
[],
push
:
[],
forward
:
[]
forward
:
[],
warnPush
:
[],
phone
:
[]
},
loading
:
{
receiving
:
false
,
received
:
false
,
pending
:
false
,
push
:
false
,
forward
:
false
forward
:
false
,
warnPush
:
false
,
phone
:
false
},
pagers
:
{
receiving
:
{
pageNo
:
1
,
pageSize
:
10
,
totalRecord
:
0
},
received
:
{
pageNo
:
1
,
pageSize
:
10
,
totalRecord
:
0
},
pending
:
{
pageNo
:
1
,
pageSize
:
10
,
totalRecord
:
0
},
push
:
{
pageNo
:
1
,
pageSize
:
10
,
totalRecord
:
0
},
forward
:
{
pageNo
:
1
,
pageSize
:
10
,
totalRecord
:
0
}
forward
:
{
pageNo
:
1
,
pageSize
:
10
,
totalRecord
:
0
},
warnPush
:
{
pageNo
:
1
,
pageSize
:
10
,
totalRecord
:
0
},
phone
:
{
pageNo
:
1
,
pageSize
:
10
,
totalRecord
:
0
}
},
pushModal
:
{
visible
:
false
,
...
...
@@ -700,6 +846,14 @@ export default {
data
:
{},
loading
:
false
},
phoneModal
:
{
visible
:
false
,
submitting
:
false
,
record
:
{},
form
:
{
phone_number
:
''
}
},
receivingColumns
:
[
{
type
:
'index'
,
title
:
'序号'
,
width
:
60
,
align
:
'center'
},
{
title
:
'市(州)'
,
key
:
'city_name'
,
align
:
'center'
},
...
...
@@ -759,7 +913,28 @@ export default {
{
title
:
'身份证号'
,
key
:
'card_no'
,
align
:
'center'
},
{
title
:
'街道'
,
key
:
'street_name'
,
align
:
'center'
},
{
title
:
'社区'
,
key
:
'community_name'
,
align
:
'center'
}
]
],
warnPushColumns
:
[
{
type
:
'index'
,
title
:
'序号'
,
width
:
60
,
align
:
'center'
},
{
title
:
'推送市(州)'
,
key
:
'recvie_city_name'
,
align
:
'center'
},
{
title
:
'推送县(市、区)'
,
key
:
'recvie_area_name'
,
align
:
'center'
},
{
title
:
'推送街道(乡镇)'
,
key
:
'recvie_street_name'
,
align
:
'center'
},
{
title
:
'推送社区(村)'
,
key
:
'recvie_community_name'
,
align
:
'center'
},
{
title
:
'姓名'
,
key
:
'name'
,
align
:
'center'
},
{
title
:
'身份证号'
,
key
:
'card_no'
,
align
:
'center'
,
width
:
200
},
{
title
:
'推送状态'
,
slot
:
'push_status'
,
align
:
'center'
,
width
:
120
},
{
title
:
'操作'
,
slot
:
'warnPushAction'
,
align
:
'center'
,
width
:
160
,
fixed
:
'right'
}
],
phoneColumns
:
[
{
type
:
'index'
,
title
:
'序号'
,
width
:
60
,
align
:
'center'
},
{
title
:
'市(州)'
,
key
:
'city_name'
,
align
:
'center'
},
{
title
:
'区(县)'
,
key
:
'area_name'
,
align
:
'center'
},
{
title
:
'街道(乡镇)'
,
key
:
'street_name'
,
align
:
'center'
},
// { title: '推送社区(村)', key: 'community_name', align: 'center' },
{
title
:
'联系电话'
,
key
:
'phone_number'
,
align
:
'center'
},
{
title
:
'操作'
,
slot
:
'phoneAction'
,
align
:
'center'
,
width
:
160
,
fixed
:
'right'
}
],
otherUserInfo
:
{}
}
},
computed
:
{
...
...
@@ -781,6 +956,7 @@ export default {
this
.
loadDicts
()
this
.
loadCityOptions
()
this
.
fetchList
(
this
.
activeTab
)
this
.
otherUserInfo
=
this
.
$store
.
state
.
user
.
otherUserInfo
||
{}
},
methods
:
{
loadDicts
()
{
...
...
@@ -819,7 +995,9 @@ export default {
received
:
getDualReceivedList
,
pending
:
getDualPendingList
,
push
:
getDualPushList
,
forward
:
getDualForwardList
forward
:
getDualForwardList
,
warnPush
:
getDualWarnPushList
,
phone
:
getDualPhoneList
}
const
api
=
apiMap
[
tab
]
if
(
!
api
)
return
...
...
@@ -1037,7 +1215,8 @@ export default {
recvie_street_id
:
form
.
recvie_street_id
,
recvie_community_id
:
form
.
recvie_community_id
,
recvie_region
:
form
.
recvie_region
,
push_type
:
'0'
push_type
:
'0'
,
push_duty_phone
:
form
.
push_duty_phone
}
this
.
pushModal
.
submitting
=
true
saveDualPush
(
payload
).
then
(
ret
=>
{
...
...
@@ -1565,6 +1744,68 @@ export default {
this
.
pagers
[
key
].
pageNo
=
1
})
this
.
fetchList
(
this
.
activeTab
)
},
// 通讯录管理
openPhoneModal
(
row
)
{
this
.
phoneModal
.
visible
=
true
this
.
phoneModal
.
submitting
=
false
this
.
phoneModal
.
record
=
row
?
Object
.
assign
({},
row
)
:
{}
this
.
phoneModal
.
form
.
phone_number
=
this
.
extractPhoneValue
(
row
)
},
extractPhoneValue
(
row
)
{
if
(
!
row
)
return
''
return
(
row
.
phone_number
||
''
).
trim
()
},
submitPhoneEdit
()
{
const
phone
=
this
.
phoneModal
.
form
.
phone_number
if
(
!
phone
)
{
this
.
$Message
.
warning
(
'请输入联系电话'
)
return
}
const
param
=
this
.
phoneModal
.
record
param
.
phone_number
=
phone
saveDualPhone
(
param
).
then
(
ret
=>
{
if
(
ret
.
data
&&
ret
.
data
.
errcode
===
0
)
{
this
.
$Message
.
success
(
'保存成功'
)
this
.
phoneModal
.
visible
=
false
const
target
=
this
.
tables
.
phone
.
find
(
item
=>
{
const
targetId
=
item
.
id
return
String
(
targetId
)
===
String
(
param
.
id
)
})
if
(
target
)
{
this
.
$set
(
target
,
'mark_id'
,
ret
.
data
.
data
)
this
.
$set
(
target
,
'phone_number'
,
phone
)
}
else
{
this
.
fetchList
(
'phone'
)
}
}
else
{
this
.
$Notice
.
error
({
title
:
'保存失败'
,
desc
:
(
ret
.
data
&&
ret
.
data
.
errmsg
)
||
'请稍后重试'
})
}
}).
catch
(
err
=>
{
console
.
error
(
'更新通讯录失败:'
,
err
)
this
.
$Notice
.
error
({
title
:
'保存失败'
,
desc
:
'更新通讯录失败,请稍后重试'
})
}).
finally
(()
=>
{
this
.
phoneModal
.
submitting
=
false
})
},
getWarnPushTitle
()
{
let
wptitle
=
'推送未接收'
return
wptitle
},
phoneEdit
(
row
)
{
const
grade
=
this
.
otherUserInfo
.
company_grade
const
code
=
this
.
otherUserInfo
.
area_id
if
(
grade
===
'3'
)
{
return
row
.
city_id
===
code
}
else
if
(
grade
===
'4'
)
{
return
row
.
area_id
===
code
}
else
if
(
grade
===
'5'
)
{
return
row
.
street_id
===
code
}
else
if
(
grade
===
'2'
||
grade
===
'1'
||
grade
===
'0'
)
{
return
true
}
else
{
return
false
}
}
}
}
...
...
src/view/key-person/key-person-rating/keyPersonRatingDetails.vue
View file @
8978ca8c
...
...
@@ -32,14 +32,47 @@
<div
class=
"disputetype"
style=
"padding: 10px;"
v-if=
"this.params.isHide"
>
<div>
<Row
type=
"flex"
class=
""
>
<Col
span=
"
10
"
>
<Col
span=
"
6
"
>
<span>
参会人员:
</span>
<Input
v-model=
"ratingUsers"
placeholder=
"请输入"
style=
"width: 65%"
/>
</Col>
<Col
span=
"
10
"
>
<Col
span=
"
6
"
>
<span>
评分时间:
</span>
<DatePicker
type=
"datetime"
v-model=
"ratingTime"
format=
"yyyy-MM-dd HH:mm:ss"
></DatePicker>
</Col>
<Col
span=
"6"
>
<Upload
ref=
"upload"
action=
"#"
:show-upload-list=
"false"
:before-upload=
"beforeUpload"
:format=
"['jpg', 'jpeg', 'png', 'bmp', 'gif', 'webp', 'doc', 'docx', 'pdf']"
multiple
>
<Button
icon=
"ios-cloud-upload-outline"
>
上传附件
</Button>
</Upload>
</Col>
<Col
span=
"4"
v-if=
"visit_img_list.length !== 0"
>
<div
v-if=
"visit_img_list.length"
class=
"upload-preview"
>
<div
class=
"demo-upload-list"
v-for=
"(item, index) in visit_img_list"
:key=
"item.uid || index"
>
<span
class=
"hover-effect"
@
click=
"checkFile(item,index)"
>
附件{{index +1}}
</span>
<span
style=
"margin-left: 10px;cursor: pointer;"
@
click=
"delFile(item,index)"
>
<Icon
type=
"md-close"
/>
</span>
<!-- <img :src="item.preview || item.url" />
<span class="demo-upload-list-cover">
<Icon type="ios-eye-outline" @click.native="handleVisitImagePreview(item)" />
<Icon type="ios-trash-outline" @click.native="removeVisitImage(index)" />
</span> -->
</div>
</div>
</Col>
</Row>
</div>
</div>
...
...
@@ -62,7 +95,32 @@
</Table>
<Page
class=
"page_style"
:total=
"params.totalRecord"
:current=
"params.pageNo"
:page-size=
"params.pageSize"
@
on-change=
"changePageNo"
show-total
show-sizer
@
on-page-size-change=
"size"
/>
<Modal
footer-hide
v-model=
"indicatory"
:title=
"modalName"
width=
"900"
>
<Row
:gutter=
"16"
v-if=
"preview_imgs && preview_imgs.length > 0"
>
<Col
span=
"24"
>
<p><strong>
附件:
</strong>
<!-- <div class="img-list">
<img v-for="(src,idx) in (preview_imgs && (Array.isArray(preview_imgs) ? preview_imgs : String(preview_imgs).split(',').map(s=>s.trim()).filter(Boolean)))" :key="idx" :src="src" style="width:80px;height:80px;margin-right:8px" @click="openImagePreview(src)" />
</div> -->
<div
class=
"demo-upload-list"
v-for=
"(item, index) in (preview_imgs && (Array.isArray(preview_imgs) ? preview_imgs : String(preview_imgs).split(',').map(s=>s.trim()).filter(Boolean)))"
:key=
"item.uid || index"
>
<span
class=
"hover-effect"
@
click=
"checkFile(item,index)"
>
附件{{index +1}}
</span>
<!-- <img :src="item.preview || item.url" />
<span class="demo-upload-list-cover">
<Icon type="ios-eye-outline" @click.native="handleVisitImagePreview(item)" />
<Icon type="ios-trash-outline" @click.native="removeVisitImage(index)" />
</span> -->
</div>
</p>
</Col>
</Row>
<Row
:gutter=
"16"
>
<Table
border
:columns=
"SummaryRatingDetailsListColumns"
:data=
"SummaryDetailsList"
></Table>
</Row>
</Modal>
<Modal
v-model=
"showErrorModal"
...
...
@@ -82,6 +140,15 @@
<Button
@
click=
"showErrorModal = false"
>
确认
</Button>
</div>
</Modal>
<Modal
v-model=
"preview.visible"
title=
"查看图片"
width=
"600"
>
<img
v-if=
"preview.visible"
:src=
"preview.url"
alt=
"预览图片"
style=
"width: 100%"
/>
</Modal>
<!-- 图片预览(全屏) -->
<Modal
v-model=
"imagePreview.visible"
title=
"图片预览"
:footer-hide=
"true"
fullscreen
:mask-closable=
"true"
>
<div
style=
"height: calc(100vh - 100px); display: flex; align-items: center; justify-content: center;"
>
<img
:src=
"imagePreview.src"
style=
"max-width: 100%; max-height: 100%;"
/>
</div>
</Modal>
</div>
</template>
...
...
@@ -93,6 +160,9 @@ import {
selectRatingSummaryByPersonIdList
,
// 评分详情
selectSummaryRatingDetailsList
// 历史详情
}
from
'@/api/key-person'
import
{
uploadFile
}
from
'@/api/contradiction.js'
import
xeUtil
from
'xe-utils'
export
default
{
data
()
{
...
...
@@ -140,7 +210,14 @@ export default {
showErrorModal
:
false
,
// 控制错误弹窗显示/隐藏
errorList
:
[],
// 存储所有错误信息
ratingUsers
:
''
,
// 存储参会人员
ratingTime
:
''
// 存储评分时间
ratingTime
:
''
,
// 存储评分时间
visit_img_list
:
[],
preview
:
{
visible
:
false
,
url
:
''
},
imagePreview
:
{
visible
:
false
,
src
:
''
},
preview_imgs
:
[]
}
},
methods
:
{
...
...
@@ -191,6 +268,7 @@ export default {
},
showSummaryRatingDetail
(
row
)
{
this
.
modalName
=
'历史评分('
+
String
(
row
.
rating_custom_time
==
null
?
row
.
rating_time
:
row
.
rating_custom_time
)
+
')'
+
(
row
.
rating_users
==
null
?
''
:
'参会人员('
+
row
.
rating_users
+
')'
)
this
.
preview_imgs
=
row
.
rating_img
||
''
this
.
indicatory
=
true
selectSummaryRatingDetailsList
({
key_person_rating_summary_id
:
row
.
id
}).
then
((
ret
)
=>
{
if
(
ret
.
data
.
errcode
===
0
)
{
...
...
@@ -253,6 +331,8 @@ export default {
this
.
params
.
ratingDetailsList
=
ratingDetailsList
this
.
params
.
ratingUsers
=
this
.
ratingUsers
this
.
params
.
ratingTime
=
this
.
ratingTime
const
visitImg
=
this
.
visit_img_list
.
map
(
item
=>
item
&&
item
.
url
).
filter
(
Boolean
).
join
(
','
)
this
.
params
.
ratingImg
=
visitImg
saveRatingDetails
(
this
.
params
).
then
((
ret
)
=>
{
if
(
ret
.
data
.
errcode
===
0
)
{
this
.
$Notice
.
success
({
title
:
'评分成功'
})
...
...
@@ -265,6 +345,105 @@ export default {
this
.
loding
=
true
this
.
$Notice
.
error
({
title
:
'网络异常'
,
desc
:
'请稍后重试'
})
})
},
beforeUpload
(
file
)
{
const
allowedTypes
=
[
'image/jpeg'
,
'image/png'
,
'image/jpg'
,
'image/bmp'
,
'image/gif'
,
'image/webp'
]
const
isValidType
=
allowedTypes
.
includes
(
file
.
type
)
||
file
.
type
.
startsWith
(
'image/'
)
||
file
.
type
.
endsWith
(
'docx'
)
||
file
.
type
.
endsWith
(
'pdf'
)
const
isLt5M
=
file
.
size
/
1024
/
1024
<
5
if
(
!
isValidType
)
{
this
.
$Message
.
error
(
'请上传图片或PDF格式文件'
)
return
false
}
if
(
!
isLt5M
)
{
this
.
$Message
.
error
(
'文件大小不能超过5MB!'
)
return
false
}
const
tempItem
=
{
uid
:
`
${
Date
.
now
()}
_
${
Math
.
random
().
toString
(
16
).
slice
(
2
)}
`
,
name
:
file
.
name
,
status
:
'uploading'
,
preview
:
''
,
url
:
''
}
// this.visit_img_list.push(tempItem)
const
reader
=
new
FileReader
()
reader
.
onload
=
(
e
)
=>
{
this
.
$set
(
tempItem
,
'preview'
,
e
.
target
.
result
)
}
reader
.
readAsDataURL
(
file
)
this
.
uploadFile
(
file
,
tempItem
)
return
false
},
async
uploadFile
(
file
,
targetItem
)
{
const
formData
=
new
FormData
()
formData
.
append
(
'file'
,
file
)
try
{
const
res
=
await
uploadFile
(
formData
)
if
(
res
&&
res
.
data
&&
res
.
data
.
errcode
===
0
)
{
const
url
=
this
.
extractUploadUrl
(
res
.
data
)
if
(
url
)
{
if
(
targetItem
)
{
this
.
$set
(
targetItem
,
'url'
,
url
)
this
.
$set
(
targetItem
,
'status'
,
'finished'
)
}
else
{
this
.
visit_img_list
.
push
({
name
:
file
.
name
,
url
:
url
,
status
:
'finished'
})
}
this
.
$Message
.
success
(
'上传成功'
)
}
}
else
{
this
.
$Message
.
error
((
res
&&
res
.
data
&&
res
.
data
.
errmsg
)
||
'上传失败'
)
this
.
removeVisitImageByItem
(
targetItem
)
}
}
catch
(
e
)
{
console
.
error
(
'上传失败'
,
e
)
this
.
$Message
.
error
(
'上传失败'
)
this
.
removeVisitImageByItem
(
targetItem
)
}
},
removeVisitImage
(
index
)
{
if
(
index
<
0
)
return
this
.
visit_img_list
.
splice
(
index
,
1
)
},
removeVisitImageByItem
(
item
)
{
if
(
!
item
)
return
const
idx
=
this
.
visit_img_list
.
indexOf
(
item
)
if
(
idx
>
-
1
)
{
this
.
visit_img_list
.
splice
(
idx
,
1
)
}
},
handleVisitImagePreview
(
item
)
{
if
(
!
item
)
return
const
ss
=
item
.
url
.
split
(
'.'
)
const
_suffix
=
ss
.
length
>
1
?
ss
[
1
]
:
''
const
allowedTypes
=
[
'jpeg'
,
'png'
,
'jpg'
,
'bmp'
,
'gif'
,
'webp'
]
if
(
!
allowedTypes
.
includes
(
_suffix
))
return
const
url
=
item
.
url
||
item
.
preview
if
(
!
url
)
return
this
.
preview
.
url
=
url
this
.
preview
.
visible
=
true
},
checkFile
(
item
,
index
)
{
window
.
open
(
item
.
url
,
'_blank'
)
console
.
log
(
item
,
index
)
},
delFile
(
item
,
index
)
{
this
.
urlList
.
splice
(
index
,
1
)
console
.
log
(
item
,
index
)
},
extractUploadUrl
(
responseData
)
{
if
(
!
responseData
)
return
''
if
(
typeof
responseData
===
'string'
)
return
responseData
const
data
=
responseData
.
data
||
{}
return
data
.
url
||
data
.
fileUrl
||
data
.
file_url
||
responseData
.
url
||
''
},
openImagePreview
(
src
)
{
if
(
!
src
)
return
this
.
imagePreview
.
src
=
src
this
.
imagePreview
.
visible
=
true
}
},
mounted
()
{
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论