Jelajahi Sumber

更新移动端笼位申请

xukai 3 bulan lalu
induk
melakukan
9a12c6a980

+ 1 - 1
src/constants/pageConstants.ts

@@ -165,7 +165,7 @@ export interface CreateAnimalApplyLeavePayload {
 
 export interface TurnBackPayload {
   takeawayId: number // 申请带离ID
-  categoryId: string | null // 动物种类
+  // categoryId: string | null // 动物种类
   returnDate: string // 转回日期
   returnTransport: string // 转回方式
   accessCardReturn: number // 是否归还门禁卡

+ 94 - 70
src/view/animal/application/components/Application.vue

@@ -17,7 +17,7 @@
       >
         <h4 class="mb8 mt8">基本信息</h4>
         <el-row :gutter="20">
-          <el-col :span="12">
+          <el-col :span="24">
             <el-form-item
               label="课题名称"
               prop="projectGroupId"
@@ -35,7 +35,7 @@
               </el-select>
             </el-form-item>
           </el-col>
-          <el-col :span="12">
+          <el-col :span="24">
             <el-form-item
               label="姓名"
               prop="group"
@@ -48,12 +48,37 @@
           </el-col>
         </el-row>
 
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item
+              label="部门"
+              prop="deptName"
+            >
+              <el-input
+                v-model="userInfos.deptName"
+                disabled
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item
+              label="联系方式"
+              prop="phone"
+            >
+              <el-input
+                v-model="userInfos.phone"
+                disabled
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
         <h4 class="mb8 mt10">实验动物笼位预约信息</h4>
         <el-row
           class="mt10"
           :gutter="20"
         >
-          <el-col :span="12">
+          <el-col :span="24">
             <el-form-item
               label="笼位数量"
               prop="number"
@@ -65,15 +90,15 @@
               />
             </el-form-item>
           </el-col>
-          <el-col :span="12">
+          <el-col :span="24">
             <el-form-item
-              label="选择时间"
+              label="开始使用时间"
               prop="startDate"
             >
               <el-date-picker
                 v-model="state.form.startDate"
                 type="date"
-                placeholder="请选择时间"
+                placeholder="请开始使用时间"
                 clearable
                 style="width: 100%"
               />
@@ -85,7 +110,7 @@
           class="mt10"
           :gutter="20"
         >
-          <el-col :span="12">
+          <el-col :span="24">
             <el-form-item
               label="品种品系"
               prop="categoryId"
@@ -103,9 +128,9 @@
               </el-select>
             </el-form-item>
           </el-col>
-          <el-col :span="12">
+          <el-col :span="24">
             <el-form-item
-              label="级别"
+              label="饲养区域"
               prop="level"
             >
               <el-select
@@ -124,62 +149,33 @@
         </el-row>
 
         <el-row
-          class="mt10"
           :gutter="20"
+          class="mt10"
         >
-          <el-col :span="12">
+          <el-col :span="24">
             <el-form-item
-              label="雄性"
-              prop="maleNumber"
+              label="周龄"
+              prop="age"
             >
               <el-input-number
+                v-model="state.form.age"
                 style="width: 100%"
-                placeholder="雄性数量"
-                v-model="state.form.maleNumber"
                 :min="0"
               />
             </el-form-item>
           </el-col>
-          <el-col :span="12">
+          <el-col :span="24">
             <el-form-item
-              label="雌性"
-              prop="famaleNumber"
+              label="体重"
+              prop="weight"
             >
               <el-input-number
+                v-model="state.form.weight"
                 style="width: 100%"
-                placeholder="雌性数量"
-                v-model="state.form.famaleNumber"
                 :min="0"
               />
             </el-form-item>
           </el-col>
-
-          <!-- <el-col :span="24">
-            <el-form-item
-              label="数量(雄性+雌性)"
-              prop="maleNumber"
-            >
-              <div style="width: 100%; display: flex; justify-content: space-between">
-                <el-input-number
-                  placeholder="雄性数量"
-                  v-model="state.form.maleNumber"
-                  :min="0"
-                />
-                +
-                <el-input-number
-                  placeholder="雌性数量"
-                  v-model="state.form.famaleNumber"
-                  :min="0"
-                />
-              </div>
-              <div style="width: 100%; margin-top: 10px">
-                <el-input
-                  placeholder="总数"
-                  v-model="animalNumber"
-                />
-              </div>
-            </el-form-item>
-          </el-col> -->
         </el-row>
 
         <el-row
@@ -188,30 +184,40 @@
         >
           <el-col :span="24">
             <el-form-item
-              label="体重"
-              prop="weight"
+              label="雄性"
+              prop="maleNumber"
             >
               <el-input-number
-                v-model="state.form.weight"
                 style="width: 100%"
+                placeholder="雄性数量"
+                v-model="state.form.maleNumber"
                 :min="0"
               />
             </el-form-item>
           </el-col>
-        </el-row>
-
-        <el-row
-          class="mt10"
-          :gutter="20"
-        >
           <el-col :span="24">
             <el-form-item
-              label="周龄"
-              prop="age"
+              label="雌性"
+              prop="famaleNumber"
             >
               <el-input-number
-                v-model="state.form.age"
                 style="width: 100%"
+                placeholder="雌性数量"
+                v-model="state.form.famaleNumber"
+                :min="0"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item
+              label="合计"
+              prop="totalNumber"
+            >
+              <el-input-number
+                style="width: 100%"
+                disabled
+                placeholder="合计"
+                v-model="state.form.totalNumber"
                 :min="0"
               />
             </el-form-item>
@@ -308,7 +314,11 @@
             <el-form-item
               label="生产许可证副本"
               prop="licenseNumberFile"
-              :rules="{ required: state.form.buyFrom === ProcurementChannels.PURCHASED_BY_MYSELF, message: '不能为空', trigger: 'change' }"
+              :rules="{
+                required: state.form.buyFrom === ProcurementChannels.PURCHASED_BY_MYSELF,
+                message: '不能为空',
+                trigger: 'change',
+              }"
             >
               <el-upload
                 v-model:file-list="licenseNumberFileList"
@@ -336,7 +346,11 @@
             <el-form-item
               label="近三个月动物质量检测证明"
               prop="animalTestDateFile"
-              :rules="{ required: state.form.buyFrom === ProcurementChannels.PURCHASED_BY_MYSELF, message: '不能为空', trigger: 'change' }"
+              :rules="{
+                required: state.form.buyFrom === ProcurementChannels.PURCHASED_BY_MYSELF,
+                message: '不能为空',
+                trigger: 'change',
+              }"
             >
               <el-upload
                 v-model:file-list="animalTestDateFileList"
@@ -541,7 +555,7 @@
 </template>
 
 <script setup lang="ts" name="systemProDialog">
-  import { reactive, ref, computed } from 'vue'
+  import { reactive, ref, watch } from 'vue'
   import to from 'await-to-js'
   import { ElMessage } from 'element-plus'
   import { UploadFile } from 'element-plus/es/components'
@@ -582,12 +596,6 @@
     ethicsAdviceFile: { required: true, message: '不能为空', trigger: 'change' },
   }
 
-  // const animalNumber = computed(() => {
-  //   const maleNumber = state.form.maleNumber || 0
-  //   const famaleNumber = state.form.famaleNumber || 0
-  //   return maleNumber + famaleNumber
-  // })
-
   const licenseNumberFileList = ref<UploadFile[]>([])
   const animalTestDateFileList = ref<UploadFile[]>([])
   const geneIdentificationFileList = ref<UploadFile[]>([])
@@ -622,6 +630,9 @@
       cageAppointFile: [],
       ethicsCheckFile: [],
       ethicsAdviceFile: [],
+      deptName: '',
+      phone: '',
+      totalNumber: 0,
     },
     safePromise: false,
     safeRead: false,
@@ -649,9 +660,8 @@
     })
   }
   // 打开弹窗
-  const openDialog = async (type: 'add' | 'edit') => {
+  const openDialog = () => {
     getDicts()
-    state.dialog.type = type
     state.dialog.isShowDialog = true
   }
 
@@ -659,6 +669,12 @@
   const closeDialog = () => {
     expertDialogFormRef.value.resetFields()
     state.dialog.isShowDialog = false
+    licenseNumberFileList.value = []
+    animalTestDateFileList.value = []
+    geneIdentificationFileList.value = []
+    cageAppointFileList.value = []
+    ethicsCheckFileList.value = []
+    ethicsAdviceFileList.value = []
   }
   // 取消
   const onCancel = () => {
@@ -757,6 +773,14 @@
     })
   }
 
+  watch(
+    () => [state.form.maleNumber, state.form.famaleNumber],
+    ([maleNumber, famaleNumber]) => {
+      state.form.totalNumber = (maleNumber || 0) + (famaleNumber || 0)
+    },
+    { immediate: true },
+  )
+
   // 暴露变量
   defineExpose({
     openDialog,

+ 195 - 127
src/view/animal/application/components/Detail.vue

@@ -17,107 +17,93 @@
       >
         <el-row :gutter="35">
           <el-col
-            :span="12"
+            :span="24"
             class="mb20"
           >
             <el-form-item
-              label="申请人姓名"
-              prop="memberName"
+              label="课题名称"
+              prop="memberType"
             >
               <el-input
-                v-model="state.form.userName"
+                v-model="state.form.projectGroupName"
                 disabled
-                placeholder="请输入申请人姓名"
+                placeholder="请输入课题名称"
               ></el-input>
             </el-form-item>
           </el-col>
           <el-col
-            :span="12"
+            :span="24"
             class="mb20"
           >
             <el-form-item
-              label="课题名称"
-              prop="memberType"
+              label="姓名"
+              prop="memberName"
             >
               <el-input
-                v-model="state.form.projectGroupName"
+                v-model="state.form.userName"
                 disabled
-                placeholder="请输入课题名称"
+                placeholder="请输入姓名"
               ></el-input>
             </el-form-item>
           </el-col>
         </el-row>
 
-        <el-row :gutter="35">
-          <el-col
-            :span="12"
-            class="mb20"
-          >
+        <el-row :gutter="20">
+          <el-col :span="24">
             <el-form-item
-              label="申请时间"
-              prop="memberPhone"
+              label="部门"
+              prop="deptName"
             >
               <el-input
-                v-model="state.form.createdTime"
+                v-model="state.form.deptName"
                 disabled
-                placeholder="请输入申请时间"
-              ></el-input>
+              />
             </el-form-item>
           </el-col>
-          <el-col
-            :span="12"
-            class="mb20"
-          >
+          <el-col :span="24">
             <el-form-item
-              label="申请状态"
-              prop="mentorName"
+              label="联系方式"
+              prop="phone"
             >
               <el-input
-                v-model="state.form.approveStatus"
+                v-model="state.form.phone"
                 disabled
-                placeholder="请输入申请状态"
-              ></el-input>
+              />
             </el-form-item>
           </el-col>
         </el-row>
 
-        <el-row :gutter="35">
-          <el-col
-            :span="12"
-            class="mb10"
-          >
+        <h4 class="mb8 mt10">实验动物笼位预约信息</h4>
+        <el-row
+          class="mt10"
+          :gutter="20"
+        >
+          <el-col :span="24">
             <el-form-item
-              :label="props.isReturnCageList ? '退还笼位(个)' : '申请笼位(个)'"
-              prop="mentorObj"
+              label="笼位数量"
+              prop="number"
             >
-              <el-input
-                v-if="!props.isReturnCageList"
+              <el-input-number
                 v-model="state.form.number"
+                style="width: 100%"
+                :min="1"
                 disabled
-                placeholder="请输入申请笼位"
-              ></el-input>
-              <el-input
-                v-else
-                v-model="state.form.returnNumber"
-                disabled
-                placeholder="请输入申请笼位"
-              ></el-input>
+              />
             </el-form-item>
           </el-col>
-
-          <el-col
-            :span="12"
-            class="mb10"
-          >
+          <el-col :span="24">
             <el-form-item
-              label="动物类型"
-              prop="mentorDeptName"
+              label="开始使用时间"
+              prop="startDate"
             >
-              <el-input
-                v-model="state.form.categoryName"
+              <el-date-picker
+                v-model="state.form.startDate"
+                type="date"
+                placeholder="请开始使用时间"
+                clearable
+                style="width: 100%"
                 disabled
-                placeholder="请输入动物类型"
-              ></el-input>
+              />
             </el-form-item>
           </el-col>
         </el-row>
@@ -126,47 +112,73 @@
           class="mt10"
           :gutter="20"
         >
-          <el-col :span="12">
+          <el-col :span="24">
             <el-form-item
-              label="雄性"
-              prop="maleNumber"
+              label="品种品系"
+              prop="categoryId"
             >
-              <el-input
-                style="width: 100%"
+              <el-select
+                v-model="state.form.categoryId"
+                placeholder="请选择"
                 disabled
-                placeholder="雄性数量"
-                v-model="state.form.maleNumber"
-              />
+              >
+                <el-option
+                  v-for="item in animalTypeList"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id"
+                />
+              </el-select>
             </el-form-item>
           </el-col>
-          <el-col :span="12">
+          <el-col :span="24">
             <el-form-item
-              label="雌性"
-              prop="famaleNumber"
+              label="饲养区域"
+              prop="level"
             >
-              <el-input
-                style="width: 100%"
+              <el-select
+                v-model="state.form.level"
+                placeholder="请选择"
                 disabled
-                placeholder="雌性数量"
-                v-model="state.form.famaleNumber"
-              />
+              >
+                <el-option
+                  v-for="item in LeavelList"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id"
+                />
+              </el-select>
             </el-form-item>
           </el-col>
         </el-row>
 
         <el-row
-          class="mt10"
           :gutter="20"
+          class="mt10"
         >
+          <el-col :span="24">
+            <el-form-item
+              label="周龄"
+              prop="age"
+            >
+              <el-input-number
+                v-model="state.form.age"
+                style="width: 100%"
+                :min="0"
+                disabled
+              />
+            </el-form-item>
+          </el-col>
           <el-col :span="24">
             <el-form-item
               label="体重"
               prop="weight"
             >
-              <el-input
-                disabled
+              <el-input-number
                 v-model="state.form.weight"
                 style="width: 100%"
+                :min="0"
+                disabled
               />
             </el-form-item>
           </el-col>
@@ -178,13 +190,43 @@
         >
           <el-col :span="24">
             <el-form-item
-              label="周龄"
-              prop="age"
+              label="雄性"
+              prop="maleNumber"
             >
-              <el-input
+              <el-input-number
+                style="width: 100%"
+                placeholder="雄性数量"
+                v-model="state.form.maleNumber"
+                :min="0"
                 disabled
-                v-model="state.form.age"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item
+              label="雌性"
+              prop="famaleNumber"
+            >
+              <el-input-number
                 style="width: 100%"
+                placeholder="雌性数量"
+                v-model="state.form.famaleNumber"
+                :min="0"
+                disabled
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item
+              label="合计"
+              prop="totalNumber"
+            >
+              <el-input-number
+                style="width: 100%"
+                disabled
+                placeholder="合计"
+                v-model="state.form.totalNumber"
+                :min="0"
               />
             </el-form-item>
           </el-col>
@@ -199,15 +241,17 @@
               label="饲养总天数"
               prop="feedingDay"
             >
-              <el-input
-                disabled
+              <el-input-number
                 v-model="state.form.feedingDay"
                 style="width: 100%"
+                :min="1"
+                disabled
               />
             </el-form-item>
           </el-col>
         </el-row>
 
+        <h4 class="mb8 mt20">采购渠道</h4>
         <el-row
           class="mt10"
           :gutter="20"
@@ -239,46 +283,19 @@
         </el-row>
 
         <el-row
+          v-if="state.form.buyFrom === ProcurementChannels.PURCHASED_BY_MYSELF"
           class="mt10"
           :gutter="20"
         >
           <el-col :span="24">
             <el-form-item
-              label="是否有特殊饲养要求"
-              prop="hasFeedingSpecial"
-            >
-              <el-radio-group
-                disabled
-                v-model="state.form.hasFeedingSpecial"
-              >
-                <el-radio
-                  :label="FeedingSpecial.HAVE_FEEDING_SPECIAL"
-                  size="large"
-                >
-                  有
-                </el-radio>
-                <el-radio
-                  :label="FeedingSpecial.NO_FEEDING_SPECIAL"
-                  size="large"
-                >
-                  无
-                </el-radio>
-              </el-radio-group>
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-row>
-          <el-col :span="24">
-            <el-form-item
-              label="特殊饲养要求"
-              prop="feedingSpecialDesc"
+              label="外购来源单位"
+              prop="comeFromUnit"
             >
               <el-input
-                v-model="state.form.feedingSpecialDesc"
+                v-model="state.form.comeFromUnit"
                 disabled
-                placeholder="请输入特殊饲养要求"
-              ></el-input>
+              />
             </el-form-item>
           </el-col>
         </el-row>
@@ -293,30 +310,59 @@
               prop="comeTime"
             >
               <el-date-picker
-                disabled
                 v-model="state.form.comeTime"
                 type="date"
                 placeholder="请选择到达时间"
                 clearable
                 style="width: 100%"
+                disabled
               />
             </el-form-item>
           </el-col>
         </el-row>
 
+        <h4 class="mb8 mt20">特殊要求和附件</h4>
         <el-row
           class="mt10"
           :gutter="20"
         >
           <el-col :span="24">
             <el-form-item
-              label="外购来源单位"
-              prop="comeFromUnit"
+              label="是否有特殊饲养要求"
+              prop="hasFeedingSpecial"
+            >
+              <el-radio-group
+                disabled
+                v-model="state.form.hasFeedingSpecial"
+              >
+                <el-radio
+                  :label="FeedingSpecial.HAVE_FEEDING_SPECIAL"
+                  size="large"
+                >
+                  有
+                </el-radio>
+                <el-radio
+                  :label="FeedingSpecial.NO_FEEDING_SPECIAL"
+                  size="large"
+                >
+                  无
+                </el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="24">
+            <el-form-item
+              label="特殊饲养要求"
+              prop="feedingSpecialDesc"
             >
               <el-input
+                v-model="state.form.feedingSpecialDesc"
                 disabled
-                v-model="state.form.comeFromUnit"
-              />
+                placeholder="请输入特殊饲养要求"
+              ></el-input>
             </el-form-item>
           </el-col>
         </el-row>
@@ -355,6 +401,7 @@
           <el-col
             :span="24"
             class="mb20"
+            style="overflow: hidden"
           >
             <el-form-item
               label="近三个月动物质量检测证明"
@@ -381,6 +428,7 @@
           <el-col
             :span="24"
             class="mb20"
+            style="overflow: hidden"
           >
             <el-form-item
               label="基因鉴定报告"
@@ -407,6 +455,7 @@
           <el-col
             :span="24"
             class="mb20"
+            style="overflow: hidden"
           >
             <el-form-item
               label="近三个月饲养环境检测证明"
@@ -433,6 +482,7 @@
           <el-col
             :span="24"
             class="mb20"
+            style="overflow: hidden"
           >
             <el-form-item
               label="笼位预约表"
@@ -459,6 +509,7 @@
           <el-col
             :span="24"
             class="mb20"
+            style="overflow: hidden"
           >
             <el-form-item
               label="实验动物福利伦理审查申请表"
@@ -485,6 +536,7 @@
           <el-col
             :span="24"
             class="mb20"
+            style="overflow: hidden"
           >
             <el-form-item
               label="实验动物福利伦理审查意见表"
@@ -518,20 +570,14 @@
 
 <script setup lang="ts" name="systemProDialog">
   import to from 'await-to-js'
-  import { nextTick, reactive, ref, computed, defineAsyncComponent } from 'vue'
+  import { nextTick, reactive, ref, defineAsyncComponent, watch } from 'vue'
   import dayjs from 'dayjs'
 
   import { usePlatAnimalCageApplicationApi } from '/@/api/platform/animal'
-  import { ApproveStatusList, ProcurementChannels, FeedingSpecial } from '/@/constants/pageConstants'
+  import { ApproveStatusList, ProcurementChannels, FeedingSpecial, LeavelList } from '/@/constants/pageConstants'
 
   const FlowTable = defineAsyncComponent(() => import('/@/components/FlowTable.vue'))
 
-  const animalNumber = computed(() => {
-    const maleNumber = state.form.maleNumber || 0
-    const famaleNumber = state.form.famaleNumber || 0
-    return maleNumber + famaleNumber
-  })
-
   // 定义子组件向父组件传值/事件
   const props = defineProps({
     code: { type: String, default: '' },
@@ -543,6 +589,7 @@
   const platAnimalCageApplicationApi = usePlatAnimalCageApplicationApi()
 
   const expertDialogFormRef = ref()
+  const animalTypeList = ref<any[]>([])
 
   const state = reactive({
     form: {
@@ -571,12 +618,25 @@
       ethicsCheckFile: [],
       ethicsAdviceFile: [],
       geneIdentificationFile: [],
+      deptName: '',
+      phone: '',
+      categoryId: null,
+      level: null,
+      startDate: '',
+      totalNumber: 0,
     },
     disabled: false,
   })
 
+  const getDicts = () => {
+    Promise.all([platAnimalCageApplicationApi.getAnimalTypeList({})]).then(([animalType]) => {
+      animalTypeList.value = animalType.data
+    })
+  }
+
   // 打开弹窗
   const initForm = async (code: string) => {
+    await getDicts()
     const [err, res]: ToResponse = await to(platAnimalCageApplicationApi.getEntityById({ id: parseInt(code) }))
     if (err) return
     await nextTick()
@@ -603,6 +663,14 @@
   defineExpose({
     initForm,
   })
+
+  watch(
+    () => [state.form.maleNumber, state.form.famaleNumber],
+    ([maleNumber, famaleNumber]) => {
+      state.form.totalNumber = (maleNumber || 0) + (famaleNumber || 0)
+    },
+    { immediate: true },
+  )
 </script>
 <style lang="scss" scoped>
   :deep(.disUoloadSty .el-upload--picture-card) {

+ 1 - 1
src/view/animal/applicationRemoval/components/addEdit.vue

@@ -80,7 +80,7 @@
         >
           <el-col :span="24">
             <el-form-item
-              label="动物品系"
+              label="品种品系"
               prop="categoryId"
             >
               <el-select

+ 6 - 6
src/view/animal/applicationRemoval/components/turnBack.vue

@@ -41,10 +41,10 @@
             </el-form-item>
           </el-col>
         </el-row>
-        <el-row class="mb20">
+        <!-- <el-row class="mb20">
           <el-col :span="24">
             <el-form-item
-              label="动物品系"
+              label="品种品系"
               prop="categoryId"
             >
               <el-select
@@ -60,7 +60,7 @@
               </el-select>
             </el-form-item>
           </el-col>
-        </el-row>
+        </el-row> -->
 
         <el-row v-if="isReturn === 1">
           <el-col :span="24">
@@ -205,7 +205,7 @@
   const isReturn = ref<number>(1)
 
   const rules = reactive<FormRules<TurnBackPayload>>({
-    categoryId: [{ required: true, message: '请选择动物种类', trigger: 'blur' }],
+    // categoryId: [{ required: true, message: '请选择动物种类', trigger: 'blur' }],
     returnDate: [{ required: true, message: '请选择转出日期', trigger: 'blur' }],
 
     notReturnReason: [{ required: true, message: '请输入未返回动物情况说明', trigger: 'blur' }],
@@ -213,7 +213,7 @@
 
   const defaultFormFields: TurnBackPayload = {
     takeawayId: 0,
-    categoryId: null,
+    // categoryId: null,
     returnDate: '',
     returnTransport: '',
     accessCardReturn: 1,
@@ -248,7 +248,7 @@
     await getDicts()
     state.dialog.title = '登记转回'
     state.form.takeawayId = sourceData.id
-    state.form.categoryId = animalTypeList.value[0].id
+    // state.form.categoryId = animalTypeList.value[0].id
     state.dialog.isShowDialog = true
   }