张晓波
2023-12-11 0d0968ec2d1a39c21e15e447c4f2227f70d6a11b
Merge branch 'master' of http://111.30.93.211:10101/r/supipe
已修改21个文件
已添加1个文件
594 ■■■■ 文件已修改
hd/pipe/materialsManage/src/main/java/com/thhy/materials/modules/biz/concret/entity/dto/PieceDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hd/pipe/materialsManage/src/main/java/com/thhy/materials/modules/biz/concret/mapper/TMaterialReleaseMappper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hd/pipe/materialsManage/src/main/java/com/thhy/materials/modules/biz/concret/service/impl/TMaterialReleaseServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hd/pipe/materialsManage/src/main/resources/mapping/SysSteelRecordMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hd/pipe/materialsManage/src/main/resources/mapping/TMaterialReleaseMapper.xml 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/api/modules/safety.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/assets/mixing/container_10.png 补丁 | 查看 | 原始文档 | blame | 历史
web/src/assets/mixing/container_100.png 补丁 | 查看 | 原始文档 | blame | 历史
web/src/assets/mixing/container_20.png 补丁 | 查看 | 原始文档 | blame | 历史
web/src/assets/mixing/container_40.png 补丁 | 查看 | 原始文档 | blame | 历史
web/src/assets/mixing/container_60.png 补丁 | 查看 | 原始文档 | blame | 历史
web/src/assets/mixing/container_80.png 补丁 | 查看 | 原始文档 | blame | 历史
web/src/assets/mixing/container_90.png 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/GoodManage/MixRatioScreen.vue 55 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/GoodManage/MixingScreen.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/GoodManage/components/MixingExpend.vue 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/MixingInfo/messageInfo.vue 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/MixingInfo/mixing.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/SecureManage/BroadcastSystem.vue 351 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/SecureManage/RiskGrad/AreaPolling.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/SecureManage/RiskGrad/components/PollingTask.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/SecureManage/RiskGrad/components/TaskPunchcard.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hd/pipe/materialsManage/src/main/java/com/thhy/materials/modules/biz/concret/entity/dto/PieceDto.java
@@ -11,6 +11,9 @@
    private Integer byId;
    private String bldTim;
    private Integer types;
    private List<TRawMaterial> rawMaterials;
hd/pipe/materialsManage/src/main/java/com/thhy/materials/modules/biz/concret/mapper/TMaterialReleaseMappper.java
@@ -26,7 +26,7 @@
    List<PieceDto> pieceList(HashMap<String, Object> values);
    List<TRawMaterial> materialRew(Integer byId);
    List<TRawMaterial> materialRew(@Param("byId") Integer byId,@Param("types")Integer types);
    void mixingInsert(@Idkey("mixingId") Map<String,Object> mixing);
hd/pipe/materialsManage/src/main/java/com/thhy/materials/modules/biz/concret/service/impl/TMaterialReleaseServiceImpl.java
@@ -214,7 +214,7 @@
        PageHelper.startPage(pageNum,pageSize);
        List<PieceDto> pieceDtos =  materialReleaseMappper.pieceList(values);
        for (PieceDto pieceDto : pieceDtos){
            List<TRawMaterial> rawMaterials = materialReleaseMappper.materialRew(pieceDto.getById());
            List<TRawMaterial> rawMaterials = materialReleaseMappper.materialRew(pieceDto.getById(),pieceDto.getTypes());
            pieceDto.setRawMaterials(rawMaterials);
        }
        PageInfo<PieceDto> pieceDtoPageInfo = new PageInfo<>(pieceDtos);
hd/pipe/materialsManage/src/main/resources/mapping/SysSteelRecordMapper.xml
@@ -190,7 +190,7 @@
        where  ssr.is_use=1
          and ssr.stock_type=2
            and ss.company_id=#{companyId}
        order by ssr.create_time desc
        order by ssr.create_time desc limit 0,10
  </select>
  <select id="recordInfo" parameterType="java.lang.String" resultType="com.thhy.materials.modules.biz.concret.entity.SysSteelRecord">
        select
hd/pipe/materialsManage/src/main/resources/mapping/TMaterialReleaseMapper.xml
@@ -147,10 +147,16 @@
    where material_release_id=#{materialReleaseId}
  </update>
  <select id="pieceList" resultType="com.thhy.materials.modules.biz.concret.entity.dto.PieceDto">
    select by_id as byId from  t_piece
    select by_id as byId,
      BldTim as bldTim,
      types as types
     from  t_piece
    where 1=1
    <if test="byId!=null and byId!='' ">
      and by_id=#{byId}
    </if>
    <if test="types!=null and types!=''">
        and types=#{types}
    </if>
    ORDER BY  by_id desc
  </select>
@@ -161,7 +167,7 @@
    PlanAmnt as planamnt,
    FactAmnt as factamnt
     from  t_raw_material
    where  Piece=#{byId}
    where  Piece=#{byId} and types=#{types}
  </select>
  <insert id="mixingInsert" >
    insert into t_mixing
@@ -433,7 +439,7 @@
  <select id="mixingConsumes" resultType="com.thhy.materials.modules.biz.concret.entity.TMixingConsume">
    select
    mc.mixing_consume_id as mixingConsumeId,
    sd.dict_name as dictName,
    -- sd.dict_name as dictName,
    mc.dict_id as dictId,
    mc.spec as spec,
    mc.manufacturer as manufacturer,
@@ -447,7 +453,7 @@
    mc.create_time as createTime,
    mc.construction_unit as constructionUnit
     from t_mixing_consume mc
     left join  sys_dict sd on mc.dict_id=sd.dict_id
    -- left join  sys_dict sd on mc.dict_id=sd.dict_id
     where mc.mixing_signboard_id=#{mixingSignboardId} and mc.star=#{star}
<!--     <if test="strTime!=null and strTime!='' and endTime !=null and endTime!=''">-->
<!--         and mc.create_time between #{strTime} and #{endTime}-->
web/src/api/modules/safety.js
@@ -362,4 +362,21 @@
        responseType: 'blob',
        data: params
    }),
  /**
   * 广播文件上传模块
   */
  //查询广播文件列表
    searchBoardLists: (params) =>
    axios.post('/secure/integralAccount/selectSafeIntegralPageList', params),
  //查询所有区域
  getAreaLists: (params) =>
    axios.post('/screen/audio/groups', params),
  //上传文件添加/修改
  addAreaInfos: (params) =>
    axios.post('/screen/audio/addFile', params),
  //上传文件详情
  detailsAreaInfos: (params) =>
    axios.post('/screen/audio/groupInfo', params),
}
web/src/assets/mixing/container_10.png

web/src/assets/mixing/container_100.png

web/src/assets/mixing/container_20.png

web/src/assets/mixing/container_40.png

web/src/assets/mixing/container_60.png

web/src/assets/mixing/container_80.png

web/src/assets/mixing/container_90.png

web/src/views/GoodManage/MixRatioScreen.vue
@@ -78,8 +78,8 @@
    <el-dialog class="prop_dialog" width="80%" v-if="isRenderDialog" :title="dialogTitle" :visible.sync="asyncVisible"
      @close="closeDialog">
      <el-form ref="ruleForm" class="rule_form" :model="ruleForm" :rules="rules">
        <el-form-item label="拌合站屏:" prop="mixingSignboardId">
          <el-select size="mini" v-model="ruleForm.mixingSignboardId" :disabled="isUpdate" placeholder="请选择拌合站屏"
        <el-form-item label="拌和站屏:" prop="mixingSignboardId">
          <el-select size="mini" v-model="ruleForm.mixingSignboardId" :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>
@@ -110,10 +110,11 @@
        <div style="display: flex;">
          <div style="margin-right: 10px;" v-for="(item, index) in  ruleForm.infos " :key="index">
            <el-form-item :label="index === 0 ? '材料名称' : ''" :prop="`infos.${index}.dictId`">
              <el-select v-model="item.dictId" size="mini" placeholder="请选择材料名称">
              <!-- <el-select v-model="item.dictId" size="mini" placeholder="请选择材料名称">
                <el-option v-for="item in selects.materials" :key="item.value" :label="item.label"
                  :value="item.value"></el-option>
              </el-select>
              </el-select> -->
              <el-input v-model="item.dictId" size="mini" placeholder="请输入" clearable></el-input>
            </el-form-item>
            <el-form-item :label="index === 0 ? '规格型号' : ''" :prop="`infos.${index}.spec`">
              <el-input v-model="item.spec" size="mini" placeholder="请输入" clearable></el-input>
@@ -153,7 +154,7 @@
      times: [], // 时间范围
      selects: {
        screenNames: [], // 配合比屏
        materials: [] // 材料名称
        // materials: [] // 材料名称[先改成输入,,字典表材料不匹配]
      }, // 下拉框状态选择汇总
      tableData: [{
        inType: '', // 录入方式
@@ -166,7 +167,7 @@
        construction: '',  // 施工部位
        mixingConsumeId: '', // 每个材料id
        dataLists: [
          {name: '材料名称', type: 'dictName', value: []}, // 材料名称
          {name: '材料名称', type: 'dictId', value: []}, // 材料名称
          {name: '规格型号', type: 'spec', value: []}, // 规格型号
          {name: '生产厂家', type: 'manufacturer', value: []}, // 生产厂家
          {name: '材料含水率(%)', type: 'watFull', value: []}, // 含水率
@@ -177,7 +178,7 @@
      }],
      ruleForm: {
        mixingSignboardId: '', // 屏名称id
        proName: '', // 工程名称 [拌合站屏下拉框联动]
        proName: '', // 工程名称 [拌和站屏下拉框联动]
        constructionUnit: '', // 施工单位
        saveStamp: '',  // 施工日期
        construction: '',  // 施工部位
@@ -194,7 +195,7 @@
        pageNum: 1,
        pageSize: 9999,
        // stata: '', // 录入方式
        mixingSignboardId: '', // 拌合站屏名称
        mixingSignboardId: '', // 拌和站屏名称
        strTime: '',
        endTime: '',
      },
@@ -220,7 +221,7 @@
      2: '手动',
    }
    this.rules = {
      mixingSignboardId: [{required: true, message: '请选择拌合站屏', trigger: 'change'}],
      mixingSignboardId: [{required: true, message: '请选择拌和站屏', trigger: 'change'}],
      proName: [{required: true, message: '请输入工程名称', trigger: 'change'}],
      constructionUnit: [{required: true, message: '请输入工程名称', trigger: 'blur'}],
      saveStamp: [{required: true, message: '请输入施工日期', trigger: 'blur'}],
@@ -252,7 +253,7 @@
          construction: '',  // 施工部位
          mixingConsumeId: '', // 每个材料id
          dataLists: [
            {name: '材料名称', type: 'dictName', value: []}, // 材料名称
            {name: '材料名称', type: 'dictId', value: []}, // 材料名称
            {name: '规格型号', type: 'spec', value: []}, // 规格型号
            {name: '生产厂家', type: 'manufacturer', value: []}, // 生产厂家
            {name: '材料含水率(%)', type: 'watFull', value: []}, // 含水率
@@ -307,18 +308,18 @@
      })
    },
    //获取字典表材料名称
    async getDicFilteredData() {
      let params = {pageNum: 1, pageSize: 100000000}
      let {data} = await this.$api.Dictionary.searchDictionary(params)
      data.list.forEach(item => {
        if (item.dictType === 'pipe_materials') {
          this.selects.materials.push({
            label: item.dictName,
            value: item.dictId,
          })
        }
      })
    },
    // async getDicFilteredData() {
    //   let params = {pageNum: 1, pageSize: 100000000}
    //   let {data} = await this.$api.Dictionary.searchDictionary(params)
    //   data.list.forEach(item => {
    //     if (item.dictType === 'pipe_materials') {
    //       this.selects.materials.push({
    //         label: item.dictName,
    //         value: item.dictId,
    //       })
    //     }
    //   })
    // },
    // 获取配比屏名称
    async getScreenNames() {
      const params = {pageNum: 1, pageSize: 9999}
@@ -351,9 +352,9 @@
        if (!this.isRenderDialog) {
          this.isRenderDialog = true
        }
        if (!this.selects.materials.length) {
          await this.getDicFilteredData()
        }
        // if (!this.selects.materials.length) {
        //   await this.getDicFilteredData()
        // }
        this.asyncVisible = true
        this.$nextTick(() => {
          resolve()
@@ -372,7 +373,6 @@
      this.submitMode = 'update'
      this.showDialog().then(() => {
        const {mixingSignboardId, proName, constructionUnit, saveStamp, construction, dataListFlat} = this.tableData[i]
        console.log(constructionUnit)
        this.ruleForm = Object.assign(this.ruleForm, {
          mixingSignboardId,
          proName,
@@ -543,8 +543,11 @@
          justify-content: center;
          align-items: center;
          flex: 1;
          padding: 0 4px;
          line-height: 24px;
          margin: -1px -1px -1px 0;
          border: 1px solid #01B3EF;
          word-break: break-all;
        }
      }
    }
web/src/views/GoodManage/MixingScreen.vue
@@ -1,4 +1,4 @@
<!-- 物资管理 ==> 拌合站屏管理-->
<!-- 物资管理 ==> 拌和站屏管理-->
<template>
  <div class="main">
    <div class="main_header">
@@ -87,8 +87,8 @@
    <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="请选择拌合站屏"
        <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>
@@ -149,8 +149,8 @@
      submitMode: '', // add update
      dataLists: [],  // [[],[],[]]
      selects: {
        screenNames: [], // 拌合站屏
        screenNameIds: {}, // 拌合站屏id map
        screenNames: [], // 拌和站屏
        screenNameIds: {}, // 拌和站屏id map
      }, // 下拉框状态选择汇总
      ruleForm: {
        name: '', // 下拉框屏名称
@@ -187,7 +187,7 @@
        pageNum: 1,
        pageSize: 9999,
        stata: '', // 录入方式
        types: '', // 拌合站屏
        types: '', // 拌和站屏
        strTime: '',
        endTime: '',
      },
@@ -203,7 +203,7 @@
  },
  beforeCreate() {
    this.rules = {
      name: [{required: true, message: '请选择拌合站屏', trigger: 'change'}],
      name: [{required: true, message: '请选择拌和站屏', trigger: 'change'}],
      infos: [{
        num: [{required: true, message: '请输入', trigger: 'blur'}],
        spec: [{required: true, message: '请输入', trigger: 'blur'}],
web/src/views/GoodManage/components/MixingExpend.vue
@@ -15,6 +15,14 @@
            <div class="content_tables_headers">
                <div class="tables_headers_title">盘次:</div>
                <div class="tables_headers_datas">{{item.byId}}</div>
              <div style="display: flex; margin-left: 30px">
                  <div class="tables_headers_title">搅拌时间:</div>
                  <div class="tables_headers_datas">{{item.bldTim}}</div>
              </div>
              <div style="display: flex; margin-left: 30px">
                  <div class="tables_headers_title">搅拌站:</div>
                  <div class="tables_headers_datas">{{item.types == 1 ? '二号' : '一号'}}</div>
                </div>
            </div>
            <div class="content_tables_alone">
                <el-table
@@ -119,7 +127,16 @@
        this.$api.Materials.mixingExpendLists(params).then((res) => {
          if(res.statusMsg === 'ok') {
            this.total = res.data.total;
            this.tablesList = res.data.list;
            this.tablesList = res.data.list.map(item => {
              let dataTime = item.bldTim.split(',');
              dataTime = dataTime.map(time => {
                time = time.substring(0, 19);
                return time;
              })
              item.bldTim = dataTime.join();
              // item.bldTim
              return item;
            });
          }
          this.loading = false;
        })
web/src/views/MixingInfo/messageInfo.vue
@@ -1,39 +1,47 @@
<template>
    <div class="mixing_index">
        <div class="mixing_header">
            <span>中铁十四局通甬站前I标管片场拌合站</span>
            <span>中铁十四局通甬站前I标管片场拌和站</span>
        </div>
        <div class="mixing_main">
            <div class="mixing_left">
                <div class="mixing_left_num">
                    <div class="">{{mixingList&&mixingList.tableNum}}</div>
                    <div class="">{{ mixingList.tableNum }}</div>
                </div>
                <div class="mixing_left_name">{{mixingList&&mixingList.materialName}}</div>
                <div class="mixing_left_name">{{ mixingList.materialName || '' }}</div>
            </div>
            <div class="mixing_right">
                <div class="mixing_rows">
                    <div class="mixing_rows_titles">产地名称:</div>
                    <div class="mixing_rows_datas">{{mixingList&&mixingList.nameOfOrigin}}</div>
                    <div class="mixing_rows_datas">{{ mixingList.nameOfOrigin || '' }}</div>
                </div>
                <div class="mixing_rows">
                    <div class="mixing_rows_titles">进场数量:</div>
                    <div class="mixing_rows_datas">{{mixingList&&mixingList.incomingQuantity}} t</div>
                    <div class="mixing_rows_datas">{{ mixingList.incomingQuantity || '' }} t</div>
                </div>
                <div class="mixing_rows">
                    <div class="mixing_rows_titles">进场日期:</div>
                    <div class="mixing_rows_datas">{{mixingList&&mixingList.inTime}}</div>
                    <div class="mixing_rows_datas">{{ mixingList.inTime || '' }}</div>
                </div>
                <div class="mixing_rows">
                    <div class="mixing_rows_titles">检验日期:</div>
                    <div class="mixing_rows_datas">{{mixingList&&mixingList.inspectionDate}}</div>
                    <div class="mixing_rows_datas">{{ mixingList.inspectionDate || '' }}</div>
                </div>
                <div class="mixing_rows">
                    <div class="mixing_rows_titles">检验状态:</div>
                    <div class="mixing_rows_datas"  :class="{'standardStyle':mixingList.status===1,'notStandardStyle':mixingList.status!==1}">{{mixingList&&mixingList.status===1?'合格':mixingList&&mixingList.status===2?'待检':''}}</div>
                    <div class="mixing_rows_datas"
                        :class="{ 'standardStyle': mixingList.status === 1, 'notStandardStyle': mixingList.status !== 1 }">
                        {{ mixingList.status === 1 ? '合格' : mixingList.status === 2 ? '待检' : ''
                        }}</div>
                </div>
                <div class="mixing_rows">
                    <div class="mixing_rows_titles">报告编号:</div>
                    <div class="mixing_rows_datas">{{mixingList&&mixingList.reportNumber}}</div>
                    <div class="mixing_rows_datas small_size">
                        {{
                            mixingList.reportNumber &&
                            mixingList.reportNumber.replace(/\s/g, '\n')
                        }}
                    </div>
                </div>
            </div>
        </div>
@@ -44,7 +52,7 @@
    data(){
        return{
            timer:null,//定时器
            mixingList:null,//展示数据
            mixingList: {},//展示数据
        }
    },
    created(){
@@ -77,8 +85,8 @@
                tableNum:window.location.href.split('/')[5].split('=')[1]
            }
            this.$api.Infos.showHmixings(params).then(res=>{
                if(res.statusMsg==='ok'){
                    this.mixingList = res.data===null?[]:res.data
                if (res.statusMsg === 'ok' && res.data) {
                    this.mixingList = res.data
                }else{
                    this.$message.warning('请检查网络或联系管理员!!!')
                }
@@ -93,7 +101,7 @@
    flex-direction: column;
    width: 100%;
    height: 100%;
    padding: 5px;
    padding: 0.4rem;
    background: url("../../assets/mixing/mixing_bg3.png") no-repeat;
    background-size: 100% 100%;
    background-position: center center;
@@ -101,9 +109,8 @@
    .mixing_header{
        width: 100%;
        height: 3.2rem;
        height: 9rem;
        position: relative;
        padding: 4rem;
        display: flex;
        justify-content: center;
        align-items: center;
@@ -125,14 +132,14 @@
        flex: 1;
        width: 100%;
        height: 100%;
        padding: 6rem;
        padding: 3rem 4rem 5rem 4rem;
        display: flex;
        .mixing_left{
            display: flex;
            flex-direction: column;
            width: 45%;
            margin-right: 15px;
            flex: 1;
            margin-right: 3rem;
            display: flex;
            flex-direction: column;
            align-items: center;
@@ -146,6 +153,7 @@
                width: 100%;
                background: url("../../assets/mixing/mixing_left_bg.png") no-repeat;
                background-size: 100% 100%;
                >div{
                    display: flex;
                    justify-content: center;
@@ -158,6 +166,7 @@
                    background-color: rgba(37, 129, 255, 0.29);
                }
            }
            .mixing_left_name{
                flex: 1;
                width: 100%;
@@ -168,38 +177,49 @@
                background: linear-gradient(to bottom,#FFFFFF 0%,rgba(140, 186, 255, 0.88) 100%);
                background-clip: text;
                -webkit-background-clip: text;
                text-fill-color: transparent;
                -webkit-text-fill-color: transparent;
                color: #FFFFFF;
                font-size: 9rem;
                font-weight: 500;
            }
        }
        .mixing_right{
            width: calc(55% - 100px);
            flex: 1.2;
            background: linear-gradient(to right,#0D3776 0%,#041A40 100%);
            display: flex;
            flex-direction: column;
            justify-content: space-between;
            justify-content: space-around;
            padding: 2rem 4rem;
            .mixing_rows{
                padding: 10px 20px;
                overflow: hidden;
                display: flex;
                .mixing_rows_titles{
                    flex: none;
                    color: #FFFFFF;
                    font-weight: 400;
                    font-size: 5rem;
                }
                .mixing_rows_datas{
                    flex: none;
                    overflow: hidden;
                    flex: 1;
                    color: #FFFFFF;
                    font-weight: 400;
                    font-size: 5rem;
                    white-space: pre-wrap;
                    &.small_size {
                        font-size: 4.3rem;
                }
                }
                .standardStyle{
                    color:#15EF48;
                    font-size:8rem;
                }
                .notStandardStyle{
                    color:rgba(255, 102, 0, 1);
                    font-size:8rem;
web/src/views/MixingInfo/mixing.vue
@@ -263,7 +263,7 @@
                > p {
                    position: absolute;
                    left: 50%;
                    top: 18%;
                    top: 9%;
                    font-size: 0.7rem;
                    white-space: nowrap;
                    transform: translate(-50%, -50%);
web/src/views/SecureManage/BroadcastSystem.vue
对比新文件
@@ -0,0 +1,351 @@
<template>
  <div class="main">
    <div class="main_header">
      <div class="header_item">
        <span class="header_label">区域名称:</span>
        <el-select v-model="search.groupId" placeholder="请选择区域名称" clearable>
            <el-option
            v-for="item in optionAreaList"
            :key="item.id"
            :label="item.groupName"
            :value="item.id">
            </el-option>
        </el-select>
      </div>
      <div class="header_item">
        <el-button  icon="el-icon-search" v-if="showButton('search')" @click="searchButtonInfo(true)">查询</el-button>
        <!-- <el-button class="search_btn" icon="el-icon-plus" v-if="showButton('insert')" @click="insertProp">新增</el-button> -->
      </div>
    </div>
    <div class="main_content">
      <el-table
        v-loading="loading"
        :data="dataList"
        height="100%">
        <el-table-column align="center" label="序号" width="60">
          <template #default="scope">
            <span>{{(pageNum - 1) * pageSize + scope.$index + 1}}</span>
          </template>
        </el-table-column>
        <el-table-column prop="groupName" label="区域名称" align="center"></el-table-column>
        <!-- <el-table-column prop="dictName" label="上传文件" align="center"></el-table-column> -->
        <el-table-column label="操作" align="center" width="200">
          <template #default="{ row }">
            <el-button class="table_btn" size="mini" v-if="showButton('update')" @click="updateProp(row)">修改</el-button>
            <!-- <el-button class="delete_btn" size="mini" v-if="showButton('delete')" @click="deleteInfo(row)">删除</el-button> -->
          </template>
        </el-table-column>
      </el-table>
    </div>
    <!-- <div class="main_footer">
      <el-pagination
        background
        @current-change="changePageNum"
        @size-change="changePageSize"
        :current-page="pageNum"
        :page-sizes="[10, 20, 50, 100]"
        :page-size="pageSize"
        layout="total, sizes, prev, pager, next, jumper"
        :total="total">
      </el-pagination>
    </div> -->
    <el-dialog
      class="prop_dialog"
      :title="asyncTitle ? '新增' : '修改'"
      :close-on-click-modal="false"
      :visible.sync="asyncVisible"
      width="55%">
      <el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="auto" class="rule_form">
        <el-form-item label="区域名称:" prop="groupId">
          <el-select v-model="ruleForm.groupId" placeholder="请选择区域名称">
                <el-option
                v-for="item in optionAreaList"
                :key="item.id"
                :label="item.groupName"
                :value="item.id">
                </el-option>
            </el-select>
        </el-form-item>
        <el-form-item label="上传文件:" >
            <div class="upload_index">
                <div class="upload_text">
                    <el-upload
                        class="upload-demo"
                        action=""
                        :multiple="false"
                        :http-request="httpRequest"
                        :show-file-list="false"
                        :file-list="fileList">
                        <el-button type="text" :size="size">上传文件</el-button>
                    </el-upload>
                </div>
                <div class="upload_tables">
                    <el-table
                        v-loading="loadingUpload"
                        :data="fileList"
                        height="100%">
                        <el-table-column prop="name" label="文件" align="center"></el-table-column>
                        <el-table-column label="操作" align="center">
                            <template #default="{ row }">
                                <el-button class="delete_btn" size="mini" v-if="showButton('delete')" @click="deleteFiles(row)">删除</el-button>
                            </template>
                        </el-table-column>
                        <el-table-column label="是否默认播放" align="center">
                            <template #default="{ row }">
                                <el-radio v-model="row.defaults" :label="1">是</el-radio>
                                <el-radio v-model="row.defaults" :label="2">否</el-radio>
                            </template>
                        </el-table-column>
                    </el-table>
                </div>
            </div>
        </el-form-item>
      </el-form>
      <div slot="footer">
        <el-button @click="asyncVisible = false">取 消</el-button>
        <el-button class="submit_btn" @click="asyncTitle ? submitInsert() : submitUpdate()">提 交</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import { buttonPinia } from '../../pinia/index';
import { throttle, changeSize } from '../../plugins/public'; // 导入节流、动态切换组件尺寸方法
  export default {
    data() {
      return {
        size: changeSize(), // 组件尺寸
        pageNum: 1,
        pageSize: 10,
        search:{},//查询条件
        total: 0,
        loading: false,
        loadingUpload:false,
        dataList: [], //广播文件上传信息列表
        asyncTitle: true, // 对话框title 新增:true  修改:false
        asyncVisible: false, // 添加 修改对话框
        ruleForm: {
        }, // 按钮表单
        rules: {
          groupId: [{
            required: true,
            message: '请选择区域',
            trigger: 'blur'
          }],
        },
        optionAreaList:[],//所有区域
        fileList:[
        ],//上传文件
      }
    },
    watch: {
      asyncVisible(bol) {
        if(!bol) {
          this.ruleForm = {};
          this.$refs.ruleForm.resetFields();
        }
      }
    },
    mounted() {
      const that = this;
      // 根据窗口大小动态修改组件尺寸
      window.onresize = () => {
        that.size = changeSize();
      }
      that.searchButtonInfo(true);
      that.getAllTypes()
    },
    methods: {
    //获取所有区域
      getAllTypes(){
        let params = {
        }
        this.$api.Safety.getAreaLists(params).then(res=>{
            if(res.statusMsg === 'ok'){
                this.optionAreaList = res.data
            }else{
                this.$message.warning(res.statusMsg)
            }
        })
      },
      //删除上传的文件
      deleteFiles(row){
        this.fileList.splice(this.fileList.findIndex(item => item.ids == row.ids),1);
        this.$message.success("删除成功!")
      },
      // 自定义上传事件
      httpRequest({file}) {
        this.functionLoading();
        this.loadingUpload = true
        if(file.type !=="video/mp4"){
            this.$message.warning("请上传MP4格式的文件!!!")
            this.loadingView.close();
            return false
        }
        const formData = new FormData();
        formData.set('file', file);
        this.$api.System.uploadFileRequest(formData).then((res) => {
            if(res.success) {
                this.$message.success('上传成功!');
                this.$nextTick(() => {
                    this.fileList.push({
                        ids: this.fileList.length + 1,
                        name:file.name,
                        defaults:2,
                        audioFile:res.data
                    })
                })
            } else {
                this.$message.warning(res.statusMsg);
            }
            this.loadingUpload = false
            this.loadingView.close();
        }).catch(() => {
            this.loadingUpload = false
            this.loadingView.close();
            this.$message.error('请检查网络连接后重新上传!');
        })
      },
      // 等待方法
      functionLoading() {
        this.loadingView = this.$loading({
          lock: true,
          text: '请稍后...',
          spinner: 'el-icon-loading',
          background: 'rgba(0, 0, 0, 0.7)'
        });
      },
      // 查询按钮列表信息
      searchButtonInfo(bol) {
        if(bol) {
          this.pageNum = 1;
        }
        let params = Object.assign({},this.search,{
        //   pageNum: this.pageNum,
        //   pageSize: this.pageSize
        })
        this.loading = true;
        this.$api.Safety.getAreaLists(params).then((res) => {
          if(res.statusMsg === 'ok') {
            // this.total = res.data.total;
            this.dataList = res.data;
          }
          this.loading = false;
        })
      },
      // 新增按钮信息
      insertProp() {
        this.asyncTitle = true;
        this.asyncVisible = true;
      },
      // 修改按钮信息
      updateProp(row) {
        this.asyncTitle = false;
        this.asyncVisible = true;
        this.$api.Safety.detailsAreaInfos({groupId: row.id}).then(res=>{
            if(res.statusMsg === 'ok'){
                this.$set(this.ruleForm,'groupId',res.data.id)
                this.fileList = res.data.fileList
                let projectArr = []
                res.data.supplierPros.forEach(item=>{
                    projectArr.push(item.proId)
                })
                this.$set(this.ruleForm,'proIds',projectArr)
            }else{
                this.$message.warning(res.statusMsg)
            }
        })
      },
      // 删除按钮信息
      deleteInfo(row) {
        this.$confirm("该操作将删除该信息,是否继续删除?", "提示", {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning"
       })
       .then(() => {
         this.$api.Safety.deleteSupplier({supplierId: row.id})
        .then(res => {
          if(res.statusMsg === 'ok') {
            this.searchButtonInfo(true);
            this.$message.success("删除成功!");
          } else {
            this.$message.warning(res.statusMsg);
          }
        })
       })
       .catch(() => {
         this.$message.warning("您已取消");
       })
      },
      // 提交添加按钮信息
      submitInsert: throttle(function() {
        this.$refs.ruleForm.validate((valid) => {
          if(valid) {
            const params = Object.assign({}, this.ruleForm);
            params.fileList = this.fileList
            this.$api.Safety.addAreaInfos(params).then((res) => {
              if(res.statusMsg === 'ok') {
                this.asyncVisible = false;
                this.searchButtonInfo(true);
                this.$message.success('添加成功!');
              } else {
                this.$message.warning(res.statusMsg);
              }
            })
          }
        })
      }, 3000),
      // 提交修改按钮信息
      submitUpdate: throttle(function() {
        this.$refs.ruleForm.validate((valid) => {
          if(valid) {
            const params = Object.assign({}, this.ruleForm);
            params.fileList = this.fileList
            this.$api.Safety.addAreaInfos(params).then((res) => {
              if(res.statusMsg === 'ok') {
                this.asyncVisible = false;
                this.searchButtonInfo(true);
                this.$message.success('修改成功!');
              } else {
                this.$message.warning(res.statusMsg);
              }
            })
          }
        })
      }, 3000),
      // 判断按钮权限信息
      showButton(str) {
        const pinia = buttonPinia();
        return pinia.$state.buttonInfo.includes(str);
      },
      // 切换页数
      changePageNum(page) {
        this.pageNum = page;
        this.searchButtonInfo();
      },
      // 切换每页条数
      changePageSize(size) {
        this.pageSize = size;
        this.searchButtonInfo();
      }
    }
  }
</script>
<style lang="scss" scoped>
@import '../../style/layout-main.scss';
.upload_index{
    width: 100%;
    display: flex;
    flex-direction: column;
    .upload_text{
        display: flex;
        justify-content: flex-end;
    }
    .upload_tables{
        height: 200px;
    }
}
</style>
web/src/views/SecureManage/RiskGrad/AreaPolling.vue
@@ -7,7 +7,9 @@
                <el-tab-pane label="任务打卡" name="second"></el-tab-pane>
            </el-tabs>
        </div>
        <div class="content">
        <component :is="cpns[activeName]"></component>
        </div>
    </div>
</template>
<script>
@@ -32,4 +34,13 @@
<style lang="scss" scoped>
@import '@/style/layout-main.scss';
.main {
    display: flex;
    .content {
        overflow: hidden;
        flex: 1;
    }
}
</style>
web/src/views/SecureManage/RiskGrad/components/PollingTask.vue
@@ -1,6 +1,6 @@
<!-- 安全管理 ==> 风险分级管控 => 区域巡检(巡检任务)-->
<template>
    <div>
    <div class="wrap">
        <div class="main_header">
            <div class="header_item">
                <span class="header_label">巡检任务:</span>
@@ -385,6 +385,17 @@
<style lang="scss" scoped>
@import '@/style/layout-main.scss';
.wrap {
    display: flex;
    flex-direction: column;
    height: 100%;
    .main_content {
        overflow: hidden;
        flex: 1;
    }
}
.divider {
    position: relative;
    margin-bottom: 30px;
web/src/views/SecureManage/RiskGrad/components/TaskPunchcard.vue
@@ -1,6 +1,6 @@
<!-- 安全管理 ==> 风险分级管控 => 区域巡检(任务打卡)-->
<template>
    <div>
    <div class="wrap">
        <div class="main_header">
            <div class="header_item">
                <span class="header_label">巡检人:</span>
@@ -8,7 +8,7 @@
            </div>
            <div class="header_item">
                <span class="header_label">巡检状态:</span>
                <el-select size="mini" v-model="queryInfo.status">
                <el-select size="mini" v-model="queryInfo.status" clearable>
                    <el-option v-for="item in queryStatus" :key="item.value" :label="item.label" :value="item.value"
                        placeholder="请选择巡检状态"></el-option>
                </el-select>
@@ -72,8 +72,6 @@
                    <el-image class="image" v-for="(item, index) in regionInfos.img" :key="index" :src="item" fit="contain"
                        :preview-src-list="regionInfos.img"></el-image>
                </el-form-item>
                <el-form-item label="获取当前位置:">{{ regionInfos.location }}</el-form-item>
            </el-form>
        </el-dialog>
    </div>
@@ -120,7 +118,6 @@
                region: '', // 巡检区域
                res: '', // 巡检结果
                img: '', // 上传的图片
                location: '', // 位置
            }
        }
    },
@@ -230,13 +227,12 @@
                    this.regionInfos.time = res.data.inspectionTime
                    this.regionInfos.region = res.data.region
                    this.regionInfos.res = res.data.result
                    this.regionInfos.location = res.data.location
                    this.regionInfos.img = []
                    if (res.data.imgPaths) {
                        let arr = []
                        res.data.imgPaths.split(',').forEach(item => {
                            arr.push(process.env.VUE_APP_BASE_URL + '/' + item)
                            arr.push('https://szpipe.thhy-tj.com/' + item) // 是生产地址
                        })
                        this.regionInfos.img.push(...arr)
                    }
@@ -265,6 +261,17 @@
<style lang="scss" scoped>
@import '@/style/layout-main.scss';
.wrap {
    display: flex;
    flex-direction: column;
    height: 100%;
    .main_content {
        overflow: hidden;
        flex: 1;
    }
}
.rule_form {
    color: #fff;