Skip to content
This repository was archived by the owner on Mar 31, 2026. It is now read-only.

Commit bb2e2c0

Browse files
authored
Merge pull request #259 from CloudExplorer-Dev/pr@main@renew_instance
feat(vm-service,sdk): 续费功能
2 parents 35b54ca + 4670a05 commit bb2e2c0

File tree

60 files changed

+2113
-136
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+2113
-136
lines changed

framework/provider/core/pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,12 @@
7070
<dependency>
7171
<groupId>com.huaweicloud.sdk</groupId>
7272
<artifactId>huaweicloud-sdk-iam</artifactId>
73-
<version>3.1.9</version>
73+
<version>3.1.53</version>
7474
</dependency>
7575
<dependency>
7676
<groupId>com.huaweicloud.sdk</groupId>
7777
<artifactId>huaweicloud-sdk-bss</artifactId>
78-
<version>3.1.9</version>
78+
<version>3.1.53</version>
7979
</dependency>
8080
<!-- https://mvnrepository.com/artifact/com.huaweicloud/esdk-obs-java -->
8181
<dependency>
@@ -86,7 +86,7 @@
8686
<dependency>
8787
<groupId>com.huaweicloud.sdk</groupId>
8888
<artifactId>huaweicloud-sdk-ces</artifactId>
89-
<version>3.1.6</version>
89+
<version>3.1.53</version>
9090
</dependency>
9191
<!-- 华为云 end -->
9292
<!-- 腾讯云 start -->

framework/sdk/backend/src/main/java/com/fit2cloud/base/entity/VmCloudServer.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,23 @@
44
import com.baomidou.mybatisplus.annotation.TableField;
55
import com.baomidou.mybatisplus.annotation.TableId;
66
import com.baomidou.mybatisplus.annotation.TableName;
7-
import java.io.Serializable;
8-
import java.time.LocalDateTime;
9-
import lombok.Getter;
10-
import lombok.Setter;
11-
import lombok.experimental.Accessors;
12-
import java.io.Serial;
13-
147
import com.fasterxml.jackson.annotation.JsonFormat;
158
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
169
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
1710
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
1811
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
12+
import lombok.Getter;
13+
import lombok.Setter;
14+
import lombok.experimental.Accessors;
15+
16+
import java.io.Serial;
17+
import java.io.Serializable;
18+
import java.time.LocalDateTime;
1919

2020
/**
2121
* <p>
22-
*
23-
* </p>
24-
*
2522
*
23+
* </p>
2624
*/
2725
@Getter
2826
@Setter
@@ -323,4 +321,10 @@ public class VmCloudServer implements Serializable {
323321
@JsonSerialize(using = LocalDateTimeSerializer.class)
324322
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
325323
private LocalDateTime expiredTime;
324+
325+
/**
326+
* 是否自动续费
327+
*/
328+
@TableField("auto_renew")
329+
private Boolean autoRenew;
326330
}

framework/sdk/backend/src/main/java/com/fit2cloud/base/mapper/BaseVmCloudServerMapper.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,11 @@
2121
public interface BaseVmCloudServerMapper extends MPJBaseMapper<VmCloudServer> {
2222
@Select("SELECT source_id as `key`,count(*) as `value` FROM vm_cloud_server ${ew.customSqlSegment} GROUP BY source_id")
2323
List<DefaultKeyValue<String, Integer>> groupSourceId(@Param(Constants.WRAPPER) Wrapper<VmCloudServer> wrapper);
24+
25+
/**
26+
* 修改自动续费的超时时间
27+
*
28+
* @param cloudAccountIdList 云账号id
29+
*/
30+
void renewInstance(@Param("cloudAccountIdList") List<String> cloudAccountIdList);
2431
}

framework/sdk/backend/src/main/java/com/fit2cloud/base/mapper/BaseVmCloudServerMapper.xml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,20 @@
22
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
33
<mapper namespace="com.fit2cloud.base.mapper.BaseVmCloudServerMapper">
44

5+
<update id="renewInstance">
6+
UPDATE vm_cloud_server
7+
SET expired_time = date_add( `expired_time`, INTERVAL 1 MONTH )
8+
WHERE
9+
TIMESTAMPDIFF( HOUR, NOW(), expired_time )&lt;=0
10+
AND instance_charge_type='PrePaid'
11+
AND auto_renew=true
12+
<if test="cloudAccountIdList!=null and cloudAccountIdList.size >0">
13+
AND account_id IN
14+
<foreach collection="cloudAccountIdList" index="index" item="cloudAccountId" separator="," close=")"
15+
open="(">
16+
#{cloudAccountId}
17+
</foreach>
18+
</if>
19+
;
20+
</update>
521
</mapper>

framework/sdk/backend/src/main/java/com/fit2cloud/common/constants/JobTypeConstants.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,11 @@ public enum JobTypeConstants {
8282
/**
8383
* 扩容磁盘
8484
*/
85-
CLOUD_DISK_ENLARGE_JOB(305);
85+
CLOUD_DISK_ENLARGE_JOB(305),
86+
/**
87+
* 续期
88+
*/
89+
CLOUD_RENEW_INSTANCE_JOB(306);
8690

8791
@EnumValue
8892
private final int code;

framework/sdk/backend/src/main/java/com/fit2cloud/common/form/util/FormUtil.java

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,13 @@
77
import com.fit2cloud.common.form.vo.FormObject;
88
import com.fit2cloud.common.utils.JsonUtil;
99
import com.fit2cloud.common.utils.SpringUtil;
10+
import org.apache.commons.lang3.ClassUtils;
1011
import org.apache.commons.lang3.StringUtils;
1112
import org.apache.commons.lang3.reflect.FieldUtils;
1213
import org.apache.commons.lang3.reflect.MethodUtils;
1314

1415
import java.lang.reflect.Field;
15-
import java.util.Arrays;
16-
import java.util.HashMap;
17-
import java.util.Map;
16+
import java.util.*;
1817
import java.util.concurrent.atomic.AtomicInteger;
1918
import java.util.stream.Collectors;
2019

@@ -62,10 +61,9 @@ public static <T> FormObject toForm(Class<T> clazz) {
6261
}));
6362

6463
boolean hasGroup = groupAnnotationMap.size() > 0, hasStep = stepAnnotationMap.size() > 0, hasConfirm = confirmAnnotationMap.size() > 0;
65-
66-
Field[] fieldsWithAnnotation = FieldUtils.getFieldsWithAnnotation(clazz, com.fit2cloud.common.form.annotaion.Form.class);
64+
List<Field> fieldList = listField(clazz);
6765
AtomicInteger atomicInteger = new AtomicInteger(0);
68-
FormObject formObject = new FormObject().setForms(Arrays.stream(fieldsWithAnnotation).map(field -> {
66+
FormObject formObject = new FormObject().setForms(fieldList.stream().map(field -> {
6967
field.setAccessible(true);
7068
com.fit2cloud.common.form.annotaion.Form annotation = field.getAnnotation(com.fit2cloud.common.form.annotaion.Form.class);
7169
Map<String, Object> map = new HashMap<>();
@@ -142,6 +140,34 @@ public static <T> FormObject toForm(Class<T> clazz) {
142140
return formObject;
143141
}
144142

143+
144+
/**
145+
* 获取当前Class的所有Field,如果field名称则取子类field
146+
*
147+
* @param clazz class对象
148+
* @param <T> class泛型
149+
* @return 字段列表
150+
*/
151+
private static <T> List<Field> listField(Class<T> clazz) {
152+
Field[] fieldsWithAnnotation = FieldUtils.getFieldsWithAnnotation(clazz, com.fit2cloud.common.form.annotaion.Form.class);
153+
List<Field> fieldList = new ArrayList<>();
154+
Map<String, List<Field>> collect = Arrays.stream(fieldsWithAnnotation)
155+
.collect(Collectors.groupingBy(Field::getName));
156+
157+
// 获取class的继承关系
158+
List<Class<?>> allSuperclasses = ClassUtils.getAllSuperclasses(clazz);
159+
160+
for (Map.Entry<String, List<Field>> stringListEntry : collect.entrySet()) {
161+
List<Field> fields = stringListEntry
162+
.getValue()
163+
.stream()
164+
.sorted(Comparator.comparing(s -> allSuperclasses.indexOf(s.getDeclaringClass())))
165+
.toList();
166+
fieldList.add(fields.get(0));
167+
}
168+
return fieldList;
169+
}
170+
145171
/**
146172
* 执行class函数
147173
*

framework/sdk/backend/src/main/java/com/fit2cloud/common/log/constants/OperatedTypeEnum.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public enum OperatedTypeEnum {
3131
ATTACH_DISK("ATTACH_DISK", "挂载磁盘"),
3232
DETACH_DISK("DETACH_DISK", "卸载磁盘"),
3333
DELETE_DISK("DELETE_DISK", "删除磁盘"),
34+
RENEW_INSTANCE("RENEW_INSTANCE", "续费"),
3435
// RECYCLE_DISK("RECYCLE_DISK", "磁盘放入回收站"),
3536
// BATCH_ATTACH_DISK("BATCH_ATTACH_DISK", "批量挂载磁盘"),
3637
// BATCH_DETACH_DISK("BATCH_DETACH_DISK", "批量卸载磁盘"),

framework/sdk/backend/src/main/java/com/fit2cloud/common/provider/impl/huawei/api/HuaweiBaseCloudApi.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public static F2CBalance getAccountBalance(GetAccountBalanceRequest request) {
2424
BssClient bssClient = credential.getBssClient(request.getRegionId() != null ? request.getRegionId() : "cn-north-1");
2525
ShowCustomerAccountBalancesResponse response = bssClient.showCustomerAccountBalances(request);
2626
AccountBalanceV3 customerAccount = response.getAccountBalances().stream().filter(accountBalance -> 1 == accountBalance.getAccountType()).findFirst().get();
27-
return new F2CBalance(customerAccount.getAmount(), customerAccount.getCurrency(), response.getDebtAmount());
27+
return new F2CBalance(customerAccount.getAmount().doubleValue(), customerAccount.getCurrency(), response.getDebtAmount().doubleValue());
2828
}
2929
return new F2CBalance();
3030
}

services/vm-service/backend/src/main/java/com/fit2cloud/utils/ChargingUtil.java renamed to framework/sdk/backend/src/main/java/com/fit2cloud/common/utils/ChargingUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fit2cloud.utils;
1+
package com.fit2cloud.common.utils;
22

33
import com.fit2cloud.base.entity.BillPolicyDetails;
44
import com.fit2cloud.base.entity.json_entity.BillingField;

framework/sdk/frontend/commons/components/ce-form/CeFormItem.vue

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,11 @@ watch(
121121
props.listOptions(props.formItem, loading).then(() => {
122122
if (props.formItem.valueField && props.formItem.optionList) {
123123
if (
124-
props.formItem.optionList.some(
125-
(item: any) =>
126-
item[props.formItem.valueField as string] ===
127-
props.formItem.defaultValue
124+
props.formItem.optionList.some((item: any) =>
125+
item[props.formItem.valueField as string] ===
126+
props.formItem.defaultJsonValue
127+
? JSON.parse(props.formItem.defaultValue)
128+
: props.formItem.defaultValue
128129
)
129130
) {
130131
props.initDefaultData(props.formItem);

0 commit comments

Comments
 (0)