skyouc
2024-12-21 c635d78b479510ebe2556a420948effcd30a0731
zy-asrs-admin/src/views/out/orderOut/index.vue
@@ -1,268 +1,268 @@
<script setup>
import { ref, computed, reactive } from 'vue';
import { useRouter } from "vue-router";
import { get, post, postBlob } from '@/utils/request.js'
import { message, Modal } from 'ant-design-vue';
import { logout } from '@/config.js';
import { formatMessage } from '@/utils/localeUtils.js';
import useTableSearch from '@/utils/tableUtils.jsx';
import OrderOutBatchPreviewView from '@/components/orderOut/orderOutBatchPreview/index.vue';
import OrderOutMergePreviewView from '@/components/orderOut/orderOutMergePreview/index.vue';
const router = useRouter();
const emit = defineEmits(['pageReload'])
const TABLE_KEY = 'table-order-detl';
let currentPage = 1;
let pageSize = 10;
const {
    getColumnSearchProps,
    handleResizeColumn,
} = useTableSearch();
let currentOrder = ref(null);
let searchInput = ref(null);
let tableData = ref([]);
const orderOutBatchPreviewChild = ref(null);
const orderOutMergePreviewChild = ref(null);
const checkedOrderKeys = ref([]);
getPage();
const columns = [
    {
        title: formatMessage('db.man_order_detl.order_no', '订单编号'),
        dataIndex: 'orderNo',
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('orderNo'),
    },
    {
        title: formatMessage('db.man_order_detl.anfme', '数量'),
        dataIndex: 'anfme',
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('anfme'),
    },
    {
        title: formatMessage('db.man_order_detl.qty', '已完成数量'),
        dataIndex: 'qty',
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('qty'),
    },
    {
        title: formatMessage('db.man_order_detl.work_qty', '作业中数量'),
        dataIndex: 'workQty',
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('workQty'),
    },
    {
        title: formatMessage('db.man_order_detl.matnr', '商品编号'),
        dataIndex: ['mat$', 'matnr'],
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('matId$'),
    },
    {
        title: formatMessage('db.man_order_detl.batch', '批号'),
        dataIndex: 'batch',
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('batch'),
    },
    // {
    //     title: formatMessage('common.operation', '操作'),
    //     name: 'oper',
    //     dataIndex: 'oper',
    //     key: 'oper',
    //     width: 140,
    // },
];
const state = reactive({
    selectedRowKeys: [],
    loading: false,
});
const onSelectChange = selectedRowKeys => {
    // console.log('selectedRowKeys changed: ', selectedRowKeys);
    state.selectedRowKeys = selectedRowKeys;
};
function getPage() {
    if (currentOrder.value != null) {
        get('/api/orderDetl/orderId/' + currentOrder.value.id, {}).then((resp) => {
            let result = resp.data;
            if (result.code == 200) {
                let data = result.data;
                tableData.value = data;
            } else if (result.code === 401) {
                message.error(result.msg);
                logout()
            } else {
                message.error(result.msg);
            }
        })
    }
}
function handleTableReload(value) {
    getPage()
}
let orderData = ref([]);
let searchOrder = ref("");
getOrderData()
function getOrderData() {
    post('/api/order/out/page', {
        current: currentPage,
        pageSize: pageSize,
        condition: searchOrder.value,
        orderOut: true,
    }).then((resp) => {
        let result = resp.data;
        if (result.code == 200) {
            let data = result.data.records;
            orderData.value = data
        } else if (result.code === 401) {
            message.error(result.msg);
            logout()
        } else {
            message.error(result.msg);
        }
    })
}
const handleOrderSelected = (selectedKeys, e) => {
    currentOrder.value = e.selectedNodes[0];
    getPage()
}
const handleSearchOrder = (e) => {
    getOrderData()
}
const handleBatchOrderOut = () => {
    let data = state.selectedRowKeys;
    handleOrderOutPreview(data)
}
const handleOrderOutPreview = (data) => {
    if (data.length == 0) {
        message.error(formatMessage("page.orderOut.batchOrderOut.error", "请选择至少一条出库明细"));
        return;
    }
    orderOutBatchPreviewChild.value.open = true;
    orderOutBatchPreviewChild.value.records = data;
}
const handleMergeOrderOut = () => {
    let orderIdList = [];
    checkedOrderKeys.value.forEach((idx) => {
        let index = parseInt(idx.split("-")[1]);
        orderIdList.push(orderData.value[index].id)
    })
    if (orderIdList.length == 0) {
        message.error(formatMessage("page.orderOut.mergeOrderOut.error", "请选择至少一条订单"));
        return;
    }
    orderOutMergePreviewChild.value.open = true;
    orderOutMergePreviewChild.value.records = orderIdList;
}
const handleChildReload = () => {
    handleTableReload()
}
const handleGenerateWave = () => {
    let orderIdList = [];
    checkedOrderKeys.value.forEach((idx) => {
        let index = parseInt(idx.split("-")[1]);
        orderIdList.push(orderData.value[index].id)
    })
    if (orderIdList.length == 0) {
        message.error(formatMessage("page.orderOut.mergeOrderOut.error", "请选择至少一条订单"));
        return;
    }
    post('/api/out/wave/generate', orderIdList).then((resp) => {
        let result = resp.data;
        if (result.code == 200) {
            message.success(formatMessage('page.add.success', '成功'));
            emit('pageReload', 'reload')
        } else {
            message.error(result.msg);
        }
    })
}
</script>
<script>
export default {
    name: '订单出库'
}
</script>
<template>
    <div style="display: flex;">
        <a-card :title="formatMessage('common.order', '订单')" style="flex: 4;margin-right: 30px;">
            <div style="margin-bottom: 10px;display: flex;">
                <!-- <div style="margin-right: 10px;">
                    <a-button @click="handleMergeOrderOut()">
                        {{ formatMessage('common.orderOut', '合并订单') }}
                    </a-button>
                </div> -->
                <div style="margin-right: 10px;">
                    <a-button @click="handleGenerateWave()">
                        {{ formatMessage('common.generateWave', '生成波次') }}
                    </a-button>
                </div>
            </div>
            <a-input v-model:value="searchOrder" @change="handleSearchOrder"
                :placeholder="formatMessage('page.input', '请输入')" style="margin-bottom: 8px" />
            <a-tree @select="handleOrderSelected" :tree-data="orderData" v-model:checkedKeys="checkedOrderKeys"
                checkable blockNode>
                <template #title="{ orderNo, createTime$ }">
                    <div style="display: flex;justify-content: space-between">
                        <div>{{ orderNo }}</div>
                        <div>{{ createTime$ }}</div>
                    </div>
                </template>
            </a-tree>
        </a-card>
        <a-card style="flex: 10;">
            <div class="table-header">
                <!-- <a-button size="small" @click="handleBatchOrderOut()">
                    {{ formatMessage('common.orderOut', '批量出库') }}
                </a-button> -->
            </div>
            <a-table :row-selection="{ selectedRowKeys: state.selectedRowKeys, onChange: onSelectChange }"
                :data-source="tableData" :defaultExpandAllRows="false" :key="TABLE_KEY" rowKey="id"
                :scroll="{ y: 768, scrollToFirstRowOnChange: true }" :columns="columns">
                <template #bodyCell="{ column, text, record }">
                    <template v-if="column.dataIndex === 'oper'">
                        <div style="display: flex;justify-content: space-evenly;">
                            <a-button size="small" @click="handleOrderOutPreview([record.id])">
                                {{ formatMessage('common.orderOut', '出库') }}
                            </a-button>
                        </div>
                    </template>
                </template>
            </a-table>
        </a-card>
        <OrderOutBatchPreviewView ref="orderOutBatchPreviewChild" @reload="handleChildReload" />
        <OrderOutMergePreviewView ref="orderOutMergePreviewChild" @reload="handleChildReload" />
    </div>
</template>
<style></style>
<script setup>
import { ref, computed, reactive } from 'vue';
import { useRouter } from "vue-router";
import { get, post, postBlob } from '@/utils/request.js'
import { message, Modal } from 'ant-design-vue';
import { logout } from '@/config.js';
import { formatMessage } from '@/utils/localeUtils.js';
import useTableSearch from '@/utils/tableUtils.jsx';
import OrderOutBatchPreviewView from '@/components/orderOut/orderOutBatchPreview/index.vue';
import OrderOutMergePreviewView from '@/components/orderOut/orderOutMergePreview/index.vue';
const router = useRouter();
const emit = defineEmits(['pageReload'])
const TABLE_KEY = 'table-order-detl';
let currentPage = 1;
let pageSize = 10;
const {
    getColumnSearchProps,
    handleResizeColumn,
} = useTableSearch();
let currentOrder = ref(null);
let searchInput = ref(null);
let tableData = ref([]);
const orderOutBatchPreviewChild = ref(null);
const orderOutMergePreviewChild = ref(null);
const checkedOrderKeys = ref([]);
getPage();
const columns = [
    {
        title: formatMessage('db.man_order_detl.order_no', '订单编号'),
        dataIndex: 'orderNo',
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('orderNo'),
    },
    {
        title: formatMessage('db.man_order_detl.anfme', '数量'),
        dataIndex: 'anfme',
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('anfme'),
    },
    {
        title: formatMessage('db.man_order_detl.qty', '已完成数量'),
        dataIndex: 'qty',
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('qty'),
    },
    {
        title: formatMessage('db.man_order_detl.work_qty', '作业中数量'),
        dataIndex: 'workQty',
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('workQty'),
    },
    {
        title: formatMessage('db.man_order_detl.matnr', '商品编号'),
        dataIndex: ['mat$', 'matnr'],
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('matId$'),
    },
    {
        title: formatMessage('db.man_order_detl.batch', '批号'),
        dataIndex: 'batch',
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('batch'),
    },
    // {
    //     title: formatMessage('common.operation', '操作'),
    //     name: 'oper',
    //     dataIndex: 'oper',
    //     key: 'oper',
    //     width: 140,
    // },
];
const state = reactive({
    selectedRowKeys: [],
    loading: false,
});
const onSelectChange = selectedRowKeys => {
    // console.log('selectedRowKeys changed: ', selectedRowKeys);
    state.selectedRowKeys = selectedRowKeys;
};
function getPage() {
    if (currentOrder.value != null) {
        get('/api/orderDetl/orderId/' + currentOrder.value.id, {}).then((resp) => {
            let result = resp.data;
            if (result.code == 200) {
                let data = result.data;
                tableData.value = data;
            } else if (result.code === 401) {
                message.error(result.msg);
                logout()
            } else {
                message.error(result.msg);
            }
        })
    }
}
function handleTableReload(value) {
    getPage()
}
let orderData = ref([]);
let searchOrder = ref("");
getOrderData()
function getOrderData() {
    post('/api/order/out/page', {
        current: currentPage,
        pageSize: pageSize,
        condition: searchOrder.value,
        orderOut: true,
    }).then((resp) => {
        let result = resp.data;
        if (result.code == 200) {
            let data = result.data.records;
            orderData.value = data
        } else if (result.code === 401) {
            message.error(result.msg);
            logout()
        } else {
            message.error(result.msg);
        }
    })
}
const handleOrderSelected = (selectedKeys, e) => {
    currentOrder.value = e.selectedNodes[0];
    getPage()
}
const handleSearchOrder = (e) => {
    getOrderData()
}
const handleBatchOrderOut = () => {
    let data = state.selectedRowKeys;
    handleOrderOutPreview(data)
}
const handleOrderOutPreview = (data) => {
    if (data.length == 0) {
        message.error(formatMessage("page.orderOut.batchOrderOut.error", "请选择至少一条出库明细"));
        return;
    }
    orderOutBatchPreviewChild.value.open = true;
    orderOutBatchPreviewChild.value.records = data;
}
const handleMergeOrderOut = () => {
    let orderIdList = [];
    checkedOrderKeys.value.forEach((idx) => {
        let index = parseInt(idx.split("-")[1]);
        orderIdList.push(orderData.value[index].id)
    })
    if (orderIdList.length == 0) {
        message.error(formatMessage("page.orderOut.mergeOrderOut.error", "请选择至少一条订单"));
        return;
    }
    orderOutMergePreviewChild.value.open = true;
    orderOutMergePreviewChild.value.records = orderIdList;
}
const handleChildReload = () => {
    handleTableReload()
}
const handleGenerateWave = () => {
    let orderIdList = [];
    checkedOrderKeys.value.forEach((idx) => {
        let index = parseInt(idx.split("-")[1]);
        orderIdList.push(orderData.value[index].id)
    })
    if (orderIdList.length == 0) {
        message.error(formatMessage("page.orderOut.mergeOrderOut.error", "请选择至少一条订单"));
        return;
    }
    post('/api/out/wave/generate', orderIdList).then((resp) => {
        let result = resp.data;
        if (result.code == 200) {
            message.success(formatMessage('page.add.success', '成功'));
            emit('pageReload', 'reload')
        } else {
            message.error(result.msg);
        }
    })
}
</script>
<script>
export default {
    name: '订单出库'
}
</script>
<template>
    <div style="display: flex;">
        <a-card :title="formatMessage('common.order', '订单')" style="flex: 4;margin-right: 30px;">
            <div style="margin-bottom: 10px;display: flex;">
                <!-- <div style="margin-right: 10px;">
                    <a-button @click="handleMergeOrderOut()">
                        {{ formatMessage('common.orderOut', '合并订单') }}
                    </a-button>
                </div> -->
                <div style="margin-right: 10px;">
                    <a-button @click="handleGenerateWave()">
                        {{ formatMessage('common.generateWave', '生成波次') }}
                    </a-button>
                </div>
            </div>
            <a-input v-model:value="searchOrder" @change="handleSearchOrder"
                :placeholder="formatMessage('page.input', '请输入')" style="margin-bottom: 8px" />
            <a-tree @select="handleOrderSelected" :tree-data="orderData" v-model:checkedKeys="checkedOrderKeys"
                checkable blockNode>
                <template #title="{ orderNo, createTime$ }">
                    <div style="display: flex;justify-content: space-between">
                        <div>{{ orderNo }}</div>
                        <div>{{ createTime$ }}</div>
                    </div>
                </template>
            </a-tree>
        </a-card>
        <a-card style="flex: 10;">
            <div class="table-header">
                <!-- <a-button size="small" @click="handleBatchOrderOut()">
                    {{ formatMessage('common.orderOut', '批量出库') }}
                </a-button> -->
            </div>
            <a-table :row-selection="{ selectedRowKeys: state.selectedRowKeys, onChange: onSelectChange }"
                :data-source="tableData" :defaultExpandAllRows="false" :key="TABLE_KEY" rowKey="id"
                :scroll="{ y: 768, scrollToFirstRowOnChange: true }" :columns="columns">
                <template #bodyCell="{ column, text, record }">
                    <template v-if="column.dataIndex === 'oper'">
                        <div style="display: flex;justify-content: space-evenly;">
                            <a-button size="small" @click="handleOrderOutPreview([record.id])">
                                {{ formatMessage('common.orderOut', '出库') }}
                            </a-button>
                        </div>
                    </template>
                </template>
            </a-table>
        </a-card>
        <OrderOutBatchPreviewView ref="orderOutBatchPreviewChild" @reload="handleChildReload" />
        <OrderOutMergePreviewView ref="orderOutMergePreviewChild" @reload="handleChildReload" />
    </div>
</template>
<style></style>