| | |
| | | <view class="info-label">项目名称</view> |
| | | <view class="info-value">{{ formData.fcheckItem }}</view> |
| | | </view> |
| | | <view v-if="parseHoleCount(formData.fcheckItem)" class="info-item"> |
| | | <view class="info-label">穴数</view> |
| | | <view class="info-value hole-count">{{ parseHoleCount(formData.fcheckItem) }}穴</view> |
| | | </view> |
| | | <view class="info-item"> |
| | | <view class="info-label">检验工具</view> |
| | | <view class="info-value">{{ formData.fcheckTool }}</view> |
| | |
| | | |
| | | <!-- 结果表格 --> |
| | | <view v-if="tableData.length>0" class="table-container"> |
| | | <view class="table-header"> |
| | | <!-- 有穴数时的表格头部 --> |
| | | <view v-if="parseHoleCount(formData.fcheckItem)" class="table-header"> |
| | | <view class="th">编号</view> |
| | | <view class="th">穴号</view> |
| | | <view class="th">记录值</view> |
| | | <view class="th">检验结果<i style="color: rgb(0 212 68);" |
| | | v-if="!(tableData.length < formData.checkQyt)">(输入已完成)</i></view> |
| | | <view class="th" v-if="current">操作</view> |
| | | </view> |
| | | |
| | | <!-- 无穴数时的表格头部 --> |
| | | <view v-else class="table-header"> |
| | | <view class="th">编号</view> |
| | | <view class="th">检验结果<i style="color: rgb(0 212 68);" |
| | | v-if="!(tableData.length < formData.checkQyt)">(输入已完成)</i></view> |
| | | <view class="th" v-if="current">操作</view> |
| | | </view> |
| | | |
| | | <view v-for="(item, index) in tableData" :key="index" class="table-row"> |
| | | <view class="td">{{ index + 1 }}</view> |
| | | <view class="td"> |
| | | <view :class="['result-badge', item.fcheckResu]"> |
| | | {{ item.fcheckResu }} |
| | | <!-- 有穴数时的表格行 --> |
| | | <template v-if="parseHoleCount(formData.fcheckItem)"> |
| | | <view v-for="(item, index) in completeHoleList" :key="index" class="table-row"> |
| | | <view class="td">{{ index + 1 }}</view> |
| | | <view class="td">{{ item.holeNumber }}穴</view> |
| | | <view class="td">{{ item.recordValue }}</view> |
| | | <view class="td"> |
| | | <view :class="['result-badge', getResultBadgeClass(item.resultStatus)]"> |
| | | {{ item.resultStatus }} |
| | | </view> |
| | | </view> |
| | | <view class="td" v-if="current"> |
| | | <button v-if="!item.isDefault && isNumber" class="btn danger-btn" @tap="toDetail(item)"> |
| | | 修改 |
| | | </button> |
| | | </view> |
| | | </view> |
| | | <view class="td" v-if="current"> |
| | | <button v-if="!isNumber" class="btn danger-btn" @tap="toggleResult(item)"> |
| | | {{ editResult(item.fcheckResu) }} |
| | | </button> |
| | | <button v-if="isNumber" class="btn danger-btn" @tap="toDetail(item)"> |
| | | 修改 |
| | | </button> |
| | | </template> |
| | | |
| | | <!-- 无穴数时的表格行 --> |
| | | <template v-else> |
| | | <view v-for="(item, index) in tableData" :key="index" class="table-row"> |
| | | <view class="td">{{ index + 1 }}</view> |
| | | <view class="td"> |
| | | <view :class="['result-badge', item.fcheckResu]"> |
| | | {{ item.fcheckResu }} |
| | | </view> |
| | | </view> |
| | | <view class="td" v-if="current"> |
| | | <button v-if="!isNumber" class="btn danger-btn" @tap="toggleResult(item)"> |
| | | {{ editResult(item.fcheckResu) }} |
| | | </button> |
| | | <button v-if="isNumber" class="btn danger-btn" @tap="toDetail(item)"> |
| | | 修改 |
| | | </button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | </view> |
| | | <view v-if="remarksPopup" class="overlay"> |
| | | <view class="popup"> |
| | |
| | | isFocus: false, // 新增,控制输入框聚焦 |
| | | } |
| | | }, |
| | | computed: { |
| | | // 生成完整的穴位列表(根据检验数量生成,穴号循环显示) |
| | | completeHoleList() { |
| | | const holeCount = this.parseHoleCount(this.formData.fcheckItem); |
| | | if (!holeCount) return this.tableData; |
| | | |
| | | const checkQyt = this.formData.checkQyt || 0; // 检验数量 |
| | | const completeList = []; |
| | | |
| | | // 根据检验数量生成记录,穴号循环显示 |
| | | for (let i = 1; i <= checkQyt; i++) { |
| | | // 计算当前记录的穴号(循环显示) |
| | | const holeNumber = ((i - 1) % holeCount) + 1; |
| | | |
| | | // 查找是否已有该位置的记录 |
| | | const existingRecord = this.tableData.find((item, index) => { |
| | | return index === i - 1; // 按顺序匹配 |
| | | }); |
| | | |
| | | if (existingRecord) { |
| | | // 如果已有记录,使用现有数据 |
| | | completeList.push({ |
| | | ...existingRecord, |
| | | holeNumber: holeNumber, |
| | | recordValue: existingRecord.fcheckResu || 'N/A', |
| | | resultStatus: this.getResultStatus(existingRecord.fcheckResu) || '未填写' |
| | | }); |
| | | } else { |
| | | // 如果没有记录,创建默认记录 |
| | | completeList.push({ |
| | | id: null, |
| | | holeNumber: holeNumber, |
| | | recordValue: 'N/A', |
| | | resultStatus: '未填写', |
| | | fcheckResu: null, |
| | | isDefault: true // 标记为默认记录 |
| | | }); |
| | | } |
| | | } |
| | | return completeList; |
| | | } |
| | | }, |
| | | methods: { |
| | | // 解析检验项目名称中的穴数 |
| | | parseHoleCount(checkItemName) { |
| | | if (!checkItemName) return null; |
| | | |
| | | // 匹配格式:尺寸检查(5穴)或 尺寸检查(5穴) |
| | | const match = checkItemName.match(/[((](\d+)穴[))]/); |
| | | return match ? parseInt(match[1]) : null; |
| | | }, |
| | | |
| | | // 根据记录值判断检验结果状态 |
| | | getResultStatus(recordValue) { |
| | | if (!recordValue) return ''; |
| | | |
| | | // 如果有上下限,根据数值判断 |
| | | if (this.formData.fupAllow && this.formData.fdownAllow) { |
| | | const numValue = parseFloat(recordValue); |
| | | if (isNaN(numValue)) return recordValue; |
| | | |
| | | if (numValue >= parseFloat(this.formData.fdownAllow) && |
| | | numValue <= parseFloat(this.formData.fupAllow)) { |
| | | return 'OK'; |
| | | } else { |
| | | return 'NG'; |
| | | } |
| | | } |
| | | |
| | | // 无上下限时,直接返回记录值 |
| | | return recordValue; |
| | | }, |
| | | |
| | | // 获取检验结果徽章的样式类 |
| | | getResultBadgeClass(resultStatus) { |
| | | switch(resultStatus) { |
| | | case 'OK': |
| | | return 'OK'; |
| | | case 'NG': |
| | | return 'NG'; |
| | | case '未填写': |
| | | return 'pending'; |
| | | default: |
| | | return 'default'; |
| | | } |
| | | }, |
| | | |
| | | // 添加新记录(用于未填写的穴位) |
| | | addNewRecord(item) { |
| | | // 这里可以触发填写逻辑,比如弹出输入框或跳转到填写页面 |
| | | // 暂时先显示提示 |
| | | this.$showMessage(`请填写第${item.holeNumber}穴的检验结果`); |
| | | }, |
| | | |
| | | // 防抖自动保存方法 |
| | | autoSaveResult() { |
| | | // 清除之前的定时器 |
| | |
| | | this.remarksPopup = true; |
| | | }, |
| | | saveResult() { |
| | | |
| | | let count = this.formData.checkQyt; |
| | | let fstand = "√"; |
| | | |
| | |
| | | } |
| | | |
| | | if (!/^-?\d+(\.\d+)?$/.test(this.formData.fcheckResu)) { |
| | | this.$showMessage("请输入正确的数值!"); |
| | | return; |
| | | this.$showMessage("请输入正确的数值!"); |
| | | return; |
| | | } |
| | | if (parseFloat(this.formData.fcheckResu) >= parseFloat(this.formData.fdownAllow) && parseFloat(this |
| | | .formData |
| | |
| | | }) |
| | | |
| | | }, |
| | | |
| | | goBack() { |
| | | uni.navigateBack() |
| | | }, |
| | |
| | | }) |
| | | }, |
| | | editResult(fcheckResu) { |
| | | if (fcheckResu == 'OK') { |
| | | return "改为不合格"; |
| | | } else { |
| | | return "改为合格"; |
| | | } |
| | | // 统一显示"改为不合格" |
| | | return "改为不合格"; |
| | | }, |
| | | toDetail(item) { |
| | | this.showPopup = !this.showPopup; |
| | |
| | | flex: 1; |
| | | padding: 12px; |
| | | font-weight: bold; |
| | | text-align: center; |
| | | } |
| | | } |
| | | |
| | |
| | | flex: 1; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | text-align: center; |
| | | } |
| | | } |
| | | } |
| | |
| | | &.NG { |
| | | background-color: rgba($danger-color, 0.1); |
| | | color: $danger-color; |
| | | } |
| | | |
| | | &.pending { |
| | | background-color: rgba(#f39c12, 0.1); |
| | | color: #f39c12; |
| | | } |
| | | |
| | | &.default { |
| | | background-color: rgba(#909399, 0.1); |
| | | color: #909399; |
| | | } |
| | | } |
| | | |
| | |
| | | opacity: 0.6; |
| | | cursor: not-allowed; |
| | | } |
| | | |
| | | .hole-count { |
| | | color: #409EFF; |
| | | font-weight: bold; |
| | | background-color: rgba(64, 158, 255, 0.1); |
| | | padding: 2px 8px; |
| | | border-radius: 4px; |
| | | display: inline-block; |
| | | } |
| | | </style> |