| <script setup> | 
| import { getCurrentInstance, ref, watch, reactive } from 'vue'; | 
| import { useRouter } from "vue-router"; | 
| import { get, post, postForm } 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'; | 
| const context = getCurrentInstance()?.appContext.config.globalProperties; | 
|   | 
| const router = useRouter(); | 
|   | 
| const TABLE_KEY = 'table-locDetl'; | 
|   | 
| let tableData = ref([]); | 
| let deleteDetlId = ref([]); | 
| let orderId = ref(null); | 
| getColumns(); | 
|   | 
| const { | 
|     getColumnSearchProps, | 
| } = useTableSearch(); | 
|   | 
| const state = reactive({ | 
|     selectedRowKeys: [], | 
|     loading: false, | 
|     columns: [], | 
| }); | 
|   | 
| state.columns = [ | 
|     { | 
|         title: '#', | 
|         dataIndex: '_id', | 
|         width: 60, | 
|         ellipsis: true, | 
|     }, | 
|     { | 
|         title: formatMessage('db.man_loc_detl.matnr', '物料号'), | 
|         dataIndex: 'matnr', | 
|         width: 140, | 
|         ellipsis: true, | 
|     }, | 
|     { | 
|         title: formatMessage('db.man_loc_detl.maktx', '物料名'), | 
|         dataIndex: 'maktx', | 
|         width: 140, | 
|         ellipsis: true, | 
|     }, | 
|     { | 
|         title: formatMessage('db.man_loc_detl.batch', '批号'), | 
|         dataIndex: 'batch', | 
|         width: 140, | 
|         ellipsis: true, | 
|         editable: true, | 
|     }, | 
|     { | 
|         title: formatMessage('db.man_loc_detl.anfme', '数量'), | 
|         dataIndex: 'anfme', | 
|         width: 140, | 
|         ellipsis: true, | 
|         editable: true, | 
|     }, | 
|     { | 
|         title: formatMessage('db.man_loc_detl.qty', '已完成数量'), | 
|         dataIndex: 'qty', | 
|         width: 140, | 
|         ellipsis: true, | 
|         editable: true, | 
|     }, | 
|     { | 
|         title: formatMessage('db.man_loc_detl.workQty', '作业中数量'), | 
|         dataIndex: 'workQty', | 
|         width: 140, | 
|         ellipsis: true, | 
|         editable: true, | 
|     }, | 
|     { | 
|         title: formatMessage('db.man_loc_detl.memo', '备注'), | 
|         dataIndex: 'memo', | 
|         width: 140, | 
|         ellipsis: true, | 
|         editable: true, | 
|     }, | 
| ]; | 
|   | 
| const fieldList = []; | 
| //加载扩展字段 | 
| async function getColumns() { | 
|     let fieldResp = await post('/api/matField/list', { | 
|         fieldType: 1 | 
|     }) | 
|     let fieldResult = fieldResp.data; | 
|     let tmp = state.columns; | 
|     if (fieldResult.code == 200) { | 
|         let data = fieldResult.data; | 
|   | 
|         data.forEach((item) => { | 
|             tmp.push({ | 
|                 title: formatMessage(item.language, item.describe), | 
|                 name: item.name, | 
|                 dataIndex: item.name, | 
|                 key: item.name, | 
|                 width: 140, | 
|                 editable: true, | 
|             }) | 
|   | 
|             fieldList.push(item.name); | 
|         }) | 
|   | 
|         tmp.push({ | 
|             title: formatMessage('common.operation', '操作'), | 
|             name: 'oper', | 
|             dataIndex: 'oper', | 
|             key: 'oper', | 
|             width: 140, | 
|         }) | 
|   | 
|         state.columns = tmp; | 
|     } else if (result.code === 401) { | 
|         message.error(result.msg); | 
|         logout() | 
|     } else { | 
|         message.error(result.msg); | 
|     } | 
| } | 
|   | 
| const openAddDetl = ref(false); | 
| const matChecked = ref([]); | 
| const matQueryList = ref(null); | 
| const matSelectList = ref([]); | 
| const addDetl = () => { | 
|     openAddDetl.value = true; | 
| } | 
|   | 
| const handleAddDetlOk = () => { | 
|     let origin = tableData.value; | 
|     let index = origin.length + 1; | 
|     matSelectList.value.forEach((item) => { | 
|         let data = { | 
|             _id: index++, | 
|             matnr: item.data.matnr, | 
|             maktx: item.data.maktx, | 
|             batch: '', | 
|             anfme: 0, | 
|             qty: 0, | 
|             workQty: 0, | 
|             memo: '' | 
|         }; | 
|         fieldList.forEach((field) => { | 
|             data[field] = ''; | 
|         }) | 
|         origin.push(data) | 
|     }) | 
|     tableData.value = origin; | 
|   | 
|     openAddDetl.value = false; | 
|     matSelectList.value = []; | 
|     matChecked.value = []; | 
| } | 
|   | 
| const handleAddDetlCancel = () => { | 
|     matSelectList.value = []; | 
|     matChecked.value = []; | 
| } | 
|   | 
| const handleSearch = val => { | 
|     matQuery(val); | 
| } | 
|   | 
| const handleSelect = (value, option) => { | 
|     let flag = true; | 
|     matSelectList.value.forEach((item) => { | 
|         if (item.value == value) { | 
|             flag = false; | 
|         } | 
|     }) | 
|   | 
|     if (flag) { | 
|         matSelectList.value.push(option) | 
|     } | 
| } | 
|   | 
| const handleDeselect = (value, option) => { | 
|     let tmp = []; | 
|     matSelectList.value.forEach((item) => { | 
|         if (item.value != value) { | 
|             tmp.push(item); | 
|         } | 
|     }) | 
|   | 
|     matSelectList.value = tmp; | 
| } | 
|   | 
| matQuery(null); | 
| function matQuery(condition) { | 
|     post('/api/mat/page', { | 
|         current: 1, | 
|         pageSize: 100, | 
|         condition: condition | 
|     }).then((resp) => { | 
|         let result = resp.data; | 
|         let tmp = [] | 
|         result.data.records.forEach((item) => { | 
|             tmp.push({ | 
|                 value: item.matnr, | 
|                 label: item.matnr, | 
|                 data: item | 
|             }) | 
|         }) | 
|         matQueryList.value = tmp; | 
|     }) | 
| } | 
|   | 
| const handleDel = (record) => { | 
|     let tmp = []; | 
|     tableData.value.forEach((item) => { | 
|         if (item._id != record._id) { | 
|             tmp.push(item); | 
|         } | 
|     }) | 
|   | 
|     //重建索引 | 
|     let index = 1; | 
|     tmp.forEach((item) => { | 
|         item._id = index++; | 
|     }) | 
|   | 
|     if (record.detlId != undefined) { | 
|         deleteDetlId.value.push(record.detlId); | 
|     } | 
|   | 
|     tableData.value = tmp; | 
| } | 
|   | 
| watch(orderId, (newVal, oldVal) => { | 
|     if(newVal == undefined || newVal == null) { | 
|         tableData.value = []; | 
|         return; | 
|     } | 
|   | 
|     get("/api/orderDetl/orderId/" + newVal, {}).then((resp) => { | 
|         let result = resp.data; | 
|         let index = 1; | 
|         let tmp = []; | 
|         result.data.forEach((item) => { | 
|             let data = { | 
|                 _id: index++, | 
|                 detlId: item.id, | 
|                 matnr: item.mat$.matnr, | 
|                 maktx: item.mat$.maktx, | 
|                 batch: item.batch, | 
|                 anfme: item.anfme, | 
|                 qty: item.qty, | 
|                 workQty: item.workQty, | 
|                 memo: item.memo | 
|             }; | 
|             fieldList.forEach((field) => { | 
|                 data[field] = item[field]; | 
|             }) | 
|             tmp.push(data) | 
|         }) | 
|         tableData.value = tmp; | 
|     }) | 
|      | 
| }) | 
|   | 
| defineExpose({ | 
|     tableData, | 
|     orderId, | 
|     deleteDetlId, | 
| }) | 
|   | 
| </script> | 
|   | 
| <script> | 
| export default { | 
|     name: 'orderDetlComponent' | 
| } | 
| </script> | 
|   | 
| <template> | 
|     <div> | 
|         <div class="table-header"> | 
|             <a-button @click="addDetl()" type="primary">{{ formatMessage('page.add', '添加明细') }}</a-button> | 
|         </div> | 
|         <a-table :data-source="tableData" :defaultExpandAllRows="false" :key="TABLE_KEY" rowKey="id" | 
|             :scroll="{ y: 768 }" :columns="state.columns"> | 
|             <template #bodyCell="{ column, record, index }"> | 
|                 <template v-if="column.dataIndex === 'oper'"> | 
|                     <div style="display: flex;justify-content: space-evenly;"> | 
|                         <a-button type="link" danger @click="handleDel(record)">{{ formatMessage('page.delete', '删除') | 
|                             }}</a-button> | 
|                     </div> | 
|                 </template> | 
|   | 
|                 <template v-if="column.editable"> | 
|                     <div> | 
|                         <a-input v-model:value="record[column.dataIndex]" /> | 
|                     </div> | 
|                 </template> | 
|             </template> | 
|         </a-table> | 
|   | 
|         <a-modal v-model:open="openAddDetl" :title="formatMessage('component.orderDetl.edit.addDetl', '添加明细')" | 
|             @ok="handleAddDetlOk" @cancel="handleAddDetlCancel"> | 
|             <a-select v-model:value="matChecked" :options="matQueryList" mode="multiple" | 
|                 :placeholder="formatMessage('component.orderDetl.edit.selectMat', '请选择物料')" @search="handleSearch" | 
|                 @select="handleSelect" @deselect="handleDeselect"></a-select> | 
|         </a-modal> | 
|     </div> | 
| </template> | 
|   | 
| <style></style> |