<script setup lang="ts">
import {computed, ref, UnwrapRef, watch} from "vue";
import {getScjhService,getWorkerService,getProcessService,addWorkInfoService} from "@/api/fprw.js";
import {ElMessage} from "element-plus";

const scjh = ref({
    generalOrder:'',
    divisionOrder:'',
    subordinateOrder:'',
    productName:'',
    batch:'',
    liucheng:'',
    quantity:'',
    nextTeam:'',
    startTime:'',
    endTime:''
})

const scjhs = ref([
    {
        generalOrder:'',
        divisionOrder:'',
        subordinateOrder:'',
        productName:'',
        batch:'',
        liucheng:'',
        quantity:'',
        nextTeam:'',
        startTime:'',
        endTime:''
    }
])

const getScjh = async () => {
    let result = await getScjhService()
    scjhs.value = result.data
}

getScjh()

const workers = ref([
    {
        id:'',
        name:'',
        teamName:''
    }
])

const getWorker = async (nextTeam) => {
    let result = await getWorkerService(nextTeam)
    workers.value = result.data
}
const fprwDialogVisible = ref(false)

const openFprwDialog = async (row) =>{
    scjh.value = {
        generalOrder: row.generalOrder,
        divisionOrder: row.divisionOrder,
        subordinateOrder: row.subordinateOrder,
        productName: row.productName,
        batch: row.batch,
        liucheng: row.liucheng,
        quantity: row.quantity,
        nextTeam: row.nextTeam,
        startTime: row.startTime,
        endTime: row.endTime
    }

    await getWorker(scjh.value.nextTeam)
    processes.value =row.liucheng.split(',')
    processes.value.forEach(p => {
        /*processWorkers.value[p] = {
            workerId: '',
            quantity: 0
        }*/
        processWorkers.value[p] = []
    })
    /*await getProcess()*/
    fprwDialogVisible.value = true
}

const workInfo = ref({
    generalOrder:'',
    divisionOrder:'',
    subordinateOrder:'',
    productName:'',
    batch:'',
    teamName:'',
    process:'',
    id:'',
    name:'',
    quantity:'',
    status:'',

})

const processes = ref([]) // 新增:存储工序列表
const processWorkers = ref({}) // 新增:存储每个工序分配的工人和数量


/*const getProcess = async () => {
    let result = await getProcessService(scjh.value.nextTeam)
    processes.value = result.data.split(',')
    processes.value.forEach(p => {
        processWorkers.value[p] = {
            workerId: '',
            quantity: 0
        }
    })
}*/


const getWorkerById = (id) => {
    return workers.value.find(w => w.id === id)
}
const addWorkerAssignment = (process) => {
    processWorkers.value[process].push({
        workerId: '',
        quantity: 0
    });
};

const removeWorkerAssignment = (process, index) => {
    processWorkers.value[process].splice(index, 1);
};

/*const addWorkInfo = async () => {
    for (const process in processWorkers.value) {
        const { workerId, quantity } = processWorkers.value[process]
        if (workerId && quantity > 0) {
            const worker = getWorkerById(workerId)
            if (worker) {
                workInfo.value = {
                    generalOrder: scjh.value.generalOrder,
                    divisionOrder: scjh.value.divisionOrder,
                    subordinateOrder: scjh.value.subordinateOrder,
                    productName: scjh.value.productName,
                    batch: scjh.value.batch,
                    teamName: scjh.value.nextTeam,
                    process: process,
                    id: worker.id,
                    name: worker.name,
                    quantity: quantity,
                    status:"未领取"
                }
                await addWorkInfoService(workInfo.value)
            }
        }
    }
    fprwDialogVisible.value = false
    await getScjh() // 刷新列表数据
}*/

const validateTotalQuantity = (process) => {
    const totalQuantity = processWorkers.value[process].reduce((sum, worker) => sum + worker.quantity, 0);
    return totalQuantity === Number(scjh.value.quantity);
};
const addWorkInfo = async () => {
    for (const process in processWorkers.value) {
        if (!validateTotalQuantity(process)) {
            // 如果不等于总数量,提示错误并停止提交
            ElMessage.error(`${process}的工人数量未押平,请确保每个工序的数量总和等于总数量`);
            return; // 停止提交
        }
    }

    for (const process in processWorkers.value) {
        const workersAssignments = processWorkers.value[process];

        for (const { workerId, quantity } of workersAssignments) {
            if (workerId && quantity > 0) {
                const worker = getWorkerById(workerId);
                if (worker) {
                    workInfo.value = {
                        generalOrder: scjh.value.generalOrder,
                        divisionOrder: scjh.value.divisionOrder,
                        subordinateOrder: scjh.value.subordinateOrder,
                        productName: scjh.value.productName,
                        batch: scjh.value.batch,
                        teamName: scjh.value.nextTeam,
                        process: process,
                        id: worker.id,
                        name: worker.name,
                        quantity: quantity,
                        status: "未领取"
                    };
                    await addWorkInfoService(workInfo.value);
                }
            }
        }
    }

    fprwDialogVisible.value = false;
    await getScjh(); // 刷新列表数据
};

// 添加 watch 函数来监听 workerId 的变化
/*watch(processWorkers, (newVal) => {
    for (const process in newVal) {
        const { workerId } = newVal[process]
        processWorkers.value[process].quantity = workerId ? Number(scjh.value.quantity) : 0
    }
}, { deep: true })*/


watch(processWorkers, (newVal) => {
    for (const process in newVal) {
        const workersAssignments = newVal[process];

        // 获取选择的工人数量
        const selectedWorkers = workersAssignments.filter(worker => worker.workerId).length;

        // 如果有工人被选择且总数量不为0
        if (selectedWorkers > 0 && Number(scjh.value.quantity) > 0) {
            // 计算每个工人分配的平均数量
            const averageQuantity = Math.floor(Number(scjh.value.quantity) / selectedWorkers);

            // 如果计算出的平均数量大于0,为每个工人分配相同的数量
            workersAssignments.forEach((workerAssignment) => {
                if (workerAssignment.workerId) {
                    workerAssignment.quantity = averageQuantity; // 自动设置平均数量
                } else {
                    workerAssignment.quantity = 0; // 没有选择工人的数量为0
                }
            });

            // 处理余数,将剩余数量分配给第一个几个工人
            const remainder = Number(scjh.value.quantity) - averageQuantity * selectedWorkers;
            if (remainder > 0) {
                for (let i = 0; i < remainder; i++) {
                    // 将余数分配给前几个工人
                    if (workersAssignments[i].workerId) {
                        workersAssignments[i].quantity += 1;
                    }
                }
            }
        } else {
            // 没有工人被选择时,所有工人的数量为0
            workersAssignments.forEach((workerAssignment) => {
                workerAssignment.quantity = 0;
            });
        }
    }
}, { deep: true });




</script>

<template>
    <h1>分配任务</h1>

    <el-table :data="scjhs" border style="width: 100%">
        <el-table-column prop="generalOrder" label="总制令" />
        <el-table-column prop="divisionOrder" label="分制令" />
        <el-table-column prop="subordinateOrder" label="子制令" />
        <el-table-column prop="productName" label="产品名" />
        <el-table-column prop="batch" label="批次" />
        <el-table-column prop="liucheng" label="流程" />
        <el-table-column prop="quantity" label="数量" />
        <el-table-column prop="nextTeam" label="待分配班组" />
        <el-table-column prop="startTime" label="开始时间" />
        <el-table-column prop="endTime" label="结束时间" />
        <el-table-column label="操作">
            <template #default="{row}">
                <el-button type="primary" @click="openFprwDialog(row)" :disabled="row.status === '已分配'">分配任务</el-button>
            </template>
        </el-table-column>
    </el-table>

<!--    <el-dialog v-model="fprwDialogVisible" title="分配任务"  width="500" draggable center>
        <el-form label-position="left" label-width="auto">
            <el-form-item
                v-for="process in processes"
                :key="process"
                :label="process"
            >
                <div style="display: flex; gap: 10px; align-items: center">
                    <el-select
                        v-model="processWorkers[process].workerId"
                        placeholder="选择工人"
                        style="width: 200px"
                    >
                        <el-option
                            v-for="worker in workers"
                            :key="worker.id"
                            :label="worker.name"
                            :value="worker.id"
                        />
                    </el-select>
                    <el-input-number
                        v-model="processWorkers[process].quantity"
                        :min="0"
                        :max="Number(scjh.quantity)"
                        placeholder="分配数量"
                    />
                </div>
            </el-form-item>
        </el-form>

        <template #footer>
            <div class="dialog-footer">
                <el-button @click="fprwDialogVisible = false">关闭</el-button>
                <el-button type="primary" @click="addWorkInfo" >分配</el-button>
            </div>
        </template>
    </el-dialog>-->
    <el-dialog v-model="fprwDialogVisible" title="分配任务" width="600" draggable center>
        <el-form label-position="left" label-width="auto">
            <el-form-item v-for="process in processes" :key="process" :label="process">
                <div style="display: flex; flex-direction: column; gap: 10px; align-items: flex-start">

                    <!-- 循环显示工人分配项 -->
                    <div v-for="(workerAssignment, index) in processWorkers[process]" :key="index" style="display: flex; gap: 10px; align-items: center">
                        <el-select
                            v-model="workerAssignment.workerId"
                            placeholder="选择工人"
                            style="width: 200px"
                        >
                            <el-option
                                v-for="worker in workers"
                                :key="worker.id"
                                :label="worker.name"
                                :value="worker.id"
                            />
                        </el-select>
                        <el-input-number
                            v-model="workerAssignment.quantity"
                            :min="0"
                            :max="Number(scjh.quantity)"
                            placeholder="分配数量"
                        />
                        <el-button
                            type="danger"
                            @click="removeWorkerAssignment(process, index)"
                        >删除</el-button>
                    </div>

                    <!-- 添加工人按钮 -->
                    <el-button
                        type="primary"
                        @click="addWorkerAssignment(process)"
                    >添加工人</el-button>

                </div>
            </el-form-item>
        </el-form>
        <template #footer>
            <div class="dialog-footer">
                <el-button @click="fprwDialogVisible = false">关闭</el-button>
                <el-button type="primary" @click="addWorkInfo" >分配</el-button>
            </div>
        </template>
    </el-dialog>


</template>

<style scoped >
demo-form-inline .el-input {
    --el-input-width: 220px;
}

.demo-form-inline .el-select {
    --el-select-width: 220px;
}
</style>
posted on 2024-10-01 22:37  leapss  阅读(16)  评论(0)    收藏  举报