<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>  
 |