diff --git a/rc-service/rc-inner-api/other-inner/other-inner-api/src/main/java/com/red/circle/other/inner/endpoint/team/manager/TeamManagerClient.java b/rc-service/rc-inner-api/other-inner/other-inner-api/src/main/java/com/red/circle/other/inner/endpoint/team/manager/TeamManagerClient.java new file mode 100644 index 00000000..a9cf78d5 --- /dev/null +++ b/rc-service/rc-inner-api/other-inner/other-inner-api/src/main/java/com/red/circle/other/inner/endpoint/team/manager/TeamManagerClient.java @@ -0,0 +1,13 @@ +package com.red.circle.other.inner.endpoint.team.manager; + +import com.red.circle.other.inner.endpoint.team.manager.api.TeamManagerClientApi; +import org.springframework.cloud.openfeign.FeignClient; + +/** + * 团队经理. + */ +@FeignClient(name = "teamManagerClient", url = "${feign.other.url}" + + TeamManagerClientApi.API_PREFIX) +public interface TeamManagerClient extends TeamManagerClientApi { + +} diff --git a/rc-service/rc-inner-api/other-inner/other-inner-api/src/main/java/com/red/circle/other/inner/endpoint/team/manager/api/TeamManagerClientApi.java b/rc-service/rc-inner-api/other-inner/other-inner-api/src/main/java/com/red/circle/other/inner/endpoint/team/manager/api/TeamManagerClientApi.java new file mode 100644 index 00000000..4c6e7877 --- /dev/null +++ b/rc-service/rc-inner-api/other-inner/other-inner-api/src/main/java/com/red/circle/other/inner/endpoint/team/manager/api/TeamManagerClientApi.java @@ -0,0 +1,47 @@ +package com.red.circle.other.inner.endpoint.team.manager.api; + +import com.red.circle.framework.dto.PageResult; +import com.red.circle.framework.dto.ResultResponse; +import com.red.circle.other.inner.model.cmd.team.manager.TeamManagerAddCmd; +import com.red.circle.other.inner.model.cmd.team.manager.TeamManagerOpsPageQryCmd; +import com.red.circle.other.inner.model.dto.agency.manager.TeamManagerDTO; +import java.util.Map; +import java.util.Set; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * 团队经理. + */ +public interface TeamManagerClientApi { + + String API_PREFIX = "/team/manager/client"; + + @GetMapping("/getById") + ResultResponse getById(@RequestParam("id") Long id); + + @GetMapping("/getByUserId") + ResultResponse getByUserId(@RequestParam("userId") Long userId); + + @PostMapping("/add") + ResultResponse add(@RequestBody @Validated TeamManagerAddCmd cmd); + + @GetMapping("/check") + ResultResponse check(@RequestParam("userId") Long userId); + + @PostMapping("/mapCheck") + ResultResponse> mapCheck(@RequestBody Set userIds); + + @PostMapping("/pageOps") + ResultResponse> pageOps(@RequestBody TeamManagerOpsPageQryCmd qryCmd); + + @PostMapping("/updateSelectiveById") + ResultResponse updateSelectiveById(@RequestBody @Validated TeamManagerDTO dto); + + @GetMapping("/deleteById") + ResultResponse deleteById(@RequestParam("id") Long id); + +} diff --git a/rc-service/rc-inner-api/other-inner/other-inner-api/src/main/java/com/red/circle/other/inner/endpoint/team/target/api/UserHistoryIdentityClientApi.java b/rc-service/rc-inner-api/other-inner/other-inner-api/src/main/java/com/red/circle/other/inner/endpoint/team/target/api/UserHistoryIdentityClientApi.java index 833c184d..51575954 100644 --- a/rc-service/rc-inner-api/other-inner/other-inner-api/src/main/java/com/red/circle/other/inner/endpoint/team/target/api/UserHistoryIdentityClientApi.java +++ b/rc-service/rc-inner-api/other-inner/other-inner-api/src/main/java/com/red/circle/other/inner/endpoint/team/target/api/UserHistoryIdentityClientApi.java @@ -32,6 +32,9 @@ public interface UserHistoryIdentityClientApi { @GetMapping("/saveHost") ResultResponse saveHost(@RequestParam("userId") Long userId); - @GetMapping("/saveBd") - ResultResponse saveBd(@RequestParam("userId") Long userId); -} + @GetMapping("/saveBd") + ResultResponse saveBd(@RequestParam("userId") Long userId); + + @GetMapping("/saveManager") + ResultResponse saveManager(@RequestParam("userId") Long userId); +} diff --git a/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/enums/team/TeamUserIdentity.java b/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/enums/team/TeamUserIdentity.java index 5cefd812..e959299c 100644 --- a/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/enums/team/TeamUserIdentity.java +++ b/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/enums/team/TeamUserIdentity.java @@ -5,10 +5,14 @@ package com.red.circle.other.inner.enums.team; * * @author pengshigang on 2021/7/17 */ -public enum TeamUserIdentity { - /** - * 代理 - */ +public enum TeamUserIdentity { + /** + * 经理 + */ + MANAGER, + /** + * 代理 + */ AGENT, /** * 主播 diff --git a/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/model/cmd/team/manager/TeamManagerAddCmd.java b/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/model/cmd/team/manager/TeamManagerAddCmd.java new file mode 100644 index 00000000..adca4a1f --- /dev/null +++ b/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/model/cmd/team/manager/TeamManagerAddCmd.java @@ -0,0 +1,35 @@ +package com.red.circle.other.inner.model.cmd.team.manager; + +import com.red.circle.framework.dto.Command; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 添加团队经理. + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class TeamManagerAddCmd extends Command { + + @NotNull(message = "id required.") + private Long id; + + @NotBlank(message = "sysOrigin required.") + private String sysOrigin; + + @NotNull(message = "userId required.") + private Long userId; + + private String contact; + + @NotBlank(message = "regionId required.") + private String regionId; + + @NotNull(message = "createUser required.") + private Long createUser; + +} diff --git a/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/model/cmd/team/manager/TeamManagerOpsPageQryCmd.java b/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/model/cmd/team/manager/TeamManagerOpsPageQryCmd.java new file mode 100644 index 00000000..f01489ea --- /dev/null +++ b/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/model/cmd/team/manager/TeamManagerOpsPageQryCmd.java @@ -0,0 +1,26 @@ +package com.red.circle.other.inner.model.cmd.team.manager; + +import com.red.circle.framework.core.dto.PageCommand; +import java.io.Serial; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 运营后台团队经理查询. + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class TeamManagerOpsPageQryCmd extends PageCommand { + + @Serial + private static final long serialVersionUID = 1L; + + private Long userId; + + private String sysOrigin; + + private Long createUser; + +} diff --git a/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/model/dto/agency/agency/UserHistoryIdentityDTO.java b/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/model/dto/agency/agency/UserHistoryIdentityDTO.java index 1dd85b44..cc30aaa0 100644 --- a/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/model/dto/agency/agency/UserHistoryIdentityDTO.java +++ b/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/model/dto/agency/agency/UserHistoryIdentityDTO.java @@ -34,9 +34,14 @@ public class UserHistoryIdentityDTO implements Serializable { */ private Boolean agent; - /** - * 是否做过主播. - */ - private Boolean host; - -} + /** + * 是否做过主播. + */ + private Boolean host; + + /** + * 是否做过团队经理. + */ + private Boolean manager; + +} diff --git a/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/model/dto/agency/manager/TeamManagerDTO.java b/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/model/dto/agency/manager/TeamManagerDTO.java new file mode 100644 index 00000000..c2473f8a --- /dev/null +++ b/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/model/dto/agency/manager/TeamManagerDTO.java @@ -0,0 +1,43 @@ +package com.red.circle.other.inner.model.dto.agency.manager; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.red.circle.framework.dto.DTO; +import java.io.Serial; +import java.sql.Timestamp; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 团队经理. + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +public class TeamManagerDTO extends DTO { + + @Serial + private static final long serialVersionUID = 1L; + + @JsonSerialize(using = ToStringSerializer.class) + private Long id; + + private String sysOrigin; + + @JsonSerialize(using = ToStringSerializer.class) + private Long userId; + + private String contact; + + private String regionId; + + private Timestamp createTime; + + private Timestamp updateTime; + + private Long createUser; + + private Long updateUser; + +} diff --git a/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/model/dto/live/RoomProfileDTO.java b/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/model/dto/live/RoomProfileDTO.java index a230b10a..607e96ea 100644 --- a/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/model/dto/live/RoomProfileDTO.java +++ b/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/model/dto/live/RoomProfileDTO.java @@ -43,14 +43,19 @@ public class RoomProfileDTO implements Serializable { @JsonSerialize(using = ToStringSerializer.class) private Long userId; - /** - * 封面. - */ - private String roomCover; - - /** - * 名称. - */ + /** + * 封面. + */ + private String roomCover; + + /** + * 背景图. + */ + private String roomBackground; + + /** + * 名称. + */ private String roomName; /** diff --git a/rc-service/rc-service-console/console-adapter/src/main/java/com/red/circle/console/adapter/app/team/manager/TeamManagerRestController.java b/rc-service/rc-service-console/console-adapter/src/main/java/com/red/circle/console/adapter/app/team/manager/TeamManagerRestController.java new file mode 100644 index 00000000..c1263387 --- /dev/null +++ b/rc-service/rc-service-console/console-adapter/src/main/java/com/red/circle/console/adapter/app/team/manager/TeamManagerRestController.java @@ -0,0 +1,54 @@ +package com.red.circle.console.adapter.app.team.manager; + +import com.red.circle.console.app.dto.clienobject.team.manager.TeamManagerCO; +import com.red.circle.console.app.dto.cmd.app.team.manager.TeamManagerAddCmd; +import com.red.circle.console.app.dto.cmd.app.team.manager.TeamManagerUpdateCmd; +import com.red.circle.console.app.service.app.team.manager.TeamManagerService; +import com.red.circle.console.infra.annotations.OpsOperationReqLog; +import com.red.circle.framework.dto.PageResult; +import com.red.circle.framework.web.controller.BaseController; +import com.red.circle.other.inner.model.cmd.team.manager.TeamManagerOpsPageQryCmd; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 团队经理前端控制器. + */ +@RestController("teamOpsManagerRestController") +@RequiredArgsConstructor +@RequestMapping("/team/manager") +public class TeamManagerRestController extends BaseController { + + private final TeamManagerService teamManagerService; + + @GetMapping("/page") + public PageResult pageOps(TeamManagerOpsPageQryCmd qryCmd) { + return teamManagerService.pageOps(qryCmd); + } + + @OpsOperationReqLog("添加团队经理") + @PostMapping("/add") + public void add(@RequestBody @Validated TeamManagerAddCmd cmd) { + cmd.setCreateUser(getReqUserId()); + teamManagerService.add(cmd); + } + + @OpsOperationReqLog("编辑团队经理") + @PostMapping("/update") + public void update(@RequestBody @Validated TeamManagerUpdateCmd cmd) { + cmd.setUpdateUser(getReqUserId()); + teamManagerService.update(cmd); + } + + @OpsOperationReqLog("删除团队经理") + @GetMapping("/del") + public void deleteById(Long id) { + teamManagerService.delete(id, getReqUserId()); + } + +} diff --git a/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/team/manager/TeamManagerServiceImpl.java b/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/team/manager/TeamManagerServiceImpl.java new file mode 100644 index 00000000..834b3f3d --- /dev/null +++ b/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/team/manager/TeamManagerServiceImpl.java @@ -0,0 +1,133 @@ +package com.red.circle.console.app.service.app.team.manager; + +import com.red.circle.console.app.dto.clienobject.team.manager.TeamManagerCO; +import com.red.circle.console.app.dto.cmd.app.team.manager.TeamManagerAddCmd; +import com.red.circle.console.app.dto.cmd.app.team.manager.TeamManagerUpdateCmd; +import com.red.circle.console.infra.database.rds.entity.admin.User; +import com.red.circle.console.infra.database.rds.service.admin.UserService; +import com.red.circle.console.inner.error.ConsoleErrorCode; +import com.red.circle.framework.core.asserts.ResponseAssert; +import com.red.circle.framework.core.response.CommonErrorCode; +import com.red.circle.framework.dto.PageResult; +import com.red.circle.other.inner.endpoint.team.manager.TeamManagerClient; +import com.red.circle.other.inner.endpoint.team.target.UserHistoryIdentityClient; +import com.red.circle.other.inner.endpoint.user.region.RegionConfigClient; +import com.red.circle.other.inner.endpoint.user.user.UserProfileClient; +import com.red.circle.other.inner.model.cmd.team.manager.TeamManagerOpsPageQryCmd; +import com.red.circle.other.inner.model.dto.agency.manager.TeamManagerDTO; +import com.red.circle.other.inner.model.dto.user.UserProfileDTO; +import com.red.circle.tool.core.sequence.IdWorkerUtils; +import com.red.circle.tool.core.text.StringUtils; +import java.util.Collection; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + * 团队经理管理实现. + */ +@Service +@RequiredArgsConstructor +public class TeamManagerServiceImpl implements TeamManagerService { + + private final UserService userService; + private final TeamManagerClient teamManagerClient; + private final UserProfileClient userProfileClient; + private final RegionConfigClient regionConfigClient; + private final UserHistoryIdentityClient userHistoryIdentityClient; + + @Override + public PageResult pageOps(TeamManagerOpsPageQryCmd qryCmd) { + PageResult pageResult = ResponseAssert.requiredSuccess( + teamManagerClient.pageOps(qryCmd)); + + if (pageResult.checkRecordsEmpty()) { + return pageResult.emptyRecords(); + } + + Map sysUserMap = userService.mapBackUser( + Stream.of(pageResult.getRecords().stream() + .filter(info -> Objects.nonNull(info.getCreateUser()) + && info.getCreateUser() > 0) + .map(TeamManagerDTO::getCreateUser) + .collect(Collectors.toSet()), + pageResult.getRecords().stream() + .filter(info -> Objects.nonNull(info.getUpdateUser()) + && info.getUpdateUser() > 0) + .map(TeamManagerDTO::getUpdateUser) + .collect(Collectors.toSet())) + .flatMap(Collection::stream) + .collect(Collectors.toSet())); + + Map userProfileMap = ResponseAssert.requiredSuccess( + userProfileClient.mapByUserIds(pageResult.getRecords().stream() + .map(TeamManagerDTO::getUserId) + .collect(Collectors.toSet()))); + + Map regionNameMap = ResponseAssert.requiredSuccess( + regionConfigClient.mapRegionNameByRegionIds( + pageResult.getRecords().stream() + .map(TeamManagerDTO::getRegionId) + .filter(StringUtils::isNotBlank) + .collect(Collectors.toSet()))); + + return pageResult.convert(info -> new TeamManagerCO() + .setId(info.getId()) + .setSysOrigin(info.getSysOrigin()) + .setUserProfile(userProfileMap.get(info.getUserId())) + .setContact(info.getContact()) + .setCreateUserName( + Optional.ofNullable(sysUserMap.get(info.getCreateUser())).map(User::getNickname) + .orElse("")) + .setUpdateUserName( + Optional.ofNullable(sysUserMap.get(info.getUpdateUser())).map(User::getNickname) + .orElse("")) + .setRegionId(info.getRegionId()) + .setRegionName(regionNameMap.get(info.getRegionId())) + .setCreateTime(info.getCreateTime()) + .setUpdateTime(info.getUpdateTime())); + } + + @Override + public void add(com.red.circle.console.app.dto.cmd.app.team.manager.TeamManagerAddCmd cmd) { + UserProfileDTO userProfile = ResponseAssert.requiredSuccess( + userProfileClient.getByUserId(cmd.getUserId())); + ResponseAssert.notNull(ConsoleErrorCode.USER_INFO_NOT_FOUND, userProfile); + + ResponseAssert.isFalse(ConsoleErrorCode.USER_ALREADY_EXISTS, + ResponseAssert.requiredSuccess(teamManagerClient.check(cmd.getUserId()))); + + com.red.circle.other.inner.model.cmd.team.manager.TeamManagerAddCmd addCmd = + new com.red.circle.other.inner.model.cmd.team.manager.TeamManagerAddCmd() + .setId(IdWorkerUtils.getId()) + .setUserId(cmd.getUserId()) + .setSysOrigin(cmd.getSysOrigin()) + .setContact(cmd.getContact()) + .setRegionId(cmd.getRegionId()) + .setCreateUser(cmd.getCreateUser()); + + ResponseAssert.requiredSuccess(teamManagerClient.add(addCmd)); + ResponseAssert.requiredSuccess(userHistoryIdentityClient.saveManager(cmd.getUserId())); + } + + @Override + public void update(TeamManagerUpdateCmd cmd) { + ResponseAssert.requiredSuccess(teamManagerClient.updateSelectiveById(new TeamManagerDTO() + .setId(cmd.getId()) + .setContact(cmd.getContact()) + .setRegionId(cmd.getRegionId()) + .setUpdateUser(cmd.getUpdateUser()))); + } + + @Override + public void delete(Long id, Long updateUser) { + TeamManagerDTO db = ResponseAssert.requiredSuccess(teamManagerClient.getById(id)); + ResponseAssert.notNull(CommonErrorCode.DATA_ERROR, db); + ResponseAssert.requiredSuccess(teamManagerClient.deleteById(id)); + } + +} diff --git a/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/user/UserBaseInfoServiceImpl.java b/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/user/UserBaseInfoServiceImpl.java index 4a111a2e..1e5483c7 100644 --- a/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/user/UserBaseInfoServiceImpl.java +++ b/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/user/UserBaseInfoServiceImpl.java @@ -23,9 +23,10 @@ import com.red.circle.other.inner.endpoint.material.props.PropsBackpackClient; import com.red.circle.other.inner.endpoint.material.props.PropsNobleVipClient; import com.red.circle.other.inner.endpoint.sys.SysCountryCodeClient; import com.red.circle.other.inner.endpoint.sys.SysImAccountClient; -import com.red.circle.other.inner.endpoint.team.bd.BdTeamInfoClient; -import com.red.circle.other.inner.endpoint.team.bd.BdTeamLeaderClient; -import com.red.circle.other.inner.endpoint.team.target.TeamProfileClient; +import com.red.circle.other.inner.endpoint.team.bd.BdTeamInfoClient; +import com.red.circle.other.inner.endpoint.team.bd.BdTeamLeaderClient; +import com.red.circle.other.inner.endpoint.team.manager.TeamManagerClient; +import com.red.circle.other.inner.endpoint.team.target.TeamProfileClient; import com.red.circle.other.inner.endpoint.team.target.UserHistoryIdentityClient; import com.red.circle.other.inner.endpoint.user.device.RegisterDeviceClient; import com.red.circle.other.inner.endpoint.user.region.UserRegionClient; @@ -91,8 +92,9 @@ public class UserBaseInfoServiceImpl implements private final TeamProfileClient teamProfileClient; private final UserProfileClient userProfileClient; private final FreightGoldClient freightGoldClient; - private final BdTeamLeaderClient bdTeamLeaderClient; - private final SysCountryCodeClient countryCodeClient; + private final BdTeamLeaderClient bdTeamLeaderClient; + private final TeamManagerClient teamManagerClient; + private final SysCountryCodeClient countryCodeClient; private final PropsBackpackClient propsBackpackClient; private final PropsNobleVipClient propsNobleVipClient; private final WalletDiamondClient walletDiamondClient; @@ -283,9 +285,10 @@ public class UserBaseInfoServiceImpl implements return new UserIdentityCO() .setAgent(Objects.nonNull(teamMember) && TeamMemberRole.OWN.eq(teamMember.getRole())) .setAnchor(Objects.nonNull(teamMember)) - .setBd(ResponseAssert.requiredSuccess(bdTeamInfoClient.check(userId))) - .setBdLeader(ResponseAssert.requiredSuccess(bdTeamLeaderClient.check(userId))) - .setFreightAgent( + .setBd(ResponseAssert.requiredSuccess(bdTeamInfoClient.check(userId))) + .setBdLeader(ResponseAssert.requiredSuccess(bdTeamLeaderClient.check(userId))) + .setManager(ResponseAssert.requiredSuccess(teamManagerClient.check(userId))) + .setFreightAgent( ResponseAssert.requiredSuccess(freightGoldClient.checkFreightAgent(userId))) .setHistoryIdentity( ResponseAssert.requiredSuccess(historyIdentityClient.getLabels(userId))); diff --git a/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/dto/clienobject/team/manager/TeamManagerCO.java b/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/dto/clienobject/team/manager/TeamManagerCO.java new file mode 100644 index 00000000..fd16a4cd --- /dev/null +++ b/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/dto/clienobject/team/manager/TeamManagerCO.java @@ -0,0 +1,45 @@ +package com.red.circle.console.app.dto.clienobject.team.manager; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.red.circle.framework.dto.ClientObject; +import com.red.circle.other.inner.model.dto.user.UserProfileDTO; +import java.io.Serial; +import java.sql.Timestamp; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 团队经理. + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class TeamManagerCO extends ClientObject { + + @Serial + private static final long serialVersionUID = 1L; + + @JsonSerialize(using = ToStringSerializer.class) + private Long id; + + private String sysOrigin; + + private UserProfileDTO userProfile; + + private String contact; + + private String createUserName; + + private String updateUserName; + + private String regionId; + + private String regionName; + + private Timestamp createTime; + + private Timestamp updateTime; + +} diff --git a/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/dto/clienobject/user/UserIdentityCO.java b/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/dto/clienobject/user/UserIdentityCO.java index 31defdd5..5fb47771 100644 --- a/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/dto/clienobject/user/UserIdentityCO.java +++ b/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/dto/clienobject/user/UserIdentityCO.java @@ -31,13 +31,18 @@ public class UserIdentityCO implements Serializable { */ private Boolean bd; - /** - * true:bd Leader,false:不是. - */ - private Boolean bdLeader; - - /** - * 货运代理: true:是 false:不是. + /** + * true:bd Leader,false:不是. + */ + private Boolean bdLeader; + + /** + * true:团队经理,false:不是. + */ + private Boolean manager; + + /** + * 货运代理: true:是 false:不是. */ private Boolean freightAgent; diff --git a/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/dto/cmd/app/team/manager/TeamManagerAddCmd.java b/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/dto/cmd/app/team/manager/TeamManagerAddCmd.java new file mode 100644 index 00000000..3c453e1f --- /dev/null +++ b/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/dto/cmd/app/team/manager/TeamManagerAddCmd.java @@ -0,0 +1,34 @@ +package com.red.circle.console.app.dto.cmd.app.team.manager; + +import com.red.circle.framework.dto.Command; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import java.io.Serial; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 添加团队经理. + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class TeamManagerAddCmd extends Command { + + @Serial + private static final long serialVersionUID = 1L; + + @NotNull(message = "userId required.") + private Long userId; + + private String sysOrigin; + + private String contact; + + private Long createUser; + + @NotBlank(message = "regionId required.") + private String regionId; + +} diff --git a/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/dto/cmd/app/team/manager/TeamManagerUpdateCmd.java b/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/dto/cmd/app/team/manager/TeamManagerUpdateCmd.java new file mode 100644 index 00000000..06e51780 --- /dev/null +++ b/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/dto/cmd/app/team/manager/TeamManagerUpdateCmd.java @@ -0,0 +1,32 @@ +package com.red.circle.console.app.dto.cmd.app.team.manager; + +import com.red.circle.framework.dto.Command; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import java.io.Serial; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 修改团队经理. + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class TeamManagerUpdateCmd extends Command { + + @Serial + private static final long serialVersionUID = 1L; + + @NotNull(message = "id required.") + private Long id; + + private String contact; + + private Long updateUser; + + @NotBlank(message = "regionId required.") + private String regionId; + +} diff --git a/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/service/app/team/manager/TeamManagerService.java b/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/service/app/team/manager/TeamManagerService.java new file mode 100644 index 00000000..1e9bfc57 --- /dev/null +++ b/rc-service/rc-service-console/console-client/src/main/java/com/red/circle/console/app/service/app/team/manager/TeamManagerService.java @@ -0,0 +1,22 @@ +package com.red.circle.console.app.service.app.team.manager; + +import com.red.circle.console.app.dto.clienobject.team.manager.TeamManagerCO; +import com.red.circle.console.app.dto.cmd.app.team.manager.TeamManagerAddCmd; +import com.red.circle.console.app.dto.cmd.app.team.manager.TeamManagerUpdateCmd; +import com.red.circle.framework.dto.PageResult; +import com.red.circle.other.inner.model.cmd.team.manager.TeamManagerOpsPageQryCmd; + +/** + * 团队经理管理. + */ +public interface TeamManagerService { + + PageResult pageOps(TeamManagerOpsPageQryCmd qryCmd); + + void add(TeamManagerAddCmd cmd); + + void update(TeamManagerUpdateCmd cmd); + + void delete(Long id, Long updateUser); + +} diff --git a/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/room/RoomProfileRestController.java b/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/room/RoomProfileRestController.java index 21f1a82b..75c55e2c 100644 --- a/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/room/RoomProfileRestController.java +++ b/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/room/RoomProfileRestController.java @@ -3,10 +3,11 @@ package com.red.circle.other.adapter.app.room; import com.red.circle.common.business.dto.cmd.AppExtCommand; import com.red.circle.common.business.dto.cmd.app.AppRoomIdCmd; import com.red.circle.common.business.dto.cmd.app.AppUserIdCmd; -import com.red.circle.framework.web.controller.BaseController; -import com.red.circle.other.app.dto.cmd.room.UpdateRoomCmdData; -import com.red.circle.other.app.service.room.RoomProfileService; -import com.red.circle.other.inner.model.dto.live.RoomProfileDTO; +import com.red.circle.framework.web.controller.BaseController; +import com.red.circle.other.app.dto.cmd.room.UpdateRoomBackgroundCmd; +import com.red.circle.other.app.dto.cmd.room.UpdateRoomCmdData; +import com.red.circle.other.app.service.room.RoomProfileService; +import com.red.circle.other.inner.model.dto.live.RoomProfileDTO; import com.red.circle.other.inner.model.dto.live.RoomProfileManagerDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -82,8 +83,21 @@ public class RoomProfileRestController extends BaseController { * @eo.request-type json */ @PutMapping - public RoomProfileDTO updateProfileV2(@RequestBody @Validated UpdateRoomCmdData cmd) { - return roomProfileService.updateProfile(cmd); - } - -} + public RoomProfileDTO updateProfileV2(@RequestBody @Validated UpdateRoomCmdData cmd) { + return roomProfileService.updateProfile(cmd); + } + + /** + * 修改房间背景图. + * + * @eo.name 修改房间背景图. + * @eo.url /background + * @eo.method put + * @eo.request-type json + */ + @PutMapping("/background") + public RoomProfileManagerDTO updateBackground(@RequestBody @Validated UpdateRoomBackgroundCmd cmd) { + return roomProfileService.updateBackground(cmd); + } + +} diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/room/UpdateRoomBackgroundCmdExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/room/UpdateRoomBackgroundCmdExe.java new file mode 100644 index 00000000..268123e5 --- /dev/null +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/room/UpdateRoomBackgroundCmdExe.java @@ -0,0 +1,72 @@ +package com.red.circle.other.app.command.room; + +import com.red.circle.common.business.core.ImageSizeConst; +import com.red.circle.external.inner.endpoint.oss.OssServiceClient; +import com.red.circle.framework.core.asserts.ResponseAssert; +import com.red.circle.framework.core.response.CommonErrorCode; +import com.red.circle.other.app.convertor.live.RoomProfileAppConvertor; +import com.red.circle.other.app.dto.cmd.room.UpdateRoomBackgroundCmd; +import com.red.circle.other.infra.database.mongo.entity.live.RoomProfile; +import com.red.circle.other.infra.database.mongo.entity.sys.ApiOperationLog; +import com.red.circle.other.infra.database.mongo.service.live.RoomProfileManagerService; +import com.red.circle.other.infra.database.mongo.service.sys.ApiOperationLogService; +import com.red.circle.other.inner.asserts.RoomErrorCode; +import com.red.circle.other.inner.model.dto.live.RoomProfileManagerDTO; +import com.red.circle.tool.core.date.DateUtils; +import com.red.circle.tool.core.json.JacksonUtils; +import com.red.circle.tool.core.sequence.IdWorkerUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +/** + * 修改房间背景图. + */ +@Component +@RequiredArgsConstructor +public class UpdateRoomBackgroundCmdExe { + + private final OssServiceClient ossServiceClient; + private final ApiOperationLogService apiOperationLogService; + private final RoomProfileAppConvertor roomProfileAppConvertor; + private final RoomProfileManagerService roomProfileManagerService; + + public RoomProfileManagerDTO execute(UpdateRoomBackgroundCmd cmd) { + Long reqUserId = cmd.requiredReqUserId(); + + apiOperationLogService.add( + new ApiOperationLog() + .setId(IdWorkerUtils.getIdStr()) + .setRequestUserId(reqUserId) + .setApiDesc("房间背景图变更") + .setBusinessCode("ROOM_BACKGROUND_UPDATE") + .setBusinessContent(String.valueOf(cmd.getRoomId())) + .setCmd(JacksonUtils.toJson(cmd)) + .setExpiredTime(DateUtils.nowPlusDays(7)) + .setCreateTime(DateUtils.now()) + ); + + RoomProfile roomProfile = roomProfileManagerService.getProfileById(cmd.getRoomId()); + ResponseAssert.notNull(RoomErrorCode.ROOM_NOT_EXISTS, roomProfile); + ResponseAssert.isTrue(CommonErrorCode.INSUFFICIENT_PERMISSION, + cmd.reqIsSelf(roomProfile.getUserId())); + + String roomBackground = ossServiceClient.processImgSaveAsCompressZoom( + cmd.getRoomBackground(), + ImageSizeConst.COVER_HEIGHT + ).getBody(); + + RoomProfile updateRoomProfile = new RoomProfile(); + updateRoomProfile.setId(cmd.getRoomId()); + updateRoomProfile.setUserId(roomProfile.getUserId()); + updateRoomProfile.setSysOrigin(cmd.requireReqSysOrigin()); + updateRoomProfile.setRoomBackground(roomBackground); + + ResponseAssert.isTrue(CommonErrorCode.UPDATE_FAILURE, + roomProfileManagerService.updateSelectiveProfile(updateRoomProfile)); + + return roomProfileAppConvertor.toRoomProfileManagerDTO( + roomProfileManagerService.getById(cmd.getRoomId()) + ); + } + +} diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/room/UpdateRoomProfileCmdExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/room/UpdateRoomProfileCmdExe.java index ff7de9e1..e1d75e00 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/room/UpdateRoomProfileCmdExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/room/UpdateRoomProfileCmdExe.java @@ -70,13 +70,18 @@ public class UpdateRoomProfileCmdExe { } cmd.setRoomName(KeywordConstant.filter(cmd.getRoomName())); cmd.setRoomDesc(KeywordConstant.filter(cmd.getRoomDesc())); - if (StringUtils.isNotBlank(cmd.getRoomCover())) { - cmd.setRoomCover(ossServiceClient.processImgSaveAsCompressZoom(cmd.getRoomCover(), - ImageSizeConst.COVER_HEIGHT).getBody() - ); - } - - RoomProfile updateRoomProfile = roomProfileAppConvertor.toRoomProfile(cmd); + if (StringUtils.isNotBlank(cmd.getRoomCover())) { + cmd.setRoomCover(ossServiceClient.processImgSaveAsCompressZoom(cmd.getRoomCover(), + ImageSizeConst.COVER_HEIGHT).getBody() + ); + } + if (StringUtils.isNotBlank(cmd.getRoomBackground())) { + cmd.setRoomBackground(ossServiceClient.processImgSaveAsCompressZoom(cmd.getRoomBackground(), + ImageSizeConst.COVER_HEIGHT).getBody() + ); + } + + RoomProfile updateRoomProfile = roomProfileAppConvertor.toRoomProfile(cmd); updateRoomProfile.setUserId(roomProfile.getUserId()); updateRoomProfile.setSysOrigin(cmd.requireReqSysOrigin()); roomProfileManagerService.updateSelectiveProfile(updateRoomProfile); diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/team/query/TeamUserIdentityQryExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/team/query/TeamUserIdentityQryExe.java index b58e3a46..6088dde3 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/team/query/TeamUserIdentityQryExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/team/query/TeamUserIdentityQryExe.java @@ -4,6 +4,7 @@ import com.red.circle.common.business.dto.cmd.app.AppUserIdCmd; import com.red.circle.other.infra.database.mongo.entity.team.team.TeamMember; import com.red.circle.other.infra.database.mongo.service.team.team.TeamMemberService; import com.red.circle.other.infra.database.mongo.service.team.team.TeamProfileService; +import com.red.circle.other.infra.database.rds.service.team.TeamManagerInfoService; import com.red.circle.other.inner.enums.team.TeamMemberRole; import com.red.circle.other.inner.enums.team.TeamUserIdentity; import java.util.Objects; @@ -21,8 +22,13 @@ public class TeamUserIdentityQryExe { private final TeamMemberService teamMemberService; private final TeamProfileService teamProfileService; + private final TeamManagerInfoService teamManagerInfoService; public TeamUserIdentity execute(AppUserIdCmd cmd) { + if (teamManagerInfoService.checkManager(cmd.getUserId())) { + return TeamUserIdentity.MANAGER; + } + TeamMember teamMember = teamMemberService.getByMemberId(cmd.getUserId()); if (Objects.isNull(teamMember) diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/room/RoomProfileServiceImpl.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/room/RoomProfileServiceImpl.java index 16106a63..68ba1227 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/room/RoomProfileServiceImpl.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/room/RoomProfileServiceImpl.java @@ -1,15 +1,17 @@ package com.red.circle.other.app.service.room; -import com.red.circle.common.business.dto.cmd.AppExtCommand; -import com.red.circle.common.business.dto.cmd.app.AppRoomIdCmd; -import com.red.circle.common.business.dto.cmd.app.AppUserIdCmd; -import com.red.circle.other.app.command.room.UpdateRoomProfileCmdExe; -import com.red.circle.other.app.command.room.query.RoomProfileByIdQryExe; -import com.red.circle.other.app.command.room.query.RoomProfileByUserIdQryExe; -import com.red.circle.other.app.command.room.query.RoomVoiceProfileByUserIdQryExe; -import com.red.circle.other.app.dto.cmd.room.UpdateRoomCmdData; -import com.red.circle.other.inner.model.dto.live.RoomProfileDTO; -import com.red.circle.other.inner.model.dto.live.RoomProfileManagerDTO; +import com.red.circle.common.business.dto.cmd.AppExtCommand; +import com.red.circle.common.business.dto.cmd.app.AppRoomIdCmd; +import com.red.circle.common.business.dto.cmd.app.AppUserIdCmd; +import com.red.circle.other.app.command.room.UpdateRoomBackgroundCmdExe; +import com.red.circle.other.app.command.room.UpdateRoomProfileCmdExe; +import com.red.circle.other.app.command.room.query.RoomProfileByIdQryExe; +import com.red.circle.other.app.command.room.query.RoomProfileByUserIdQryExe; +import com.red.circle.other.app.command.room.query.RoomVoiceProfileByUserIdQryExe; +import com.red.circle.other.app.dto.cmd.room.UpdateRoomBackgroundCmd; +import com.red.circle.other.app.dto.cmd.room.UpdateRoomCmdData; +import com.red.circle.other.inner.model.dto.live.RoomProfileDTO; +import com.red.circle.other.inner.model.dto.live.RoomProfileManagerDTO; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -21,11 +23,12 @@ import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor public class RoomProfileServiceImpl implements RoomProfileService { - - private final RoomProfileByIdQryExe roomProfileByIdQryExe; - private final UpdateRoomProfileCmdExe updateRoomProfileCmdExe; - private final RoomProfileByUserIdQryExe roomProfileByUserIdQryExe; - private final RoomVoiceProfileByUserIdQryExe roomVoiceProfileByUserIdQryExe; + + private final RoomProfileByIdQryExe roomProfileByIdQryExe; + private final UpdateRoomProfileCmdExe updateRoomProfileCmdExe; + private final UpdateRoomBackgroundCmdExe updateRoomBackgroundCmdExe; + private final RoomProfileByUserIdQryExe roomProfileByUserIdQryExe; + private final RoomVoiceProfileByUserIdQryExe roomVoiceProfileByUserIdQryExe; @Override public RoomProfileManagerDTO getRoomProfile(AppExtCommand cmd) { @@ -43,8 +46,13 @@ public class RoomProfileServiceImpl implements RoomProfileService { } @Override - public RoomProfileDTO updateProfile(UpdateRoomCmdData cmd) { - return updateRoomProfileCmdExe.execute(cmd); - } - -} + public RoomProfileDTO updateProfile(UpdateRoomCmdData cmd) { + return updateRoomProfileCmdExe.execute(cmd); + } + + @Override + public RoomProfileManagerDTO updateBackground(UpdateRoomBackgroundCmd cmd) { + return updateRoomBackgroundCmdExe.execute(cmd); + } + +} diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/user/user/UserIdentityServiceImpl.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/user/user/UserIdentityServiceImpl.java index d2e22cd5..f774a4b9 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/user/user/UserIdentityServiceImpl.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/user/user/UserIdentityServiceImpl.java @@ -9,9 +9,10 @@ import com.red.circle.other.app.service.team.TeamBdService; import com.red.circle.other.infra.database.rds.entity.sys.Administrator; import com.red.circle.other.infra.database.rds.service.sys.AdministratorAuthService; import com.red.circle.other.infra.database.rds.service.sys.AdministratorService; -import com.red.circle.other.inner.endpoint.team.bd.BdTeamInfoClient; -import com.red.circle.other.inner.endpoint.team.bd.BdTeamLeaderClient; -import com.red.circle.other.inner.endpoint.team.target.TeamProfileClient; +import com.red.circle.other.inner.endpoint.team.bd.BdTeamInfoClient; +import com.red.circle.other.inner.endpoint.team.bd.BdTeamLeaderClient; +import com.red.circle.other.inner.endpoint.team.manager.TeamManagerClient; +import com.red.circle.other.inner.endpoint.team.target.TeamProfileClient; import com.red.circle.other.inner.enums.material.PropsCommodityType; import com.red.circle.other.inner.enums.sys.appmanager.RoomRolesEnum; import com.red.circle.other.inner.enums.team.TeamMemberRole; @@ -32,8 +33,9 @@ public class UserIdentityServiceImpl implements UserIdentityService { private final FreightGoldClient freightGoldClient; private final BdTeamInfoClient bdTeamInfoClient; private final AdministratorService administratorService; - private final AdministratorAuthService administratorAuthService; - private final BdTeamLeaderClient bdTeamLeaderClient; + private final AdministratorAuthService administratorAuthService; + private final BdTeamLeaderClient bdTeamLeaderClient; + private final TeamManagerClient teamManagerClient; @Override public UserIdentityVO getUserIdentity(Long userId) { @@ -46,21 +48,23 @@ public class UserIdentityServiceImpl implements UserIdentityService { boolean isSuperAdmin = isValidAdmin && Optional.of(administrator) .map(e -> RoomRolesEnum.MANAGER.eq(e.getRoles()) || RoomRolesEnum.SUPER_ADMIN.eq(e.getRoles())) .orElse(Boolean.FALSE); - boolean isManager = isValidAdmin && Optional.of(administrator) - .map(e -> RoomRolesEnum.MANAGER.eq(e.getRoles())) - .orElse(Boolean.FALSE); - - return new UserIdentityVO() - .setAgent(Objects.nonNull(teamMember) && TeamMemberRole.OWN.eq(teamMember.getRole())) - .setAnchor(Objects.nonNull(teamMember)) - .setBd(ResponseAssert.requiredSuccess(bdTeamInfoClient.check(userId))) + boolean isManager = isValidAdmin && Optional.of(administrator) + .map(e -> RoomRolesEnum.MANAGER.eq(e.getRoles())) + .orElse(Boolean.FALSE); + boolean isTeamManager = ResponseAssert.requiredSuccess(teamManagerClient.check(userId)); + + return new UserIdentityVO() + .setAgent(Objects.nonNull(teamMember) && TeamMemberRole.OWN.eq(teamMember.getRole())) + .setAnchor(Objects.nonNull(teamMember)) + .setBd(ResponseAssert.requiredSuccess(bdTeamInfoClient.check(userId))) .setFreightAgent(ResponseAssert.requiredSuccess(freightGoldClient.checkFreightAgent(userId))) - .setSuperFreightAgent(ResponseAssert.requiredSuccess(freightGoldClient.checkSuperFreightAgent(userId))) - .setSuperAdmin(isSuperAdmin) - .setAdmin(isValidAdmin) - .setBdLeader(ResponseAssert.requiredSuccess(bdTeamLeaderClient.check(userId))) - .setManager(isManager) - ; + .setSuperFreightAgent(ResponseAssert.requiredSuccess(freightGoldClient.checkSuperFreightAgent(userId))) + .setSuperAdmin(isSuperAdmin) + .setAdmin(isValidAdmin) + .setBdLeader(ResponseAssert.requiredSuccess(bdTeamLeaderClient.check(userId))) + .setManager(isTeamManager) + .setAppManager(isManager) + ; } @Override diff --git a/rc-service/rc-service-other/other-application/src/test/java/com/red/circle/other/app/command/room/UpdateRoomBackgroundCmdExeTest.java b/rc-service/rc-service-other/other-application/src/test/java/com/red/circle/other/app/command/room/UpdateRoomBackgroundCmdExeTest.java new file mode 100644 index 00000000..374d7b8d --- /dev/null +++ b/rc-service/rc-service-other/other-application/src/test/java/com/red/circle/other/app/command/room/UpdateRoomBackgroundCmdExeTest.java @@ -0,0 +1,74 @@ +package com.red.circle.other.app.command.room; + +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.red.circle.external.inner.endpoint.oss.OssServiceClient; +import com.red.circle.framework.core.dto.ReqSysOrigin; +import com.red.circle.framework.dto.ResultResponse; +import com.red.circle.other.app.convertor.live.RoomProfileAppConvertor; +import com.red.circle.other.app.dto.cmd.room.UpdateRoomBackgroundCmd; +import com.red.circle.other.infra.database.mongo.entity.live.RoomProfile; +import com.red.circle.other.infra.database.mongo.entity.live.RoomProfileManager; +import com.red.circle.other.infra.database.mongo.entity.sys.ApiOperationLog; +import com.red.circle.other.infra.database.mongo.service.live.RoomProfileManagerService; +import com.red.circle.other.infra.database.mongo.service.sys.ApiOperationLogService; +import com.red.circle.other.inner.model.dto.live.RoomProfileManagerDTO; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; + +class UpdateRoomBackgroundCmdExeTest { + + @Test + void execute_shouldUpdateBackgroundWhenRequesterIsRoomOwner() { + OssServiceClient ossServiceClient = mock(OssServiceClient.class); + ApiOperationLogService apiOperationLogService = mock(ApiOperationLogService.class); + RoomProfileAppConvertor roomProfileAppConvertor = mock(RoomProfileAppConvertor.class); + RoomProfileManagerService roomProfileManagerService = mock(RoomProfileManagerService.class); + UpdateRoomBackgroundCmdExe exe = new UpdateRoomBackgroundCmdExe( + ossServiceClient, + apiOperationLogService, + roomProfileAppConvertor, + roomProfileManagerService + ); + + UpdateRoomBackgroundCmd cmd = new UpdateRoomBackgroundCmd(); + cmd.setReqUserId(1001L); + cmd.setReqSysOrigin(ReqSysOrigin.of("LIKEI", "LIKEI")); + cmd.setRoomId(2002L); + cmd.setRoomBackground("source.png"); + + RoomProfile currentProfile = new RoomProfile(); + currentProfile.setId(2002L); + currentProfile.setUserId(1001L); + RoomProfileManager updatedProfile = new RoomProfileManager(); + updatedProfile.setId(2002L); + RoomProfileManagerDTO expected = new RoomProfileManagerDTO(); + + when(roomProfileManagerService.getProfileById(2002L)).thenReturn(currentProfile); + when(ossServiceClient.processImgSaveAsCompressZoom(eq("source.png"), eq(510))) + .thenReturn(ResultResponse.success("processed.png")); + when(roomProfileManagerService.updateSelectiveProfile(any(RoomProfile.class))).thenReturn(true); + when(roomProfileManagerService.getById(2002L)).thenReturn(updatedProfile); + when(roomProfileAppConvertor.toRoomProfileManagerDTO(updatedProfile)).thenReturn(expected); + + RoomProfileManagerDTO result = exe.execute(cmd); + + assertSame(expected, result); + verify(apiOperationLogService).add(any(ApiOperationLog.class)); + + ArgumentCaptor updateCaptor = ArgumentCaptor.forClass(RoomProfile.class); + verify(roomProfileManagerService).updateSelectiveProfile(updateCaptor.capture()); + RoomProfile updateProfile = updateCaptor.getValue(); + assertEquals(2002L, updateProfile.getId()); + assertEquals(1001L, updateProfile.getUserId()); + assertEquals("LIKEI", updateProfile.getSysOrigin()); + assertEquals("processed.png", updateProfile.getRoomBackground()); + } + +} diff --git a/rc-service/rc-service-other/other-application/src/test/java/com/red/circle/other/app/command/team/query/TeamUserIdentityQryExeTest.java b/rc-service/rc-service-other/other-application/src/test/java/com/red/circle/other/app/command/team/query/TeamUserIdentityQryExeTest.java index 1dcecc50..f6bd18c7 100644 --- a/rc-service/rc-service-other/other-application/src/test/java/com/red/circle/other/app/command/team/query/TeamUserIdentityQryExeTest.java +++ b/rc-service/rc-service-other/other-application/src/test/java/com/red/circle/other/app/command/team/query/TeamUserIdentityQryExeTest.java @@ -8,6 +8,7 @@ import com.red.circle.common.business.dto.cmd.app.AppUserIdCmd; import com.red.circle.other.infra.database.mongo.entity.team.team.TeamMember; import com.red.circle.other.infra.database.mongo.service.team.team.TeamMemberService; import com.red.circle.other.infra.database.mongo.service.team.team.TeamProfileService; +import com.red.circle.other.infra.database.rds.service.team.TeamManagerInfoService; import com.red.circle.other.inner.enums.team.TeamMemberRole; import com.red.circle.other.inner.enums.team.TeamUserIdentity; import org.junit.jupiter.api.Test; @@ -18,7 +19,9 @@ class TeamUserIdentityQryExeTest { void executeShouldReturnTouristWhenOwnerTeamIsClosed() { TeamMemberService teamMemberService = mock(TeamMemberService.class); TeamProfileService teamProfileService = mock(TeamProfileService.class); - TeamUserIdentityQryExe exe = new TeamUserIdentityQryExe(teamMemberService, teamProfileService); + TeamManagerInfoService teamManagerInfoService = mock(TeamManagerInfoService.class); + TeamUserIdentityQryExe exe = new TeamUserIdentityQryExe(teamMemberService, teamProfileService, + teamManagerInfoService); AppUserIdCmd cmd = new AppUserIdCmd(); cmd.setUserId(100L); @@ -28,6 +31,7 @@ class TeamUserIdentityQryExeTest { .setRole(TeamMemberRole.OWN); when(teamMemberService.getByMemberId(100L)).thenReturn(teamMember); + when(teamManagerInfoService.checkManager(100L)).thenReturn(false); when(teamProfileService.checkStatusAvailable(200L)).thenReturn(false); assertEquals(TeamUserIdentity.TOURIST, exe.execute(cmd)); @@ -37,7 +41,9 @@ class TeamUserIdentityQryExeTest { void executeShouldReturnAgentWhenOwnerTeamIsAvailable() { TeamMemberService teamMemberService = mock(TeamMemberService.class); TeamProfileService teamProfileService = mock(TeamProfileService.class); - TeamUserIdentityQryExe exe = new TeamUserIdentityQryExe(teamMemberService, teamProfileService); + TeamManagerInfoService teamManagerInfoService = mock(TeamManagerInfoService.class); + TeamUserIdentityQryExe exe = new TeamUserIdentityQryExe(teamMemberService, teamProfileService, + teamManagerInfoService); AppUserIdCmd cmd = new AppUserIdCmd(); cmd.setUserId(100L); @@ -47,8 +53,25 @@ class TeamUserIdentityQryExeTest { .setRole(TeamMemberRole.OWN); when(teamMemberService.getByMemberId(100L)).thenReturn(teamMember); + when(teamManagerInfoService.checkManager(100L)).thenReturn(false); when(teamProfileService.checkStatusAvailable(200L)).thenReturn(true); assertEquals(TeamUserIdentity.AGENT, exe.execute(cmd)); } + + @Test + void executeShouldReturnManagerWhenUserIsTeamManager() { + TeamMemberService teamMemberService = mock(TeamMemberService.class); + TeamProfileService teamProfileService = mock(TeamProfileService.class); + TeamManagerInfoService teamManagerInfoService = mock(TeamManagerInfoService.class); + TeamUserIdentityQryExe exe = new TeamUserIdentityQryExe(teamMemberService, teamProfileService, + teamManagerInfoService); + + AppUserIdCmd cmd = new AppUserIdCmd(); + cmd.setUserId(100L); + + when(teamManagerInfoService.checkManager(100L)).thenReturn(true); + + assertEquals(TeamUserIdentity.MANAGER, exe.execute(cmd)); + } } diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/room/RoomVoiceProfileCO.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/room/RoomVoiceProfileCO.java index d64c5042..92f95d75 100644 --- a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/room/RoomVoiceProfileCO.java +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/room/RoomVoiceProfileCO.java @@ -49,14 +49,19 @@ public class RoomVoiceProfileCO extends ClientObject { @JsonSerialize(using = ToStringSerializer.class) private Long userId; - /** - * 封面. - */ - private String roomCover; - - /** - * 名称. - */ + /** + * 封面. + */ + private String roomCover; + + /** + * 背景图. + */ + private String roomBackground; + + /** + * 名称. + */ private String roomName; /** diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/room/UpdateRoomBackgroundCmd.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/room/UpdateRoomBackgroundCmd.java new file mode 100644 index 00000000..c3a13444 --- /dev/null +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/room/UpdateRoomBackgroundCmd.java @@ -0,0 +1,37 @@ +package com.red.circle.other.app.dto.cmd.room; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.red.circle.common.business.dto.cmd.AppExtCommand; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 修改房间背景图. + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class UpdateRoomBackgroundCmd extends AppExtCommand { + + /** + * 房间id. + * + * @eo.required + */ + @NotNull(message = "roomId required.") + @JsonSerialize(using = ToStringSerializer.class) + private Long roomId; + + /** + * 房间背景图. + * + * @eo.required + */ + @NotBlank(message = "roomBackground required.") + private String roomBackground; + +} diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/room/UpdateRoomCmdData.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/room/UpdateRoomCmdData.java index 64778d59..e28f3a04 100644 --- a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/room/UpdateRoomCmdData.java +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/room/UpdateRoomCmdData.java @@ -23,14 +23,19 @@ public class UpdateRoomCmdData extends AppExtCommand { @NotNull(message = "id required.") private Long id; - /** - * 封面. - */ - private String roomCover; - - /** - * 名称. - */ + /** + * 封面. + */ + private String roomCover; + + /** + * 背景图. + */ + private String roomBackground; + + /** + * 名称. + */ private String roomName; /** diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/h5/UserIdentityVO.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/h5/UserIdentityVO.java index a3cb2fe0..3d96aa34 100644 --- a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/h5/UserIdentityVO.java +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/h5/UserIdentityVO.java @@ -1,11 +1,11 @@ -package com.red.circle.other.app.dto.h5; - -import lombok.Data; -import lombok.experimental.Accessors; - -import java.io.Serial; -import java.io.Serializable; -import java.util.List; +package com.red.circle.other.app.dto.h5; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serial; +import java.io.Serializable; +import java.util.List; +import lombok.Data; +import lombok.experimental.Accessors; @Data @Accessors(chain = true) @@ -54,14 +54,20 @@ public class UserIdentityVO implements Serializable { */ private Boolean superAdmin; - /** - * 是否是经理 - */ - private Boolean manager; - - /** - * 历史身份. + /** + * 是否是经理 + */ + private Boolean manager; + + /** + * 是否是App管理员角色里的经理. + */ + @JsonProperty("app_manager") + private Boolean appManager; + + /** + * 历史身份. */ private List historyIdentity; -} \ No newline at end of file +} diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/room/RoomProfileService.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/room/RoomProfileService.java index d7ac6e4f..b81a0c63 100644 --- a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/room/RoomProfileService.java +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/room/RoomProfileService.java @@ -2,11 +2,12 @@ package com.red.circle.other.app.service.room; import com.red.circle.common.business.dto.cmd.AppExtCommand; -import com.red.circle.common.business.dto.cmd.app.AppRoomIdCmd; -import com.red.circle.common.business.dto.cmd.app.AppUserIdCmd; -import com.red.circle.other.app.dto.cmd.room.UpdateRoomCmdData; -import com.red.circle.other.inner.model.dto.live.RoomProfileDTO; -import com.red.circle.other.inner.model.dto.live.RoomProfileManagerDTO; +import com.red.circle.common.business.dto.cmd.app.AppRoomIdCmd; +import com.red.circle.common.business.dto.cmd.app.AppUserIdCmd; +import com.red.circle.other.app.dto.cmd.room.UpdateRoomBackgroundCmd; +import com.red.circle.other.app.dto.cmd.room.UpdateRoomCmdData; +import com.red.circle.other.inner.model.dto.live.RoomProfileDTO; +import com.red.circle.other.inner.model.dto.live.RoomProfileManagerDTO; /** * 房间资料信息. @@ -20,6 +21,8 @@ public interface RoomProfileService { RoomProfileManagerDTO getRoomProfile(AppRoomIdCmd cmd); RoomProfileManagerDTO getRoomProfile(AppUserIdCmd cmd); - - RoomProfileDTO updateProfile(UpdateRoomCmdData cmd); -} + + RoomProfileDTO updateProfile(UpdateRoomCmdData cmd); + + RoomProfileManagerDTO updateBackground(UpdateRoomBackgroundCmd cmd); +} diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/entity/live/RoomProfile.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/entity/live/RoomProfile.java index 3e436f40..b1def0b9 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/entity/live/RoomProfile.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/entity/live/RoomProfile.java @@ -41,14 +41,19 @@ public class RoomProfile implements Serializable { @JsonSerialize(using = ToStringSerializer.class) private Long userId; - /** - * 封面. - */ - private String roomCover; - - /** - * 名称. - */ + /** + * 封面. + */ + private String roomCover; + + /** + * 背景图. + */ + private String roomBackground; + + /** + * 名称. + */ private String roomName; /** diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/live/impl/RoomProfileManagerServiceImpl.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/live/impl/RoomProfileManagerServiceImpl.java index 8b20a2de..9fdde82d 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/live/impl/RoomProfileManagerServiceImpl.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/live/impl/RoomProfileManagerServiceImpl.java @@ -805,12 +805,15 @@ public class RoomProfileManagerServiceImpl implements RoomProfileManagerService return update; } - if (StringUtils.isNotBlank(newProfile.getRoomCover())) { - update.set("roomCover", newProfile.getRoomCover()); - } - if (StringUtils.isNotBlank(newProfile.getRoomName())) { - update.set("roomName", newProfile.getRoomName()); - } + if (StringUtils.isNotBlank(newProfile.getRoomCover())) { + update.set("roomCover", newProfile.getRoomCover()); + } + if (StringUtils.isNotBlank(newProfile.getRoomBackground())) { + update.set("roomBackground", newProfile.getRoomBackground()); + } + if (StringUtils.isNotBlank(newProfile.getRoomName())) { + update.set("roomName", newProfile.getRoomName()); + } if (StringUtils.isNotBlank(newProfile.getRoomDesc())) { update.set("roomDesc", newProfile.getRoomDesc()); } diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/dao/team/TeamManagerInfoDAO.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/dao/team/TeamManagerInfoDAO.java new file mode 100644 index 00000000..99ec6f2a --- /dev/null +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/dao/team/TeamManagerInfoDAO.java @@ -0,0 +1,11 @@ +package com.red.circle.other.infra.database.rds.dao.team; + +import com.red.circle.framework.mybatis.dao.BaseDAO; +import com.red.circle.other.infra.database.rds.entity.team.TeamManagerInfo; + +/** + * 团队经理. + */ +public interface TeamManagerInfoDAO extends BaseDAO { + +} diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/entity/team/TeamManagerInfo.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/entity/team/TeamManagerInfo.java new file mode 100644 index 00000000..cfb1633e --- /dev/null +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/entity/team/TeamManagerInfo.java @@ -0,0 +1,54 @@ +package com.red.circle.other.infra.database.rds.entity.team; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.red.circle.framework.mybatis.entity.TimestampBaseEntity; +import java.io.Serial; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 团队经理. + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@TableName("team_manager_base_info") +public class TeamManagerInfo extends TimestampBaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键标识. + */ + @TableId(value = "id") + private Long id; + + /** + * 来源app. + */ + @TableField("sys_origin") + private String sysOrigin; + + /** + * 经理用户ID. + */ + @TableField("user_id") + private Long userId; + + /** + * 联系方式. + */ + @TableField("contact") + private String contact; + + /** + * 区域ID. + */ + @TableField("region_id") + private String regionId; + +} diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/entity/team/UserHistoryIdentity.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/entity/team/UserHistoryIdentity.java index da86f0d3..520be5fd 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/entity/team/UserHistoryIdentity.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/entity/team/UserHistoryIdentity.java @@ -44,10 +44,16 @@ public class UserHistoryIdentity extends TimestampBaseEntity { @TableField("is_agent") private Boolean agent; - /** - * 是否做过主播. - */ - @TableField("is_host") - private Boolean host; - -} + /** + * 是否做过主播. + */ + @TableField("is_host") + private Boolean host; + + /** + * 是否做过团队经理. + */ + @TableField("is_manager") + private Boolean manager; + +} diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/team/TeamManagerInfoService.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/team/TeamManagerInfoService.java new file mode 100644 index 00000000..2944b21e --- /dev/null +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/team/TeamManagerInfoService.java @@ -0,0 +1,21 @@ +package com.red.circle.other.infra.database.rds.service.team; + +import com.red.circle.framework.mybatis.service.BaseService; +import com.red.circle.other.infra.database.rds.entity.team.TeamManagerInfo; +import java.util.List; +import java.util.Set; + +/** + * 团队经理服务. + */ +public interface TeamManagerInfoService extends BaseService { + + boolean checkManager(Long userId); + + TeamManagerInfo getByUserId(Long userId); + + void deleteById(Long id); + + List listByUserIds(Set userIds); + +} diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/team/UserHistoryIdentityService.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/team/UserHistoryIdentityService.java index c90f9a97..a03ddcca 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/team/UserHistoryIdentityService.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/team/UserHistoryIdentityService.java @@ -13,10 +13,15 @@ import java.util.Set; */ public interface UserHistoryIdentityService extends BaseService { - /** - * 保存身份=bd. - */ - void saveBd(Long userId); + /** + * 保存身份=bd. + */ + void saveBd(Long userId); + + /** + * 保存身份=manager. + */ + void saveManager(Long userId); /** * 保存身份=host. diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/team/impl/TeamManagerInfoServiceImpl.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/team/impl/TeamManagerInfoServiceImpl.java new file mode 100644 index 00000000..9d0ae660 --- /dev/null +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/team/impl/TeamManagerInfoServiceImpl.java @@ -0,0 +1,54 @@ +package com.red.circle.other.infra.database.rds.service.team.impl; + +import com.red.circle.framework.mybatis.constant.PageConstant; +import com.red.circle.framework.mybatis.service.impl.BaseServiceImpl; +import com.red.circle.other.infra.database.rds.dao.team.TeamManagerInfoDAO; +import com.red.circle.other.infra.database.rds.entity.team.TeamManagerInfo; +import com.red.circle.other.infra.database.rds.service.team.TeamManagerInfoService; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import org.springframework.stereotype.Service; + +/** + * 团队经理服务实现. + */ +@Service +public class TeamManagerInfoServiceImpl + extends BaseServiceImpl + implements TeamManagerInfoService { + + @Override + public boolean checkManager(Long userId) { + return Objects.nonNull(query() + .eq(TeamManagerInfo::getUserId, userId) + .last(PageConstant.LIMIT_ONE) + .getOne()); + } + + @Override + public TeamManagerInfo getByUserId(Long userId) { + return query() + .eq(TeamManagerInfo::getUserId, userId) + .last(PageConstant.LIMIT_ONE) + .getOne(); + } + + @Override + public void deleteById(Long id) { + delete().eq(TeamManagerInfo::getId, id).execute(); + } + + @Override + public List listByUserIds(Set userIds) { + if (userIds == null || userIds.isEmpty()) { + return new ArrayList<>(); + } + + return query() + .in(TeamManagerInfo::getUserId, userIds) + .list(); + } + +} diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/team/impl/UserHistoryIdentityServiceImpl.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/team/impl/UserHistoryIdentityServiceImpl.java index 34f2d70b..3989c862 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/team/impl/UserHistoryIdentityServiceImpl.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/team/impl/UserHistoryIdentityServiceImpl.java @@ -27,26 +27,50 @@ public class UserHistoryIdentityServiceImpl extends UserHistoryIdentityService { @Override - public void saveBd(Long userId) { - if (exists(userId)) { - update() - .set(UserHistoryIdentity::getBd, Boolean.TRUE) - .eq(UserHistoryIdentity::getId, userId) + public void saveBd(Long userId) { + if (exists(userId)) { + update() + .set(UserHistoryIdentity::getBd, Boolean.TRUE) + .eq(UserHistoryIdentity::getId, userId) .execute(); return; } try { - save(new UserHistoryIdentity() - .setId(userId) - .setBd(Boolean.TRUE) - .setAgent(Boolean.FALSE) - .setHost(Boolean.FALSE) - ); - } catch (DuplicateKeyException ex) { - // ignore - } - } + save(new UserHistoryIdentity() + .setId(userId) + .setBd(Boolean.TRUE) + .setAgent(Boolean.FALSE) + .setHost(Boolean.FALSE) + .setManager(Boolean.FALSE) + ); + } catch (DuplicateKeyException ex) { + // ignore + } + } + + @Override + public void saveManager(Long userId) { + if (exists(userId)) { + update() + .set(UserHistoryIdentity::getManager, Boolean.TRUE) + .eq(UserHistoryIdentity::getId, userId) + .execute(); + return; + } + + try { + save(new UserHistoryIdentity() + .setId(userId) + .setBd(Boolean.FALSE) + .setAgent(Boolean.FALSE) + .setHost(Boolean.FALSE) + .setManager(Boolean.TRUE) + ); + } catch (DuplicateKeyException ex) { + // ignore + } + } @Override public void saveHost(Long userId) { @@ -58,15 +82,16 @@ public class UserHistoryIdentityServiceImpl extends return; } try { - save(new UserHistoryIdentity() - .setId(userId) - .setBd(Boolean.FALSE) - .setAgent(Boolean.FALSE) - .setHost(Boolean.TRUE) - ); - } catch (DuplicateKeyException ex) { - // ignore - } + save(new UserHistoryIdentity() + .setId(userId) + .setBd(Boolean.FALSE) + .setAgent(Boolean.FALSE) + .setHost(Boolean.TRUE) + .setManager(Boolean.FALSE) + ); + } catch (DuplicateKeyException ex) { + // ignore + } } @@ -81,15 +106,16 @@ public class UserHistoryIdentityServiceImpl extends return; } try { - save(new UserHistoryIdentity() - .setId(userId) - .setBd(Boolean.FALSE) - .setAgent(Boolean.TRUE) - .setHost(Boolean.TRUE) - ); - } catch (DuplicateKeyException ex) { - // ignore - } + save(new UserHistoryIdentity() + .setId(userId) + .setBd(Boolean.FALSE) + .setAgent(Boolean.TRUE) + .setHost(Boolean.TRUE) + .setManager(Boolean.FALSE) + ); + } catch (DuplicateKeyException ex) { + // ignore + } } private boolean exists(Long userId) { @@ -141,10 +167,14 @@ public class UserHistoryIdentityServiceImpl extends res.add("Agent"); } - if (Objects.equals(identity.getHost(), Boolean.TRUE)) { - res.add("Host"); - } - return res; - } + if (Objects.equals(identity.getHost(), Boolean.TRUE)) { + res.add("Host"); + } + + if (Objects.equals(identity.getManager(), Boolean.TRUE)) { + res.add("Manager"); + } + return res; + } } diff --git a/rc-service/rc-service-other/other-infrastructure/src/test/java/com/red/circle/other/infra/database/mongo/service/live/impl/RoomProfileManagerServiceImplTest.java b/rc-service/rc-service-other/other-infrastructure/src/test/java/com/red/circle/other/infra/database/mongo/service/live/impl/RoomProfileManagerServiceImplTest.java index e535d269..c0a20b73 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/test/java/com/red/circle/other/infra/database/mongo/service/live/impl/RoomProfileManagerServiceImplTest.java +++ b/rc-service/rc-service-other/other-infrastructure/src/test/java/com/red/circle/other/infra/database/mongo/service/live/impl/RoomProfileManagerServiceImplTest.java @@ -23,6 +23,7 @@ import org.mockito.ArgumentCaptor; import org.bson.Document; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.core.query.Update; import org.springframework.data.redis.core.RedisTemplate; class RoomProfileManagerServiceImplTest { @@ -104,6 +105,26 @@ class RoomProfileManagerServiceImplTest { assertEquals(99L, queryCaptor.getValue().getQueryObject().getLong("id")); } + @Test + void updateSelectiveProfile_shouldUpdateRoomBackground() { + RoomProfileManager room = new RoomProfileManager(); + room.setId(99L); + + when(mongoTemplate.findOne(any(Query.class), eq(RoomProfileManager.class))).thenReturn(room); + + RoomProfile updateProfile = new RoomProfile(); + updateProfile.setId(99L); + updateProfile.setRoomBackground("background.png"); + + service.updateSelectiveProfile(updateProfile); + + ArgumentCaptor updateCaptor = ArgumentCaptor.forClass(Update.class); + verify(mongoTemplate).updateFirst(any(Query.class), updateCaptor.capture(), + eq(RoomProfileManager.class)); + Document setDocument = (Document) updateCaptor.getValue().getUpdateObject().get("$set"); + assertEquals("background.png", setDocument.getString("roomBackground")); + } + @Test void listSelectiveLimitByCountryCodes_shouldQueryIncludedCountriesWithMemberCountSort() { ArgumentCaptor queryCaptor = ArgumentCaptor.forClass(Query.class); diff --git a/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/convertor/team/TeamManagerInnerConvertor.java b/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/convertor/team/TeamManagerInnerConvertor.java new file mode 100644 index 00000000..5e055329 --- /dev/null +++ b/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/convertor/team/TeamManagerInnerConvertor.java @@ -0,0 +1,24 @@ +package com.red.circle.other.app.inner.convertor.team; + +import com.red.circle.framework.core.convertor.ConvertorModel; +import com.red.circle.framework.dto.PageResult; +import com.red.circle.other.infra.database.rds.entity.team.TeamManagerInfo; +import com.red.circle.other.inner.model.cmd.team.manager.TeamManagerAddCmd; +import com.red.circle.other.inner.model.dto.agency.manager.TeamManagerDTO; +import org.mapstruct.Mapper; + +/** + * 团队经理转换器. + */ +@Mapper(componentModel = ConvertorModel.SPRING) +public interface TeamManagerInnerConvertor { + + TeamManagerDTO toTeamManagerDTO(TeamManagerInfo managerInfo); + + TeamManagerInfo toTeamManagerInfo(TeamManagerAddCmd cmd); + + TeamManagerInfo toTeamManagerInfo(TeamManagerDTO dto); + + PageResult toPageTeamManagerDTO(PageResult pageResult); + +} diff --git a/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/endpoint/team/UserHistoryIdentityEndpoint.java b/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/endpoint/team/UserHistoryIdentityEndpoint.java index d3cb2bd8..b7f77ef9 100644 --- a/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/endpoint/team/UserHistoryIdentityEndpoint.java +++ b/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/endpoint/team/UserHistoryIdentityEndpoint.java @@ -52,8 +52,14 @@ public class UserHistoryIdentityEndpoint implements UserHistoryIdentityClientApi } @Override - public ResultResponse saveBd(Long userId) { - historyIdentityClientService.saveBd(userId); - return ResultResponse.success(); - } -} + public ResultResponse saveBd(Long userId) { + historyIdentityClientService.saveBd(userId); + return ResultResponse.success(); + } + + @Override + public ResultResponse saveManager(Long userId) { + historyIdentityClientService.saveManager(userId); + return ResultResponse.success(); + } +} diff --git a/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/endpoint/team/manager/TeamManagerClientEndpoint.java b/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/endpoint/team/manager/TeamManagerClientEndpoint.java new file mode 100644 index 00000000..f2e0ebb7 --- /dev/null +++ b/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/endpoint/team/manager/TeamManagerClientEndpoint.java @@ -0,0 +1,72 @@ +package com.red.circle.other.app.inner.endpoint.team.manager; + +import com.red.circle.framework.dto.PageResult; +import com.red.circle.framework.dto.ResultResponse; +import com.red.circle.other.app.inner.service.team.manager.TeamManagerClientService; +import com.red.circle.other.inner.endpoint.team.manager.api.TeamManagerClientApi; +import com.red.circle.other.inner.model.cmd.team.manager.TeamManagerAddCmd; +import com.red.circle.other.inner.model.cmd.team.manager.TeamManagerOpsPageQryCmd; +import com.red.circle.other.inner.model.dto.agency.manager.TeamManagerDTO; +import java.util.Map; +import java.util.Set; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 团队经理. + */ +@Validated +@RestController +@RequestMapping(value = TeamManagerClientApi.API_PREFIX, produces = MediaType.APPLICATION_JSON_VALUE) +@RequiredArgsConstructor +public class TeamManagerClientEndpoint implements TeamManagerClientApi { + + private final TeamManagerClientService teamManagerClientService; + + @Override + public ResultResponse getById(Long id) { + return ResultResponse.success(teamManagerClientService.getById(id)); + } + + @Override + public ResultResponse getByUserId(Long userId) { + return ResultResponse.success(teamManagerClientService.getByUserId(userId)); + } + + @Override + public ResultResponse add(TeamManagerAddCmd cmd) { + teamManagerClientService.add(cmd); + return ResultResponse.success(); + } + + @Override + public ResultResponse check(Long userId) { + return ResultResponse.success(teamManagerClientService.check(userId)); + } + + @Override + public ResultResponse> mapCheck(Set userIds) { + return ResultResponse.success(teamManagerClientService.mapCheck(userIds)); + } + + @Override + public ResultResponse> pageOps(TeamManagerOpsPageQryCmd qryCmd) { + return ResultResponse.success(teamManagerClientService.pageOps(qryCmd)); + } + + @Override + public ResultResponse updateSelectiveById(TeamManagerDTO dto) { + teamManagerClientService.updateSelectiveById(dto); + return ResultResponse.success(); + } + + @Override + public ResultResponse deleteById(Long id) { + teamManagerClientService.deleteById(id); + return ResultResponse.success(); + } + +} diff --git a/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/team/UserHistoryIdentityClientService.java b/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/team/UserHistoryIdentityClientService.java index 917d10d5..ccdb339c 100644 --- a/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/team/UserHistoryIdentityClientService.java +++ b/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/team/UserHistoryIdentityClientService.java @@ -18,7 +18,9 @@ public interface UserHistoryIdentityClientService { Map mapByIds(Set userIds); - void saveHost(Long userId); - - void saveBd(Long userId); -} + void saveHost(Long userId); + + void saveBd(Long userId); + + void saveManager(Long userId); +} diff --git a/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/team/impl/UserHistoryIdentityClientServiceImpl.java b/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/team/impl/UserHistoryIdentityClientServiceImpl.java index 8235c336..9c83cc83 100644 --- a/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/team/impl/UserHistoryIdentityClientServiceImpl.java +++ b/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/team/impl/UserHistoryIdentityClientServiceImpl.java @@ -47,7 +47,12 @@ public class UserHistoryIdentityClientServiceImpl implements UserHistoryIdentity @Override - public void saveBd(Long userId) { - historyIdentityService.saveBd(userId); - } -} + public void saveBd(Long userId) { + historyIdentityService.saveBd(userId); + } + + @Override + public void saveManager(Long userId) { + historyIdentityService.saveManager(userId); + } +} diff --git a/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/team/manager/TeamManagerClientService.java b/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/team/manager/TeamManagerClientService.java new file mode 100644 index 00000000..845a9294 --- /dev/null +++ b/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/team/manager/TeamManagerClientService.java @@ -0,0 +1,31 @@ +package com.red.circle.other.app.inner.service.team.manager; + +import com.red.circle.framework.dto.PageResult; +import com.red.circle.other.inner.model.cmd.team.manager.TeamManagerAddCmd; +import com.red.circle.other.inner.model.cmd.team.manager.TeamManagerOpsPageQryCmd; +import com.red.circle.other.inner.model.dto.agency.manager.TeamManagerDTO; +import java.util.Map; +import java.util.Set; + +/** + * 团队经理 inner 服务. + */ +public interface TeamManagerClientService { + + TeamManagerDTO getById(Long id); + + TeamManagerDTO getByUserId(Long userId); + + void add(TeamManagerAddCmd cmd); + + boolean check(Long userId); + + Map mapCheck(Set userIds); + + PageResult pageOps(TeamManagerOpsPageQryCmd qryCmd); + + void updateSelectiveById(TeamManagerDTO dto); + + void deleteById(Long id); + +} diff --git a/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/team/manager/impl/TeamManagerClientServiceImpl.java b/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/team/manager/impl/TeamManagerClientServiceImpl.java new file mode 100644 index 00000000..aa39e47e --- /dev/null +++ b/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/team/manager/impl/TeamManagerClientServiceImpl.java @@ -0,0 +1,83 @@ +package com.red.circle.other.app.inner.service.team.manager.impl; + +import com.google.common.collect.Maps; +import com.red.circle.framework.dto.PageResult; +import com.red.circle.other.app.inner.convertor.team.TeamManagerInnerConvertor; +import com.red.circle.other.app.inner.service.team.manager.TeamManagerClientService; +import com.red.circle.other.infra.database.rds.entity.team.TeamManagerInfo; +import com.red.circle.other.infra.database.rds.service.team.TeamManagerInfoService; +import com.red.circle.other.inner.model.cmd.team.manager.TeamManagerAddCmd; +import com.red.circle.other.inner.model.cmd.team.manager.TeamManagerOpsPageQryCmd; +import com.red.circle.other.inner.model.dto.agency.manager.TeamManagerDTO; +import com.red.circle.tool.core.collection.CollectionUtils; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + * 团队经理 inner 服务实现. + */ +@Service +@RequiredArgsConstructor +public class TeamManagerClientServiceImpl implements TeamManagerClientService { + + private final TeamManagerInfoService teamManagerInfoService; + private final TeamManagerInnerConvertor teamManagerInnerConvertor; + + @Override + public TeamManagerDTO getById(Long id) { + return teamManagerInnerConvertor.toTeamManagerDTO(teamManagerInfoService.getById(id)); + } + + @Override + public TeamManagerDTO getByUserId(Long userId) { + return teamManagerInnerConvertor.toTeamManagerDTO(teamManagerInfoService.getByUserId(userId)); + } + + @Override + public void add(TeamManagerAddCmd cmd) { + teamManagerInfoService.save(teamManagerInnerConvertor.toTeamManagerInfo(cmd)); + } + + @Override + public boolean check(Long userId) { + return teamManagerInfoService.checkManager(userId); + } + + @Override + public Map mapCheck(Set userIds) { + if (CollectionUtils.isEmpty(userIds)) { + return Maps.newHashMap(); + } + + return teamManagerInfoService.listByUserIds(userIds).stream() + .collect(Collectors.toMap(TeamManagerInfo::getUserId, v -> Boolean.TRUE, (v1, v2) -> v2)); + } + + @Override + public PageResult pageOps(TeamManagerOpsPageQryCmd qryCmd) { + return teamManagerInnerConvertor.toPageTeamManagerDTO( + teamManagerInfoService.query() + .eq(Objects.nonNull(qryCmd.getUserId()), TeamManagerInfo::getUserId, qryCmd.getUserId()) + .eq(TeamManagerInfo::getSysOrigin, qryCmd.getSysOrigin()) + .eq(Objects.nonNull(qryCmd.getCreateUser()), TeamManagerInfo::getCreateUser, + qryCmd.getCreateUser()) + .orderByDesc(TeamManagerInfo::getCreateTime) + .page(qryCmd.getPageQuery()) + ); + } + + @Override + public void updateSelectiveById(TeamManagerDTO dto) { + teamManagerInfoService.updateSelectiveById(teamManagerInnerConvertor.toTeamManagerInfo(dto)); + } + + @Override + public void deleteById(Long id) { + teamManagerInfoService.deleteById(id); + } + +} diff --git a/sql/20260506_likei_google_product_config.sql b/sql/20260506_likei_google_product_config.sql new file mode 100644 index 00000000..50c919fd --- /dev/null +++ b/sql/20260506_likei_google_product_config.sql @@ -0,0 +1,168 @@ +-- LIKEI Google Play in-app product configs. +-- This script is idempotent for the two product_package values below: +-- it keeps one row per sys_origin + platform + product_package, updates it, +-- removes duplicate rows for those packages, and inserts missing rows. +-- +-- Production LIKEI regions verified from mongo-1 Mongo sys_region_config: +-- 7455586935705044691 Pakistan - 03 +-- 2047598855125528577 Pakistan - rolex +-- 2046578237923979266 Europe Region +-- 2046488527570530306 Africa Region +-- 2046067717605224449 Southeast Asia Region +-- 2046067036517363714 Middle East Region +-- 2046066409959649281 Turkey Region +-- 2045389832842178561 South Asia +-- 69d88849bdbcc07ebc3f118c Default +-- +-- For production, confirm the LIKEI region ids in Mongo first: +-- db.sys_region_config.find( +-- {sysOrigin: "LIKEI", del: false}, +-- {_id: 1, regionName: 1, regionCode: 1} +-- ) +-- If production has different region ids, replace @target_regions before running. + +START TRANSACTION; + +SET @sys_origin := CONVERT('LIKEI' USING utf8mb4) COLLATE utf8mb4_0900_ai_ci; +SET @platform := CONVERT('GOOGLE' USING utf8mb4) COLLATE utf8mb4_0900_ai_ci; +SET @obsolete_product_package := CONVERT('coins.800000' USING utf8mb4) COLLATE utf8mb4_0900_ai_ci; +SET @target_regions := CONVERT('7455586935705044691,2047598855125528577,2046578237923979266,2046488527570530306,2046067717605224449,2046067036517363714,2046066409959649281,2045389832842178561,69d88849bdbcc07ebc3f118c' USING utf8mb4) COLLATE utf8mb4_0900_ai_ci; +SET @country_codes := NULL; +SET @operator_id := 0; + +CREATE TEMPORARY TABLE tmp_likei_google_product_config ( + row_no INT NOT NULL PRIMARY KEY, + product_package VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + unit_price DECIMAL(10, 2) NOT NULL, + obtain_candy DECIMAL(10, 2) NOT NULL, + reward_candy DECIMAL(10, 2) NOT NULL DEFAULT 0, + sort_no INT NOT NULL, + description VARCHAR(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL +); + +INSERT INTO tmp_likei_google_product_config ( + row_no, + product_package, + unit_price, + obtain_candy, + reward_candy, + sort_no, + description +) VALUES + (1, 'coins.80000', 1.00, 80000.00, 0.00, 1, '80000 coins'), + (2, 'coins.240000', 3.00, 240000.00, 0.00, 2, '240000 coins'); + +DELETE FROM sys_product_config_v2 +WHERE sys_origin = @sys_origin + AND platform = @platform + AND product_package = @obsolete_product_package; + +DELETE FROM sys_product_config_package +WHERE product_package = @obsolete_product_package; + +CREATE TEMPORARY TABLE tmp_likei_google_product_keep AS +SELECT + t.product_package, + MIN(t.id) AS keep_id +FROM sys_product_config_v2 t +JOIN tmp_likei_google_product_config s + ON s.product_package = t.product_package +WHERE t.sys_origin = @sys_origin + AND t.platform = @platform +GROUP BY t.product_package; + +DELETE t +FROM sys_product_config_v2 t +JOIN tmp_likei_google_product_keep k + ON k.product_package = t.product_package +WHERE t.sys_origin = @sys_origin + AND t.platform = @platform + AND t.id <> k.keep_id; + +UPDATE sys_product_config_v2 t +JOIN tmp_likei_google_product_keep k + ON k.keep_id = t.id +JOIN tmp_likei_google_product_config s + ON s.product_package = k.product_package +SET + t.description = s.description, + t.unit_price = s.unit_price, + t.obtain_candy = s.obtain_candy, + t.reward_candy = s.reward_candy, + t.regions = @target_regions, + t.country_codes = @country_codes, + t.sort = s.sort_no, + t.is_showcase = 1, + t.update_time = CURRENT_TIMESTAMP, + t.update_user = @operator_id; + +SET @next_product_config_id := ( + SELECT COALESCE(MAX(id), 0) + FROM sys_product_config_v2 +); + +INSERT INTO sys_product_config_v2 ( + id, + sys_origin, + description, + product_package, + unit_price, + obtain_candy, + reward_candy, + platform, + regions, + country_codes, + sort, + is_showcase, + create_time, + update_time, + create_user, + update_user +) +SELECT + (@next_product_config_id := @next_product_config_id + 1) AS id, + @sys_origin, + s.description, + s.product_package, + s.unit_price, + s.obtain_candy, + s.reward_candy, + @platform, + @target_regions, + @country_codes, + s.sort_no, + 1, + CURRENT_TIMESTAMP, + CURRENT_TIMESTAMP, + @operator_id, + @operator_id +FROM tmp_likei_google_product_config s +LEFT JOIN tmp_likei_google_product_keep k + ON k.product_package = s.product_package +WHERE k.keep_id IS NULL; + +SELECT + id, + sys_origin, + product_package, + unit_price, + obtain_candy, + reward_candy, + platform, + regions, + country_codes, + sort, + is_showcase +FROM sys_product_config_v2 +WHERE sys_origin = @sys_origin + AND platform = @platform + AND product_package IN ( + SELECT product_package + FROM tmp_likei_google_product_config + ) +ORDER BY sort, unit_price; + +DROP TEMPORARY TABLE IF EXISTS tmp_likei_google_product_keep; +DROP TEMPORARY TABLE IF EXISTS tmp_likei_google_product_config; + +COMMIT; diff --git a/sql/20260506_team_manager_identity.sql b/sql/20260506_team_manager_identity.sql new file mode 100644 index 00000000..399eb5b1 --- /dev/null +++ b/sql/20260506_team_manager_identity.sql @@ -0,0 +1,32 @@ +SET @table_schema = DATABASE(); + +CREATE TABLE IF NOT EXISTS `team_manager_base_info` ( + `id` bigint NOT NULL COMMENT '主键ID', + `sys_origin` varchar(64) NOT NULL DEFAULT '' COMMENT '来源APP', + `user_id` bigint NOT NULL COMMENT '经理用户ID', + `contact` varchar(255) NOT NULL DEFAULT '' COMMENT '联系方式', + `region_id` varchar(64) NOT NULL DEFAULT '' COMMENT '区域ID', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `create_user` bigint DEFAULT NULL COMMENT '创建人', + `update_user` bigint DEFAULT NULL COMMENT '更新人', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_team_manager_user_id` (`user_id`), + KEY `idx_team_manager_sys_origin` (`sys_origin`), + KEY `idx_team_manager_region` (`region_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='团队经理基本信息'; + +SET @ddl = IF( + EXISTS( + SELECT 1 + FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = @table_schema + AND TABLE_NAME = 'user_history_identity' + AND COLUMN_NAME = 'is_manager' + ), + 'SELECT 1', + "ALTER TABLE `user_history_identity` ADD COLUMN `is_manager` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否做过团队经理' AFTER `is_host`" +); +PREPARE stmt FROM @ddl; +EXECUTE stmt; +DEALLOCATE PREPARE stmt;