| | |
| | | <template> |
| | | <el-dialog |
| | | v-model="visible" |
| | | :title="isEdit ? '编辑设备领用' : '新增设备领用'" |
| | | :title="isReturnMode ? '设备归还' : (isEdit ? '编辑设备领用' : '新增设备领用')" |
| | | width="600px" |
| | | @close="handleClose" |
| | | > |
| | |
| | | <el-select |
| | | v-model="form.userId" |
| | | placeholder="请选择" |
| | | :disabled="isViewMode" |
| | | :disabled="isViewMode || isReturnMode" |
| | | @change="getEquipment" |
| | | > |
| | | <el-option |
| | |
| | | <el-select |
| | | v-model="form.equipmentId" |
| | | placeholder="请选择" |
| | | :disabled="isViewMode" |
| | | :disabled="isViewMode || isReturnMode" |
| | | > |
| | | <el-option |
| | | v-for="item in equipmentList" |
| | |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="设备库存" prop="equipmentStock"> |
| | | <el-form-item label="设备库存" prop="equipmentStock" v-if="!isReturnMode && formData.status !== 2"> |
| | | <el-input |
| | | :value=" |
| | | equipmentList.find((item) => item.id == form.equipmentId) |
| | |
| | | style="width: 100%" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="领用数量" prop="usageQuantity"> |
| | | <el-form-item label="已使用数量" prop="usedQuantity" v-if="isReturnMode"> |
| | | <el-input |
| | | :value="formData.usageQuantity" |
| | | disabled |
| | | style="width: 100%" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="已归还数量" prop="returnedQuantity" v-if="isReturnMode"> |
| | | <el-input |
| | | :value="formData.totalReturnNo || 0" |
| | | disabled |
| | | style="width: 100%" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="领用数量" prop="usageQuantity" v-if="!isReturnMode && formData.status !== 2"> |
| | | <el-input-number |
| | | v-model="form.usageQuantity" |
| | | :min="1" |
| | |
| | | >(最多{{ maxQuantity }}台)</span |
| | | > |
| | | </el-form-item> |
| | | <el-form-item label="使用状态" prop="equipmentStatus"> |
| | | <!-- 编辑的时候自动匹配 --> |
| | | <el-select |
| | | v-model="form.equipmentStatus" |
| | | placeholder="请选择" |
| | | :disabled="isViewMode" |
| | | default-first-option |
| | | <el-form-item label="本次归还数量" prop="returnQuantity" v-if="isReturnMode"> |
| | | <el-input-number |
| | | v-model="form.returnQuantity" |
| | | :min="1" |
| | | :max="Math.max(1, remainingReturnQuantity)" |
| | | style="width: 100%" |
| | | :disabled="remainingReturnQuantity <= 0" |
| | | /> |
| | | <span |
| | | style="color: #999; font-size: 12px; margin-left: 8px" |
| | | v-if="remainingReturnQuantity > 0" |
| | | >(最多{{ remainingReturnQuantity }}台)</span |
| | | > |
| | | <el-option label="使用中" :value="1" /> |
| | | <el-option label="已归还" :value="2" :disabled="props.id" /> |
| | | </el-select> |
| | | <span |
| | | style="color: #ff4d4f; font-size: 12px; margin-left: 8px" |
| | | v-else |
| | | >(已全部归还)</span |
| | | > |
| | | </el-form-item> |
| | | <el-form-item label="使用开始时间" prop="usageStartTime"> |
| | | <!-- 使用开始时间 - 只在非归还模式显示 --> |
| | | <el-form-item label="使用开始时间" prop="usageStartTime" v-if="!isReturnMode"> |
| | | <el-date-picker |
| | | v-model="form.usageStartTime" |
| | | type="datetime" |
| | |
| | | :disabled="isViewMode" |
| | | /> |
| | | </el-form-item> |
| | | <!-- <el-form-item label="使用结束时间" prop="usageEndTime"> |
| | | |
| | | <!-- 归还结束时间 - 只在归还模式显示 --> |
| | | <el-form-item label="归还时间" prop="returnTime" v-if="isReturnMode"> |
| | | <el-date-picker |
| | | v-model="form.usageEndTime" |
| | | v-model="form.returnTime" |
| | | type="datetime" |
| | | placeholder="选择结束时间" |
| | | placeholder="选择归还时间" |
| | | style="width: 100%" |
| | | value-format="YYYY-MM-DD" |
| | | format="YYYY-MM-DD" |
| | | /> |
| | | </el-form-item> --> |
| | | </el-form-item> |
| | | <el-form-item label="备注" prop="remarks"> |
| | | <el-input |
| | | v-model="form.remarks" |
| | |
| | | type: Object, |
| | | default: () => ({}), |
| | | }, |
| | | beforeClose: { |
| | | type: Function, |
| | | default: () => {}, |
| | | }, |
| | | addOrEdit: { |
| | | type: String, |
| | | default: "add", |
| | | }, |
| | | title: { |
| | | type: String, |
| | | default: "", |
| | | }, |
| | | equipmentStatus: { |
| | | type: [Number, String], // 允许数字或字符串 |
| | | default: 1, |
| | | }, |
| | | }); |
| | | const maxQuantity = computed(() => { |
| | |
| | | const isViewMode = computed( |
| | | () => |
| | | props.addOrEdit === "view" || |
| | | props.addOrEdit === "viewRow" || |
| | | Number(props.equipmentStatus) === 2 |
| | | props.addOrEdit === "viewRow" |
| | | ); |
| | | |
| | | // 判断是否为归还模式 |
| | | const isReturnMode = computed(() => props.addOrEdit === "return"); |
| | | |
| | | // 计算剩余可归还数量 |
| | | const remainingReturnQuantity = computed(() => { |
| | | if (!isReturnMode.value || !props.formData.usageQuantity) return 0; |
| | | |
| | | const totalUsageQuantity = props.formData.usageQuantity || 0; // 总使用数量 |
| | | const alreadyReturnedQuantity = props.formData.totalReturnNo || 0; // 已归还数量 |
| | | const remaining = totalUsageQuantity - alreadyReturnedQuantity; // 剩余可归还数量 |
| | | |
| | | return Math.max(0, remaining); // 确保不为负数 |
| | | }); |
| | | |
| | | const isEdit = computed(() => !!props.formData?.id); |
| | | const formRef = ref(); |
| | |
| | | userId: "", |
| | | equipmentId: "", |
| | | usageQuantity: 1, |
| | | equipmentStatus: 1, // 默认使用中 |
| | | usageStartTime: "", |
| | | returnQuantity: 1, |
| | | returnTime: "", |
| | | remarks: "", |
| | | }; |
| | | const form = ref({ ...defaultForm }); |
| | | |
| | | // 确保初始化时使用状态有默认值 |
| | | // 获取当前日期(YYYY-MM-DD格式) |
| | | const getCurrentDate = () => { |
| | | const now = new Date(); |
| | | const year = now.getFullYear(); |
| | | const month = String(now.getMonth() + 1).padStart(2, '0'); |
| | | const day = String(now.getDate()).padStart(2, '0'); |
| | | return `${year}-${month}-${day}`; |
| | | }; |
| | | |
| | | // 确保初始化时获取设备列表 |
| | | onMounted(() => { |
| | | if ( |
| | | form.value.equipmentStatus === undefined || |
| | | form.value.equipmentStatus === null |
| | | ) { |
| | | console.log(form.value.equipmentStatus); |
| | | form.value.equipmentStatus = 1; |
| | | } |
| | | getEquipment(); |
| | | }); |
| | | |
| | |
| | | () => props.formData, |
| | | (val) => { |
| | | if (val && Object.keys(val).length > 0) { |
| | | // 编辑模式,直接赋值,不使用默认值合并 |
| | | form.value = { ...val }; |
| | | |
| | | // 归还模式初始化 |
| | | if (isReturnMode.value) { |
| | | form.value.returnTime = getCurrentDate(); |
| | | const maxReturnQuantity = remainingReturnQuantity.value; |
| | | form.value.returnQuantity = maxReturnQuantity > 0 ? Math.min(1, maxReturnQuantity) : 0; |
| | | } |
| | | } else { |
| | | // 新增模式,使用默认值 |
| | | form.value = { ...defaultForm }; |
| | | } |
| | | }, |
| | | { immediate: true } |
| | | ); |
| | | |
| | | const rules = { |
| | | userId: [{ required: true, message: "请输入领用人", trigger: "blur" }], |
| | | equipmentId: [{ required: true, message: "请输入设备ID", trigger: "blur" }], |
| | | usageQuantity: [ |
| | | { required: true, message: "请输入领用数量", trigger: "blur" }, |
| | | { type: "number", min: 1, message: "至少领用1台", trigger: "blur" }, |
| | | { |
| | | validator: (rule, value, callback) => { |
| | | if (maxQuantity.value !== null && value > maxQuantity.value) { |
| | | callback(new Error("领用数量不能大于设备数量")); |
| | | } else { |
| | | callback(); |
| | | } |
| | | }, |
| | | trigger: "blur", |
| | | }, |
| | | ], |
| | | equipmentStatus: [ |
| | | { required: true, message: "请选择使用状态", trigger: "change" }, |
| | | ], |
| | | usageStartTime: [ |
| | | { required: true, message: "请选择开始时间", trigger: "change" }, |
| | | ], |
| | | }; |
| | | const rules = computed(() => { |
| | | const baseRules = { |
| | | userId: [{ required: true, message: "请输入领用人", trigger: "blur" }], |
| | | equipmentId: [{ required: true, message: "请输入设备ID", trigger: "blur" }], |
| | | }; |
| | | |
| | | if (isReturnMode.value) { |
| | | // 归还模式的验证规则 |
| | | return { |
| | | ...baseRules, |
| | | returnQuantity: [ |
| | | { required: true, message: "请输入归还数量", trigger: "blur" }, |
| | | { type: "number", min: 1, message: "至少归还1台", trigger: "blur" }, |
| | | { |
| | | validator: (rule, value, callback) => { |
| | | const remaining = remainingReturnQuantity.value; |
| | | if (remaining <= 0) { |
| | | callback(new Error("已全部归还,无法继续归还")); |
| | | } else if (value > remaining) { |
| | | callback(new Error(`归还数量不能大于剩余可归还数量(${remaining}台)`)); |
| | | } else { |
| | | callback(); |
| | | } |
| | | }, |
| | | trigger: "blur", |
| | | }, |
| | | ], |
| | | returnTime: [ |
| | | { required: true, message: "请选择归还时间", trigger: "change" }, |
| | | ], |
| | | }; |
| | | } else { |
| | | // 新增/编辑模式的验证规则 |
| | | return { |
| | | ...baseRules, |
| | | usageQuantity: [ |
| | | { required: true, message: "请输入领用数量", trigger: "blur" }, |
| | | { type: "number", min: 1, message: "至少领用1台", trigger: "blur" }, |
| | | { |
| | | validator: (rule, value, callback) => { |
| | | if (maxQuantity.value !== null && value > maxQuantity.value) { |
| | | callback(new Error("领用数量不能大于设备数量")); |
| | | } else { |
| | | callback(); |
| | | } |
| | | }, |
| | | trigger: "blur", |
| | | }, |
| | | ], |
| | | usageStartTime: [ |
| | | { required: true, message: "请选择开始时间", trigger: "change" }, |
| | | ], |
| | | }; |
| | | } |
| | | }); |
| | | |
| | | function handleClose() { |
| | | emit("update:modelValue", false); |
| | |
| | | function handleSubmit() { |
| | | formRef.value.validate((valid) => { |
| | | if (!valid) return; |
| | | let res = addOrEditUsageRecord(form.value); |
| | | emit("submit", { ...form.value }); |
| | | |
| | | let submitData = { ...form.value }; |
| | | |
| | | // 归还模式处理 |
| | | if (isReturnMode.value) { |
| | | const currentReturnQuantity = form.value.returnQuantity; |
| | | const totalUsageQuantity = props.formData.usageQuantity; |
| | | const alreadyReturnedQuantity = props.formData.totalReturnNo || 0; |
| | | const newTotalReturnedQuantity = alreadyReturnedQuantity + currentReturnQuantity; |
| | | |
| | | submitData = { |
| | | ...props.formData, |
| | | totalReturnNo: newTotalReturnedQuantity, |
| | | returnQuantity: currentReturnQuantity, |
| | | returnTime: form.value.returnTime, |
| | | equipmentStatus: 2, |
| | | remarks: form.value.remarks, |
| | | usageQuantity: totalUsageQuantity |
| | | }; |
| | | } |
| | | |
| | | addOrEditUsageRecord(submitData); |
| | | emit("submit", submitData); |
| | | handleClose(); |
| | | }); |
| | | } |