| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <el-dialog |
| | | v-model="visible" |
| | | title="æ¸
åºè®°å½" |
| | | width="900px" |
| | | :close-on-click-modal="false" |
| | | destroy-on-close |
| | | > |
| | | <div class="clearance-record-form"> |
| | | <!-- åºæ¬ä¿¡æ¯åºå --> |
| | | <div class="basic-info"> |
| | | <table class="info-table"> |
| | | <tr> |
| | | <td class="label">产ååç§°</td> |
| | | <td class="value" colspan="3">{{ formData.productName }}</td> |
| | | <td class="label">çäº§æ¥æ</td> |
| | | <td class="value">{{ formData.productionDate }}</td> |
| | | </tr> |
| | | <tr> |
| | | <td class="label">è§æ ¼</td> |
| | | <td class="value">{{ formData.spec }}</td> |
| | | <td class="label">æ¹å·</td> |
| | | <td class="value">{{ formData.batchNo }}</td> |
| | | <td class="label">ç产车é´</td> |
| | | <td class="value">{{ formData.workshop }}</td> |
| | | </tr> |
| | | </table> |
| | | </div> |
| | | |
| | | <!-- æ¸
åºæ£æ¥é¡¹ç®è¡¨æ ¼ --> |
| | | <div class="check-items-section"> |
| | | <table class="check-table"> |
| | | <thead> |
| | | <tr> |
| | | <th class="item-no">åºå·</th> |
| | | <th class="content">æ¸
åºå
容åè¦æ±</th> |
| | | <th class="result" colspan="2">æ£æ¥ç»æ</th> |
| | | </tr> |
| | | </thead> |
| | | <tbody> |
| | | <tr v-for="(item, index) in formData.checkItems" :key="index"> |
| | | <td class="item-no">{{ item.itemNo }}</td> |
| | | <td class="content">{{ item.content }}</td> |
| | | <td class="result-option"> |
| | | <el-radio-group v-model="item.result"> |
| | | <el-radio label="符åè§å®">符åè§å®</el-radio> |
| | | </el-radio-group> |
| | | </td> |
| | | <td class="result-option"> |
| | | <el-radio-group v-model="item.result"> |
| | | <el-radio label="ä¸ç¬¦åè§å®">ä¸ç¬¦åè§å®</el-radio> |
| | | </el-radio-group> |
| | | </td> |
| | | </tr> |
| | | </tbody> |
| | | </table> |
| | | </div> |
| | | |
| | | <!-- ç¾ååºå --> |
| | | <div class="signature-section"> |
| | | <table class="signature-table"> |
| | | <tr> |
| | | <td class="label">æ¸
åºäºº</td> |
| | | <td class="value"> |
| | | <el-input v-model="formData.cleaner" placeholder="请è¾å
¥æ¸
åºäºº" clearable /> |
| | | </td> |
| | | <td class="label">æ¥æ</td> |
| | | <td class="value"> |
| | | <el-date-picker |
| | | v-model="formData.cleanDate" |
| | | type="datetime" |
| | | placeholder="éæ©æ¥ææ¶é´" |
| | | format="YYYY-MM-DD HH:mm:ss" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | style="width: 100%" |
| | | /> |
| | | </td> |
| | | <td class="label">æ£æ¥äºº</td> |
| | | <td class="value"> |
| | | <el-input v-model="formData.inspector" placeholder="请è¾å
¥æ£æ¥äºº" clearable /> |
| | | </td> |
| | | <td class="label">æ¥æ</td> |
| | | <td class="value"> |
| | | <el-date-picker |
| | | v-model="formData.inspectDate" |
| | | type="datetime" |
| | | placeholder="éæ©æ¥ææ¶é´" |
| | | format="YYYY-MM-DD HH:mm:ss" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | style="width: 100%" |
| | | /> |
| | | </td> |
| | | </tr> |
| | | </table> |
| | | </div> |
| | | </div> |
| | | |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button @click="handleCancel">å æ¶</el-button> |
| | | <el-button type="primary" :loading="saving" @click="handleSave">ä¿ å</el-button> |
| | | </span> |
| | | </template> |
| | | </el-dialog> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive, watch, computed } from 'vue'; |
| | | import dayjs from 'dayjs'; |
| | | |
| | | const props = defineProps({ |
| | | modelValue: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | orderData: { |
| | | type: Object, |
| | | default: () => ({}) |
| | | } |
| | | }); |
| | | |
| | | const emit = defineEmits(['update:modelValue', 'save']); |
| | | |
| | | const visible = computed({ |
| | | get: () => props.modelValue, |
| | | set: (val) => emit('update:modelValue', val) |
| | | }); |
| | | |
| | | const saving = ref(false); |
| | | |
| | | // é»è®¤æ£æ¥é¡¹ç® |
| | | const defaultCheckItems = [ |
| | | { itemNo: 1, content: '车é´å
æ åæ¹éçç©ãåºå¼ç©ã', result: '符åè§å®', remark: '' }, |
| | | { itemNo: 2, content: '车é´å
æ æ å
³æä»¤ãè§ç¨ãè®°å½çã', result: '符åè§å®', remark: '' }, |
| | | { itemNo: 3, content: 'æ¡é¢ãå·¥ä½å°åºæ¸
æ´ï¼æ å°ãæ å¢ã', result: '符åè§å®', remark: '' }, |
| | | { itemNo: 4, content: 'å°é¢æ¸
æ´ï¼æ 积å°ãæç©ã', result: '符åè§å®', remark: '' }, |
| | | { itemNo: 5, content: '设å¤åé¨ä»¶å
ãå¤åºæ¸
æ´ï¼æ å¼ç©ã', result: '符åè§å®', remark: '' }, |
| | | { itemNo: 6, content: '容å¨å
·åºæ¸
æ´æ å¼ç©ï¼å¹¶ç½®æå®ä½ç½®', result: '符åè§å®', remark: '' }, |
| | | { itemNo: 7, content: 'å«çæ´å
·æ¸
æ´ï¼å¹¶ç½®æå®ä½ç½®', result: '符åè§å®', remark: '' }, |
| | | { itemNo: 8, content: 'å
¶å®', result: '符åè§å®', remark: '' } |
| | | ]; |
| | | |
| | | const formData = reactive({ |
| | | orderId: '', |
| | | productName: '', |
| | | productionDate: '', |
| | | spec: '', |
| | | batchNo: '', |
| | | workshop: '', |
| | | checkItems: JSON.parse(JSON.stringify(defaultCheckItems)), |
| | | cleaner: '', |
| | | cleanDate: '', |
| | | inspector: '', |
| | | inspectDate: '' |
| | | }); |
| | | |
| | | // çå¬å¼¹æ¡æå¼ï¼åå§åæ°æ® |
| | | watch(() => props.modelValue, (val) => { |
| | | if (val && props.orderData) { |
| | | initFormData(); |
| | | } |
| | | }); |
| | | |
| | | const initFormData = () => { |
| | | const order = props.orderData; |
| | | |
| | | const cleanRecord = order.cleanRecord || order.clearanceRecord; |
| | | if (cleanRecord) { |
| | | try { |
| | | const record = typeof cleanRecord === 'string' |
| | | ? JSON.parse(cleanRecord) |
| | | : cleanRecord; |
| | | |
| | | // å è½½åºæ¬å段 |
| | | formData.orderId = record.orderId || order.npsNo || ''; |
| | | formData.productName = record.productName || order.productCategory || ''; |
| | | formData.productionDate = record.productionDate || (order.startTime ? dayjs(order.startTime).format('YYYY-MM-DD') : dayjs().format('YYYY-MM-DD')); |
| | | formData.spec = record.spec || order.specificationModel || ''; |
| | | formData.batchNo = record.batchNo || order.batchNo || order.uidNo || ''; |
| | | formData.workshop = record.workshop || order.workshop || order.manufacturingTeam || ''; |
| | | |
| | | // å è½½æ£æ¥é¡¹ç®ï¼ä¿æé»è®¤ç»æä½æ´æ°ç»æ |
| | | if (record.checkItems && Array.isArray(record.checkItems)) { |
| | | formData.checkItems = defaultCheckItems.map((defaultItem, index) => { |
| | | const savedItem = record.checkItems.find(item => item.itemNo === defaultItem.itemNo); |
| | | return { |
| | | ...defaultItem, |
| | | result: savedItem?.result || '符åè§å®', |
| | | remark: savedItem?.remark || '' |
| | | }; |
| | | }); |
| | | } else { |
| | | formData.checkItems = JSON.parse(JSON.stringify(defaultCheckItems)); |
| | | } |
| | | |
| | | // å è½½ç¾åä¿¡æ¯ |
| | | formData.cleaner = record.cleaner || ''; |
| | | formData.cleanDate = record.cleanDate || dayjs().format('YYYY-MM-DD HH:mm:ss'); |
| | | formData.inspector = record.inspector || ''; |
| | | formData.inspectDate = record.inspectDate || dayjs().format('YYYY-MM-DD HH:mm:ss'); |
| | | } catch (e) { |
| | | console.error('è§£ææ¸
åºè®°å½æ°æ®å¤±è´¥:', e); |
| | | resetFormData(order); |
| | | } |
| | | } else { |
| | | resetFormData(order); |
| | | } |
| | | }; |
| | | |
| | | const resetFormData = (order) => { |
| | | // éç½®æ£æ¥é¡¹ç® |
| | | formData.checkItems = JSON.parse(JSON.stringify(defaultCheckItems)); |
| | | |
| | | // èªå¨å¸¦å
¥è®¢åæ°æ® |
| | | formData.orderId = order.npsNo || ''; |
| | | formData.productName = order.productCategory || ''; |
| | | formData.productionDate = order.startTime ? dayjs(order.startTime).format('YYYY-MM-DD') : dayjs().format('YYYY-MM-DD'); |
| | | formData.spec = order.specificationModel || ''; |
| | | formData.batchNo = order.batchNo || order.uidNo || ''; |
| | | formData.workshop = order.workshop || order.manufacturingTeam || ''; |
| | | |
| | | // æ¸
åºäººåæ£æ¥äººé»è®¤ä¸ºç©ºï¼æ¥æé»è®¤ä¸ºå½åæ¶é´ |
| | | formData.cleaner = ''; |
| | | formData.cleanDate = dayjs().format('YYYY-MM-DD HH:mm:ss'); |
| | | formData.inspector = ''; |
| | | formData.inspectDate = dayjs().format('YYYY-MM-DD HH:mm:ss'); |
| | | }; |
| | | |
| | | const handleCancel = () => { |
| | | visible.value = false; |
| | | }; |
| | | |
| | | const handleSave = () => { |
| | | // éªè¯å¿
填项 |
| | | if (!formData.cleaner) { |
| | | ElMessage.warning('请è¾å
¥æ¸
åºäºº'); |
| | | return; |
| | | } |
| | | if (!formData.cleanDate) { |
| | | ElMessage.warning('è¯·éæ©æ¸
åºæ¥æ'); |
| | | return; |
| | | } |
| | | if (!formData.inspector) { |
| | | ElMessage.warning('请è¾å
¥æ£æ¥äºº'); |
| | | return; |
| | | } |
| | | if (!formData.inspectDate) { |
| | | ElMessage.warning('è¯·éæ©æ£æ¥æ¥æ'); |
| | | return; |
| | | } |
| | | |
| | | // æé ä¿åçJSONæ°æ® |
| | | const saveData = { |
| | | orderId: formData.orderId, |
| | | productName: formData.productName, |
| | | productionDate: formData.productionDate, |
| | | spec: formData.spec, |
| | | batchNo: formData.batchNo, |
| | | workshop: formData.workshop, |
| | | checkItems: formData.checkItems.map(item => ({ |
| | | itemNo: item.itemNo, |
| | | content: item.content, |
| | | result: item.result, |
| | | remark: item.remark || undefined |
| | | })), |
| | | cleaner: formData.cleaner, |
| | | cleanDate: formData.cleanDate, |
| | | inspector: formData.inspector, |
| | | inspectDate: formData.inspectDate |
| | | }; |
| | | |
| | | // ç§»é¤undefinedåæ®µ |
| | | saveData.checkItems = saveData.checkItems.map(item => { |
| | | if (!item.remark) delete item.remark; |
| | | return item; |
| | | }); |
| | | |
| | | saving.value = true; |
| | | emit('save', saveData, () => { |
| | | saving.value = false; |
| | | visible.value = false; |
| | | }); |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | .clearance-record-form { |
| | | .basic-info { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .info-table { |
| | | width: 100%; |
| | | border-collapse: collapse; |
| | | border: 1px solid #dcdfe6; |
| | | |
| | | td { |
| | | border: 1px solid #dcdfe6; |
| | | padding: 10px; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .label { |
| | | background-color: #f5f7fa; |
| | | width: 100px; |
| | | text-align: center; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .value { |
| | | background-color: #fff; |
| | | min-width: 150px; |
| | | } |
| | | } |
| | | |
| | | .check-items-section { |
| | | margin-bottom: 10px; |
| | | |
| | | .check-table { |
| | | width: 100%; |
| | | border-collapse: collapse; |
| | | border: 1px solid #dcdfe6; |
| | | |
| | | th, td { |
| | | border: 1px solid #dcdfe6; |
| | | padding: 12px 10px; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | th { |
| | | background-color: #f5f7fa; |
| | | font-weight: 500; |
| | | text-align: center; |
| | | } |
| | | |
| | | .item-no { |
| | | width: 60px; |
| | | text-align: center; |
| | | } |
| | | |
| | | .content { |
| | | text-align: left; |
| | | padding-left: 15px; |
| | | } |
| | | |
| | | .result { |
| | | width: 200px; |
| | | text-align: center; |
| | | } |
| | | |
| | | .result-option { |
| | | width: 150px; |
| | | text-align: center; |
| | | |
| | | :deep(.el-radio-group) { |
| | | display: flex; |
| | | justify-content: center; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .remark-section { |
| | | margin-bottom: 20px; |
| | | padding: 0 10px; |
| | | } |
| | | |
| | | .signature-section { |
| | | .signature-table { |
| | | width: 100%; |
| | | border-collapse: collapse; |
| | | border: 1px solid #dcdfe6; |
| | | |
| | | td { |
| | | border: 1px solid #dcdfe6; |
| | | padding: 10px; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .label { |
| | | background-color: #f5f7fa; |
| | | width: 80px; |
| | | text-align: center; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .value { |
| | | background-color: #fff; |
| | | min-width: 150px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .dialog-footer { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | gap: 10px; |
| | | } |
| | | </style> |