ll
liukangdong
2024-11-27 e36eed2cdc9335fc4d1b84c8e4e306422638542f
ll
已添加1个文件
已修改25个文件
787 ■■■■ 文件已修改
admin/src/api/Inspection/ywPatrolLine.js 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/Inspection/ywPatrolScheme.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/Inspection/ywPatrolTask.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/company.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/member.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/project/ywProject.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/system/common.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/QueryForm/queryForm.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/components/OperaYwPatrolLineWindow.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/components/OperaYwPatrolPointWindow.vue 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/components/OperaYwPatrolSchemeWindow.vue 196 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/components/taskDetail.vue 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/path.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/plan.vue 83 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/task.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/internalMember.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/client/components/staffEdit.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/client/staffList.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/components/companyEdit.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/components/deviceEdit.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/components/maintain.vue 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/components/maintainDetail.vue 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/record.vue 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/project/components/OperaYwProjectWindow.vue 61 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/project/projectList.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/workorder/components/detail.vue 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/Inspection/ywPatrolLine.js
@@ -24,7 +24,10 @@
export function updateById (data) {
  return request.post('/visitsAdmin/cloudService/business/ywPatrolLine/updateById', data)
}
// è¯¦æƒ…
export function detailById (id) {
  return request.get(`/visitsAdmin/cloudService/business/ywPatrolLine/${id}`)
}
// åˆ é™¤
export function deleteById (id) {
  return request.get(`/visitsAdmin/cloudService/business/ywPatrolLine/delete/${id}`)
admin/src/api/Inspection/ywPatrolScheme.js
@@ -24,11 +24,19 @@
export function updateById (data) {
  return request.post('/visitsAdmin/cloudService/business/ywPatrolScheme/updateById', data)
}
// ä¿®æ”¹
export function updateStatusById (data) {
  return request.post('/visitsAdmin/cloudService/business/ywPatrolScheme/updateStatus', data)
}
// åˆ é™¤
export function deleteById (id) {
  return request.get(`/visitsAdmin/cloudService/business/ywPatrolScheme/delete/${id}`)
}
// åˆ é™¤
export function detailById (id) {
  return request.get(`/visitsAdmin/cloudService/business/ywPatrolScheme/${id}`)
}
// æ‰¹é‡åˆ é™¤
export function deleteByIdInBatch (ids) {
admin/src/api/Inspection/ywPatrolTask.js
@@ -29,6 +29,9 @@
export function deleteById (id) {
  return request.get(`/visitsAdmin/cloudService/business/ywPatrolTask/delete/${id}`)
}
export function getDetail (data) {
  return request.post(`/visitsAdmin/cloudService/business/ywPatrolTaskRecord/page`, data)
}
// æ‰¹é‡åˆ é™¤
export function deleteByIdInBatch (ids) {
admin/src/api/business/company.js
@@ -24,6 +24,13 @@
export function create (data) {
  return request.post('/visitsAdmin/cloudService/business/company/create', data)
}
// åˆ›å»ºè´¢åŠ¡å…¬å¸
export function createFinanceCompany (data) {
  return request.post('/visitsAdmin/cloudService/business/company/createFinanceCompany', data)
}
export function updateFinanceCompany (data) {
  return request.post('/visitsAdmin/cloudService/business/company/updateFinanceCompany', data)
}
// ä¿®æ”¹
export function updateById (data) {
admin/src/api/business/member.js
@@ -46,6 +46,10 @@
export function updateById (data) {
  return request.post('/visitsAdmin/cloudService/business/member/updateById', data)
}
export function updateStatusById (data) {
  return request.post('/visitsAdmin/cloudService/business/member/updateStatusById', data)
}
export function updateHead (data) {
  return request.post('/visitsAdmin/cloudService/business/member/updateHead', data)
}
admin/src/api/project/ywProject.js
@@ -34,6 +34,10 @@
export function deleteById (id) {
  return request.get(`/visitsAdmin/cloudService/business/ywProject/delete/${id}`)
}
// åˆ é™¤
export function detailById (id) {
  return request.get(`/visitsAdmin/cloudService/business/ywProject/${id}`)
}
// æ‰¹é‡åˆ é™¤
export function deleteByIdInBatch (ids) {
admin/src/api/system/common.js
@@ -71,3 +71,7 @@
export function upload (data) {
  return request.post('/visitsAdmin/cloudService/public/upload', data)
}
// èŽ·å–çœå¸‚åŒºæ ‘
export function getCityTree (data) {
  return request.post('/visitsAdmin/cloudService/business/areas/treeList', data)
}
admin/src/components/common/QueryForm/queryForm.vue
@@ -58,8 +58,8 @@
      </template>
      <!-- æ“ä½œ -->
      <el-form-item>
        <el-button type="primary" @click="handleQuery">搜索</el-button>
        <el-button v-if="showQk" @click="clear">重置</el-button>
        <el-button style="width: 56px" type="primary" @click="handleQuery">搜索</el-button>
        <el-button style="width: 56px" v-if="showQk" @click="clear">重置</el-button>
        <slot name="btns" />
        <template v-if="queryFormConfig.formItems.length > listLength">
          <el-button v-if="!showZk" type="text" @click="zkBtn">展开<i
admin/src/views/Inspection/components/OperaYwPatrolLineWindow.vue
@@ -48,7 +48,7 @@
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { getFetchList } from '@/api/Inspection/ywPatrolPoint'
import { create } from '@/api/Inspection/ywPatrolLine'
import { create,detailById } from '@/api/Inspection/ywPatrolLine'
import { Message } from 'element-ui'
export default {
  name: 'OperaYwPatrolLineWindow',
@@ -82,13 +82,21 @@
      if (list.length == 0) return Message.warning('请先选择巡检点')
      form.linePointList = list
      create({ ...form }).then(res => {
        if (res.code == 200) {
          Message.success('保存成功')
        this.$emit('success')
          this.close()
        }
      })
    },
    getDetail(row) {
      detailById(row.id).then(res => {
        this.form = res
        this.list = res.linePointList || []
      })
    },
    initData() {
      this.list = []
      getFetchList({}).then(res => {
        this.pointList = res || []
      })
@@ -130,8 +138,7 @@
          needScancode: '1',
          pointName: i.name,
          pointId: i.id,
          code: i.code,
          id: i.id
          code: i.code
        })
      })
      this.isShowModal = false
admin/src/views/Inspection/components/OperaYwPatrolPointWindow.vue
@@ -30,7 +30,7 @@
        <el-input type="textarea" :rows="4" v-model="form.content" placeholder="请输入" />
      </el-form-item>
      <el-form-item label="上传图片" prop="imgurl">
        <UploadAvatarImage :file="{ 'imgurlfull': form.imgurlfull, 'imgurl': form.imgurl }"
        <UploadAvatarImage :file="{ 'imgurlfull': form.fileFullUrl, 'imgurl': form.fileurl }"
          :uploadData="{ folder: 'ywPatrol/' }" @uploadSuccess="uploadAvatarSuccess" @uploadEnd="isUploading = false"
          @uploadBegin="isUploading = true" />
      </el-form-item>
@@ -45,6 +45,7 @@
import mapDrag from '@/components/common/map/mapDrag.vue'
import { fetchList } from '@/api/business/category'
import { detail } from '@/api/Inspection/ywPatrolPoint'
import { fetchList as getDeiceList } from '@/api/Inspection/device'
export default {
  name: 'OperaYwPatrolPointWindow',
  extends: BaseOpera,
@@ -81,6 +82,7 @@
    open(title, row) {
      this.title = title
      this.visible = true
      this.initData()
      if (row && row.id) {
        this.getDetail(row)
      }
@@ -91,31 +93,37 @@
        // this.$set(this.form, 'areaId', res.areaId)
        // console.log('res', res)
        // console.log('res', this.form)
        this.initData(res.areaId)
      })
    },
    initData(areaId) {
    initData() {
      fetchList({
        model: { type: 4 },
        capacity: 1000,
        page: 1,
      }).then(res => {
        this.cateList = res.records || []
        console.log('this.form.areaId', this.form)
        setTimeout(() => {
          const areaId = this.form.areaId
        if (areaId) {
          this.cateList.forEach(item => {
            if (item.childCategoryList) {
              item.childCategoryList.forEach(item2 => {
                if (item2.id == areaId) {
                  this.$set(this.form, 'areaIds', [item.id, item2.id])
                  console.log('areaIds', this.form)
                }
              })
            }
          })
        }
        }, 1300)
      })
      getDeiceList({
        model: {},
        capacity: 1000,
        page: 1,
      }).then(res => {
        this.deviceList = res.records
      })
    },
@@ -138,8 +146,8 @@
      }
    },
    uploadAvatarSuccess(file) {
      this.form.imgurl = file.imgurl
      this.form.imgurlfull = file.imgurlfull
      this.form.fileurl = file.imgurl
      this.form.fileFullUrl = file.imgurlfull
    },
  }
}
admin/src/views/Inspection/components/OperaYwPatrolSchemeWindow.vue
@@ -1,38 +1,52 @@
<template>
  <GlobalWindow width="520px" :title="title" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
  <GlobalWindow width="520px" :title="title" @close="close" :visible.sync="visible" :confirm-working="isWorking"
    @confirm="confirm">
    <div class="warnning">
      {{ form.id ? '编辑计划对已生成的任务无效,会在下次生成任务时生效,且当天不会生成两个任务' : '新建巡检计划会从当天开始,按照配置规则产生对应的巡检任务' }}
    </div>
    <el-form :model="form" ref="form" :rules="rules">
      <el-form-item label="计划名称" prop="title">
        <el-input v-model="form.title" placeholder="请输入标题" v-trim />
      </el-form-item>
      <el-form-item label="巡检线路">
        <el-select v-model="form.status" filterable clearable>
          <el-option value="0" label="每天"></el-option>
          <el-option value="1" label="每周"></el-option>
          <el-option value="2" label="每月"></el-option>
      <el-form-item label="巡检线路" prop="lineId">
        <el-select v-model="form.lineId" filterable clearable>
          <el-option v-for="item in lineList" :value="item.id" :label="item.name"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="巡检负责人">
      <el-form-item label="巡检负责人" prop="userIds">
        <el-select v-model="form.userIds" filterable clearable>
          <el-option value="0" label="每天"></el-option>
          <el-option value="1" label="每周"></el-option>
          <el-option value="2" label="每月"></el-option>
          <el-option v-for="item in staffList" :value="item.id" :label="item.realname"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="计划开始日期-结束日期">
        <el-date-picker v-model="form.selDate" is-range range-separator="-" value-format="yyyy-MM-dd" type="daterange"
          start-placeholder="开始日期" end-placeholder="结束日期" class="w400" />
      <el-form-item label="计划开始日期-结束日期" prop="selDate">
        <el-date-picker v-model="form.selDate" @change="changeDate" is-range range-separator="-"
          value-format="yyyy-MM-dd" type="daterange" start-placeholder="开始日期" end-placeholder="结束日期" />
      </el-form-item>
      <el-form-item label="计划执行时间">
        <el-time-picker v-model="form.selTime" is-range range-separator="-" format="HH:mm" value-format="HH:mm:ss"
          start-placeholder="开始时间" end-placeholder="结束时间" placeholder="选择时间范围" class="w400" />
        <el-time-picker v-model="form.selTime" @change="changeTime" is-range range-separator="-" format="HH:mm"
          value-format="HH:mm:ss" start-placeholder="开始时间" end-placeholder="结束时间" placeholder="选择时间范围" />
      </el-form-item>
      <el-form-item label="循环周期">
        <el-select v-model="form.circleType" filterable clearable>
          <el-option value="0" label="每天"></el-option>
          <el-option value="1" label="每周"></el-option>
          <el-option value="2" label="每月"></el-option>
      <el-form-item label="重复频率">
        <el-select v-model="form.circleType" @change="changeType" 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 v-if="form.circleType == 1" prop="circleDays" label="重复规则">
        <div class="weeks">
          <div class="week" @click="weekClick(i)" :class="{ active: item.sel }" v-for="item, i in weeks">{{ item.la }}
          </div>
        </div>
      </el-form-item>
      <el-form-item v-if="form.circleType == 2" prop="circleDays" label="重复规则">
        <div class="weeks">
          <div class="week" @click="monthClick(i)" :class="{ active: item.sel }" v-for="item, i in monthsList">{{
            item.la
            }}</div>
        </div>
      </el-form-item>
    </el-form>
  </GlobalWindow>
</template>
@@ -40,6 +54,9 @@
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { fetchList as getLineList } from '@/api/Inspection/ywPatrolLine'
import { detailById } from '@/api/Inspection/ywPatrolScheme'
import { getUserList } from '@/api/system/user'
export default {
  name: 'OperaYwPatrolSchemeWindow',
  extends: BaseOpera,
@@ -63,7 +80,7 @@
        dealUserId: '',
        dealDate: '',
        dealInfo: '',
        circleType: '',
        circleType: 0,
        circleDays: '',
        startDate: '',
        endDate: '',
@@ -71,10 +88,26 @@
        endTime: '',
        processStatus: '',
        selDate: [],
        selTime: [],
      },
      // éªŒè¯è§„则
      lineList: [],
      staffList: [],
      weeks: [
        { la: '周一', va: 1, sel: false },
        { la: '周二', va: 2, sel: false },
        { la: '周三', va: 3, sel: false },
        { la: '周四', va: 4, sel: false },
        { la: '周五', va: 5, sel: false },
        { la: '周六', va: 6, sel: false },
        { la: '周日', va: 7, sel: false },
      ],
      monthsList: [],
      selCircleDays: [],
      rules: {
        title: [{ required: true, message: '请输入' }],
        lineId: [{ required: true, message: '请选择' }],
        userIds: [{ required: true, message: '请选择' }],
        selDate: [{ type: 'array', required: true, message: '请选择' }],
        circleDays: [{ required: true, message: '请选择' }],
      }
    }
  },
@@ -85,10 +118,125 @@
    })
  },
  methods: {
    weekClick(i) {
      this.weeks.forEach((item, index) => {
        if (i == index) { item.sel = !item.sel }
      })
      this.$set(this.form, 'circleDays', this.weeks.filter(j => j.sel).map(a => a.va).join(','))
    },
    monthClick(i) {
      this.monthsList.forEach((item, index) => {
        if (i == index) { item.sel = !item.sel }
      })
      this.$set(this.form, 'circleDays', this.monthsList.filter(j => j.sel).map(a => a.va).join(','))
    },
    changeTime(e) {
      if (e && e.length > 0) {
        this.$set(this.form, 'startTime', e[0])
        this.$set(this.form, 'endTime', e[1])
      } else {
        this.$set(this.form, 'startTime', '')
        this.$set(this.form, 'endTime', '')
      }
    },
    changeDate(e) {
      if (e && e.length > 0) {
        this.$set(this.form, 'startDate', e[0])
        this.$set(this.form, 'endDate', e[1])
      } else {
        this.$set(this.form, 'startDate', '')
        this.$set(this.form, 'endDate', '')
      }
    },
    changeType() {
      this.$set(this.form, 'circleDays', '')
    },
    getDetail(id) {
      detailById(id).then(res => {
        this.form = res
        if (res.userIds) {
          this.$set(this.form, 'userIds', Number(res.userIds))
        }
        if (res.startTime) {
          this.$set(this.form, 'selTime', [res.startTime, res.endTime])
        }
        if (res.circleDays) {
          const circleDays = res.circleDays.split(',')
          if (res.circleType == 1) {
            circleDays.forEach(i => {
              this.weeks.forEach(j => {
                if (i == j.va) {
                  j.sel = true
                }
              })
            })
          } else {
            setTimeout(() => {
              circleDays.forEach(i => {
                this.monthsList.forEach(j => {
                  if (i == j.va) {
                    j.sel = true
                  }
                })
              })
            }, 500)
          }
        }
        this.$set(this.form, 'selDate', [res.startDate, res.endDate])
      })
    },
    initData() {
      getLineList({
        model: {},
        capacity: 9999,
        page: 1,
      }).then(res => {
        this.lineList = res.records
      })
      getUserList({}).then(res => {
        this.staffList = res
      })
      this.monthsList = []
      for (let i = 1; i < 32; i++) {
        this.monthsList.push({ la: i, va: i, sel: false })
      }
    },
    close() {
      this.$refs.form.resetFields()
      this.visible = false
    }
  }
}
</script>
<style lang="scss" scoped>
@import '@/assets/style/variables.scss';
.warnning{
  padding: 6px 10px;
  background-color: #fcf3e6;
  font-size: 12px;
  color: #333333;
}
.weeks {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  .week {
    border: 1px solid #999999;
    width: 40px;
    height: 18px;
    text-align: center;
    line-height: 18px;
    font-size: 12px;
    margin-right: 8px;
    cursor: pointer;
    margin-bottom: 6px;
  }
  .active {
    color: $primary-color;
    border: 1px solid $primary-color;
  }
}
</style>
admin/src/views/Inspection/components/taskDetail.vue
@@ -2,16 +2,22 @@
  <GlobalWindow title="巡检任务详情" :showConfirm="false" :visible.sync="isShowModal">
    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
    <el-table v-loading="loading" :data="list" stripe>
      <el-table-column prop="" label="巡检点名称" min-width="100" show-overflow-tooltip />
      <el-table-column prop="" label="状态" min-width="100" show-overflow-tooltip />
      <el-table-column prop="" label="巡检人" min-width="100" show-overflow-tooltip />
      <el-table-column prop="" label="巡检时间" min-width="100" show-overflow-tooltip />
      <el-table-column prop="" label="巡检结果" min-width="100" show-overflow-tooltip />
      <el-table-column prop="" label="巡检说明" min-width="100" show-overflow-tooltip>
        <template v-slot="scope">
          <span>{{ scope.row.billCode || scope.row.contractNum }}</span>
      <el-table-column prop="pointName" label="巡检点名称" min-width="100" show-overflow-tooltip />
      <el-table-column prop="" label="状态" min-width="100" show-overflow-tooltip>
        <template v-slot="{ row }">
          <span v-if="row.status == 0">待开始</span>
          <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="editDate" label="巡检时间" min-width="100" show-overflow-tooltip />
      <el-table-column prop="" label="巡检结果" min-width="100" show-overflow-tooltip>
        <template v-slot="{ row }">
          <span class="gray" v-if="row.dealStatus == 0">正常</span>
          <span class="red" v-if="row.dealStatus == 1">异常</span>
        </template>
      </el-table-column>
      <el-table-column prop="dealInfo" label="巡检说明" min-width="100" show-overflow-tooltip />
    </el-table>
    <div class="mt20">
      <Pagination @size-change="handleSizeChange" @current-change="getDetail" :pagination="pagination" />
@@ -23,11 +29,12 @@
import GlobalWindow from '@/components/common/GlobalWindow'
import QueryForm from '@/components/common/QueryForm'
import Pagination from '@/components/common/Pagination'
import { getDetail } from '@/api/Inspection/ywPatrolTask'
export default {
  components: { GlobalWindow, QueryForm, Pagination },
  data() {
    return {
      isShowModal: true,
      isShowModal: false,
      id: '',
      pagination: {
        pageSize: 10,
@@ -40,16 +47,19 @@
      queryFormConfig: {
        formItems: [
          {
            filed: 'name',
            filed: 'pointName',
            type: 'input',
            label: '巡检点名称'
          },
          {
            filed: 'status',
            type: 'select',
            label: '执行状态',
            label: '状态',
            placeholder: '全部',
            options: []
            options: [
              { label: '待开始', value: 0 },
              { label: '已巡检', value: 1 },
            ]
          },
        ],
        online: true
@@ -60,10 +70,10 @@
    getDetail(page) {
      const { pagination, filters, id } = this
      this.loading = true
      platformLogPage({
      getDetail({
        model: {
          ...filters,
          id,
          taskId: id,
        },
        sorts: [{ direction: 'DESC', property: 'param1' }],
        capacity: pagination.pageSize,
@@ -71,6 +81,7 @@
      }).then(res => {
        this.loading = false
        this.list = res.records || []
        this.pagination.total = res.total
        this.list.forEach(item => {
          item.inTypeTemp = item.inType == 0 ? '整托盘' : '件烟'
          item.taskOrigin = 'WMS获取'
@@ -94,5 +105,3 @@
  }
}
</script>
<style lang="scss" scoped></style>
admin/src/views/Inspection/path.vue
@@ -91,6 +91,7 @@
    editClick(row) {
      if (row && row.id) {
        this.$refs.operaYwPatrolLineWindow.open('编辑巡检线路')
        this.$refs.operaYwPatrolLineWindow.getDetail(row)
      } else {
        this.$refs.operaYwPatrolLineWindow.open('新建巡检线路')
      }
admin/src/views/Inspection/plan.vue
@@ -2,16 +2,12 @@
  <TableLayout :permissions="['business:ywpatrolscheme:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="标题" prop="title">
      <el-form-item label="计划标题" prop="title">
        <el-input v-model="searchForm.title" placeholder="请输入标题" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="开始日期" prop="startDate">
        <el-date-picker v-model="searchForm.startDate" value-format="yyyy-MM-dd" placeholder="请输入开始日期"
          @change="search" />
      </el-form-item>
      <el-form-item label="结束日期" prop="endDate">
        <el-date-picker v-model="searchForm.endDate" value-format="yyyy-MM-dd" placeholder="请输入结束日期" @change="search" />
      <el-form-item label="计划日期" prop="selDate">
        <el-date-picker type="daterange" v-model="searchForm.selDate" clearable value-format="yyyy-MM-dd"
          @change="changeDate" />
      </el-form-item>
      <section>
@@ -24,7 +20,7 @@
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:ywpatrolscheme:create', 'business:ywpatrolscheme:delete']">
        <li><el-button type="primary" @click="$refs.operaYwPatrolSchemeWindow.open('新建巡检计划')" icon="el-icon-plus"
        <li><el-button type="primary" @click="editClick()" icon="el-icon-plus"
            v-permissions="['business:ywpatrolscheme:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete"
            v-permissions="['business:ywpatrolscheme:delete']">删除</el-button></li>
@@ -34,30 +30,36 @@
        <el-table-column prop="title" label="计划名称" min-width="100px"></el-table-column>
        <el-table-column prop="lineId" label="计划编号" min-width="100px"></el-table-column>
        <el-table-column prop="dealDate" label="负责人员" min-width="100px"></el-table-column>
        <el-table-column prop="userName" label="负责人员" min-width="100px"></el-table-column>
        <el-table-column prop="startDate" label="计划日期" min-width="100px">
        <el-table-column prop="startDate" label="计划日期" min-width="150px">
          <template v-slot="scope">
            <span>{{ scope.row.startDate }} - {{ scope.row.endDate }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="startDate" label="执行时间" min-width="100px">
        <el-table-column prop="startDate" label="执行时间" min-width="130px">
          <template v-slot="scope">
            <span>{{ scope.row.startTime }} - {{ scope.row.endTime }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="" label="创建人" min-width="100px"></el-table-column>
        <el-table-column prop="" label="执行结果" min-width="100px"></el-table-column>
        <el-table-column prop="createUserName" label="创建人" min-width="100px"></el-table-column>
        <el-table-column prop="" label="执行结果" min-width="100px">
          <template v-slot="scope">
            <span v-if="scope.row.schemeStatus == 0">待开始</span>
            <span v-if="scope.row.schemeStatus == 1">进行中</span>
            <span v-if="scope.row.schemeStatus == 2">已结束</span>
          </template>
        </el-table-column>
        <el-table-column label="状态" min-width="100px">
          <template v-slot="scope">
            <el-switch v-model="scope.row.status" @change="changeStatus" 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>
        <el-table-column v-if="containPermissions(['business:ywpatrolscheme:update', 'business:ywpatrolscheme:delete'])"
          label="操作" min-width="120" fixed="right">
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.operaYwPatrolSchemeWindow.open('编辑巡检计划', row)" icon="el-icon-edit"
            <el-button type="text" @click="editClick(row)" icon="el-icon-edit"
              v-permissions="['business:ywpatrolscheme:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
              v-permissions="['business:ywpatrolscheme:delete']">删除</el-button>
@@ -77,6 +79,8 @@
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaYwPatrolSchemeWindow from './components/OperaYwPatrolSchemeWindow'
import { updateStatusById } from '@/api/Inspection/ywPatrolScheme'
import { Message } from 'element-ui'
export default {
  name: 'YwPatrolScheme',
  extends: BaseTable,
@@ -85,28 +89,7 @@
    return {
      // æœç´¢
      searchForm: {
        id: '',
        creator: '',
        createDate: '',
        editor: '',
        editDate: '',
        isdeleted: '',
        title: '',
        remark: '',
        status: '',
        sortnum: '',
        lineId: '',
        userIds: '',
        dealUserId: '',
        dealDate: '',
        dealInfo: '',
        circleType: '',
        circleDays: '',
        startDate: '',
        endDate: '',
        startTime: '',
        endTime: '',
        processStatus: ''
       title: ''
      }
    }
  },
@@ -120,9 +103,33 @@
    this.search()
  },
  methods: {
    changeStatus(e) {
      console.log(e);
      updateStatusById(e).then(res => {
        this.search()
        Message.success('状态修改成功')
      }, () => {
        this.search()
      })
    },
    changeDate(e) {
      if(e && e.length > 0){
        this.$set(this.searchForm, 'startDate', e[0])
        this.$set(this.searchForm, 'endDate', e[1])
      }else{
        this.$set(this.searchForm, 'startDate', '')
        this.$set(this.searchForm, 'endDate', '')
      }
    },
    reset() {
      this.searchForm = {}
      this.search()
    },
    editClick(row) {
      if (row && row.id) {
        this.$refs.operaYwPatrolSchemeWindow.open('编辑巡检计划')
        this.$refs.operaYwPatrolSchemeWindow.getDetail(row.id)
      } else {
        this.$refs.operaYwPatrolSchemeWindow.open('新建巡检计划')
      }
admin/src/views/Inspection/task.vue
@@ -2,11 +2,11 @@
  <TableLayout :permissions="['business:ywpatroltask:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="计划名称" prop="title">
        <el-input v-model="searchForm.title" placeholder="请输入计划名称" @keypress.enter.native="search"></el-input>
      <el-form-item label="计划名称" prop="planTitle">
        <el-input v-model="searchForm.planTitle" placeholder="请输入计划名称" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item >
        <el-select v-model="searchForm.status" filterable clearable>
      <el-form-item label="任务状态">
        <el-select v-model="searchForm.status" label="任务状态" filterable clearable>
          <el-option value="0" label="待开始"></el-option>
          <el-option value="1" label="进行中"></el-option>
          <el-option value="2" label="已超期"></el-option>
@@ -30,11 +30,11 @@
      >
        <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="schemeId" 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="100px">
        <el-table-column prop="dealDate" label="任务时间" min-width="140px">
          <template v-slot="scope">
            <span>{{ scope.row.startDate }} {{ scope.row.endDate }}</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>
@@ -55,7 +55,8 @@
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:ywpatroltask:delete']">取消</el-button>
            <el-button type="text" @click="handleDetail(row)">查看详情</el-button>
            <el-button type="text" @click="cancelById(row)" v-permissions="['business:ywpatroltask:delete']">取消</el-button>
          </template>
        </el-table-column>
      </el-table>
@@ -104,6 +105,9 @@
      this.$refs.TaskDetailRef.id = row.id
      this.$refs.TaskDetailRef.getDetail()
    },
    cancelById() {
    },
  }
}
</script>
admin/src/views/business/internalMember.vue
@@ -171,8 +171,6 @@
          <template slot-scope="{row}">
            <el-button type="text" icon="el-icon-edit" @click="$refs.OperaMemberWindow.open('编辑员工信息', row, department)"
              v-permissions="['business:empower:update']">编辑</el-button>
            <el-button type="text" icon="el-icon-plus" @click="empower(row.id)"
              v-permissions="['business:empower:create']">重新授权</el-button>
            <el-button type="text" :loading="heading" style="color: red" icon="el-icon-delete"
              @click="updateHead(row, 0)" v-if="row.headStatus == 1"
              v-permissions="['business:member:head']">取消主管</el-button>
admin/src/views/client/components/staffEdit.vue
@@ -1,6 +1,6 @@
<template>
  <GlobalWindow :title="title" width="900px" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
    <el-form :model="form" ref="form" :rules="rules">
  <GlobalWindow :title="title" width="820px" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
    <el-form :model="form" ref="form" label-position="top" :rules="rules">
      <div class="list">
        <el-form-item label="客户名称" prop="customerId">
          <el-select v-model="form.customerId" clearable filterable>
admin/src/views/client/staffList.vue
@@ -37,8 +37,12 @@
          </template>
        </el-table-column>
        <el-table-column prop="status" label="状态" min-width="100px">
          <template slot-scope="{row}">
            <span :class="{ red: row.status == 1 }">{{ row.status == '0' ? '正常' : '禁用' }}</span>
            <el-switch v-model="row.status" @change="e => changeStatus(row)" :active-value="0"
              :inactive-value="1">
            </el-switch>
            <!-- <span :class="{ red: row.status == 1 }">{{ row.status == '0' ? '正常' : '禁用' }}</span> -->
          </template>
        </el-table-column>
        <el-table-column v-if="containPermissions(['business:ywcustomer:update', 'business:ywcustomer:delete'])"
@@ -65,6 +69,8 @@
import Pagination from '@/components/common/Pagination'
import OperaYwCustomerWindow from './components/staffEdit.vue'
import { fetchList } from '@/api/client/ywCustomer'
import { updateStatusById } from '@/api/business/member'
import { Message } from 'element-ui'
export default {
  name: 'YwCustomer',
  extends: BaseTable,
@@ -90,6 +96,14 @@
    this.initData()
  },
  methods: {
    changeStatus(e) {
      updateStatusById(e).then(res => {
        this.search()
        Message.success('状态修改成功')
      }, () => {
        this.search()
      })
    },
    initData() {
      fetchList({
        capacity: 9000,
admin/src/views/finance/components/companyEdit.vue
@@ -25,7 +25,7 @@
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
import UploadAvatarImage from '@/components/common/UploadAvatarImage'
import { create, updateById } from '@/api/business/company'
import { createFinanceCompany, updateFinanceCompany } from '@/api/business/company'
import { Message } from 'element-ui'
export default {
  components: { GlobalWindow, UploadAvatarImage },
@@ -52,7 +52,7 @@
      const { param, subLoading } = this
      this.$refs['paramRef'].validate((valid) => {
        if (valid) {
          let fn = param.id ? updateById : create
          let fn = param.id ? updateFinanceCompany : createFinanceCompany
          this.subLoading = true
          fn(param).then(res => {
            this.subLoading = false
admin/src/views/operation/components/deviceEdit.vue
@@ -43,7 +43,7 @@
        </el-select>
      </el-form-item>
      <el-form-item label="照片" prop="">
        <UploadAvatarImage :file="{ 'imgurlfull': param.imgurlfull, 'imgurl': param.imgurl }"
        <UploadAvatarImage :file="{ 'imgurlfull': param.fileFullUrl, 'imgurl': param.fileUrl }"
          :uploadData="{ folder: 'ywDevice/' }" @uploadSuccess="uploadAvatarSuccess" @uploadEnd="isUploading = false"
          @uploadBegin="isUploading = true" />
      </el-form-item>
@@ -109,7 +109,6 @@
                  if (item2.id == cateId) {
                    this.$set(this.param, 'cateIds', [item.id, item2.id])
                    console.log('cateId', this.form)
                  }
                })
              }
@@ -141,8 +140,8 @@
      }
    },
    uploadAvatarSuccess(file) {
      this.$set(this.param, 'imgurl', file.imgurl)
      this.$set(this.param, 'imgurlfull', file.imgurlfull)
      this.$set(this.param, 'fileUrl', file.imgurl)
      this.$set(this.param, 'fileFullUrl', file.imgurlfull)
    },
    close() {
      this.isShowModal = false
admin/src/views/operation/components/maintain.vue
@@ -2,21 +2,21 @@
  <GlobalWindow :title="param.id ? '编辑运维记录' : '新建运维记录'" :confirmWorking="subLoading" :visible.sync="isShowModal"
    width="600px" @close="close" @confirm="handleSub">
    <el-form :model="param" ref="paramRef" :rules="rules">
      <el-form-item label="选择设备" prop="code">
      <el-form-item label="选择设备" prop="deviceId">
        <el-select v-model="param.deviceId" filterable clearable>
          <el-option v-for="item in deviceList" :value="item" :label="item"></el-option>
          <el-option v-for="item in deviceList" :value="item.id" :label="item.name"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="运维人员" prop="code">
        <el-select v-model="param.realName" filterable clearable>
          <el-option v-for="item in 10" :value="item" :label="item"></el-option>
      <el-form-item label="运维人员" prop="userId">
        <el-select v-model="param.userId" filterable clearable>
          <el-option v-for="item in staffList" :value="item.id" :label="item.realname"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="设备状态" prop="">
        <el-select v-model="param.status" filterable clearable>
          <el-option value="0" label="正常"></el-option>
          <el-option value="1" label="损坏"></el-option>
          <el-option value="2" label="报废"></el-option>
          <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="">
@@ -37,17 +37,13 @@
          </div>
        </div>
      </el-form-item>
      <el-form-item label="运维备注" prop="">
        <el-input type="textarea" :rows="4" v-model="param.remark" placeholder="请输入" />
      <el-form-item label="运维备注" prop="content">
        <el-input type="textarea" :rows="4" v-model="param.content" placeholder="请输入" />
      </el-form-item>
      <el-form-item label="运维时间" prop="">
      <el-form-item label="运维时间" prop="dealDate">
        <el-date-picker v-model="param.dealDate" format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss"
          type="datetime"></el-date-picker>
      </el-form-item>
    </el-form>
  </GlobalWindow>
</template>
@@ -56,6 +52,8 @@
import GlobalWindow from '@/components/common/GlobalWindow'
import UploadAvatarImage from '@/components/common/UploadAvatarImage'
import { fetchList } from '@/api/Inspection/device'
import { getUserList } from '@/api/system/user'
import { create, updateById } from '@/api/Inspection/deviceRecord'
import { Message, Loading } from 'element-ui'
export default {
  components: { GlobalWindow, UploadAvatarImage },
@@ -65,9 +63,11 @@
      subLoading: false,
      param: {},
      deviceList: [],
      staffList: [],
      rules: {
        name: [{ required: true, message: '请输入' }],
        code: [{ required: true, message: '请输入' }]
        deviceId: [{ required: true, message: '请选择' }],
        content: [{ required: true, message: '请输入' }],
        // code: [{ required: true, message: '请输入' }],
      },
      loadingInstance: null,
@@ -84,18 +84,19 @@
  },
  methods: {
    handleSub() {
      const { param, subLoading } = this
      const { param, subLoading, fileList } = this
      this.$refs['paramRef'].validate((valid) => {
        if (valid) {
          let fn = param.id ? updateById : create
          if(fileList && fileList.length > 0){
            param.multifileList = fileList
          }
          this.subLoading = true
          fn(param).then(res => {
            if (res.code == 200) {
              this.subLoading = false
              this.$emit('success')
              Message.success('保存成功')
              this.close()
            }
          }).catch(() => {
            this.subLoading = false
          })
@@ -108,9 +109,11 @@
        capacity: 1000,
        page: 1,
      }).then(res => {
        this.deviceList = res || []
        this.deviceList = res.records
      })
      getUserList({}).then(res => {
        this.staffList = res
      })
    },
    changeSel(e) {
      if (e && e.length == 1) {
@@ -155,12 +158,14 @@
      if (['.mp4', '.avi', '.flv', '.wmv'].some(char => item.imgaddr.includes(char))) {
        this.fileList.push({
          type: 1,
          objType: 6,
          fileurl: item.imgaddr,
          fileurlFull: item.url
        })
      } else {
        this.fileList.push({
          type: 0,
          objType: 6,
          fileurl: item.imgaddr,
          fileurlFull: item.url
        })
@@ -184,6 +189,7 @@
.file_list {
  display: flex;
  flex-wrap: wrap;
  .avatar-uploader{
    width: 92px;
    height: 92px;
@@ -192,6 +198,7 @@
    align-items: center;
    border: 1px dashed #d9d9d9;
  }
  .item {
    width: 92px;
    max-height: 92px;
admin/src/views/operation/components/maintainDetail.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,104 @@
<template>
  <GlobalWindow title="设备运维详情" :showConfirm="false" :visible.sync="visible" width="800px">
    <div class="model_wrap">
      <div class="list">
        <div class="item">
          <div class="la">设备名称</div>
          <div class="val">{{ info.deviceName }}</div>
        </div>
        <div class="item">
          <div class="la">设备编号</div>
          <div class="val">{{ info.deviceCode }}</div>
        </div>
        <div class="item">
          <div class="la">设备状态</div>
          <div class="val" v-if="info.status == 0">正常</div>
          <div class="val" v-if="info.status == 1">损坏</div>
          <div class="val" v-if="info.status == 2">报废</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.mobile }}</div>
        </div>
        <div class="item">
          <div class="la">运维时间</div>
          <div class="val">{{ info.dealDate }}</div>
        </div>
        <div class="item max">
          <div class="la">运维备注</div>
          <div class="val">{{ info.content }}</div>
        </div>
        <div class="item max">
          <div class="la">现场照片</div>
          <div class="value" v-if="info.multifileList == null || !info.multifileList.length">无</div>
          <div class="value" v-if="info.multifileList != null && info.multifileList.length">
            <div v-for="item in info.multifileList" :key="item.id" style="display: inline;margin-right: 20px">
              <video v-if="item.fileurlFull && item.fileurlFull.endsWith('.mp4')" ref="videoRef" controls preload="auto"
                style="width: 80px;height: 80px;object-fit: contain;" :src="item.fileurlFull" />
              <el-image v-else-if="item.fileurlFull" style="width:80px; height: 80px" :src="item.fileurlFull"
                :preview-src-list="[item.fileurlFull]">
              </el-image>
            </div>
          </div>
        </div>
      </div>
    </div>
  </GlobalWindow>
</template>
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { detailById } from '@/api/Inspection/deviceRecord'
export default {
  extends: BaseOpera,
  components: { GlobalWindow },
  data() {
    return {
      // è¡¨å•数据
      info: {},
    }
  },
  created() {
  },
  methods: {
    getDetail(id) {
      detailById(id).then(res => {
        this.info = res
      })
    }
  }
}
</script>
<style lang="scss" scoped>
.model_wrap {
  padding-top: 20px;
  .title {
    font-size: 18px;
    font-weight: 600;
    margin-bottom: 16px;
  }
  .list {
    display: flex;
    flex-wrap: wrap;
    .item {
      width: 33.33%;
      margin-bottom: 8px;
      .la {
        color: #7f7f7f
      }
    }
    .max{
      width: 100%;
    }
  }
}
</style>
admin/src/views/operation/record.vue
@@ -7,16 +7,21 @@
      <el-button type="primary" @click="handleEx" v-permissions="['business:ywpatrolline:create']">导出</el-button>
    </div>
    <el-table v-loading="loading" :data="list" stripe>
      <el-table-column prop="" label="运维人" min-width="100" show-overflow-tooltip />
      <el-table-column prop="code" label="设备编号" min-width="100" show-overflow-tooltip />
      <el-table-column prop="name" label="设备名称" min-width="100" show-overflow-tooltip />
      <el-table-column prop="stautsName" label="设备状态" min-width="100" show-overflow-tooltip />
      <el-table-column prop="remark" label="运维备注" min-width="100" show-overflow-tooltip />
      <el-table-column prop="createTime" label="创建时间" min-width="100" show-overflow-tooltip />
      <el-table-column prop="realName" label="运维人" min-width="100" show-overflow-tooltip />
      <el-table-column prop="deviceCode" label="设备编号" min-width="100" show-overflow-tooltip />
      <el-table-column prop="deviceName" label="设备名称" min-width="100" show-overflow-tooltip />
      <el-table-column prop="status" label="设备状态" min-width="100" show-overflow-tooltip>
        <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="content" label="运维备注" min-width="100" show-overflow-tooltip />
      <el-table-column prop="createDate" label="创建时间" min-width="140" show-overflow-tooltip />
      <el-table-column label="操作" min-width="120" fixed="right">
        <template slot-scope="{row}">
          <el-button type="text" @click="handleDetail(row)" icon="el-icon-edit"
            v-permissions="['business:category:update']">查看</el-button>
          <el-button type="text" @click="handleDetail(row)" v-permissions="['business:category:update']">查看</el-button>
        </template>
      </el-table-column>
    </el-table>
@@ -24,6 +29,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>
@@ -31,12 +37,14 @@
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
import Edit from './components/maintain.vue'
import { fetchList, deleteById } from '@/api/Inspection/device'
import Detail from './components/maintainDetail.vue'
import { fetchList, deleteById } from '@/api/Inspection/deviceRecord'
export default {
  components: {
    Pagination,
    QueryForm,
    Edit
    Edit,
    Detail
  },
  data() {
    return {
@@ -105,8 +113,9 @@
      })
    },
    handleDetail() {
    handleDetail(row) {
      this.$refs.DetailRef.visible = true
      this.$refs.DetailRef.getDetail(row.id)
    },
    handleDel(row) {
      let message = `确认删除该记录吗?`
admin/src/views/project/components/OperaYwProjectWindow.vue
@@ -1,17 +1,16 @@
<template>
  <GlobalWindow
    :title="title"
    :visible.sync="visible"
    :confirm-working="isWorking"
    @confirm="confirm"
  >
  <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
    <el-form :model="form" ref="form" :rules="rules">
     
      <el-form-item label="项目名称" prop="name">
        <el-input v-model="form.name" placeholder="请输入名称" v-trim/>
      </el-form-item>
      <el-form-item label="所属地址" prop="addr">
        <el-input v-model="form.addr" placeholder="请输入详细地址"/>
      <el-form-item label="所属地区" prop="addr">
        <el-cascader v-model="form.areaIdT" :props="{
          label: 'name',
          value: 'id',
          children: 'childList'
        }" :options="treeList" @change="handleChange"></el-cascader>
      </el-form-item>
      <el-form-item label="详细地址" prop="addr">
        <el-input v-model="form.addr" placeholder="请输入详细地址"/>
@@ -26,6 +25,8 @@
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { getCityTree } from '@/api/system/common'
import { detailById } from '@/api/project/ywProject'
export default {
  name: 'OperaYwProjectWindow',
  extends: BaseOpera,
@@ -45,14 +46,18 @@
        status: '',
        sortnum: '',
        imgurl: '',
        areaIdT: '',
        cityId: '',
        areaId: '',
        provinceId: '',
        addr: ''
      },
      // éªŒè¯è§„则
      rules: {
        name: [{ required: true, message: '请输入项目名称', trigger: 'blur' }]
      },
      projectList: []
      projectList: [],
      treeList: []
    }
  },
  created () {
@@ -62,6 +67,44 @@
    })
  },
  methods: {
    open(title, target) {
      this.title = title
      this.visible = true
      this.initData()
      this.$nextTick(() => {
        for (const key in this.form) {
          this.form[key] = target[key]
        }
        this.$set(this.form, 'areaIdT', [target.provinceId, target.cityId, target.areaId,])
        // console.log(this.form)
      })
    },
    handleChange(e) {
      if (e && e.length > 0) {
        if (e.length == 3) {
          this.$set(this.form, 'areaId', e[2])
        } else if (e.length == 2) {
          this.$set(this.form, 'areaId', e[1])
        } else {
          this.$set(this.form, 'areaId', e[0])
        }
      }
    },
    getDetail(id) {
      detailById(id).then(res => {
        this.form = res
      })
    },
    initData() {
      getCityTree({
        "type": 0
      }).then(res => {
        this.treeList = res
      })
    }
  }
}
</script>
admin/src/views/project/projectList.vue
@@ -15,7 +15,7 @@
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:ywproject:create', 'business:ywproject:delete']">
        <li><el-button type="primary" @click="$refs.operaYwProjectWindow.open('新建项目')" icon="el-icon-plus" v-permissions="['business:ywproject:create']">新建</el-button></li>
        <li><el-button type="primary" @click="handleEdit()" icon="el-icon-plus" v-permissions="['business:ywproject:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:ywproject:delete']">删除</el-button></li>
      </ul>
      <el-table
@@ -36,7 +36,7 @@
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.operaYwProjectWindow.open('编辑项目', row)" icon="el-icon-edit" v-permissions="['business:ywproject:update']">编辑</el-button>
            <el-button type="text" @click="handleEdit(row)" icon="el-icon-edit" v-permissions="['business:ywproject:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:ywproject:delete']">删除</el-button>
          </template>
        </el-table-column>
@@ -90,6 +90,16 @@
      'field.main': 'id'
    })
    this.search()
  },
  methods: {
    handleEdit(row){
      if(row && row.id){
        this.$refs.operaYwProjectWindow.open('编辑项目', row)
      }else{
        this.$refs.operaYwProjectWindow.open('新建项目')
        // this.$refs.operaYwProjectWindow.open('新建项目')
      }
    }
  }
}
</script>
admin/src/views/workorder/components/detail.vue
@@ -1,5 +1,5 @@
<template>
  <GlobalWindow width="820px" title="工单详情" :visible.sync="visible" :confirm-working="isWorking" @close="close"
  <GlobalWindow width="900px" title="工单详情" :visible.sync="visible" :confirm-working="isWorking" @close="close"
    @confirm="confirm">
    <div class="main">
      <div class="title">
@@ -10,6 +10,7 @@
          <div class="status gray" v-if="info.dealStatus == 2">已处理</div>
        </div>
      </div>
      <div class="main_content">
      <div class="list">
        <div class="item">
          <div class="la">位置类型</div>
@@ -48,11 +49,28 @@
          <div class="value" v-if="info.fileList == null || !info.fileList.length">无</div>
          <div class="value" v-if="info.fileList != null && info.fileList.length">
            <div v-for="item in info.fileList" :key="item.id" style="display: inline;margin-right: 20px">
              <video v-if="item.fileurlFull && item.fileurlFull.endsWith('.mp4')" ref="videoRef" controls preload="auto"
                style="width: 80px;height: 80px;object-fit: contain;" :src="item.fileurlFull" />
                <video v-if="item.fileurlFull && item.fileurlFull.endsWith('.mp4')" ref="videoRef" controls
                  preload="auto" style="width: 80px;height: 80px;object-fit: contain;" :src="item.fileurlFull" />
              <el-image v-else-if="item.fileurlFull" style="width:80px; height: 80px" :src="item.fileurlFull"
                :preview-src-list="[item.fileurlFull]">
              </el-image>
              </div>
            </div>
          </div>
        </div>
        <div class="side">
          <div class="title">工单流转记录员</div>
          <div class="flow_list">
            <div class="item" v-for="item,i in info.logList">
              <div class="icon">
                <div class="dian"></div>
                <div v-if="i < info.logList.length - 1" class="line"></div>
              </div>
              <div class="content">
                <div class="name">{{ item.title }}</div>
                <div class="time">操作时间:{{ item.createDate }}</div>
                <div class="creator">操作人:{{ item.param1 }}</div>
              </div>
            </div>
          </div>
        </div>
@@ -85,8 +103,8 @@
          </el-form-item>
          <el-form-item label="现场图片">
            <div class="file_list">
              <el-upload class="avatar-uploader" :data="uploadData" multiple :limit="6" :auto-upload="true" :action="uploadImgUrl"
                :show-file-list="false" :on-success="uploadAvatarSuccess" :on-error="uploadError"
              <el-upload class="avatar-uploader" :data="uploadData" multiple :limit="6" :auto-upload="true"
                :action="uploadImgUrl" :show-file-list="false" :on-success="uploadAvatarSuccess" :on-error="uploadError"
                :before-upload="beforeUpload">
                <div class="upload_wrap">
                  <i class="el-icon-plus avatar-uploader-icon"></i>
@@ -326,6 +344,46 @@
      width: 100%;
    }
  }
  .main_content{
    display: flex;
    .side{
      width: 240px;
      .title{
        font-size: 14px;
      }
      .flow_list{
        .item{
          display: flex;
          .icon{
            width: 28px;
            display: flex;
            flex-direction: column;
            align-items: center;
            .dian{
              width: 12px;
              height: 12px;
              border-radius: 50%;
              background-color: #e89e42;
            }
            .line{
              width: 1px;
              height: 100%;
              background-color: #e89e42;
            }
          }
          .content{
            font-size: 12px;
            color: #999999;
            padding-bottom: 12px;
            .name{
              font-size: 13px;
              color: #333333;
            }
          }
        }
      }
    }
  }
}
.file_list {