Bladeren bron

修改内容

yangg 1 week geleden
bovenliggende
commit
5f4144c9d9

+ 14 - 1
src/views/system/borrow/component/CollectEquipment/AbnormalDialog/index.vue

@@ -27,6 +27,19 @@
 
       <el-form-item label="照片">
         <el-upload
+          class="upload-demo"
+          list-type="picture-card"
+          :action="action"
+          :headers="{ Authorization: 'JWT ' + Session.get('token') }"
+          :on-success="handleUploadSuccess"
+          :on-error="handleUploadError"
+           :file-list="fileList"
+          multiple
+          :on-remove="handleRemove"
+        >
+        <el-icon><Plus /></el-icon>
+        </el-upload>
+       <!--  <el-upload
           class="upload-demo"
           :action="action"
           :headers="{ Authorization: 'JWT ' + Session.get('token') }"
@@ -44,7 +57,7 @@
               只能上传jpg/png文件,且不超过5MB
             </div>
           </template>
-        </el-upload>
+        </el-upload> -->
       </el-form-item>
     </el-form>
     <template #footer>

+ 16 - 4
src/views/system/borrow/component/CollectEquipment/ViewAbnormalDialog/index.vue

@@ -21,13 +21,16 @@
       </el-select>
     </el-form-item>
 
-      <el-form-item label="照片" v-if="abnormalData.photos.length">
+      <el-form-item label="照片" v-if="abnormalData?.photos?.length">
         <el-image
           v-for="(photo, index) in abnormalData.photos"
           :key="index"
           style="width: 100px; height: 100px; margin-right: 10px;"
           :src="photo"
-         
+          :preview-src-list="photoUrls"
+          :initial-index="index"
+          :preview-teleported="true"
+          :z-index="3000"
           fit="cover"
         />
       </el-form-item>
@@ -41,7 +44,7 @@
 </template>
 
 <script setup lang="ts">
-import { ref, watch } from 'vue';
+import { ref, watch, computed } from 'vue';
 
 interface Photo {
   filename: string;
@@ -51,6 +54,7 @@ interface Photo {
 interface AbnormalData {
   condition: string;
   photos: Photo[];
+  damage_type: number;
 }
 
 const props = defineProps<{
@@ -72,15 +76,23 @@ watch(() => dialogVisible.value, (newVal) => {
   emit('update:visible', newVal);
 });
 
+// 统一处理 abnormalData,避免模板 undefined
+const abnormalData = computed<AbnormalData>(() => {
+  return props.abnormalData ?? { condition: '', photos: [], damage_type: 0 };
+});
+
 // 获取照片URL列表用于预览
 const getPhotoUrls = () => {
-  return props.abnormalData?.photos?.map(photo => 'data:image/jpeg;base64,' + photo.data) || [];
+  return abnormalData.value.photos.map(photo => photo);
 };
 
 const onCancel = () => {
   emit('update:visible', false);
 };
 
+// 预览用的图片 URL 列表
+const photoUrls = computed(() => getPhotoUrls());
+
 defineExpose({
   dialogVisible
 });

+ 31 - 3
src/views/system/borrow/component/CollectEquipment/index.vue

@@ -388,7 +388,7 @@
 	<SelectDeviceDialog 
     v-model:visible="showSelectDeviceDialog"  
     @confirm="onDeviceSelected" 
-    :device-ids="returnDeviceList.map(item => item.device_no)"
+    :device-ids="unreturnedDeviceIds"
     :return-mode="activeName === 'third'"
     :device-status-map="deviceStatusMap"
 />
@@ -629,6 +629,25 @@ const returnAccessoryInfo = ref('');
 const returnRemark = ref('');
 const selectedDevices = ref<DeviceListItem[]>([]); // 添加选中设备列表
 
+// 统一判定设备是否已归还
+const isDeviceReturned = (device: any) => {
+  if (device?.is_return === true) return true;
+  const rs = device?.return_status;
+  if (rs && (rs.value === 2 || rs.label === '已归还')) return true;
+  if (device?.status === '已归还') return true;
+  return false;
+};
+
+// 过滤未归还设备的 device_no 列表,用于设备选择弹窗的排除
+const unreturnedDeviceIds = computed(() =>
+  returnDeviceList.value
+    .filter((d) => !isDeviceReturned(d))
+    .map((d) => d.device_no)
+);
+
+// 是否全部已归还(仅在归还页签生效)
+const allReturned = computed(() => unreturnedDeviceIds.value.length === 0);
+
 //审批步骤
 const steps = ref<any[]>([]);
 // 仓库映射(id -> name)
@@ -771,6 +790,7 @@ const onAbnormalConfirm = (data: { condition: string; photos: any[] }) => {
     device.damage_type = data.damage_type;
     ElMessage.success('异常信息已保存');
   }
+  console.log("returnDeviceList.value:::",returnDeviceList.value);
 };
 
 // 处理查看异常
@@ -780,7 +800,7 @@ const handleViewAbnormal = (index: number) => {
   if (device) {
     if(device.problem_records?.length){
       currentAbnormalData.value = {
-        damage_type:device.problem_records?.[0].damage_type ||'',
+        damage_type:device.problem_records?.[0].damage_type ||device.damage_type ||'',
         condition: device.problem_records?.[0].device_condition_after ||'',
         photos: device.problem_records?.[0].returned_images.map((item:any)=>item.image_url) ||[]
       };
@@ -924,6 +944,10 @@ const handleView = (row: any) => {
 
 // 借用列表相关方法
 const handleAdd = () => {
+  if (activeName.value === 'third' && allReturned.value) {
+    ElMessage.info('当前列表设备均已归还,无可选择设备');
+    return;
+  }
   showSelectDeviceDialog.value = true;
 };
 
@@ -1311,7 +1335,11 @@ watch(() => form.value.app_user_borrower, (newValue) => {
   }
 });
 function addItem() {
-	showSelectDeviceDialog.value = true;
+    if (activeName.value === 'third' && allReturned.value) {
+        ElMessage.info('当前列表设备均已归还,无可选择设备');
+        return;
+    }
+    showSelectDeviceDialog.value = true;
 }
 function removeItem(index: number) {
 	form.value.items.splice(index, 1);

+ 2 - 0
src/views/system/device/crud.tsx

@@ -370,10 +370,12 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 						]
 					}),
 					form: {
+						show:false,
 						component: { placeholder: '请选择设备状态' },
 						rules: [{ required: true, message: '请选择设备状态' }],
 					},
 					viewForm:{
+						show:false,
 						component: { placeholder: '' },
 						rules: [{ required: true, message: '' }],
 					}

+ 38 - 4
src/views/system/devicemanual/crud.tsx

@@ -4,6 +4,7 @@ import { auth } from '/@/utils/authFunction';
 import {request} from '/@/utils/service';
 import {getBaseURL} from '/@/utils/baseUrl';
 import {Ref} from 'vue'
+import { ElMessage } from 'element-plus';
 import Cookies from 'js-cookie';
 
 const { compute } = useCompute();
@@ -352,9 +353,29 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 						show: true,
 						component: {
 							limit: 1,
+							// 保持可点击,通过 beforeUpload + uploadRequest 做前置校验与提示
+							helpMessage: '请先选择设备名称或填写设备编号后再上传PDF',
 							uploader: {
 								type: 'form',
-								accept: ".pdf",
+								accept: 'application/pdf,.pdf',
+								beforeUpload: (file: File) => {
+									try {
+										const formData = crudExpose.getFormData();
+										if (!formData || !formData.device) {
+											ElMessage.warning('请先选择设备或填写设备编号');
+											return false;
+										}
+									} catch (e) {
+										ElMessage.error('无法获取表单数据,请重试');
+										return false;
+									}
+									const isPdf = file.type === 'application/pdf' || /\.pdf$/i.test(file.name);
+									if (!isPdf) {
+										ElMessage.error('仅支持上传 PDF 文件');
+										return false;
+									}
+									return true;
+								},
 								uploadRequest: async (params: any) => {
 									const { action, file, onProgress } = params;
 									
@@ -368,6 +389,7 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 									}
 									
 									if (!deviceId) {
+										ElMessage.warning('请先选择设备或填写设备编号');
 										throw new Error('请先选择设备');
 									}
 									
@@ -389,16 +411,24 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 										}
 									});
 								},
-								successHandle(ret) {
+									successHandle(ret: any) {
 									// eslint-disable-next-line no-console
 									// console.log("ret.data.image_url:::",ret.data.image_url);
 
-									return {
+										return {
 										url: getBaseURL(ret.data.manual_url), 
 										key: ret.data.id,
 										...ret.data
 									};
-								}
+									},
+									onError: (error: any) => {
+										ElMessage.error('PDF 上传失败,请重试');
+										// eslint-disable-next-line no-console
+										console.error('PDF上传失败:', error);
+									},
+									onExceed: () => {
+										ElMessage.warning('只允许上传 1 个文件');
+									},
 								/* buildUrl(res: any) {
 									console.log("PDF上传响应:", res);
 									// 根据返回的数据结构,提取manual_url
@@ -429,7 +459,11 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 							required: false, 
 							message: 'PDF手册为可选项' 
 						}],
+						helper: {
+							text: "请先选择设备名称或填写设备编号后再上传PDF"
+						  },
 					},
+					
 					viewForm: {
 						component: { 
 							placeholder: '',

+ 2 - 2
src/views/system/login/index.vue

@@ -79,8 +79,8 @@
 
 			<a href="https://wap.scjgj.sh.gov.cn/businessCheck/verifKey.do?showType=extShow&serial=9031000020250320141804000014054024-SAIC_SHOW_310000-6b70f287e0d2495697591ebb489adbe0956&signData=MEUCIGXojP0+cGcuBbeXVsraC1SL1GH9NehsKT6NwL/dPcjDAiEAryFp/aqoTmP5Z7seNN9eVQ4Rrvk4SsyT0FnqcL4kxFM="
 				target="_blank">
-				<img style="display: inline-block;width: 28px;" src="../../../assets/电子营业执照.png"
-					alt=""></a>{{ getSystemConfig['login.keep_record'] || '京ICP备2021031018号' }}
+				<!-- <img style="display: inline-block;width: 28px;" src="../../../assets/电子营业执照.png"
+					alt=""> --></a>{{ getSystemConfig['login.keep_record'] || '京ICP备2021031018号' }}
 			<!-- |
 				<a :href="getSystemConfig['login.help_url'] ? getSystemConfig['login.help_url'] : '#'" target="_blank">帮助</a>
 				|