Newer
Older
casic-metering-biz-xichang / casic-metering-api / src / main / java / com / casic / missiles / controller / GeneralApprovalController.java
package com.casic.missiles.controller;

import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.casic.missiles.GeneralApprovalDTO;
import com.casic.missiles.core.base.controller.ExportController;
import com.casic.missiles.core.page.PageFactory;
import com.casic.missiles.core.page.PageInfoBT;
import com.casic.missiles.dto.*;
import com.casic.missiles.dto.flowable.ApprovalDeleteRequest;
import com.casic.missiles.dto.flowable.ApprovalRejectRequest;
import com.casic.missiles.dto.resource.customer.SuggestFormApprovalListRequest;
import com.casic.missiles.enums.BusinessExceptionEnum;
import com.casic.missiles.enums.system.ApprovalStatusEnum;
import com.casic.missiles.exception.BusinessException;
import com.casic.missiles.service.IGeneralApprovalService;
import com.casic.missiles.utils.DictCodeUtils;
import io.swagger.annotations.ApiOperation;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.validation.Valid;
import java.util.List;
import java.util.Objects;

/**
 * @Description: 通用审批Controller
 *          O:列表响应实体类
 *          T:编辑请求实体类
 *          R:列表请求实体类
 *          S:提交请求实体类
 * @Author: wangpeng
 * @Date: 2023/8/14 15:26
 */
public class GeneralApprovalController<O extends GeneralApprovalDTO, T extends GeneralApprovalDTO, R extends BaseApprovalListRequest, S extends BaseApprovalSubmitRequest> extends ExportController {

    private final IGeneralApprovalService<O, T, R, S> baseApprovalService;

    public GeneralApprovalController(IGeneralApprovalService<O, T, R, S> baseApprovalService) {
        this.baseApprovalService = baseApprovalService;
    }

    @ApiOperation("审批列表(分页)")
    @PostMapping("/approval/listPage")
    public ReturnDTO<PageInfoBT<O>> approvalListPage(@RequestBody @Valid R request) throws Exception {
        Page<O> page = PageFactory.defaultPage();
        page = baseApprovalService.listPage(page, request);
        return ReturnUtil.success(super.packForBT(page));
    }

    @ApiOperation("草稿箱-编辑")
    @PostMapping("/draftUpdate")
    public ReturnDTO draftUpdate(@RequestBody @Valid T request) {
        return baseApprovalService.draftUpdate(request);
    }

    @ApiOperation("草稿箱-删除")
    @PostMapping("/draftDelete")
    public ReturnDTO draftDelete(@RequestBody @Valid IdDTO idDTO) {
        Assert.isFalse(Objects.isNull(idDTO.getId()), () -> {
            throw new BusinessException(BusinessExceptionEnum.ID_NULL);
        });
        return baseApprovalService.draftDelete(idDTO.getId());
    }

    @ApiOperation("草稿箱-批量删除")
    @PostMapping("/draftBatchDelete")
    public ReturnDTO draftBatchDelete(@RequestBody @Valid IdsDTO idsDTO) {
        Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> {
            throw new BusinessException(BusinessExceptionEnum.ID_NULL);
        });
        return baseApprovalService.draftBatchDelete(idsDTO.getIds());
    }

    @ApiOperation("提交(未调用过保存接口保存至草稿箱需先调用保存接口,再调用该接口;无基本信息变更时changeFlag传1)")
    @PostMapping("/submit")
    public ReturnDTO submit(@RequestBody @Valid S request) {
        return baseApprovalService.submit(request);
    }

    @ApiOperation("审批-拒绝(驳回至起始节点)")
    @PostMapping("/approval/refuse")
    public ReturnDTO approvalRefuse(@RequestBody @Valid BaseApprovalRefuseRequest request) {
        return baseApprovalService.approvalRefuse(request);
    }

    @ApiOperation("审批操作-驳回(驳回至上一节点)")
    @PostMapping("/approval/reject")
    @ResponseBody
    public ReturnDTO reject(@RequestBody @Valid ApprovalRejectRequest request) {
        return baseApprovalService.approvalReject(request);
    }

    @ApiOperation("审批-取消(发起者撤回,表单状态更改为已取消,仅审批中状态可撤回)")
    @PostMapping("/approval/revoke")
    public ReturnDTO approvalRevoke(@RequestBody @Valid BaseApprovalRevokeRequest request) {
        return baseApprovalService.approvalRevoke(request);
    }

    @ApiOperation("审批-删除(已取消删除,发起者或具有删除权限的用户可以删除,已通过/未通过状态不可删除,前端控制按钮权限)")
    @PostMapping("/approval/delete")
    public ReturnDTO delete(@RequestBody @Valid ApprovalDeleteRequest request) {
        return baseApprovalService.approvalDelete(request);
    }

    @ApiOperation("未通过/已取消-编辑(驳回后的重新编辑)")
    @PostMapping("/failUpdate")
    public ReturnDTO failUpdate(@RequestBody @Valid T request) {
        return baseApprovalService.failUpdate(request);
    }

    public List<O> exportList(@RequestBody @Valid R request) throws Exception {
        List<O> list;
        if (!CollectionUtils.isEmpty(request.getIds())) {
            list = baseApprovalService.listExportByIds(request.getIds());
        } else {
            if (request.getClass().equals(SuggestFormApprovalListRequest.class)) {
                request.setApprovalStatus(null);
            } else {
                request.setApprovalStatus(ApprovalStatusEnum.PASSED);
            }
            list = baseApprovalService.listExport(request);
        }
        for (O record : list) {
            DictCodeUtils.convertDictCodeToName(record);
        }
        return list;
    }
}