次月政策

This commit is contained in:
hy001 2026-04-30 20:07:54 +08:00
parent 7df5a8e04d
commit fb4184584d
11 changed files with 549 additions and 139 deletions

View File

@ -0,0 +1,32 @@
package com.red.circle.other.inner.enums.team;
/**
* 团队政策状态.
*/
public enum TeamPolicyStatusEnum {
/**
* 草稿.
*/
DRAFT,
/**
* 待生效.
*/
SCHEDULED,
/**
* 当前生效.
*/
ACTIVE,
/**
* 历史政策.
*/
HISTORY,
/**
* 已取消.
*/
CANCELLED
}

View File

@ -41,16 +41,36 @@ public class TeamPolicyManagerCmd extends CommonCommand {
@NotBlank(message = "region {not.null}")
private String region;
/**
* true已发布队外政策.
*/
private Boolean release;
/**
* 标题.
*/
@NotBlank(message = "title {not.null}")
private String title;
/**
* true已发布队外政策.
*/
private Boolean release;
/**
* 政策状态 DRAFT/SCHEDULED/ACTIVE/HISTORY/CANCELLED.
*/
private String policyStatus;
/**
* 生效月份 yyyyMM.
*/
private Integer effectiveMonth;
/**
* 生效时间.
*/
private Timestamp effectiveStartTime;
/**
* 实际激活时间.
*/
private Timestamp activatedTime;
/**
* 标题.
*/
@NotBlank(message = "title {not.null}")
private String title;
/**
* 政策.

View File

@ -47,15 +47,35 @@ public class TeamPolicyManagerDTO implements Serializable {
*/
private Boolean historyRelease;
/**
* true已发布队外政策.
*/
private Boolean release;
/**
* 标题.
*/
private String title;
/**
* true已发布队外政策.
*/
private Boolean release;
/**
* 政策状态 DRAFT/SCHEDULED/ACTIVE/HISTORY/CANCELLED.
*/
private String policyStatus;
/**
* 生效月份 yyyyMM.
*/
private Integer effectiveMonth;
/**
* 生效时间.
*/
private Timestamp effectiveStartTime;
/**
* 实际激活时间.
*/
private Timestamp activatedTime;
/**
* 标题.
*/
private String title;
/**
* 政策.

View File

@ -3,8 +3,9 @@ package com.red.circle.console.adapter.app.team;
import com.red.circle.console.app.dto.clienobject.team.TeamPolicyManagerCO;
import com.red.circle.console.app.service.app.team.TeamPolicyManagerBackService;
import com.red.circle.framework.web.controller.BaseController;
import com.red.circle.other.inner.endpoint.team.target.TeamBillCycleClient;
import com.red.circle.other.inner.model.cmd.team.TeamBillCycleBackQryCmd;
import com.red.circle.other.inner.endpoint.team.target.TeamBillCycleClient;
import com.red.circle.other.inner.enums.team.TeamPolicyStatusEnum;
import com.red.circle.other.inner.model.cmd.team.TeamBillCycleBackQryCmd;
import com.red.circle.other.inner.model.cmd.team.TeamPolicyManagerBackQryCmd;
import com.red.circle.other.inner.model.cmd.team.TeamPolicyManagerCmd;
import com.red.circle.tool.core.date.TimestampUtils;
@ -60,7 +61,8 @@ public class TeamPolicyManagerRestController extends BaseController {
teamPolicyManagerBackService.add(param);
// 发布完政策如果有团队是其他政策需要替换最新的政策可能出现的情况钻石->美元;美元->钻石;美元->美元;钻石->钻石
if (Objects.equals(param.getRelease(), Boolean.TRUE)) {
if (Objects.equals(param.getRelease(), Boolean.TRUE)
&& !Objects.equals(param.getPolicyStatus(), TeamPolicyStatusEnum.SCHEDULED.name())) {
// 发布后主动重算该系统该区域下团队的未出账账单
teamBillCycleClient.refreshUnpaidBills(new TeamBillCycleBackQryCmd()
.setSysOrigin(param.getSysOrigin())

View File

@ -48,15 +48,35 @@ public class TeamPolicyManagerCO implements Serializable {
*/
private Boolean historyRelease;
/**
* true已发布队外政策.
*/
private Boolean release;
/**
* 标题.
*/
private String title;
/**
* true已发布队外政策.
*/
private Boolean release;
/**
* 政策状态 DRAFT/SCHEDULED/ACTIVE/HISTORY/CANCELLED.
*/
private String policyStatus;
/**
* 生效月份 yyyyMM.
*/
private Integer effectiveMonth;
/**
* 生效时间.
*/
private Timestamp effectiveStartTime;
/**
* 实际激活时间.
*/
private Timestamp activatedTime;
/**
* 标题.
*/
private String title;
/**
* 政策.

View File

@ -0,0 +1,94 @@
package com.red.circle.other.app.scheduler;
import com.google.common.collect.Lists;
import com.red.circle.component.redis.annotation.TaskCacheLock;
import com.red.circle.mq.rocket.business.producer.TeamSalaryMqMessage;
import com.red.circle.other.infra.database.mongo.entity.team.team.TeamPolicyManager;
import com.red.circle.other.infra.database.mongo.entity.team.team.TeamProfile;
import com.red.circle.other.infra.database.mongo.service.team.team.TeamPolicyManagerService;
import com.red.circle.other.infra.database.mongo.service.team.team.TeamProfileService;
import com.red.circle.other.inner.model.dto.agency.agency.TeamStatus;
import com.red.circle.tool.core.collection.CollectionUtils;
import com.red.circle.tool.core.date.TimestampUtils;
import com.red.circle.tool.core.text.StringUtils;
import java.sql.Timestamp;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* 团队政策待生效切换任务.
*/
@Slf4j
@Component
@AllArgsConstructor
public class TeamPolicyActivationTask {
private final TeamPolicyManagerService teamPolicyManagerService;
private final TeamProfileService teamProfileService;
private final TeamSalaryMqMessage teamSalaryMqMessage;
/**
* 每5分钟补偿激活已到生效时间的政策避免服务短暂不可用导致漏切换.
*/
@Scheduled(cron = "15 0/5 * * * ?", zone = "Asia/Riyadh")
@TaskCacheLock(key = "TEAM_POLICY_ACTIVATION_TASK", expireSecond = 300)
public void activateScheduledPolicies() {
long startTime = System.currentTimeMillis();
Timestamp now = TimestampUtils.now();
List<TeamPolicyManager> policies = teamPolicyManagerService.listDueScheduledPolicies(now);
if (CollectionUtils.isEmpty(policies)) {
return;
}
Set<String> refreshedRegions = new HashSet<>();
int activatedCount = 0;
for (TeamPolicyManager policy : policies) {
TeamPolicyManager activatedPolicy = teamPolicyManagerService.activateScheduledPolicy(policy.getId(), now);
if (Objects.isNull(activatedPolicy)) {
continue;
}
activatedCount++;
String refreshKey = buildRefreshKey(activatedPolicy);
if (refreshedRegions.add(refreshKey)) {
refreshUnpaidBills(activatedPolicy);
}
}
log.info("exec team_policy_activation_task activated={}, cost={}",
activatedCount, System.currentTimeMillis() - startTime);
}
private void refreshUnpaidBills(TeamPolicyManager policy) {
if (Objects.isNull(policy)
|| StringUtils.isBlank(policy.getSysOrigin())
|| StringUtils.isBlank(policy.getRegion())) {
return;
}
List<TeamProfile> teamProfiles = Optional.ofNullable(teamProfileService.listRegionAll(policy.getRegion()))
.orElse(Lists.newArrayList())
.stream()
.filter(teamProfile -> Objects.equals(TeamStatus.AVAILABLE, teamProfile.getStatus()))
.filter(teamProfile -> Objects.equals(policy.getSysOrigin(), teamProfile.getSysOrigin()))
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(teamProfiles)) {
return;
}
Lists.partition(teamProfiles, 200).forEach(teamList -> teamSalaryMqMessage.sendSalaryCount(
teamList.stream().map(TeamProfile::getId).collect(Collectors.toSet())));
}
private String buildRefreshKey(TeamPolicyManager policy) {
return policy.getSysOrigin() + ":" + policy.getRegion();
}
}

View File

@ -46,15 +46,35 @@ public class TeamPolicyManagerCO extends ClientObject {
*/
private Boolean historyRelease;
/**
* true已发布队外政策.
*/
private Boolean release;
/**
* 标题.
*/
private String title;
/**
* true已发布队外政策.
*/
private Boolean release;
/**
* 政策状态 DRAFT/SCHEDULED/ACTIVE/HISTORY/CANCELLED.
*/
private String policyStatus;
/**
* 生效月份 yyyyMM.
*/
private Integer effectiveMonth;
/**
* 生效时间.
*/
private java.sql.Timestamp effectiveStartTime;
/**
* 实际激活时间.
*/
private java.sql.Timestamp activatedTime;
/**
* 标题.
*/
private String title;
/**
* 政策.

View File

@ -52,15 +52,35 @@ public class TeamPolicyManager implements Serializable {
*/
private Boolean historyRelease;
/**
* true已发布队外政策.
*/
private Boolean release;
/**
* 标题.
*/
private String title;
/**
* true已发布队外政策.
*/
private Boolean release;
/**
* 政策状态 DRAFT/SCHEDULED/ACTIVE/HISTORY/CANCELLED.
*/
private String policyStatus;
/**
* 生效月份 yyyyMM.
*/
private Integer effectiveMonth;
/**
* 生效时间.
*/
private Timestamp effectiveStartTime;
/**
* 实际激活时间.
*/
private Timestamp activatedTime;
/**
* 标题.
*/
private String title;
/**
* 政策.

View File

@ -1,9 +1,10 @@
package com.red.circle.other.infra.database.mongo.service.team.team;
import com.red.circle.other.infra.database.mongo.entity.team.team.TeamPolicyManager;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.red.circle.other.infra.database.mongo.entity.team.team.TeamPolicyManager;
import java.sql.Timestamp;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 团队策略.
@ -74,15 +75,25 @@ public interface TeamPolicyManagerService {
*/
TeamPolicyManager getById(Long id);
/**
* 添加策略.
*/
void add(TeamPolicyManager policyManager);
/**
* 删除策略.
*
* @param id id.
/**
* 添加策略.
*/
void add(TeamPolicyManager policyManager);
/**
* 查询到期的待生效政策.
*/
List<TeamPolicyManager> listDueScheduledPolicies(Timestamp now);
/**
* 激活待生效政策.
*/
TeamPolicyManager activateScheduledPolicy(Long id, Timestamp now);
/**
* 删除策略.
*
* @param id id.
*/
void deleteById(Long id);

View File

@ -1,23 +1,29 @@
package com.red.circle.other.infra.database.mongo.service.team.team.impl;
import com.google.common.collect.Maps;
import com.mongodb.client.result.UpdateResult;
import com.red.circle.other.infra.common.sys.CountryCodeAliasSupport;
import com.red.circle.other.infra.database.mongo.dto.team.TeamPolicy;
import com.red.circle.other.infra.database.mongo.entity.team.team.TeamPolicyManager;
import com.red.circle.other.infra.database.mongo.service.team.team.TeamPolicyManagerService;
import com.red.circle.other.inner.enums.team.TeamPolicyTypeEnum;
import com.red.circle.tool.core.collection.CollectionUtils;
import com.red.circle.tool.core.text.StringUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Sort;
import com.red.circle.other.infra.database.mongo.entity.team.team.TeamPolicyManager;
import com.red.circle.other.infra.database.mongo.service.team.team.TeamPolicyManagerService;
import com.red.circle.other.inner.enums.team.TeamPolicyStatusEnum;
import com.red.circle.other.inner.enums.team.TeamPolicyTypeEnum;
import com.red.circle.tool.core.collection.CollectionUtils;
import com.red.circle.tool.core.text.StringUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
* 团队策略.
@ -28,6 +34,10 @@ import java.util.stream.Collectors;
@RequiredArgsConstructor
public class TeamPolicyManagerServiceImpl implements TeamPolicyManagerService {
private static final ZoneId RIYADH_ZONE = ZoneId.of("Asia/Riyadh");
private static final DateTimeFormatter EFFECTIVE_MONTH_FORMATTER =
DateTimeFormatter.ofPattern("yyyyMM");
private final MongoTemplate mongoTemplate;
private final CountryCodeAliasSupport countryCodeAliasSupport;
@ -67,24 +77,24 @@ public class TeamPolicyManagerServiceImpl implements TeamPolicyManagerService {
}
@Override
public List<TeamPolicyManager> listReleaseTeamPolicy(String sysOrigin, String region) {
return mongoTemplate
.find(Query.query(Criteria.where("region").is(region)
.and("release").is(Boolean.TRUE)
.and("sysOrigin").is(sysOrigin))
.with(Sort.by(Sort.Order.desc("createTime"))),
TeamPolicyManager.class);
}
public List<TeamPolicyManager> listReleaseTeamPolicy(String sysOrigin, String region) {
return mongoTemplate
.find(Query.query(Criteria.where("region").is(region)
.and("release").is(Boolean.TRUE)
.and("sysOrigin").is(sysOrigin))
.with(activePolicySort()),
TeamPolicyManager.class);
}
@Override
public TeamPolicyManager getReleaseByRegionAndType(String sysOrigin, String region) {
return mongoTemplate.findOne(Query.query(
Criteria.where("region").is(region)
.and("release").is(Boolean.TRUE)
.and("sysOrigin").is(sysOrigin)
), TeamPolicyManager.class);
}
public TeamPolicyManager getReleaseByRegionAndType(String sysOrigin, String region) {
return mongoTemplate.findOne(Query.query(
Criteria.where("region").is(region)
.and("release").is(Boolean.TRUE)
.and("sysOrigin").is(sysOrigin)
).with(activePolicySort()), TeamPolicyManager.class);
}
@Override
public TeamPolicyManager getReleaseByRegionAndType(String sysOrigin, String region, String policyType, String countryCode) {
@ -102,8 +112,8 @@ public class TeamPolicyManagerServiceImpl implements TeamPolicyManagerService {
criteria.and("countryCode").in(countryCodeAliasSupport.getMatchCodes(countryCode));
}
return mongoTemplate.findOne(Query.query(criteria), TeamPolicyManager.class);
}
return mongoTemplate.findOne(Query.query(criteria).with(activePolicySort()), TeamPolicyManager.class);
}
@Override
public Map<String, TeamPolicyManager> mapRegionRelease(Set<String> regions) {
@ -112,16 +122,17 @@ public class TeamPolicyManagerServiceImpl implements TeamPolicyManagerService {
return Maps.newHashMap();
}
List<TeamPolicyManager> teamPolicyManagers = mongoTemplate.find(
Query.query(Criteria.where("region").in(regions).and("release").is(Boolean.TRUE)),
TeamPolicyManager.class);
List<TeamPolicyManager> teamPolicyManagers = mongoTemplate.find(
Query.query(Criteria.where("region").in(regions).and("release").is(Boolean.TRUE))
.with(activePolicySort()),
TeamPolicyManager.class);
if (CollectionUtils.isEmpty(teamPolicyManagers)) {
return Maps.newHashMap();
}
return teamPolicyManagers.stream()
.collect(Collectors.toMap(TeamPolicyManager::getRegion, v -> v));
return teamPolicyManagers.stream()
.collect(Collectors.toMap(TeamPolicyManager::getRegion, v -> v, (existing, replacement) -> existing));
}
@Override
@ -132,10 +143,11 @@ public class TeamPolicyManagerServiceImpl implements TeamPolicyManagerService {
}
// 查询所有 region 的已发布政策所有 countryCode
List<TeamPolicyManager> policies = mongoTemplate.find(
Query.query(Criteria.where("region").in(regions)
.and("release").is(Boolean.TRUE)),
TeamPolicyManager.class);
List<TeamPolicyManager> policies = mongoTemplate.find(
Query.query(Criteria.where("region").in(regions)
.and("release").is(Boolean.TRUE))
.with(activePolicySort()),
TeamPolicyManager.class);
if (CollectionUtils.isEmpty(policies)) {
return Maps.newHashMap();
@ -165,27 +177,173 @@ public class TeamPolicyManagerServiceImpl implements TeamPolicyManagerService {
return mongoTemplate.findOne(Query.query(Criteria.where("id").is(id)), TeamPolicyManager.class);
}
@Override
public void add(TeamPolicyManager policyManager) {
policyManager.setHistoryRelease(Boolean.FALSE);
if (Boolean.TRUE.equals(policyManager.getRelease()) && StringUtils
.isNotBlank(policyManager.getRegion())
&& StringUtils.isNotBlank(policyManager.getSysOrigin())) {
policyManager.setHistoryRelease(Boolean.TRUE);
}
policyManager.setPolicy(policyManager.getPolicy().stream()
.sorted(Comparator.comparing(TeamPolicy::getLevel))
.collect(Collectors.toList()));
mongoTemplate.save(policyManager);
}
@Override
public void add(TeamPolicyManager policyManager) {
Timestamp now = Optional.ofNullable(policyManager.getCreateTime())
.orElseGet(() -> new Timestamp(System.currentTimeMillis()));
normalizePolicyState(policyManager, now);
if (Boolean.TRUE.equals(policyManager.getRelease()) && StringUtils.isNotBlank(policyManager.getRegion())
&& StringUtils.isNotBlank(policyManager.getSysOrigin())) {
deactivateActivePolicies(policyManager, now);
}
if (CollectionUtils.isNotEmpty(policyManager.getPolicy())) {
policyManager.setPolicy(policyManager.getPolicy().stream()
.sorted(Comparator.comparing(TeamPolicy::getLevel))
.collect(Collectors.toList()));
}
mongoTemplate.save(policyManager);
}
@Override
public List<TeamPolicyManager> listDueScheduledPolicies(Timestamp now) {
return mongoTemplate.find(Query.query(Criteria.where("policyStatus")
.is(TeamPolicyStatusEnum.SCHEDULED.name())
.and("release").is(Boolean.FALSE)
.and("effectiveStartTime").lte(now))
.with(Sort.by(Sort.Order.asc("effectiveStartTime"), Sort.Order.asc("createTime"))),
TeamPolicyManager.class);
}
@Override
public TeamPolicyManager activateScheduledPolicy(Long id, Timestamp now) {
TeamPolicyManager scheduled = mongoTemplate.findOne(Query.query(Criteria.where("id").is(id)
.and("policyStatus").is(TeamPolicyStatusEnum.SCHEDULED.name())
.and("release").is(Boolean.FALSE)
.and("effectiveStartTime").lte(now)),
TeamPolicyManager.class);
if (Objects.isNull(scheduled)) {
return null;
}
deactivateActivePolicies(scheduled, now);
Update update = new Update()
.set("release", Boolean.TRUE)
.set("historyRelease", Boolean.TRUE)
.set("policyStatus", TeamPolicyStatusEnum.ACTIVE.name())
.set("effectiveMonth", resolveEffectiveMonth(scheduled.getEffectiveStartTime()))
.set("activatedTime", now)
.set("updateTime", now);
UpdateResult result = mongoTemplate.updateFirst(Query.query(Criteria.where("id").is(id)
.and("policyStatus").is(TeamPolicyStatusEnum.SCHEDULED.name())
.and("release").is(Boolean.FALSE)),
update,
TeamPolicyManager.class);
if (result.getModifiedCount() <= 0) {
return null;
}
return getById(id);
}
@Override
public void deleteById(Long id) {
mongoTemplate.remove(Query.query(Criteria.where("id").is(id)), TeamPolicyManager.class);
}
}
public void deleteById(Long id) {
mongoTemplate.remove(Query.query(Criteria.where("id").is(id)), TeamPolicyManager.class);
}
private void normalizePolicyState(TeamPolicyManager policyManager, Timestamp now) {
String policyStatus = policyManager.getPolicyStatus();
if (StringUtils.isBlank(policyStatus)) {
policyStatus = Boolean.TRUE.equals(policyManager.getRelease())
? TeamPolicyStatusEnum.ACTIVE.name()
: TeamPolicyStatusEnum.DRAFT.name();
}
if (Objects.equals(policyStatus, TeamPolicyStatusEnum.SCHEDULED.name())) {
Timestamp effectiveStartTime = Optional.ofNullable(policyManager.getEffectiveStartTime())
.orElseGet(this::nextMonthStartTime);
policyManager.setPolicyStatus(TeamPolicyStatusEnum.SCHEDULED.name());
policyManager.setRelease(Boolean.FALSE);
policyManager.setHistoryRelease(Boolean.FALSE);
policyManager.setEffectiveStartTime(effectiveStartTime);
policyManager.setEffectiveMonth(resolveEffectiveMonth(effectiveStartTime));
policyManager.setActivatedTime(null);
return;
}
if (Boolean.TRUE.equals(policyManager.getRelease())
|| Objects.equals(policyStatus, TeamPolicyStatusEnum.ACTIVE.name())) {
policyManager.setPolicyStatus(TeamPolicyStatusEnum.ACTIVE.name());
policyManager.setRelease(Boolean.TRUE);
policyManager.setHistoryRelease(Boolean.TRUE);
policyManager.setActivatedTime(Optional.ofNullable(policyManager.getActivatedTime()).orElse(now));
policyManager.setEffectiveStartTime(Optional.ofNullable(policyManager.getEffectiveStartTime()).orElse(now));
policyManager.setEffectiveMonth(Optional.ofNullable(policyManager.getEffectiveMonth())
.orElseGet(() -> resolveEffectiveMonth(policyManager.getEffectiveStartTime())));
return;
}
policyManager.setPolicyStatus(policyStatus);
policyManager.setRelease(Boolean.FALSE);
policyManager.setHistoryRelease(Boolean.TRUE.equals(policyManager.getHistoryRelease()));
}
private void deactivateActivePolicies(TeamPolicyManager policyManager, Timestamp now) {
Criteria criteria = samePolicyScopeCriteria(policyManager)
.and("release").is(Boolean.TRUE);
if (Objects.nonNull(policyManager.getId())) {
criteria.and("id").ne(policyManager.getId());
}
mongoTemplate.updateMulti(Query.query(criteria), new Update()
.set("release", Boolean.FALSE)
.set("historyRelease", Boolean.TRUE)
.set("policyStatus", TeamPolicyStatusEnum.HISTORY.name())
.set("updateTime", now),
TeamPolicyManager.class);
}
private Criteria samePolicyScopeCriteria(TeamPolicyManager policyManager) {
Criteria criteria = Criteria.where("region").is(policyManager.getRegion())
.and("sysOrigin").is(policyManager.getSysOrigin());
appendPolicyTypeCriteria(criteria, policyManager.getPolicyType());
appendCountryScopeCriteria(criteria, policyManager.getCountryCode());
return criteria;
}
private void appendPolicyTypeCriteria(Criteria criteria, String policyType) {
if (StringUtils.isNotBlank(policyType)
&& Objects.equals(policyType, TeamPolicyTypeEnum.SALARY_DIAMOND.name())) {
criteria.and("policyType").is(policyType);
return;
}
criteria.and("policyType").ne(TeamPolicyTypeEnum.SALARY_DIAMOND.name());
}
private void appendCountryScopeCriteria(Criteria criteria, String countryCode) {
if (StringUtils.isNotBlank(countryCode)) {
criteria.and("countryCode").in(countryCodeAliasSupport.getMatchCodes(countryCode));
return;
}
criteria.orOperator(
Criteria.where("countryCode").exists(false),
Criteria.where("countryCode").is(null),
Criteria.where("countryCode").is(""));
}
private Timestamp nextMonthStartTime() {
LocalDate nextMonthFirstDay = LocalDate.now(RIYADH_ZONE).plusMonths(1).withDayOfMonth(1);
return Timestamp.from(nextMonthFirstDay.atStartOfDay(RIYADH_ZONE).toInstant());
}
private Integer resolveEffectiveMonth(Timestamp effectiveStartTime) {
if (Objects.isNull(effectiveStartTime)) {
return null;
}
return Integer.valueOf(effectiveStartTime.toInstant()
.atZone(RIYADH_ZONE)
.format(EFFECTIVE_MONTH_FORMATTER));
}
private Sort activePolicySort() {
return Sort.by(
Sort.Order.desc("effectiveStartTime"),
Sort.Order.desc("activatedTime"),
Sort.Order.desc("createTime"));
}
}

View File

@ -1,14 +1,15 @@
package com.red.circle.other.app.inner.service.team.impl;
import com.red.circle.framework.core.asserts.ResponseAssert;
import com.red.circle.framework.core.response.CommonErrorCode;
import com.red.circle.other.infra.convertor.team.TeamInfraConvertor;
import com.red.circle.other.infra.database.mongo.entity.team.team.TeamPolicyManager;
import com.red.circle.other.infra.database.mongo.service.team.team.TeamPolicyManagerService;
import com.red.circle.other.app.inner.service.team.TeamPolicyManagerClientService;
import com.red.circle.other.inner.model.cmd.team.TeamPolicyManagerCmd;
import com.red.circle.other.inner.model.dto.agency.agency.TeamPolicyManagerDTO;
import com.red.circle.tool.core.sequence.IdWorkerUtils;
import com.red.circle.framework.core.asserts.ResponseAssert;
import com.red.circle.framework.core.response.CommonErrorCode;
import com.red.circle.other.infra.convertor.team.TeamInfraConvertor;
import com.red.circle.other.infra.database.mongo.entity.team.team.TeamPolicyManager;
import com.red.circle.other.infra.database.mongo.service.team.team.TeamPolicyManagerService;
import com.red.circle.other.app.inner.service.team.TeamPolicyManagerClientService;
import com.red.circle.other.inner.enums.team.TeamPolicyStatusEnum;
import com.red.circle.other.inner.model.cmd.team.TeamPolicyManagerCmd;
import com.red.circle.other.inner.model.dto.agency.agency.TeamPolicyManagerDTO;
import com.red.circle.tool.core.sequence.IdWorkerUtils;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@ -68,14 +69,26 @@ public class TeamPolicyManagerClientServiceImpl implements TeamPolicyManagerClie
teamPolicyManagerService.listTeamPolicyAndTypePolicy(sysOrigin, region, policyType, countryCode));
}
@Override
public void add(TeamPolicyManagerCmd cmd) {
if (Objects.nonNull(cmd.getId())) {
teamPolicyManagerService.deleteById(cmd.getId());
}
cmd.setId(IdWorkerUtils.getId());
teamPolicyManagerService.add(teamAppConvertor.toTeamPolicyManager(cmd));
}
@Override
public void add(TeamPolicyManagerCmd cmd) {
if (Objects.nonNull(cmd.getId())) {
TeamPolicyManager existingPolicy = teamPolicyManagerService.getById(cmd.getId());
if (Objects.nonNull(existingPolicy) && shouldReplaceExistingPolicy(cmd, existingPolicy)) {
teamPolicyManagerService.deleteById(cmd.getId());
}
}
cmd.setId(IdWorkerUtils.getId());
teamPolicyManagerService.add(teamAppConvertor.toTeamPolicyManager(cmd));
}
private boolean shouldReplaceExistingPolicy(TeamPolicyManagerCmd cmd, TeamPolicyManager existingPolicy) {
if (!Objects.equals(cmd.getPolicyStatus(), TeamPolicyStatusEnum.SCHEDULED.name())) {
return true;
}
return Objects.equals(existingPolicy.getPolicyStatus(), TeamPolicyStatusEnum.SCHEDULED.name())
&& !Boolean.TRUE.equals(existingPolicy.getHistoryRelease())
&& !Boolean.TRUE.equals(existingPolicy.getRelease());
}
@Override