src/views/basicData/supplierManage/components/HomeTab.vue
@@ -44,6 +44,9 @@
        width="70%"
        @close="closeDia"
    >
      <el-tabs v-model="supplierActiveTab">
        <!-- 基本信息 Tab -->
        <el-tab-pane label="基本信息" name="basic">
      <el-form
          :model="form"
          label-width="140px"
@@ -187,12 +190,113 @@
          </el-col>
        </el-row>
      </el-form>
        </el-tab-pane>
        <!-- 合同记录 Tab -->
        <el-tab-pane label="合同记录" name="contract" :disabled="operationType === 'add' || !currentSupplierId">
          <div style="margin-bottom: 15px;">
            <el-button type="primary" size="small" @click="handleAddContract">新增合同记录</el-button>
          </div>
          <el-table :data="contractRecordList" border style="width: 100%">
            <el-table-column prop="masterContractNo" label="总合同号" show-overflow-tooltip />
            <el-table-column prop="entryDate" label="录入日期" width="180" />
            <el-table-column prop="entryPerson" label="录入人" width="120" />
            <el-table-column prop="remark" label="备注" show-overflow-tooltip />
            <el-table-column label="附件" width="100">
              <template #default="{ row }">
                <el-link type="primary" v-if="row.fileList && row.fileList.length" @click="handleViewContractFiles(row)">
                  查看({{ row.fileList.length }})
                </el-link>
                <span v-else>-</span>
              </template>
            </el-table-column>
            <el-table-column label="操作" width="150">
              <template #default="{ row }">
                <el-button link type="primary" @click="handleEditContract(row)">编辑</el-button>
                <el-button link type="danger" @click="handleDeleteContract(row)">删除</el-button>
              </template>
            </el-table-column>
          </el-table>
        </el-tab-pane>
      </el-tabs>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" @click="submitForm">确认</el-button>
          <el-button @click="closeDia">取消</el-button>
        </div>
      </template>
    </el-dialog>
    <!-- 合同记录弹窗 -->
    <el-dialog
        v-model="contractDialogVisible"
        :title="contractDialogTitle"
        width="600px"
        :close-on-click-modal="false"
    >
      <el-form
          :model="contractForm"
          :rules="contractRules"
          ref="contractFormRef"
          label-width="100px"
      >
        <el-form-item label="总合同号" prop="masterContractNo">
          <el-input v-model="contractForm.masterContractNo" placeholder="请输入总合同号" clearable />
        </el-form-item>
        <el-form-item label="录入日期" prop="entryDate">
          <el-date-picker
              v-model="contractForm.entryDate"
              type="datetime"
              placeholder="选择日期时间"
              value-format="YYYY-MM-DD HH:mm:ss"
              style="width: 100%"
              clearable
          />
        </el-form-item>
        <el-form-item label="录入人" prop="entryPerson">
          <el-input v-model="contractForm.entryPerson" placeholder="请输入录入人" clearable />
        </el-form-item>
        <el-form-item label="附件">
          <FileUpload
              v-model="contractForm.storageBlobDTOs"
              :record-type="'supplier_contract_record'"
              :record-id="contractForm.id"
          />
        </el-form-item>
        <el-form-item label="备注">
          <el-input v-model="contractForm.remark" type="textarea" :rows="3" placeholder="请输入备注" />
        </el-form-item>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" @click="submitContractForm">确认</el-button>
          <el-button @click="contractDialogVisible = false">取消</el-button>
        </div>
      </template>
    </el-dialog>
    <!-- 合同附件查看弹窗 -->
    <el-dialog
        v-model="contractFileDialogVisible"
        title="合同附件"
        width="700px"
        :close-on-click-modal="false"
    >
      <el-table :data="contractFileList" border v-if="contractFileList.length">
        <el-table-column prop="name" label="文件名称" show-overflow-tooltip />
        <el-table-column prop="byteSize" label="文件大小" width="120">
          <template #default="{ row }">
            {{ formatFileSize(row.byteSize) }}
          </template>
        </el-table-column>
        <el-table-column label="操作" width="150">
          <template #default="{ row }">
            <el-link type="primary" :href="row.previewURL" target="_blank">预览</el-link>
            <el-link type="primary" :href="row.downloadURL" style="margin-left: 10px">下载</el-link>
          </template>
        </el-table-column>
      </el-table>
      <el-empty v-else description="暂无附件" />
    </el-dialog>
    <!-- 供应商导入对话框 -->
@@ -256,8 +360,16 @@
  listSupplier,
  updateSupplier,
} from "@/api/basicData/supplierManageFile.js";
import {
  getSupplierContractList,
  getSupplierContractById,
  addSupplierContract,
  updateSupplierContract,
  delSupplierContract,
} from "@/api/basicData/supplierContract.js";
import useUserStore from "@/store/modules/user";
import { getToken } from "@/utils/auth.js";
import FileUpload from "@/components/AttachmentUpload/file/index.vue";
const FileList = defineAsyncComponent(() =>
    import("@/components/Dialog/FileList.vue")
);
@@ -355,6 +467,34 @@
  size: 100,
  total: 0,
});
// 供应商详情Tab相关
const supplierActiveTab = ref('basic');
const currentSupplierId = ref(null);
const contractRecordList = ref([]);
// 合同记录弹窗相关
const contractDialogVisible = ref(false);
const contractDialogTitle = ref('');
const contractFormRef = ref();
const contractForm = reactive({
  id: null,
  supplierId: null,
  masterContractNo: '',
  entryDate: '',
  entryPerson: '',
  entryPersonId: null,
  remark: '',
  storageBlobDTOs: []
});
const contractRules = {
  masterContractNo: [{ required: true, message: '请输入总合同号', trigger: 'blur' }],
  entryDate: [{ required: true, message: '请选择录入日期', trigger: 'change' }]
};
// 合同附件弹窗相关
const contractFileDialogVisible = ref(false);
const contractFileList = ref([]);
// 用户信息表单弹框数据
const operationType = ref("");
const dialogFormVisible = ref(false);
@@ -472,21 +612,122 @@
  selectedRows.value = selection;
};
// 打开弹框
const openForm = (type, row) => {
const openForm = async (type, row) => {
  operationType.value = type;
  form.value = {};
  form.value.maintainUserId = userStore.id;
  form.value.maintainTime = getCurrentDate();
  supplierActiveTab.value = 'basic';
  currentSupplierId.value = null;
  contractRecordList.value = [];
  userListNoPage().then((res) => {
    userList.value = res.data;
  });
  if (type === "edit") {
    currentSupplierId.value = row.id;
    getSupplier(row.id).then((res) => {
      form.value = { ...res.data };
    });
    // 加载合同记录列表
    loadContractList(row.id);
  }
  dialogFormVisible.value = true;
};
// 加载合同记录列表
const loadContractList = async (supplierId) => {
  try {
    const res = await getSupplierContractList(supplierId);
    if (res.code === 200) {
      contractRecordList.value = res.data || [];
    }
  } catch (error) {
    console.error('获取合同记录列表失败:', error);
  }
};
// 新增合同记录
const handleAddContract = () => {
  contractDialogTitle.value = '新增合同记录';
  Object.assign(contractForm, {
    id: null,
    supplierId: currentSupplierId.value,
    masterContractNo: '',
    entryDate: '',
    entryPerson: userStore.nickName,
    entryPersonId: userStore.id,
    remark: '',
    storageBlobDTOs: []
  });
  contractDialogVisible.value = true;
};
// 编辑合同记录
const handleEditContract = async (row) => {
  contractDialogTitle.value = '编辑合同记录';
  try {
    const res = await getSupplierContractById(row.id);
    if (res.code === 200) {
      Object.assign(contractForm, {
        ...res.data,
        storageBlobDTOs: res.data.fileList ? res.data.fileList.map(f => ({ id: f.id })) : []
      });
      contractDialogVisible.value = true;
    }
  } catch (error) {
    console.error('获取合同记录详情失败:', error);
  }
};
// 删除合同记录
const handleDeleteContract = async (row) => {
  try {
    await ElMessageBox.confirm('确定删除该合同记录吗?', '提示', { type: 'warning' });
    const res = await delSupplierContract(row.id);
    if (res.code === 200) {
      proxy.$modal.msgSuccess('删除成功');
      loadContractList(currentSupplierId.value);
    }
  } catch (error) {
    if (error !== 'cancel') {
      console.error('删除合同记录失败:', error);
    }
  }
};
// 提交合同记录表单
const submitContractForm = async () => {
  try {
    await contractFormRef.value.validate();
    const api = contractForm.id ? updateSupplierContract : addSupplierContract;
    const res = await api(contractForm);
    if (res.code === 200) {
      proxy.$modal.msgSuccess('操作成功');
      contractDialogVisible.value = false;
      loadContractList(currentSupplierId.value);
    }
  } catch (error) {
    console.error('提交合同记录失败:', error);
  }
};
// 查看合同附件
const handleViewContractFiles = (row) => {
  contractFileList.value = row.fileList || [];
  contractFileDialogVisible.value = true;
};
// 格式化文件大小
const formatFileSize = (bytes) => {
  if (!bytes) return '0 B';
  const k = 1024;
  const sizes = ['B', 'KB', 'MB', 'GB'];
  const i = Math.floor(Math.log(bytes) / Math.log(k));
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
};
// 提交表单
const submitForm = () => {
  proxy.$refs["formRef"].validate((valid) => {