ll
liukangdong
2024-12-03 b2e8e233d59d107615a8336dce9da36f1f8bcde0
ll
已添加1个文件
已修改30个文件
1053 ■■■■■ 文件已修改
admin/src/components/business/OperaInternalCompanyWindow.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/GlobalRigthWindow.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/GlobalWindow.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/components/OperaYwPatrolLineWindow.vue 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/components/OperaYwPatrolPointWindow.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/components/taskDetail.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/path.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/plan.vue 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/task.vue 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/internalCompany.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/client/components/OperaYwCustomerWindow.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/components/deviceDetail.vue 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/components/deviceEdit.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/components/maintain.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/components/maintainDetail.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/device.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/project/components/OperaYwRoomWindow.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/project/components/buildingDetail.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/project/housingList.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/workorder/workorderList.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/App.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/api/yw.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/manifest.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/operation/device.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/polling/detail.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/polling/point.vue 236 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/polling/task.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/workOrder/detail.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/workOrder/edit.vue 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/workOrder/list.vue 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaInternalCompanyWindow.vue
@@ -4,6 +4,7 @@
        :visible.sync="visible"
        :confirm-working="isWorking"
        @confirm="confirm"
        width="600px"
    >
        <el-form :model="form" ref="form" :rules="rules">
            <el-form-item label="上级组织"  >
@@ -15,12 +16,11 @@
            <el-form-item label="组织名称" prop="name">
                <el-input v-model="form.name" placeholder="请输入组织名称" v-trim/>
            </el-form-item>
          <el-form-item label="组织类型" prop="type">
          <!-- <el-form-item label="组织类型" prop="type">
            <el-radio-group v-model="form.type" :disabled="form.parentType == 0">
<!--              <el-radio :label="0">相关方组织</el-radio>-->
              <el-radio :label="1">内部组织</el-radio>
            </el-radio-group>
          </el-form-item>
          </el-form-item> -->
        </el-form>
    </GlobalWindow>
</template>
@@ -39,7 +39,7 @@
      // è¡¨å•数据
      form: {
        id: null,
        type: '0',
        type: '2',
        name: '',
        parentId: null,
        disable: false,
admin/src/components/common/GlobalRigthWindow.vue
@@ -72,7 +72,7 @@
// è¾“入框高度
$input-height: 32px;
.global-window {
  top: 56px !important;
  top: 0;
  left: 218px !important;
  // å¤´éƒ¨æ ‡é¢˜
  ::v-deep .el-drawer__header {
admin/src/components/common/GlobalWindow.vue
@@ -87,7 +87,7 @@
// è¾“入框高度
$input-height: 32px;
.global-window {
  top: 56px !important;
  top: 0;
  left: 250px !important;
  // å¤´éƒ¨æ ‡é¢˜
  ::v-deep .el-drawer__header {
admin/src/views/Inspection/components/OperaYwPatrolLineWindow.vue
@@ -56,10 +56,10 @@
        <el-table-column type="selection" width="55" align="center" />
        <el-table-column prop="code" label="巡检点编码" min-width="100px"></el-table-column>
        <el-table-column prop="name" label="巡检点名称" min-width="100px"></el-table-column>
        <el-table-column prop="deviceName" label="巡检点名称" min-width="100px"></el-table-column>
        <el-table-column prop="areaName" label="巡检点名称" min-width="100px"></el-table-column>
        <el-table-column prop="deviceName" label="关联设备" min-width="100px"></el-table-column>
        <el-table-column prop="areaName" label="巡检区域" min-width="100px"></el-table-column>
      </el-table>
      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="pagination">
      <pagination class="mt10" @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="pagination">
      </pagination>
      <span slot="footer" class="dialog-footer">
@@ -75,7 +75,7 @@
import GlobalWindow from '@/components/common/GlobalWindow'
import Pagination from '@/components/common/Pagination'
import { fetchList as getFetchList } from '@/api/Inspection/ywPatrolPoint'
import { create,updateById, detailById } from '@/api/Inspection/ywPatrolLine'
import { create, updateById, detailById } from '@/api/Inspection/ywPatrolLine'
import { Message } from 'element-ui'
import { fetchList } from '@/api/business/category'
export default {
@@ -127,7 +127,7 @@
          if (list.length == 0) return Message.warning('请先选择巡检点')
          form.linePointList = list
          this.isWorking = true
          let  fn = form.id ? updateById : create
          let fn = form.id ? updateById : create
          fn({ ...form }).then(res => {
            Message.success('保存成功')
            this.isWorking = false
@@ -155,7 +155,6 @@
      })
    },
    initData() {
      this.list = []
      const { searchForm, pagination } = this
      getFetchList({
        page: pagination.page,
@@ -193,8 +192,8 @@
    },
    openModal() {
      this.selPoint = this.list.map(i => i.id)
      this.getProject()
      this.reset()
      this.isShowModal = true
    },
    changeSel(e) {
@@ -206,12 +205,23 @@
      this.initData()
    },
    subModal() {
      this.list = this.selList.map(item => {
        return {
          needScancode: 0,
          pointName: item.name,
          pointId: item.id,
          code: item.code
      // this.list = this.selList.map(item => {
      //   return {
      //     needScancode: 0,
      //     pointName: item.name,
      //     pointId: item.id,
      //     code: item.code
      //   }
      // })
      this.selList.forEach(item => {
        const index = this.list.findIndex(i => i.code === item.code)
        if (index === -1) {
          this.list.push({
            needScancode: 0,
            pointName: item.name,
            pointId: item.id,
            code: item.code
          })
        }
      })
      this.isShowModal = false
admin/src/views/Inspection/components/OperaYwPatrolPointWindow.vue
@@ -21,11 +21,11 @@
          }"></el-cascader>
      </el-form-item>
      <el-form-item label="经纬度">
        <el-input v-model="form.lnglat" disabled v-trim />
        <el-input v-model="form.lnglat" placeholder="示例:117.297461,31.849234" v-trim />
      </el-form-item>
      <el-form-item>
      <!-- <el-form-item>
        <mapDrag class="mapbox" @center="getCenter" />
      </el-form-item>
      </el-form-item> -->
      <el-form-item label="巡检内容" prop="content">
        <el-input type="textarea" :rows="4" v-model="form.content" placeholder="请输入" />
      </el-form-item>
admin/src/views/Inspection/components/taskDetail.vue
@@ -1,6 +1,6 @@
<template>
  <GlobalWindow title="巡检任务详情" :showConfirm="false" :visible.sync="isShowModal">
    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getDetail(1)" @clear="clear" />
    <el-table v-loading="loading" :data="list" stripe>
      <el-table-column prop="pointName" label="巡检点名称" min-width="100" show-overflow-tooltip />
      <el-table-column prop="" label="状态" min-width="100" show-overflow-tooltip>
@@ -9,7 +9,7 @@
          <span v-if="row.status == 1">已巡检</span>
        </template>
      </el-table-column>
      <el-table-column prop="editor" label="巡检人" min-width="100" show-overflow-tooltip />
      <el-table-column prop="realname" label="巡检人" min-width="100" show-overflow-tooltip />
      <el-table-column prop="editDate" label="巡检时间" min-width="100" show-overflow-tooltip />
      <el-table-column prop="" label="巡检结果" min-width="100" show-overflow-tooltip>
        <template v-slot="{ row }">
@@ -30,6 +30,7 @@
import QueryForm from '@/components/common/QueryForm'
import Pagination from '@/components/common/Pagination'
import { getDetail } from '@/api/Inspection/ywPatrolTask'
import dayjs from 'dayjs'
export default {
  components: { GlobalWindow, QueryForm, Pagination },
  data() {
@@ -41,6 +42,7 @@
        page: 1,
        total: 0
      },
      loading:false,
      filters: {},
      list: [],
      total: 0,
@@ -82,11 +84,11 @@
        this.loading = false
        this.list = res.records || []
        this.pagination.total = res.total
        this.list.forEach(item => {
          item.inTypeTemp = item.inType == 0 ? '整托盘' : '件烟'
          item.taskOrigin = 'WMS获取'
          item.workTime = dayjs.duration(item.param3, 'seconds').format('H时m分s秒')
        })
        // this.list.forEach(item => {
        //   item.inTypeTemp = item.inType == 0 ? '整托盘' : '件烟'
        //   item.taskOrigin = 'WMS获取'
        //   item.workTime = dayjs.duration(item.param3, 'seconds').format('H时m分s秒')
        // })
        this.pagination.total = res.total || 0
      }, () => {
        this.loading = false
admin/src/views/Inspection/path.vue
@@ -17,8 +17,8 @@
      <ul class="toolbar" v-permissions="['business:ywpatrolline:create', 'business:ywpatrolline:delete']">
        <li><el-button type="primary" @click="editClick()" icon="el-icon-plus"
            v-permissions="['business:ywpatrolline:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete"
            v-permissions="['business:ywpatrolline:delete']">删除</el-button></li>
        <!-- <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete"
            v-permissions="['business:ywpatrolline:delete']">删除</el-button></li> -->
      </ul>
      <el-table v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
        <el-table-column type="selection" width="55"></el-table-column>
@@ -105,6 +105,7 @@
      } else {
        this.$refs.operaYwPatrolLineWindow.open('新建巡检线路')
      }
      this.$refs.operaYwPatrolLineWindow.list = []
      this.$refs.operaYwPatrolLineWindow.initData()
      
    },
admin/src/views/Inspection/plan.vue
@@ -12,8 +12,6 @@
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:ywpatrolscheme:exportExcel']"
          @click="exportExcel">导出</el-button>
        <el-button @click="reset">重置</el-button>
      </section>
    </el-form>
@@ -22,6 +20,8 @@
      <ul class="toolbar" v-permissions="['business:ywpatrolscheme:create', 'business:ywpatrolscheme:delete']">
        <li><el-button type="primary" @click="editClick()" icon="el-icon-plus"
            v-permissions="['business:ywpatrolscheme:create']">新建</el-button></li>
        <el-button type="primary" plain  :loading="isWorking.export" v-permissions="['business:ywpatrolscheme:exportExcel']"
          @click="exportExcel">导出</el-button>
        <!-- <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete"
            v-permissions="['business:ywpatrolscheme:delete']">删除</el-button></li> -->
      </ul>
@@ -52,7 +52,8 @@
        </el-table-column>
        <el-table-column label="状态" min-width="100px">
          <template v-slot="scope">
            <el-switch v-model="scope.row.status" @change="e => changeStatus(scope.row)" :active-value="0" :inactive-value="1">
            <el-switch v-model="scope.row.status" @change="e => changeStatus(scope.row)" :active-value="0"
              :inactive-value="1">
            </el-switch>
          </template>
        </el-table-column>
@@ -89,7 +90,7 @@
    return {
      // æœç´¢
      searchForm: {
       title: ''
        title: ''
      }
    }
  },
@@ -104,7 +105,7 @@
  },
  methods: {
    changeStatus(e) {
      console.log(e);
      console.log(e)
      updateStatusById(e).then(res => {
        this.search()
        Message.success('状态修改成功')
@@ -113,14 +114,14 @@
      })
    },
    changeDate(e) {
      if(e && e.length > 0){
      if (e && e.length > 0) {
        this.$set(this.searchForm, 'startDate', e[0])
        this.$set(this.searchForm, 'endDate', e[1])
      }else{
      } else {
        this.$set(this.searchForm, 'startDate', '')
        this.$set(this.searchForm, 'endDate', '')
      }
    },
    reset() {
      this.searchForm = {}
@@ -134,7 +135,7 @@
        this.$refs.operaYwPatrolSchemeWindow.open('新建巡检计划')
      }
      this.$refs.operaYwPatrolSchemeWindow.initData()
    },
  }
}
admin/src/views/Inspection/task.vue
@@ -16,25 +16,25 @@
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:ywpatroltask:exportExcel']" @click="exportExcel">导出</el-button>
        <el-button @click="reset">重置</el-button>
      </section>
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <el-table
        v-loading="isWorking.search"
        :data="tableData.list"
        stripe
        @selection-change="handleSelectionChange"
      >
      <div>
        <el-button type="primary" plain :loading="isWorking.export"
          v-permissions="['business:ywpatroltask:exportExcel']" @click="exportExcel">导出</el-button>
      </div>
      <el-table v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="planTitle" label="计划名称" min-width="100px"></el-table-column>
        <el-table-column prop="planCode" label="计划编号" min-width="100px"></el-table-column>
        <el-table-column prop="code" label="任务编号" min-width="100px"></el-table-column>
        <el-table-column prop="dealDate" label="任务时间" min-width="140px">
          <template v-slot="scope">
            <span v-if="scope.row.startDate && scope.row.endDate">{{ scope.row.startDate.slice(0, 16) }} - {{ scope.row.endDate.slice(11, 16) }}</span>
            <span v-if="scope.row.startDate && scope.row.endDate">{{ scope.row.startDate.slice(0, 16) }} - {{
              scope.row.endDate.slice(11, 16) }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="dealDate" label="实际完成时间" min-width="100px"></el-table-column>
@@ -48,23 +48,16 @@
            <span class="gray" v-if="scope.row.status == 4">已取消</span>
          </template>
        </el-table-column>
        <el-table-column
          v-if="containPermissions(['business:ywpatroltask:update', 'business:ywpatroltask:delete'])"
          label="操作"
          min-width="120"
          fixed="right"
        >
        <el-table-column v-if="containPermissions(['business:ywpatroltask:update', 'business:ywpatroltask:delete'])"
          label="操作" min-width="120" fixed="right">
          <template slot-scope="{row}">
            <el-button type="text" @click="handleDetail(row)">查看详情</el-button>
            <el-button v-if="row.status == 0" type="text" class="red" @click="cancelById(row)" v-permissions="['business:ywpatroltask:delete']">取消</el-button>
            <el-button v-if="row.status == 0" type="text" class="red" @click="cancelById(row)"
              v-permissions="['business:ywpatroltask:delete']">取消</el-button>
          </template>
        </el-table-column>
      </el-table>
      <pagination
        @size-change="handleSizeChange"
        @current-change="handlePageChange"
        :pagination="tableData.pagination"
      >
      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
      </pagination>
    </template>
    <!--  -->
@@ -83,16 +76,16 @@
  name: 'YwPatrolTask',
  extends: BaseTable,
  components: { TableLayout, Pagination, TaskDetail },
  data () {
  data() {
    return {
      // æœç´¢
      searchForm: {
        title:'',
        title: '',
        status: ''
      }
    }
  },
  created () {
  created() {
    this.config({
      module: '运维巡检任务信息表',
      api: '/Inspection/ywPatrolTask',
admin/src/views/business/internalCompany.vue
@@ -32,12 +32,12 @@
                default-expand-all>
                <el-table-column type="selection" width="55"></el-table-column>
                <el-table-column prop="name" label="组织名称" min-width="100px"></el-table-column>
                <el-table-column prop="name" label="组织类型" min-width="80px">
                <!-- <el-table-column prop="name" label="组织类型" min-width="80px">
                  <template scope="{row}">
                      <span v-if="row.type == 0">相关方组织</span>
                      <span v-if="row.type == 1">内部组织</span>
                  </template>
                </el-table-column>
                </el-table-column> -->
                <el-table-column prop="companyNamePath" label="组织路径" min-width="100px"></el-table-column>
              <el-table-column prop="editorName" label="操作人" min-width="100px"></el-table-column>
              <el-table-column prop="editDate" label="最后更新时间" min-width="100px"></el-table-column>
@@ -73,7 +73,7 @@
      loading: false,
      sorting: false,
      searchForm: {
        // type: 1
        type: 2
      },
      list: [],
      total: 0
admin/src/views/client/components/OperaYwCustomerWindow.vue
@@ -212,18 +212,18 @@
      // ç¼–辑
      this.$nextTick(() => {
        if (title == '编辑客户') {
          this.getClient()
          this.getClient(target.id)
          detailById(target.id).then(res => {
            this.form = res
          })
        }
      })
    },
    getClient() {
    getClient(customerId) {
      fetchList({
        capacity: 9999,
        page: 1,
        model: {}
        model: {customerId}
      }).then(res => {
        this.clientList = res.records
      })
admin/src/views/operation/components/deviceDetail.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,211 @@
<template>
  <GlobalWindow width="720px" title="工单详情" :visible.sync="visible" :confirm-working="isWorking" @close="close"
    @confirm="confirm">
    <div class="main">
      <div class="title">
        <span>基础信息</span>
      </div>
      <div class="main_content">
        <div class="list">
          <div class="item">
            <div class="la">设备编码</div>
            <div class="val">{{ info.code }}</div>
          </div>
          <div class="item">
            <div class="la">设备名称</div>
            <div class="val">{{ info.name }}</div>
          </div>
          <div class="item">
            <div class="la">设备型号</div>
            <div class="val">{{ info.modelNo }}</div>
          </div>
          <div class="item">
            <div class="la">设备分类</div>
            <div class="val">{{ info.categoryName }}</div>
          </div>
          <div class="item">
            <div class="la">设备管理员</div>
            <div class="val">{{ info.realName }}</div>
          </div>
          <div class="item">
            <div class="la">所在位置</div>
            <div class="val">{{ info.addr }}</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>
            <spa class="val" v-if="info.status == 2">报废</spa>
          </div>
          <div class="item">
            <div class="la">供应商</div>
            <div class="val">{{ info.supplier }}</div>
          </div>
          <div class="item" v-if="info.content" style="width: 100%;">
            <div class="la">运维内容</div>
            <div class="val">{{ info.content }}</div>
          </div>
          <div v-if="info.fileFullUrl" class="item" style="width: 100%;">
            <div class="la">照片</div>
            <div class="val">
              <img class="photo" :src="info.fileFullUrl" alt="">
            </div>
          </div>
        </div>
      </div>
    </div>
  </GlobalWindow>
</template>
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
import BaseOpera from '@/components/base/BaseOpera'
import { detailById } from '@/api/Inspection/device.js'
import { getUserList } from '@/api/system/user'
import { Message, Loading } from 'element-ui'
export default {
  components: {
    GlobalWindow
  },
  extends: BaseOpera,
  data() {
    return {
      id: '',
      visible: false,
      info: {},
    }
  },
  methods: {
    getDetail() {
      const { id } = this
      detailById(id).then(res => {
        this.info = res
      })
    },
    close() {
      this.visible = false
      this.$emit('close')
    }
  }
}
</script>
<style lang="scss" scoped>
@import '@/assets/style/variables.scss';
.main {
  padding-top: 20px;
  .title {
    font-weight: 500;
    font-size: 18px;
    color: $primary-color;
    margin-bottom: 10px;
    display: flex;
    align-items: center;
    .status {
      padding: 0 6px;
      height: 22px;
      line-height: 22px;
      border-radius: 2px;
      border: 1px solid #00BA92;
      color: #00BA92;
      font-weight: 400;
      font-size: 12px;
      margin-left: 10px;
    }
    .primaryColor {
      border: 1px solid $primary-color;
    }
    .gray {
      color: gray;
      border: 1px solid gray;
    }
  }
  .list {
    display: flex;
    flex-wrap: wrap;
    /* background: #F7F7F7; */
    border-radius: 2px;
    padding: 15px 20px;
    margin-bottom: 16px;
    width: 100%;
    .item {
      width: 33.3%;
      margin-bottom: 12px;
      .photo {
        width: 92px;
        height: 92px;
      }
      .la {
        color: #7f7f7f;
        margin-top: 2px;
      }
    }
    .item2 {
      width: 100%;
      display: flex;
      align-items: center;
    }
    .max {
      width: 100%;
    }
  }
  .main_content {
    display: flex;
    width: 100%;
  }
}
.file_list {
  display: flex;
  flex-wrap: wrap;
  .avatar-uploader {
    width: 92px;
    height: 92px;
    display: flex;
    justify-content: center;
    align-items: center;
    border: 1px dashed #d9d9d9;
  }
  .item {
    width: 92px;
    max-height: 92px;
    margin-left: 10px;
    position: relative;
    border: 1px dashed #d9d9d9;
    border-radius: 4px;
    display: flex;
    align-items: center;
    justify-content: center;
    .close {
      font-size: 20px;
      position: absolute;
      right: -10px;
      top: -10px;
      z-index: 111;
      color: red;
      cursor: pointer;
    }
    .img {
      width: 92px;
      max-height: 92px;
    }
  }
}
</style>
admin/src/views/operation/components/deviceEdit.vue
@@ -30,7 +30,6 @@
      </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="请输入" />
admin/src/views/operation/components/maintain.vue
@@ -55,6 +55,7 @@
import { getUserList } from '@/api/system/user'
import { create, updateById } from '@/api/Inspection/deviceRecord'
import { Message, Loading } from 'element-ui'
import dayjs from 'dayjs'
export default {
  components: { GlobalWindow, UploadAvatarImage },
  data() {
@@ -65,6 +66,7 @@
      deviceList: [],
      staffList: [],
      rules: {
        dealDate: [{ required: true, message: '请选择' }],
        deviceId: [{ required: true, message: '请选择' }],
        content: [{ required: true, message: '请输入' }],
        // code: [{ required: true, message: '请输入' }],
@@ -74,13 +76,14 @@
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch',
      fileList: [],
      uploadData: {
        folder: 'HIDDEN_DANGER_FILE'
        folder: 'YW_DEVICE'
      },
    }
  },
  created() {
    this.initData()
    this.$set(this.param, 'dealDate', dayjs().format('YYYY-MM-DD HH:mm:ss'))
  },
  methods: {
    handleSub() {
admin/src/views/operation/components/maintainDetail.vue
@@ -18,7 +18,7 @@
        </div>
        <div class="item">
          <div class="la">运维人</div>
          <div class="val">{{ info.realName }}</div>
          <div class="val">{{ info.realName }}-{{ info.companyName }}</div>
        </div>
        <div class="item">
          <div class="la">运维人电话</div>
admin/src/views/operation/device.vue
@@ -19,8 +19,9 @@
          <span v-if="row.status == 2">报废</span>
        </template>
      </el-table-column>
      <el-table-column label="操作" min-width="120" fixed="right">
      <el-table-column label="操作" min-width="130" fixed="right">
        <template slot-scope="{row}">
          <el-button type="text" @click="handleDetail(row)" v-permissions="['business:category:update']">查看详情</el-button>
          <el-button type="text" @click="handleEdit(row)" icon="el-icon-edit"
            v-permissions="['business:category:update']">编辑</el-button>
          <el-button type="text" @click="handleDel(row)" icon="el-icon-delete"
@@ -32,6 +33,7 @@
      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
    </div>
    <Edit v-if="showEdit" ref="EditRef" @success="getList" @close="showEdit = false" />
    <Detail ref="DetailRef" />
  </div>
</template>
@@ -39,12 +41,14 @@
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
import Edit from './components/deviceEdit'
import Detail from './components/deviceDetail'
import { fetchList, deleteById } from '@/api/Inspection/device'
export default {
  components: {
    Pagination,
    QueryForm,
    Edit
    Edit,
    Detail
  },
  data() {
    return {
@@ -105,13 +109,18 @@
        this.loading = false
      })
    },
    handleDetail(row) {
      this.$refs.DetailRef.visible = true
      this.$refs.DetailRef.id = row.id
      this.$refs.DetailRef.getDetail()
    },
    handleEdit(row) {
      this.showEdit = true
      this.$nextTick(() => {
        this.$refs.EditRef.isShowModal = true
        if (row && row.id) {
          console.log('---');
          console.log('---')
          this.$refs.EditRef.getDetail(row.id)
        }
      })
admin/src/views/project/components/OperaYwRoomWindow.vue
@@ -23,7 +23,7 @@
        <el-input v-model="form.code" placeholder="请输入房间编号" v-trim />
      </el-form-item>
      <el-form-item label="是否招商" prop="isInvestment">
        <el-switch v-model="form.isInvestment" active-value="1" inactive-value="0">
        <el-switch v-model="form.isInvestment" :active-value="1" :inactive-value="0">
        </el-switch>
      </el-form-item>
      <el-form-item label="建筑面积(m²)" prop="area">
@@ -67,7 +67,7 @@
        imgurl: '',
        code: '',
        roomNum: '',
        isInvestment: '0',
        isInvestment: 0,
        area: '',
        feeArea: '',
        rentArea: '',
@@ -115,6 +115,16 @@
        this.getDetail(target.id)
      })
    },
    confirm () {
      if(!this.form.feeArea){
        this.form.feeArea = this.form.rentArea
      }
      if (this.form.id == null || this.form.id === '') {
        this.__confirmCreate()
        return
      }
      this.__confirmEdit()
    },
    getDetail(id) {
      detailById(id).then(res => {
        this.form = res || {}
admin/src/views/project/components/buildingDetail.vue
@@ -9,7 +9,7 @@
        </div>
        <div class="item">
          <div class="la">楼宇名称</div>
          <div class="val">{{ info.buildingName }}</div>
          <div class="val">{{ info.buildingName || info.name }}</div>
        </div>
        <div class="item">
          <div class="la">楼宇编码</div>
admin/src/views/project/housingList.vue
@@ -17,8 +17,8 @@
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:ywroom:exportExcel']"
          @click="exportExcel">导出</el-button>
        <!-- <el-button type="primary" :loading="isWorking.export" v-permissions="['business:ywroom:exportExcel']"
          @click="exportExcel">导出</el-button> -->
        <el-button @click="reset">重置</el-button>
      </section>
    </el-form>
@@ -27,8 +27,8 @@
      <ul class="toolbar" v-permissions="['business:ywroom:create', 'business:ywroom:delete']">
        <li><el-button type="primary" @click="editClick()" icon="el-icon-plus"
            v-permissions="['business:ywroom:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete"
            v-permissions="['business:ywroom:delete']">删除</el-button></li>
        <!-- <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete"
            v-permissions="['business:ywroom:delete']">删除</el-button></li> -->
      </ul>
      <el-table v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
        <el-table-column type="selection" width="55"></el-table-column>
@@ -38,7 +38,13 @@
        <el-table-column prop="roomNum" label="房号" min-width="60px"></el-table-column>
        <el-table-column prop="rentArea" label="计租面积(m²)" min-width="80px"></el-table-column>
        <el-table-column prop="feeArea" label="计费面积(m²)" min-width="80px"></el-table-column>
        <el-table-column prop="feeArea" label="租赁状态" min-width="80px"></el-table-column>
        <el-table-column prop="" label="租赁状态" min-width="80px">
          <template v-slot="{row}">
            <span v-if="row.leaseStatus == 0">待租赁</span>
            <span v-if="row.leaseStatus == 1">已租赁</span>
            <span v-if="row.leaseStatus == 2">未开启租赁</span>
          </template>
        </el-table-column>
        <el-table-column prop="isInvestment" label="招商状态" min-width="60px">
          <template v-slot="scope">
            <span v-if="scope.row.isInvestment == 1" class="green">招商</span>
admin/src/views/workorder/workorderList.vue
@@ -2,7 +2,7 @@
  <TableLayout :permissions="['business:ywworkorder:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item prop="areaType" label="位置类别">
      <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>
@@ -45,7 +45,7 @@
          @click="exportExcel" plain>导出</el-button>
      </ul>
      <el-table v-loading="isWorking.search" :data="tableData.list" stripe>
        <el-table-column prop="areaType" label="位置类型" min-width="80px">
        <el-table-column prop="areaType" label="位置类型" min-width="70px">
          <template v-slot="scope">
            <span v-if="scope.row.areaType == 0">室内装修</span>
            <span v-if="scope.row.areaType == 1">公共区域</span>
@@ -57,18 +57,18 @@
              }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="categoryName" label="物品类型" min-width="100px"></el-table-column>
        <el-table-column prop="creatorName" label="上报人" min-width="100px"></el-table-column>
        <el-table-column prop="categoryName" label="工单分类" min-width="100px"></el-table-column>
        <el-table-column prop="creatorName" label="上报人" min-width="80px"></el-table-column>
        <el-table-column prop="createDate" label="上报时间" min-width="100px"></el-table-column>
        <el-table-column prop="dealUserName" label="处理人" min-width="100px"></el-table-column>
        <el-table-column label="工单状态" min-width="100px">
        <el-table-column prop="dealUserName" 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>
          </template>
        </el-table-column>
        <el-table-column v-if="containPermissions(['business:ywworkorder:update'])" label="操作" min-width="80"
        <el-table-column v-if="containPermissions(['business:ywworkorder:update'])" label="操作" width="80"
          fixed="right">
          <template slot-scope="{row}">
            <span @click="handleDetail(row)" class="primaryColor cu">查看详情</span>
h5/App.vue
@@ -1,7 +1,7 @@
<script>
export default {
  onLaunch: function () {
    // const result = uni.getWindowInfo()
  },
  onShow: function () {
    console.log('App Show')
@@ -15,6 +15,7 @@
<style lang="scss">
/*每个页面公共css */
@import "uview-ui/index.scss";
// @import "./uni_modules/uview-ui/index.scss";
body{
    font-size: 28rpx;
}
@@ -26,6 +27,16 @@
  justify-content: space-between;
  align-items: center;
}
.empty_wrap{
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    height: 100%;
    image{
        width: 320rpx;
    }
}
.bg{
    width: 100%;
    height: 100%;
h5/api/yw.js
@@ -120,4 +120,11 @@
    url: 'visitsAdmin/cloudService/business/ywPatrolTaskRecord/patrolData',
    data
  })
}
// åˆ†ç±»
export const getCategoryPost = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/category/page',
    data
  })
}
h5/manifest.json
@@ -129,7 +129,7 @@
                "/gateway_interface" : {
                    // è¿™ä¸ªå­—段名需与你配置的basePrefixUrl一致,系统识别到带有/dev-api请求的地址时,会在前面拼接上代理服务器地址
                    // "target" : "http://172.20.10.7:10010", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    "target" : "http://192.168.0.162:10010", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    "target" : "http://192.168.0.163:10010", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    // "target" : "http://10.50.250.253:8088/gateway_interface", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    // "target" : "http://192.168.0.173/gateway_interface", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    "changeOrigin" : true, // å…è®¸è·¨åŸŸ 
h5/pages.json
@@ -67,7 +67,7 @@
            "path" : "pages/polling/detail",
            "style" : 
            {
                "navigationBarTitleText" : "运维详情"
                "navigationBarTitleText" : "任务详情"
            }
        },
        {
h5/pages/operation/device.vue
@@ -61,7 +61,7 @@
                </view>
                <view class="modal_list">
                    <view class="item" v-for="item,i in deviceList" @click="deviceClick(item)">
                        <view class="name">{{ item.name }}</view>
                        <view class="name">[{{item.code}}] {{ item.name }}</view>
                        <image v-if="activeDevice.id == item.id" src="@/static/radioed.png" mode=""></image>
                    </view>
                </view>
@@ -106,7 +106,7 @@
                    multifileList: fileList
                }).then(res => {
                    this.showToast('提交成功')
                    // uni.navigateBack()
                    uni.navigateBack()
                })
            },
            getDevice(){
h5/pages/polling/detail.vue
@@ -7,13 +7,12 @@
            <image v-if="info.status == 2" class="icon" src="@/static/side/ic_dabiaoed.png" mode=""></image>
            <image v-if="info.status == 3" class="icon" src="@/static/side/ic_dabiao.png" mode=""></image>
            <view class="head">
                <view class="name">{{ info.title }}</view>
                <view class="name">{{ info.title || info.planTitle }}</view>
                <view class="status" v-if="info.status || info.status == 0" :style="{color: statusM[info.status].color}">{{statusM[info.status].name}}</view>
            </view>
            <view class="line">
                <view class="la">任务日期:</view>
                <view class="val" v-if="info.startDate && info.endDate">{{ info.startDate.slice(0, 11) }} è‡³
                    {{ info.endDate.slice(0, 11) }}</view>
                <view class="val" v-if="info.startDate">{{ info.startDate.slice(0, 10) }}</view>
            </view>
            <view class="line">
                <view class="la">执行时间:</view>
@@ -22,7 +21,7 @@
            </view>
            <view class="line">
                <view class="la">完成情况:</view>
                <view class="val">{{info.finishNum}}/{{info.patrolNum}}</view>
                <view class="val">{{info.finishNum || 0}}/{{info.patrolNum}}</view>
            </view>
        </view>
        <view class="title">巡检点列表({{list.length}})</view>
@@ -48,7 +47,7 @@
                </view>
            </view>
        </view>
        <view class="footer">
        <view class="footer" v-if="flag">
            <view class="sub_btn">扫码巡检</view>
        </view>
    </view>
@@ -58,13 +57,15 @@
    import {
        ywPatrolDetail,
        ywPatrolTaskRecord
    } from '@/api'
    } from '@/api'
    import dayjs from 'dayjs';
    export default {
        data() {
            return {
                id: '',
                info: {},
                list: [],
                flag: false,
                statusM: [
                    { color: '#4593f7', name: '待开始' },
                    { color: '#73e09a', name: '进行中' },
@@ -81,7 +82,8 @@
            this.getDetail()
        },
        methods: {
            itemClick(item) {
            itemClick(item) {
                if(!this.flag) return
                uni.navigateTo({
                    url: '/pages/polling/point?id=' + item.id
                })
@@ -91,7 +93,9 @@
                    id
                } = this
                ywPatrolDetail(id).then(res => {
                    this.info = res.data
                    this.info = res.data
                    let time = new Date(res.data.startDate.slice(0, 10) + ' 00:00:00').getTime()
                    this.flag = new Date().getTime() > time
                })
                ywPatrolTaskRecord({
                    capacity: 999,
h5/pages/polling/point.vue
@@ -8,7 +8,8 @@
            <template v-if="info.status == 1">
                <view class="line">
                    <div class="la">巡检结果:</div>
                    <div class="val primaryColor" :class="{red: info.dealStatus == 1}">{{ info.dealStatus == 0 ? '正常' : '异常' }}</div>
                    <div class="val primaryColor" :class="{red: info.dealStatus == 1}">{{ info.dealStatus == 0 ? '正常' : '异常' }}
                    </div>
                </view>
                <view class="line">
                    <div class="la">巡检时间:</div>
@@ -23,12 +24,12 @@
        </view>
        <!--  -->
        <view v-if="info.status == 1" class="content">
            <view class="title">巡检记录</view>
            <view class="files">
                <view class="adduser_list_item_ipt1_upload" v-for="(item, i) in info.multifileList" :key="i">
                    <image v-if="item.type == 0" :src="item.fileurlFull" mode="widthFix"></image>
                    <video v-if="item.type == 1" :src="item.fileurlFull" :controls="false"></video>
                </view>
            <view class="title">巡检记录</view>
            <view class="files">
                <view class="adduser_list_item_ipt1_upload" v-for="(item, i) in info.multifileList" :key="i">
                    <image v-if="item.type == 0" :src="item.fileurlFull" mode="widthFix"></image>
                    <video v-if="item.type == 1" :src="item.fileurlFull" :controls="false"></video>
                </view>
            </view>
            <view class="desc">{{ info.dealInfo }}</view>
            <view class="line line_s">
@@ -54,7 +55,13 @@
                        <u-icon name="arrow-right"></u-icon>
                    </view>
                </view>
                <view class="df_sb">
                    <view class="">巡检结果</view>
                    <view class="df_ac" @click="isShowRes = true" v-if="handleParam.dealDate">
                        {{ handleParam.dealName }}
                        <u-icon name="arrow-right"></u-icon>
                    </view>
                </view>
                <view class="label">
                    ä¸Šä¼ å›¾ç‰‡/视频
                </view>
@@ -74,7 +81,7 @@
                <view class="label">处理说明</view>
                <textarea v-model="handleParam.dealInfo" placeholder="请填写处理说明" placeholder-class="placeholder9" />
            </view>
        </view>
        </view>
        <view class="sub_btn" @click="onSubmit">确认巡检</view>
        <!--  -->
        <u-popup :show="showUpload" @close="showUpload = false" closeOnClickOverlay>
@@ -86,52 +93,98 @@
        <!--  -->
        <u-datetime-picker :minDate="new Date().getTime()" :show="isShowHandleDate" @confirm="confirmHandleDate"
            @cancel="isShowHandleDate = false" mode="datetime"></u-datetime-picker>
        <u-picker :show="isShowRes" keyName="name" @cancel="isShowRes = false" @confirm='confirmRes'
            :columns="columns"></u-picker>
    </view>
</template>
<script>
    import {
        uploadUrl,
        ywPatrolPointDetail,
        uploadUrl,
        ywPatrolPointDetail,
        patrolData
    } from '@/api'
    import dayjs from 'dayjs';
    export default {
        data() {
            return {
                id: '',
            return {
                id: '',
                info: {},
                isShowRes: false,
                showUpload: false,
                isShowHandle: false,
                isShowHandleDate: false,
                handleParam: {
                    dealStatus: 1
                handleParam: {
                    dealStatus: 0,
                    dealName: '正常'
                },
                fileList: []
                fileList: [],
                columns: [
                    [{
                            id: 0,
                            name: '正常'
                        },
                        {
                            id: 1,
                            name: '异常'
                        },
                        {
                            id: '',
                            name: '跳过'
                        },
                    ]
                ],
            };
        },
        onLoad(option) {
            this.id = option.id
            this.getDetail()
            this.$set(this.handleParam, 'dealDate', dayjs().format('YYYY-MM-DD HH:mm:ss'))
        },
        onLoad(option) {
            this.id = option.id
            this.getDetail()
            this.$set(this.handleParam, 'dealDate', dayjs().format('YYYY-MM-DD HH:mm:ss'))
        },
        methods: {
            onSubmit() {
                const { handleParam, fileList, id } = this
                patrolData({
                    ...handleParam,
                    multifileList: fileList,
                    id,
                }).then(res => {
                    this.showToast('操作成功')
                    uni.navigateBack()
            onSubmit() {
                const {
                    handleParam,
                    fileList,
                    id
                } = this
                if (handleParam.dealStatus == 1) {
                    return uni.showModal({
                        title: '温馨提示',
                        content: '巡检结果异常,是否前往提交工单?',
                        success: function(res) {
                            if (res.confirm) {
                                patrolData({
                                    ...handleParam,
                                    multifileList: fileList,
                                    id,
                                }).then(res => {
                                    this.showToast('操作成功')
                                    uni.navigateBack()
                                })
                            }
                        }
                    });
                } else {
                    patrolData({
                        ...handleParam,
                        multifileList: fileList,
                        id,
                    }).then(res => {
                        this.showToast('操作成功')
                        uni.navigateBack()
                    })
                }
            },
            getDetail() {
                const {
                    id
                } = this
                ywPatrolPointDetail(id).then(res => {
                    this.info = res.data
                })
            },
            getDetail(){
                const { id } = this
                ywPatrolPointDetail(id).then(res => {
                    this.info  = res.data
                })
            },
            callPhone() {
                uni.makePhoneCall({
@@ -141,6 +194,11 @@
            confirmHandleDate(e) {
                this.$set(this.handleParam, 'dealDate', dayjs(e.value).format('YYYY-MM-DD HH:mm:ss'));
                this.isShowHandleDate = false;
            },
            confirmRes(e) {
                this.$set(this.handleParam, 'dealStatus', e.value[0].id)
                this.$set(this.handleParam, 'dealName', e.value[0].name)
                this.isShowRes = false
            },
            fileDel(str, i) {
                this[str].splice(i, 1);
@@ -300,22 +358,24 @@
            text-align: center;
        }
    }
    .sub_btn{
        position: fixed;
        bottom: 68rpx;
        left: 40rpx;
        width: 670rpx;
        height: 88rpx;
        background: $primaryColor;
        box-shadow: 0rpx 8rpx 20rpx 0rpx rgba(0,104,255,0.3);
        border-radius: 44rpx;
        display: flex;
        align-items: center;
        justify-content: center;
        font-weight: 500;
        font-size: 32rpx;
        color: #FFFFFF;
    .sub_btn {
        position: fixed;
        bottom: 68rpx;
        left: 40rpx;
        width: 670rpx;
        height: 88rpx;
        background: $primaryColor;
        box-shadow: 0rpx 8rpx 20rpx 0rpx rgba(0, 104, 255, 0.3);
        border-radius: 44rpx;
        display: flex;
        align-items: center;
        justify-content: center;
        font-weight: 500;
        font-size: 32rpx;
        color: #FFFFFF;
    }
    .appr_modal {
        .label {
            text {
@@ -372,41 +432,43 @@
            margin-bottom: 30rpx;
        }
    }
    .files{
        display: flex;
        margin-bottom: 20rpx;
    }
    .adduser_list_item_ipt1_upload {
        margin-top: 24rpx;
        width: 156rpx;
        height: 156rpx;
        margin-right: 24rpx;
        border: 2rpx solid #e5e5e5;
        background: #f7f7f7;
        color: #666666;
        font-size: 22rpx;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        position: relative;
        .close {
            position: absolute;
            right: -20rpx;
            top: -20rpx;
            z-index: 9999;
        }
        image {
            width: 100%;
            height: 100%;
        }
        video {
            width: 100%;
            height: 100%;
        }
    }
    .files {
        display: flex;
        margin-bottom: 20rpx;
    }
    .adduser_list_item_ipt1_upload {
        margin-top: 24rpx;
        width: 156rpx;
        height: 156rpx;
        margin-right: 24rpx;
        border: 2rpx solid #e5e5e5;
        background: #f7f7f7;
        color: #666666;
        font-size: 22rpx;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        position: relative;
        .close {
            position: absolute;
            right: -20rpx;
            top: -20rpx;
            z-index: 9999;
        }
        image {
            width: 100%;
            height: 100%;
        }
        video {
            width: 100%;
            height: 100%;
        }
    }
</style>
h5/pages/polling/task.vue
@@ -8,11 +8,11 @@
        </view> -->
        <!--  -->
        <view class="tabs">
            <view class="tab" :class="{active: param.status == 0}" @click="tabsClick(0)">
            <view class="tab" :class="{active: param.queryStatus == '0,1'}" @click="tabsClick('0,1')">
                <text>待处理</text>
                <text class="border"></text>
            </view>
            <view class="tab" :class="{active: param.status == 3}" @click="tabsClick(3)">
            <view class="tab" :class="{active: param.queryStatus == 3}" @click="tabsClick(3)">
                <text>已处理</text>
                <text class="border"></text>
            </view>
@@ -39,10 +39,10 @@
                            gray: item.status == 3 || item.status == 4
                        }">{{statusM[item.status]}}</view>
                    </view>
                    <view class="line" v-if="item.startDate && item.endDate">任务日期:{{ item.startDate.slice(0, 11) }} è‡³ {{ item.endDate.slice(0, 11) }}</view>
                    <view class="line">执行时间:{{ item.startDate.slice(11, 16) }} - {{ item.endDate.slice(11, 16) }}</view>
                    <view class="line" v-if="item.startDate">任务日期:{{ item.startDate.slice(0, 11) }}</view>
                    <view class="line">执行时间:{{ item.startDate.slice(11, 16) }} è‡³ {{ item.endDate.slice(11, 16) }}</view>
                    <view class="line">
                        <view>完成情况:{{item.finishNum}}/{{item.patrolNum}}</view>
                        <view>完成情况:{{item.finishNum || 0}}/{{item.patrolNum}}</view>
                        <view class="btn">
                            <image src="@/static/side/ic_saoma@2x.png" class="saoma" mode=""></image>
                            <view>扫码巡检</view>
@@ -61,7 +61,7 @@
        data() {
            return {
                param: {
                    status: 0
                    queryStatus: '0,1'
                },
                list: [],
                activeTab: 0,
@@ -110,7 +110,7 @@
            getList() {
                const { page, param, selectAll } = this
                ywPatrolTaskPost({
                    model: {...param, dispatchUserId: selectAll ? '' : uni.getStorageSync('userInfo').id, },
                    model: {...param, dealUserId: selectAll ? '' : uni.getStorageSync('userInfo').id, },
                    page,
                    capacity: 10
                }).then(res => {
h5/pages/workOrder/detail.vue
@@ -10,7 +10,7 @@
            <view class="desc">{{ info.content }}</view>
            <view class="file_list">
                <view class="file" v-for="(item,index) in info.fileList">
                    <image v-if="item.type == 0" :src="item.fileurlFull" mode="widthFix"></image>
                    <image v-if="item.type == 0" :src="item.fileurlFull" mode="aspectFill"></image>
                    <video v-if="item.type == 1" :src="item.fileurlFull" :controls="false"></video>
                </view>
            </view>
@@ -33,14 +33,14 @@
                </view>
                <view class="line" v-if="info.getDate">
                    <view class="la">上门时间:</view>
                    <view class="val">{{ info.getDate }}</view>
                    <view class="val">{{ info.getDate.slice(0, 16) }}</view>
                </view>
            </view>
            <view class="result_wrap" v-if="info.dealStatus == 2">
                <div class="title">处理结果</div>
                <view v-if="info.dealFileList && info.dealFileList.length > 0" class="file_list">
                    <view class="file" v-for="item in info.dealFileList">
                        <image v-if="item.type == 0" :src="item.fileurlFull" mode="widthFix"></image>
                        <image v-if="item.type == 0" :src="item.fileurlFull" mode="aspectFill"></image>
                        <video v-if="item.type == 1" :src="item.fileurlFull" :controls="false"></video>
                    </view>
                </view>
@@ -49,7 +49,7 @@
                </view>
                <view class="line">
                    <view class="la">处理人:</view>
                    <view class="val">{{ info.dealUserName }}</view>
                    <view class="val">{{ info.dealUserName }}{{info.dealUserCompany ? '-' + info.dealUserCompany : ''}}</view>
                </view>
                <view class="line">
                    <view class="la">处理时间:</view>
@@ -316,7 +316,8 @@
                image,
                video {
                    width: 156rpx;
                    width: 156rpx;
                    height: 156rpx;
                }
            }
        }
h5/pages/workOrder/edit.vue
@@ -12,14 +12,25 @@
            <view class="item">
                <view class="la"><text class="red">*</text>选择区域</view>
                <view class="line sel_wrap" @click="showModal1 = true">
                    <view class="left" :class="param.projectName ? '' : 'placeholder9'">{{ param.projectName ? `${param.projectName} ${param.buildingName || ''} ${param.areaType == 0 ? param.roomName || '' : param.floorName || ''}` : '请选择' }}</view>
                    <view class="left" :class="param.projectName ? '' : 'placeholder9'">
                        {{ param.projectName ? `${param.projectName} ${param.buildingName || ''} ${param.areaType == 0 ? param.roomNum || '' : param.floorName || ''}` : '请选择' }}
                    </view>
                    <u-icon name="arrow-right" color="#999999" size="15"></u-icon>
                </view>
            </view>
            <view class="item">
                <view class="la"><text class="red">*</text>工单分类</view>
                <view class="line sel_wrap" @click="showCate1 = true">
                    <view class="left" :class="param.cateName ? '' : 'placeholder9'">
                        {{ param.cateName ? param.cateName : '请选择' }}</view>
                    <u-icon name="arrow-right" color="#999999" size="15"></u-icon>
                </view>
            </view>
            <view class="item">
                <view class="la">上门时间</view>
                <view class="line sel_wrap" @click="showTime = true">
                    <view class="left" :class="param.getDate ? '' : 'placeholder9'">{{ param.getDate ? param.getDate : '请选择' }}</view>
                    <view class="left" :class="param.getDate ? '' : 'placeholder9'">{{ param.getDate ? param.getDate : '请选择' }}
                    </view>
                    <u-icon name="arrow-right" color="#999999" size="15"></u-icon>
                </view>
            </view>
@@ -63,11 +74,14 @@
            :columns="buildingList"></u-picker>
        <u-picker :show="showModal3" keyName="name" @cancel="showModal3 = false" @confirm='confirm3'
            :columns="floorList"></u-picker>
        <u-picker :show="showModal4" keyName="name" @cancel="showModal4 = false" @confirm='confirm4'
        <u-picker :show="showModal4" keyName="roomNum" @cancel="showModal4 = false" @confirm='confirm4'
            :columns="roomList"></u-picker>
        <!--  -->
        <u-datetime-picker :minDate="new Date().getTime()" :show="showTime" @confirm="confirmDate"
        <u-datetime-picker :minDate="new Date().getTime()" :show="showTime" @confirm="confirmDate"
            @cancel="showTime = false" mode="datetime"></u-datetime-picker>
        <u-picker :show="showCate1" keyName="name" ref="uPicker" @change="changeHandler" @cancel="showCate1 = false"
            @confirm='confirmCate1' :columns="cateList1"></u-picker>
    </view>
</template>
@@ -77,14 +91,18 @@
        ywProjectPost,
        ywBuildingPost,
        ywFloorPost,
        ywRoomPost,
        ywWorkorderCreate
        ywRoomPost,
        ywWorkorderCreate,
        getCategoryPost
    } from '@/api'
    import dayjs from 'dayjs';
    export default {
        data() {
            return {
                param: {},
                param: {
                    areaName: '室内装修',
                    areaType: 0
                },
                showUpload: false,
                fileList: [],
@@ -92,8 +110,10 @@
                showModal1: false,
                showModal2: false,
                showModal3: false,
                showModal4: false,
                showModal4: false,
                showTime: false,
                showCate1: false,
                showCate2: false,
                areaType: [
                    [{
                            name: '室内装修',
@@ -105,6 +125,8 @@
                        }
                    ]
                ],
                cateList1: [],
                cateList2: [],
                projectList: [],
                buildingList: [],
                floorList: [],
@@ -113,29 +135,59 @@
        },
        onLoad() {
            this.getProject()
            this.getCate()
        },
        methods: {
            onSubmit() {
                const { param, fileList } = this
                ywWorkorderCreate({
                    ...param,
                    // roomId: '',
                    fileList
                }).then(res => {
                    this.showToast('提交成功')
                    uni.redirectTo({
                        url: '/pages/workOrder/list'
                    })
                })
        methods: {
            onSubmit() {
                const {
                    param,
                    fileList
                } = this
                ywWorkorderCreate({
                    ...param,
                    // roomId: '',
                    fileList
                }).then(res => {
                    this.showToast('提交成功')
                    uni.redirectTo({
                        url: '/pages/workOrder/list'
                    })
                })
            },
            confirm0(e) {
            changeHandler(e) {
                const {
                    columnIndex,
                    value,
                    values, // values为当前变化列的数组内容
                    index,
                    // å¾®ä¿¡å°ç¨‹åºæ— æ³•å°†picker实例传出来,只能通过ref操作
                    picker = this.$refs.uPicker
                } = e
                // å½“第一列值发生变化时,变化第二列(后一列)对应的选项
                console.log(index);
                console.log(index);
                if (columnIndex === 0) {
                    // picker为选择器this实例,变化第二列对应的选项
                    picker.setColumnValues(1, this.cateList1[0][index].childCategoryList)
                }
            },
            confirmCate1(e) {
                console.log(e.value[1]);
                if(e.value.length == 2){
                    this.$set(this.param, 'cateId', e.value[1].id)
                    this.$set(this.param, 'cateName', e.value[1].name)
                    this.showCate1 = false
                }
            },
            confirm0(e) {
                const item = e.value[0]
                this.$set(this.param, 'areaType', item.id)
                this.$set(this.param, 'areaName', item.name)
                this.showModal0 = false
                this.param = {
                    areaType: item.id,
                    areaName: item.name,
                this.showModal0 = false
                this.param = {
                    areaType: item.id,
                    areaName: item.name,
                }
            },
            confirm1(e) {
@@ -151,29 +203,47 @@
                this.showModal2 = false
                this.$set(this.param, 'buildingName', item.name)
                this.$set(this.param, 'buildingId', item.id)
                if (this.areaType == 0) {
                    this.getRoom(item.id)
                if (this.param.areaType == 0) {
                    this.getRoom(item.id)
                    this.showModal4 = true
                } else {
                    this.getFloor(item.id)
                    this.getFloor(item.id)
                    this.showModal3 = true
                }
            },
            confirm3(e) {
                const item = e.value[0]
                this.showModal3 = false
                this.$set(this.param, 'floorName', item.name)
                this.$set(this.param, 'floorId', item.id)
            },
            confirm4(e) {
                const item = e.value[0]
                this.showModal4 = false
                this.$set(this.param, 'roomName', item.name)
                this.$set(this.param, 'roomId', item.id)
            },
            confirmDate(e) {
                this.$set(this.param, 'getDate', dayjs(e.value).format('YYYY-MM-DD HH:mm:ss'));
                this.showTime = false
            },
            confirm3(e) {
                const item = e.value[0]
                this.showModal3 = false
                this.$set(this.param, 'floorName', item.name)
                this.$set(this.param, 'floorId', item.id)
            },
            confirm4(e) {
                const item = e.value[0]
                this.showModal4 = false
                this.$set(this.param, 'roomNum', item.roomNum)
                this.$set(this.param, 'roomId', item.id)
            },
            confirmDate(e) {
                this.$set(this.param, 'getDate', dayjs(e.value).format('YYYY-MM-DD HH:mm:ss'));
                this.showTime = false
            },
            getCate() {
                getCategoryPost({
                    capacity: 9999,
                    page: 1,
                    model: {
                        type: 3
                    }
                }).then(res => {
                    let temp = res.data.records || []
                    if (temp && temp.length > 0) {
                        this.cateList1 = [temp, temp[0].childCategoryList || []]
                    } else {
                        this.cateList1 = [temp, []]
                    }
                    console.log(this.cateList1);
                })
            },
            getProject() {
                ywProjectPost().then(res => {
@@ -389,16 +459,17 @@
        font-weight: 500;
        font-size: 32rpx;
        color: #FFFFFF;
    }
    .sel_upload_wrap {
        width: 100%;
        border-top: 1px solid #666666;
        box-shadow: 0 1 1 #333333;
        .btn {
            height: 90rpx;
            line-height: 90rpx;
            text-align: center;
        }
    }
    .sel_upload_wrap {
        width: 100%;
        border-top: 1px solid #666666;
        box-shadow: 0 1 1 #333333;
        .btn {
            height: 90rpx;
            line-height: 90rpx;
            text-align: center;
        }
    }
</style>
h5/pages/workOrder/list.vue
@@ -1,50 +1,58 @@
<template>
    <view class="main_app">
        <view class="head_wrap">
            <view class="search_wrap">
                <image class="mr12 search" src="@/static/home/ic_search@2x.png" mode="widthFix"></image>
                <input v-model="param.roomName" @confirm="handleQuery" type="text" placeholder="搜索楼宇/房间名称"
                    placeholder-class="placeholder9" />
            </view>
        </view>
        <!--  -->
        <view class="tabs">
            <view class="tab" :class="{active: activeTab == -1}" @click="tabsClick(-1)">
                <text>待处理</text>
                <text class="border"></text>
            </view>
            <view class="tab" :class="{active: activeTab == 2}" @click="tabsClick(2)">
                <text>已处理</text>
                <text class="border"></text>
            </view>
            <view class="tab" @click="allClick">
                <view class="name">
                    <image v-if="selectAll" class="icon" src="@/static/checked.png" mode=""></image>
                    <image v-else class="icon" src="@/static/check.png" mode=""></image>
                    <text>查看全部</text>
        <div class="main_head">
            <view class="head_wrap">
                <view class="search_wrap">
                    <image class="mr12 search" src="@/static/home/ic_search@2x.png" mode="widthFix"></image>
                    <input v-model="param.roomName" @confirm="handleQuery" type="text" placeholder="搜索楼宇/房间名称"
                        placeholder-class="placeholder9" />
                </view>
                <text class="border"></text>
            </view>
        </view>
        <!--  -->
        <view class="list">
            <view class="item" v-for="item in list" @click="itemClick(item)">
                <image v-if="item.dealStatus == 0" src="@/static/side/workordered.png" class="icon"></image>
                <image v-else src="@/static/side/workorder.png" class="icon"></image>
                <view class="content">
                    <view class="name_wrap line">
                        <view class="name">{{item.buildingName}}/{{item.roomNum || item.floorName}}</view>
                        <view class="status gray" v-if="item.dealStatus == 2">已处理</view>
                        <view class="status" v-if="item.dealStatus == 0">待处理</view>
                        <view class="status" v-if="item.dealStatus == 1">待处理</view>
            <!--  -->
            <view class="tabs">
                <view class="tab" :class="{active: activeTab == '0,1'}" @click="tabsClick('0,1')">
                    <text>待处理</text>
                    <text class="border"></text>
                </view>
                <view class="tab" :class="{active: activeTab == 2}" @click="tabsClick(2)">
                    <text>已处理</text>
                    <text class="border"></text>
                </view>
                <view class="tab" @click="allClick">
                    <view class="name">
                        <image v-if="selectAll" class="icon" src="@/static/checked.png" mode=""></image>
                        <image v-else class="icon" src="@/static/check.png" mode=""></image>
                        <text>查看全部</text>
                    </view>
                    <view class="line">位置类型:{{item.areaType == '0' ? '室内装修' : '公共区域'}}</view>
                    <view class="line">工单分类:{{item.categoryName}}</view>
                    <view class="line">上报时间:{{item.createDate}}</view>
                    <view class="line">上门时间:{{item.getDate}}</view>
                    <text class="border"></text>
                </view>
            </view>
        </view>
        </div>
        <!--  -->
        <scroll-view scroll-y="true" class="scroll_Y" @scrolltolower="scrolltolower">
            <view class="list">
                <view class="item" v-for="item in list" @click="itemClick(item)">
                    <image v-if="item.dealStatus == 0" src="@/static/side/workordered.png" class="icon"></image>
                    <image v-else src="@/static/side/workorder.png" class="icon"></image>
                    <view class="content">
                        <view class="name_wrap line">
                            <view class="name">{{item.buildingName}}/{{item.roomNum || item.floorName}}</view>
                            <view class="status gray" v-if="item.dealStatus == 2">已处理</view>
                            <view class="status" v-if="item.dealStatus == 0">待处理</view>
                            <view class="status" v-if="item.dealStatus == 1">待处理</view>
                        </view>
                        <view class="line">位置类型:{{item.areaType == '0' ? '室内装修' : '公共区域'}}</view>
                        <view class="line">工单分类:{{item.categoryName}}</view>
                        <view class="line">上报时间:{{item.createDate}}</view>
                        <view class="line">上门时间:{{item.getDate}}</view>
                    </view>
                </view>
                <view v-if="list.length == 0" class="empty_wrap">
                    <image src="@/static/empty.png" mode=""></image>
                    <view class="">暂无数据</view>
                </view>
            </view>
        </scroll-view>
        <!--  -->
    </view>
</template>
@@ -57,7 +65,7 @@
        data() {
            return {
                param: {},
                activeTab: -1,
                activeTab: '0,1',
                selectAll: false,
                list: [],
@@ -68,21 +76,24 @@
        onShow() {
            this.getList()
        },
        onReachBottom() {
            const {total,list} = this
            if (list.length < total) {
                this.page = this.page + 1
                this.getList()
            } else {
                this.showToast('暂无更多数据')
            }
        },
        methods: {
        methods: {
            scrolltolower() {
                const {
                    total,
                    list
                } = this
                if (list.length < total) {
                    this.page = this.page + 1
                    this.getList()
                } else {
                    this.showToast('暂无更多数据')
                }
            },
            tabsClick(val) {
                this.activeTab = val
                this.list = []
                this.page = 1
                this, getList()
                this.getList()
            },
            allClick() {
                this.selectAll = !this.selectAll
@@ -94,11 +105,11 @@
                uni.navigateTo({
                    url: `/pages/workOrder/detail?id=${item.id}`
                })
            },
            handleQuery() {
                this.list = []
                this.page = 1
                this.getList()
            },
            handleQuery() {
                this.list = []
                this.page = 1
                this.getList()
            },
            getList() {
                const {
@@ -106,14 +117,15 @@
                    total,
                    list,
                    activeTab,
                    param,
                    param,
                    selectAll
                } = this
                ywWorkorder({
                    page,
                    capacity: 10,
                    model: {
                        ...param,
                        ...param,
                        queryStatus: activeTab,
                        dispatchUserId: selectAll ? '' : uni.getStorageSync('userInfo').id,
                    }
                }).then(res => {
@@ -203,7 +215,9 @@
        }
    }
    .scroll_Y{
        height: calc(100vh - 320rpx);
    }
    .list {
        .item {
            display: flex;