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