Browse Source

Merge branch 'master' into dev-detail-adjust0919

feature
jiangyy 3 years ago
parent
commit
1ba55a4833
  1. 761
      src/views/modules/base/epidemic/natFocus/natFocusList.vue
  2. 2
      src/views/modules/base/epidemic/natFocus/natFocusListHistory.vue
  3. 27
      src/views/modules/base/epidemic/natFocus/nfNoticeList.vue
  4. 20
      src/views/modules/base/epidemic/natFocus/nfSendNotice.vue
  5. 11
      src/views/modules/base/epidemic/natFocus/nfVisiteList.vue
  6. 95
      src/views/modules/base/epidemic/travel.vue
  7. 5
      src/views/modules/base/epidemic/veroFocus/veroFocusList.vue
  8. 17
      src/views/modules/base/epidemic/veroFocus/vfNoticeList.vue
  9. 15
      src/views/modules/base/epidemic/veroFocus/vfSendNotice.vue
  10. 976
      src/views/modules/cpts/base/cpts/detail.vue
  11. 67
      src/views/modules/cpts/base/cpts/edit.vue

761
src/views/modules/base/epidemic/natFocus/natFocusList.vue

File diff suppressed because it is too large

2
src/views/modules/base/epidemic/natFocus/natFocusListHistory.vue

@ -840,7 +840,7 @@ export default {
handleNoticeList(row) { handleNoticeList(row) {
this.noticeListFormShow = true; this.noticeListFormShow = true;
this.$nextTick(() => { this.$nextTick(() => {
this.$refs.ref_noticelist.initTable(row.idCard, "2"); this.$refs.ref_noticelist.initTable(row.realIdCard, "2");
}); });
}, },
handleVisiteList(row) { handleVisiteList(row) {

27
src/views/modules/base/epidemic/natFocus/nfNoticeList.vue

@ -38,6 +38,13 @@
min-width="380"> min-width="380">
</el-table-column> </el-table-column>
<el-table-column prop="sendResShow"
header-align="center"
align="center"
label="状态"
min-width="180">
</el-table-column>
</el-table> </el-table>
<div> <div>
@ -66,7 +73,7 @@ export default {
return { return {
tableLoading: false, tableLoading: false,
total: 0, total: 0,
idCard: '', realIdCard: '',
tableData: [], tableData: [],
pageSize: 20, pageSize: 20,
pageNo: 1, pageNo: 1,
@ -80,8 +87,8 @@ export default {
methods: { methods: {
async initTable (idCard, origin) { async initTable (realIdCard, origin) {
this.idCard = idCard this.realIdCard = realIdCard
this.origin = origin this.origin = origin
await this.loadTable() await this.loadTable()
@ -93,7 +100,7 @@ export default {
const url = "/epmetuser/icNotice/page" const url = "/epmetuser/icNotice/page"
// const url = "http://yapi.elinkservice.cn/mock/245/epmetuser/icNotice/page" // const url = "http://yapi.elinkservice.cn/mock/245/epmetuser/icNotice/page"
let params = { let params = {
idCard: this.idCard, idCard: this.realIdCard,
pageNo: this.pageNo, pageNo: this.pageNo,
pageSize: this.pageSize, pageSize: this.pageSize,
origin: this.origin origin: this.origin
@ -105,15 +112,9 @@ export default {
this.total = data.total this.total = data.total
this.tableData = data.list this.tableData = data.list
// data.list.forEach(item => { this.tableData.forEach(item => {
// item.isEdit = false item.sendResShow = item.sendRes === '1' ? '成功' : item.sendRes === '0' ? '失败' : ''
// item.isNew = false });
// let arrayInspectors = item.inspectors.split(',')
// item.inspectorArray = [...arrayInspectors]
// let arrayReviewTime = item.reviewTime.split(' ')
// item.reviewTime = arrayReviewTime[0]
// });
// this.tableData = [...data.list] // this.tableData = [...data.list]

20
src/views/modules/base/epidemic/natFocus/nfSendNotice.vue

@ -78,7 +78,8 @@ export default {
isSelChannel: false, isSelChannel: false,
channel: [], channel: [],
content: '', content: '',
userList: [], // userList: [],
bdIds: []
}, },
@ -93,11 +94,19 @@ export default {
methods: { methods: {
async initForm (selectionAll) { async initForm (selectionAll, origin) {
this.$refs['ref_form1'].resetFields(); this.$refs['ref_form1'].resetFields();
this.formData.userList = selectionAll if (origin) {
this.formData.origin = origin
}
// this.formData.userList = selectionAll
// this.formData.userList = JSON.parse(JSON.stringify(selectionAll))
this.formData.bdIds = []
selectionAll.forEach(element => {
this.formData.bdIds.push(element.id)
});
}, },
@ -126,7 +135,7 @@ export default {
let url = '' let url = ''
url = '/epmetuser/icNotice/sendNotice' url = '/epmetuser/icNotice/sendNoticeV2'
const { data, code, msg } = await requestPost(url, this.formData) const { data, code, msg } = await requestPost(url, this.formData)
@ -164,7 +173,8 @@ export default {
isSelChannel: false, isSelChannel: false,
channel: [], channel: [],
content: '', content: '',
userList: [], // userList: [],
bdIds: []
} }
}, },

11
src/views/modules/base/epidemic/natFocus/nfVisiteList.vue

@ -55,7 +55,8 @@
title="新增" title="新增"
append-to-body append-to-body
@closed="handleCancle"> @closed="handleCancle">
<div v-if="dialogVisible" class="epidemic-form"> <div v-if="dialogVisible"
class="epidemic-form">
<el-form ref="ref_form" <el-form ref="ref_form"
:inline="true" :inline="true"
:model="formData" :model="formData"
@ -130,7 +131,7 @@ export default {
formData: { formData: {
visitTime: '',//访 visitTime: '',//访
content: '',// content: '',//
idCard: '', realIdCard: '',
name: '', name: '',
mobile: '', mobile: '',
origin: '' origin: ''
@ -149,7 +150,7 @@ export default {
async initTable (row, origin) { async initTable (row, origin) {
this.formData.idCard = row.idCard this.formData.realIdCard = row.realIdCard
this.formData.name = row.name this.formData.name = row.name
this.formData.mobile = row.mobile this.formData.mobile = row.mobile
this.formData.origin = origin this.formData.origin = origin
@ -166,7 +167,7 @@ export default {
// const url = 'http://yapi.elinkservice.cn/mock/245/epmetuser/followup/page' // const url = 'http://yapi.elinkservice.cn/mock/245/epmetuser/followup/page'
let params = { let params = {
name: this.formData.name, name: this.formData.name,
idCard: this.formData.idCard, idCard: this.formData.realIdCard,
pageNo: this.pageNo, pageNo: this.pageNo,
pageSize: this.pageSize, pageSize: this.pageSize,
origin: this.formData.origin origin: this.formData.origin
@ -224,7 +225,7 @@ export default {
const url = "/epmetuser/followup/export" const url = "/epmetuser/followup/export"
let params = { let params = {
idCard: this.formData.idCard, idCard: this.formData.realIdCard,
name: this.formData.name, name: this.formData.name,
origin: this.formData.origin origin: this.formData.origin
} }

95
src/views/modules/base/epidemic/travel.vue

@ -1,6 +1,7 @@
<template> <template>
<div class="div_main"> <div class="div_main">
<div ref="div_search" class="div_search"> <div ref="div_search"
class="div_search">
<el-form :inline="true" <el-form :inline="true"
:model="formData" :model="formData"
ref="ref_searchform" ref="ref_searchform"
@ -35,7 +36,7 @@
class="list_item_width_1" class="list_item_width_1"
clearable clearable
placeholder="请输入身份证号或证件号"> placeholder="请输入身份证号或证件号">
</el-input> </el-input>
</el-form-item> </el-form-item>
@ -85,11 +86,11 @@
size="small" size="small"
@click="handleAdd">新增</el-button> @click="handleAdd">新增</el-button>
<el-button <el-button class="diy-button--export"
class="diy-button--export"
size="small" size="small"
@click="handleExportModule">下载模板</el-button> @click="handleExportModule">下载模板</el-button>
<el-upload :headers="$getElUploadHeaders()" ref="upload" <el-upload :headers="$getElUploadHeaders()"
ref="upload"
:multiple='false' :multiple='false'
:show-file-list='false' :show-file-list='false'
:before-upload="beforeUpload" :before-upload="beforeUpload"
@ -99,9 +100,9 @@
:on-exceed="handleExceed" :on-exceed="handleExceed"
:http-request="uploadHttpRequest"> :http-request="uploadHttpRequest">
<el-button size="small" <el-button size="small"
style="margin-left: 10px" style="margin-left: 10px"
class="diy-button--delete" class="diy-button--delete"
:loading="importLoading">{{importBtnTitle}}</el-button> :loading="importLoading">{{importBtnTitle}}</el-button>
</el-upload> </el-upload>
<el-button style="margin-left:10px" <el-button style="margin-left:10px"
@ -130,20 +131,23 @@
v-loading="tableLoading" v-loading="tableLoading"
:header-cell-style="{background:'#2195FE',color:'#FFFFFF'}" :header-cell-style="{background:'#2195FE',color:'#FFFFFF'}"
style="width: 100%" style="width: 100%"
@selection-change="handleSelectionChange"> @selection-change="handleSelectionChange">
<el-table-column type="selection" <el-table-column type="selection"
width="55" fixed="left"></el-table-column> width="55"
fixed="left"></el-table-column>
<el-table-column label="序号" <el-table-column label="序号"
header-align="center" header-align="center"
align="center" align="center"
type="index" type="index"
width="50" fixed="left"></el-table-column> width="50"
fixed="left"></el-table-column>
<el-table-column prop="name" <el-table-column prop="name"
header-align="center" header-align="center"
align="center" align="center"
label="姓名" label="姓名"
width="100" fixed="left"> width="100"
fixed="left">
</el-table-column> </el-table-column>
<el-table-column prop="mobile" <el-table-column prop="mobile"
header-align="center" header-align="center"
@ -218,8 +222,8 @@
class="div-table-button--detail" class="div-table-button--detail"
size="small" size="small"
@click="handleDetail(scope.row)">查看</el-button> @click="handleDetail(scope.row)">查看</el-button>
<!-- v-if="scope.row.userType != 'resi'" --> <!-- v-if="scope.row.userType != 'resi'" -->
<el-button type="text" <el-button type="text"
class="div-table-button--edit" class="div-table-button--edit"
size="small" size="small"
@click="handleEdit(scope.row)">修改</el-button> @click="handleEdit(scope.row)">修改</el-button>
@ -255,30 +259,31 @@
slot="reference">更多<i class="el-icon-caret-bottom"></i></el-button> slot="reference">更多<i class="el-icon-caret-bottom"></i></el-button>
</el-popover> --> </el-popover> -->
<el-dropdown trigger="hover"> <el-dropdown trigger="hover">
<span class="el-dropdown-link" style="margin-left:10px;"> <span class="el-dropdown-link"
style="margin-left:10px;">
<el-button type="text" <el-button type="text"
size="small" size="small"
class="div-table-button--more" class="div-table-button--more"
slot="reference">更多<i class="el-icon-caret-bottom"></i></el-button> slot="reference">更多<i class="el-icon-caret-bottom"></i></el-button>
</span> </span>
<el-dropdown-menu slot="dropdown"> <el-dropdown-menu slot="dropdown">
<el-dropdown-item> <el-dropdown-item>
<el-button type="text" <el-button type="text"
class="div-table-button--detail--noline" class="div-table-button--detail--noline"
size="small" size="small"
@click="handleNoticeList(scope.row)">通知记录</el-button> @click="handleNoticeList(scope.row)">通知记录</el-button>
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item> <el-dropdown-item>
<el-button type="text" <el-button type="text"
class="div-table-button--detail--noline" class="div-table-button--detail--noline"
size="small" size="small"
@click="handleVisiteList(scope.row) ">随访记录</el-button> @click="handleVisiteList(scope.row) ">随访记录</el-button>
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item> <el-dropdown-item>
<el-button type="text" <el-button type="text"
class="div-table-button--delete--noline " class="div-table-button--delete--noline "
size="small" size="small"
@click="handleDelete(scope.row)">删除</el-button> @click="handleDelete(scope.row)">删除</el-button>
</el-dropdown-item> </el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
</el-dropdown> </el-dropdown>
@ -307,9 +312,10 @@
top="5vh" top="5vh"
class="dialog-h" class="dialog-h"
@closed="diaClose"> @closed="diaClose">
<travel-form v-if="formShow" ref="ref_form" <travel-form v-if="formShow"
@dialogCancle="addFormCancle" ref="ref_form"
@dialogOk="addFormOk"></travel-form> @dialogCancle="addFormCancle"
@dialogOk="addFormOk"></travel-form>
</el-dialog> </el-dialog>
<!-- 发送通知弹出框 --> <!-- 发送通知弹出框 -->
<el-dialog :visible.sync="sendNoticeFormShow" <el-dialog :visible.sync="sendNoticeFormShow"
@ -321,6 +327,7 @@
class="dialog-h" class="dialog-h"
@closed="diaClose"> @closed="diaClose">
<nf-send-notice ref="ref_sendnotice" <nf-send-notice ref="ref_sendnotice"
@dialogOk="addFormOk"
@dialogCancle="diaClose"></nf-send-notice> @dialogCancle="diaClose"></nf-send-notice>
</el-dialog> </el-dialog>
<!-- 通知记录弹出框 --> <!-- 通知记录弹出框 -->
@ -427,7 +434,7 @@ export default {
}, },
methods: { methods: {
lzayLoadArea(node, resolve) { lzayLoadArea (node, resolve) {
this.getArea(node, resolve) this.getArea(node, resolve)
// setTimeout(() => { // setTimeout(() => {
@ -437,7 +444,7 @@ export default {
this.loadTable() this.loadTable()
}, },
handleSelectionChange(val) { handleSelectionChange (val) {
console.log('val----', val) console.log('val----', val)
this.selectionAll = val this.selectionAll = val
}, },
@ -495,7 +502,7 @@ export default {
} }
this.tableLoading = false this.tableLoading = false
}, },
handleAreaChange(val) { handleAreaChange (val) {
if (val.length > 0) { if (val.length > 0) {
const len = val.length - 1 const len = val.length - 1
@ -525,7 +532,7 @@ export default {
handleNoticeList (row) { handleNoticeList (row) {
this.noticeListFormShow = true this.noticeListFormShow = true
this.$nextTick(() => { this.$nextTick(() => {
this.$refs.ref_noticelist.initTable(row.idCard, '0') this.$refs.ref_noticelist.initTable(row.realIdCard, '0')
}) })
}, },
@ -546,17 +553,20 @@ export default {
this.sendNoticeFormShow = true this.sendNoticeFormShow = true
this.$nextTick(() => { this.$nextTick(() => {
const arr = this.selectionAll.map(item => { const arr = this.selectionAll.map(item => {
return { return {
userId: item.userId, userId: item.userId,
idCard: item.idCard, idCard: item.idCard,
mobile: item.mobile realIdCard: item.realIdCard,
mobile: item.mobile,
id: item.id
} }
}) })
this.$refs.ref_sendnotice.initForm(arr, '0') this.$refs.ref_sendnotice.initForm(arr, '0')
}) })
}, },
handleAttention(row) { handleAttention (row) {
if (this.selectionAll.length === 0) { if (this.selectionAll.length === 0) {
this.$message.info('请选择要加入关注的名单') this.$message.info('请选择要加入关注的名单')
return false return false
@ -606,8 +616,8 @@ export default {
list: this.selectionAll.map(item => { list: this.selectionAll.map(item => {
return { return {
name: item.name, name: item.name,
mobile: item.mobile, mobile: item.realMobile,
idCard: item.idCard, idCard: item.realIdCard,
attentionType: 2 attentionType: 2
} }
}) })
@ -629,14 +639,16 @@ export default {
async deleteFocus (row) { async deleteFocus (row) {
const url = "/epmetuser/icEpidemicSpecialAttention/cancel-attention" const url = "/epmetuser/icEpidemicSpecialAttention/cancel-attention"
// const url = "http://yapi.elinkservice.cn/mock/245/gov/org/placepatrolteam/del" // const url = "http://yapi.elinkservice.cn/mock/245/gov/org/placepatrolteam/del"
let idCards = [] let ids = []
this.selectionAll.forEach(element => { this.selectionAll.forEach(element => {
idCards.push(element.idCard) if (element.epidemicId !== '' && element.epidemicId !== null && element.epidemicId !== undefined) {
ids.push(element.epidemicId)
}
}); });
let params = { let params = {
attentionType: 2, attentionType: 2,
idCards: idCards ids: ids
} }
const { data, code, msg } = await requestPost(url, params) const { data, code, msg } = await requestPost(url, params)
@ -682,6 +694,7 @@ export default {
}, },
addFormOk () { addFormOk () {
this.formShow = false this.formShow = false
this.sendNoticeFormShow = false
this.loadTable() this.loadTable()
}, },

5
src/views/modules/base/epidemic/veroFocus/veroFocusList.vue

@ -144,7 +144,8 @@
class="diy-button--export" class="diy-button--export"
size="small" size="small"
@click="handleExportModule">下载模板</el-button> @click="handleExportModule">下载模板</el-button>
<el-upload :headers="$getElUploadHeaders()" ref="upload" <el-upload :headers="$getElUploadHeaders()"
ref="upload"
:multiple="false" :multiple="false"
:show-file-list="false" :show-file-list="false"
:before-upload="beforeUpload" :before-upload="beforeUpload"
@ -713,7 +714,7 @@ export default {
handleNoticeList (row) { handleNoticeList (row) {
this.noticeListFormShow = true; this.noticeListFormShow = true;
this.$nextTick(() => { this.$nextTick(() => {
this.$refs.ref_noticelist.initTable(row.idCard); this.$refs.ref_noticelist.initTable(row.realIdCard);
}); });
}, },
handleVisiteList (row) { handleVisiteList (row) {

17
src/views/modules/base/epidemic/veroFocus/vfNoticeList.vue

@ -38,6 +38,13 @@
min-width="380"> min-width="380">
</el-table-column> </el-table-column>
<el-table-column prop="sendResShow"
header-align="center"
align="center"
label="状态"
min-width="180">
</el-table-column>
</el-table> </el-table>
<div> <div>
@ -80,8 +87,8 @@ export default {
methods: { methods: {
async initTable (idCard) { async initTable (realIdCard) {
this.idCard = idCard this.realIdCard = realIdCard
await this.loadTable() await this.loadTable()
}, },
@ -92,7 +99,7 @@ export default {
const url = "/epmetuser/icNotice/page" const url = "/epmetuser/icNotice/page"
// const url = "http://yapi.elinkservice.cn/mock/245/epmetuser/icNotice/page" // const url = "http://yapi.elinkservice.cn/mock/245/epmetuser/icNotice/page"
let params = { let params = {
idCard: this.idCard, idCard: this.realIdCard,
pageNo: this.pageNo, pageNo: this.pageNo,
pageSize: this.pageSize, pageSize: this.pageSize,
origin: '1' origin: '1'
@ -103,7 +110,9 @@ export default {
if (code === 0) { if (code === 0) {
this.total = data.total this.total = data.total
this.tableData = data.list this.tableData = data.list
this.tableData.forEach(item => {
item.sendResShow = item.sendRes === '1' ? '成功' : item.sendRes === '0' ? '失败' : ''
});
// data.list.forEach(item => { // data.list.forEach(item => {
// item.isEdit = false // item.isEdit = false
// item.isNew = false // item.isNew = false

15
src/views/modules/base/epidemic/veroFocus/vfSendNotice.vue

@ -78,7 +78,8 @@ export default {
isSelChannel: false, isSelChannel: false,
channel: [], channel: [],
content: '', content: '',
userList: [], // userList: [],
bdIds: []
}, },
@ -96,7 +97,12 @@ export default {
async initForm (selectionAll) { async initForm (selectionAll) {
console.log(selectionAll) console.log(selectionAll)
this.$refs['ref_form1'].resetFields(); this.$refs['ref_form1'].resetFields();
this.formData.userList = selectionAll // this.formData.userList = JSON.parse(JSON.stringify(selectionAll))
this.formData.bdIds = []
selectionAll.forEach(element => {
this.formData.bdIds.push(element.id)
});
}, },
@ -120,7 +126,7 @@ export default {
let url = '' let url = ''
url = '/epmetuser/icNotice/sendNotice' url = '/epmetuser/icNotice/sendNoticeV2'
const { data, code, msg } = await requestPost(url, this.formData) const { data, code, msg } = await requestPost(url, this.formData)
@ -158,7 +164,8 @@ export default {
isSelChannel: false, isSelChannel: false,
channel: [], channel: [],
content: '', content: '',
userList: [], // userList: [],
bdIds: []
} }
}, },

976
src/views/modules/cpts/base/cpts/detail.vue

@ -1,976 +0,0 @@
<template>
<div>
<div class="dialog-h-content scroll-h">
<el-form
v-if="iniLoaded"
ref="ref_form"
:model="fmData"
:inline="true"
:disabled="formType === 'watch'"
class="m-fm"
:class="editParamsDiv ? 'z-div' : ''"
>
<div class="list">
<el-form-item
v-for="item in editParams"
class="item"
label-width="140px"
style="display: block"
:key="'edit' + item.keyName"
:label="item.field"
:prop="item.keyName"
:rules="item.rules || []"
>
<template v-if="item.type == 'switch'">
<el-switch
v-model="fmData[item.keyName]"
size="small"
:active-text="item.activeText || ''"
:inactive-text="item.inactiveText || ''"
:active-value="item.activeValue || true"
:inactive-value="item.inactiveValue || false"
>
</el-switch>
</template>
<template v-if="item.type == 'input'">
<el-input
v-if="
formType == 'add' || (formType == 'edit' && !item.editDisable)
"
v-model="fmData[item.keyName]"
class="item-input"
size="small"
clearable
show-word-limit
:maxlength="item.maxlength || ''"
:placeholder="item.placeholder || '请输入'"
>
</el-input>
<div class="item-show" v-else>
{{ fmData[item.keyName] || "--" }}
</div>
</template>
<template v-if="item.type == 'textarea'">
<el-input
v-if="
formType == 'add' || (formType == 'edit' && !item.editDisable)
"
v-model="fmData[item.keyName]"
type="textarea"
class="item-input"
size="small"
clearable
show-word-limit
:rows="3"
:maxlength="item.maxlength || ''"
:placeholder="item.placeholder || '请输入'"
>
</el-input>
<div class="item-show" v-else>
{{ fmData[item.keyName] || "--" }}
</div>
</template>
<template v-if="item.type == 'date'">
<el-date-picker
v-if="
formType == 'add' || (formType == 'edit' && !item.editDisable)
"
v-model="fmData[item.keyName]"
:picker-options="item.pickerOptions"
class="item-input"
size="small"
clearable
show-word-limit
:value-format="item.format || 'yyyy-MM-dd'"
:placeholder="item.placeholder || '请输入'"
>
</el-date-picker>
<div class="item-show" v-else>
{{ fmData[item.keyName] || "--" }}
</div>
</template>
<template v-if="item.type == 'number'">
<el-input-number
v-model="fmData[item.keyName]"
class="item-number"
size="small"
clearable
:precision="item.precision || 0"
:step="item.step || 1"
:min="item.min || 0"
:max="item.max || 999999999999"
:placeholder="item.placeholder || '请输入'"
>
</el-input-number>
<span v-if="item.unitName">{{ item.unitName }}</span>
</template>
<template v-else-if="item.type == 'select'">
<el-select
v-model="fmData[item.keyName]"
:placeholder="item.placeholder || '请选择'"
size="small"
clearable
class="item-select"
:multiple="item.multiple || false"
:filterable="item.filterable || false"
:allowCreate="item.allowCreate || false"
:collapse-tags="item.collapseTags || false"
default-first-option
@change="(e) => handleChangeSelect(e, item)"
>
<template v-if="item.optionType == 'group'">
<el-option-group
v-for="group in item.optionList"
:key="group.label"
:label="group.label"
>
<el-option
v-for="subItem in group.optionList"
:key="subItem.value"
:label="subItem.label"
:value="subItem.value"
>
</el-option>
</el-option-group>
</template>
<template v-else>
<el-option
v-for="(subItem, subIndex) in item.optionList"
:key="subItem.value + subIndex"
:label="subItem.label"
:value="subItem.value"
>
</el-option>
</template>
</el-select>
</template>
<template v-else-if="item.type == 'rich-text'">
<div
v-if="
formType == 'add' || (formType == 'edit' && !item.editDisable)
"
class="item-rich-text"
>
<Tinymce
:ref="'richText' + item.keyName"
v-model="fmData[item.keyName]"
:customerId="customerId"
:placeholder="item.placeholder || '请输入'"
:height="500"
/>
</div>
<div
v-else
class="item-rich-text z-show"
@click="handleClickHtmlNode"
>
<div v-html="fmData[item.keyName]"></div>
</div>
</template>
<template v-else-if="item.type == 'cascader'">
<el-cascader
v-model="fmData[item.keyName]"
:placeholder="item.placeholder || '请选择'"
:options="item.optionList"
:props="item.optionProps || {}"
:show-all-levels="false"
:collapse-tags="item.collapseTags || false"
size="small"
clearable
class="item-select"
@change="(e) => handleChangeCascader(e, item)"
>
</el-cascader>
</template>
<template v-else-if="item.type == 'upload'">
<el-upload :headers="$getElUploadHeaders()"
v-if="
formType == 'add' || (formType == 'edit' && !item.editDisable)
"
ref="upload"
class="avatar-uploader"
:class="{ 'z-full': fmData[item.keyName].length >= item.limit }"
:action="item.uploadUrl || uploadUrl"
:data="{ customerId: customerId }"
:show-file-list="true"
:list-type="item.listType || 'picture'"
:limit="item.limit || 100"
:file-list="fmData[item.keyName]"
:on-success="(res, file) => handleImgSuccess(res, file, item)"
:on-error="(res, file) => handleImgError(res, file, item)"
:on-remove="(res) => handleImgRemove(res, item)"
:on-exceed="(res) => handleImgExceed(res, item)"
:before-upload="(file) => beforeImgUpload(file, item)"
>
<a><i class="el-icon-plus"></i> 点击上传</a>
</el-upload>
<el-image
v-else-if="fmData[item.keyName].length > 0"
style="width: 100px; height: 100px"
:src="fmData[item.keyName][0].url"
fit="cover"
:preview-src-list="fmData[item.keyName].map((item) => item.url)"
></el-image>
<span v-else>--</span>
</template>
<template v-else-if="item.type == 'address'">
<div class="address-item">
<el-input
class="address-item-input"
:placeholder="item.placeholder || '请输入所在地址'"
v-model="fmData[item.keyName]"
:maxlength="item.maxlength || ''"
show-word-limit
size="small"
>
</el-input>
<el-button
style="margin-left: 10px"
type="default"
size="small"
ref="mapSearch"
@click="handleSearchMap(item)"
>查询</el-button
>
<div id="app" class="div_map"></div>
<div style="margin-top: 10px" v-show="false">
<span>经度</span>
<el-input
class="address-item-input2"
maxlength="50"
placeholder="请输入经度"
v-model="fmData[item.supKeys[0]]"
>
</el-input>
<span style="margin-left: 20px">纬度</span>
<el-input
class="address-item-input2"
maxlength="50"
placeholder="请输入纬度"
v-model="fmData[item.supKeys[1]]"
>
</el-input>
</div>
</div>
</template>
</el-form-item>
</div>
</el-form>
<div class="div_btn resi-btns" v-if="!formBtnFixed">
<el-button size="small" @click="handleCancle">{{
editConfig.cancelBtnName || "取消"
}}</el-button>
<el-button
v-if="formType != 'watch'"
type="primary"
size="small"
:disabled="btnDisable"
@click="handleComfirm"
>{{ editConfig.confirmBtnName || "确定" }}</el-button
>
<slot
name="operateSup"
v-bind:id="formId"
v-bind:info="fmData"
v-bind:formType="formType"
></slot>
</div>
<slot
name="bottomSup"
v-bind:id="formId"
v-bind:info="fmData"
v-bind:formType="formType"
></slot>
</div>
<div class="div_btn resi-btns" v-if="formBtnFixed">
<el-button size="small" @click="handleCancle">{{
editConfig.cancelBtnName || "取消"
}}</el-button>
<el-button
v-if="formType != 'watch'"
type="primary"
size="small"
:disabled="btnDisable"
@click="handleComfirm"
>{{ editConfig.confirmBtnName || "确定" }}</el-button
>
<slot
name="operateSup"
v-bind:id="formId"
v-bind:info="fmData"
v-bind:formType="formType"
></slot>
</div>
</div>
</template>
<script>
import { requestPost } from "@/js/dai/request";
import nextTick from "dai-js/tools/nextTick";
import Schema from "async-validator";
import Tinymce from "@c/tinymce2/index.vue";
var map;
var search;
var markers;
var infoWindowList;
var geocoder; //
export default {
components: { Tinymce },
props: {
formId: {
type: String,
default: "",
},
formType: {
type: String,
default: "info",
},
formBtnFixed: {
type: Boolean,
default: true,
},
idName: {
type: String,
default: "",
},
addUrl: {
type: String,
default: "",
},
editUrl: {
type: String,
default: "",
},
delUrl: {
type: String,
default: "",
},
infoUrl: {
type: String,
default: "",
},
editParams: {
type: Array,
default: () => [],
},
editFixedParams: {
type: Object,
default: () => ({}),
},
editParamsDiv: {
type: Number,
default: 0,
},
editElseRules: {
type: Object,
default: () => ({}),
},
editConfig: {
type: Object,
default: () => ({}),
},
},
data() {
return {
iniLoaded: false,
btnDisable: false,
fmData: {},
editParams1: [],
editParams2: [],
uploadUrl: window.SITE_CONFIG["apiURL"] + "/oss/file/uploadqrcodeV2",
customerId: localStorage.getItem("customerId"),
};
},
computed: {},
watch: {
editParams: {
handler() {
this.computeFmData();
},
deep: true,
},
},
async mounted() {
this.initForm();
},
methods: {
async initForm() {
this.iniFmData();
if (this.formId && this.formType != "add") {
this.getInfo();
}
},
computeFmData() {
console.log(this.fmData);
},
iniFmData() {
const { editParams, fmData, editParamsDiv } = this;
editParams.forEach((item, index) => {
if (typeof item.value == "function") {
fmData[item.keyName] = item.value();
} else if (
typeof item.value == "string" ||
typeof item.value == "number" ||
typeof item.value == "boolean"
) {
fmData[item.keyName] = item.value;
} else if (typeof item.value == "undefined") {
fmData[item.keyName] = "";
} else {
fmData[item.keyName] = item.value || "";
console.error(
"不应该直接传入数组或对象的值,这样会导致传入的值被子组件修改。editParams-------------cpts/base/cpts/edit.vue",
item
);
}
if (item.supValues) {
item.supValues.forEach((value, index) => {
if (typeof value == "function") {
fmData[item.supKeys[index]] = value();
} else if (
typeof value == "string" ||
typeof value == "number" ||
typeof value == "boolean"
) {
fmData[item.supKeys[index]] = value;
} else if (typeof value == "undefined") {
fmData[item.supKeys[index]] = "";
} else {
fmData[item.supKeys[index]] = value;
console.error(
"不应该直接传入数组或对象的值,这样会导致传入的值被子组件修改。editParams-------------cpts/base/cpts/edit.vue",
item
);
}
});
}
if (item.type == "select" || item.type == "cascader") {
if (item.optionUrl) {
this.getFmOptions(
index,
item.optionUrl,
item.optionUrlParams || {},
item.optionCook || null
);
}
} else if (item.type == "address") {
this.$nextTick(async () => {
await nextTick(300);
this.initMap(item);
});
}
});
this.fmData = { ...fmData };
if (editParamsDiv) {
this.editParams1 = editParams.slice(0, editParamsDiv);
this.editParams2 = editParams.slice(editParamsDiv);
} else {
this.editParams1 = editParams;
}
console.log("------------------------------------", this.fmData);
this.iniLoaded = true;
},
handleClickHtmlNode(e) {
//
if (e.target.localName.toLowerCase() === "a") {
//
let url = e.target.getAttribute("src"); //adata-ididclickaclick
window.open(url);
}
},
async getFmOptions(index, url, params, cookFn) {
const { data, code, msg } = await requestPost(url, {
...params,
});
if (code === 0) {
this.editParams[index].optionList =
typeof cookFn == "function" ? cookFn(data) : data || [];
} else {
this.$message.error("请求检索基础数据失败!");
}
},
handleChangeCascader(vals, item) {
this.fmData[item["keyName"]] = vals;
if (typeof item.handleChangeFn == "function") {
item.handleChangeFn(vals, item, this);
}
},
handleChangeSelect(vals, item) {
console.log(vals, item);
this.fmData[item["keyName"]] = vals;
if (typeof item.handleChangeFn == "function") {
item.handleChangeFn(vals, item, this);
}
},
beforeImgUpload(file, item) {
if (typeof item.beforeImgUpload == "function") {
if (!item.beforeImgUpload(file, item, this)) return false;
}
return true;
},
handleImgRemove(file, item) {
console.log("handleImgRemove", file);
let url = file.response ? file.response.data.url : file.url;
if (url) {
let { fmData } = this;
this.fmData[item.keyName] = fmData[item.keyName].filter(
(item) => item.url !== url
);
if (item.supKeys && Array.isArray(item.supKeys)) {
if (item.supKeys.length > 0) {
this.fmData[item.supKeys[0]] = fmData[item.keyName].map(
(item) => item.url
);
}
if (item.supKeys.length > 1) {
this.fmData[item.supKeys[1]] =
this.fmData[item.supKeys[0]][0] || "";
}
}
}
},
handleImgExceed(res, item) {
console.log(res);
// this.$message({
// type: "warning",
// message: "",
// });
},
handleImgSuccess(res, file, item) {
console.log("handleImgSuccess", res);
if (res.code === 0 && res.msg === "success") {
let { fmData } = this;
// let picItem = {
// url: res.data.url,
// name: file.name,
// size: file.size,
// type: file.type,
// format: file.name.split(".").pop(),
// };
let picItem = file;
picItem.url = res.data.url;
picItem.format = file.name.split(".").pop();
if (Array.isArray(this.fmData[item.keyName])) {
this.fmData[item.keyName].push(picItem);
} else {
this.fmData[item.keyName] = [picItem];
}
if (item.supKeys && Array.isArray(item.supKeys)) {
if (item.supKeys.length > 0) {
this.fmData[item.supKeys[0]] = fmData[item.keyName].map(
(item) => item.url
);
}
if (item.supKeys.length > 1) {
this.fmData[item.supKeys[1]] =
this.fmData[item.supKeys[0]][0] || "";
}
}
} else {
this.$message.error(res.msg);
}
},
handleImgError(res, file, item) {
console.log(res);
},
// init
initMap(item) {
let { latitude, longitude } = this.$store.state.user;
if (!latitude || latitude == "" || latitude == "0") {
latitude = 39.9088810666821;
longitude = 116.39743841556731;
}
//
var center = new window.TMap.LatLng(latitude, longitude);
// map TMap.Map()
map = new window.TMap.Map(document.getElementById("app"), {
center: center, //
zoom: 13, //
pitch: 43.5, //
rotation: 45, //
});
search = new window.TMap.service.Search({ pageSize: 10 });
//
markers = new TMap.MultiMarker({
map: map,
geometries: [],
});
infoWindowList = Array(10);
geocoder = new TMap.service.Geocoder(); //
//
map.on("panend", (e) => {
this.handleMoveCenter(item, e);
});
// this.handleMoveCenter(item);
},
setMarker(lat, lng) {
markers.setGeometries([]);
markers.add([
{
id: "4",
styleId: "marker",
position: new TMap.LatLng(lat, lng),
properties: {
title: "marker4",
},
},
]);
},
handleSearchMap(item) {
infoWindowList.forEach((infoWindow) => {
infoWindow.close();
});
infoWindowList.length = 0;
markers.setGeometries([]);
//
search
.searchRectangle({
keyword: this.fmData[item.keyName],
bounds: map.getBounds(),
})
.then((result) => {
let { data } = result;
if (Array.isArray(data) && data.length > 0) {
const {
location: { lat, lng },
} = data[0];
map.setCenter(new TMap.LatLng(lat, lng));
this.setMarker(lat, lng);
// item.supValues[0] = lng;
// item.supValues[1] = lat;
this.fmData[item.supKeys[0]] = lng;
this.fmData[item.supKeys[1]] = lat;
} else {
this.$message.error("未检索到相关位置坐标");
}
});
},
handleMoveCenter(item, e) {
console.log(e);
//
const center = map.getCenter();
const lat = center.getLat();
const lng = center.getLng();
// item.supValues[0] = lng;
// item.supValues[1] = lat;
this.fmData[item.supKeys[0]] = lng;
this.fmData[item.supKeys[1]] = lat;
this.setMarker(lat, lng);
if (e && e.originalEvent) {
geocoder
.getAddress({ location: new TMap.LatLng(lat, lng) }) //
.then((result) => {
this.fmData[item.keyName] = result.result.address;
});
}
},
async getInfo() {
let url = this.infoUrl;
if (!url) return;
const { idName, formId } = this;
if (url.endsWith("/")) {
url += formId;
}
const params = {
[idName]: formId,
};
let { data, code, msg } = await requestPost(url, params);
if (code === 0) {
const { editConfig } = this;
console.log("xxxxxxxxxxxxxxxxxxxxxx", editConfig);
if (editConfig && typeof editConfig.cookInfoFn == "function") {
data = editConfig.cookInfoFn(data);
}
this.fmData = {
...this.fmData,
...data,
};
await nextTick(600);
if (map) {
if (data.latitude) {
map.setCenter(new TMap.LatLng(data.latitude, data.longitude));
} else {
if (this.formType == "edit" && this.$refs && this.$refs.mapSearch) {
this.$refs.mapSearch[0].handleClick();
}
}
}
} else {
this.$message.error(msg);
}
},
watchImg(src) {
window.open(src);
},
//
dormatHtml(content) {
if (
content.startsWith(
"<!DOCTYPE html>\n<html>\n<head>\n</head>\n<body>\n"
) &&
content.endsWith("\n</body>\n</html>")
) {
content = content.slice(45, -16);
}
return content;
},
cookBeforeSubmit(data) {
Object.keys(data).forEach((k) => {
if (typeof data[k] == "string") {
data[k] = this.dormatHtml(data[k]);
}
});
return data;
},
async handleComfirm() {
this.btnDisable = true;
setTimeout(() => {
this.btnDisable = false;
}, 5000);
console.log(this.$refs["ref_form"]);
this.$refs["ref_form"].validate((valid, messageObj) => {
console.log(valid, messageObj);
if (!valid) {
app.util.validateRule(messageObj);
this.btnDisable = false;
} else {
if (this.editElseRules) {
const validator = new Schema(this.editElseRules);
validator
.validate(this.fmData)
.then(() => {
this.submit();
})
.catch(({ err, fields }) => {
console.log("--------------", err, fields);
app.util.validateRule(fields);
});
} else {
this.submit();
}
}
});
},
async submit() {
const { editConfig, fmData, formType, editFixedParams } = this;
if (
typeof editConfig.beforeSubmit == "function" &&
!editConfig.beforeSubmit(formType, fmData, this)
) {
return;
}
let url = "";
let params = {
...fmData,
...editFixedParams,
// serviceType: this.fmData.serviceTypeArr.join(","),
};
params = this.cookBeforeSubmit(params);
if (this.formType === "add") {
url = this.addUrl;
} else {
url = this.editUrl;
}
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
this.$message({
type: "success",
message: "操作成功",
});
this.handleCancle();
this.$emit("afterEdit");
this.btnDisable = false;
} else {
this.btnDisable = false;
this.$message.error(msg);
}
},
handleCancle() {
this.$emit("close");
},
},
};
</script>
<style lang="scss" scoped>
.m-fm {
margin-top: 30px;
&.z-div {
.list {
display: flex;
flex-wrap: wrap;
.item {
min-width: 45%;
.item-rich-text {
width: 817px;
max-height: 500px;
overflow: auto;
img {
max-width: 100%;
}
&.z-show {
box-sizing: border-box;
padding: 15px;
border: 1px solid #eee;
height: auto;
}
}
}
}
.item-show {
width: 324px;
}
.item-input {
width: 324px;
}
.item-select {
width: 324px;
}
.item-number {
width: 180px;
}
.address-item {
width: 350px;
.address-item-input {
width: 74%;
}
.address-item-input2 {
margin-left: 5px;
width: 40%;
}
}
}
.avatar-uploader {
&.z-full {
/deep/ .el-upload.el-upload--picture-card {
display: none !important;
}
}
a {
display: flex;
align-items: center;
justify-content: center;
color: #65a5f9;
i {
margin-right: 4px;
color: #65a5f9;
font-size: 18px;
}
&:hover {
text-decoration: none;
}
}
}
.item-rich-text {
width: 600px;
height: 500px;
img {
max-width: 100%;
}
.item-show {
width: 100%;
}
}
.item-select,
.item-show,
.item-input {
width: 450px;
}
.item-number {
width: 225px;
}
.address-item {
width: 450px;
.address-item-input {
width: 85%;
}
.address-item-input2 {
margin-left: 5px;
width: 40%;
}
}
.div_map {
margin-top: 10px;
}
}
</style>

67
src/views/modules/cpts/base/cpts/edit.vue

@ -8,7 +8,7 @@
:inline="true" :inline="true"
:disabled="formType === 'watch'" :disabled="formType === 'watch'"
class="m-fm" class="m-fm"
:class="editParamsDiv ? 'z-div' : ''" :class="{ 'z-div': editParamsDiv, 'z-watch': formType === 'watch' }"
> >
<div class="list"> <div class="list">
<el-form-item <el-form-item
@ -98,6 +98,9 @@
<template v-if="item.type == 'number'"> <template v-if="item.type == 'number'">
<el-input-number <el-input-number
v-if="
formType == 'add' || (formType == 'edit' && !item.editDisable)
"
v-model="fmData[item.keyName]" v-model="fmData[item.keyName]"
class="item-number" class="item-number"
size="small" size="small"
@ -109,6 +112,9 @@
:placeholder="item.placeholder || '请输入'" :placeholder="item.placeholder || '请输入'"
> >
</el-input-number> </el-input-number>
<span class="item-show" v-else>
{{ fmData[item.keyName] || "--" }}
</span>
<span v-if="item.unitName">{{ item.unitName }}</span> <span v-if="item.unitName">{{ item.unitName }}</span>
</template> </template>
@ -194,7 +200,8 @@
</template> </template>
<template v-else-if="item.type == 'upload'"> <template v-else-if="item.type == 'upload'">
<el-upload :headers="$getElUploadHeaders()" <el-upload
:headers="$getElUploadHeaders()"
v-if=" v-if="
formType == 'add' || (formType == 'edit' && !item.editDisable) formType == 'add' || (formType == 'edit' && !item.editDisable)
" "
@ -864,6 +871,60 @@ export default {
.m-fm { .m-fm {
margin-top: 30px; margin-top: 30px;
&.z-watch {
.list {
.item {
}
::v-deep .item {
// placeholder
.el-input.is-disabled .el-input__inner,
.el-textarea.is-disabled textarea.el-textarea__inner {
color: #333;
background-color: rgba(#000, 0);
border-color: rgba(#000, 0);
resize: none;
transform: translateX(-15px);
cursor: default;
&::placeholder {
color: rgba(#fff, 0);
}
}
.el-input.is-disabled .el-input__suffix {
display: none;
}
.el-checkbox.is-disabled.is-checked .el-checkbox__label {
color: #333;
}
.el-form-item__label {
position: relative;
text-align: left;
padding-left: 35px;
&::before {
content: "";
display: block;
position: absolute;
top: 0;
bottom: 0;
left: 20px;
width: 6px;
height: 6px;
margin: auto;
background: #0c81fe;
border-radius: 3px;
margin-right: 10px;
}
&::after {
content: " :";
display: inline;
color: #333;
}
}
}
}
}
&.z-div { &.z-div {
.list { .list {
display: flex; display: flex;
@ -916,6 +977,7 @@ export default {
} }
} }
} }
.avatar-uploader { .avatar-uploader {
&.z-full { &.z-full {
/deep/ .el-upload.el-upload--picture-card { /deep/ .el-upload.el-upload--picture-card {
@ -938,6 +1000,7 @@ export default {
} }
} }
} }
.item-rich-text { .item-rich-text {
width: 600px; width: 600px;
height: 500px; height: 500px;

Loading…
Cancel
Save