| | |
| | | <template> |
| | | <view class="rm-form-page"> |
| | | <PageHeader :title="operationType === 'add' ? '新增原料检' : '编辑原料检'" @back="goBack" /> |
| | | <PageHeader :title="operationType === 'add' ? '新增原料检' : (operationType === 'detail' ? '检测化验详情' : '编辑检测化验')" @back="goBack" /> |
| | | |
| | | <scroll-view scroll-y class="content-scroll"> |
| | | <view class="section-card"> |
| | |
| | | |
| | | <view class="form-row"> |
| | | <text class="form-label required">产品名称</text> |
| | | <view class="selector-trigger" @click="openProductSelector" :class="{ disabled: operationType === 'edit' }"> |
| | | <view |
| | | class="selector-trigger" |
| | | @click="!isReadOnly && openProductSelector()" |
| | | :class="{ disabled: operationType === 'edit' || isReadOnly }" |
| | | > |
| | | <text class="selector-text" :class="{ placeholder: !form.productName }"> |
| | | {{ form.productName || '请选择产品' }} |
| | | </text> |
| | |
| | | |
| | | <view class="form-row"> |
| | | <text class="form-label required">批号</text> |
| | | <up-input v-model="form.batchNo" placeholder="请输入批号" /> |
| | | <up-input v-model="form.batchNo" :disabled="isReadOnly" placeholder="请输入批号" /> |
| | | </view> |
| | | |
| | | <view class="form-row"> |
| | | <text class="form-label required">检验类型</text> |
| | | <view class="selector-trigger" @click="showCheckTypeSheet = true"> |
| | | <view class="selector-trigger" @click="!isReadOnly && (showCheckTypeSheet = true)"> |
| | | <text class="selector-text" :class="{ placeholder: form.checkType === '' || form.checkType == null }"> |
| | | {{ checkTypeLabel }} |
| | | </text> |
| | |
| | | |
| | | <view class="form-row"> |
| | | <text class="form-label required">检测结果</text> |
| | | <view class="selector-trigger" @click="showCheckResultSheet = true"> |
| | | <view class="selector-trigger" @click="!isReadOnly && (showCheckResultSheet = true)"> |
| | | <text class="selector-text" :class="{ placeholder: form.checkResult === '' || form.checkResult == null }"> |
| | | {{ checkResultLabel }} |
| | | </text> |
| | |
| | | |
| | | <view class="form-row"> |
| | | <text class="form-label required">检验员</text> |
| | | <up-input v-model="form.checkUserName" placeholder="请输入检验员" /> |
| | | <up-input v-model="form.checkUserName" :disabled="isReadOnly" placeholder="请输入检验员" /> |
| | | </view> |
| | | |
| | | <view class="form-row"> |
| | | <text class="form-label required">检测日期</text> |
| | | <view class="selector-trigger" @click="openCheckDatePicker"> |
| | | <view class="selector-trigger" @click="!isReadOnly && openCheckDatePicker()"> |
| | | <text class="selector-text" :class="{ placeholder: !form.checkTime }"> |
| | | {{ form.checkTime || '请选择检测日期' }} |
| | | </text> |
| | |
| | | <view class="section-card"> |
| | | <view class="section-title row-between"> |
| | | <text>检测项目</text> |
| | | <view class="btn-inline" @click="openItemSelector">添加检测项目</view> |
| | | <view class="btn-inline" v-if="!isReadOnly" @click="openItemSelector">添加检测项目</view> |
| | | </view> |
| | | |
| | | <view v-if="inspectItems.length > 0"> |
| | | <view v-for="(it, idx) in inspectItems" :key="it.id || idx" class="item-card"> |
| | | <view class="item-head"> |
| | | <text class="item-name">{{ it.name }}</text> |
| | | <view class="item-del" @click="removeItem(it.id)">删除</view> |
| | | <view class="item-del" v-if="!isReadOnly" @click="removeItem(it.id)">删除</view> |
| | | </view> |
| | | <view class="item-row"><text class="l">单位</text><text class="r">{{ it.unit || '-' }}</text></view> |
| | | <view class="item-row"><text class="l">标准值</text><text class="r">{{ it.standardValue || '-' }}</text></view> |
| | | <view class="item-row"><text class="l">内控值</text><text class="r">{{ it.internalControl || '-' }}</text></view> |
| | | <view class="item-row input-row"> |
| | | <text class="l">化验值</text> |
| | | <up-input v-model="it.testValue" placeholder="请输入" class="test-value-input" /> |
| | | <up-input v-model="it.testValue" :disabled="isReadOnly" placeholder="请输入" class="test-value-input" /> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <view v-else class="no-data">请添加检测项目</view> |
| | | <view v-else class="no-data">{{ isReadOnly ? '暂无检测项目' : '请添加检测项目' }}</view> |
| | | </view> |
| | | </scroll-view> |
| | | |
| | | <view class="bottom-bar"> |
| | | <view class="bottom-bar" v-if="!isReadOnly"> |
| | | <view class="btn-submit" :class="{ disabled: submitLoading }" @click="handleSubmit"> |
| | | {{ submitLoading ? '提交中...' : '保存' }} |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 产品选择弹窗(复用 pageModel 接口) --> |
| | | <up-popup :show="showProductPopup" mode="bottom" @close="showProductPopup = false"> |
| | | <up-popup :show="showProductPopup && !isReadOnly" mode="bottom" @close="showProductPopup = false"> |
| | | <view class="popup-wrap"> |
| | | <view class="popup-header"> |
| | | <text class="popup-title">选择产品</text> |
| | |
| | | </up-popup> |
| | | |
| | | <!-- 检测项目选择弹窗(简化:从检测项维护表里选) --> |
| | | <up-popup :show="showItemPopup" mode="bottom" @close="showItemPopup = false"> |
| | | <up-popup :show="showItemPopup && !isReadOnly" mode="bottom" @close="showItemPopup = false"> |
| | | <view class="popup-wrap"> |
| | | <view class="popup-header"> |
| | | <text class="popup-title">选择检测项目</text> |
| | |
| | | </up-popup> |
| | | |
| | | <!-- 选择器:检验类型/结果 --> |
| | | <up-action-sheet :actions="checkTypeActions" :show="showCheckTypeSheet" @close="showCheckTypeSheet = false" @select="onSelectCheckType" title="检验类型" /> |
| | | <up-action-sheet :actions="checkResultActions" :show="showCheckResultSheet" @close="showCheckResultSheet = false" @select="onSelectCheckResult" title="检测结果" /> |
| | | <up-action-sheet |
| | | :actions="checkTypeActions" |
| | | :show="showCheckTypeSheet && !isReadOnly" |
| | | @close="showCheckTypeSheet = false" |
| | | @select="onSelectCheckType" |
| | | title="检验类型" |
| | | /> |
| | | <up-action-sheet |
| | | :actions="checkResultActions" |
| | | :show="showCheckResultSheet && !isReadOnly" |
| | | @close="showCheckResultSheet = false" |
| | | @select="onSelectCheckResult" |
| | | title="检测结果" |
| | | /> |
| | | |
| | | <!-- 日期选择 --> |
| | | <up-popup :show="showCheckDatePicker" mode="bottom" @close="showCheckDatePicker = false"> |
| | | <up-popup :show="showCheckDatePicker && !isReadOnly" mode="bottom" @close="showCheckDatePicker = false"> |
| | | <up-datetime-picker :show="true" v-model="checkDateValue" mode="date" @confirm="onCheckDateConfirm" @cancel="showCheckDatePicker = false" /> |
| | | </up-popup> |
| | | </view> |
| | |
| | | const userStore = useUserStore() |
| | | |
| | | const operationType = ref('add') |
| | | const isReadOnly = computed(() => operationType.value === 'detail') |
| | | const submitLoading = ref(false) |
| | | |
| | | const form = reactive({ |
| | |
| | | const productList = ref([]) |
| | | const productLoading = ref(false) |
| | | const openProductSelector = () => { |
| | | if (operationType.value === 'edit') return |
| | | if (operationType.value === 'edit' || isReadOnly.value) return |
| | | showProductPopup.value = true |
| | | if (productList.value.length === 0) loadProductList() |
| | | } |
| | |
| | | const selectedItemIds = ref(new Set()) |
| | | const isItemSelected = (id) => selectedItemIds.value.has(id) |
| | | const openItemSelector = () => { |
| | | if (isReadOnly.value) return |
| | | showItemPopup.value = true |
| | | selectedItemIds.value = new Set(inspectItems.value.map(i => i.id)) |
| | | if (itemList.value.length === 0) loadItemList() |
| | |
| | | } |
| | | |
| | | const handleSubmit = () => { |
| | | if (isReadOnly.value) return |
| | | if (submitLoading.value) return |
| | | const msg = validate() |
| | | if (msg) { |
| | |
| | | onLoad((options) => { |
| | | operationType.value = options?.type || 'add' |
| | | const id = options?.id |
| | | if (operationType.value === 'edit' && id) { |
| | | if ((operationType.value === 'edit' || operationType.value === 'detail') && id) { |
| | | findRawMaterialDetail(id).then(res => { |
| | | const d = res?.data || {} |
| | | form.id = d.id |