mitao
1 天以前 03587b58b343956f910a653c37b9a7bcd84e4af9
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationsController.java
@@ -6,29 +6,64 @@
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.exception.ServiceException;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.dto.AddAdvertisementDTO;
import com.ruoyi.system.dto.AddBusinessTripDTO;
import com.ruoyi.system.dto.AddContactDTO;
import com.ruoyi.system.dto.AddContractDTO;
import com.ruoyi.system.dto.AddLeaveDTO;
import com.ruoyi.system.dto.SetApprovalDTO;
import com.ruoyi.system.dto.AddLeaveDestroyDTO;
import com.ruoyi.system.dto.AddMoneyDTO;
import com.ruoyi.system.dto.AddOutDTO;
import com.ruoyi.system.dto.AddPaymentDTO;
import com.ruoyi.system.dto.AddReimbursementDTO;
import com.ruoyi.system.emums.ApprovalStatusEnum;
import com.ruoyi.system.emums.ApprovalTypeEnum;
import com.ruoyi.system.model.OaApprovalApplicationAdvertisement;
import com.ruoyi.system.model.OaApprovalApplicationAttendance;
import com.ruoyi.system.model.OaApprovalApplicationContact;
import com.ruoyi.system.model.OaApprovalApplicationContract;
import com.ruoyi.system.model.OaApprovalApplicationMoney;
import com.ruoyi.system.model.OaApprovalApplicationPayment;
import com.ruoyi.system.model.OaApprovalApplicationReimbursement;
import com.ruoyi.system.model.OaApprovalApplicationReimbursementItem;
import com.ruoyi.system.model.OaApprovalApplications;
import com.ruoyi.system.model.OaApprovalFlowNode;
import com.ruoyi.system.service.*;
import com.ruoyi.system.utils.ApprovalTypeEnum;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.service.OaApprovalApplicationAdvertisementService;
import com.ruoyi.system.service.OaApprovalApplicationAttendanceService;
import com.ruoyi.system.service.OaApprovalApplicationContactService;
import com.ruoyi.system.service.OaApprovalApplicationContractService;
import com.ruoyi.system.service.OaApprovalApplicationMoneyService;
import com.ruoyi.system.service.OaApprovalApplicationPaymentService;
import com.ruoyi.system.service.OaApprovalApplicationReimbursementItemService;
import com.ruoyi.system.service.OaApprovalApplicationReimbursementService;
import com.ruoyi.system.service.OaApprovalApplicationsService;
import com.ruoyi.system.service.OaApprovalFlowNodeService;
import com.ruoyi.system.service.OaApprovalService;
import com.ruoyi.system.service.OaApprovalTodoService;
import com.ruoyi.system.service.TDeptService;
import com.ruoyi.system.utils.UUIDUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
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.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import com.ruoyi.system.emums.ApprovalStatusEnum;
import com.ruoyi.common.exception.ServiceException;
import java.util.List;
import java.util.stream.Collectors;
/**
 * <p>
@@ -39,7 +74,7 @@
 * @since 2025-09-15
 */
@RestController
@Api("审批-发起审批")
@Api(tags ="审批-发起审批")
@RequestMapping("/oa-approval-applications")
public class OaApprovalApplicationsController {
    @Resource
@@ -49,20 +84,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());
@@ -73,15 +126,479 @@
        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();
    }
    @Log(title = "审批-撤回通用审批单", businessType = BusinessType.UPDATE)
    @ApiOperation(value = "撤回审批单:仅更新状态为已撤回")
    @ApiOperation(value = "撤回审批单(通用接口)")
    @PutMapping(value = "/withdraw/{id}")
    public R withdraw(@PathVariable Integer id) {
    public R<?> withdraw(@PathVariable Integer id) {
        OaApprovalApplications current = approvalApplicationsService.getById(id);
        if (current == null) {
            throw new ServiceException("审批单不存在");