shishuaikang
2023-12-05 e8c0ee20186dd4fd13b1284c6184d07763a0a748
web/src/views/GoodManage/MixingScreen.vue
@@ -1,17 +1,17 @@
<!-- 设备管理 ==> 拌合站屏管理-->
<!-- 物资管理 ==> 拌合站屏管理-->
<template>
  <div class="main">
    <div class="main_header">
      <div class="header_item">
        <span class="header_label">拌合站屏:</span>
        <el-select size="mini" v-model="queryInfo.screen" placeholder="请选择拌合站屏">
          <el-option v-for="item in queryInfoScreens" :key="item.value" :label="item.label"
            :value="item.value"></el-option>
        <span class="header_label">拌和站屏:</span>
        <el-select size="mini" v-model="queryInfo.types" placeholder="请选择拌和站屏" clearable>
          <el-option v-for="item in selects.screenNames" :key="item.value" :label="item.label"
            :value="item.value2"></el-option>
        </el-select>
      </div>
      <div class="header_item">
        <span class="header_label">录入方式:</span>
        <el-select size="mini" v-model="queryInfo.inmode" placeholder="请选择录入方式">
        <el-select size="mini" v-model="queryInfo.stata" placeholder="请选择录入方式" clearable>
          <el-option v-for="item in queryInfoInmodes" :key="item.value" :label="item.label"
            :value="item.value"></el-option>
        </el-select>
@@ -19,40 +19,122 @@
      <div class="header_item">
        <span class="header_label">创建时间:</span>
        <el-date-picker type="daterange" v-model="times" value-format="yyyy-MM-dd" start-placeholder="起始时间"
          end-placeholder="结束时间" @change="changeTime" clear></el-date-picker>
          end-placeholder="结束时间" @change="changeTime" clearable></el-date-picker>
      </div>
      <div class="header_item">
        <el-button icon="el-icon-search" v-permission="'search'" @click="queryReset">查询</el-button>
        <el-button icon="el-icon-plus" v-permission="'insert'" @click="addRow">新增</el-button>
        <el-button v-permission="'search'" @click="queryReset">查询</el-button>
        <el-button v-permission="'insert'" @click="addRow">新增</el-button>
      </div>
    </div>
    <div class="main_content">
      <div class="main_content_item" v-for="(item, index) in ['', '', '', '', '',]" :key="index">
      <div class="main_content_wrap">
        <div class="main_content_item" v-for="(list, index) in dataLists" :key="index">
          <el-row>
            <el-col :span="24 / list.length" v-for="(item, index) in list" :key="index">
              <div class="head">
                <span class="left_title">{{ item.siloName }}</span>
                <span v-if="index + 1 === list.length" class="right_title">录入方式: <span style="color:#39B5FE">{{
                  queryInfoInmodeMap[item.stata] }}</span></span>
              </div>
              <div class="list">
                <div class="item">
                  <span class="name">屏幕编号:</span>
                  <span class="value">{{ item.types }}</span>
                </div>
                <div class="item">
                  <span class="name">规格型号:</span>
                  <span class="value">{{ item.spec }}</span>
                </div>
                <div class="item">
                  <span class="name">产地名称:</span>
                  <span class="value">{{ item.producer }}</span>
                </div>
                <div class="item">
                  <span class="name">炉(批)号:</span>
                  <span class="value">{{ item.stove }}</span>
                </div>
                <div class="item">
                  <span class="name">进场数量:</span>
                  <span class="value">{{ item.inNum }}</span>
                </div>
                <div class="item">
                  <span class="name">进场日期:</span>
                  <span class="value">{{ item.inDate }}</span>
                </div>
                <div class="item">
                  <span class="name">检验日期:</span>
                  <span class="value">{{ item.inspectDate }}</span>
                </div>
                <div class="item">
                  <span class="name">检验状态:</span>
                  <span :class="['value', 'style' + item.inspectState]">{{ ruleFormStatuMap[item.inspectState] }}</span>
                </div>
                <div class="item">
                  <span class="name">报告编号:</span>
                  <span class="value">{{ item.reportNumber }}</span>
      </div>
    </div>
    <!-- 详情dialog -->
    <el-dialog width="400px" class="prop_dialog" v-if="isRenderDialog" title="详情" :visible.sync="asyncVisible">
      <el-form class="rule_form" label-width="auto">
        <div class="divider"></div>
        <el-form-item label="巡检任务:">{{ info.task }}</el-form-item>
        <el-form-item label="巡检标准:">{{ info.standard }}</el-form-item>
        <el-form-item label="巡检人员:">{{ info.name }}</el-form-item>
        <div class="divider"><span>巡检路线</span></div>
        <div class="regions">
          <div class="region" v-for="     item      in      info.regions     " :key="item.regionId">{{
            item.region }}
            </el-col>
          </el-row>
          <el-row class="foot">
            <el-button size="mini" v-permission="'delete'" @click="deleteRow(index)">删除</el-button>
            <el-button size="mini" v-permission="'update'" @click="updateRow(index)">修改</el-button>
          </el-row>
          </div>
        </div>
    </div>
    <!-- dialog -->
    <el-dialog class="prop_dialog" v-if="isRenderDialog" :title="dialogTitle" :visible.sync="asyncVisible"
      @close="closeDialog">
      <el-form ref="ruleForm" class="rule_form" :model="ruleForm" :rules="rules" label-width="auto">
        <el-form-item label="拌合站屏:" prop="name">
          <el-select size="mini" v-model="ruleForm.name" :disabled="isUpdate" placeholder="请选择拌合站屏"
            @change="changeSelectForm($event)">
            <el-option v-for="item in selects.screenNames" :key="item.value" :label="item.label"
              :value="item.value"></el-option>
          </el-select>
        </el-form-item>
        <el-row :gutter="100">
          <el-col :class="'elCol elCol' + index" :span="12" v-for="(item, index) in ruleForm.infos" :key="index">
            <el-form-item label="屏幕编号:" :prop="`infos.${index}.num`">
              <el-input v-model="item.num" size="mini" disabled></el-input>
            </el-form-item>
            <el-form-item label="规格型号:" :prop="`infos.${index}.spec`">
              <el-input v-model="item.spec" size="mini" placeholder="请输入规格型号" clearable></el-input>
            </el-form-item>
            <el-form-item label="产地名称:" :prop="`infos.${index}.producer`">
              <el-input v-model="item.producer" size="mini" placeholder="请输入产地名称" clearable></el-input>
            </el-form-item>
            <el-form-item label="炉(批)号:" :prop="`infos.${index}.stove`">
              <el-input v-model="item.stove" size="mini" placeholder="请输入炉(批)号" clearable></el-input>
            </el-form-item>
            <el-form-item label="进场数量:" :prop="`infos.${index}.inNum`">
              <el-input v-model="item.inNum" size="mini" placeholder="请输入进场数量" clearable></el-input>
            </el-form-item>
            <el-form-item label="进场日期:" :prop="`infos.${index}.inDate`">
              <el-date-picker v-model="item.inDate" size="mini" value-format="yyyy-MM-dd" placeholder="请选择检验日期"
                clearable></el-date-picker>
            </el-form-item>
            <el-form-item label="检验日期:" :prop="`infos.${index}.inspectDate`">
              <el-date-picker v-model="item.inspectDate" size="mini" value-format="yyyy-MM-dd" placeholder="请选择检验日期"
                clearable></el-date-picker>
            </el-form-item>
            <el-form-item label="检验状态:" :prop="`infos.${index}.inspectState`">
              <el-select v-model="item.inspectState" size="mini" placeholder="请选择检验状态" clearable>
                <el-option v-for="item in ruleFormStatus" :key="item.value" :label="item.label"
                  :value="item.value"></el-option>
              </el-select>
            </el-form-item>
            <el-form-item label="报告编号:" :prop="`infos.${index}.reportNumber`">
              <el-input v-model="item.reportNumber" size="mini" placeholder="请输入报告编号" clearable></el-input>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <div slot="footer">
        <el-button @click="asyncVisible = false">取 消</el-button>
        <el-button class="submit_btn" @click="onSubmit('ruleForm')">提 交</el-button>
      </div>
    </el-dialog>
  </div>
@@ -64,75 +146,270 @@
      loading: false,
      isRenderDialog: false,
      asyncVisible: false,
      info: { // 详情信息
        task: '',
        standard: '',
        name: '',
        regions: [],
      submitMode: '', // add update
      dataLists: [],  // [[],[],[]]
      selects: {
        screenNames: [], // 拌合站屏
        screenNameIds: {}, // 拌合站屏id map
      }, // 下拉框状态选择汇总
      ruleForm: {
        name: '', // 下拉框屏名称
        mixingIds: '', // 修改id []
        infos: [{
          material: '', // 原料名称
          siloId: '', // 屏幕编号id
          num: '', // 屏幕编号
          spec: '',
          producer: '',
          stove: '',
          inNum: '',
          inDate: '',
          inspectDate: '',
          inspectState: '',
          reportNumber: '',
        }, {
          material: '',
          siloId: '', // 屏幕id
          num: '', // 屏幕编号
          spec: '',
          producer: '',
          stove: '',
          inNum: '',
          inDate: '',
          inspectDate: '',
          inspectState: '',
          reportNumber: '',
        }]
      },
      userId: '', // 存储点击后的用户id
      taskId: '', // 存储点击后的巡检任务id
      times: [], // 时间范围
      total: '',
      queryInfo: {
        pageNum: 1,
        pageSize: 10,
        inmode: '', // 录入方式
        screen: '', // 拌合站屏
        startTime: '',
        pageSize: 9999,
        stata: '', // 录入方式
        types: '', // 拌合站屏
        strTime: '',
        endTime: '',
      },
      regionInfos: { // 巡检路线详情
        isRenderDialog: false,
        asyncVisible: false,
        time: '', // 巡检时间
        region: '', // 巡检区域
        res: '', // 巡检结果
        img: '', // 上传的图片
        location: '', // 位置
      }
    }
  },
  computed: {
    dialogTitle() {
      return this.submitMode === 'update' ? '修改' : '添加'
    },
    isUpdate() {
      return this.submitMode === 'update'
    },
  },
  beforeCreate() {
    this.rules = {
      name: [{required: true, message: '请选择拌合站屏', trigger: 'change'}],
      infos: [{
        num: [{required: true, message: '请输入', trigger: 'blur'}],
        spec: [{required: true, message: '请输入', trigger: 'blur'}],
        producer: [{required: true, message: '请输入', trigger: 'blur'}],
        stove: [{required: true, message: '请输入', trigger: 'blur'}],
        inNum: [{required: true, message: '请输入', trigger: 'blur'}],
        inDate: [{required: true, message: '请输入', trigger: 'blur'}],
        inspectDate: [{required: true, message: '请输入', trigger: 'blur'}],
        inspectState: [{required: true, message: '请选择', trigger: 'blur'}],
        reportNumber: [{required: true, message: '请输入', trigger: 'blur'}],
      }, {
        spec: [{required: true, message: '请输入', trigger: 'blur'}],
        producer: [{required: true, message: '请输入', trigger: 'blur'}],
        stove: [{required: true, message: '请输入', trigger: 'blur'}],
        inNum: [{required: true, message: '请输入', trigger: 'blur'}],
        inDate: [{required: true, message: '请输入', trigger: 'blur'}],
        inspectDate: [{required: true, message: '请输入', trigger: 'blur'}],
        inspectState: [{required: true, message: '请选择', trigger: 'blur'}],
        reportNumber: [{required: true, message: '请输入', trigger: 'blur'}],
      }]
    }
    this.queryInfoInmodes = [
      {value: '0', label: '手动'},
      {value: '1', label: '自动'},
      {value: 1, label: '自动'},
      {value: 2, label: '手动'},
    ]
    this.queryInfoScreens = [
      {value: '0', label: '1-1'},
      {value: '1', label: '1-2'},
    this.queryInfoInmodeMap = {
      1: '自动',
      2: '手动',
    }
    this.ruleFormStatus = [
      {value: 1, label: '合格'},
      {value: 2, label: '不合格'},
      {value: 3, label: '待检测'},
    ]
    this.$http = this.$api.Safety.RiskGrad.polling
    this.ruleFormStatuMap = {
      1: '合格',
      2: '不合格',
      3: '待检测',
    }
    this.$http = this.$api.Materials.mixingSrcreen
  },
  created() {
    this.setTableColumn()
    this.getLists()
    this.getScreenNames()
  },
  methods: {
    // 获取table列表数据
    // 获取table列表数据 [types相同的放一个数组]
    getLists() {
      let params = this.queryInfo
      this.loading = true
      this.$http.taskcardGetlists(params).then(res => {
        if (res.statusMsg === 'ok') {
          console.log(res)
      this.$http.getLists(params).then(res => {
        if (res.statusMsg === 'ok' && res.data) {
          let tempMap = {}
          res.data.forEach(item => {
            if (!tempMap[item.types]) {
              tempMap[item.types] = []
            }
            tempMap[item.types].push({...item})
          })
          this.dataLists = Object.values(tempMap)
        }
        this.loading = false
      })
    },
    // 初始化 table 配置
    setTableColumn() {
    // 获取配比屏名称
    async getScreenNames() {
      const params = {pageNum: 1, pageSize: 9999}
      let {data} = await this.$http.getScreenNames(params)
      let tempIds = {}
      let tempTypes = {}
      data.forEach(item => {
        if (!tempIds[item.siloId]) {
          tempIds[item.siloId] = {...item}
        }
        if (!tempTypes[item.types]) {
          tempTypes[item.types] = []
        }
        tempTypes[item.types].push({...item})
      })
      let temps = []
      Object.values(tempTypes).forEach(list => {
        let value = ''
        let label = ''
        let type = ''
        list.forEach((item, index) => {
          value += item.siloId + ((index + 1) === list.length ? '' : ';')
          label += item.siloName + ((index + 1) === list.length ? '' : ';')
          type = item.types
        })
        temps.push({
          label: label,
          value: value,
          value2: type,
        })
      })
      this.selects.screenNames.push(...temps)
      this.selects.screenNameIds = tempIds
    },
    addRow() { },
    // 查询按钮列表信息
    queryReset() {
      this.queryInfo.pageNum = 1
      this.queryInfo.pageSize = 10
      this.getLists()
    },
    resetForm(formName) {
      this.$refs[formName].resetFields()
    },
    showDialog() {
      return new Promise(resolve => {
        if (!this.isRenderDialog) {
          this.isRenderDialog = true
        }
        this.asyncVisible = true
        this.$nextTick(() => {
          resolve()
        })
      })
    },
    closeDialog() {
      this.asyncVisible = false
      this.resetForm('ruleForm')
    },
    addRow() {
      this.submitMode = 'add'
      this.showDialog()
    },
    updateRow(i) {
      this.submitMode = 'update'
      this.showDialog().then(() => {
        let mixingIds = []
        let nameIds = ''
        this.dataLists[i].forEach((item, index) => {
          nameIds += item.siloId + ((index + 1) === this.dataLists[i].length ? '' : ';')
          mixingIds.push(item.siloId)
          this.ruleForm.infos[index] = Object.assign(this.ruleForm.infos[index], this.dataLists[i][index])
        })
        this.ruleForm.name = nameIds
        this.ruleForm.mixingIds = mixingIds
        this.changeSelectForm(nameIds)
      })
    },
    deleteRow(i) {
      this.$confirm("该操作将删除该信息,是否继续删除?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      }).then(() => {
        let mixingIds = []
        this.dataLists[i].forEach(item => {
          mixingIds.push(item.mixingId)
        })
        this.$http.delete({mixingIds: mixingIds}).then(res => {
          if (res.statusMsg === 'ok') {
            this.getLists()
            this.$message.success("删除成功!")
          } else {
            this.$message.warning(res.statusMsg)
          }
        })
      })
    },
    onSubmit(formName) {
      this.$refs[formName].validate((valid) => {
        if (!valid) return false
        const params = {mixingList: this.ruleForm.infos}
        if (this.isUpdate) {
          // 更新
          this.$http.update(params).then((res) => {
            if (res.statusMsg === 'ok') {
              this.closeDialog()
              this.getLists()
              this.$message.success('更新成功!')
            } else {
              this.$message.warning(res.statusMsg)
            }
          })
        } else {
          // 添加
          this.$http.insert(params).then((res) => {
            if (res.statusMsg === 'ok') {
              this.closeDialog()
              this.getLists()
              this.$message.success('添加成功!')
            } else {
              this.$message.warning(res.statusMsg)
            }
          })
        }
      })
    },
    changeSelectForm(value) {
      let ids = value && value.split(';')
      ids.forEach((item, index) => {
        this.ruleForm.infos[index].siloId = item
        this.ruleForm.infos[index].material = this.selects.screenNameIds[item].siloName
        this.ruleForm.infos[index].num = this.selects.screenNameIds[item].types
      })
    },
    changeTime(times) {
      times = times || ['', '']
      this.queryInfo.startTime = times[0]
      this.queryInfo.strTime = times[0]
      this.queryInfo.endTime = times[1]
    },
  }
@@ -142,61 +419,108 @@
<style lang="scss" scoped>
@import '@/style/layout-main.scss';
.rule_form {
  color: #fff;
  ::v-deep .el-form-item__content {
    display: block;
.main_content_wrap {
  height: 100%;
  overflow: auto;
  }
  .image {
    flex: none;
    width: 91px;
    height: 120px;
    margin-right: 15px;
    border-radius: 5px;
    border: 1px solid #0c5983;
    img {
      width: 100%;
    }
  }
}
.regions {
  text-align: center;
  .region {
    line-height: 34px;
    margin-bottom: 16px;
    background: rgba(56, 175, 247, .25);
    cursor: pointer;
  }
}
.divider {
  position: relative;
  margin-bottom: 30px;
  text-indent: 10px;
  color: #fff;
  border-left: 3px solid #18F6F8;
  &::after {
    content: "";
    position: absolute;
    left: 0;
    bottom: -8px;
    width: 100%;
    padding: 20px 0;
    border-bottom: 1px solid #0C4D6F;
  }
}
.main_content .main_content_item {
.main_content_item {
  overflow: hidden;
  float: left;
  width: 48%;
  height: 200px;
  margin: 1%;
  border: 1px solid red;
  font-size: 15px;
  color: #ddd;
  border: 1px solid #39B5FE;
  border-radius: 5px;
  .el-row {
    border: 1px solid #39B5FE;
    margin: -1px;
    .el-col {
      height: 100%;
      margin: 0 0 0 -1px;
      border-left: 1px solid #39B5FE;
    }
  }
  .head {
    height: 40px;
    margin: -1px;
    line-height: 40px;
    text-indent: 30px;
    background: rgba(30, 95, 147, .6);
    border: 1px solid #39B5FE;
    .left_title {
      float: left;
    }
    .right_title {
      float: right;
      margin-right: 10px;
    }
  }
  .list {
    padding: 0 10px 20px 10px;
    .item {
      display: flex;
      flex: 1;
      margin-top: 20px;
      .name {
        margin-right: 8px;
        text-indent: 6px;
        white-space: nowrap;
      }
      .value {
        color: #39B5FE;
        &.style1 {
          font-size: 20px;
          line-height: 20px;
          color: #16F849;
        }
        &.style2 {
          font-size: 20px;
          line-height: 20px;
          color: red;
        }
        &.style3 {
          font-size: 20px;
          line-height: 20px;
          color: #FF6600;
        }
      }
    }
  }
  .foot {
    height: 40px;
    line-height: 40px;
    text-align: center;
    .el-button {
      padding: 6px 20px
    }
  }
}
.rule_form {
  overflow-x: hidden;
  .elCol0 {
    border-right: 1px solid #39B5FE;
  }
}
</style>