package cn.timer.api.controller.spmk;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
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.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
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.lang.Console;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.timer.api.bean.spmk.SpmkApprovalG;
import cn.timer.api.bean.spmk.SpmkApprovalTemplate;
import cn.timer.api.bean.spmk.SpmkApprovalTemplateG;
import cn.timer.api.bean.spmk.SpmkApproveDetail;
import cn.timer.api.bean.spmk.SpmkApproveSummary;
import cn.timer.api.bean.spmk.SpmkCustomApproval;
import cn.timer.api.bean.spmk.SpmkIcon;
import cn.timer.api.bean.spmk.SpmkInitiatorConfig;
import cn.timer.api.bean.spmk.SpmkJqgz;
import cn.timer.api.bean.spmk.SpmkLcjd;
import cn.timer.api.bean.spmk.SpmkLcjdEmpAsso;
import cn.timer.api.bean.spmk.SpmkMb;
import cn.timer.api.bean.spmk.SpmkSpcz;
import cn.timer.api.bean.spmk.SpmkSpgl;
import cn.timer.api.bean.spmk.SpmkSpz;
import cn.timer.api.bean.spmk.SpmkSxpz;
import cn.timer.api.bean.yggl.YgglMainEmp;
import cn.timer.api.config.annotation.CurrentUser;
import cn.timer.api.config.annotation.UserBean;
import cn.timer.api.config.enums.CommonEnum;
import cn.timer.api.dao.spmk.SpmkApprovalGMapper;
import cn.timer.api.dao.spmk.SpmkApprovalTemplateGMapper;
import cn.timer.api.dao.spmk.SpmkApprovalTemplateMapper;
import cn.timer.api.dao.spmk.SpmkApproveDetailMapper;
import cn.timer.api.dao.spmk.SpmkApproveExecuteRecordMapper;
import cn.timer.api.dao.spmk.SpmkApproveSummaryMapper;
import cn.timer.api.dao.spmk.SpmkCustomApprovalMapper;
import cn.timer.api.dao.spmk.SpmkExecutorMapper;
import cn.timer.api.dao.spmk.SpmkInitiatorConfigMapper;
import cn.timer.api.dao.spmk.SpmkSpglMapper;
import cn.timer.api.dao.spmk.SpmkSpzMapper;
import cn.timer.api.dto.spmk.Router;
import cn.timer.api.dto.spmk.Spmk;
import cn.timer.api.dto.spmk.SpmkApprovalTemplateDto;
import cn.timer.api.dto.spmk.SpmkApproveDetailDto;
import cn.timer.api.dto.spmk.SpmkApproveSummaryDto;
import cn.timer.api.dto.spmk.SpmkCustomApprovalDto;
import cn.timer.api.dto.spmk.SpmkMbKjDto;
import cn.timer.api.dto.spmk.SpmkSpglDto;
import cn.timer.api.dto.spmk.SpmkSpglMoveDto;
import cn.timer.api.dto.spmk.SpmkSpglSortDto;
import cn.timer.api.dto.spmk.SpmkSpzDto;
import cn.timer.api.dto.spmk.SpmkSpzSortDto;
import cn.timer.api.dto.spmk.SpmkSpzSpglDto;
import cn.timer.api.utils.Result;
import cn.timer.api.utils.ResultUtil;
import cn.timer.api.utils.RouterUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

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

	@Autowired
	private SpmkSpglMapper spmkSpglMapper;
	@Autowired
	private SpmkSpzMapper spmkSpzMapper;

	/**
	 * 审批组-列表
	 */
	@GetMapping(value = "/spzs")
	@ApiOperation(value = "审批组-列表",httpMethod = "GET")
	@ApiOperationSupport(order = 2)
	public Result<List<SpmkSpzSpglDto>> selectListspz(@CurrentUser UserBean userBean) {
		Integer orgCode = userBean.getOrgCode();

		List<SpmkSpzSpglDto> spmkSpzSpglDtos = spmkSpzMapper.selectSpglListByOrgCode(orgCode);

		return ResultUtil.data(spmkSpzSpglDtos, "获取审批组列表成功");
	}
	
	/**
	 * 审批组-新增
	 */
	@PostMapping(value = "/spzs")
	@ApiOperation(value = "审批组-新建",httpMethod = "POST")
	@ApiOperationSupport(order = 3)
	public Result<SpmkSpz> addspz(@CurrentUser UserBean userBean ,@RequestBody SpmkSpz spmkSpz) {
		Integer orgCode = userBean.getOrgCode();
		
		if (spmkSpz == null || spmkSpz.getName() == null) return ResultUtil.error("请填入审批组名");
		
		SpmkSpz one = spmkSpz.selectOne(new QueryWrapper<SpmkSpz>().eq("org_code", orgCode).eq("name", spmkSpz.getName()));
		
		if (one != null) return ResultUtil.error("新增失败,换个审批组名试一试~");
		
		List<SpmkSpz> spmkSpzs = SpmkSpz.builder().build().selectList(new QueryWrapper<SpmkSpz>().eq("org_code", orgCode));
		Integer maxSort = 0;
		if (spmkSpzs != null && spmkSpzs.size() > 0) {
			for (SpmkSpz spz : spmkSpzs) {
				Integer i = spz.getSort() == null ? 0 : spz.getSort();
				// 999999 是 【其他】 审批组 ,固定排最后
				if (maxSort < i && i < CommonEnum.SPZ_OTHER.getType()) maxSort = i;
			}
		}
		
		spmkSpz.setOrgCode(orgCode);
		spmkSpz.setIsEditable(0);
		spmkSpz.setSort(maxSort+1);
		spmkSpz.insert();
		
		return ResultUtil.data(spmkSpz, "审批组-新建成功");
	}
	
	/**
	 * 审批组-删除
	 */
	@DeleteMapping(value = "/spzs/{id}")
	@ApiOperation(value = "审批组-删除",httpMethod = "DELETE")
	@ApiOperationSupport(order = 4)
	public Result<SpmkSpz> delspz(@CurrentUser UserBean userBean ,@PathVariable("id") Integer id){
		Integer orgCode = userBean.getOrgCode();
		SpmkSpz spmkSpz = SpmkSpz.builder().build();
		
		SpmkSpz thisSpz = spmkSpz.selectById(id);
		if ("其他".equals(thisSpz.getName())) return ResultUtil.error("该审批组无法删除");
		
		SpmkSpz  otherSpz = spmkSpz.selectOne((new QueryWrapper<SpmkSpz>().eq("org_code", orgCode).eq("sort", CommonEnum.SPZ_OTHER.getType())));
		
		SpmkSpgl one = SpmkSpgl.builder().build().selectOne(new QueryWrapper<SpmkSpgl>().eq("spz_id", "").orderByDesc("sort").last("limit 1"));
		Integer max = (one == null || one.getSort() == null) ? 1 : one.getSort();
		List<SpmkSpgl> spmkSpgls = SpmkSpgl.builder().build().selectList(new QueryWrapper<SpmkSpgl>().eq("spz_id", id));
		if (spmkSpgls != null && spmkSpgls.size() > 0) {
			for (SpmkSpgl spmkSpgl : spmkSpgls) {
				spmkSpgl.setSort(max);
				spmkSpgl.setSpzId(otherSpz.getId());
				spmkSpgl.updateById();
				max++;
			}
		}
		
		boolean b = spmkSpz.deleteById(id);
		if(b) return ResultUtil.success("审批组-删除成功");
		return ResultUtil.error("审批组-删除失败");
	}

	/**
	 * 审批管理-编辑
	 */
	@PutMapping(value = "/spgl")
	@ApiOperation(value = "审批管理-编辑", httpMethod = "PUT", notes = "接口发布说明")
	@ApiOperationSupport(order = 9)
	public Result<SpmkSpgl> updateSpgl(@CurrentUser UserBean userBean,@RequestBody SpmkSpglDto spmkSpglDto){
		@SuppressWarnings("unused")
		Integer orgCode = userBean.getOrgCode();
		
		SpmkSpgl spmkSpgl = SpmkSpgl.builder().build();
		BeanUtil.copyProperties(spmkSpglDto, spmkSpgl, "lcjd","spyj");
		
		spmkSpgl.setMbId(null);
		spmkSpgl.setSpzId(null);
		spmkSpgl.setOrgCode(null);
		spmkSpgl.setSpyj(ArrayUtil.join(spmkSpglDto.getSpyj(),","));
		spmkSpgl.setLcjd(ObjectUtil.serialize(spmkSpglDto.getLcjd()));
		
		boolean b = spmkSpgl.updateById();
		if (!b) return ResultUtil.error("编辑管理员列失败");
		return ResultUtil.success("编辑管理员列成功");
	}
	
	/**
	 * 审批模版-新增/编辑
	 */
	@PutMapping(value = "/mb")
	@ApiOperation(value = "审批模版-新增/编辑", httpMethod = "PUT", notes = "接口发布说明")
	@ApiOperationSupport(order = 10)
	public Result<SpmkSpgl> updateMb(@CurrentUser UserBean userBean,@RequestBody SpmkMbKjDto spmkMbKjDto) {
		// TODO Auto-generated method stub

		SpmkMb spmkMb = SpmkMb.builder().build();
		BeanUtil.copyProperties(spmkMbKjDto, spmkMb, "kj");
		spmkMb.setKj(ObjectUtil.serialize(spmkMbKjDto.getKj()));
		
		boolean b = spmkMb.insertOrUpdate();
		if (!b) return ResultUtil.error("审批模版-新增/编辑失败");
		return ResultUtil.success("审批模版-新增/编辑成功");
	}
	

	/**
	 * 审批组-重命名
	 */
	@PutMapping(value = "/updatespz")
	@ApiOperation(value = "审批组-重命名", httpMethod = "PUT", notes = "接口发布说明")
	@ApiOperationSupport(order = 5)
	public Result<SpmkSpzDto> updatespz(@CurrentUser UserBean userBean,@RequestBody SpmkSpzDto spmkSpzDto) {
		// TODO Auto-generated method stub
		
		Integer orgCode = userBean.getOrgCode();
		
		if (spmkSpzDto == null || spmkSpzDto.getName() == null) return ResultUtil.error("请填入审批组名");
		
		SpmkSpz one = SpmkSpz.builder().build().selectOne(new QueryWrapper<SpmkSpz>().eq("org_code", orgCode).eq("name", spmkSpzDto.getName()));
		
		if (one != null) return ResultUtil.error("新增失败,换个审批组名试一试~");
		
		Integer id = spmkSpzDto.getId();
		String name = spmkSpzDto.getName();
		SpmkSpz.builder().id(id).name(name).build().updateById();
		return ResultUtil.data(spmkSpzDto, "审批组重命名成功");
	}

	/**
	 * 审批组-批量排序
	 */
	@PutMapping(value = "/updatespzsort")
	@ApiOperation(value = "审批组-排序", httpMethod = "PUT", notes = "接口发布说明")
	@ApiOperationSupport(order = 6)
	public Result<Void> updatespzsort(@CurrentUser UserBean userBean,@RequestBody List<SpmkSpzSortDto> spmkSpzSortDtos) {
		Integer orgCode = userBean.getOrgCode();
		SpmkSpz.builder().sort(CommonEnum.SPZ_OTHER.getType()).build().update(new UpdateWrapper<SpmkSpz>().eq("org_code", orgCode).eq("name", "其他"));
		
		Integer count = spmkSpzMapper.updateListSortById(spmkSpzSortDtos);
		System.out.println(count);
		return ResultUtil.success("审批组批量排序成功");
	}

	/**
	 * 审批管理-批量排序
	 */
	@PutMapping(value = "/updatespglsort")
	@ApiOperation(value = "审批管理-排序", httpMethod = "PUT", notes = "接口发布说明")
	@ApiOperationSupport(order = 8)
	public Result<Void> updatespglsort(@CurrentUser UserBean userBean,@RequestBody List<SpmkSpglSortDto> spmkSpglSortDtos) {
		Integer count = spmkSpglMapper.updateListSortById(spmkSpglSortDtos);
		System.out.println(count);
		return ResultUtil.success("审批管理批量排序成功");
	}

	/**
	 * 审批管理-查询
	 */
	@GetMapping(value = "/spgl/{id}")
	@ApiOperation(value = "审批管理-查询", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 11)
	public Result<SpmkSpglDto> selectspgl(@CurrentUser UserBean userBean,@PathVariable("id") Integer id) {
		SpmkSpgl spmkSpgl = spmkSpglMapper.selectSpglById2(id);
		
		if (spmkSpgl == null) {
			return ResultUtil.success();
		}
		
		SpmkSpglDto spmkSpglDto = SpmkSpglDto.builder().build();
		SpmkMbKjDto spmkMbKjDto = SpmkMbKjDto.builder().build();
		
		BeanUtil.copyProperties(spmkSpgl,spmkSpglDto, "lcjd","spmkMb");
		if (spmkSpgl.getLcjd() != null && spmkSpgl.getLcjd().length > 0) {
			spmkSpglDto.setSpyj(StrUtil.splitToInt(spmkSpgl.getSpyj(), ","));
			spmkSpglDto.setLcjd(ObjectUtil.unserialize(spmkSpgl.getLcjd()));
		}
		
		BeanUtil.copyProperties(spmkSpgl.getSpmkMb(),spmkMbKjDto, "kj");
		if (spmkSpgl.getSpmkMb() != null && spmkSpgl.getSpmkMb().getKj() != null && spmkSpgl.getSpmkMb().getKj().length > 0) {
			System.out.println(spmkSpgl.getSpmkMb().getKj());
			spmkMbKjDto.setKj(ObjectUtil.unserialize(spmkSpgl.getSpmkMb().getKj()));
		}
		
		spmkSpglDto.setSpmkMbKjDto(spmkMbKjDto);
		
		
		return ResultUtil.data(spmkSpglDto, "审批管理查询成功");
	}

	public void addlcjd(SpmkLcjd spmkLcjd, Integer upId) {
		if (spmkLcjd != null) {
			spmkLcjd.setUpId(upId);
			spmkLcjd.insert();
			System.out.println("spmkLcjdId" + spmkLcjd);
			List<SpmkSxpz> spmkSxpzs = spmkLcjd.getSpmkSxpzs();
			Integer spmkLcjdId = spmkLcjd.getId();
			if (spmkSxpzs != null && spmkSxpzs.size() > 0) {
				for (SpmkSxpz spmkSxpz : spmkSxpzs) {
					spmkSxpz.setLcjdId(spmkLcjdId);
					spmkSxpz.insert();
				}
			}

			List<SpmkLcjdEmpAsso> spmkLcjdEmpAssos = spmkLcjd.getSpmkLcjdEmpAssos();
			if (spmkLcjdEmpAssos != null && spmkLcjdEmpAssos.size() > 0) {
				for (SpmkLcjdEmpAsso spmkLcjdEmpAsso : spmkLcjdEmpAssos) {
					spmkLcjdEmpAsso.setLcjdId(spmkLcjdId);
					spmkLcjdEmpAsso.insert();
				}
			}

			List<SpmkLcjd> spmkLcjds = spmkLcjd.getSpmkLcjds();
			if (spmkLcjds != null && spmkLcjds.size() > 0) {
				for (SpmkLcjd spmkLcjd2 : spmkLcjds) {
					this.addlcjd(spmkLcjd2, spmkLcjdId);
				}
			}
		}
	}

	/**
	 * 审批管理-流程节点-批量添加/更新
	 */
	@Transactional
	@PostMapping(value = "/lcjd")
	@ApiOperation(value = "流程节点-批量添加/更新", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 12)
	public Result<Void> addlistlcjd(@CurrentUser UserBean userBean,@RequestBody SpmkLcjd spmkLcjd) {
		return null;
	}

	/**
	 * 审批操作-发起审批
	 */
	@PostMapping(value = "/spcz")
	@ApiOperation(value = "审批操作-发起审批", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 13)
	public Result<Void> addspcz(@CurrentUser UserBean userBean,@RequestBody SpmkSpcz spmkSpcz) {
			return ResultUtil.success("审批操作-发起审批成功");
	}

	/**
	 * 审批总汇-流程
	 */
	@PostMapping(value = "/sphz")
	@ApiOperation(value = "审批汇总-流程", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 14)
	public Result<Void> sphz(@CurrentUser UserBean userBean) {

		return null;
	}

	/**
	 * 移动到
	 */
	@PutMapping(value = "/movespgl")
	@ApiOperation(value = "移动到", httpMethod = "PUT", notes = "接口发布说明")
	@ApiOperationSupport(order = 7)
	public Result<SpmkSpgl> moveSpgl(@CurrentUser UserBean userBean,@RequestBody SpmkSpglMoveDto spmkSpglMoveDto) {

		Integer id = spmkSpglMoveDto.getId();
		Integer spzId = spmkSpglMoveDto.getSpzId();

		List<SpmkSpgl> spgls = SpmkSpgl.builder().build().selectList(new QueryWrapper<SpmkSpgl>().eq("spz_id", spzId));
		Integer maxSort = 0;
		if (spgls != null && spgls.size() > 0) {
			for (SpmkSpgl spmkSpgl : spgls) {
				Integer i = spmkSpgl.getSort() == null ? 0 : spmkSpgl.getSort();
				if (maxSort < i)
					maxSort = i;
			}
		}
		boolean b = SpmkSpgl.builder().id(id).spzId(spzId).sort(maxSort + 1).build().updateById();

		if (!b)
			return ResultUtil.error("移动审批失败");
		return ResultUtil.success("移动审批成功");
	}

	/**
	 * 图标列表
	 */
	@GetMapping(value = "/icon")
	@ApiOperation(value = "图标列表", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 1)
	public Result<List<SpmkIcon>> selectListIcon(@CurrentUser UserBean userBean){
		
		List<SpmkIcon> spmkIcons = SpmkIcon.builder().build().selectAll();
		
		return ResultUtil.data(spmkIcons,"获取图标列表成功");
	}
	
	/**
	 * 假期规则列表
	 */
	@GetMapping(value = "/jqgz")
	@ApiOperation(value = "假期规则列表", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 1)
	public Result<Object> selectListjqgz(
			@RequestParam(defaultValue = "1") Integer currentPage,
			@RequestParam(defaultValue = "10") Integer totalPage, @RequestParam Integer id,
			@CurrentUser UserBean userBean){
		
		Page<SpmkJqgz> p = new Page<SpmkJqgz>(currentPage, totalPage);
		Integer orgCode = userBean.getOrgCode();
		IPage<SpmkJqgz> sPage = SpmkJqgz.builder().build().selectPage(p, new QueryWrapper<SpmkJqgz>().eq("org_code",orgCode));
		List<SpmkJqgz> spmkJqgzs = sPage.getRecords();
		return ResultUtil.data(sPage, spmkJqgzs, "获取假期规则列表成功");
	}
	
	
	
	
	
	
	
	
	
	
	/**
	 * 流程节点解析
	 */
//	@PostMapping(value = "/jsonparse")
//	@ApiOperation(value = "流程节点解析", httpMethod = "POST", notes = "流程节点解析")
//	@ApiOperationSupport(order = 1)
//	public Result<Object> jsonToObj(@RequestBody Object jsonObj){
//
//		JSONObject obj = JSONUtil.parseObj(jsonObj, false, true);
//		
//		Router Router = obj.get("router", Router.class);
//
//		Console.log("obj:" + obj.toStringPretty());
//		Console.log("Router:" + Router.toPrettyString());
//		Console.log("Router:" + Router.toJSONString());
//		
//		return ResultUtil.success("解析成功!");
//	}
	
	/**
	 * 部门id 查询 员工
	 */
	@PostMapping(value = "/deptSelectEmp")
	@ApiOperation(value = "部门id 查询 员工", httpMethod = "POST", notes = "流程节点解析_plus")
	@ApiOperationSupport(order = 1)
	public Result<Object> selectEmpBydept(@RequestParam Integer id){
		List<YgglMainEmp> ygglMainEmp = RouterUtils.selectOtherlistent(4,id);
		return ResultUtil.data(ygglMainEmp, "解析成功!");
	}
	
	
	
	
	
	/**
	 * 流程节点解析123
	 */
	@PostMapping(value = "/jsonparse_plus_plus")
	@ApiOperation(value = "jsonparse_plus_plus", httpMethod = "POST", notes = "流程节点解析_plus")
	@ApiOperationSupport(order = 1)
	public Result<Object> jsonToObj123(@CurrentUser UserBean userBean, @RequestBody Spmk spmk){
		
		List<Router> listRouter = new ArrayList<Router>();
		listRouter.add(spmk.getRouter());
		
		JSONObject jSONObject = spmk.getData();
		jSONObject.put("orgCode", userBean.getOrgCode());
		
		return ResultUtil.data(RouterUtils.NextNode(listRouter, jSONObject), "解析成功!");
	}
	
	
	
	
	@Autowired
    private SpmkApprovalTemplateGMapper spmkApprovalTemplateGMapper;
	
	@Autowired
    private SpmkApprovalTemplateMapper spmkApprovalTemplateMapper;
	
	@Autowired
    private SpmkApprovalGMapper spmkApprovalGMapper;
	
	@Autowired
    private SpmkCustomApprovalMapper spmkCustomApprovalMapper;
	
	
	
	
	//TODO 审批模板组
	
	/**
	 * 新增或编辑-审批模板组
	 */
	@PostMapping(value = "/save_approval_template_g")
	@ApiOperation(value = "新增或编辑-审批模板组", httpMethod = "POST", notes = "新增或编辑-审批模板组")
	@ApiOperationSupport(order = 1)
	public Result<Object> saveAtg(@RequestBody SpmkApprovalTemplateG spmkApprovalTemplateG){
		
        return spmkApprovalTemplateG.insertOrUpdate() ? ResultUtil.success("操作成功!") : ResultUtil.error("操作失败!");
		
	}
	
	/**
	 * 删除-审批模板组
	 */
	@DeleteMapping(value = "/delete_approval_template_g/{id}")
	@ApiOperation(value = "删除-审批模板组", httpMethod = "DELETE", notes = "删除-审批模板组")
	@ApiOperationSupport(order = 1)
	public Result<Object> deleteAtgById(@PathVariable int id){
		
        return SpmkApprovalTemplateG.builder().id(id).build().deleteById() ? ResultUtil.success("操作成功!") : ResultUtil.error("没有找到该对象");
		
	}
	
	/**
	 * 查询列表-审批模板组
	 */
	@GetMapping(value = "/list_approval_template_g")
	@ApiOperation(value = "查询列表-审批模板组", httpMethod = "GET", notes = "查询列表-审批模板组")
	@ApiOperationSupport(order = 1)
	public Result<Object> selectListAtg(){
        
        return ResultUtil.data(spmkApprovalTemplateGMapper.selectListAtInAtg(),"操作成功!");
	}
	
	/**
	 * 排序-审批模板组
	 */
	@PutMapping(value = "/update_approval_template_g")
	@ApiOperation(value = "排序-审批模板组", httpMethod = "PUT", notes = "排序-审批模板组")
	@ApiOperationSupport(order = 1)
	public Result<Object> ranksAtg(@RequestBody List<SpmkApprovalTemplateG> list){

        return spmkApprovalTemplateGMapper.updateListRandsById(list) ? ResultUtil.success("操作成功!") : ResultUtil.error("操作失败!");
	}
	
	//TODO 审批模板
	/**
	 * 新增或编辑-审批模板
	 */
	@PostMapping(value = "/save_approval_template")
	@ApiOperation(value = "新增或编辑-审批模板", httpMethod = "POST", notes = "新增或编辑-审批模板")
	@ApiOperationSupport(order = 1)
	public Result<Object> saveAt(@RequestBody SpmkApprovalTemplateDto spmkApprovalTemplateDto){
		Integer approvalTemplateGId = spmkApprovalTemplateDto.getApprovalTemplateGId();
		if (ObjectUtil.isNull(approvalTemplateGId)) 
			return ResultUtil.error("操作失败!-1");

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

		BeanUtil.copyProperties(spmkApprovalTemplateDto, at , "froms","router");
		at.setFroms(ObjectUtil.serialize(spmkApprovalTemplateDto.getFroms()));
		at.setRouter(ObjectUtil.serialize(spmkApprovalTemplateDto.getRouter()));
		
		return at.insertOrUpdate() ? ResultUtil.success("操作成功!") : ResultUtil.error("操作失败!-2");
		
	}
	
	/**
	 * 删除-审批模板
	 */
	@DeleteMapping(value = "/delete_approval_template/{id}")
	@ApiOperation(value = "删除-审批模板", httpMethod = "DELETE", notes = "删除-审批模板")
	@ApiOperationSupport(order = 1)
	public Result<Object> deleteAtById(@PathVariable int id){
		
        return SpmkApprovalTemplate.builder().id(id).build().deleteById() ? ResultUtil.success("操作成功!") : ResultUtil.error("没有找到该对象");
		
	}

	/**
	 * id查询-审批模板
	 */
	@GetMapping(value = "/select_approval_template")
	@ApiOperation(value = "id查询-审批模板", httpMethod = "GET", notes = "id查询-审批模板")
	@ApiOperationSupport(order = 1)
	public Result<Object> selectAtById(@PathVariable int id){
        
        return ResultUtil.data(SpmkApprovalTemplate.builder().id(id).build().selectById(),"操作成功!");
        
	}
	
	/**
	 * 排序-审批模板
	 */
	@PutMapping(value = "/update_approval_template")
	@ApiOperation(value = "查询列表-审批模板组", httpMethod = "PUT", notes = "查询列表-审批模板组")
	@ApiOperationSupport(order = 1)
	public Result<Object> ranksAt(@RequestBody List<SpmkApprovalTemplate> list){

        return spmkApprovalTemplateMapper.updateListRandsById(list) ? ResultUtil.success("操作成功!") : ResultUtil.error("操作失败!");
	
	}
	
	
	
	//TODO 审批组
	/**
	 * 新增或编辑-审批组
	 */
	@PostMapping(value = "/save_approval_g")
	@ApiOperation(value = "新增或编辑-审批组", httpMethod = "POST", notes = "新增或编辑-审批组")
	@ApiOperationSupport(order = 1)
	public Result<Object> saveAg(@CurrentUser UserBean userBean,@RequestBody SpmkApprovalG spmkApprovalG){
		spmkApprovalG.setOrgCode(userBean.getOrgCode());
		return spmkApprovalG.insertOrUpdate() ? ResultUtil.success("操作成功!") : ResultUtil.error("操作失败!");
		
	}
	
	/**
	 * 删除-审批组
	 */
	@DeleteMapping(value = "/delete_approval_g/{id}")
	@ApiOperation(value = "删除-审批组", httpMethod = "DELETE", notes = "删除-审批组")
	@ApiOperationSupport(order = 1)
	public Result<Object> deleteAgById(@PathVariable int id){
		
        return SpmkApprovalG.builder().id(id).build().deleteById() ? ResultUtil.success("操作成功!") : ResultUtil.error("没有找到该对象");
		
	}
	
	/**
	 * 查询列表-审批组
	 */
	@GetMapping(value = "/list_approval_g")
	@ApiOperation(value = "查询列表-审批组", httpMethod = "GET", notes = "查询列表-审批组")
	@ApiOperationSupport(order = 1)
	public Result<Object> selectListAg(@CurrentUser UserBean userBean){
		
        return ResultUtil.data(spmkApprovalGMapper.selectListAgInCa(userBean.getOrgCode(), userBean.getEmpNum()),"操作成功!");
	
	}
	
	/**
	 * 排序-审批组
	 */
	@PutMapping(value = "/update_approval_g")
	@ApiOperation(value = "排序-审批组", httpMethod = "PUT", notes = "排序-审批组")
	@ApiOperationSupport(order = 1)
	public Result<Object> ranksAg(@RequestBody List<SpmkApprovalG> list){

        return spmkApprovalGMapper.updateListRandsById(list) ? ResultUtil.success("操作成功!") : ResultUtil.error("操作失败!");
	}
	
	//TODO 自定义审批
	
	/**
	 * 新增或编辑-自定义审批
	 */
	@PostMapping(value = "/save_custom_approval")
	@ApiOperation(value = "新增或编辑-自定义审批", httpMethod = "POST", notes = "新增或编辑-自定义审批")
	@ApiOperationSupport(order = 1)
	@Transactional(rollbackFor = Exception.class)
	public Result<Object> saveCa(@RequestBody SpmkCustomApprovalDto spmkCustomApprovalDto) throws Exception{
		Integer approvalGId = spmkCustomApprovalDto.getApprovalGId();
		if (ObjectUtil.isNull(approvalGId)) 
			return ResultUtil.error("操作失败!-1");

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

		BeanUtil.copyProperties(spmkCustomApprovalDto, ca , "froms","router","initiatorConfigs");
		ca.setFroms(ObjectUtil.serialize(spmkCustomApprovalDto.getFroms()));
		ca.setRouter(ObjectUtil.serialize(spmkCustomApprovalDto.getRouter()));
		
		if (!ca.insertOrUpdate())
			return ResultUtil.error("操作失败!-2");
		
		Integer id = ca.getId();
		Console.log("自定义审批id: " + id);
		List<SpmkInitiatorConfig> listIc = spmkCustomApprovalDto.getInitiatorConfigs();

		for (int i = 0, n = listIc.size(); i < n; i++) {
			listIc.get(i).setCustomApprovalId(id);
		}

		//  
		/**
		 * 注意: 为保证该api的原子性 要加 事务处理 回滚(方法注解-@Transactional(rollbackFor = Exception.class))
		 * 1.删除	历史的  SpmkInitiatorConfig-审批发起人配置,
		 * 2.新增	最新的 SpmkInitiatorConfig-审批发起人配置,
		 * 3.新增 SpmkCustomApproval-自定义审批
		 */
		if (!SpmkInitiatorConfig.builder().build().delete(new QueryWrapper<SpmkInitiatorConfig>().lambda().eq(SpmkInitiatorConfig::getCustomApprovalId, id)) || 
				!spmkInitiatorConfigMapper.insertList(listIc)) {
			// 手动抛出异常,事务回滚
			throw new Exception();
		}
		
		return ResultUtil.success("操作成功!");
		
	}
	
	/**
	 * 删除-自定义审批
	 */
	@DeleteMapping(value = "/delete_custom_approval/{id}")
	@ApiOperation(value = "删除-自定义审批", httpMethod = "DELETE", notes = "删除-自定义审批")
	@ApiOperationSupport(order = 1)
	public Result<Object> deleteCaById(@PathVariable int id){

        return SpmkCustomApproval.builder().id(id).build().deleteById() && 
        		SpmkInitiatorConfig.builder().build().delete(new QueryWrapper<SpmkInitiatorConfig>().lambda().eq(SpmkInitiatorConfig::getCustomApprovalId, id)) ? 
        		ResultUtil.success("操作成功!") : ResultUtil.error("没有找到该对象");
		
	}

	/**
	 * id查询-自定义审批
	 */
	@GetMapping(value = "/select_custom_approval")
	@ApiOperation(value = "id查询-审批模板", httpMethod = "GET", notes = "id查询-审批模板")
	@ApiOperationSupport(order = 1)
	public Result<Object> selectCaById(@PathVariable int id){
        
        return ResultUtil.data(SpmkCustomApproval.builder().id(id).build().selectById(),"操作成功!");
        
	}
	
	/**
	 * 排序-自定义审批
	 */
	@PutMapping(value = "/update_custom_approval")
	@ApiOperation(value = "排序-自定义审批", httpMethod = "PUT", notes = "排序-自定义审批")
	@ApiOperationSupport(order = 1)
	public Result<Object> ranksCa(@RequestBody List<SpmkCustomApproval> list){

        return spmkCustomApprovalMapper.updateListRandsById(list) ? ResultUtil.success("操作成功!") : ResultUtil.error("操作失败!");
	
	}
	
	@Autowired
	private SpmkApproveSummaryMapper spmkApproveSummaryMapper;
	@Autowired
	private SpmkApproveDetailMapper spmkApproveDetailMapper;
	@Autowired
	private SpmkApproveExecuteRecordMapper spmkApproveExecuteRecordMapper;
	@Autowired
	private SpmkExecutorMapper spmkExecutorMapper;
	@Autowired
	private SpmkInitiatorConfigMapper spmkInitiatorConfigMapper;
	
	// TODO 审批汇总(发起审批)
	/**
	 * 发起审批
	 */
	@PostMapping(value = "/start_approval")
	@ApiOperation(value = "新增或编辑-自定义审批", httpMethod = "POST", notes = "新增或编辑-自定义审批")
	@ApiOperationSupport(order = 1)
	public Result<Object> saveCa(@CurrentUser UserBean userBean, @RequestBody SpmkApproveSummaryDto spmkApproveSummaryDto){
			
			SpmkApproveSummary as = spmkApproveSummaryDto.getSpmkApproveSummary();
			as.setOrgCode(userBean.getOrgCode());
//			待补充
			
			SpmkApproveDetailDto adD = spmkApproveSummaryDto.getSpmkApproveDetailDto();
			List<Router> listRouter = new ArrayList<Router>();
			listRouter.add(spmkApproveSummaryDto.getSpmkApproveDetailDto().getRouter());
			JSONObject jSONObject = spmkApproveSummaryDto
					.getSpmkApproveDetailDto()
					.getRequestData()
					.put("orgCode", userBean.getOrgCode());
			
			SpmkApproveDetail ad = SpmkApproveDetail.builder().build();
			
			BeanUtil.copyProperties(adD, ad , "requestData","froms","router");
			ad.setRequestData(ObjectUtil.serialize(adD.getRequestData()));
			ad.setFroms(ObjectUtil.serialize(adD.getFroms()));
			ad.setRouter(ObjectUtil.serialize(adD.getRouter()));
			
			
			
			
			
			

//		Integer approvalGId = spmkCustomApproval.getApprovalGId();
//		
//		if (approvalGId == null || approvalGId.equals("")) {
//			return ResultUtil.error("操作失败!-1");
//		}
			return null;
//		return spmkCustomApproval.insertOrUpdate() ? ResultUtil.success("操作成功!") : ResultUtil.error("操作失败!-2");
		
	}
	
	
	
	
	
	
	

}