spring
7 天以前 a27edc14f632e878ede9c7b16de10b01626e938b
src/pages/qualityManagement/rawMaterial/form.vue
@@ -1,6 +1,6 @@
<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">
@@ -8,7 +8,11 @@
        <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>
@@ -28,12 +32,12 @@
        <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>
@@ -43,7 +47,7 @@
        <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>
@@ -53,12 +57,12 @@
        <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>
@@ -70,36 +74,36 @@
      <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>
@@ -123,7 +127,7 @@
    </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>
@@ -164,11 +168,23 @@
    </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>
@@ -187,6 +203,7 @@
const userStore = useUserStore()
const operationType = ref('add')
const isReadOnly = computed(() => operationType.value === 'detail')
const submitLoading = ref(false)
const form = reactive({
@@ -240,7 +257,7 @@
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()
}
@@ -270,6 +287,7 @@
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()
@@ -320,6 +338,7 @@
}
const handleSubmit = () => {
  if (isReadOnly.value) return
  if (submitLoading.value) return
  const msg = validate()
  if (msg) {
@@ -343,7 +362,7 @@
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