old mode 100644
new mode 100755
| | |
| | | <script setup lang="tsx"> |
| | | import { ref } from 'vue'; |
| | | import { computed, ref } from 'vue'; |
| | | import { NDivider } from 'naive-ui'; |
| | | import { fetchBatchDeleteStoreSilk, fetchGetStoreSilkList } from '@/service/api/analy/store-silk'; |
| | | import { useAppStore } from '@/store/modules/app'; |
| | |
| | | import StoreSilkOperateDrawer from './modules/store-silk-operate-drawer.vue'; |
| | | import StoreSilkSearch from './modules/store-silk-search.vue'; |
| | | import StoreSilkDetail from './modules/store-silk-detail.vue'; |
| | | import StoreSilkSankey from './modules/store-silk-sankey.vue'; |
| | | |
| | | defineOptions({ |
| | | name: 'StoreSilkList' |
| | |
| | | |
| | | const selectedRollerDetailList = ref<any[]>([]); |
| | | const selectedPackerDetailList = ref<any[]>([]); |
| | | |
| | | // 桑基图start |
| | | const showSankey = ref(false); |
| | | const rollerRecordList = ref<any[]>([]); |
| | | const packerRecordList = ref<any[]>([]); |
| | | // 桑基图end |
| | | |
| | | const sankeyRollerBoxList = computed(() => { |
| | | return (rollerRecordList.value || []).map(item => { |
| | | const v = calcRollerBox((item as any).output); |
| | | const output = v === null ? null : Number(v.toFixed(2)); |
| | | return { ...(item as any), output }; |
| | | }); |
| | | }); |
| | | |
| | | const sankeyPackerBoxList = computed(() => { |
| | | return (packerRecordList.value || []).map(item => { |
| | | const v = calcPackerBox((item as any).output); |
| | | const output = v === null ? null : Number(v.toFixed(2)); |
| | | return { ...(item as any), output }; |
| | | }); |
| | | }); |
| | | |
| | | const searchParams = ref<Api.Analy.StoreSilkSearchParams>({ |
| | | pageNum: 1, |
| | |
| | | } |
| | | |
| | | const { columns, columnChecks, data, getData, getDataByPage, loading, mobilePagination, scrollX } = |
| | | useNaivePaginatedTable({ |
| | | useNaivePaginatedTable<any, any>({ |
| | | api: () => fetchGetStoreSilkList(searchParams.value), |
| | | transform: response => defaultTransform(response), |
| | | transform: response => { |
| | | const respData = (response as any).data; |
| | | const error = (response as any).error; |
| | | |
| | | if (!error) { |
| | | const rows = Array.isArray(respData?.rows) ? respData.rows : []; |
| | | const apiRollerRecordList = respData?.rollerRecordList; |
| | | const apiPackerRecordList = respData?.packerRecordList; |
| | | |
| | | rollerRecordList.value = |
| | | Array.isArray(apiRollerRecordList) && apiRollerRecordList.length > 0 |
| | | ? apiRollerRecordList |
| | | : rows.flatMap((r: any) => (Array.isArray(r?.rollerDetailList) ? r.rollerDetailList : [])); |
| | | |
| | | packerRecordList.value = |
| | | Array.isArray(apiPackerRecordList) && apiPackerRecordList.length > 0 |
| | | ? apiPackerRecordList |
| | | : rows.flatMap((r: any) => (Array.isArray(r?.packerDetailList) ? r.packerDetailList : [])); |
| | | } else { |
| | | rollerRecordList.value = []; |
| | | packerRecordList.value = []; |
| | | } |
| | | |
| | | return defaultTransform(response as any); |
| | | }, |
| | | onPaginationParamsChange: params => { |
| | | searchParams.value.pageNum = params.page; |
| | | searchParams.value.pageSize = params.pageSize; |
| | |
| | | key: 'materialname', |
| | | title: '牌号', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | minWidth: 96 |
| | | }, |
| | | { |
| | | key: 'batchcode', |
| | | title: '批次号', |
| | | align: 'center', |
| | | minWidth: 130 |
| | | minWidth: 110 |
| | | }, |
| | | { |
| | | key: 'rollerOutput', |
| | | title: '卷接产量(箱)', |
| | | align: 'center', |
| | | minWidth: 120, |
| | | minWidth: 112, |
| | | render: row => { |
| | | const v = calcRollerBox((row as any).rollerOutput); |
| | | if (v === null) return '-'; |
| | |
| | | } |
| | | }, |
| | | { |
| | | key: 'rollerUnitCost', |
| | | title: '卷接单耗', |
| | | align: 'center', |
| | | minWidth: 96, |
| | | render: row => { |
| | | const box = calcRollerBox((row as any).rollerOutput); |
| | | if (box === null || box <= 0) return '-'; |
| | | const weight = Number((row as any).weight); |
| | | if (!Number.isFinite(weight)) return '-'; |
| | | const val = weight / box; |
| | | if (!Number.isFinite(val)) return '-'; |
| | | return val.toFixed(2); |
| | | } |
| | | }, |
| | | { |
| | | key: 'packerOutput', |
| | | title: '包装产量(箱)', |
| | | align: 'center', |
| | | minWidth: 120, |
| | | minWidth: 112, |
| | | render: row => { |
| | | const v = calcPackerBox((row as any).packerOutput); |
| | | if (v === null) return '-'; |
| | |
| | | } |
| | | }, |
| | | { |
| | | key: 'packerUnitCost', |
| | | title: '包装单耗', |
| | | align: 'center', |
| | | minWidth: 96, |
| | | render: row => { |
| | | const box = calcPackerBox((row as any).packerOutput); |
| | | if (box === null || box <= 0) return '-'; |
| | | const weight = Number((row as any).weight); |
| | | if (!Number.isFinite(weight)) return '-'; |
| | | const val = weight / box; |
| | | if (!Number.isFinite(val)) return '-'; |
| | | return val.toFixed(2); |
| | | } |
| | | }, |
| | | { |
| | | key: 'actualstarttime', |
| | | title: '投料日期', |
| | | align: 'center', |
| | | width: 180 |
| | | width: 160 |
| | | }, |
| | | { |
| | | key: 'jobinput', |
| | | title: '投料重量', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | minWidth: 96 |
| | | }, |
| | | { |
| | | key: 'weight', |
| | | title: '储丝柜重量', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | minWidth: 96 |
| | | }, |
| | | { |
| | | key: 'distimebegin', |
| | | title: '储丝柜出料开始时间', |
| | | align: 'center', |
| | | width: 180 |
| | | width: 160 |
| | | }, |
| | | { |
| | | key: 'distimeend', |
| | | title: '储丝柜出料结束时间', |
| | | align: 'center', |
| | | width: 180 |
| | | width: 160 |
| | | }, |
| | | { |
| | | key: 'siloid', |
| | | title: '柜子号(末位)', |
| | | align: 'center', |
| | | width: 160 |
| | | width: 120 |
| | | } |
| | | ] |
| | | }); |
| | | |
| | | const { drawerVisible, operateType, editingData, handleAdd, handleEdit, checkedRowKeys, onBatchDeleted, onDeleted } = |
| | | useTableOperate(data, 'id', getData); |
| | | useTableOperate<any>(data, 'id', getData); |
| | | |
| | | async function handleBatchDelete() { |
| | | // request |
| | |
| | | if (!Number.isFinite(v)) return null; |
| | | return v; |
| | | } |
| | | |
| | | function calcPackerBox(val: unknown) { |
| | | if (val === null || val === undefined) return null; |
| | | const v = Number(val) / 10 / 250; |
| | |
| | | :loading="loading" |
| | | :show-add="false" |
| | | :show-delete="false" |
| | | :show-export="hasAuth('analy:storeSilk:export')" |
| | | :show-export="!showSankey && hasAuth('analy:storeSilk:export')" |
| | | @add="handleAdd" |
| | | @delete="handleBatchDelete" |
| | | @export="handleExport" |
| | | @refresh="getData" |
| | | > |
| | | <template #prefix> |
| | | <NButton size="small" ghost :type="showSankey ? 'primary' : 'default'" @click="showSankey = !showSankey"> |
| | | {{ showSankey ? '列表' : '桑基图' }} |
| | | </NButton> |
| | | </template> |
| | | <template #suffix> |
| | | <NPopover placement="bottom-end" trigger="click"> |
| | | <template #trigger> |
| | |
| | | </template> |
| | | </TableHeaderOperation> |
| | | </template> |
| | | <StoreSilkSankey |
| | | v-if="showSankey" |
| | | :roller-record-list="sankeyRollerBoxList" |
| | | :packer-record-list="sankeyPackerBoxList" |
| | | :rows="data" |
| | | class="h-full" |
| | | /> |
| | | <NDataTable |
| | | :columns="columns" |
| | | v-else |
| | | :columns="columns as any" |
| | | :data="data" |
| | | :size="tableSize" |
| | | :flex-height="!appStore.isMobile" |
| | |
| | | /> |
| | | </NCard> |
| | | <StoreSilkDetail |
| | | v-if="!showSankey" |
| | | :roller-detail-list="selectedRollerDetailList" |
| | | :packer-detail-list="selectedPackerDetailList" |
| | | class="h-[192px] overflow-hidden" |
| | |
| | | <style scoped> |
| | | :deep(.n-data-table-th), |
| | | :deep(.n-data-table-td) { |
| | | padding-top: 4px; |
| | | padding-bottom: 4px; |
| | | padding: 4px 6px; |
| | | } |
| | | </style> |