|
|
@@ -11,6 +11,8 @@ import com.fs.course.config.RandomRedPacketRule;
|
|
|
import com.fs.course.domain.FsUserCourse;
|
|
|
import com.fs.course.domain.FsUserCourseVideo;
|
|
|
import com.fs.course.mapper.FsUserCourseMapper;
|
|
|
+import com.fs.course.param.CourseRandomRedPacketBatchSaveParam;
|
|
|
+import com.fs.course.param.CourseRandomRedPacketCopyParam;
|
|
|
import com.fs.course.service.ICourseRandomRedPacketService;
|
|
|
import com.fs.system.domain.SysConfig;
|
|
|
import com.fs.system.service.ISysConfigService;
|
|
|
@@ -65,9 +67,78 @@ public class CourseRandomRedPacketServiceImpl implements ICourseRandomRedPacketS
|
|
|
|
|
|
@Override
|
|
|
public void saveConfig(CourseRandomRedPacketConfig config) {
|
|
|
- if (config == null || config.getProject() == null) {
|
|
|
+ validateConfig(config);
|
|
|
+ doSaveConfig(config);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void batchSaveConfig(CourseRandomRedPacketBatchSaveParam param) {
|
|
|
+ if (param == null || CollectionUtils.isEmpty(param.getProjects())) {
|
|
|
throw new IllegalArgumentException("课程项目不能为空");
|
|
|
}
|
|
|
+ CourseRandomRedPacketConfig template = buildConfigFromBatchParam(param);
|
|
|
+ validateConfig(template);
|
|
|
+ for (Long project : param.getProjects()) {
|
|
|
+ if (project == null) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ CourseRandomRedPacketConfig config = copyConfigFields(template);
|
|
|
+ config.setProject(project);
|
|
|
+ doSaveConfig(config);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void copyConfig(CourseRandomRedPacketCopyParam param) {
|
|
|
+ if (param == null || param.getSourceProject() == null) {
|
|
|
+ throw new IllegalArgumentException("源课程项目不能为空");
|
|
|
+ }
|
|
|
+ if (CollectionUtils.isEmpty(param.getTargetProjects())) {
|
|
|
+ throw new IllegalArgumentException("目标课程项目不能为空");
|
|
|
+ }
|
|
|
+ CourseRandomRedPacketConfig sourceConfig = getConfigByProject(param.getSourceProject());
|
|
|
+ if (sourceConfig == null) {
|
|
|
+ throw new IllegalArgumentException("源课程项目未配置红包规则");
|
|
|
+ }
|
|
|
+ for (Long targetProject : param.getTargetProjects()) {
|
|
|
+ if (targetProject == null || targetProject.equals(param.getSourceProject())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ CourseRandomRedPacketConfig config = copyConfigFields(sourceConfig);
|
|
|
+ config.setProject(targetProject);
|
|
|
+ doSaveConfig(config);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<CourseRandomRedPacketConfig> listConfiguredProjects() {
|
|
|
+ SysConfig query = new SysConfig();
|
|
|
+ query.setConfigKey(CONFIG_KEY_PREFIX);
|
|
|
+ List<SysConfig> configList = configService.selectConfigList(query);
|
|
|
+ if (CollectionUtils.isEmpty(configList)) {
|
|
|
+ return new ArrayList<>();
|
|
|
+ }
|
|
|
+ List<CourseRandomRedPacketConfig> result = new ArrayList<>();
|
|
|
+ for (SysConfig sysConfig : configList) {
|
|
|
+ if (sysConfig == null || StringUtils.isBlank(sysConfig.getConfigKey())
|
|
|
+ || !sysConfig.getConfigKey().startsWith(CONFIG_KEY_PREFIX)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ String projectStr = sysConfig.getConfigKey().substring(CONFIG_KEY_PREFIX.length());
|
|
|
+ try {
|
|
|
+ Long project = Long.valueOf(projectStr);
|
|
|
+ CourseRandomRedPacketConfig config = getConfigByProject(project);
|
|
|
+ if (config != null) {
|
|
|
+ result.add(config);
|
|
|
+ }
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
+ logger.warn("忽略无效的课程红包配置键 configKey={}", sysConfig.getConfigKey());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void doSaveConfig(CourseRandomRedPacketConfig config) {
|
|
|
String configKey = buildConfigKey(config.getProject());
|
|
|
String json = JSONUtil.toJsonStr(config);
|
|
|
SysConfig existing = configService.selectConfigByConfigKey(configKey);
|
|
|
@@ -84,6 +155,39 @@ public class CourseRandomRedPacketServiceImpl implements ICourseRandomRedPacketS
|
|
|
configService.insertConfig(sysConfig);
|
|
|
}
|
|
|
|
|
|
+ private CourseRandomRedPacketConfig buildConfigFromBatchParam(CourseRandomRedPacketBatchSaveParam param) {
|
|
|
+ CourseRandomRedPacketConfig config = new CourseRandomRedPacketConfig();
|
|
|
+ config.setProject(param.getProjects().get(0));
|
|
|
+ config.setEnableRandom(param.getEnableRandom());
|
|
|
+ config.setCompanyWhitelist(param.getCompanyWhitelist());
|
|
|
+ config.setTiers(param.getTiers());
|
|
|
+ return config;
|
|
|
+ }
|
|
|
+
|
|
|
+ private CourseRandomRedPacketConfig copyConfigFields(CourseRandomRedPacketConfig source) {
|
|
|
+ CourseRandomRedPacketConfig config = new CourseRandomRedPacketConfig();
|
|
|
+ config.setEnableRandom(source.getEnableRandom());
|
|
|
+ config.setCompanyWhitelist(source.getCompanyWhitelist());
|
|
|
+ config.setTiers(source.getTiers());
|
|
|
+ return config;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void validateConfig(CourseRandomRedPacketConfig config) {
|
|
|
+ if (config == null || config.getProject() == null) {
|
|
|
+ throw new IllegalArgumentException("课程项目不能为空");
|
|
|
+ }
|
|
|
+ if (!Boolean.TRUE.equals(config.getEnableRandom()) || CollectionUtils.isEmpty(config.getTiers())) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ int totalWeight = config.getTiers().stream()
|
|
|
+ .filter(t -> t.getWeight() != null && t.getWeight() > 0)
|
|
|
+ .mapToInt(CourseRandomRedPacketTier::getWeight)
|
|
|
+ .sum();
|
|
|
+ if (totalWeight != 100) {
|
|
|
+ throw new IllegalArgumentException("权重总和必须为100%");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public BigDecimal resolveAmount(BigDecimal baseAmount, Long courseId, Long companyId,
|
|
|
FsUserCourseVideo video, boolean allowLegacyRandom) {
|