<template>
|
<el-dialog
|
v-model="dialogVisible"
|
title="生产报工"
|
width="70%"
|
@close="handleClose"
|
>
|
<el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
|
<el-row :gutter="30">
|
<el-col :span="12">
|
<el-form-item label="排产数量:">
|
<el-input v-model="productionQuantity" placeholder="请输入" clearable disabled/>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="本次生产数量:" prop="finishedNum">
|
<el-input-number
|
v-model="form.finishedNum"
|
placeholder="请输入"
|
:min="0"
|
:step="0.1"
|
:precision="2"
|
clearable
|
style="width: 100%"
|
@change="changeNum"
|
/>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row :gutter="30">
|
<el-col :span="12">
|
<el-form-item label="待生产数量:">
|
<el-input v-model="pendingNum" placeholder="请输入" clearable disabled/>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="生产人:" prop="schedulingUserId">
|
<el-select
|
v-model="form.schedulingUserId"
|
placeholder="选择人员"
|
style="width: 100%;"
|
>
|
<el-option
|
v-for="user in userList"
|
:key="user.userId"
|
:label="user.nickName"
|
:value="user.userId"
|
/>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
</el-form>
|
<template #footer>
|
<div class="dialog-footer">
|
<el-button type="primary" @click="handleSubmit">确认</el-button>
|
<el-button @click="handleClose">取消</el-button>
|
</div>
|
</template>
|
</el-dialog>
|
</template>
|
|
<script setup>
|
import {ref, reactive, watch, onMounted, nextTick, computed} from "vue";
|
import ETable from "@/components/Table/ETable.vue";
|
import ETableModify from "@/components/Table/EtableModify.vue";
|
import {ElMessage, ElMessageBox, ElAlert, ElText} from "element-plus";
|
import {Delete, Warning, Plus} from "@element-plus/icons-vue";
|
import {validateFormData, validateNumber, deepClone, createDefaultProductionRow} from "@/utils/production";
|
import {useCoalData} from "./useCoalData";
|
import useUserStore from "@/store/modules/user";
|
import {work} from '@/api/productionScheduling/index'
|
import {userListAll} from "@/api/publicApi";
|
const userList = ref([])
|
|
const data = reactive({
|
form: {
|
successNum: 0,
|
schedulingNum: 0,
|
finishedNum: 0,
|
schedulingUserId: ""
|
},
|
rules: {
|
schedulingNum: [{ required: true, message: "请输入", trigger: "blur" },],
|
},
|
});
|
const { form, rules } = toRefs(data);
|
const changeNum = (value) => {
|
if (value > pendingNum.value) {
|
form.value.finishedNum = pendingNum.value
|
ElMessage.warning("本次生产数量不可大于排产数量");
|
}
|
pendingNum.value = pendingNum.value - form.value.finishedNum;
|
}
|
// Props 和 Emits
|
const props = defineProps({
|
visible: {type: Boolean, default: false},
|
type: {type: String, default: "add"},
|
rowData: {type: Object, default: () => ({})},
|
});
|
|
const dialogVisible = defineModel("visible", {type: Boolean, default: false});
|
const emit = defineEmits(["update:visible", "success", "update:productionAndProcessing"]);
|
|
// 用户信息和煤种数据
|
const userStore = useUserStore();
|
const {getCoalNameById} = useCoalData();
|
let userInfo;
|
|
// 对话框状态
|
const innerVisible = ref(false);
|
const dialogType = ref("add");
|
const loading = ref(false);
|
const etableRef = ref(null);
|
|
// 数据状态
|
const tableData = ref([]);
|
const detailsTableData = ref([]);
|
const formalDatabaseData = ref([]);
|
const formalDatabaseSelectedData = ref([]);
|
const selectedIds = ref([]);
|
const currentRow = ref(null);
|
const copyForm = ref(null);
|
const productionQuantity = ref(0);
|
const pendingNum = ref(0);
|
|
|
const handleRowClick = (row) => {
|
currentRow.value = row;
|
};
|
|
// 手动设置表格选中状态
|
const setTableSelection = (ids) => {
|
if (!etableRef.value || !Array.isArray(ids) || ids.length === 0) {
|
return;
|
}
|
|
nextTick(() => {
|
setTimeout(() => {
|
try {
|
etableRef.value.clearSelection();
|
const rowsToSelect = formalDatabaseData.value.filter((row) =>
|
ids.includes(row.id)
|
);
|
if (rowsToSelect.length > 0) {
|
etableRef.value.setRowsSelection(rowsToSelect, true);
|
}
|
} catch (error) {
|
}
|
}, 150);
|
});
|
};
|
|
// 初始化和编辑初始化
|
const Initialization = async () => {
|
tableData.value = [];
|
form.value = {
|
successNum: 0,
|
schedulingNum: 0,
|
finishedNum: 0,
|
schedulingUserId: ""
|
};
|
detailsTableData.value = [];
|
copyForm.value = null;
|
dialogType.value = "add";
|
};
|
|
const editInitialization = async (type, data) => {
|
//清空form
|
Initialization();
|
productionQuantity.value = data.schedulingNum;
|
pendingNum.value = data.schedulingNum - data.successNum;
|
copyForm.value = deepClone(data);
|
tableData.value = data.productionInventoryList || [];
|
detailsTableData.value = data.productionList || [];
|
dialogType.value = type;
|
const existingOfficialIds = tableData.value
|
.map((item) => item.officialId)
|
.filter((id) => id);
|
selectedIds.value = existingOfficialIds;
|
|
};
|
// 监听对话框状态,在打开时设置选中状态
|
watch(innerVisible, (newVal) => {
|
if (newVal && selectedIds.value.length > 0) {
|
setTimeout(() => setTableSelection(selectedIds.value), 200);
|
}
|
// 对话框关闭时清空选择状态
|
if (!newVal) {
|
formalDatabaseSelectedData.value = [];
|
}
|
});
|
|
defineExpose({
|
Initialization,
|
editInitialization,
|
});
|
const handleSelectData = (row) => {
|
tableData.value = [];
|
if (!innerVisible.value) return;
|
const selectedData = formalDatabaseSelectedData.value;
|
if (selectedData.length === 0) {
|
ElMessage.warning("请至少选择一条数据");
|
return;
|
}
|
let addedCount = 0;
|
let duplicateCount = 0;
|
selectedData.forEach((item) => {
|
const newItem = {
|
...item, // 复制所有原始数据
|
officialId: item.id, // 保存原始的id作为officialId
|
usedQuantity: 0, // 初始使用数量为0
|
// 可以根据需要添加其他字段
|
};
|
tableData.value.push(newItem);
|
addedCount++;
|
});
|
|
// 更新selectedIds,确保包含所有当前tableData中的officialId
|
const allOfficialIds = tableData.value
|
.map((item) => item.officialId)
|
.filter((id) => id);
|
selectedIds.value = allOfficialIds;
|
|
// 关闭选择对话框
|
innerVisible.value = false;
|
|
// 显示结果消息
|
let message = "";
|
if (addedCount > 0) {
|
message += `成功添加 ${addedCount} 条数据`;
|
}
|
if (duplicateCount > 0) {
|
message += (message ? "," : "") + `跳过 ${duplicateCount} 条重复数据`;
|
}
|
if (message) {
|
ElMessage.success(message);
|
} else {
|
ElMessage.info("没有新数据被添加");
|
}
|
};
|
const handleSelectionChange = (selection) => {
|
formalDatabaseSelectedData.value = selection;
|
};
|
// 提交表单 - 使用工具函数验证
|
const handleSubmit = async () => {
|
console.log(copyForm.value)
|
try{
|
const res = await work({id: copyForm.value.id,successNum: form.value.finishedNum,schedulingUserId: form.value.schedulingUserId})
|
if (res.code === 200) {
|
dialogVisible.value = false;
|
emit("success");
|
} else {
|
ElMessage.error("提交失败");
|
}
|
}catch (error){
|
ElMessage.error("提交失败,请重试");
|
}
|
};
|
// 关闭弹窗
|
const handleClose = () => {
|
dialogVisible.value = false;
|
};
|
|
// 使用数量验证 - 使用工具函数
|
const handleCellEdit = (row, prop, value) => {
|
if (prop === "usedQuantity") {
|
const validation = validateNumber(value, 0, Number(row.inventoryQuantity));
|
|
if (!validation.isValid) {
|
ElMessage.warning(validation.message);
|
row.usedQuantity = validation.value;
|
return;
|
}
|
|
row.usedQuantity = validation.value;
|
}
|
};
|
|
// 处理生产明细表格的操作 - 使用工具函数
|
const addNewRow = () => {
|
const newRow = createDefaultProductionRow(userInfo);
|
detailsTableData.value.push(newRow);
|
};
|
|
|
// 获取用户信息并加载基础数据
|
onMounted(async () => {
|
try {
|
let ress = await userListAll();
|
userList.value = ress.data;
|
userInfo = await userStore.getInfo();
|
} catch (error) {
|
ElMessage.error("初始化失败,请重试");
|
}
|
});
|
|
// 简化的事件处理函数
|
const handleDetailsChange = (data) => {
|
};
|
|
const handleDeleteRow = (index) => {
|
ElMessage.success(`已删除第 ${index + 1} 行数据`);
|
};
|
|
// 删除单个已选数据项
|
const handleRemoveItem = (row) => {
|
const index = tableData.value.findIndex(
|
(item) => item.officialId === row.officialId
|
);
|
if (index > -1) {
|
tableData.value.splice(index, 1);
|
|
// 更新selectedIds
|
const updatedOfficialIds = tableData.value
|
.map((item) => item.officialId)
|
.filter((id) => id);
|
selectedIds.value = updatedOfficialIds;
|
ElMessage.success("已删除选中项");
|
}
|
};
|
|
|
// 计算总使用量
|
const totalUsedQuantity = computed(() => {
|
return tableData.value.reduce((total, item) => {
|
const usedQty = Number(item.usedQuantity) || 0;
|
return total + usedQty;
|
}, 0);
|
});
|
</script>
|
|
<style scoped lang="scss">
|
.el-form {
|
.el-row {
|
padding-top: 20px;
|
background: rgba($color: #f8fafb, $alpha: 0.5);
|
}
|
}
|
|
.el-row > .el-col > h1 {
|
font-weight: bolder;
|
}
|
|
.empty-table > .el-row {
|
margin-bottom: 12px;
|
}
|
</style>
|