| | |
| | | width="70%" |
| | | @close="closeDia" |
| | | > |
| | | <el-tabs v-model="supplierActiveTab"> |
| | | <!-- 基本信息 Tab --> |
| | | <el-tab-pane label="基本信息" name="basic"> |
| | | <el-form |
| | | :model="form" |
| | | label-width="140px" |
| | |
| | | </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> |
| | | |
| | | <!-- 供应商导入对话框 --> |
| | |
| | | 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") |
| | | ); |
| | |
| | | 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); |
| | |
| | | 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) => { |