Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
T
travel-cloud
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
cloud
travel-cloud
Commits
87a51be4
提交
87a51be4
authored
6月 16, 2025
作者:
hzh
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
订单开票调试以及项目人员导出
上级
0f36c81e
隐藏空白字符变更
内嵌
并排
正在显示
8 个修改的文件
包含
236 行增加
和
7 行删除
+236
-7
SaPermissionImpl.java
...dromara/common/satoken/core/service/SaPermissionImpl.java
+4
-0
OrderInvoicingServiceImpl.java
...romara/server/service/impl/OrderInvoicingServiceImpl.java
+8
-4
SysUserController.java
...g/dromara/system/controller/system/SysUserController.java
+21
-3
SysProjectUserImportVo.java
.../org/dromara/system/domain/vo/SysProjectUserImportVo.java
+54
-0
SysProjectUserImportListener.java
...dromara/system/listener/SysProjectUserImportListener.java
+132
-0
ISysUserService.java
...main/java/org/dromara/system/service/ISysUserService.java
+8
-0
SysSensitiveServiceImpl.java
.../dromara/system/service/impl/SysSensitiveServiceImpl.java
+2
-0
SysUserServiceImpl.java
...a/org/dromara/system/service/impl/SysUserServiceImpl.java
+7
-0
没有找到文件。
ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/service/SaPermissionImpl.java
浏览文件 @
87a51be4
...
...
@@ -27,6 +27,8 @@ public class SaPermissionImpl implements StpInterface {
}
else
if
(
userType
==
UserType
.
APP_USER
)
{
// 其他端 自行根据业务编写
return
new
ArrayList
<>(
loginUser
.
getMenuPermission
());
}
else
if
(
userType
==
UserType
.
PROJECT_USER
)
{
return
new
ArrayList
<>(
loginUser
.
getMenuPermission
());
}
return
new
ArrayList
<>();
}
...
...
@@ -42,6 +44,8 @@ public class SaPermissionImpl implements StpInterface {
return
new
ArrayList
<>(
loginUser
.
getRolePermission
());
}
else
if
(
userType
==
UserType
.
APP_USER
)
{
// 其他端 自行根据业务编写
}
else
if
(
userType
==
UserType
.
PROJECT_USER
)
{
return
new
ArrayList
<>(
loginUser
.
getRolePermission
());
}
return
new
ArrayList
<>();
}
...
...
ruoyi-modules/ruoyi-server/src/main/java/org/dromara/server/service/impl/OrderInvoicingServiceImpl.java
浏览文件 @
87a51be4
...
...
@@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import
com.baomidou.mybatisplus.core.toolkit.CollectionUtils
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
lombok.RequiredArgsConstructor
;
import
org.dromara.common.core.exception.ServiceException
;
import
lombok.extern.slf4j.Slf4j
;
import
org.dromara.common.core.utils.StringUtils
;
import
org.dromara.common.mybatis.core.mapper.BaseMapperPlus
;
import
org.dromara.common.mybatis.service.AbstractBaseService
;
...
...
@@ -18,6 +18,7 @@ import org.dromara.server.service.IOrderInvoicingService;
import
org.springframework.stereotype.Service
;
import
java.util.Map
;
import
java.util.Optional
;
/**
* 开票订单关联Service业务层处理
...
...
@@ -27,6 +28,7 @@ import java.util.Map;
*/
@RequiredArgsConstructor
@Service
@Slf4j
public
class
OrderInvoicingServiceImpl
extends
AbstractBaseService
<
OrderInvoicingVo
,
OrderInvoicingBo
,
OrderInvoicing
>
implements
IOrderInvoicingService
{
private
final
OrderInvoicingMapper
baseMapper
;
...
...
@@ -39,11 +41,13 @@ public class OrderInvoicingServiceImpl extends AbstractBaseService<OrderInvoicin
@Override
public
void
save
(
OrderInvoicingBo
bo
)
{
OrderInvoicingStrategy
strategy
=
strategyMapper
.
selectOne
(
OrderInvoicingStrategy:
:
getType
,
bo
.
getType
());
if
(
strategy
==
null
)
throw
new
ServiceException
(
"请配置对应开票策略"
);
OrderInvoicing
invoicing
=
baseMapper
.
selectOne
(
OrderInvoicing:
:
getOrderId
,
bo
.
getOrderId
(),
OrderInvoicing:
:
getType
,
bo
.
getType
());
bo
.
setStrategy
(
strategy
.
getStrategy
());
if
(
null
==
invoicing
)
{
OrderInvoicingStrategy
strategy
=
strategyMapper
.
selectOne
(
OrderInvoicingStrategy:
:
getType
,
bo
.
getType
());
bo
.
setStrategy
(
Optional
.
ofNullable
(
strategy
).
map
(
OrderInvoicingStrategy:
:
getStrategy
).
orElse
(
null
));
if
(
strategy
==
null
)
{
log
.
info
(
"订单类型:{},未配置开票策略"
,
bo
.
getType
());
}
insertByBo
(
bo
);
}
else
{
invoicing
.
setPersonCode
(
bo
.
getPersonCode
());
...
...
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java
浏览文件 @
87a51be4
...
...
@@ -32,6 +32,7 @@ import org.dromara.system.domain.bo.SysPostBo;
import
org.dromara.system.domain.bo.SysRoleBo
;
import
org.dromara.system.domain.bo.SysUserBo
;
import
org.dromara.system.domain.vo.*
;
import
org.dromara.system.listener.SysProjectUserImportListener
;
import
org.dromara.system.listener.SysUserImportListener
;
import
org.dromara.system.service.*
;
import
org.springframework.http.MediaType
;
...
...
@@ -111,6 +112,21 @@ public class SysUserController extends BaseController {
return
R
.
ok
(
result
.
getAnalysis
());
}
/**
* 导入项目用户数据
*
* @param file 导入文件
* @param projectId 项目id
*/
@Log
(
title
=
"项目用户管理"
,
businessType
=
BusinessType
.
IMPORT
)
@SaCheckPermission
(
"system:projectUser:import"
)
@PostMapping
(
value
=
"/importProjectData"
,
consumes
=
MediaType
.
MULTIPART_FORM_DATA_VALUE
)
public
R
<
Void
>
importProjectData
(
@RequestPart
(
"file"
)
MultipartFile
file
,
@RequestParam
(
value
=
"projectId"
)
Long
projectId
)
throws
Exception
{
ExcelResult
<
SysProjectUserImportVo
>
result
=
ExcelUtil
.
importExcel
(
file
.
getInputStream
(),
SysProjectUserImportVo
.
class
,
new
SysProjectUserImportListener
(
projectId
));
return
R
.
ok
(
result
.
getAnalysis
());
}
/**
* 获取导入模板
*/
...
...
@@ -162,9 +178,11 @@ public class SysUserController extends BaseController {
su
=
userService
.
selectUserById
(
uoa
.
getUserId
());
}
//获取部门负责人id
uoa
.
setLeaderId
(
Optional
.
ofNullable
(
deptService
.
selectDeptById
(
su
.
getDeptId
()))
.
map
(
SysDeptVo:
:
getLeader
).
orElse
(
null
));
uoa
.
setDeptApprove
(
remoteDeptOrderApproveService
.
selectOrderApproveByDeptId
(
su
.
getDeptId
()));
if
(
su
.
getDeptId
()
!=
null
)
{
uoa
.
setLeaderId
(
Optional
.
ofNullable
(
deptService
.
selectDeptById
(
su
.
getDeptId
()))
.
map
(
SysDeptVo:
:
getLeader
).
orElse
(
null
));
uoa
.
setDeptApprove
(
remoteDeptOrderApproveService
.
selectOrderApproveByDeptId
(
su
.
getDeptId
()));
}
return
R
.
ok
(
uoa
);
}
...
...
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysProjectUserImportVo.java
0 → 100644
浏览文件 @
87a51be4
package
org
.
dromara
.
system
.
domain
.
vo
;
import
com.alibaba.excel.annotation.ExcelProperty
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.io.Serial
;
import
java.io.Serializable
;
/**
* 项目用户对象导入VO
*
* @author Lion Li
*/
@Data
@NoArgsConstructor
public
class
SysProjectUserImportVo
implements
Serializable
{
@Serial
private
static
final
long
serialVersionUID
=
1L
;
/**
* 用户昵称
*/
@ExcelProperty
(
value
=
"用户名称"
)
private
String
nickName
;
/**
* 手机号码
*/
@ExcelProperty
(
value
=
"手机号码"
)
private
String
phonenumber
;
/**
* 密码
*/
@ExcelProperty
(
value
=
"密码"
)
private
String
password
;
/**
* 项目名称
*/
@ExcelProperty
(
value
=
"项目名称"
)
private
String
projectName
;
/**
* 角色名称
*/
@ExcelProperty
(
"角色"
)
private
String
roleName
;
}
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/SysProjectUserImportListener.java
0 → 100644
浏览文件 @
87a51be4
package
org
.
dromara
.
system
.
listener
;
import
cn.hutool.core.bean.BeanUtil
;
import
cn.hutool.core.util.ObjectUtil
;
import
cn.hutool.core.util.StrUtil
;
import
cn.hutool.crypto.digest.BCrypt
;
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.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.vo.SysProjectUserImportVo
;
import
org.dromara.system.domain.vo.SysUserVo
;
import
org.dromara.system.service.ISysRoleService
;
import
org.dromara.system.service.ISysUserService
;
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
;
/**
* 项目用户自定义导入
*
* @author Lion Li
*/
@Slf4j
public
class
SysProjectUserImportListener
extends
AnalysisEventListener
<
SysProjectUserImportVo
>
implements
ExcelListener
<
SysProjectUserImportVo
>
{
private
final
ISysUserService
userService
;
private
final
SysUserController
sysUserController
;
private
final
ISysRoleService
sysRoleService
;
private
final
Long
operUserId
;
private
final
String
userType
;
private
final
String
operTenantId
;
private
int
successNum
=
0
;
private
int
failureNum
=
0
;
private
final
StringBuilder
successMsg
=
new
StringBuilder
();
private
final
StringBuilder
failureMsg
=
new
StringBuilder
();
public
SysProjectUserImportListener
(
Long
projectId
)
{
this
.
userService
=
SpringUtils
.
getBean
(
ISysUserService
.
class
);
this
.
sysUserController
=
SpringUtils
.
getBean
(
SysUserController
.
class
);
this
.
sysRoleService
=
SpringUtils
.
getBean
(
ISysRoleService
.
class
);
this
.
operUserId
=
LoginHelper
.
getUserId
();
this
.
operTenantId
=
LoginHelper
.
getTenantId
();
this
.
userType
=
PROJECT_USER_TYPE
+
PROJECT_USER_TYPE_SPLIT
+
projectId
;
}
@Override
public
void
invoke
(
SysProjectUserImportVo
userVo
,
AnalysisContext
context
)
{
SysUserVo
sysUser
=
this
.
userService
.
selectUserByUserName
(
userVo
.
getPhonenumber
(),
userType
,
operTenantId
);
try
{
// 验证是否存在这个用户
if
(
ObjectUtil
.
isNull
(
sysUser
))
{
SysUserBo
user
=
BeanUtil
.
toBean
(
userVo
,
SysUserBo
.
class
);
user
.
setUserName
(
user
.
getPassword
());
user
.
setUserType
(
userType
);
ValidatorUtils
.
validate
(
user
);
String
password
=
user
.
getPassword
();
if
(
StringUtils
.
isBlank
(
password
))
{
password
=
user
.
getPhonenumber
();
}
user
.
setPassword
(
BCrypt
.
hashpw
(
password
));
user
.
setCreateBy
(
operUserId
);
//设置角色
if
(
StringUtils
.
isNotEmpty
(
userVo
.
getRoleName
()))
{
user
.
setRoleIds
(
sysRoleService
.
selectRoleIdsByNameList
(
StrUtil
.
split
(
userVo
.
getRoleName
(),
"/"
)).
toArray
(
Long
[]::
new
));
}
sysUserController
.
add
(
user
);
successNum
++;
successMsg
.
append
(
"<br/>"
).
append
(
successNum
).
append
(
"、账号 "
).
append
(
user
.
getUserName
()).
append
(
" 导入成功"
);
}
else
{
failureNum
++;
failureMsg
.
append
(
"<br/>"
).
append
(
failureNum
).
append
(
"、账号 "
).
append
(
sysUser
.
getUserName
()).
append
(
" 已存在"
);
}
}
catch
(
Exception
e
)
{
failureNum
++;
String
msg
=
"<br/>"
+
failureNum
+
"、账号 "
+
HtmlUtil
.
cleanHtmlTag
(
userVo
.
getPhonenumber
())
+
" 导入失败:"
;
String
message
=
e
.
getMessage
();
if
(
e
instanceof
ConstraintViolationException
cvException
)
{
message
=
StreamUtils
.
join
(
cvException
.
getConstraintViolations
(),
ConstraintViolation:
:
getMessage
,
", "
);
}
failureMsg
.
append
(
msg
).
append
(
message
);
log
.
error
(
msg
,
e
);
}
}
@Override
public
void
doAfterAllAnalysed
(
AnalysisContext
context
)
{
}
@Override
public
ExcelResult
<
SysProjectUserImportVo
>
getExcelResult
()
{
return
new
ExcelResult
<>()
{
@Override
public
String
getAnalysis
()
{
if
(
failureNum
>
0
)
{
failureMsg
.
insert
(
0
,
"很抱歉,导入失败!共 "
+
failureNum
+
" 条数据格式不正确,错误如下:"
);
throw
new
ServiceException
(
failureMsg
.
toString
());
}
else
{
successMsg
.
insert
(
0
,
"恭喜您,数据已全部导入成功!共 "
+
successNum
+
" 条,数据如下:"
);
}
return
successMsg
.
toString
();
}
@Override
public
List
<
SysProjectUserImportVo
>
getList
()
{
return
null
;
}
@Override
public
List
<
String
>
getErrorList
()
{
return
null
;
}
};
}
}
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java
浏览文件 @
87a51be4
...
...
@@ -56,6 +56,14 @@ public interface ISysUserService {
*/
SysUserVo
selectUserByUserName
(
String
userName
);
/**
* 通过用户名查询用户
*
* @param userName 用户名
* @return 用户对象信息
*/
SysUserVo
selectUserByUserName
(
String
userName
,
String
userType
,
String
tenantId
);
/**
* 通过手机号查询用户
*
...
...
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java
浏览文件 @
87a51be4
...
...
@@ -29,6 +29,8 @@ public class SysSensitiveServiceImpl implements SensitiveService {
}
if
(
StringUtils
.
equals
(
LoginHelper
.
getUserTypeStr
(),
UserType
.
APP_USER
.
getUserType
()))
{
return
false
;
}
else
if
(
StringUtils
.
containsAny
(
LoginHelper
.
getUserTypeStr
(),
UserType
.
PROJECT_USER
.
getUserType
()))
{
return
false
;
}
boolean
roleExist
=
StringUtils
.
isNotEmpty
(
roleKey
);
boolean
permsExist
=
StringUtils
.
isNotEmpty
(
perms
);
...
...
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java
浏览文件 @
87a51be4
...
...
@@ -239,6 +239,13 @@ public class SysUserServiceImpl implements ISysUserService {
.
eq
(
SysUser:
:
getUserType
,
UserType
.
SYS_USER
.
getUserType
()));
}
@Override
public
SysUserVo
selectUserByUserName
(
String
userName
,
String
userType
,
String
tenantId
)
{
return
baseMapper
.
selectVoOne
(
new
LambdaQueryWrapper
<
SysUser
>().
eq
(
SysUser:
:
getUserName
,
userName
)
.
eq
(
SysUser:
:
getUserType
,
userType
)
.
eq
(
SysUser:
:
getTenantId
,
tenantId
));
}
/**
* 通过手机号查询用户
*
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论