package cn.timer.api.controller.spmk;


import java.io.Serializable;
import java.util.*;
import java.util.stream.Collectors;

import cn.hutool.core.convert.Convert;
import cn.hutool.db.sql.SqlBuilder;
import cn.timer.api.bean.crm.CrmBusinessGroupMember;
import cn.timer.api.bean.crm.CrmClientContacts;
import cn.timer.api.bean.kqmk.KqglAssoLeaveEmployeeBalance;
import cn.timer.api.bean.sche.ScheduleTask;
import cn.timer.api.bean.spmk.*;
import cn.timer.api.bean.zzgl.ZzglAuth;
import cn.timer.api.dao.spmk.*;
import cn.timer.api.dto.spmk.*;
import cn.timer.api.utils.redis.RedisUtil;
import cn.timer.api.utils.router.RequestDataUtils;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.SerializationUtils;
import com.beust.jcommander.internal.Lists;
import net.sf.json.JSONArray;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
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.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONObject;
import cn.timer.api.aspect.lang.annotation.Log;
import cn.timer.api.aspect.lang.enums.BusinessType;
import cn.timer.api.bean.kqgl.PunchRecord;
import cn.timer.api.bean.kqmk.KqglAssoLeaveRules;
import cn.timer.api.bean.qyzx.QyzxEmpEntAsso;
import cn.timer.api.bean.yggl.YgglMainEmp;
import cn.timer.api.bean.zzgl.ZzglBmgwM;
import cn.timer.api.config.annotation.CurrentUser;
import cn.timer.api.config.annotation.UserBean;
import cn.timer.api.config.enuminterface.SpmkEnumInterface;
import cn.timer.api.config.enuminterface.SpmkEnumInterface.ApproveSummarySts;
import cn.timer.api.config.enuminterface.SpmkEnumInterface.ExecutorSts;
import cn.timer.api.config.enums.CommonEnum;
import cn.timer.api.config.enums.SysRoleType;
import cn.timer.api.config.exception.CustomException;
import cn.timer.api.config.validation.Insert;
import cn.timer.api.config.validation.Ranks;
import cn.timer.api.config.validation.Update;
import cn.timer.api.config.validation.ValidList;
import cn.timer.api.controller.spmk.service.SpmkService;
import cn.timer.api.controller.yggl.service.YgglService;
import cn.timer.api.controller.zzgl.service.ZzglBmgwMService;
import cn.timer.api.dao.kqgl.PunchRecordMapper;
import cn.timer.api.dao.qyzx.QyzxEmpEntAssoMapper;
import cn.timer.api.utils.Result;
import cn.timer.api.utils.ResultUtil;
import cn.timer.api.utils.router.RouterUtils;
import cn.timer.api.utils.router.business.SpmkAssoBusiness;
import cn.timer.api.utils.router.business.SpmkAssoBusinessFactory;
import cn.timer.api.utils.router.enums.ApproveEnum;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

import javax.annotation.Resource;

@Api(tags = "3.0审批模块")
@RestController
@Transactional
@RequestMapping(value = "/spmk", produces = {"application/json", "multipart/form-data"})
public class SpmkController {

    @Autowired
    private SpmkService spmkService;
    @Autowired
    private ZzglBmgwMService zzglBmgwMService;

    @Autowired
    private QyzxEmpEntAssoMapper qyzxEmpEntAssoMapper;
    @Autowired
    private SpmkApprovalTemplateGMapper spmkApprovalTemplateGMapper;
    @Autowired
    private SpmkApprovalTemplateMapper spmkApprovalTemplateMapper;
    @Autowired
    private SpmkApprovalGMapper spmkApprovalGMapper;
    @Autowired
    private SpmkCustomApprovalMapper spmkCustomApprovalMapper;
    @Autowired
    private SpmkApproveSummaryMapper spmkApproveSummaryMapper;
    @Autowired
    private SpmkApproveExecuteRecordMapper spmkApproveExecuteRecordMapper;
    @Autowired
    private SpmkExecutorMapper spmkExecutorMapper;
    @Autowired
    private SpmkInitiatorConfigMapper spmkInitiatorConfigMapper;
    @Autowired
    private SpmkApproveDetailSummaryMapper spmkApproveDetailSummaryMapper;

    @Autowired
    private SpmkAssoBusinessFactory spmkAssoBusinessFactory;

    @Autowired
    private SpmkApproveDetailDraftsMapper spmkApproveDetailDraftsMapper;

    private static com.alibaba.fastjson.JSONObject jsonObject = new com.alibaba.fastjson.JSONObject();

    private boolean ISFIRST = true; // 第一次启动审批流程

    @Resource
    private RedisUtil redisUtil;

    @Autowired
    private SpmkApproveDraftsMapper spmkApproveDraftsMapper;


    //TODO 审批模板组

    /**
     * 新增或编辑-审批模板组
     */
    @PostMapping(value = "/save_approval_template_g")
    @ApiOperation(value = "1.新增或编辑-审批模板组", httpMethod = "POST", notes = "新增或编辑-审批模板组")
    @ApiOperationSupport(order = 1)
    public Result<Object> saveAtg(@Validated({Insert.class, Update.class}) @RequestBody SpmkApprovalTemplateG spmkApprovalTemplateG) {

        if (spmkApprovalTemplateG.selectCount(new QueryWrapper<SpmkApprovalTemplateG>().lambda()
                .ne(spmkApprovalTemplateG.getId() != null, SpmkApprovalTemplateG::getId, spmkApprovalTemplateG.getId())
                .eq(SpmkApprovalTemplateG::getName, spmkApprovalTemplateG.getName())) > 0) {
            return ResultUtil.error("审批模板组名重复!");
        }

        return spmkApprovalTemplateG.insertOrUpdate() ?
                ResultUtil.data(spmkApprovalTemplateG) : ResultUtil.error();
    }

    /**
     * 删除-审批模板组
     */
    @DeleteMapping(value = "/delete_approval_template_g/{id}")
    @ApiOperation(value = "2.删除-审批模板组", httpMethod = "DELETE", notes = "删除-审批模板组")
    @ApiOperationSupport(order = 2)
    public Result<Object> deleteAtgById(@PathVariable int id) {

        if (spmkApprovalTemplateMapper.selectCount(new QueryWrapper<SpmkApprovalTemplate>().lambda().eq(SpmkApprovalTemplate::getApprovalTemplateGId, id)) > 0)
            return ResultUtil.error("审批模板组存在 模板,不可直接删除!");

        return SpmkApprovalTemplateG.builder().id(id).build().deleteById() ?
                ResultUtil.success() : ResultUtil.error("没有找到该对象");
    }

    /**
     * 查询列表-审批模板组
     */
    @GetMapping(value = "/list_approval_template_g")
    @ApiOperation(value = "3.查询列表-审批模板组", httpMethod = "GET", notes = "查询列表-审批模板组")
    @ApiOperationSupport(order = 3)
    public Result<Object> selectListAtg() {

        return ResultUtil.data(spmkApprovalTemplateGMapper.selectListAtInAtg());
    }

    /**
     * 排序-审批模板组
     */
    @PutMapping(value = "/update_approval_template_g")
    @ApiOperation(value = "4.排序-审批模板组", httpMethod = "PUT", notes = "排序-审批模板组")
    @ApiOperationSupport(order = 4)
    public Result<Object> ranksAtg(@Validated(Ranks.class) @RequestBody ValidList<SpmkApprovalTemplateG> list) {

        if (list == null || (list != null && list.size() <= 0)) {
            return ResultUtil.success();
        }
        return spmkApprovalTemplateGMapper.updateListRandsById(list) ? ResultUtil.success() : ResultUtil.error();
    }

    //TODO 审批模板

    /**
     * 新增或编辑-审批模板
     */
    @PostMapping(value = "/save_approval_template")
    @ApiOperation(value = "5.新增或编辑-审批模板", httpMethod = "POST", notes = "新增或编辑-审批模板")
    @ApiOperationSupport(order = 5)
    public Result<Object> saveAt(@Validated @RequestBody SpmkApprovalTemplateDto spmkApprovalTemplateDto) {

        Integer approvalTemplateGId = spmkApprovalTemplateDto.getApprovalTemplateGId();
        if (ObjectUtil.isNull(approvalTemplateGId))
            return ResultUtil.error("审批模板ID不为空");

        SpmkApprovalTemplate at = SpmkApprovalTemplate.builder().build();

        // 克隆 SpmkApprovalTemplateDto对象 到 SpmkApprovalTemplate对象,排除属性froms,router
        BeanUtil.copyProperties(spmkApprovalTemplateDto, at, "froms", "router");
        // 序列化 后 写入 SpmkApprovalTemplate对象
        at.setFroms(ObjectUtil.serialize((List<JSONObject>) spmkApprovalTemplateDto.getFroms()));
        at.setRouter(ObjectUtil.serialize(spmkApprovalTemplateDto.getRouter()));

        if (at.selectCount(new QueryWrapper<SpmkApprovalTemplate>().lambda()
                .ne(at.getId() != null, SpmkApprovalTemplate::getId, at.getId())
                .eq(SpmkApprovalTemplate::getName, at.getName())) > 0) {
            return ResultUtil.error("审批模板名重复!");
        }

        if (!at.insertOrUpdate())
            return ResultUtil.error("数据库操作失败");

        // 清空前端不需要的字段再返回,节省流量
        at.setFroms(null);
        at.setRouter(null);
        return ResultUtil.data(at);

    }

    /**
     * 删除-审批模板
     */
    @DeleteMapping(value = "/delete_approval_template/{id}")
    @ApiOperation(value = "6.删除-审批模板", httpMethod = "DELETE", notes = "删除-审批模板")
    @ApiOperationSupport(order = 6)
    public Result<Object> deleteAtById(@PathVariable int id) {

        return SpmkApprovalTemplate.builder().id(id).build().deleteById() ? ResultUtil.success() : ResultUtil.error("没有找到该对象");

    }

    /**
     * id查询-审批模板
     */
    @GetMapping(value = "/select_approval_template/{id}")
    @ApiOperation(value = "7.id查询-审批模板", httpMethod = "GET", notes = "id查询-审批模板")
    @ApiOperationSupport(order = 7)
    public Result<Object> selectAtById(@PathVariable int id) {
        SpmkApprovalTemplate at = SpmkApprovalTemplate.builder().id(id).build().selectById();

        SpmkApprovalTemplateDto atd = SpmkApprovalTemplateDto.builder().build();
        BeanUtil.copyProperties(at, atd, "froms", "router");
        atd.setFroms(ObjectUtil.deserialize(at.getFroms()));
        atd.setRouter(ObjectUtil.deserialize(at.getRouter()));
        return ResultUtil.data(atd);

    }

    /**
     * 排序-审批模板
     */
    @PutMapping(value = "/update_approval_template")
    @ApiOperation(value = "8.排序-审批模板", httpMethod = "PUT", notes = "查询列表-审批模板组")
    @ApiOperationSupport(order = 8)
    public Result<Object> ranksAt(@Validated({Ranks.class}) @RequestBody ValidList<SpmkApprovalTemplate> list) {

        if (list == null || (list != null && list.size() <= 0)) {
            return ResultUtil.success();
        }

        return spmkApprovalTemplateMapper.updateListRandsById(list) ? ResultUtil.success() : ResultUtil.error();

    }


    //TODO 审批组

    /**
     * 新增或编辑-审批组
     */
    @PostMapping(value = "/save_approval_g")
    @ApiOperation(value = "9.新增或编辑-审批组", httpMethod = "POST", notes = "新增或编辑-审批组")
    @ApiOperationSupport(order = 9)
    public Result<Object> saveAg(@CurrentUser UserBean userBean, @Validated({Insert.class, Update.class}) @RequestBody SpmkApprovalG spmkApprovalG) {

        if (spmkApprovalG.selectCount(new QueryWrapper<SpmkApprovalG>().lambda()
                .ne(spmkApprovalG.getId() != null, SpmkApprovalG::getId, spmkApprovalG.getId())
                .eq(SpmkApprovalG::getName, spmkApprovalG.getName())
                .eq(SpmkApprovalG::getOrgCode, userBean.getOrgCode())) > 0) {
            return ResultUtil.error("审批组名重复!");
        }

        spmkApprovalG.setOrgCode(userBean.getOrgCode());
        return spmkApprovalG.insertOrUpdate() ? ResultUtil.data(spmkApprovalG) : ResultUtil.error();

    }

    /**
     * 删除-审批组
     */
    @DeleteMapping(value = "/delete_approval_g/{id}")
    @ApiOperation(value = "10.删除-审批组", httpMethod = "DELETE", notes = "删除-审批组")
    @ApiOperationSupport(order = 10)
    public Result<Object> deleteAgById(@PathVariable int id) {

//		if (spmkCustomApprovalMapper.selectCount(new QueryWrapper<SpmkCustomApproval>().lambda().eq(SpmkCustomApproval::getApprovalGId, id)) > 0 )
//			return ResultUtil.error("审批组存在 自定义审批,不可直接删除!");

        SpmkCustomApproval.builder().build().delete(new QueryWrapper<SpmkCustomApproval>().lambda().eq(SpmkCustomApproval::getApprovalGId, id));
        return SpmkApprovalG.builder().id(id).build().deleteById() ? ResultUtil.success() : ResultUtil.error("没有找到该对象");

    }

    /**
     * 查询列表-审批组-审批管理
     */
    @GetMapping(value = "/all_approval_g")
    @ApiOperation(value = "11.查询列表-审批组-审批管理", httpMethod = "GET", notes = "查询列表-审批组-审批管理")
    @ApiOperationSupport(order = 11)
    public Result<Object> selectListAgByAdmin(@CurrentUser UserBean userBean) {

        List<Integer> depts = zzglBmgwMService.empNumupGetDepts(userBean.getOrgCode(), userBean.getEmpNum());
        return ResultUtil.data(spmkApprovalGMapper.selectListAgInCaByAdmin(userBean.getOrgCode(), userBean.getEmpNum(), depts));

    }

    /**
     * 查询列表-审批组-审批管理  新增查询
     */
    @GetMapping(value = "/all_approval_g1")
    @ApiOperation(value = "11.查询列表-审批组-审批管理", httpMethod = "GET", notes = "查询列表-审批组-审批管理")
    @ApiOperationSupport(order = 11)
    public Result<Object> selectListAgByAdmin1(@CurrentUser UserBean userBean, @RequestParam("eaaname") String eaaname) {

        List<Integer> depts = zzglBmgwMService.empNumupGetDepts(userBean.getOrgCode(), userBean.getEmpNum());
        return ResultUtil.data(spmkApprovalGMapper.selectListAgInCaByAdmin1(userBean.getOrgCode(), userBean.getEmpNum(), depts, eaaname));

    }

    /**
     * 查询列表-审批组-个人审批
     */
    @GetMapping(value = "/list_approval_g")
    @ApiOperation(value = "11.查询列表-审批组-个人审批", httpMethod = "GET", notes = "查询列表-审批组-个人审批")
    @ApiOperationSupport(order = 11)
    public Result<Object> selectListAg(@CurrentUser UserBean userBean) {
        List<SpmkApprovalG> spmkApprovalGS = spmkService.selectListAg(userBean);
        return ResultUtil.data(spmkService.selectListAg(userBean));
    }

    /**
     * 排序-审批组
     */
    @PutMapping(value = "/update_approval_g")
    @ApiOperation(value = "12.排序-审批组", httpMethod = "PUT", notes = "排序-审批组")
    @ApiOperationSupport(order = 12)
    public Result<Object> ranksAg(@Validated({Ranks.class}) @RequestBody ValidList<SpmkApprovalG> list) {

        if (list == null || list.size() <= 0) {
            return ResultUtil.success();
        }

        return spmkApprovalGMapper.updateListRandsById(list) ? ResultUtil.success() : ResultUtil.error();
    }

    //TODO 自定义审批

    /**
     * 新增或编辑-自定义审批
     */
    @PostMapping(value = "/save_custom_approval")
    @ApiOperation(value = "13.新增或编辑-自定义审批", httpMethod = "POST", notes = "新增或编辑-自定义审批")
    @ApiOperationSupport(order = 13)
    @Transactional(rollbackFor = Exception.class)
    public Result<Object> saveCa(@CurrentUser UserBean userBean, @Validated @RequestBody SpmkCustomApprovalDto spmkCustomApprovalDto) throws Exception {

        SpmkCustomApproval ca = SpmkCustomApproval.builder().build();

        BeanUtil.copyProperties(spmkCustomApprovalDto, ca, "froms", "router", "initiatorConfigs");

        if (ca.selectCount(new QueryWrapper<SpmkCustomApproval>().lambda()
                .ne(ca.getId() != null, SpmkCustomApproval::getId, ca.getId())
                .eq(SpmkCustomApproval::getName, ca.getName())
                .eq(SpmkCustomApproval::getOrgCode, userBean.getOrgCode())) > 0) {
            return ResultUtil.error("自定义审批名重复!");
        }
        ca.setOrgCode(userBean.getOrgCode());
        ca.setFroms(ObjectUtil.serialize(spmkCustomApprovalDto.getFroms()));
        ca.setRouter(ObjectUtil.serialize(spmkCustomApprovalDto.getRouter()));
        ca.setUpdateTime(new Date());

        //1.新增 SpmkCustomApproval-自定义审批
        if (!ca.insertOrUpdate())
            return ResultUtil.error("新增自定义审批 失败!");


        Integer id = ca.getId();
        // 2.删除	历史的  SpmkInitiatorConfig-审批发起人配置,
        SpmkInitiatorConfig.builder().build().delete(new QueryWrapper<SpmkInitiatorConfig>().lambda().eq(SpmkInitiatorConfig::getCustomApprovalId, id));
        Console.log("自定义审批id: " + id);
        List<SpmkInitiatorConfig> listIc = spmkCustomApprovalDto.getInitiatorConfigs();

        if (listIc != null && listIc.size() > 0) {
            for (int i = 0, n = listIc.size(); i < n; i++) {
                listIc.get(i).setCustomApprovalId(id);
            }
            // 3.新增	最新的 SpmkInitiatorConfig-审批发起人配置,
            if (!spmkInitiatorConfigMapper.insertList(listIc)) {
                // 手动抛出异常,事务回滚
                throw new Exception();
            }

        }

        //
        /**
         * 注意: 为保证该api的原子性 要加 事务处理 回滚(方法注解-@Transactional(rollbackFor = Exception.class))
         * 1.新增 SpmkCustomApproval-自定义审批
         * 2.删除	历史的  SpmkInitiatorConfig-审批发起人配置,
         * 3.新增	最新的 SpmkInitiatorConfig-审批发起人配置,
         */

        // 清空前端不需要的字段再返回,节省流量
        ca.setFroms(null);
        ca.setRouter(null);
        return ResultUtil.data(ca);

    }

    /**
     * 删除-自定义审批
     *
     * @throws Exception
     */
    @DeleteMapping(value = "/delete_custom_approval/{id}")
    @ApiOperation(value = "14.删除-自定义审批", httpMethod = "DELETE", notes = "删除-自定义审批")
    @Transactional(rollbackFor = Exception.class)
    @ApiOperationSupport(order = 14)
    public Result<Object> deleteCaById(@PathVariable int id) throws Exception {
        SpmkInitiatorConfig.builder().build().delete(new QueryWrapper<SpmkInitiatorConfig>().lambda().eq(SpmkInitiatorConfig::getCustomApprovalId, id));

        if (!SpmkCustomApproval.builder().id(id).build().deleteById()) {
            throw new Exception();
        }

        return ResultUtil.success();
    }

    /**
     * id查询-自定义审批
     */
    @GetMapping(value = "/select_custom_approval/{id}")
    @ApiOperation(value = "15.id查询-自定义审批", httpMethod = "GET", notes = "id查询-自定义审批")
    @ApiOperationSupport(order = 15)
    public Result<Object> selectCaById(@PathVariable int id) {
        SpmkCustomApproval ca = SpmkCustomApproval.builder().id(id).build().selectById();
        List<SpmkInitiatorConfig> listIc = SpmkInitiatorConfig.builder().build().selectList(new QueryWrapper<SpmkInitiatorConfig>().lambda().eq(SpmkInitiatorConfig::getCustomApprovalId, id));
        SpmkCustomApprovalDto caD = SpmkCustomApprovalDto.builder()
                .froms(ObjectUtil.deserialize(ca.getFroms()))
                .router(ObjectUtil.deserialize(ca.getRouter()))
                .build();
        BeanUtil.copyProperties(ca, caD, "froms", "router");
        caD.setInitiatorConfigs(listIc);
        return ResultUtil.data(caD);
    }

    /**
     * 排序-自定义审批
     */
    @PutMapping(value = "/update_custom_approval")
    @ApiOperation(value = "16.排序-自定义审批", httpMethod = "PUT", notes = "排序-自定义审批")
    @ApiOperationSupport(order = 16)
    public Result<Object> ranksCa(@Validated({Ranks.class}) @RequestBody ValidList<SpmkCustomApproval> list) {

        if (list == null || (list != null && list.size() <= 0)) {
            return ResultUtil.success();
        }

        return spmkCustomApprovalMapper.updateListRandsById(list) ? ResultUtil.success() : ResultUtil.error();
    }

    @Autowired
    YgglService ygglService;

    /**
     * 排序-自定义审批
     */
    @PutMapping(value = "/test_spmk")
    @ApiOperation(value = "16.测试", httpMethod = "PUT", notes = "排序-自定义审批")
    @ApiOperationSupport(order = 16)
    public Result<Object> test222(@Validated({Ranks.class}) @RequestBody ValidList<SpmkCustomApproval> list) {

        Set<Integer> lanzi = new HashSet<Integer>();
        //所有部门岗位
        List<ZzglBmgwM> bmgws = ZzglBmgwM.builder().build().selectList(new QueryWrapper<ZzglBmgwM>().lambda().eq(ZzglBmgwM::getOrgCode, 311));
        //个人岗位
        YgglMainEmp one = YgglMainEmp.builder().build().selectOne(new QueryWrapper<YgglMainEmp>().lambda()
                .select(YgglMainEmp::getBmgwId)
                .eq(YgglMainEmp::getOrgCode, 311).eq(YgglMainEmp::getEmpNum, 12512));

        Integer getId = one != null ? one.getBmgwId() : null;
        Set<Integer> all = getId != null ? empNumupdept2(lanzi, bmgws, getId) : new HashSet<Integer>();
        all.add(getId);
        return spmkCustomApprovalMapper.updateListRandsById(list) ? ResultUtil.success() : ResultUtil.error();
    }

    //遍历
    public static Set<Integer> empNumupdept2(Set<Integer> lanzi, List<ZzglBmgwM> bmgws, Integer getId) {
        for (ZzglBmgwM z : bmgws) {
            if (getId.equals(z.getId())) {
                lanzi.add(getId);
                if (z.getUpId() == null || z.getUpId() == 0) {
                    return lanzi;
                }
                getId = z.getUpId();
                empNumupdept2(lanzi, bmgws, getId);
            }
        }
        return lanzi;
    }

    // TODO 审批汇总(发起审批)

    /**
     * 发起审批
     *
     * @throws Exception
     */
    @PostMapping(value = "/start_approval")
    @ApiOperation(value = "17.发起审批", httpMethod = "POST", notes = "发起审批")
    @ApiOperationSupport(order = 17)
    @Transactional(rollbackFor = Exception.class)
    @Log(title = "审批-发起审批", businessType = BusinessType.INSERT)
    public Result<Object> saveA(@CurrentUser UserBean userBean, @Validated @RequestBody SpmkApproveSummaryDto spmkApproveSummaryDto) throws Exception {
        YgglMainEmp ygglMainEmp = YgglMainEmp.builder().build().selectOne(new QueryWrapper<YgglMainEmp>()
                .lambda()
                .select(YgglMainEmp::getHeadUrl, YgglMainEmp::getName)
                .eq(YgglMainEmp::getEmpNum, userBean.getEmpNum())
                .eq(YgglMainEmp::getOrgCode, userBean.getOrgCode())
        );

        if (ygglMainEmp == null)
            return ResultUtil.error("发起人不存在!");

//			List<SpmkApprovalG> saG = spmkService.selectListAg(userBean);

        Router router = spmkApproveSummaryDto.getRouter();
//			routers = RouterUtils.clearRouters(routers);
        /*TODO 验证是否拥有添加审核人的权限 只用于华颐*/
        QyzxEmpEntAsso ent = QyzxEmpEntAsso.builder().build().selectOne(new QueryWrapper<QyzxEmpEntAsso>().lambda().eq(QyzxEmpEntAsso::getOrgCode, userBean.getOrgCode()).eq(QyzxEmpEntAsso::getEmpNum, userBean.getEmpNum()));
        if (ent != null) {
            /*超管和管理员不受权限控制*/
            if (ent.getUserType() == 2) {
                ZzglAuth zzglAuth = ZzglAuth.builder().build().selectOne(new QueryWrapper<ZzglAuth>().lambda().eq(ZzglAuth::getBmgwId, userBean.getUserInfo().getBmgwId())
                        .eq(ZzglAuth::getMenuId, "/Approvalspbutonspbuton020101"));
                /*如果没有该权限*/
                if (zzglAuth == null) {
                    SpmkCustomApproval ca = SpmkCustomApproval.builder().build().selectOne(new QueryWrapper<SpmkCustomApproval>().lambda()
                            .eq(SpmkCustomApproval::getName, spmkApproveSummaryDto.getApproveName()).eq(SpmkCustomApproval::getOrgCode, userBean.getOrgCode()));
                    Router oldRouter = ObjectUtil.deserialize(ca.getRouter());
                    if (isTrue(router.getChildren(), oldRouter.getChildren())) {
                        return ResultUtil.error("您没有新增审批人的权限");
                    }
                }
            }
        }

        List<Router> routers = router.getChildren();
        if (routers == null) {
            return ResultUtil.error("无法发起,请完善审批流程");
        }
        if (CollectionUtil.isNotEmpty(routers)) {
//				boolean hasAudit=false;
//				if(routers.size()>0){
//					for (Relation relation:routers.get(0).getRelation()) {
//						if(relation.getUsers().size()>0){
//							hasAudit=true;
//						}
//					}
//				}
////				List<Relation> relations = routers.get(0).getRelation();
////				if (relations == null || relations.size() < 1) {
////					return ResultUtil.error("无法发起,请完善审批流程");
////				}
////				List<User> users = relations.get(0).getUsers();
////				if (CollectionUtil.isEmpty(users)) {
////					return ResultUtil.error("无法发起,请完善审批流程");
////				}
//				if(!hasAudit){
//					return ResultUtil.error("请选择审批人!");
//				}
        } else {
            return ResultUtil.error("无法发起,请完善审批流程");
        }

        List<Router> listRouter = new ArrayList<Router>();
        listRouter.add(router);

        JSONObject jSONObject = spmkApproveSummaryDto.getRequestData()
                .set("orgCode", userBean.getOrgCode())
                .set("initiator", ygglMainEmp.getName())
                .set("headUrl", ygglMainEmp.getHeadUrl())
                .set("id", userBean.getEmpNum());
        RouterUtils.NextNode(listRouter, jSONObject, ISFIRST);
        List<FlowChildren> listFlowChildren = new ArrayList<FlowChildren>();
        RouterUtils.getIsFlowChildren(listRouter, listFlowChildren);

        if (listFlowChildren.isEmpty()) {
            return ResultUtil.error("无法发起,请完善审批流程");
        }
        List<FlowChildren> listFlowChildren1 = (ArrayList<FlowChildren>) SerializationUtils.clone((Serializable) listFlowChildren);
        List<String> uidlist = new ArrayList<>();
        int i = 0;
        int fsize = listFlowChildren.size();
        int f = 0;//listFlowChildren删除次数
        for (FlowChildren flowChildrenItem : listFlowChildren) {
            if ("audit".equals(flowChildrenItem.getClassName())) {
                boolean hasAudit = false;

                for (Relation relation : flowChildrenItem.getRelation()) {
                    if (relation.getUsers().size() > 0) {
                        hasAudit = true;
                        //审批人去重
                        if (relation.getUsers().size() > 1) {
                            int j = 0;
                            int usize = relation.getUsers().size();//
                            int r = 0;//user list删除次数
                            for (User user : relation.getUsers()
                            ) {
                                if (!uidlist.contains(user.getId())) {
                                    uidlist.add(user.getId());
                                } else {
                                    listFlowChildren1.get(i).getRelation().get(0).getUsers().remove(j - r);
                                    r++;
                                }
                                j++;
                            }
                            if (usize == r) {
                                listFlowChildren1.remove(i - f);
                                f++;
                            }
                        } else {
                            if (!uidlist.contains(relation.getUsers().get(0).getId())) {
                                uidlist.add(relation.getUsers().get(0).getId());
                            } else {
                                listFlowChildren1.remove(i - f);
                                f++;
                            }
                        }
                    }
                }
                if (!hasAudit) {
                    return ResultUtil.error("审批流程设置审批人为空无法发起!");
                }
            }
            i++;
        }
        listFlowChildren = (ArrayList<FlowChildren>) SerializationUtils.clone((Serializable) listFlowChildren1);

		/*for (FlowChildren flowChildrenItem: listFlowChildren) {
			if("audit".equals(flowChildrenItem.getClassName())){
				boolean hasAudit=false;
				for (Relation relation:flowChildrenItem.getRelation()) {
					if(relation.getUsers().size()>0){
						hasAudit=true;
					}
				}
				if(!hasAudit){
					return ResultUtil.error("审批流程设置审批人为空无法发起!");
				}
			}
		}*/

        Logoutput("listFlowChildren");

        // 当前审批人
        String currentApprover = jSONObject.getStr("current_approver");
        // 封装 审批汇总
        SpmkApproveSummary as = SpmkApproveSummary
                .builder()
                .orgCode(userBean.getOrgCode())
                .empNum(userBean.getEmpNum())
                .title(spmkApproveSummaryDto.getTitle())
                .digest(spmkApproveSummaryDto.getDigest())
                .initiator(spmkApproveSummaryDto.getInitiator())
                .approveName(spmkApproveSummaryDto.getApproveName())
                .assoType(spmkApproveSummaryDto.getAssoType())
                .sts(ApproveSummarySts.IN.ordinal())
                .currentApprover(currentApprover).isUrgent(spmkApproveSummaryDto.getIsUrgent())
                .build();

        if (!as.insert()) {
            throw new CustomException("审批汇总-新增异常");
        }

        // 插入记录- 审批执行记录 - 执行人记录
        RouterUtils.insertogExecuteRecord(listFlowChildren, as.getId());

        // 封装 审批详情
        SpmkApproveDetailSummary adm = SpmkApproveDetailSummary.builder().build();
        adm.setApproveSummaryId(as.getId());
        adm.setName(spmkApproveSummaryDto.getTitle());
        adm.setRequestData(spmkApproveSummaryDto.getRequestData().toString());
        adm.setFroms(spmkApproveSummaryDto.getFroms().toString());
        adm.setRouter(listRouter.get(0).toJSONString());
        adm.setFlowChildren(JSONArray.fromObject(listFlowChildren).toString());
        try {
            spmkApproveDetailSummaryMapper.insert(adm);
        } catch (Exception e) {
            throw new CustomException("审批详情-新增异常");
        }

        return ResultUtil.success();
    }

    //TODO 审批汇总

    /**
     * 审批汇总
     *
     * @param summaryQueryDto
     * @return
     * @throws
     */
    @PostMapping(value = "/select_approve_summary")
    @ApiOperation(value = "18.审批汇总", httpMethod = "POST", notes = "审批汇总")
    @ApiOperationSupport(order = 18)
    @Log(title = "审批-审批汇总", businessType = BusinessType.OTHER)
    public Result<Object> selectAs(@CurrentUser UserBean userBean, @RequestBody SummaryQueryDto summaryQueryDto) {

        IPage<SpmkApproveSummary> page = new Page<SpmkApproveSummary>(
                summaryQueryDto.getCurrentPage() == null ? 1 : summaryQueryDto.getCurrentPage(),
                summaryQueryDto.getTotalPage() == null ? 10 : summaryQueryDto.getTotalPage());
        summaryQueryDto.setOrgCode(userBean.getOrgCode());

        Integer deptId = summaryQueryDto.getDeptId();
        List<YgglMainEmp> listYgglMainEmp = zzglBmgwMService.selectOtherlistent(userBean.getOrgCode(), deptId);

        if (deptId != null && (listYgglMainEmp == null || listYgglMainEmp.size() == 0)) {
            return ResultUtil.data(new ArrayList<SpmkApproveSummary>());
        }

        List<Integer> empNums = new ArrayList<Integer>();
        for (YgglMainEmp ygglMainEmp : listYgglMainEmp) {
            empNums.add(ygglMainEmp.getEmpNum());
        }
        summaryQueryDto.setEmpNums(empNums);

        // 缺-部门id 搜索
        IPage<SpmkApproveSummary> pageAs = spmkApproveSummaryMapper.selectPageByQuery(page, summaryQueryDto);

        List<SpmkApproveSummary> listAs = pageAs.getRecords();

        return ResultUtil.data(pageAs, listAs);
    }

    //TODO 审批详情

    /**
     * 审批详情
     */
    @GetMapping(value = "/select_approve_detail/{id}")
    @ApiOperation(value = "19.审批详情", httpMethod = "GET", notes = "审批详情")
    @ApiOperationSupport(order = 19)
    @Log(title = "审批-审批详情", businessType = BusinessType.OTHER)
    public Result<Object> selectAd(@CurrentUser UserBean userBean, @PathVariable(required = true) Integer id) {
        SpmkApproveDetailDto adD = spmkService.selectApproveDetailByAsId(id, userBean.getEmpNum());
        System.out.println(ResultUtil.data(adD));
        return ResultUtil.data(adD);

    }

    /**
     * 审批详情
     */
    @GetMapping(value = "/select_drafts_detail/{id}")
    @ApiOperation(value = "草稿箱审批详情", httpMethod = "GET", notes = "审批详情")
    @Log(title = "审批-审批详情", businessType = BusinessType.OTHER)
    public Result<Object> selectdd(@CurrentUser UserBean userBean, @PathVariable(required = true) Integer id) {
        SpmkApproveDetailDto adD = spmkService.selectDraftsDetailByAsId(id);
        System.out.println(ResultUtil.data(adD));
        return ResultUtil.data(adD);

    }

    //TODO 审批人审批

    /**
     * 审批人审批
     */
    @PostMapping(value = "/approving")
    @ApiOperation(value = "20.审批人审批", httpMethod = "POST", notes = "审批人审批")
    @Transactional(rollbackFor = Exception.class)
    @ApiOperationSupport(order = 20)
    @Log(title = "审批-审批流程", businessType = BusinessType.UPDATE)
//	@BindingResultCtrol(title = "审批人审批")
    public Result<Object> approving(@CurrentUser UserBean userBean, @Validated @RequestBody ApprovingDto approvingDto) throws Exception {

        if (approvingDto.getSts() == 2 && StringUtils.isEmpty(approvingDto.getOpinion())){
            approvingDto.setOpinion("同意");
        }else if (approvingDto.getSts() == 3 && StringUtils.isEmpty(approvingDto.getOpinion())){
            approvingDto.setOpinion("拒绝");
        }else if (approvingDto.getSts() == 4 && StringUtils.isEmpty(approvingDto.getOpinion())){
            approvingDto.setOpinion("转派");
        }

        /*判断是否有权限转派*/
        if (approvingDto.getSts() == 4) {
            QyzxEmpEntAsso ent = QyzxEmpEntAsso.builder().build().selectOne(new QueryWrapper<QyzxEmpEntAsso>().lambda().eq(QyzxEmpEntAsso::getOrgCode, userBean.getOrgCode()).eq(QyzxEmpEntAsso::getEmpNum, userBean.getEmpNum()));
            if (ent != null) {
                /*超管和管理员不受权限控制*/
                if (ent.getUserType() == 2) {
                    ZzglAuth zzglAuth = ZzglAuth.builder().build().selectOne(new QueryWrapper<ZzglAuth>().lambda().eq(ZzglAuth::getBmgwId, userBean.getUserInfo().getBmgwId())
                            .eq(ZzglAuth::getMenuId, "/Approvalspbutonspbuton020102"));
                    if (zzglAuth == null) {
                        return ResultUtil.error("您没有转派权限");
                    }
                }
            }
        }
        Integer asId = approvingDto.getAsId();
        //查询redis中当前有没有在被审批执行中,0是没有在执行,1是在执行
        Integer approStatus = Integer.parseInt(redisUtil.get(asId.toString()) == null ? "0" : redisUtil.get(asId.toString()).toString());
        if (approStatus == 1) {
            return ResultUtil.error("该审批已在审批中!");
        } else {
            redisUtil.set(asId.toString(), 1, 2);
        }
        SpmkApproveDetailSummary ad = SpmkApproveDetailSummary.builder().build().selectOne(new QueryWrapper<SpmkApproveDetailSummary>()
                .lambda()
                .select(SpmkApproveDetailSummary::getId,
                        SpmkApproveDetailSummary::getRequestData,
                        SpmkApproveDetailSummary::getFroms,
                        SpmkApproveDetailSummary::getFlowChildren)
                .eq(SpmkApproveDetailSummary::getApproveSummaryId, asId));

        // 查询 SpmkApproveSummary 状态,
        SpmkApproveSummary aSummary = spmkApproveSummaryMapper.selectOne(new QueryWrapper<SpmkApproveSummary>().lambda()
                .select(SpmkApproveSummary::getSts, SpmkApproveSummary::getAssoType, SpmkApproveSummary::getEmpNum, SpmkApproveSummary::getOrgCode)
                .eq(SpmkApproveSummary::getId, asId));

        if (aSummary.getSts() > ApproveSummarySts.IN.ordinal()) {
            redisUtil.set(asId.toString(), 0, 500);
            return ResultUtil.error("该审批已结束!");
        }

        // 查询该 审批的状态 是否为 1 审批中
        Integer count = SpmkExecutor.builder().build().selectCount(new QueryWrapper<SpmkExecutor>().lambda()
                .eq(SpmkExecutor::getId, approvingDto.getExecutorId())
                .eq(SpmkExecutor::getSts, ExecutorSts.IN_EXECUTION.ordinal()));

        if (count == 0) {
            redisUtil.set(asId.toString(), 0, 500);
            return ResultUtil.error("您已审批过!");
        }

        if (spmkExecutorMapper.selectCount(new QueryWrapper<SpmkExecutor>().lambda()
                .eq(SpmkExecutor::getId, approvingDto.getExecutorId())
                .eq(SpmkExecutor::getEmpNum, userBean.getEmpNum())
                .eq(SpmkExecutor::getSts, ExecutorSts.IN_EXECUTION.ordinal())) == 0) {

            Integer adminNum = new LambdaQueryChainWrapper<QyzxEmpEntAsso>(qyzxEmpEntAssoMapper)
                    .eq(QyzxEmpEntAsso::getEmpNum, userBean.getEmpNum())
                    .eq(QyzxEmpEntAsso::getOrgCode, userBean.getOrgCode())
                    .in(QyzxEmpEntAsso::getUserType, SysRoleType.U_TYPE_ADMIN, SysRoleType.U_TYPE_C_ADMIN)
                    .count();

            if (adminNum <= 0) {
                redisUtil.set(asId.toString(), 0, 500);
                return ResultUtil.error("非当前审批人 或 管理员,无法操作!");
            }

        }

        //判断是否是请假审批
        if (aSummary.getAssoType() == ApproveEnum.LEAVE.getType()) {
            if (approvingDto.getSts() == 2) {
                JSONObject jSONObject = jsonObject.parseObject(ad.getRequestData(), JSONObject.class);
                // 请假类型 - 前端传中文
                String LeaveType = ObjectUtil.isNull(jSONObject.get("__LeaveType", FromData.class)) ? null : jSONObject.get("__LeaveType", FromData.class).getValue();
                // 时长
                String longTime = ObjectUtil.isNull(jSONObject.get("__longTime", FromData.class)) ? null : jSONObject.get("__longTime", FromData.class).getValue();
                //判断这个人假期是否足够
                KqglAssoLeaveEmployeeBalance emba = KqglAssoLeaveEmployeeBalance.builder().build().selectOne(new QueryWrapper<KqglAssoLeaveEmployeeBalance>().lambda().eq(KqglAssoLeaveEmployeeBalance::getLeaveRulesId, Convert.toInt(LeaveType))
                        .eq(KqglAssoLeaveEmployeeBalance::getUserid, aSummary.getEmpNum()).eq(KqglAssoLeaveEmployeeBalance::getOrgCode, aSummary.getOrgCode()));
                if (emba != null) {
                    if (emba.getBalanceDays() != -1 && emba.getBalanceDays() < Convert.toInt(longTime)) {
                        return ResultUtil.error("当前发起人假期余额不足");
                    }
                }
            }
        }


        if (aSummary.getSts() == 0) {
            List<FlowChildren> listFlowChildren = jsonObject.parseArray(ad.getFlowChildren(), FlowChildren.class);
            // 审批逻辑
            RouterUtils.approving(
                    listFlowChildren,
                    asId,
                    approvingDto.getExecuteRecordId(),
                    approvingDto.getExecutorId(),
                    approvingDto.getOpinion(),
                    approvingDto.getSts(),
                    approvingDto.getUser(),
                    approvingDto.getSignatureImg(),
                    userBean.getEmpNum(),
                    approvingDto.getUserList()
            );


            // 更新 flowChildren
            SpmkApproveDetailSummary sadsUpdate = SpmkApproveDetailSummary.builder().id(ad.getId()).flowChildren(JSONArray.fromObject(listFlowChildren).toString()).build();
            // 审批详情 审批时添加 附件
            if (RequestDataUtils.addFileList(ad, approvingDto.getFileList())) {
                sadsUpdate.setRequestData(ad.getRequestData());
            }
            sadsUpdate.updateById();
            //最后一条数据
            FlowChildren fc = CollUtil.getLast(listFlowChildren);
            if (fc.getExecute() == "2") {
                // 查询 SpmkApproveSummary 状态
                aSummary = spmkApproveSummaryMapper.selectOne(new QueryWrapper<SpmkApproveSummary>().lambda()
                        .select(SpmkApproveSummary::getSts, SpmkApproveSummary::getAssoType)
                        .eq(SpmkApproveSummary::getId, asId));

                if (aSummary.getSts() != ApproveSummarySts.REFUSE.ordinal()) {
                    SpmkApproveSummary.builder().id(asId).currentApprover(CommonEnum.NULL_STR.getDesc()).endTime(new Date()).sts(ApproveSummarySts.FINISH.ordinal()).build().updateById();

                    JSONObject jSONObject = jsonObject.parseObject(ad.getRequestData(), JSONObject.class);
                    jSONObject.set("approveId", FromData.builder().value(String.valueOf(asId)).build());
                    jSONObject.set("orgCode", userBean.getOrgCode());

                    //审批完成后 业务
                    SpmkAssoBusiness sab = spmkAssoBusinessFactory.createSpmkService(ApproveEnum.getEnums(aSummary.getAssoType()));
                    if (sab != null)
                        Logoutput("1----------" + sab);
                    Logoutput("2----------" + jSONObject);
                    sab.handleApprove(jSONObject);
                }
            }

        } else {
            redisUtil.set(asId.toString(), 0, 500);
            return ResultUtil.error("该审批已结束!");
        }
        redisUtil.set(asId.toString(), 0, 500);
        return ResultUtil.success();
    }

    @Autowired
    private PunchRecordMapper punchrecordmapper;
    //TODO 我发起的/我审批的/抄送我的

    /**
     * 查询列表-我发起的/我审批的/抄送我的-分页
     */
    @PostMapping(value = "/select_my_approve")
    @ApiOperation(value = "21.查询列表-我发起的/我审批的/抄送我的-分页", httpMethod = "POST", notes = "查询列表-我审批的-关键字、审批状态、发起时间-分页")
    @ApiOperationSupport(order = 21)
    @Log(title = "审批-我发起的/我审批的/抄送我的", businessType = BusinessType.OTHER)
    public Result<Object> selectMyAs(@CurrentUser UserBean userBean, @Validated @RequestBody MySummaryQueryDto mySummaryQueryDto) throws MethodArgumentNotValidException {
        IPage<SpmkApproveSummary> page = new Page<SpmkApproveSummary>(
                mySummaryQueryDto.getCurrentPage() == null ? 1 : mySummaryQueryDto.getCurrentPage(),
                mySummaryQueryDto.getTotalPage() == null ? 10 : mySummaryQueryDto.getTotalPage());
        mySummaryQueryDto.setOrgCode(userBean.getOrgCode());
        mySummaryQueryDto.setEmpNum(userBean.getEmpNum());
        if (mySummaryQueryDto.getSts() == null) {
            mySummaryQueryDto.setSts(0);
        }
        //我发起的
        if (mySummaryQueryDto.getType() == 0) {
//				mySummaryQueryDto.setSts(null);
        }
        // 缺-部门id 搜索
        IPage<SpmkApproveSummary> pageAs = spmkApproveSummaryMapper.selectPageByQueryForEmpNum(page, mySummaryQueryDto);

        List<SpmkApproveSummary> listAs = pageAs.getRecords();

        for (SpmkApproveSummary sp : listAs) {

            String requerstr = "";
            try {
                SpmkApproveDetailSummary ad = spmkApproveDetailSummaryMapper.selectOne(new QueryWrapper<SpmkApproveDetailSummary>().lambda().eq(SpmkApproveDetailSummary::getApproveSummaryId, sp.getId()).last("limit 1"));

                JSONObject as = jsonObject.parseObject(ad.getRequestData().toString(), JSONObject.class);
//					Logoutput(as);
//					Logoutput(sp.getId()+"==========================================="+sp.getAssoType());
                requerstr = "";
                //assoType : 1转正 2离职 3调薪 4调岗 5加班 6请假 7出差 8外出 9补卡
                switch (sp.getAssoType()) {
                    case 1:
                        requerstr = "转正时间:" + as.getJSONObject("__newConfirmationTime").getStr("value");
                        break;
                    case 2:
                        requerstr = "离职时间:" + as.getJSONObject("__terminationDate").getStr("value");
                        break;
                    case 3:
                        String namepos = "";
                        PunchRecord pu = punchrecordmapper.organizationalStructure(Integer.valueOf(as.getJSONObject("__TransferInDepartment").getStr("value")));
                        if (pu != null) {
                            namepos = pu.getPost();
                        }
                        requerstr = "调入岗位:" + namepos;
                        break;
                    case 5:
                        requerstr = "加班时长:" + as.getJSONObject("__timeLong").getStr("value") + "(小时)";
                        break;
                    case 6:
                        String name = "";
                        KqglAssoLeaveRules rul = KqglAssoLeaveRules.builder().build().selectById(as.getJSONObject("__LeaveType").getStr("value"));
                        if (rul != null) {
                            name = rul.getName();
                        }
                        requerstr = "请假类型:" + name;
                        break;
                    case 7:
                        requerstr = "出差时长:" + as.getJSONObject("__longTime").getStr("value") + "(小时)";
                        break;
                    case 8:
                        requerstr = "外出时长:" + as.getJSONObject("__longTime").getStr("value") + "(小时)";
                        break;
                    case 9:
                        requerstr = "补卡时间:" + as.getJSONObject("__PatchCardTime").getStr("value");
                        break;
                    default:
                        break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
//				Logoutput(requerstr);
			/*if(!StringUtils.isEmpty(sp.getDigest())){
				requerstr = requerstr+" "+sp.getDigest();
			}
			sp.setDigest(requerstr);*/
        }

        return ResultUtil.data(pageAs, listAs);
    }

    //TODO 撤销审批

    /**
     * 撤销审批
     */
    @PutMapping(value = "/revoke_approval/{id}")
    @ApiOperation(value = "22.撤销审批", httpMethod = "PUT", notes = "撤销审批")
    @Transactional(rollbackFor = Exception.class)
    @ApiOperationSupport(order = 22)
    @Log(title = "审批-撤销审批", businessType = BusinessType.UPDATE)
    public Result<Object> revokeApproval(@PathVariable Integer id) throws Exception {

        SpmkApproveSummary as = spmkApproveSummaryMapper.selectOne(new QueryWrapper<SpmkApproveSummary>()
                .lambda()
                .select(SpmkApproveSummary::getSts)
                .eq(SpmkApproveSummary::getId, id));

        return as != null && as.getSts() != ApproveSummarySts.FINISH.ordinal() ? (SpmkApproveSummary.builder().id(id).endTime(new Date()).sts(ApproveSummarySts.UNDONE.ordinal()).build().updateById() ?
                ResultUtil.success() : ResultUtil.error("撤销异常")) : ResultUtil.error("审批已结束,无法撤销!");
    }

    /**
     * 删除-审批(发起的审批)-根据审批汇总id
     */
    @DeleteMapping(value = "/delete_approval/{id}")
    @ApiOperation(value = "23.删除-审批(发起的审批)-根据审批汇总id", httpMethod = "DELETE", notes = "删除-审批(发起的审批)-根据审批汇总id")
    @ApiOperationSupport(order = 23)
    @Log(title = "审批-删除审批", businessType = BusinessType.DELETE)
    public Result<Object> deleteApprovalData(@PathVariable Integer id) {
		/*
		List<SpmkApproveExecuteRecord> listAer = spmkApproveExecuteRecordMapper.selectList(new QueryWrapper<SpmkApproveExecuteRecord>()
				.lambda()
				.select(SpmkApproveExecuteRecord::getId)
				.eq(SpmkApproveExecuteRecord::getApproveSummaryId, id));
		if (listAer != null && listAer.size() > 0) {
			for (SpmkApproveExecuteRecord aer : listAer) {
				spmkExecutorMapper.delete(new QueryWrapper<SpmkExecutor>().lambda().eq(SpmkExecutor::getApproveExecuteRecordId, aer.getId()));
			}
		}

		spmkApproveExecuteRecordMapper.delete(new QueryWrapper<SpmkApproveExecuteRecord>().lambda().eq(SpmkApproveExecuteRecord::getApproveSummaryId, id));
		//新审核表删除
		spmkApproveDetailSummaryMapper.delete(new QueryWrapper<SpmkApproveDetailSummary>().lambda().eq(SpmkApproveDetailSummary::getApproveSummaryId,id));

		spmkApproveSummaryMapper.delete(new QueryWrapper<SpmkApproveSummary>().lambda().eq(SpmkApproveSummary::getId, id));
		*/
        //逻辑删除
        SpmkApproveSummary.builder().id(id).isDelete(1).build().updateById();
        return ResultUtil.success();
    }

    /**
     * 删除-审批组、自定义审批、审批汇总、审批详情、审批执行记录、审批执行人记录 所有数据
     */
    @DeleteMapping(value = "/delete_approval_data")
    @ApiOperation(value = "90.(开发使用)删除-审批数据", httpMethod = "DELETE", notes = "审批组、自定义审批、审批汇总、审批详情、审批执行记录、审批执行人记录 所有数据")
    @ApiOperationSupport(order = 90)
    public Result<Object> deleteApprovalData(@CurrentUser UserBean userBean) {
        spmkApprovalGMapper.delete(null);
        spmkCustomApprovalMapper.delete(null);
        spmkApproveSummaryMapper.delete(null);
        spmkApproveDetailSummaryMapper.delete(null);
        spmkApproveExecuteRecordMapper.delete(null);
        spmkExecutorMapper.delete(null);
        Logoutput("删除-审批组、自定义审批、审批汇总、审批详情、审批执行记录、审批执行人记录 所有数据 完成!");
        return ResultUtil.success();
    }

    //TODO 审批图标列表
    @GetMapping(value = "/icon")
    @ApiOperation(value = "99.图标列表", httpMethod = "GET", notes = "接口发布说明")
    @ApiOperationSupport(order = 99)
    public Result<List<SpmkIcon>> selectListIcon(@CurrentUser UserBean userBean) {

        List<SpmkIcon> spmkIcons = SpmkIcon.builder().build().selectAll();

        return ResultUtil.data(spmkIcons, "获取图标列表成功");
    }

    //TODO 测试-生成 审批组 和 自定义审批
    @GetMapping(value = "/test")
    @ApiOperation(value = "98.测试-生成 审批组 和 自定义审批", httpMethod = "GET", notes = "测试-生成 审批组 和 自定义审批")
    @ApiOperationSupport(order = 98)
    public Result<List<SpmkIcon>> createCustomApproval(@RequestParam Integer orgCode) {

        spmkService.createCustomApproval(orgCode);

        List<SpmkIcon> spmkIcons = SpmkIcon.builder().build().selectAll();

        return ResultUtil.data(spmkIcons, "生成 审批组 和 自定义审批成功");
    }

    @GetMapping(value = "/verification_staff")
    @ApiOperation(value = "校验员工是否是正式员工", httpMethod = "GET", notes = " 查询列表-假期规则")
    public Result<Object> verification_staff(@CurrentUser UserBean userBean) {
        String msg = "";
        YgglMainEmp ygem = YgglMainEmp.builder().build().selectOne(new QueryWrapper<YgglMainEmp>().lambda().eq(YgglMainEmp::getOrgCode, userBean.getOrgCode())
                .eq(YgglMainEmp::getEmpNum, userBean.getEmpNum()));
        if (ygem.getJobStatus() == 1) {
            msg = "正式员工不能发起转正审批";
        }

        return ResultUtil.data(msg);
    }

    @PostMapping(value = "/approved_quantity")
    @ApiOperation(value = "APP-我发起的/我审批的/抄送我的-数量", httpMethod = "POST", notes = "")
    public Result<Object> ApprovedQuantity(@CurrentUser UserBean userBean, @Validated @RequestBody MySummaryQueryDto mysummaryquerydto) {

        ApprovedQuantityDto qna = ApprovedQuantityDto.builder().build();

        mysummaryquerydto.setEndTime(null);
        mysummaryquerydto.setStartTime(null);

        mysummaryquerydto.setOrgCode(userBean.getOrgCode());
        mysummaryquerydto.setEmpNum(userBean.getEmpNum());
        mysummaryquerydto.setSts(5);//状态 0审批中 1审批撤销 2审批通过/审批完成 3审批拒绝 4:(2/3)	5:全部

        int istartedit = 0, ccme = 0, iapprovedit = 0;
        mysummaryquerydto.setType(0);//我发起的
        List<SpmkApproveSummary> istartedit_ = spmkApproveSummaryMapper.selectPageByQueryForEmpNum(mysummaryquerydto);
        if (istartedit_.size() > 0) {
            istartedit = istartedit_.size();
        }

        mysummaryquerydto.setType(1);//抄送我的
        List<SpmkApproveSummary> ccme_ = spmkApproveSummaryMapper.selectPageByQueryForEmpNum(mysummaryquerydto);
        if (ccme_.size() > 0) {
            ccme = ccme_.size();
        }

        mysummaryquerydto.setType(2);//我审批的
        List<SpmkApproveSummary> iapprovedit_ = spmkApproveSummaryMapper.selectPageByQueryForEmpNum(mysummaryquerydto);
        if (iapprovedit_.size() > 0) {
            iapprovedit = iapprovedit_.size();
        }

        qna.setIstartedit(istartedit);
        qna.setCcme(ccme);
        qna.setIapprovedit(iapprovedit);


        return ResultUtil.data(qna);
    }

    @Value("${config-8timer.environmental-science}")
    public String environmental_science;

    public void Logoutput(String science) {

        if (!("pro").equals(environmental_science)) {

            System.out.println(science);
        } else {
            System.out.println("");
        }

    }

    /**
     * 审核详情数据转换
     */
    @PostMapping(value = "/approved_addDetail")
    @ApiOperation(value = "A审核详情数据转换", httpMethod = "POST", notes = "")
    public String addApproveDetail() {
        return spmkService.addApproveDetail();
    }

    /**
     * 判断人员是否一致
     *
     * @param olist
     * @param list
     * @return
     */
    private boolean isTrue(List<Router> olist, List<Router> list) {
        if (olist.size() == 0 && list.size() == 0) {
            return false;
        } else if (olist.size() != list.size()) {
            return true;
        }
        if (list.get(0).getClassName().equals("audit") && list.get(0).getName().equals("审批人")) {
            if (list.get(0).getRelation().get(0).getType().equals("executive") && list.get(0).getRelation().get(0).getName().equals("主管")) {
                return isTrue(olist.get(0).getChildren(), list.get(0).getChildren());
            }
            if (list.get(0).getRelation().get(0).getUsers().size() != olist.get(0).getRelation().get(0).getUsers().size()) {
                return true;
            } else {
                return isTrue(olist.get(0).getChildren(), list.get(0).getChildren());
            }
        } else if (list.get(0).getClassName().equals("copy") && list.get(0).getName().equals("抄送人")) {
            return false;
        }
        return false;
    }

    /**
     * 更新审批流程通过节点
     *
     * @param userBean
     * @param spmkApproveDetailDto
     * @return
     */
    @PostMapping(value = "/updateFlowChildren")
    @ApiOperation(value = "更新审批流程通过节点", httpMethod = "POST", notes = "")
    public Result<Object> updateFlowChildren(@CurrentUser UserBean userBean, @Validated @RequestBody SpmkApproveDetailDto spmkApproveDetailDto) {
        try {

            SpmkApproveDetailSummary spmkApproveDetailSummary = SpmkApproveDetailSummary.builder().id(spmkApproveDetailDto.getId()).build().selectById();
            List<FlowChildren> listFlowChildren = spmkApproveDetailDto.getFlowChildren();
            //只有添加审批人才会有值
            if (spmkApproveDetailDto.getIndex() != null && spmkApproveDetailDto.getUserIndex() != null) {
                //如果当前索引下的都要变更为0未执行
                int currentIndex = spmkApproveDetailDto.getIndex();
                for (int i = currentIndex + 1; i < listFlowChildren.size(); i++) {
                    if (i == currentIndex + 1) {
                        if (!listFlowChildren.get(currentIndex).getExecute().equals("1") && !listFlowChildren.get(currentIndex).getExecute().equals("0")) {
                            //如果当前索引下的都要变更为0未执行
                            FlowChildren flowChildren = listFlowChildren.get(spmkApproveDetailDto.getIndex());
                            SpmkApproveExecuteRecord spmkApproveExecuteRecord=null;
                            //如果有执行记录
                            if(spmkApproveDetailDto.getApproveExecuteRecordId()>0){
                                spmkApproveExecuteRecord=spmkApproveExecuteRecordMapper.selectById(spmkApproveDetailDto.getApproveExecuteRecordId());
                            }else{
                                User user = flowChildren.getRelation().get(0).getUsers().get(spmkApproveDetailDto.getUserIndex());
                                spmkApproveExecuteRecord = spmkApproveExecuteRecordMapper.selectExecuteRecordById(Integer.parseInt(user.getId()), spmkApproveDetailSummary.getApproveSummaryId());
                            }

                            //删除审批过的人记录
                            if (spmkApproveExecuteRecord != null) {
                                spmkApproveExecuteRecordMapper.delExecuteRecord(spmkApproveExecuteRecord.getId(), spmkApproveDetailSummary.getApproveSummaryId());
                            }
                            listFlowChildren.get(i).setExecute("1");
                            listFlowChildren.get(i).getRelation().forEach(v -> {
                                v.getUsers().forEach(u -> {
                                    u.setExecute("1");
                                    //添加审批记录
                                    SpmkApproveExecuteRecord spmkApproveExecuteRecord1 = SpmkApproveExecuteRecord
                                            .builder()
                                            .approveSummaryId(spmkApproveDetailSummary.getApproveSummaryId())
                                            .name(SpmkEnumInterface.ParticipatorType.APPROVER.getName())
                                            .type(SpmkEnumInterface.ParticipatorType.APPROVER.ordinal())
                                            .sts(SpmkEnumInterface.ExecuteRecordSts.IN_EXECUTION.ordinal())
                                            .build();
                                    spmkApproveExecuteRecord1.insert();
                                    SpmkExecutor.builder()
                                            .approveExecuteRecordId(spmkApproveExecuteRecord1.getId())
                                            .empNum(Integer.parseInt(u.getId()))
                                            .operatorHeaderUrl(u.getHeadUrl())
                                            .executorName(u.getName())
                                            .sts(1)
                                            .build().insert();
                                    SpmkApproveSummary.builder().currentApprover(u.getName()).id(spmkApproveDetailSummary.getApproveSummaryId()).build().updateById();
                                });

                            });
                            continue;
                        }
                    }
                    listFlowChildren.get(i).setExecute("0");
                    listFlowChildren.get(i).getRelation().forEach(v -> {
                        v.getUsers().forEach(u -> u.setExecute("0"));
                    });

                }

                SpmkApproveSummary.builder().sts(0).id(spmkApproveDetailSummary.getApproveSummaryId()).build().updateById();
            }

            // 更新 flowChildren

            SpmkApproveDetailSummary.builder().id(spmkApproveDetailDto.getId())
                    .flowChildren(JSONArray.fromObject(listFlowChildren).toString()).build().updateById();
        } catch (Exception e) {
            e.printStackTrace();
            return ResultUtil.error(e);
        }

        SpmkApproveDetailSummary detailSummary = SpmkApproveDetailSummary.builder().build().selectOne(new QueryWrapper<SpmkApproveDetailSummary>()
                .lambda().eq(SpmkApproveDetailSummary::getId, spmkApproveDetailDto.getId()));

        return ResultUtil.data(JSON.toJSONString(detailSummary));
    }

    //移除审批人 1.0
//    @Transactional(rollbackFor = Exception.class)
//    @PostMapping(value = "/delteApprove")
//    @ApiOperation(value = "移除审批人", httpMethod = "POST", notes = "")
//    public Result<Object> delteApprove(@CurrentUser UserBean userBean, @Validated @RequestBody SpmkApproveDetailDto spmkApproveDetailDto) {
////        try {
//
//        SpmkApproveDetailSummary spmkApproveDetailSummary = SpmkApproveDetailSummary.builder().id(spmkApproveDetailDto.getId()).build().selectById();
//        List<FlowChildren> listFlowChildren = spmkApproveDetailDto.getFlowChildren();
//        //是否执行到下一个节点
//        boolean onlyOne = false;//是否只有一条
//        boolean isExecute = false;//是否执行中
//        boolean isAbreas = false;//是否并序
//        boolean isFinal = false;//是否最终审批人
//        boolean isNext = false;//是否轮到下一个节点
//        User u;
//        //当前节点
//        FlowChildren currentChildren = listFlowChildren.get(spmkApproveDetailDto.getIndex());
//        List<User> userList = currentChildren.getRelation().get(0).getUsers();
//        User currentUser = userList.get(spmkApproveDetailDto.getUserIndex());
//        //只有添加审批人才会有值
//        if (spmkApproveDetailDto.getIndex() != null && spmkApproveDetailDto.getUserIndex() != null) {
//            if (currentChildren.getClassName().equals("audit")) {
//                //如果是并序
//                if ("1".equals(currentChildren.getRelation().get(0).getApprovalOrder())) {
//                    isAbreas = true;
//                }
//                //如果只有一个人
//                if (userList.size() == 1) {
//                    onlyOne = true;
//                    isNext=true;
//                }
//                if (currentChildren.getExecute().equals("1")) {
//                    isExecute = true;
//                    if (userList.get(spmkApproveDetailDto.getUserIndex()).getExecute().equals("1")) {
//                        //如果是最后一个
//                        if (userList.size() - 1 == spmkApproveDetailDto.getUserIndex() && !isAbreas) {
//                            isNext = true;
//                        }
//                        //出了自己其他人都审批过了
//                        if (isAbreas) {
//                            int num = currentChildren.getRelation().get(0).getUsers().stream().filter(v -> v.getExecute().equals("1") && v.getId() != currentUser.getId()).collect(Collectors.toList()).size();
//                            if (num == 0) {
//                                isNext = true;
//                            }
//                        }
//                    } else {
//                        isExecute = false;
//                    }
//                }
//                //是否最终审批人
//                if (spmkApproveDetailDto.getIndex() == listFlowChildren.size() - 1) {
//                    if (isNext || onlyOne) {
//                        isFinal = true;
//                    }
//                } else if (!listFlowChildren.get(spmkApproveDetailDto.getIndex() + 1).getClassName().equals("audit")) {
//                    isFinal = true;
//                }
//
//                SpmkApproveExecuteRecord spmkApproveExecuteRecord = spmkApproveExecuteRecordMapper.selectExecuteRecordById(Integer.parseInt(currentUser.getId()), spmkApproveDetailSummary.getApproveSummaryId());
//                //删除审批过的人记录
//                if (spmkApproveExecuteRecord != null) {
//                    if (onlyOne) {
//                        spmkApproveExecuteRecordMapper.delExecuteRecordByRecordIds(spmkApproveExecuteRecord.getId(), Integer.parseInt(currentUser.getId()));
//                    } else {
//                        List<SpmkExecutor> spmkExecutorsList=SpmkExecutor.builder().build().selectList(new LambdaQueryWrapper<SpmkExecutor>()
//                                .eq(SpmkExecutor::getApproveExecuteRecordId,spmkApproveExecuteRecord.getId()));
//                        if(spmkExecutorsList.size()>0&&spmkExecutorsList.size()==1){
//                            spmkApproveExecuteRecordMapper.delExecuteRecordByRecordIds(spmkApproveExecuteRecord.getId(), Integer.parseInt(currentUser.getId()));
//                        }else{
//                            spmkExecutorsList.stream().filter(v->v.getEmpNum()==Integer.parseInt(currentUser.getId())).collect(Collectors.toList()).get(0).deleteById();
//                        }
//                    }
//                }
//                if (isExecute && !isFinal) {
//                    if (!isAbreas) {
//                        if (isNext) {
//                            listFlowChildren.get(spmkApproveDetailDto.getIndex() + 1).setExecute("1");
//                            listFlowChildren.get(spmkApproveDetailDto.getIndex() + 1).getRelation().get(0).getUsers().get(0).setExecute("1");
//                            //并序
//                            u = listFlowChildren.get(spmkApproveDetailDto.getIndex() + 1).getRelation().get(0).getUsers().get(0);
//                        } else {
//                            listFlowChildren.get(spmkApproveDetailDto.getIndex()).setExecute("1");
//                            listFlowChildren.get(spmkApproveDetailDto.getIndex()).getRelation().get(0).getUsers().get(spmkApproveDetailDto.getUserIndex() + 1).setExecute("1");
//                            u = listFlowChildren.get(spmkApproveDetailDto.getIndex()).getRelation().get(0).getUsers().get(spmkApproveDetailDto.getUserIndex() + 1);
//                        }
//
//                        if (onlyOne || isNext) {
//                            spmkApproveExecuteRecord = SpmkApproveExecuteRecord
//                                    .builder()
//                                    .approveSummaryId(spmkApproveDetailSummary.getApproveSummaryId())
//                                    .name(SpmkEnumInterface.ParticipatorType.APPROVER.getName())
//                                    .type(SpmkEnumInterface.ParticipatorType.APPROVER.ordinal())
//                                    .sts(SpmkEnumInterface.ExecuteRecordSts.IN_EXECUTION.ordinal())
//                                    .build();
//                            spmkApproveExecuteRecord.insert();
//                        }
//                        SpmkExecutor.builder()
//                                .approveExecuteRecordId(spmkApproveExecuteRecord.getId())
//                                .empNum(Integer.parseInt(u.getId()))
//                                .operatorHeaderUrl(u.getHeadUrl())
//                                .executorName(u.getName())
//                                .sts(1)
//                                .build().insert();
//                        SpmkApproveSummary.builder().currentApprover(u.getName()).id(spmkApproveDetailSummary.getApproveSummaryId()).build().updateById();
//                    } else {
//                        //并序
//                        if (isNext) {
//                            FlowChildren nextFlowChildren = listFlowChildren.get(spmkApproveDetailDto.getIndex() + 1);
//                            if (nextFlowChildren.getRelation().get(0).getApprovalOrder().equals("1")) {
//                                listFlowChildren.get(spmkApproveDetailDto.getIndex() + 1).setExecute("1");
//                                listFlowChildren.get(spmkApproveDetailDto.getIndex() + 1).getRelation().get(0).getUsers().forEach(v -> {
//                                    v.setExecute("1");
//                                    SpmkApproveExecuteRecord spmkApproveExecuteRecord1 = SpmkApproveExecuteRecord
//                                            .builder()
//                                            .approveSummaryId(spmkApproveDetailSummary.getApproveSummaryId())
//                                            .name(SpmkEnumInterface.ParticipatorType.APPROVER.getName())
//                                            .type(SpmkEnumInterface.ParticipatorType.APPROVER.ordinal())
//                                            .sts(SpmkEnumInterface.ExecuteRecordSts.IN_EXECUTION.ordinal())
//                                            .build();
//                                    spmkApproveExecuteRecord1.insert();
//                                    SpmkExecutor.builder()
//                                            .approveExecuteRecordId(spmkApproveExecuteRecord1.getId())
//                                            .empNum(Integer.parseInt(v.getId()))
//                                            .operatorHeaderUrl(v.getHeadUrl())
//                                            .executorName(v.getName())
//                                            .sts(1)
//                                            .build().insert();
//                                });
//                                SpmkApproveSummary.builder().currentApprover(nextFlowChildren.getRelation().get(0).getUsers().get(0).getName()).id(spmkApproveDetailSummary.getApproveSummaryId()).build().updateById();
//                            }
//                        }
//                    }
//                }
//
//
//                if (isExecute && isFinal) {
//                    SpmkApproveSummary.builder().id(spmkApproveDetailSummary.getApproveSummaryId()).currentApprover(CommonEnum.NULL_STR.getDesc()).endTime(new Date()).sts(ApproveSummarySts.FINISH.ordinal()).build().updateById();
//                }
//
//                if (onlyOne) {
//                    listFlowChildren.removeIf(f -> f == currentChildren);
//                } else {
//                    listFlowChildren.get(spmkApproveDetailDto.getIndex()).getRelation().get(0).getUsers().removeIf(user -> user == currentUser);
//                }
//            }
//        }
//        // 更新 flowChildren
//        SpmkApproveDetailSummary.builder().id(spmkApproveDetailDto.getId())
//                .flowChildren(JSONArray.fromObject(listFlowChildren).toString()).build().updateById();
////        } catch (Exception e) {
////            return ResultUtil.error(e);
////        }
//
//        SpmkApproveDetailSummary detailSummary = SpmkApproveDetailSummary.builder().build().selectOne(new QueryWrapper<SpmkApproveDetailSummary>()
//                .lambda().eq(SpmkApproveDetailSummary::getId, spmkApproveDetailDto.getId()));
//
//        return ResultUtil.data(JSON.toJSONString(detailSummary));
//    }


    @Transactional(rollbackFor = Exception.class)
    @PostMapping(value = "/delteApprove")
    @ApiOperation(value = "移除审批人", httpMethod = "POST", notes = "")
    public Result<Object> delteApprove(@CurrentUser UserBean userBean, @Validated @RequestBody SpmkApproveDetailDto spmkApproveDetailDto) {
        SpmkApproveDetailSummary spmkApproveDetailSummary = SpmkApproveDetailSummary.builder().id(spmkApproveDetailDto.getId()).build().selectById();
        List<FlowChildren> listFlowChildren = spmkApproveDetailDto.getFlowChildren();
        FlowChildren currentFlowChildren = listFlowChildren.get(spmkApproveDetailDto.getIndex());
        List<User> currentUserList = currentFlowChildren.getRelation().get(0).getUsers();
        User currentUser = currentUserList.get(spmkApproveDetailDto.getUserIndex());
        //是否执行到下一个节点
        boolean onlyOne = false;//是否只有一条
        boolean isExecute = false;//是否执行中
        boolean isAbreas = false;//是否并序
        boolean isFinal = false;//是否最终审批人
        boolean isNext = false;//是否轮到下一个节点
        StringBuffer buffer = new StringBuffer();//新当前审批人的名字
        if ("1".equals(currentFlowChildren.getRelation().get(0).getApprovalOrder())) {
            isAbreas = true;
        }
        //如果只有一个人
        if (currentUserList.size() == 1) {
            onlyOne = true;
            isNext = true;
        }
        //大节点在执行中
        if (currentFlowChildren.getExecute().equals("1")) {
            //小节点也在执行中
            isExecute = true;
            if (currentUser.getExecute().equals("1")) {
                if (isAbreas) {
                    if (currentUserList.stream().filter(u -> u.getId() != currentUser.getId() && u.getExecute().equals("1")).collect(Collectors.toList()).size() == 0) {
                        isNext = true;
                    }
                } else {
                    if (currentUserList.size() - 1 == spmkApproveDetailDto.getUserIndex()) {
                        isNext = true;
                    }
                }
            } else {
                isExecute = false;
            }
        }
        //如果属于最后一个大节点
        if (listFlowChildren.size() - 1 == spmkApproveDetailDto.getIndex()) {
            if (isNext) {
                isFinal = true;
            } else {
                isFinal = false;
            }
        } else if (listFlowChildren.get(spmkApproveDetailDto.getIndex() + 1).getClassName().equals("copy")) {
            isFinal = true;
        }
        SpmkApproveExecuteRecord spmkApproveExecuteRecord;
        //执行中的人会存在操作记录/spmk/delteApprove
        if (spmkApproveDetailDto.getApproveExecuteRecordId()!=null) {
             spmkApproveExecuteRecord = SpmkApproveExecuteRecord.builder().id(spmkApproveDetailDto.getApproveExecuteRecordId()).build().selectById();
        } else {
            List<SpmkApproveExecuteRecord> spmkApproveExecuteRecords = spmkApproveExecuteRecordMapper.selectExecuteRecordListById(Integer.parseInt(currentUser.getId()), spmkApproveDetailSummary.getApproveSummaryId());
            spmkApproveExecuteRecord = spmkApproveExecuteRecords.get(spmkApproveDetailDto.getIndex());
//            spmkApproveExecuteRecord = spmkApproveExecuteRecordMapper.selectExecuteRecordById(Integer.parseInt(currentUser.getId()), spmkApproveDetailSummary.getApproveSummaryId());
        }
        //删除操作人记录
        if (spmkApproveExecuteRecord != null) {
//            SpmkExecutor spmkExecutor = SpmkExecutor.builder().build().selectOne(new LambdaQueryWrapper<SpmkExecutor>()
//                    .eq(SpmkExecutor::getApproveExecuteRecordId, spmkApproveExecuteRecord.getId()).eq(SpmkExecutor::getEmpNum, currentUser.getId()));
            List<SpmkExecutor> spmkExecutors = SpmkExecutor.builder().build().selectList(new LambdaQueryWrapper<SpmkExecutor>()
                    .eq(SpmkExecutor::getApproveExecuteRecordId, spmkApproveExecuteRecord.getId()));
            SpmkExecutor spmkExecutor = spmkExecutors.get(spmkApproveDetailDto.getUserIndex());
            if (onlyOne) {
                if (spmkExecutor.getSts() != 4) {
                    spmkApproveExecuteRecordMapper.delExecuteRecordByRecordIds(spmkApproveExecuteRecord.getId(), Integer.parseInt(currentUser.getId()));
                }
            } else {
                List<SpmkExecutor> spmkExecutorsList = SpmkExecutor.builder().build().selectList(new LambdaQueryWrapper<SpmkExecutor>()
                        .eq(SpmkExecutor::getApproveExecuteRecordId, spmkApproveExecuteRecord.getId()));
                if (isAbreas) {
                    //正常的并序是一条对应一个id,转派的是同一个id
                    if (spmkExecutorsList.size() == 1) {
                        spmkApproveExecuteRecordMapper.delExecuteRecordByRecordIds(spmkApproveExecuteRecord.getId(), Integer.parseInt(currentUser.getId()));
                    }
                }
                spmkExecutor.deleteById();
            }
        }
        //当前被移除的人在执行中
        if (isExecute) {
            //如果不是最终的就还存在下一个审批节点
            if (!isFinal) {
                if (isNext) {
                    FlowChildren nextFlowChildren = listFlowChildren.get(spmkApproveDetailDto.getIndex() + 1);
                    //如果下一个节点是并序的
                    if (nextFlowChildren.getRelation().get(0).getApprovalOrder().equals("1")) {

                        listFlowChildren.get(spmkApproveDetailDto.getIndex() + 1).setExecute("1");
                        listFlowChildren.get(spmkApproveDetailDto.getIndex() + 1).getRelation().get(0).getUsers().forEach(v -> {
                            v.setExecute("1");
                            SpmkApproveExecuteRecord spmkApproveExecuteRecord1 = SpmkApproveExecuteRecord
                                    .builder()
                                    .approveSummaryId(spmkApproveDetailSummary.getApproveSummaryId())
                                    .name(SpmkEnumInterface.ParticipatorType.APPROVER.getName())
                                    .type(SpmkEnumInterface.ParticipatorType.APPROVER.ordinal())
                                    .sts(SpmkEnumInterface.ExecuteRecordSts.IN_EXECUTION.ordinal())
                                    .build();
                            spmkApproveExecuteRecord1.insert();
                            SpmkExecutor.builder()
                                    .approveExecuteRecordId(spmkApproveExecuteRecord1.getId())
                                    .empNum(Integer.parseInt(v.getId()))
                                    .operatorHeaderUrl(v.getHeadUrl())
                                    .executorName(v.getName())
                                    .sts(1)
                                    .build().insert();
                            buffer.append(v.getName() + ",");
                        });
                        buffer.deleteCharAt(buffer.lastIndexOf(","));
                    } else {
                        listFlowChildren.get(spmkApproveDetailDto.getIndex() + 1).setExecute("1");
                        listFlowChildren.get(spmkApproveDetailDto.getIndex() + 1).getRelation().get(0).getUsers().get(0).setExecute("1");
                        User u = listFlowChildren.get(spmkApproveDetailDto.getIndex() + 1).getRelation().get(0).getUsers().get(0);
                        SpmkApproveExecuteRecord spmkApproveExecuteRecord1 = SpmkApproveExecuteRecord
                                .builder()
                                .approveSummaryId(spmkApproveDetailSummary.getApproveSummaryId())
                                .name(SpmkEnumInterface.ParticipatorType.APPROVER.getName())
                                .type(SpmkEnumInterface.ParticipatorType.APPROVER.ordinal())
                                .sts(SpmkEnumInterface.ExecuteRecordSts.IN_EXECUTION.ordinal())
                                .build();
                        spmkApproveExecuteRecord1.insert();
                        SpmkExecutor.builder()
                                .approveExecuteRecordId(spmkApproveExecuteRecord1.getId())
                                .empNum(Integer.parseInt(u.getId()))
                                .operatorHeaderUrl(u.getHeadUrl())
                                .executorName(u.getName())
                                .sts(1)
                                .build().insert();
                        buffer.append(u.getName());

                    }
                } else {
                    if (!isAbreas) {
                        //顺序有一个同一个user里面的
                        listFlowChildren.get(spmkApproveDetailDto.getIndex()).getRelation().get(0).getUsers().get(spmkApproveDetailDto.getUserIndex() + 1).setExecute("1");
                        User u = listFlowChildren.get(spmkApproveDetailDto.getIndex()).getRelation().get(0).getUsers().get(spmkApproveDetailDto.getUserIndex() + 1);
                        SpmkExecutor.builder()
                                .approveExecuteRecordId(spmkApproveExecuteRecord.getId())
                                .empNum(Integer.parseInt(u.getId()))
                                .operatorHeaderUrl(u.getHeadUrl())
                                .executorName(u.getName())
                                .sts(1)
                                .build().insert();
                        buffer.append(u.getName());
                    }
                }
            }
            SpmkApproveSummary.builder().currentApprover(buffer.toString()).id(spmkApproveDetailSummary.getApproveSummaryId()).build().updateById();
        }
        //只有一条数据或者已经到下一个大节点
        if (onlyOne && isNext) {
            listFlowChildren.removeIf(f -> f == currentFlowChildren);
        } else {
            listFlowChildren.get(spmkApproveDetailDto.getIndex()).getRelation().get(0).getUsers().removeIf(u -> u == currentUser);
        }
        //如果是最终执行人
        if (isFinal && isNext && isExecute) {
            SpmkApproveSummary.builder().id(spmkApproveDetailSummary.getApproveSummaryId()).currentApprover(CommonEnum.NULL_STR.getDesc()).endTime(new Date()).sts(ApproveSummarySts.FINISH.ordinal()).build().updateById();
        }
        SpmkApproveDetailSummary.builder().id(spmkApproveDetailDto.getId())
                .flowChildren(JSONArray.fromObject(listFlowChildren).toString()).build().updateById();
        SpmkApproveDetailSummary detailSummary = SpmkApproveDetailSummary.builder().build().selectOne(new QueryWrapper<SpmkApproveDetailSummary>()
                .lambda().eq(SpmkApproveDetailSummary::getId, spmkApproveDetailDto.getId()));

        return ResultUtil.data(JSON.toJSONString(detailSummary));

    }


    @PostMapping(value = "/save_drafts")
    @ApiOperation(value = "存入草稿箱", httpMethod = "POST", notes = "存入草稿箱")
    @Transactional(rollbackFor = Exception.class)
    @Log(title = "审批-存入草稿箱", businessType = BusinessType.INSERT)
    public Result<Object> saveDrafts(@CurrentUser UserBean userBean, @Validated @RequestBody SpmkApproveSummaryDto spmkApproveSummaryDto) throws Exception {
        try {
            YgglMainEmp ygglMainEmp = YgglMainEmp.builder().build().selectOne(new QueryWrapper<YgglMainEmp>()
                    .lambda()
                    .select(YgglMainEmp::getHeadUrl, YgglMainEmp::getName)
                    .eq(YgglMainEmp::getEmpNum, userBean.getEmpNum())
                    .eq(YgglMainEmp::getOrgCode, userBean.getOrgCode())
            );

            if (ygglMainEmp == null)
                return ResultUtil.error("发起人不存在!");

//			List<SpmkApprovalG> saG = spmkService.selectListAg(userBean);
            Router router = spmkApproveSummaryDto.getRouter();
//			routers = RouterUtils.clearRouters(routers);
            /*TODO 验证是否拥有添加审核人的权限 只用于华颐*/
            QyzxEmpEntAsso ent = QyzxEmpEntAsso.builder().build().selectOne(new QueryWrapper<QyzxEmpEntAsso>().lambda().eq(QyzxEmpEntAsso::getOrgCode, userBean.getOrgCode()).eq(QyzxEmpEntAsso::getEmpNum, userBean.getEmpNum()));
            if (ent != null) {
                /*超管和管理员不受权限控制*/
                if (ent.getUserType() == 2) {
                    ZzglAuth zzglAuth = ZzglAuth.builder().build().selectOne(new QueryWrapper<ZzglAuth>().lambda().eq(ZzglAuth::getBmgwId, userBean.getUserInfo().getBmgwId())
                            .eq(ZzglAuth::getMenuId, "/Approvalspbutonspbuton020101"));
                    /*如果没有该权限*/
                    if (zzglAuth == null) {
                        SpmkCustomApproval ca = SpmkCustomApproval.builder().build().selectOne(new QueryWrapper<SpmkCustomApproval>().lambda()
                                .eq(SpmkCustomApproval::getName, spmkApproveSummaryDto.getApproveName()).eq(SpmkCustomApproval::getOrgCode, userBean.getOrgCode()));
                        Router oldRouter = ObjectUtil.deserialize(ca.getRouter());
                        if (isTrue(router.getChildren(), oldRouter.getChildren())) {
                            return ResultUtil.error("您没有新增审批人的权限");
                        }
                    }
                }
            }
            List<Router> listRouter = new ArrayList<Router>();
            listRouter.add(router);

            JSONObject jSONObject = spmkApproveSummaryDto.getRequestData()
                    .set("orgCode", userBean.getOrgCode())
                    .set("initiator", ygglMainEmp.getName())
                    .set("headUrl", ygglMainEmp.getHeadUrl())
                    .set("id", userBean.getEmpNum());
            RouterUtils.NextNode(listRouter, jSONObject, ISFIRST, true);
            List<FlowChildren> listFlowChildren = new ArrayList<FlowChildren>();
            RouterUtils.getIsFlowChildren(listRouter, listFlowChildren);

            String currentApprover = jSONObject.getStr("current_approver");
            SpmkApproveDrafts as = SpmkApproveDrafts
                    .builder()
                    .orgCode(userBean.getOrgCode())
                    .empNum(userBean.getEmpNum())
                    .title(spmkApproveSummaryDto.getTitle())
                    .initiator(spmkApproveSummaryDto.getInitiator())
                    .approveName(spmkApproveSummaryDto.getApproveName())
                    .assoType(spmkApproveSummaryDto.getAssoType())
                    .sts(ApproveSummarySts.IN.ordinal())
                    .digest(spmkApproveSummaryDto.getDigest())
                    .updateTime(new Date())
                    .currentApprover(currentApprover).isUrgent(spmkApproveSummaryDto.getIsUrgent())
                    .build();
            if (spmkApproveSummaryDto.getId() != null) {
                as.setId(spmkApproveSummaryDto.getId());

            }

            if (!as.insertOrUpdate()) {
                throw new CustomException("审批草稿汇总-新增异常");
            }
            // 草稿不插入执审批流程
//		RouterUtils.insertogExecuteRecord(listFlowChildren, as.getId());

            // 封装 审批详情
            SpmkApproveDetailDrafts adm = SpmkApproveDetailDrafts.builder().build();
            adm.setApproveSummaryId(as.getId());
            adm.setName(spmkApproveSummaryDto.getTitle());
            adm.setRequestData(spmkApproveSummaryDto.getRequestData().toString());
            adm.setFroms(spmkApproveSummaryDto.getFroms().toString());
            adm.setRouter(listRouter.get(0).toJSONString());
            adm.setFlowChildren(JSONArray.fromObject(listFlowChildren).toString());

            if (spmkApproveSummaryDto.getId() != null) {
                SpmkApproveDetailDrafts sp = SpmkApproveDetailDrafts.builder().build().selectOne(new QueryWrapper<SpmkApproveDetailDrafts>().lambda().eq(SpmkApproveDetailDrafts::getApproveSummaryId, spmkApproveSummaryDto.getId()));
                adm.setId(sp.getId());
                spmkApproveDetailDraftsMapper.updateById(adm);
            } else {
                spmkApproveDetailDraftsMapper.insert(adm);
            }
            return ResultUtil.data(as.getId());
        } catch (Exception e) {
//			throw new CustomException("审批草稿详情-新增异常");
            e.printStackTrace();
        }
        return ResultUtil.error("审批草稿详情-新增异常");
    }

    ;

    @PostMapping(value = "/my_drafts")
    @ApiOperation(value = "我的草稿箱", httpMethod = "POST", notes = "我的草稿箱")
    @Log(title = "审批-我的草稿箱", businessType = BusinessType.OTHER)
    public Result<Object> myDrafts(@CurrentUser UserBean userBean, @Validated @RequestBody MySummaryQueryDto mySummaryQueryDto) {
        IPage<SpmkApproveDrafts> page = new Page<SpmkApproveDrafts>(
                mySummaryQueryDto.getCurrentPage() == null ? 1 : mySummaryQueryDto.getCurrentPage(),
                mySummaryQueryDto.getTotalPage() == null ? 10 : mySummaryQueryDto.getTotalPage());
        mySummaryQueryDto.setOrgCode(userBean.getOrgCode());
        mySummaryQueryDto.setEmpNum(userBean.getEmpNum());
        if (mySummaryQueryDto.getSts() == null) {
            mySummaryQueryDto.setSts(0);
        }
        IPage<SpmkApproveDrafts> pageAs = spmkApproveDraftsMapper.selectPageByQueryForEmpNum(page, mySummaryQueryDto);

        List<SpmkApproveDrafts> listAs = pageAs.getRecords();
        return ResultUtil.data(pageAs, listAs);
    }

    @PostMapping(value = "/del_drafts")
    @ApiOperation(value = "删除草稿", httpMethod = "POST", notes = "删除草稿")
    @Log(title = "审批-删除草稿", businessType = BusinessType.OTHER)
    public Result<Object> myDrafts(@CurrentUser UserBean userBean, @RequestBody SpmkApproveDrafts spmkApproveDrafts) {
        SpmkApproveDrafts drafts = SpmkApproveDrafts.builder().id(spmkApproveDrafts.getId()).build().selectById();
        SpmkApproveDetailDrafts.builder().build().delete(new QueryWrapper<SpmkApproveDetailDrafts>().lambda().eq(SpmkApproveDetailDrafts::getApproveSummaryId, drafts.getId()));
        drafts.deleteById();
        return ResultUtil.data("删除成功");
    }

    @PostMapping(value = "/add_files")
    @ApiOperation(value = "添加附件", httpMethod = "POST", notes = "添加附件")
    @Log(title = "审批-添加附件", businessType = BusinessType.OTHER)
    public Result<Object> addFiles(@CurrentUser UserBean userBean, @RequestBody ApprovingDto approvingDto) {
        QyzxEmpEntAsso ent = QyzxEmpEntAsso.builder().build().selectOne(new QueryWrapper<QyzxEmpEntAsso>().lambda().eq(QyzxEmpEntAsso::getOrgCode, userBean.getOrgCode()).eq(QyzxEmpEntAsso::getEmpNum, userBean.getEmpNum()));
        if (ent != null) {
            System.out.println(!ent.getEmpNum().equals(userBean.getEmpNum()));
            if (ent.getUserType() == 2 && !ent.getEmpNum().equals(userBean.getEmpNum())) {
                return ResultUtil.error("暂无权限");
            }
        }
        SpmkApproveDetailSummary ad = SpmkApproveDetailSummary.builder().build().selectOne(new QueryWrapper<SpmkApproveDetailSummary>()
                .lambda()
                .select(SpmkApproveDetailSummary::getId,
                        SpmkApproveDetailSummary::getRequestData,
                        SpmkApproveDetailSummary::getFroms,
                        SpmkApproveDetailSummary::getFlowChildren)
                .eq(SpmkApproveDetailSummary::getId, approvingDto.getAsId()));
        // 审批详情 审批时添加 附件
        try {
            if (RequestDataUtils.addFileList(ad, approvingDto.getFileList())) {
                ad.updateById();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ResultUtil.data("添加附件成功");
    }

    @PostMapping(value = "/del_file")
    @ApiOperation(value = "添加附件", httpMethod = "POST", notes = "添加附件")
    @Log(title = "审批-添加附件", businessType = BusinessType.OTHER)
    public Result<Object> delFileList(@CurrentUser UserBean userBean, @RequestBody ApprovingDto approvingDto) {
        QyzxEmpEntAsso ent = QyzxEmpEntAsso.builder().build().selectOne(new QueryWrapper<QyzxEmpEntAsso>().lambda().eq(QyzxEmpEntAsso::getOrgCode, userBean.getOrgCode()).eq(QyzxEmpEntAsso::getEmpNum, userBean.getEmpNum()));
        if (ent != null) {
            if (ent.getUserType() == 2 && !ent.getEmpNum().equals(userBean.getEmpNum())) {
                return ResultUtil.error("暂无权限");
            }
        }
        SpmkApproveDetailSummary ad = SpmkApproveDetailSummary.builder().build().selectOne(new QueryWrapper<SpmkApproveDetailSummary>()
                .lambda()
                .select(SpmkApproveDetailSummary::getId,
                        SpmkApproveDetailSummary::getRequestData,
                        SpmkApproveDetailSummary::getFroms,
                        SpmkApproveDetailSummary::getFlowChildren)
                .eq(SpmkApproveDetailSummary::getId, approvingDto.getAsId()));
        // 审批详情 审批时添加 附件
        try {
            if (RequestDataUtils.delFileList(ad, approvingDto.getFileList())) {
                ad.updateById();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ResultUtil.data("删除附件成功");
    }

    @PostMapping(value = "/update_spmk_content")
    @ApiOperation(value = "更新审批文本内容", httpMethod = "POST", notes = "更新审批文本内容")
    @Log(title = "更新审批文本内容", businessType = BusinessType.OTHER)
    public Result<Object> update_spmk_content(@CurrentUser UserBean userBean, @RequestBody SpmkApproveDetailDto sq) {
        SpmkApproveSummary.builder().id(sq.getId()).digest(sq.getDigest()).title(sq.getName()).build().updateById();
        SpmkApproveDetailSummary spmks = SpmkApproveDetailSummary.builder().build().selectOne(new LambdaQueryWrapper<SpmkApproveDetailSummary>().eq(SpmkApproveDetailSummary::getApproveSummaryId, sq.getId()));
        spmks.setRequestData(sq.getRequestData().toString());
        spmks.setName(sq.getName());
        spmks.updateById();
        return ResultUtil.data("更新成功");
    }


    @PostMapping(value = "/is_current_execute")
    @ApiOperation(value = "查询是否当前审批人", httpMethod = "POST", notes = "查询是否当前审批人")
    @Log(title = "查询是否当前审批人", businessType = BusinessType.OTHER)
    public Result<Object> isCurrentExecute(@CurrentUser UserBean userBean, @RequestBody SpmkApproveDetailDto sq) {
        SpmkApproveExecuteRecord spmkApproveExecuteRecord = spmkApproveExecuteRecordMapper.selectExecuteRecordBySts1(userBean.getEmpNum(), sq.getApproveSummaryId());
        return ResultUtil.data(spmkApproveExecuteRecord);
    }

}