From 935c4cd8282980cbd9d5d9e9ae336312cf7f4d75 Mon Sep 17 00:00:00 2001 From: Wang Date: Thu, 8 Jan 2026 14:46:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0app=E7=AB=AF=E4=BB=A3?= =?UTF-8?q?=E7=90=86=E5=95=86=E7=AE=A1=E7=90=86=E5=91=98=E5=B7=A5=E7=9A=84?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../teach/common/enums/ResultCodeEnum.java | 3 +- .../AppAgentEmployeeRelationController.java | 94 +++++++++ .../req/AppAgentEmployeeRelationQueryReq.java | 3 + .../req/AppAgentEmployeeRelationReq.java | 27 +++ .../IAppAgentEmployeeRelationService.java | 76 ++++++++ .../AppAgentEmployeeRelationServiceImpl.java | 180 ++++++++++++++++++ 6 files changed, 382 insertions(+), 1 deletion(-) create mode 100644 seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/AppAgentEmployeeRelationController.java create mode 100644 seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/req/AppAgentEmployeeRelationReq.java create mode 100644 seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/IAppAgentEmployeeRelationService.java create mode 100644 seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/impl/AppAgentEmployeeRelationServiceImpl.java diff --git a/seer-common/common-enums/src/main/java/com/seer/teach/common/enums/ResultCodeEnum.java b/seer-common/common-enums/src/main/java/com/seer/teach/common/enums/ResultCodeEnum.java index ff2e9cf..2866070 100644 --- a/seer-common/common-enums/src/main/java/com/seer/teach/common/enums/ResultCodeEnum.java +++ b/seer-common/common-enums/src/main/java/com/seer/teach/common/enums/ResultCodeEnum.java @@ -336,7 +336,8 @@ public enum ResultCodeEnum { PARTICIPATION_FAILED(13010, "参与活动失败"), PARENT_NOT_FOUND(13011, "家长不存在"), INVALID_ACTIVITY_STATUS(13012, "无效的活动状态"), - PARENT_ALREADY_SIGN_UP(130121, "已经报名参加该活动"); + PARENT_ALREADY_SIGN_UP(130121, "已经报名参加该活动"), + UNAUTHORIZED_UPDATE_EMPLOYEE(13013, "无权限更新员工信息"); private int code; private String msg; diff --git a/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/AppAgentEmployeeRelationController.java b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/AppAgentEmployeeRelationController.java new file mode 100644 index 0000000..521052c --- /dev/null +++ b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/AppAgentEmployeeRelationController.java @@ -0,0 +1,94 @@ +package com.seer.teach.mp.app.controller; + +import cn.dev33.satoken.annotation.SaCheckLogin; +import cn.dev33.satoken.stp.StpUtil; +import com.seer.teach.common.PageListBean; +import com.seer.teach.common.ResultBean; +import com.seer.teach.common.annotation.LogPrint; +import com.seer.teach.common.enums.ResultCodeEnum; +import com.seer.teach.mp.app.controller.req.AppAgentEmployeeRelationQueryReq; +import com.seer.teach.mp.app.controller.req.AppAgentEmployeeRelationReq; +import com.seer.teach.mp.app.controller.resp.AppAgentEmployeeRelationResp; +import com.seer.teach.mp.app.service.IAppAgentEmployeeRelationService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@LogPrint +@RequiredArgsConstructor +@RestController +@Tag(name = "App - 代理商员工管理") +@RequestMapping("/app/agent/employee") +public class AppAgentEmployeeRelationController { + + private final IAppAgentEmployeeRelationService agentEmployeeRelationService; + + @Operation(summary = "我的员工列表") + @PostMapping("/page-list") + @SaCheckLogin + public ResultBean> pageList(@RequestBody @Validated AppAgentEmployeeRelationQueryReq query) { + Integer agentId = StpUtil.getLoginIdAsInt(); + query.setAgentId(agentId); + return ResultBean.success(agentEmployeeRelationService.pageList(query)); + } + + @Operation(summary = "新增员工") + @PostMapping("/add") + @SaCheckLogin + public ResultBean addEmployee(@RequestBody @Validated AppAgentEmployeeRelationReq request) { + Integer agentId = StpUtil.getLoginIdAsInt(); + request.setAgentId(agentId); + return ResultBean.success(agentEmployeeRelationService.addEmployee(request)); + } + + @Operation(summary = "更新员工信息") + @PostMapping("/update") + @SaCheckLogin + public ResultBean updateEmployee(@RequestBody @Validated AppAgentEmployeeRelationReq request) { + Integer agentId = StpUtil.getLoginIdAsInt(); + // 验证员工是否属于当前代理商 + boolean belongsToAgent = agentEmployeeRelationService.isEmployeeBelongsToAgent(request.getId(), agentId); + if (!belongsToAgent) { + return ResultBean.error(ResultCodeEnum.UNAUTHORIZED_UPDATE_EMPLOYEE); + } + return ResultBean.success(agentEmployeeRelationService.updateEmployee(request)); + } + + @Operation(summary = "删除员工") + @DeleteMapping("/{id}") + @SaCheckLogin + public ResultBean deleteEmployee(@PathVariable Integer id) { + Integer agentId = StpUtil.getLoginIdAsInt(); + boolean belongsToAgent = agentEmployeeRelationService.isEmployeeBelongsToAgent(id, agentId); + if (!belongsToAgent) { + return ResultBean.error(ResultCodeEnum.UNAUTHORIZED_UPDATE_EMPLOYEE); + } + return ResultBean.success(agentEmployeeRelationService.deleteEmployee(id)); + } + + @Operation(summary = "员工详情") + @GetMapping("/{id}") + @SaCheckLogin + public ResultBean getEmployee(@PathVariable Integer id) { + Integer agentId = StpUtil.getLoginIdAsInt(); // 假设代理商ID就是登录ID + // 验证员工是否属于当前代理商 + boolean belongsToAgent = agentEmployeeRelationService.isEmployeeBelongsToAgent(id, agentId); + if (!belongsToAgent) { + return ResultBean.error(ResultCodeEnum.UNAUTHORIZED_UPDATE_EMPLOYEE); + } + AppAgentEmployeeRelationResp result = agentEmployeeRelationService.getById(id); + return ResultBean.success(result); + } + + @Operation(summary = "获取所有员工列表") + @GetMapping("/all") + @SaCheckLogin + public ResultBean> getAllEmployees() { + Integer agentId = StpUtil.getLoginIdAsInt(); // 假设代理商ID就是登录ID + return ResultBean.success(agentEmployeeRelationService.getAllEmployeesByAgentId(agentId)); + } +} \ No newline at end of file diff --git a/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/req/AppAgentEmployeeRelationQueryReq.java b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/req/AppAgentEmployeeRelationQueryReq.java index 45caef8..3ebd2e2 100644 --- a/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/req/AppAgentEmployeeRelationQueryReq.java +++ b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/req/AppAgentEmployeeRelationQueryReq.java @@ -8,6 +8,9 @@ import lombok.Data; @Data public class AppAgentEmployeeRelationQueryReq extends PageRequest { + @Schema(description = "代理商ID") + private Integer agentId; // 用于限制只能查询当前代理商的员工 + @Schema(description = "员工职位") private String position; diff --git a/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/req/AppAgentEmployeeRelationReq.java b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/req/AppAgentEmployeeRelationReq.java new file mode 100644 index 0000000..abad852 --- /dev/null +++ b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/req/AppAgentEmployeeRelationReq.java @@ -0,0 +1,27 @@ +package com.seer.teach.mp.app.controller.req; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotNull; + +@Schema(name = "AppAgentEmployeeRelationReq", description = "App端代理商员工关联请求参数") +@Data +public class AppAgentEmployeeRelationReq { + + @Schema(description = "关联ID") + private Integer id; + + @Schema(description = "代理商ID") + private Integer agentId; // 用于内部验证,不强制要求前端传入 + + @NotNull(message = "员工用户ID不能为空") + @Schema(description = "员工用户ID") + private Integer employeeUserId; + + @Schema(description = "员工职位") + private String position; + + @Schema(description = "员工状态:0-禁用,1-启用") + private Integer status = 1; +} \ No newline at end of file diff --git a/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/IAppAgentEmployeeRelationService.java b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/IAppAgentEmployeeRelationService.java new file mode 100644 index 0000000..b778090 --- /dev/null +++ b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/IAppAgentEmployeeRelationService.java @@ -0,0 +1,76 @@ +package com.seer.teach.mp.app.service; + +import com.seer.teach.common.PageListBean; +import com.seer.teach.mp.app.controller.req.AppAgentEmployeeRelationQueryReq; +import com.seer.teach.mp.app.controller.req.AppAgentEmployeeRelationReq; +import com.seer.teach.mp.app.controller.resp.AppAgentEmployeeRelationResp; + +import java.util.List; + +/** + *

+ * App端代理商员工关系服务类 + *

+ * + * @author Lingma + * @since 2025-12-30 + */ +public interface IAppAgentEmployeeRelationService { + + /** + * 分页查询我的员工列表 + * + * @param query 查询条件 + * @return 员工关联分页列表 + */ + PageListBean pageList(AppAgentEmployeeRelationQueryReq query); + + /** + * 新增员工 + * + * @param request 员工关联请求对象 + * @return 操作是否成功 + */ + boolean addEmployee(AppAgentEmployeeRelationReq request); + + /** + * 更新员工信息 + * + * @param request 员工关联请求对象 + * @return 操作是否成功 + */ + boolean updateEmployee(AppAgentEmployeeRelationReq request); + + /** + * 删除员工 + * + * @param id 关联ID + * @return 操作是否成功 + */ + boolean deleteEmployee(Integer id); + + /** + * 根据ID获取详情 + * + * @param id 关联ID + * @return 关联详情 + */ + AppAgentEmployeeRelationResp getById(Integer id); + + /** + * 根据代理商ID获取所有员工列表 + * + * @param agentId 代理商ID + * @return 员工关联列表 + */ + List getAllEmployeesByAgentId(Integer agentId); + + /** + * 验证员工是否属于指定代理商 + * + * @param relationId 关联ID + * @param agentId 代理商ID + * @return 是否属于 + */ + boolean isEmployeeBelongsToAgent(Integer relationId, Integer agentId); +} \ No newline at end of file diff --git a/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/impl/AppAgentEmployeeRelationServiceImpl.java b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/impl/AppAgentEmployeeRelationServiceImpl.java new file mode 100644 index 0000000..360a48b --- /dev/null +++ b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/impl/AppAgentEmployeeRelationServiceImpl.java @@ -0,0 +1,180 @@ +package com.seer.teach.mp.app.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.seer.teach.common.PageListBean; +import com.seer.teach.common.enums.ResultCodeEnum; +import com.seer.teach.common.exception.CommonException; +import com.seer.teach.common.utils.AssertUtils; +import com.seer.teach.common.utils.PageConverterUtils; +import com.seer.teach.mp.app.controller.req.AppAgentEmployeeRelationQueryReq; +import com.seer.teach.mp.app.controller.req.AppAgentEmployeeRelationReq; +import com.seer.teach.mp.app.controller.resp.AppAgentEmployeeRelationResp; +import com.seer.teach.mp.app.service.IAppAgentEmployeeRelationService; +import com.seer.teach.mp.entity.MpAgentEmployeeRelationEntity; +import com.seer.teach.mp.service.IMpAgentEmployeeRelationService; +import com.seer.teach.user.api.UserService; +import com.seer.teach.user.api.dto.UserInfoDTO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +/** + *

+ * App端代理商员工关系服务实现类 + *

+ * + * @author Lingma + * @since 2025-12-30 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class AppAgentEmployeeRelationServiceImpl implements IAppAgentEmployeeRelationService { + + private final IMpAgentEmployeeRelationService mpAgentEmployeeRelationService; + private final UserService userService; + + @Override + public PageListBean pageList(AppAgentEmployeeRelationQueryReq query) { + log.info("查询参数:{}", query); + IPage page = new Page<>(query.getPageNo(), query.getPageSize()); + var pageResult = mpAgentEmployeeRelationService.page(page, new LambdaQueryWrapper<>(MpAgentEmployeeRelationEntity.class) + .eq(query.getAgentId() != null, MpAgentEmployeeRelationEntity::getAgentId, query.getAgentId()) // 只查询当前代理商的员工 + .like(StringUtils.isNotBlank(query.getPosition()), MpAgentEmployeeRelationEntity::getPosition, query.getPosition()) + .eq(query.getStatus() != null, MpAgentEmployeeRelationEntity::getStatus, query.getStatus())); + + if (pageResult.getRecords() == null || pageResult.getRecords().isEmpty()) { + log.info("查询结果为空"); + } + log.info("查询代理商员工数量:{}", pageResult.getTotal()); + + return PageConverterUtils.convertPageListBean(pageResult, this::convertToRespList); + } + + @Override + public boolean addEmployee(AppAgentEmployeeRelationReq request) { + // 检查员工是否已经存在于当前代理商下 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(MpAgentEmployeeRelationEntity::getAgentId, request.getAgentId()) + .eq(MpAgentEmployeeRelationEntity::getEmployeeUserId, request.getEmployeeUserId()); + + MpAgentEmployeeRelationEntity existing = mpAgentEmployeeRelationService.getOne(wrapper); + if (existing != null) { + throw new CommonException(ResultCodeEnum.DATA_REPEAT_ERROR, "该员工已属于当前代理商"); + } + + MpAgentEmployeeRelationEntity entity = new MpAgentEmployeeRelationEntity(); + entity.setAgentId(request.getAgentId()); + entity.setEmployeeUserId(request.getEmployeeUserId()); + entity.setPosition(request.getPosition()); + entity.setStatus(request.getStatus()); + + boolean result = mpAgentEmployeeRelationService.save(entity); + log.info("新增员工结果:{}", result); + return result; + } + + @Override + public boolean updateEmployee(AppAgentEmployeeRelationReq request) { + // 验证员工是否属于当前代理商(通过ID查询并验证) + MpAgentEmployeeRelationEntity existing = mpAgentEmployeeRelationService.getById(request.getId()); + AssertUtils.notNull(existing, ResultCodeEnum.DATA_NOT_EXIST); + + if (!existing.getAgentId().equals(request.getAgentId())) { + throw new CommonException(ResultCodeEnum.PERMISSION_DENIED, "无权限操作此员工"); + } + + existing.setEmployeeUserId(request.getEmployeeUserId()); + existing.setPosition(request.getPosition()); + existing.setStatus(request.getStatus()); + + boolean result = mpAgentEmployeeRelationService.updateById(existing); + log.info("更新员工结果:{}", result); + return result; + } + + @Override + public boolean deleteEmployee(Integer id) { + // 验证员工是否属于当前代理商 + MpAgentEmployeeRelationEntity existing = mpAgentEmployeeRelationService.getById(id); + AssertUtils.notNull(existing, ResultCodeEnum.DATA_NOT_EXIST); + + boolean result = mpAgentEmployeeRelationService.removeById(id); + log.info("删除员工结果:{}", result); + return result; + } + + @Override + public AppAgentEmployeeRelationResp getById(Integer id) { + MpAgentEmployeeRelationEntity entity = mpAgentEmployeeRelationService.getById(id); + if (entity == null) { + return null; + } + return convertToResp(entity); + } + + @Override + public List getAllEmployeesByAgentId(Integer agentId) { + List entities = mpAgentEmployeeRelationService.list( + new LambdaQueryWrapper() + .eq(MpAgentEmployeeRelationEntity::getAgentId, agentId) + ); + + if (CollectionUtil.isEmpty(entities)) { + return List.of(); + } + + return entities.stream() + .map(this::convertToResp) + .collect(Collectors.toList()); + } + + @Override + public boolean isEmployeeBelongsToAgent(Integer relationId, Integer agentId) { + MpAgentEmployeeRelationEntity entity = mpAgentEmployeeRelationService.getById(relationId); + if (entity == null) { + return false; + } + return entity.getAgentId().equals(agentId); + } + + /** + * 将实体转换为响应对象 + */ + private AppAgentEmployeeRelationResp convertToResp(MpAgentEmployeeRelationEntity entity) { + AppAgentEmployeeRelationResp resp = new AppAgentEmployeeRelationResp(); + resp.setId(entity.getId()); + resp.setAgentId(entity.getAgentId()); + resp.setPosition(entity.getPosition()); + resp.setStatus(entity.getStatus()); + resp.setCreateTime(entity.getCreateTime()); + resp.setUpdateTime(entity.getUpdateTime()); + + // 通过用户服务获取员工的详细信息 + if (entity.getEmployeeUserId() != null) { + UserInfoDTO userInfo = userService.getUserInfoById(entity.getEmployeeUserId()); + resp.setEmployeeUserInfo(userInfo); + } + + return resp; + } + + /** + * 批量转换实体为响应对象 + */ + private List convertToRespList(List entities) { + if (CollectionUtil.isEmpty(entities)) { + return List.of(); + } + return entities.stream() + .map(this::convertToResp) + .collect(Collectors.toList()); + } +} \ No newline at end of file