|
@@ -0,0 +1,651 @@
|
|
|
+<template>
|
|
|
+ <div class="rolling-three-dashboard flex flex-col">
|
|
|
+ <div class="search-wrapper">
|
|
|
+ <BasicForm class="search-form" @register="registerForm" @submit="handleSubmit" @reset="handleSubmit">
|
|
|
+ <template #ccmNo="{ model, field }">
|
|
|
+ <segmented-select
|
|
|
+ v-model:value="model[field]"
|
|
|
+ @change="
|
|
|
+ () => {
|
|
|
+ handleSubmit();
|
|
|
+ }
|
|
|
+ "
|
|
|
+ dict="lg_zj"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </BasicForm>
|
|
|
+ </div>
|
|
|
+ <a-spin :spinning="loading">
|
|
|
+ <div class="common-table">
|
|
|
+ <a-descriptions bordered style="min-height: 72px" size="small" :column="5" :label-style="{ fontWeight: 'bold', width: '70px' }">
|
|
|
+ <template v-for="item in dtlList" :key="item.title">
|
|
|
+ <a-descriptions-item :label-style="!item.title ? { display: 'none' } : {}" :label="item.title">
|
|
|
+ <div :class="'wrapper-' + item.zjNo">
|
|
|
+ <div class="nb-left">
|
|
|
+ <div class="flex">
|
|
|
+ <div class="flex nick">
|
|
|
+ <span class="total">总数:{{ item.nums }} 支</span>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="flex nick">
|
|
|
+ <span>重量:{{ item.blankOutput ? Number(item.blankOutput).toFixed(4) : 0 }} t</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="flex dtl-wrapper" v-if="item.statisticsDetailsList.length > 0">
|
|
|
+ <div>明细:</div>
|
|
|
+ <div class="dtl flex-1 flex flex-wrap">
|
|
|
+ <div class="flex-dlt-item flex" v-for="ele in item.statisticsDetailsList">
|
|
|
+ <div class="flex dtl-item bt-line">
|
|
|
+ <span class="nums">{{ ele.size }}: {{ ele.nums }} 支</span>
|
|
|
+ </div>
|
|
|
+ <div class="flex dtl-item">
|
|
|
+ <span class="nums bt-line">重量:{{ ele.blankOutput ? Number(ele.blankOutput).toFixed(4) : 0 }} t</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- <div class="flex nb-right">
|
|
|
+ <div class="flex nick">
|
|
|
+ <span>重量:{{ item.blankOutput }}</span>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="flex dtl-wrapper" v-if="item.statisticsDetailsList.length > 0">
|
|
|
+ <div class="dtl">
|
|
|
+ <div class="flex dtl-item" v-for="ele in item.statisticsDetailsList">
|
|
|
+ <span>重量:{{ ele.blankOutput }}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div> -->
|
|
|
+ </div>
|
|
|
+ </a-descriptions-item>
|
|
|
+ </template>
|
|
|
+ </a-descriptions>
|
|
|
+ </div>
|
|
|
+ <template v-if="threeList.length">
|
|
|
+ <a-row :gutter="[16, 8]">
|
|
|
+ <a-col class="gutter-row" v-for="item in threeList" :key="item.id">
|
|
|
+ <div class="ticket next-ticket" :class="{ disabled: !!item.confirmTime }">
|
|
|
+ <div class="ticket-op-w" v-if="!isAuth">
|
|
|
+ <a-button type="primary" :disabled="!!item.confirmTime" size="small" @click="confirmCard(item)">确认装运单</a-button>
|
|
|
+ <a-button
|
|
|
+ type="primary"
|
|
|
+ size="small"
|
|
|
+ :disabled="!!item.confirmTime"
|
|
|
+ @click="
|
|
|
+ openPrintModal(true, {
|
|
|
+ record: item,
|
|
|
+ isEdit: true,
|
|
|
+ type: 'offline',
|
|
|
+ })
|
|
|
+ "
|
|
|
+ ><Icon icon="ant-design:edit-outlined"
|
|
|
+ /></a-button>
|
|
|
+ </div>
|
|
|
+ <div class="flex" style="line-height: 24px">
|
|
|
+ <div class="flex-1"> 库名:{{ item.destination }} </div>
|
|
|
+ <div class="flex-1" style="text-align: center; font-size: 13px">
|
|
|
+ {{ dayjs(item.arrivalTime).format('YYYY年MM月DD日 HH时mm分') }}
|
|
|
+ </div>
|
|
|
+ <div class="flex-1" style="text-align: right; font-size: 12px">
|
|
|
+ <component :is="renderDictTag(item.shift, 'lg_bb')" />
|
|
|
+ /
|
|
|
+ <component :is="renderDictTag(item.shiftGroup, 'lg_bz')" />
|
|
|
+ </div>
|
|
|
+ <div class="flex-1" style="text-align: right"> {{ item.ccmNo }}#机 / {{ item.btype == 1 ? '冷' : '热' }} </div>
|
|
|
+ </div>
|
|
|
+ <a-descriptions class="ticket-info" layout="vertical" bordered :column="8" size="small">
|
|
|
+ <a-descriptions-item class="ticket-info-item" label="序号">
|
|
|
+ <div style="min-height: 80px; display: flex; align-items: center; justify-content: center">
|
|
|
+ {{ item.number }}
|
|
|
+ </div>
|
|
|
+ </a-descriptions-item>
|
|
|
+ <a-descriptions-item class="ticket-info-item" label="车号">
|
|
|
+ {{ item.licensePlate }}
|
|
|
+ </a-descriptions-item>
|
|
|
+ <a-descriptions-item class="ticket-info-item" label="牌号">
|
|
|
+ <component :is="renderDictTag(item.brandNum, 'billet_spec')" />
|
|
|
+ </a-descriptions-item>
|
|
|
+ <a-descriptions-item class="heat-wrapper ticket-info-item" label="炉号">
|
|
|
+ <div style="min-width: 120px">
|
|
|
+ <div class="heatNo-item" v-for="(ele, sindex) in item.headDtl" :key="item.id">
|
|
|
+ {{ ele.heatNo }} - {{ ele.heatNum ? ele.heatNum : item.billetNos.length }}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </a-descriptions-item>
|
|
|
+ <a-descriptions-item class="ticket-info-item" label="规格">
|
|
|
+ <div style="min-width: 120px">
|
|
|
+ <span> 170 /</span>
|
|
|
+ {{ item.size }}
|
|
|
+ </div>
|
|
|
+ </a-descriptions-item>
|
|
|
+ <a-descriptions-item class="ticket-info-item" label="名称">
|
|
|
+ <div style="min-width: 40px"> 方坯 </div>
|
|
|
+ </a-descriptions-item>
|
|
|
+ <a-descriptions-item class="ticket-info-item" label="支数">
|
|
|
+ {{ item.amountTotal }}
|
|
|
+ </a-descriptions-item>
|
|
|
+ <!-- <a-descriptions-item style="border: 1px solid #bfbfbf; font-size: 12px; padding: 4px; text-align: center; height: 36px" label="重量">
|
|
|
+ <a-input-number
|
|
|
+ :bordered="false"
|
|
|
+ style="min-width: 80px; width: 80px; font-size: 12px; text-align: center"
|
|
|
+ v-model:value="info.weight"
|
|
|
+ :min="0"
|
|
|
+ :max="99"
|
|
|
+ :precision="4"
|
|
|
+ />
|
|
|
+ </a-descriptions-item> -->
|
|
|
+ </a-descriptions>
|
|
|
+ <!-- <a-descriptions style="padding: 0 30px" size="small">
|
|
|
+ <a-descriptions-item label="储运中心"> </a-descriptions-item>
|
|
|
+ <a-descriptions-item label="轧钢厂"> </a-descriptions-item>
|
|
|
+ <a-descriptions-item label="炼钢厂"> </a-descriptions-item>
|
|
|
+ </a-descriptions> -->
|
|
|
+ </div>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+
|
|
|
+ <a-pagination
|
|
|
+ class="pagination"
|
|
|
+ :defaultPageSize="pageLimit"
|
|
|
+ v-model:current="currentPage"
|
|
|
+ show-quick-jumper
|
|
|
+ :total="totalPage"
|
|
|
+ @change="onPageChange"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ <a-empty v-else :image="Empty.PRESENTED_IMAGE_SIMPLE" />
|
|
|
+ </a-spin>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 打印 -->
|
|
|
+ <printModal @register="registerPrintModal" @success="() => getList()" />
|
|
|
+
|
|
|
+ <!-- 确认 -->
|
|
|
+ <a-modal v-model:open="open" title="确认装运单" ok-text="确认" cancel-text="取消" @ok="confirmSubmit">
|
|
|
+ <div style="margin: 20px">
|
|
|
+ <div style="color: #f50; margin-bottom: 10px">说明:一经确认,装运单信息无法修改。</div>
|
|
|
+ <a-textarea v-model:value="remark" placeholder="备注" :auto-size="{ minRows: 2, maxRows: 5 }" />
|
|
|
+ </div>
|
|
|
+ </a-modal>
|
|
|
+</template>
|
|
|
+<script setup lang="ts">
|
|
|
+ import { onMounted, ref } from 'vue';
|
|
|
+ import { getStorageBillPrintList, saveStorageBillPrint, getrollClubStatistics } from './dashboard.api';
|
|
|
+ import dayjs, { Dayjs } from 'dayjs';
|
|
|
+ import { useForm, BasicForm, FormSchema } from '/@/components/Form';
|
|
|
+ import SegmentedSelect from '/@/components/SegmentedSelect/index.vue';
|
|
|
+ import { Empty } from 'ant-design-vue';
|
|
|
+ import { render } from '/@/utils/common/renderUtils';
|
|
|
+ import { useModal } from '/@/components/Modal';
|
|
|
+ import printModal from '../shippingBill/components/printModal.vue';
|
|
|
+ import { destinationOptions, machineDicts } from '../hotDelivery/common.data';
|
|
|
+ import { isJsonObjectString } from '/@/utils/is';
|
|
|
+ import { getMachineNum } from '../hotDelivery/common.data';
|
|
|
+ import { Pagination as APagination } from 'ant-design-vue';
|
|
|
+ import { useUserStore } from '/@/store/modules/user';
|
|
|
+ import { cloneDeep } from 'lodash-es';
|
|
|
+
|
|
|
+ const userStore = useUserStore();
|
|
|
+
|
|
|
+ const isAuth = userStore.userInfo && userStore.userInfo.username === '5';
|
|
|
+
|
|
|
+ const threeList = ref<any[]>([]);
|
|
|
+ const dateObj = ref<Dayjs>(dayjs());
|
|
|
+ const machineNum = getMachineNum(true) || '3';
|
|
|
+ const changeShiftId = ref('');
|
|
|
+
|
|
|
+ // 注册打印modal
|
|
|
+ const [registerPrintModal, { openModal: openPrintModal }] = useModal();
|
|
|
+ // 渲染字典标签
|
|
|
+ const renderDictTag = (value: string, dictCode: string) => {
|
|
|
+ return render.renderDict(value, dictCode);
|
|
|
+ };
|
|
|
+
|
|
|
+ //自定义表单字段
|
|
|
+ const formSchemas: FormSchema[] = [
|
|
|
+ {
|
|
|
+ field: 'ccmNo',
|
|
|
+ label: '铸机',
|
|
|
+ component: 'Input',
|
|
|
+ defaultValue: '5',
|
|
|
+ componentProps: {
|
|
|
+ dictCode: 'lg_zj',
|
|
|
+ },
|
|
|
+ colProps: { span: 6 },
|
|
|
+ slot: 'ccmNo',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '日期',
|
|
|
+ field: 'arrivalTime',
|
|
|
+ component: 'DatePicker',
|
|
|
+ componentProps: {
|
|
|
+ showTime: true,
|
|
|
+ valueFormat: 'YYYY-MM-DD HH:mm:ss',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ // {
|
|
|
+ // label: '班组',
|
|
|
+ // field: 'shiftGroup',
|
|
|
+ // component: 'JDictSelectTag',
|
|
|
+ // componentProps: {
|
|
|
+ // dictCode: 'lg_bz',
|
|
|
+ // },
|
|
|
+ // },
|
|
|
+ // {
|
|
|
+ // label: '班别',
|
|
|
+ // field: 'shift',
|
|
|
+ // component: 'JDictSelectTag',
|
|
|
+ // componentProps: {
|
|
|
+ // dictCode: 'lg_bb',
|
|
|
+ // },
|
|
|
+ // },
|
|
|
+ ];
|
|
|
+ /**
|
|
|
+ * BasicForm绑定注册;
|
|
|
+ */
|
|
|
+ const [registerForm, { getFieldsValue }] = useForm({
|
|
|
+ //注册表单列
|
|
|
+ schemas: formSchemas,
|
|
|
+ //是否显示展开收起按钮,默认false
|
|
|
+ showAdvancedButton: true,
|
|
|
+ //超过指定行数折叠,默认3行
|
|
|
+ autoAdvancedCol: 3,
|
|
|
+ //折叠时默认显示行数,默认1行
|
|
|
+ alwaysShowLines: 3,
|
|
|
+ //将表单内时间区域的值映射成 2个字段, 'YYYY-MM-DD'日期格式化
|
|
|
+ fieldMapToTime: [
|
|
|
+ // ['createTime', ['createTime_begin', 'createTime_end'], 'YYYY-MM-DD HH:mm:ss'],
|
|
|
+ // ['storageTime', ['storageTime_begin', 'storageTime_end'], 'YYYY-MM-DD HH:mm:ss'],
|
|
|
+ ],
|
|
|
+ //每列占比,默认一行为24
|
|
|
+ baseColProps: { span: 6 },
|
|
|
+ });
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 点击提交按钮的value值
|
|
|
+ * @param values
|
|
|
+ */
|
|
|
+ function handleSubmit() {
|
|
|
+ currentPage.value = 1;
|
|
|
+ getList();
|
|
|
+ getStatistics();
|
|
|
+ }
|
|
|
+
|
|
|
+ const currentPage = ref(1);
|
|
|
+ const totalPage = ref(0);
|
|
|
+ const pageLimit = ref(20);
|
|
|
+ const onPageChange = (n) => {
|
|
|
+ currentPage.value = n;
|
|
|
+ getList();
|
|
|
+ };
|
|
|
+
|
|
|
+ // 获取列表
|
|
|
+ const loading = ref(false);
|
|
|
+ const destinationTxt = {
|
|
|
+ '3': '棒三',
|
|
|
+ '4': '上若',
|
|
|
+ };
|
|
|
+ const nbDetinationTxt = {
|
|
|
+ '3': 'rollClubThreeStatisticsList',
|
|
|
+ '4': 'rollOutShippStatisticsList',
|
|
|
+ };
|
|
|
+ const getList = async () => {
|
|
|
+ try {
|
|
|
+ const values = getFieldsValue();
|
|
|
+ let params: any = Object.assign({}, values, { destination: destinationTxt[machineNum] });
|
|
|
+ if (!values.ccmNo) {
|
|
|
+ values.ccmNo = '5';
|
|
|
+ }
|
|
|
+ loading.value = true;
|
|
|
+
|
|
|
+ if (!values.arrivalTime) {
|
|
|
+ params = Object.assign({}, values, {
|
|
|
+ arrivalTime: dateObj.value.format('YYYY-MM-DD 00:00:00'),
|
|
|
+ destination: destinationTxt[machineNum],
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ loading.value = true;
|
|
|
+ const res = await getStorageBillPrintList({ pageNo: currentPage.value, pageSize: pageLimit.value, ...params });
|
|
|
+
|
|
|
+ totalPage.value = res.total;
|
|
|
+ currentPage.value = res.current;
|
|
|
+ threeList.value = (res.records || []).map((item) => {
|
|
|
+ const shiftObj = item.classes.split('/');
|
|
|
+ let shift = '';
|
|
|
+ let shiftGroup = '';
|
|
|
+ if (shiftObj.length === 2) {
|
|
|
+ shift = shiftObj[0];
|
|
|
+ shiftGroup = shiftObj[1];
|
|
|
+ } else if (shiftObj.length > 2) {
|
|
|
+ shift = shiftObj[shiftObj.length - 2];
|
|
|
+ shiftGroup = shiftObj[shiftObj.length - 1];
|
|
|
+ }
|
|
|
+
|
|
|
+ const bzTxtObj = machineDicts['lg_bz'].find((el) => el.label === shiftObj[shiftObj.length - 1]);
|
|
|
+ if (bzTxtObj) {
|
|
|
+ shiftGroup = bzTxtObj.value;
|
|
|
+ }
|
|
|
+ const bbTxtObj = machineDicts['lg_bb'].find((el) => el.label === shiftObj[shiftObj.length - 2]);
|
|
|
+ if (bbTxtObj) {
|
|
|
+ shift = bbTxtObj.value;
|
|
|
+ }
|
|
|
+
|
|
|
+ const typeConfigId = destinationOptions[item.ccmNo].find((el) => el.label === item.destination);
|
|
|
+
|
|
|
+ const heatNos = isJsonObjectString(item.heatNo) ? JSON.parse(item.heatNo) : {};
|
|
|
+ const heatNosArr = Object.keys(heatNos).map((key) => {
|
|
|
+ return {
|
|
|
+ heatNo: key,
|
|
|
+ heatNum: heatNos[key],
|
|
|
+ };
|
|
|
+ });
|
|
|
+
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ recordId: item.id,
|
|
|
+ id: item.storageBillId,
|
|
|
+ shift,
|
|
|
+ shiftGroup,
|
|
|
+ typeConfigId: typeConfigId ? typeConfigId.value : '',
|
|
|
+ headDtl: heatNosArr,
|
|
|
+ };
|
|
|
+ });
|
|
|
+ } catch (error) {
|
|
|
+ console.log(error);
|
|
|
+ } finally {
|
|
|
+ loading.value = false;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // 确定
|
|
|
+ const open = ref(false);
|
|
|
+ const confirmInfo = ref({});
|
|
|
+ const remark = ref('装运单确认无误!');
|
|
|
+ const confirmCard = (record) => {
|
|
|
+ open.value = true;
|
|
|
+ confirmInfo.value = record;
|
|
|
+ remark.value = '装运单确认无误!';
|
|
|
+ };
|
|
|
+ const confirmSubmit = () => {
|
|
|
+ const info: any = confirmInfo.value;
|
|
|
+ saveStorageBillPrint({
|
|
|
+ id: info.recordId,
|
|
|
+ confirmTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
|
|
|
+ remark: remark.value,
|
|
|
+ storageBillId: info.id,
|
|
|
+ btype: info.btype,
|
|
|
+ }).then(() => {
|
|
|
+ open.value = false;
|
|
|
+ getList();
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ // 明细展示
|
|
|
+ const defaultDtl = [
|
|
|
+ {
|
|
|
+ // title: '总计',
|
|
|
+ title: '',
|
|
|
+ zjNo: 0,
|
|
|
+ blankOutput: 0,
|
|
|
+ nums: 0,
|
|
|
+ statisticsDetailsList: [],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '5#机',
|
|
|
+ zjNo: 5,
|
|
|
+ blankOutput: 0,
|
|
|
+ nums: 0,
|
|
|
+ statisticsDetailsList: [],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '6#机',
|
|
|
+ zjNo: 6,
|
|
|
+ blankOutput: 0,
|
|
|
+ nums: 0,
|
|
|
+ statisticsDetailsList: [],
|
|
|
+ },
|
|
|
+ ];
|
|
|
+ const dtlList = ref<any[]>(defaultDtl);
|
|
|
+ // 获取统计信息
|
|
|
+ /**
|
|
|
+ * ccmNo、changeShiftId、queryDate、queryType(1、2、3、4)代表棒一、棒二、棒三、上若, 就这四个参数,ccmNo、queryType 必输,changeShiftId、queryDate(2025-06-24)非必输,
|
|
|
+ **/
|
|
|
+ const getStatistics = async () => {
|
|
|
+ const values = getFieldsValue();
|
|
|
+ const ccmNo = values.ccmNo || '5';
|
|
|
+ let dtlItems: any = cloneDeep(defaultDtl);
|
|
|
+ try {
|
|
|
+ const staticsRres = await getrollClubStatistics({
|
|
|
+ ccmNo,
|
|
|
+ queryType: machineNum,
|
|
|
+ changeShiftId: changeShiftId.value || undefined,
|
|
|
+ queryDate: values.arrivalTime ? values.arrivalTime : dayjs().format('YYYY-MM-DD HH:mm:ss'),
|
|
|
+ });
|
|
|
+ const res = staticsRres[0];
|
|
|
+ dtlItems[0].blankOutput = res.totalWeight || 0;
|
|
|
+ dtlItems[0].nums = res.counts || 0;
|
|
|
+ let totalObj = {
|
|
|
+ 5: { blankOutput: 0, nums: 0 },
|
|
|
+ 6: { blankOutput: 0, nums: 0 },
|
|
|
+ };
|
|
|
+ let statisticsDetailsList5: any[] = [];
|
|
|
+ let statisticsDetailsList6: any[] = [];
|
|
|
+
|
|
|
+ (res[nbDetinationTxt[machineNum]] || []).forEach((element) => {
|
|
|
+ if (ccmNo === '5') {
|
|
|
+ statisticsDetailsList5.push({ ...element, nums: element.amountTotal, blankOutput: element.blankOutput.toFixed(4) });
|
|
|
+ totalObj[5].blankOutput += element.blankOutput;
|
|
|
+ totalObj[5].nums += element.amountTotal;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ccmNo === '6') {
|
|
|
+ statisticsDetailsList6.push({ ...element, nums: element.amountTotal, blankOutput: element.blankOutput.toFixed(4) });
|
|
|
+ totalObj[6].blankOutput += element.blankOutput;
|
|
|
+ totalObj[6].nums += element.amountTotal;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ if (ccmNo === '5') {
|
|
|
+ dtlItems[1].statisticsDetailsList = statisticsDetailsList5;
|
|
|
+ dtlItems[1].blankOutput = totalObj[5].blankOutput ? totalObj[5].blankOutput.toFixed(4) : 0;
|
|
|
+ dtlItems[1].nums = totalObj[5].nums;
|
|
|
+ dtlItems.splice(2, 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ccmNo === '6') {
|
|
|
+ dtlItems[2].statisticsDetailsList = statisticsDetailsList6;
|
|
|
+ dtlItems[2].blankOutput = totalObj[6].blankOutput ? totalObj[6].blankOutput.toFixed(4) : 0;
|
|
|
+ dtlItems[2].nums = totalObj[6].nums;
|
|
|
+ dtlItems.splice(1, 1);
|
|
|
+ }
|
|
|
+ dtlList.value = dtlItems;
|
|
|
+ } catch (error) {
|
|
|
+ if (ccmNo === '6') {
|
|
|
+ dtlItems.splice(1, 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ccmNo === '5') {
|
|
|
+ dtlItems.splice(2, 1);
|
|
|
+ }
|
|
|
+ dtlList.value = dtlItems;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ onMounted(() => {
|
|
|
+ getStatistics();
|
|
|
+ getList();
|
|
|
+ });
|
|
|
+</script>
|
|
|
+<style scoped lang="less">
|
|
|
+ .rolling-three-dashboard {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ padding: 20px;
|
|
|
+ overflow: hidden;
|
|
|
+ background: var(--bg-s-color);
|
|
|
+
|
|
|
+ .search-wrapper {
|
|
|
+ margin-bottom: 10px;
|
|
|
+ background-color: #005baf;
|
|
|
+ padding: 20px 20px 0;
|
|
|
+ border-radius: 4px;
|
|
|
+
|
|
|
+ .search-form {
|
|
|
+ :deep(.btnArea) {
|
|
|
+ .ant-form-item-row {
|
|
|
+ width: 100%;
|
|
|
+ justify-content: flex-end;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.ant-form) {
|
|
|
+ .ant-form-item .ant-form-item-label > label {
|
|
|
+ color: #fff;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.ant-spin-nested-loading) {
|
|
|
+ flex: 1;
|
|
|
+ overflow: hidden;
|
|
|
+ }
|
|
|
+
|
|
|
+ .ant-empty {
|
|
|
+ margin-top: 60px;
|
|
|
+ color: #cbcbcb;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gutter-row {
|
|
|
+ max-width: 660px;
|
|
|
+ position: relative;
|
|
|
+
|
|
|
+ .ticket {
|
|
|
+ padding: 10px 10px 0;
|
|
|
+ border: 1px solid #c5c5c5;
|
|
|
+ background: beige;
|
|
|
+
|
|
|
+ &.disabled {
|
|
|
+ background: #e9e9e9;
|
|
|
+ }
|
|
|
+
|
|
|
+ .ticket-op-w {
|
|
|
+ margin-bottom: 10px;
|
|
|
+ text-align: right;
|
|
|
+
|
|
|
+ .ant-btn {
|
|
|
+ margin-left: 20px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .ant-select {
|
|
|
+ :deep(.ant-select-selector) {
|
|
|
+ font-size: 14px;
|
|
|
+ padding: 0;
|
|
|
+
|
|
|
+ .ant-select-selection-item,
|
|
|
+ .ant-select-selection-placeholder {
|
|
|
+ padding-inline-end: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.ant-select-arrow) {
|
|
|
+ display: none;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .ticket-info {
|
|
|
+ margin-top: 6px;
|
|
|
+ margin-bottom: 4px;
|
|
|
+
|
|
|
+ :deep(.ant-descriptions-view) {
|
|
|
+ .ticket-info-item {
|
|
|
+ border: 1px solid #bfbfbf;
|
|
|
+ font-size: 12px;
|
|
|
+ padding: 4px !important;
|
|
|
+ text-align: center;
|
|
|
+ height: 36px;
|
|
|
+ position: relative;
|
|
|
+ color: #333;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .heatNo-item {
|
|
|
+ min-width: 120px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .pagination {
|
|
|
+ margin-top: 20px;
|
|
|
+ text-align: right;
|
|
|
+ padding-right: 30px;
|
|
|
+
|
|
|
+ :deep(.ant-pagination-item) {
|
|
|
+ a {
|
|
|
+ color: rgba(51, 51, 51, 0.88);
|
|
|
+ }
|
|
|
+
|
|
|
+ &.ant-pagination-item-active {
|
|
|
+ background-color: var(--vxe-primary-color);
|
|
|
+ border-color: var(--vxe-primary-color);
|
|
|
+ a {
|
|
|
+ color: #fff;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .common-table {
|
|
|
+ margin-bottom: 20px;
|
|
|
+ color: #fff;
|
|
|
+
|
|
|
+ .wrapper-0 {
|
|
|
+ min-width: 300px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .nb-left,
|
|
|
+ .nb-right {
|
|
|
+ flex-direction: column;
|
|
|
+ }
|
|
|
+
|
|
|
+ .nick {
|
|
|
+ padding: 0;
|
|
|
+ font-weight: 700;
|
|
|
+ // color: rgba(0, 0, 0, 0.8);
|
|
|
+
|
|
|
+ .total {
|
|
|
+ display: inline-block;
|
|
|
+ min-width: 130px;
|
|
|
+ margin-right: 30px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .dtl-wrapper {
|
|
|
+ margin-top: 10px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .dtl {
|
|
|
+ display: flex;
|
|
|
+ // color: rgba(0, 0, 0, 0.6);
|
|
|
+ gap: 8px 16px;
|
|
|
+
|
|
|
+ .nums {
|
|
|
+ display: inline-block;
|
|
|
+ min-width: 130px;
|
|
|
+ margin-right: 30px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .bt-line {
|
|
|
+ border-bottom: 1px solid #eee;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+</style>
|