Commit 8978ca8c by wangchunyang

1、统计颜色按标准指定红、黄、绿颜色显示;

2、评分时增加多附件上传
3、双属地增加通讯录
4、双属地增加预警,推送后24小时后,若未接收,显示在预警
5、统计调整,双属地统计时,去除原属地统计数量
parent 0f723ce8
...@@ -329,6 +329,30 @@ export const getDualDetail = (param) => { ...@@ -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) => { export const findVisitRecordList = (param) => {
......
...@@ -515,7 +515,7 @@ export default { ...@@ -515,7 +515,7 @@ export default {
legend: { legend: {
top: 'bottom', top: 'bottom',
textStyle: { textStyle: {
color: ['#ff9c9c', '#ffe757', '#65c1ff'] // 图例文字颜色 color: ['#b63636', '#ffe757', '#90EE90'] // 图例文字颜色
} }
}, },
title: { title: {
...@@ -527,7 +527,7 @@ export default { ...@@ -527,7 +527,7 @@ export default {
// fontSize: 14 // fontSize: 14
// } // }
}, },
color: ['#ff9c9c', '#ffe757', '#65c1ff'], color: ['#b63636', '#ffe757', '#90EE90'],
series: chartData.map(function (data, idx) { series: chartData.map(function (data, idx) {
var top = idx * 33.3 var top = idx * 33.3
console.log('data', data) console.log('data', data)
...@@ -624,7 +624,7 @@ export default { ...@@ -624,7 +624,7 @@ export default {
legend: { legend: {
top: 'bottom', top: 'bottom',
textStyle: { textStyle: {
color: ['#ff9c9c', '#ffe757', '#65c1ff'] // 图例文字颜色 color: ['#b63636', '#ffe757', '#90EE90'] // 图例文字颜色
} }
}, },
title: { title: {
...@@ -636,7 +636,7 @@ export default { ...@@ -636,7 +636,7 @@ export default {
// fontSize: 14 // fontSize: 14
// } // }
}, },
color: ['#ff9c9c', '#ffe757', '#65c1ff'], color: ['#b63636', '#ffe757', '#90EE90'],
series: chartData.map(function (data, idx) { series: chartData.map(function (data, idx) {
var top = idx * 33.3 var top = idx * 33.3
console.log('data', data) console.log('data', data)
...@@ -733,7 +733,7 @@ export default { ...@@ -733,7 +733,7 @@ export default {
legend: { legend: {
top: 'bottom', top: 'bottom',
textStyle: { textStyle: {
color: ['#ff9c9c', '#ffe757', '#65c1ff'] // 图例文字颜色 color: ['#b63636', '#ffe757', '#90EE90'] // 图例文字颜色
} }
}, },
title: { title: {
...@@ -745,7 +745,7 @@ export default { ...@@ -745,7 +745,7 @@ export default {
// fontSize: 14 // fontSize: 14
// } // }
}, },
color: ['#ff9c9c', '#ffe757', '#65c1ff'], color: ['#b63636', '#ffe757', '#90EE90'],
series: chartData.map(function (data, idx) { series: chartData.map(function (data, idx) {
var top = idx * 33.3 var top = idx * 33.3
console.log('data', data) console.log('data', data)
......
...@@ -343,6 +343,118 @@ ...@@ -343,6 +343,118 @@
@on-page-size-change="sizeChange('forward', $event)" @on-page-size-change="sizeChange('forward', $event)"
/> />
</TabPane> </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> </Tabs>
<!-- 推送弹窗 --> <!-- 推送弹窗 -->
...@@ -432,6 +544,9 @@ ...@@ -432,6 +544,9 @@
<Option v-for="c in forwardModal.areaState.streetList" :key="c.parent_id" :value="c.parent_id">{{ c.name }}</Option> <Option v-for="c in forwardModal.areaState.streetList" :key="c.parent_id" :value="c.parent_id">{{ c.name }}</Option>
</Select> </Select>
</FormItem> </FormItem>
<FormItem label="转发负责人电话" required>
<Input type="text" v-model="forwardModal.form.push_duty_phone" placeholder="请输入转发负责人电话" />
</FormItem>
<FormItem label="转发原因" required> <FormItem label="转发原因" required>
<Input type="textarea" :rows="3" v-model="forwardModal.form.push_reason" placeholder="请输入转发原因" /> <Input type="textarea" :rows="3" v-model="forwardModal.form.push_reason" placeholder="请输入转发原因" />
</FormItem> </FormItem>
...@@ -546,6 +661,22 @@ ...@@ -546,6 +661,22 @@
<Button type="primary" @click="detailModal.visible=false">关闭</Button> <Button type="primary" @click="detailModal.visible=false">关闭</Button>
</div> </div>
</Modal> </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> </div>
</template> </template>
...@@ -563,7 +694,10 @@ import { ...@@ -563,7 +694,10 @@ import {
rejectDualPush, rejectDualPush,
returnDualPerson, returnDualPerson,
getDualDetail, getDualDetail,
selectCurrentUserInfo selectCurrentUserInfo,
getDualWarnPushList, //
getDualPhoneList,
saveDualPhone
} from '@/api/key-person' } from '@/api/key-person'
import { selectCityList } from '@/api/contradiction' import { selectCityList } from '@/api/contradiction'
import { getDictList } from '@/api/common' import { getDictList } from '@/api/common'
...@@ -573,7 +707,9 @@ const buildFilters = { ...@@ -573,7 +707,9 @@ const buildFilters = {
received: () => ({ name: '', card_no: '', city_id: '', area_id: '', street_id: '', community_id: '' }), 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: '' }), 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: '' }), 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 { ...@@ -604,35 +740,45 @@ export default {
received: buildFilters.received(), received: buildFilters.received(),
pending: buildFilters.pending(), pending: buildFilters.pending(),
push: buildFilters.push(), push: buildFilters.push(),
forward: buildFilters.forward() forward: buildFilters.forward(),
warnPush: buildFilters.warnPush(),
phone: buildFilters.phone()
}, },
areaState: { areaState: {
receiving: { areaList: [], streetList: [], communityList: [] }, receiving: { areaList: [], streetList: [], communityList: [] },
received: { areaList: [], streetList: [], communityList: [] }, received: { areaList: [], streetList: [], communityList: [] },
pending: { areaList: [], streetList: [], communityList: [] }, pending: { areaList: [], streetList: [], communityList: [] },
push: { areaList: [], streetList: [], communityList: [] }, push: { areaList: [], streetList: [], communityList: [] },
forward: { areaList: [], streetList: [], communityList: [] } forward: { areaList: [], streetList: [], communityList: [] },
warnPush: { areaList: [], streetList: [], communityList: [] },
phone: { areaList: [], streetList: [], communityList: [] }
}, },
tables: { tables: {
receiving: [], receiving: [],
received: [], received: [],
pending: [], pending: [],
push: [], push: [],
forward: [] forward: [],
warnPush: [],
phone: []
}, },
loading: { loading: {
receiving: false, receiving: false,
received: false, received: false,
pending: false, pending: false,
push: false, push: false,
forward: false forward: false,
warnPush: false,
phone: false
}, },
pagers: { pagers: {
receiving: { pageNo: 1, pageSize: 10, totalRecord: 0 }, receiving: { pageNo: 1, pageSize: 10, totalRecord: 0 },
received: { pageNo: 1, pageSize: 10, totalRecord: 0 }, received: { pageNo: 1, pageSize: 10, totalRecord: 0 },
pending: { pageNo: 1, pageSize: 10, totalRecord: 0 }, pending: { pageNo: 1, pageSize: 10, totalRecord: 0 },
push: { 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: { pushModal: {
visible: false, visible: false,
...@@ -700,6 +846,14 @@ export default { ...@@ -700,6 +846,14 @@ export default {
data: {}, data: {},
loading: false loading: false
}, },
phoneModal: {
visible: false,
submitting: false,
record: {},
form: {
phone_number: ''
}
},
receivingColumns: [ receivingColumns: [
{ type: 'index', title: '序号', width: 60, align: 'center' }, { type: 'index', title: '序号', width: 60, align: 'center' },
{ title: '市(州)', key: 'city_name', align: 'center' }, { title: '市(州)', key: 'city_name', align: 'center' },
...@@ -759,7 +913,28 @@ export default { ...@@ -759,7 +913,28 @@ export default {
{ title: '身份证号', key: 'card_no', align: 'center' }, { title: '身份证号', key: 'card_no', align: 'center' },
{ title: '街道', key: 'street_name', align: 'center' }, { title: '街道', key: 'street_name', align: 'center' },
{ title: '社区', key: 'community_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: { computed: {
...@@ -781,6 +956,7 @@ export default { ...@@ -781,6 +956,7 @@ export default {
this.loadDicts() this.loadDicts()
this.loadCityOptions() this.loadCityOptions()
this.fetchList(this.activeTab) this.fetchList(this.activeTab)
this.otherUserInfo = this.$store.state.user.otherUserInfo || {}
}, },
methods: { methods: {
loadDicts () { loadDicts () {
...@@ -819,7 +995,9 @@ export default { ...@@ -819,7 +995,9 @@ export default {
received: getDualReceivedList, received: getDualReceivedList,
pending: getDualPendingList, pending: getDualPendingList,
push: getDualPushList, push: getDualPushList,
forward: getDualForwardList forward: getDualForwardList,
warnPush: getDualWarnPushList,
phone: getDualPhoneList
} }
const api = apiMap[tab] const api = apiMap[tab]
if (!api) return if (!api) return
...@@ -1037,7 +1215,8 @@ export default { ...@@ -1037,7 +1215,8 @@ export default {
recvie_street_id: form.recvie_street_id, recvie_street_id: form.recvie_street_id,
recvie_community_id: form.recvie_community_id, recvie_community_id: form.recvie_community_id,
recvie_region: form.recvie_region, recvie_region: form.recvie_region,
push_type: '0' push_type: '0',
push_duty_phone: form.push_duty_phone
} }
this.pushModal.submitting = true this.pushModal.submitting = true
saveDualPush(payload).then(ret => { saveDualPush(payload).then(ret => {
...@@ -1565,6 +1744,68 @@ export default { ...@@ -1565,6 +1744,68 @@ export default {
this.pagers[key].pageNo = 1 this.pagers[key].pageNo = 1
}) })
this.fetchList(this.activeTab) 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
}
} }
} }
} }
......
...@@ -32,14 +32,47 @@ ...@@ -32,14 +32,47 @@
<div class="disputetype" style="padding: 10px;" v-if="this.params.isHide"> <div class="disputetype" style="padding: 10px;" v-if="this.params.isHide">
<div> <div>
<Row type="flex" class=""> <Row type="flex" class="">
<Col span="10"> <Col span="6">
<span>参会人员:</span> <span>参会人员:</span>
<Input v-model="ratingUsers" placeholder="请输入" style="width: 65%"/> <Input v-model="ratingUsers" placeholder="请输入" style="width: 65%"/>
</Col> </Col>
<Col span="10"> <Col span="6">
<span>评分时间:</span> <span>评分时间:</span>
<DatePicker type="datetime" v-model="ratingTime" format="yyyy-MM-dd HH:mm:ss"></DatePicker> <DatePicker type="datetime" v-model="ratingTime" format="yyyy-MM-dd HH:mm:ss"></DatePicker>
</Col> </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> </Row>
</div> </div>
</div> </div>
...@@ -62,7 +95,32 @@ ...@@ -62,7 +95,32 @@
</Table> </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" /> <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" > <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> <Table border :columns="SummaryRatingDetailsListColumns" :data="SummaryDetailsList"></Table>
</Row>
</Modal> </Modal>
<Modal <Modal
v-model="showErrorModal" v-model="showErrorModal"
...@@ -82,6 +140,15 @@ ...@@ -82,6 +140,15 @@
<Button @click="showErrorModal = false">确认</Button> <Button @click="showErrorModal = false">确认</Button>
</div> </div>
</Modal> </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> </div>
</template> </template>
...@@ -93,6 +160,9 @@ import { ...@@ -93,6 +160,9 @@ import {
selectRatingSummaryByPersonIdList, // 评分详情 selectRatingSummaryByPersonIdList, // 评分详情
selectSummaryRatingDetailsList // 历史详情 selectSummaryRatingDetailsList // 历史详情
} from '@/api/key-person' } from '@/api/key-person'
import {
uploadFile
} from '@/api/contradiction.js'
import xeUtil from 'xe-utils' import xeUtil from 'xe-utils'
export default { export default {
data () { data () {
...@@ -140,7 +210,14 @@ export default { ...@@ -140,7 +210,14 @@ export default {
showErrorModal: false, // 控制错误弹窗显示/隐藏 showErrorModal: false, // 控制错误弹窗显示/隐藏
errorList: [], // 存储所有错误信息 errorList: [], // 存储所有错误信息
ratingUsers: '', // 存储参会人员 ratingUsers: '', // 存储参会人员
ratingTime: '' // 存储评分时间 ratingTime: '', // 存储评分时间
visit_img_list: [],
preview: {
visible: false,
url: ''
},
imagePreview: { visible: false, src: '' },
preview_imgs: []
} }
}, },
methods: { methods: {
...@@ -191,6 +268,7 @@ export default { ...@@ -191,6 +268,7 @@ export default {
}, },
showSummaryRatingDetail (row) { 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.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 this.indicatory = true
selectSummaryRatingDetailsList({ key_person_rating_summary_id: row.id }).then((ret) => { selectSummaryRatingDetailsList({ key_person_rating_summary_id: row.id }).then((ret) => {
if (ret.data.errcode === 0) { if (ret.data.errcode === 0) {
...@@ -253,6 +331,8 @@ export default { ...@@ -253,6 +331,8 @@ export default {
this.params.ratingDetailsList = ratingDetailsList this.params.ratingDetailsList = ratingDetailsList
this.params.ratingUsers = this.ratingUsers this.params.ratingUsers = this.ratingUsers
this.params.ratingTime = this.ratingTime 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) => { saveRatingDetails(this.params).then((ret) => {
if (ret.data.errcode === 0) { if (ret.data.errcode === 0) {
this.$Notice.success({ title: '评分成功' }) this.$Notice.success({ title: '评分成功' })
...@@ -265,6 +345,105 @@ export default { ...@@ -265,6 +345,105 @@ export default {
this.loding = true this.loding = true
this.$Notice.error({ title: '网络异常', desc: '请稍后重试' }) 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 () { mounted () {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论