CycleCountHeaderList.vue 11.9 KB
<template>
  <a-card :bordered="false">
    <!-- 查询区域 -->
    <div class="table-page-search-wrapper">
      <a-form layout="inline" @keyup.enter.native="searchQuery">
        <a-row :gutter="24">
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item :label="$t('inventory.inventoryCheckCode')">
              <a-input :placeholder="$t('inventory.enterInventoryCheckCode')" v-model="queryParam.code"></a-input>
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
              <a-button type="primary" @click="searchQuery" icon="search">{{ $t('button.search') }}</a-button>
              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">{{ $t('button.reset') }}</a-button>
            </span>
          </a-col>
        </a-row>
      </a-form>
    </div>
    <!-- 查询区域-END -->
    <!-- 操作按钮区域 -->
    <div class="table-operator">
      <a-button v-has="'cycleCountHeader:add'" @click="handleAdd" type="primary" icon="plus">{{ $t('button.new') }}</a-button>
      <a-button v-has="'cycleCountHeader:export'" type="primary" icon="download" @click="handleExportXls('盘点主表')">{{
          $t('button.export')
        }}
      </a-button>
      <a-upload v-has="'cycleCountHeader:import'" name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader"
                :action="importExcelUrl" @change="handleImportExcel">
        <a-button type="primary" icon="import">{{ $t('button.import') }}</a-button>
      </a-upload>
      <a-dropdown v-if="selectedRowKeys.length > 0">
        <a-menu slot="overlay">
          <a-menu-item key="1" @click="batchDel">
            <a-icon type="delete"/>
            {{ $t('button.delete') }}
          </a-menu-item>
        </a-menu>
        <a-button style="margin-left: 8px">{{ $t('button.multiSelectActions') }}
          <a-icon type="down"/>
        </a-button>
      </a-dropdown>
    </div>
    <!-- table区域-begin -->
    <div>
      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
        <i class="anticon anticon-info-circle ant-alert-icon"></i> {{ $t('button.selected') }}
        <a style="font-weight: 600">{{ selectedRowKeys.length }}</a> {{ $t('button.item') }}
        <a style="margin-left: 24px" @click="onClearSelected">{{ $t('button.clearAll') }}</a>
      </div>

      <a-table
        ref="table"
        size="middle"
        bordered
        rowKey="id"
        :columns="columns"
        :dataSource="dataSource"
        :pagination="ipagination"
        :loading="loading"
        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
        class="j-table-force-nowrap"
        @change="handleTableChange">
        <!-- 内嵌table区域 begin -->
        <template slot="expandedRowRender" slot-scope="record">
          <a-tabs tabPosition="top">
            <a-tab-pane :tab="$t('inventory.inventoryCheckDetail')" key="cycleCountDetailId" forceRender>
              <cycle-count-detail-list :record="record" :isLoad="true"/>
            </a-tab-pane>
          </a-tabs>
        </template>
        <!-- 内嵌table区域 end -->
        <span slot="companyCode" slot-scope="companyCode">
          <a-tag :key="companyCode" color=blue>
            {{ solutionCompany(companyCode) }}
          </a-tag>
        </span>

        <span slot="countType" slot-scope="countType">
          <a-tag :key="countType" :color="getCountTypeColor(countType)">
            {{ solutionCountType(countType) }}
          </a-tag>
        </span>

        <span slot="statusCyc_dictText" slot-scope="statusCyc_dictText">
            <a-tag :key="statusCyc_dictText" :color="getStatusColor(statusCyc_dictText)">
              {{ statusCyc_dictText }}
            </a-tag>
        </span>

        <span slot="enable_dictText" slot-scope="enable_dictText">
            <a-tag :key="enable_dictText" :color="getStatusColor(enable_dictText)">
              {{ enable_dictText }}
            </a-tag>
        </span>

        <span slot="action" slot-scope="text, record">
          <a v-if="record.statusCyc === 1" @click="cycleCountDetailAdd(record)">{{ $t('button.new') }}</a>
          <a-divider type="vertical" v-if="record.statusCyc !== 100"/>
          <a-dropdown>
            <a class="ant-dropdown-link">{{ $t('button.more') }}&nbsp;<a-icon type="down"/></a>
            <a-menu slot="overlay">
              <a-menu-item v-has="'cycleCountHeader:edit'">
                <a v-if="record.statusCyc === 1" @click="handleEdit(record)">{{ $t('button.edit') }}</a>
              </a-menu-item>
              <a-menu-item>
                <a @click="handleDetail(record)">{{ $t('button.details') }}</a>
              </a-menu-item>
              <a-menu-item v-if="record.statusCyc === 1" v-has="'cycleCountHeader:delete'">
                <a-popconfirm :title="$t('button.deletingIt')" @confirm="() => handleDelete(record.id)">
                  <a>{{ $t('button.delete') }}</a>
                </a-popconfirm>
              </a-menu-item>
            </a-menu>
          </a-dropdown>
        </span>

      </a-table>
    </div>
    <cycle-count-header-modal ref="modalForm" @ok="modalFormOk"></cycle-count-header-modal>
    <cycle-count-detail-modal ref="detailModalForm" @ok="detailModalFormOk"/>
  </a-card>
</template>

<script>

import '@/assets/less/TableExpand.less'
import {mixinDevice} from '@/utils/mixin'
import {JeecgListMixin} from '@/mixins/JeecgListMixin'
import {getCompanyList, getCountTypeList} from '@/api/api'
import CycleCountHeaderModal from './modules/CycleCountHeaderModal'
import CycleCountDetailList from "./CycleCountDetailList";
import Utils from "../../../components/jeecgbiz/JButtonBizComponent/util.js"
import CycleCountDetailModal from "./modules/CycleCountDetailModal";

export default {
  name: 'CycleCountHeaderList',
  mixins: [JeecgListMixin, mixinDevice],
  components: {
    CycleCountDetailModal,
    CycleCountHeaderModal,
    CycleCountDetailList,
  },
  data() {
    return {
      // 选择用户查询条件配置
      selectUserQueryConfig: [
        {key: 'locationCode', label: '库位'},
      ],
      description: '盘点主表管理页面',
      companyList: [],
      CountTypeList: [],
      // 表头
      columns: [
        {
          title: 'ID',
          dataIndex: '',
          key: 'rowIndex',
          width: 60,
          align: "center",
          customRender: function (t, r, index) {
            return parseInt(index) + 1;
          }
        },
        {
          title: this.$t('inventory.inventoryCheckCode'),
          align: "center",
          dataIndex: 'code'
        },
        {
          title: this.$t('inventory.company'),
          align: "center",
          dataIndex: 'companyCode',
          key: 'companyCode',
          scopedSlots: {customRender: 'companyCode'}
        },
        {
          title: this.$t('inventory.totalLocation'),
          align: "center",
          dataIndex: 'totalLocs'
        },
        {
          title: this.$t('inventory.totalQty'),
          align: "center",
          dataIndex: 'totalItems'
        },
        {
          title: this.$t('inventory.checkType'),
          align: "center",
          dataIndex: 'countType',
          key: 'countType',
          scopedSlots: {customRender: 'countType'}
        },
        {
          title: this.$t('inventory.checkStatus'),
          align: "center",
          dataIndex: 'statusCyc_dictText' + this.$ls.get('language'),
          scopedSlots: {customRender: 'statusCyc_dictText'}
        },
        {
          title: this.$t('inventory.checkPerson'),
          align: "center",
          dataIndex: 'stocktakingAs'
        },
        {
          title: this.$t('inventory.realCheckPerson'),
          align: "center",
          dataIndex: 'stocktakingAc'
        },
        {
          title: this.$t('inventory.effective'),
          align: "center",
          dataIndex: 'enable_dictText' + this.$ls.get('language'),
          scopedSlots: {customRender: 'enable_dictText'}
        },
        {
          title: this.$t('inventory.remark'),
          align: "center",
          dataIndex: 'remark'
        },
        {
          title: this.$t('system.options'),
          dataIndex: 'action',
          align: "center",
          // fixed:"right",
          width: 147,
          scopedSlots: {customRender: 'action'}
        }
      ],
      url: {
        list: "/cycleCountHeader/cycleCountHeader/list",
        delete: "/cycleCountHeader/cycleCountHeader/delete",
        deleteBatch: "/cycleCountHeader/cycleCountHeader/deleteBatch",
        exportXlsUrl: "/cycleCountHeader/cycleCountHeader/exportXls",
        importExcelUrl: "cycleCountHeader/cycleCountHeader/importExcel",
      },
      dictOptions: {
        status: [],
      },
      superFieldList: [],
    }
  },
  created() {
    this.getSuperFieldList();
    this.loadFrom();
  },
  mounted() {
    let that = this;
    Utils.$on('refreshCycleCountHeader', () => {
      that.loadData()
    })
  },
  computed: {
    importExcelUrl: function () {
      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
    },
  },
  methods: {
    initDictConfig() {
    },
    getSuperFieldList() {
      let fieldList = [];
      fieldList.push({type: 'string', value: 'code', text: '盘点主表编号', dictCode: ''})
      fieldList.push({type: 'string', value: 'companyCode', text: '货主编码', dictCode: ''})
      fieldList.push({type: 'string', value: 'countType', text: '盘点类型', dictCode: ''})
      fieldList.push({type: 'int', value: 'statusCyc', text: '盘点状态', dictCode: 'cycleCount_status'})
      fieldList.push({type: 'string', value: 'remark', text: '备注', dictCode: ''})
      fieldList.push({type: 'int', value: 'totalLocs', text: '总货位数', dictCode: ''})
      fieldList.push({type: 'int', value: 'totalItems', text: '总物料数', dictCode: ''})
      fieldList.push({type: 'string', value: 'stocktakingAs', text: '指定盘点人员', dictCode: ''})
      fieldList.push({type: 'string', value: 'stocktakingAc', text: '实际盘点人员', dictCode: ''})
      fieldList.push({type: 'int', value: 'enable', text: '是否有效', dictCode: 'valid_status'})
      fieldList.push({type: 'datetime', value: 'uploadTime', text: '回传时间'})
      fieldList.push({type: 'int', value: 'uploadStatus', text: '回传状态', dictCode: 'valid_status'})
      fieldList.push({type: 'string', value: 'closedBy', text: '关闭人', dictCode: ''})
      this.superFieldList = fieldList
    },
    loadFrom() {
      getCompanyList().then((res) => {
        if (res.success) {
          this.companyList = res.result
        }
      });
      getCountTypeList().then((res) => {
        if (res.success) {
          this.CountTypeList = res.result
        }
      });
    },
    solutionCompany(value) {
      let actions = []
      Object.keys(this.companyList).some((key) => {
        if (this.companyList[key].code === ('' + value)) {
          actions.push(this.companyList[key].name)
          return true
        }
      })
      return actions.join('')
    },
    solutionCountType(value) {
      let actions = []
      Object.keys(this.CountTypeList).some((key) => {
        if (this.CountTypeList[key].code === ('' + value)) {
          actions.push(this.CountTypeList[key].name)
          return true
        }
      })
      return actions.join('')
    },
    cycleCountDetailAdd(record) {
      this.$refs.detailModalForm.title = this.$t('inventory.inventory');
      this.$refs.detailModalForm.cycleCountHeader = record;
      this.$refs.detailModalForm.visible = true;
    },
    detailModalFormOk() {
      this.loadData();
    },
    getCountTypeColor(countType) {
      const colors = {
        '01': 'cyan',
        '02': 'purple',
        '明盘': 'cyan',
        '暗盘': 'purple',
        default: 'blue'
      };
      return colors[countType] || colors.default;
    }
  }
}
</script>
<style scoped>
@import '~@assets/less/common.less';
</style>