xiangpei
2024-08-24 cfa6fbe23b5aea9b400fab78e04239b64d0dda92
src/views/system/work-order/distribute/index.vue
@@ -4,59 +4,53 @@
      <el-col :span="24" style="position: relative">
        <el-menu :default-active="activeIndex" class="el-menu" mode="horizontal" @select="handleSelect">
          <el-menu-item index="0" @click="changeUnit(null, '全部')">
            全部单位(430)
            全部单位({{ totalWorkOrders }})
          </el-menu-item>
          <el-menu-item index="1">
            自流井运维单位(70)
          <el-menu-item :index="index + 1" v-for="(item, index) in unitList" :key="index" @click="changeUnit(item.id, item.value)">
            {{ item.unitName }}({{ item.workOrderCount }})
          </el-menu-item>
          <el-menu-item index="2">
            大安运维(50)
          </el-menu-item>
          <el-menu-item index="3">富顺运维单位(70)</el-menu-item>
          <el-menu-item index="4">高新运维单位(15)</el-menu-item>
          <el-menu-item index="5">荣县运维单位(90)</el-menu-item>
          <el-menu-item index="6">贡井运维单位(45)</el-menu-item>
          <el-menu-item index="7">沿滩运维单位(70)</el-menu-item>
        </el-menu>
        <el-popover
          placement="right"
          width="400"
          trigger="click">
          <el-form :model="settingForm" :rules="settingRules" ref="settingForm" label-width="120px">
            <el-form-item label="录像质量" prop="videoQuality">
              <el-select style="width: 100%" v-model="settingForm.videoQuality" placeholder="最低录像质量">
                <el-option label="全录像" value="全录像"/>
                <el-option label="部分录像" value="部分录像"/>
                <el-option label="无录像" value="无录像"/>
              </el-select>
            </el-form-item>
            <el-form-item label="点位离线时长" prop="outLine">
              <el-input type="number" v-model="settingForm.outLine" placeholder="不能超过多久">
                <template slot="append">分钟</template>
              </el-input>
            </el-form-item>
            <el-form-item label="视频标注准确率" prop="videoLabel">
              <el-input type="number" v-model="settingForm.videoLabel" placeholder="最低准确率">
                <template slot="append">%</template>
              </el-input>
            </el-form-item>
            <el-form-item>
              <el-button type="primary" @click="submitSetting">保存</el-button>
            </el-form-item>
          </el-form>
          <el-button title="自动生成工单设置" slot="reference" class="setting" style="" type="success" icon="el-icon-s-tools" circle></el-button>
        </el-popover>
      </el-col>
    </el-row>
    <el-row class="op-warp" type="flex" justify="left" >
      <el-col :span="24">
        <el-button size="small" type="info" @click="selectedDistribute" class="op">下发选中工单</el-button>
    <el-row class="op-warp">
      <el-row v-show="showSearch">
        <el-form :model="queryParams" ref="queryForm" size="small" :inline="true">
          <el-form-item label="关键词" prop="keyword">
            <el-input
              v-model="queryParams.keyword"
              placeholder="关键词搜索"
              clearable
              @keyup.enter.native="page"
              @clear="page"
            />
          </el-form-item>
          <el-form-item label="故障类型" prop="errorTypeList">
            <el-select v-model="queryParams.errorTypeList" multiple placeholder="故障类型" clearable @change="page" @clear="page">
              <el-option v-for="dict in dict.type.error_type"
                         :value="dict.value"
                         :label="dict.label"/>
            </el-select>
          </el-form-item>
          <el-form-item label="下发状态" prop="status">
            <el-select v-model="queryParams.status" @change="page" placeholder="下发状态" clearable>
              <el-option label="未下发" value="WAIT_DISTRIBUTE"/>
              <el-option label="已下发" value="DISTRIBUTED"/>
            </el-select>
          </el-form-item>
          <el-form-item>
            <el-button type="primary" icon="el-icon-search" size="small" @click="page">搜索</el-button>
          </el-form-item>
        </el-form>
      </el-row>
      <el-row>
        <el-button size="mini" plain type="info" @click="selectedDistribute" class="op">下发选中工单</el-button>
        <el-popconfirm
          @confirm="allDistribute"
          title="确定要下发所有工单吗?"
        >
          <el-button size="small" type="danger"  class="op" slot="reference">全部下发</el-button>
          <el-button size="mini" plain type="danger" class="op" slot="reference">全部下发</el-button>
        </el-popconfirm>
        <el-popover
@@ -67,33 +61,43 @@
          <span style="font-weight: bold;font-size: 16px">快捷下发</span>
          <el-form ref="fastDistributeForm" :model="fastDistributeForm" :rules="fastDistributeRules" label-width="80px">
            <el-form-item label="快捷方式" prop="fastWay">
              <el-radio v-model="fastDistributeForm.fastWay" label="0">最近30分钟</el-radio>
              <el-radio v-model="fastDistributeForm.fastWay" label="01">最近1小时</el-radio>
              <el-radio v-model="fastDistributeForm.fastWay" label="10">最近2小时</el-radio>
              <el-radio v-model="fastDistributeForm.fastWay" label="11">最近1天</el-radio>
              <el-radio v-model="fastDistributeForm.fastWay" label="101">自定义</el-radio>
              <el-radio v-model="fastDistributeForm.fastWay" label="LAST_HALF_HOUR">最近30分钟</el-radio>
              <el-radio v-model="fastDistributeForm.fastWay" label="LAST_HOUR">最近1小时</el-radio>
              <el-radio v-model="fastDistributeForm.fastWay" label="LAST_TWO_HOUR">最近2小时</el-radio>
              <el-radio v-model="fastDistributeForm.fastWay" label="LAST_DAY">最近1天</el-radio>
              <el-radio v-model="fastDistributeForm.fastWay" label="CUSTOM">自定义</el-radio>
            </el-form-item>
            <el-form-item v-if="fastDistributeForm.fastWay === '101'" label="时间范围">
            <el-form-item v-if="fastDistributeForm.fastWay === 'CUSTOM'" label="时间范围">
              <el-date-picker
                style="width: 100%"
                v-model="fastTimeRange"
                type="datetimerange"
                range-separator="至"
                start-placeholder="开始日期"
                value-format="yyyy-MM-dd HH:mm:ss"
                end-placeholder="结束日期">
              </el-date-picker>
            </el-form-item>
            <el-form-item label="故障类型" prop="errorType">
              <el-select v-model="fastDistributeForm.errorType" multiple>
                <el-option v-for="dict in dict.type.error_type"
                           :value="dict.value"
                           :key="dict.value"
                           :label="dict.label"/>
              </el-select>
            </el-form-item>
            <el-form-item label="数量限制" prop="fastNumLimit">
              <el-input v-model="fastDistributeForm.fastNumLimit" size="small" type="number" placeholder="此次工单下发最大数量"></el-input>
              <el-input v-model="fastDistributeForm.fastNumLimit" type="number" placeholder="此次工单下发最大数量"></el-input>
            </el-form-item>
            <el-form-item>
              <el-button type="primary" size="small" @click="fastDistribute">立即下发</el-button>
            </el-form-item>
          </el-form>
          <el-button slot="reference" type="primary" size="small">快捷下发</el-button>
          <el-button slot="reference" type="primary" size="mini" plain>快捷下发</el-button>
        </el-popover>
        <el-button size="small" type="primary" @click="page" class="op">刷新</el-button>
      </el-col>
        <el-button size="mini" plain type="success" @click="handleAdd">手动新增工单</el-button>
        <right-toolbar :showSearch.sync="showSearch" @queryTable="page"></right-toolbar>
      </el-row>
    </el-row>
    <el-row class="content-warp" type="flex" justify="left">
@@ -101,10 +105,22 @@
        <el-table v-loading="loading" :data="workOrderList" @selection-change="handleSelectionChange">
          <el-table-column type="selection" width="55" align="center" />
          <el-table-column label="工单号" align="center" prop="workOrderNo"/>
          <el-table-column label="运维单位" align="center" prop="unitName"/>
          <el-table-column label="工单来源" align="center" prop="source"/>
          <el-table-column label="故障点位" align="center" prop="source">
            <template slot-scope="scope">
              <el-popover
                placement="right"
                :title="scope.row.important ? '重点点位': '正常点位'"
                width="200"
                trigger="hover">
                <span :class="{important: scope.row.important}" slot="reference">{{ scope.row.source }}</span>
              </el-popover>
            </template>
          </el-table-column>
          <el-table-column label="故障类型" align="center" prop="errorType"/>
          <el-table-column label="运维单位" align="center" prop="unitName"/>
          <el-table-column label="产生时间" align="center" prop="createTime"/>
          <el-table-column v-if="queryParams.status === 'DISTRIBUTED'" label="下发人" align="center" prop="realName"/>
          <el-table-column v-if="queryParams.status === 'DISTRIBUTED'" label="下发时间" align="center" prop="distributeTime"/>
        </el-table>
        <pagination
@@ -117,15 +133,71 @@
      </el-col>
    </el-row>
    <!-- 添加或修改【请填写功能名称】对话框 -->
    <el-dialog :title="detailName" :visible.sync="open" width="500px" append-to-body>
      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
        <el-form-item label="运维单位" prop="unitId">
          <el-select v-model="form.unitId" placeholder="请选择">
            <el-option
              v-for="item in unitList"
              :key="item.id"
              :label="item.unitName"
              :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="工单来源" prop="source">
          <el-select
            v-model="form.source"
            filterable
            remote
            reserve-keyword
            placeholder="请选择来源"
            :remote-method="remoteGetPoints"
            @change="setPointId"
            :loading="selectLoading">
            <el-option
              v-for="item in pointList"
              :key="item.id"
              :label="item.value"
              :value="item.value">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="故障类型" prop="errorType">
          <el-select v-model="form.errorType" multiple>
            <el-option v-for="dict in dict.type.error_type"
                       :value="dict.value"
                       :key="dict.value"
                       :label="dict.label"/>
          </el-select>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="cancel">取 消</el-button>
        <el-button type="primary" @click="submitForm">确 定</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import {distributeWorkOrder, fastDistribute} from '@/api/platform/work-order'
import {distributeWorkOrder, fastDistribute, addWorkOrder, updateWorkOrder, selectedIdsDistribute} from '@/api/platform/work-order'
import {workList} from "@/api/platform/unit";
import { pointSelectData } from "@/api/platform/point";
export default {
  dicts: ['error_type'],
  name: 'index',
  data() {
    return {
      showSearch: true,
      selectedIdsDistributeForm: {
        ids: [],
        unitId: null
      },
      unitList: [],
      settingForm: {
        // 离线
        outLine: null,
@@ -164,16 +236,21 @@
      // 下发表单验证
      fastDistributeRules: {
        fastWay: [
          { required: true, message: "请选择快速分发方式", trigger: "change" }
          { required: true, message: "请选择快速分发方式", trigger: "blur" }
        ],
        fastNumLimit: [
          { required: true, message: "请输入快速分发数量限制", trigger: "change" }
          { required: true, message: "请输入快速分发数量限制", trigger: "blur" }
        ],
        errorType: [
          { required: true, message: "请故障类型", trigger: "blur" }
        ],
      },
      queryParams: {
        unitId: null,
        keyword: '',
        status: 'WAIT_DISTRIBUTE',
        pageNum: 1,
        pageSize: 20,
        pageSize: 10,
      },
      // 总条数
      total: 0,
@@ -182,12 +259,47 @@
      activeIndex: '0',
      loading: false,
      workOrderList: [],
      // 弹出层标题
      title: "",
      // 是否显示弹出层
      open: false,
      // 表单参数
      form: {
      },
      // 下拉加载
      selectLoading: false,
      // 点位list
      pointList: [],
      // 表单校验
      rules: {
        source: [
          { required: true, message: "工单来源不能为空", trigger: "blur" }
        ],
        workOrderNo: [
          { required: true, message: "工单号不能为空", trigger: "blur" }
        ],
        unitId: [
          { required: true, message: "运维单位不能为空", trigger: "blur" }
        ],
        errorType: [
          { required: true, message: "请选择故障类型", trigger: "blur" }
        ],
      }
    }
  },
  mounted() {
    this.page();
  },
  computed: {
    totalWorkOrders() {
      return this.unitList.reduce((total, item) => total + item.workOrderCount, 0);
    },
  },
  methods: {
    setPointId(selectedValue) {
      const selectedItem = this.pointList.find(item => item.value === selectedValue);
      this.form.serialNumber = selectedItem.id
    },
    submitSetting() {
      this.$refs['settingForm'].validate((valid) => {
        if (valid) {
@@ -200,8 +312,9 @@
    },
    page() {
      this.loading = true;
      this.selectUnit();
      distributeWorkOrder(this.queryParams).then(res => {
        this.workOrderList = res.data;
        this.workOrderList = res.data.records;
        this.total = res.total;
        this.loading = false;
      })
@@ -218,33 +331,30 @@
      this.fastDistributeForm.end = null
      this.fastDistributeForm.fastNumLimit = null
      this.fastTimeRange = []
      this.fastDistributeForm.errorType = null
    },
    // 全部下发
    allDistribute() {
      this.fastDistribute();
      this.selectedIdsDistributeForm.unitId = this.unitId
      selectedIdsDistribute(this.selectedIdsDistributeForm).then(res => {
        this.$message.success("工单下发成功")
        this.page();
      })
    },
    // 快速下发
    fastDistribute() {
      // this.$refs['fastDistributeForm'].validate((valid) => {
      //   if (valid) {
          // 如果是自定义方式,那么时间段必填
          if (this.fastDistributeForm.fastWay === '101' && !this.fastTimeRange.length > 0) {
            this.$message.warning("请选择时间范围")
            return false
          }
          if (this.fastTimeRange.length > 0) {
            this.fastDistributeForm.start = this.fastTimeRange[0]
            this.fastDistributeForm.end = this.fastTimeRange[1]
          }
      this.$refs['fastDistributeForm'].validate((valid) => {
        if (valid) {
          this.fastDistributeForm.start = this.fastTimeRange[0]
          this.fastDistributeForm.end = this.fastTimeRange[1]
          this.fastDistributeForm.unitId = this.unitId
          fastDistribute(this.fastDistributeForm).then(res => {
            // this.clearFastDistributeForm();
            res.code == 200 ? this.$message.success(res.msg) : this.$message.warning(res.msg)
            this.clearFastDistributeForm();
            this.page();
          })
        // } else {
        //   return false
        // }
      // })
        }
      })
    },
    // 选中工单下发
    selectedDistribute() {
@@ -252,7 +362,13 @@
        this.$message.warning("请先选择要下发的工单")
        return
      }
      this.fastDistribute();
      this.selectedIdsDistributeForm.unitId = this.unitId;
      this.selectedIdsDistributeForm.ids = this.multipleSelection;
      selectedIdsDistribute(this.selectedIdsDistributeForm).then(res => {
        this.$message.success("工单下发成功")
        this.selectedIdsDistributeForm.ids = [];
        this.page();
      })
    },
    handleSelect(key, keyPath) {
      console.log(key, keyPath);
@@ -264,11 +380,74 @@
    handleSelectionChange(selection) {
      this.multipleSelection = selection.map(item => item.id)
    },
    /** 新增按钮操作 */
    handleAdd() {
      this.reset();
      this.open = true;
      this.title = "添加合同";
    },
    // 表单重置
    reset() {
      this.form = {};
      this.resetForm("form");
    },
    /** 提交按钮 */
    submitForm() {
      this.$refs["form"].validate(valid => {
        if (valid) {
          if (this.form.id != null) {
            updateWorkOrder(this.form).then(response => {
              this.$modal.msgSuccess("修改成功");
              this.open = false;
              this.page();
            });
          } else {
            addWorkOrder(this.form).then(response => {
              this.$modal.msgSuccess("新增成功");
              this.open = false;
              this.page();
            });
          }
        }
      });
    },
    // 取消按钮
    cancel() {
      this.open = false;
      this.reset();
    },
    // 运维公司下拉数据
    selectUnit() {
      workList().then(res => {
        this.unitList = res.data;
      })
    },
    // 远程搜索点位
    remoteGetPoints(query) {
      if (query !== '') {
        this.selectLoading = true;
        let data = {
          "keyword": query
        }
        pointSelectData(data).then(res => {
          this.pointList = res.data;
          this.selectLoading = false;
        })
      } else {
        this.pointList = [];
      }
    },
  }
}
</script>
<style scoped>
.important {
  color: red;
}
/deep/ .el-popover__title {
  margin-bottom: 0px;
}
.row {
  padding: 0 20px;
}