| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # å®¢æ·æ¡£æ¡ç§æµ·-ååè®°å½ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - å®¢æ·æ¡£æ¡ï¼ç§æµ·ï¼è¯¦æ
页 |
| | | |
| | | ## API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /basic/customer-contract/list/{customerId} | æ¥è¯¢ååè®°å½å表 | |
| | | | GET | /basic/customer-contract/{id} | è·åååè®°å½è¯¦æ
| |
| | | | POST | /basic/customer-contract | æ°å¢ååè®°å½ | |
| | | | PUT | /basic/customer-contract | ä¿®æ¹ååè®°å½ | |
| | | | DELETE | /basic/customer-contract/{id} | å é¤ååè®°å½ | |
| | | |
| | | **注æï¼é件使ç¨ç³»ç»éç¨æ¥å£ `/basic/storage-attachment` 管ç** |
| | | |
| | | ### 请æ±åæ° |
| | | |
| | | **æ°å¢/ä¿®æ¹ååè®°å½ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "id": null, // ä¿®æ¹æ¶å¿
ä¼ |
| | | "customerId": 1, // å®¢æ·æ¡£æ¡IDï¼å¿
å¡«ï¼ |
| | | "masterContractNo": "HT202606240001", // æ»ååå·ï¼å¿
å¡«ï¼ |
| | | "entryDate": "2026-06-24 10:30:00", // å½å
¥æ¥æï¼å¿
å¡«ï¼ |
| | | "entryPerson": "å¼ ä¸", // å½å
¥äººå§å |
| | | "entryPersonId": 1, // å½å
¥äººID |
| | | "remark": "夿³¨ä¿¡æ¯", // 夿³¨ |
| | | "storageBlobDTOs": [ // éä»¶å表 |
| | | { "id": 1 }, |
| | | { "id": 2 } |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | id | Long | å¦ | ä¿®æ¹æ¶å¿
ä¼ | |
| | | | customerId | Long | æ¯ | å®¢æ·æ¡£æ¡ID | |
| | | | masterContractNo | String | æ¯ | æ»ååå· | |
| | | | entryDate | String | æ¯ | å½å
¥æ¥æï¼yyyy-MM-dd HH:mm:ssï¼ | |
| | | | entryPerson | String | å¦ | å½å
¥äººå§å | |
| | | | entryPersonId | Long | å¦ | å½å
¥äººID | |
| | | | remark | String | å¦ | 夿³¨ | |
| | | | storageBlobDTOs | List | å¦ | éä»¶IDå表 | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå", |
| | | "data": { |
| | | "id": 1, |
| | | "customerId": 1, |
| | | "masterContractNo": "HT202606240001", |
| | | "entryDate": "2026-06-24 10:30:00", |
| | | "entryPerson": "å¼ ä¸", |
| | | "entryPersonId": 1, |
| | | "remark": "夿³¨ä¿¡æ¯", |
| | | "fileList": [ |
| | | { |
| | | "id": 1, |
| | | "name": "ååæ«æä»¶.pdf", |
| | | "previewURL": "xxx", |
| | | "downloadURL": "xxx", |
| | | "byteSize": 102400, |
| | | "contentType": "application/pdf" |
| | | } |
| | | ] |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. å¨å®¢æ·æ¡£æ¡ï¼ç§æµ·ï¼è¯¦æ
页添å ååè®°å½Tab |
| | | |
| | | ```html |
| | | <el-tabs v-model="activeTab"> |
| | | <!-- å
¶ä»Tab --> |
| | | <el-tab-pane label="ååè®°å½" name="contract"> |
| | | <el-button type="primary" size="small" @click="handleAddContract">æ°å¢ååè®°å½</el-button> |
| | | <el-table :data="contractList" style="width: 100%; margin-top: 15px"> |
| | | <el-table-column prop="masterContractNo" label="æ»ååå·" /> |
| | | <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="handleViewFiles(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 type="text" size="small" @click="handleEditContract(row)">ç¼è¾</el-button> |
| | | <el-button type="text" size="small" style="color: #f56c6c" @click="handleDeleteContract(row)">å é¤</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | ``` |
| | | |
| | | ### 2. æ°å¢/ç¼è¾ååè®°å½å¼¹çªï¼ä½¿ç¨ç³»ç»éç¨ä¸ä¼ ç»ä»¶ï¼ |
| | | |
| | | ```html |
| | | <el-dialog :title="contractDialogTitle" v-model="contractDialogVisible" width="600px"> |
| | | <el-form :model="contractForm" :rules="contractRules" ref="contractFormRef" label-width="100px"> |
| | | <el-form-item label="æ»ååå·" prop="masterContractNo"> |
| | | <el-input v-model="contractForm.masterContractNo" placeholder="请è¾å
¥æ»ååå·" /> |
| | | </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%" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="å½å
¥äºº" prop="entryPerson"> |
| | | <el-input v-model="contractForm.entryPerson" placeholder="请è¾å
¥å½å
¥äºº" /> |
| | | </el-form-item> |
| | | <el-form-item label="éä»¶"> |
| | | <!-- 使ç¨ç³»ç»å°è£
çæä»¶ä¸ä¼ ç»ä»¶ --> |
| | | <file-upload |
| | | v-model="contractForm.storageBlobDTOs" |
| | | :record-type="'customer_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> |
| | | <el-button @click="contractDialogVisible = false">åæ¶</el-button> |
| | | <el-button type="primary" @click="submitContractForm">ç¡®å®</el-button> |
| | | </template> |
| | | </el-dialog> |
| | | ``` |
| | | |
| | | ### 3. data æ°æ® |
| | | |
| | | ```js |
| | | data() { |
| | | return { |
| | | // ååè®°å½ç¸å
³ |
| | | contractList: [], |
| | | contractDialogVisible: false, |
| | | contractDialogTitle: '', |
| | | contractForm: { |
| | | id: null, |
| | | customerId: null, |
| | | masterContractNo: '', |
| | | entryDate: '', |
| | | entryPerson: '', |
| | | entryPersonId: null, |
| | | remark: '', |
| | | storageBlobDTOs: [] // éä»¶å表ï¼ä½¿ç¨ç³»ç»éç¨æ ¼å¼ |
| | | }, |
| | | contractRules: { |
| | | masterContractNo: [{ required: true, message: '请è¾å
¥æ»ååå·', trigger: 'blur' }], |
| | | entryDate: [{ required: true, message: 'è¯·éæ©å½å
¥æ¥æ', trigger: 'change' }] |
| | | } |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 4. æ¹æ³ |
| | | |
| | | ```js |
| | | methods: { |
| | | // è·åååè®°å½å表ï¼å«éä»¶ï¼ |
| | | async getContractList(customerId) { |
| | | const res = await this.$http.get(`/basic/customer-contract/list/${customerId}`) |
| | | if (res.code === 200) { |
| | | this.contractList = res.data |
| | | } |
| | | }, |
| | | |
| | | // æ°å¢ååè®°å½ |
| | | handleAddContract() { |
| | | this.contractDialogTitle = 'æ°å¢ååè®°å½' |
| | | this.contractForm = { |
| | | id: null, |
| | | customerId: this.customerId, |
| | | masterContractNo: '', |
| | | entryDate: '', |
| | | entryPerson: '', |
| | | entryPersonId: null, |
| | | remark: '', |
| | | storageBlobDTOs: [] |
| | | } |
| | | this.contractDialogVisible = true |
| | | }, |
| | | |
| | | // ç¼è¾ååè®°å½ |
| | | async handleEditContract(row) { |
| | | this.contractDialogTitle = 'ç¼è¾ååè®°å½' |
| | | const res = await this.$http.get(`/basic/customer-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/customer-contract/${row.id}`) |
| | | if (res.code === 200) { |
| | | this.$message.success('å 餿å') |
| | | this.getContractList(this.customerId) |
| | | } |
| | | }, |
| | | |
| | | // æäº¤ååè®°å½è¡¨å |
| | | async submitContractForm() { |
| | | await this.$refs.contractFormRef.validate() |
| | | const res = await this.$http.post('/basic/customer-contract', this.contractForm) |
| | | if (res.code === 200) { |
| | | this.$message.success('æä½æå') |
| | | this.contractDialogVisible = false |
| | | this.getContractList(this.customerId) |
| | | } |
| | | }, |
| | | |
| | | // æ¥çéä»¶å表 |
| | | handleViewFiles(row) { |
| | | // å¼¹çªå±ç¤ºéä»¶å表ï¼ä½¿ç¨ row.fileList |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ## å端æä»¶æ¸
å |
| | | |
| | | | æä»¶è·¯å¾ | 说æ | |
| | | |---------|------| |
| | | | `src/main/java/com/ruoyi/basic/pojo/CustomerContractRecord.java` | å®ä½ç±» | |
| | | | `src/main/java/com/ruoyi/basic/dto/CustomerContractRecordDto.java` | DTOï¼å«éä»¶åè¡¨ï¼ | |
| | | | `src/main/java/com/ruoyi/basic/mapper/CustomerContractRecordMapper.java` | Mapperæ¥å£ | |
| | | | `src/main/resources/mapper/basic/CustomerContractRecordMapper.xml` | Mapper XML | |
| | | | `src/main/java/com/ruoyi/basic/service/CustomerContractRecordService.java` | Serviceæ¥å£ | |
| | | | `src/main/java/com/ruoyi/basic/service/impl/CustomerContractRecordServiceImpl.java` | Serviceå®ç° | |
| | | | `src/main/java/com/ruoyi/basic/controller/CustomerContractRecordController.java` | Controller | |
| | | | `src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java` | æ·»å æä¸¾å¼ `CUSTOMER_CONTRACT_RECORD` | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - éä»¶ä¸ä¼ 使ç¨ç³»ç»å°è£
ç `StorageAttachment` æå¡ï¼éè¿ `record_type='customer_contract_record'` å `record_id` å
³è |
| | | - å端å¯ä½¿ç¨é¡¹ç®å°è£
ç `file-upload` ç»ä»¶ï¼ç»ä»¶å
é¨è°ç¨ `/basic/storage-attachment` æ¥å£ |
| | | - å é¤ååè®°å½æ¶ï¼å端ä¼èªå¨åæ¥å é¤å
³èçéä»¶ |
| | | - æ°å¢ååè®°å½æååï¼è¿åç `data.id` 为æ°å¢è®°å½çID |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- å®¢æ·æ¡£æ¡ç§æµ·-ååè®°å½å表 |
| | | CREATE TABLE `customer_contract_record` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主é®ID', |
| | | `customer_id` bigint NOT NULL COMMENT 'å
³èå®¢æ·æ¡£æ¡IDï¼ç§æµ·å®¢æ·ï¼', |
| | | `master_contract_no` varchar(100) DEFAULT NULL COMMENT 'æ»ååå·', |
| | | `entry_date` datetime DEFAULT NULL COMMENT 'å½å
¥æ¥æ', |
| | | `entry_person` varchar(50) DEFAULT NULL COMMENT 'å½å
¥äºº', |
| | | `entry_person_id` bigint DEFAULT NULL COMMENT 'å½å
¥äººID', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `tenant_id` bigint DEFAULT NULL COMMENT 'ç§æ·ID', |
| | | `dept_id` bigint DEFAULT NULL COMMENT 'é¨é¨ID', |
| | | `create_user` int DEFAULT NULL COMMENT 'åå»ºç¨æ·', |
| | | `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `update_user` int DEFAULT NULL COMMENT 'ä¿®æ¹ç¨æ·', |
| | | `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'ä¿®æ¹æ¶é´', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_customer_id` (`customer_id`) COMMENT '客æ·IDç´¢å¼' |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='å®¢æ·æ¡£æ¡ç§æµ·-ååè®°å½è¡¨'; |
| | | |
| | | -- 注æï¼é件使ç¨ç³»ç»ç»ä¸ç storage_attachment 表管ç |
| | | -- éè¦å¨ RecordTypeEnum æä¸¾ä¸æ·»å ï¼CUSTOMER_CONTRACT_RECORD("customer_contract_record") |
| | | -- éä»¶å
³èæ¹å¼ï¼record_type = 'customer_contract_record', record_id = ååè®°å½ID |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # éè´å°è´¦-æ»ååå·èå¨éæ©åéä»¶æ¥ç |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - ä¾åºå管ç详æ
é¡µï¼æ°å¢ååè®°å½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 |
| | | <el-tabs v-model="activeTab"> |
| | | <!-- åºæ¬ä¿¡æ¯Tab --> |
| | | <el-tab-pane label="åºæ¬ä¿¡æ¯" name="basic">...</el-tab-pane> |
| | | <!-- ååè®°å½Tab --> |
| | | <el-tab-pane label="ååè®°å½" name="contract"> |
| | | <el-button type="primary" size="small" @click="handleAddContract">æ°å¢ååè®°å½</el-button> |
| | | <el-table :data="contractList" style="width: 100%; margin-top: 15px"> |
| | | <el-table-column prop="masterContractNo" label="æ»ååå·" /> |
| | | <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="handleViewFiles(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 type="text" size="small" @click="handleEditContract(row)">ç¼è¾</el-button> |
| | | <el-button type="text" size="small" style="color: #f56c6c" @click="handleDeleteContract(row)">å é¤</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | ``` |
| | | |
| | | ### 2. æ°å¢/ç¼è¾ååè®°å½å¼¹çª |
| | | |
| | | ```html |
| | | <el-dialog :title="contractDialogTitle" v-model="contractDialogVisible" width="600px"> |
| | | <el-form :model="contractForm" :rules="contractRules" ref="contractFormRef" label-width="100px"> |
| | | <el-form-item label="æ»ååå·" prop="masterContractNo"> |
| | | <el-input v-model="contractForm.masterContractNo" placeholder="请è¾å
¥æ»ååå·" /> |
| | | </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%" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="å½å
¥äºº" prop="entryPerson"> |
| | | <el-input v-model="contractForm.entryPerson" placeholder="请è¾å
¥å½å
¥äºº" /> |
| | | </el-form-item> |
| | | <el-form-item label="éä»¶"> |
| | | <file-upload |
| | | 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> |
| | | <el-button @click="contractDialogVisible = false">åæ¶</el-button> |
| | | <el-button type="primary" @click="submitContractForm">ç¡®å®</el-button> |
| | | </template> |
| | | </el-dialog> |
| | | ``` |
| | | |
| | | ### 3. éè´å°è´¦æ°å¢/ç¼è¾é¡µ - ä¾åºåéæ©åè卿»ååå· |
| | | |
| | | ```html |
| | | <el-form-item label="ä¾åºå" prop="supplierId"> |
| | | <el-select |
| | | v-model="form.supplierId" |
| | | placeholder="è¯·éæ©ä¾åºå" |
| | | filterable |
| | | @change="handleSupplierChange" |
| | | > |
| | | <el-option |
| | | v-for="item in supplierList" |
| | | :key="item.id" |
| | | :label="item.supplierName" |
| | | :value="item.id" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="æ»ååå·" prop="masterContractNo"> |
| | | <el-select |
| | | v-model="form.masterContractNo" |
| | | placeholder="请å
éæ©ä¾åºå" |
| | | filterable |
| | | clearable |
| | | :disabled="!form.supplierId" |
| | | > |
| | | <el-option |
| | | v-for="item in contractList" |
| | | :key="item.id" |
| | | :label="item.masterContractNo" |
| | | :value="item.masterContractNo" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | ``` |
| | | |
| | | ### 4. éè´å°è´¦å表页 - æä½æ æ·»å æ¥çæ»ååéä»¶æé® |
| | | |
| | | ```html |
| | | <el-table-column label="æä½" width="200"> |
| | | <template #default="{ row }"> |
| | | <el-button type="text" size="small" @click="handleEdit(row)">ç¼è¾</el-button> |
| | | <el-button type="text" size="small" @click="handleDelete(row)">å é¤</el-button> |
| | | <el-button |
| | | type="text" |
| | | size="small" |
| | | v-if="row.masterContractNo" |
| | | @click="handleViewContractFiles(row)" |
| | | >æ¥çéä»¶</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | ``` |
| | | |
| | | ### 5. æ»ååéä»¶æ¥çå¼¹çª |
| | | |
| | | ```html |
| | | <el-dialog title="æ»ååéä»¶" v-model="contractFileDialogVisible" width="600px"> |
| | | <el-table :data="contractFileList" v-if="contractFileList.length"> |
| | | <el-table-column prop="name" label="æä»¶åç§°" /> |
| | | <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> |
| | | ``` |
| | | |
| | | ### 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 |
| | | <el-table-column prop="masterContractNo" label="æ»ååå·" width="150" show-overflow-tooltip /> |
| | | ``` |
| | | |
| | | ## å端æä»¶æ¸
å |
| | | |
| | | | æä»¶è·¯å¾ | 说æ | |
| | | |---------|------| |
| | | | `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` åæ®µï¼æ éä¿®æ¹æ°æ®åº |
| | | - æ¥çéä»¶æé®ä»
卿»ååå·å卿¶æ¾ç¤º |
| | | - éä»¶å表éè¿æ»ååå·æ¥è¯¢ï¼æ¯æé¢è§åä¸è½½ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # éå®å°è´¦/é宿¥ä»·-æ»ååå·èå¨éæ©åéä»¶æ¥ç |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - éå®å°è´¦å表页/æ°å¢ç¼è¾é¡µ |
| | | - é宿¥ä»·å表页/æ°å¢ç¼è¾é¡µ |
| | | |
| | | ## æ°å¢API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /basic/customer-contract/list/{customerId} | æ¥è¯¢å®¢æ·ååè®°å½å表ï¼ä¾ä¸æéæ©ï¼ | |
| | | | GET | /basic/customer-contract/files/byContractNo?masterContractNo=xxx | æ ¹æ®æ»ååå·æ¥è¯¢éä»¶ | |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. éå®å°è´¦æ°å¢/ç¼è¾é¡µ - 客æ·éæ©åè卿»ååå· |
| | | |
| | | ```html |
| | | <el-form-item label="客æ·åç§°" prop="customerId"> |
| | | <el-select |
| | | v-model="form.customerId" |
| | | placeholder="è¯·éæ©å®¢æ·" |
| | | filterable |
| | | @change="handleCustomerChange" |
| | | > |
| | | <el-option |
| | | v-for="item in customerList" |
| | | :key="item.id" |
| | | :label="item.customerName" |
| | | :value="item.id" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="æ»ååå·" prop="masterContractNo"> |
| | | <el-select |
| | | v-model="form.masterContractNo" |
| | | placeholder="请å
鿩客æ·" |
| | | filterable |
| | | clearable |
| | | :disabled="!form.customerId" |
| | | > |
| | | <el-option |
| | | v-for="item in contractList" |
| | | :key="item.id" |
| | | :label="item.masterContractNo" |
| | | :value="item.masterContractNo" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | ``` |
| | | |
| | | ### 2. é宿¥ä»·æ°å¢/ç¼è¾é¡µ - åæ ·æ·»å 客æ·åæ»ååå·èå¨ |
| | | |
| | | ```html |
| | | <el-form-item label="客æ·åç§°" prop="customerId"> |
| | | <el-select |
| | | v-model="form.customerId" |
| | | placeholder="è¯·éæ©å®¢æ·" |
| | | filterable |
| | | @change="handleCustomerChange" |
| | | > |
| | | <el-option |
| | | v-for="item in customerList" |
| | | :key="item.id" |
| | | :label="item.customerName" |
| | | :value="item.id" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="æ»ååå·" prop="masterContractNo"> |
| | | <el-select |
| | | v-model="form.masterContractNo" |
| | | placeholder="请å
鿩客æ·" |
| | | filterable |
| | | clearable |
| | | :disabled="!form.customerId" |
| | | > |
| | | <el-option |
| | | v-for="item in contractList" |
| | | :key="item.id" |
| | | :label="item.masterContractNo" |
| | | :value="item.masterContractNo" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | ``` |
| | | |
| | | ### 3. éå®å°è´¦å表页 - æä½æ æ·»å æ¥çæ»ååéä»¶æé® |
| | | |
| | | ```html |
| | | <el-table-column label="æä½" width="200"> |
| | | <template #default="{ row }"> |
| | | <el-button type="text" size="small" @click="handleEdit(row)">ç¼è¾</el-button> |
| | | <el-button type="text" size="small" @click="handleDelete(row)">å é¤</el-button> |
| | | <el-button |
| | | type="text" |
| | | size="small" |
| | | v-if="row.masterContractNo" |
| | | @click="handleViewContractFiles(row)" |
| | | >æ¥çéä»¶</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | ``` |
| | | |
| | | ### 4. æ»ååéä»¶æ¥çå¼¹çª |
| | | |
| | | ```html |
| | | <el-dialog title="æ»ååéä»¶" v-model="contractFileDialogVisible" width="600px"> |
| | | <el-table :data="contractFileList" v-if="contractFileList.length"> |
| | | <el-table-column prop="name" label="æä»¶åç§°" /> |
| | | <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> |
| | | ``` |
| | | |
| | | ### 5. data æ°æ® |
| | | |
| | | ```js |
| | | data() { |
| | | return { |
| | | // ååå表ï¼ä¾ä¸æéæ©ï¼ |
| | | contractList: [], |
| | | // æ»ååéä»¶å¼¹çª |
| | | contractFileDialogVisible: false, |
| | | contractFileList: [] |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 6. æ¹æ³ |
| | | |
| | | ```js |
| | | methods: { |
| | | // 客æ·éæ©ååæ¶ï¼å 载该客æ·çååå表 |
| | | async handleCustomerChange(customerId) { |
| | | this.form.masterContractNo = '' // æ¸
空æ»ååå· |
| | | this.contractList = [] |
| | | if (!customerId) return |
| | | |
| | | const res = await this.$http.get(`/basic/customer-contract/list/${customerId}`) |
| | | if (res.code === 200) { |
| | | this.contractList = res.data |
| | | } |
| | | }, |
| | | |
| | | // æ¥çæ»ååéä»¶ |
| | | async handleViewContractFiles(row) { |
| | | if (!row.masterContractNo) { |
| | | this.$message.warning('è¯¥è®°å½æ²¡ææ»ååå·') |
| | | return |
| | | } |
| | | const res = await this.$http.get('/basic/customer-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] |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 7. éå®å°è´¦/æ¥ä»·å表页 - è¡¨æ ¼æ¾ç¤ºæ»ååå·å |
| | | |
| | | ```html |
| | | <el-table-column prop="masterContractNo" label="æ»ååå·" width="150" show-overflow-tooltip /> |
| | | ``` |
| | | |
| | | ### 8. ç¼è¾é¡µæå¼æ¶åæ¾æ»ååå· |
| | | |
| | | ```js |
| | | // æå¼ç¼è¾å¼¹çªæ¶ï¼å 载客æ·çåååè¡¨å¹¶åæ¾ |
| | | async handleEdit(row) { |
| | | this.form = { ...row } |
| | | this.dialogVisible = true |
| | | |
| | | // å 载客æ·çååå表 |
| | | if (row.customerId) { |
| | | const res = await this.$http.get(`/basic/customer-contract/list/${row.customerId}`) |
| | | if (res.code === 200) { |
| | | this.contractList = res.data |
| | | } |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - æ»ååå·æ¥æºäºå®¢æ·æ¡£æ¡ç§æµ·çååè®°å½å表 |
| | | - éæ©é¡ºåºï¼å
éå®¢æ· -> èªå¨å 载该客æ·çååå表 -> åéæ»ååå· |
| | | - éå®å°è´¦è¡¨å·²æ `master_contract_no` åæ®µï¼é宿¥ä»·è¡¨éæ°å¢è¯¥å段 |
| | | - æ¥çéä»¶æé®ä»
卿»ååå·å卿¶æ¾ç¤º |
| | | - éä»¶å表éè¿æ»ååå·æ¥è¯¢ï¼æ¯æé¢è§åä¸è½½ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- é宿¥ä»·è¡¨æ·»å æ»ååå·å段 |
| | | ALTER TABLE `sales_quotation` |
| | | ADD COLUMN `master_contract_no` varchar(100) DEFAULT NULL COMMENT 'æ»ååå·' AFTER `customer_id`; |
| | | |
| | | -- 注æï¼éå®å°è´¦è¡¨å·²æ master_contract_no åæ®µï¼æ éä¿®æ¹ |
| | | -- 注æï¼customer_contract_record 表已å¨åé¢å建ï¼ç¨äºåå¨å®¢æ·ååè®°å½åéä»¶ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ä¾åºå管ç-ååè®°å½å表 |
| | | CREATE TABLE `supplier_contract_record` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主é®ID', |
| | | `supplier_id` bigint NOT NULL COMMENT 'å
³èä¾åºåID', |
| | | `master_contract_no` varchar(100) DEFAULT NULL COMMENT 'æ»ååå·', |
| | | `entry_date` datetime DEFAULT NULL COMMENT 'å½å
¥æ¥æ', |
| | | `entry_person` varchar(50) DEFAULT NULL COMMENT 'å½å
¥äºº', |
| | | `entry_person_id` bigint DEFAULT NULL COMMENT 'å½å
¥äººID', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `tenant_id` bigint DEFAULT NULL COMMENT 'ç§æ·ID', |
| | | `dept_id` bigint DEFAULT NULL COMMENT 'é¨é¨ID', |
| | | `create_user` int DEFAULT NULL COMMENT 'åå»ºç¨æ·', |
| | | `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `update_user` int DEFAULT NULL COMMENT 'ä¿®æ¹ç¨æ·', |
| | | `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'ä¿®æ¹æ¶é´', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_supplier_id` (`supplier_id`) COMMENT 'ä¾åºåIDç´¢å¼' |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='ä¾åºå管ç-ååè®°å½è¡¨'; |
| | | |
| | | -- 注æï¼é件使ç¨ç³»ç»ç»ä¸ç storage_attachment 表管ç |
| | | -- éè¦å¨ RecordTypeEnum æä¸¾ä¸æ·»å ï¼SUPPLIER_CONTRACT_RECORD("supplier_contract_record") |
| | | -- éä»¶å
³èæ¹å¼ï¼record_type = 'supplier_contract_record', record_id = ååè®°å½ID |
| | | |
| | | -- éè´å°è´¦è¡¨æ·»å ä¾åºåæ»ååå·å段ï¼å¦æè¿æ²¡æçè¯ï¼ |
| | | ALTER TABLE `purchase_ledger` ADD COLUMN `master_contract_no` varchar(100) DEFAULT NULL COMMENT 'æ»ååå·' AFTER `supplier_id`; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.controller; |
| | | |
| | | import com.ruoyi.basic.dto.CustomerContractRecordDto; |
| | | import com.ruoyi.basic.service.CustomerContractRecordService; |
| | | import com.ruoyi.framework.aspectj.lang.annotation.Log; |
| | | import com.ruoyi.framework.aspectj.lang.enums.BusinessType; |
| | | import com.ruoyi.framework.web.controller.BaseController; |
| | | import com.ruoyi.framework.web.domain.AjaxResult; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 客æ·ååè®°å½Controller |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-06-24 |
| | | */ |
| | | @Tag(name = "客æ·ååè®°å½") |
| | | @RestController |
| | | @RequestMapping("/basic/customer-contract") |
| | | @RequiredArgsConstructor |
| | | public class CustomerContractRecordController extends BaseController { |
| | | |
| | | private final CustomerContractRecordService customerContractRecordService; |
| | | |
| | | /** |
| | | * æ¥è¯¢å®¢æ·ååè®°å½å表 |
| | | */ |
| | | @Operation(summary = "æ¥è¯¢å®¢æ·ååè®°å½å表") |
| | | @GetMapping("/list/{customerId}") |
| | | public AjaxResult list(@PathVariable Long customerId) { |
| | | List<CustomerContractRecordDto> list = customerContractRecordService.selectListByCustomerId(customerId); |
| | | return AjaxResult.success(list); |
| | | } |
| | | |
| | | /** |
| | | * è·å客æ·ååè®°å½è¯¦ç»ä¿¡æ¯ |
| | | */ |
| | | @Operation(summary = "è·å客æ·ååè®°å½è¯¦ç»ä¿¡æ¯") |
| | | @GetMapping("/{id}") |
| | | public AjaxResult getInfo(@PathVariable Long id) { |
| | | return AjaxResult.success(customerContractRecordService.selectDetailById(id)); |
| | | } |
| | | |
| | | /** |
| | | * æ°å¢å®¢æ·ååè®°å½ |
| | | */ |
| | | @Operation(summary = "æ°å¢å®¢æ·ååè®°å½") |
| | | @Log(title = "客æ·ååè®°å½-æ°å¢", businessType = BusinessType.INSERT) |
| | | @PostMapping |
| | | public AjaxResult add(@RequestBody CustomerContractRecordDto dto) { |
| | | int result = customerContractRecordService.insertCustomerContractRecord(dto); |
| | | return toAjax(result); |
| | | } |
| | | |
| | | /** |
| | | * ä¿®æ¹å®¢æ·ååè®°å½ |
| | | */ |
| | | @Operation(summary = "ä¿®æ¹å®¢æ·ååè®°å½") |
| | | @Log(title = "客æ·ååè®°å½-ä¿®æ¹", businessType = BusinessType.UPDATE) |
| | | @PutMapping |
| | | public AjaxResult edit(@RequestBody CustomerContractRecordDto dto) { |
| | | return toAjax(customerContractRecordService.updateCustomerContractRecord(dto)); |
| | | } |
| | | |
| | | /** |
| | | * å é¤å®¢æ·ååè®°å½ |
| | | */ |
| | | @Operation(summary = "å é¤å®¢æ·ååè®°å½") |
| | | @Log(title = "客æ·ååè®°å½-å é¤", businessType = BusinessType.DELETE) |
| | | @DeleteMapping("/{id}") |
| | | public AjaxResult remove(@PathVariable Long id) { |
| | | return toAjax(customerContractRecordService.deleteCustomerContractRecord(id)); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®æ»ååå·æ¥è¯¢éä»¶ï¼ä¾éå®å°è´¦ãé宿¥ä»·ç模å使ç¨ï¼ |
| | | */ |
| | | @Operation(summary = "æ ¹æ®æ»ååå·æ¥è¯¢éä»¶") |
| | | @GetMapping("/files/byContractNo") |
| | | public AjaxResult getFilesByContractNo(@RequestParam String masterContractNo) { |
| | | return AjaxResult.success(customerContractRecordService.selectFilesByMasterContractNo(masterContractNo)); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.controller; |
| | | |
| | | import com.ruoyi.basic.dto.SupplierContractRecordDto; |
| | | import com.ruoyi.basic.service.SupplierContractRecordService; |
| | | import com.ruoyi.framework.aspectj.lang.annotation.Log; |
| | | import com.ruoyi.framework.aspectj.lang.enums.BusinessType; |
| | | import com.ruoyi.framework.web.controller.BaseController; |
| | | import com.ruoyi.framework.web.domain.AjaxResult; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * ä¾åºåååè®°å½Controller |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-06-24 |
| | | */ |
| | | @Tag(name = "ä¾åºåååè®°å½") |
| | | @RestController |
| | | @RequestMapping("/basic/supplier-contract") |
| | | @RequiredArgsConstructor |
| | | public class SupplierContractRecordController extends BaseController { |
| | | |
| | | private final SupplierContractRecordService supplierContractRecordService; |
| | | |
| | | /** |
| | | * æ¥è¯¢ä¾åºåååè®°å½å表 |
| | | */ |
| | | @Operation(summary = "æ¥è¯¢ä¾åºåååè®°å½å表") |
| | | @GetMapping("/list/{supplierId}") |
| | | public AjaxResult list(@PathVariable Long supplierId) { |
| | | List<SupplierContractRecordDto> list = supplierContractRecordService.selectListBySupplierId(supplierId); |
| | | return AjaxResult.success(list); |
| | | } |
| | | |
| | | /** |
| | | * è·åä¾åºåååè®°å½è¯¦ç»ä¿¡æ¯ |
| | | */ |
| | | @Operation(summary = "è·åä¾åºåååè®°å½è¯¦ç»ä¿¡æ¯") |
| | | @GetMapping("/{id}") |
| | | public AjaxResult getInfo(@PathVariable Long id) { |
| | | return AjaxResult.success(supplierContractRecordService.selectDetailById(id)); |
| | | } |
| | | |
| | | /** |
| | | * æ°å¢ä¾åºåååè®°å½ |
| | | */ |
| | | @Operation(summary = "æ°å¢ä¾åºåååè®°å½") |
| | | @Log(title = "ä¾åºåååè®°å½-æ°å¢", businessType = BusinessType.INSERT) |
| | | @PostMapping |
| | | public AjaxResult add(@RequestBody SupplierContractRecordDto dto) { |
| | | int result = supplierContractRecordService.insertSupplierContractRecord(dto); |
| | | return toAjax(result); |
| | | } |
| | | |
| | | /** |
| | | * ä¿®æ¹ä¾åºåååè®°å½ |
| | | */ |
| | | @Operation(summary = "ä¿®æ¹ä¾åºåååè®°å½") |
| | | @Log(title = "ä¾åºåååè®°å½-ä¿®æ¹", businessType = BusinessType.UPDATE) |
| | | @PutMapping |
| | | public AjaxResult edit(@RequestBody SupplierContractRecordDto dto) { |
| | | return toAjax(supplierContractRecordService.updateSupplierContractRecord(dto)); |
| | | } |
| | | |
| | | /** |
| | | * å é¤ä¾åºåååè®°å½ |
| | | */ |
| | | @Operation(summary = "å é¤ä¾åºåååè®°å½") |
| | | @Log(title = "ä¾åºåååè®°å½-å é¤", businessType = BusinessType.DELETE) |
| | | @DeleteMapping("/{id}") |
| | | public AjaxResult remove(@PathVariable Long id) { |
| | | return toAjax(supplierContractRecordService.deleteSupplierContractRecord(id)); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®æ»ååå·æ¥è¯¢éä»¶ï¼ä¾éè´å°è´¦ç模å使ç¨ï¼ |
| | | */ |
| | | @Operation(summary = "æ ¹æ®æ»ååå·æ¥è¯¢éä»¶") |
| | | @GetMapping("/files/byContractNo") |
| | | public AjaxResult getFilesByContractNo(@RequestParam String masterContractNo) { |
| | | return AjaxResult.success(supplierContractRecordService.selectFilesByMasterContractNo(masterContractNo)); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.dto; |
| | | |
| | | import com.ruoyi.basic.pojo.CustomerContractRecord; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 客æ·ååè®°å½DTO |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-06-24 |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @Schema(name = "客æ·ååè®°å½DTO") |
| | | public class CustomerContractRecordDto extends CustomerContractRecord { |
| | | |
| | | @Schema(description = "客æ·åç§°") |
| | | private String customerName; |
| | | |
| | | @Schema(description = "éä»¶å表") |
| | | private List<StorageBlobVO> fileList; |
| | | |
| | | @Schema(description = "éä»¶IDå表ï¼ç¨äºä¿åï¼") |
| | | private List<StorageBlobDTO> storageBlobDTOs; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.dto; |
| | | |
| | | import com.ruoyi.basic.pojo.SupplierContractRecord; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * ä¾åºåååè®°å½DTO |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-06-24 |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @Schema(name = "ä¾åºåååè®°å½DTO") |
| | | public class SupplierContractRecordDto extends SupplierContractRecord { |
| | | |
| | | @Schema(description = "ä¾åºååç§°") |
| | | private String supplierName; |
| | | |
| | | @Schema(description = "éä»¶å表") |
| | | private List<StorageBlobVO> fileList; |
| | | |
| | | @Schema(description = "éä»¶IDå表ï¼ç¨äºä¿åï¼") |
| | | private List<StorageBlobDTO> storageBlobDTOs; |
| | | } |
| | |
| | | CUSTOMER_FOLLOW_UP_FILE("customer_follow_up_file"), |
| | | CUSTOMER_FOLLOW_UP("customer_follow_up"), |
| | | CUSTOMER_PRIVATE("customer_private"), |
| | | CUSTOMER_CONTRACT_RECORD("customer_contract_record"), |
| | | SUPPLIER_CONTRACT_RECORD("supplier_contract_record"), |
| | | // Approve |
| | | WORKING_HOURS_SETTING("working_hours_setting"), |
| | | OVERTIME_SETTING("overtime_setting"), |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.mapper; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.basic.pojo.CustomerContractRecord; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 客æ·ååè®°å½Mapperæ¥å£ |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-06-24 |
| | | */ |
| | | public interface CustomerContractRecordMapper extends BaseMapper<CustomerContractRecord> { |
| | | |
| | | /** |
| | | * æ¥è¯¢å®¢æ·ååè®°å½å表 |
| | | * |
| | | * @param customerId 客æ·ID |
| | | * @return ååè®°å½å表 |
| | | */ |
| | | List<CustomerContractRecord> selectListByCustomerId(@Param("customerId") Long customerId); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.mapper; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.basic.pojo.SupplierContractRecord; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * ä¾åºåååè®°å½Mapperæ¥å£ |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-06-24 |
| | | */ |
| | | public interface SupplierContractRecordMapper extends BaseMapper<SupplierContractRecord> { |
| | | |
| | | /** |
| | | * æ¥è¯¢ä¾åºåååè®°å½å表 |
| | | * |
| | | * @param supplierId ä¾åºåID |
| | | * @return ååè®°å½å表 |
| | | */ |
| | | List<SupplierContractRecord> selectListBySupplierId(@Param("supplierId") Long supplierId); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.pojo; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * å®¢æ·æ¡£æ¡ç§æµ·-ååè®°å½è¡¨ |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-06-24 |
| | | */ |
| | | @Data |
| | | @TableName("customer_contract_record") |
| | | @Schema(name = "客æ·ååè®°å½") |
| | | public class CustomerContractRecord implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** |
| | | * 主é®ID |
| | | */ |
| | | @TableId(type = IdType.AUTO) |
| | | private Long id; |
| | | |
| | | /** |
| | | * å
³èå®¢æ·æ¡£æ¡IDï¼ç§æµ·å®¢æ·ï¼ |
| | | */ |
| | | @Schema(description = "å
³èå®¢æ·æ¡£æ¡ID") |
| | | private Long customerId; |
| | | |
| | | /** |
| | | * æ»ååå· |
| | | */ |
| | | @Schema(description = "æ»ååå·") |
| | | private String masterContractNo; |
| | | |
| | | /** |
| | | * å½å
¥æ¥æ |
| | | */ |
| | | @Schema(description = "å½å
¥æ¥æ") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @TableField(value = "entry_date") |
| | | private LocalDateTime entryDate; |
| | | |
| | | /** |
| | | * å½å
¥äºº |
| | | */ |
| | | @Schema(description = "å½å
¥äºº") |
| | | private String entryPerson; |
| | | |
| | | /** |
| | | * å½å
¥äººID |
| | | */ |
| | | @Schema(description = "å½å
¥äººID") |
| | | private Long entryPersonId; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | @Schema(description = "夿³¨") |
| | | private String remark; |
| | | |
| | | /** |
| | | * ç§æ·ID |
| | | */ |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long tenantId; |
| | | |
| | | /** |
| | | * é¨é¨ID |
| | | */ |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long deptId; |
| | | |
| | | /** |
| | | * åå»ºç¨æ· |
| | | */ |
| | | @Schema(description = "åå»ºç¨æ·") |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Integer createUser; |
| | | |
| | | /** |
| | | * å建æ¶é´ |
| | | */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private LocalDateTime createTime; |
| | | |
| | | /** |
| | | * ä¿®æ¹ç¨æ· |
| | | */ |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private Integer updateUser; |
| | | |
| | | /** |
| | | * ä¿®æ¹æ¶é´ |
| | | */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private LocalDateTime updateTime; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.pojo; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * ä¾åºå管ç-ååè®°å½è¡¨ |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-06-24 |
| | | */ |
| | | @Data |
| | | @TableName("supplier_contract_record") |
| | | @Schema(name = "ä¾åºåååè®°å½") |
| | | public class SupplierContractRecord implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** |
| | | * 主é®ID |
| | | */ |
| | | @TableId(type = IdType.AUTO) |
| | | private Long id; |
| | | |
| | | /** |
| | | * å
³èä¾åºåID |
| | | */ |
| | | @Schema(description = "å
³èä¾åºåID") |
| | | private Long supplierId; |
| | | |
| | | /** |
| | | * æ»ååå· |
| | | */ |
| | | @Schema(description = "æ»ååå·") |
| | | private String masterContractNo; |
| | | |
| | | /** |
| | | * å½å
¥æ¥æ |
| | | */ |
| | | @Schema(description = "å½å
¥æ¥æ") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @TableField(value = "entry_date") |
| | | private LocalDateTime entryDate; |
| | | |
| | | /** |
| | | * å½å
¥äºº |
| | | */ |
| | | @Schema(description = "å½å
¥äºº") |
| | | private String entryPerson; |
| | | |
| | | /** |
| | | * å½å
¥äººID |
| | | */ |
| | | @Schema(description = "å½å
¥äººID") |
| | | private Long entryPersonId; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | @Schema(description = "夿³¨") |
| | | private String remark; |
| | | |
| | | /** |
| | | * ç§æ·ID |
| | | */ |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long tenantId; |
| | | |
| | | /** |
| | | * é¨é¨ID |
| | | */ |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long deptId; |
| | | |
| | | /** |
| | | * åå»ºç¨æ· |
| | | */ |
| | | @Schema(description = "åå»ºç¨æ·") |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Integer createUser; |
| | | |
| | | /** |
| | | * å建æ¶é´ |
| | | */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private LocalDateTime createTime; |
| | | |
| | | /** |
| | | * ä¿®æ¹ç¨æ· |
| | | */ |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private Integer updateUser; |
| | | |
| | | /** |
| | | * ä¿®æ¹æ¶é´ |
| | | */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private LocalDateTime updateTime; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.service; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.basic.dto.CustomerContractRecordDto; |
| | | import com.ruoyi.basic.dto.StorageBlobVO; |
| | | import com.ruoyi.basic.pojo.CustomerContractRecord; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 客æ·ååè®°å½Serviceæ¥å£ |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-06-24 |
| | | */ |
| | | public interface CustomerContractRecordService extends IService<CustomerContractRecord> { |
| | | |
| | | /** |
| | | * æ¥è¯¢å®¢æ·ååè®°å½å表 |
| | | * |
| | | * @param customerId 客æ·ID |
| | | * @return ååè®°å½å表 |
| | | */ |
| | | List<CustomerContractRecordDto> selectListByCustomerId(Long customerId); |
| | | |
| | | /** |
| | | * æ¥è¯¢å®¢æ·ååè®°å½è¯¦æ
ï¼å«éä»¶ï¼ |
| | | * |
| | | * @param id ååè®°å½ID |
| | | * @return ååè®°å½è¯¦æ
|
| | | */ |
| | | CustomerContractRecordDto selectDetailById(Long id); |
| | | |
| | | /** |
| | | * æ°å¢å®¢æ·ååè®°å½ |
| | | * |
| | | * @param dto ååè®°å½ä¿¡æ¯ |
| | | * @return ç»æ |
| | | */ |
| | | int insertCustomerContractRecord(CustomerContractRecordDto dto); |
| | | |
| | | /** |
| | | * ä¿®æ¹å®¢æ·ååè®°å½ |
| | | * |
| | | * @param dto ååè®°å½ä¿¡æ¯ |
| | | * @return ç»æ |
| | | */ |
| | | int updateCustomerContractRecord(CustomerContractRecordDto dto); |
| | | |
| | | /** |
| | | * å é¤å®¢æ·ååè®°å½ |
| | | * |
| | | * @param id ååè®°å½ID |
| | | * @return ç»æ |
| | | */ |
| | | int deleteCustomerContractRecord(Long id); |
| | | |
| | | /** |
| | | * æ ¹æ®æ»ååå·æ¥è¯¢éä»¶å表 |
| | | * |
| | | * @param masterContractNo æ»ååå· |
| | | * @return éä»¶å表 |
| | | */ |
| | | List<StorageBlobVO> selectFilesByMasterContractNo(String masterContractNo); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.service; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.basic.dto.StorageBlobVO; |
| | | import com.ruoyi.basic.dto.SupplierContractRecordDto; |
| | | import com.ruoyi.basic.pojo.SupplierContractRecord; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * ä¾åºåååè®°å½Serviceæ¥å£ |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-06-24 |
| | | */ |
| | | public interface SupplierContractRecordService extends IService<SupplierContractRecord> { |
| | | |
| | | /** |
| | | * æ¥è¯¢ä¾åºåååè®°å½å表 |
| | | * |
| | | * @param supplierId ä¾åºåID |
| | | * @return ååè®°å½å表 |
| | | */ |
| | | List<SupplierContractRecordDto> selectListBySupplierId(Long supplierId); |
| | | |
| | | /** |
| | | * æ¥è¯¢ä¾åºåååè®°å½è¯¦æ
ï¼å«éä»¶ï¼ |
| | | * |
| | | * @param id ååè®°å½ID |
| | | * @return ååè®°å½è¯¦æ
|
| | | */ |
| | | SupplierContractRecordDto selectDetailById(Long id); |
| | | |
| | | /** |
| | | * æ°å¢ä¾åºåååè®°å½ |
| | | * |
| | | * @param dto ååè®°å½ä¿¡æ¯ |
| | | * @return ç»æ |
| | | */ |
| | | int insertSupplierContractRecord(SupplierContractRecordDto dto); |
| | | |
| | | /** |
| | | * ä¿®æ¹ä¾åºåååè®°å½ |
| | | * |
| | | * @param dto ååè®°å½ä¿¡æ¯ |
| | | * @return ç»æ |
| | | */ |
| | | int updateSupplierContractRecord(SupplierContractRecordDto dto); |
| | | |
| | | /** |
| | | * å é¤ä¾åºåååè®°å½ |
| | | * |
| | | * @param id ååè®°å½ID |
| | | * @return ç»æ |
| | | */ |
| | | int deleteSupplierContractRecord(Long id); |
| | | |
| | | /** |
| | | * æ ¹æ®æ»ååå·æ¥è¯¢éä»¶å表 |
| | | * |
| | | * @param masterContractNo æ»ååå· |
| | | * @return éä»¶å表 |
| | | */ |
| | | List<StorageBlobVO> selectFilesByMasterContractNo(String masterContractNo); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.basic.dto.CustomerContractRecordDto; |
| | | import com.ruoyi.basic.dto.StorageBlobVO; |
| | | import com.ruoyi.basic.enums.RecordTypeEnum; |
| | | import com.ruoyi.basic.mapper.CustomerContractRecordMapper; |
| | | import com.ruoyi.basic.pojo.CustomerContractRecord; |
| | | import com.ruoyi.basic.service.CustomerContractRecordService; |
| | | import com.ruoyi.basic.utils.FileUtil; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * 客æ·ååè®°å½Serviceå®ç°ç±» |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-06-24 |
| | | */ |
| | | @Service |
| | | @RequiredArgsConstructor |
| | | public class CustomerContractRecordServiceImpl extends ServiceImpl<CustomerContractRecordMapper, CustomerContractRecord> implements CustomerContractRecordService { |
| | | |
| | | private final CustomerContractRecordMapper customerContractRecordMapper; |
| | | private final FileUtil fileUtil; |
| | | |
| | | @Override |
| | | public List<CustomerContractRecordDto> selectListByCustomerId(Long customerId) { |
| | | List<CustomerContractRecord> records = customerContractRecordMapper.selectListByCustomerId(customerId); |
| | | return records.stream().map(record -> { |
| | | CustomerContractRecordDto dto = new CustomerContractRecordDto(); |
| | | BeanUtils.copyProperties(record, dto); |
| | | // è·åéä»¶å表 |
| | | List<StorageBlobVO> files = fileUtil.getStorageBlobVOsByRecordTypeAndRecordId( |
| | | RecordTypeEnum.CUSTOMER_CONTRACT_RECORD, record.getId()); |
| | | dto.setFileList(files); |
| | | return dto; |
| | | }).collect(Collectors.toList()); |
| | | } |
| | | |
| | | @Override |
| | | public CustomerContractRecordDto selectDetailById(Long id) { |
| | | CustomerContractRecord record = customerContractRecordMapper.selectById(id); |
| | | if (record == null) { |
| | | return null; |
| | | } |
| | | CustomerContractRecordDto dto = new CustomerContractRecordDto(); |
| | | BeanUtils.copyProperties(record, dto); |
| | | // è·åéä»¶å表 |
| | | List<StorageBlobVO> files = fileUtil.getStorageBlobVOsByRecordTypeAndRecordId( |
| | | RecordTypeEnum.CUSTOMER_CONTRACT_RECORD, id); |
| | | dto.setFileList(files); |
| | | return dto; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public int insertCustomerContractRecord(CustomerContractRecordDto dto) { |
| | | CustomerContractRecord record = new CustomerContractRecord(); |
| | | BeanUtils.copyProperties(dto, record); |
| | | int result = customerContractRecordMapper.insert(record); |
| | | // ä¿åéä»¶ |
| | | if (dto.getStorageBlobDTOs() != null && !dto.getStorageBlobDTOs().isEmpty()) { |
| | | fileUtil.saveStorageAttachmentByRecordTypeAndRecordId( |
| | | "file", RecordTypeEnum.CUSTOMER_CONTRACT_RECORD, record.getId(), dto.getStorageBlobDTOs()); |
| | | } |
| | | // è¿åæ°å¢è®°å½çID |
| | | dto.setId(record.getId()); |
| | | return result; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public int updateCustomerContractRecord(CustomerContractRecordDto dto) { |
| | | CustomerContractRecord record = new CustomerContractRecord(); |
| | | BeanUtils.copyProperties(dto, record); |
| | | int result = customerContractRecordMapper.updateById(record); |
| | | // æ´æ°éä»¶ |
| | | if (dto.getStorageBlobDTOs() != null) { |
| | | fileUtil.saveStorageAttachmentByRecordTypeAndRecordId( |
| | | "file", RecordTypeEnum.CUSTOMER_CONTRACT_RECORD, record.getId(), dto.getStorageBlobDTOs()); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public int deleteCustomerContractRecord(Long id) { |
| | | // å é¤éä»¶ |
| | | fileUtil.deleteStorageAttachmentsByRecordTypeAndRecordId(RecordTypeEnum.CUSTOMER_CONTRACT_RECORD, id); |
| | | return customerContractRecordMapper.deleteById(id); |
| | | } |
| | | |
| | | @Override |
| | | public List<StorageBlobVO> selectFilesByMasterContractNo(String masterContractNo) { |
| | | // æ ¹æ®æ»ååå·æ¥è¯¢ååè®°å½ |
| | | CustomerContractRecord record = customerContractRecordMapper.selectOne( |
| | | new LambdaQueryWrapper<CustomerContractRecord>() |
| | | .eq(CustomerContractRecord::getMasterContractNo, masterContractNo) |
| | | .last("LIMIT 1")); |
| | | if (record == null) { |
| | | return Collections.emptyList(); |
| | | } |
| | | // è·åéä»¶å表 |
| | | return fileUtil.getStorageBlobVOsByRecordTypeAndRecordId( |
| | | RecordTypeEnum.CUSTOMER_CONTRACT_RECORD, record.getId()); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.basic.dto.StorageBlobVO; |
| | | import com.ruoyi.basic.dto.SupplierContractRecordDto; |
| | | import com.ruoyi.basic.enums.RecordTypeEnum; |
| | | import com.ruoyi.basic.mapper.SupplierContractRecordMapper; |
| | | import com.ruoyi.basic.pojo.SupplierContractRecord; |
| | | import com.ruoyi.basic.service.SupplierContractRecordService; |
| | | import com.ruoyi.basic.utils.FileUtil; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * ä¾åºåååè®°å½Serviceå®ç°ç±» |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-06-24 |
| | | */ |
| | | @Service |
| | | @RequiredArgsConstructor |
| | | public class SupplierContractRecordServiceImpl extends ServiceImpl<SupplierContractRecordMapper, SupplierContractRecord> implements SupplierContractRecordService { |
| | | |
| | | private final SupplierContractRecordMapper supplierContractRecordMapper; |
| | | private final FileUtil fileUtil; |
| | | |
| | | @Override |
| | | public List<SupplierContractRecordDto> selectListBySupplierId(Long supplierId) { |
| | | List<SupplierContractRecord> records = supplierContractRecordMapper.selectListBySupplierId(supplierId); |
| | | return records.stream().map(record -> { |
| | | SupplierContractRecordDto dto = new SupplierContractRecordDto(); |
| | | BeanUtils.copyProperties(record, dto); |
| | | // è·åéä»¶å表 |
| | | List<StorageBlobVO> files = fileUtil.getStorageBlobVOsByRecordTypeAndRecordId( |
| | | RecordTypeEnum.SUPPLIER_CONTRACT_RECORD, record.getId()); |
| | | dto.setFileList(files); |
| | | return dto; |
| | | }).collect(Collectors.toList()); |
| | | } |
| | | |
| | | @Override |
| | | public SupplierContractRecordDto selectDetailById(Long id) { |
| | | SupplierContractRecord record = supplierContractRecordMapper.selectById(id); |
| | | if (record == null) { |
| | | return null; |
| | | } |
| | | SupplierContractRecordDto dto = new SupplierContractRecordDto(); |
| | | BeanUtils.copyProperties(record, dto); |
| | | // è·åéä»¶å表 |
| | | List<StorageBlobVO> files = fileUtil.getStorageBlobVOsByRecordTypeAndRecordId( |
| | | RecordTypeEnum.SUPPLIER_CONTRACT_RECORD, id); |
| | | dto.setFileList(files); |
| | | return dto; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public int insertSupplierContractRecord(SupplierContractRecordDto dto) { |
| | | SupplierContractRecord record = new SupplierContractRecord(); |
| | | BeanUtils.copyProperties(dto, record); |
| | | int result = supplierContractRecordMapper.insert(record); |
| | | // ä¿åéä»¶ |
| | | if (dto.getStorageBlobDTOs() != null && !dto.getStorageBlobDTOs().isEmpty()) { |
| | | fileUtil.saveStorageAttachmentByRecordTypeAndRecordId( |
| | | "file", RecordTypeEnum.SUPPLIER_CONTRACT_RECORD, record.getId(), dto.getStorageBlobDTOs()); |
| | | } |
| | | // è¿åæ°å¢è®°å½çID |
| | | dto.setId(record.getId()); |
| | | return result; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public int updateSupplierContractRecord(SupplierContractRecordDto dto) { |
| | | SupplierContractRecord record = new SupplierContractRecord(); |
| | | BeanUtils.copyProperties(dto, record); |
| | | int result = supplierContractRecordMapper.updateById(record); |
| | | // æ´æ°éä»¶ |
| | | if (dto.getStorageBlobDTOs() != null) { |
| | | fileUtil.saveStorageAttachmentByRecordTypeAndRecordId( |
| | | "file", RecordTypeEnum.SUPPLIER_CONTRACT_RECORD, record.getId(), dto.getStorageBlobDTOs()); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public int deleteSupplierContractRecord(Long id) { |
| | | // å é¤éä»¶ |
| | | fileUtil.deleteStorageAttachmentsByRecordTypeAndRecordId(RecordTypeEnum.SUPPLIER_CONTRACT_RECORD, id); |
| | | return supplierContractRecordMapper.deleteById(id); |
| | | } |
| | | |
| | | @Override |
| | | public List<StorageBlobVO> selectFilesByMasterContractNo(String masterContractNo) { |
| | | // æ ¹æ®æ»ååå·æ¥è¯¢ååè®°å½ |
| | | SupplierContractRecord record = supplierContractRecordMapper.selectOne( |
| | | new LambdaQueryWrapper<SupplierContractRecord>() |
| | | .eq(SupplierContractRecord::getMasterContractNo, masterContractNo) |
| | | .last("LIMIT 1")); |
| | | if (record == null) { |
| | | return Collections.emptyList(); |
| | | } |
| | | // è·åéä»¶å表 |
| | | return fileUtil.getStorageBlobVOsByRecordTypeAndRecordId( |
| | | RecordTypeEnum.SUPPLIER_CONTRACT_RECORD, record.getId()); |
| | | } |
| | | } |
| | |
| | | @ApiModelProperty(value = "客æ·id") |
| | | private Long customerId; |
| | | |
| | | @ApiModelProperty(value = "æ»ååå·") |
| | | @Excel(name = "æ»ååå·") |
| | | private String masterContractNo; |
| | | |
| | | @ApiModelProperty(value = "ä¸å¡å") |
| | | @Excel(name = "ä¸å¡å") |
| | | private String salesperson; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="UTF-8" ?> |
| | | <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.basic.mapper.CustomerContractRecordMapper"> |
| | | |
| | | <resultMap id="CustomerContractRecordResult" type="com.ruoyi.basic.pojo.CustomerContractRecord"> |
| | | <id property="id" column="id"/> |
| | | <result property="customerId" column="customer_id"/> |
| | | <result property="masterContractNo" column="master_contract_no"/> |
| | | <result property="entryDate" column="entry_date"/> |
| | | <result property="entryPerson" column="entry_person"/> |
| | | <result property="entryPersonId" column="entry_person_id"/> |
| | | <result property="remark" column="remark"/> |
| | | <result property="tenantId" column="tenant_id"/> |
| | | <result property="deptId" column="dept_id"/> |
| | | <result property="createUser" column="create_user"/> |
| | | <result property="createTime" column="create_time"/> |
| | | <result property="updateUser" column="update_user"/> |
| | | <result property="updateTime" column="update_time"/> |
| | | </resultMap> |
| | | |
| | | <select id="selectListByCustomerId" resultMap="CustomerContractRecordResult"> |
| | | SELECT id, customer_id, master_contract_no, entry_date, entry_person, entry_person_id, remark, |
| | | tenant_id, dept_id, create_user, create_time, update_user, update_time |
| | | FROM customer_contract_record |
| | | WHERE customer_id = #{customerId} |
| | | ORDER BY entry_date DESC, create_time DESC |
| | | </select> |
| | | |
| | | </mapper> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="UTF-8" ?> |
| | | <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.basic.mapper.SupplierContractRecordMapper"> |
| | | |
| | | <resultMap id="SupplierContractRecordResult" type="com.ruoyi.basic.pojo.SupplierContractRecord"> |
| | | <id property="id" column="id"/> |
| | | <result property="supplierId" column="supplier_id"/> |
| | | <result property="masterContractNo" column="master_contract_no"/> |
| | | <result property="entryDate" column="entry_date"/> |
| | | <result property="entryPerson" column="entry_person"/> |
| | | <result property="entryPersonId" column="entry_person_id"/> |
| | | <result property="remark" column="remark"/> |
| | | <result property="tenantId" column="tenant_id"/> |
| | | <result property="deptId" column="dept_id"/> |
| | | <result property="createUser" column="create_user"/> |
| | | <result property="createTime" column="create_time"/> |
| | | <result property="updateUser" column="update_user"/> |
| | | <result property="updateTime" column="update_time"/> |
| | | </resultMap> |
| | | |
| | | <select id="selectListBySupplierId" resultMap="SupplierContractRecordResult"> |
| | | SELECT id, supplier_id, master_contract_no, entry_date, entry_person, entry_person_id, remark, |
| | | tenant_id, dept_id, create_user, create_time, update_user, update_time |
| | | FROM supplier_contract_record |
| | | WHERE supplier_id = #{supplierId} |
| | | ORDER BY entry_date DESC, create_time DESC |
| | | </select> |
| | | |
| | | </mapper> |
| | |
| | | AND (sl.sales_contract_no like concat('%',#{qualityInspect.salesContractNo},'%') |
| | | OR po_sales.sales_contract_no like concat('%',#{qualityInspect.salesContractNo},'%')) |
| | | </if> |
| | | ORDER BY qi.check_time DESC |
| | | ORDER BY qi.create_time DESC |
| | | </select> |
| | | |
| | | <select id="qualityInspectExport" resultType="com.ruoyi.quality.pojo.QualityInspect"> |
| | |
| | | END as shippingStatus, |
| | | CASE |
| | | WHEN T1.type != 2 THEN NULL |
| | | WHEN EXISTS ( |
| | | SELECT 1 FROM stock_in_record sir |
| | | WHERE sir.record_type = '7' AND sir.record_id = T1.sales_ledger_id |
| | | AND ((sir.batch_no IS NOT NULL AND sir.batch_no LIKE CONCAT('%-', T1.id)) |
| | | OR (sir.batch_no IS NULL AND sir.product_model_id = T1.product_model_id)) |
| | | AND sir.approval_status = 2 |
| | | ) THEN '已驳å' |
| | | WHEN IFNULL(t4.approved_stock_in_num, 0) <= 0 THEN 'å¾
å
¥åº' |
| | | WHEN IFNULL(t4.approved_stock_in_num, 0) >= IFNULL(T1.quantity, 0) THEN 'å®å
¨å
¥åº' |
| | | ELSE 'å
¥åºä¸' |