大件运输联网系统后端代码
guoshilong
2022-12-16 2739964a8ed8e8e586971a5271a4d6bf2dbac2e5
添加审核工作流
11 files modified
9 files added
813 ■■■■■ changed files
src/main/java/org/springblade/common/utils/CommonUtil.java 31 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/flow/business/service/impl/FlowBusinessServiceImpl.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/flow/core/constant/ProcessConstant.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/flow/core/utils/FlowUtil.java 1 ●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/application/controller/ApplicationController.java 41 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/application/entity/ApplicationEntity.java 26 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/application/mapper/ApplicationMapper.java 9 ●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/application/mapper/ApplicationMapper.xml 15 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/application/service/IApplicationService.java 25 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/application/service/impl/ApplicationServiceImpl.java 170 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/enterprise/wrapper/EnterpriseWrapper.java 18 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/reject/controller/RejectController.java 126 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/reject/dto/RejectDTO.java 34 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/reject/entity/RejectEntity.java 55 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/reject/mapper/RejectMapper.java 43 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/reject/mapper/RejectMapper.xml 27 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/reject/service/IRejectService.java 42 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/reject/service/impl/RejectServiceImpl.java 57 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/reject/vo/RejectVO.java 35 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/reject/wrapper/RejectWrapper.java 50 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/common/utils/CommonUtil.java
@@ -16,6 +16,12 @@
 */
package org.springblade.common.utils;
import org.springblade.core.tool.utils.StringUtil;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * 通用工具类
 *
@@ -23,4 +29,29 @@
 */
public class CommonUtil {
    /**
     * 生成随时间自增变化的编号
     * @param prefixStr 前缀
     * @param maxNumber 最大值
     * @return
     */
    public final static String createNo(String prefixStr,String maxNumber){
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
        String caseNo="";
        if (StringUtil.isNotBlank(maxNumber)) {
            DecimalFormat decimalFormat = new DecimalFormat("000000");
            String dateStr = df.format(new Date());
            int preLength = maxNumber.indexOf(prefixStr) > -1 ? prefixStr.length():0;
            String value = maxNumber.substring(dateStr.length() + 5 + preLength, maxNumber.length());
            int i = Integer.parseInt(value) + 1;
            String k = decimalFormat.format(i);
            // 订单号
            caseNo= prefixStr + dateStr + k;
        } else {
            //初始、默认值
            caseNo = prefixStr + df.format(new Date()) + "000001";
        }
        return caseNo;
    }
}
src/main/java/org/springblade/flow/business/service/impl/FlowBusinessServiceImpl.java
@@ -19,9 +19,12 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.AllArgsConstructor;
import org.flowable.engine.HistoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.history.HistoricProcessInstanceQuery;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.flowable.task.api.TaskQuery;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.flowable.task.api.history.HistoricTaskInstanceQuery;
src/main/java/org/springblade/flow/core/constant/ProcessConstant.java
@@ -29,6 +29,11 @@
    String LEAVE_KEY = "Leave";
    /**
     * 请假流程标识
     */
    String AUDIT_KEY = "Audit";
    /**
     * 报销流程标识
     */
    String EXPENSE_KEY = "Expense";
src/main/java/org/springblade/flow/core/utils/FlowUtil.java
@@ -37,6 +37,7 @@
    static {
        BUSINESS_TABLE.put(ProcessConstant.LEAVE_KEY, "blade_process_leave");
        BUSINESS_TABLE.put(ProcessConstant.AUDIT_KEY, "sys_application");
    }
    /**
src/main/java/org/springblade/modules/application/controller/ApplicationController.java
@@ -24,13 +24,17 @@
import javax.validation.Valid;
import org.springblade.Application;
import org.springblade.common.cache.UserCache;
import org.springblade.core.secure.BladeUser;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springblade.flow.core.entity.BladeFlow;
import org.springblade.flow.demo.leave.entity.ProcessLeave;
import org.springblade.modules.application.entity.*;
import org.springblade.modules.enterprise.entity.EnterpriseEntity;
import org.springblade.modules.reject.entity.RejectEntity;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.modules.application.vo.ApplicationVO;
@@ -100,7 +104,7 @@
    @PostMapping("/saveVo")
    @ApiOperationSupport(order = 4)
    @ApiOperation(value = "自定义新增", notes = "传入applicationVo")
    public R save(@Valid @RequestBody ApplicationEntity application, @RequestBody BasicInfoEntity basicInfoEntity, @RequestBody CarEntity carEntity,
    public R saveVo(@Valid @RequestBody ApplicationEntity application, @RequestBody BasicInfoEntity basicInfoEntity, @RequestBody CarEntity carEntity,
                  @RequestBody PlanEntity planEntity, @RequestBody SchemeEntity schemeEntity, @RequestBody GoodsEntity goodsEntity) {
        return R.status(applicationService.saveVo(application,basicInfoEntity,carEntity,planEntity,schemeEntity,goodsEntity));
    }
@@ -145,6 +149,41 @@
    public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
        return R.status(applicationService.deleteLogic(Func.toLongList(ids)));
    }
    //================================工作流========================================
    /**
     * 申请表  工作流开始
     */
    @PostMapping("/start-process")
    @ApiOperationSupport(order = 4)
    @ApiOperation(value = "工作流开始", notes = "传入applicationVo")
    public R startProcess(@Valid @RequestBody ApplicationEntity application, @RequestBody BasicInfoEntity basicInfoEntity, @RequestBody CarEntity carEntity,
                          @RequestBody PlanEntity planEntity, @RequestBody SchemeEntity schemeEntity, @RequestBody GoodsEntity goodsEntity) {
        return R.status(applicationService.startProcess(application,basicInfoEntity,carEntity,planEntity,schemeEntity,goodsEntity));
    }
    /**
     * 详情
     *
     * @param businessId 主键
     */
    @GetMapping("/process-detail")
    public R<ApplicationVO> detail(Long businessId) {
        ApplicationEntity detail = applicationService.getById(businessId);
        ApplicationVO applicationVO = applicationService.getVo(detail);
        applicationVO.getFlow().setAssigneeName(UserCache.getUser(detail.getCreateUser()).getName());
        return R.data(applicationVO);
    }
    /**
     * 完成任务
     *
     * @param flow 审核信息
     */
    @PostMapping("complete-task")
    @ApiOperationSupport(order = 7)
    @ApiOperation(value = "完成任务", notes = "传入流程信息")
    public R completeTask(@ApiParam("任务信息") @RequestBody BladeFlow flow, @RequestBody ApplicationEntity applicationEntity, @RequestBody RejectEntity rejectEntity) {
        return R.status(applicationService.completeTask(flow,applicationEntity,rejectEntity));
    }
}
src/main/java/org/springblade/modules/application/entity/ApplicationEntity.java
@@ -25,6 +25,7 @@
import java.util.Date;
import lombok.EqualsAndHashCode;
import org.springblade.core.tenant.mp.TenantEntity;
import org.springblade.flow.core.entity.FlowEntity;
/**
 * 申请表 实体类
@@ -36,7 +37,7 @@
@TableName(value = "sys_application",autoResultMap = true)
@ApiModel(value = "Application对象", description = "申请表")
@EqualsAndHashCode(callSuper = true)
public class ApplicationEntity extends TenantEntity {
public class ApplicationEntity extends FlowEntity {
    /**
     * 关联的用户id
     */
@@ -47,6 +48,16 @@
     */
    @ApiModelProperty(value = "申请编号")
    private String no;
    /**
     * 货物分类
     */
    @ApiModelProperty(value = "货物分类")
    private String goodsCategory;
    /**
     * 货物类别
     */
    @ApiModelProperty(value = "货物类别")
    private String goodsType;
    /**
     * 道路运输经营许可证图片
     */
@@ -82,5 +93,16 @@
     */
    @ApiModelProperty(value = "完善意见")
    private String suggestion;
    /**
     * 流程定义id
     */
    private String processDefinitionId;
    /**
     * 流程实例id
     */
    private String processInstanceId;
    /**
     * 审批人
     */
    private String taskUser;
}
src/main/java/org/springblade/modules/application/mapper/ApplicationMapper.java
@@ -16,6 +16,7 @@
 */
package org.springblade.modules.application.mapper;
import org.apache.ibatis.annotations.Param;
import org.springblade.modules.application.entity.ApplicationEntity;
import org.springblade.modules.application.vo.ApplicationVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -37,7 +38,13 @@
     * @param application
     * @return
     */
    List<ApplicationVO> selectApplicationPage(IPage page, ApplicationVO application);
    List<ApplicationVO> selectApplicationPage(IPage page, @Param("application") ApplicationVO application);
    /**
     * 获取最大编号
     * @return
     */
    ApplicationEntity getMaxNoEntity();
    ApplicationEntity getByNo(@Param("no") String no);
}
src/main/java/org/springblade/modules/application/mapper/ApplicationMapper.xml
@@ -6,18 +6,12 @@
    <resultMap id="applicationResultMap" type="org.springblade.modules.application.vo.ApplicationVO">
        <result column="id" property="id"/>
        <result column="no" property="no"/>
        <result column="basic_info_id" property="basicInfoId"/>
        <result column="scheme_id" property="schemeId"/>
        <result column="plan_id" property="planId"/>
        <result column="goods_id" property="goodsId"/>
        <result column="car_id" property="carId"/>
        <result column="road_license_url" property="roadLicenseUrl"/>
        <result column="id_license_url" property="idLicenseUrl"/>
        <result column="license_url" property="licenseUrl"/>
        <result column="skeleton_url" property="skeletonUrl"/>
        <result column="attorney_url" property="attorneyUrl"/>
        <result column="suggestion" property="suggestion"/>
        <result column="tenant_id" property="tenantId"/>
        <result column="create_user" property="createUser"/>
        <result column="create_dept" property="createDept"/>
        <result column="create_time" property="createTime"/>
@@ -44,6 +38,15 @@
        LEFT JOIN sys_application_goods goods ON goods.application_id = app.id
        LEFT JOIN sys_enterprise enterprise ON enterprise.user_id = app.user_id AND enterprise.is_deleted = 0
        where app.is_deleted = 0
        <if test="application.userId != null and application.userId !='' ">
           AND app.user_id = #{application.userId}
        </if>
    </select>
    <select id="getMaxNoEntity" resultType="org.springblade.modules.application.entity.ApplicationEntity">
        SELECT * from sys_application where is_deleted = 0 ORDER BY create_time DESC LIMIT 1
    </select>
    <select id="getByNo" resultType="org.springblade.modules.application.entity.ApplicationEntity">
        SELECT * FROM sys_application WHERE is_deleted = 0 AND no = #{no}
    </select>
src/main/java/org/springblade/modules/application/service/IApplicationService.java
@@ -17,10 +17,12 @@
package org.springblade.modules.application.service;
import org.springblade.Application;
import org.springblade.flow.core.entity.BladeFlow;
import org.springblade.modules.application.entity.*;
import org.springblade.modules.application.vo.ApplicationVO;
import org.springblade.core.mp.base.BaseService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.modules.reject.entity.RejectEntity;
/**
 * 申请表 服务类
@@ -43,5 +45,28 @@
    ApplicationVO getVo(ApplicationEntity application);
    ApplicationEntity getMaxNoEntity();
    Boolean updateVoById(ApplicationEntity application, BasicInfoEntity basicInfoEntity, CarEntity carEntity, PlanEntity planEntity, SchemeEntity schemeEntity, GoodsEntity goodsEntity);
    ApplicationEntity getByNo(String no);
    /**
     * application 工作流
     * @param application
     * @param basicInfoEntity
     * @param carEntity
     * @param planEntity
     * @param schemeEntity
     * @param goodsEntity
     * @return
     */
    Boolean startProcess(ApplicationEntity application, BasicInfoEntity basicInfoEntity, CarEntity carEntity, PlanEntity planEntity, SchemeEntity schemeEntity, GoodsEntity goodsEntity);
    /**
     * 审核信息
     * @param flow
     * @return
     */
    Boolean completeTask(BladeFlow flow, ApplicationEntity applicationEntity, RejectEntity rejectEntity);
}
src/main/java/org/springblade/modules/application/service/impl/ApplicationServiceImpl.java
@@ -16,9 +16,26 @@
 */
package org.springblade.modules.application.service.impl;
import com.aliyun.oss.ServiceException;
import lombok.AllArgsConstructor;
import org.flowable.bpmn.model.*;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.springblade.common.utils.CommonUtil;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.support.Kv;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringUtil;
import org.springblade.flow.business.service.IFlowService;
import org.springblade.flow.core.constant.ProcessConstant;
import org.springblade.flow.core.entity.BladeFlow;
import org.springblade.flow.core.utils.FlowUtil;
import org.springblade.flow.core.utils.TaskUtil;
import org.springblade.modules.application.entity.*;
import org.springblade.modules.application.service.*;
import org.springblade.modules.application.vo.ApplicationVO;
@@ -26,10 +43,14 @@
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.modules.application.wrapper.ApplicationWrapper;
import org.springblade.modules.enterprise.wrapper.EnterpriseWrapper;
import org.springblade.modules.reject.entity.RejectEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
/**
 * 申请表 服务实现类
@@ -46,6 +67,11 @@
    private final IGoodsService goodsService;
    private final ICarService carService;
    private final IFlowService flowService;
    private final TaskService taskService;
    private final RuntimeService runtimeService;
    private final RepositoryService repositoryService;
    @Override
    public IPage<ApplicationVO> selectApplicationPage(IPage<ApplicationVO> page, ApplicationVO application) {
        return page.setRecords(baseMapper.selectApplicationPage(page, application));
@@ -54,6 +80,15 @@
    @Transactional
    @Override
    public Boolean saveVo(ApplicationEntity application, BasicInfoEntity basicInfoEntity, CarEntity carEntity, PlanEntity planEntity, SchemeEntity schemeEntity, GoodsEntity goodsEntity) {
        boolean result = false;
        //保存
        ApplicationEntity applicationEntity = getMaxNoEntity();
        String str = "";
        if (applicationEntity != null) {
            str = applicationEntity.getNo();
        }
        application.setNo(CommonUtil.createNo("", str));
        boolean save = super.save(application);
        basicInfoEntity.setApplicationId(application.getId().toString());
@@ -70,8 +105,9 @@
        carEntity.setApplicationId(application.getId().toString());
        boolean c = carService.save(carEntity);
        result = b && p && s && g && c && save;
        return b&&p&&s&&g&&c&&save;
        return result;
    }
    @Override
@@ -107,7 +143,137 @@
        boolean s = schemeService.updateById(schemeEntity);
        boolean g = goodsService.updateById(goodsEntity);
        boolean update = super.updateById(application);
        return  b&&p&&s&&g&&c&&update;
        return b && p && s && g && c && update;
    }
    @Override
    public ApplicationEntity getByNo(String no) {
        return baseMapper.getByNo(no);
    }
    @Override
    public Boolean startProcess(ApplicationEntity application, BasicInfoEntity basicInfoEntity, CarEntity carEntity, PlanEntity planEntity, SchemeEntity schemeEntity, GoodsEntity goodsEntity) {
        boolean result = false;
        String businessTable = FlowUtil.getBusinessTable(ProcessConstant.AUDIT_KEY);
        if (Func.isEmpty(application.getId())) {
            //保存
            ApplicationEntity applicationEntity = getMaxNoEntity();
            String str = "";
            if (applicationEntity != null) {
                str = applicationEntity.getNo();
            }
            application.setNo(CommonUtil.createNo("", str));
            boolean save = super.save(application);
            basicInfoEntity.setApplicationId(application.getId().toString());
            boolean b = basicInfoService.save(basicInfoEntity);
            planEntity.setApplicationId(application.getId().toString());
            boolean p = planService.save(planEntity);
            schemeEntity.setApplicationId(application.getId().toString());
            boolean s = schemeService.save(schemeEntity);
            goodsEntity.setApplicationId(application.getId().toString());
            boolean g = goodsService.save(goodsEntity);
            carEntity.setApplicationId(application.getId().toString());
            boolean c = carService.save(carEntity);
            result = b && p && s && g && c && save;
            //启动流程
            Kv variables = Kv.create()
                .set(ProcessConstant.TASK_VARIABLE_CREATE_USER, basicInfoEntity.getName())
                .set("taskUser", TaskUtil.getTaskUser(application.getTaskUser()));
            BladeFlow flow = flowService.startProcessInstanceById(application.getProcessDefinitionId(), FlowUtil.getBusinessKey(businessTable, String.valueOf(application.getId())), variables);
            if (Func.isNotEmpty(flow)) {
                log.error("流程已启动,流程ID:" + flow.getProcessInstanceId());
                // 返回流程id写入leave
                application.setProcessInstanceId(flow.getProcessInstanceId());
                updateById(application);
            } else {
                throw new ServiceException("开启流程失败");
            }
        } else {
            updateById(application);
        }
        return result;
    }
    @Override
    public Boolean completeTask(BladeFlow flow, ApplicationEntity applicationEntity, RejectEntity rejectEntity) {
        String taskId = flow.getTaskId();
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
        //  通过任务对象获取流程实例
        ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
        // 通过流程实例获取“业务键”
        String businessKey = pi.getBusinessKey().split(":")[1];
        //获取实例对象改变业务状态
        ApplicationEntity entity = getById(businessKey);
        if (!StringUtil.isBlank(applicationEntity.getSuggestion())){
            entity.setSuggestion(applicationEntity.getSuggestion());
        }
        if (entity.getStatus() == 1){
            entity.setStatus(2);
        }
        String processInstanceId = flow.getProcessInstanceId();
        String comment = Func.toStr(flow.getComment(), ProcessConstant.PASS_COMMENT);
        // 增加评论
        if (StringUtil.isNoneBlank(processInstanceId, comment)) {
            taskService.addComment(taskId, processInstanceId, comment);
        }
        // 创建变量
        Map<String, Object> variables = flow.getVariables();
        if (variables == null) {
            variables = Kv.create();
        }
        variables.put("suggestion",Func.toStr(applicationEntity.getSuggestion(),""));
        variables.put(ProcessConstant.PASS_KEY, flow.isPass());
        // 完成任务
        taskService.complete(taskId, variables);
        //判读是否有末尾节点
        if (getEndNode(task,entity.getProcessDefinitionId())){
            //判断是否pass
            if ((Boolean)variables.get(ProcessConstant.PASS_KEY)){
                //改变业务状态
                entity.setStatus(10);
                //生成通行证
            }
        }
        updateById(entity);
        return true;
    }
    /**
     * 获取最大编号
     *
     * @return
     */
    public ApplicationEntity getMaxNoEntity() {
        return baseMapper.getMaxNoEntity();
    }
    public boolean getEndNode(Task task,String definitionId){
        BpmnModel bpmnModel = repositoryService.getBpmnModel(definitionId);
        FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey());
        List<SequenceFlow> outgoingFlows = flowNode.getOutgoingFlows();
        for (SequenceFlow outgoingFlow : outgoingFlows) {
            FlowElement targetFlowElement = outgoingFlow.getTargetFlowElement();
            if (targetFlowElement instanceof EndEvent){
                return true;
            }
        }
        return false;
    }
}
src/main/java/org/springblade/modules/enterprise/wrapper/EnterpriseWrapper.java
@@ -18,6 +18,7 @@
import org.springblade.core.mp.support.BaseEntityWrapper;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.ObjectUtil;
import org.springblade.modules.enterprise.entity.EnterpriseEntity;
import org.springblade.modules.enterprise.vo.EnterpriseVO;
import java.util.Objects;
@@ -36,14 +37,19 @@
    @Override
    public EnterpriseVO entityVO(EnterpriseEntity enterprise) {
        EnterpriseVO enterpriseVO = Objects.requireNonNull(BeanUtil.copy(enterprise, EnterpriseVO.class));
        if (ObjectUtil.isNotEmpty(enterprise)){
            EnterpriseVO enterpriseVO = Objects.requireNonNull(BeanUtil.copy(enterprise, EnterpriseVO.class));
        //User createUser = UserCache.getUser(enterprise.getCreateUser());
        //User updateUser = UserCache.getUser(enterprise.getUpdateUser());
        //enterpriseVO.setCreateUserName(createUser.getName());
        //enterpriseVO.setUpdateUserName(updateUser.getName());
            //User createUser = UserCache.getUser(enterprise.getCreateUser());
            //User updateUser = UserCache.getUser(enterprise.getUpdateUser());
            //enterpriseVO.setCreateUserName(createUser.getName());
            //enterpriseVO.setUpdateUserName(updateUser.getName());
        return enterpriseVO;
            return enterpriseVO;
        }else {
            return null;
        }
    }
src/main/java/org/springblade/modules/reject/controller/RejectController.java
New file
@@ -0,0 +1,126 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill 庄骞 (smallchill@163.com)
 */
package org.springblade.modules.reject.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import lombok.AllArgsConstructor;
import javax.validation.Valid;
import org.springblade.core.secure.BladeUser;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.modules.reject.entity.RejectEntity;
import org.springblade.modules.reject.vo.RejectVO;
import org.springblade.modules.reject.wrapper.RejectWrapper;
import org.springblade.modules.reject.service.IRejectService;
import org.springblade.core.boot.ctrl.BladeController;
/**
 * 拒绝申请表 控制器
 *
 * @author BladeX
 * @since 2022-12-15
 */
@RestController
@AllArgsConstructor
@RequestMapping("reject/reject")
@Api(value = "拒绝申请表", tags = "拒绝申请表接口")
public class RejectController extends BladeController {
    private final IRejectService rejectService;
    /**
     * 拒绝申请表 详情
     */
    @GetMapping("/detail")
    @ApiOperationSupport(order = 1)
    @ApiOperation(value = "详情", notes = "传入reject")
    public R<RejectVO> detail(RejectEntity reject) {
        RejectEntity detail = rejectService.getOne(Condition.getQueryWrapper(reject));
        return R.data(RejectWrapper.build().entityVO(detail));
    }
    /**
     * 拒绝申请表 分页
     */
    @GetMapping("/list")
    @ApiOperationSupport(order = 2)
    @ApiOperation(value = "分页", notes = "传入reject")
    public R<IPage<RejectVO>> list(RejectEntity reject, Query query) {
        IPage<RejectEntity> pages = rejectService.page(Condition.getPage(query), Condition.getQueryWrapper(reject));
        return R.data(RejectWrapper.build().pageVO(pages));
    }
    /**
     * 拒绝申请表 自定义分页
     */
    @GetMapping("/page")
    @ApiOperationSupport(order = 3)
    @ApiOperation(value = "分页", notes = "传入reject")
    public R<IPage<RejectVO>> page(RejectVO reject, Query query) {
        IPage<RejectVO> pages = rejectService.selectRejectPage(Condition.getPage(query), reject);
        return R.data(pages);
    }
    /**
     * 拒绝申请表 新增
     */
    @PostMapping("/save")
    @ApiOperationSupport(order = 4)
    @ApiOperation(value = "新增", notes = "传入reject")
    public R save(@Valid @RequestBody RejectEntity reject) {
        return R.status(rejectService.save(reject));
    }
    /**
     * 拒绝申请表 修改
     */
    @PostMapping("/update")
    @ApiOperationSupport(order = 5)
    @ApiOperation(value = "修改", notes = "传入reject")
    public R update(@Valid @RequestBody RejectEntity reject) {
        return R.status(rejectService.updateById(reject));
    }
    /**
     * 拒绝申请表 新增或修改
     */
    @PostMapping("/submit")
    @ApiOperationSupport(order = 6)
    @ApiOperation(value = "新增或修改", notes = "传入reject")
    public R submit(@Valid @RequestBody RejectEntity reject) {
        return R.status(rejectService.saveOrUpdate(reject));
    }
    /**
     * 拒绝申请表 删除
     */
    @PostMapping("/remove")
    @ApiOperationSupport(order = 7)
    @ApiOperation(value = "逻辑删除", notes = "传入ids")
    public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
        return R.status(rejectService.deleteLogic(Func.toLongList(ids)));
    }
}
src/main/java/org/springblade/modules/reject/dto/RejectDTO.java
New file
@@ -0,0 +1,34 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill 庄骞 (smallchill@163.com)
 */
package org.springblade.modules.reject.dto;
import org.springblade.modules.reject.entity.RejectEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * 拒绝申请表 数据传输对象实体类
 *
 * @author BladeX
 * @since 2022-12-15
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class RejectDTO extends RejectEntity {
    private static final long serialVersionUID = 1L;
}
src/main/java/org/springblade/modules/reject/entity/RejectEntity.java
New file
@@ -0,0 +1,55 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill 庄骞 (smallchill@163.com)
 */
package org.springblade.modules.reject.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.Date;
import lombok.EqualsAndHashCode;
import org.springblade.core.tenant.mp.TenantEntity;
/**
 * 拒绝申请表 实体类
 *
 * @author BladeX
 * @since 2022-12-15
 */
@Data
@TableName("sys_reject")
@ApiModel(value = "Reject对象", description = "拒绝申请表")
@EqualsAndHashCode(callSuper = true)
public class RejectEntity extends TenantEntity {
    /**
     * 申请编号
     */
    @ApiModelProperty(value = "申请编号")
    private String no;
    /**
     * 拒绝理由
     */
    @ApiModelProperty(value = "拒绝理由")
    private String rejectReason;
    /**
     * 备注
     */
    @ApiModelProperty(value = "备注")
    private String remark;
}
src/main/java/org/springblade/modules/reject/mapper/RejectMapper.java
New file
@@ -0,0 +1,43 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill 庄骞 (smallchill@163.com)
 */
package org.springblade.modules.reject.mapper;
import org.springblade.modules.reject.entity.RejectEntity;
import org.springblade.modules.reject.vo.RejectVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.util.List;
/**
 * 拒绝申请表 Mapper 接口
 *
 * @author BladeX
 * @since 2022-12-15
 */
public interface RejectMapper extends BaseMapper<RejectEntity> {
    /**
     * 自定义分页
     *
     * @param page
     * @param reject
     * @return
     */
    List<RejectVO> selectRejectPage(IPage page, RejectVO reject);
}
src/main/java/org/springblade/modules/reject/mapper/RejectMapper.xml
New file
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.springblade.modules.reject.mapper.RejectMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="rejectResultMap" type="org.springblade.modules.reject.entity.RejectEntity">
        <result column="id" property="id"/>
        <result column="no" property="no"/>
        <result column="reject_reason" property="rejectReason"/>
        <result column="remark" property="remark"/>
        <result column="tenant_id" property="tenantId"/>
        <result column="create_user" property="createUser"/>
        <result column="create_dept" property="createDept"/>
        <result column="create_time" property="createTime"/>
        <result column="update_user" property="updateUser"/>
        <result column="update_time" property="updateTime"/>
        <result column="status" property="status"/>
        <result column="is_deleted" property="isDeleted"/>
    </resultMap>
    <select id="selectRejectPage" resultMap="rejectResultMap">
        select * from sys_reject where is_deleted = 0
    </select>
</mapper>
src/main/java/org/springblade/modules/reject/service/IRejectService.java
New file
@@ -0,0 +1,42 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill 庄骞 (smallchill@163.com)
 */
package org.springblade.modules.reject.service;
import org.springblade.modules.reject.entity.RejectEntity;
import org.springblade.modules.reject.vo.RejectVO;
import org.springblade.core.mp.base.BaseService;
import com.baomidou.mybatisplus.core.metadata.IPage;
/**
 * 拒绝申请表 服务类
 *
 * @author BladeX
 * @since 2022-12-15
 */
public interface IRejectService extends BaseService<RejectEntity> {
    /**
     * 自定义分页
     *
     * @param page
     * @param reject
     * @return
     */
    IPage<RejectVO> selectRejectPage(IPage<RejectVO> page, RejectVO reject);
}
src/main/java/org/springblade/modules/reject/service/impl/RejectServiceImpl.java
New file
@@ -0,0 +1,57 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill 庄骞 (smallchill@163.com)
 */
package org.springblade.modules.reject.service.impl;
import org.springblade.modules.application.entity.ApplicationEntity;
import org.springblade.modules.application.service.IApplicationService;
import org.springblade.modules.reject.entity.RejectEntity;
import org.springblade.modules.reject.vo.RejectVO;
import org.springblade.modules.reject.mapper.RejectMapper;
import org.springblade.modules.reject.service.IRejectService;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.metadata.IPage;
/**
 * 拒绝申请表 服务实现类
 *
 * @author BladeX
 * @since 2022-12-15
 */
@Service
public class RejectServiceImpl extends BaseServiceImpl<RejectMapper, RejectEntity> implements IRejectService {
    @Autowired
    IApplicationService applicationService;
    @Override
    public IPage<RejectVO> selectRejectPage(IPage<RejectVO> page, RejectVO reject) {
        return page.setRecords(baseMapper.selectRejectPage(page, reject));
    }
    @Override
    public boolean save(RejectEntity entity) {
        boolean save = super.save(entity);
        ApplicationEntity applicationEntity = applicationService.getByNo(entity.getNo());
        applicationEntity.setStatus(99);
        boolean update = applicationService.updateById(applicationEntity);
        return update&&save;
    }
}
src/main/java/org/springblade/modules/reject/vo/RejectVO.java
New file
@@ -0,0 +1,35 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill 庄骞 (smallchill@163.com)
 */
package org.springblade.modules.reject.vo;
import org.springblade.modules.reject.entity.RejectEntity;
import org.springblade.core.tool.node.INode;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * 拒绝申请表 视图实体类
 *
 * @author BladeX
 * @since 2022-12-15
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class RejectVO extends RejectEntity {
    private static final long serialVersionUID = 1L;
}
src/main/java/org/springblade/modules/reject/wrapper/RejectWrapper.java
New file
@@ -0,0 +1,50 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill 庄骞 (smallchill@163.com)
 */
package org.springblade.modules.reject.wrapper;
import org.springblade.core.mp.support.BaseEntityWrapper;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.modules.reject.entity.RejectEntity;
import org.springblade.modules.reject.vo.RejectVO;
import java.util.Objects;
/**
 * 拒绝申请表 包装类,返回视图层所需的字段
 *
 * @author BladeX
 * @since 2022-12-15
 */
public class RejectWrapper extends BaseEntityWrapper<RejectEntity, RejectVO>  {
    public static RejectWrapper build() {
        return new RejectWrapper();
     }
    @Override
    public RejectVO entityVO(RejectEntity reject) {
        RejectVO rejectVO = Objects.requireNonNull(BeanUtil.copy(reject, RejectVO.class));
        //User createUser = UserCache.getUser(reject.getCreateUser());
        //User updateUser = UserCache.getUser(reject.getUpdateUser());
        //rejectVO.setCreateUserName(createUser.getName());
        //rejectVO.setUpdateUserName(updateUser.getName());
        return rejectVO;
    }
}