# 采购台账-总合同号联动选择及附件查看 ## 涉及页面 - 供应商管理详情页(新增合同记录Tab) - 采购台账列表页/新增编辑页 ## 新增API | 方法 | 路径 | 说明 | |------|------|------| | GET | /basic/supplier-contract/list/{supplierId} | 查询供应商合同记录列表(供下拉选择) | | GET | /basic/supplier-contract/{id} | 获取供应商合同记录详情 | | POST | /basic/supplier-contract | 新增供应商合同记录 | | PUT | /basic/supplier-contract | 修改供应商合同记录 | | DELETE | /basic/supplier-contract/{id} | 删除供应商合同记录 | | GET | /basic/supplier-contract/files/byContractNo?masterContractNo=xxx | 根据总合同号查询附件 | ## 前端修改点 ### 1. 供应商管理详情页 - 添加合同记录Tab ```html ... 新增合同记录 ``` ### 2. 新增/编辑合同记录弹窗 ```html ``` ### 3. 采购台账新增/编辑页 - 供应商选择后联动总合同号 ```html ``` ### 4. 采购台账列表页 - 操作栏添加查看总合同附件按钮 ```html ``` ### 5. 总合同附件查看弹窗 ```html ``` ### 6. data 数据 ```js data() { return { // 合同列表(供下拉选择) contractList: [], // 合同记录列表(供应商详情页) contractRecordList: [], contractDialogVisible: false, contractDialogTitle: '', contractForm: { id: null, supplierId: null, masterContractNo: '', entryDate: '', entryPerson: '', entryPersonId: null, remark: '', storageBlobDTOs: [] }, contractRules: { masterContractNo: [{ required: true, message: '请输入总合同号', trigger: 'blur' }], entryDate: [{ required: true, message: '请选择录入日期', trigger: 'change' }] }, // 总合同附件弹窗 contractFileDialogVisible: false, contractFileList: [] } } ``` ### 7. 方法 ```js methods: { // 供应商选择变化时,加载该供应商的合同列表 async handleSupplierChange(supplierId) { this.form.masterContractNo = '' // 清空总合同号 this.contractList = [] if (!supplierId) return const res = await this.$http.get(`/basic/supplier-contract/list/${supplierId}`) if (res.code === 200) { this.contractList = res.data } }, // 获取供应商合同记录列表(供应商详情页) async getContractList(supplierId) { const res = await this.$http.get(`/basic/supplier-contract/list/${supplierId}`) if (res.code === 200) { this.contractRecordList = res.data } }, // 新增合同记录 handleAddContract() { this.contractDialogTitle = '新增合同记录' this.contractForm = { id: null, supplierId: this.supplierId, masterContractNo: '', entryDate: '', entryPerson: '', entryPersonId: null, remark: '', storageBlobDTOs: [] } this.contractDialogVisible = true }, // 编辑合同记录 async handleEditContract(row) { this.contractDialogTitle = '编辑合同记录' const res = await this.$http.get(`/basic/supplier-contract/${row.id}`) if (res.code === 200) { this.contractForm = { ...res.data, storageBlobDTOs: res.data.fileList ? res.data.fileList.map(f => ({ id: f.id })) : [] } this.contractDialogVisible = true } }, // 删除合同记录 async handleDeleteContract(row) { await this.$confirm('确定删除该合同记录吗?', '提示', { type: 'warning' }) const res = await this.$http.delete(`/basic/supplier-contract/${row.id}`) if (res.code === 200) { this.$message.success('删除成功') this.getContractList(this.supplierId) } }, // 提交合同记录表单 async submitContractForm() { await this.$refs.contractFormRef.validate() const res = await this.$http.post('/basic/supplier-contract', this.contractForm) if (res.code === 200) { this.$message.success('操作成功') this.contractDialogVisible = false this.getContractList(this.supplierId) } }, // 查看总合同附件 async handleViewContractFiles(row) { if (!row.masterContractNo) { this.$message.warning('该记录没有总合同号') return } const res = await this.$http.get('/basic/supplier-contract/files/byContractNo', { params: { masterContractNo: row.masterContractNo } }) if (res.code === 200) { this.contractFileList = res.data || [] this.contractFileDialogVisible = true } }, // 格式化文件大小 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] }, // 查看附件列表 handleViewFiles(row) { this.contractFileList = row.fileList || [] this.contractFileDialogVisible = true }, // 编辑页打开时回显总合同号 async handleEdit(row) { this.form = { ...row } this.dialogVisible = true // 加载供应商的合同列表 if (row.supplierId) { const res = await this.$http.get(`/basic/supplier-contract/list/${row.supplierId}`) if (res.code === 200) { this.contractList = res.data } } } } ``` ### 8. 采购台账列表页 - 表格显示总合同号列 ```html ``` ## 后端文件清单 | 文件路径 | 说明 | |---------|------| | `src/main/java/com/ruoyi/basic/pojo/SupplierContractRecord.java` | 实体类 | | `src/main/java/com/ruoyi/basic/dto/SupplierContractRecordDto.java` | DTO | | `src/main/java/com/ruoyi/basic/mapper/SupplierContractRecordMapper.java` | Mapper接口 | | `src/main/resources/mapper/basic/SupplierContractRecordMapper.xml` | Mapper XML | | `src/main/java/com/ruoyi/basic/service/SupplierContractRecordService.java` | Service接口 | | `src/main/java/com/ruoyi/basic/service/impl/SupplierContractRecordServiceImpl.java` | Service实现 | | `src/main/java/com/ruoyi/basic/controller/SupplierContractRecordController.java` | Controller | | `src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java` | 添加枚举值 `SUPPLIER_CONTRACT_RECORD` | ## 注意事项 - 总合同号来源于供应商管理的合同记录子表 - 选择顺序:先选供应商 -> 自动加载该供应商的合同列表 -> 再选总合同号 - 采购台账表已有 `master_contract_no` 字段,无需修改数据库 - 查看附件按钮仅在总合同号存在时显示 - 附件列表通过总合同号查询,支持预览和下载