无关风月
10 小时以前 d38daf71ef496cd5788c955192ec5ed003fc6d8c
审批模块接口代码
1个文件已删除
18个文件已修改
38个文件已添加
2722 ■■■■■ 已修改文件
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationsController.java 510 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalFlowAuditController.java 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalFlowNodeController.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalTodoController.java 380 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaNotificationController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/AddAdvertisementDTO.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/AddBusinessTripDTO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/AddContactDTO.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/AddContractDTO.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/AddLeaveDestroyDTO.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/AddMoneyDTO.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/AddOutDTO.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/AddPaymentDTO.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/AddReimbursementDTO.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/AuditDTO.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/SetApprovalDTO.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/emums/ApprovalFlowNodeEnum.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalTodoMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/OaApproval.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationAttendance.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationDispose.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationReimbursement.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationReimbursementItem.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplications.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalTodo.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/ApprovalTodoListQuery.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalTodoService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalTodoServiceImpl.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/utils/ApprovalTypeEnum.java 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/AdvertisementDetailVO.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/ApprovalFlowNodeListVO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/ApprovalTodoVO.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/BackDetailVO.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/BackListVO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/BorrowDetailVO.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/BorrowListVO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/BusinessTripDetailVO.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/ChangeDetailVO.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/ChangeListVO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/ContactDetailVO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/ContractDetailVO.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/DisposeDetailVO.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/DisposeListVO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/GrabDetailVO.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/GrabListVO.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/LeaveDestroyDetailVO.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/LeaveDetailVO.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/MoneyDetailVO.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/OutDetailVO.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/PaymentDetailVO.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/PurchaseDetailVO.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/PurchaseListVO.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/ReimbursementDetailVO.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/StorageDetailVO.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/StorageListVO.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/OaApprovalTodoMapper.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationsController.java
@@ -6,13 +6,13 @@
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.entity.TDept;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.dto.AddLeaveDTO;
import com.ruoyi.system.dto.SetApprovalDTO;
import com.ruoyi.system.model.OaApprovalApplications;
import com.ruoyi.system.model.OaApprovalFlowNode;
import com.ruoyi.system.dto.*;
import com.ruoyi.system.emums.ApprovalFlowNodeEnum;
import com.ruoyi.system.emums.ApprovalTypeEnum;
import com.ruoyi.system.model.*;
import com.ruoyi.system.service.*;
import com.ruoyi.system.utils.ApprovalTypeEnum;
import com.ruoyi.system.utils.UUIDUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -20,11 +20,17 @@
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import oshi.driver.mac.net.NetStat;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
 * <p>
@@ -35,7 +41,7 @@
 * @since 2025-09-15
 */
@RestController
@Api("审批-发起审批")
@Api(tags ="审批-发起审批")
@RequestMapping("/oa-approval-applications")
public class OaApprovalApplicationsController {
    @Resource
@@ -45,20 +51,38 @@
    @Resource
    private OaApprovalApplicationsService approvalApplicationsService;
    @Resource
    private OaApprovalApplicationAdvertisementService approvalApplicationAdvertisementService;
    @Resource
    private OaApprovalApplicationContactService approvalApplicationContactService;
    @Resource
    private OaApprovalApplicationPaymentService approvalApplicationPaymentService;
    @Resource
    private OaApprovalApplicationContractService approvalApplicationContractService;
    @Resource
    private OaApprovalApplicationMoneyService approvalApplicationMoneyService;
    @Resource
    private OaApprovalApplicationReimbursementService approvalApplicationReimbursementService;
    @Resource
    private OaApprovalApplicationReimbursementItemService approvalApplicationReimbursementItemService;
    @Resource
    private OaApprovalFlowNodeService approvalFlowNodeService;
    @Resource
    private ISysUserService sysUserService;
    @Resource
    private OaApprovalApplicationAttendanceService approvalApplicationAttendanceService;
    @Resource
    private TDeptService deptService;
    @Resource
    private OaApprovalTodoService oaApprovalTodoService;
    @Log(title = "审批-发起请假", businessType = BusinessType.INSERT)
    @ApiOperation(value = "发起请假")
    @PostMapping(value = "/setApproval")
    public R setDept(@RequestBody AddLeaveDTO dto) {
    @PostMapping(value = "/addLeave")
    public R addLeave(@RequestBody AddLeaveDTO dto) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String code = "qj"+sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
        String code = "Leave-"+sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
        OaApprovalApplications oaApprovalApplications = new OaApprovalApplications();
        oaApprovalApplications.setApplicationCode(code);
        oaApprovalApplications.setApprovalId(ApprovalTypeEnum.LEAVE_APPLICATION.getId());
        oaApprovalApplications.setApprovalId(ApprovalTypeEnum.LEAVE.getCode());
        oaApprovalApplications.setApplicantUserId(tokenService.getLoginUser().getUserId().intValue());
        SysUser sysUser = sysUserService.selectUserById(tokenService.getLoginUser().getUserId());
        TDept dept = deptService.getById(sysUser.getDeptId());
@@ -69,8 +93,472 @@
        oaApprovalApplications.setApplicationReason(dto.getApplicationReason());
        oaApprovalApplications.setApprovalStatus(1);
        oaApprovalApplications.setAttachmentUrl(dto.getAttachmentUrl());
//        oaApprovalApplications.setCurrentFlowNodeId();
        OaApprovalFlowNode approvalFlowNode = approvalFlowNodeService.lambdaQuery()
                .eq(OaApprovalFlowNode::getApprovalId, ApprovalTypeEnum.LEAVE.getCode())
                .orderByAsc(OaApprovalFlowNode::getSortOrder)
                .eq(OaApprovalFlowNode::getStatus,1)
                .last("limit 1")
                .one();
        oaApprovalApplications.setCurrentFlowNodeId(approvalFlowNode.getId());
        List<Integer> approvalIds = approvalApplicationsService.lambdaQuery()
                .in(OaApprovalApplications::getApprovalStatus, Arrays.asList(1,2))
                .eq(OaApprovalApplications::getApprovalId, ApprovalTypeEnum.LEAVE.getCode())
                .eq(OaApprovalApplications::getApplicantUserId, sysUser.getUserId()).list()
                .stream().map(OaApprovalApplications::getId).collect(Collectors.toList());
        if (!approvalIds.isEmpty()){
            // 根据请假时间 查询请假申请记录
            List<OaApprovalApplicationAttendance> approvalApplicationAttendances = approvalApplicationAttendanceService.lambdaQuery()
                    .in(OaApprovalApplicationAttendance::getApprovalApplicationId,approvalIds)
                    .ge(OaApprovalApplicationAttendance::getStartTime, dto.getStartTime())
                    .le(OaApprovalApplicationAttendance::getEndTime, dto.getEndTime())
                    .eq(OaApprovalApplicationAttendance::getIsLeave, 1).list();
            if (!approvalApplicationAttendances.isEmpty()){
                boolean hasOverlap = approvalApplicationAttendanceService.lambdaQuery()
                        .eq(OaApprovalApplicationAttendance::getIsLeave, true)
                        .in(OaApprovalApplicationAttendance::getApprovalApplicationId, approvalIds)
                        .apply("(start_time < {0} AND end_time > {1})", dto.getEndTime(), dto.getStartTime())
                        .exists();
                if (hasOverlap) {
                    return R.fail("请假时间与已有请假记录重叠,请重新选择时间");
                }
            }
        }
        approvalApplicationsService.save(oaApprovalApplications);
        // 生成明细记录
        OaApprovalApplicationAttendance oaApprovalApplicationAttendance = new OaApprovalApplicationAttendance();
        oaApprovalApplicationAttendance.setApprovalApplicationId(oaApprovalApplications.getId());
        oaApprovalApplicationAttendance.setStartTime(dto.getStartTime());
        oaApprovalApplicationAttendance.setEndTime(dto.getEndTime());
        oaApprovalApplicationAttendance.setDuration(dto.getDuration());
        oaApprovalApplicationAttendance.setIsLeave(true);
        approvalApplicationAttendanceService.save(oaApprovalApplicationAttendance);
        // 根据节点类型 生成代办
        oaApprovalTodoService.createApprovalTodos(oaApprovalApplications.getId(), code, approvalFlowNode,
                Integer.valueOf(sysUser.getDeptId()));
        return R.ok();
    }
    @Log(title = "审批-发起外出申请", businessType = BusinessType.INSERT)
    @ApiOperation(value = "发起外出申请")
    @PostMapping(value = "/addOut")
    public R addOut(@RequestBody AddOutDTO dto) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String code = "Out-"+sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
        OaApprovalApplications oaApprovalApplications = new OaApprovalApplications();
        oaApprovalApplications.setApplicationCode(code);
        oaApprovalApplications.setApprovalId(ApprovalTypeEnum.OUT.getCode());
        oaApprovalApplications.setApplicantUserId(tokenService.getLoginUser().getUserId().intValue());
        SysUser sysUser = sysUserService.selectUserById(tokenService.getLoginUser().getUserId());
        TDept dept = deptService.getById(sysUser.getDeptId());
        oaApprovalApplications.setApplicantName(sysUser.getNickName());
        oaApprovalApplications.setDeptId(Integer.valueOf(sysUser.getDeptId()));
        oaApprovalApplications.setDeptName(dept.getDeptName());
        oaApprovalApplications.setApplicationDate(LocalDate.now());
        oaApprovalApplications.setApplicationReason(dto.getApplicationReason());
        oaApprovalApplications.setApprovalStatus(1);
        oaApprovalApplications.setAttachmentUrl(dto.getAttachmentUrl());
        OaApprovalFlowNode approvalFlowNode = approvalFlowNodeService.lambdaQuery()
                .eq(OaApprovalFlowNode::getApprovalId, ApprovalTypeEnum.OUT.getCode())
                .orderByAsc(OaApprovalFlowNode::getSortOrder)
                .eq(OaApprovalFlowNode::getStatus,1)
                .last("limit 1")
                .one();
        oaApprovalApplications.setCurrentFlowNodeId(approvalFlowNode.getId());
        List<Integer> approvalIds = approvalApplicationsService.lambdaQuery()
                .in(OaApprovalApplications::getApprovalStatus, Arrays.asList(1,2))
                .eq(OaApprovalApplications::getApprovalId, ApprovalTypeEnum.OUT.getCode())
                .eq(OaApprovalApplications::getApplicantUserId, sysUser.getUserId()).list()
                .stream().map(OaApprovalApplications::getId).collect(Collectors.toList());
        if (!approvalIds.isEmpty()){
            // 根据请假时间 查询请假申请记录
            List<OaApprovalApplicationAttendance> approvalApplicationAttendances = approvalApplicationAttendanceService.lambdaQuery()
                    .in(OaApprovalApplicationAttendance::getApprovalApplicationId,approvalIds)
                    .ge(OaApprovalApplicationAttendance::getStartTime, dto.getStartTime())
                    .le(OaApprovalApplicationAttendance::getEndTime, dto.getEndTime())
                    .list();
            if (!approvalApplicationAttendances.isEmpty()){
                boolean hasOverlap = approvalApplicationAttendanceService.lambdaQuery()
                        .in(OaApprovalApplicationAttendance::getApprovalApplicationId, approvalIds)
                        .apply("(start_time < {0} AND end_time > {1})", dto.getEndTime(), dto.getStartTime())
                        .exists();
                if (hasOverlap) {
                    return R.fail("外出时间与已有外出记录重叠,请重新选择时间");
                }
            }
        }
        approvalApplicationsService.save(oaApprovalApplications);
        // 生成明细记录
        OaApprovalApplicationAttendance oaApprovalApplicationAttendance = new OaApprovalApplicationAttendance();
        oaApprovalApplicationAttendance.setApprovalApplicationId(oaApprovalApplications.getId());
        oaApprovalApplicationAttendance.setStartTime(dto.getStartTime());
        oaApprovalApplicationAttendance.setEndTime(dto.getEndTime());
        oaApprovalApplicationAttendance.setDuration(dto.getDuration());
        oaApprovalApplicationAttendance.setAddress(dto.getAddress());
        approvalApplicationAttendanceService.save(oaApprovalApplicationAttendance);
        // 根据节点类型 生成代办
        oaApprovalTodoService.createApprovalTodos(oaApprovalApplications.getId(), code, approvalFlowNode,
                Integer.valueOf(sysUser.getDeptId()));
        return R.ok();
    }
    @Log(title = "审批-发起出差申请", businessType = BusinessType.INSERT)
    @ApiOperation(value = "发起出差申请")
    @PostMapping(value = "/addBusinessTrip")
    public R addBusinessTrip(@RequestBody AddBusinessTripDTO dto) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String code = "BusinessTrip-"+sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
        OaApprovalApplications oaApprovalApplications = new OaApprovalApplications();
        oaApprovalApplications.setApplicationCode(code);
        oaApprovalApplications.setApprovalId(ApprovalTypeEnum.BUSINESS_TRIP.getCode());
        oaApprovalApplications.setApplicantUserId(tokenService.getLoginUser().getUserId().intValue());
        SysUser sysUser = sysUserService.selectUserById(tokenService.getLoginUser().getUserId());
        TDept dept = deptService.getById(sysUser.getDeptId());
        oaApprovalApplications.setApplicantName(sysUser.getNickName());
        oaApprovalApplications.setDeptId(Integer.valueOf(sysUser.getDeptId()));
        oaApprovalApplications.setDeptName(dept.getDeptName());
        oaApprovalApplications.setApplicationDate(LocalDate.now());
        oaApprovalApplications.setApplicationReason(dto.getApplicationReason());
        oaApprovalApplications.setApprovalStatus(1);
        oaApprovalApplications.setAttachmentUrl(dto.getAttachmentUrl());
        OaApprovalFlowNode approvalFlowNode = approvalFlowNodeService.lambdaQuery()
                .eq(OaApprovalFlowNode::getApprovalId, ApprovalTypeEnum.BUSINESS_TRIP.getCode())
                .orderByAsc(OaApprovalFlowNode::getSortOrder)
                .eq(OaApprovalFlowNode::getStatus,1)
                .last("limit 1")
                .one();
        oaApprovalApplications.setCurrentFlowNodeId(approvalFlowNode.getId());
        List<Integer> approvalIds = approvalApplicationsService.lambdaQuery()
                .in(OaApprovalApplications::getApprovalStatus, Arrays.asList(1,2))
                .eq(OaApprovalApplications::getApprovalId, ApprovalTypeEnum.BUSINESS_TRIP.getCode())
                .eq(OaApprovalApplications::getApplicantUserId, sysUser.getUserId()).list()
                .stream().map(OaApprovalApplications::getId).collect(Collectors.toList());
        if (!approvalIds.isEmpty()){
            // 根据请假时间 查询请假申请记录
            List<OaApprovalApplicationAttendance> approvalApplicationAttendances = approvalApplicationAttendanceService.lambdaQuery()
                    .in(OaApprovalApplicationAttendance::getApprovalApplicationId,approvalIds)
                    .ge(OaApprovalApplicationAttendance::getStartTime, dto.getStartTime())
                    .le(OaApprovalApplicationAttendance::getEndTime, dto.getEndTime())
                    .list();
            if (!approvalApplicationAttendances.isEmpty()){
                boolean hasOverlap = approvalApplicationAttendanceService.lambdaQuery()
                        .in(OaApprovalApplicationAttendance::getApprovalApplicationId, approvalIds)
                        .apply("(start_time < {0} AND end_time > {1})", dto.getEndTime(), dto.getStartTime())
                        .exists();
                if (hasOverlap) {
                    return R.fail("外出时间与已有外出记录重叠,请重新选择时间");
                }
            }
        }
        approvalApplicationsService.save(oaApprovalApplications);
        // 生成明细记录
        OaApprovalApplicationAttendance oaApprovalApplicationAttendance = new OaApprovalApplicationAttendance();
        oaApprovalApplicationAttendance.setApprovalApplicationId(oaApprovalApplications.getId());
        oaApprovalApplicationAttendance.setStartTime(dto.getStartTime());
        oaApprovalApplicationAttendance.setEndTime(dto.getEndTime());
        oaApprovalApplicationAttendance.setDuration(dto.getDuration());
        oaApprovalApplicationAttendance.setAddress(dto.getAddress());
        oaApprovalApplicationAttendance.setProjectName(dto.getProjectName());
        approvalApplicationAttendanceService.save(oaApprovalApplicationAttendance);
        // 根据节点类型 生成代办
        oaApprovalTodoService.createApprovalTodos(oaApprovalApplications.getId(), code, approvalFlowNode,
                Integer.valueOf(sysUser.getDeptId()));
        return R.ok();
    }
    @Log(title = "审批-发起销假申请", businessType = BusinessType.INSERT)
    @ApiOperation(value = "发起销假申请")
    @PostMapping(value = "/addLeaveDestroy")
    public R addLeaveDestroy(@RequestBody AddLeaveDestroyDTO dto) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String code = "LeaveDestroy-"+sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
        OaApprovalApplications oaApprovalApplications = new OaApprovalApplications();
        oaApprovalApplications.setApplicationCode(code);
        oaApprovalApplications.setApprovalId(ApprovalTypeEnum.LEAVE_DESTROY.getCode());
        oaApprovalApplications.setApplicantUserId(tokenService.getLoginUser().getUserId().intValue());
        SysUser sysUser = sysUserService.selectUserById(tokenService.getLoginUser().getUserId());
        TDept dept = deptService.getById(sysUser.getDeptId());
        oaApprovalApplications.setApplicantName(sysUser.getNickName());
        oaApprovalApplications.setDeptId(Integer.valueOf(sysUser.getDeptId()));
        oaApprovalApplications.setDeptName(dept.getDeptName());
        oaApprovalApplications.setApplicationDate(LocalDate.now());
        oaApprovalApplications.setApplicationReason(dto.getApplicationReason());
        oaApprovalApplications.setApprovalStatus(1);
        oaApprovalApplications.setAttachmentUrl(dto.getAttachmentUrl());
        OaApprovalFlowNode approvalFlowNode = approvalFlowNodeService.lambdaQuery()
                .eq(OaApprovalFlowNode::getApprovalId, ApprovalTypeEnum.LEAVE_DESTROY.getCode())
                .orderByAsc(OaApprovalFlowNode::getSortOrder)
                .eq(OaApprovalFlowNode::getStatus,1)
                .last("limit 1")
                .one();
        oaApprovalApplications.setCurrentFlowNodeId(approvalFlowNode.getId());
        // 生成明细记录
        OaApprovalApplicationAttendance oaApprovalApplicationAttendance = new OaApprovalApplicationAttendance();
        oaApprovalApplicationAttendance.setStartTime(dto.getStartTime());
        oaApprovalApplicationAttendance.setEndTime(dto.getEndTime());
        oaApprovalApplicationAttendance.setDuration(dto.getDuration());
        List<Integer> approvalIds = approvalApplicationsService.lambdaQuery()
                .eq(OaApprovalApplications::getApprovalStatus, 2)
                .eq(OaApprovalApplications::getApprovalId, ApprovalTypeEnum.LEAVE.getCode())
                .eq(OaApprovalApplications::getApplicantUserId, sysUser.getUserId()).list()
                .stream().map(OaApprovalApplications::getId).collect(Collectors.toList());
        if (approvalIds.isEmpty()){
            return R.fail("销假失败,销假日期范围内未查询到请假申请");
        }
        // 根据请假时间 查询请假申请记录
        OaApprovalApplicationAttendance approvalApplicationAttendance = approvalApplicationAttendanceService.lambdaQuery()
                .in(OaApprovalApplicationAttendance::getApprovalApplicationId,approvalIds)
                .ge(OaApprovalApplicationAttendance::getStartTime, dto.getStartTime())
                .le(OaApprovalApplicationAttendance::getEndTime, dto.getEndTime())
                .eq(OaApprovalApplicationAttendance::getIsLeave, 1)
                .orderByDesc(OaApprovalApplicationAttendance::getId)
                .last("limit 1").one();
        if (approvalApplicationAttendance==null){
            return R.fail("销假失败,销假日期范围内未查询到请假申请");
        }
        OaApprovalApplications approvalApplications = approvalApplicationsService.getById(approvalApplicationAttendance.getApprovalApplicationId());
        if (approvalApplications.getApprovalStatus()!=2){
            return R.fail("销假失败,请假申请未通过");
        }
        approvalApplicationsService.save(oaApprovalApplications);
        oaApprovalApplicationAttendance.setApprovalApplicationId(oaApprovalApplications.getId());
        oaApprovalApplicationAttendance.setLeaveApprovalApplicationId(approvalApplicationAttendance.getApprovalApplicationId());
        approvalApplicationAttendanceService.save(oaApprovalApplicationAttendance);
        // 根据节点类型 生成代办
        oaApprovalTodoService.createApprovalTodos(oaApprovalApplications.getId(), code, approvalFlowNode,
                Integer.valueOf(sysUser.getDeptId()));
        return R.ok();
    }
    @Log(title = "审批-发起报销申请", businessType = BusinessType.INSERT)
    @ApiOperation(value = "发起报销申请")
    @PostMapping(value = "/addReimbursement")
    public R addReimbursement(@RequestBody AddReimbursementDTO dto) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String code = "Reimbursement-"+sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
        OaApprovalApplications oaApprovalApplications = new OaApprovalApplications();
        oaApprovalApplications.setApplicationCode(code);
        oaApprovalApplications.setApprovalId(ApprovalTypeEnum.REIMBURSEMENT.getCode());
        oaApprovalApplications.setApplicantUserId(tokenService.getLoginUser().getUserId().intValue());
        SysUser sysUser = sysUserService.selectUserById(tokenService.getLoginUser().getUserId());
        TDept dept = deptService.getById(sysUser.getDeptId());
        oaApprovalApplications.setApplicantName(sysUser.getNickName());
        oaApprovalApplications.setDeptId(Integer.valueOf(sysUser.getDeptId()));
        oaApprovalApplications.setDeptName(dept.getDeptName());
        oaApprovalApplications.setApplicationDate(LocalDate.now());
        oaApprovalApplications.setApprovalStatus(1);
        OaApprovalFlowNode approvalFlowNode = approvalFlowNodeService.lambdaQuery()
                .eq(OaApprovalFlowNode::getApprovalId, ApprovalTypeEnum.REIMBURSEMENT.getCode())
                .orderByAsc(OaApprovalFlowNode::getSortOrder)
                .eq(OaApprovalFlowNode::getStatus,1)
                .last("limit 1")
                .one();
        oaApprovalApplications.setCurrentFlowNodeId(approvalFlowNode.getId());
        approvalApplicationsService.save(oaApprovalApplications);
        OaApprovalApplicationReimbursement oaApprovalApplicationReimbursement = new OaApprovalApplicationReimbursement();
        oaApprovalApplicationReimbursement.setApprovalApplicationId(oaApprovalApplications.getId());
        oaApprovalApplicationReimbursement.setType(dto.getType());
        approvalApplicationReimbursementService.save(oaApprovalApplicationReimbursement);
        BigDecimal total = new BigDecimal(0);
        List<OaApprovalApplicationReimbursementItem> oaApprovalApplicationReimbursementItems = new ArrayList<>();
        for (OaApprovalApplicationReimbursementItem oaApprovalApplicationReimbursementItem : oaApprovalApplicationReimbursementItems) {
            oaApprovalApplicationReimbursementItem.setApprovalApplicationId(oaApprovalApplicationReimbursement.getId());
            total = total.add(oaApprovalApplicationReimbursementItem.getAmount());
        }
        oaApprovalApplicationReimbursement.setReimbursementAmount(total);
        approvalApplicationReimbursementService.updateById(oaApprovalApplicationReimbursement);
        approvalApplicationReimbursementItemService.saveBatch(oaApprovalApplicationReimbursementItems);
        // 根据节点类型 生成代办
        oaApprovalTodoService.createApprovalTodos(oaApprovalApplications.getId(), code, approvalFlowNode,
                Integer.valueOf(sysUser.getDeptId()));
        return R.ok();
    }
    @Log(title = "审批-发起款项申请", businessType = BusinessType.INSERT)
    @ApiOperation(value = "发起款项申请")
    @PostMapping(value = "/addMoney")
    public R addMoney(@RequestBody AddMoneyDTO dto) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String code = "Money-"+sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
        OaApprovalApplications oaApprovalApplications = new OaApprovalApplications();
        oaApprovalApplications.setApplicationCode(code);
        oaApprovalApplications.setApprovalId(ApprovalTypeEnum.MONEY.getCode());
        oaApprovalApplications.setApplicantUserId(tokenService.getLoginUser().getUserId().intValue());
        SysUser sysUser = sysUserService.selectUserById(tokenService.getLoginUser().getUserId());
        TDept dept = deptService.getById(sysUser.getDeptId());
        oaApprovalApplications.setApplicantName(sysUser.getNickName());
        oaApprovalApplications.setDeptId(Integer.valueOf(sysUser.getDeptId()));
        oaApprovalApplications.setDeptName(dept.getDeptName());
        oaApprovalApplications.setApplicationDate(LocalDate.now());
        oaApprovalApplications.setApprovalStatus(1);
        OaApprovalFlowNode approvalFlowNode = approvalFlowNodeService.lambdaQuery()
                .eq(OaApprovalFlowNode::getApprovalId, ApprovalTypeEnum.MONEY.getCode())
                .orderByAsc(OaApprovalFlowNode::getSortOrder)
                .eq(OaApprovalFlowNode::getStatus,1)
                .last("limit 1")
                .one();
        oaApprovalApplications.setCurrentFlowNodeId(approvalFlowNode.getId());
        approvalApplicationsService.save(oaApprovalApplications);
        OaApprovalApplicationMoney oaApprovalApplicationMoney = new OaApprovalApplicationMoney();
        BeanUtils.copyProperties(dto, oaApprovalApplicationMoney);
        oaApprovalApplicationMoney.setApprovalApplicationId(oaApprovalApplications.getId());
        approvalApplicationMoneyService.save(oaApprovalApplicationMoney);
        // 根据节点类型 生成代办
        oaApprovalTodoService.createApprovalTodos(oaApprovalApplications.getId(), code, approvalFlowNode,
                Integer.valueOf(sysUser.getDeptId()));
        return R.ok();
    }
    @Log(title = "审批-发起合同文件申请", businessType = BusinessType.INSERT)
    @ApiOperation(value = "发起合同文件申请")
    @PostMapping(value = "/addContract")
    public R addContract(@RequestBody AddContractDTO dto) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String code = "Contract-"+sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
        OaApprovalApplications oaApprovalApplications = new OaApprovalApplications();
        oaApprovalApplications.setApplicationCode(code);
        oaApprovalApplications.setApprovalId(ApprovalTypeEnum.CONTRACT.getCode());
        oaApprovalApplications.setApplicantUserId(tokenService.getLoginUser().getUserId().intValue());
        SysUser sysUser = sysUserService.selectUserById(tokenService.getLoginUser().getUserId());
        TDept dept = deptService.getById(sysUser.getDeptId());
        oaApprovalApplications.setApplicantName(sysUser.getNickName());
        oaApprovalApplications.setDeptId(Integer.valueOf(sysUser.getDeptId()));
        oaApprovalApplications.setDeptName(dept.getDeptName());
        oaApprovalApplications.setApplicationDate(LocalDate.now());
        oaApprovalApplications.setApplicationReason(dto.getApplicationReason());
        oaApprovalApplications.setAttachmentUrl(dto.getAttachmentUrl());
        oaApprovalApplications.setApprovalStatus(1);
        OaApprovalFlowNode approvalFlowNode = approvalFlowNodeService.lambdaQuery()
                .eq(OaApprovalFlowNode::getApprovalId, ApprovalTypeEnum.CONTRACT.getCode())
                .orderByAsc(OaApprovalFlowNode::getSortOrder)
                .eq(OaApprovalFlowNode::getStatus,1)
                .last("limit 1")
                .one();
        oaApprovalApplications.setCurrentFlowNodeId(approvalFlowNode.getId());
        approvalApplicationsService.save(oaApprovalApplications);
        OaApprovalApplicationContract oaApprovalApplicationContract = new OaApprovalApplicationContract();
        oaApprovalApplicationContract.setContractUrl(dto.getContractUrl());
        oaApprovalApplicationContract.setApprovalApplicationId(oaApprovalApplications.getId());
        approvalApplicationContractService.save(oaApprovalApplicationContract);
        // 根据节点类型 生成代办
        oaApprovalTodoService.createApprovalTodos(oaApprovalApplications.getId(), code, approvalFlowNode,
                Integer.valueOf(sysUser.getDeptId()));
        return R.ok();
    }
    @Log(title = "审批-发起进度款支付申请", businessType = BusinessType.INSERT)
    @ApiOperation(value = "发起进度款支付申请")
    @PostMapping(value = "/addPayment")
    public R addPayment(@RequestBody AddPaymentDTO dto) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String code = "Payment-"+sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
        OaApprovalApplications oaApprovalApplications = new OaApprovalApplications();
        oaApprovalApplications.setApplicationCode(code);
        oaApprovalApplications.setApprovalId(ApprovalTypeEnum.PAYMENT.getCode());
        oaApprovalApplications.setApplicantUserId(tokenService.getLoginUser().getUserId().intValue());
        SysUser sysUser = sysUserService.selectUserById(tokenService.getLoginUser().getUserId());
        TDept dept = deptService.getById(sysUser.getDeptId());
        oaApprovalApplications.setApplicantName(sysUser.getNickName());
        oaApprovalApplications.setDeptId(Integer.valueOf(sysUser.getDeptId()));
        oaApprovalApplications.setDeptName(dept.getDeptName());
        oaApprovalApplications.setApplicationDate(LocalDate.now());
        oaApprovalApplications.setApplicationReason(dto.getApplicationReason());
        oaApprovalApplications.setAttachmentUrl(dto.getAttachmentUrl());
        oaApprovalApplications.setApprovalStatus(1);
        OaApprovalFlowNode approvalFlowNode = approvalFlowNodeService.lambdaQuery()
                .eq(OaApprovalFlowNode::getApprovalId, ApprovalTypeEnum.PAYMENT.getCode())
                .orderByAsc(OaApprovalFlowNode::getSortOrder)
                .eq(OaApprovalFlowNode::getStatus,1)
                .last("limit 1")
                .one();
        oaApprovalApplications.setCurrentFlowNodeId(approvalFlowNode.getId());
        approvalApplicationsService.save(oaApprovalApplications);
        OaApprovalApplicationPayment oaApprovalApplicationPayment = new OaApprovalApplicationPayment();
        oaApprovalApplicationPayment.setApprovalApplicationId(oaApprovalApplications.getId());
        oaApprovalApplicationPayment.setProjectId(dto.getProjectId());
        oaApprovalApplicationPayment.setContractAmount(dto.getContractAmount());
        oaApprovalApplicationPayment.setApplyAmount(dto.getApplyAmount());
        approvalApplicationPaymentService.save(oaApprovalApplicationPayment);
        // 根据节点类型 生成代办
        oaApprovalTodoService.createApprovalTodos(oaApprovalApplications.getId(), code, approvalFlowNode,
                Integer.valueOf(sysUser.getDeptId()));
        return R.ok();
    }
    @Log(title = "审批-发起内部联系单申请", businessType = BusinessType.INSERT)
    @ApiOperation(value = "发起内部联系单申请")
    @PostMapping(value = "/addContact")
    public R addContact(@RequestBody AddContactDTO dto) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String code = "Contact-"+sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
        OaApprovalApplications oaApprovalApplications = new OaApprovalApplications();
        oaApprovalApplications.setApplicationCode(code);
        oaApprovalApplications.setApprovalId(ApprovalTypeEnum.CONTACT.getCode());
        oaApprovalApplications.setApplicantUserId(tokenService.getLoginUser().getUserId().intValue());
        SysUser sysUser = sysUserService.selectUserById(tokenService.getLoginUser().getUserId());
        TDept dept = deptService.getById(sysUser.getDeptId());
        oaApprovalApplications.setApplicantName(sysUser.getNickName());
        oaApprovalApplications.setDeptId(Integer.valueOf(sysUser.getDeptId()));
        oaApprovalApplications.setDeptName(dept.getDeptName());
        oaApprovalApplications.setApplicationDate(LocalDate.now());
        oaApprovalApplications.setApplicationReason(dto.getApplicationReason());
        oaApprovalApplications.setApprovalStatus(1);
        OaApprovalFlowNode approvalFlowNode = approvalFlowNodeService.lambdaQuery()
                .eq(OaApprovalFlowNode::getApprovalId, ApprovalTypeEnum.CONTACT.getCode())
                .orderByAsc(OaApprovalFlowNode::getSortOrder)
                .eq(OaApprovalFlowNode::getStatus,1)
                .last("limit 1")
                .one();
        oaApprovalApplications.setCurrentFlowNodeId(approvalFlowNode.getId());
        approvalApplicationsService.save(oaApprovalApplications);
        OaApprovalApplicationContact oaApprovalApplicationContact = new OaApprovalApplicationContact();
        oaApprovalApplicationContact.setApprovalApplicationId(oaApprovalApplications.getId());
        oaApprovalApplicationContact.setDescription(dto.getDescription());
        approvalApplicationContactService.save(oaApprovalApplicationContact);
        // 根据节点类型 生成代办
        oaApprovalTodoService.createApprovalTodos(oaApprovalApplications.getId(), code, approvalFlowNode,
                Integer.valueOf(sysUser.getDeptId()));
        return R.ok();
    }
    @Log(title = "审批-发起广告制作申请", businessType = BusinessType.INSERT)
    @ApiOperation(value = "发起广告制作申请")
    @PostMapping(value = "/addAdvertisement")
    public R addAdvertisement(@RequestBody AddAdvertisementDTO dto) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String code = "Advertisement-"+sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
        OaApprovalApplications oaApprovalApplications = new OaApprovalApplications();
        oaApprovalApplications.setApplicationCode(code);
        oaApprovalApplications.setApprovalId(ApprovalTypeEnum.ADVERTISEMENT.getCode());
        oaApprovalApplications.setApplicantUserId(tokenService.getLoginUser().getUserId().intValue());
        SysUser sysUser = sysUserService.selectUserById(tokenService.getLoginUser().getUserId());
        TDept dept = deptService.getById(sysUser.getDeptId());
        oaApprovalApplications.setApplicantName(sysUser.getNickName());
        oaApprovalApplications.setDeptId(Integer.valueOf(sysUser.getDeptId()));
        oaApprovalApplications.setDeptName(dept.getDeptName());
        oaApprovalApplications.setApplicationDate(LocalDate.now());
        oaApprovalApplications.setAttachmentUrl(dto.getAttachmentUrl());
        oaApprovalApplications.setApplicationReason(dto.getApplicationReason());
        oaApprovalApplications.setApprovalStatus(1);
        OaApprovalFlowNode approvalFlowNode = approvalFlowNodeService.lambdaQuery()
                .eq(OaApprovalFlowNode::getApprovalId, ApprovalTypeEnum.ADVERTISEMENT.getCode())
                .orderByAsc(OaApprovalFlowNode::getSortOrder)
                .eq(OaApprovalFlowNode::getStatus,1)
                .last("limit 1")
                .one();
        oaApprovalApplications.setCurrentFlowNodeId(approvalFlowNode.getId());
        approvalApplicationsService.save(oaApprovalApplications);
        OaApprovalApplicationAdvertisement oaApprovalApplicationAdvertisement = new OaApprovalApplicationAdvertisement();
        oaApprovalApplicationAdvertisement.setApprovalApplicationId(oaApprovalApplications.getId());
        oaApprovalApplicationAdvertisement.setTitle(dto.getTitle());
        oaApprovalApplicationAdvertisement.setContent(dto.getContent());
        oaApprovalApplicationAdvertisement.setNumber(dto.getNumber());
        oaApprovalApplicationAdvertisement.setTotalAmount(dto.getTotalAmount());
        oaApprovalApplicationAdvertisement.setSpec(dto.getSpec());
        oaApprovalApplicationAdvertisement.setStatus(false);
        approvalApplicationAdvertisementService.save(oaApprovalApplicationAdvertisement);
        // 根据节点类型 生成代办
        oaApprovalTodoService.createApprovalTodos(oaApprovalApplications.getId(), code, approvalFlowNode,
                Integer.valueOf(sysUser.getDeptId()));
        return R.ok();
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalController.java
@@ -34,7 +34,7 @@
 */
@RestController
@RequestMapping("/oa-approval")
@Api("审批流程设计")
@Api(tags ="审批流程设计")
public class OaApprovalController {
    @Resource
    private OaApprovalService oaApprovalService;
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalFlowAuditController.java
@@ -1,8 +1,26 @@
package com.ruoyi.web.controller.api;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.dto.AddLeaveDTO;
import com.ruoyi.system.dto.AuditDTO;
import com.ruoyi.system.model.*;
import com.ruoyi.system.service.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
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;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
/**
 * <p>
@@ -14,7 +32,117 @@
 */
@RestController
@RequestMapping("/oa-approval-flow-audit")
@Api(tags = "通用审批接口")
public class OaApprovalFlowAuditController {
    @Resource
    private OaApprovalTodoService approvalTodoService;
    @Resource
    private OaApprovalFlowAuditService approvalFlowAuditService;
    @Resource
    private OaApprovalApplicationStorageService approvalApplicationStorageService;
    @Resource
    private OaApprovalApplicationPurchaseService approvalApplicationPurchaseService;
    @Resource
    private OaApprovalApplicationAssetItemService approvalApplicationAssetItemService;
    @Resource
    private TokenService tokenService;
    @Resource
    private OaApprovalService approvalService;
    @Resource
    private OaApprovalApplicationsService approvalApplicationsService;
    @Resource
    private OaApprovalApplicationAdvertisementService approvalApplicationAdvertisementService;
    @Resource
    private OaApprovalApplicationContactService approvalApplicationContactService;
    @Resource
    private OaApprovalApplicationPaymentService approvalApplicationPaymentService;
    @Resource
    private OaApprovalApplicationContractService approvalApplicationContractService;
    @Resource
    private OaApprovalApplicationMoneyService approvalApplicationMoneyService;
    @Resource
    private AssetMainService assetMainService;
    @Resource
    private OaApprovalApplicationReimbursementService approvalApplicationReimbursementService;
    @Resource
    private OaApprovalApplicationReimbursementItemService approvalApplicationReimbursementItemService;
    @Resource
    private OaApprovalFlowNodeService approvalFlowNodeService;
    @Resource
    private OaApprovalApplicationAssetService approvalApplicationAssetService;
    @Resource
    private ISysUserService sysUserService;
    @Resource
    private OaApprovalApplicationDisposeService approvalApplicationDisposeService;
    @Resource
    private OaApprovalApplicationChangeService approvalApplicationChangeService;
    @Resource
    private OaApprovalApplicationAttendanceService approvalApplicationAttendanceService;
    @Resource
    private TDeptService deptService;
    @Resource
    private OaApprovalTodoService oaApprovalTodoService;
    @Resource
    private OaApprovalFlowService approvalFlowService;
    @Log(title = "审批-通用审批接口", businessType = BusinessType.INSERT)
    @ApiOperation(value = "通用审批接口")
    @PostMapping(value = "/audit")
    public R addLeave(@RequestBody AuditDTO dto) {
        OaApprovalApplications approvalApplications = approvalApplicationsService.getById(dto.getApprovalApplicationId());
        Integer currentFlowNodeId = approvalApplications.getCurrentFlowNodeId();
        Long userId = tokenService.getLoginUser().getUserId();
        SysUser sysUser = sysUserService.selectUserById(userId);
        OaApprovalTodo approvalTodo = approvalTodoService.lambdaQuery().eq(OaApprovalTodo::getUserId, userId)
                .eq(OaApprovalTodo::getFlowNodeId, currentFlowNodeId)
                .eq(OaApprovalTodo::getApplicationId, approvalApplications.getId())
                .last("limit 1").one();
        approvalTodo.setStatus(1);
        approvalTodo.setHandleTime(LocalDateTime.now());
        approvalTodoService.updateById(approvalTodo);
        OaApproval approval = approvalService.getById(approvalApplications.getApprovalId());
        if (dto.getApprovalStatus()==0){
            // 中断审批流程
            approvalApplications.setApprovalStatus(3);
            approvalApplicationsService.updateById(approvalApplications);
            // 删除除当前审批人该申请单的未处理的所有待办
            approvalTodoService.remove(new LambdaQueryWrapper<OaApprovalTodo>()
                    .eq(OaApprovalTodo::getApplicationId, approvalApplications.getId())
                    .eq(OaApprovalTodo::getStatus,0));
        }
        OaApprovalFlowNode oaApprovalFlowNode = approvalFlowNodeService.getById(currentFlowNodeId);
        OaApprovalFlowAudit approvalFlowAudit = new OaApprovalFlowAudit();
        approvalFlowAudit.setApprovalApplicationId(approvalApplications.getId());
        approvalFlowAudit.setFlowNodeId(approvalApplications.getCurrentFlowNodeId());
        approvalFlowAudit.setFlowName(oaApprovalFlowNode.getFlowName());
        approvalFlowAudit.setSortOrder(oaApprovalFlowNode.getSortOrder());
        approvalFlowAudit.setUserId(userId.intValue());
        approvalFlowAudit.setUserName(sysUser.getUserName());
        approvalFlowAudit.setApprovalStatus(dto.getApprovalStatus() != 0);
        approvalFlowAudit.setApprovalTime(LocalDateTime.now());
        approvalFlowAudit.setReason(dto.getReason());
        approvalFlowAuditService.save(approvalFlowAudit);
        List<OaApprovalFlowNode> approvalFlowNodes = approvalFlowNodeService.lambdaQuery().eq(OaApprovalFlowNode::getApprovalId, approval.getId())
                .orderByDesc(OaApprovalFlowNode::getSortOrder).list();
        if (dto.getApprovalStatus()==1){
            for (OaApprovalFlowNode approvalFlowNode : approvalFlowNodes) {
                // 判断当前是否处于最后一个节点
                if(approvalApplications.getCurrentFlowNodeId().equals(approvalFlowNode.getId())){
                    // 审批通过 审批流程结束
                    approvalApplications.setApprovalStatus(2);
                    approvalApplicationsService.updateById(approvalApplications);
                    if (approval.getApprovalCategory()==1)
                    break;
                }
            }
        }
        return R.ok();
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalFlowNodeController.java
@@ -1,15 +1,18 @@
package com.ruoyi.web.controller.api;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.dto.SetApprovalDTO;
import com.ruoyi.system.dto.SetDeptDTO;
import com.ruoyi.system.model.OaApproval;
import com.ruoyi.system.model.OaApprovalFlowNode;
import com.ruoyi.system.query.ApprovalListQuery;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.service.OaApprovalFlowNodeService;
import com.ruoyi.system.service.OaApprovalService;
import com.ruoyi.system.vo.system.ApprovalFlowNodeVO;
@@ -20,6 +23,7 @@
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
/**
 * <p>
@@ -30,12 +34,14 @@
 * @since 2025-09-15
 */
@RestController
@Api("审批流程")
@Api(tags ="审批流程")
@RequestMapping("/oa-approval-flow-node")
public class OaApprovalFlowNodeController {
    @Resource
    private OaApprovalFlowNodeService oaApprovalFlowNodeService;
    @Resource
    private ISysUserService sysUserService;
    /**
     * 审批流程设计列表
     */
@@ -60,14 +66,27 @@
        oaApprovalFlowNodeService.updateById(approval);
        return R.ok();
    }
    @ApiOperation(value = "根据部门查询人员列表")
    @GetMapping(value = "/listUserByDeptId")
    public R<List<SysUser>> listUserByDeptId(Integer id ) {
        List<SysUser> users = sysUserService.selectAllList().stream()
                .filter(e -> e.getStatus().equals("0") && e.getDeptId().equals(id.toString()))
                .collect(Collectors.toList());
        return R.ok(users);
    }
    @Log(title = "审批流程-设置审批人", businessType = BusinessType.UPDATE)
    @ApiOperation(value = "设置审批人")
    @PostMapping(value = "/setApproval")
    public R setDept(@RequestBody SetApprovalDTO dto) {
        OaApprovalFlowNode approval = oaApprovalFlowNodeService.getById(dto.getId());
        approval.setApprovalIds(dto.getApprovalIds());
        oaApprovalFlowNodeService.updateById(approval);
        LambdaUpdateWrapper<OaApprovalFlowNode> oaApprovalFlowNodeLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
        oaApprovalFlowNodeLambdaUpdateWrapper.eq(OaApprovalFlowNode::getId,dto.getId());
        oaApprovalFlowNodeLambdaUpdateWrapper.set(OaApprovalFlowNode::getApprovalType,dto.getApprovalType());
        if (dto.getApprovalType() == 1){
            oaApprovalFlowNodeLambdaUpdateWrapper.set(OaApprovalFlowNode::getApprovalIds,null);
        }else{
            oaApprovalFlowNodeLambdaUpdateWrapper.set(OaApprovalFlowNode::getApprovalIds,dto.getApprovalIds());
        }
        oaApprovalFlowNodeService.update(oaApprovalFlowNodeLambdaUpdateWrapper);
        return R.ok();
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalTodoController.java
@@ -1,8 +1,34 @@
package com.ruoyi.web.controller.api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.entity.TDept;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.emums.ApprovalTypeEnum;
import com.ruoyi.system.model.*;
import com.ruoyi.system.query.ApprovalTodoListQuery;
import com.ruoyi.system.query.NotificationListQuery;
import com.ruoyi.system.service.*;
import com.ruoyi.system.vo.ApprovalFlowNodeListVO;
import com.ruoyi.system.vo.ApprovalTodoVO;
import com.ruoyi.system.vo.ContractDetailVO;
import com.ruoyi.system.vo.system.NotificationVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * <p>
@@ -13,8 +39,358 @@
 * @since 2025-09-15
 */
@RestController
@Api(tags ="待办事项")
@RequestMapping("/oa-approval-todo")
public class OaApprovalTodoController {
    @Resource
    private OaApprovalTodoService approvalTodoService;
    @Resource
    private OaApprovalFlowAuditService approvalFlowAuditService;
    @Resource
    private OaApprovalApplicationStorageService approvalApplicationStorageService;
    @Resource
    private OaApprovalApplicationPurchaseService approvalApplicationPurchaseService;
    @Resource
    private OaApprovalApplicationAssetItemService approvalApplicationAssetItemService;
    @Resource
    private TokenService tokenService;
    @Resource
    private OaApprovalService approvalService;
    @Resource
    private OaApprovalApplicationsService approvalApplicationsService;
    @Resource
    private OaApprovalApplicationAdvertisementService approvalApplicationAdvertisementService;
    @Resource
    private OaApprovalApplicationContactService approvalApplicationContactService;
    @Resource
    private OaApprovalApplicationPaymentService approvalApplicationPaymentService;
    @Resource
    private OaApprovalApplicationContractService approvalApplicationContractService;
    @Resource
    private OaApprovalApplicationMoneyService approvalApplicationMoneyService;
    @Resource
    private AssetMainService assetMainService;
    @Resource
    private OaApprovalApplicationReimbursementService approvalApplicationReimbursementService;
    @Resource
    private OaApprovalApplicationReimbursementItemService approvalApplicationReimbursementItemService;
    @Resource
    private OaApprovalFlowNodeService approvalFlowNodeService;
    @Resource
    private OaApprovalApplicationAssetService approvalApplicationAssetService;
    @Resource
    private ISysUserService sysUserService;
    @Resource
    private OaApprovalApplicationDisposeService approvalApplicationDisposeService;
    @Resource
    private OaApprovalApplicationChangeService approvalApplicationChangeService;
    @Resource
    private OaApprovalApplicationAttendanceService approvalApplicationAttendanceService;
    @Resource
    private TDeptService deptService;
    @Resource
    private OaApprovalTodoService oaApprovalTodoService;
    @Resource
    private OaApprovalFlowService  approvalFlowService;
    @ApiOperation("测试接口")
    @PostMapping("/test")
    public void test() {
        List<OaApproval> approvals = approvalService.list();
        List<OaApprovalFlow> list = approvalFlowService.list();
        List<OaApprovalFlowNode> oaApprovalFlowNodes = new ArrayList<>();
        for (OaApproval approval : approvals) {
            int i = 1;
            for (OaApprovalFlow oaApprovalFlow : list) {
                OaApprovalFlowNode oaApprovalFlowNode = new OaApprovalFlowNode();
                oaApprovalFlowNode.setApprovalId(approval.getId());
                oaApprovalFlowNode.setApprovalFlowId(oaApprovalFlow.getId());
                oaApprovalFlowNode.setFlowName(oaApprovalFlow.getFlowName());
                oaApprovalFlowNode.setSortOrder(i);
                oaApprovalFlowNode.setApprovalType(0);
                oaApprovalFlowNode.setStatus(true);
                oaApprovalFlowNode.setSignFlag(true);
                i++;
                oaApprovalFlowNodes.add(oaApprovalFlowNode);
            }
        }
        approvalFlowNodeService.saveBatch(oaApprovalFlowNodes);
    }
    @ApiOperation("待办事项列表")
    @PostMapping("/pageList")
    public R<PageInfo<ApprovalTodoVO>> pageList(@RequestBody ApprovalTodoListQuery query) {
        List<ApprovalTodoVO> resList = new ArrayList<>();
        Long userId = tokenService.getLoginUser().getUserId();
        query.setUserId(userId);
        PageInfo<ApprovalTodoVO> res = new PageInfo<>(query.getPageNum(), query.getPageSize());
        PageInfo<OaApprovalTodo> pageInfo = approvalTodoService.pageList(query);
        List<OaApprovalTodo> list = pageInfo.getRecords();
        if (list.isEmpty()){
            return R.ok(new PageInfo<>());
        }
        res.setTotal(pageInfo.getTotal());
        List<Integer> applicationIds = list.stream().map(OaApprovalTodo::getApplicationId).collect(Collectors.toList());
        Map<Integer, OaApprovalApplicationReimbursement> approvalApplicationReimbursementMap = approvalApplicationReimbursementService.lambdaQuery()
                .in(OaApprovalApplicationReimbursement::getApprovalApplicationId, applicationIds).list()
                .stream().collect(Collectors.toMap(OaApprovalApplicationReimbursement::getApprovalApplicationId, e -> e));
        Map<Integer, OaApprovalApplicationMoney> oaApprovalApplicationMoneyMap = approvalApplicationMoneyService.lambdaQuery()
                .in(OaApprovalApplicationMoney::getApprovalApplicationId, applicationIds).list()
                .stream().collect(Collectors.toMap(OaApprovalApplicationMoney::getApprovalApplicationId, e -> e));
        Map<Integer, OaApprovalApplicationPayment> approvalApplicationPaymentMap = approvalApplicationPaymentService.lambdaQuery()
                .in(OaApprovalApplicationPayment::getApprovalApplicationId, applicationIds).list()
                .stream().collect(Collectors.toMap(OaApprovalApplicationPayment::getApprovalApplicationId, e -> e));
        Map<Integer, OaApprovalApplicationStorage> applicationStorageMap = approvalApplicationStorageService.lambdaQuery()
                .in(OaApprovalApplicationStorage::getApprovalApplicationId, applicationIds).list()
                .stream().collect(Collectors.toMap(OaApprovalApplicationStorage::getApprovalApplicationId, e -> e));
        Map<Integer, OaApprovalApplicationAsset> approvalApplicationAssetMap = approvalApplicationAssetService.lambdaQuery()
                .in(OaApprovalApplicationAsset::getApprovalApplicationId, applicationIds).list()
                .stream().collect(Collectors.toMap(OaApprovalApplicationAsset::getApprovalApplicationId, e -> e));
        Map<Integer, OaApprovalApplicationDispose> approvalApplicationDisposeMap = approvalApplicationDisposeService.lambdaQuery()
                .in(OaApprovalApplicationDispose::getApprovalApplicationId, applicationIds).list()
                .stream().collect(Collectors.toMap(OaApprovalApplicationDispose::getApprovalApplicationId, e -> e));
        Map<Integer, OaApprovalApplicationChange> approvalApplicationChangeMap = approvalApplicationChangeService.lambdaQuery()
                .in(OaApprovalApplicationChange::getApprovalApplicationId, applicationIds).list()
                .stream().collect(Collectors.toMap(OaApprovalApplicationChange::getApprovalApplicationId, e -> e));
        Map<Integer, OaApprovalApplicationPurchase> approvalApplicationPurchaseMap = approvalApplicationPurchaseService.lambdaQuery()
                .in(OaApprovalApplicationPurchase::getApprovalApplicationId, applicationIds).list()
                .stream().collect(Collectors.toMap(OaApprovalApplicationPurchase::getApprovalApplicationId, e -> e));
        Map<Integer, List<OaApprovalApplicationAssetItem>> approvalApplicationAssetItemMap = approvalApplicationAssetItemService.lambdaQuery()
                .in(OaApprovalApplicationAssetItem::getApprovalApplicationId, applicationIds).list()
                .stream().collect(Collectors.groupingBy(OaApprovalApplicationAssetItem::getApprovalApplicationId));
        Map<Integer, OaApprovalApplicationAdvertisement> approvalApplicationAdvertisementMap = approvalApplicationAdvertisementService.lambdaQuery()
                .in(OaApprovalApplicationAdvertisement::getApprovalApplicationId, applicationIds).list()
                .stream().collect(Collectors.toMap(OaApprovalApplicationAdvertisement::getApprovalApplicationId, e -> e));
        Map<Integer, OaApprovalApplicationAttendance> applicationAttendanceMap = approvalApplicationAttendanceService.lambdaQuery()
                .in(OaApprovalApplicationAttendance::getApprovalApplicationId, applicationIds).list()
                .stream().collect(Collectors.toMap(OaApprovalApplicationAttendance::getApprovalApplicationId, e -> e));
        Map<Integer, AssetMain> assetMainMap = assetMainService.list().stream().collect(Collectors.toMap(AssetMain::getId, e -> e));
        Map<Integer, OaApprovalTodo> approvalTodoMap = list.stream().collect(Collectors.toMap(OaApprovalTodo::getApplicationId, e -> e));
        Map<Long, SysUser> userMap = sysUserService.selectAllList().stream().collect(Collectors.toMap(SysUser::getUserId, e -> e));
        Map<Integer, TDept> deptMap = deptService.list().stream().collect(Collectors.toMap(TDept::getId, e -> e));
        Map<Integer, OaApproval> approvalMap = approvalService.list().stream().collect(Collectors.toMap(OaApproval::getId, e -> e));
        List<OaApprovalApplications> approvalApplications = approvalApplicationsService.lambdaQuery().in(OaApprovalApplications::getId, applicationIds).list();
        for (OaApprovalApplications approvalApplication : approvalApplications) {
            ApprovalTodoVO approvalTodoVO = new ApprovalTodoVO();
            approvalTodoVO.setApprovalCategory(approvalMap.get(approvalApplication.getApprovalId()).getApprovalCategory());
            switch (approvalTodoVO.getApprovalCategory()){
                case 1:
                case 2:
                case 3:
                case 4:
                default:
                    OaApprovalApplicationAttendance oaApprovalApplicationAttendance = applicationAttendanceMap.get(approvalApplication.getId());
                    if (oaApprovalApplicationAttendance!=null){
                        approvalTodoVO.setStartTime(oaApprovalApplicationAttendance.getStartTime());
                        approvalTodoVO.setEndTime(oaApprovalApplicationAttendance.getEndTime());
                        approvalTodoVO.setDuration(oaApprovalApplicationAttendance.getDuration());
                    }
                    break;
            }
            SysUser sysUser = userMap.get(approvalApplication.getApplicantUserId().longValue());
            if (sysUser!=null){
                approvalTodoVO.setApplyUserName(sysUser.getUserName());
                TDept tDept = deptMap.get(Integer.parseInt(sysUser.getDeptId()));
                if (tDept!=null){
                    approvalTodoVO.setApplyDeptName(tDept.getDeptName());
                }
            }
            approvalTodoVO.setApplicationCode(approvalApplication.getApplicationCode());
            approvalTodoVO.setCreateTime(approvalApplication.getCreateTime());
            OaApprovalTodo oaApprovalTodo = approvalTodoMap.get(approvalApplication.getId());
            approvalTodoVO.setId(oaApprovalTodo.getId());
            approvalTodoVO.setApplicationId(approvalApplication.getId());
            switch (approvalTodoVO.getApprovalCategory()){
                case 5:
                    OaApprovalApplicationPurchase oaApprovalApplicationPurchase = approvalApplicationPurchaseMap.get(approvalApplication.getId());
                    if (oaApprovalApplicationPurchase!=null){
                        approvalTodoVO.setAmount(oaApprovalApplicationPurchase.getTotalAmount());
                    }
                    break;
                case 6:
                    OaApprovalApplicationStorage oaApprovalApplicationStorage = applicationStorageMap.get(approvalApplication.getId());
                    if (oaApprovalApplicationStorage!=null){
                        approvalTodoVO.setStorageType(oaApprovalApplicationStorage.getStorageType());
                    }
                    break;
                case 7:
                    StringBuilder temp = new StringBuilder();
                    List<OaApprovalApplicationAssetItem> oaApprovalApplicationAssetItems = approvalApplicationAssetItemMap.get(approvalApplication.getId());
                    if (oaApprovalApplicationAssetItems!=null){
                        for (OaApprovalApplicationAssetItem oaApprovalApplicationAssetItem : oaApprovalApplicationAssetItems) {
                            AssetMain assetMain = assetMainMap.get(oaApprovalApplicationAssetItem.getAssetMainId());
                            if (assetMain!=null){
                                temp.append(assetMain.getAssetName()).append(",");
                            }
                        }
                        // 去除最后一位字符
                        if (StringUtils.hasLength(temp.toString())){
                            approvalTodoVO.setAssetName(temp.substring(0, temp.length() - 1));
                        }else{
                            approvalTodoVO.setAssetName("");
                        }
                    }
                    break;
                case 8:
                    OaApprovalApplicationAsset oaApprovalApplicationAssetOut = approvalApplicationAssetMap.get(approvalApplication.getId());
                    if (oaApprovalApplicationAssetOut!=null){
                        approvalTodoVO.setOperateTime(oaApprovalApplicationAssetOut.getOperateTime());
                    }
                    break;
                case 9:
                    OaApprovalApplicationAsset oaApprovalApplicationAssetBack = approvalApplicationAssetMap.get(approvalApplication.getId());
                    if (oaApprovalApplicationAssetBack!=null){
                        approvalTodoVO.setOperateTime(oaApprovalApplicationAssetBack.getExpectReturnDate());
                    }
                    break;
                case 10:
                    OaApprovalApplicationDispose oaApprovalApplicationDispose = approvalApplicationDisposeMap.get(approvalApplication.getId());
                    if (oaApprovalApplicationDispose!=null){
                        approvalTodoVO.setDisposeType(oaApprovalApplicationDispose.getDisposeType());
                    }
                    break;
                case 11:
                    OaApprovalApplicationChange oaApprovalApplicationChange = approvalApplicationChangeMap.get(approvalApplication.getId());
                    if (oaApprovalApplicationChange!=null){
                        Integer ownershipDeptId = oaApprovalApplicationChange.getOwnershipDeptId();
                        TDept tDept = deptMap.get(ownershipDeptId);
                        if (tDept!=null){
                            approvalTodoVO.setOwnershipDeptName(tDept.getDeptName());
                        }
                    }
                    break;
                case 12:
                    OaApprovalApplicationReimbursement oaApprovalApplicationReimbursement = approvalApplicationReimbursementMap.get(approvalApplication.getId());
                    if (oaApprovalApplicationReimbursement!=null){
                        approvalTodoVO.setAmount(oaApprovalApplicationReimbursement.getReimbursementAmount());
                    }
                    break;
                case 13:
                    OaApprovalApplicationMoney oaApprovalApplicationMoney = oaApprovalApplicationMoneyMap.get(approvalApplication.getId());
                    if (oaApprovalApplicationMoney!=null){
                        approvalTodoVO.setAmount(oaApprovalApplicationMoney.getApplyAmount());
                        approvalTodoVO.setDescription(oaApprovalApplicationMoney.getDescription());
                    }
                    break;
                case 15:
                    OaApprovalApplicationPayment oaApprovalApplicationPayment = approvalApplicationPaymentMap.get(approvalApplication.getId());
                    if (oaApprovalApplicationPayment!=null){
                        approvalTodoVO.setAmount(oaApprovalApplicationPayment.getApplyAmount());
                        approvalTodoVO.setDescription(approvalApplication.getApplicationReason());
                    }
                    break;
                case 17:
                    OaApprovalApplicationAdvertisement oaApprovalApplicationAdvertisement = approvalApplicationAdvertisementMap.get(approvalApplication.getId());
                    if (oaApprovalApplicationAdvertisement!=null){
                        approvalTodoVO.setContent(oaApprovalApplicationAdvertisement.getContent());
                        approvalTodoVO.setAmount(oaApprovalApplicationAdvertisement.getTotalAmount());
                    }
                    break;
            }
            resList.add(approvalTodoVO);
        }
        res.setRecords(resList);
        return R.ok(res);
    }
    @ApiOperation(value = "合同文件审批详情")
    @GetMapping(value = "/detailContract")
    public R<ContractDetailVO> detailContract(@ApiParam("待办列表id") Integer id) {
        OaApprovalTodo approvalTodo = approvalTodoService.getById(id);
        OaApprovalApplications approvalApplications = approvalApplicationsService.getById(approvalTodo.getApplicationId());
        OaApprovalApplicationContract approvalApplicationContract = approvalApplicationContractService.lambdaQuery()
                .eq(OaApprovalApplicationContract::getApprovalApplicationId, approvalApplications.getId())
                .last("limit 1").one();
        List<OaApprovalFlowAudit> approvalFlowAudits = approvalFlowAuditService.lambdaQuery().eq(OaApprovalFlowAudit::getApprovalApplicationId, approvalApplications.getId())
                .orderByAsc(OaApprovalFlowAudit::getSortOrder)
                .list();
        ContractDetailVO res = new ContractDetailVO();
        List<OaApprovalFlowNode> approvalFlowNodes = approvalFlowNodeService.lambdaQuery()
                .eq(OaApprovalFlowNode::getApprovalId, ApprovalTypeEnum.CONTRACT.getCode())
                .orderByAsc(OaApprovalFlowNode::getSortOrder)
                .eq(OaApprovalFlowNode::getStatus, 1).list();
        List<ApprovalFlowNodeListVO> flowNodeList = getFlowNodeList(approvalApplications, res, approvalFlowAudits,approvalFlowNodes);
        res.setApprovalFlowNodeListVOS(flowNodeList);
        res.setApprovalApplicationId(approvalApplications.getId());
        res.setContractUrl(approvalApplicationContract.getContractUrl());
        res.setApplicationReason(approvalApplications.getApplicationReason());
        res.setAttachmentUrl(approvalApplications.getAttachmentUrl());
        return R.ok(res);
    }
    @ApiOperation(value = "进度款支付审批详情")
    @GetMapping(value = "/detailPayment")
    public R<ContractDetailVO> detailPayment(@ApiParam("待办列表id") Integer id) {
        OaApprovalTodo approvalTodo = approvalTodoService.getById(id);
        OaApprovalApplications approvalApplications = approvalApplicationsService.getById(approvalTodo.getApplicationId());
        OaApprovalApplicationContract approvalApplicationContract = approvalApplicationContractService.lambdaQuery()
                .eq(OaApprovalApplicationContract::getApprovalApplicationId, approvalApplications.getId())
                .last("limit 1").one();
        List<OaApprovalFlowAudit> approvalFlowAudits = approvalFlowAuditService.lambdaQuery().eq(OaApprovalFlowAudit::getApprovalApplicationId, approvalApplications.getId())
                .orderByAsc(OaApprovalFlowAudit::getSortOrder)
                .list();
        ContractDetailVO res = new ContractDetailVO();
        List<OaApprovalFlowNode> approvalFlowNodes = approvalFlowNodeService.lambdaQuery()
                .eq(OaApprovalFlowNode::getApprovalId, ApprovalTypeEnum.PAYMENT.getCode())
                .orderByAsc(OaApprovalFlowNode::getSortOrder)
                .eq(OaApprovalFlowNode::getStatus, 1).list();
        List<ApprovalFlowNodeListVO> flowNodeList = getFlowNodeList(approvalApplications, res, approvalFlowAudits,approvalFlowNodes);
        res.setApprovalFlowNodeListVOS(flowNodeList);
        res.setApprovalApplicationId(approvalApplications.getId());
        res.setContractUrl(approvalApplicationContract.getContractUrl());
        res.setApplicationReason(approvalApplications.getApplicationReason());
        res.setAttachmentUrl(approvalApplications.getAttachmentUrl());
        return R.ok(res);
    }
    private List<ApprovalFlowNodeListVO> getFlowNodeList(OaApprovalApplications approvalApplications, ContractDetailVO res, List<OaApprovalFlowAudit> approvalFlowAudits
    ,List<OaApprovalFlowNode> approvalFlowNodes) {
        List<ApprovalFlowNodeListVO> approvalFlowNodeListVOS = new ArrayList<>();
        Map<Integer, OaApprovalFlowAudit> approvalFlowAuditMap = approvalFlowAudits.stream().collect(Collectors.toMap(OaApprovalFlowAudit::getFlowNodeId, e -> e));
        ApprovalFlowNodeListVO approvalFlowNodeListVO = new ApprovalFlowNodeListVO();
        approvalFlowNodeListVO.setFlowName("发起");
        SysUser sysUser = sysUserService.selectUserById(approvalApplications.getApplicantUserId().longValue());
        if (sysUser!=null){
            approvalFlowNodeListVO.setUserName(sysUser.getUserName());
            res.setUserName(sysUser.getUserName());
            TDept dept = deptService.getById(sysUser.getDeptId());
            if (dept!=null){
                res.setDeptName(dept.getDeptName());
            }
        }
        approvalFlowNodeListVOS.add(approvalFlowNodeListVO);
        for (OaApprovalFlowNode approvalFlowNode : approvalFlowNodes) {
            ApprovalFlowNodeListVO approvalFlowNodeVO = new ApprovalFlowNodeListVO();
            OaApprovalFlowAudit approvalFlowAudit = approvalFlowAuditMap.get(approvalFlowNode.getId());
            if (approvalFlowAudit!=null){
                approvalFlowNodeVO.setFlowName(approvalFlowAudit.getFlowName());
                approvalFlowNodeVO.setUserName(approvalFlowAudit.getUserName());
                approvalFlowNodeVO.setSignPicUrl(approvalFlowAudit.getSignPicUrl());
                approvalFlowNodeVO.setApprovalStatus(approvalFlowAudit.getApprovalStatus());
            }else{
                approvalFlowNodeVO.setFlowName(approvalFlowNode.getFlowName());
            }
            approvalFlowNodeListVOS.add(approvalFlowNodeVO);
        }
        for (OaApprovalFlowAudit approvalFlowAudit : approvalFlowAudits) {
            ApprovalFlowNodeListVO approvalFlowNodeVO = new ApprovalFlowNodeListVO();
            approvalFlowNodeVO.setFlowName(approvalFlowAudit.getFlowName());
            approvalFlowNodeVO.setUserName(approvalFlowAudit.getUserName());
            approvalFlowNodeVO.setSignPicUrl(approvalFlowAudit.getSignPicUrl());
            approvalFlowNodeVO.setApprovalStatus(approvalFlowAudit.getApprovalStatus());
            approvalFlowNodeListVOS.add(approvalFlowNodeVO);
        }
        return approvalFlowNodeListVOS;
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaNotificationController.java
@@ -40,7 +40,7 @@
 * @since 2025-09-15
 */
@RestController
@Api("消息通知")
@Api(tags = "消息通知")
@RequestMapping("/oa-notification")
public class OaNotificationController {
    @Resource
@@ -120,7 +120,11 @@
                String orDefault = deptMap.getOrDefault(Integer.parseInt(deptId), "");
                deptName.append(orDefault).append(",");
            }
            notificationDetailVO.setDeptName(deptName.substring(0,deptName.length()-1));
            if (deptName.length() > 0){
                notificationDetailVO.setDeptName(deptName.substring(0,deptName.length()-1));
            }else {
                notificationDetailVO.setDeptName("");
            }
            List<NotificationDeptUserDetailVO> notificationUserVOS = new ArrayList<>();
            List<Long> userIds = notifationUsers.stream().map(e -> e.getUserId().longValue()).collect(Collectors.toList());
            if (!userIds.isEmpty()){
ruoyi-system/src/main/java/com/ruoyi/system/dto/AddAdvertisementDTO.java
New file
@@ -0,0 +1,47 @@
package com.ruoyi.system.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@ApiModel(value = "发起广告制作申请记录DTO")
public class AddAdvertisementDTO implements Serializable {
    @ApiModelProperty(value = "事项标题")
    @TableField("title")
    private String title;
    @ApiModelProperty(value = "内容")
    @TableField("content")
    private String content;
    @ApiModelProperty(value = "数量")
    @TableField("number")
    private Integer number;
    @ApiModelProperty(value = "总金额")
    @TableField("total_amount")
    private BigDecimal totalAmount;
    @ApiModelProperty(value = "规格")
    @TableField("spec")
    private String spec;
    @ApiModelProperty(value = "事由/原因/说明/备注")
    private String applicationReason;
    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
    private String attachmentUrl;
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/AddBusinessTripDTO.java
New file
@@ -0,0 +1,31 @@
package com.ruoyi.system.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@ApiModel(value = "发起出差申请记录DTO")
public class AddBusinessTripDTO implements Serializable {
    @ApiModelProperty(value = "开始请假/外出/出差/销假时间")
    private LocalDateTime startTime;
    @ApiModelProperty(value = "结束请假/外出/出差/销假时间")
    private LocalDateTime endTime;
    @ApiModelProperty(value = "请假/外出/出差/销假时长(天)")
    private Double duration;
    @ApiModelProperty(value = "事由/原因/说明")
    private String applicationReason;
    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
    private String attachmentUrl;
    @ApiModelProperty(value = "外出/出差地点")
    private String address;
    @ApiModelProperty(value = "出差项目")
    private String projectName;
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/AddContactDTO.java
New file
@@ -0,0 +1,22 @@
package com.ruoyi.system.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@ApiModel(value = "发起内部联系单申请记录DTO")
public class AddContactDTO implements Serializable {
    @ApiModelProperty(value = "事由/原因/说明")
    private String applicationReason;
    @ApiModelProperty(value = "详细说明")
    private String description;
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/AddContractDTO.java
New file
@@ -0,0 +1,25 @@
package com.ruoyi.system.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@ApiModel(value = "发起合同文件申请记录DTO")
public class AddContractDTO implements Serializable {
    @ApiModelProperty(value = "合同文件地址")
    private String contractUrl;
    @ApiModelProperty(value = "事由/原因/说明")
    private String applicationReason;
    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
    private String attachmentUrl;
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/AddLeaveDestroyDTO.java
New file
@@ -0,0 +1,30 @@
package com.ruoyi.system.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@ApiModel(value = "发起销假申请记录DTO")
public class AddLeaveDestroyDTO implements Serializable {
    @ApiModelProperty(value = "开始请假/外出/出差/销假时间")
    private LocalDateTime startTime;
    @ApiModelProperty(value = "结束请假/外出/出差/销假时间")
    private LocalDateTime endTime;
    @ApiModelProperty(value = "请假/外出/出差/销假时长(天)")
    private Double duration;
    @ApiModelProperty(value = "事由/原因/说明")
    private String applicationReason;
    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
    private String attachmentUrl;
    @ApiModelProperty(value = "关联请假单,格式:yyyy-MM-dd - yyyy-MM-dd")
    private String leaveTime;
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/AddMoneyDTO.java
New file
@@ -0,0 +1,38 @@
package com.ruoyi.system.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import com.ruoyi.system.model.OaApprovalApplicationReimbursementItem;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel(value = "发起款项申请记录DTO")
public class AddMoneyDTO implements Serializable {
    @ApiModelProperty(value = "项目名称")
    private String projectName;
    @ApiModelProperty(value = "申请金额")
    private BigDecimal applyAmount;
    @ApiModelProperty(value = "申请说明")
    private String description;
    @ApiModelProperty(value = "付款方")
    private String payer;
    @ApiModelProperty(value = "收款方")
    private String payee;
    @ApiModelProperty(value = "收款方联系方式")
    private String payeeContact;
    @ApiModelProperty(value = "收款方账户")
    private String payeeAccount;
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/AddOutDTO.java
New file
@@ -0,0 +1,29 @@
package com.ruoyi.system.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@ApiModel(value = "发起外出申请记录DTO")
public class AddOutDTO implements Serializable {
    @ApiModelProperty(value = "开始请假/外出/出差/销假时间")
    private LocalDateTime startTime;
    @ApiModelProperty(value = "结束请假/外出/出差/销假时间")
    private LocalDateTime endTime;
    @ApiModelProperty(value = "请假/外出/出差/销假时长(天)")
    private Double duration;
    @ApiModelProperty(value = "事由/原因/说明")
    private String applicationReason;
    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
    private String attachmentUrl;
    @ApiModelProperty(value = "外出/出差地点")
    private String address;
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/AddPaymentDTO.java
New file
@@ -0,0 +1,29 @@
package com.ruoyi.system.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@ApiModel(value = "发起进度款支付申请记录DTO")
public class AddPaymentDTO implements Serializable {
    @ApiModelProperty(value = "关联项目ID")
    private Integer projectId;
    @ApiModelProperty(value = "合同金额")
    private BigDecimal contractAmount;
    @ApiModelProperty(value = "申请金额")
    private BigDecimal applyAmount;
    @ApiModelProperty(value = "事由/原因/说明")
    private String applicationReason;
    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
    private String attachmentUrl;
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/AddReimbursementDTO.java
New file
@@ -0,0 +1,22 @@
package com.ruoyi.system.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import com.ruoyi.system.model.OaApprovalApplicationReimbursementItem;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ApiModel(value = "发起报销申请记录DTO")
public class AddReimbursementDTO implements Serializable {
    @ApiModelProperty(value = "报销类型 0-差旅招待交通费,1-企业日常采购,2-房租水电日常,3-聚餐团建,4-其他")
    private Integer type;
    @ApiModelProperty(value = "明细")
    private List<OaApprovalApplicationReimbursementItem> items;
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/AuditDTO.java
New file
@@ -0,0 +1,21 @@
package com.ruoyi.system.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@ApiModel(value = "通用审批接口DTO")
public class AuditDTO implements Serializable {
    @ApiModelProperty(value = "审批申请记录ID")
    private Integer approvalApplicationId;
    @ApiModelProperty(value = "不通过原因")
    private String reason;
    @ApiModelProperty(value = "审批意见 0-审批不通过,1-审批通过")
    private Integer approvalStatus;
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/SetApprovalDTO.java
@@ -12,7 +12,9 @@
    @ApiModelProperty(value = "审批流程id")
    private Integer id;
    @ApiModelProperty(value = "审批类型 0-上级部门,1-指定部门审批,2-指定人员审批")
    private Integer approvalType;
    @ApiModelProperty(value = "人员ids")
    @ApiModelProperty(value = "审批类型为上级部门该字段不传,指定部门审批存部门id,指定人员审批存人员id,多个id使用英文逗号拼接")
    private String approvalIds;
}
ruoyi-system/src/main/java/com/ruoyi/system/emums/ApprovalFlowNodeEnum.java
New file
@@ -0,0 +1,57 @@
package com.ruoyi.system.emums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
 * 审批流程节点枚举
 *
 * @author YourName
 * @since 2025-09-11
 */
@Getter
@AllArgsConstructor
public enum ApprovalFlowNodeEnum {
    /**
     * 部门负责人审批
     */
    DEPT(1, "部门负责人审批"),
    /**
     * 风险合规部审批
     */
    RISK(2, "风险合规部审批"),
    /**
     * 财务融资部审批
     */
    FINANCE(3, "财务融资部审批"),
    /**
     * 分管领导审批
     */
    DIVISION(4, "分管领导审批"),
    /**
     * 总经理审批
     */
    GENERAL(5, "总经理审批"),
    /**
     * 董事长审批
     */
    CHAIRMAN(6, "董事长审批");
    private final Integer code;
    private final String desc;
    public static ApprovalFlowNodeEnum getEnumByCode(Integer code) {
        for (ApprovalFlowNodeEnum e : ApprovalFlowNodeEnum.values()) {
            if (e.code.equals(code)) {
                return e;
            }
        }
        return null;
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalTodoMapper.java
@@ -1,7 +1,12 @@
package com.ruoyi.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.system.model.OaApprovalTodo;
import com.ruoyi.system.query.ApprovalTodoListQuery;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * <p>
@@ -13,4 +18,6 @@
 */
public interface OaApprovalTodoMapper extends BaseMapper<OaApprovalTodo> {
    List<OaApprovalTodo> pageList(@Param("query")ApprovalTodoListQuery query, @Param("pageInfo")PageInfo<OaApprovalTodo> pageInfo);
}
ruoyi-system/src/main/java/com/ruoyi/system/model/OaApproval.java
@@ -38,7 +38,7 @@
    @ApiModelProperty(value = "审批类型 1-请假申请,2-外出申请,3-出差申请,4-销假申请,5-采购申请,6-资产入库,7-物品领用,8-物品借用,9-借用归还,10-资产处置,11-资产表更,12-报销申请,13-款项申请,14-合同文件,15-进度款支付,16-内部联系单,17-广告制作申请")
    @TableField("approval_category")
    private Boolean approvalCategory;
    private Integer approvalCategory;
    @ApiModelProperty(value = "当前状态 0-禁用,1-启用")
    @TableField("status")
ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationAttendance.java
@@ -60,5 +60,9 @@
    @TableField("leave_approval_application_id")
    private Integer leaveApprovalApplicationId;
    @ApiModelProperty(value = "是否是请假申请 0否1是")
    @TableField("is_leave")
    private Boolean isLeave;
}
ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationDispose.java
@@ -24,7 +24,7 @@
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("oa_approval_application_dispose")
@ApiModel(value="OaApprovalApplicationDispose对象", description="资产领用单明细表")
@ApiModel(value="OaApprovalApplicationDispose对象", description="资产处置单明细表")
public class OaApprovalApplicationDispose implements Serializable {
    private static final long serialVersionUID = 1L;
@@ -51,7 +51,7 @@
    @ApiModelProperty(value = "处置方式 0-报废,1-报损,2-捐赠")
    @TableField("dispose_type")
    private Boolean disposeType;
    private Integer disposeType;
    @ApiModelProperty(value = "处置总金额(元)")
    @TableField("dispose_total_amount")
ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationReimbursement.java
@@ -10,6 +10,7 @@
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
/**
 * <p>
@@ -37,7 +38,9 @@
    @ApiModelProperty(value = "报销类型 0-差旅招待交通费,1-企业日常采购,2-房租水电日常,3-聚餐团建,4-其他")
    @TableField("type")
    private Boolean type;
    private Integer type;
    @ApiModelProperty(value = "总金额")
    @TableField("reimbursement_amount")
    private BigDecimal reimbursementAmount;
}
ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationReimbursementItem.java
@@ -32,13 +32,13 @@
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "报销申请记录ID")
    @ApiModelProperty(value = "报销申请记录ID 前端不传")
    @TableField("approval_application_id")
    private Integer approvalApplicationId;
    @ApiModelProperty(value = "报销类型 0-飞机票,1-火车票,2-的士费,3-住宿费,4-餐饮费,5-礼品费,6-活动费,7-通讯费,8-补助,9-办公费,10-采购费,11-水电费,12-修理费,13-养路费,14-燃料费,15-其他")
    @TableField("fee_type")
    private Boolean feeType;
    private Integer feeType;
    @ApiModelProperty(value = "费用金额")
    @TableField("amount")
ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplications.java
@@ -48,14 +48,14 @@
    @ApiModelProperty(value = "申请人")
    @TableField("applicant_name")
    private String applicantName;
    @ApiModelProperty(value = "所属部门")
    @TableField("dept_name")
    private String deptName;
    @ApiModelProperty(value = "部门ID")
    @TableField("dept_id")
    private Integer deptId;
    @ApiModelProperty(value = "所属部门")
    @TableField("dept_name")
    private String deptName;
    @ApiModelProperty(value = "申请日期")
    @TableField("application_date")
ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalTodo.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.sun.org.apache.xpath.internal.operations.Bool;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -72,5 +73,8 @@
    @TableField("handle_time")
    private LocalDateTime handleTime;
    @ApiModelProperty(value = "是否删除 0-否,1-是")
    @TableField("disabled")
    private Integer disabled;
}
ruoyi-system/src/main/java/com/ruoyi/system/query/ApprovalTodoListQuery.java
New file
@@ -0,0 +1,15 @@
package com.ruoyi.system.query;
import com.ruoyi.common.core.domain.BasePage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "代办事项分页列表query")
public class ApprovalTodoListQuery extends BasePage {
    @ApiModelProperty("用户id 前端忽略")
    private Long userId;
}
ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalTodoService.java
@@ -1,8 +1,13 @@
package com.ruoyi.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.system.model.OaApprovalFlowNode;
import com.ruoyi.system.model.OaApprovalTodo;
import com.ruoyi.system.query.ApprovalTodoListQuery;
import com.ruoyi.system.vo.ApprovalTodoVO;
import java.util.List;
/**
 * <p>
@@ -22,4 +27,7 @@
     * @param deptId          申请部门ID(用于上级部门审批场景)
     */
    void createApprovalTodos(Integer applicationId, String applicationCode, OaApprovalFlowNode flowNode, Integer deptId);
    PageInfo<OaApprovalTodo> pageList(ApprovalTodoListQuery query);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalTodoServiceImpl.java
@@ -2,17 +2,24 @@
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.entity.TDept;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.system.mapper.OaApprovalTodoMapper;
import com.ruoyi.system.model.OaApprovalFlowNode;
import com.ruoyi.system.model.OaApprovalTodo;
import com.ruoyi.system.query.ApprovalTodoListQuery;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.service.OaApprovalTodoService;
import com.ruoyi.system.service.TDeptService;
import com.ruoyi.system.vo.ApprovalTodoVO;
import com.ruoyi.system.vo.system.NotificationVO;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.security.core.token.TokenService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -34,7 +41,7 @@
public class OaApprovalTodoServiceImpl extends ServiceImpl<OaApprovalTodoMapper, OaApprovalTodo> implements OaApprovalTodoService {
    private final ISysUserService sysUserService;
    private final ISysDeptService sysDeptService;
    private final TDeptService deptService;
    /**
     * 创建审批待办(公共实现)
@@ -62,6 +69,15 @@
        }
    }
    @Override
    public PageInfo<OaApprovalTodo> pageList(ApprovalTodoListQuery query) {
        PageInfo<OaApprovalTodo> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<OaApprovalTodo> list = this.baseMapper.pageList(query,pageInfo);
        pageInfo.setRecords( list);
        return pageInfo;
    }
    /**
     * 创建上级部门审批待办
     */
@@ -71,7 +87,7 @@
            throw new ServiceException("未填写申请部门信息");
        }
        SysDept currentDept = sysDeptService.selectDeptById(Long.valueOf(deptId));
        TDept currentDept = deptService.getById(Long.valueOf(deptId));
        if (currentDept == null) {
            throw new ServiceException("申请部门信息不存在");
        }
@@ -81,13 +97,13 @@
            throw new ServiceException("当前部门没有上级部门");
        }
        SysDept parentDept = sysDeptService.selectDeptById(currentDept.getParentId());
        TDept parentDept = deptService.getById(currentDept.getParentId());
        if (parentDept == null) {
            throw new ServiceException("上级部门信息不存在");
        }
        // 3. 查询所有关联了该上级部门的用户
        List<SysUser> users = sysUserService.selectListByDeptId(parentDept.getDeptId().toString());
        List<SysUser> users = sysUserService.selectListByDeptId(parentDept.getId().toString());
        if (CollUtil.isEmpty(users)) {
            throw new ServiceException("上级部门下没有找到用户");
        }
ruoyi-system/src/main/java/com/ruoyi/system/utils/ApprovalTypeEnum.java
File was deleted
ruoyi-system/src/main/java/com/ruoyi/system/vo/AdvertisementDetailVO.java
New file
@@ -0,0 +1,51 @@
package com.ruoyi.system.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ApiModel(value = "广告制作详情返回VO")
public class AdvertisementDetailVO implements Serializable {
    @ApiModelProperty(value = "申请人")
    private String userName;
    @ApiModelProperty(value = "所属部门")
    private String deptName;
    @ApiModelProperty(value = "事由/原因/说明")
    private String applicationReason;
    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
    private String attachmentUrl;
    @ApiModelProperty(value = "审批申请记录ID")
    private Integer approvalApplicationId;
    @ApiModelProperty(value = "事项标题")
    private String title;
    @ApiModelProperty(value = "申请日期")
    @JsonFormat(pattern = "yyyy-MM-dd ", timezone = "GMT+8")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "内容")
    private String content;
    @ApiModelProperty(value = "数量")
    private Integer number;
    @ApiModelProperty(value = "总金额")
    private BigDecimal totalAmount;
    @ApiModelProperty(value = "规格")
    private String spec;
    @ApiModelProperty(value = "审批流程")
    private List<ApprovalFlowNodeListVO> approvalFlowNodeListVOS;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/ApprovalFlowNodeListVO.java
New file
@@ -0,0 +1,23 @@
package com.ruoyi.system.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.models.auth.In;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel(value = "审批流程通用返回VO")
public class ApprovalFlowNodeListVO implements Serializable {
    @ApiModelProperty(value = "审批流程名称")
    private String flowName;
    @ApiModelProperty(value = "发起人/审批人名称")
    private String userName;
    @ApiModelProperty(value = "签字图片地址")
    private String signPicUrl;
    @ApiModelProperty(value = "审批意见 0-审批不通过,1-审批通过")
    private Boolean approvalStatus;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/ApprovalTodoVO.java
New file
@@ -0,0 +1,69 @@
package com.ruoyi.system.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.system.model.OaApprovalTodo;
import com.ruoyi.system.model.OaNotification;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
@ApiModel(value = "待办事项列表返回VO")
public class ApprovalTodoVO implements Serializable {
    @ApiModelProperty(value = "审批类型 1-请假申请,2-外出申请,3-出差申请,4-销假申请,5-采购申请,6-资产入库,7-物品领用,8-物品借用,9-借用归还,10-资产处置,11-资产表更,12-报销申请,13-款项申请,14-合同文件,15-进度款支付,16-内部联系单,17-广告制作申请")
    private Integer approvalCategory;
    @ApiModelProperty(value = "开始请假/外出/出差/销假时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime startTime;
    @ApiModelProperty(value = "结束请假/外出/出差/销假时间")
    private LocalDateTime endTime;
    @ApiModelProperty(value = "请假/外出/出差/销假时长(天)")
    private Double duration;
    @ApiModelProperty(value = "申请人名称")
    private String applyUserName;
    @ApiModelProperty(value = "申请人部门名称")
    private String applyDeptName;
    @ApiModelProperty(value = "申请单号")
    private String applicationCode;
    @ApiModelProperty(value = "申请时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "代办id")
    private Integer id;
    @ApiModelProperty(value = "审批申请ID")
    private Integer applicationId;
    @ApiModelProperty(value = "报销金额/申请金额/合计金额/总金额(报销申请/款项申请/款项支付审批/广告制作)")
    private BigDecimal amount;
    @ApiModelProperty(value = "入库类型 0-正常入库(资产入库)")
    private Boolean storageType;
    @ApiModelProperty(value = "领用/借用/归还日期(物品借用/领用归还)")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDate operateTime;
    @ApiModelProperty(value = "处置方式 0-报废,1-报损,2-捐赠(资产处置)")
    private Integer disposeType;
    @ApiModelProperty(value = "更改方(资产变更)")
    private String ownershipDeptName;
    @ApiModelProperty(value = "领用物品(资产领用)")
    private String assetName;
    @ApiModelProperty(value = "申请说明/申请事由(款项申请/款项支付审批)")
    private String description;
    @ApiModelProperty(value = "内容(广告制作)")
    private String content;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/BackDetailVO.java
New file
@@ -0,0 +1,44 @@
package com.ruoyi.system.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.basic.PageInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ApiModel(value = "借用归还审批详情返回VO")
public class BackDetailVO implements Serializable {
    @ApiModelProperty(value = "借用人")
    private String userName;
    @ApiModelProperty(value = "借用部门")
    private String deptName;
    @ApiModelProperty(value = "事由/原因/说明")
    private String applicationReason;
    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
    private String attachmentUrl;
    @ApiModelProperty(value = "审批申请记录ID")
    private Integer approvalApplicationId;
    @ApiModelProperty(value = "借用日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate operateTime;
    @ApiModelProperty(value = "归还日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate expectReturnDate;
    @ApiModelProperty(value = "标题")
    private String title;
    @ApiModelProperty(value = "借用单据号")
    private String applicationCode;
    @ApiModelProperty(value = "借用资产列表")
    private PageInfo<BackListVO> backListVOPageInfo;
    @ApiModelProperty(value = "审批流程")
    private List<ApprovalFlowNodeListVO> approvalFlowNodeListVOS;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/BackListVO.java
New file
@@ -0,0 +1,31 @@
package com.ruoyi.system.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
@Data
@ApiModel(value = "归还资产列表返回VO")
public class BackListVO implements Serializable {
    @ApiModelProperty(value = "资产名称")
    private String assetName;
    @ApiModelProperty(value = "资产类型")
    private String assetTypeName;
    @ApiModelProperty(value = "资产编码")
    private String assetCode;
    @ApiModelProperty(value = "归属部门")
    private String ownershipDeptName;
    @ApiModelProperty(value = "资产状态")
    private String assetStatus;
    @ApiModelProperty(value = "使用部门/位置")
    private String useName;
    @ApiModelProperty(value = "入库日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate storageTime;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/BorrowDetailVO.java
New file
@@ -0,0 +1,40 @@
package com.ruoyi.system.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.basic.PageInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ApiModel(value = "物品借用审批详情返回VO")
public class BorrowDetailVO implements Serializable {
    @ApiModelProperty(value = "借用人")
    private String userName;
    @ApiModelProperty(value = "借用部门")
    private String deptName;
    @ApiModelProperty(value = "事由/原因/说明")
    private String applicationReason;
    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
    private String attachmentUrl;
    @ApiModelProperty(value = "审批申请记录ID")
    private Integer approvalApplicationId;
    @ApiModelProperty(value = "借用日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate operateTime;
    @ApiModelProperty(value = "预计归还日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate expectReturnDate;
    @ApiModelProperty(value = "借用资产列表")
    private PageInfo<BorrowListVO> borrowListVOPageInfo;
    @ApiModelProperty(value = "审批流程")
    private List<ApprovalFlowNodeListVO> approvalFlowNodeListVOS;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/BorrowListVO.java
New file
@@ -0,0 +1,31 @@
package com.ruoyi.system.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
@Data
@ApiModel(value = "借用资产列表返回VO")
public class BorrowListVO implements Serializable {
    @ApiModelProperty(value = "资产名称")
    private String assetName;
    @ApiModelProperty(value = "资产类型")
    private String assetTypeName;
    @ApiModelProperty(value = "资产编码")
    private String assetCode;
    @ApiModelProperty(value = "归属部门")
    private String ownershipDeptName;
    @ApiModelProperty(value = "资产状态")
    private String assetStatus;
    @ApiModelProperty(value = "使用部门/位置")
    private String useName;
    @ApiModelProperty(value = "入库日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate storageTime;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/BusinessTripDetailVO.java
New file
@@ -0,0 +1,45 @@
package com.ruoyi.system.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ApiModel(value = "出差审批详情返回VO")
public class BusinessTripDetailVO implements Serializable {
    @ApiModelProperty(value = "申请人")
    private String userName;
    @ApiModelProperty(value = "所属部门")
    private String deptName;
    @ApiModelProperty(value = "事由/原因/说明")
    private String applicationReason;
    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
    private String attachmentUrl;
    @ApiModelProperty(value = "外出/出差地点")
    private String address;
    @ApiModelProperty(value = "出差项目")
    private String projectName;
    @ApiModelProperty(value = "审批申请记录ID")
    private Integer approvalApplicationId;
    @ApiModelProperty(value = "开始请假/外出/出差/销假时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime startTime;
    @ApiModelProperty(value = "结束请假/外出/出差/销假时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime endTime;
    @ApiModelProperty(value = "请假/外出/出差/销假时长(天)")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Double duration;
    @ApiModelProperty(value = "审批流程")
    private List<ApprovalFlowNodeListVO> approvalFlowNodeListVOS;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/ChangeDetailVO.java
New file
@@ -0,0 +1,46 @@
package com.ruoyi.system.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.basic.PageInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ApiModel(value = "资产变更审批详情返回VO")
public class ChangeDetailVO implements Serializable {
    @ApiModelProperty(value = "领用人")
    private String userName;
    @ApiModelProperty(value = "领用部门")
    private String deptName;
    @ApiModelProperty(value = "事由/原因/说明")
    private String applicationReason;
    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
    private String attachmentUrl;
    @ApiModelProperty(value = "审批申请记录ID")
    private Integer approvalApplicationId;
    @ApiModelProperty(value = "领用日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate ChangeTime;
    @ApiModelProperty(value = "标题")
    private String title;
    @ApiModelProperty(value = "资产类型名称")
    private String assetTypeName;
    @ApiModelProperty(value = "部门 ")
    private String ownershipDeptName;
    @ApiModelProperty(value = "仓库")
    private String warehouseName;
    @ApiModelProperty(value = "地址")
    private String address;
    @ApiModelProperty(value = "领用资产列表")
    private PageInfo<ChangeListVO> grabListVOPageInfo;
    @ApiModelProperty(value = "审批流程")
    private List<ApprovalFlowNodeListVO> approvalFlowNodeListVOS;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/ChangeListVO.java
New file
@@ -0,0 +1,31 @@
package com.ruoyi.system.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
@Data
@ApiModel(value = "资产变更列表返回VO")
public class ChangeListVO implements Serializable {
    @ApiModelProperty(value = "资产名称")
    private String assetName;
    @ApiModelProperty(value = "资产类型")
    private String assetTypeName;
    @ApiModelProperty(value = "资产编码")
    private String assetCode;
    @ApiModelProperty(value = "归属部门")
    private String ownershipDeptName;
    @ApiModelProperty(value = "资产状态")
    private String assetStatus;
    @ApiModelProperty(value = "使用部门/位置")
    private String useName;
    @ApiModelProperty(value = "入库日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate storageTime;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/ContactDetailVO.java
New file
@@ -0,0 +1,31 @@
package com.ruoyi.system.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel(value = "内部联系单详情返回VO")
public class ContactDetailVO implements Serializable {
    @ApiModelProperty(value = "申请人")
    private String userName;
    @ApiModelProperty(value = "所属部门")
    private String deptName;
    @ApiModelProperty(value = "事由/原因/说明")
    private String applicationReason;
    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
    private String attachmentUrl;
    @ApiModelProperty(value = "审批申请记录ID")
    private Integer approvalApplicationId;
    @ApiModelProperty(value = "详细说明")
    private String description;
    @ApiModelProperty(value = "审批流程")
    private List<ApprovalFlowNodeListVO> approvalFlowNodeListVOS;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/ContractDetailVO.java
New file
@@ -0,0 +1,35 @@
package com.ruoyi.system.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.system.model.OaApprovalApplicationContract;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ApiModel(value = "待审批合同文件详情返回VO")
public class ContractDetailVO implements Serializable {
    @ApiModelProperty(value = "申请人")
    private String userName;
    @ApiModelProperty(value = "所属部门")
    private String deptName;
    @ApiModelProperty(value = "事由/原因/说明")
    private String applicationReason;
    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
    private String attachmentUrl;
    @ApiModelProperty(value = "审批申请记录ID")
    private Integer approvalApplicationId;
    @ApiModelProperty(value = "合同文件地址")
    private String contractUrl;
    @ApiModelProperty(value = "审批流程")
    private List<ApprovalFlowNodeListVO> approvalFlowNodeListVOS;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/DisposeDetailVO.java
New file
@@ -0,0 +1,46 @@
package com.ruoyi.system.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.basic.PageInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ApiModel(value = "资产处置审批详情返回VO")
public class DisposeDetailVO implements Serializable {
    @ApiModelProperty(value = "领用人")
    private String userName;
    @ApiModelProperty(value = "领用部门")
    private String deptName;
    @ApiModelProperty(value = "事由/原因/说明")
    private String applicationReason;
    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
    private String attachmentUrl;
    @ApiModelProperty(value = "审批申请记录ID")
    private Integer approvalApplicationId;
    @ApiModelProperty(value = "处置日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate disposeTime;
    @ApiModelProperty(value = "标题")
    private String title;
    @ApiModelProperty(value = "处置资产类型名称")
    private String assetTypeName;
    @ApiModelProperty(value = "处置方式 0-报废,1-报损,2-捐赠")
    private Integer disposeType;
    @ApiModelProperty(value = "处置总金额(元)")
    private BigDecimal disposeTotalAmount;
    @ApiModelProperty(value = "处置资产列表")
    private PageInfo<GrabListVO> grabListVOPageInfo;
    @ApiModelProperty(value = "审批流程")
    private List<ApprovalFlowNodeListVO> approvalFlowNodeListVOS;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/DisposeListVO.java
New file
@@ -0,0 +1,31 @@
package com.ruoyi.system.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
@Data
@ApiModel(value = "领用资产列表返回VO")
public class DisposeListVO implements Serializable {
    @ApiModelProperty(value = "资产名称")
    private String assetName;
    @ApiModelProperty(value = "资产类型")
    private String assetTypeName;
    @ApiModelProperty(value = "资产编码")
    private String assetCode;
    @ApiModelProperty(value = "归属部门")
    private String ownershipDeptName;
    @ApiModelProperty(value = "资产状态")
    private String assetStatus;
    @ApiModelProperty(value = "使用部门/位置")
    private String useName;
    @ApiModelProperty(value = "入库日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate storageTime;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/GrabDetailVO.java
New file
@@ -0,0 +1,41 @@
package com.ruoyi.system.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.basic.PageInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ApiModel(value = "物品领用审批详情返回VO")
public class GrabDetailVO implements Serializable {
    @ApiModelProperty(value = "领用人")
    private String userName;
    @ApiModelProperty(value = "领用部门")
    private String deptName;
    @ApiModelProperty(value = "事由/原因/说明")
    private String applicationReason;
    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
    private String attachmentUrl;
    @ApiModelProperty(value = "审批申请记录ID")
    private Integer approvalApplicationId;
    @ApiModelProperty(value = "领用日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate operateTime;
    @ApiModelProperty(value = "标题")
    private String title;
    @ApiModelProperty(value = "资产类型名称")
    private String assetTypeName;
    @ApiModelProperty(value = "领用资产列表")
    private PageInfo<GrabListVO> grabListVOPageInfo;
    @ApiModelProperty(value = "审批流程")
    private List<ApprovalFlowNodeListVO> approvalFlowNodeListVOS;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/GrabListVO.java
New file
@@ -0,0 +1,34 @@
package com.ruoyi.system.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ApiModel(value = "领用资产列表返回VO")
public class GrabListVO implements Serializable {
    @ApiModelProperty(value = "资产名称")
    private String assetName;
    @ApiModelProperty(value = "资产类型")
    private String assetTypeName;
    @ApiModelProperty(value = "资产编码")
    private String assetCode;
    @ApiModelProperty(value = "归属部门")
    private String ownershipDeptName;
    @ApiModelProperty(value = "资产状态")
    private String assetStatus;
    @ApiModelProperty(value = "使用部门/位置")
    private String useName;
    @ApiModelProperty(value = "入库日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate storageTime;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/LeaveDestroyDetailVO.java
New file
@@ -0,0 +1,39 @@
package com.ruoyi.system.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ApiModel(value = "销假审批详情返回VO")
public class LeaveDestroyDetailVO implements Serializable {
    @ApiModelProperty(value = "申请人")
    private String userName;
    @ApiModelProperty(value = "所属部门")
    private String deptName;
    @ApiModelProperty(value = "事由/原因/说明")
    private String applicationReason;
    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
    private String attachmentUrl;
    @ApiModelProperty(value = "审批申请记录ID")
    private Integer approvalApplicationId;
    @ApiModelProperty(value = "开始请假/外出/出差/销假时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime startTime;
    @ApiModelProperty(value = "结束请假/外出/出差/销假时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime endTime;
    @ApiModelProperty(value = "请假/外出/出差/销假时长(天)")
    private Double duration;
    @ApiModelProperty(value = "审批流程")
    private List<ApprovalFlowNodeListVO> approvalFlowNodeListVOS;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/LeaveDetailVO.java
New file
@@ -0,0 +1,41 @@
package com.ruoyi.system.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ApiModel(value = "请假审批详情返回VO")
public class LeaveDetailVO implements Serializable {
    @ApiModelProperty(value = "申请人")
    private String userName;
    @ApiModelProperty(value = "所属部门")
    private String deptName;
    @ApiModelProperty(value = "事由/原因/说明")
    private String applicationReason;
    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
    private String attachmentUrl;
    @ApiModelProperty(value = "审批申请记录ID")
    private Integer approvalApplicationId;
    @ApiModelProperty(value = "开始请假/外出/出差/销假时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime startTime;
    @ApiModelProperty(value = "结束请假/外出/出差/销假时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime endTime;
    @ApiModelProperty(value = "请假/外出/出差/销假时长(天)")
    private Double duration;
    @ApiModelProperty(value = "审批流程")
    private List<ApprovalFlowNodeListVO> approvalFlowNodeListVOS;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/MoneyDetailVO.java
New file
@@ -0,0 +1,50 @@
package com.ruoyi.system.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.ruoyi.system.model.OaApprovalApplicationReimbursementItem;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel(value = "款项审批详情返回VO")
public class MoneyDetailVO implements Serializable {
    @ApiModelProperty(value = "申请人")
    private String userName;
    @ApiModelProperty(value = "所属部门")
    private String deptName;
    @ApiModelProperty(value = "事由/原因/说明")
    private String applicationReason;
    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
    private String attachmentUrl;
    @ApiModelProperty(value = "审批申请记录ID")
    private Integer approvalApplicationId;
    @ApiModelProperty(value = "项目名称")
    private String projectName;
    @ApiModelProperty(value = "申请金额")
    private BigDecimal applyAmount;
    @ApiModelProperty(value = "申请说明")
    private String description;
    @ApiModelProperty(value = "付款方")
    private String payer;
    @ApiModelProperty(value = "收款方")
    private String payee;
    @ApiModelProperty(value = "收款方联系方式")
    private String payeeContact;
    @ApiModelProperty(value = "收款方账户")
    private String payeeAccount;
    @ApiModelProperty(value = "审批流程")
    private List<ApprovalFlowNodeListVO> approvalFlowNodeListVOS;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/OutDetailVO.java
New file
@@ -0,0 +1,39 @@
package com.ruoyi.system.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ApiModel(value = "外出审批详情返回VO")
public class OutDetailVO implements Serializable {
    @ApiModelProperty(value = "申请人")
    private String userName;
    @ApiModelProperty(value = "所属部门")
    private String deptName;
    @ApiModelProperty(value = "事由/原因/说明")
    private String applicationReason;
    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
    private String attachmentUrl;
    @ApiModelProperty(value = "审批申请记录ID")
    private Integer approvalApplicationId;
    @ApiModelProperty(value = "开始请假/外出/出差/销假时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime startTime;
    @ApiModelProperty(value = "结束请假/外出/出差/销假时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime endTime;
    @ApiModelProperty(value = "请假/外出/出差/销假时长(天)")
    private Double duration;
    @ApiModelProperty(value = "审批流程")
    private List<ApprovalFlowNodeListVO> approvalFlowNodeListVOS;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/PaymentDetailVO.java
New file
@@ -0,0 +1,32 @@
package com.ruoyi.system.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel(value = "进度款支付详情返回VO")
public class PaymentDetailVO implements Serializable {
    @ApiModelProperty(value = "申请人")
    private String userName;
    @ApiModelProperty(value = "所属部门")
    private String deptName;
    @ApiModelProperty(value = "事由/原因/说明")
    private String applicationReason;
    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
    private String attachmentUrl;
    @ApiModelProperty(value = "审批申请记录ID")
    private Integer approvalApplicationId;
    @ApiModelProperty(value = "关联项目")
    private String projectName;
    @ApiModelProperty(value = "申请金额")
    private BigDecimal applyAmount;
    @ApiModelProperty(value = "审批流程")
    private List<ApprovalFlowNodeListVO> approvalFlowNodeListVOS;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/PurchaseDetailVO.java
New file
@@ -0,0 +1,42 @@
package com.ruoyi.system.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.basic.PageInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ApiModel(value = "采购审批详情返回VO")
public class PurchaseDetailVO implements Serializable {
    @ApiModelProperty(value = "申请人")
    private String userName;
    @ApiModelProperty(value = "所属部门")
    private String deptName;
    @ApiModelProperty(value = "事由/原因/说明")
    private String applicationReason;
    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
    private String attachmentUrl;
    @ApiModelProperty(value = "审批申请记录ID")
    private Integer approvalApplicationId;
    @ApiModelProperty(value = "申请日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "总金额")
    private BigDecimal totalAmount;
    @ApiModelProperty(value = "标题")
    private String title;
    @ApiModelProperty(value = "资产类型名称")
    private String assetTypeName;
    @ApiModelProperty(value = "采购物品清单")
    private PageInfo<PurchaseListVO> purchaseListVOPageInfo;
    @ApiModelProperty(value = "审批流程")
    private List<ApprovalFlowNodeListVO> approvalFlowNodeListVOS;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/PurchaseListVO.java
New file
@@ -0,0 +1,33 @@
package com.ruoyi.system.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ApiModel(value = "采购物品清单列表返回VO")
public class PurchaseListVO implements Serializable {
    @ApiModelProperty(value = "资产名称")
    private String assetName;
    @ApiModelProperty(value = "资产分类")
    private String assetTypeName;
    @ApiModelProperty(value = "总金额")
    private BigDecimal totalAmount;
    @ApiModelProperty(value = "规格型号")
    private String spec;
    @ApiModelProperty(value = "单位")
    private String unit;
    @ApiModelProperty(value = "数量")
    private Integer quantity;
    @ApiModelProperty(value = "单价(元)")
    private BigDecimal price;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/ReimbursementDetailVO.java
New file
@@ -0,0 +1,35 @@
package com.ruoyi.system.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.system.model.OaApprovalApplicationReimbursementItem;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.List;
@Data
@ApiModel(value = "报销审批详情返回VO")
public class ReimbursementDetailVO implements Serializable {
    @ApiModelProperty(value = "申请人")
    private String userName;
    @ApiModelProperty(value = "所属部门")
    private String deptName;
    @ApiModelProperty(value = "事由/原因/说明")
    private String applicationReason;
    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
    private String attachmentUrl;
    @ApiModelProperty(value = "审批申请记录ID")
    private Integer approvalApplicationId;
    @ApiModelProperty(value = "报销类型 0-差旅招待交通费,1-企业日常采购,2-房租水电日常,3-聚餐团建,4-其他")
    private Integer type;
    @ApiModelProperty(value = "费用明细")
    private List<OaApprovalApplicationReimbursementItem> approvalApplicationReimbursementItems;
    @ApiModelProperty(value = "审批流程")
    private List<ApprovalFlowNodeListVO> approvalFlowNodeListVOS;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/StorageDetailVO.java
New file
@@ -0,0 +1,39 @@
package com.ruoyi.system.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.basic.PageInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ApiModel(value = "资产入库审批详情返回VO")
public class StorageDetailVO implements Serializable {
    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
    private String attachmentUrl;
    @ApiModelProperty(value = "审批申请记录ID")
    private Integer approvalApplicationId;
    @ApiModelProperty(value = "标题")
    private String title;
    @ApiModelProperty(value = "入库类型 0-正常入库")
    private Integer storageType;
    @ApiModelProperty(value = "入库日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate storageTime;
    @ApiModelProperty(value = "入库备注")
    private String remarks;
    @ApiModelProperty(value = "采购物品清单")
    private PageInfo<GrabListVO> grabListVOPageInfo;
    @ApiModelProperty(value = "审批流程")
    private List<ApprovalFlowNodeListVO> approvalFlowNodeListVOS;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/StorageListVO.java
New file
@@ -0,0 +1,59 @@
package com.ruoyi.system.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
@Data
@ApiModel(value = "入库资产列表返回VO")
public class StorageListVO implements Serializable {
    @ApiModelProperty(value = "资产名称")
    private String assetName;
    @ApiModelProperty(value = "规格型号")
    private String specificationModel;
    @ApiModelProperty(value = "资产类型")
    private String assetTypeName;
    @ApiModelProperty(value = "计量单位")
    private String measurementUnit;
    @ApiModelProperty(value = "数量")
    private BigDecimal quantity;
    @ApiModelProperty(value = "单价")
    private BigDecimal unitPrice;
    @ApiModelProperty(value = "总价值(数量*单价)")
    private BigDecimal totalValue;
    @ApiModelProperty(value = "入账时间")
    @TableField("accounting_date")
    private LocalDate accountingDate;
    @ApiModelProperty(value = "会计凭证号")
    private String accountingVoucherNo;
    @ApiModelProperty(value = "会计科目")
    private String accountingSubject;
    @ApiModelProperty(value = "入账金额")
    private BigDecimal accountingAmount;
    @ApiModelProperty(value = "入账状态")
    private String accountingStatus;
    @ApiModelProperty(value = "资产状态")
    private String assetStatus;
    @ApiModelProperty(value = "归属部门")
    private String ownershipDeptName;
    @ApiModelProperty(value = "使用人")
    private String userName;
    @ApiModelProperty(value = "使用部门/位置")
    private String useName;
    @ApiModelProperty(value = "备注")
    private String remarks;
    @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址")
    private Integer addressType;
}
ruoyi-system/src/main/resources/mapper/system/OaApprovalTodoMapper.xml
@@ -21,5 +21,15 @@
    <sql id="Base_Column_List">
        id, application_id, application_code, flow_node_id, user_id, user_name, dept_id, sort_order, status, create_time, handle_time
    </sql>
    <select id="pageList" resultType="com.ruoyi.system.model.OaApprovalTodo">
        select * from oa_approval_todo
        where 1=1
        <if test="query.userId != null">
            and user_id = #{query.userId}
        </if>
        and status = 0
        group by application_id
        order by create_time desc
    </select>
</mapper>