PublicAffairs/gather-app/src/main/java/com/ruoyi/business/controller/BusinessTripApprovalControl...

640 lines
26 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.ruoyi.business.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AddTreeSelect;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.TreeSelect;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.database.domain.ApprovalProcess;
import com.ruoyi.database.domain.BaseAddressInfo;
import com.ruoyi.database.domain.BusinessTripApproval;
import com.ruoyi.database.domain.dto.ApprovaltBusinessDto;
import com.ruoyi.database.domain.gwglLog;
import com.ruoyi.database.service.ApprovalProcessService;
import com.ruoyi.database.service.BaseAddressInfoService;
import com.ruoyi.database.service.BusinessTripApprovalService;
import com.ruoyi.database.service.gwglLogService;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Description BusinessTripApprovalController
* @Author lijingtong
* @Date 2025-05-29
*/
@RestController
@RequestMapping("/BusinessTripApproval")
@RequiredArgsConstructor
@Api(tags = "出差审批单")
public class BusinessTripApprovalController extends BaseController {
private final BusinessTripApprovalService businessTripApprovalService;
private final ISysUserService sysUserService;
private final ISysDeptService sysDeptService;
private final BaseAddressInfoService baseAddressInfoService;
private final ApprovalProcessService approvalsProcessService;
private final gwglLogService gwglLogService;
@PostMapping("/list")
@ApiOperation("查询出差申请")
public TableDataInfo list(BusinessTripApproval businessTripApproval) {
startPage();
QueryWrapper<BusinessTripApproval> queryWrapper = new QueryWrapper<>(businessTripApproval);
queryWrapper.orderByDesc("create_time");
List<BusinessTripApproval> list = businessTripApprovalService.list(queryWrapper);
long size = businessTripApprovalService.count(queryWrapper);
return getDataTableEnhance(list, size);
}
@PostMapping("/add")
@ApiOperation("新增出差申请")
public AjaxResult add(@RequestBody BusinessTripApproval dto) {
SysUser user = getLoginUser().getUser();
if (dto.getHasOffcialCar() == null) {
throw new RuntimeException("请选择是否自带公务车辆");
}
if (dto.getHasOffcialCar() != null && dto.getHasOffcialCar() == 1) {
if (dto.getUseCarType() == null) {
throw new RuntimeException("请选择用车方式");
}
}
if (dto.getStartDate() == null || dto.getEndDate() == null) {
throw new RuntimeException("请选择出差时间范围");
}
if (dto.getDestinationId() == null) {
throw new RuntimeException("请选择出差目的地");
}
dto.setUserName(user.getNickName());
dto.setUserId(user.getUserId());
dto.setDepartment(user.getDept().getDeptName());
List<Long> togUserIdList = dto.getTogUserIdList();
int isLeader = 0;
if (user.getIsLeader() != null) {
isLeader = 1;
}
StringBuilder ids = new StringBuilder();
if (togUserIdList != null && !togUserIdList.isEmpty()) {
for (Long aLong : togUserIdList) {
if (ids.length() > 0) {
ids.append(",");
}
ids.append(aLong);
SysUser user1 = sysUserService.selectUserById(aLong);
if (user1.getIsLeader() != null) {
isLeader = 1;
}
}
dto.setTogUserIds(ids.toString());
}
String s = OrderNumberGenerator();
dto.setApplyNo(s);
UUID uuid = UUID.randomUUID();
String uuids = uuid.toString();
dto.setUuid(uuids);
BaseAddressInfo byId = baseAddressInfoService.getById(dto.getDestinationId());
ApprovalProcess approvalProcess = new ApprovalProcess();
approvalProcess.setApprovalNo(s);
approvalProcess.setProcessTitle("出差呈请");
approvalProcess.setSubmitterName(user.getNickName());
approvalProcess.setSubmitterId(user.getUserId());
approvalProcess.setSubmitTime(new Date().getTime());
approvalProcess.setMatterType(2);
approvalProcess.setReadStatus(0);
approvalProcess.setBusinessTripDestination(byId.getAddName());
approvalProcess.setStartTime(dto.getStartDate());
approvalProcess.setEndTime(dto.getEndDate());
approvalProcess.setCreateTime(new Date().getTime());
approvalProcess.setUuid(uuids);
List<Long> longs = new ArrayList<>();
if (isLeader == 1) {
if (dto.getHasOffcialCar() == 1) {
approvalProcess.setApprovalStatusH(100);
longs.add(2165L);
} else {
approvalProcess.setApprovalStatusH(400);
longs.add(1660L);
longs.add(1661L);
}
} else {
approvalProcess.setApprovalStatusH(1);
longs.add(user.getDept().getLeaderId());
}
addLog(approvalProcess, longs);
return toAjax(businessTripApprovalService.save(dto)
&& approvalsProcessService.save(approvalProcess)
);
}
/*@GetMapping("/userList")
@ApiOperation("查询用户人员列表")
public AjaxResult applyList() {
*//*List<SysUser> sysUsers = sysUserService.selectList();
List<SysDept> sysDepts = sysDeptService.selectDeptList(new SysDept());
sysDepts = sysDepts.stream()
.filter(dept -> dept.getDeptId() != 131000) // 过滤掉id为131000的部门
.collect(Collectors.toList());
List<SysDept> depts = sysDeptService.buildDeptTree(sysDepts);
Map<Long, List<SysUser>> deptUsersMap = new HashMap<>();
for (SysUser user : sysUsers) {
deptUsersMap.computeIfAbsent(user.getDeptId(), k -> new ArrayList<>()).add(user);
}
return AjaxResult.success(buildTree(depts, deptUsersMap));*//*
// 获取当前用户ID
// 获取当前用户ID
Long userId = getLoginUser().getUser().getUserId();
// 查询用户和部门
List<SysUser> sysUsers = sysUserService.selectList();
List<SysDept> sysDepts = sysDeptService.selectDeptList(new SysDept());
sysDepts = sysDepts.stream()
.filter(dept -> dept.getDeptId() != 131000) // 过滤掉id为131000的部门
.collect(Collectors.toList());
// 构建部门树
List<SysDept> depts = sysDeptService.buildDeptTree(sysDepts);
// 查找当前用户所在部门
SysUser currentUser = sysUsers.stream()
.filter(user -> user.getUserId().equals(userId))
.findFirst()
.orElse(null);
Long currentDeptId = currentUser != null ? currentUser.getDeptId() : null;
// 构建用户映射
Map<Long, List<SysUser>> deptUsersMap = new HashMap<>();
for (SysUser user : sysUsers) {
deptUsersMap.computeIfAbsent(user.getDeptId(), k -> new ArrayList<>()).add(user);
}
// 构建树结构
List<TreeSelect> treeList = new ArrayList<>();
// 在最外层顶部添加当前部门资源(如果找到)
if (currentDeptId != null) {
SysDept currentDept = findDeptById(depts, currentDeptId);
if (currentDept != null) {
TreeSelect currentDeptNode = buildDeptNode(currentDept, deptUsersMap);
treeList.add(currentDeptNode);
}
}
// 保持原有部门树结构不变
treeList.addAll(buildTree(depts, deptUsersMap));
return AjaxResult.success(treeList);
}
private TreeSelect buildDeptNode(SysDept dept, Map<Long, List<SysUser>> deptUsersMap) {
TreeSelect treeSelect = new TreeSelect();
treeSelect.setId(dept.getDeptId());
treeSelect.setLabel(dept.getDeptName());
// 添加部门下的用户
List<TreeSelect> children = new ArrayList<>();
List<SysUser> users = deptUsersMap.getOrDefault(dept.getDeptId(), Collections.emptyList());
for (SysUser user : users) {
TreeSelect userNode = new TreeSelect();
userNode.setLabel(user.getNickName());
userNode.setId(user.getUserId());
userNode.setDictId(dept.getDeptId());
userNode.setDictName(dept.getDeptName());
children.add(userNode);
}
// 递归添加所有子部门
for (SysDept child : dept.getChildren()) {
children.add(buildDeptNode(child, deptUsersMap));
}
if (!children.isEmpty()) {
treeSelect.setChildren(children);
}
return treeSelect;
}
private SysDept findDeptById(List<SysDept> depts, Long deptId) {
for (SysDept dept : depts) {
SysDept found = findDeptInTree(dept, deptId);
if (found != null) {
return found;
}
}
return null;
}
// 辅助方法在部门树中递归查找指定ID的部门
private SysDept findDeptInTree(SysDept dept, Long deptId) {
if (dept.getDeptId().equals(deptId)) {
return dept;
}
for (SysDept child : dept.getChildren()) {
SysDept found = findDeptInTree(child, deptId);
if (found != null) {
return found;
}
}
return null;
}*/
@GetMapping("/userList")
@ApiOperation("查询用户人员列表")
public AjaxResult applyList() {
// Long currentUserId = getCurrentUserId();
Long currentUserId = getLoginUser().getUser().getUserId();
List<SysUser> sysUsers = sysUserService.selectList();
List<SysDept> sysDepts = sysDeptService.selectDeptList(new SysDept());
// 过滤无效部门并复制原始列表(避免修改原始数据)
List<SysDept> originalDepts = sysDepts.stream()
.filter(dept -> dept.getDeptId() != 131000)
.collect(Collectors.toList());
// 构建原始部门树
List<SysDept> deptTree = sysDeptService.buildDeptTree(originalDepts);
// 查找当前部门并从原始树中移除
SysDept currentDept = removeCurrentDeptFromTree(deptTree, currentUserId, sysUsers);
// 构建用户映射
Map<Long, List<SysUser>> deptUsersMap = sysUsers.stream()
.collect(Collectors.groupingBy(SysUser::getDeptId));
// 构建结果:先添加当前部门(作为独立顶级节点),再添加原始树(已移除当前部门)
List<TreeSelect> treeList = new ArrayList<>();
if (currentDept != null) {
treeList.add(buildCurrentDeptNode(currentDept, deptUsersMap));
}
treeList.addAll(buildTree(deptTree, deptUsersMap)); // 原始树已不含当前部门
return AjaxResult.success(treeList);
}
// 从部门树中查找并移除当前部门
private SysDept removeCurrentDeptFromTree(List<SysDept> deptTree, Long currentUserId, List<SysUser> sysUsers) {
SysUser currentUser = sysUsers.stream()
.filter(user -> user.getUserId().equals(currentUserId))
.findFirst()
.orElse(null);
if (currentUser == null) return null;
Long currentDeptId = currentUser.getDeptId();
SysDept currentDept = findDeptInTree(deptTree, currentDeptId);
// 递归从原始树中移除当前部门(避免重复显示)
if (currentDept != null) {
removeDeptFromParent(deptTree, currentDeptId);
}
return currentDept;
}
private TreeSelect buildDeptNode(SysDept dept, Map<Long, List<SysUser>> deptUsersMap) {
TreeSelect treeSelect = new TreeSelect();
treeSelect.setId(dept.getDeptId());
treeSelect.setLabel(dept.getDeptName());
// 添加部门下的用户
List<TreeSelect> children = new ArrayList<>();
List<SysUser> users = deptUsersMap.getOrDefault(dept.getDeptId(), Collections.emptyList());
for (SysUser user : users) {
TreeSelect userNode = new TreeSelect();
userNode.setLabel(user.getNickName());
userNode.setId(user.getUserId());
userNode.setDictId(dept.getDeptId());
userNode.setDictName(dept.getDeptName());
children.add(userNode);
}
// 递归添加所有子部门
for (SysDept child : dept.getChildren()) {
children.add(buildDeptNode(child, deptUsersMap));
}
if (!children.isEmpty()) {
treeSelect.setChildren(children);
}
return treeSelect;
}
// 递归查找部门节点
private SysDept findDeptInTree(List<SysDept> depts, Long deptId) {
for (SysDept dept : depts) {
if (dept.getDeptId().equals(deptId)) {
return dept;
}
SysDept found = findDeptInTree(dept.getChildren(), deptId);
if (found != null) {
return found;
}
}
return null;
}
// 递归从父节点中移除指定部门
private void removeDeptFromParent(List<SysDept> depts, Long deptId) {
depts.removeIf(dept -> dept.getDeptId().equals(deptId)); // 移除顶级节点
depts.forEach(dept -> dept.getChildren().removeIf(child -> child.getDeptId().equals(deptId))); // 移除子节点
depts.forEach(dept -> removeDeptFromParent(dept.getChildren(), deptId)); // 深层递归
}
// 构建当前部门节点(仅显示一次在最外层)
private TreeSelect buildCurrentDeptNode(SysDept dept, Map<Long, List<SysUser>> deptUsersMap) {
TreeSelect node = new TreeSelect();
node.setId(dept.getDeptId());
node.setLabel(dept.getDeptName());
// 添加当前部门的用户和子部门(保持原有层级)
List<TreeSelect> children = new ArrayList<>();
deptUsersMap.getOrDefault(dept.getDeptId(), Collections.emptyList()).forEach(user -> {
TreeSelect userNode = new TreeSelect();
userNode.setLabel(user.getNickName());
userNode.setId(user.getUserId());
userNode.setDictId(dept.getDeptId());
userNode.setDictName(dept.getDeptName());
children.add(userNode);
});
dept.getChildren().forEach(child -> children.add(buildDeptNode(child, deptUsersMap))); // 递归子部门
if (!children.isEmpty()) {
node.setChildren(children);
}
return node;
}
// 原始buildTree方法仅处理原始树不含当前部门
private List<TreeSelect> buildTree(List<SysDept> depts, Map<Long, List<SysUser>> deptUsersMap) {
return depts.stream().map(dept -> {
TreeSelect treeSelect = new TreeSelect();
treeSelect.setId(dept.getDeptId());
treeSelect.setLabel(dept.getDeptName());
// 处理当前部门以外的用户和子部门
List<TreeSelect> children = deptUsersMap.getOrDefault(dept.getDeptId(), Collections.emptyList()).stream()
.map(user -> {
TreeSelect userNode = new TreeSelect();
userNode.setLabel(user.getNickName());
userNode.setId(user.getUserId());
userNode.setDictId(dept.getDeptId());
userNode.setDictName(dept.getDeptName());
return userNode;
})
.collect(Collectors.toList());
children.addAll(buildTree(dept.getChildren(), deptUsersMap)); // 递归原始树的子部门
if (!children.isEmpty()) {
treeSelect.setChildren(children);
}
return treeSelect;
}).collect(Collectors.toList());
}
// 获取当前用户ID保持不变
/*public List<TreeSelect> buildTree(List<SysDept> depts, Map<Long, List<SysUser>> deptUsersMap) {
List<TreeSelect> treeList = new ArrayList<>();
for (SysDept dept : depts) {
TreeSelect treeSelect = new TreeSelect();
treeSelect.setId(dept.getDeptId());
treeSelect.setLabel(dept.getDeptName());
// 分配用户到部门
List<SysUser> users = deptUsersMap.getOrDefault(dept.getDeptId(), Collections.emptyList());
// 这里可以根据需要处理用户信息,比如只存储用户名或创建包含用户详细信息的子对象
// 这里简单示例,只存储用户名列表
List<TreeSelect> children = new ArrayList<>();
if (users != null) {
for (SysUser sysUser : users) {
TreeSelect treeSelect1 = new TreeSelect();
treeSelect1.setLabel(sysUser.getNickName());
treeSelect1.setId(sysUser.getUserId());
treeSelect1.setDictId(dept.getDeptId());
treeSelect1.setDictName(dept.getDeptName());
children.add(treeSelect1);
}
}
// 递归处理子部门
children.addAll(buildTree(dept.getChildren(), deptUsersMap));
if (!children.isEmpty()) {
treeSelect.setChildren(children); // 注意这里我们重置了children因为前面我们错误地将它设置为了用户名字符串列表
}
treeList.add(treeSelect);
}
return treeList;
}*/
@GetMapping("/addressList")
@ApiOperation("查询地址信息列表")
public AjaxResult addressList() {
List<BaseAddressInfo> allAddresses = baseAddressInfoService.list();
Map<Long, List<BaseAddressInfo>> addressMap = allAddresses.stream()
.collect(Collectors.groupingBy(BaseAddressInfo::getTopId));
List<AddTreeSelect> tree = buildTree(addressMap, 0L);
return AjaxResult.success(tree);
}
private List<AddTreeSelect> buildTree(
Map<Long, List<BaseAddressInfo>> addressMap,
Long parentId
) {
List<BaseAddressInfo> children = addressMap.get(parentId);
if (children == null) return Collections.emptyList();
return children.stream()
.map(info -> {
AddTreeSelect node = new AddTreeSelect();
node.setId(info.getId());
node.setLabel(info.getAddName());
node.setValue(info.getId().toString());
node.setChildren(buildTree(addressMap, info.getId()));
return node;
})
.collect(Collectors.toList());
}
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
private static final String DATA_KEY = "DDATAKEY:";
public static String OrderNumberGenerator() {
String format = sdf.format(new Date());
RedisCache bean = SpringUtils.getBean(RedisCache.class);
bean.setCacheObject(DATA_KEY + format, bean.getCacheObject(DATA_KEY + format) == null ? 1 : (Integer) (bean.getCacheObject(DATA_KEY + format)) + 1);
return format + String.format("%04d", (Integer) (bean.getCacheObject(DATA_KEY + format)));
}
@ApiOperation("审批出差申请")
@PostMapping("/approval")
public AjaxResult approval(@RequestBody ApprovaltBusinessDto dto) {
SysUser user = getLoginUser().getUser();
String uuid = dto.getUuid();
if (uuid == null) {
throw new RuntimeException("uuid不可为空");
}
if (dto.getState() == null) {
throw new RuntimeException("请选择通过或者驳回");
}
gwglLog one = gwglLogService.lambdaQuery()
.eq(gwglLog::getUuid, uuid)
.orderByDesc(gwglLog::getCreateTime)
.last("LIMIT 1")
.one();
Integer checkState = one.getCheckState();
if (checkState != 0) {
throw new RuntimeException("记录已被处理");
}
String checkUserId = one.getCheckUserId();
List<Long> longs = new ArrayList<>();
if (checkUserId != null) {
if (checkUserId.contains(",")) {
String[] split = checkUserId.split(",");
for (String s : split) {
longs.add(Long.parseLong(s));
}
} else {
longs.add(Long.parseLong(checkUserId));
}
}
if (longs.isEmpty() || !longs.contains(user.getUserId())) {
throw new RuntimeException("当前用户无法操作");
}
ApprovalProcess approvalProcess = approvalsProcessService.lambdaQuery()
.eq(ApprovalProcess::getUuid, uuid)
.last("LIMIT 1")
.one();
BusinessTripApproval businessTripApproval = businessTripApprovalService.lambdaQuery()
.eq(BusinessTripApproval::getUuid,uuid)
.last("LIMIT 1")
.one();
Integer approvalStatus = approvalProcess.getApprovalStatusH();
if (dto.getState() == 1) {
if (approvalStatus == 1) {
List<Long> userIds = new ArrayList<>();
if (businessTripApproval.getHasOffcialCar() == 1) {
approvalProcess.setApprovalStatusH(100);
userIds.add(2165L);
} else {
approvalProcess.setApprovalStatusH(400);
userIds.add(1660L);
userIds.add(1661L);
}
addLog(approvalProcess, userIds);
}
if (approvalStatus == 100) {
if (dto.getDriverName() == null) {
throw new RuntimeException("驾驶员姓名不可为空");
}
if (dto.getPlateNo() == null) {
throw new RuntimeException("车牌号不可为空");
}
approvalProcess.setApprovalStatusH(200);
List<Long> userIds = new ArrayList<>();
userIds.add(2157L);
addLog(approvalProcess, userIds);
}
if (approvalStatus == 200) {
if (dto.getLeaderId() == null) {
throw new RuntimeException("请选择分管局领导");
}
approvalProcess.setApprovalStatusH(300);
List<Long> userIds = new ArrayList<>();
userIds.add(dto.getLeaderId());
addLog(approvalProcess, userIds);
}
if (approvalStatus == 300) {
approvalProcess.setApprovalStatusH(400);
List<Long> userIds = new ArrayList<>();
userIds.add(1660L);
userIds.add(1661L);
addLog(approvalProcess, userIds);
}
if (approvalStatus == 400) {
approvalProcess.setApprovalStatusH(500);
}
one.setCheckState(dto.getState());
one.setCheckTime(System.currentTimeMillis() / 1000L);
one.setReason(dto.getReason());
boolean updateById = gwglLogService.updateById(one);
boolean updateById1 = approvalsProcessService.updateById(approvalProcess);
return toAjax(updateById1 && updateById);
} else if (dto.getState() == 2) {
if (dto.getReason() == null) {
throw new RuntimeException("驳回意见不可为空");
}
if (approvalStatus == 100 || approvalStatus == 200 || approvalStatus == 300) {
approvalProcess.setApprovalStatusH(400);
List<Long> userIds = new ArrayList<>();
userIds.add(1660L);
userIds.add(1661L);
addLog(approvalProcess, userIds);
}else {
approvalProcess.setApprovalStatusH(0);
List<Long> userIds = new ArrayList<>();
userIds.add(approvalProcess.getSubmitterId());
addLog(approvalProcess, userIds);
}
one.setCheckState(dto.getState());
one.setCheckTime(System.currentTimeMillis() / 1000L);
one.setReason(dto.getReason());
boolean updateById = gwglLogService.updateById(one);
boolean updateById1 = approvalsProcessService.updateById(approvalProcess);
return toAjax(updateById1 && updateById);
} else {
throw new RuntimeException("处理结果参数不正确");
}
}
public Boolean addLog(ApprovalProcess approvalProcess, List<Long> userIds) {
gwglLog gwglLog = new gwglLog();
gwglLog.setUserId(approvalProcess.getSubmitterId());
gwglLog.setUserName(approvalProcess.getSubmitterName());
gwglLog.setCheckState(0);
gwglLog.setUuid(approvalProcess.getUuid());
gwglLog.setApprovalStatusH(approvalProcess.getApprovalStatusH());
gwglLog.setCreateTime(System.currentTimeMillis() / 1000L);
SysUser user = new SysUser();
StringBuilder name = new StringBuilder();
StringBuilder ids = new StringBuilder();
for (Long userId : userIds) {
SysUser user1 = sysUserService.selectUserById(userId);
if (name.length() > 0) {
name.append(",");
}
name.append(user1.getNickName());
if (ids.length() > 0) {
ids.append(",");
}
ids.append(user1.getUserId());
}
gwglLog.setCheckUserId(ids.toString());
gwglLog.setChecker(name.toString());
if (user.getDept() != null) {
gwglLog.setCheckDeptName(user.getDept().getDeptName());
}
gwglLog.setCheckDeptId(user.getDeptId());
return gwglLogService.save(gwglLog);
}
}