MessageSendLog.vue 8.32 KB
<template>
  <div class="fullheight">
    <ht-table
      @load="loadData"
      :data="data"
      :pageResult="pageResult"
      quick-search-props="subject,senderName,content"
      :default-sorter="[{direction: 'DESC', property: 'CREATE_TIME_'}]"
      ref="htTable"
      :show-export="false"
      @row-click="rowClick"
      @selection-change="handleSelectionChange"
    >
      <template v-slot:toolbar>
        <el-button-group>
          <ht-delete-button
            :url="deleteUrl"
            :htTable="$refs.htTable"
            @after-delete="afterDelete"
            :disabled="isDisabled"
            >删除</ht-delete-button
          >
        </el-button-group>
      </template>

      <template>
        <ht-table-column type="index" width="50" align="center" label="序号" />
        <ht-table-column
          prop="subject"
          label="标题"
          :sortable="true"
          show-overflow-tooltip
        >
          <template v-slot="{row}">
            <el-link type="primary" @click="openDetail(row)" title="查看明细">{{
              row.subject
            }}</el-link>
          </template>
        </ht-table-column>
        <ht-table-column
          prop="type"
          label="消息类型"
          width="100"
          :render-header="renderHeaderMethod"
          :filters="typeArray"
        >
          <template v-slot="{row}">
            <el-tag
              v-show="row.type == s.value"
              type="info"
              v-for="s in typeArray"
              :key="s.value"
              >{{ s.text }}</el-tag
            >
          </template>
        </ht-table-column>
        <ht-table-column
          prop="isSuccess"
          label="状态"
          width="80"
          :render-header="renderHeaderMethod"
          :filters="statusArray"
        >
          <template v-slot="{row}">
            <el-tag
              v-show="row.isSuccess == s.value"
              :type="s.type"
              v-for="s in statusArray"
              :key="s.value"
              >{{ s.text }}</el-tag
            >
          </template>
        </ht-table-column>
        <ht-table-column
          prop="content"
          label="消息内容"
          :show-overflow-tooltip="true"
        />
        <ht-table-column prop="retryCount" width="80" label="重试次数" />
        <ht-table-column prop="createTime" label="记录时间" width="180" />

        <ht-table-column width="300" label="操作" align="left">
          <template v-slot="{row}">
            <el-button size="mini" @click="reinvoke(row.id)" 
            type="text"
            >重调</el-button>
            <el-button
              size="mini"
              type="text"
              v-show="!row.isSuccess"
              @click="signSuccess(row.id)"
              >标记为成功</el-button
            >
          </template>
        </ht-table-column>
      </template>
    </ht-table>
    <ht-sidebar-dialog
      width="28%"
      title="日志明细"
      :visible="dialogVisible"
      :before-close="handleClose"
    >
      <el-form v-model="curRow" data-vv-scope="editRoleForm">
        <ht-form-item label="类型" prop="name" label-width="80px">
          <el-tag
            v-show="curRow.type == s.value"
            :type="s.type"
            v-for="s in typeArray"
            :key="s.value"
            >{{ s.text }}</el-tag
          >
        </ht-form-item>

        <!--<ht-form-item label="发送人" prop="name" label-width="80px">{{curRow.senderName}}</ht-form-item>-->
        <ht-form-item label="接收人" prop="receivers" label-width="80px">
          <ht-input
            type="textarea"
            v-model="curRow.receivers"
            :rows="3"
            :readonly="true"
            placeholder=""
          />
        </ht-form-item>
        <ht-form-item label="标题" prop="subject" label-width="80px">{{
          curRow.subject
        }}</ht-form-item>
        <ht-form-item label="消息内容" prop="content" label-width="80px">
          <ht-input
            type="textarea"
            v-model="curRow.content"
            :rows="3"
            :readonly="true"
            placeholder=""
          />
        </ht-form-item>
        <ht-form-item label="状态" prop="isSuccess" label-width="80px">
          <el-tag
            v-show="curRow.isSuccess == s.value"
            :type="s.type"
            v-for="s in statusArray"
            :key="s.value"
            >{{ s.text }}</el-tag
          >
        </ht-form-item>
        <ht-form-item label="异常信息" prop="exception" label-width="80px">
          <ht-input
            type="textarea"
            v-model="curRow.exception"
            :rows="3"
            :readonly="true"
            placeholder=""
          />
        </ht-form-item>
        <ht-form-item label="重试次数" prop="name" label-width="80px">{{
          curRow.retryCount
        }}</ht-form-item>
        <ht-form-item label="记录时间" prop="createTime" label-width="80px">{{
          curRow.createTime
        }}</ht-form-item>
      </el-form>
    </ht-sidebar-dialog>
  </div>
</template>
<script>
  import req from '@/request.js'
  import tableHeaderFilter from '@/mixins/tableHeaderFilter.js'
  export default {
    components: {},
    mixins: [tableHeaderFilter],
    data() {
      return {
        isDisabled:true,
        selectedList: [],
        defaultProps: {
          children: 'children',
          label: 'name',
        },
        data: [],
        pageResult: {
          page: 1,
          pageSize: 50,
          total: 0,
        },
        curRow: {},
        dialogVisible: false,
        statusArray: [
          {text: '失败', value: 0, type: 'danger'},
          {text: '成功', value: 1, type: 'info'},
        ],
        typeArray: [
          {text: '内部消息', value: 'inner'},
          {text: '邮件', value: 'mail'},
          {text: '短信', value: 'sms'},
          {text: '语音', value: 'voice'},
          {text: '微信', value: 'wxEnterprise'},
          {text: '钉钉', value: 'dingTalk'},
          {text: '飞书', value: 'flyBook'},
        ],
      }
    },
    watch: {
      selectedList:{
        handler(val){
          this.isDisabled = val.length < 1 ? true : false
        },
        deep:true
      }
    },
    computed: {
      deleteUrl: function () {
        return window.context.portal + '/portal/messageLog/v1/removes'
      },
    },
    methods: {
      handleSelectionChange(selection) {
        this.selectedList = selection
      },
      rowClick(row, column, event) {
        this.$refs.htTable.$refs.htTable.toggleRowSelection(row)
      },
      handleClose() {
        this.dialogVisible = false
      },
      openDetail(row) {
        this.curRow = row
        this.dialogVisible = true
      },
      loadData(param, cb) {
        req
          .post(window.context.portal + '/portal/messageLog/v1/list', param)
          .then((data) => {
            let response = data.data
            this.data = response.rows
            this.pageResult = {
              page: response.page,
              pageSize: response.pageSize,
              total: response.total,
            }
          })
          .finally(() => cb())
      },
      afterDelete() {
        this.$refs.htTable.load()
      },
      reinvoke(id) {
        let this_ = this
        req
          .post(window.context.portal + '/portal/messageLog/v1/reinvoke/' + id)
          .then(function (response) {
            let data = response.data
            if (data.state) {
              this_.$message.success(data.message)
              this_.$refs.htTable.load()
            } else {
              this_.$message.fail(data.message)
            }
          })
      },
      signSuccess(id) {
        let this_ = this
        req
          .post(window.context.portal + '/portal/messageLog/v1/signSuccess/' + id)
          .then(function (response) {
            let data = response.data
            if (data.state) {
              this_.$message.success(data.message)
              this_.$refs.htTable.load()
            } else {
              this_.$message.fail(data.message)
            }
          })
      },
    },
  }
</script>

<style lang="scss" scoped>
  @import '@/assets/css/element-variables.scss';
  .aside-width {
    width: $--aside-width !important;
  }

  .inputs.ht-form-inputs__inline {
    width: auto;
  }
  ::v-deep{
    .cell>.el-table__column-filter-trigger{
      display: none;
    }
  }
</style>