liukangdong
2025-01-22 a7b60ffdfa197c457a3118424337a95594d62239
Merge branch '2.0.1' of http://139.186.142.91:10010/r/productDev/funingyunwei into 2.0.1
已修改14个文件
1955 ■■■■ 文件已修改
admin/src/api/Inspection/device.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/system/common.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/workorder/ywWorkorder.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/ywProblem.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/components/deviceDetail.vue 281 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/components/deviceEdit.vue 356 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/device.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/project/components/houseDetails.vue 641 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/project/housingList.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/workorder/components/OperaYwWorkorderWindow.vue 137 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/workorder/components/detail.vue 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/workorder/components/handleProblem.vue 338 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/workorder/components/problemReportingDetails.vue 89 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/workorder/problemReporting.vue 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/Inspection/device.js
@@ -42,3 +42,13 @@
    }
  })
}
// 设备状态统计
export function getDeviceStatus (data) {
  return request.post('/visitsAdmin/cloudService/business/ywDevice/getDeviceStatus', data)
}
// 设备数量分类统计
export function getDeviceCateData (data) {
  return request.post('/visitsAdmin/cloudService/business/ywDevice/getDeviceCateData', data)
}
admin/src/api/system/common.js
@@ -71,6 +71,10 @@
export function upload (data) {
  return request.post('/visitsAdmin/cloudService/public/upload', data)
}
// 批量上传文件到FTP
export function uploadBatch (data) {
  return request.post('/visitsAdmin/cloudService/public/uploadBatch', data)
}
// 获取省市区树
export function getCityTree (data) {
  return request.post('/visitsAdmin/cloudService/business/areas/treeList', data)
admin/src/api/workorder/ywWorkorder.js
@@ -32,6 +32,11 @@
  return request.post('/visitsAdmin/cloudService/business/ywWorkorder/updateById', data)
}
// 获取工单数量信息
export function getDataVO (data) {
  return request.post('/visitsAdmin/cloudService/business/ywWorkorder/getDataVO', data)
}
// 删除
export function deleteById (id) {
  return request.get(`/visitsAdmin/cloudService/business/ywWorkorder/delete/${id}`)
admin/src/api/ywProblem.js
@@ -13,11 +13,26 @@
}
// 根据ID修改
export function editProblem (data) {
  return request.post('/visitsAdmin/cloudService/business/ywProblem/editProblem', data)
}
// 根据ID修改
export function updateById (data) {
  return request.post('/visitsAdmin/cloudService/business/ywProblem/updateById', data)
}
// 根据ID查询
export function getById (id) {
  return request.get(`/visitsAdmin/cloudService/business/ywProblem/${id}`)
}
// 删除
export function deleteById (id) {
  return request.get(`/visitsAdmin/cloudService/business/ywProblem/delete/${id}`)
}
// 根据工单查询
export function getByWorkorderId (workorderId) {
  return request.get(`/visitsAdmin/cloudService/business/ywProblem/getByWorkorderId?workorderId=${workorderId}`)
}
admin/src/views/operation/components/deviceDetail.vue
@@ -1,7 +1,14 @@
<template>
  <GlobalWindow width="720px" title="设备详情" :visible.sync="visible" :confirm-working="isWorking" @close="close"
  <GlobalWindow width="100%" title="设备详情" :withFooter="false" :visible.sync="visible" :confirm-working="isWorking" @close="close"
    @confirm="confirm">
    <div class="main">
    <div style="width: 100%; position: sticky; top: 0; left: 0; z-index: 999; background: #ffffff;">
      <div class="tabs">
        <div class="tab" :class="{ active: activeTabs === 0 }" @click="tabsClick(0)">设备信息</div>
        <div class="tab" :class="{ active: activeTabs === 1 }" @click="tabsClick(1)">运维记录</div>
        <div class="tab" :class="{ active: activeTabs === 2 }" @click="tabsClick(2)">巡检记录</div>
      </div>
    </div>
    <div class="main" v-if="activeTabs === 0">
      <div class="title">
        <span>基础信息</span>
      </div>
@@ -32,6 +39,18 @@
            <div class="val">{{ info.addr }}</div>
          </div>
          <div class="item">
            <div class="la">所属项目</div>
            <div class="val">{{ info.projectName }}</div>
          </div>
          <div class="item">
            <div class="la">关联房源</div>
            <div class="val">{{ info.buildingName }} / {{ info.floorName }} / {{info.roomName}}</div>
          </div>
          <div class="item">
            <div class="la">购入时间</div>
            <div class="val">{{ info.buyDate }}</div>
          </div>
          <div class="item">
            <div class="la">设备状态</div>
            <spa class="val" v-if="info.status == 0">正常</spa>
            <spa class="val" v-if="info.status == 1">损坏</spa>
@@ -48,24 +67,189 @@
          <div v-if="info.fileFullUrl" class="item" style="width: 100%;">
            <div class="la">照片</div>
            <div class="val">
              <img class="photo" :src="info.fileFullUrl" alt="">
              <el-image
                style="width: 100px; height: 100px"
                :src="info.fileFullUrl"
                :preview-src-list="[info.fileFullUrl]">
              </el-image>
            </div>
          </div>
          <div class="item" style="width: 100%;">
            <div class="la">附件</div>
            <div class="val">
              <el-table
                :data="info.multifileList ? info.multifileList : []"
                border
                style="width: 100%">
                <el-table-column
                  prop="name"
                  label="附件名称">
                </el-table-column>
                <el-table-column
                  prop="userName"
                  label="操作人">
                </el-table-column>
                <el-table-column
                  prop="createDate"
                  label="操作时间">
                </el-table-column>
              </el-table>
            </div>
          </div>
        </div>
      </div>
      <div class="title">
        <span>供应商信息</span>
      </div>
      <div class="main_content">
        <div class="list">
          <div class="item">
            <div class="la">供应商</div>
            <div class="val">{{info.supplier}}</div>
          </div>
          <div class="item">
            <div class="la">联系人</div>
            <div class="val">{{info.supplierLinker}}</div>
          </div>
          <div class="item">
            <div class="la">联系方式</div>
            <div class="val">{{info.supplierPhone}}</div>
          </div>
        </div>
      </div>
      <div class="title">
        <span>维保信息</span>
      </div>
      <div class="main_content">
        <div class="list">
          <div class="item">
            <div class="la">维保负责人</div>
            <div class="val">{{info.maintenanceUserName}}</div>
          </div>
          <div class="item">
            <div class="la">维保到期日</div>
            <div class="val">{{info.maintenanceOverDate}}</div>
          </div>
          <div class="item" style="width: 100%;">
            <div class="la">维保说明</div>
            <div class="val">{{info.maintenanceContent}}</div>
          </div>
        </div>
      </div>
    </div>
    <div class="main" v-if="activeTabs === 1">
      <el-table
        :data="infoList"
        border
        style="width: 100%">
        <el-table-column
          prop="realName"
          label="运维人员">
        </el-table-column>
        <el-table-column
          label="设备状态">
          <template slot-scope="{row}">
            <span v-if="row.status === 0">正常</span>
            <span v-if="row.status === 1">损坏</span>
            <span v-if="row.status === 2">报废</span>
          </template>
        </el-table-column>
        <el-table-column
          prop="remark"
          label="运维备注">
        </el-table-column>
        <el-table-column
          prop="dealDate"
          label="运维时间">
        </el-table-column>
        <el-table-column
          label="操作">
          <template slot-scope="{row}">
            <el-button type="text" @click="handleDetail(row)">查看详情</el-button>
          </template>
        </el-table-column>
      </el-table>
      <el-pagination
        @size-change="handleSizeChange"
        @current-change="handleCurrentChange"
        :current-page="page"
        :page-sizes="[10, 20, 30, 40]"
        :page-size="pageSize"
        layout="total, sizes, prev, pager, next, jumper"
        :total="total">
      </el-pagination>
    </div>
    <div class="main" v-if="activeTabs === 2">
      <el-table
        :data="infoList"
        border
        style="width: 100%">
        <el-table-column
          prop="schemeTitle"
          label="计划名称">
        </el-table-column>
        <el-table-column
          prop="taskCode"
          label="任务编号">
        </el-table-column>
        <el-table-column
          label="任务时间">
          <template slot-scope="{row}">
            {{row.startDate}} ~ {{row.endDate}}
          </template>
        </el-table-column>
        <el-table-column
          prop="realname"
          label="巡检人">
        </el-table-column>
        <el-table-column
          label="巡检结果">
          <template slot-scope="{row}">
            <span v-if="row.dealStatus === 0">正常</span>
            <span v-if="row.dealStatus === 1">异常</span>
          </template>
        </el-table-column>
        <el-table-column
          label="巡检附件">
          <template slot-scope="{row}">
            <el-image
              v-if="row.multifileList && row.multifileList.length > 0"
              style="width: 100px; height: 100px"
              :src="row.multifileList[0].fileurlFull"
              :preview-src-list="[row.multifileList[0].fileurlFull]">
            </el-image>
          </template>
        </el-table-column>
        <el-table-column
          prop="content"
          label="巡检说明">
        </el-table-column>
      </el-table>
      <el-pagination
        @size-change="handleSizeChange"
        @current-change="handleCurrentChange"
        :current-page="page"
        :page-sizes="[10, 20, 30, 40]"
        :page-size="pageSize"
        layout="total, sizes, prev, pager, next, jumper"
        :total="total">
      </el-pagination>
    </div>
    <Detail ref="DetailRef" />
  </GlobalWindow>
</template>
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
import BaseOpera from '@/components/base/BaseOpera'
import Detail from './maintainDetail'
import { detailById } from '@/api/Inspection/device.js'
import { getUserList } from '@/api/system/user'
import { Message, Loading } from 'element-ui'
import { fetchList } from '@/api/Inspection/deviceRecord.js'
import { getDetail } from '@/api/Inspection/ywPatrolTask.js'
export default {
  components: {
    GlobalWindow
    GlobalWindow,
    Detail
  },
  extends: BaseOpera,
  data() {
@@ -73,19 +257,83 @@
      id: '',
      visible: false,
      info: {},
      activeTabs: 0,
      fileList: [],
      infoList: [],
      total: 0,
      pageSize: 10,
      page: 1
    }
  },
  methods: {
    handleSizeChange(e) {
      this.pageSize = e
      if (this.activeTabs === 1) {
        this.getyunwei()
      } else if (this.activeTabs === 2) {
        this.getXunJian()
      }
    },
    handleCurrentChange(e) {
      this.page = e
      if (this.activeTabs === 1) {
        this.getyunwei()
      } else if (this.activeTabs === 2) {
        this.getXunJian()
      }
    },
    getDetail() {
      this.this.activeTabs = 0
      const { id } = this
      detailById(id).then(res => {
        this.info = res
      })
    },
    handleDetail(row) {
      this.$refs.DetailRef.visible = true
      this.$refs.DetailRef.getDetail(row.id)
    },
    close() {
      this.visible = false
      this.$emit('close')
    },
    tabsClick(val) {
      this.activeTabs = val
      this.pageSize = 10
      this.page = 1
      this.infoList = []
      if (val === 1) {
        this.getyunwei()
      } else if (val === 2) {
        this.getXunJian()
      }
    },
    // 获取设备运维记录
    getyunwei() {
      fetchList({
        capacity: this.pageSize,
        page: this.page,
        model: {
          deviceId: this.id
        }
      }).then(res => {
        this.infoList = res.records
        this.total = res.total
      })
    },
    // 巡检记录
    getXunJian() {
      getDetail({
        capacity: this.pageSize,
        page: this.page,
        model: {
          deviceId: this.id
        }
      }).then(res => {
        this.infoList = res.records
        this.total = res.total
      })
    }
  }
}
@@ -93,7 +341,24 @@
<style lang="scss" scoped>
@import '@/assets/style/variables.scss';
.tabs {
  border-bottom: 1px solid #DFE2E8;
  display: flex;
  .tab {
    height: 58px;
    line-height: 58px;
    font-size: 16px;
    color: #666666;
    margin-right: 30px;
    cursor: pointer;
  }
  .active {
    font-weight: 500;
    color: $primary-color;
    border-bottom: 2px solid $primary-color;
  }
}
.main {
  padding-top: 20px;
admin/src/views/operation/components/deviceEdit.vue
@@ -1,52 +1,170 @@
<template>
  <GlobalWindow :title="param.id ? '编辑设备' : '新建设备'" :confirmWorking="subLoading" :visible.sync="isShowModal"
    width="600px" @close="close" @confirm="handleSub">
    width="100%" @close="close" @confirm="handleSub">
    <el-form :model="param" ref="paramRef" :rules="rules">
      <el-form-item label="设备编码" prop="code">
        <el-input v-model="param.code" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="设备名称" prop="name">
        <el-input v-model="param.name" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="设备型号" prop="">
        <el-input v-model="param.modelNo" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="设备分类" prop="cateId">
        <el-cascader v-model="param.cateIds" @change="changeSel" placeholder="请选择设备分类" clearable :options="cateList"
          :props="{
            label: 'name',
            value: 'id',
            children: 'childCategoryList'
          }"></el-cascader>
      </el-form-item>
      <el-form-item label="设备管理员" prop="">
        <el-select v-model="param.userId" clearable filterable>
          <el-option v-for="item in staffList" :label="item.realname" :value="item.id"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="所在位置" prop="">
        <el-input v-model="param.addr" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="供应商" prop="">
        <el-input v-model="param.supplier" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="运维内容" prop="">
        <el-input type="textarea" :rows="4" v-model="param.content" placeholder="请输入" />
      </el-form-item>
      <el-form-item label="设备状态" prop="">
        <el-select v-model="param.status" filterable>
          <el-option :value="0" label="正常"></el-option>
          <el-option :value="1" label="损坏"></el-option>
          <el-option :value="2" label="报废"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="照片" prop="">
        <UploadAvatarImage :file="{ 'imgurlfull': param.fileFullUrl, 'imgurl': param.fileUrl }"
          :uploadData="{ folder: 'ywDevice/' }" @uploadSuccess="uploadAvatarSuccess" @uploadEnd="isUploading = false"
          @uploadBegin="isUploading = true" />
      </el-form-item>
      <div style="width: 100%; display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; padding-top: 20px; box-sizing: border-box;">
        <div class="title">基础信息</div>
        <div style="width: 31%;">
          <el-form-item label="设备编码" prop="code">
            <el-input v-model="param.code" placeholder="请输入" v-trim />
          </el-form-item>
        </div>
        <div style="width: 31%;">
          <el-form-item label="设备名称" prop="name">
            <el-input v-model="param.name" placeholder="请输入" v-trim />
          </el-form-item>
        </div>
        <div style="width: 31%;">
          <el-form-item label="设备型号" prop="modelNo">
            <el-input v-model="param.modelNo" placeholder="请输入" v-trim />
          </el-form-item>
        </div>
        <div style="width: 31%;">
          <el-form-item label="设备分类" prop="cateIds">
            <el-cascader v-model="param.cateIds" @change="changeSel" placeholder="请选择设备分类" clearable :options="cateList"
             :props="{
              label: 'name',
              value: 'id',
              children: 'childCategoryList'
            }"></el-cascader>
          </el-form-item>
        </div>
        <div style="width: 31%;">
          <el-form-item label="设备管理员" prop="userId">
            <el-select v-model="param.userId" clearable filterable>
              <el-option v-for="item in staffList" :label="item.realname" :value="item.id"></el-option>
            </el-select>
          </el-form-item>
        </div>
        <div style="width: 31%;">
          <el-form-item label="所在位置" prop="addr">
            <el-input v-model="param.addr" placeholder="请输入" v-trim />
          </el-form-item>
        </div>
        <div style="width: 31%;">
          <el-form-item label="所属项目" prop="projectId">
            <el-select v-model="param.projectId" @change="changeProject" filterable>
              <el-option v-for="item in projectList" :label="item.name" :value="item.id"></el-option>
            </el-select>
          </el-form-item>
        </div>
        <div style="width: 31%;">
          <el-form-item label="关联房源" prop="rooms">
            <el-cascader v-model="param.rooms" :disabled="!param.projectId" ref="cascader" @change="getHouseVal" placeholder="请选择关联房源" :options="houseList"
             :props="{
              label: 'name',
              value: 'id',
              children: 'projectDataVOList'
            }"></el-cascader>
          </el-form-item>
        </div>
        <div style="width: 31%;">
          <el-form-item label="购入时间" prop="buyDate">
            <el-date-picker
              v-model="param.buyDate"
              type="date"
              value-format="yyyy-MM-dd"
              placeholder="选择日期">
            </el-date-picker>
          </el-form-item>
        </div>
        <div style="width: 31%;">
          <el-form-item label="设备状态" prop="status">
            <el-select v-model="param.status" filterable>
              <el-option :value="0" label="正常"></el-option>
              <el-option :value="1" label="损坏"></el-option>
              <el-option :value="2" label="报废"></el-option>
            </el-select>
          </el-form-item>
        </div>
        <div style="width: 100%;">
          <el-form-item label="运维内容" prop="content">
            <el-input type="textarea" :rows="4" v-model="param.content" placeholder="请输入" />
          </el-form-item>
        </div>
        <div style="width: 100%;">
          <el-form-item label="照片" prop="">
            <UploadAvatarImage :file="{ 'imgurlfull': param.fileFullUrl, 'imgurl': param.fileUrl }"
             :uploadData="{ folder: 'ywDevice/' }" @uploadSuccess="uploadAvatarSuccess" @uploadEnd="isUploading = false"
             @uploadBegin="isUploading = true" />
            <div style="width: 100%; height: 40px;"></div>
          </el-form-item>
        </div>
        <div style="width: 100%;">
          <el-form-item label="附件" prop="multifileList">
            <div style="display: flex; flex-direction: column; align-items: flex-start;">
              <el-button type="text" @click="$refs.uploadFile.click()">+添加附件</el-button>
              <el-table
                :data="param.multifileList"
                border
                style="width: 100%">
                <el-table-column
                  prop="name"
                  label="附件名称">
                </el-table-column>
                <el-table-column
                  prop="createUserName"
                  label="操作人">
                </el-table-column>
                <el-table-column
                  prop="createTime"
                  label="操作时间">
                </el-table-column>
                <el-table-column
                  label="操作">
                  <template slot-scope="scope">
                    <el-button type="text" @click="deleFile(scope.$index)">删除</el-button>
                  </template>
                </el-table-column>
              </el-table>
            </div>
          </el-form-item>
        </div>
        <div class="title">供应商信息</div>
        <div style="width: 31%;">
          <el-form-item label="供应商" prop="supplier">
            <el-input v-model="param.supplier" placeholder="请输入" v-trim />
          </el-form-item>
        </div>
        <div style="width: 31%;">
          <el-form-item label="联系人" prop="supplierLinker">
            <el-input v-model="param.supplierLinker" placeholder="请输入" v-trim />
          </el-form-item>
        </div>
        <div style="width: 31%;">
          <el-form-item label="联系方式" prop="supplierPhone">
            <el-input v-model="param.supplierPhone" placeholder="请输入" v-trim />
          </el-form-item>
        </div>
        <div class="title">维保信息</div>
        <div style="width: 31%;">
          <el-form-item label="维保负责人" prop="maintenanceUserId">
            <el-select v-model="param.maintenanceUserId" clearable filterable>
              <el-option v-for="item in staffList" :label="item.realname" :value="item.id"></el-option>
            </el-select>
          </el-form-item>
        </div>
        <div style="width: 31%;">
          <el-form-item label="维保到期日" prop="maintenanceOverDate">
            <el-date-picker
              v-model="param.maintenanceOverDate"
              type="date"
              value-format="yyyy-MM-dd"
              placeholder="选择日期">
            </el-date-picker>
          </el-form-item>
        </div>
        <div style="width: 31%;"></div>
        <div style="width: 100%;">
          <el-form-item label="维保说明" prop="maintenanceContent">
            <el-input v-model="param.maintenanceContent" type="textarea" placeholder="请输入" v-trim />
          </el-form-item>
        </div>
      </div>
    </el-form>
    <input type="file" ref="uploadFile" style="position: fixed; top: -20px; left: 0;" @change="getFile" />
  </GlobalWindow>
</template>
@@ -56,7 +174,10 @@
import { fetchList } from '@/api/business/category'
import { create, updateById, detailById } from '@/api/Inspection/device'
import { getUserList } from '@/api/system/user'
import { Message } from 'element-ui'
import { uploadBatch } from '@/api/system/common'
import { getProjectList, tree } from '@/api/project/ywProject'
import { Loading, Message } from 'element-ui'
import { mapState } from 'vuex'
export default {
  components: { GlobalWindow, UploadAvatarImage },
  data() {
@@ -64,22 +185,126 @@
      isShowModal: false,
      subLoading: false,
      param: {
        status: 0
        code: '',
        name: '',
        modelNo: '',
        cateIds: '',
        userId: '',
        addr: '',
        projectId: '',
        rooms: [],
        buildingId: '',
        floorId: '',
        roomId: '',
        supplier: [],
        buyDate: '',
        content: '',
        supplierLinker: '',
        supplierPhone: '',
        maintenanceUserId: '',
        maintenanceOverDate: '',
        maintenanceContent: '',
        status: 0,
        multifileList: []
      },
      cateList: [],
      rules: {
        name: [{ required: true, message: '请输入' }],
        code: [{ required: true, message: '请输入' }],
        cateId: [{ required: true, message: '请选择' }],
        name: [{ required: true, message: '请输入', trigger: 'blur' }],
        code: [{ required: true, message: '请输入', trigger: 'blur' }],
        cateId: [{ required: true, message: '请选择', trigger: 'blur' }],
        projectId: [{ required: true, message: '请选择', trigger: 'blur' }],
        rooms: [{ required: true, message: '请选择', trigger: 'blur' }]
      },
      staffList: []
      loadings: false,
      cateList: [],
      houseList: [],
      staffList: [],
      projectList: []
    }
  },
  computed: {
    ...mapState(['userInfo'])
  },
  created() {
    this.initData()
    this.getProjectLists()
    console.log(this.userInfo)
  },
  methods: {
    getHouseVal(e) {
      this.param.buildingId = e[1]
      this.param.floorId = e[2]
      this.param.roomId = e[3]
    },
    changeProject(e) {
      this.getHouseTree()
    },
    getHouseTree() {
      tree({
        projectId: this.param.projectId
      }).then(res => {
        this.addParamToArray(res)
        this.houseList = res
      })
    },
    addParamToArray(arr) {
      for (let i = 0; i < arr.length; i++) {
        const currentItem = arr[i].projectDataVOList
        if (currentItem && currentItem.length >= 0) {
          currentItem.forEach(item => {
            if (item.lv === 3) {
              delete item.projectDataVOList
            }
          })
        }
        if (currentItem && currentItem.length > 0) {
          this.addParamToArray(currentItem)
        }
      }
    },
    deleFile(index) {
      this.param.multifileList.splice(index, 1)
    },
    // 获取项目
    getProjectLists() {
      getProjectList({})
        .then(res => {
          this.projectList = res
        })
    },
    // 上传附件
    getFile(e) {
      this.loadings = Loading.service({
        lock: true,
        text: 'Loading',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)'
      })
      let formDate = new FormData()
      formDate.append('folder', 'YW_DEVICE')
      formDate.append('file', e.target.files[0])
      uploadBatch(formDate)
        .then(res => {
          this.param.multifileList.push({ ...res[0], fileurl: res[0].imgaddr, name: res[0].originname, createUserName: this.userInfo.realname, createTime: this.getDate() })
        })
        .finally(() => {
          e.target.files = null
          this.loadings.close()
        })
    },
    getDate() {
      const currentDate = new Date();
      const year = currentDate.getFullYear(); // 获取当前年份
      const month = currentDate.getMonth() + 1; // 获取当前月份 (0-11,所以需要 +1)
      const day = currentDate.getDate(); // 获取当前日期
      const hours = currentDate.getHours(); // 获取当前小时
      const minutes = currentDate.getMinutes(); // 获取当前分钟
      const seconds = currentDate.getSeconds(); // 获取当前秒钟
      return `${year}-${month < 10 ? '0' + month : month}-${day < 10 ? '0' + day : day} `
              + `${hours < 10 ? '0' + hours : hours}:${minutes < 10 ? '0' + minutes : minutes}:${seconds < 10 ? '0' + seconds : seconds}`;
    },
    handleSub() {
      const { param, subLoading } = this
      this.$refs['paramRef'].validate((valid) => {
@@ -100,6 +325,15 @@
    getDetail(id) {
      detailById(id).then(res => {
        this.param = res
        this.param.rooms = [res.projectId, res.buildingId, res.floorId, res.roomId]
        this.param.multifileList = res.multifileList.map(item => {
          return {
            ...item,
            createUserName: item.userName,
            createTime: item.createDate
          }
        })
        this.getHouseTree()
        const cateId = this.param.cateId || ''
        setTimeout(() => {
          if (cateId) {
@@ -108,7 +342,6 @@
                item.childCategoryList.forEach(item2 => {
                  if (item2.id == cateId) {
                    this.$set(this.param, 'cateIds', [item.id, item2.id])
                    console.log('cateId', this.form)
                  }
                })
              }
@@ -149,4 +382,17 @@
    }
  }
}
</script>
</script>
<style lang="scss" scoped>
  @import '@/assets/style/variables.scss';
  .title {
    width: 100%;
    font-weight: 500;
    font-size: 18px;
    color: $primary-color;
    margin-bottom: 10px;
    display: flex;
    align-items: center;
  }
</style>
admin/src/views/operation/device.vue
@@ -120,8 +120,6 @@
      this.$nextTick(() => {
        this.$refs.EditRef.isShowModal = true
        if (row && row.id) {
          console.log('---')
          this.$refs.EditRef.getDetail(row.id)
        }
      })
admin/src/views/project/components/houseDetails.vue
@@ -1,11 +1,16 @@
<template>
    <GlobalWindow
        title="楼宇详情"
        :title="title"
        :showConfirm="false"
        :visible.sync="visible"
        width="800px">
        width="100%">
        <div class="right">
            <div class="right_head">项目名称</div>
            <div class="right_head">
                <span>{{info.roomNum}}</span>
                <el-tag type="success" v-if="info.leaseStatus === 0">待租赁</el-tag>
                <el-tag type="success" v-if="info.leaseStatus === 1">已租赁</el-tag>
                <el-tag type="success" v-if="info.leaseStatus === 2">未开启租赁</el-tag>
            </div>
            <div class="right_cate">
                <el-tabs v-model="activeName" @tab-click="handleClick">
                    <el-tab-pane label="房源信息" name="houseinfo">
@@ -17,39 +22,40 @@
                                <div class="xm_info">
                                    <div class="xm_info_row" style="width: 25%;">
                                        <span>所属项目</span>
                                        <span>XXXXXXXXXX</span>
                                        <span>{{info.projectName}}</span>
                                    </div>
                                    <div class="xm_info_row" style="width: 25%;">
                                        <span>楼宇</span>
                                        <span>综合楼</span>
                                        <span>{{info.buildingName}}</span>
                                    </div>
                                    <div class="xm_info_row" style="width: 25%;">
                                        <span>楼层</span>
                                        <span>1</span>
                                        <span>{{info.floorName}}</span>
                                    </div>
                                    <div class="xm_info_row" style="width: 25%;">
                                        <span>房号</span>
                                        <span>101活动室</span>
                                        <span>{{info.roomNum}}</span>
                                    </div>
                                    <div class="xm_info_row" style="width: 25%; margin-top: 15px;">
                                        <span>房间编号</span>
                                        <span>101</span>
                                        <span>{{info.code}}</span>
                                    </div>
                                    <div class="xm_info_row" style="width: 25%; margin-top: 15px;">
                                        <span>是否招商</span>
                                        <span>否</span>
                                        <span v-if="info.isInvestment === 0">否</span>
                                        <span v-if="info.isInvestment === 1">是</span>
                                    </div>
                                    <div class="xm_info_row" style="width: 25%; margin-top: 15px;">
                                        <span>建筑面积</span>
                                        <span>50㎡</span>
                                        <span>{{info.area}}㎡</span>
                                    </div>
                                    <div class="xm_info_row" style="width: 25%; margin-top: 15px;">
                                        <span>计租面积</span>
                                        <span>50㎡</span>
                                        <span>{{info.rentArea}}㎡</span>
                                    </div>
                                    <div class="xm_info_row" style="width: 25%; margin-top: 15px;">
                                        <span>计费面积</span>
                                        <span>45㎡</span>
                                        <span>{{info.feeArea}}㎡</span>
                                    </div>
                                </div>
                            </el-card>
@@ -62,37 +68,51 @@
                                    <span>当前在租合同</span>
                                </div>
                                <div class="xm_table">
                                    <el-input v-model="input" style="width: 300px; margin-bottom: 15px;" placeholder="请输入合同编号"></el-input>
                                    <div style="width: 100%; display: flex; align-items: center; margin-bottom: 15px;">
                                        <el-input v-model="form.code" style="width: 300px;" placeholder="请输入合同编号"></el-input>
                                        <el-button type="primary" style="margin-left: 15px;" @click="getTenantContract()">搜索</el-button>
                                    </div>
                                    <el-table
                                        :data="tableData"
                                        border
                                        v-loading="loading"
                                        style="width: 100%">
                                        <el-table-column
                                            prop="date"
                                            label="合同编号">
                                            <template slot-scope="{row}">
                                                <el-button type="text" @click="$refs.ContractDetailRef.open('合同详情', row.id)" v-if="row.status === 1">{{row.code}}</el-button>
                                                <el-button type="text" v-else>{{row.code}}</el-button>
                                            </template>
                                        </el-table-column>
                                        <el-table-column
                                            prop="name"
                                            prop="renterName"
                                            label="客户名称">
                                        </el-table-column>
                                        <el-table-column
                                            prop="address"
                                            prop="startDate"
                                            label="开始日期">
                                        </el-table-column>
                                        <el-table-column
                                            prop="address"
                                            prop="endDate"
                                            label="结束日期">
                                        </el-table-column>
                                        <el-table-column
                                            prop="address"
                                            label="租赁单价">
                                            <template slot-scope="{row}">
                                                <div style="display: flex; align-items: center;">
                                                    <span>{{row.zlFirstPrice || row.wyFirstPrice}}</span>
                                                    <span>{{row.zlFirstCircleStr || row.wyFirstCircleStr}}</span>
                                                </div>
                                            </template>
                                        </el-table-column>
                                        <el-table-column
                                            prop="address"
                                            label="租赁面积(㎡)">
                                            <template slot-scope="{row}">
                                                {{row.totalArea}}㎡
                                            </template>
                                        </el-table-column>
                                        <el-table-column
                                            prop="address"
                                            prop="signDate"
                                            label="签订日">
                                        </el-table-column>
                                        <el-table-column
@@ -100,8 +120,14 @@
                                            label="合同来源">
                                        </el-table-column>
                                        <el-table-column
                                            prop="address"
                                            label="合同状态">
                                            <template slot-scope="{row}">
                                                <span class="primaryColor" v-if="row.status === 0">待执行</span>
                                                <span class="green" v-if="row.status === 1">正常执行中</span>
                                                <span class="gary" v-if="row.status === 2">已到期</span>
                                                <span class="gary" v-if="row.status === 3">退租结算中</span>
                                                <span class="gary" v-if="row.status === 4">已退租</span>
                                            </template>
                                        </el-table-column>
                                    </el-table>
                                    <div class="xm_table_f">
@@ -125,84 +151,93 @@
                                <div class="xm_one1">
                                    <div class="xm_one_row">
                                        <span>待指派数量</span>
                                        <span>15</span>
                                        <span>{{numObj.waitAssignAmount || 0}}</span>
                                    </div>
                                    <div class="xm_one_row">
                                        <span>待处理数量</span>
                                        <span>15</span>
                                        <span>{{numObj.waitDealAmount || 0}}</span>
                                    </div>
                                    <div class="xm_one_row">
                                        <span>本月工单数</span>
                                        <span>15</span>
                                        <span>{{numObj.monthAmount || 0}}</span>
                                    </div>
                                    <div class="xm_one_row">
                                        <span>累计工单数</span>
                                        <span>15</span>
                                        <span>{{numObj.amount || 0}}</span>
                                    </div>
                                </div>
                            </el-card>
                            <el-card style="margin-top: 20px;">
                                <div class="xm_table">
                                    <div class="xm_table_search">
                                        <el-select v-model="value" style="width: 300px; margin-right: 15px;" placeholder="位置类型">
                                            <el-option
                                                    v-for="item in options"
                                                    :key="item.value"
                                                    :label="item.label"
                                                    :value="item.value">
                                            </el-option>
                                        </el-select>
                                        <el-select v-model="value" style="width: 300px;" placeholder="工单分类">
                                            <el-option
                                                    v-for="item in options"
                                                    :key="item.value"
                                                    :label="item.label"
                                                    :value="item.value">
                                            </el-option>
                                        </el-select>
                                        <div>
                                            <el-cascader style="width: 150px; margin-right: 15px;" v-model="form.areaIds" @change="changeSel" placeholder="请选择工单分类" clearable
                                                :options="cateList" :props="{
                                                    label: 'name',
                                                    value: 'id',
                                                    children: 'childCategoryList'
                                                }" />
                                            <el-select v-model="form.status" style="width: 150px; margin-right: 15px;" placeholder="工单状态">
                                                <el-option label="启用" :value="0"></el-option>
                                                <el-option label="禁用" :value="1"></el-option>
                                            </el-select>
                                            <el-button type="primary" @click="getFetchList">查询</el-button>
                                            <el-button @click="clear">清空</el-button>
                                        </div>
                                        <el-button type="primary" @click="$refs.operaYwWorkorderWindow.open('新建工单')">新增工单</el-button>
                                    </div>
                                    <el-table
                                            :data="tableData"
                                            border
                                            style="width: 100%">
                                        :data="tableData"
                                        border
                                        v-loading="loading"
                                        style="width: 100%">
                                        <el-table-column
                                                prop="date"
                                                label="工单分类">
                                            prop="categoryName"
                                            label="工单分类">
                                        </el-table-column>
                                        <el-table-column
                                                prop="name"
                                                label="报修区域">
                                            label="报修区域">
                                            <template v-slot="scope">
                                                <span>{{ scope.row.buildingName }} / {{ scope.row.areaType == 0 ? scope.row.roomNum : scope.row.floorName
                                                  }}</span>
                                            </template>
                                        </el-table-column>
                                        <el-table-column
                                                prop="address"
                                                label="上报人">
                                            prop="creatorName"
                                            label="上报人">
                                        </el-table-column>
                                        <el-table-column
                                                prop="address"
                                                label="上报时间">
                                            prop="createDate"
                                            label="上报时间">
                                        </el-table-column>
                                        <el-table-column
                                                prop="address"
                                                label="处理人">
                                            prop="dealUserName"
                                            label="处理人">
                                        </el-table-column>
                                        <el-table-column
                                                prop="address"
                                                label="工单状态">
                                            label="工单状态">
                                            <template slot-scope="{row}">
                                                <span v-if="row.dealStatus === 0">待指派</span>
                                                <span v-if="row.dealStatus === 1">已指派</span>
                                                <span v-if="row.dealStatus === 2">已处理</span>
                                            </template>
                                        </el-table-column>
                                        <el-table-column
                                                prop="address"
                                                label="操作">
                                            label="操作">
                                            <template slot-scope="{row}">
                                                <el-button type="text" @click="handleDetail(row)">查看详情</el-button>
                                            </template>
                                        </el-table-column>
                                    </el-table>
                                    <div class="xm_table_f">
                                        <el-pagination
                                                @size-change="handleSizeChange"
                                                @current-change="handleCurrentChange"
                                                :current-page="page"
                                                :page-sizes="[10, 20, 30, 40]"
                                                :page-size="pageTotal"
                                                layout="total, sizes, prev, pager, next, jumper"
                                                :total="total">
                                            @size-change="handleSizeChange"
                                            @current-change="handleCurrentChange"
                                            :current-page="page"
                                            :page-sizes="[10, 20, 30, 40]"
                                            :page-size="pageTotal"
                                            layout="total, sizes, prev, pager, next, jumper"
                                            :total="total">
                                        </el-pagination>
                                    </div>
                                </div>
@@ -223,62 +258,64 @@
                                <div class="xm_table">
                                    <div class="xm_table_search">
                                        <div class="xm_table_search_left">
                                            <el-input v-model="input" placeholder="请输入设备名称/编码" style="width: 200px; margin-right: 15px;"></el-input>
                                            <el-select v-model="value" style="width: 200px; margin-right: 15px;" placeholder="设备状态">
                                                <el-option
                                                        v-for="item in options"
                                                        :key="item.value"
                                                        :label="item.label"
                                                        :value="item.value">
                                                </el-option>
                                            <el-input v-model="form.name" placeholder="请输入设备名称/编码" style="width: 200px; margin-right: 15px;"></el-input>
                                            <el-select v-model="form.status" style="width: 150px; margin-right: 15px;" placeholder="设备状态">
                                                <el-option label="正常" :value="0"></el-option>
                                                <el-option label="损坏" :value="1"></el-option>
                                                <el-option label="报废" :value="2"></el-option>
                                            </el-select>
                                            <el-button type="primary">查询</el-button>
                                            <el-button>清空</el-button>
                                            <el-button type="primary" @click="getDevicePage">查询</el-button>
                                            <el-button @click="clear">清空</el-button>
                                        </div>
                                        <el-button type="primary">新增</el-button>
                                        <el-button type="primary" @click="handleEdit">新增</el-button>
                                    </div>
                                    <el-table
                                            :data="tableData"
                                            border
                                            style="width: 100%">
                                        :data="tableData"
                                        border
                                        v-loading="loading"
                                        style="width: 100%">
                                        <el-table-column
                                                prop="date"
                                                label="工单分类">
                                            prop="code"
                                            label="设备编码">
                                        </el-table-column>
                                        <el-table-column
                                                prop="name"
                                                label="报修区域">
                                            prop="name"
                                            label="设备名称">
                                        </el-table-column>
                                        <el-table-column
                                                prop="address"
                                                label="上报人">
                                            prop="categoryName"
                                            label="设备分类">
                                        </el-table-column>
                                        <el-table-column
                                                prop="address"
                                                label="上报时间">
                                            prop="modelNo"
                                            label="设备型号">
                                        </el-table-column>
                                        <el-table-column
                                                prop="address"
                                                label="处理人">
                                            prop="realName"
                                            label="设备管理员">
                                        </el-table-column>
                                        <el-table-column
                                                prop="address"
                                                label="工单状态">
                                            prop="supplier"
                                            label="设备供应商">
                                        </el-table-column>
                                        <el-table-column
                                                prop="address"
                                                label="操作">
                                            label="设备状态">
                                            <template slot-scope="{row}">
                                                <span v-if="row.status === 0">正常</span>
                                                <span v-if="row.status === 1">损坏</span>
                                                <span v-if="row.status === 2">报废</span>
                                            </template>
                                        </el-table-column>
                                    </el-table>
                                    <div class="xm_table_f">
                                        <el-pagination
                                                @size-change="handleSizeChange"
                                                @current-change="handleCurrentChange"
                                                :current-page="page"
                                                :page-sizes="[10, 20, 30, 40]"
                                                :page-size="pageTotal"
                                                layout="total, sizes, prev, pager, next, jumper"
                                                :total="total">
                                            @size-change="handleSizeChange"
                                            @current-change="handleCurrentChange"
                                            :current-page="page"
                                            :page-sizes="[10, 20, 30, 40]"
                                            :page-size="pageTotal"
                                            layout="total, sizes, prev, pager, next, jumper"
                                            :total="total">
                                        </el-pagination>
                                    </div>
                                </div>
@@ -294,62 +331,65 @@
                                <div class="xm_table">
                                    <div class="xm_table_search">
                                        <div class="xm_table_search_left">
                                            <el-input v-model="input" placeholder="请输入资产名称/编码" style="width: 200px; margin-right: 15px;"></el-input>
                                            <el-input v-model="form.code" placeholder="请输入资产名称/编码" style="width: 200px; margin-right: 15px;"></el-input>
                                            <el-select v-model="value" style="width: 200px; margin-right: 15px;" placeholder="资产分类">
                                                <el-option
                                                        v-for="item in options"
                                                        :key="item.value"
                                                        :label="item.label"
                                                        :value="item.value">
                                                    v-for="item in options"
                                                    :key="item.value"
                                                    :label="item.label"
                                                    :value="item.value">
                                                </el-option>
                                            </el-select>
                                            <el-button type="primary">查询</el-button>
                                            <el-button>清空</el-button>
                                            <el-button type="primary" @click="getPropertyLists">查询</el-button>
                                            <el-button @click="clear">清空</el-button>
                                        </div>
                                        <el-button type="primary">新增</el-button>
                                        <el-button type="primary" @click="$refs.newMaterial.open('新建物料')">新增</el-button>
                                    </div>
                                    <el-table
                                            :data="tableData"
                                            border
                                            style="width: 100%">
                                        :data="tableData"
                                        border
                                        v-loading="loading"
                                        style="width: 100%">
                                        <el-table-column
                                                prop="date"
                                                label="资产编码">
                                            prop="code"
                                            label="资产编码">
                                        </el-table-column>
                                        <el-table-column
                                                prop="name"
                                                label="资产名称">
                                            prop="name"
                                            label="资产名称">
                                        </el-table-column>
                                        <el-table-column
                                                prop="address"
                                                label="条码">
                                            prop="qrcode"
                                            label="条码">
                                        </el-table-column>
                                        <el-table-column
                                                prop="address"
                                                label="品牌">
                                            prop="brand"
                                            label="品牌">
                                        </el-table-column>
                                        <el-table-column
                                                prop="address"
                                                label="规格型号">
                                            prop="attr"
                                            label="规格型号">
                                        </el-table-column>
                                        <el-table-column
                                                prop="address"
                                                label="单位">
                                            prop="unitName"
                                            label="单位">
                                        </el-table-column>
                                        <el-table-column
                                                prop="address"
                                                label="库存数量">
                                            label="库存数量">
                                            <template v-slot="scope">
                                                <span>{{ scope.row.maxStock }} ~ {{ scope.row.minStock }}</span>
                                            </template>
                                        </el-table-column>
                                    </el-table>
                                    <div class="xm_table_f">
                                        <el-pagination
                                                @size-change="handleSizeChange"
                                                @current-change="handleCurrentChange"
                                                :current-page="page"
                                                :page-sizes="[10, 20, 30, 40]"
                                                :page-size="pageTotal"
                                                layout="total, sizes, prev, pager, next, jumper"
                                                :total="total">
                                            @size-change="handleSizeChange"
                                            @current-change="handleCurrentChange"
                                            :current-page="page"
                                            :page-sizes="[10, 20, 30, 40]"
                                            :page-size="pageTotal"
                                            layout="total, sizes, prev, pager, next, jumper"
                                            :total="total">
                                        </el-pagination>
                                    </div>
                                </div>
@@ -359,34 +399,222 @@
                </el-tabs>
            </div>
        </div>
        <!--    合同详情    -->
        <ContractDetail ref="ContractDetailRef" />
        <!--    工单详情    -->
        <Detail v-if="showDetail" ref="DetailRef" @close="showDetail = false" />
        <!--    新建工单    -->
        <OperaYwWorkorderWindow ref="operaYwWorkorderWindow" @success="getFetchList" />
        <!--    新建设备    -->
        <Edit v-if="showEdit1" ref="EditRef" @success="getDevicePage" @close="showEdit1 = false" />
        <!--    新建资产    -->
        <newMaterial ref="newMaterial" @success="getPropertyLists" />
    </GlobalWindow>
</template>
<script>
  import BaseOpera from '@/components/base/BaseOpera'
  import GlobalWindow from '@/components/common/GlobalWindow'
  import newMaterial from '../../stock/components/newMaterial'
  import * as echarts from 'echarts';
  import { detailById } from '@/api/project/ywRoom'
  import { fetchList as TenantContract } from '@/api/contract'
  import { getDataVO, fetchList } from '@/api/workorder/ywWorkorder'
  import ContractDetail from '../../contract/components/contractDetail'
  import { fetchList as getCateList } from '@/api/business/category.js'
  import { fetchList as getPropertyList } from '@/api/ywMaterial'
  import { getDeviceStatus, getDeviceCateData, fetchList as devicePage } from '@/api/Inspection/device'
  import Detail from '../../workorder/components/detail'
  import OperaYwWorkorderWindow from '../../workorder/components/OperaYwWorkorderWindow'
  import Edit from '../../operation/components/deviceEdit'
  export default {
    name: "houseDetails",
    extends: BaseOpera,
    components: { GlobalWindow },
    components: { GlobalWindow, ContractDetail, Detail, OperaYwWorkorderWindow, Edit, newMaterial },
    data() {
      return {
        info: {},
        houseId: '',
        propsName: '',
        activeName: 'houseinfo',
        total: 0,
        pageTotal: 10,
        page: 1,
        tableData: []
        numObj: {},
        tableData: [],
        loading: false,
        form: {
          code: '',
          areaIds: [],
          cateId: '',
          status: '',
          name: ''
        },
        cateList: [],
        categaryList: [],
        deviceList: [],
        showDetail: false,
        showEdit1: false
      }
    },
    methods: {
      open (title, target) {
      open (title, id) {
        this.title = title
        this.visible = true
        this.houseId = id
        detailById(id)
          .then(res => {
            this.info = res
            this.visible = true
          })
      },
      handleEdit(row) {
        this.showEdit1 = true
        this.$nextTick(() => {
          this.reand()
          this.reand1()
          this.$refs.EditRef.isShowModal = true
        })
      },
      handleDetail(row) {
        this.showDetail = true
        this.$nextTick(() => {
          this.$refs.DetailRef.visible = true
          this.$refs.DetailRef.id = row.id
          this.$refs.DetailRef.getDetail()
        })
      },
      // 获取设备状态
      getDevice() {
        getDeviceStatus({ roomId: this.houseId })
            .then(res => {
              this.$nextTick(() => {
                this.deviceList = [
                  { value: res.workAmount || 0, name: '正常' },
                  { value: res.exceptionAmount || 0, name: '异常' },
                  { value: res.errAmount || 0, name: '报废' }
                ]
                this.reand()
              })
            })
      },
      // 设备数量分布统计
      getDeviceCateDatas() {
        getDeviceCateData({
          roomId: this.houseId
        }).then(res => {
          this.categaryList = res
          this.$nextTick(() => {
            this.reand1()
          })
        })
      },
      // 获取设备分页
      getDevicePage() {
        this.loading = true
        devicePage({
          capacity: this.pageTotal,
          page: this.page,
          model: {
            roomId: this.houseId,
            status: this.form.status,
            name: this.form.name
          }
        }).then(res => {
          this.tableData = res.records
          this.total = res.total
        }).finally(() => {
          this.loading = false
        })
      },
      // 获取资产列表
      getPropertyLists() {
        this.loading = true
        getPropertyList({
          capacity: this.pageTotal,
          page: this.page,
          model: {
            roomId: this.houseId,
            name: this.form.name
          }
        }).then(res => {
          this.tableData = res.records
          this.total = res.total
        }).finally(() => {
          this.loading = false
        })
      },
      getCate() {
        getCateList({
          model: { type: 3 },
          capacity: 1000,
          page: 1,
        }).then(res => {
          this.cateList = res.records || []
        })
      },
      changeSel(e) {
        if (e && e.length == 2) {
          this.$set(this.form, 'cateId', e[1])
        } else {
          this.$set(this.form, 'cateId', '')
        }
      },
      clear() {
        this.page = 1
        this.form.status = ''
        this.form.areaIds = []
        this.form.cateId = ''
        this.form.name = ''
        if (this.propsName === 'project') {
          this.getTenantContract()
        } else if (this.propsName === 'second') {
          this.getFetchList()
        } else if (this.propsName === 'third') {
          this.getDevicePage()
        } else if (this.propsName === 'fourth') {
          this.getPropertyLists()
        }
      },
      // 获取工单数
      getDataVOs() {
        getDataVO({
          queryId: this.houseId,
          queryType: 3
        }).then(res => {
          this.numObj = res
        })
      },
      // 获取工单列表
      getFetchList() {
        this.loading = true
        fetchList({
          capacity: 10,
          page: 1,
          model: {
            roomId: this.houseId,
            status: this.form.status,
            cateId: this.form.cateId
          }
        }).then(res => {
          this.tableData = res.records
          this.total = res.total
        }).finally(() => {
          this.loading = false
        })
      },
      // 获取合同分页
      getTenantContract() {
        this.loading = true
        TenantContract({
          capacity: this.pageTotal,
          page: this.page,
          model: {
            roomIds: [this.houseId],
            code: this.form.code
          }
        }).then(res => {
          this.tableData = res.records
          this.total = res.total
        }).finally(() => {
          this.loading = false
        })
      },
      reand() {
@@ -394,38 +622,29 @@
        var myChart = echarts.init(chartDom);
        var option;
        option = {
          title: {
            text: '设备状态'
          },
          tooltip: {
            trigger: 'item'
          },
          legend: {
            top: '5%',
            left: 'center'
            left: 'right',
            top: 'middle',
            width: '80'
          },
          series: [
            {
              name: 'Access From',
              name: '设备状态',
              type: 'pie',
              radius: ['40%', '80%'],
              avoidLabelOverlap: false,
              label: {
                show: false,
                position: 'center'
                show: true,
                position: 'center',
                fontWeight: 'bold',
                fontSize: 22
              },
              emphasis: {
                label: {
                  show: true,
                  fontSize: 40,
                  fontWeight: 'bold'
                }
              },
              labelLine: {
                show: false
              },
              data: [
                { value: 1048, name: '正常' },
                { value: 735, name: '异常' },
                { value: 580, name: '报废' }
              ]
              data: this.deviceList
            }
          ]
        };
@@ -435,7 +654,6 @@
        var chartDom = document.getElementById('chat2');
        var myChart = echarts.init(chartDom);
        var option;
        // There should not be negative values in rawData
        const rawData = [
          [100, 302, 301, 334, 390, 330, 320],
          [320, 132, 101, 134, 90, 230, 210],
@@ -451,12 +669,6 @@
          }
          totalData.push(sum);
        }
        const grid = {
          left: 100,
          right: 100,
          top: 50,
          bottom: 50
        };
        const series = [
          'Direct',
          'Mail Ad',
@@ -469,41 +681,103 @@
            type: 'bar',
            stack: 'total',
            barWidth: '60%',
            label: {
              show: true,
              formatter: (params) => Math.round(params.value * 1000) / 10 + '%'
            },
            data: rawData[sid].map((d, did) =>
              totalData[did] <= 0 ? 0 : d / totalData[did]
            )
          };
        });
        let seriesArr = this.categaryList.map(item => {
          return {
            name: item.cateName,
            type: 'bar',
            stack: 'total',
            barWidth: '60%',
            data: item.ywDeviceCateDataVOList.map((child) =>
              child.deviceAmount
            )
          }
        })
        let xAxisData = this.categaryList.map(item => item.cateName)
        console.log(series)
        console.log(seriesArr)
        console.log(xAxisData)
        option = {
          legend: {
            selectedMode: false
          title: {
            text: '设备数量分类统计'
          },
          grid,
          grid: {
            left: 50,
            right: 50,
            top: 50,
            bottom: 50
          },
          tooltip: {
            trigger: 'axis',
            axisPointer: {
              type: 'shadow'
            }
          },
          yAxis: {
            type: 'value'
          },
          xAxis: {
            type: 'category',
            data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
            data: xAxisData
          },
          series
          series: seriesArr
        };
        option && myChart.setOption(option);
      },
      handleClick(tab, event) {
        console.log(tab, event);
      handleClick(tab) {
        this.page = 1
        this.pageTotal = 10
        this.tableData = []
        this.total = 0
        this.form.code = ''
        this.form.areaIds = []
        this.form.cateId = ''
        this.form.status = ''
        this.form.name = ''
        this.propsName = tab._props.name
        if (tab._props.name === 'project') {
          this.getTenantContract()
        } else if (tab._props.name === 'second') {
          this.getDataVOs()
          this.getCate()
          this.getFetchList()
        } else if (tab._props.name === 'third') {
          this.getDevice()
          this.getDeviceCateDatas()
          this.getDevicePage()
        } else if (this.propsName === 'fourth') {
          this.getPropertyLists()
        }
      },
      handleCurrentChange(page) {
        this.page = page
        if (this.propsName === 'project') {
          this.getTenantContract()
        } else if (this.propsName === 'second') {
          this.getFetchList()
        } else if (tab._props.name === 'third') {
          this.getDevicePage()
        } else if (this.propsName === 'fourth') {
          this.getPropertyLists()
        }
      },
      handleSizeChange(pageTotal) {
        this.pageTotal = pageTotal
      },
        if (this.propsName === 'project') {
          this.getTenantContract()
        } else if (this.propsName === 'second') {
          this.getFetchList()
        } else if (tab._props.name === 'third') {
          this.getDevicePage()
        } else if (this.propsName === 'fourth') {
          this.getPropertyLists()
        }
      }
    }
  }
</script>
@@ -517,10 +791,13 @@
            width: 100%;
            padding: 20px;
            box-sizing: border-box;
            font-size: 16px;
            font-weight: bold;
            color: black;
            background: #ffffff;
            span {
                font-size: 16px;
                font-weight: bold;
                color: black;
                background: #ffffff;
                margin-right: 10px;
            }
        }
        .right_cate {
            width: 100%;
admin/src/views/project/housingList.vue
@@ -54,7 +54,7 @@
        <el-table-column v-if="containPermissions(['business:ywroom:update', 'business:ywroom:delete'])" label="操作"
          min-width="140" fixed="right">
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.houseDetails.open('房源详情')">查看详情</el-button>
            <el-button type="text" @click="$refs.houseDetails.open('房源详情', row.id)">查看详情</el-button>
            <el-button type="text" @click="editClick(row)" icon="el-icon-edit"
              v-permissions="['business:ywroom:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
admin/src/views/workorder/components/OperaYwWorkorderWindow.vue
@@ -3,32 +3,48 @@
    @confirm="confirm">
    <el-form :model="form" ref="form" :rules="rules">
      <el-form-item label="位置类型" prop="areaType">
        <el-select v-model="form.areaType">
          <el-option label="室内维修" value="0"></el-option>
          <el-option label="公共维修" value="1"></el-option>
        <el-select v-model="form.areaType" @change="changeType">
          <el-option label="室内维修" :value="0"></el-option>
          <el-option label="公共维修" :value="1"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="选择项目" prop="projectId">
        <el-select v-model="form.projectId" clearable filterable @change="getBuild">
          <el-option v-for="item in projectList" :label="item.name" :value="item.id" />
        </el-select>
      <el-form-item label="报修区域" prop="rooms">
        <el-cascader
          v-model="form.rooms"
          :disabled="![0,1].includes(form.areaType)"
          ref="cascader"
          @change="getHouseVal"
          placeholder="请选择报修区域"
          :options="form.areaType === 0 ? houseList : houseList1"
          :props="{
              label: 'name',
              value: 'id',
              children: 'projectDataVOList'
          }" />
      </el-form-item>
      <el-form-item label="选择楼宇" prop="buildingId">
        <el-select v-model="form.buildingId" clearable filterable @change="changeBuild">
          <el-option v-for="item in buildList" :label="item.name" :value="item.id" />
        </el-select>
      </el-form-item>
<!--      <el-form-item label="选择项目" prop="projectId">-->
<!--        <el-select v-model="form.projectId" clearable filterable @change="getBuild">-->
<!--          <el-option v-for="item in projectList" :label="item.name" :value="item.id" />-->
<!--        </el-select>-->
<!--      </el-form-item>-->
<!--      <el-form-item label="选择楼宇" prop="buildingId">-->
<!--        <el-select v-model="form.buildingId" clearable filterable @change="changeBuild">-->
<!--          <el-option v-for="item in buildList" :label="item.name" :value="item.id" />-->
<!--        </el-select>-->
<!--      </el-form-item>-->
      <el-form-item v-if="form.areaType == 1" label="选择楼层" prop="floorId">
        <el-select v-model="form.floorId">
          <el-option v-for="item in levelList" clearable filterable :label="item.name" :value="item.id" />
        </el-select>
      </el-form-item>
      <el-form-item v-if="form.areaType == 0" label="选择房间" prop="roomId">
        <el-select v-model="form.roomId" clearable filterable>
          <el-option v-for="item in roomList" :label="item.roomNum" :value="item.id" />
        </el-select>
      </el-form-item>
<!--      <el-form-item v-if="form.areaType == 1" label="选择楼层" prop="floorId">-->
<!--        <el-select v-model="form.floorId">-->
<!--          <el-option v-for="item in levelList" clearable filterable :label="item.name" :value="item.id" />-->
<!--        </el-select>-->
<!--      </el-form-item>-->
<!--      <el-form-item v-if="form.areaType == 0" label="选择房间" prop="roomId">-->
<!--        <el-select v-model="form.roomId" clearable filterable>-->
<!--          <el-option v-for="item in roomList" :label="item.roomNum" :value="item.id" />-->
<!--        </el-select>-->
<!--      </el-form-item>-->
      <el-form-item label="工单分类" prop="cateId">
        <el-cascader v-model="form.areaIds" @change="changeSel" placeholder="请选择分类" clearable :options="cateList"
          :props="{
@@ -63,8 +79,6 @@
        <el-input type="textarea" :rows="4" v-model="form.content" placeholder="请输入" :maxlength="300" v-trim />
      </el-form-item>
    </el-form>
    <!--  -->
  </GlobalWindow>
</template>
@@ -72,7 +86,7 @@
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { Loading, Message } from 'element-ui'
import { getProjectList } from '@/api/project/ywProject'
import { getProjectList, tree } from '@/api/project/ywProject'
import { getBuildList } from '@/api/project/ywBuilding'
import { getRoomList } from '@/api/project/ywRoom'
import { getFloorList } from '@/api/project/yeFloor'
@@ -87,6 +101,9 @@
      // 表单数据
      form: {
        id: null,
        rooms: [],
        editDate: '',
        floor: '',
        title: '',
@@ -102,7 +119,7 @@
        userId: '',
        submitDate: '',
        cateId: '',
        areaType: '0',
        areaType: 0,
        code: '',
        dealStatus: '',
        dispatchUserId: '',
@@ -113,6 +130,8 @@
        dealInfo: '',
        dealType: ''
      },
      houseList: [],
      houseList1: [],
      loadingInstance: null,
      // 验证规则
      rules,
@@ -140,7 +159,8 @@
      this.visible = true
      this.getProject()
      this.getCate()
      // 新建
      this.getHouseTree()
      // 新建
      if (target == null) {
        this.form = {
          id: null,
@@ -159,7 +179,7 @@
          userId: '',
          submitDate: '',
          cateId: '',
          areaType: '0',
          areaType: 0,
          code: '',
          dealStatus: '',
          dispatchUserId: '',
@@ -185,6 +205,65 @@
          this.form[key] = target[key]
        }
      })
    },
    changeType(e) {
      this.form.rooms = []
      this.form.projectId = ''
      this.form.buildingId = ''
      this.form.levelList = ''
      this.form.roomId = ''
    },
    getHouseVal(e) {
      if (this.form.areaType === 0) {
        this.form.projectId = e[0]
        this.form.buildingId = e[1]
        this.form.floorId = e[2]
        this.form.roomId = e[3]
      } else {
        this.form.projectId = e[0]
        this.form.buildingId = e[1]
        this.form.floorId = e[2]
      }
    },
    getHouseTree() {
      tree({}).then(res => {
        let arr1 = JSON.parse(JSON.stringify(res))
        let arr2 = JSON.parse(JSON.stringify(res))
        this.addParamToArray(arr1)
        this.addParamToArray1(arr2)
        this.houseList = arr1
        this.houseList1 = arr2
      })
    },
    addParamToArray(arr) {
      for (let i = 0; i < arr.length; i++) {
        const currentItem = arr[i].projectDataVOList
        if (currentItem && currentItem.length >= 0) {
          currentItem.forEach(item => {
            if (item.lv === 3) {
              delete item.projectDataVOList
            }
          })
        }
        if (currentItem && currentItem.length > 0) {
          this.addParamToArray(currentItem)
        }
      }
    },
    addParamToArray1(arr) {
      for (let i = 0; i < arr.length; i++) {
        const currentItem = arr[i].projectDataVOList
        if (currentItem && currentItem.length >= 0) {
          currentItem.forEach(item => {
            if (item.lv === 2) {
              delete item.projectDataVOList
            }
          })
        }
        if (currentItem && currentItem.length > 0) {
          this.addParamToArray1(currentItem)
        }
      }
    },
    close() {
      this.visible = false
@@ -347,4 +426,4 @@
    }
  }
}
</style>
</style>
admin/src/views/workorder/components/detail.vue
@@ -1,5 +1,5 @@
<template>
  <GlobalWindow width="960px" title="工单详情" :visible.sync="visible" :confirm-working="isWorking" @close="close"
  <GlobalWindow width="100%" title="工单详情" :visible.sync="visible" :confirm-working="isWorking" @close="close"
    @confirm="confirm">
    <div class="main">
      <div class="title">
@@ -11,7 +11,7 @@
            <div class="status gray" v-if="info.dealStatus == 2">已处理</div>
          </div>
        </div>
        <el-button>查看问题上报</el-button>
        <el-button v-if="info.origin === 1" @click="openWT">查看问题上报</el-button>
      </div>
      <div class="main_content">
        <div class="list">
@@ -26,6 +26,11 @@
          <div class="item">
            <div class="la">工单分类</div>
            <div class="val">{{ info.categoryName }}</div>
          </div>
          <div class="item">
            <div class="la">来源</div>
            <div class="val" v-if="info.origin === 0">自建</div>
            <div class="val" v-if="info.origin === 1">问题转工单</div>
          </div>
          <div class="item">
            <div class="la">上报人</div>
@@ -167,19 +172,24 @@
        </template>
      </el-form>
    </div>
    <!--  问题上报详情  -->
    <problemReportingDetails ref="problemReportingDetails" />
  </GlobalWindow>
</template>
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
import BaseOpera from '@/components/base/BaseOpera'
import problemReportingDetails from './problemReportingDetails'
import { detailById, dispatchOrder, dealOrder } from '@/api/workorder/ywWorkorder'
import { getByWorkorderId } from '@/api/ywProblem'
import { getUserList } from '@/api/system/user'
import { Message, Loading } from 'element-ui'
import dayjs from 'dayjs'
export default {
  components: {
    GlobalWindow
    GlobalWindow,
    problemReportingDetails
  },
  extends: BaseOpera,
  data() {
@@ -212,6 +222,13 @@
    this.getStaff()
  },
  methods: {
    openWT() {
      getByWorkorderId(this.id)
        .then(res => {
          console.log(res)
          this.$refs.problemReportingDetails.open('问题上报详情', res)
        })
    },
    confirm() {
      this.$refs['form'].validate((valid) => {
        if (valid) {
admin/src/views/workorder/components/handleProblem.vue
@@ -1,95 +1,122 @@
<template>
    <GlobalWindow
        title="问题上报"
        :showConfirm="false"
        :title="title"
        :visible.sync="visible"
        width="100%">
        width="100%"
        @confirm="confirm">
        <div class="wt">
            <div class="wt_head">
                <div class="wt_head_title">
                    问题详情
                    <el-tag style="margin-left: 10px;">转工单</el-tag>
                    <div class="title">问题详情</div>
                    <el-tag style="margin-left: 10px;" v-if="info.dealStatus === 0">待处理</el-tag>
                    <el-tag style="margin-left: 10px;" v-if="info.dealStatus === 1">已转工单</el-tag>
                    <el-tag style="margin-left: 10px;" v-if="info.dealStatus === 2">已关闭</el-tag>
                </div>
                <el-button>查看工单</el-button>
            </div>
            <div class="wt_content">
                <div class="wt_content_row" style="width: 25%;">
                    位置:-
                    位置:{{info.position || '-'}}
                </div>
                <div class="wt_content_row" style="width: 25%;">
                    上报人:张三丰
                    上报人:{{info.name || '-'}}
                </div>
                <div class="wt_content_row" style="width: 50%;">
                    上报人电话:180553847234
                    上报人电话:{{info.phone || '-'}}
                </div>
                <div class="wt_content_row" style="width: 100%; margin-top: 15px;">
                    上报时间:2024-11-21 12:00:23
                    上报时间:{{info.submitDate || '-'}}
                </div>
                <div class="wt_content_row" style="width: 100%; margin-top: 15px;">
                    问题描述:这是问题描述这是问题描述这是问题描述这是问题描述这是问题描述这是问题描述这是问题描述这是问题描述
                    问题描述:{{info.content || '-'}}
                </div>
                <div class="wt_content_row" style="width: 100%; margin-top: 15px;">
                <div class="wt_content_row" style="width: 100%; margin-top: 15px; margin-bottom: 20px;">
                    <div class="wt_content_row_label">问题图片:</div>
                    <div class="wt_content_row_list">
                        <div class="wt_content_row_list_img">
                            <img src="" alt="" />
                    <div class="wt_content_row_list" v-if="info.fileList && info.fileList.length >= 0">
                        <div class="wt_content_row_list_img" v-for="(item, index) in info.fileList" :key="index">
                            <el-image
                                style="width: 100px; height: 100px"
                                :src="item.fileurlFull"
                                :preview-src-list="info.fileList.map(item => item.fileurlFull)">
                            </el-image>
                        </div>
                    </div>
                </div>
            </div>
            <el-form :model="form" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
                <el-form-item label="处理方式" prop="resource">
                    <el-radio-group v-model="form.resource">
                        <el-radio :label="0">转工单</el-radio>
                        <el-radio :label="1">关闭问题</el-radio>
            <el-form :model="form" :rules="rules" ref="form" label-width="100px" class="demo-ruleForm">
                <el-form-item label="处理方式" prop="dealStatus">
                    <el-radio-group v-model="form.dealStatus">
                        <el-radio :label="1">转工单</el-radio>
                        <el-radio :label="2">关闭问题</el-radio>
                    </el-radio-group>
                </el-form-item>
                <div style="display: flex; align-items: center;">
                    <el-form-item label="位置类型" prop="region">
                        <el-select v-model="form.resource" placeholder="请选择位置类型">
                            <el-option label="区域一" value="shanghai"></el-option>
                            <el-option label="区域二" value="beijing"></el-option>
                        </el-select>
                <template v-if="form.dealStatus === 1">
                    <div style="width: 100%; display: flex; align-items: center;">
                        <el-form-item label="位置类型" prop="workOrderAreaType">
                            <el-select v-model="form.workOrderAreaType" @change="changeType" placeholder="请选择位置类型">
                                <el-option label="室内维修" :value="0"></el-option>
                                <el-option label="公共区域" :value="1"></el-option>
                            </el-select>
                        </el-form-item>
                        <el-form-item label="报修区域" prop="rooms">
                            <el-cascader
                                v-model="form.rooms"
                                :disabled="![0,1].includes(form.workOrderAreaType)"
                                ref="cascader"
                                @change="getHouseVal"
                                placeholder="请选择报修区域"
                                :options="form.workOrderAreaType === 0 ? houseList : houseList1"
                                :props="{
                                    label: 'name',
                                    value: 'id',
                                    children: 'projectDataVOList'
                                }" />
                        </el-form-item>
                    </div>
                    <div style="width: 100%; display: flex; align-items: center;">
                        <el-form-item label="工单分类" prop="workOrderCateId">
                            <el-cascader v-model="form.workOrderCateId" @change="changeSel" placeholder="请选择分类" clearable :options="cateList"
                            :props="{
                            label: 'name',
                            value: 'id',
                            children: 'childCategoryList'
                          }"></el-cascader>
                        </el-form-item>
                        <el-form-item label="上门时间" prop="workOrderGetDate" v-if="form.workOrderAreaType === 0">
                            <el-date-picker
                                v-model="form.workOrderGetDate"
                                type="datetime"
                                value-format="yyyy-MM-dd HH:mm:ss"
                                placeholder="选择上门时间">
                            </el-date-picker>
                        </el-form-item>
                    </div>
                    <el-form-item label="描述" prop="dealInfo">
                        <el-input
                            type="textarea"
                            :rows="5"
                            placeholder="请输入描述"
                            v-model="form.dealInfo">
                        </el-input>
                    </el-form-item>
                    <el-form-item label="报修区域" prop="resource">
                        <el-select v-model="form.resource" placeholder="请选择报修区域">
                            <el-option label="区域一" value="shanghai"></el-option>
                            <el-option label="区域二" value="beijing"></el-option>
                        </el-select>
                    <el-form-item label="问题图片" prop="resource">
                        <el-upload
                            :action="base"
                            :file-list="form.workOrderFileList"
                            accept=".png,.jpg,.jpeg,.PNG,.JPG"
                            :on-success="getFile"
                            :data="{ folder: 'YW_PROBLEM' }"
                            list-type="picture-card">
                            <i class="el-icon-plus"></i>
                        </el-upload>
                    </el-form-item>
                </div>
                <div style="display: flex; align-items: center;">
                    <el-form-item label="工单分类" prop="resource">
                        <el-select v-model="form.resource" placeholder="请选择工单分类">
                            <el-option label="区域一" value="shanghai"></el-option>
                            <el-option label="区域二" value="beijing"></el-option>
                        </el-select>
                    </el-form-item>
                    <el-form-item label="上门时间" prop="resource">
                        <el-date-picker v-model="form.resource" type="date" placeholder="选择上门时间"></el-date-picker>
                    </el-form-item>
                </div>
                <el-form-item label="描述" prop="resource">
                </template>
                <el-form-item label="关闭说明" prop="dealInfo" v-if="form.dealStatus === 2">
                    <el-input
                        type="textarea"
                        :rows="5"
                        placeholder="请输入描述"
                        v-model="form.resource">
                    </el-input>
                </el-form-item>
                <el-form-item label="问题图片" prop="resource">
                    <el-upload
                        action="https://jsonplaceholder.typicode.com/posts/"
                        list-type="picture-card">
                        <i class="el-icon-plus"></i>
                    </el-upload>
                </el-form-item>
                <el-form-item label="关闭问题" prop="resource">
                    <el-input
                        type="textarea"
                        :rows="5"
                        maxlength="300"
                        placeholder="请输入关闭问题"
                        v-model="form.resource">
                        v-model="form.dealInfo">
                    </el-input>
                </el-form-item>
            </el-form>
@@ -100,6 +127,9 @@
<script>
  import BaseOpera from '@/components/base/BaseOpera'
  import GlobalWindow from '@/components/common/GlobalWindow'
  import { fetchList as getCateList } from '@/api/business/category.js'
  import { tree } from '@/api/project/ywProject'
  import { editProblem } from '@/api/ywProblem'
  export default {
    name: "handleProblem",
    extends: BaseOpera,
@@ -107,61 +137,184 @@
    data() {
      return {
        info: {},
        cateList: [],
        base: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch',
        form: {
          resource: 0
          dealStatus: 1,
          workOrderAreaType: '',
          workOrderCateId: '',
          workOrderGetDate: '',
          dealInfo: '',
          workOrderFileList: [],
          rooms: [],
          workOrderProjectId: '',
          workOrderBuildId: '',
          workOrderFloorId: '',
          workOrderRoomId: ''
        },
        houseList: [],
        houseList1: [],
        rules: {
          resource: [
            { required: true, message: '请选择', trigger: 'change' }
          dealStatus: [
            { required: true, message: '请选择', trigger: 'blur' }
          ],
          workOrderAreaType: [
            { required: true, message: '请选择', trigger: 'blur' }
          ],
          workOrderCateId: [
            { required: true, message: '请选择', trigger: 'blur' }
          ],
          dealInfo: [
            { required: true, message: '请输入', trigger: 'blur' }
          ],
          rooms: [
            { required: true, message: '请选择', trigger: 'blur' }
          ]
        }
      }
    },
    methods: {
      open (title, target) {
        this.title = title
        this.info = target
        this.getCate()
        this.getHouseTree()
        this.visible = true
      },
      getHouseVal(e) {
        if (this.form.workOrderAreaType === 0) {
          this.form.workOrderProjectId = e[0]
          this.form.workOrderBuildId = e[1]
          this.form.workOrderFloorId = e[2]
          this.form.workOrderRoomId = e[3]
        } else {
          this.form.workOrderProjectId = e[0]
          this.form.workOrderBuildId = e[1]
          this.form.workOrderFloorId = e[2]
        }
      },
      changeType(e) {
        this.form.rooms = []
        this.form.workOrderProjectId = ''
        this.form.workOrderBuildId = ''
        this.form.workOrderFloorId = ''
        this.form.workOrderRoomId = ''
      },
      getHouseTree() {
        tree({}).then(res => {
          let arr1 = JSON.parse(JSON.stringify(res))
          let arr2 = JSON.parse(JSON.stringify(res))
          this.addParamToArray(arr1)
          this.addParamToArray1(arr2)
          this.houseList = arr1
          this.houseList1 = arr2
        })
      },
      addParamToArray(arr) {
        for (let i = 0; i < arr.length; i++) {
          const currentItem = arr[i].projectDataVOList
          if (currentItem && currentItem.length >= 0) {
            currentItem.forEach(item => {
              if (item.lv === 3) {
                delete item.projectDataVOList
              }
            })
          }
          if (currentItem && currentItem.length > 0) {
            this.addParamToArray(currentItem)
          }
        }
      },
      addParamToArray1(arr) {
        for (let i = 0; i < arr.length; i++) {
          const currentItem = arr[i].projectDataVOList
          if (currentItem && currentItem.length >= 0) {
            currentItem.forEach(item => {
              if (item.lv === 2) {
                delete item.projectDataVOList
              }
            })
          }
          if (currentItem && currentItem.length > 0) {
            this.addParamToArray1(currentItem)
          }
        }
      },
      getFile(e) {
        console.log(e)
        this.form.workOrderFileList.push({ ...e })
      },
      changeSel(e) {
        if (e && e.length == 2) {
          this.$set(this.form, 'workOrderCateId', e[1])
        } else {
          this.$set(this.form, 'workOrderCateId', '')
        }
      },
      getCate() {
        getCateList({
          model: { type: 3 },
          capacity: 1000,
          page: 1,
        }).then(res => {
          this.cateList = res.records || []
        })
      },
      confirm() {
        this.$refs.form.validate((valid) => {
          if (!valid) {
            return
          }
          this.isWorking = true
          editProblem({
            ...this.form,
            id: this.info.id
          })
            .then(() => {
              this.visible = false
              this.$tip.apiSuccess('操作成功')
              this.$emit('success')
            })
            .finally(() => {
              this.isWorking = false
            })
        })
      }
    }
  }
</script>
<style lang="scss" scoped>
    @import '@/assets/style/variables.scss';
    .wt {
        width: 100%;
        display: flex;
        flex-direction: column;
        .wt_head {
            width: 100%;
            padding: 20px 0;
            box-sizing: border-box;
            display: flex;
            align-items: center;
            justify-content: space-between;
            .wt_head_title {
                display: flex;
                align-items: center;
                font-size: 16px;
                color: black;
                margin-right: 10px;
            }
        }
        .wt_content {
            width: 100%;
            display: flex;
            align-items: center;
            flex-wrap: wrap;
            .wt_content_row {
                font-size: 14px;
                color: rgb(51, 51, 51);
                display: flex;
                align-items: self-start;
                .wt_content_row_label {
                    flex-shrink: 0;
                    font-size: 14px;
                    color: rgb(51, 51, 51);
                }
                .wt_content_row_list {
                    flex: 1;
                    display: flex;
                    align-items: center;
                    .wt_content_row_list_img {
                        width: 106px;
                        height: 93px;
@@ -170,9 +323,11 @@
                        justify-content: center;
                        overflow-x: hidden;
                        margin-right: 15px;
                        &:last-child {
                            margin: 0 !important;
                        }
                        img {
                            width: 100%;
                        }
@@ -180,5 +335,30 @@
                }
            }
        }
        .wt_head {
            width: 100%;
            padding: 20px 0;
            box-sizing: border-box;
            display: flex;
            align-items: center;
            justify-content: space-between;
            .wt_head_title {
                display: flex;
                align-items: center;
                font-size: 16px;
                color: black;
                margin-right: 10px;
                .title {
                    font-weight: 500;
                    font-size: 18px;
                    color: $primary-color;
                    display: flex;
                    align-items: center;
                }
            }
        }
    }
</style>
admin/src/views/workorder/components/problemReportingDetails.vue
@@ -1,83 +1,128 @@
<template>
    <GlobalWindow
        title="问题上报详情"
        :title="title"
        :showConfirm="false"
        :visible.sync="visible"
        width="100%">
        <div class="wt">
            <div class="wt_head">
                <div class="wt_head_title">
                    问题详情
                    <el-tag style="margin-left: 10px;">转工单</el-tag>
                    <div class="title">问题详情</div>
                    <el-tag style="margin-left: 10px;" v-if="form.dealStatus === 0">待处理</el-tag>
                    <el-tag style="margin-left: 10px;" v-if="form.dealStatus === 1">已转工单</el-tag>
                    <el-tag style="margin-left: 10px;" v-if="form.dealStatus === 2">已关闭</el-tag>
                </div>
                <el-button>查看工单</el-button>
                <el-button @click="handleDetail" v-if="form.dealStatus === 1">查看工单</el-button>
            </div>
            <div class="wt_content">
                <div class="wt_content_row" style="width: 25%;">
                    位置:-
                    位置:{{form.position || '-'}}
                </div>
                <div class="wt_content_row" style="width: 25%;">
                    上报人:张三丰
                    上报人:{{form.name || '-'}}
                </div>
                <div class="wt_content_row" style="width: 50%;">
                    上报人电话:180553847234
                    上报人电话:{{form.phone || '-'}}
                </div>
                <div class="wt_content_row" style="width: 100%; margin-top: 15px;">
                    上报时间:2024-11-21 12:00:23
                    上报时间:{{form.submitDate || '-'}}
                </div>
                <div class="wt_content_row" style="width: 100%; margin-top: 15px;">
                    问题描述:这是问题描述这是问题描述这是问题描述这是问题描述这是问题描述这是问题描述这是问题描述这是问题描述
                    问题描述:{{form.content || '-'}}
                </div>
                <div class="wt_content_row" style="width: 100%; margin-top: 15px;">
                    <div class="wt_content_row_label">问题图片:</div>
                    <div class="wt_content_row_list">
                        <div class="wt_content_row_list_img">
                            <img src="" alt="" />
                    <div class="wt_content_row_list" v-if="form.fileList && form.fileList.length >= 0">
                        <div class="wt_content_row_list_img" v-for="(item, index) in form.fileList" :key="index">
                            <el-image
                                style="width: 80px; height: 80px"
                                :src="item.fileurlFull"
                                :preview-src-list="form.fileList.map(item => item.fileurlFull)">
                            </el-image>
                        </div>
                    </div>
                </div>
            </div>
            <div class="wt_head">
                <div class="wt_head_title">
                    处理结果
                    <div class="title">问题详情</div>
                </div>
            </div>
            <div class="wt_content">
                <div class="wt_content_row" style="width: 100%;">
                    处理人:张三-行政部
                    处理人:{{form.dealUserName}}-{{form.dealUserCompanyName}}
                </div>
                <div class="wt_content_row" style="width: 100%; margin-top: 15px;">
                    处理时间:2024-11-21 12:00:23
                    处理时间:{{form.dealDate || '-'}}
                </div>
                <div class="wt_content_row" style="width: 100%; margin-top: 15px;">
                    处理结果:转工单
                    处理结果:{{returnText(form.dealStatus)}}
                </div>
                <div class="wt_content_row" style="width: 100%; margin-top: 15px;">
                    关闭说明:说明说明说明说明说明说明说明说明说明说明说明说明说明说明说明说明说明
                <div class="wt_content_row" style="width: 100%; margin-top: 15px;" v-if="form.dealStatus === 2">
                    关闭说明:{{form.dealInfo}}
                </div>
            </div>
        </div>
        <!--    工单详情    -->
        <Detail v-if="showDetail" ref="DetailRef" @close="showDetail = false" />
    </GlobalWindow>
</template>
<script>
  import BaseOpera from '@/components/base/BaseOpera'
  import GlobalWindow from '@/components/common/GlobalWindow'
  import Detail from './detail'
  import { getById } from '@/api/ywProblem'
  export default {
    name: "problemReportingDetails",
    extends: BaseOpera,
    components: { GlobalWindow },
    components: { GlobalWindow, Detail },
    data() {
      return {
        info: {}
        form: {},
        showDetail: false,
      }
    },
    methods: {
      open (title, target) {
        this.title = title
        this.form = target
        getById(target.id)
            .then(res => {
              this.form = res
              this.visible = true
            })
      },
      handleDetail() {
        this.showDetail = true
        this.$nextTick(() => {
          this.$refs.DetailRef.visible = true
          this.$refs.DetailRef.id = this.form.workorderId
          this.$refs.DetailRef.getDetail()
        })
      },
      returnText(status) {
        if (status === 0) {
          return '待处理'
        } else if (status === 1) {
          return '已转工单'
        } else if (status === 2) {
          return '已关闭'
        } else {
          return ''
        }
      }
    }
  }
</script>
<style lang="scss" scoped>
    @import '@/assets/style/variables.scss';
    .title {
        font-weight: 500;
        font-size: 18px;
        color: $primary-color;
    }
</style>
<style lang="scss" scoped>
    .wt {
        width: 100%;
admin/src/views/workorder/problemReporting.vue
@@ -2,14 +2,14 @@
    <TableLayout :permissions="['business:ywworkorder:query']">
        <!-- 搜索表单 -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
            <el-form-item label="描述" prop="roomNum">
                <el-input v-model="searchForm.roomNum" placeholder="请输入描述" @keypress.enter.native="search"></el-input>
            <el-form-item label="描述" prop="content">
                <el-input v-model="searchForm.content" placeholder="请输入描述" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item prop="areaType" label="处理状态">
                <el-select v-model="searchForm.areaType">
                    <el-option label="未处理" value="0"></el-option>
                    <el-option label="生成工单" value="1"></el-option>
                    <el-option label="关闭保修" value="1"></el-option>
            <el-form-item prop="dealStatus" label="处理状态">
                <el-select v-model="searchForm.dealStatus">
                    <el-option label="未处理" :value="0"></el-option>
                    <el-option label="已转工单" :value="1"></el-option>
                    <el-option label="已关闭" :value="2"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="上报时间">
@@ -18,7 +18,7 @@
                    @change="changeSelDate"
                    format="yyyy-MM-dd"
                    value-format="yyyy-MM-dd"
                    type="daterange"></el-date-picker>
                    type="daterange" />
            </el-form-item>
            <section>
                <el-button type="primary" @click="search">搜索</el-button>
@@ -30,15 +30,19 @@
            <el-table v-loading="isWorking.search" :data="tableData.list" stripe>
                <el-table-column prop="remark" label="描述" min-width="70px"></el-table-column>
                <el-table-column prop="position" label="位置" min-width="100px"></el-table-column>
                <el-table-column prop="categoryName" label="现场图片" min-width="100px"></el-table-column>
                <el-table-column label="现场图片" min-width="100px">
                    <template slot-scope="{row}">
                        {{row.fileList ? row.fileList.length : 0}}张
                    </template>`
                </el-table-column>
                <el-table-column prop="name" label="上报人" min-width="80px"></el-table-column>
                <el-table-column prop="phone" label="上报人电话" min-width="100px"></el-table-column>
                <el-table-column prop="submitDate" label="上报时间" min-width="80px"></el-table-column>
                <el-table-column label="处理状态" min-width="70px">
                    <template slot-scope="{row}">
                        <span v-if="row.dealStatus == 0">待指派</span>
                        <span v-if="row.dealStatus == 1">已指派</span>
                        <span v-if="row.dealStatus == 2">已处理</span>
                        <span v-if="row.dealStatus === 0">待处理</span>
                        <span v-if="row.dealStatus === 1">已转工单</span>
                        <span v-if="row.dealStatus === 2">已关闭</span>
                    </template>`
                </el-table-column>
                <el-table-column prop="dealUserName" label="处理人" min-width="80px"></el-table-column>
@@ -48,8 +52,8 @@
                    width="130"
                    fixed="right">
                    <template slot-scope="{row}">
                        <el-button type="text" @click="$refs.handleProblem.open()">处理</el-button>
                        <el-button type="text" @click="$refs.problemReportingDetails.open()">查看详情</el-button>
                        <el-button type="text" v-if="row.dealStatus === 0" @click="$refs.handleProblem.open('问题上报', row)">处理</el-button>
                        <el-button type="text" @click="$refs.problemReportingDetails.open('问题上报详情', row)">查看详情</el-button>
                    </template>
                </el-table-column>
            </el-table>
@@ -79,10 +83,10 @@
        showDetail: false,
        searchForm: {
          selDate: [],
          areaIds: '',
          projectId: '',
          buildingId: '',
          cateId: '',
          dealDateStart: '',
          dealDateEnd: '',
          content: '',
          dealStatus: ''
        },
        projectList: [],
        buildList: [],
@@ -99,7 +103,17 @@
      this.search()
    },
    methods: {
      // 搜索框重置
      reset () {
        this.$refs.searchForm.resetFields()
        this.searchForm.dealDateStart = ''
        this.searchForm.dealDateEnd = ''
        this.search()
      },
      changeSelDate(e) {
        this.searchForm.dealDateStart = e[0]
        this.searchForm.dealDateEnd = e[1]
      }
    }
  }
</script>