Selaa lähdekoodia

修改伙伴商问题

hurx 3 päivää sitten
vanhempi
sitoutus
d10d969e10

+ 2 - 0
src/api/partner/contacts/types.ts

@@ -8,6 +8,7 @@ export interface PartnerContactsVO {
   status?: string;
   remark?: string;
   createTime?: string;
+  address?: string;
 }
 
 export interface PartnerContactsForm {
@@ -19,6 +20,7 @@ export interface PartnerContactsForm {
   contactType?: number;
   status?: string;
   remark?: string;
+  address?: string;
 }
 
 export interface PartnerContactsQuery {

+ 7 - 5
src/views/partner/merchant/components/BankDialog.vue

@@ -22,8 +22,8 @@
           </el-form-item>
         </el-col>
         <el-col :span="12">
-          <el-form-item label="银行账号">
-            <el-input v-model="form.bankNumber" placeholder="请输入" />
+          <el-form-item label="银行账号" prop="bankNumber">
+            <el-input v-model="form.bankNumber" placeholder="请输入" @input="form.bankNumber = form.bankNumber.replace(/[^0-9]/g, '')" />
           </el-form-item>
         </el-col>
       </el-row>
@@ -41,8 +41,8 @@
       </el-row>
       <el-row :gutter="20">
         <el-col :span="12">
-          <el-form-item label="电话">
-            <el-input v-model="form.phone" placeholder="请输入" />
+          <el-form-item label="电话" prop="phone">
+            <el-input v-model="form.phone" placeholder="请输入" maxlength="11" @input="form.phone = form.phone.replace(/[^0-9]/g, '')" />
           </el-form-item>
         </el-col>
         <el-col :span="12">
@@ -85,7 +85,9 @@ const dialogVisible = computed({
 });
 
 const rules = {
-  account: [{ required: true, message: '开户名称不能为空', trigger: 'blur' }]
+  account: [{ required: true, message: '开户名称不能为空', trigger: 'blur' }],
+  bankNumber: [{ required: true, message: '银行账号不能为空', trigger: 'blur' }],
+  phone: [{ pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' }]
 };
 
 const formRef = ref();

+ 29 - 10
src/views/partner/merchant/components/ContactDialog.vue

@@ -1,33 +1,40 @@
 <template>
   <el-dialog v-model="dialogVisible" title="联系人管理" width="800px" append-to-body @close="handleClose">
-    <el-form ref="formRef" :model="formData" :rules="rules" label-width="100px">
+    <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
       <el-row :gutter="20">
         <el-col :span="12">
           <el-form-item label="姓名" prop="name">
-            <el-input v-model="formData.name" placeholder="请输入" />
+            <el-input v-model="form.name" placeholder="请输入" />
           </el-form-item>
         </el-col>
         <el-col :span="12">
-          <el-form-item label="电话">
-            <el-input v-model="formData.phone" placeholder="请输入" />
+          <el-form-item label="电话" prop="phone">
+            <el-input v-model="form.phone" placeholder="请输入" maxlength="11" @input="form.phone = form.phone.replace(/[^0-9]/g, '')" />
           </el-form-item>
         </el-col>
       </el-row>
       <el-row :gutter="20">
         <el-col :span="12">
-          <el-form-item label="电子邮箱">
-            <el-input v-model="formData.email" placeholder="请输入" />
+          <el-form-item label="电子邮箱" prop="email">
+            <el-input v-model="form.email" placeholder="请输入" />
           </el-form-item>
         </el-col>
         <el-col :span="12">
           <el-form-item label="联系人类型">
-            <el-select v-model="formData.contactType" placeholder="请选择" style="width: 100%">
+            <el-select v-model="form.contactType" placeholder="请选择" style="width: 100%">
               <el-option label="主要联系人" :value="1" />
               <el-option label="次要联系人" :value="2" />
             </el-select>
           </el-form-item>
         </el-col>
       </el-row>
+      <el-row :gutter="20">
+        <el-col :span="24">
+          <el-form-item label="联系人地址" prop="remark">
+            <el-input v-model="form.address" placeholder="请输入" />
+          </el-form-item>
+        </el-col>
+      </el-row>
     </el-form>
     <template #footer>
       <el-button @click="handleClose">取消</el-button>
@@ -37,7 +44,7 @@
 </template>
 
 <script setup lang="ts">
-import { ref, computed } from 'vue';
+import { ref, computed, reactive, watch } from 'vue';
 import type { PartnerContactsForm } from '@/api/partner/contacts/types';
 
 interface Props {
@@ -59,8 +66,20 @@ const dialogVisible = computed({
   set: (value) => emit('update:visible', value)
 });
 
+const form = reactive<PartnerContactsForm>({ ...props.formData });
+
+watch(
+  () => props.formData,
+  (newVal) => {
+    Object.assign(form, newVal);
+  },
+  { deep: true }
+);
+
 const rules = {
-  name: [{ required: true, message: '姓名不能为空', trigger: 'blur' }]
+  name: [{ required: true, message: '姓名不能为空', trigger: 'blur' }],
+  phone: [{ pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' }],
+  email: [{ pattern: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/, message: '请输入正确的邮箱地址', trigger: 'blur' }]
 };
 
 const formRef = ref();
@@ -73,7 +92,7 @@ const handleClose = () => {
 const handleSubmit = () => {
   formRef.value?.validate((valid: boolean) => {
     if (valid) {
-      emit('submit', props.formData);
+      emit('submit', form);
     }
   });
 };

+ 7 - 10
src/views/partner/merchant/components/ContractDialog.vue

@@ -49,7 +49,7 @@
       </el-row>
       <el-row :gutter="20">
         <el-col :span="12">
-          <el-form-item label="结算周期">
+          <el-form-item label="结算周期(天)">
             <el-input v-model="form.settlementCycle" placeholder="请输入" />
           </el-form-item>
         </el-col>
@@ -73,20 +73,15 @@
       </el-row>
       <el-row :gutter="20">
         <el-col :span="12">
-          <el-form-item label="联系电话">
-            <el-input v-model="form.phone" placeholder="请输入" />
+          <el-form-item label="联系电话" prop="phone">
+            <el-input v-model="form.phone" placeholder="请输入" maxlength="11" @input="form.phone = form.phone.replace(/[^0-9]/g, '')" />
           </el-form-item>
         </el-col>
       </el-row>
       <el-row>
         <el-col :span="24">
           <el-form-item label="附件">
-            <el-upload class="upload-demo" action="#" :auto-upload="false">
-              <el-button size="small">上传</el-button>
-              <template #tip>
-                <div class="el-upload__tip">支持jpg/png/xlsx等文件</div>
-              </template>
-            </el-upload>
+            <FileUpload v-model="form.annex" :file-size="5" :file-type="['jpg', 'jpeg', 'png', 'xlsx', 'xls', 'doc', 'docx', 'pdf']" />
           </el-form-item>
         </el-col>
       </el-row>
@@ -107,6 +102,7 @@
 
 <script setup lang="ts">
 import { ref, computed } from 'vue';
+import FileUpload from '@/components/FileUpload/index.vue';
 import type { PartnerContractForm } from '@/api/partner/contract/types';
 import { listProjectInfo } from '@/api/project/projectInfo';
 interface Props {
@@ -130,7 +126,8 @@ const dialogVisible = computed({
 });
 
 const rules = {
-  contractNo: [{ required: true, message: '合同编号不能为空', trigger: 'blur' }]
+  contractNo: [{ required: true, message: '合同编号不能为空', trigger: 'blur' }],
+  phone: [{ pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' }]
 };
 
 const formRef = ref();

+ 3 - 65
src/views/partner/merchant/components/QualificationDialog.vue

@@ -32,20 +32,7 @@
       <el-row>
         <el-col :span="24">
           <el-form-item label="附件">
-            <el-upload
-              :action="action"
-              :on-success="handleUploadSuccess"
-              :before-upload="beforeUpload"
-              :on-remove="handleRemoveUploadFile"
-              :on-preview="handlePreviewUploadFile"
-              :file-list="fileList"
-              multiple
-            >
-              <el-button type="primary" icon="Upload">点击上传</el-button>
-              <template #tip>
-                <div class="el-upload__tip">支持jpg/png/xlsx等文件,单个文件不超过50MB</div>
-              </template>
-            </el-upload>
+            <FileUpload v-model="localFormData.annex" :file-size="5" :file-type="['jpg', 'jpeg', 'png', 'xlsx', 'xls', 'doc', 'docx', 'pdf']" />
           </el-form-item>
         </el-col>
       </el-row>
@@ -59,15 +46,14 @@
 
 <script setup lang="ts">
 import { ref, computed, reactive, watch } from 'vue';
+import FileUpload from '@/components/FileUpload/index.vue';
 import type { PartnerQualificationForm } from '@/api/partner/qualification/types';
-const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const action = import.meta.env.VITE_APP_BASE_API + '/resource/oss/upload';
 
 interface Props {
   visible: boolean;
   formData: PartnerQualificationForm;
 }
-const fileList = ref<any[]>([]);
+
 interface Emits {
   (e: 'update:visible', value: boolean): void;
   (e: 'update:formData', value: PartnerQualificationForm): void;
@@ -107,54 +93,6 @@ const rules = {
 
 const formRef = ref();
 
-/** 上传前校验 */
-const beforeUpload = (file: any) => {
-  const isLt50M = file.size / 1024 / 1024 < 50;
-  if (!isLt50M) {
-    proxy?.$modal.msgWarning('上传文件大小不能超过 50MB!');
-  }
-  return isLt50M;
-};
-
-function handleUploadSuccess(response: any, file: any, fileListParam: any[]) {
-  if (response.code === 200) {
-    // 为每个上传成功的文件设置 url 属性
-    fileListParam.forEach((f: any) => {
-      if (f.response?.code === 200 && f.response?.data?.url) {
-        f.url = f.response.data.url;
-      }
-    });
-    // 更新 fileList
-    fileList.value = fileListParam;
-    // 收集所有已上传成功的文件URL
-    const urls = fileListParam
-      .filter((f: any) => f.response?.code === 200 || f.url)
-      .map((f: any) => f.response?.data?.url || f.url)
-      .filter(Boolean);
-    localFormData.annex = urls.join(',');
-    proxy?.$modal.msgSuccess('文件上传成功');
-  } else {
-    proxy?.$modal.msgError(response.msg || '文件上传失败');
-  }
-}
-
-/** 删除文件 */
-const handleRemoveUploadFile = (uploadFile: any) => {
-  localFormData.annex = fileList.value
-    .map((f) => f.url)
-    .filter(Boolean)
-    .join(',');
-};
-
-/** 预览文件 */
-const handlePreviewUploadFile = (uploadFile: any) => {
-  if (uploadFile.url) {
-    window.open(uploadFile.url, '_blank');
-  } else {
-    proxy?.$modal.msgWarning('文件地址不存在');
-  }
-};
-
 const handleClose = () => {
   emit('update:visible', false);
   // 弹窗关闭时,重置表单校验状态

+ 24 - 12
src/views/partner/merchant/components/UserDialog.vue

@@ -1,39 +1,39 @@
 <template>
   <el-dialog v-model="dialogVisible" title="用户账号管理" width="800px" append-to-body @close="handleClose">
-    <el-form ref="formRef" :model="formData" :rules="rules" label-width="100px">
+    <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
       <el-row :gutter="20">
         <el-col :span="12">
           <el-form-item label="登录账号" prop="loginUser">
-            <el-input v-model="formData.loginUser" placeholder="请输入" />
+            <el-input v-model="form.loginUser" placeholder="请输入" />
           </el-form-item>
         </el-col>
         <el-col :span="12">
           <el-form-item label="用户姓名" prop="name">
-            <el-input v-model="formData.name" placeholder="请输入" />
+            <el-input v-model="form.name" placeholder="请输入" />
           </el-form-item>
         </el-col>
       </el-row>
       <el-row :gutter="20">
         <el-col :span="12">
-          <el-form-item label="电子邮箱">
-            <el-input v-model="formData.email" placeholder="请输入" />
+          <el-form-item label="电子邮箱" prop="email">
+            <el-input v-model="form.email" placeholder="请输入" />
           </el-form-item>
         </el-col>
         <el-col :span="12">
           <el-form-item label="职务">
-            <el-input v-model="formData.duties" placeholder="请输入" />
+            <el-input v-model="form.duties" placeholder="请输入" />
           </el-form-item>
         </el-col>
       </el-row>
       <el-row :gutter="20">
         <el-col :span="12">
-          <el-form-item label="电话">
-            <el-input v-model="formData.phone" placeholder="请输入" />
+          <el-form-item label="电话" prop="phone">
+            <el-input v-model="form.phone" placeholder="请输入" maxlength="11" @input="form.phone = form.phone.replace(/[^0-9]/g, '')" />
           </el-form-item>
         </el-col>
         <el-col :span="12">
           <el-form-item label="密码" prop="password">
-            <el-input v-model="formData.password" type="password" placeholder="请输入" show-password />
+            <el-input v-model="form.password" type="password" placeholder="请输入" show-password />
           </el-form-item>
         </el-col>
       </el-row>
@@ -46,7 +46,7 @@
 </template>
 
 <script setup lang="ts">
-import { ref, computed } from 'vue';
+import { ref, computed, reactive, watch } from 'vue';
 import type { PartnerUserForm } from '@/api/partner/user/types';
 
 interface Props {
@@ -68,10 +68,22 @@ const dialogVisible = computed({
   set: (value) => emit('update:visible', value)
 });
 
+const form = reactive<PartnerUserForm>({ ...props.formData });
+
+watch(
+  () => props.formData,
+  (newVal) => {
+    Object.assign(form, newVal);
+  },
+  { deep: true }
+);
+
 const rules = {
   loginUser: [{ required: true, message: '登录账号不能为空', trigger: 'blur' }],
   name: [{ required: true, message: '用户姓名不能为空', trigger: 'blur' }],
-  password: [{ required: true, message: '密码不能为空', trigger: 'blur' }]
+  password: [{ required: true, message: '密码不能为空', trigger: 'blur' }],
+  phone: [{ pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' }],
+  email: [{ pattern: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/, message: '请输入正确的邮箱地址', trigger: 'blur' }]
 };
 
 const formRef = ref();
@@ -84,7 +96,7 @@ const handleClose = () => {
 const handleSubmit = () => {
   formRef.value?.validate((valid: boolean) => {
     if (valid) {
-      emit('submit', props.formData);
+      emit('submit', form);
     }
   });
 };

+ 31 - 41
src/views/partner/merchant/components/WarehouseDialog.vue

@@ -1,16 +1,16 @@
 <template>
   <!-- 仓库管理对话框组件 -->
   <el-dialog v-model="dialogVisible" title="仓库管理" width="800px" append-to-body @close="handleClose">
-    <el-form ref="formRef" :model="formData" :rules="rules" label-width="100px">
+    <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
       <el-row :gutter="20">
         <el-col :span="12">
           <el-form-item label="仓库名称" prop="name">
-            <el-input v-model="formData.name" placeholder="请输入" />
+            <el-input v-model="form.name" placeholder="请输入" />
           </el-form-item>
         </el-col>
         <el-col :span="12">
           <el-form-item label="仓库性质">
-            <el-select v-model="formData.warehouseNature" placeholder="请选择" style="width: 100%">
+            <el-select v-model="form.warehouseNature" placeholder="请选择" style="width: 100%">
               <el-option label="自有仓库" :value="1" />
               <el-option label="租赁仓库" :value="2" />
             </el-select>
@@ -20,50 +20,45 @@
       <el-row :gutter="20">
         <el-col :span="12">
           <el-form-item label="所在地区">
-            <el-input v-model="formData.warehouseLocation" placeholder="请输入" />
+            <el-input v-model="form.warehouseLocation" placeholder="请输入" />
           </el-form-item>
         </el-col>
         <el-col :span="12">
           <el-form-item label="仓库面积">
-            <el-input v-model="formData.warehouseArea" placeholder="请输入" />
+            <el-input v-model="form.warehouseArea" placeholder="请输入" />
           </el-form-item>
         </el-col>
       </el-row>
       <el-row :gutter="20">
         <el-col :span="24">
           <el-form-item label="所在地址">
-            <el-input v-model="formData.warehouseAddress" placeholder="请输入" />
+            <el-input v-model="form.warehouseAddress" placeholder="请输入" />
           </el-form-item>
         </el-col>
       </el-row>
       <el-row :gutter="20">
         <el-col :span="12">
           <el-form-item label="联系人">
-            <el-input v-model="formData.warehouseContacts" placeholder="请输入" />
+            <el-input v-model="form.warehouseContacts" placeholder="请输入" />
           </el-form-item>
         </el-col>
         <el-col :span="12">
-          <el-form-item label="联系电话">
-            <el-input v-model="formData.phone" placeholder="请输入" />
+          <el-form-item label="联系电话" prop="phone">
+            <el-input v-model="form.phone" placeholder="请输入" maxlength="11" @input="form.phone = form.phone.replace(/[^0-9]/g, '')" />
           </el-form-item>
         </el-col>
       </el-row>
       <el-row>
         <el-col :span="24">
           <el-form-item label="附件">
-            <el-upload class="upload-demo" action="#" :auto-upload="false">
-              <el-button size="small">上传</el-button>
-              <template #tip>
-                <div class="el-upload__tip">支持jpg/png/xlsx等文件</div>
-              </template>
-            </el-upload>
+            <FileUpload v-model="form.annex" :file-size="5" :file-type="['jpg', 'jpeg', 'png', 'xlsx', 'xls', 'doc', 'docx', 'pdf']" />
           </el-form-item>
         </el-col>
       </el-row>
       <el-row>
         <el-col :span="24">
           <el-form-item label="备注">
-            <el-input v-model="formData.remark" type="textarea" :rows="2" placeholder="请输入" />
+            <el-input v-model="form.remark" type="textarea" :rows="2" placeholder="请输入" />
           </el-form-item>
         </el-col>
       </el-row>
@@ -76,60 +71,55 @@
 </template>
 
 <script setup lang="ts">
-import { ref, computed } from 'vue';
+import { ref, computed, reactive, watch } from 'vue';
 import type { PartnerWarehouseForm } from '@/api/partner/warehouse/types';
+import FileUpload from '@/components/FileUpload/index.vue';
 
-// ========== 组件属性定义 ==========
-// 这些是父组件传进来的数据
 interface Props {
-  visible: boolean;           // 对话框是否显示
-  formData: PartnerWarehouseForm;  // 表单数据
+  visible: boolean;
+  formData: PartnerWarehouseForm;
 }
 
-// ========== 组件事件定义 ==========
-// 这些是子组件要通知父组件的事件
 interface Emits {
-  (e: 'update:visible', value: boolean): void;  // 更新显示状态
-  (e: 'update:formData', value: PartnerWarehouseForm): void;  // 更新表单数据
-  (e: 'submit', value: PartnerWarehouseForm): void;  // 提交表单
+  (e: 'update:visible', value: boolean): void;
+  (e: 'update:formData', value: PartnerWarehouseForm): void;
+  (e: 'submit', value: PartnerWarehouseForm): void;
 }
 
-// 接收父组件传来的属性
 const props = defineProps<Props>();
-// 定义可以触发的事件
 const emit = defineEmits<Emits>();
 
-// ========== 对话框显示状态(计算属性) ==========
-// 使用 computed 创建一个可读写的计算属性
-// 读取时返回 props.visible,写入时触发 update:visible 事件
 const dialogVisible = computed({
   get: () => props.visible,
   set: (value) => emit('update:visible', value)
 });
 
-// ========== 表单验证规则 ==========
+const form = reactive<PartnerWarehouseForm>({ ...props.formData });
+
+watch(
+  () => props.formData,
+  (newVal) => {
+    Object.assign(form, newVal);
+  },
+  { deep: true }
+);
+
 const rules = {
-  name: [{ required: true, message: '仓库名称不能为空', trigger: 'blur' }]
+  name: [{ required: true, message: '仓库名称不能为空', trigger: 'blur' }],
+  phone: [{ pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' }]
 };
 
-// ========== 表单引用 ==========
 const formRef = ref();
 
-// ========== 关闭对话框 ==========
 const handleClose = () => {
-  // 通知父组件关闭对话框
   emit('update:visible', false);
-  // 重置表单验证状态
   formRef.value?.resetFields();
 };
 
-// ========== 提交表单 ==========
 const handleSubmit = () => {
-  // 先验证表单
   formRef.value?.validate((valid: boolean) => {
     if (valid) {
-      // 验证通过,通知父组件提交
-      emit('submit', props.formData);
+      emit('submit', form);
     }
   });
 };

+ 16 - 15
src/views/partner/merchant/index.vue

@@ -96,15 +96,15 @@
                 </el-form-item>
               </el-col>
               <el-col :span="12">
-                <el-form-item label="伙伴商编号" prop="partnerNo">
-                  <el-input v-model="form.partnerNo" placeholder="请输入" />
+                <el-form-item label="公司简称" prop="company">
+                  <el-input v-model="form.company" placeholder="请输入" />
                 </el-form-item>
               </el-col>
             </el-row>
             <el-row :gutter="20">
               <el-col :span="12">
-                <el-form-item label="公司简称" prop="company">
-                  <el-input v-model="form.company" placeholder="请输入" />
+                <el-form-item label="传真号码" prop="fax">
+                  <el-input v-model="form.fax" placeholder="请输入" />
                 </el-form-item>
               </el-col>
               <el-col :span="12">
@@ -129,13 +129,6 @@
                 </el-form-item>
               </el-col>
             </el-row>
-            <el-row :gutter="20">
-              <el-col :span="24">
-                <el-form-item label="传真号码" prop="fax">
-                  <el-input v-model="form.fax" placeholder="请输入" />
-                </el-form-item>
-              </el-col>
-            </el-row>
             <el-row :gutter="20">
               <el-col :span="24">
                 <el-form-item label="公司注册地址" prop="registerAddress">
@@ -262,7 +255,13 @@
               <el-table-column label="序号" type="index" width="60" />
               <el-table-column label="合同编号" prop="contractNo" />
               <el-table-column label="合作项目名称" prop="cooperativeName" />
-              <el-table-column label="合同类型" prop="contractType" />
+              <el-table-column label="合同类型" prop="contractType">
+                <template #default="scope">
+                  <span v-if="scope.row.contractType === 1">战略合作</span>
+                  <span v-else-if="scope.row.contractType === 2">项目合作</span>
+                  <span v-else>{{ scope.row.contractType }}</span>
+                </template>
+              </el-table-column>
               <el-table-column label="合同状态" prop="contractStatus" />
               <el-table-column label="合作区域" prop="area" />
               <el-table-column label="操作" width="150">
@@ -550,7 +549,7 @@ const data = reactive<PageData<PartnerMerchantForm, PartnerMerchantQuery>>({
   },
   rules: {
     partnerName: [{ required: true, message: '伙伴商名称不能为空', trigger: 'blur' }],
-    partnerNo: [{ required: true, message: '伙伴商编号不能为空', trigger: 'blur' }],
+    // partnerNo: [{ required: true, message: '伙伴商编号不能为空', trigger: 'blur' }],
     partnerCooperateType: [{ required: true, message: '合作型态不能为空', trigger: 'blur' }]
   }
 });
@@ -794,7 +793,8 @@ const submitForm = () => {
               email: itemAny.email,
               contactType: itemAny.contactType,
               status: itemAny.status,
-              remark: itemAny.remark
+              remark: itemAny.remark,
+              address: itemAny.address
             };
             savePromises.push(addPartnerContacts(data));
           } else {
@@ -806,7 +806,8 @@ const submitForm = () => {
               email: itemAny.email,
               contactType: itemAny.contactType,
               status: itemAny.status,
-              remark: itemAny.remark
+              remark: itemAny.remark,
+              address: itemAny.address
             };
             savePromises.push(updatePartnerContacts(data));
           }

+ 2 - 2
src/views/project/projectInfo/addEditDrawer.vue

@@ -1,9 +1,9 @@
 <template>
   <el-drawer v-model="visible" :title="title" :size="'50%'" :before-close="handleClose" destroy-on-close :close-on-click-modal="true">
     <el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
-      <el-form-item label="项目编号" prop="projectNo">
+      <!-- <el-form-item label="项目编号" prop="projectNo">
         <el-input v-model="form.projectNo" placeholder="请输入项目编号" />
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item label="项目logo" prop="projectLogo">
         <div class="logo-upload" @click="showFileSelector = true">
           <img v-if="form.projectLogo" :src="form.projectLogo" alt="项目logo" class="logo-image" />

+ 37 - 15
src/views/report/order/index.vue

@@ -101,8 +101,8 @@
         <el-table-column label="操作" align="center" min-width="200">
           <template #default="scope">
             <div style="display: flex; flex-wrap: wrap; gap: 4px; justify-content: center">
-              <el-button link type="primary" @click="handleUpdate(scope.row)">编辑</el-button>
-              <el-button link type="success" @click="handleSubmit(scope.row)">提交</el-button>
+              <!-- <el-button link type="primary" @click="handleUpdate(scope.row)">编辑</el-button> -->
+              <!-- <el-button link type="success" @click="handleSubmit(scope.row)">提交</el-button> -->
               <el-button link type="danger" @click="handleReject(scope.row)">驳回</el-button>
               <el-button link type="primary" @click="handleConfirm(scope.row)">确认</el-button>
               <el-button link type="info" @click="handleViewAttachment(scope.row)">查看附件</el-button>
@@ -374,22 +374,22 @@
     <!-- 附件查看抽屉 -->
     <el-drawer v-model="attachmentDrawer.visible" title="查看附件" direction="rtl" size="50%" :close-on-click-modal="true">
       <el-table :data="attachmentDrawer.attachments" border style="width: 100%">
-        <el-table-column label="附件名称" prop="name" width="150" />
-        <el-table-column label="附件预览" align="center" width="200">
+        <el-table-column label="附件名称" prop="name" />
+        <el-table-column label="附件预览" align="center">
           <template #default="scope">
             <el-image
-              v-if="scope.row.url.match(/\.(jpg|jpeg|png|gif|webp)$/i)"
+              v-if="isImageFile(scope.row.url)"
               :src="scope.row.url"
               style="width: 100px; height: 100px"
               fit="cover"
               :preview-src-list="attachmentDrawer.attachments.map((a: any) => a.url)"
             />
-            <span v-else>不支持预览</span>
+            <span v-else>{{ getFileTypeLabel(scope.row.url) }}</span>
           </template>
         </el-table-column>
         <el-table-column label="操作" align="center" width="150">
           <template #default="scope">
-            <el-button link type="primary" @click="window.open(scope.row.url, '_blank')">下载</el-button>
+            <el-button link type="primary" @click="downloadFile(scope.row.url)">下载</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -415,6 +415,7 @@ import {
 import { PartnerPreparedVO, PartnerPreparedForm, PartnerPreparedQuery } from '@/api/partner/prepared/types';
 import { ComponentInternalInstance } from 'vue';
 import { getToken } from '@/utils/auth';
+import { listByIds } from '@/api/system/oss';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 
@@ -813,15 +814,36 @@ function handleReject(row: any) {
     .catch(() => {});
 }
 
-function handleViewAttachment(row: any) {
+const isImageFile = (url: string) => {
+  return url && /\.(jpg|jpeg|png|gif|webp)$/i.test(url);
+};
+
+const getFileTypeLabel = (url: string) => {
+  if (!url) return '未知文件';
+  const ext = url.split('.').pop()?.toLowerCase();
+  return ext ? `${ext.toUpperCase()} 文件` : '未知文件';
+};
+
+const downloadFile = (url: string) => {
+  if (url) {
+    window.open(url, '_blank');
+  }
+};
+
+async function handleViewAttachment(row: any) {
   if (row.invoiceAttachment) {
-    // 解析附件URL列表
-    const urls = row.invoiceAttachment.split(',').filter(Boolean);
-    attachmentDrawer.value.attachments = urls.map((url: string, index: number) => ({
-      name: `附件${index + 1}`,
-      url: url.trim()
-    }));
-    attachmentDrawer.value.visible = true;
+    try {
+      const res = await listByIds(row.invoiceAttachment);
+      const ossList = res.data || [];
+      attachmentDrawer.value.attachments = ossList.map((oss: any) => ({
+        name: oss.originalName || '附件',
+        url: oss.url
+      }));
+      attachmentDrawer.value.visible = true;
+    } catch (error) {
+      console.error('获取附件信息失败:', error);
+      proxy?.$modal.msgError('获取附件信息失败');
+    }
   } else {
     proxy?.$modal.msgWarning('该订单暂无附件');
   }