Explorar el Código

feat(resource): 新增「购买时长」字段(按量/月/季度/半年/年)

- 新增 PurchaseDuration 枚举(1-按量 2-月 3-季度 4-半年 5-年)
- 实体/ResourceDTO/ResourceVO/ResourceExportVO 贯通 purchaseDuration 与中文文本
- ResourceServiceImpl 读写映射 + 导出填充
- 前端表单下拉、资源列表、项目详情关联资源表新增购买时长列
- sql/schema.sql 同步 resource 表 purchase_duration 列
C hace 2 meses
padre
commit
a0943f6ca3

+ 32 - 0
backend/src/main/java/com/example/resourceplatform/common/PurchaseDuration.java

@@ -0,0 +1,32 @@
+package com.example.resourceplatform.common;
+
+import lombok.Getter;
+
+/**
+ * 购买时长枚举
+ */
+@Getter
+public enum PurchaseDuration {
+
+    PAY_AS_YOU_GO(1, "按量"),
+    MONTH(2, "月"),
+    QUARTER(3, "季度"),
+    HALF_YEAR(4, "半年"),
+    YEAR(5, "年");
+
+    private final int code;
+    private final String text;
+
+    PurchaseDuration(int code, String text) {
+        this.code = code;
+        this.text = text;
+    }
+
+    public static String getTextByCode(Integer code) {
+        if (code == null) return "";
+        for (PurchaseDuration d : values()) {
+            if (d.code == code) return d.text;
+        }
+        return "";
+    }
+}

+ 3 - 0
backend/src/main/java/com/example/resourceplatform/dto/ResourceDTO.java

@@ -36,6 +36,9 @@ public class ResourceDTO {
 
     private String remark;
 
+    /** 购买时长: 1-按量 2-月 3-季度 4-半年 5-年 */
+    private Integer purchaseDuration;
+
     /** 关联的项目id列表,支持一个资源同时关联多个项目 */
     private List<Long> projectIds;
 }

+ 4 - 0
backend/src/main/java/com/example/resourceplatform/dto/ResourceExportVO.java

@@ -36,6 +36,9 @@ public class ResourceExportVO {
     @ExcelProperty("关联项目")
     private String projectNames;
 
+    @ExcelProperty("购买时长")
+    private String purchaseDurationText;
+
     @ExcelProperty("备注")
     private String remark;
 
@@ -51,6 +54,7 @@ public class ResourceExportVO {
         export.setStatusText(vo.getStatusText());
         export.setProjectNames(vo.getProjects() == null ? "" :
                 String.join("、", vo.getProjects().stream().map(ResourceVO.SimpleProject::getName).toList()));
+        export.setPurchaseDurationText(vo.getPurchaseDurationText());
         export.setRemark(vo.getRemark());
         return export;
     }

+ 6 - 0
backend/src/main/java/com/example/resourceplatform/dto/ResourceVO.java

@@ -44,6 +44,12 @@ public class ResourceVO {
 
     private String remark;
 
+    /** 购买时长编码: 1-按量 2-月 3-季度 4-半年 5-年 */
+    private Integer purchaseDuration;
+
+    /** 购买时长中文文本,用于前端展示 */
+    private String purchaseDurationText;
+
     /** 关联的项目简要信息 */
     private List<SimpleProject> projects;
 

+ 3 - 0
backend/src/main/java/com/example/resourceplatform/entity/Resource.java

@@ -41,6 +41,9 @@ public class Resource {
 
     private String remark;
 
+    /** 购买时长: 1-按量 2-月 3-季度 4-半年 5-年 */
+    private Integer purchaseDuration;
+
     private LocalDateTime createTime;
 
     private LocalDateTime updateTime;

+ 4 - 0
backend/src/main/java/com/example/resourceplatform/service/impl/ResourceServiceImpl.java

@@ -3,6 +3,7 @@ package com.example.resourceplatform.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.example.resourceplatform.common.BusinessException;
+import com.example.resourceplatform.common.PurchaseDuration;
 import com.example.resourceplatform.common.ResourceStatus;
 import com.example.resourceplatform.dto.*;
 import com.example.resourceplatform.entity.*;
@@ -148,6 +149,8 @@ public class ResourceServiceImpl implements ResourceService {
             vo.setStatus(r.getStatus());
             vo.setStatusText(statusText(r.getStatus()));
             vo.setRemark(r.getRemark());
+            vo.setPurchaseDuration(r.getPurchaseDuration());
+            vo.setPurchaseDurationText(PurchaseDuration.getTextByCode(r.getPurchaseDuration()));
 
             List<Long> projectIds = resourceProjectIdsMap.getOrDefault(r.getId(), List.of());
             vo.setProjects(projectIds.stream().map(pid -> {
@@ -190,6 +193,7 @@ public class ResourceServiceImpl implements ResourceService {
         resource.setCostCycle(dto.getCostCycle());
         resource.setOwnerId(dto.getOwnerId());
         resource.setRemark(dto.getRemark());
+        resource.setPurchaseDuration(dto.getPurchaseDuration());
         if (isNew) {
             resource.setStatus(ResourceStatus.ACTIVE.getCode());
             resourceMapper.insert(resource);

+ 1 - 0
frontend/src/views/project/ProjectDetail.vue

@@ -40,6 +40,7 @@
         <el-table-column prop="name" label="资源名称" min-width="140" />
         <el-table-column prop="typeName" label="类型" width="110" />
         <el-table-column prop="providerName" label="服务商" width="100" />
+        <el-table-column prop="purchaseDurationText" label="购买时长" width="90" />
         <el-table-column prop="ownerName" label="负责人" width="90" />
         <el-table-column label="到期日期" width="110" class-name="mono-num">
           <template #default="{ row }">{{ row.expireDate || '-' }}</template>

+ 15 - 0
frontend/src/views/resource/ResourceForm.vue

@@ -61,6 +61,20 @@
         </el-col>
       </el-row>
 
+      <el-row :gutter="12">
+        <el-col :span="12">
+          <el-form-item label="购买时长">
+            <el-select v-model="form.purchaseDuration" style="width: 100%" clearable placeholder="请选择">
+              <el-option label="按量" :value="1" />
+              <el-option label="月" :value="2" />
+              <el-option label="季度" :value="3" />
+              <el-option label="半年" :value="4" />
+              <el-option label="年" :value="5" />
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+
       <el-form-item label="负责人" prop="ownerId">
         <el-select v-model="form.ownerId" placeholder="请选择" style="width: 100%" filterable>
           <el-option v-for="u in userOptions" :key="u.id" :label="u.realName" :value="u.id" />
@@ -117,6 +131,7 @@ const defaultForm = () => ({
   expireDate: '',
   cost: 0,
   costCycle: 1,
+  purchaseDuration: null,
   ownerId: null,
   remark: '',
   projectIds: []

+ 1 - 0
frontend/src/views/resource/ResourceList.vue

@@ -55,6 +55,7 @@
         <el-table-column prop="name" label="资源名称" min-width="150" />
         <el-table-column prop="typeName" label="类型" width="110" />
         <el-table-column prop="providerName" label="服务商" width="100" />
+        <el-table-column prop="purchaseDurationText" label="购买时长" width="90" />
         <el-table-column label="关联项目" min-width="160">
           <template #default="{ row }">
             <el-tag v-for="p in row.projects" :key="p.id" size="small" style="margin-right: 4px">{{ p.name }}</el-tag>

+ 1 - 0
sql/schema.sql

@@ -86,6 +86,7 @@ CREATE TABLE `resource` (
   `owner_id`      BIGINT UNSIGNED NOT NULL COMMENT '负责人,关联sys_user.id',
   `status`        TINYINT         NOT NULL DEFAULT 1 COMMENT '状态: 1-使用中 2-即将到期 3-已过期 0-已停用',
   `remark`        VARCHAR(500)             DEFAULT NULL,
+  `purchase_duration` TINYINT           DEFAULT NULL COMMENT '购买时长: 1-按量 2-月 3-季度 4-半年 5-年',
   `create_time`   DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
   `update_time`   DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   `deleted`       TINYINT         NOT NULL DEFAULT 0 COMMENT '逻辑删除: 0-未删除 1-已删除',