package cn.timer.api.controller.qyzx;

import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import javax.servlet.http.HttpSession;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.timer.api.bean.jxgl.JxglBasicSetting;
import cn.timer.api.bean.kqmk.*;
import cn.timer.api.bean.qyxx.CmsContent;
import cn.timer.api.bean.xcgl.XcglAssoBszqsz;
import cn.timer.api.bean.yggl.YgglMainEmp;
import cn.timer.api.config.enuminterface.YgEnumInterface;
import cn.timer.api.config.exception.CustomException;
import cn.timer.api.controller.jxgl.service.JxglService;
import cn.timer.api.controller.qyzx.service.RegisterHelper;
import cn.timer.api.controller.spmk.service.SpmkServiceImpl;
import cn.timer.api.dao.kqmk.KqglAssoLeaveRulesMapper;
import cn.timer.api.dto.qyzx.*;
import cn.timer.api.utils.Md5;
import cn.timer.api.utils.redis.RedisUtil;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.web.bind.annotation.*;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.conditions.update.LambdaUpdateChainWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.timer.api.aspect.lang.annotation.Log;
import cn.timer.api.aspect.lang.enums.BusinessType;
import cn.timer.api.bean.admin.AdminMenuTemplate;
import cn.timer.api.bean.qyzx.QyzxAdminColour;
import cn.timer.api.bean.qyzx.QyzxAdminMenu;
import cn.timer.api.bean.qyzx.QyzxAttaFwjsb;
import cn.timer.api.bean.qyzx.QyzxEmpEntAsso;
import cn.timer.api.bean.qyzx.QyzxEmpLogin;
import cn.timer.api.bean.qyzx.QyzxEntInfoM;
import cn.timer.api.bean.qyzx.QyzxInvoiceUsual;
import cn.timer.api.bean.qyzx.QyzxLogBuy;
import cn.timer.api.bean.qyzx.QyzxOperLog;
import cn.timer.api.bean.qyzx.QyzxPayServe;
import cn.timer.api.bean.qyzx.QyzxSuggestionFeeback;
import cn.timer.api.bean.zzgl.ZzglAuth;
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.enums.CommonEnum;
import cn.timer.api.config.enums.SysRoleType;
import cn.timer.api.controller.kqgl.ClockInTool;
import cn.timer.api.dao.qyzx.QyzxEmpEntAssoMapper;
import cn.timer.api.dao.qyzx.QyzxEmpLoginMapper;
import cn.timer.api.dao.qyzx.QyzxEntInfoMMapper;
import cn.timer.api.dao.qyzx.QyzxInvoiceUsualMapper;
import cn.timer.api.dao.qyzx.QyzxLogBuyMapper;
import cn.timer.api.dao.qyzx.QyzxOperLogMapper;
import cn.timer.api.dao.qyzx.QyzxPayServeMapper;
import cn.timer.api.dao.zzgl.ZzglBmgwMMapper;
import cn.timer.api.dto.login.QysDto;
import cn.timer.api.utils.Result;
import cn.timer.api.utils.ResultUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RestController
@Api(tags = "4.0企业中心")
@RequestMapping(value = "/qyzx", produces = { "application/json" })
public class QyzxController {
	@Autowired
	private HttpSession session;

	@Autowired
	private RedisUtil redisUtil;

	@Autowired
	private QyzxEmpEntAssoMapper qyzxEmpEntAssoMapper;

	@Autowired
	private QyzxEntInfoMMapper qyzxEntInfoMMapper;

	@Autowired
	private QyzxEmpLoginMapper qyzxEmpLoginMapper;

	@Autowired
	private QyzxLogBuyMapper qyzxLogBuyMapper;

	@Autowired
	private ZzglBmgwMMapper zzglBmgwMMapper;

	@Autowired
	private QyzxPayServeMapper qyzxPayServeMapper;

	@Autowired
	private QyzxInvoiceUsualMapper qyzxInvoiceUsualMapper;

	@Value("${config-8timer.register-company-max-num}")
	public Integer max;
	@Value("${config-8timer.qyxx.title}")
	private String title;
	@Value("${config-8timer.qyxx.author}")
	private String author;
	@Value("${config-8timer.qyxx.cover}")
	private String cover;
	@Value("${config-8timer.qyxx.summary}")
	private String summary;
	@Value("${config-8timer.environmental-science}")
	public String environmental_science;

	@Autowired
	SpmkServiceImpl SpmkService;
	@Autowired
	private KqglAssoLeaveRulesMapper kqglassoleaverulesmapper;

	@Autowired
	JxglService jxglService;
	/**
	 * 获取企业信息
	 *
	 * @param
	 * @return
	 */
	@GetMapping(value = "/ent")
	@ApiOperation(value = "获取企业信息", httpMethod = "GET", notes = "接口发布说明")
	public Result<QyzxEntInfoM> selectent(@CurrentUser UserBean userBean) {
		Integer orgCode = userBean.getOrgCode();
		QyzxEntInfoM qyzxEntInfoM = new LambdaQueryChainWrapper<QyzxEntInfoM>(qyzxEntInfoMMapper)
				.eq(orgCode != null, QyzxEntInfoM::getId, orgCode).one();
		return ResultUtil.data(qyzxEntInfoM, "获取企业信息成功");
	}

	/**
	 * 添加/修改企业信息
	 *
	 * @param
	 * @return
	 */
	@PostMapping(value = "/ent")
	@ApiOperation(value = "添加/修改企业信息", httpMethod = "POST", notes = "接口发布说明")
	@Log(title = "修改-企业信息", businessType = BusinessType.UPDATE)
	public Result<QyzxEntInfoM> addent(@CurrentUser UserBean userBean, @RequestBody QyzxEntInfoM qyzxEntInfoM) {
		qyzxEntInfoM.setId(userBean.getOrgCode());

		QyzxEntInfoM q = new LambdaQueryChainWrapper<QyzxEntInfoM>(qyzxEntInfoMMapper)
				.eq(QyzxEntInfoM::getId, userBean.getOrgCode()).one();

		qyzxEntInfoM.setRegisterTime(q.getRegisterTime());
		qyzxEntInfoM.insertOrUpdate();

		return ResultUtil.data(qyzxEntInfoM, "添加/修改企业");
	}

	/**
	 * 企业认证-申请
	 *
	 * @param qyzxEntAuth
	 * @return
	 */
	@PostMapping(value = "/entauth")
	@ApiOperation(value = "企业认证", httpMethod = "POST", notes = "接口发布说明")
	@Log(title = "企业认证", businessType = BusinessType.INSERT)
	public Result<QyzxEntInfoM> entauth(@CurrentUser UserBean userBean, @RequestBody QyzxEntInfoM qyzxEntInfoM) {
		// 设置审核状态
		qyzxEntInfoM.setAttestStatus(CommonEnum.AUTH_TYPE_UNDEREVIEW.getType());
		qyzxEntInfoM.setId(userBean.getOrgCode());
		qyzxEntInfoM.updateById();
		// }
		return ResultUtil.data(qyzxEntInfoM, "申请企业认证中");
	}

	/**
	 * 运营管理 企业认证-审核-通过/不通过(weng)
	 *
	 * @param qyzxEntAuth
	 * @return
	 */
	@PostMapping(value = "/entauthpass")
	@ApiOperation(value = "企业认证-审核-通过", httpMethod = "POST", notes = "接口发布说明")
	public Result<String> entauthpass(@RequestBody EntauthDto entauthDto) {// 2未通过,3通过
		String msg = "企业未认证";
		Integer type = entauthDto.getAuthType();
		if (type == CommonEnum.AUTH_TYPE_SUCCESS.getType()) {
			msg = "企业认证成功";
		}
		if (type == CommonEnum.AUTH_TYPE_FAILURE.getType()) {
			msg = "企业认证失败";
		}
		boolean b = new LambdaUpdateChainWrapper<QyzxEntInfoM>(qyzxEntInfoMMapper)
				.eq(QyzxEntInfoM::getId, entauthDto.getOrgCode()).set(QyzxEntInfoM::getAttestStatus, type).update();
		if (b) {
			return ResultUtil.data(msg);
		}
		return ResultUtil.data("企业认证流程有误");
	}

	/**
	 * 新增/编辑常用企业开票资料
	 *
	 * @param QyzxInvoiceUsual
	 * @return
	 */
	@PostMapping(value = "/invoiceusual")
	@ApiOperation(value = "新增/编辑常用企业开票资料", httpMethod = "POST", notes = "接口发布说明")
	public Result<QyzxInvoiceUsual> invoiceusual(@CurrentUser UserBean userBean,
			@RequestBody QyzxInvoiceUsual qyzxInvoiceUsual) {
		qyzxInvoiceUsual.setOrgCode(userBean.getOrgCode());
		qyzxInvoiceUsual.setModifyUser(userBean.getEmpNum());
		boolean tof = qyzxInvoiceUsual.insertOrUpdate();
		if (tof) {
			return ResultUtil.data(qyzxInvoiceUsual, "常用企业开票资料已修改");
		}
		return ResultUtil.error("开票资料修改无效");
	}

	/**
	 * 显示常用的企业开票资料
	 *
	 * @param QyzxInvoiceUsual
	 * @return
	 */
	@GetMapping(value = "/invoiceusual")
	@ApiOperation(value = "显示常用的企业开票资料", httpMethod = "GET", notes = "接口发布说明")
	public Result<QyzxInvoiceUsual> invoiceusual(@CurrentUser UserBean userBean) {
		QyzxInvoiceUsual one = qyzxInvoiceUsualMapper.selectOne(
				new QueryWrapper<QyzxInvoiceUsual>().lambda().eq(QyzxInvoiceUsual::getOrgCode, userBean.getOrgCode()));
		if (one != null) {
			if (one.getShippingArea() == null) {
				one.setShippingArea("");
			}
			if (one.getShippingAddress() == null) {
				one.setShippingAddress("");
			}
		}
		return ResultUtil.data(one, "显示常用的企业开票资料");
	}

	/**
	 * 显示企业的超级管理员
	 *
	 * @param qyzxEntAuth
	 * @return
	 */
	@GetMapping(value = "/smanagerphone")
	@ApiOperation(value = "显示超管头像和电话号码", httpMethod = "GET", notes = "接口发布说明")
	public Result<QyzxEmpLogin> smanagerphone(@CurrentUser UserBean userBean) {
		QyzxEmpEntAsso smanagerid = new LambdaQueryChainWrapper<QyzxEmpEntAsso>(qyzxEmpEntAssoMapper)
				.select(QyzxEmpEntAsso::getEmpNum).eq(QyzxEmpEntAsso::getOrgCode, userBean.getOrgCode())
				.eq(QyzxEmpEntAsso::getStatus, 0).one();
		QyzxEmpLogin smanagerphone = new LambdaQueryChainWrapper<QyzxEmpLogin>(qyzxEmpLoginMapper)
				.select(QyzxEmpLogin::getPhone, QyzxEmpLogin::getHeadUrl)
				.eq(QyzxEmpLogin::getId, smanagerid.getEmpNum()).one();
		return ResultUtil.data(smanagerphone, "企业超管头像和电话号码");
	}

	/*	*//**
			 * 获取企业的到期时间和版本号
			 *//*
				 * @GetMapping(value = "/endtimeversion")
				 *
				 * @ApiOperation(value = "获取企业的到期时间和版本号", httpMethod = "GET", notes = "接口发布说明")
				 * public Result<QyzxEntInfoM> endtimeversion(@CurrentUser UserBean userBean) {
				 * QyzxEntInfoM qyzxEntInfoM = new
				 * LambdaQueryChainWrapper<QyzxEntInfoM>(qyzxEntInfoMMapper)
				 * .select(QyzxEntInfoM::getEndTime,QyzxEntInfoM::getLevel).eq(QyzxEntInfoM::
				 * getId, userBean.getOrgCode()).one(); return ResultUtil.data(qyzxEntInfoM,
				 * "获取企业的到期时间和版本号成功"); }
				 */

	/**
	 * 当前用户企业列表
	 *
	 * @param
	 * @return
	 */
	@GetMapping(value = "/entlist")
	@ApiOperation(value = "当前用户企业列表", httpMethod = "GET", notes = "接口发布说明")
	public Result<List<QyzxEntInfoM>> entlist1(@CurrentUser UserBean userBean) {

		List<Object> orgCodes = qyzxEmpEntAssoMapper.selectObjs(new QueryWrapper<QyzxEmpEntAsso>().lambda()
				.select(QyzxEmpEntAsso::getOrgCode).eq(QyzxEmpEntAsso::getEmpNum, userBean.getEmpNum()));
		List<QyzxEntInfoM> qyzxEntInfoMs = new LambdaQueryChainWrapper<QyzxEntInfoM>(qyzxEntInfoMMapper)
				.in(CollUtil.isNotEmpty(orgCodes), QyzxEntInfoM::getId, orgCodes).list();
		return ResultUtil.data(qyzxEntInfoMs, "获取企业信息成功");
	}

	/**
	 * 所有企业列表
	 *
	 * @param
	 * @return
	 */
	@GetMapping(value = "/entlistAll")
	@ApiOperation(value = "所有企业列表", httpMethod = "GET", notes = "接口发布说明")
	public Result<List<QyzxEntInfoM>> entlistAll(@CurrentUser UserBean userBean) {
		List<QyzxEntInfoM> qyzxEntInfoMs = new LambdaQueryChainWrapper<QyzxEntInfoM>(qyzxEntInfoMMapper)
				.list();
		return ResultUtil.data(qyzxEntInfoMs, "获取企业信息成功");
	}

	/**
	 * 切换企业
	 *
	 * @param org_num
	 * @return
	 */
	@GetMapping(value = "/changeent/{orgCode}")
	@ApiOperation(value = "切换企业", httpMethod = "GET", notes = "接口发布说明")
	public Result<List<String>> changeent(@CurrentUser UserBean userBean, @PathVariable Integer orgCode) {
		// 查询该员工加入的企业id列表
		QyzxEmpLogin emp = userBean.getQyzxEmpLogin();
		Stream<QysDto> s = emp.getQys().stream().filter(o -> orgCode.equals(o.getId()));
		// 判断 切换目标企业id 是否包含在 企业id列表 内
		if (s != null) {
			List<String> menus = new ArrayList<>();
			QysDto ctrl = s.findFirst().orElse(null);
			if (ctrl == null) {
				return ResultUtil.data(menus, "你不是该企业的用户!");
			}

			if (SysRoleType.U_TYPE_ADMIN.getType().equals(ctrl.getUserType())
					|| SysRoleType.U_TYPE_C_ADMIN.getType().equals(ctrl.getUserType())) {
			} else {
				// 获取权限
				ArrayList<Integer> list = new ArrayList<Integer>();
//				List<ZzglBmgwM> zzglBmgwMs = new LambdaQueryChainWrapper<ZzglBmgwM>(zzglBmgwMMapper)
//						.eq(ZzglBmgwM::getOrgCode, ctrl.getId()).list();

				List<ZzglBmgwM> zzglBmgwMs = zzglBmgwMMapper
						.selectList(new QueryWrapper<ZzglBmgwM>().lambda().eq(ZzglBmgwM::getOrgCode, ctrl.getId()));

				// 传入的部门岗位是登录者的岗位id.获取的list中只有一个元素,不必要
				ZzglBmgwM.getupDepts(list, ctrl.getBmgwId(), zzglBmgwMs);
				if (list != null && list.size() > 0) {
					LambdaQueryWrapper<ZzglAuth> wp = new LambdaQueryWrapper<>();
					wp.select(ZzglAuth::getMenuId).eq(ZzglAuth::getOrgCode, ctrl.getId())
							.and(i -> i.in(ZzglAuth::getBmgwId, list.toArray()));
					List<ZzglAuth> zas = ZzglAuth.builder().build().selectList(wp);
					if (zas != null && zas.size() != 0)
						zas.stream().forEach(o -> menus.add(o.getMenuId()));
				}
			}
			emp.setOrgId(orgCode);
			//session.setAttribute("ui", emp);
			redisUtil.setAttribute(session.getId(),"ui", emp);
			qyzxEmpLoginMapper.updateById(emp);
			return ResultUtil.data(menus, "切换企业成功");
		} else {
			return ResultUtil.error();
		}
	}

	/**
	 * 意见反馈
	 */
	@PostMapping(value = "/feedback")
	@ApiOperation(value = "意见反馈", httpMethod = "POST", notes = "接口发布说明")
	public Result<String> feedback(@CurrentUser UserBean userBean,
			@RequestBody QyzxSuggestionFeeback qyzxSuggestionFeeback) {

		if (!ObjectUtil.isAllNotEmpty(qyzxSuggestionFeeback.getOpinionText(), qyzxSuggestionFeeback.getUrl(),
				qyzxSuggestionFeeback.getPersonalContact()))
			return ResultUtil.error("请完善意见信息!");

		qyzxSuggestionFeeback.setCreateTime(new Date());
		qyzxSuggestionFeeback.setEmpNum(userBean.getEmpNum());
		qyzxSuggestionFeeback.setOrgCode(userBean.getOrgCode());
		if (qyzxSuggestionFeeback.insert()) {
			return ResultUtil.data("意见反馈成功!");
		}
		return ResultUtil.data("意见反馈失败!");
	}

	/**
	 * 查看服务列表
	 */
	@GetMapping(value = "/servelist")
	@ApiOperation(value = "查看服务列表", httpMethod = "GET", notes = "接口发布说明")
	public Result<List<QyzxPayServe>> servelist() {
		List<QyzxPayServe> list = new LambdaQueryChainWrapper<QyzxPayServe>(qyzxPayServeMapper)
				.select(QyzxPayServe::getName, QyzxPayServe::getNum, QyzxPayServe::getSpecialPrice,
						QyzxPayServe::getOriginalPrice, QyzxPayServe::getSort, QyzxPayServe::getUnit,
						QyzxPayServe::getRemark)
				.orderByAsc(QyzxPayServe::getId).list();
		return ResultUtil.data(list, "查看服务列表成功");
	}

	/**
	 * 购买服务(添加服务计算,添加购买记录)
	 *
	 * @param
	 * @return
	 */
	@PostMapping(value = "/buyserve")
	@ApiOperation(value = "购买服务(添加服务计算,添加购买记录)", httpMethod = "POST", notes = "接口发布说明")
	public Result<QyzxLogBuy> buyserve(@CurrentUser UserBean userBean, @RequestBody QyzxLogBuy qyzxLogBuy) {
		Integer payServeId = qyzxLogBuy.getPayServeId();// 套餐的付费服务的id
		Integer num = qyzxLogBuy.getNum();// 套餐的购买次数
		QyzxPayServe qyzxPayServe = QyzxPayServe.builder().id(payServeId).build().selectById();
		Integer code = qyzxPayServe.getCode();// 获取套餐的付费服务代码

		Double o = qyzxPayServe.getOriginalPrice();
		Double s = qyzxPayServe.getSpecialPrice();
		Double price = (s != null && s > 0d ? s : o);
		Double money = NumberUtil.round(NumberUtil.mul(price, num), 4).doubleValue();
		log.info("money:" + money);
		Date date = new Date();
		log.info("date:" + date);
		// 添加购买记录表
		QyzxLogBuy.builder().empNum(userBean.getEmpNum()).payServeId(payServeId).money(money).num(num).createTime(date)
				.build().insertOrUpdate();
		// 添加或修改服务计算表
		Integer number = qyzxPayServe.getNum();
		LambdaQueryWrapper<QyzxAttaFwjsb> queryWrapper = new QueryWrapper<QyzxAttaFwjsb>().lambda();
		queryWrapper.eq(QyzxAttaFwjsb::getEmpNum, userBean.getEmpNum()).eq(QyzxAttaFwjsb::getCode, code);
		Integer result = QyzxAttaFwjsb.builder().build().selectCount(queryWrapper);
		if (result != null && result > 0) {
			QyzxAttaFwjsb fwjb = QyzxAttaFwjsb.builder().build().selectOne(queryWrapper);
			// 续费
			QyzxAttaFwjsb.builder().id(fwjb.getId()).empNum(userBean.getEmpNum()).code(code)
					.hasNum(fwjb.getHasNum() + num * number).createTime(date).build().insertOrUpdate();
		} else {
			// 新增
			QyzxAttaFwjsb.builder().empNum(userBean.getEmpNum()).code(code).hasNum(num * number).createTime(date)
					.build().insertOrUpdate();
		}
		return ResultUtil.data(qyzxLogBuy, "添加/修改发票资料成功");
	}

	// 使用系统购买服务
	/**
	 * 获取服务计算
	 *
	 * @param
	 * @return
	 */
	@GetMapping(value = "/fwjs")
	@ApiOperation(value = "查看服务计算", httpMethod = "GET", notes = "接口发布说明")
	public Result<List<QyzxAttaFwjsb>> fwjs(@CurrentUser UserBean userBean) {
		List<QyzxAttaFwjsb> qyzxAttaFpgl = QyzxAttaFwjsb.builder().build().selectList(
				new QueryWrapper<QyzxAttaFwjsb>().lambda().eq(QyzxAttaFwjsb::getEmpNum, userBean.getEmpNum()));
		return ResultUtil.data(qyzxAttaFpgl, "获取服务计算成功");
	}

	/**
	 * 获取购买记录
	 *
	 * @param
	 * @return
	 */
	@GetMapping(value = "/gmjl")
	@ApiOperation(value = "获取购买记录", httpMethod = "GET", notes = "接口发布说明")
	public Result<List<QyzxLogBuy>> selectgmjl(@CurrentUser UserBean userBean) {
		List<QyzxLogBuy> qyzxLogBuy = QyzxLogBuy.builder().build()
				.selectList(new QueryWrapper<QyzxLogBuy>().lambda().eq(QyzxLogBuy::getEmpNum, userBean.getEmpNum()));
		return ResultUtil.data(qyzxLogBuy, "获取购买记录成功");
	}

	/**
	 * 查询购买记录
	 *
	 * @param
	 * @return
	 */
	@PostMapping(value = "/gmjlquery")
	@ApiOperation(value = "查询购买记录", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> querygmjl(@CurrentUser UserBean userBean, @RequestBody AttaFpglQueryDto attaFpglQueryDto) {

		Integer empNum = userBean.getEmpNum();
		attaFpglQueryDto.setEmpNum(empNum);

		IPage<LogBuyDto> page = new Page<LogBuyDto>(
				attaFpglQueryDto.getCurrentPage() == null ? 1 : attaFpglQueryDto.getCurrentPage(),
				attaFpglQueryDto.getTotalPage() == null ? 10 : attaFpglQueryDto.getTotalPage());

		List<LogBuyDto> logBuyDto = qyzxLogBuyMapper.selectByName(page, attaFpglQueryDto);

		return ResultUtil.data(page, logBuyDto, "查询成功");
	}

	/**
	 * 账号管理 获取账号
	 *
	 * @param
	 * @return
	 */
	@GetMapping(value = "/adminlist/{page}/{limit}")
	@ApiOperation(value = "获取账号", httpMethod = "GET", notes = "接口发布说明")
	public Result<Object> adminlist(@CurrentUser UserBean userBean, @PathVariable("page") Integer page,
			@PathVariable("limit") Integer limit) {
		IPage<AdminListDto> page1 = new Page<AdminListDto>(page, limit);
		return ResultUtil.data(page1, qyzxEmpEntAssoMapper.adminlist(page1, userBean.getOrgCode()), "获取账号");
	}

	@Autowired
	private QyzxOperLogMapper qyzxOperLogMapper;

	/**
	 * 查询-操作日志
	 *
	 * @param
	 * @return
	 */
	@PostMapping(value = "/select_oper_log")
	@ApiOperation(value = "查询-操作日志", httpMethod = "POST", notes = "查询-操作日志")
	public Result<Object> selectOperLog(@CurrentUser UserBean userBean,
			@RequestBody QyzxOperLogQuaryDto qyzxOperLogQuaryDto) {
		IPage<QyzxOperLog> page = new Page<QyzxOperLog>(
				qyzxOperLogQuaryDto.getCurrentPage() == null ? 1 : qyzxOperLogQuaryDto.getCurrentPage(),
				qyzxOperLogQuaryDto.getTotalPage() == null ? 10 : qyzxOperLogQuaryDto.getTotalPage());

		qyzxOperLogQuaryDto.setOrgCode(userBean.getOrgCode());
//		IPage<QyzxOperLog> pages = qyzxOperLogMapper.selectPageByQuery(page, qyzxOperLogQuaryDto);

		if (qyzxOperLogQuaryDto.getEmpNums() == null) {

			List<Integer> roles = new ArrayList<Integer>();
			roles.add(SysRoleType.U_TYPE_ADMIN.getType());
			roles.add(SysRoleType.U_TYPE_C_ADMIN.getType());

			List<QyzxEmpEntAsso> list = QyzxEmpEntAsso.builder().build()
					.selectList(new LambdaQueryWrapper<QyzxEmpEntAsso>()
							.eq(QyzxEmpEntAsso::getOrgCode, userBean.getOrgCode())
							.in(QyzxEmpEntAsso::getUserType, roles).select(QyzxEmpEntAsso::getEmpNum));

			List<Integer> empNums = list.stream().map(QyzxEmpEntAsso::getEmpNum).collect(Collectors.toList());
			qyzxOperLogQuaryDto.setEmpNums(empNums);
		}
		IPage<QyzxOperLog> pages = qyzxOperLogMapper.selectPageByQuery2(page, qyzxOperLogQuaryDto);
		List<QyzxOperLog> listOl = pages.getRecords();

		return ResultUtil.data(pages, listOl, "操作成功!");
	}

	@PostMapping(value = "/menusequencedata")
	@ApiOperation(value = "菜单顺序数据", httpMethod = "POST", notes = "")
	public Result<Object> menusequencedata(@CurrentUser UserBean userBean) {

		List<MenuStructureDto> mestrs = new ArrayList<MenuStructureDto>();
		List<QyzxAdminMenu> qyme = QyzxAdminMenu.builder().build().selectList(new QueryWrapper<QyzxAdminMenu>().lambda().eq(QyzxAdminMenu::getOrgCode, userBean.getOrgCode()).orderByAsc(QyzxAdminMenu::getSortNumber));
		String[] zdy = new String[qyme.size()];
		int i  = 0;
		for(QyzxAdminMenu me : qyme) {
			MenuStructureDto metr = MenuStructureDto.builder().build();
			metr.setMenuCode(me.getMenuCode());
			metr.setMenuName(me.getMenuName());
			metr.setSortNumber(me.getSortNumber());
			metr.setPath("");
			mestrs.add(metr);
			zdy[i] = me.getMenuCode();
			i++;
		}
		//
		List<AdminMenuTemplate> adtes = AdminMenuTemplate.builder().build().selectList(new QueryWrapper<AdminMenuTemplate>().lambda().eq(AdminMenuTemplate::getEnable, 1).orderByAsc(AdminMenuTemplate::getSortNumber));
		for(AdminMenuTemplate adm : adtes) {

			if(!ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(zdy), adm.getMenuCode())) {
				if(adm.getDistribution() == 0 && userBean.getOrgCode() == 3) {
					MenuStructureDto metr = MenuStructureDto.builder().build();
					metr.setMenuCode(adm.getMenuCode());
					metr.setMenuName(adm.getMenuName());
					metr.setSortNumber(adm.getSortNumber());
					metr.setPath("");
					mestrs.add(metr);
				}else if(adm.getDistribution() == 1) {
					MenuStructureDto metr = MenuStructureDto.builder().build();
					metr.setMenuCode(adm.getMenuCode());
					metr.setMenuName(adm.getMenuName());
					metr.setSortNumber(adm.getSortNumber());
					metr.setPath("");
					mestrs.add(metr);
				}
			}
		}

		return ResultUtil.data(mestrs, "成功");
	}


	@PostMapping(value = "/menustructure")
	@ApiOperation(value = "菜单结构", httpMethod = "POST", notes = "")
	public Result<Object> menustructure(@CurrentUser UserBean userBean,@RequestBody List<QyzxAdminMenu> qymu) {

		QyzxAdminMenu.builder().build().delete(new QueryWrapper<QyzxAdminMenu>().lambda().eq(QyzxAdminMenu::getOrgCode, userBean.getOrgCode()));

		for(QyzxAdminMenu me : qymu) {
			QyzxAdminMenu meu = QyzxAdminMenu.builder().build();
			meu.setMenuCode(me.getMenuCode());
			meu.setMenuName(me.getMenuName());
			meu.setSortNumber(me.getSortNumber());
			meu.setOrgCode(userBean.getOrgCode());
			meu.setAddtime(new Date().getTime());
			meu.insert();
		}


		return ResultUtil.data(qymu, "修改成功");
	}

	@PostMapping(value = "/corporatecolor")
	@ApiOperation(value = "菜单自定义颜色", httpMethod = "POST", notes = "")
	public Result<Object> corporatecolor(@CurrentUser UserBean userBean) {

		QyzxAdminColour cdys = QyzxAdminColour.builder().build().selectOne(new QueryWrapper<QyzxAdminColour>().lambda().eq(QyzxAdminColour::getOrgCode, userBean.getOrgCode()));

		return ResultUtil.data(cdys, "查询成功");
	}


	@PostMapping(value = "/customcolor")
	@ApiOperation(value = "菜单自定义颜色", httpMethod = "POST", notes = "")
	public Result<Object> customcolor(@CurrentUser UserBean userBean,@RequestBody QyzxAdminColour cdys) {

		cdys.setOrgCode(userBean.getOrgCode());
		cdys.setAddtime(new Date().getTime());
		cdys.insertOrUpdate();

		return ResultUtil.data(cdys, "保存成功");
	}


	/**
	 * 删除-操作日志
	 *
	 * @param
	 * @return
	 */
	@DeleteMapping(value = "/delete_oper_log")
	@ApiOperation(value = "删除-操作日志", httpMethod = "DELETE", notes = "查询-操作日志")
	public Result<Object> deleteOperLog(@CurrentUser UserBean userBean, @RequestBody Integer[] ids) {

		ArrayList<Integer> list = CollUtil.toList(ids);
		int delCount = qyzxOperLogMapper.deleteBatchIds(list);

		return ResultUtil.data(delCount, "操作成功!");
	}

	/**
	 * 运营后台---企业信息列表
	 * @param
	 * @param cdys
	 * @return
	 */
	@PostMapping(value = "/companyAdminList")
	@ApiOperation(value = "运营后台---企业信息列表", httpMethod = "POST", notes = "")
	public Result<Object> companyAdminList(@RequestBody EntInfoDto entInfoDto) {
		Map map = Maps.newHashMap();
		List<EntInfoDto> list = Optional.ofNullable(qyzxEntInfoMMapper.companyAdminList(entInfoDto)).orElse(Lists.newArrayList());
		Integer count = qyzxEntInfoMMapper.companyAdminCount(entInfoDto);
		map.put("list",list);
		map.put("count",count);
		return ResultUtil.data(map);
	}
	@GetMapping(value = "/selectentbyId")
	@ApiOperation(value = "运营后台---获取企业信息", httpMethod = "GET", notes = "接口发布说明")
	public Result<Object> selectentbyId(@RequestParam("id") String id) {
		QyzxEntInfoM qyzxEntInfoM = QyzxEntInfoM.builder().id(Integer.parseInt(id)).build().selectById();
		return ResultUtil.data(qyzxEntInfoM, "获取企业信息成功");
	}
	@PostMapping(value = "/aeCompamy")
	@ApiOperation(value = "运营后台---添加/修改企业信息", httpMethod = "POST", notes = "接口发布说明")
	@Log(title = "运营后台---添加/修改-企业信息", businessType = BusinessType.UPDATE)
	public Result<QyzxEntInfoM> aeCompamy(@RequestBody QyzxEntInfoM qyzxEntInfoM) {

		QyzxEntInfoM q = new LambdaQueryChainWrapper<QyzxEntInfoM>(qyzxEntInfoMMapper)
				.eq(QyzxEntInfoM::getId, qyzxEntInfoM.getId()).one();
		boolean b1;
		if (q == null) {
			try {
				QyzxEntInfoM gsif = QyzxEntInfoM.builder().build().selectOne(new QueryWrapper<QyzxEntInfoM>().lambda().eq(QyzxEntInfoM::getName, qyzxEntInfoM.getName()));
				if(gsif!=null){
					return ResultUtil.error("企业名称已存在");
				}
				qyzxEntInfoM.setRegisterTime(new Date());
			QyzxEmpLogin login = new LambdaQueryChainWrapper<QyzxEmpLogin>(qyzxEmpLoginMapper)
					.eq(!StrUtil.hasBlank(qyzxEntInfoM.getPhone()), QyzxEmpLogin::getPhone, qyzxEntInfoM.getPhone()).one();
			if (login != null) {
				Integer count = new LambdaQueryChainWrapper<QyzxEmpEntAsso>(qyzxEmpEntAssoMapper)
						.eq(QyzxEmpEntAsso::getEmpNum, login.getId())
						.eq(QyzxEmpEntAsso::getUserType, SysRoleType.U_TYPE_ADMIN.getType()).count();
				//将密码改为注册企业输入的密码 2021//11/11 wgd
				login.setPw(Md5.md5("123456"));
				if (count > max) {
					return ResultUtil.error("已注册过企业");
				}
			}
			b1 =qyzxEntInfoM.insert();
			Integer qyId = qyzxEntInfoM.getId();
			if (login == null) {
				// 员工信息
				QyzxEmpLogin qyzxEmpLogin = QyzxEmpLogin.builder().phone(qyzxEntInfoM.getPhone()).pw(Md5.md5("123456"))
						.sts(CommonEnum.U_STS_ON.getType()).orgId(qyId).regTime(DateUtil.date()).build();
				boolean b2 = qyzxEmpLogin.insert();
				if (!b2) {
					TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
					return ResultUtil.error("注册企业失败2");
				}
				login = qyzxEmpLogin;
			} else {
				login.setOrgId(qyId);
				login.updateById();
			}
			// 员工信息
			boolean b4 = YgglMainEmp.builder().orgCode(qyId).empNum(login.getId()).rzTime(new Date()).name(qyzxEntInfoM.getLinkMan())
					.phone(qyzxEntInfoM.getPhone()).jobType(YgEnumInterface.YgJobType.QUANZHI.getType())
					.jobStatus(YgEnumInterface.jobStatus.ZHENSHI.getType()).build().insert();
			if (!b4) {
				TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
				return ResultUtil.error("注册企业失败3");
			}
			QyzxEmpEntAsso qyzxEmpEntAsso = QyzxEmpEntAsso.builder().empNum(login.getId()).orgCode(qyzxEntInfoM.getId())
					.status(1).userType(SysRoleType.U_TYPE_ADMIN.getType()).build();
			boolean b3 = qyzxEmpEntAsso.insert();
			if (!b3) {
				TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
				return ResultUtil.error("注册企业失败4");
			}

			SpmkService.createCustomApproval(qyzxEntInfoM.getId());
			//企业注册添加10条短信
			RegisterHelper.companyRegister(qyId,login.getId());
				// *****************************考勤假期初始化
				// 获取模板数据
//			List<KqglAssoLeaveRules> ruless = new LambdaQueryChainWrapper<KqglAssoLeaveRules>(kqglassoleaverulesmapper)
//					.eq(KqglAssoLeaveRules::getOrgCode, 0).list();
				List<KqglAssoLeaveRulesT> ruless = KqglAssoLeaveRulesT.builder().build().selectAll();
				// 查询当前公司是否已初始化
				KqglAssoLeaveRules rule = kqglassoleaverulesmapper.selectOne(new QueryWrapper<KqglAssoLeaveRules>().lambda()
						.eq(KqglAssoLeaveRules::getOrgCode, qyzxEntInfoM.getId()).eq(KqglAssoLeaveRules::getLeaveType, 1)
						.last("LIMIT 1"));
				if (rule == null) {
					List<KqglAssoLeaveRules> rullist = new ArrayList<KqglAssoLeaveRules>();

					for (KqglAssoLeaveRulesT rul : ruless) {
						KqglAssoLeaveRules vice = KqglAssoLeaveRules.builder().name(rul.getName()).company(rul.getCompany())
								.leaveType(rul.getLeaveType()).apply(rul.getApply()).createTime(new Date().getTime())
								.createUserid(999).orgCode(qyzxEntInfoM.getId()).isOpen(rul.getIsOpen())
								.leaveBalance(rul.getLeaveBalance()).rulesType(rul.getRulesType()).build();
						rullist.add(vice);
					}
					if (rullist.size() > 0) {
						kqglassoleaverulesmapper.insertleaverulesList(rullist);
					}
					Logoutput("操作成功!");
				} else {
					Logoutput("重复初始化数据!");
				}

				//建立初始化的加班规则
				KqglAssoOvertimeRulesM jbgzdef = KqglAssoOvertimeRulesM.builder().build().selectOne(new QueryWrapper<KqglAssoOvertimeRulesM>().lambda().eq(KqglAssoOvertimeRulesM::getOvertimeruledefault, 1));
				KqglAssoOvertimeRules Rules =  KqglAssoOvertimeRules.builder().build();
				Rules.setOrgCode(qyzxEntInfoM.getId());
				BeanUtil.copyProperties(jbgzdef, Rules , "orgCode");
				Rules.insert();

				//假期规则初始化
				String current_time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
				List<KqglAssoLeaveRules> rul = KqglAssoLeaveRules.builder().build().selectList(new QueryWrapper<KqglAssoLeaveRules>().lambda().eq(KqglAssoLeaveRules::getOrgCode, qyId));
				for(KqglAssoLeaveRules r : rul) {
					if(r.getLeaveBalance() == 0) {
						KqglAssoLeaveEmployeeBalance.builder().leaveRulesId(r.getId()).userid(login.getId()).balanceDays(-1).modifyUserid(login.getId()).modifyTimer(current_time).orgCode(qyId).build().insert();
					}else {
						KqglAssoLeaveEmployeeBalance.builder().leaveRulesId(r.getId()).userid(login.getId()).balanceDays(0.0).modifyUserid(login.getId()).modifyTimer(current_time).orgCode(qyId).build().insert();
					}
				}

				//加班基础设置
				KqglAssoOvertimeBasics.builder().minimumUnit(3).modifyUserid(999).modifyTime(new Date().getTime()).orgCode(qyzxEntInfoM.getId()).build().insert();

				//报税周期设置
				XcglAssoBszqsz.builder().taxReturnCycle(2).qyid(qyzxEntInfoM.getId()).build().insert();

				// 绩效设置初始化
				JxglBasicSetting bS = jxglService.selectAT(qyId);
				if (bS == null) {
					boolean res = jxglService.initJxglBasicSetting(qyId);
					if (!res) {
						throw new CustomException("绩效设置异常");
					}
				}

				/********** 默认企业讯息添加 ***********/
				CmsContent cmsContent = CmsContent.builder().build();

				cmsContent.setTitle(title);
				cmsContent.setPublisherName(author);
				cmsContent.setAuthor(author);
				cmsContent.setModularid(1);
				cmsContent.setFmtpath(cover);
				cmsContent.setSummary(summary);
				cmsContent.setStatus(1);
				cmsContent.setOrganizationId(qyId);
				cmsContent.setReleasestate(0);
				cmsContent.setAddeddate(new Date().getTime());
				cmsContent.setReleasetime(String.valueOf(new Date().getTime()));
				cmsContent.insert();

				/********** 默认企业讯息添加 ***********/

				return ResultUtil.success("注册企业成功");
			} catch (Exception e) {
				TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
				e.printStackTrace();
				return ResultUtil.error("注册异常");
			}
		}
		b1 =qyzxEntInfoM.updateById();
		if (!b1) {
			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
			return ResultUtil.error("注册企业失败1");
		}



		return ResultUtil.data(qyzxEntInfoM, "添加/修改企业");
	}
	@GetMapping(value = "/getCompanySelect")
	@ApiOperation(value = "运营后台---获取选择框下的企业信息", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> getCompanySelect() {
		return ResultUtil.data(qyzxEntInfoMMapper.getCompanyList(), "获取成功");
	}
	public void Logoutput(String science) {

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

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

	}

}