Files
ys-app/src/pages/business/EQF/components/gkQualityFeedbackDetailComponent.vue
2025-09-29 15:40:03 +08:00

388 lines
13 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<uni-forms ref="formRef" :model="formData" :rules="rules" label-width="100px" label-position="top">
<uni-forms-item label="合同号" name="cusName" class="f-c-right">
<view @click="chooseCustomer" class="form-item-container">
<text class="name">{{ formData.gkOrder || '点击选择合同数据' }}</text>
</view>
</uni-forms-item>
<uni-forms-item label="合同号" name="gkOrder" class="f-c-right">
<uni-easyinput v-model="formData.gkOrder" placeholder="请输入合同号" name="input" :disabled="isDisabled"/>
</uni-forms-item>
<uni-forms-item label="产品规格型号" name="gkProductSpec" class="f-c-right">
<uni-easyinput v-model="formData.gkProductSpec" placeholder="请输入产品规格型号" name="input" :disabled="isDisabled"/>
</uni-forms-item>
<uni-forms-item label="数量" name="gkAmount" class="f-c-right">
<uni-easyinput v-model="formData.gkAmount" type="text" placeholder="请输入供货数量" name="input" :disabled="isDisabled"/>
</uni-forms-item>
<uni-forms-item label="批号" name="gkTokenCode" class="f-c-right">
<uni-easyinput v-model="formData.gkTokenCode" placeholder="请输入批号" name="input" :disabled="isDisabled" />
</uni-forms-item>
<uni-forms-item label="母批号" name="gkMotherorderCode" class="f-c-right">
<uni-easyinput v-model="formData.gkMotherorderCode" placeholder="请输入母批号" name="input" :disabled="isDisabled"/>
</uni-forms-item>
<uni-forms-item label="图纸编号" name="gkDrawingNumber" class="f-c-right">
<uni-easyinput v-model="formData.gkDrawingNumber" placeholder="请输入图纸编号" name="input" :disabled="isDisabled"/>
</uni-forms-item>
<uni-forms-item label="技术负责人" name="gkTechnicalDirector" class="f-c-right">
<uni-easyinput v-model="formData.gkTechnicalDirector" placeholder="请输入技术负责人" name="input" :disabled="isDisabled"/>
</uni-forms-item>
<uni-forms-item label="产品ID" name="gkProductId" class="f-c-right">
<uni-easyinput v-model="formData.gkProductId" placeholder="请输入产品ID" name="input" :disabled="isDisabled"/>
</uni-forms-item>
</uni-forms>
<view class="footer-con">
<button class="btn-default" type="default" @click="handleDeleteDetailItem" size="mini" v-if="false">删除</button>
<button class="btn-primary" type="primary" @click="submitForm" size="mini">保存</button>
</view>
</template>
<script setup name="gkQualityFeedbackDetailComponent">
import { ref, reactive } from 'vue'
import cache from '../../../../utils/cache'
import { onShow,onLoad, onUnload } from '@dcloudio/uni-app';
import {
qualityFeedbackGkDetailAdd
} from '@/api/eqf/qualityFeedback.js'
let isDisabled = ref(false)
const props = defineProps({
cusName: String, //客户单位名称
cusId: Number, //客户ID
feedbackId: Number, //质量反馈ID
status: String //状态
})
// 表单数据
const formData = ref({
customerCode: '',
batchNumber: '',
supplyQuantity: '',
specificationModel: '',
motherBatch: '',
materialId: '',
eqfId: '',
drawingNumber:'',
technicalDirector:'',
});
// 验证规则
const rules = {
contractNumber: {
rules: [
{ required: true, errorMessage: '请输入合同号' }
]
},
batchNumber: {
rules: [
{ required: true, errorMessage: '请输入批号' }
]
},
supplyQuantity: {
rules: [
{ required: true, errorMessage: '请输入供货数量' },
{ type: 'number', errorMessage: '请输入数字' }
]
},
specificationModel: {
rules: [
{ required: true, errorMessage: '请输入产品规格型号' }
]
}
};
// 表单ref
const formRef = ref(null);
onLoad((options) => {
//清空表单
clearForm()
// 然后设置eqfId
if (options && options.id) {
formData.value.eqfId = options.id;
}
// 清除相关缓存,确保首次加载时没有旧数据干扰
cache.remove(`qualityFeedbackDetail_${options?.id || ''}`);
})
//获取当前外反的明细
const detailList = ref([])
const getQualityFeedbackDetail = async () => {
let param = {
eqfId: formData.value.eqfId
}
let detailRes = await qualityFeedbackDetailAdd(param);
detailList.value = detailRes.rows[0];
}
//删除明细项的内容
function handleDeleteDetailItem() {
// 使用本地存储或其他方式暂存删除操作
uni.showToast({
title: '删除成功',
duration: 2000
});
//清空表单
clearForm()
}
// 清空表单
function clearForm() {
formData.value.gkOrder = ''
formData.value.gkProductSpec = ''
formData.value.gkAmount = ''
formData.value.gkTokenCode = ''
formData.value.gkMotherorderCode = ''
formData.value.gkDrawingNumber = ''
formData.value.gkTechnicalDirector = ''
formData.value.gkProductId = ''
}
// 选择合同页面跳转
function chooseCustomer() {
uni.navigateTo({
url: '/pages/business/EQF/components/gkCustomerOrder'
})
}
// 提交表单
const submitForm = async () => {
try {
// 表单校验
await formRef.value.validate()
console.log(formData,"5555")
const res = await qualityFeedbackGkDetailAdd(formData.value);
uni.showToast({
title: '提交成功',
icon: 'success'
})
// 发送刷新列表事件,同时支持两种事件名称以兼容现有代码
uni.$emit('refreshMarketList');
uni.$emit('refreshFeedbackList');
setTimeout(() => {
uni.navigateBack(1);
}, 1500);
console.log('表单数据:', formData.value)
} catch (err) {
console.log('表单验证失败:', err)
}
}
//页面渲染完成后,查询详情
onShow(() => {
// Try to load from cache if available
const cachedData = cache.get(`qualityFeedbackDetail_${props.feedbackId}`);
if (cachedData) {
formData.value = {
...formData.value,
...cachedData
};
}
if (props.status == '完成') {
isDisabled.value = true
} else {
isDisabled.value = false
}
// 监听客户订单选择事件
uni.$on('onCustomerSelected', handleCustomerSelected);
});
// 处理客户订单选择结果
function handleCustomerSelected(data) {
// 确保数据存在
if (!data || typeof data !== 'object') {
console.error('无效的数据:', data);
return;
}
// 如果返回的是对象
let selectedItems = [];
console.log('接收到的数据:', data);
// 兼容新格式
selectedItems = data.originalData || [];
if (selectedItems && selectedItems.length > 0) {
// 清空表单
clearForm();
console.log('选中的项目数量:', selectedItems.length);
console.log('选中的项目详情:', selectedItems);
// 循环拼接所有选中项目的字段
const gkOrder = selectedItems.map(item => item.gkOrder || '').filter(Boolean);
const gkProductSpec = selectedItems.map(item => item.gkProductSpec || '').filter(Boolean);
const gkAmount = selectedItems.map(item => item.gkAmount || '').filter(Boolean);
const gkTokenCode = selectedItems.map(item => item.gkTokenCode || '').filter(Boolean);
const gkMotherorderCode = selectedItems.map(item => item.gkMotherorderCode || '').filter(Boolean);
const gkDrawingNumber = selectedItems.map(item => item.gkDrawingNumber || '').filter(Boolean);
const gkTechnicalDirector = selectedItems.map(item => item.gkTechnicalDirector || '').filter(Boolean);
const gkProductId = selectedItems.map(item => item.gkProductId || '').filter(Boolean);
console.log('拼接前的合同号:', gkOrder);
// 使用nextTick确保DOM更新
setTimeout(() => {
formData.value.gkOrder = gkOrder.join(',');
formData.value.gkProductSpec = gkProductSpec.join(',');
formData.value.gkAmount = gkAmount.join(',');
formData.value.gkTokenCode = gkTokenCode.join(',');
formData.value.gkMotherorderCode = gkMotherorderCode.join(',');
formData.value.gkDrawingNumber = gkDrawingNumber.join(',');
formData.value.gkTechnicalDirector = gkTechnicalDirector.join(',');
formData.value.gkProductId = gkProductId.join(',');
console.log('设置后的表单数据:', formData.value);
}, 0);
// 显示提示信息
uni.showToast({
title: `已选择${selectedItems.length}个批次`,
icon: 'none',
duration: 2000
});
// 保存到缓存
cache.set(`qualityFeedbackDetail_${props.feedbackId || ''}`, formData.value);
}
};
// 页面卸载时移除事件监听
onUnload(() => {
uni.$off('onCustomerSelected', handleCustomerSelected);
});
// 处理批号变化,自动查询数据
const handleBatchNumberChange = async (value) => {
const trimmedValue = value?.trim() || '';
// 防止空值查询
if (!trimmedValue) {
console.log('批号为空,不执行查询');
return;
}
try {
// 显示加载提示
uni.showLoading({
title: '查询中...',
});
const param = { batchNumber: value };
console.log('查询参数:', param);
// 尝试从缓存获取数据,减少重复请求
const cacheKey = `batchInfo_${trimmedValue}`;
let batchInfo = cache.get(cacheKey);
console.log('缓存数据:', batchInfo);
if (1==1) {
// 调用API获取数据
console.log('准备调用API...');
let apiData
try {
const res = await getMockBatchData(param);
console.log('API响应原始数据:', res);
// 根据isTransformResponse=false的设置正确处理响应数据
// 修复4: 处理可能的嵌套数据结构
apiData = res;
// 检查是否有data字段适应不同的响应结构
if (res.data !== undefined) {
apiData = res.data;
}
} catch (apiError) {
console.error('API调用直接失败:', apiError);
// 重新抛出错误让外层catch处理
throw new Error(`API调用失败: ${apiError?.message || '未知错误'}`);
}
console.log('处理后的数据:', apiData);
if (typeof apiData === 'object' && apiData !== null) {
// 提取并格式化有用的数据
batchInfo = {
supplyQuantity: apiData.supplyQuantity || '',
specificationModel: apiData.specificationModel || '',
motherBatch: apiData.motherBatch || '',
materialId: apiData.materialId || '',
batchNumber: trimmedValue // 确保不会覆盖用户已输入的批号
};
// 保存到缓存过期时间设置为1小时
cache.set(cacheKey, batchInfo, 3600000);
// 安全更新表单数据避免覆盖整个formData对象
formData.value.batchNumber = trimmedValue;
formData.value.supplyQuantity = apiData.rows[0].amount || '';
formData.value.specificationModel = apiData.rows[0].itemName || '';
formData.value.motherBatch = apiData.rows[0].texing || '';
formData.value.materialId = apiData.rows[0].materialId || '';
formData.value.customerCode = apiData.rows[0].orderCode || '';
console.log('apiData:', apiData.rows[0]);
console.log('更新后的formData:', formData.value);
// 显示查询成功提示
uni.showToast({
title: '查询成功',
duration: 2000
});
} else {
// 没有数据时的处理
console.log('未查询到相关数据');
uni.showToast({
title: '未查询到相关数据',
icon: 'none',
duration: 2000
});
}
} else {
// 使用缓存数据更新表单
formData.value = {
...formData.value,
...batchInfo,
// 确保不会覆盖用户正在输入的批号
batchNumber: trimmedValue
};
}
} catch (error) {
console.error('查询批号数据失败:', error);
uni.showToast({
title: '查询失败,请重试',
icon: 'none',
duration: 2000
});
} finally {
// 隐藏加载提示
uni.hideLoading();
}
};
// 明确暴露给父组件的方法
defineExpose({
clearForm
})
</script>
<style scoped>
.footer-con {
display: flex;
justify-content: flex-end;
padding: 20rpx;
gap: 20rpx;
}
.btn-default {
background-color: #f0f0f0;
color: #333;
}
.btn-primary {
background-color: #6FA2F8;
color: #fff;
}
</style>