jiangping
2024-11-23 8ac30411bb33e406e0ed5a2b6e2edaf7ab59f11f
Merge remote-tracking branch 'origin/master'
已添加18个文件
已修改22个文件
4030 ■■■■■ 文件已修改
admin/src/api/Inspection/device.js 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/Inspection/ywPatrolPoint.js 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/style/style.scss 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/MemberSearch/index.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/MemberSearch/src/index.vue 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/QueryForm/queryForm.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/area.vue 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/components/OperaYwPatrolLineWindow.vue 171 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/components/OperaYwPatrolPointWindow.vue 93 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/components/OperaYwPatrolSchemeWindow.vue 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/components/areaCate.vue 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/components/taskDetail.vue 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/dot.vue 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/path.vue 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/plan.vue 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/task.vue 86 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/client/staffList.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/contract/components/config.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/contract/components/contractDetail.vue 226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/contract/components/contractEdit.vue 376 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/contract/contractList.vue 147 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/account.vue 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/bull.vue 194 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/company.vue 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/components/accountEdit.vue 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/components/companyEdit.vue 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/components/deviceEdit.vue 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/payments.vue 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/category.vue 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/components/OperaCategoryWindow.vue 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/components/deviceEdit.vue 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/components/maintain.vue 222 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/device.vue 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/record.vue 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/project/buildingList.vue 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/project/components/OperaYwBuildingWindow.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/workorder/components/OperaCategoryWindow.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/workorder/components/OperaYwWorkorderWindow.vue 222 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/workorder/workorderCate.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/workorder/workorderList.vue 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/Inspection/device.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
import request from '../../utils/request'
// æŸ¥è¯¢
export function fetchList (data) {
  return request.post('/visitsAdmin/cloudService/business/ywDevice/page', data, {
    trim: true
  })
}
// å¯¼å‡ºExcel
export function exportExcel (data) {
  return request.post('/visitsAdmin/cloudService/business/ywDevice/exportExcel', data, {
    trim: true,
    download: true
  })
}
// åˆ›å»º
export function create (data) {
  return request.post('/visitsAdmin/cloudService/business/ywDevice/create', data)
}
// ä¿®æ”¹
export function updateById (data) {
  return request.post('/visitsAdmin/cloudService/business/ywDevice/updateById', data)
}
// åˆ é™¤
export function deleteById (id) {
  return request.get(`/visitsAdmin/cloudService/business/ywDevice/delete/${id}`)
}
// æ‰¹é‡åˆ é™¤
export function deleteByIdInBatch (ids) {
  return request.get('/visitsAdmin/cloudService/business/ywDevice/delete/batch', {
    params: {
      ids
    }
  })
}
admin/src/api/Inspection/ywPatrolPoint.js
@@ -6,7 +6,12 @@
    trim: true
  })
}
// æŸ¥è¯¢
export function getFetchList (data) {
  return request.post('/visitsAdmin/cloudService/business/ywPatrolPoint/list', data, {
    trim: true
  })
}
// å¯¼å‡ºExcel
export function exportExcel (data) {
  return request.post('/visitsAdmin/cloudService/business/ywPatrolPoint/exportExcel', data, {
admin/src/assets/style/style.scss
@@ -50,6 +50,9 @@
.green{
  color: #75a236;
}
.gary{
  color: #aaaaaa;
}
.cu{
  cursor: pointer;
}
admin/src/components/common/MemberSearch/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
import Index from './src'
export default Index
admin/src/components/common/MemberSearch/src/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,155 @@
<template>
  <GlobalWindow title="选择客户" width="1000px" @close="close" :visible.sync="isShowMemberList">
    <div>
      <div class="df_ac mb20">
        <el-input v-model="modalSearchValue" placeholder="请输入客户名称" class="w400" @keyup.enter.native="queryList">
          <!-- <el-button slot="append" icon="el-icon-search" @click="queryList()" /> -->
        </el-input>
        <el-button class="ml10" type="primary" @click="queryList()">查询</el-button>
      </div>
      <el-table ref="table" v-loading="listLoading" :data="list" element-loading-text="Loading" border fit
        :header-row-class-name="'table-header'" class="doumee-element-table doumee-element-tableb"
        @row-click="rowClick">
        <el-table-column align="center" label="客户类型" prop="cardName" show-overflow-tooltip min-width="80" />
        <el-table-column align="center" label="客户名称" show-overflow-tooltip prop="remainingMoney" min-width="80" />
        <el-table-column align="center" label="联系人" show-overflow-tooltip prop="remainingGiveMoney" min-width="80" />
        <el-table-column label="联系电话" prop="createTime" min-width="100" align="center" />
        <el-table-column label="统一信用代码" prop="createTime" min-width="120" align="center" />
        <el-table-column label="营业期限" prop="createTime" min-width="100" align="center" />
        <el-table-column label="默认发票类型" prop="createTime" min-width="100" align="center" />
      </el-table>
      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
    </div>
  </GlobalWindow>
</template>
<script>
import { memberList, memberDetailInfo } from '@/api'
import GlobalWindow from '@/components/common/GlobalWindow'
import dayjs from 'dayjs'
// import { debounce } from '@/utils/debounce'
import Pagination from '@/components/common/Pagination'
export default {
  components: {
    Pagination,
    GlobalWindow
  },
  props: {
    isShowChooseBtn: {
      type: Boolean,
      default: () => true
    },
    type: { // (10: å•†å“æŠ˜æ‰£  20: è®¢åœºæŠ˜æ‰£ 30: é—¨ç¥¨æŠ˜æ‰£ 40: å¥—餐折扣 50:活动折扣 60:课程折扣)
      type: String,
      default: 'default'
    }
  },
  data() {
    return {
      searchValue: '',
      isShowMemberList: false,
      modalSearchValue: '',
      list: [],
      totalCount: 0,
      pagination: {
        pageSize: 10,
        page: 1,
        total: 0
      },
      listLoading: false,
    }
  },
  created() {
    // (10: å•†å“æŠ˜æ‰£  20: è®¢åœºæŠ˜æ‰£ 30: é—¨ç¥¨æŠ˜æ‰£ 40: å¥—餐折扣 50:活动折扣 60:课程折扣)
  },
  methods: {
    clearSearch() {
      this.searchValue = ''
      this.modalSearchValue = ''
    },
    handleMemberSelect(item) {
      memberDetailInfo({ param: { memberId: item.id } }).then((res) => {
        if (res.errorCode !== '000000') return
        const obj = res.record || {}
        obj.searchValue = this.searchValue
        this.$emit('select', obj)
      })
    },
    clear() {
      this.searchValue = ''
      setTimeout(() => {
        this.$refs.searchValueRef.focus()
      })
      this.$emit('clear')
    },
    rowClick(item) {
      memberDetailInfo({ param: { memberId: item.id } }).then((res) => {
        if (res.errorCode !== '000000') return
        const obj = res.record || {}
        this.searchValue = obj.nickName
        obj.searchValue = this.modalSearchValue
        if (item.phone) {
          this.searchValue += '-' + item.phone
        }
        if (item.number) {
          this.searchValue += '(' + item.number + ')'
        }
        this.$emit('select', obj)
      })
      this.isShowMemberList = false
    },
    getList() {
      const { pagination, modalSearchValue } = this
      this.listLoading = true
      memberList({ pagination, param: { keyword: modalSearchValue } }).then((res) => {
        this.listLoading = false
        if (res.errorCode !== '000000') return
        this.list = res.recordList
        this.pagination.total = res.total || 0
        this.totalCount = res.totalCount
      }, () => {
        this.listLoading = false
      })
    },
    openModal() {
      this.modalSearchValue = ''
      // this.queryList()
      this.isShowMemberList = true
    },
    queryList() {
      this.pagination.page = 1
      this.getList()
    },
    currentChange(val) {
      this.pagination.page = val
      this.getList()
    },
    clear() {
      this.filters = {}
      this.pagination.pageSize = 10
      this.pagination.page = 1
      this.getList()
    },
    handleSizeChange(capacity) {
      this.pagination.pageSize = capacity
      this.getList()
    },
    close() {
      this.isShowMemberList = false
    }
  }
}
</script>
<style lang="scss" scoped>
.member_search_wrap {
  display: flex;
  ::v-deep .el-input__validateIcon {
    display: none !important;
  }
}
</style>
admin/src/components/common/QueryForm/queryForm.vue
@@ -2,13 +2,13 @@
  <div class="doumee-filter">
    <el-form inline label-suffix=":" @submit.native.prevent>
      <template v-for="(item, index) in queryFormConfig.formItems">
        <el-form-item v-if="item.type === 'input' && (showZk || index < listLength)" :key="item.filed">
        <el-form-item v-if="item.type === 'input' && (showZk || index < listLength)" :label="item.label" :key="item.filed">
          <el-input v-model="searchForm[item.filed]"
            :clearable="(item.clearable !== null && item.clearable !== undefined && item.clearable !== '') ? item.clearable : true"
            :placeholder="item.label" class="w200"
            @change="changeForm(item.filed)" @keyup.enter.native="handlekeyup(item.keyup || false)" />
        </el-form-item>
        <el-form-item v-if="item.type === 'moneySelect' && (showZk || index < listLength)" :key="item.label">
        <el-form-item v-if="item.type === 'moneySelect' && (showZk || index < listLength)" :label="item.label" :key="item.label">
          <el-input v-model="searchForm[item.filedStrt]"
            :clearable="(item.clearable !== null && item.clearable !== undefined && item.clearable !== '') ? item.clearable : true"
            :placeholder="item.start" style="width: 150px" />
@@ -17,7 +17,7 @@
            :clearable="(item.clearable !== null && item.clearable !== undefined && item.clearable !== '') ? item.clearable : true"
            :placeholder="item.end" style="width: 150px" />
        </el-form-item>
        <el-form-item v-if="item.type === 'select' && (showZk || index < listLength)" :key="item.filed">
        <el-form-item v-if="item.type === 'select' && (showZk || index < listLength)" :label="item.label" :key="item.filed">
          <el-select v-model="searchForm[item.filed]" :filterable="item.filterable || true"
            :clearable="(item.clearable !== null && item.clearable !== undefined && item.clearable !== '') ? item.clearable : true"
            :placeholder="item.label" class="w200"
@@ -26,25 +26,25 @@
              :label="item.labelCode ? opt[item.labelCode] : opt.label" />
          </el-select>
        </el-form-item>
        <el-form-item v-if="item.type === 'date' && (showZk || index < listLength)" :key="item.filed">
        <el-form-item v-if="item.type === 'date' && (showZk || index < listLength)" :label="item.label" :key="item.filed">
          <el-date-picker v-model="searchForm[item.filed]" type="date" value-format="yyyy-MM-dd" class="w200"
            :clearable="(item.clearable !== null && item.clearable !== undefined && item.clearable !== '') ? item.clearable : true"
            :placeholder="item.label" :picker-options="item.pickerOptions || {}"
            @change="changeForm(item.filed)" />
        </el-form-item>
        <el-form-item v-if="item.type === 'daterange' && (showZk || index < listLength)" :key="item.filed">
        <el-form-item v-if="item.type === 'daterange' && (showZk || index < listLength)" :label="item.label" :key="item.filed">
          <el-date-picker v-model="searchForm[item.filed]" value-format="yyyy-MM-dd" type="daterange"
            range-separator="至"
            :clearable="(item.clearable !== null && item.clearable !== undefined && item.clearable !== '') ? item.clearable : true"
            :start-placeholder="item.start || ''" :end-placeholder="item.end || ''"
            :picker-options="item.pickerOptions || {}" class="w400" @change="changeForm(item.filed)" />
        </el-form-item>
        <el-form-item v-if="item.type === 'timePicker' && (showZk || index < listLength)" :key="item.filed">
        <el-form-item v-if="item.type === 'timePicker' && (showZk || index < listLength)" :label="item.label" :key="item.filed">
          <el-time-picker v-model="searchForm[item.filed]" is-range range-separator="至" format="HH:mm"
            value-format="HH:mm" start-placeholder="开始时间" end-placeholder="结束时间" placeholder="选择时间范围" class="w400"
            @change="changeForm(item.filed)" />
        </el-form-item>
        <el-form-item v-if="item.type === 'datetimerange' && (showZk || index < listLength)" :key="item.filed">
        <el-form-item v-if="item.type === 'datetimerange' && (showZk || index < listLength)" :label="item.label" :key="item.filed">
          <el-date-picker v-model="searchForm[item.filed]" format="yyyy-MM-dd HH:mm:ss"
            value-format="yyyy-MM-dd HH:mm:ss" type="datetimerange" :default-time="['00:00:00', '23:59:59']"
            :picker-options="item.pickerOptions || pickerOptions" range-separator="至"
@@ -52,7 +52,7 @@
            :start-placeholder="item.start || '开始时间'" :end-placeholder="item.end || '结束时间'" class="w400"
            @change="changeForm(item.filed)" />
        </el-form-item>
        <el-form-item v-if="item.type === 'slot' && (showZk || index < listLength)" :key="item.filed">
        <el-form-item v-if="item.type === 'slot' && (showZk || index < listLength)" :label="item.label" :key="item.filed">
          <slot :name="item.filed" />
        </el-form-item>
      </template>
admin/src/views/Inspection/area.vue
@@ -0,0 +1,107 @@
<template>
  <TableLayout>
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:category:create', 'business:category:delete']">
        <li><el-button type="primary" @click="handleEdit()" icon="el-icon-plus"
            v-permissions="['business:category:create']">新建</el-button></li>
      </ul>
      <el-table row-key="id" :tree-props="{ children: 'childCategoryList' }" v-loading="isWorking.search"
        :data="dataList" stripe @selection-change="handleSelectionChange">
        <el-table-column prop="name" label="工单区域" min-width="100px"></el-table-column>
        <!-- <el-table-column prop="parentName" label="所属分类" min-width="100px"></el-table-column> -->
        <el-table-column prop="sortnum" label="排序码" min-width="100px"></el-table-column>
        <el-table-column v-if="containPermissions(['business:category:update', 'business:category:delete'])" label="操作"
          min-width="120" fixed="right">
          <template slot-scope="{row}">
            <el-button type="text" @click="handleEdit(row)" icon="el-icon-edit"
              v-permissions="['business:category:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
              v-permissions="['business:category:delete']">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
      <pagination @size-change="handleSizeChange" @current-change="getList" :pagination="tableData.pagination">
      </pagination>
    </template>
    <!-- æ–°å»º/修改 -->
    <OperaCategoryWindow v-if="isShowEdit" @close="isShowEdit = false" ref="operaCategoryWindow" @success="getList" />
  </TableLayout>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaCategoryWindow from './components/areaCate.vue'
import { fetchList, deleteById } from '@/api/business/category.js'
export default {
  name: 'Category',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaCategoryWindow },
  data() {
    return {
      // æœç´¢
      filters: {
        parentId: ''
      },
      isShowEdit: false,
      loading: false,
      pagination: {
        pageSize: 10,
        page: 1,
        total: 0,
      },
      dataList: []
    }
  },
  created() {
    this.config({
      module: '车辆信息表',
      api: '/business/category',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.getList()
  },
  methods: {
    handleEdit(row) {
      this.isShowEdit = true
      let str = row && row.id ? '编辑区域' : '新建区域'
      this.$nextTick(() => {
        this.$refs.operaCategoryWindow.open(str)
        this.$refs.operaCategoryWindow.getList()
        if (row && row.id) {
          this.$refs.operaCategoryWindow.getDetail(row.id)
        }
      })
    },
    deleteById(row) {
      this.$confirm(`您确认要删除该区域吗`, '温馨提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        deleteById(row.id).then(res => {
          this.getList()
        })
      })
    },
    getList() {
      const { pagination, filters } = this
      this.loading = true
      fetchList({
        model: { ...filters, type: 4 },
        capacity: pagination.pageSize,
        page: pagination.page,
      }).then(res => {
        this.loading = false
        this.dataList = res.records || []
        this.pagination.total = res.total || 0
      }, () => {
        this.loading = false
      })
    },
  }
}
</script>
admin/src/views/Inspection/components/OperaYwPatrolLineWindow.vue
@@ -1,48 +1,55 @@
<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="creator">
        <el-input v-model="form.creator" placeholder="请输入创建人编码" v-trim/>
      <el-form-item label="线路名称" prop="name">
        <el-input v-model="form.name" placeholder="请输入线路名称" v-trim />
      </el-form-item>
      <el-form-item label="创建时间" prop="createDate">
        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="请输入创建时间"></el-date-picker>
      </el-form-item>
      <el-form-item label="更新人编码" prop="editor">
        <el-input v-model="form.editor" placeholder="请输入更新人编码" v-trim/>
      </el-form-item>
      <el-form-item label="更新时间" prop="editDate">
        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="请输入更新时间"></el-date-picker>
      </el-form-item>
      <el-form-item label="是否删除0否 1是" prop="isdeleted">
        <el-input v-model="form.isdeleted" placeholder="请输入是否删除0否 1是" v-trim/>
      </el-form-item>
      <el-form-item label="名称" prop="name">
        <el-input v-model="form.name" placeholder="请输入名称" v-trim/>
      </el-form-item>
      <el-form-item label="备注" prop="remark">
        <el-input v-model="form.remark" placeholder="请输入备注" v-trim/>
      </el-form-item>
      <el-form-item label="状态 0启用 1禁用" prop="status">
        <el-input v-model="form.status" placeholder="请输入状态 0启用 1禁用" v-trim/>
      </el-form-item>
      <el-form-item label="排序码" prop="sortnum">
        <el-input v-model="form.sortnum" placeholder="请输入排序码" v-trim/>
      </el-form-item>
      <el-form-item label="图标" prop="imgurl">
        <el-input v-model="form.imgurl" placeholder="请输入图标" v-trim/>
      </el-form-item>
      <div class="head">
        <div class="title">巡检点</div>
        <el-button type="primary" @click="openModal">添加巡检点</el-button>
      </div>
      <el-table v-loading="isWorking.search" :data="list" stripe>
        <el-table-column prop="code" label="巡检点编码" min-width="100px"></el-table-column>
        <el-table-column prop="pointName" label="巡检点名称" min-width="100px"></el-table-column>
        <el-table-column prop="name" label="扫码打卡" min-width="100px">
          <template v-slot="scope">
            <el-switch v-model="scope.row.needScancode" @change="changeStatus" active-value="0"
              inactive-value="1"></el-switch>
          </template>
        </el-table-column>
        <el-table-column prop="name" label="排序码" min-width="100px">
          <template v-slot="scope">
            <el-input v-model="scope.row.sortnum" class="w100"></el-input>
          </template>
        </el-table-column>
        <el-table-column prop="name" label="操作" min-width="100px">
          <template v-slot="scope">
            <span class="red cu" @click="handleDel(scope)">删除</span>
          </template>
        </el-table-column>
      </el-table>
    </el-form>
    <!--  -->
    <el-dialog title="添加巡检点" :close-on-click-modal="false" append-to-body :visible.sync="isShowModal" width="500px">
      <el-select class="w400" v-model="selPoint" clearable multiple filterable>
        <el-option v-for="item in pointList" :value="item.id" :label="item.name"></el-option>
      </el-select>
      <span slot="footer" class="dialog-footer">
        <el-button @click="isShowModal = false">取 æ¶ˆ</el-button>
        <el-button type="primary" @click="subModal">ç¡® å®š</el-button>
      </span>
    </el-dialog>
  </GlobalWindow>
</template>
<script>
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 { Message } from 'element-ui'
export default {
  name: 'OperaYwPatrolLineWindow',
  extends: BaseOpera,
@@ -51,28 +58,100 @@
    return {
      // è¡¨å•数据
      form: {
        id: null,
        creator: '',
        createDate: '',
        editor: '',
        editDate: '',
        isdeleted: '',
        name: '',
        remark: '',
        status: '',
        sortnum: '',
        imgurl: ''
      },
      selPoint: [],
      pointList: [],
      list: [],
      isShowModal: false,
      // éªŒè¯è§„则
      rules: {
        name: [{ required: true, message: '请输入' }],
        selPoint: [{ type: 'array', required: true, message: '请输入' }],
      }
    }
  },
  created () {
    this.config({
      api: '/Inspection/ywPatrolLine',
      'field.id': 'id'
    })
  },
  methods: {
    confirm() {
      const { form, list } = this
      if (list.length == 0) return Message.warning('请先选择巡检点')
      form.linePointList = list
      create({ ...form }).then(res => {
        if (res.code == 200) {
          Message.success('保存成功')
          this.close()
        }
      })
    },
    initData() {
      getFetchList({}).then(res => {
        this.pointList = res || []
      })
    },
    handleDel(row) {
      this.list.splice(row.$index, 1)
    },
    changeStatus(row) {
    },
    openModal() {
      this.selPoint = this.list.map(i => i.id)
      this.isShowModal = true
    },
    subModal() {
      const { selPoint, pointList, list } = this
      if (selPoint.length == 0) return Message.warning('请先选择巡检点')
      let arr = []
      // å–出选中列表
      pointList.forEach(item => {
        selPoint.forEach(item2 => {
          if (item.id === item2) {
            arr.push(item)
          }
        })
      })
      // åŒlist去重
      list.forEach(item => {
        arr.forEach((item2, i) => {
          if (item.id === item2.id) {
            arr.splice(i, 1)
          }
        })
      })
      // æ·»åŠ 
      arr.forEach(i => {
        this.list.push({
          needScancode: '1',
          pointName: i.name,
          pointId: i.id,
          code: i.code,
          id: i.id
        })
      })
      this.isShowModal = false
    },
    close(){
      this.visible = false
      this.$emit('success')
    }
  }
}
</script>
<style lang="scss" scoped>
.head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 20px;
  div {
    font-weight: 500;
  }
}
</style>
admin/src/views/Inspection/components/OperaYwPatrolPointWindow.vue
@@ -1,22 +1,36 @@
<template>
  <GlobalWindow
    :title="title"
    :visible.sync="visible"
    :confirm-working="isWorking"
    @confirm="confirm"
  >
  <GlobalWindow :title="title" :visible.sync="visible" width="620px" :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 label="巡检点编码" prop="code">
        <el-input v-model="form.code" placeholder="请输入名称" v-trim />
      </el-form-item>
      <el-form-item label="图标" prop="imgurl">
        <el-input v-model="form.imgurl" placeholder="请输入图标" v-trim/>
      <el-form-item label="巡检点名称" prop="name">
        <el-input v-model="form.name" placeholder="请输入巡检点名称" v-trim />
      </el-form-item>
      <el-form-item label="区域编码(关联category)" prop="areaId">
        <el-input v-model="form.areaId" placeholder="请输入区域编码(关联category)" v-trim/>
      <el-form-item label="巡检设备">
        <el-select v-model="form.deviceId">
          <el-option v-for="item in deviceList" :key="item.id" :label="item.name" :value="item.id"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="地址" prop="addr">
        <el-input v-model="form.addr" placeholder="请输入地址" v-trim/>
      <el-form-item label="所属区域" prop="areaId">
        <el-cascader v-model="form.areaIds" @change="changeSel" placeholder="请选择巡检区域" clearable :options="cateList"
          :props="{
            label: 'name',
            value: 'id',
            children: 'childCategoryList',
            checkStrictly: true
          }"></el-cascader>
      </el-form-item>
      <el-form-item label="经纬度">
      </el-form-item>
      <el-form-item label="巡检内容" prop="content">
        <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 }"
          :uploadData="{ folder: 'projects' }" @uploadSuccess="uploadAvatarSuccess" @uploadEnd="isUploading = false"
          @uploadBegin="isUploading = true" />
      </el-form-item>
    </el-form>
  </GlobalWindow>
@@ -25,31 +39,31 @@
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import UploadAvatarImage from '@/components/common/UploadAvatarImage'
import { fetchList } from '@/api/business/category'
export default {
  name: 'OperaYwPatrolPointWindow',
  extends: BaseOpera,
  components: { GlobalWindow },
  components: { GlobalWindow, UploadAvatarImage },
  data () {
    return {
      // è¡¨å•数据
      form: {
        id: null,
        creator: '',
        createDate: '',
        editor: '',
        editDate: '',
        isdeleted: '',
        name: '',
        remark: '',
        status: '',
        sortnum: '',
        code: '',
        content: '',
        imgurl: '',
        areaId: '',
        addr: ''
      },
      deviceList: [],
      cateList: [],
      // éªŒè¯è§„则
      rules: {
      }
        name: [{ required: true, message: '请输入' }],
        code: [{ required: true, message: '请输入' }],
      },
      isUploading: false,
    }
  },
  created () {
@@ -57,6 +71,35 @@
      api: '/Inspection/ywPatrolPoint',
      'field.id': 'id'
    })
  },
  methods: {
    initData() {
      fetchList({
        model: { type: 4 },
        capacity: 1000,
        page: 1,
      }).then(res => {
        this.cateList = res.records || []
      })
    },
    changeSel(e) {
      if (e && e.length == 1) {
        this.$set(this.form, 'catePId', e[0])
        this.$set(this.form, 'cateId', '')
      } else if (e && e.length == 2) {
        this.$set(this.form, 'catePId', e[0])
        this.$set(this.form, 'cateId', e[1])
      } else {
        this.$set(this.form, 'catePId', '')
        this.$set(this.form, 'cateId', '')
      }
      this.search()
    },
    uploadAvatarSuccess(file) {
      this.form.imgurl = file.imgurl
      this.form.imgurlfull = file.imgurlfull
    },
  }
}
</script>
admin/src/views/Inspection/components/OperaYwPatrolSchemeWindow.vue
@@ -1,38 +1,37 @@
<template>
  <GlobalWindow
    :title="title"
    :visible.sync="visible"
    :confirm-working="isWorking"
    @confirm="confirm"
  >
  <GlobalWindow width="520px" :title="title" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
    <el-form :model="form" ref="form" :rules="rules">
      <el-form-item label="标题" prop="title">
      <el-form-item label="计划名称" prop="title">
        <el-input v-model="form.title" placeholder="请输入标题" v-trim/>
      </el-form-item>
      <el-form-item label="巡检负责人编码集合,多个使用英文逗号隔开" prop="userIds">
        <el-input v-model="form.userIds" placeholder="请输入巡检负责人编码集合,多个使用英文逗号隔开" v-trim/>
      <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-select>
      </el-form-item>
      <el-form-item label="循环周期  0每天 1每周 2每天" prop="circleType">
        <el-input v-model="form.circleType" placeholder="请输入循环周期  0每天 1每周 2每天" v-trim/>
      <el-form-item label="巡检负责人">
        <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-select>
      </el-form-item>
      <el-form-item label="循环重复规则 1-31,多个英文逗号隔开" prop="circleDays">
        <el-input v-model="form.circleDays" placeholder="请输入循环重复规则 1-31,多个英文逗号隔开" v-trim/>
      <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>
      <el-form-item label="开始日期" prop="startDate">
        <el-date-picker v-model="form.startDate" value-format="yyyy-MM-dd" placeholder="请输入开始日期"></el-date-picker>
      <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-form-item>
      <el-form-item label="结束日期" prop="endDate">
        <el-date-picker v-model="form.endDate" value-format="yyyy-MM-dd" placeholder="请输入结束日期"></el-date-picker>
      </el-form-item>
      <el-form-item label="开始时间点" prop="startTime">
        <el-input v-model="form.startTime" placeholder="请输入开始时间点" v-trim/>
      </el-form-item>
      <el-form-item label="结束时间点" prop="endTime">
        <el-input v-model="form.endTime" placeholder="请输入结束时间点" v-trim/>
      <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-select>
      </el-form-item>
    </el-form>
  </GlobalWindow>
@@ -70,7 +69,9 @@
        endDate: '',
        startTime: '',
        endTime: '',
        processStatus: ''
        processStatus: '',
        selDate: [],
        selTime: [],
      },
      // éªŒè¯è§„则
      rules: {
@@ -82,6 +83,12 @@
      api: '/Inspection/ywPatrolScheme',
      'field.id': 'id'
    })
  },
  methods: {
    initData() {
  }
}
}
</script>
admin/src/views/Inspection/components/areaCate.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
<template>
  <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" width="600px" @close="close" @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="parentId">
        <el-select :disabled="form.id" v-model="form.parentId" placeholder="不填为则一级区域">
          <el-option v-for="op in dataList" :key="op.id" :label="op.name" :value="op.id"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="排序码(升序)" prop="sortnum">
        <el-input v-model="form.sortnum" oninput="value=value.replace(/^(0+)|[^\d]+/g, '').slice(0, 6)" v-trim />
      </el-form-item>
    </el-form>
  </GlobalWindow>
</template>
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { create, fetchCateList, getInfoById } from '@/api/business/category.js'
export default {
  name: 'OperaCategoryWindow',
  extends: BaseOpera,
  components: { GlobalWindow },
  data() {
    return {
      // è¡¨å•数据
      form: {
        parentId: null,
        name: '',
        remark: '',
        status: '',
        sortnum: '',
        type: 4
      },
      // éªŒè¯è§„则
      rules: {
        name: [
          { required: true, message: '请输入区域名称', trigger: 'blur' }
        ],
        status: [
          { required: true, message: '请选择是否启用', trigger: 'change' }
        ]
      },
      dataList: []
    }
  },
  created() {
    this.config({
      api: '/business/category',
      'field.id': 'id'
    })
  },
  methods: {
    getList() {
      fetchCateList({ type: 4 }).then(res => {
        this.dataList = res || []
      })
    },
    close() {
      this.visible = false
      this.$emit('close')
    },
    getDetail(id) {
      getInfoById(id).then(res => {
        this.form = res
      })
    },
  }
}
</script>
admin/src/views/Inspection/components/taskDetail.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,98 @@
<template>
  <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>
        </template>
      </el-table-column>
    </el-table>
    <div class="mt20">
      <Pagination @size-change="handleSizeChange" @current-change="getDetail" :pagination="pagination" />
    </div>
  </GlobalWindow>
</template>
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
import QueryForm from '@/components/common/QueryForm'
import Pagination from '@/components/common/Pagination'
export default {
  components: { GlobalWindow, QueryForm, Pagination },
  data() {
    return {
      isShowModal: true,
      id: '',
      pagination: {
        pageSize: 10,
        page: 1,
        total: 0
      },
      filters: {},
      list: [],
      total: 0,
      queryFormConfig: {
        formItems: [
          {
            filed: 'name',
            type: 'input',
            label: '巡检点名称'
          },
          {
            filed: 'status',
            type: 'select',
            label: '执行状态',
            placeholder: '全部',
            options: []
          },
        ],
        online: true
      }
    }
  },
  methods: {
    getDetail(page) {
      const { pagination, filters, id } = this
      this.loading = true
      platformLogPage({
        model: {
          ...filters,
          id,
        },
        sorts: [{ direction: 'DESC', property: 'param1' }],
        capacity: pagination.pageSize,
        page: page || pagination.page,
      }).then(res => {
        this.loading = false
        this.list = res.records || []
        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
      })
    },
    clear() {
      this.filters = {}
      this.pagination.pageSize = 10
      this.pagination.page = 1
      this.getDetail()
    },
    handleSizeChange(capacity) {
      this.pagination.pageSize = capacity
      this.getDetail()
    }
  }
}
</script>
<style lang="scss" scoped></style>
admin/src/views/Inspection/dot.vue
@@ -1,22 +1,44 @@
<template>
  <TableLayout :permissions="['business:ywpatrolpoint:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="巡检点" prop="name">
        <el-input v-model="searchForm.name" placeholder="请输入巡检点名称/编码" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="巡检区域">
        <el-cascader v-model="searchForm.areaIds" @change="changeSel" placeholder="请选择巡检区域" clearable
          :options="areaList" :props="{
            label: 'name',
            value: 'id',
            children: 'childCategoryList',
            checkStrictly: true
          }"></el-cascader>
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:ywpatrolline:exportExcel']"
          @click="exportExcel">导出</el-button>
        <el-button @click="reset">重置</el-button>
      </section>
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:ywpatrolpoint:create', 'business:ywpatrolpoint:delete']">
        <li><el-button type="primary" @click="$refs.operaYwPatrolPointWindow.open('新建巡检点')" icon="el-icon-plus"
        <li><el-button type="primary" @click="editClick()" icon="el-icon-plus"
            v-permissions="['business:ywpatrolpoint:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete"
            v-permissions="['business:ywpatrolpoint: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>
        <el-table-column prop="name" label="名称" min-width="100px"></el-table-column>
        <el-table-column prop="status" label="状态 0启用 1禁用" min-width="100px"></el-table-column>
        <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 v-if="containPermissions(['business:ywpatrolpoint:update', 'business:ywpatrolpoint:delete'])"
          label="操作" min-width="120" fixed="right">
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.operaYwPatrolPointWindow.open('编辑巡检点', row)" icon="el-icon-edit"
            <el-button type="text" @click="editClick(row)" icon="el-icon-edit"
              v-permissions="['business:ywpatrolpoint:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
              v-permissions="['business:ywpatrolpoint:delete']">删除</el-button>
@@ -36,6 +58,7 @@
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaYwPatrolPointWindow from './components/OperaYwPatrolPointWindow'
import { fetchList } from '@/api/business/category'
export default {
  name: 'YwPatrolPoint',
  extends: BaseTable,
@@ -57,7 +80,8 @@
        imgurl: '',
        areaId: '',
        addr: ''
      }
      },
      areaList: []
    }
  },
  created() {
@@ -68,6 +92,39 @@
      'field.main': 'id'
    })
    this.search()
    this.getProject()
  },
  methods: {
    getProject() {
      fetchList({
        model: {type: 4},
        capacity: 1000,
        page: 1,
      }).then(res => {
        this.areaList = res.records || []
      })
    },
    editClick(row) {
      if (row && row.id) {
        this.$refs.operaYwPatrolPointWindow.open('编辑巡检点')
      } else {
        this.$refs.operaYwPatrolPointWindow.open('新建巡检点')
      }
      this.$refs.operaYwPatrolPointWindow.initData()
    },
    changeSel(e) {
      if (e && e.length == 1) {
        this.$set(this.searchForm, 'catePId', e[0])
        this.$set(this.searchForm, 'cateId', '')
      } else if (e && e.length == 2) {
        this.$set(this.searchForm, 'catePId', e[0])
        this.$set(this.searchForm, 'cateId', e[1])
      } else {
        this.$set(this.searchForm, 'catePId', '')
        this.$set(this.searchForm, 'cateId', '')
      }
      this.search()
    },
  }
}
</script>
admin/src/views/Inspection/path.vue
@@ -2,50 +2,45 @@
  <TableLayout :permissions="['business:ywpatrolline:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="名称" prop="name">
        <el-input v-model="searchForm.name" placeholder="请输入名称" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="计划日期">
        <el-input v-model="searchForm.name" placeholder="请输入名称" @keypress.enter.native="search"></el-input>
      <el-form-item label="巡检线路" prop="name">
        <el-input v-model="searchForm.name" placeholder="请输入巡检线路名称" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:ywpatrolline:exportExcel']" @click="exportExcel">导出</el-button>
        <!-- <el-button type="primary" :loading="isWorking.export" v-permissions="['business:ywpatrolline:exportExcel']"
          @click="exportExcel">导出</el-button> -->
        <el-button @click="reset">重置</el-button>
      </section>
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:ywpatrolline:create', 'business:ywpatrolline:delete']">
        <li><el-button type="primary" @click="$refs.operaYwPatrolLineWindow.open('新建巡检线路')" 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 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>
      </ul>
      <el-table
        v-loading="isWorking.search"
        :data="tableData.list"
        stripe
        @selection-change="handleSelectionChange"
      >
      <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="name" label="名称" min-width="100px"></el-table-column>
        <el-table-column prop="status" label="状态 0启用 1禁用" min-width="100px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['business:ywpatrolline:update', 'business:ywpatrolline:delete'])"
          label="操作"
          min-width="120"
          fixed="right"
        >
        <el-table-column prop="name" label="线路名称" min-width="100px"></el-table-column>
        <el-table-column prop="lineAmount" label="巡检点数量" min-width="100px"></el-table-column>
        <el-table-column prop="status" 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>
          </template>
        </el-table-column>
        <el-table-column v-if="containPermissions(['business:ywpatrolline:update', 'business:ywpatrolline:delete'])"
          label="操作" min-width="120" fixed="right">
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.operaYwPatrolLineWindow.open('编辑巡检线路', row)" icon="el-icon-edit" v-permissions="['business:ywpatrolline:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:ywpatrolline:delete']">删除</el-button>
            <el-button type="text" @click="editClick(row)" icon="el-icon-edit"
              v-permissions="['business:ywpatrolline:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
              v-permissions="['business:ywpatrolline: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>
    <!-- æ–°å»º/修改 -->
@@ -88,6 +83,20 @@
      'field.main': 'id'
    })
    this.search()
  },
  methods: {
    changeStatus() {
    },
    editClick(row) {
      if (row && row.id) {
        this.$refs.operaYwPatrolLineWindow.open('编辑巡检线路')
      } else {
        this.$refs.operaYwPatrolLineWindow.open('新建巡检线路')
      }
      this.$refs.operaYwPatrolLineWindow.initData()
    },
  }
}
</script>
admin/src/views/Inspection/plan.vue
@@ -7,7 +7,8 @@
        <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-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"/>
@@ -15,52 +16,55 @@
     
      <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 type="primary" :loading="isWorking.export" v-permissions="['business:ywpatrolscheme:exportExcel']"
          @click="exportExcel">导出</el-button>
        <el-button @click="reset">重置</el-button>
      </section>
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <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" 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>
        <li><el-button type="primary" @click="$refs.operaYwPatrolSchemeWindow.open('新建巡检计划')" 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>
      </ul>
      <el-table
        v-loading="isWorking.search"
        :data="tableData.list"
        stripe
        @selection-change="handleSelectionChange"
      >
      <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="title" label="标题" min-width="100px"></el-table-column>
        <el-table-column prop="status" label="状态 0启用 1禁用" min-width="100px"></el-table-column>
        <el-table-column prop="lineId" label="巡检点编码(关联yw_patrol_line)" min-width="100px"></el-table-column>
        <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="dealDate" label="处理时间" min-width="100px"></el-table-column>
        <el-table-column prop="dealInfo" label="处理备注" min-width="100px"></el-table-column>
        <el-table-column prop="startDate" label="开始日期" min-width="100px"></el-table-column>
        <el-table-column prop="endDate" label="结束日期" min-width="100px"></el-table-column>
        <el-table-column prop="startTime" label="开始时间点" min-width="100px"></el-table-column>
        <el-table-column prop="endTime" label="结束时间点" min-width="100px"></el-table-column>
        <el-table-column prop="processStatus" label="执行进度 0待开始 1进行中 2超期 3已完成" min-width="100px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['business:ywpatrolscheme:update', 'business:ywpatrolscheme:delete'])"
          label="操作"
          min-width="120"
          fixed="right"
        >
        <el-table-column prop="startDate" label="计划日期" min-width="100px">
          <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">
          <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 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>
          </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" 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>
            <el-button type="text" @click="$refs.operaYwPatrolSchemeWindow.open('编辑巡检计划', 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>
          </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>
    <!-- æ–°å»º/修改 -->
@@ -114,6 +118,17 @@
      'field.main': 'id'
    })
    this.search()
  },
  methods: {
    editClick(row) {
      if (row && row.id) {
        this.$refs.operaYwPatrolSchemeWindow.open('编辑巡检计划')
      } else {
        this.$refs.operaYwPatrolSchemeWindow.open('新建巡检计划')
      }
      this.$refs.operaYwPatrolSchemeWindow.initData()
    },
  }
}
</script>
admin/src/views/Inspection/task.vue
@@ -2,15 +2,17 @@
  <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="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 >
        <el-select v-model="searchForm.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="3" label="已完成"></el-option>
          <el-option value="4" label="已取消"></el-option>
        </el-select>
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
@@ -20,10 +22,6 @@
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:ywpatroltask:create', 'business:ywpatroltask:delete']">
        <li><el-button type="primary" @click="$refs.operaYwPatrolTaskWindow.open('新建巡检任务')" icon="el-icon-plus" v-permissions="['business:ywpatroltask:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:ywpatroltask:delete']">删除</el-button></li>
      </ul>
      <el-table
        v-loading="isWorking.search"
        :data="tableData.list"
@@ -31,16 +29,25 @@
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="title" label="标题" min-width="100px"></el-table-column>
        <el-table-column prop="status" label="状态 0待开始 1进行中 2已超期 3已完成 4已取消" min-width="100px"></el-table-column>
        <el-table-column prop="schemeId" label="巡检计划编码(关联yw_patrol_scheme)" min-width="100px"></el-table-column>
        <el-table-column prop="dealUserId" label="处理人编码(关联system_user)" min-width="100px"></el-table-column>
        <el-table-column prop="dealDate" label="处理时间" min-width="100px"></el-table-column>
        <el-table-column prop="dealInfo" label="处理备注" min-width="100px"></el-table-column>
        <el-table-column prop="startDate" label="开始日期" min-width="100px"></el-table-column>
        <el-table-column prop="endDate" label="结束日期" min-width="100px"></el-table-column>
        <el-table-column prop="dealStatus" label="巡检结果  0正常 1异常" min-width="100px"></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="code" label="任务编号" min-width="100px"></el-table-column>
        <el-table-column prop="dealDate" label="任务时间" min-width="100px">
          <template v-slot="scope">
            <span>{{ scope.row.startDate }} {{ scope.row.endDate }}</span>
          </template>
        </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="dealStatus" label="任务状态" min-width="100px">
          <template v-slot="scope">
            <span class="primaryColor" v-if="scope.row.status == 0">待开始</span>
            <span class="green" v-if="scope.row.status == 1">进行中</span>
            <span class="red" v-if="scope.row.status == 2">已超期</span>
            <span class="gray" v-if="scope.row.status == 3">已完成</span>
            <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="操作"
@@ -48,8 +55,7 @@
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.operaYwPatrolTaskWindow.open('编辑巡检任务', row)" icon="el-icon-edit" v-permissions="['business:ywpatroltask:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:ywpatroltask:delete']">删除</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:ywpatroltask:delete']">取消</el-button>
          </template>
        </el-table-column>
      </el-table>
@@ -60,7 +66,8 @@
      >
      </pagination>
    </template>
    <!--  -->
    <TaskDetail ref="TaskDetailRef" />
  </TableLayout>
</template>
@@ -68,33 +75,17 @@
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import TaskDetail from './components/taskDetail'
export default {
  name: 'YwPatrolTask',
  extends: BaseTable,
  components: { TableLayout, Pagination },
  components: { TableLayout, Pagination, TaskDetail },
  data () {
    return {
      // æœç´¢
      searchForm: {
        id: '',
        creator: '',
        createDate: '',
        editor: '',
        editDate: '',
        isdeleted: '',
        title: '',
        remark: '',
        status: '',
        sortnum: '',
        schemeId: '',
        pointId: '',
        dealUserId: '',
        dealDate: '',
        dealInfo: '',
        circleType: '',
        startDate: '',
        endDate: '',
        dealStatus: ''
        status: ''
      }
    }
  },
@@ -106,6 +97,13 @@
      'field.main': 'id'
    })
    this.search()
  },
  methods: {
    handleDetail(row) {
      this.$refs.TaskDetailRef.isShowModal = true
      this.$refs.TaskDetailRef.id = row.id
      this.$refs.TaskDetailRef.getDetail()
    },
  }
}
</script>
admin/src/views/client/staffList.vue
@@ -5,6 +5,9 @@
      <el-form-item label="客户名称" prop="name">
        <el-input v-model="searchForm.name" placeholder="请输入客户名称" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item prop="name">
        <el-input v-model="searchForm.name" placeholder="请输入人员姓名/手机号" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:ywcustomer:exportExcel']"
@@ -21,10 +24,11 @@
            v-permissions="['business:ywcustomer: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>
        <el-table-column prop="name" label="客户名称" min-width="100px"></el-table-column>
        <el-table-column prop="memberName" label="联系人" min-width="100px"></el-table-column>
        <el-table-column prop="phone" label="联系电话" min-width="100px"></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 v-if="containPermissions(['business:ywcustomer:update', 'business:ywcustomer:delete'])"
          label="操作" min-width="120" fixed="right">
          <template slot-scope="{row}">
admin/src/views/contract/components/config.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
export const rules = {
  name: [{ required: true, message: '请输入' }]
}
admin/src/views/contract/components/contractDetail.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,226 @@
<template>
  <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" @close="close"
    @confirm="confirm">
    <div class="home_title">
      <div class="left">
        <span class="mr10">单位名称:xxx</span>
        <span class="status">status</span>
      </div>
      <el-button plain type="danger">退租</el-button>
    </div>
    <div class="remark">合同摘要:xxxx</div>
    <div class="tabs">
      <div class="tab" :class="{ active: activeTabs == 0 }" @click="tabsClick(0)">合同信息</div>
      <div class="tab" :class="{ active: activeTabs == 1 }" @click="tabsClick(1)">关联账单</div>
      <div class="tab" :class="{ active: activeTabs == 2 }" @click="tabsClick(2)">操作记录</div>
    </div>
    <div class="main">
      <div class="title">基础信息</div>
      <div class="list">
        <div class="item">
          <div class="la">合同编号</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
        <div class="item">
          <div class="la">经办人</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
        <div class="item">
          <div class="la">创建人</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
        <div class="item">
          <div class="la">合同租赁数</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
        <div class="item">
          <div class="la">所属公司</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
        <div class="item">
          <div class="la">签订日期</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
        <div class="item">
          <div class="la">开始日期</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
        <div class="item">
          <div class="la">结束日期</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
        <div class="item">
          <div class="la">所属项目</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
        <div class="item">
          <div class="la">结果取整(四舍五入)</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
      </div>
      <div class="title">房源信息</div>
      <div class="list">
        <div class="item">
          <div class="la">项目名称</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
        <div class="item">
          <div class="la">楼宇名称</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
        <div class="item">
          <div class="la">楼层/房号</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
        <div class="item">
          <div class="la">面积</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
      </div>
      <div class="title">租客信息</div>
      <div class="list">
        <div class="item">
          <div class="la">租客</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
        <div class="item">
          <div class="la">经办人</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
      </div>
      <div class="title">租赁条款</div>
      <div class="list">
        <div class="item">
          <div class="la">押金金额</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
        <div class="item">
          <div class="la">付款方式</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
        <div class="item">
          <div class="la">免租期</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
      </div>
      <el-table :data="info.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>
    </div>
  </GlobalWindow>
</template>
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
import BaseOpera from '@/components/base/BaseOpera'
export default {
  components: {
    GlobalWindow
  },
  extends: BaseOpera,
  data() {
    return {
      id: '',
      visible: false,
      activeTabs: '',
      info: {}
    }
  },
  methods: {
    tabsClick(val) {
      this.activeTabs = val
    },
    getDetail() {
    }
  }
}
</script>
<style lang="scss" scoped>
@import '@/assets/style/variables.scss';
.home_title {
  display: flex;
  justify-content: space-between;
  align-items: center;
  .left {
    font-weight: 500;
    font-size: 16px;
    margin-right: 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;
      color: #00BA92;
    }
  }
}
.remark {
  background: #E8EBF7;
  border-radius: 2px;
  padding: 10px 20px;
  font-size: 16px;
  margin: 20px 0
}
.tabs {
  border-bottom: 1px solid #DFE2E8;
  display: flex;
  margin-bottom: 20px;
  .tab {
    height: 58px;
    line-height: 58px;
    font-size: 16px;
    color: #666666;
    margin-right: 30px;
    cursor: pointer;
  }
  .active {
    font-weight: 500;
    color: $primary-color;
    border-bottom: 2px solid $primary-color;
  }
}
.main {
  .title {
    font-weight: 500;
    font-size: 18px;
    color: $primary-color;
    margin-bottom: 15px;
  }
  .list {
    display: flex;
    flex-wrap: wrap;
    background: #F7F7F7;
    border-radius: 2px;
    padding: 15px 20px;
    margin-bottom: 20px;
    .item {
      width: 25%;
      margin-bottom: 16px;
      .la {
        color: #7f7f7f;
        margin-top: 2px;
      }
    }
  }
}
</style>
admin/src/views/contract/components/contractEdit.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,376 @@
<template>
  <GlobalWindow width="1000px" :title="title" :visible.sync="showModal" :confirm-working="isWorking" @close="close" @confirm="confirm">
    <div class="tabs">
      <div class="tab" :class="{ active: activeTabs == 0 }" @click="tabsClick(0)">1、基本信息</div>
      <div class="tab" :class="{ active: activeTabs == 1 }" @click="tabsClick(1)">2、费用条款</div>
    </div>
    <template v-if="activeTabs == 0">
      <div class="main">
        <div class="main_content">
          <el-form :model="param" ref="paramRef" :rules="rules">
            <div class="m_title">基础信息</div>
            <div class="list">
              <el-form-item label="合同类型" prop="type">
                <el-select v-model="param.type" placeholder="请选择" clearable>
                  <el-option v-for="item in types" :value="item.value" :label="item.name"></el-option>
                </el-select>
              </el-form-item>
              <el-form-item label="合同编号" prop="code">
                <el-input v-model="param.code" placeholder="请输入合同编号" v-trim />
              </el-form-item>
              <el-form-item label="经办人" prop="aaa">
                <el-select v-model="param.aaa" placeholder="请选择" clearable>
                  <el-option v-for="item in agentList" :value="item.id" :label="item.name"></el-option>
                </el-select>
              </el-form-item>
              <el-form-item label="合同签订日期" prop="">
                <el-date-picker type="date" v-model="param.getDate" value-format="yyyy-MM-dd" placeholder="请选择" />
              </el-form-item>
              <el-form-item label="合同开始日期" prop="">
                <el-date-picker type="date" v-model="param.getDate" value-format="yyyy-MM-dd" placeholder="请选择" />
              </el-form-item>
              <el-form-item label="合同结束日期" prop="">
                <el-date-picker type="date" v-model="param.getDate" value-format="yyyy-MM-dd" placeholder="请选择" />
              </el-form-item>
              <el-form-item label="归属项目" prop="">
                <el-select v-model="param.aaa" placeholder="请选择" clearable>
                  <el-option v-for="item in projectList" :value="item.id" :label="item.name"></el-option>
                </el-select>
              </el-form-item>
              <el-form-item label="结果取整(四舍五入)" prop="">
                <el-select v-model="param.aaa" placeholder="请选择" clearable>
                  <el-option :value="0" label="否"></el-option>
                  <el-option :value="1" label="是"></el-option>
                </el-select>
              </el-form-item>
              <el-form-item label="所属公司" prop="">
                <el-select v-model="param.aaa" placeholder="请选择" clearable>
                  <el-option v-for="item in comparyList" :value="item.id" :label="item.name"></el-option>
                </el-select>
              </el-form-item>
            </div>
            <div class="m_title">租客信息</div>
            <div class="list">
              <el-form-item label="租客" prop="">
                <el-button @click="handleRent" type="primary">选择租客</el-button>
                <el-select v-model="param.aaa" placeholder="请选择" clearable>
                  <el-option v-for="item in renterList" :value="item.id" :label="item.name"></el-option>
                </el-select>
              </el-form-item>
              <el-form-item label="联系人" prop="">
                <el-select v-model="param.aaa" placeholder="请选择" clearable>
                  <el-option v-for="item in contacts" :value="item.id" :label="item.name"></el-option>
                </el-select>
              </el-form-item>
            </div>
          </el-form>
        </div>
        <div class="main_house">
          <div class="title">请选择房源</div>
          <el-cascader style="width: 300px" v-model="value" @change="houseChange" :options="options"
            :props="{ multiple: true }" collapse-tags clearable />
        </div>
      </div>
      <div class="file_wrap">
        <div class="head">
          <div>合同附件</div>
          <el-button icon="el-icon-plus" plain>添加附件</el-button>
        </div>
        <el-table :data="param.list" stripe>
          <el-table-column prop="" label="附件名称" align="center" min-width="100" show-overflow-tooltip />
          <el-table-column prop="" label="操作人" align="center" min-width="100" show-overflow-tooltip />
          <el-table-column prop="" label="操作时间" align="center" min-width="100" show-overflow-tooltip />
          <el-table-column prop="" label="操作" align="center" min-width="100">
            <template v-slot="scope">
              <span class="cu red">删除</span>
            </template>
          </el-table-column>
        </el-table>
      </div>
    </template>
    <template v-if="activeTabs == 1">
      <div class="tabs cost_tabs">
        <div class="tab" :class="{ active: cactiveTabs == 0 }" @click="ctabsClick(0)">租赁条款</div>
        <div class="tab" :class="{ active: cactiveTabs == 1 }" @click="ctabsClick(1)">物业条款</div>
      </div>
      <div class="main">
        <div class="main_content">
          <el-form :model="paramCost" ref="paramCostRef" :rules="rules">
            <div class="m_title">租赁信息</div>
            <div class="list">
              <el-form-item label="押金金额(元)" prop="type">
                <el-input v-model="paramCost.code" placeholder="请输入" v-trim />
              </el-form-item>
              <el-form-item label="付款方式" prop="code">
                <el-select v-model="paramCost.type" placeholder="请选择" clearable>
                  <el-option v-for="item in payMethods" :value="item.value" :label="item.name"></el-option>
                </el-select>
              </el-form-item>
              <el-form-item label="免租期" prop="aaa">
                <el-date-picker type="daterange" v-model="paramCost.getDate" value-format="yyyy-MM-dd"
                  placeholder="请选择" />
              </el-form-item>
            </div>
            <div class="m_title">租赁条款</div>
            <div class="list">
              <el-form-item label="起始日期" prop="">
                <el-date-picker type="date" v-model="paramCost.getDate" value-format="yyyy-MM-dd" placeholder="请选择" />
              </el-form-item>
              <el-form-item label="合同单价" prop="">
                <el-input placeholder="请输入内容" v-model="paramCost.aaa">
                  <el-select v-model="paramCost.ddd" slot="append" placeholder="请选择" clearable>
                    <el-option v-for="item in unitOps" :value="item.value" :label="item.name"></el-option>
                  </el-select>
                </el-input>
              </el-form-item>
              <el-form-item label="付款提前天数" prop="">
                <el-input v-model="paramCost.aaa" placeholder="请输入" v-trim />
              </el-form-item>
            </div>
          </el-form>
        </div>
      </div>
      <el-button style="width: 100%;height: 48px;" type="primary" plain>生成账单明细</el-button>
      <el-table :data="paramCost.list" class="mt20" stripe>
        <el-table-column prop="" label="费用类型" align="center" width="160px" show-overflow-tooltip />
        <el-table-column prop="" label="指数"align="center" min-width="100" show-overflow-tooltip />
        <el-table-column prop="" label="区间" align="center" min-width="100" show-overflow-tooltip />
        <el-table-column prop="" label="付款日" align="center" min-width="100" show-overflow-tooltip />
        <el-table-column prop="" label="应收" align="center" min-width="100" show-overflow-tooltip />
      </el-table>
      <div class="total">
        <span>总计</span>
        <div>费用应收总计:,押金应收总计:</div>
      </div>
    </template>
    <!--  -->
    <MemberSearch ref="MemberSearchRef" />
  </GlobalWindow>
</template>
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
import BaseOpera from '@/components/base/BaseOpera'
import MemberSearch from '@/components/common/MemberSearch'
import { rules } from './config'
export default {
  components: {
    GlobalWindow,
    MemberSearch
  },
  extends: BaseOpera,
  data() {
    return {
      showModal: false,
      title: '创建合同',
      activeTabs: '0',
      param: {},
      rules,
      types: [
        { name: '物业+租赁合同', value: 0 },
        { name: '租赁合同', value: 1 },
        { name: '物业合同', value: 2 },
      ],
      agentList: [], //经办人
      projectList: [],
      comparyList: [], // å…¬å¸
      renterList: [], // ç§Ÿå®¢
      contacts: [], // è”系人
      value: [],
      options: [
        {
          value: 1,
          label: '东南',
          children: [{
            value: 2,
            label: '上海',
            children: [
              { value: 3, label: '普陀' },
              { value: 4, label: '黄埔' },
              { value: 5, label: '徐汇' }
            ]
          }, {
            value: 7,
            label: '江苏',
            children: [
              { value: 8, label: '南京' },
              { value: 9, label: '苏州' },
              { value: 10, label: '无锡' }
            ]
          }, {
            value: 12,
            label: '浙江',
            children: [
              { value: 13, label: '杭州' },
              { value: 14, label: '宁波' },
              { value: 15, label: '嘉兴' }
            ]
          }]
        },
        {
          value: 17,
          label: '西北',
          children: [{
            value: 18,
            label: '陕西',
            children: [
              { value: 19, label: '西安' },
              { value: 20, label: '延安' }
            ]
          }, {
            value: 21,
            label: '新疆维吾尔族自治区',
            children: [
              { value: 22, label: '乌鲁木齐' },
              { value: 23, label: '克拉玛依' }
            ]
          }]
        }
      ],
      cactiveTabs: 0,
      paramCost: {},
      payMethods: [
        { name: '一次性付款', value: 0 },
        { name: '3个月一付', value: 1 },
        { name: '6个月一付', value: 2 },
        { name: '1年一付', value: 2 },
      ],
      unitOps: [
        { name: '元/m²·天', value: 0 },
        { name: '元/m²·月', value: 1 },
        { name: '元/天', value: 2 },
        { name: '元/月', value: 3 },
        { name: '元/å¹´', value: 4 },
        { name: '元/m²·年', value: 5 },
        { name: '元/场', value: 6 },
      ],
    }
  },
  methods: {
    tabsClick(val) {
      this.activeTabs = val
    },
    ctabsClick(val) {
      this.cactiveTabs = val
    },
    getDetail() {
    },
    handleRent() {
      this.$refs.MemberSearchRef.openModal()
    },
    houseChange(e) {
      console.log(e)
      console.log(this.value)
    },
    close() {
      this.showModal = false
      this.$emit('close')
    }
  }
}
</script>
<style lang="scss" scoped>
@import '@/assets/style/variables.scss';
.tabs {
  border-bottom: 1px solid #DFE2E8;
  display: flex;
  margin-bottom: 20px;
  display: flex;
  justify-content: center;
  .tab {
    height: 58px;
    line-height: 58px;
    font-size: 16px;
    color: #666666;
    margin: 0 30px;
    cursor: pointer;
  }
  .active {
    font-weight: 500;
    color: $primary-color;
    border-bottom: 2px solid $primary-color;
  }
}
.cost_tabs {
  justify-content: flex-start;
  border: none;
  .tab {
    height: 36px;
    line-height: 36px;
    font-size: 14px;
  }
}
.main {
  display: flex;
  margin-bottom: 20px;
  .main_content {
    flex: 1;
    margin-right: 20px;
    .list {
      display: flex;
      flex-wrap: wrap;
      .el-form-item {
        width: 33.33%;
        box-sizing: border-box;
        padding: 0 12px;
      }
    }
  }
  .main_house {
    width: 420px;
    padding: 24px 12px;
    border: 1px solid #c3c6cd;
    border-radius: 2px;
    .title {
      font-size: 16px;
      font-weight: 500;
      margin-bottom: 30px;
    }
  }
}
.total{
  display: flex;
  justify-content: space-between;
  align-items: center;
  height: 32px;
  background-color: #e7e9f5;
  span{
    width: 160px;
    text-align: center;
  }
}
.file_wrap {
  padding: 20px 16px;
  border: 1px solid #c3c6cd;
  border-radius: 2px;
  .head {
    display: flex;
    justify-content: space-between;
    align-items: center;
  }
}
.m_title {
  font-weight: 500;
  font-size: 14px;
  margin-bottom: 15px;
  margin-top: 10px;
}
</style>
admin/src/views/contract/contractList.vue
@@ -0,0 +1,147 @@
<template>
  <div class="main_app">
    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear">
      <template #btns>
        <el-button>导出</el-button>
      </template>
    </QueryForm>
    <div class="mt10">
      <el-button @click="handleEdit()" icon="el-icon-plus" type="primary">新建</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="" 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 />
      <el-table-column prop="" label="合同状态" min-width="100" show-overflow-tooltip>
        <template v-slot="scope">
          <span class="primaryColor">待执行</span>
          <span class="green">正常执行中</span>
          <span class="gary">已退租</span>
        </template>
      </el-table-column>
      <el-table-column prop="" label="操作" min-width="100" show-overflow-tooltip>
        <template v-slot="scope">
          <span class="primaryColor cu" @click="handleDetail(scope.row)">查看详情</span>
        </template>
      </el-table-column>
    </el-table>
    <div class="mt20">
      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
    </div>
    <ContractDetail ref="ContractDetailRef" />
    <ContractEdit ref="ContractEditRef" v-if="showEdit" />
  </div>
</template>
<script>
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
import ContractDetail from './components/contractDetail'
import ContractEdit from './components/contractEdit.vue'
import dayjs from 'dayjs'
import duration from 'dayjs/plugin/duration'
dayjs.extend(duration)
import { platformLogPage, getPlatformGroupList } from '@/api'
export default {
  components: {
    Pagination,
    QueryForm,
    ContractEdit,
    ContractDetail
  },
  data() {
    return {
      showEdit: false,
      loading: false,
      pagination: {
        pageSize: 10,
        page: 1,
        total: 0
      },
      filters: {},
      list: [],
      total: 0,
      queryFormConfig: {
        formItems: [
          {
            filed: 'name',
            type: 'input',
            label: '合同名称'
          },
          {
            filed: 'selDate',
            type: 'datetimerange',
            placeholder: '应开始时间'
          }
        ],
        online: true
      }
    }
  },
  created() {
    // this.getList()
    // this.getGroupList()
  },
  methods: {
    handleEdit(row) {
      this.showEdit = true
      this.$nextTick(() => {
        this.$refs.ContractEditRef.showModal = true
      })
      if(row && row.id){
      }else{
      }
    },
    handleDetail(row) {
      this.$refs.ContractDetailRef.visible = true
      this.$refs.ContractDetailRef.getDetail(row.id)
    },
    getList(page) {
      const { pagination, filters } = this
      this.loading = true
      platformLogPage({
        model: {
          ...filters,
          queryStatus: '6,7,8',
          beginWorkDateStart: filters.selDate && filters.selDate.length > 0 ? filters.selDate[0] : null,
          beginWorkDateEnd: filters.selDate && filters.selDate.length > 0 ? filters.selDate[1] : null,
        },
        sorts: [{ direction: 'DESC', property: 'param1' }],
        capacity: pagination.pageSize,
        page: page || pagination.page,
      }).then(res => {
        this.loading = false
        this.list = res.records || []
        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
      })
    },
    clear() {
      this.filters = {}
      this.pagination.pageSize = 10
      this.pagination.page = 1
      this.getList()
    },
    handleSizeChange(capacity) {
      this.pagination.pageSize = capacity
    }
  }
}
</script>
<style>
</>
admin/src/views/finance/account.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,138 @@
<template>
  <div class="main_app">
    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
    <div class="mt20">
      <el-button type="primary" @click="handleEdit()" icon="el-icon-plus"
        v-permissions="['business:ywpatrolline:create']">新建</el-button>
    </div>
    <el-table v-loading="loading" :data="list" stripe>
      <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="" label="账户类型" min-width="100" show-overflow-tooltip />
      <el-table-column prop="modelNo" label="账户名称" min-width="100" show-overflow-tooltip />
      <el-table-column prop="realName" label="开户银行" min-width="100" show-overflow-tooltip />
      <el-table-column prop="realName" label="银行账号" min-width="100" show-overflow-tooltip />
      <el-table-column prop="status" label="状态" min-width="100" show-overflow-tooltip>
        <template v-slot="scope">
          <el-switch v-model="scope.row.status" active-value="0" inactive-value="1">
          </el-switch>
        </template>
      </el-table-column>
      <el-table-column label="操作" min-width="120" fixed="right">
        <template slot-scope="{row}">
          <el-button type="text" @click="handleEdit(row)" icon="el-icon-edit"
            v-permissions="['business:category:update']">编辑</el-button>
          <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
            v-permissions="['business:category:delete']">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <div class="mt20">
      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
    </div>
    <Edit v-if="showEdit" ref="EditRef" @success="getList" @close="showEdit = false" />
  </div>
</template>
<script>
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
import Edit from './components/accountEdit.vue'
import { companyGetList, deleteById } from '@/api/business/company'
export default {
  components: {
    Pagination,
    QueryForm,
    Edit
  },
  data() {
    return {
      loading: false,
      showEdit: false,
      pagination: {
        pageSize: 10,
        page: 1,
        total: 0
      },
      filters: {},
      list: [],
      total: 0,
      queryFormConfig: {
        formItems: [
          {
            filed: 'name',
            type: 'input',
            label: '收支条目'
          },
          {
            filed: 'name',
            type: 'select',
            label: '收款公司'
          },
        ],
        online: true
      }
    }
  },
  created() {
    this.getList()
  },
  methods: {
    getList(page) {
      const { pagination, filters } = this
      this.loading = true
      companyGetList({
        model: {
          ...filters,
          type: 2
        },
        capacity: pagination.pageSize,
        page: page || pagination.page,
      }).then(res => {
        this.loading = false
        this.list = res.records || []
        this.list.forEach(item => {
          item.stautsName = item.status == 0 ? '正常' : item.status == 1 ? '损坏' : '报废'
        })
        this.pagination.total = res.total || 0
      }, () => {
        this.loading = false
      })
    },
    handleEdit(row) {
      this.showEdit = true
      this.$nextTick(() => {
        this.$refs.EditRef.isShowModal = true
        if (row && row.id) {
          this.$refs.EditRef.getDetail(row.id)
        }
      })
    },
    handleDel(row) {
      let message = `确认删除该记录吗?`
      this.$dialog.deleteConfirm(message)
        .then(() => {
          this.isWorking.delete = true
          deleteById(row.id)
            .then(() => {
              this.$tip.apiSuccess('删除成功')
              this.getList()
            })
        })
        .catch(() => { })
    },
    clear() {
      this.filters = {}
      this.pagination.pageSize = 10
      this.pagination.page = 1
      this.getList()
    },
    handleSizeChange(capacity) {
      this.pagination.pageSize = capacity
    }
  }
}
</script>
<style></style>
admin/src/views/finance/bull.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,194 @@
<template>
  <div class="main_app">
    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
    <div class="df_sb mt20">
      <div class="tabs">
        <div class="tab" :class="{ active: activeTabs == 0 }" @click="tabsClick(0)">收款账单</div>
        <div class="tab" :class="{ active: activeTabs == 1 }" @click="tabsClick(1)">付款账单</div>
      </div>
      <div class="btns">
        <el-button type="primary" @click="handleEdit()" icon="el-icon-plus"
          v-permissions="['business:ywpatrolline:create']">新建</el-button>
        <el-button @click="handleEx" v-permissions="['business:ywpatrolline:create']">导出</el-button>
      </div>
    </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 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>
        </template>
      </el-table-column>
    </el-table>
    <div class="mt20">
      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
    </div>
    <Edit v-if="showEdit" ref="EditRef" @success="getList" @close="showEdit = false" />
  </div>
</template>
<script>
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
import Edit from './components/deviceEdit.vue'
import { fetchList, deleteById } from '@/api/Inspection/device'
export default {
  components: {
    Pagination,
    QueryForm,
    Edit
  },
  data() {
    return {
      loading: false,
      showEdit: false,
      pagination: {
        pageSize: 10,
        page: 1,
        total: 0
      },
      activeTabs: 0,
      filters: {},
      list: [],
      total: 0,
      statusMap: [
        { value: 0, label: '待收款' },
        { value: 1, label: '已结算' },
        { value: 2, label: '部分结清' },
        { value: 3, label: '待退款' },
        { value: 4, label: '待付款' },
      ],
      queryFormConfig: {
        formItems: [
          {
            filed: 'name',
            type: 'input',
            label: '客户名称',
          },
          {
            filed: 'status',
            type: 'select',
            label: '账单状态',
            options: [
              { value: '0', label: '开启' },
              { value: '1', label: '关闭' },
            ]
          },
          {
            filed: 'status',
            type: 'select',
            label: '结清状态',
            options: this.statusMap
          },
          {
            filed: 'selDate',
            type: 'daterange',
            label: '应收/付日期'
          },
        ],
        online: true
      }
    }
  },
  created() {
    this.getList()
  },
  methods: {
    getList(page) {
      const { pagination, filters } = this
      this.loading = true
      fetchList({
        model: {
          ...filters,
        },
        capacity: pagination.pageSize,
        page: page || pagination.page,
      }).then(res => {
        this.loading = false
        this.list = res.records || []
        this.list.forEach(item => {
          item.stautsName = item.status == 0 ? '正常' : item.status == 1 ? '损坏' : '报废'
        })
        this.pagination.total = res.total || 0
      }, () => {
        this.loading = false
      })
    },
    handleEx() {
    },
    tabsClick(val) {
      this.activeTabs = val
    },
    handleEdit(row) {
      this.showEdit = true
      this.$nextTick(() => {
        this.$refs.EditRef.isShowModal = true
        if (row && row.id) {
          this.$refs.EditRef.getDetail(row.id)
        }
      })
    },
    handleDetail() {
    },
    handleDel(row) {
      let message = `确认删除该记录吗?`
      this.$dialog.deleteConfirm(message)
        .then(() => {
          this.isWorking.delete = true
          deleteById(row.id)
            .then(() => {
              this.$tip.apiSuccess('删除成功')
              this.getList()
            })
        })
        .catch(() => { })
    },
    clear() {
      this.filters = {}
      this.pagination.pageSize = 10
      this.pagination.page = 1
      this.getList()
    },
    handleSizeChange(capacity) {
      this.pagination.pageSize = capacity
      this.getList()
    }
  }
}
</script>
<style lang="scss" scoped>
@import '@/assets/style/variables.scss';
.tabs {
  border-bottom: 1px solid #DFE2E8;
  display: flex;
  margin-bottom: 20px;
  display: flex;
  justify-content: center;
  .tab {
    height: 58px;
    line-height: 58px;
    font-size: 16px;
    color: #666666;
    margin: 0 30px;
    cursor: pointer;
  }
  .active {
    font-weight: 500;
    color: $primary-color;
    border-bottom: 2px solid $primary-color;
  }
}
</style>
admin/src/views/finance/company.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,132 @@
<template>
  <div class="main_app">
    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
    <div class="mt20">
      <el-button type="primary" @click="handleEdit()" icon="el-icon-plus"
        v-permissions="['business:ywpatrolline:create']">新建</el-button>
    </div>
    <el-table v-loading="loading" :data="list" stripe>
      <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="" label="纳税识别号" min-width="100" show-overflow-tooltip />
      <el-table-column prop="modelNo" label="公司地址" min-width="100" show-overflow-tooltip />
      <el-table-column prop="realName" label="收支账户数量" min-width="100" show-overflow-tooltip />
      <el-table-column prop="status" label="状态" min-width="100" show-overflow-tooltip>
        <template v-slot="scope">
          <el-switch v-model="scope.row.status" active-value="0" inactive-value="1">
          </el-switch>
        </template>
      </el-table-column>
      <el-table-column label="操作" min-width="120" fixed="right">
        <template slot-scope="{row}">
          <el-button type="text" @click="handleEdit(row)" icon="el-icon-edit"
            v-permissions="['business:category:update']">编辑</el-button>
          <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
            v-permissions="['business:category:delete']">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <div class="mt20">
      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
    </div>
    <Edit v-if="showEdit" ref="EditRef" @success="getList" @close="showEdit = false" />
  </div>
</template>
<script>
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
import Edit from './components/companyEdit.vue'
import { companyGetList, deleteById } from '@/api/business/company'
export default {
  components: {
    Pagination,
    QueryForm,
    Edit
  },
  data() {
    return {
      loading: false,
      showEdit: false,
      pagination: {
        pageSize: 10,
        page: 1,
        total: 0
      },
      filters: {},
      list: [],
      total: 0,
      queryFormConfig: {
        formItems: [
          {
            filed: 'name',
            type: 'input',
            label: '公司名称'
          },
        ],
        online: true
      }
    }
  },
  created() {
    this.getList()
  },
  methods: {
    getList(page) {
      const { pagination, filters } = this
      this.loading = true
      companyGetList({
        model: {
          ...filters,
          type: 2
        },
        capacity: pagination.pageSize,
        page: page || pagination.page,
      }).then(res => {
        this.loading = false
        this.list = res.records || []
        this.list.forEach(item => {
          item.stautsName = item.status == 0 ? '正常' : item.status == 1 ? '损坏' : '报废'
        })
        this.pagination.total = res.total || 0
      }, () => {
        this.loading = false
      })
    },
    handleEdit(row) {
      this.showEdit = true
      this.$nextTick(() => {
        this.$refs.EditRef.isShowModal = true
        if (row && row.id) {
          this.$refs.EditRef.getDetail(row.id)
        }
      })
    },
    handleDel(row) {
      let message = `确认删除该记录吗?`
      this.$dialog.deleteConfirm(message)
        .then(() => {
          this.isWorking.delete = true
          deleteById(row.id)
            .then(() => {
              this.$tip.apiSuccess('删除成功')
              this.getList()
            })
        })
        .catch(() => { })
    },
    clear() {
      this.filters = {}
      this.pagination.pageSize = 10
      this.pagination.page = 1
      this.getList()
    },
    handleSizeChange(capacity) {
      this.pagination.pageSize = capacity
    }
  }
}
</script>
<style></style>
admin/src/views/finance/components/accountEdit.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,104 @@
<template>
  <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="name">
        <el-input v-model="param.name" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="收款公司" prop="name">
        <el-select v-model="param.realName" filterable clearable>
          <el-option value="0" label="xxx"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="收款类型" prop="name">
        <el-radio-group v-model="param.radio">
          <el-radio :label="0">对公</el-radio>
          <el-radio :label="1">个人</el-radio>
        </el-radio-group>
      </el-form-item>
      <el-form-item label="账户名称" prop="desc">
        <el-input v-model="param.desc" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="开户名称">
        <el-input v-model="param.code" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="银行账号">
        <el-input v-model="param.addr" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="状态" prop="code">
        <el-switch v-model="param.status" active-value="0" inactive-value="1">
        </el-switch>
      </el-form-item>
    </el-form>
  </GlobalWindow>
</template>
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
import UploadAvatarImage from '@/components/common/UploadAvatarImage'
import { create, updateById } from '@/api/business/company'
import { Message } from 'element-ui'
export default {
  components: { GlobalWindow, UploadAvatarImage },
  data() {
    return {
      isShowModal: false,
      subLoading: false,
      param: {
        type: 2,
        status: '0'
      },
      cateList: [],
      rules: {
        name: [{ required: true, message: '请输入' }],
        desc: [{ required: true, message: '请输入' }]
      },
    }
  },
  created() {
  },
  methods: {
    handleSub() {
      const { param, subLoading } = this
      this.$refs['paramRef'].validate((valid) => {
        if (valid) {
          let fn = param.id ? updateById : create
          this.subLoading = true
          fn(param).then(res => {
            this.subLoading = false
            this.$emit('success')
            Message.success('保存成功')
            this.close()
          }).catch(() => {
            this.subLoading = false
          })
        }
      })
    },
    changeSel(e) {
      if (e && e.length == 1) {
        this.$set(this.param, 'catePId', e[0])
        this.$set(this.param, 'cateId', '')
      } else if (e && e.length == 2) {
        this.$set(this.param, 'catePId', e[0])
        this.$set(this.param, 'cateId', e[1])
      } else {
        this.$set(this.param, 'catePId', '')
        this.$set(this.param, 'cateId', '')
      }
      this.search()
    },
    uploadAvatarSuccess(file) {
      this.$set(this.param, 'imgurl', file.imgurl)
      this.$set(this.param, 'imgurlfull', file.imgurlfull)
    },
    close() {
      this.isShowModal = false
      this.$emit('close')
    }
  }
}
</script>
<style lang="scss" scoped></style>
admin/src/views/finance/components/companyEdit.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
<template>
  <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="name">
        <el-input v-model="param.name" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="公司简介" prop="desc">
        <el-input v-model="param.desc" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="纳税识别号">
        <el-input v-model="param.code" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="联系地址">
        <el-input v-model="param.addr" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="状态" prop="code">
        <el-switch v-model="param.status" active-value="0" inactive-value="1">
        </el-switch>
      </el-form-item>
    </el-form>
  </GlobalWindow>
</template>
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
import UploadAvatarImage from '@/components/common/UploadAvatarImage'
import { create, updateById } from '@/api/business/company'
import { Message } from 'element-ui'
export default {
  components: { GlobalWindow, UploadAvatarImage },
  data() {
    return {
      isShowModal: false,
      subLoading: false,
      param: {
        type: 2,
        status: '0'
      },
      cateList: [],
      rules: {
        name: [{ required: true, message: '请输入' }],
        desc: [{ required: true, message: '请输入' }]
      },
    }
  },
  created() {
  },
  methods: {
    handleSub() {
      const { param, subLoading } = this
      this.$refs['paramRef'].validate((valid) => {
        if (valid) {
          let fn = param.id ? updateById : create
          this.subLoading = true
          fn(param).then(res => {
            this.subLoading = false
            this.$emit('success')
            Message.success('保存成功')
            this.close()
          }).catch(() => {
            this.subLoading = false
          })
        }
      })
    },
    changeSel(e) {
      if (e && e.length == 1) {
        this.$set(this.param, 'catePId', e[0])
        this.$set(this.param, 'cateId', '')
      } else if (e && e.length == 2) {
        this.$set(this.param, 'catePId', e[0])
        this.$set(this.param, 'cateId', e[1])
      } else {
        this.$set(this.param, 'catePId', '')
        this.$set(this.param, 'cateId', '')
      }
      this.search()
    },
    uploadAvatarSuccess(file) {
      this.$set(this.param, 'imgurl', file.imgurl)
      this.$set(this.param, 'imgurlfull', file.imgurlfull)
    },
    close() {
      this.isShowModal = false
      this.$emit('close')
    }
  }
}
</script>
<style lang="scss" scoped></style>
admin/src/views/finance/components/deviceEdit.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,137 @@
<template>
  <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-input v-model="param.code" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="设备名称" prop="name">
        <el-input v-model="param.name" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="设备型号" prop="">
        <el-input v-model="param.modelNo" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="设备分类" prop="">
        <el-cascader v-model="param.areaIds" @change="changeSel" placeholder="请选择巡检区域" clearable :options="cateList"
          :props="{
            label: 'name',
            value: 'id',
            children: 'childCategoryList',
            checkStrictly: true
          }"></el-cascader>
      </el-form-item>
      <el-form-item label="设备管理员" prop="">
        <el-select v-model="param.realName" filterable clearable>
          <el-option value="0" label="xxx"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="所在位置" prop="">
        <el-input v-model="param.addr" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="供应商" prop="">
        <el-input v-model="param.company" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="运维内容" prop="">
        <el-input type="textarea" :rows="4" v-model="param.content" placeholder="请输入" />
      </el-form-item>
      <el-form-item label="设备状态" prop="">
        <el-select v-model="param.status" filterable clearable>
          <el-option value="0" label="正常"></el-option>
          <el-option value="1" label="损坏"></el-option>
          <el-option value="2" label="报废"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="照片" prop="">
        <UploadAvatarImage :file="{ 'imgurlfull': param.imgurlfull, 'imgurl': param.imgurl }"
          :uploadData="{ folder: 'projects' }" @uploadSuccess="uploadAvatarSuccess" @uploadEnd="isUploading = false"
          @uploadBegin="isUploading = true" />
      </el-form-item>
    </el-form>
  </GlobalWindow>
</template>
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
import UploadAvatarImage from '@/components/common/UploadAvatarImage'
import { fetchList } from '@/api/business/category'
import { create, updateById } from '@/api/Inspection/device'
import { Message } from 'element-ui'
export default {
  components: { GlobalWindow, UploadAvatarImage },
  data() {
    return {
      isShowModal: false,
      subLoading: false,
      param: {},
      cateList: [],
      rules: {
        name: [{ required: true, message: '请输入' }],
        code: [{ required: true, message: '请输入' }]
      },
    }
  },
  created() {
    this.initData()
  },
  methods: {
    handleSub() {
      const { param, subLoading } = this
      this.$refs['paramRef'].validate((valid) => {
        if (valid) {
          let fn = param.id ? updateById : create
          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
          })
        }
      })
    },
    initData() {
      fetchList({
        model: { type: 5 },
        capacity: 1000,
        page: 1,
      }).then(res => {
        this.cateList = res.records || []
      })
    },
    changeSel(e) {
      if (e && e.length == 1) {
        this.$set(this.param, 'catePId', e[0])
        this.$set(this.param, 'cateId', '')
      } else if (e && e.length == 2) {
        this.$set(this.param, 'catePId', e[0])
        this.$set(this.param, 'cateId', e[1])
      } else {
        this.$set(this.param, 'catePId', '')
        this.$set(this.param, 'cateId', '')
      }
      this.search()
    },
    uploadAvatarSuccess(file) {
      this.$set(this.param, 'imgurl', file.imgurl)
      this.$set(this.param, 'imgurlfull', file.imgurlfull)
    },
    close() {
      this.isShowModal = false
      this.$emit('close')
    }
  }
}
</script>
<style lang="scss" scoped></style>
admin/src/views/finance/payments.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,137 @@
<template>
  <div class="main_app">
    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
    <div class="mt20">
      <el-button type="primary" @click="handleEdit()" icon="el-icon-plus"
        v-permissions="['business:ywpatrolline:create']">新建</el-button>
    </div>
    <el-table v-loading="loading" :data="list" stripe>
      <el-table-column prop="code" label="shou" min-width="100" show-overflow-tooltip />
      <el-table-column prop="name" label="公司简介" min-width="100" show-overflow-tooltip />
      <el-table-column prop="" label="纳税识别号" min-width="100" show-overflow-tooltip />
      <el-table-column prop="modelNo" label="公司地址" min-width="100" show-overflow-tooltip />
      <el-table-column prop="realName" label="收支账户数量" min-width="100" show-overflow-tooltip />
      <el-table-column prop="status" label="状态" min-width="100" show-overflow-tooltip>
        <template v-slot="scope">
          <el-switch v-model="scope.row.status" active-value="0" inactive-value="1">
          </el-switch>
        </template>
      </el-table-column>
      <el-table-column label="操作" min-width="120" fixed="right">
        <template slot-scope="{row}">
          <el-button type="text" @click="handleEdit(row)" icon="el-icon-edit"
            v-permissions="['business:category:update']">编辑</el-button>
          <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
            v-permissions="['business:category:delete']">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <div class="mt20">
      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
    </div>
    <Edit v-if="showEdit" ref="EditRef" @success="getList" @close="showEdit = false" />
  </div>
</template>
<script>
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
import Edit from './components/companyEdit.vue'
import { companyGetList, deleteById } from '@/api/business/company'
export default {
  components: {
    Pagination,
    QueryForm,
    Edit
  },
  data() {
    return {
      loading: false,
      showEdit: false,
      pagination: {
        pageSize: 10,
        page: 1,
        total: 0
      },
      filters: {},
      list: [],
      total: 0,
      queryFormConfig: {
        formItems: [
          {
            filed: 'name',
            type: 'input',
            label: '收支条目'
          },
          {
            filed: 'name',
            type: 'select',
            label: '收款公司'
          },
        ],
        online: true
      }
    }
  },
  created() {
    this.getList()
  },
  methods: {
    getList(page) {
      const { pagination, filters } = this
      this.loading = true
      companyGetList({
        model: {
          ...filters,
          type: 2
        },
        capacity: pagination.pageSize,
        page: page || pagination.page,
      }).then(res => {
        this.loading = false
        this.list = res.records || []
        this.list.forEach(item => {
          item.stautsName = item.status == 0 ? '正常' : item.status == 1 ? '损坏' : '报废'
        })
        this.pagination.total = res.total || 0
      }, () => {
        this.loading = false
      })
    },
    handleEdit(row) {
      this.showEdit = true
      this.$nextTick(() => {
        this.$refs.EditRef.isShowModal = true
        if (row && row.id) {
          this.$refs.EditRef.getDetail(row.id)
        }
      })
    },
    handleDel(row) {
      let message = `确认删除该记录吗?`
      this.$dialog.deleteConfirm(message)
        .then(() => {
          this.isWorking.delete = true
          deleteById(row.id)
            .then(() => {
              this.$tip.apiSuccess('删除成功')
              this.getList()
            })
        })
        .catch(() => { })
    },
    clear() {
      this.filters = {}
      this.pagination.pageSize = 10
      this.pagination.page = 1
      this.getList()
    },
    handleSizeChange(capacity) {
      this.pagination.pageSize = capacity
    }
  }
}
</script>
<style></style>
admin/src/views/operation/category.vue
@@ -0,0 +1,109 @@
<template>
  <TableLayout>
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:category:create', 'business:category:delete']">
        <li><el-button type="primary" @click="handleEdit()" icon="el-icon-plus"
            v-permissions="['business:category:create']">新建</el-button></li>
        <li v-permissions="['business:category:exportExcel']"><el-button type="primary"
            @click="exportExcel">导出</el-button></li>
      </ul>
      <el-table row-key="id" :tree-props="{ children: 'childCategoryList' }" v-loading="isWorking.search"
        :data="dataList" stripe @selection-change="handleSelectionChange">
        <el-table-column prop="name" label="设备分类" min-width="100px"></el-table-column>
        <!-- <el-table-column prop="parentName" label="所属分类" min-width="100px"></el-table-column> -->
        <el-table-column prop="sortnum" label="排序码" min-width="100px"></el-table-column>
        <el-table-column v-if="containPermissions(['business:category:update', 'business:category:delete'])" label="操作"
          min-width="120" fixed="right">
          <template slot-scope="{row}">
            <el-button type="text" @click="handleEdit(row)" icon="el-icon-edit"
              v-permissions="['business:category:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
              v-permissions="['business:category:delete']">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
      <pagination @size-change="handleSizeChange" @current-change="getList" :pagination="tableData.pagination">
      </pagination>
    </template>
    <!-- æ–°å»º/修改 -->
    <OperaCategoryWindow v-if="isShowEdit" @close="isShowEdit = false" ref="operaCategoryWindow" @success="getList" />
  </TableLayout>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaCategoryWindow from './components/OperaCategoryWindow'
import { fetchList, deleteById } from '@/api/business/category.js'
export default {
  name: 'Category',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaCategoryWindow },
  data() {
    return {
      // æœç´¢
      filters: {
        parentId: ''
      },
      isShowEdit: false,
      loading: false,
      pagination: {
        pageSize: 10,
        page: 1,
        total: 0,
      },
      dataList: []
    }
  },
  created() {
    this.config({
      module: '车辆信息表',
      api: '/business/category',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.getList()
  },
  methods: {
    handleEdit(row) {
      this.isShowEdit = true
      let str = row && row.id ? '编辑设备分类' : '新建设备分类'
      this.$nextTick(() => {
        this.$refs.operaCategoryWindow.open(str)
        this.$refs.operaCategoryWindow.getList()
        if (row && row.id) {
          this.$refs.operaCategoryWindow.getDetail(row.id)
        }
      })
    },
    deleteById(row) {
      this.$confirm(`您确认要删除该分类吗`, '温馨提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        deleteById(row.id).then(res => {
          this.getList()
        })
      })
    },
    getList() {
      const { pagination, filters } = this
      this.loading = true
      fetchList({
        model: { ...filters, type: 5 },
        capacity: pagination.pageSize,
        page: pagination.page,
      }).then(res => {
        this.loading = false
        this.dataList = res.records || []
        this.pagination.total = res.total || 0
      }, () => {
        this.loading = false
      })
    },
  }
}
</script>
admin/src/views/operation/components/OperaCategoryWindow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
<template>
  <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" width="600px" @close="close" @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="parentId">
        <el-select :disabled="form.id" v-model="form.parentId" placeholder="不填为则一级分类">
          <el-option v-for="op in dataList" :key="op.id" :label="op.name" :value="op.id"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="排序码(升序)" prop="sortnum">
        <el-input v-model="form.sortnum" oninput="value=value.replace(/^(0+)|[^\d]+/g, '').slice(0, 6)" v-trim />
      </el-form-item>
    </el-form>
  </GlobalWindow>
</template>
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { create, fetchCateList, getInfoById } from '@/api/business/category.js'
export default {
  name: 'OperaCategoryWindow',
  extends: BaseOpera,
  components: { GlobalWindow },
  data() {
    return {
      // è¡¨å•数据
      form: {
        parentId: null,
        name: '',
        remark: '',
        status: '',
        sortnum: '',
        type: 5
      },
      // éªŒè¯è§„则
      rules: {
        name: [
          { required: true, message: '请输入二级分类名称', trigger: 'blur' }
        ],
        status: [
          { required: true, message: '请选择是否启用', trigger: 'change' }
        ]
      },
      dataList: []
    }
  },
  created() {
    this.config({
      api: '/business/category',
      'field.id': 'id'
    })
  },
  methods: {
    getList() {
      fetchCateList({ type: 5 }).then(res => {
        this.dataList = res || []
      })
    },
    close() {
      this.visible = false
      this.$emit('close')
    },
    getDetail(id) {
      getInfoById(id).then(res => {
        this.form = res
      })
    },
  }
}
</script>
admin/src/views/operation/components/deviceEdit.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,137 @@
<template>
  <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-input v-model="param.code" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="设备名称" prop="name">
        <el-input v-model="param.name" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="设备型号" prop="">
        <el-input v-model="param.modelNo" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="设备分类" prop="">
        <el-cascader v-model="param.areaIds" @change="changeSel" placeholder="请选择巡检区域" clearable :options="cateList"
          :props="{
            label: 'name',
            value: 'id',
            children: 'childCategoryList',
            checkStrictly: true
          }"></el-cascader>
      </el-form-item>
      <el-form-item label="设备管理员" prop="">
        <el-select v-model="param.realName" filterable clearable>
          <el-option value="0" label="xxx"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="所在位置" prop="">
        <el-input v-model="param.addr" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="供应商" prop="">
        <el-input v-model="param.company" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="运维内容" prop="">
        <el-input type="textarea" :rows="4" v-model="param.content" placeholder="请输入" />
      </el-form-item>
      <el-form-item label="设备状态" prop="">
        <el-select v-model="param.status" filterable clearable>
          <el-option value="0" label="正常"></el-option>
          <el-option value="1" label="损坏"></el-option>
          <el-option value="2" label="报废"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="照片" prop="">
        <UploadAvatarImage :file="{ 'imgurlfull': param.imgurlfull, 'imgurl': param.imgurl }"
          :uploadData="{ folder: 'projects' }" @uploadSuccess="uploadAvatarSuccess" @uploadEnd="isUploading = false"
          @uploadBegin="isUploading = true" />
      </el-form-item>
    </el-form>
  </GlobalWindow>
</template>
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
import UploadAvatarImage from '@/components/common/UploadAvatarImage'
import { fetchList } from '@/api/business/category'
import { create, updateById } from '@/api/Inspection/device'
import { Message } from 'element-ui'
export default {
  components: { GlobalWindow, UploadAvatarImage },
  data() {
    return {
      isShowModal: false,
      subLoading: false,
      param: {},
      cateList: [],
      rules: {
        name: [{ required: true, message: '请输入' }],
        code: [{ required: true, message: '请输入' }]
      },
    }
  },
  created() {
    this.initData()
  },
  methods: {
    handleSub() {
      const { param, subLoading } = this
      this.$refs['paramRef'].validate((valid) => {
        if (valid) {
          let fn = param.id ? updateById : create
          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
          })
        }
      })
    },
    initData() {
      fetchList({
        model: { type: 5 },
        capacity: 1000,
        page: 1,
      }).then(res => {
        this.cateList = res.records || []
      })
    },
    changeSel(e) {
      if (e && e.length == 1) {
        this.$set(this.param, 'catePId', e[0])
        this.$set(this.param, 'cateId', '')
      } else if (e && e.length == 2) {
        this.$set(this.param, 'catePId', e[0])
        this.$set(this.param, 'cateId', e[1])
      } else {
        this.$set(this.param, 'catePId', '')
        this.$set(this.param, 'cateId', '')
      }
      this.search()
    },
    uploadAvatarSuccess(file) {
      this.$set(this.param, 'imgurl', file.imgurl)
      this.$set(this.param, 'imgurlfull', file.imgurlfull)
    },
    close() {
      this.isShowModal = false
      this.$emit('close')
    }
  }
}
</script>
<style lang="scss" scoped></style>
admin/src/views/operation/components/maintain.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,222 @@
<template>
  <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-select v-model="param.deviceId" filterable clearable>
          <el-option v-for="item in deviceList" :value="item" :label="item"></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-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-select>
      </el-form-item>
      <el-form-item label="现场照片" prop="">
        <div class="file_list">
          <el-upload class="avatar-uploader" :data="uploadData" :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>
              <div>图片/视频</div>
            </div>
          </el-upload>
          <div v-for="(item, i) in fileList" :key="i" class="item">
            <i @click="handleDelImg(i)" class="el-icon-error close"></i>
            <el-image :src="item.fileurlFull" :preview-src-list="[item.fileurlFull]" v-if="item.type == 0"
              class="img"></el-image>
            <video :src="item.fileurlFull" controls v-if="item.type == 1" class="img"></video>
          </div>
        </div>
      </el-form-item>
      <el-form-item label="运维备注" prop="">
        <el-input type="textarea" :rows="4" v-model="param.remark" placeholder="请输入" />
      </el-form-item>
      <el-form-item label="运维时间" prop="">
        <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>
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
import UploadAvatarImage from '@/components/common/UploadAvatarImage'
import { fetchList } from '@/api/Inspection/device'
import { Message, Loading } from 'element-ui'
export default {
  components: { GlobalWindow, UploadAvatarImage },
  data() {
    return {
      isShowModal: false,
      subLoading: false,
      param: {},
      deviceList: [],
      rules: {
        name: [{ required: true, message: '请输入' }],
        code: [{ required: true, message: '请输入' }]
      },
      loadingInstance: null,
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch',
      fileList: [],
      uploadData: {
        folder: 'HIDDEN_DANGER_FILE'
      },
    }
  },
  created() {
    this.initData()
  },
  methods: {
    handleSub() {
      const { param, subLoading } = this
      this.$refs['paramRef'].validate((valid) => {
        if (valid) {
          let fn = param.id ? updateById : create
          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
          })
        }
      })
    },
    initData() {
      fetchList({
        model: {},
        capacity: 1000,
        page: 1,
      }).then(res => {
        this.deviceList = res || []
      })
    },
    changeSel(e) {
      if (e && e.length == 1) {
        this.$set(this.param, 'catePId', e[0])
        this.$set(this.param, 'cateId', '')
      } else if (e && e.length == 2) {
        this.$set(this.param, 'catePId', e[0])
        this.$set(this.param, 'cateId', e[1])
      } else {
        this.$set(this.param, 'catePId', '')
        this.$set(this.param, 'cateId', '')
      }
      this.search()
    },
    beforeUpload(file) {
      if (['video/mp4', 'video/ogg', 'video/flv', 'video/avi', 'video/wmv', 'video/rmvb', 'image/jpeg', 'image/jpg', 'image/png', 'image/gif'].indexOf(file.type) == -1) {
        this.$message.error('请上传正确的视频/图片格式')
        return false
      }
      this.loadingInstance = Loading.service({
        lock: true,
        text: 'Loading',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)'
      })
    },
    uploadError() {
      this.$nextTick(() => { // ä»¥æœåŠ¡çš„æ–¹å¼è°ƒç”¨çš„ Loading éœ€è¦å¼‚步关闭
        if (this.loadingInstance) {
          this.loadingInstance.close()
        }
      })
    },
    uploadAvatarSuccess(file) {
      this.$nextTick(() => { // ä»¥æœåŠ¡çš„æ–¹å¼è°ƒç”¨çš„ Loading éœ€è¦å¼‚步关闭
        if (this.loadingInstance) {
          this.loadingInstance.close()
        }
      })
      console.log('file', file)
      const item = file.data[0]
      if (['.mp4', '.avi', '.flv', '.wmv'].some(char => item.imgaddr.includes(char))) {
        this.fileList.push({
          type: 1,
          fileurl: item.imgaddr,
          fileurlFull: item.url
        })
      } else {
        this.fileList.push({
          type: 0,
          fileurl: item.imgaddr,
          fileurlFull: item.url
        })
      }
      console.log('file', this.fileList)
      // this.$set(this.param, 'faceImg', file.imgurl)
      // this.$set(this.param, 'faceImgUrl', file.imgurlfull)
    },
    handleDelImg(i) {
      this.fileList.splice(i, 1)
    },
    close() {
      this.isShowModal = false
      this.$emit('close')
    }
  }
}
</script>
<style lang="scss" scoped>
.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/device.vue
@@ -0,0 +1,138 @@
<template>
  <div class="main_app">
    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
    <div class="mt20">
      <el-button type="primary" @click="handleEdit()" icon="el-icon-plus"
        v-permissions="['business:ywpatrolline:create']">新建</el-button>
    </div>
    <el-table v-loading="loading" :data="list" stripe>
      <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="" label="设备分类" min-width="100" show-overflow-tooltip />
      <el-table-column prop="modelNo" label="设备型号" min-width="100" show-overflow-tooltip />
      <el-table-column prop="realName" label="管理员" min-width="100" show-overflow-tooltip />
      <el-table-column prop="company" label="设备供应商" min-width="100" show-overflow-tooltip />
      <el-table-column prop="status" label="设备状态" min-width="100" show-overflow-tooltip />
      <el-table-column label="操作" min-width="120" fixed="right">
        <template slot-scope="{row}">
          <el-button type="text" @click="handleEdit(row)" icon="el-icon-edit"
            v-permissions="['business:category:update']">编辑</el-button>
          <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
            v-permissions="['business:category:delete']">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <div class="mt20">
      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
    </div>
    <Edit v-if="showEdit" ref="EditRef" @success="getList" @close="showEdit = false" />
  </div>
</template>
<script>
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
import Edit from './components/deviceEdit'
import { fetchList, deleteById } from '@/api/Inspection/device'
export default {
  components: {
    Pagination,
    QueryForm,
    Edit
  },
  data() {
    return {
      loading: false,
      showEdit: false,
      pagination: {
        pageSize: 10,
        page: 1,
        total: 0
      },
      filters: {},
      list: [],
      total: 0,
      queryFormConfig: {
        formItems: [
          {
            filed: 'name',
            type: 'input',
            label: '设备名称',
            placeholder: '请输入设备名称/编码'
          },
          {
            filed: 'status',
            type: 'select',
            label: '设备状态',
            options: [
              { value: 0, label: '正常' },
              { value: 1, label: '损坏' },
              { value: 2, label: '报废' },
            ]
          },
        ],
        online: true
      }
    }
  },
  created() {
    this.getList()
  },
  methods: {
    getList(page) {
      const { pagination, filters } = this
      this.loading = true
      fetchList({
        model: {
          ...filters,
        },
        capacity: pagination.pageSize,
        page: page || pagination.page,
      }).then(res => {
        this.loading = false
        this.list = res.records || []
        this.list.forEach(item => {
          item.stautsName = item.status == 0 ? '正常' : item.status == 1 ? '损坏' : '报废'
        })
        this.pagination.total = res.total || 0
      }, () => {
        this.loading = false
      })
    },
    handleEdit(row) {
      this.showEdit = true
      this.$nextTick(() => {
        this.$refs.EditRef.isShowModal = true
        if (row && row.id) {
          this.$refs.EditRef.getDetail(row.id)
        }
      })
    },
    handleDel(row) {
      let message = `确认删除该记录吗?`
      this.$dialog.deleteConfirm(message)
        .then(() => {
          this.isWorking.delete = true
          deleteById(row.id)
            .then(() => {
              this.$tip.apiSuccess('删除成功')
              this.getList()
            })
        })
        .catch(() => { })
    },
    clear() {
      this.filters = {}
      this.pagination.pageSize = 10
      this.pagination.page = 1
      this.getList()
    },
    handleSizeChange(capacity) {
      this.pagination.pageSize = capacity
    }
  }
}
</script>
<style></style>
admin/src/views/operation/record.vue
@@ -0,0 +1,138 @@
<template>
  <div class="main_app">
    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
    <div class="mt20">
      <el-button type="primary" @click="handleEdit()" icon="el-icon-plus"
        v-permissions="['business:ywpatrolline:create']">新建</el-button>
      <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 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>
        </template>
      </el-table-column>
    </el-table>
    <div class="mt20">
      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
    </div>
    <Edit v-if="showEdit" ref="EditRef" @success="getList" @close="showEdit = false" />
  </div>
</template>
<script>
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'
export default {
  components: {
    Pagination,
    QueryForm,
    Edit
  },
  data() {
    return {
      loading: false,
      showEdit: false,
      pagination: {
        pageSize: 10,
        page: 1,
        total: 0
      },
      filters: {},
      list: [],
      total: 0,
      queryFormConfig: {
        formItems: [
          {
            filed: 'name',
            type: 'input',
            label: '设备名称',
            placeholder: '请输入设备名称/编码'
          },
          {
            filed: 'selTime',
            type: 'datetimerange',
            label: '创建时间'
          },
        ],
        online: true
      }
    }
  },
  created() {
    this.getList()
  },
  methods: {
    getList(page) {
      const { pagination, filters } = this
      this.loading = true
      fetchList({
        model: {
          ...filters,
        },
        capacity: pagination.pageSize,
        page: page || pagination.page,
      }).then(res => {
        this.loading = false
        this.list = res.records || []
        this.list.forEach(item => {
          item.stautsName = item.status == 0 ? '正常' : item.status == 1 ? '损坏' : '报废'
        })
        this.pagination.total = res.total || 0
      }, () => {
        this.loading = false
      })
    },
    handleEx() {
    },
    handleEdit(row) {
      this.showEdit = true
      this.$nextTick(() => {
        this.$refs.EditRef.isShowModal = true
        if (row && row.id) {
          this.$refs.EditRef.getDetail(row.id)
        }
      })
    },
    handleDetail() {
    },
    handleDel(row) {
      let message = `确认删除该记录吗?`
      this.$dialog.deleteConfirm(message)
        .then(() => {
          this.isWorking.delete = true
          deleteById(row.id)
            .then(() => {
              this.$tip.apiSuccess('删除成功')
              this.getList()
            })
        })
        .catch(() => { })
    },
    clear() {
      this.filters = {}
      this.pagination.pageSize = 10
      this.pagination.page = 1
      this.getList()
    },
    handleSizeChange(capacity) {
      this.pagination.pageSize = capacity
      this.getList()
    }
  }
}
</script>
<style></style>
admin/src/views/project/buildingList.vue
@@ -12,22 +12,20 @@
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:ywbuilding:exportExcel']" @click="exportExcel">导出</el-button>
        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:ywbuilding:exportExcel']"
          @click="exportExcel">导出</el-button>
        <el-button @click="reset">重置</el-button>
      </section>
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:ywbuilding:create', 'business:ywbuilding:delete']">
        <li><el-button type="primary" @click="editClick()" icon="el-icon-plus" v-permissions="['business:ywbuilding:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:ywbuilding:delete']">删除</el-button></li>
        <li><el-button type="primary" @click="editClick()" icon="el-icon-plus"
            v-permissions="['business:ywbuilding:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete"
            v-permissions="['business:ywbuilding:delete']">删除</el-button></li>
      </ul>
      <el-table
        v-loading="isWorking.search"
        :data="tableData.list"
        stripe
        @selection-change="handleSelectionChange"
      >
      <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="name" label="楼宇名称" min-width="100px">
          <template v-slot="scope">
@@ -40,24 +38,19 @@
        <el-table-column prop="cqArea" label="管理面积(m²)" min-width="80px"></el-table-column>
        <el-table-column prop="" label="房间总数(间)" min-width="80px"></el-table-column>
        <el-table-column prop="" label="可招商房源数量(间)" min-width="100px"></el-table-column>     
        <el-table-column
          v-if="containPermissions(['business:ywbuilding:update', 'business:ywbuilding:delete'])"
          label="操作"
          min-width="120"
          fixed="right"
        >
        <el-table-column v-if="containPermissions(['business:ywbuilding:update', 'business:ywbuilding:delete'])"
          label="操作" min-width="120" fixed="right">
          <template slot-scope="{row}">
            <el-button type="text" @click="editClick(row)" icon="el-icon-edit" v-permissions="['business:ywbuilding:update']">编辑</el-button>
            <el-button type="text" @click="editFloor(row)" v-permissions="['business:ywbuilding:update']">楼层管理</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:ywbuilding:delete']">删除</el-button>
            <el-button type="text" @click="editClick(row)" icon="el-icon-edit"
              v-permissions="['business:ywbuilding:update']">编辑</el-button>
            <el-button type="text" @click="editFloor(row)"
              v-permissions="['business:ywbuilding:update']">楼层管理</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
              v-permissions="['business:ywbuilding: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>
    <!-- æ–°å»º/修改 -->
admin/src/views/project/components/OperaYwBuildingWindow.vue
@@ -2,7 +2,7 @@
  <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
    <el-form :model="form" ref="form" :rules="rules">
      <el-form-item label="所属项目" prop="projectId" clearable placeholder="请选择项目">
        <el-select v-model="form.projectId">
        <el-select v-model="form.projectId" filterable clearable>
          <el-option v-for="item in projectList" :key="item.id" :label="item.name" :value="item.id"></el-option>
        </el-select>
      </el-form-item>
admin/src/views/workorder/components/OperaCategoryWindow.vue
@@ -1,22 +1,16 @@
<template>
  <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" width="600px" @close="close" @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="parentId">
        <el-select :disabled="form.id" v-model="form.parentId" placeholder="不填为则一级分类">
          <el-option v-for="op in dataList" :key="op.id" :label="op.name" :value="op.id"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="分类名称" prop="name">
        <el-input v-model="form.name" placeholder="请输入分类名称" v-trim />
      </el-form-item>
      <!-- <el-form-item label="状态" prop="status">
        <el-select v-model="form.status" placeholder="请选择">
          <el-option label="启用" value="0"></el-option>
          <el-option label="禁用" value="1"></el-option>
        </el-select>
      </el-form-item> -->
      <el-form-item label="备注" prop="remark">
        <el-input type="textarea" v-model="form.remark" placeholder="请输入备注" v-trim />
      <el-form-item label="排序码(升序)" prop="sortnum">
        <el-input v-model="form.sortnum" oninput="value=value.replace(/^(0+)|[^\d]+/g, '').slice(0, 6)" v-trim />
      </el-form-item>
    </el-form>
  </GlobalWindow>
@@ -38,7 +32,8 @@
        name: '',
        remark: '',
        status: '',
        type: 1
        sortnum: '',
        type: 3
      },
      // éªŒè¯è§„则
      rules: {
@@ -60,7 +55,7 @@
  },
  methods: {
    getList() {
      fetchCateList({}).then(res => {
      fetchCateList({ type: 3 }).then(res => {
        this.dataList = res || []
        
      })
admin/src/views/workorder/components/OperaYwWorkorderWindow.vue
@@ -1,102 +1,55 @@
<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="creator">
        <el-input v-model="form.creator" placeholder="请输入创建人编码" v-trim/>
      <el-form-item label="位置类型" prop="areaType">
        <el-select v-model="form.areaType">
          <el-option label="室内维修" value="0"></el-option>
          <el-option label="公共维修" value="1"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="创建时间" prop="createDate">
        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="请输入创建时间"></el-date-picker>
      <el-form-item label="报修区域">
      </el-form-item>
      <el-form-item label="更新人编码" prop="editor">
        <el-input v-model="form.editor" placeholder="请输入更新人编码" v-trim/>
      </el-form-item>
      <el-form-item label="更新时间" prop="editDate">
        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="请输入更新时间"></el-date-picker>
      </el-form-item>
      <el-form-item label="是否删除0否 1是" prop="isdeleted">
        <el-input v-model="form.isdeleted" placeholder="请输入是否删除0否 1是" v-trim/>
      </el-form-item>
      <el-form-item label="标题" prop="title">
        <el-input v-model="form.title" placeholder="请输入标题" v-trim/>
      </el-form-item>
      <el-form-item label="备注" prop="remark">
        <el-input v-model="form.remark" placeholder="请输入备注" v-trim/>
      </el-form-item>
      <el-form-item label="状态 0启用 1禁用" prop="status">
        <el-input v-model="form.status" placeholder="请输入状态 0启用 1禁用" v-trim/>
      </el-form-item>
      <el-form-item label="排序码" prop="sortnum">
        <el-input v-model="form.sortnum" placeholder="请输入排序码" v-trim/>
      </el-form-item>
      <el-form-item label="情况说明" prop="content">
        <el-input v-model="form.content" placeholder="请输入情况说明" v-trim/>
      <el-form-item label="分类" prop="cateId">
        <el-select v-model="form.cateId">
          <el-option label="" value=""></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="上门时间" prop="getDate">
        <el-date-picker v-model="form.getDate" value-format="yyyy-MM-dd" placeholder="请输入上门时间"></el-date-picker>
        <el-date-picker type="datetime" v-model="form.getDate" format="yyyy-MM-dd HH:mm" value-format="yyyy-MM-dd HH:mm:ss"
          placeholder="请选择上门时间"></el-date-picker>
      </el-form-item>
      <el-form-item label="所属项目编码(关联yw_project)" prop="projectId">
        <el-input v-model="form.projectId" placeholder="请输入所属项目编码(关联yw_project)" v-trim/>
      <el-form-item label="现场图片">
        <div class="file_list">
          <el-upload class="avatar-uploader" :data="uploadData" :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>
              <div>图片/视频</div>
            </div>
          </el-upload>
          <div v-for="(item, i) in fileList" :key="i" class="item">
            <i @click="handleDelImg(i)" class="el-icon-error close"></i>
            <el-image :src="item.fileurlFull" :preview-src-list="[item.fileurlFull]" v-if="item.type == 0"
              class="img"></el-image>
            <video :src="item.fileurlFull" controls v-if="item.type == 1" class="img"></video>
          </div>
        </div>
      </el-form-item>
      <el-form-item label="所属项目编码(关联yw_building)" prop="buildingId">
        <el-input v-model="form.buildingId" placeholder="请输入所属项目编码(关联yw_building)" v-trim/>
      </el-form-item>
      <el-form-item label="所属房间编码(关联yw_room)" prop="roomId">
        <el-input v-model="form.roomId" placeholder="请输入所属房间编码(关联yw_room)" v-trim/>
      </el-form-item>
      <el-form-item label="提报人编码" prop="userId">
        <el-input v-model="form.userId" placeholder="请输入提报人编码" v-trim/>
      </el-form-item>
      <el-form-item label="联系电话" prop="phone">
        <el-input v-model="form.phone" placeholder="请输入联系电话" v-trim/>
      </el-form-item>
      <el-form-item label="提报时间" prop="submitDate">
        <el-date-picker v-model="form.submitDate" value-format="yyyy-MM-dd" placeholder="请输入提报时间"></el-date-picker>
      </el-form-item>
      <el-form-item label="工单分类编码(关联category)" prop="cateId">
        <el-input v-model="form.cateId" placeholder="请输入工单分类编码(关联category)" v-trim/>
      </el-form-item>
      <el-form-item label="保修区域类型 0室内维修 1公共区域" prop="areaType">
        <el-input v-model="form.areaType" placeholder="请输入保修区域类型 0室内维修 1公共区域" v-trim/>
      </el-form-item>
      <el-form-item label="工单编号" prop="code">
        <el-input v-model="form.code" placeholder="请输入工单编号" v-trim/>
      </el-form-item>
      <el-form-item label="处理状态 0待处理 1已分派 2已处理" prop="dealStatus">
        <el-input v-model="form.dealStatus" placeholder="请输入处理状态 0待处理 1已分派 2已处理" v-trim/>
      </el-form-item>
      <el-form-item label="分派人编码(关联system_user)" prop="dispatchUserId">
        <el-input v-model="form.dispatchUserId" placeholder="请输入分派人编码(关联system_user)" v-trim/>
      </el-form-item>
      <el-form-item label="分派时间" prop="dispatchDate">
        <el-date-picker v-model="form.dispatchDate" value-format="yyyy-MM-dd" placeholder="请输入分派时间"></el-date-picker>
      </el-form-item>
      <el-form-item label="分派处理说明" prop="dispatchInfo">
        <el-input v-model="form.dispatchInfo" placeholder="请输入分派处理说明" v-trim/>
      </el-form-item>
      <el-form-item label="处理人编码(关联system_user)" prop="dealUserId">
        <el-input v-model="form.dealUserId" placeholder="请输入处理人编码(关联system_user)" v-trim/>
      </el-form-item>
      <el-form-item label="处理时间" prop="dealDate">
        <el-date-picker v-model="form.dealDate" value-format="yyyy-MM-dd" placeholder="请输入处理时间"></el-date-picker>
      </el-form-item>
      <el-form-item label="处理备注" prop="dealInfo">
        <el-input v-model="form.dealInfo" placeholder="请输入处理备注" v-trim/>
      </el-form-item>
      <el-form-item label="处理方式 0指派后处理 1直接回复" prop="dealType">
        <el-input v-model="form.dealType" placeholder="请输入处理方式 0指派后处理 1直接回复" v-trim/>
      <el-form-item label="情况说明" prop="content">
        <el-input type="textarea" :rows="4" v-model="form.content" placeholder="请输入情况说明" v-trim />
      </el-form-item>
    </el-form>
    <!--  -->
  </GlobalWindow>
</template>
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { Loading } from 'element-ui'
export default {
  name: 'OperaYwWorkorderWindow',
  extends: BaseOpera,
@@ -124,7 +77,7 @@
        phone: '',
        submitDate: '',
        cateId: '',
        areaType: '',
        areaType: '0',
        code: '',
        dealStatus: '',
        dispatchUserId: '',
@@ -135,9 +88,15 @@
        dealInfo: '',
        dealType: ''
      },
      loadingInstance: null,
      // éªŒè¯è§„则
      rules: {
      }
      },
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch',
      fileList: [],
      uploadData: {
        folder: 'HIDDEN_DANGER_FILE'
      },
    }
  },
  created () {
@@ -145,6 +104,99 @@
      api: '/workorder/ywWorkorder',
      'field.id': 'id'
    })
  },
  methods: {
    beforeUpload (file) {
      if (['video/mp4', 'video/ogg', 'video/flv', 'video/avi', 'video/wmv', 'video/rmvb', 'image/jpeg','image/jpg', 'image/png', 'image/gif'].indexOf(file.type) == -1) {
        this.$message.error('请上传正确的视频/图片格式')
        return false
      }
      this.loadingInstance = Loading.service({
        lock: true,
        text: 'Loading',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)'
      })
    },
    uploadError() {
      this.$nextTick(() => { // ä»¥æœåŠ¡çš„æ–¹å¼è°ƒç”¨çš„ Loading éœ€è¦å¼‚步关闭
        if(this.loadingInstance){
          this.loadingInstance.close()
        }
      })
    },
    uploadAvatarSuccess (file) {
      this.$nextTick(() => { // ä»¥æœåŠ¡çš„æ–¹å¼è°ƒç”¨çš„ Loading éœ€è¦å¼‚步关闭
        if(this.loadingInstance){
          this.loadingInstance.close()
        }
      })
      console.log('file', file)
      const item = file.data[0]
      if (['.mp4', '.avi', '.flv', '.wmv'].some(char => item.imgaddr.includes(char))) {
        this.fileList.push({
          type: 1,
          fileurl: item.imgaddr,
          fileurlFull: item.url
        })
      } else {
        this.fileList.push({
          type: 0,
          fileurl: item.imgaddr,
          fileurlFull: item.url
        })
      }
      console.log('file', this.fileList)
      // this.$set(this.param, 'faceImg', file.imgurl)
      // this.$set(this.param, 'faceImgUrl', file.imgurlfull)
    },
    handleDelImg (i) {
      this.fileList.splice(i, 1)
    },
    close(){
      this.isShowModal = false
      this.$emit('close')
    }
  }
}
</script>
<style lang="scss" scoped>
.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/workorder/workorderCate.vue
@@ -9,15 +9,9 @@
      </ul>
      <el-table row-key="id" :tree-props="{ children: 'childCategoryList' }" v-loading="isWorking.search"
        :data="dataList" stripe @selection-change="handleSelectionChange">
        <el-table-column prop="name" label="分类名称" min-width="100px"></el-table-column>
        <el-table-column prop="remark" label="备注" min-width="100px"></el-table-column>
        <!-- <el-table-column prop="status" label="状态" min-width="100px">
                  <template slot-scope="{row}">
                      <span v-if="row.status === 0">启用</span>
                      <span v-if="row.status === 1">禁用</span>
                  </template>
</el-table-column> -->
        <el-table-column prop="createDate" label="创建时间" min-width="100px"></el-table-column>
        <el-table-column prop="name" label="工单分类" min-width="100px"></el-table-column>
        <!-- <el-table-column prop="parentName" label="所属分类" min-width="100px"></el-table-column> -->
        <el-table-column prop="sortnum" label="排序码" min-width="100px"></el-table-column>
        <el-table-column v-if="containPermissions(['business:category:update', 'business:category:delete'])" label="操作"
          min-width="120" fixed="right">
          <template slot-scope="{row}">
@@ -99,7 +93,7 @@
      const { pagination, filters } = this
      this.loading = true
      fetchList({
        model: { ...filters },
        model: { ...filters, type: 3 },
        capacity: pagination.pageSize,
        page: pagination.page,
      }).then(res => {
admin/src/views/workorder/workorderList.vue
@@ -2,70 +2,61 @@
  <TableLayout :permissions="['business:ywworkorder:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="所属项目编码(关联yw_project)" prop="projectId">
        <el-input v-model="searchForm.projectId" placeholder="请输入所属项目编码(关联yw_project)" @keypress.enter.native="search"></el-input>
      <el-form-item prop="areaType">
        <el-select v-model="searchForm.areaType">
          <el-option label="室内维修" value="0"></el-option>
          <el-option label="公共维修" value="1"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="所属项目编码(关联yw_building)" prop="buildingId">
        <el-input v-model="searchForm.buildingId" placeholder="请输入所属项目编码(关联yw_building)" @keypress.enter.native="search"></el-input>
      <el-form-item label="请选择报修区域" prop="buildingId">
        <el-input v-model="searchForm.buildingId" placeholder="请输入所属项目编码(关联yw_building)"
          @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="所属房间编码(关联yw_room)" prop="roomId">
        <el-input v-model="searchForm.roomId" placeholder="请输入所属房间编码(关联yw_room)" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="工单分类编码(关联category)" prop="cateId">
        <el-input v-model="searchForm.cateId" placeholder="请输入工单分类编码(关联category)" @keypress.enter.native="search"></el-input>
      <el-form-item prop="cateId">
        <el-input v-model="searchForm.cateId" placeholder="报修物品类别" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:ywworkorder:exportExcel']" @click="exportExcel">导出</el-button>
        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:ywworkorder:exportExcel']"
          @click="exportExcel">导出</el-button>
        <el-button @click="reset">重置</el-button>
      </section>
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:ywworkorder:create', 'business:ywworkorder:delete']">
        <li><el-button type="primary" @click="$refs.operaYwWorkorderWindow.open('新建工单')" icon="el-icon-plus" v-permissions="['business:ywworkorder:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:ywworkorder:delete']">删除</el-button></li>
        <li><el-button type="primary" @click="$refs.operaYwWorkorderWindow.open('新建工单')" icon="el-icon-plus"
            v-permissions="['business:ywworkorder:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete"
            v-permissions="['business:ywworkorder: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>
        <el-table-column prop="projectId" label="所属项目编码(关联yw_project)" min-width="100px"></el-table-column>
        <el-table-column prop="buildingId" label="所属项目编码(关联yw_building)" min-width="100px"></el-table-column>
        <el-table-column prop="roomId" label="所属房间编码(关联yw_room)" min-width="100px"></el-table-column>
        <el-table-column prop="userId" label="提报人编码" min-width="100px"></el-table-column>
        <el-table-column prop="phone" label="联系电话" min-width="100px"></el-table-column>
        <el-table-column prop="submitDate" label="提报时间" min-width="100px"></el-table-column>
        <el-table-column prop="cateId" label="工单分类编码(关联category)" min-width="100px"></el-table-column>
        <el-table-column prop="areaType" label="保修区域类型 0室内维修 1公共区域" min-width="100px"></el-table-column>
        <el-table-column prop="dealStatus" label="处理状态 0待处理 1已分派 2已处理" min-width="100px"></el-table-column>
        <el-table-column prop="dealUserId" label="处理人编码(关联system_user)" min-width="100px"></el-table-column>
        <el-table-column prop="dealType" label="处理方式 0指派后处理 1直接回复" min-width="100px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['business:ywworkorder:update', 'business:ywworkorder:delete'])"
          label="操作"
          min-width="120"
          fixed="right"
        >
      <el-table v-loading="isWorking.search" :data="tableData.list" stripe>
        <el-table-column prop="areaType" label="位置类型" min-width="80px">
          <template v-slot="scope">
            <span v-if="scope.row.areaType == 0">室内装修</span>
            <span v-if="scope.row.areaType == 1">公共区域</span>
          </template>
        </el-table-column>
        <el-table-column prop="" label="报修区域" min-width="100px"></el-table-column>
        <el-table-column prop="cateName" label="报修物品类型" min-width="100px"></el-table-column>
        <el-table-column prop="userName" label="上报人" min-width="100px"></el-table-column>
        <el-table-column prop="submitDate" 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">
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.operaYwWorkorderWindow.open('编辑工单', row)" icon="el-icon-edit" v-permissions="['business:ywworkorder:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:ywworkorder:delete']">删除</el-button>
            <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" fixed="right">
          <template slot-scope="{row}">
            <span class="primaryColor cu">查看详情</span>
          </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>
    <!-- æ–°å»º/修改 -->
@@ -86,7 +77,7 @@
    return {
      // æœç´¢
      searchForm: {
        id: '',
        areaType: '',
        creator: '',
        createDate: '',
        editor: '',
@@ -105,7 +96,6 @@
        phone: '',
        submitDate: '',
        cateId: '',
        areaType: '',
        code: '',
        dealStatus: '',
        dispatchUserId: '',