|
@@ -0,0 +1,1339 @@
|
|
|
+<template>
|
|
|
+ <div class="cc-heatList flex flex-col">
|
|
|
+ <div class="tips-title flex" v-if="showAction">
|
|
|
+ <div class="left-tip">当班浇铸炉次</div>
|
|
|
+ <div class="flex flex-1 items-center">
|
|
|
+ <div class="flex flex-1">
|
|
|
+ <template v-for="item in 8">
|
|
|
+ <JSearchSelect
|
|
|
+ type="list"
|
|
|
+ style="width: 96px"
|
|
|
+ v-model:value="strandNoSelected[item]"
|
|
|
+ dict="lg_dcgg"
|
|
|
+ :placeholder="`${item}流定尺`"
|
|
|
+ :class="{ changele: strandNoSelectedOrg[item] != strandNoSelected[item] }"
|
|
|
+ allowClear
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ <div style="margin-right: 6px">
|
|
|
+ <a-button type="primary" danger style="font-size: 16px" @click="handlerChangeLength">
|
|
|
+ 切换{{ cuttolengthStatus == 2 ? '手动定尺' : '自动定尺' }}
|
|
|
+ </a-button>
|
|
|
+ </div>
|
|
|
+ <div style="margin-right: 6px; display: none">
|
|
|
+ <span style="font-size: 16px; color: #f50">短尺:</span>
|
|
|
+ <a-select style="width: 120px" :options="shortSizeOptions" @change="changeShortLength" />
|
|
|
+ </div>
|
|
|
+ <div style="margin-right: 6px">
|
|
|
+ <a-button type="primary" @click="() => refresh()"> 刷新 </a-button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="current-table-list flex-1">
|
|
|
+ <!--引用表格-->
|
|
|
+ <BasicTable @register="registerTable">
|
|
|
+ <!--操作栏-->
|
|
|
+ <template #action="{ record, index }">
|
|
|
+ <TableAction class="flex flex-col" style="gap: 4px; min-height: 88px" :actions="getTableAction(record, index)" />
|
|
|
+ </template>
|
|
|
+ <!--字段回显插槽-->
|
|
|
+ <!-- <template v-slot:bodyCell="{ column, record, index, text }"> </template> -->
|
|
|
+ </BasicTable>
|
|
|
+ </div>
|
|
|
+ <BasicTable @register="registerExtraTable" v-if="otherShiftTableData.length > 0" :dataSource="otherShiftTableData">
|
|
|
+ <!--操作栏-->
|
|
|
+ <template #action="{ record }">
|
|
|
+ <TableAction class="flex flex-col" style="gap: 4px; min-height: 88px" :actions="getTableAction(record)" />
|
|
|
+ </template>
|
|
|
+ <!--字段回显插槽-->
|
|
|
+ <!-- <template v-slot:bodyCell="{ column, record, index, text }"> </template> -->
|
|
|
+ </BasicTable>
|
|
|
+ <!-- 流切换定尺 -->
|
|
|
+ <a-modal
|
|
|
+ v-model:open="openSizeModal"
|
|
|
+ title="切换定尺"
|
|
|
+ centered
|
|
|
+ width="400px"
|
|
|
+ ok-text="确认"
|
|
|
+ :okButtonProps="{ loading: okLoading }"
|
|
|
+ cancel-text="取消"
|
|
|
+ @ok="switchSteelOne"
|
|
|
+ @cancel="
|
|
|
+ () => {
|
|
|
+ openSizeModal = false;
|
|
|
+ newSizeNum = '';
|
|
|
+ }
|
|
|
+ "
|
|
|
+ >
|
|
|
+ <div class="flex justify-center items-center" style="margin: 20px 0">
|
|
|
+ <div>选择定尺:</div>
|
|
|
+ <JSearchSelect type="list" style="width: 277px" v-model:value="newSizeNum" dict="lg_dcgg" placeholder="请选择" allowClear />
|
|
|
+ </div>
|
|
|
+ </a-modal>
|
|
|
+ <!-- 补录钢坯 -->
|
|
|
+ <a-modal
|
|
|
+ v-model:open="openCompensateModal"
|
|
|
+ :title="'补录钢坯' + (heatInfo.heatNo ? ',炉号:' + heatInfo.heatNo : '')"
|
|
|
+ centered
|
|
|
+ width="700px"
|
|
|
+ ok-text="确认"
|
|
|
+ :okButtonProps="{ loading: okLoading }"
|
|
|
+ cancel-text="取消"
|
|
|
+ @ok="confirmCompensate"
|
|
|
+ @cancel="closeCompensateModal"
|
|
|
+ >
|
|
|
+ <div class="strand-list">
|
|
|
+ <div class="flex justify-between strand-item" v-if="isAllHeat" style="margin: 20px 0">
|
|
|
+ <div class="flex" style="height: 40px; line-height: 40px">
|
|
|
+ <span class="mr-2">炉号:</span>
|
|
|
+ <a-input
|
|
|
+ :status="newHeatNoStatus"
|
|
|
+ @change="handlerChange($event, 'newHeat')"
|
|
|
+ v-model:value="newHeatNo"
|
|
|
+ style="width: 180px"
|
|
|
+ size="large"
|
|
|
+ type="number"
|
|
|
+ placeholder="请输入炉号"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="strand-item" v-else style="margin: 20px 0">
|
|
|
+ <a-radio-group v-model:value="isRollOne">
|
|
|
+ <a-radio-button value="default">默认</a-radio-button>
|
|
|
+ <a-radio-button value="rollOne">棒一</a-radio-button>
|
|
|
+ </a-radio-group>
|
|
|
+ </div>
|
|
|
+ <div v-for="(item, index) in Object.keys(strandFormInfo)" class="flex justify-between items-center strand-item" style="margin: 20px 0">
|
|
|
+ <div class="strand-num">{{ strandFormInfo[item].no }}流</div>
|
|
|
+ <div class="flex items-center" style="position: relative; width: 120px">
|
|
|
+ <component :is="formatDefineSize(heatInfo[item], heatInfo[lengthArr[index]])" />
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <JSearchSelect
|
|
|
+ type="list"
|
|
|
+ style="width: 96px"
|
|
|
+ v-model:value="strandFormInfo[item].size"
|
|
|
+ dict="lg_dcgg"
|
|
|
+ :placeholder="`${strandFormInfo[item].no}流定尺`"
|
|
|
+ allowClear
|
|
|
+ :status="strandFormInfo[item].sizeStatus"
|
|
|
+ :disabled="isRollOne === 'rollOne' ? (strandFormInfo[item].hasOne ? false : true) : false"
|
|
|
+ @change="handlerChange($event, 'sizeStatus', item)"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <a-input-number
|
|
|
+ id="inputNumber"
|
|
|
+ :status="strandFormInfo[item].sumStatus"
|
|
|
+ @change="handlerChange($event, 'sumStatus', item)"
|
|
|
+ v-model:value="strandFormInfo[item].sum"
|
|
|
+ :disabled="isRollOne === 'rollOne' ? (strandFormInfo[item].hasOne ? false : true) : false"
|
|
|
+ :min="0"
|
|
|
+ :max="10"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div style="width: 140px" v-if="isAllHeat">
|
|
|
+ <div class="flex items-center" v-if="isAllHeat && strandFormInfo[item].hasOne">
|
|
|
+ <span class="mr-2" style="color: #f50">去棒一:</span>
|
|
|
+ <a-input type="number" v-model:value="strandFormInfo[item].rollClubOne" style="width: 80px" suffix="支" placeholder="棒一" :min="0" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </a-modal>
|
|
|
+ </div>
|
|
|
+ <!-- 打印 -->
|
|
|
+ <rollLinePrint @register="registerPrintModal" />
|
|
|
+ <!-- 炉次调根数 -->
|
|
|
+ <a-modal
|
|
|
+ v-model:open="openLuciModal"
|
|
|
+ :title="`调整炉次支数【${adjustCurHeat.heatNo}】`"
|
|
|
+ centered
|
|
|
+ width="1400px"
|
|
|
+ ok-text="确认"
|
|
|
+ :okButtonProps="{ loading: okLoading }"
|
|
|
+ cancel-text="取消"
|
|
|
+ @ok="confirmChangeHeat"
|
|
|
+ @cancel="
|
|
|
+ () => {
|
|
|
+ openLuciModal = false;
|
|
|
+ }
|
|
|
+ "
|
|
|
+ >
|
|
|
+ <div class="flex flex-col justify-center items-center change-heat" style="margin: 20px 0">
|
|
|
+ <div style="width: 100%; padding: 0 20px">
|
|
|
+ <a-radio-group button-style="solid" size="large">
|
|
|
+ <a-radio-button disabled>{{ adjustCurHeat.heatNo }}</a-radio-button>
|
|
|
+ </a-radio-group>
|
|
|
+ </div>
|
|
|
+ <BasicTable @register="registerShiftTableTable" :dataSource="[adjustCurHeat]" />
|
|
|
+ <div style="width: 100%; padding: 10px 20px 0">
|
|
|
+ <span style="padding: 0; color: #f50">调拨至:</span>
|
|
|
+ <a-radio-group v-model:value="adjustHeatNo" button-style="solid" @change="changeHeatNum" size="large">
|
|
|
+ <template v-for="item in currentShiftTableData">
|
|
|
+ <a-radio-button :value="item.heatNo" v-if="item.heatNo !== adjustCurHeat.heatNo">{{ item.heatNo }}</a-radio-button>
|
|
|
+ </template>
|
|
|
+ </a-radio-group>
|
|
|
+ </div>
|
|
|
+ <BasicTable style="min-height: 160px" @register="registerShiftTableTable" :dataSource="[{ ...adjustSelectedHeat, columnIndex: '' }]" />
|
|
|
+ <div class="flex items-center justify-end" style="width: 100%; margin-bottom: 20px; padding-right: 30px">
|
|
|
+ <div style="width: 72px">棒一:</div>
|
|
|
+ <div style="width: 100px">
|
|
|
+ <a-switch v-model:checked="isGotoRollOne" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="flex items-center justify-end" style="width: 100%; margin-bottom: 20px; padding-right: 30px">
|
|
|
+ <div style="width: 72px">调整支数:</div>
|
|
|
+ <div style="width: 100px">
|
|
|
+ <a-input-number size="large" v-if="isGotoRollOne" :defaultValue="1" :step="1" v-model:value="adjustHeatNum" :min="1" />
|
|
|
+ <a-input-number size="large" v-else :defaultValue="4" :step="4" v-model:value="adjustHeatNum" :min="4" @change="handleChangeNum" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </a-modal>
|
|
|
+
|
|
|
+ <!-- 热装堆垛选择定尺 -->
|
|
|
+ <a-modal
|
|
|
+ v-model:open="openHotSelectedModal"
|
|
|
+ title="选择定尺"
|
|
|
+ centered
|
|
|
+ width="400px"
|
|
|
+ ok-text="确认"
|
|
|
+ :okButtonProps="{ loading: okLoading }"
|
|
|
+ cancel-text="取消"
|
|
|
+ @ok="() => (opType === 'hot' ? doHotCharge(opRecord) : doStack(opRecord))"
|
|
|
+ @cancel="
|
|
|
+ () => {
|
|
|
+ openHotSelectedModal = false;
|
|
|
+ selectedSize = undefined;
|
|
|
+ opRecord = null;
|
|
|
+ opType = '';
|
|
|
+ }
|
|
|
+ "
|
|
|
+ >
|
|
|
+ <div class="flex justify-center items-center" style="margin: 20px 0">
|
|
|
+ <div>选择定尺:</div>
|
|
|
+ <a-select v-model:value="selectedSize" placeholder="请选择" allowClear style="width: 277px" :options="selectedSizeOptions"></a-select>
|
|
|
+ </div>
|
|
|
+ </a-modal>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script lang="ts" name="billetLiftingBill" setup>
|
|
|
+ import { BasicTable, TableAction, ActionItem } from '/@/components/Table';
|
|
|
+ import { useListPage } from '/@/hooks/system/useListPage';
|
|
|
+ import { getColumns, renderStrandCell } from '../operator.data';
|
|
|
+ import {
|
|
|
+ queryOriginalHeatInfoByCcmNo as queryHeatsActualsByCcmNo,
|
|
|
+ addHotCharge,
|
|
|
+ stackingUpAdd,
|
|
|
+ changeDefiningLength,
|
|
|
+ changeStrandLength,
|
|
|
+ addBilletBasic,
|
|
|
+ addHeatBillet,
|
|
|
+ queryChangeShortLength,
|
|
|
+ addRollOneBilletBasic,
|
|
|
+ adjustHeatBillet,
|
|
|
+ queryBilletRecordByCcmNo,
|
|
|
+ } from '../operator.api';
|
|
|
+ import { h, onMounted, onUnmounted, ref, watch } from 'vue';
|
|
|
+ import { mapTableTotalSummary } from '/@/utils/common/compUtils';
|
|
|
+ import { useMessage } from '/@/hooks/web/useMessage';
|
|
|
+ import JSearchSelect from '/@/components/Form/src/jeecg/components/JSearchSelect.vue';
|
|
|
+ import { useModal } from '/@/components/Modal';
|
|
|
+ import rollLinePrint from './rollLinePrint.vue';
|
|
|
+ import { getDictItems } from '/@/utils/dict/JDictSelectUtil';
|
|
|
+ import dayjs from 'dayjs';
|
|
|
+
|
|
|
+ // 注册打印modal
|
|
|
+ const [registerPrintModal, { openModal: openPrintModal }] = useModal();
|
|
|
+
|
|
|
+ const { createMessage, createConfirm } = useMessage();
|
|
|
+
|
|
|
+ const emits = defineEmits(['changeLengthSuccess']);
|
|
|
+
|
|
|
+ const props = defineProps({
|
|
|
+ ccmNo: {
|
|
|
+ type: String,
|
|
|
+ default: '5',
|
|
|
+ },
|
|
|
+ carRef: {
|
|
|
+ type: Object,
|
|
|
+ default: () => {
|
|
|
+ return {};
|
|
|
+ },
|
|
|
+ },
|
|
|
+ queryType: {
|
|
|
+ type: String,
|
|
|
+ default: '1',
|
|
|
+ },
|
|
|
+ changeShiftId: {
|
|
|
+ type: String,
|
|
|
+ default: '',
|
|
|
+ },
|
|
|
+ showAction: {
|
|
|
+ type: Boolean,
|
|
|
+ default: true,
|
|
|
+ },
|
|
|
+ canResize: {
|
|
|
+ type: Boolean,
|
|
|
+ default: true,
|
|
|
+ },
|
|
|
+ lengthList: {
|
|
|
+ type: String,
|
|
|
+ default: '',
|
|
|
+ },
|
|
|
+ curShiftInfo: {
|
|
|
+ type: Object,
|
|
|
+ default: () => ({
|
|
|
+ shift: '',
|
|
|
+ shiftGroup: '',
|
|
|
+ }),
|
|
|
+ },
|
|
|
+ cuttolength: {
|
|
|
+ // 1 手动定尺 2 自动定尺
|
|
|
+ type: [Number, String],
|
|
|
+ default: 2,
|
|
|
+ },
|
|
|
+ });
|
|
|
+
|
|
|
+ const otherShiftTableData = ref<any[]>([]);
|
|
|
+ const currentShiftTableData = ref<any[]>([]);
|
|
|
+
|
|
|
+ // 流修改定尺
|
|
|
+ const openSizeModal = ref(false); // 打开定尺modal
|
|
|
+ const newSizeNum = ref(''); // 新定尺
|
|
|
+ const okLoading = ref(false); // 确定按钮loading
|
|
|
+ const heatInfo = ref<any>({}); // 炉信息
|
|
|
+ const strandNum = ref<number>(); // 流号
|
|
|
+ const orgSizeNum = ref<number>(); // 原定尺
|
|
|
+ const isAllHeat = ref<boolean>(false); // 是否是整炉添加
|
|
|
+ const isRollOne = ref<string>('default'); // 是否是去棒一,不是整炉添加时有效
|
|
|
+ const cuttolengthStatus = ref<string | number>(props.cuttolength); // 1 手动定尺 2 自动定尺
|
|
|
+
|
|
|
+ // 调整炉次支数
|
|
|
+ const openLuciModal = ref(false);
|
|
|
+ const columns = getColumns({
|
|
|
+ clickCb: ({ record, size, strandNo }) => {
|
|
|
+ return;
|
|
|
+ newSizeNum.value = size;
|
|
|
+ orgSizeNum.value = size;
|
|
|
+ openSizeModal.value = true;
|
|
|
+ heatInfo.value = record;
|
|
|
+ strandNum.value = strandNo;
|
|
|
+ },
|
|
|
+ openCompensateModal: (record) => {
|
|
|
+ return;
|
|
|
+ openCompensateModal.value = true;
|
|
|
+ strandFormInfo.value = {
|
|
|
+ oneStrandNo: {
|
|
|
+ sum: 0,
|
|
|
+ size: strandNoSelectedOrg.value['1'],
|
|
|
+ sizeName: 'oneLength',
|
|
|
+ sumStatus: '',
|
|
|
+ sizeStatus: '',
|
|
|
+ no: 1,
|
|
|
+ hasOne: true,
|
|
|
+ rollClubOne: 0,
|
|
|
+ },
|
|
|
+ twoStrandNo: {
|
|
|
+ sum: 0,
|
|
|
+ size: strandNoSelectedOrg.value['2'],
|
|
|
+ sizeName: 'twoLength',
|
|
|
+ sumStatus: '',
|
|
|
+ sizeStatus: '',
|
|
|
+ no: 2,
|
|
|
+ hasOne: true,
|
|
|
+ rollClubOne: 0,
|
|
|
+ },
|
|
|
+ threeStrandNo: {
|
|
|
+ sum: 0,
|
|
|
+ size: strandNoSelectedOrg.value['3'],
|
|
|
+ sizeName: 'threeLength',
|
|
|
+ sumStatus: '',
|
|
|
+ sizeStatus: '',
|
|
|
+ no: 3,
|
|
|
+ hasOne: true,
|
|
|
+ rollClubOne: 0,
|
|
|
+ },
|
|
|
+ fourStrandNo: {
|
|
|
+ sum: 0,
|
|
|
+ size: strandNoSelectedOrg.value['4'],
|
|
|
+ sizeName: 'fourLength',
|
|
|
+ sumStatus: '',
|
|
|
+ sizeStatus: '',
|
|
|
+ no: 4,
|
|
|
+ hasOne: true,
|
|
|
+ rollClubOne: 0,
|
|
|
+ },
|
|
|
+ fiveStrandNo: {
|
|
|
+ sum: 0,
|
|
|
+ size: strandNoSelectedOrg.value['5'],
|
|
|
+ sizeName: 'fiveLength',
|
|
|
+ sumStatus: '',
|
|
|
+ sizeStatus: '',
|
|
|
+ no: 5,
|
|
|
+ hasOne: true,
|
|
|
+ rollClubOne: 0,
|
|
|
+ },
|
|
|
+ sixStrandNo: {
|
|
|
+ sum: 0,
|
|
|
+ size: strandNoSelectedOrg.value['6'],
|
|
|
+ sizeName: 'sixLength',
|
|
|
+ sumStatus: '',
|
|
|
+ sizeStatus: '',
|
|
|
+ no: 6,
|
|
|
+ hasOne: true,
|
|
|
+ rollClubOne: 0,
|
|
|
+ },
|
|
|
+ sevenStrandNo: { sum: 0, size: strandNoSelectedOrg.value['7'], sizeName: 'sevenLength', sumStatus: '', sizeStatus: '', no: 7 },
|
|
|
+ eightStrandNo: { sum: 0, size: strandNoSelectedOrg.value['8'], sizeName: 'eightLength', sumStatus: '', sizeStatus: '', no: 8 },
|
|
|
+ };
|
|
|
+ if (record.dataIndex && record.dataIndex === 'totalInfo') {
|
|
|
+ heatInfo.value = {};
|
|
|
+ isAllHeat.value = true;
|
|
|
+ newHeatNo.value = '';
|
|
|
+ } else {
|
|
|
+ heatInfo.value = record;
|
|
|
+ isAllHeat.value = false;
|
|
|
+ }
|
|
|
+ isRollOne.value = 'default';
|
|
|
+ },
|
|
|
+ heatNoClick: (record) => {
|
|
|
+ return;
|
|
|
+ openLuciModal.value = true;
|
|
|
+ adjustCurHeat.value = record;
|
|
|
+ adjustHeatNo.value = '';
|
|
|
+ adjustHeatNum.value = 4;
|
|
|
+ isGotoRollOne.value = false;
|
|
|
+ adjustSelectedHeat.value = {};
|
|
|
+ okLoading.value = false;
|
|
|
+ },
|
|
|
+ });
|
|
|
+
|
|
|
+ // 调整炉次支数
|
|
|
+ const adjustCurHeat = ref({});
|
|
|
+ const adjustHeatNo = ref('');
|
|
|
+ const adjustSelectedHeat = ref<any>({});
|
|
|
+ const isGotoRollOne = ref(false); // 是否去棒一
|
|
|
+ const adjustHeatNum = ref(); // 需要调整的支数
|
|
|
+ const confirmChangeHeat = async () => {
|
|
|
+ try {
|
|
|
+ if (!adjustSelectedHeat.value.heatNo) {
|
|
|
+ createMessage.error('请选择要调整的炉次!');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (!adjustHeatNum.value) {
|
|
|
+ createMessage.error('请输入要调整的支数!');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!isGotoRollOne.value && adjustHeatNum.value % 4 !== 0) {
|
|
|
+ createMessage.error('调整支数请输入4的倍数!');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const { totalInfo } = adjustSelectedHeat.value;
|
|
|
+ if (totalInfo) {
|
|
|
+ const obj = JSON.parse(totalInfo);
|
|
|
+ if (obj.totalCount < adjustHeatNum.value) {
|
|
|
+ createMessage.error('支数不能大于总支数!');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const params = {
|
|
|
+ ccmNo: props.ccmNo,
|
|
|
+ originalHeatNo: adjustCurHeat.value.heatNo,
|
|
|
+ changeHeatNo: adjustSelectedHeat.value.heatNo,
|
|
|
+ number: adjustHeatNum.value,
|
|
|
+ changeType: isGotoRollOne.value ? 1 : 2,
|
|
|
+ };
|
|
|
+ okLoading.value = true;
|
|
|
+ await adjustHeatBillet(params);
|
|
|
+
|
|
|
+ refresh();
|
|
|
+ okLoading.value = false;
|
|
|
+ openLuciModal.value = false;
|
|
|
+ } catch (error) {
|
|
|
+ okLoading.value = false;
|
|
|
+ openLuciModal.value = false;
|
|
|
+ }
|
|
|
+ };
|
|
|
+ const changeHeatNum = (v) => {
|
|
|
+ if (v.target.value) {
|
|
|
+ adjustSelectedHeat.value = currentShiftTableData.value.find((item) => item.heatNo === v.target.value);
|
|
|
+ } else {
|
|
|
+ adjustSelectedHeat.value = {};
|
|
|
+ }
|
|
|
+ };
|
|
|
+ // 不去棒一必须是4的倍数
|
|
|
+ const handleChangeNum = async (value) => {
|
|
|
+ if (!isGotoRollOne.value) {
|
|
|
+ if (value % 4 !== 0) {
|
|
|
+ adjustHeatNum.value = value - (value % 4);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // 补录钢坯
|
|
|
+ const openCompensateModal = ref(false);
|
|
|
+ // 补录钢坯信息 sum 数量 size 定尺 status 状态 no 流号
|
|
|
+ const strandFormInfo = ref<any>({
|
|
|
+ oneStrandNo: { sum: 0, size: undefined, sizeName: 'oneLength', sumStatus: '', sizeStatus: '', no: 1, hasOne: true, rollClubOne: 0 },
|
|
|
+ twoStrandNo: { sum: 0, size: undefined, sizeName: 'twoLength', sumStatus: '', sizeStatus: '', no: 2, hasOne: true, rollClubOne: 0 },
|
|
|
+ threeStrandNo: { sum: 0, size: undefined, sizeName: 'threeLength', sumStatus: '', sizeStatus: '', no: 3, hasOne: true, rollClubOne: 0 },
|
|
|
+ fourStrandNo: { sum: 0, size: undefined, sizeName: 'fourLength', sumStatus: '', sizeStatus: '', no: 4, hasOne: true, rollClubOne: 0 },
|
|
|
+ fiveStrandNo: { sum: 0, size: undefined, sizeName: 'fiveLength', sumStatus: '', sizeStatus: '', no: 5, hasOne: true, rollClubOne: 0 },
|
|
|
+ sixStrandNo: { sum: 0, size: undefined, sizeName: 'sixLength', sumStatus: '', sizeStatus: '', no: 6, hasOne: true, rollClubOne: 0 },
|
|
|
+ sevenStrandNo: { sum: 0, size: undefined, sizeName: 'sevenLength', sumStatus: '', sizeStatus: '', no: 7 },
|
|
|
+ eightStrandNo: { sum: 0, size: undefined, sizeName: 'eightLength', sumStatus: '', sizeStatus: '', no: 8 },
|
|
|
+ });
|
|
|
+
|
|
|
+ const closeCompensateModal = () => {
|
|
|
+ openCompensateModal.value = false;
|
|
|
+ };
|
|
|
+ // 格式化定尺
|
|
|
+ const formatDefineSize = (num, jsonStr) => {
|
|
|
+ if (!num) {
|
|
|
+ return h('div', { style: { color: '#f50' } }, 0);
|
|
|
+ }
|
|
|
+ return renderStrandCell({ num, lengthJsonStr: jsonStr });
|
|
|
+ };
|
|
|
+
|
|
|
+ // 验证状态
|
|
|
+ const handlerChange = (e, type, k?: string) => {
|
|
|
+ // newHeat, sizeStatus, sumStatus
|
|
|
+ if (type === 'newHeat') {
|
|
|
+ newHeatNoStatus.value = e && e.target && e.target.value.trim() ? '' : 'error';
|
|
|
+ }
|
|
|
+ if (type === 'sumStatus' && k) {
|
|
|
+ strandFormInfo.value[k].sumStatus = e >= 0 ? '' : 'error';
|
|
|
+ }
|
|
|
+ if (type === 'sizeStatus' && k) {
|
|
|
+ strandFormInfo.value[k].sizeStatus = e ? '' : 'error';
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // 新炉号
|
|
|
+ const newHeatNo = ref('');
|
|
|
+ const newHeatNoStatus = ref('');
|
|
|
+ // 确认添加定尺
|
|
|
+ const confirmCompensate = async () => {
|
|
|
+ try {
|
|
|
+ // 整炉添加钢坯
|
|
|
+ if (isAllHeat.value) {
|
|
|
+ if (!newHeatNo.value) {
|
|
|
+ newHeatNoStatus.value = 'error';
|
|
|
+ createMessage.error('整炉补录钢坯, 需输入新炉号');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取所有流输入的总支数
|
|
|
+ const changeStrandNums = Object.keys(strandFormInfo.value).filter((item) => strandFormInfo.value[item].sum);
|
|
|
+ if (changeStrandNums.length === 0) {
|
|
|
+ createMessage.error('请输入要增加的根数');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 判断是否输入了定尺
|
|
|
+ const noInputSize = changeStrandNums
|
|
|
+ .filter((item) => !strandFormInfo.value[item].size)
|
|
|
+ .map((item) => {
|
|
|
+ strandFormInfo.value[item].sizeStatus = 'error';
|
|
|
+ return strandFormInfo.value[item].no + '流';
|
|
|
+ });
|
|
|
+ if (noInputSize.length > 0) {
|
|
|
+ createMessage.error(`请选择${noInputSize.join(' , ')}的定尺`);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 整炉补录,判断支数先减去棒一支数后是否是4的倍数
|
|
|
+ const allNums = changeStrandNums.reduce((pre, cur) => pre + Number(strandFormInfo.value[cur].sum), 0);
|
|
|
+ const rollOneList = Object.keys(strandFormInfo.value).filter((item) => strandFormInfo.value[item].rollClubOne);
|
|
|
+ const rollOneNums = rollOneList.reduce((pre, cur) => pre + Number(strandFormInfo.value[cur].rollClubOne), 0);
|
|
|
+
|
|
|
+ let rollClubOneListParams: any[] = [];
|
|
|
+ if (isAllHeat.value && rollOneNums) {
|
|
|
+ if ((allNums - rollOneNums) % 4 !== 0) {
|
|
|
+ createMessage.error('减去棒一支数,剩下的钢坯支数必须为4的倍数');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ rollClubOneListParams = rollOneList.map((item) => {
|
|
|
+ return {
|
|
|
+ strandNo: strandFormInfo.value[item].no,
|
|
|
+ addSum: Number(strandFormInfo.value[item].rollClubOne),
|
|
|
+ length: Number(strandFormInfo.value[item].size),
|
|
|
+ };
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果是补录棒一,就把数据放到补录棒一的列表中
|
|
|
+ if (isRollOne.value === 'rollOne') {
|
|
|
+ rollClubOneListParams = Object.keys(strandFormInfo.value)
|
|
|
+ .filter((item) => strandFormInfo.value[item].sum)
|
|
|
+ .map((item: any) => {
|
|
|
+ return {
|
|
|
+ strandNo: strandFormInfo.value[item].no,
|
|
|
+ addSum: Number(strandFormInfo.value[item].sum),
|
|
|
+ length: Number(strandFormInfo.value[item].size),
|
|
|
+ };
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ okLoading.value = true;
|
|
|
+ let params = {
|
|
|
+ ccmNo: props.ccmNo,
|
|
|
+ heatNo: isAllHeat.value ? newHeatNo.value : heatInfo.value.heatNo,
|
|
|
+ shift: heatInfo.value.shift || props.curShiftInfo.shift,
|
|
|
+ shiftGroup: heatInfo.value.shiftGroup || props.curShiftInfo.shiftGroup,
|
|
|
+ addType: isAllHeat.value ? 1 : 2,
|
|
|
+ rollClubOneList: rollClubOneListParams,
|
|
|
+ addCount: allNums,
|
|
|
+ };
|
|
|
+
|
|
|
+ changeStrandNums.forEach((item) => {
|
|
|
+ if (strandFormInfo.value[item].size) {
|
|
|
+ params = Object.assign(params, {
|
|
|
+ [item + 'Sum']: strandFormInfo.value[item].sum,
|
|
|
+ [strandFormInfo.value[item].sizeName]: strandFormInfo.value[item].size,
|
|
|
+ [item]: strandFormInfo.value[item].no,
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ const fetchFn = isAllHeat.value ? addHeatBillet : isRollOne.value === 'rollOne' ? addRollOneBilletBasic : addBilletBasic;
|
|
|
+ await fetchFn(params);
|
|
|
+ refresh();
|
|
|
+ closeCompensateModal();
|
|
|
+ okLoading.value = false;
|
|
|
+ } catch (error) {
|
|
|
+ okLoading.value = false;
|
|
|
+ console.log(error);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const switchSteelOne = async () => {
|
|
|
+ try {
|
|
|
+ if (newSizeNum.value == '') {
|
|
|
+ createMessage.error('请选择牌号');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ okLoading.value = true;
|
|
|
+ await changeStrandLength({
|
|
|
+ ccmNo: props.ccmNo,
|
|
|
+ heatNo: heatInfo.value.heatNo,
|
|
|
+ originalLength: Number(orgSizeNum.value),
|
|
|
+ length: Number(newSizeNum.value),
|
|
|
+ strandNo: strandNum.value,
|
|
|
+ });
|
|
|
+
|
|
|
+ getTableList();
|
|
|
+ openSizeModal.value = false;
|
|
|
+ newSizeNum.value = '';
|
|
|
+ okLoading.value = false;
|
|
|
+ } catch (error) {
|
|
|
+ okLoading.value = false;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // 获取短尺
|
|
|
+ const shortSizeOptions = ref([]);
|
|
|
+ const getShortRuler = async () => {
|
|
|
+ getDictItems('lg_dcgg', {}).then((res) => {
|
|
|
+ shortSizeOptions.value = res.filter((item) => Number(item.value) < 10000);
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ const getTableList = async () => {
|
|
|
+ try {
|
|
|
+ setLoading(true);
|
|
|
+ const res = await queryHeatsActualsByCcmNo({ ccmNo: props.ccmNo, queryType: props.queryType, changeShiftId: props.changeShiftId });
|
|
|
+ const { billetOriginalProductRecordList } = res;
|
|
|
+ const data = billetOriginalProductRecordList
|
|
|
+ .sort((a, b) => {
|
|
|
+ return dayjs(a.createTime).isBefore(dayjs(b.createTime)) ? -1 : 1;
|
|
|
+ })
|
|
|
+ .map((item) => {
|
|
|
+ const { rollClubOneDetails, hotChargeLength, stackLength, lengthDetails } = item;
|
|
|
+
|
|
|
+ // 棒一
|
|
|
+ let directRolling = {};
|
|
|
+ if (rollClubOneDetails) {
|
|
|
+ const oneObj = JSON.parse(rollClubOneDetails);
|
|
|
+ directRolling = {
|
|
|
+ directRollingTotalCount: oneObj.directRollingTotalCount,
|
|
|
+ directRollingTotalWeight: oneObj.directRollingTotalWeight,
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ // 热装
|
|
|
+ let hotZ: any = {};
|
|
|
+ if (hotChargeLength) {
|
|
|
+ const hotObj = JSON.parse(hotChargeLength);
|
|
|
+ hotObj.forEach((item) => {
|
|
|
+ if (!hotZ.hotChargeTotalCount) {
|
|
|
+ hotZ.hotChargeTotalCount = item.totalCount;
|
|
|
+ } else {
|
|
|
+ hotZ.hotChargeTotalCount += item.totalCount;
|
|
|
+ }
|
|
|
+ if (!hotZ.hotChargeTotalWeight) {
|
|
|
+ hotZ.hotChargeTotalWeight = item.totalWeight;
|
|
|
+ } else {
|
|
|
+ hotZ.hotChargeTotalWeight += item.totalWeight;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // 堆垛
|
|
|
+ let stack: any = {};
|
|
|
+ if (stackLength) {
|
|
|
+ const stackObj = JSON.parse(stackLength);
|
|
|
+ stackObj.forEach((item) => {
|
|
|
+ if (!stack.stackingTotalCount) {
|
|
|
+ stack.stackingTotalCount = item.stackingCount;
|
|
|
+ } else {
|
|
|
+ stack.stackingTotalCount += item.stackingCount;
|
|
|
+ }
|
|
|
+ if (!stack.stackingTotalWeight) {
|
|
|
+ stack.stackingTotalWeight = item.stackingWeight;
|
|
|
+ } else {
|
|
|
+ stack.stackingTotalWeight += item.stackingWeight;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // 定尺
|
|
|
+ let sizeObj = {};
|
|
|
+ if (lengthDetails) {
|
|
|
+ const obj = JSON.parse(lengthDetails);
|
|
|
+ Object.keys(obj).forEach((key) => {
|
|
|
+ sizeObj[key] = { lengthTotalCount: obj[key] };
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ brandNum: item.grade,
|
|
|
+ oneStrandNo: item.oneStrandSum,
|
|
|
+ twoStrandNo: item.twoStrandSum,
|
|
|
+ threeStrandNo: item.threeStrandSum,
|
|
|
+ fourStrandNo: item.fourStrandSum,
|
|
|
+ fiveStrandNo: item.fiveStrandSum,
|
|
|
+ sixStrandNo: item.sixStrandSum,
|
|
|
+ sevenStrandNo: item.sevenStrandSum,
|
|
|
+ eightStrandNo: item.eightStrandSum,
|
|
|
+ directRolling: JSON.stringify(directRolling),
|
|
|
+ hotCharge: hotChargeLength ? JSON.stringify(hotZ) : undefined,
|
|
|
+ stacking: JSON.stringify(stack),
|
|
|
+ length: JSON.stringify(sizeObj),
|
|
|
+ totalInfo: JSON.stringify({ totalCount: item.amount, totalWeight: null }),
|
|
|
+ };
|
|
|
+ });
|
|
|
+
|
|
|
+ // 处理数据
|
|
|
+ let cunShift: any[] = [],
|
|
|
+ otherShift: any[] = [];
|
|
|
+ data.forEach((item) => {
|
|
|
+ if (!props.curShiftInfo.shift && !props.curShiftInfo.shiftGroup) {
|
|
|
+ cunShift.push(item);
|
|
|
+ } else {
|
|
|
+ if (item.shift === props.curShiftInfo.shift && item.shiftGroup === props.curShiftInfo.shiftGroup) {
|
|
|
+ cunShift.push(item);
|
|
|
+ } else {
|
|
|
+ otherShift.push(item);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ const length = cunShift.length;
|
|
|
+ otherShiftTableData.value = otherShift.map((item) => {
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ columnIndex: '#',
|
|
|
+ };
|
|
|
+ });
|
|
|
+
|
|
|
+ currentShiftTableData.value = cunShift.map((item, index) => {
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ columnIndex: length - index,
|
|
|
+ };
|
|
|
+ });
|
|
|
+
|
|
|
+ setTableData(currentShiftTableData.value);
|
|
|
+ } catch (error) {
|
|
|
+ console.log('error', error);
|
|
|
+ } finally {
|
|
|
+ setLoading(false);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ //注册table数据
|
|
|
+ const { tableContext } = useListPage({
|
|
|
+ tableProps: {
|
|
|
+ // api: queryHeatsActualsByCcmNo,
|
|
|
+ beforeFetch: (params) => {
|
|
|
+ return Object.assign(params, { ccmNo: props.ccmNo, queryType: props.queryType, changeShiftId: props.changeShiftId });
|
|
|
+ },
|
|
|
+ afterFetch: (orgData) => {
|
|
|
+ return;
|
|
|
+ let cunShift: any[] = [],
|
|
|
+ otherShift: any[] = [];
|
|
|
+ const data = orgData.sort((a, b) => {
|
|
|
+ return dayjs(a.createTime).isBefore(dayjs(b.createTime)) ? -1 : 1;
|
|
|
+ });
|
|
|
+ data.forEach((item) => {
|
|
|
+ if (!props.curShiftInfo.shift && !props.curShiftInfo.shiftGroup) {
|
|
|
+ cunShift.push(item);
|
|
|
+ } else {
|
|
|
+ if (item.shift === props.curShiftInfo.shift && item.shiftGroup === props.curShiftInfo.shiftGroup) {
|
|
|
+ cunShift.push(item);
|
|
|
+ } else {
|
|
|
+ otherShift.push(item);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ const length = cunShift.length;
|
|
|
+ otherShiftTableData.value = otherShift.map((item) => {
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ columnIndex: '#',
|
|
|
+ };
|
|
|
+ });
|
|
|
+
|
|
|
+ currentShiftTableData.value = cunShift;
|
|
|
+
|
|
|
+ return cunShift.map((item, index) => {
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ columnIndex: length - index,
|
|
|
+ };
|
|
|
+ });
|
|
|
+ },
|
|
|
+ columns,
|
|
|
+ showIndexColumn: false,
|
|
|
+ canResize: false,
|
|
|
+ striped: true,
|
|
|
+ showTableSetting: false,
|
|
|
+ pagination: false,
|
|
|
+ actionColumn: {
|
|
|
+ width: 60,
|
|
|
+ title: '操作',
|
|
|
+ fixed: 'right',
|
|
|
+ },
|
|
|
+ showActionColumn: props.showAction,
|
|
|
+ showSummary: true,
|
|
|
+ summaryFunc: onSummary,
|
|
|
+ },
|
|
|
+ });
|
|
|
+
|
|
|
+ // 调整炉次时展示的数据
|
|
|
+ const { tableContext: otherShiftTableContext } = useListPage({
|
|
|
+ tableProps: {
|
|
|
+ columns: getColumns({ clickCb: () => {} }),
|
|
|
+ showIndexColumn: false,
|
|
|
+ canResize: false,
|
|
|
+ striped: true,
|
|
|
+ showTableSetting: false,
|
|
|
+ pagination: false,
|
|
|
+ showActionColumn: false,
|
|
|
+ },
|
|
|
+ });
|
|
|
+
|
|
|
+ const [registerShiftTableTable] = otherShiftTableContext;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算合计
|
|
|
+ * @param tableData
|
|
|
+ */
|
|
|
+ const strandArr = ['oneStrandNo', 'twoStrandNo', 'threeStrandNo', 'fourStrandNo', 'fiveStrandNo', 'sixStrandNo', 'sevenStrandNo', 'eightStrandNo'];
|
|
|
+ const lengthArr = ['oneLength', 'twoLength', 'threeLength', 'fourLength', 'fiveLength', 'sixLength', 'sevenLength', 'eightLength'];
|
|
|
+ function onSummary(tableData: Recordable[]) {
|
|
|
+ const newTableData = tableData.filter((ele) => ele.shift === props.curShiftInfo.shift && ele.shiftGroup === props.curShiftInfo.shiftGroup);
|
|
|
+ // 可用工具方法自动计算合计
|
|
|
+ const totals = mapTableTotalSummary(newTableData, strandArr);
|
|
|
+ // 直轧,热装,堆垛,总计
|
|
|
+ let directRollingTotalCount = 0,
|
|
|
+ directRollingTotalWeight = 0,
|
|
|
+ hotChargeTotalCount = 0,
|
|
|
+ hotChargeTotalWeight = 0,
|
|
|
+ stackingTotalCount = 0,
|
|
|
+ stackingTotalWeight = 0,
|
|
|
+ totalCount = 0,
|
|
|
+ totalWeight = 0;
|
|
|
+ try {
|
|
|
+ newTableData.forEach((item) => {
|
|
|
+ const { hotSend, directRolling, hotCharge, stacking, totalInfo } = item;
|
|
|
+ // 直轧
|
|
|
+ if (hotSend) {
|
|
|
+ const obj = JSON.parse(hotSend);
|
|
|
+ directRollingTotalCount += Number(obj.hotSendTotalCount);
|
|
|
+ directRollingTotalWeight += parseFloat(obj.hotSendTotalWeight);
|
|
|
+ }
|
|
|
+ if (directRolling) {
|
|
|
+ const obj = JSON.parse(directRolling);
|
|
|
+ directRollingTotalCount += Number(obj.directRollingTotalCount);
|
|
|
+ directRollingTotalWeight += parseFloat(obj.directRollingTotalWeight);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 热装
|
|
|
+ if (hotCharge) {
|
|
|
+ const obj = JSON.parse(hotCharge);
|
|
|
+ hotChargeTotalCount += Number(obj.hotChargeTotalCount);
|
|
|
+ hotChargeTotalWeight += parseFloat(obj.hotChargeTotalWeight);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 堆垛
|
|
|
+ if (stacking) {
|
|
|
+ const obj = JSON.parse(stacking);
|
|
|
+ stackingTotalCount += Number(obj.stackingTotalCount);
|
|
|
+ stackingTotalWeight += parseFloat(obj.stackingTotalWeight);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 总计
|
|
|
+ if (totalInfo) {
|
|
|
+ const obj = JSON.parse(totalInfo);
|
|
|
+ totalCount += Number(obj.totalCount);
|
|
|
+ totalWeight += parseFloat(obj.totalWeight);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } catch (error) {}
|
|
|
+
|
|
|
+ return [
|
|
|
+ {
|
|
|
+ ...totals,
|
|
|
+ directRolling: JSON.stringify({ directRollingTotalCount, directRollingTotalWeight: directRollingTotalWeight }),
|
|
|
+ hotCharge: JSON.stringify({ hotChargeTotalCount, hotChargeTotalWeight: hotChargeTotalWeight }),
|
|
|
+ stacking: JSON.stringify({ stackingTotalCount, stackingTotalWeight: stackingTotalWeight }),
|
|
|
+ totalInfo: JSON.stringify({ totalCount, totalWeight: totalWeight }),
|
|
|
+ columnIndex: '合',
|
|
|
+ },
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ const [registerTable, { setLoading, setTableData }] = tableContext;
|
|
|
+
|
|
|
+ // 额外的表格
|
|
|
+ const { tableContext: extraTableContext } = useListPage({
|
|
|
+ tableProps: {
|
|
|
+ columns,
|
|
|
+ showIndexColumn: false,
|
|
|
+ canResize: false,
|
|
|
+ striped: true,
|
|
|
+ showTableSetting: false,
|
|
|
+ pagination: false,
|
|
|
+ actionColumn: {
|
|
|
+ width: 60,
|
|
|
+ title: '操作',
|
|
|
+ fixed: 'right',
|
|
|
+ },
|
|
|
+ showActionColumn: props.showAction,
|
|
|
+ showHeader: false,
|
|
|
+ },
|
|
|
+ });
|
|
|
+
|
|
|
+ const [registerExtraTable] = extraTableContext;
|
|
|
+
|
|
|
+ const useTimeoutFn = (fn: TimerHandler, delay: number) => {
|
|
|
+ let timer: number | undefined = undefined;
|
|
|
+
|
|
|
+ const start = () => {
|
|
|
+ stop();
|
|
|
+ timer = setTimeout(fn, delay);
|
|
|
+ };
|
|
|
+
|
|
|
+ const stop = () => {
|
|
|
+ if (timer) {
|
|
|
+ clearTimeout(timer);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ return { start, stop };
|
|
|
+ };
|
|
|
+
|
|
|
+ const { start, stop } = useTimeoutFn(async () => {
|
|
|
+ if (!props.changeShiftId) {
|
|
|
+ // await queryBilletRecordByCcmNo({ ccmNo: props.ccmNo, queryType: 1 });
|
|
|
+ // await getTableList();
|
|
|
+ // start();
|
|
|
+ }
|
|
|
+ }, 10000);
|
|
|
+
|
|
|
+ onMounted(() => {
|
|
|
+ getTableList();
|
|
|
+ start();
|
|
|
+ // 获取短尺
|
|
|
+ getShortRuler();
|
|
|
+ });
|
|
|
+
|
|
|
+ onUnmounted(() => {
|
|
|
+ stop();
|
|
|
+ });
|
|
|
+
|
|
|
+ // 获取所有的定尺
|
|
|
+ const openHotSelectedModal = ref(false);
|
|
|
+ const selectedSize = ref(undefined);
|
|
|
+ const selectedSizeOptions = ref([]);
|
|
|
+ const opType = ref('');
|
|
|
+ const opRecord = ref(null);
|
|
|
+ const getSize = (record, type) => {
|
|
|
+ opType.value = type;
|
|
|
+ opRecord.value = record;
|
|
|
+ const { length } = record;
|
|
|
+ let lengthArr: any = [];
|
|
|
+ if (length) {
|
|
|
+ const obj = JSON.parse(length);
|
|
|
+
|
|
|
+ lengthArr = Object.keys(obj).map((key) => ({
|
|
|
+ label: key,
|
|
|
+ value: key,
|
|
|
+ }));
|
|
|
+ }
|
|
|
+
|
|
|
+ selectedSize.value = undefined;
|
|
|
+ if (lengthArr.length > 0) {
|
|
|
+ openHotSelectedModal.value = true;
|
|
|
+ selectedSizeOptions.value = lengthArr;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (type === 'hot') {
|
|
|
+ doHotCharge(record);
|
|
|
+ } else {
|
|
|
+ doStack(record);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ // 热装
|
|
|
+ const doHotCharge = async (record) => {
|
|
|
+ try {
|
|
|
+ const valiDesRes = props.carRef && props.carRef.valirDest ? props.carRef.valirDest() : true;
|
|
|
+ if (!valiDesRes) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const chargeInfo = props.carRef && props.carRef.getCurrentCar ? props.carRef.getCurrentCar() : {};
|
|
|
+ if (!chargeInfo.id) {
|
|
|
+ createMessage.error('获取车辆信息失败,请刷新页面重试~');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const params = {
|
|
|
+ ccmNo: props.ccmNo,
|
|
|
+ heatNo: record.heatNo,
|
|
|
+ storageId: chargeInfo.id,
|
|
|
+ shift: record.shift,
|
|
|
+ shiftGroup: record.shiftGroup,
|
|
|
+ length: !selectedSize.value ? 0 : Number(selectedSize.value),
|
|
|
+ };
|
|
|
+
|
|
|
+ setLoading(true);
|
|
|
+ await addHotCharge(params);
|
|
|
+ refresh();
|
|
|
+ props.carRef.refreshCarList && props.carRef.refreshCarList();
|
|
|
+ } catch (error) {
|
|
|
+ } finally {
|
|
|
+ setLoading(false);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // 起垛
|
|
|
+ const doStack = async (record) => {
|
|
|
+ try {
|
|
|
+ const selectStackList = props.carRef && props.carRef.getSelectedStack ? props.carRef.getSelectedStack() : [];
|
|
|
+ const emptyAddress = selectStackList.filter((item) => !item.billetNos);
|
|
|
+ if (emptyAddress.length === 0) {
|
|
|
+ createMessage.error('请选择起垛位置!');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 堆垛信息
|
|
|
+ const stackInfo = props.carRef && props.carRef.getStackInfo ? props.carRef.getStackInfo() : {};
|
|
|
+ if (!stackInfo.id) {
|
|
|
+ createMessage.error('获取堆垛信息失败,请刷新页面重试~');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ let layerObj = {},
|
|
|
+ sortedStackList: any[] = [];
|
|
|
+ emptyAddress.forEach((item) => {
|
|
|
+ if (!layerObj[item.layer]) layerObj[item.layer] = [];
|
|
|
+ layerObj[item.layer].push(item);
|
|
|
+ });
|
|
|
+
|
|
|
+ // 根据层数和位置排序
|
|
|
+ Object.keys(layerObj)
|
|
|
+ .sort((a, b) => Number(a) - Number(b))
|
|
|
+ .forEach((item) => {
|
|
|
+ layerObj[item].sort((j, k) => Number(j.address) - Number(k.address)).forEach((item) => sortedStackList.push(item));
|
|
|
+ });
|
|
|
+
|
|
|
+ const params = {
|
|
|
+ ccmNo: props.ccmNo,
|
|
|
+ heatNo: record.heatNo,
|
|
|
+ billetHotsendTypeConfigId: stackInfo.id,
|
|
|
+ stackingAndLoadingVehiclesIds: sortedStackList.map((item) => item.id),
|
|
|
+ shift: record.shift,
|
|
|
+ shiftGroup: record.shiftGroup,
|
|
|
+ length: !selectedSize.value ? 0 : Number(selectedSize.value),
|
|
|
+ };
|
|
|
+
|
|
|
+ setLoading(true);
|
|
|
+ await stackingUpAdd(params);
|
|
|
+ refresh();
|
|
|
+ props.carRef.refreshCarList && props.carRef.refreshCarList();
|
|
|
+ } catch (error) {
|
|
|
+ } finally {
|
|
|
+ setLoading(false);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // 变更定尺
|
|
|
+ const strandNoSelectedOrg = ref({
|
|
|
+ '1': undefined,
|
|
|
+ '2': undefined,
|
|
|
+ '3': undefined,
|
|
|
+ '4': undefined,
|
|
|
+ '5': undefined,
|
|
|
+ '6': undefined,
|
|
|
+ '7': undefined,
|
|
|
+ '8': undefined,
|
|
|
+ });
|
|
|
+ const strandNoSelected = ref({
|
|
|
+ '1': undefined,
|
|
|
+ '2': undefined,
|
|
|
+ '3': undefined,
|
|
|
+ '4': undefined,
|
|
|
+ '5': undefined,
|
|
|
+ '6': undefined,
|
|
|
+ '7': undefined,
|
|
|
+ '8': undefined,
|
|
|
+ });
|
|
|
+
|
|
|
+ watch(
|
|
|
+ () => props.lengthList,
|
|
|
+ (val) => {
|
|
|
+ const data = JSON.parse(val || '{}');
|
|
|
+ Object.keys(data).forEach((item) => {
|
|
|
+ strandNoSelectedOrg.value[item] = data[item];
|
|
|
+ if (!strandNoSelected.value[item]) {
|
|
|
+ strandNoSelected.value[item] = data[item];
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ {
|
|
|
+ deep: true,
|
|
|
+ immediate: true,
|
|
|
+ }
|
|
|
+ );
|
|
|
+ const handlerChangeLength = async () => {
|
|
|
+ const record = strandNoSelected.value;
|
|
|
+ const sizeList = Object.keys(record)
|
|
|
+ .filter((ele) => record[ele] && record[ele] !== strandNoSelectedOrg.value[ele])
|
|
|
+ .map((item) => ({
|
|
|
+ strandNo: item,
|
|
|
+ length: record[item],
|
|
|
+ }));
|
|
|
+
|
|
|
+ if (!sizeList.length) {
|
|
|
+ createMessage.error('请选择需要变更的定尺');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ createConfirm({
|
|
|
+ title: '变更定尺确认',
|
|
|
+ content: h(
|
|
|
+ 'div',
|
|
|
+ null,
|
|
|
+ sizeList.map((item) => h('div', null, ` ${item.strandNo}流: ${item.length / 1000}`))
|
|
|
+ ),
|
|
|
+ iconType: 'warning',
|
|
|
+ onOk: () => {
|
|
|
+ const params = {
|
|
|
+ ccmNo: props.ccmNo,
|
|
|
+ cutToLength: cuttolengthStatus.value == 2 ? 1 : 2,
|
|
|
+ strandNoSizeList: Object.keys(record)
|
|
|
+ .filter((ele) => record[ele])
|
|
|
+ .map((item) => ({
|
|
|
+ strandNo: item,
|
|
|
+ length: record[item],
|
|
|
+ })),
|
|
|
+ };
|
|
|
+
|
|
|
+ return changeDefiningLength(params).then(() => {
|
|
|
+ emits('changeLengthSuccess');
|
|
|
+ });
|
|
|
+ },
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ const changeShortLength = (v) => {
|
|
|
+ createConfirm({
|
|
|
+ title: '变更短尺确认',
|
|
|
+ iconType: 'warning',
|
|
|
+ onOk: () => {
|
|
|
+ return queryChangeShortLength({
|
|
|
+ ccmNo: props.ccmNo,
|
|
|
+ length: v,
|
|
|
+ });
|
|
|
+ },
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 操作栏
|
|
|
+ */
|
|
|
+ function getTableAction(record, index?: number): ActionItem[] | undefined {
|
|
|
+ const printAction: ActionItem[] = [
|
|
|
+ {
|
|
|
+ label: '打印',
|
|
|
+ type: 'primary',
|
|
|
+ onClick: () => {
|
|
|
+ openPrintModal(true, { record, list: currentShiftTableData.value, index });
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ];
|
|
|
+ if (!record.operateStatus) return printAction;
|
|
|
+
|
|
|
+ const chargeInfo = props.carRef && props.carRef.getCurrentCar ? props.carRef.getCurrentCar() : {};
|
|
|
+ return [
|
|
|
+ {
|
|
|
+ label: '热装',
|
|
|
+ color: 'error',
|
|
|
+ disabled: !chargeInfo.id || !!chargeInfo.outTime,
|
|
|
+ type: 'primary',
|
|
|
+ onClick: () => {
|
|
|
+ getSize(record, 'hot');
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '起垛',
|
|
|
+ color: 'warning',
|
|
|
+ type: 'primary',
|
|
|
+ onClick: () => {
|
|
|
+ getSize(record, 'stack');
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ...printAction,
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ const refresh = async () => {
|
|
|
+ stop();
|
|
|
+ await getTableList();
|
|
|
+ start();
|
|
|
+ };
|
|
|
+
|
|
|
+ defineExpose({
|
|
|
+ reload: refresh,
|
|
|
+ });
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped lang="less">
|
|
|
+ .cc-heatList {
|
|
|
+ height: 100%;
|
|
|
+ overflow: hidden;
|
|
|
+
|
|
|
+ .tips-title {
|
|
|
+ color: #fff;
|
|
|
+ font-size: 18px;
|
|
|
+ text-align: center;
|
|
|
+ border: 1px solid #fff;
|
|
|
+ margin-bottom: 4px;
|
|
|
+
|
|
|
+ .left-tip {
|
|
|
+ width: 227px;
|
|
|
+ border-right: 1px solid #fff;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .current-table-list {
|
|
|
+ overflow: auto;
|
|
|
+ }
|
|
|
+
|
|
|
+ .jeecg-basic-table {
|
|
|
+ padding: 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.ant-table) {
|
|
|
+ .ant-table-thead > tr > th {
|
|
|
+ font-size: 16px;
|
|
|
+ font-weight: 800;
|
|
|
+ color: #fff;
|
|
|
+ }
|
|
|
+
|
|
|
+ .ant-table-thead > tr > th:nth-child(4),
|
|
|
+ .ant-table-thead > tr > th:nth-child(5),
|
|
|
+ .ant-table-thead > tr > th:nth-child(6),
|
|
|
+ .ant-table-thead > tr > th:nth-child(7),
|
|
|
+ .ant-table-thead > tr > th:nth-child(8),
|
|
|
+ .ant-table-thead > tr > th:nth-child(9),
|
|
|
+ .ant-table-thead > tr > th:nth-child(10),
|
|
|
+ .ant-table-thead > tr > th:nth-child(11) {
|
|
|
+ color: #f50;
|
|
|
+ padding: 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ .ant-table-tbody {
|
|
|
+ font-size: 15px;
|
|
|
+ font-family: 'Kingsoft_Cloud_Font';
|
|
|
+
|
|
|
+ & > tr > td:nth-child(6),
|
|
|
+ & > tr > td:nth-child(7),
|
|
|
+ & > tr > td:nth-child(8),
|
|
|
+ & > tr > td:nth-child(9),
|
|
|
+ & > tr > td:nth-child(10),
|
|
|
+ & > tr > td:nth-child(11) {
|
|
|
+ padding: 0 8px;
|
|
|
+ position: relative;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .ant-table-footer {
|
|
|
+ padding: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .changele {
|
|
|
+ :deep(.ant-select-selector) {
|
|
|
+ background-color: #faa19d;
|
|
|
+ color: #fff;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .strand-list {
|
|
|
+ padding: 0 30px;
|
|
|
+ font-family: 'Kingsoft_Cloud_Font';
|
|
|
+ color: #000;
|
|
|
+
|
|
|
+ .strand-num {
|
|
|
+ color: #f50;
|
|
|
+ }
|
|
|
+
|
|
|
+ .strand-item {
|
|
|
+ border-bottom: 1px solid #eee;
|
|
|
+ padding-bottom: 10px;
|
|
|
+
|
|
|
+ &:last-child {
|
|
|
+ border-bottom: none;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // .change-heat {
|
|
|
+ // :deep(.ant-table-row-level-0) {
|
|
|
+ // .ant-table-cell {
|
|
|
+ // background-color: #9eceff !important;
|
|
|
+ // }
|
|
|
+ // &:not(.jeecg-basic-table-row__striped) {
|
|
|
+ // background-color: rgba(51, 51, 51, 0.04) !important;
|
|
|
+ // .ant-table-cell {
|
|
|
+ // background-color: rgba(51, 51, 51, 0.04) !important;
|
|
|
+ // border-color: #d9d9d9;
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+</style>
|