123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595 |
- <template>
- <com-head :options="headList" v-model="search.state.type" showCtrl>
- <el-form label-width="90px" inline="true">
- <el-form-item label="楼栋-单元:">
- <el-input v-model="search.state.buildingUnit" placeholder="请输入"></el-input>
- </el-form-item>
- <el-form-item label="房号:">
- <el-input v-model="search.state.roomNumber" placeholder="请输入"></el-input>
- </el-form-item>
- <el-form-item label="建筑面积:" >
- <div class="range-number">
- <el-input v-model="search.state.constructionAreaStar" placeholder="请输入"></el-input>
- <span>至</span>
- <el-input v-model="search.state.constructionAreaEnd" placeholder="请输入"></el-input>
- </div>
- </el-form-item>
- <el-form-item label="套内面积:">
- <div class="range-number">
- <el-input v-model="search.state.insideAreaStar" placeholder="请输入"></el-input>
- <span>至</span>
- <el-input v-model="search.state.insideAreaSnd" placeholder="请输入"></el-input>
- </div>
- </el-form-item>
- <el-form-item label="更新时间:">
- <el-date-picker
- v-model="updateTime"
- type="daterange"
- range-separator="至"
- start-placeholder="开始时间"
- end-placeholder="结束时间">
- </el-date-picker>
- </el-form-item>
- <el-form-item label="维护人:">
- <el-input v-model="search.state.maintenanceman" placeholder="请输入"></el-input>
- </el-form-item>
-
- <el-form-item label="状态:">
- <el-select v-model="search.state.auditStatus" placeholder="全部">
- <el-option v-for="(item) in status" :key="item.value" :label="item.name" :value="item.value"></el-option>
- </el-select>
- </el-form-item>
- <el-form-item label="审核人:">
- <el-input v-model="search.state.reviewer" placeholder="请输入"></el-input>
- </el-form-item>
- <el-form-item label="创建时间:">
- <el-date-picker
- v-model="createTime"
- type="daterange"
- range-separator="至"
- start-placeholder="开始日期"
- end-placeholder="结束日期">
- </el-date-picker>
- </el-form-item>
- <el-form-item label="审核时间:">
- <el-date-picker
- v-model="reviewTime"
- type="daterange"
- range-separator="至"
- start-placeholder="开始日期"
- end-placeholder="结束日期">
- </el-date-picker>
- </el-form-item>
- <el-form-item class="searh-btns">
- <el-button @click="resetSearch">重置</el-button>
- <el-button type="primary" @click="search.submit">查询</el-button>
- </el-form-item>
- </el-form>
- </com-head>
- <div class="body-layer">
- <div class="body-head">
- <h3>
- <span>全部房源VR</span>
- </h3>
- <!-- <div>
- <el-button type="primary" @click="dataList.deleteSelect" v-if="auth.delete" :disabled="!dataList.state.length">删除</el-button>
- </div> -->
- </div>
- <el-table ref="multipleTable" :data="dataList.state" style="width: 100%" @selection-change="dataList.changeSelectRows">
- <el-table-column type="selection" width="55" @click.stop v-if="auth.deleteProject"></el-table-column>
-
- <el-table-column label="楼栋-单元" v-slot:default="{ row }">
- {{row.buildingUnit}}
- </el-table-column>
- <el-table-column label="房号" v-slot:default="{ row }">
- {{row.roomNumber}}
- </el-table-column>
- <el-table-column label="建筑面积" prop="buildArea"></el-table-column>
- <el-table-column label="套内面积" prop="roomArea"></el-table-column>
- <el-table-column label="状态" v-slot:default="{row}" width="90">
- <div class="status" :class="{interactive:row.auditStatus !== draftStatus || row.reviewer || row.reviewTime}" @click="(row.auditStatus !== draftStatus || row.reviewer || row.reviewTime) && selectRow(row)">
- <span>{{getStatusName(row.auditStatus)}}</span>
- <template v-if="row.auditStatus !== draftStatus || row.reviewer || row.reviewTime">
- <i class="el-icon-document" v-if="row.auditStatus !== noAdoptStatus && row.auditStatus !== noComAdoptStatus"></i>
- <i class="el-icon-warning-outline error" v-else></i>
- </template>
- </div>
-
- </el-table-column>
- <el-table-column label="维护人" prop="maintenanceman"></el-table-column>
- <el-table-column label="更新时间" prop="lastupdateTime"></el-table-column>
- <el-table-column label="审核人" prop="reviewer"></el-table-column>
- <el-table-column label="审核时间" prop="reviewTime"></el-table-column>
- <el-table-column label="操作" width="180" v-slot:default="{row}">
- <span
- class="oper-span"
- @click="(~[draftStatus, noAdoptStatus, noComAdoptStatus].indexOf(row.auditStatus)) && editHouse(row)"
- :class="{disable: !~[draftStatus, noAdoptStatus, noComAdoptStatus].indexOf(row.auditStatus)}"
- v-if="auth.update"
- >
- 编辑VR
- </span>
- <span
- class="oper-span"
- @click="() => {~[adoptStatus, uplineStatus].indexOf(row.auditStatus) && (queryVR.show = true ,queryVR.data = row)}"
- :class="{disable: (!~[adoptStatus, uplineStatus].indexOf(row.auditStatus))}" >
- 查看
- </span>
- <!-- <span
- class="oper-span"
- @click="~[draftStatus, noAdoptStatus, noComAdoptStatus].indexOf(row.status) && editHouse(row)"
- :class="{disable: !~[draftStatus, noAdoptStatus, noComAdoptStatus].indexOf(row.status)}"
- v-if="auth.deleteProject">
- 删除
- </span>
- -->
- <span
- class="oper-span"
- v-if="user.role !== 'group'"
- :class="{disable: user.role === 'group' || adoptStatus === row.auditStatus || uplineStatus === row.auditStatus}"
- @click.stop="(user.role !== 'group' && row.auditStatus !== adoptStatus && row.auditStatus !== uplineStatus) && examine(row)">
- {{ ~[draftStatus, noAdoptStatus, adoptStatus, noComAdoptStatus].indexOf(row.auditStatus) ? '提审' : '撤回'}}
- </span>
- <span
- class="oper-span"
- @click="(~[draftStatus, noAdoptStatus, noComAdoptStatus].indexOf(row.auditStatus)) && delModel(row)"
- :class="{disable: !~[draftStatus, noAdoptStatus, noComAdoptStatus].indexOf(row.auditStatus)}"
- v-if="auth.update"
- >
- 删除VR
- </span>
- <span class="oper-span" @click.stop="shareRow(row)" v-if="false">预览</span>
- <span class="oper-span" @click.stop="offlineItem(row)" v-if="row.auditStatus === uplineStatus" :class="{disable: !~[adoptStatus, uplineStatus].indexOf(row.auditStatus)}">
- {{row.auditStatus === uplineStatus ? '下线' : '上线' }}
- </span>
- </el-table-column>
- </el-table>
- <com-pagination
- @size-change="pag.sizeChange"
- @current-change="pag.currentChange"
- :current-page="pag.state.currPage"
- :page-size="pag.state.size"
- layout="total, sizes, prev, pager, next, jumper"
- :total="pag.state.total"/>
- </div>
- <com-query-vr v-model:show="queryVR.show" :data="queryVR.data" v-if="queryVR.show" />
- <com-record v-model:show="recordData.show" :data="recordData.id" v-if="recordData.show" />
- <com-share
- :setLogo="auth.update"
- v-if="shareData.show"
- v-model:show="shareData.show"
- :items="shareData.data" />
- <com-vrlist v-model:show="selectVR.show" v-if="selectVR.show" @enter="item => updateModel(item)" v-model="selectVR.value" />
- </template>
- <script>
- import axios from 'axios'
- import {ref, watch} from 'vue'
- import getTableState from '@/state/tableRef'
- import comHead from "@/components/head";
- import comShare from "../share";
- import comRecord from "./record";
- import comVrlist from "./vrlist";
- import comQueryVr from "./queryvr";
- import qrcode from 'qrcode'
- import auth from "@/state/viewAuth";
- import comPagination from "@/components/pagination";
- import router from '@/router'
- import { dateFormat, strToParams } from '@/util'
- import user from '@/state/user'
- import {
- EXAMINE_SHOW_SELECT_STATUS_2 as EXAMINE_SHOW_SELECT_STATUS,
- EXAMINE_SHOW_SELECT_STATUS_3 as EXAMINE_SHOW_SELECT_STATUS_TEXT,
- EXAMINE_DRAFT_STATUS,
- UN_REQ_NUM,
- EXAMINE_NO_ADOPT_STATUS,
- EXAMINE_NO_AUDIT_STATUS,
- EXAMINE_NO_COM_ADOPT_STATUS,
- EXAMINE_ADOPT_STATUS,
- EXAMINE_UP_ONLINE_STATUS,
- EXAMINE_NO_COM_AUDIT_STATUS,
- getName,
-
- getRedirectRoomAuditBody
- } from '@/constant'
- import {
- getCommunityByHouseId,
- getSecondHouseList,
- deleteSecondHouse,
- auditSecondHouse,
- dismissSecondHouse,
- secondHouseOnline
- } from '@/request/config'
- const getTimeMapSearch = (searchKey, search) => {
- const time = ref(null)
- const start = `${searchKey}Start`
- const end = `${searchKey}End`
- watch(time, () => {
- if (time.value) {
- search.value.state[start] = dateFormat(new Date(time.value[0]), 'yyyy-MM-dd hh:mm:ss').toString()
- search.value.state[end] = dateFormat(new Date(time.value[1]), 'yyyy-MM-dd 23:59:59').toString()
- } else {
- search.value.state[start] = search.value.state[end] = ''
- }
- })
- watch(
- () => search.value.state[start],
- () => {
- if (!search.value.state[start]) {
- time.value = null
- }
- }
- )
- watch(
- () => search.value.state[end],
- () => {
- if (!search.value.state[end]) {
- time.value = null
- }
- }
- )
- return time
- }
- export default {
- name: 'housing',
- setup() {
- const headList = ref([{ name: "二手房", value: 1 }])
- const state = getTableState({
- getUrl: getSecondHouseList,
- delUrl: deleteSecondHouse,
- pagAttr: {listMap: {roomid: 'id'}},
- searchAttr: {
- gardenId: router.currentRoute.value.params.id,
- cityId: router.currentRoute.value.params.cityId,
- buildingUnit: "",
- roomNumber: '',
- maintenanceman: '',
- auditStatus: UN_REQ_NUM,
- reviewer: '',
- updateTimeStart: '',
- updateTimeEnd: '',
- createTimeStart: '',
- createTimeEnd: '',
- reviewTimeStart: '',
- reviewTimeEnd: '',
- insideAreaSnd: '',
- insideAreaStar: '',
- constructionAreaStar: '',
- constructionAreaEnd: '',
- }
- })
- state.dataList.value._delete = async (data) => {
- await axios.post(deleteSecondHouse, {}, {params: {roomid: data.roomid} })
- }
- const names = ref([])
- const initNames = ref([])
-
- return {
- ...state,
- headList,
- auth,
- user,
- initNames,
- names,
- updateTime: getTimeMapSearch('updateTime', state.search),
- auditTime: getTimeMapSearch('auditTime', state.search),
- createTime: getTimeMapSearch('createTime', state.search),
- reviewTime: getTimeMapSearch('reviewTime', state.search)
- };
- },
- data() {
- return {
- gardenName: '',
- status: EXAMINE_SHOW_SELECT_STATUS,
- uplineStatus: EXAMINE_UP_ONLINE_STATUS,
- draftStatus: EXAMINE_DRAFT_STATUS,
- noAdoptStatus: EXAMINE_NO_ADOPT_STATUS,
- noComAdoptStatus: EXAMINE_NO_COM_ADOPT_STATUS,
- noAuditStatus: EXAMINE_NO_AUDIT_STATUS,
- adoptStatus: EXAMINE_ADOPT_STATUS,
- recordData: { show: false, id: 0 },
- selectVR: { show: false, data: null, value: null },
- queryVR: { show: false, data: null },
- shareData: { show: false, data: 0 }
- }
- },
- methods: {
- clickEstateItem(ev, item) {
- if (item.disable) {
- ev.stopPropagation()
- }
- },
- getStatusName: getName(EXAMINE_SHOW_SELECT_STATUS_TEXT),
- selectRow(data) {
- this.recordData.show = true
- this.recordData.id = data.vrId
- },
- async shareRow(raw, type = 1) {
- if (!raw.vRUrl) {
- return this.$confirm('暂无有效链接', '提示')
- }
- const vrLink = process.env.VUE_APP_DOMAIN + raw.vRUrl
- const QrCode = await qrcode.toDataURL(vrLink)
- let shareItems = [{
- QrCode: QrCode,
- type: 'building',
- noRandow: true,
- houseTitle: raw.buildingUnit + raw.roomNumber,
- epcVrLink: vrLink.replace('hengda.html', 'epc.html'),
- vrLink: vrLink,
- innerVrLink: process.env.VUE_APP_INTRANET_DOMAIN + raw.vRUrl,
- status: raw.auditStatus,
- }]
- if (type === 1) {
- this.shareData.show = true
- this.shareData.data = shareItems
- } else {
- window.open(type === 1 ? shareItems[0].vrLink : shareItems[0].epcVrLink)
- }
- },
- openHouse(data) {
- return this.shareRow(data)
- // if (data.status === this.adoptStatus) {
- // window.open(data.vrLink)
- // } else {
- // window.open(data.innerVrLink)
- // }
- },
- async offlineItem(data) {
- data.cityId = this.$route.params.cityId
- data.gardenName = this.gardenName
- if (data.auditStatus !== EXAMINE_ADOPT_STATUS && data.auditStatus !== EXAMINE_UP_ONLINE_STATUS) return;
- if (data.auditStatus === EXAMINE_UP_ONLINE_STATUS) {
- if (!(await this.$msgbox({
- message: '下线后VR链接将无法继续访问,确定要下线吗?',
- title: '下线',
- showCancelButton: true,
- confirmButtonText: '下线',
- cancelButtonText: '取消',
- }))) {
- return;
- }
- }
- const status = data.auditStatus === EXAMINE_UP_ONLINE_STATUS ? EXAMINE_DRAFT_STATUS : EXAMINE_UP_ONLINE_STATUS
- await axios.post(
- secondHouseOnline,
- getRedirectRoomAuditBody(data, status)
- )
- this.$alert((status === EXAMINE_UP_ONLINE_STATUS ? '上' : '下') + '线成功', '提示')
- this.dataList.refer()
- },
- async examine(data) {
- data.cityId = this.$route.params.cityId
- data.gardenName = this.gardenName
- console.log(data)
- if (~[this.draftStatus, this.noAdoptStatus, this.adoptStatus, this.noComAdoptStatus].indexOf(data.auditStatus)) {
- await this.shareRow(data)
- if (!this.shareData.show) {
- return;
- }
- this.shareData.show = false
- // await axios.post(auditSecondHouse, getRedirectRoomAuditBody(data, EXAMINE_NO_COM_AUDIT_STATUS))
- const status = user.value.role === 'group' || user.value.role === 'admin' || user.value.role === 'region'
- ? EXAMINE_NO_AUDIT_STATUS
- : EXAMINE_NO_COM_AUDIT_STATUS
-
- await axios.post(auditSecondHouse, getRedirectRoomAuditBody(data, status))
-
- // data.auditId = res.data.auditId
- this.$alert('提审成功', '提示')
- } else {
- await axios.post(dismissSecondHouse, getRedirectRoomAuditBody(data, EXAMINE_DRAFT_STATUS))
- this.$alert('撤销成功', '提示')
- }
- this.dataList.refer()
- },
- resetSearch() {
- let type = this.search.state.type
- this.search.reset()
- this.search.state.type = type
- },
- async updateModel(raw) {
- const upload = {
- vrModelName: raw.sceneName,
- num: raw.num,
- vrCover: raw.thumb,
- vRUrl: `/hengda.html?m=${raw.num}&prodId=${this.search.state.gardenId}&houseId=${this.selectVR.data.roomlistingId}&businessType=2`
- }
- await axios.post(dismissSecondHouse, getRedirectRoomAuditBody({
- ...this.selectVR.data,
- ...upload
- }, EXAMINE_DRAFT_STATUS, '', this.selectVR.data.roomlistingId))
- this.selectVR.show = false
- this.dataList.refer()
- },
- async delModel(row) {
- if (!row.vRUrl) {
- return this.$alert('暂无有效链接', '提示')
- }
- await axios.post(dismissSecondHouse, getRedirectRoomAuditBody({
- ...row,
- vrCover: '',
- vRUrl: '',
- }, EXAMINE_DRAFT_STATUS, '', this.selectVR.data.roomlistingId))
- this.selectVR.show = false
- this.dataList.refer()
- },
- editHouse(item, isView = 0) {
- if (isView) {
- const params = strToParams(item.vRUrl.substr(item.vRUrl.indexOf('?')))
-
- const link = '/epc.html?m=' + params.m + '&token=' + user.value.token
- return window.open(link)
- } else {
- if (item.vRUrl) {
- const params = strToParams(item.vRUrl.substr(item.vRUrl.indexOf('?')))
- this.selectVR.value = params.m
- } else {
- this.selectVR.value = null
- }
-
- this.selectVR.show = true
- this.selectVR.data = item
- }
- // let link = process.env.VUE_APP_PREFIX + '/sh_house/edit.html?m=' + item.id + '&h=' + item.gardenId + '&canView=' + isView
- // window.open(link)
- }
- },
- watch: {
- '$route': {
- immediate: true,
- async handler(newVal, oldVal) {
- if (newVal.name !== "secondHouse" || (this.search.state.gardenId === newVal.params.id && oldVal)) return;
- try {
- this.search.state.gardenId = newVal.params.id
- let res = await axios.get(getCommunityByHouseId, { params: { gardenId: newVal.params.id } })
- this.gardenName = res.data.gardenName
- document.querySelector('.player').querySelector('.active span').textContent = this.gardenName
- this.gardenId = res.data.gardenId
- } catch (e) {
- this.$router.back()
- }
- }
- }
- },
- components: {
- comVrlist,
- comQueryVr,
- "com-head": comHead,
- "com-record": comRecord,
- "com-share": comShare,
- "com-pagination": comPagination
- },
- };
- </script>
- <style lang="less">
- .my-autocomplete {
- li {
- line-height: normal;
- padding: 0 !important;
- .item-layout {
- padding: 7px !important;
- display: flex;
- justify-content: space-between;
- span {
- flex: none;
- }
- }
- .item-layout.disable {
- cursor: not-allowed;
- *{
- color: #c0c4cc;
- }
- }
- .name {
- text-overflow: ellipsis;
- overflow: hidden;
- line-height: 16px;
- }
- .addr {
- text-overflow: ellipsis;
- overflow: hidden;
- line-height: 16px;
- }
- .highlighted .addr {
- color: #ddd;
- }
- }
- }
- .info-from .el-form-item__content{
- width: calc(100% - 100px);
- }
- .info-from .el-form-item__content .inline-input {
- width: 100%;
- }
- </style>
- <style lang="scss" scoped>
- .add-input {
- width: 250px;
- margin: 40px auto;
- padding-left: 80px;
- position: relative;
- label {
- position: absolute;
- left: 0;
- top: 50%;
- transform: translateY(-50%);
- span {
- color: var(--primaryColor);
- }
- }
- }
- .cover-img {
- width: 32px;
- height: 32px;
- }
- .status {
- &.interactive {
- cursor: pointer;
- }
- i {
- vertical-align: text-bottom;
- margin-left: 5px;
- font-size: 1.2rem;
- color: rgb(144,144,150);
-
- &.error {
- color: var(--primaryColor);
- }
- }
- }
- </style>
|