| <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 | 
|     }).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> |