提交 d9d73c56 authored 作者: hzh's avatar hzh

Merge branch 'dev'

......@@ -24,11 +24,11 @@ public interface IBaseService<V, B, T> {
V queryById(Long id);
/**
* 分页查询活动机票订单列表
* 分页查询
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 活动机票订单分页列表
* @return 分页列表
*/
TableDataInfo<V> queryPageList(B bo, PageQuery pageQuery);
......
......@@ -46,6 +46,7 @@ public class LoginHelper {
public static final String MEMBER_ID = "memberId";
public static final String USER_TYPE = "userType";
public static final String PROJECT_ID = "projectId";
public static final String PROJECT_DEPT_ID = "projectDeptId";
/**
* 登录系统 基于 设备类型
......@@ -66,9 +67,6 @@ public class LoginHelper {
.setExtra(USER_TYPE, loginUser.getUserType())
);
StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser);
if (StringUtils.contains(loginUser.getUserType(), UserType.PROJECT_USER.getUserType())) {
StpUtil.getTokenSession().set(PROJECT_ID, Long.valueOf(StringUtils.splitList(loginUser.getUserType(), ":").get(1)));
}
}
/**
......@@ -165,6 +163,25 @@ public class LoginHelper {
}
}
/**
* 获取项目部门id
*/
public static Long getProjectDeptId() {
if (StringUtils.equals(getUserTypeStr(), UserType.SYS_USER.getUserType()) && getProjectId() == null) {
return getDeptId();
}
SaSession session = StpUtil.getTokenSession();
if (ObjectUtil.isNull(session)) {
return null;
}
Object projectDept = session.get(PROJECT_DEPT_ID);
if (projectDept == null) {
return null;
} else {
return Long.parseLong(projectDept.toString());
}
}
/**
* 获取客户端ID
*/
......@@ -274,12 +291,19 @@ public class LoginHelper {
* 动态设置项目id
*
* @param projectId 项目id
* @param deptId 部门id
*/
public static void dynamicProjectId(Long projectId) {
public static void dynamicProjectId(Long projectId, Long deptId) {
if (projectId != null) {
StpUtil.getTokenSession().set(PROJECT_ID, projectId);
if (deptId != null) {
StpUtil.getTokenSession().set(PROJECT_DEPT_ID, deptId);
} else {
StpUtil.getTokenSession().delete(PROJECT_DEPT_ID);
}
} else {
StpUtil.getTokenSession().delete(PROJECT_ID);
StpUtil.getTokenSession().delete(PROJECT_DEPT_ID);
}
}
}
......@@ -178,6 +178,7 @@ public class OrderAirportServiceImpl extends AbstractBaseService<OrderAirportVo,
List<OrderAirportPay> orderPayList = payMapper.selectList(new LambdaQueryWrapper<OrderAirportPay>().in(OrderAirportPay::getOrderId, orderIds));
List<OrderAirportTicket> orderTicketList = ticketMapper.selectList(new LambdaQueryWrapper<OrderAirportTicket>().in(OrderAirportTicket::getOrderId, orderIds));
Long projectId = isAdd ? LoginHelper.getProjectId() : null;
Long projectDeptId = isAdd ? LoginHelper.getProjectDeptId() : null;
//更新数据
orderList.forEach(order -> {
scheduledExecutorService.execute(() -> {
......@@ -312,6 +313,7 @@ public class OrderAirportServiceImpl extends AbstractBaseService<OrderAirportVo,
.map(o -> DateUtil.parse(o.getDepartTime(), "yyyy-MM-dd HH:mm"))
.orElse(null)
);
invoice.setCreateDept(projectDeptId);
orderInvoicingService.save(invoice);
});
}
......
......@@ -177,6 +177,7 @@ public class OrderHotelServiceImpl extends AbstractBaseService<OrderHotelVo, Ord
List<OrderHotelPsgInfo> orderPsgList = psgInfoMapper.selectList(new LambdaQueryWrapper<OrderHotelPsgInfo>().in(OrderHotelPsgInfo::getOrderId, orderIds));
List<OrderHotelPayInfo> orderPayInfoList = payInfoMapper.selectList(new LambdaQueryWrapper<OrderHotelPayInfo>().in(OrderHotelPayInfo::getOrderId, orderIds));
Long projectId = isAdd ? LoginHelper.getProjectId() : null;
Long projectDeptId = isAdd ? LoginHelper.getProjectDeptId() : null;
//更新数据
orderList.forEach(order -> {
scheduledExecutorService.execute(() -> {
......@@ -281,6 +282,7 @@ public class OrderHotelServiceImpl extends AbstractBaseService<OrderHotelVo, Ord
.setUseTime(Optional.ofNullable(order)
.map(o -> DateUtil.parse(o.getCheckInDate(), "yyyy-MM-dd"))
.orElse(null));
invoice.setCreateDept(projectDeptId);
orderInvoicingService.save(invoice);
});
}
......
......@@ -58,7 +58,6 @@ public class OrderInvoicingServiceImpl extends AbstractBaseService<OrderInvoicin
if (user != null) {
bo.setUserType(user.getUserType());
bo.setCreateName(user.getNickName());
bo.setCreateDept(user.getDeptId());
}
bo.setProjectId(bo.getProjectId());
bo.setCreateBy(bo.getUserId());
......
......@@ -187,6 +187,7 @@ public class OrderTrainServiceImpl extends AbstractBaseService<OrderTrainVo, Ord
List<OrderTrainRange> orderRangeList = rangeMapper.selectList(new LambdaQueryWrapper<OrderTrainRange>().in(OrderTrainRange::getOrderId, orderIds));
List<OrderTrainTicket> orderTicketList = ticketMapper.selectList(new LambdaQueryWrapper<OrderTrainTicket>().in(OrderTrainTicket::getOrderId, orderIds));
Long projectId = isAdd ? LoginHelper.getProjectId() : null;
Long projectDeptId = isAdd ? LoginHelper.getProjectDeptId() : null;
//更新数据
orderList.forEach(order -> {
scheduledExecutorService.execute(() -> {
......@@ -319,6 +320,7 @@ public class OrderTrainServiceImpl extends AbstractBaseService<OrderTrainVo, Ord
.setUseTime(Optional.ofNullable(rangeMapper.selectOne(OrderTrainRange::getOrderNo, order.getOrderNo()))
.map(o -> DateUtil.parse(o.getFromDate() + " " + o.getFromTime(), "yyyy-MM-dd HH:mm"))
.orElse(null));
invoice.setCreateDept(projectDeptId);
orderInvoicingService.save(invoice);
});
}
......
......@@ -220,6 +220,7 @@ public class OrderVehiclesServiceImpl extends AbstractBaseService<OrderVehiclesV
List<OrderVehiclesBusiness> orderBusinessList = businessMapper.selectList(new LambdaQueryWrapper<OrderVehiclesBusiness>().in(OrderVehiclesBusiness::getOrderId, orderIds));
List<OrderVehiclesPayInfo> orderPayInfoList = payInfoMapper.selectList(new LambdaQueryWrapper<OrderVehiclesPayInfo>().in(OrderVehiclesPayInfo::getOrderId, orderIds));
Long projectId = isAdd ? LoginHelper.getProjectId() : null;
Long projectDeptId = isAdd ? LoginHelper.getProjectDeptId() : null;
//更新数据
orderList.forEach(order -> {
scheduledExecutorService.execute(() -> {
......@@ -286,6 +287,7 @@ public class OrderVehiclesServiceImpl extends AbstractBaseService<OrderVehiclesV
}
return null;
}).orElse(null));
invoice.setCreateDept(projectDeptId);
orderInvoicingService.save(invoice);
});
}
......
......@@ -6,6 +6,7 @@ import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
......@@ -19,8 +20,11 @@ import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.web.core.BaseController;
import org.dromara.system.constant.Constant;
import org.dromara.system.domain.bo.SysProjectBo;
import org.dromara.system.domain.bo.SysUserProjectBo;
import org.dromara.system.domain.vo.SysProjectVo;
import org.dromara.system.domain.vo.SysUserProjectVo;
import org.dromara.system.service.ISysProjectService;
import org.dromara.system.service.ISysUserProjectService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
......@@ -40,6 +44,7 @@ import java.util.List;
public class SysProjectController extends BaseController {
private final ISysProjectService sysProjectService;
private final ISysUserProjectService userProjectService;
/**
* 查询系统项目列表
......@@ -129,7 +134,18 @@ public class SysProjectController extends BaseController {
*/
@GetMapping("/dynamic")
public R<Void> dynamicProjectId(@RequestParam(required = false) Long projectId) {
LoginHelper.dynamicProjectId(projectId);
Long deptId = null;
if (projectId != null) {
SysUserProjectBo sup = new SysUserProjectBo();
sup.setUserId(LoginHelper.getUserId());
sup.setProjectId(projectId);
SysUserProjectVo vo = userProjectService.getOne(sup);
if (vo == null) {
throw new ServiceException("用户不存在在该项目中");
}
deptId = vo.getCreateDept();
}
LoginHelper.dynamicProjectId(projectId,deptId);
return R.ok();
}
......
......@@ -57,7 +57,6 @@ public class SysUserController extends BaseController {
private final ISysRoleService roleService;
private final ISysPostService postService;
private final ISysDeptService deptService;
private final ISysTenantService tenantService;
private final ISysUserProjectService userProjectService;
@DubboReference
private RemoteDeptOrderApproveService remoteDeptOrderApproveService;
......@@ -162,7 +161,7 @@ public class SysUserController extends BaseController {
}
/**
* 获取用户信息
* 获取用户订单审批数据
*
* @return 用户信息
*/
......@@ -179,10 +178,10 @@ public class SysUserController extends BaseController {
if (su == null) {
return R.ok(uoa);
}
if (su.getUserType().contains(SysUser.PROJECT_USER_TYPE)) {
if (su.getUserType().contains(SysUser.PROJECT_USER_TYPE) && projectId == null) {
uoa.setStaffId(su.getCreateBy());
su = userService.selectUserById(uoa.getStaffId());
} else if (StringUtils.equals(su.getUserType(), UserType.SYS_USER.getUserType()) && projectId != null) {
} else if (projectId != null) {
SysUserProjectBo sup = new SysUserProjectBo();
sup.setUserId(LoginHelper.getUserId());
sup.setProjectId(projectId);
......@@ -242,20 +241,6 @@ public class SysUserController extends BaseController {
@Log(title = "用户管理", businessType = BusinessType.INSERT)
@PostMapping
public R<Void> add(@Validated @RequestBody SysUserBo user) {
deptService.checkDeptDataScope(user.getDeptId());
if (!userService.checkUserNameUnique(user)) {
return R.fail("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
} else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
return R.fail("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
} else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
return R.fail("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
}
if (TenantHelper.isEnable()) {
if (!tenantService.checkAccountBalance(TenantHelper.getTenantId())) {
return R.fail("当前租户下用户名额不足,请联系管理员");
}
}
user.setPassword(BCrypt.hashpw(user.getPassword()));
return toAjax(userService.insertUser(user));
}
......
......@@ -13,6 +13,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.web.core.BaseController;
import org.dromara.system.domain.bo.SysUserProjectBo;
import org.dromara.system.domain.bo.SysUserProjectInsertBo;
import org.dromara.system.domain.vo.SysUserProjectVo;
import org.dromara.system.domain.vo.UserProjectVo;
import org.dromara.system.service.ISysUserProjectService;
......@@ -67,6 +68,18 @@ public class SysUserProjectController extends BaseController {
return toAjax(sysUserProjectService.insertByBo(bo));
}
/**
* 新增用户项目
*/
@SaCheckPermission("system:userProject:add")
@Log(title = "用户项目", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/addProjectUser")
public R<Void> addProjectUser(@Validated(AddGroup.class) @RequestBody SysUserProjectInsertBo bo) {
sysUserProjectService.insert(bo);
return R.ok();
}
/**
* 删除用户项目
*
......
package org.dromara.system.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.tenant.core.TenantEntity;
import java.io.Serial;
......@@ -32,6 +34,11 @@ public class SysUserProject extends TenantEntity {
*/
private Long userId;
/**
* 用户类型
*/
private String userType;
/**
* 项目id
*/
......
......@@ -38,6 +38,11 @@ public class SysUserProjectBo extends BaseEntity {
@NotNull(message = "项目id不能为空", groups = { AddGroup.class, EditGroup.class })
private Long projectId;
/**
* 用户类型
*/
private String userType;
/**
* 角色id
*/
......
package org.dromara.system.domain.bo;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import lombok.experimental.Accessors;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.xss.Xss;
import org.dromara.common.mybatis.core.domain.BaseEntity;
/**
* 用户项目业务对象 sys_user_project
*
* @author hzh
* @date 2025-06-19
*/
@Data
@Accessors(chain = true)
public class SysUserProjectInsertBo extends BaseEntity {
/**
* 用户id
*/
private Long userId;
/**
* 项目id
*/
@NotNull(message = "项目id不能为空", groups = {AddGroup.class})
private Long projectId;
/**
* 角色id
*/
@NotNull(message = "角色id不能为空", groups = {AddGroup.class})
private Long roleId;
/**
* 昵称
*/
@Xss(message = "用户名不能包含脚本字符")
@Size(min = 0, max = 30, message = "用户名长度不能超过{max}个字符")
private String nickName;
/**
* 手机号
*/
private String phonenumber;
/**
* 邮箱
*/
@Email(message = "邮箱格式不正确")
@Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符")
private String email;
/**
* 密码
*/
private String password;
}
......@@ -38,6 +38,11 @@ public class SysUserProjectVo implements Serializable {
@ExcelProperty(value = "用户id")
private Long userId;
/**
* 用户类型
*/
private String userType;
/**
* 项目id
*/
......@@ -50,13 +55,18 @@ public class SysUserProjectVo implements Serializable {
@ExcelProperty(value = "角色id")
private Long roleId;
/**
* 创建部门
*/
private Long createDept;
/**
* 创建人
*/
private Long createBy;
@Translation(type = TransConstant.USER_ID_TO_NICKNAME,mapper = "createBy" )
@Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy")
private String createNickName;
@Translation(type = TransConstant.USER_ID_TO_NAME,mapper = "createBy" )
@Translation(type = TransConstant.USER_ID_TO_NAME, mapper = "createBy")
private String createUserName;
/**
......
......@@ -15,16 +15,16 @@ import org.dromara.system.api.domain.vo.RemoteProjectVo;
import org.dromara.system.constant.Constant;
import org.dromara.system.domain.SysProject;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.SysUserProject;
import org.dromara.system.mapper.SysProjectMapper;
import org.dromara.system.mapper.SysUserMapper;
import org.dromara.system.mapper.SysUserProjectMapper;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import static org.dromara.system.domain.SysUser.PROJECT_USER_TYPE_SPLIT;
/**
* @author hzh
* @date 2025-06-11
......@@ -36,21 +36,26 @@ public class RemoteProjectServiceImpl implements RemoteProjectService {
private final SysProjectMapper sysProjectMapper;
private final SysUserMapper sysUserMapper;
private final SysUserProjectMapper sysUserProjectMapper;
@Override
public List<RemoteProjectVo> queryList(String tenantId, String phone) {
List<SysUser> userList = sysUserMapper.selectList(new LambdaQueryWrapper<SysUser>()
.eq(StringUtils.isNotEmpty(tenantId), SysUser::getTenantId, tenantId)
.eq(StringUtils.isNotEmpty(phone), SysUser::getPhonenumber, phone)
.likeRight(SysUser::getUserType, SysUser.PROJECT_USER_TYPE)
.eq(SysUser::getUserType, SysUser.PROJECT_USER_TYPE)
.eq(SysUser::getStatus, UserConstants.USER_NORMAL)
.select(SysUser::getUserType)
.select(SysUser::getUserId)
);
Set<Long> projectIds = StreamUtils.toSet(userList, u -> {
String[] split = u.getUserType().split(PROJECT_USER_TYPE_SPLIT);
return Long.parseLong(split[1]);
});
return CollectionUtil.isEmpty(projectIds) ? List.of() : BeanUtil.copyToList(StreamUtils.filter(sysProjectMapper.selectByIds(projectIds), sp -> StringUtils.equals(sp.getStatus(), Constant.PROJECT_NORMAL)), RemoteProjectVo.class);
if (CollectionUtil.isEmpty(userList)) {
return List.of();
}
List<SysUserProject> supList = sysUserProjectMapper.selectList(new LambdaQueryWrapper<SysUserProject>()
.in(SysUserProject::getUserId, StreamUtils.toList(userList, SysUser::getUserId)));
Set<Long> projectIds = StreamUtils.toSet(supList, SysUserProject::getProjectId);
return CollectionUtil.isEmpty(projectIds) ?
List.of() :
BeanUtil.copyToList(StreamUtils.filter(sysProjectMapper.selectByIds(projectIds), sp -> StringUtils.equals(sp.getStatus(), Constant.PROJECT_NORMAL)), RemoteProjectVo.class);
}
@Override
......
package org.dromara.system.listener;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HtmlUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.utils.ValidatorUtils;
import org.dromara.common.excel.core.ExcelListener;
import org.dromara.common.excel.core.ExcelResult;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.controller.system.SysUserController;
import org.dromara.system.domain.bo.SysUserBo;
import org.dromara.system.domain.bo.SysUserProjectInsertBo;
import org.dromara.system.domain.vo.SysProjectUserImportVo;
import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.service.ISysUserService;
import org.dromara.system.service.ISysConfigService;
import org.dromara.system.service.ISysUserProjectService;
import java.util.List;
import static org.dromara.system.domain.SysUser.PROJECT_USER_TYPE;
import static org.dromara.system.domain.SysUser.PROJECT_USER_TYPE_SPLIT;
/**
* 项目用户自定义导入
*
......@@ -36,12 +28,12 @@ import static org.dromara.system.domain.SysUser.PROJECT_USER_TYPE_SPLIT;
@Slf4j
public class SysProjectUserImportListener extends AnalysisEventListener<SysProjectUserImportVo> implements ExcelListener<SysProjectUserImportVo> {
private final ISysUserService userService;
private final SysUserController sysUserController;
private final ISysUserProjectService sysUserProjectService;
private final Long operUserId;
private final Long roleId;
private final String userType;
private final String operTenantId;
private final Long projectId;
private final String initPassword;
private int successNum = 0;
private int failureNum = 0;
......@@ -49,46 +41,31 @@ public class SysProjectUserImportListener extends AnalysisEventListener<SysProje
private final StringBuilder failureMsg = new StringBuilder();
public SysProjectUserImportListener(Long projectId, Long roleId) {
this.userService = SpringUtils.getBean(ISysUserService.class);
this.sysUserController = SpringUtils.getBean(SysUserController.class);
this.sysUserProjectService = SpringUtils.getBean(ISysUserProjectService.class);
this.operUserId = LoginHelper.getUserId();
this.operTenantId = LoginHelper.getTenantId();
this.userType = PROJECT_USER_TYPE + PROJECT_USER_TYPE_SPLIT + projectId;
this.projectId = projectId;
this.roleId = roleId;
this.initPassword =SpringUtils.getBean(ISysConfigService.class).selectConfigByKey("sys.user.initPassword");
}
@Override
public void invoke(SysProjectUserImportVo userVo, AnalysisContext context) {
SysUserVo sysUser = this.userService.selectUserByUserName(userVo.getPhonenumber(), userType, operTenantId);
public void invoke(SysProjectUserImportVo vo, AnalysisContext context) {
try {
// 验证是否存在这个用户
if (ObjectUtil.isNull(sysUser)) {
SysUserBo user = BeanUtil.toBean(userVo, SysUserBo.class);
user.setUserName(user.getPhonenumber());
user.setUserType(userType);
ValidatorUtils.validate(user);
String password = user.getPassword();
if (StringUtils.isBlank(password)) {
password = user.getPhonenumber();
}
user.setPassword(password.trim());
user.setCreateBy(operUserId);
if (roleId != null) {
user.setRoleIds(new Long[]{roleId});
}
R<Void> r = sysUserController.add(user);
if (r.getCode() == R.FAIL) {
throw new ServiceException(r.getMsg());
}
successNum++;
successMsg.append("<br/>").append(successNum).append("、账号 ").append(user.getUserName()).append(" 导入成功");
} else {
failureNum++;
failureMsg.append("<br/>").append(failureNum).append("、账号 ").append(sysUser.getUserName()).append(" 已存在");
}
String password = StringUtils.isBlank(vo.getPassword()) ?initPassword:vo.getPassword();
SysUserProjectInsertBo bo = new SysUserProjectInsertBo()
.setProjectId(projectId)
.setRoleId(roleId)
.setNickName(vo.getNickName())
.setPhonenumber(vo.getPhonenumber())
.setEmail(vo.getEmail())
.setPassword(password);
bo.setCreateBy(operUserId);
sysUserProjectService.insert(bo);
successNum++;
successMsg.append("<br/>").append(successNum).append("、账号 ").append(vo.getPhonenumber()).append(" 导入成功");
} catch (Exception e) {
failureNum++;
String msg = "<br/>" + failureNum + "、账号 " + HtmlUtil.cleanHtmlTag(userVo.getPhonenumber()) + " 导入失败:";
String msg = "<br/>" + failureNum + "、账号 " + HtmlUtil.cleanHtmlTag(vo.getPhonenumber()) + " 导入失败:";
String message = e.getMessage();
if (e instanceof ConstraintViolationException cvException) {
message = StreamUtils.join(cvException.getConstraintViolations(), ConstraintViolation::getMessage, ", ");
......
......@@ -9,7 +9,6 @@ import com.alibaba.excel.event.AnalysisEventListener;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StreamUtils;
......@@ -18,7 +17,6 @@ import org.dromara.common.core.utils.ValidatorUtils;
import org.dromara.common.excel.core.ExcelListener;
import org.dromara.common.excel.core.ExcelResult;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.controller.system.SysUserController;
import org.dromara.system.domain.bo.SysUserBo;
import org.dromara.system.domain.vo.SysUserImportVo;
import org.dromara.system.domain.vo.SysUserVo;
......@@ -36,7 +34,6 @@ import java.util.Objects;
public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo> implements ExcelListener<SysUserImportVo> {
private final ISysUserService userService;
private final SysUserController sysUserController;
private final ISysDeptService sysDeptService;
private final ISysPostService sysPostService;
private final ISysRoleService sysRoleService;
......@@ -55,7 +52,6 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo
public SysUserImportListener(Boolean isUpdateSupport) {
String initPassword = SpringUtils.getBean(ISysConfigService.class).selectConfigByKey("sys.user.initPassword");
this.userService = SpringUtils.getBean(ISysUserService.class);
this.sysUserController = SpringUtils.getBean(SysUserController.class);
this.sysDeptService = SpringUtils.getBean(ISysDeptService.class);
this.sysPostService = SpringUtils.getBean(ISysPostService.class);
this.sysRoleService = SpringUtils.getBean(ISysRoleService.class);
......@@ -87,11 +83,7 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo
if (StringUtils.isNotEmpty(userVo.getRoleName())) {
user.setRoleIds(sysRoleService.selectRoleIdsByNameList(StrUtil.split(userVo.getRoleName(), "/")).toArray(Long[]::new));
}
sysUserController.add(user);
R<Void> r = sysUserController.add(user);
if (r.getCode() == R.FAIL) {
throw new ServiceException(r.getMsg());
}
userService.insertUser(user);
successNum++;
successMsg.append("<br/>").append(successNum).append("、账号 ").append(user.getUserName()).append(" 导入成功");
} else if (isUpdateSupport) {
......
......@@ -3,6 +3,7 @@ package org.dromara.system.service;
import org.dromara.common.mybatis.service.IBaseService;
import org.dromara.system.domain.SysUserProject;
import org.dromara.system.domain.bo.SysUserProjectBo;
import org.dromara.system.domain.bo.SysUserProjectInsertBo;
import org.dromara.system.domain.vo.SysUserProjectVo;
import org.dromara.system.domain.vo.UserProjectVo;
......@@ -24,4 +25,11 @@ public interface ISysUserProjectService extends IBaseService<SysUserProjectVo, S
* @return 项目列表
*/
List<UserProjectVo> selectListByUserId(Long userId);
/**
* 添加项目人员
*
* @param bo 数据
*/
void insert(SysUserProjectInsertBo bo);
}
......@@ -2,7 +2,6 @@ package org.dromara.system.service;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.bo.SysUserBo;
import org.dromara.system.domain.vo.SysUserExportVo;
import org.dromara.system.domain.vo.SysUserVo;
......@@ -293,13 +292,6 @@ public interface ISysUserService {
*/
List<Long> selectUserIdsByRoleKeyAndDeptId(String roleKey, Long deptId);
/**
* 保存或更新用户信息
*
* @param sysUser 用户信息
*/
void saveOrUpdateYsUser(SysUser sysUser);
/**
* 根据用户昵称查询userIds
*
......
package org.dromara.system.service;
import org.dromara.system.domain.SysUser;
/**
* @author hzh
* @date 2025-06-25
**/
public interface IThirdService {
/**
* 保存或更新用户信息
*
* @param sysUser 用户信息
*/
void saveOrUpdateYsUser(SysUser sysUser);
}
......@@ -32,7 +32,7 @@ import org.dromara.system.domain.bo.SysTenantBo;
import org.dromara.system.domain.vo.SysTenantVo;
import org.dromara.system.mapper.*;
import org.dromara.system.service.ISysTenantService;
import org.dromara.system.service.ISysUserService;
import org.dromara.system.service.IThirdService;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
......@@ -60,7 +60,7 @@ public class SysTenantServiceImpl implements ISysTenantService {
private final SysDictTypeMapper dictTypeMapper;
private final SysDictDataMapper dictDataMapper;
private final SysConfigMapper configMapper;
private final ISysUserService userService;
private final IThirdService thirdService;
@DubboReference
private final RemoteProcessService remoteProcessService;
@DubboReference
......@@ -178,7 +178,7 @@ public class SysTenantServiceImpl implements ISysTenantService {
userMapper.insert(user);
// 同步到云服务用户
userService.saveOrUpdateYsUser(user);
thirdService.saveOrUpdateYsUser(user);
//创建审批流程
remoteProcessService.createDefaultProcessConfig(tenantId);
......
......@@ -7,8 +7,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.common.base.Objects;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.enums.UserType;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.common.mybatis.service.AbstractBaseService;
import org.dromara.system.constant.Constant;
......@@ -16,7 +18,9 @@ import org.dromara.system.domain.SysProject;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.SysUserProject;
import org.dromara.system.domain.SysUserRole;
import org.dromara.system.domain.bo.SysUserBo;
import org.dromara.system.domain.bo.SysUserProjectBo;
import org.dromara.system.domain.bo.SysUserProjectInsertBo;
import org.dromara.system.domain.vo.SysUserProjectVo;
import org.dromara.system.domain.vo.UserProjectVo;
import org.dromara.system.mapper.SysProjectMapper;
......@@ -24,6 +28,7 @@ import org.dromara.system.mapper.SysUserMapper;
import org.dromara.system.mapper.SysUserProjectMapper;
import org.dromara.system.mapper.SysUserRoleMapper;
import org.dromara.system.service.ISysUserProjectService;
import org.dromara.system.service.ISysUserService;
import org.springframework.stereotype.Service;
import java.util.Collection;
......@@ -45,6 +50,7 @@ public class SysUserProjectServiceImpl extends AbstractBaseService<SysUserProjec
private final SysUserRoleMapper userRoleMapper;
private final SysUserMapper sysUserMapper;
private final SysProjectMapper sysProjectMapper;
private final ISysUserService userService;
@Override
public BaseMapperPlus<SysUserProject, SysUserProjectVo> mapper() {
......@@ -57,6 +63,7 @@ public class SysUserProjectServiceImpl extends AbstractBaseService<SysUserProjec
LambdaQueryWrapper<SysUserProject> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getUserId() != null, SysUserProject::getUserId, bo.getUserId());
lqw.eq(bo.getProjectId() != null, SysUserProject::getProjectId, bo.getProjectId());
lqw.eq(StringUtils.isNotBlank(bo.getUserType()), SysUserProject::getUserType, bo.getUserType());
lqw.eq(bo.getRoleId() != null, SysUserProject::getRoleId, bo.getRoleId());
return lqw;
}
......@@ -98,6 +105,9 @@ public class SysUserProjectServiceImpl extends AbstractBaseService<SysUserProjec
@Override
public void validEntityBeforeSave(SysUserProject entity) {
super.validEntityBeforeSave(entity);
if (entity.getId() == null) {
entity.setUserType(Optional.ofNullable(sysUserMapper.selectById(entity.getUserId())).map(SysUser::getUserType).orElse(UserType.SYS_USER.getUserType()));
}
//校验用户是否已经存在
List<SysUserProject> supList = baseMapper.selectList(SysUserProject::getUserId, entity.getUserId(), SysUserProject::getProjectId, entity.getProjectId());
SysUserProject sysUserProject = StreamUtils.findFirst(supList, sup -> !Objects.equal(sup.getId(), entity.getId()));
......@@ -144,4 +154,47 @@ public class SysUserProjectServiceImpl extends AbstractBaseService<SysUserProjec
.eq(SysProject::getStatus, Constant.PROJECT_NORMAL));
return BeanUtil.copyToList(projectList, UserProjectVo.class);
}
@Override
public void insert(SysUserProjectInsertBo bo) {
SysUserProjectBo sup = new SysUserProjectBo();
sup.setProjectId(bo.getProjectId());
sup.setRoleId(bo.getRoleId());
String userType = UserType.PROJECT_USER.getUserType();
if (bo.getUserId() != null) {
sup.setUserId(bo.getUserId());
} else {
validEntity(bo);
//根据手机号查询是否存在用户信息
SysUser user = sysUserMapper.selectOne(SysUser::getUserType, UserType.PROJECT_USER.getUserType(), SysUser::getPhonenumber, bo.getPhonenumber());
if (user != null) {
sup.setUserId(user.getUserId());
} else {
//新增用户
SysUserBo su = new SysUserBo();
su.setNickName(bo.getNickName());
su.setUserName(bo.getPhonenumber());
su.setPhonenumber(bo.getPhonenumber());
su.setEmail(bo.getEmail());
su.setPassword(bo.getPassword());
su.setCreateBy(bo.getCreateBy());
su.setUserType(userType);
userService.insertUser(su);
//查询用户
user = sysUserMapper.selectOne(SysUser::getUserType, userType, SysUser::getPhonenumber, bo.getPhonenumber());
sup.setUserId(user.getUserId());
}
}
sup.setUserType(userType);
insertByBo(sup);
}
private void validEntity(SysUserProjectInsertBo bo) {
if (StringUtils.isBlank(bo.getNickName())) {
throw new ServiceException("姓名不能为空");
}
if (StringUtils.isEmpty(bo.getPhonenumber())) {
throw new ServiceException("手机号码不能为空");
}
}
}
package org.dromara.system.service.impl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.server.api.RemoteServerService;
import org.dromara.server.api.domain.RemoteUser;
import org.dromara.system.domain.SysUser;
import org.dromara.system.service.IThirdService;
import org.springframework.stereotype.Service;
/**
* @author hzh
* @date 2025-06-25
**/
@Slf4j
@RequiredArgsConstructor
@Service
public class ThirdServiceImpl implements IThirdService {
@DubboReference
private RemoteServerService remoteServerService;
@Override
public void saveOrUpdateYsUser(SysUser sysUser) {
remoteServerService.saveOrUpdateUser(
new RemoteUser()
.setSystemUserId(sysUser.getUserId())
.setUserName(sysUser.getUserName())
.setPhoneNumber(sysUser.getPhonenumber())
.setIdCard(sysUser.getIdCard())
.setUserType(sysUser.getUserType())
.setTenantId(sysUser.getTenantId())
);
}
}
package org.dromara.workflow.flowable.listener;
import cn.hutool.core.collection.CollectionUtil;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.workflow.common.constant.FlowConstant;
import org.dromara.workflow.domain.FileApprove;
import org.dromara.workflow.mapper.FileApproveMapper;
import org.dromara.workflow.service.IDeptService;
import org.flowable.common.engine.api.variable.VariableContainer;
import org.flowable.engine.impl.el.FixedValue;
import org.flowable.task.service.delegate.DelegateTask;
import org.flowable.task.service.delegate.TaskListener;
import org.springframework.stereotype.Component;
import java.util.Objects;
import java.util.List;
/**
* 部门文件下载申请自定义审批人监听器
......@@ -20,8 +26,15 @@ import java.util.Objects;
*/
@Component
@Slf4j
@Getter
@Setter
public class DeptFileApproveAssigneeListener implements TaskListener {
/**
* 角色编码
*/
private FixedValue roleKey;
@Override
public void notify(DelegateTask delegateTask) {
// 获取业务id
......@@ -34,10 +47,15 @@ public class DeptFileApproveAssigneeListener implements TaskListener {
// 调用服务获取审批人列表
Long approveId = deptService.selectLeaderIdByFileId(fa.getSysDeptFileId());
List<Long> roleUserIds = deptService.selectUserListByFileIdAndRoleKey(fa.getSysDeptFileId(), roleKey.getValue(VariableContainer.empty()).toString());
if (approveId != null) {
roleUserIds.add(approveId);
}
if (CollectionUtil.isEmpty(roleUserIds)) {
roleUserIds = List.of(-1L);
}
// 设置候选用户
String owner = Objects.isNull(approveId) ? null : approveId.toString();
delegateTask.setAssignee(owner);
delegateTask.addCandidateUsers(StreamUtils.toList(roleUserIds, Object::toString));
}
}
package org.dromara.workflow.flowable.listener;
import cn.hutool.core.collection.CollectionUtil;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.workflow.common.constant.FlowConstant;
import org.dromara.workflow.domain.FileApprove;
import org.dromara.workflow.mapper.FileApproveMapper;
import org.dromara.workflow.service.IDeptService;
import org.flowable.task.service.delegate.DelegateTask;
import org.flowable.task.service.delegate.TaskListener;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 部门文件下载申请自定义审批人监听器
*
* @author wenhe
*/
@Component
@Slf4j
public class DeptFileApproveGroupListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
// 获取业务id
Long businessKey = Long.parseLong(delegateTask.getVariable(FlowConstant.BUSINESS_KEY).toString());
FileApproveMapper mapper = SpringUtils.getBean(FileApproveMapper.class);
FileApprove fa = mapper.selectById(businessKey);
IDeptService deptService = SpringUtils.getBean(IDeptService.class);
// 调用服务获取审批人列表
List<Long> userIds = deptService.selectUserListByFileIdAndRoleKey(fa.getSysDeptFileId(), "file_approve");
if (CollectionUtil.isEmpty(userIds)) {
userIds = List.of(-1L);
}
// 设置候选用户
delegateTask.addCandidateUsers(StreamUtils.toList(userIds, Object::toString));
}
}
package org.dromara.workflow.flowable.listener;
import org.flowable.task.service.delegate.DelegateTask;
import org.flowable.task.service.delegate.TaskListener;
/**
* @author wenhe
*/
public class DeptReviewCompleteListener implements TaskListener {
@Override
public void notify(DelegateTask task) {
task.setVariable("end", true);
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论