package cn.timer.api.controller;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
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.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.fastjson.JSONObject;
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.extension.conditions.query.LambdaQueryChainWrapper;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.timer.api.aspect.lang.annotation.Log;
import cn.timer.api.aspect.lang.enums.BusinessType;
import cn.timer.api.bean.jxgl.JxglBasicSetting;
import cn.timer.api.bean.kqmk.KqglAssoLeaveEmployeeBalance;
import cn.timer.api.bean.kqmk.KqglAssoLeaveRules;
import cn.timer.api.bean.kqmk.KqglAssoLeaveRulesT;
import cn.timer.api.bean.qyxx.CmsContent;
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.QyzxSms;
import cn.timer.api.bean.qyzx.businessService.QyzxRemainingQuantity;
import cn.timer.api.bean.yggl.YgglMainEmp;
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.enuminterface.YgEnumInterface;
import cn.timer.api.config.enuminterface.YgEnumInterface.YgJobType;
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.controller.jxgl.service.JxglService;
import cn.timer.api.controller.spmk.service.SpmkServiceImpl;
import cn.timer.api.dao.kqmk.KqglAssoLeaveRulesMapper;
import cn.timer.api.dao.qyzx.QyzxEmpEntAssoMapper;
import cn.timer.api.dao.qyzx.QyzxEmpLoginMapper;
import cn.timer.api.dao.yggl.YgglMainEmpMapper;
import cn.timer.api.dao.zzgl.ZzglBmgwMMapper;
import cn.timer.api.dto.login.QysDto;
import cn.timer.api.dto.qyzx.EntRegisterDto;
import cn.timer.api.utils.Md5;
import cn.timer.api.utils.Result;
import cn.timer.api.utils.ResultUtil;
import cn.timer.api.utils.UserIp;
import cn.timer.api.utils.aliyun.AliyunSMS;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

@RestController
@Api(tags = "1.0登录注册")
@Transactional
@RequestMapping(value = "/login", produces = { "application/json" })
public class LoginController {

	@Value(value = "${config-8timer.init-password}")
	public String pwd; // 系统赠送时间

	@Value("${config-8timer.register-free-time}")
	public Integer offset; // 系统赠送时间

	@Value("${config-8timer.register-company-max-num}")
	public Integer max;

	@Value("${config-8timer.register-childAccount-max-num}")
	public Integer maxChildAccount;

	@Value("${config-8timer.Aliyun.PROJECT_NAME}")
	private String PROJECT_NAME;

	@Value("${config-8timer.Aliyun.REGION_ID}")
	private String REGION_ID;

	@Value("${config-8timer.Aliyun.ACCESSKEY_ID}")
	private String ACCESSKEY_ID;

	@Value("${config-8timer.Aliyun.SECRET}")
	private String SECRET;

//	public static String host;
//	public static String PROJECT_ID;
//	public static String PROJECT_SECRET;
//
//	@Value("${config-8timer.esign.host}")
//	private String host_s;
//
//	@Value("${config-8timer.esign.PROJECT_ID}")
//	private String PROJECT_ID_s;
//
//	@Value("${config-8timer.esign.PROJECT_SECRET}")
//	private String PROJECT_SECRET_s;
//
//	@PostConstruct
//	public void init() {
//		host = host_s;
//		PROJECT_ID = PROJECT_ID_s;
//		PROJECT_SECRET = PROJECT_SECRET_s;
//	}

	@Value("${config-8timer.Aliyun.PROJECT_NAME}")
	private String endpoint;

	@Value("${config-8timer.Aliyun.ACCESSKEY_ID}")
	private String accessKeyId;

	@Value("${config-8timer.Aliyun.SECRET}")
	private String accessKeySecret;

	@Value("${config-8timer.Aliyun.bucketName}")
	private String bucketName;

	@Value("${config-8timer.Aliyun.bucketName_pri}")
	private String bucketName_pri;

	@Value("${config-8timer.Aliyun.project_package}")
	private String project_package;

	@Value("${config-8timer.Aliyun.expirationTime}")
	private String expirationTime;

	@Value("${config-8timer.Aliyun.expirationTime_pri}")
	private String expirationTime_pri;

	@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;

	@Autowired
	private HttpSession session;

	@Autowired
	private QyzxEmpLoginMapper qyzxEmpLoginMapper;

	@Autowired
	private QyzxEmpEntAssoMapper qyzxEmpEntAssoMapper;

	@Autowired
	private ZzglBmgwMMapper zzglBmgwMMapper;

	@Autowired
	private YgglMainEmpMapper ygglMainEmpMapper;

	@Autowired
	private AliyunSMS aliyunSMS;

	// @Autowired
	// private DataSourceTransactionManager transactionManager;

	/**
	 * 发送验证码
	 * 
	 * @param qyzxEmpLogin
	 * @return
	 */
	@PostMapping(value = "/sendcode")
	@ApiOperation(value = "1.发送验证码", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 1)
	@Log(title = "发送验证码", businessType = BusinessType.SEND_CODE)
	public Result<String> sendCode(@RequestBody EntRegisterDto entRegisterDto) {

		String phone = entRegisterDto.getPhone();
		if (phone == null || StrUtil.hasBlank(phone)) {
			return ResultUtil.error("请输入手机号");
		}
		Integer orgCode = null;
		if (entRegisterDto.getTc() != 4) { // 如果不是注册,则判断
			QyzxEmpLogin qyzxEmpLogin = QyzxEmpLogin.builder().build()
					.selectOne(new LambdaQueryWrapper<QyzxEmpLogin>().eq(QyzxEmpLogin::getPhone, phone));
			orgCode = qyzxEmpLogin.getOrgId();
			QyzxRemainingQuantity quantity = QyzxRemainingQuantity.builder().build()
					.selectOne(new LambdaQueryWrapper<QyzxRemainingQuantity>()
							.eq(QyzxRemainingQuantity::getOrgCode, orgCode).eq(QyzxRemainingQuantity::getPmid, 1)
							.gt(QyzxRemainingQuantity::getRemainder, 0));
			Date date = null;
			Integer remainder = null;
			if (quantity != null) {
				remainder = quantity.getRemainder();
				date = quantity.getExpireDate();
			}

			if (remainder == null || remainder <= 0) { // 判断充了钱没
				return ResultUtil.error("请充值后使用短信功能!");
			}
			if (date != null && date.getTime() <= new Date().getTime()) {
				System.err.println("企业 " + orgCode + " :短信套餐已过期");
				return ResultUtil.error("短信套餐已到期!");
			}
		}

		// 6位随机数验证码
		try {
			Integer code = (int) ((Math.random() * 9 + 1) * 100000);

			if (phone == null || "".equals(phone)) {
				phone = entRegisterDto.getUsername();
				entRegisterDto.setPhone(phone);
			}
			List<Object> list = aliyunSMS.authCode(entRegisterDto, entRegisterDto.getTc(), code);
			Integer useId = (Integer) list.get(0);
			JSONObject j = (JSONObject) list.get(1);
			// 获取当前日期的字符串格式
			String today = DateUtil.today();
			// yyyy-MM-dd
			today = today.replace("-", "");

			Thread.sleep(1000);
			JSONObject jsonObject = (JSONObject) JSONObject
					.parseObject(aliyunSMS.QuerySendDetails(phone, today, j.getString("BizId")))
					.getJSONObject("SmsSendDetailDTOs").getJSONArray("SmsSendDetailDTO").get(0);
			String phoneNum = jsonObject.getString("PhoneNum");
			String content = jsonObject.getString("Content");
			// String templateCode = jsonObject.getString("TemplateCode");
			// String sendStatus = jsonObject.getString("SendStatus");
			// String sendDate = jsonObject.getString("SendDate");

			QyzxSms qyzxSms = new QyzxSms();
			qyzxSms.setContent(content);
			qyzxSms.setCreateTime(new Date());
			qyzxSms.setMessageType(entRegisterDto.getTc());
			qyzxSms.setPhone(phoneNum);
			qyzxSms.setOrgCode(orgCode);
			qyzxSms.setUseId(useId);
			qyzxSms.insert();

			String message = j.getString("Message");
			if ("OK".equals(message)) {
				session.setAttribute(phone, code);
				// redisTemplate.set(phone, code);
				// redisTemplate.expire(phone, 60);

				return ResultUtil.data("发送验证码成功");
			} else {
				return ResultUtil.error("发送验证码失败");
			}
		} catch (Exception e) {
			e.printStackTrace();
			return ResultUtil.error("发送验证码失败");
		}
	}

	/**
	 * 手机号码认证
	 * 
	 * @param qyzxEmpLogin
	 * @return
	 */
	@PostMapping(value = "/authentication")
	@ApiOperation(value = "2.手机号码认证", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 2)
	public Result<String> authentication(@RequestBody EntRegisterDto entRegisterDto) {
		String phone = entRegisterDto.getPhone();

		String code = entRegisterDto.getCode().toString();

		String codeRedis = session.getAttribute(phone) != null ? session.getAttribute(phone).toString() : "";

		if (code == null || !code.equals(codeRedis)) {
			return ResultUtil.error("验证码不符");
		}
		return ResultUtil.success("验证码正确");
	}

	/**
	 * 手机号码认证
	 * 
	 * @param qyzxEmpLogin
	 * @return
	 * @throws IOException
	 *//*
		 * @PostMapping(value = "/test")
		 * 
		 * @ApiOperation(value = "3.测试", httpMethod = "POST", notes = "接口发布说明")
		 * 
		 * @ApiOperationSupport(order = 3) public void test(HttpServletRequest request,
		 * HttpServletResponse res) throws IOException {
		 * 
		 * res.setHeader("content-type","text/html;charset=UTF-8");
		 * res.setHeader("selfHeader","selfHeaderValue"); //
		 * res.addHeader("response_code", "123"); //
		 * res.setContentType("application/octet-stream"); //
		 * res.addHeader("Content-Length", "0");
		 * 
		 * res.addHeader("response_code", "100"); res.addHeader("trans_id", "");
		 * res.addHeader("cmd_code", "NO com");
		 * 
		 * res.setContentType("application/octet-stream");
		 * res.addHeader("Content-Length", "0");
		 * 
		 * res.flushBuffer(); // response.addHeader("response_code",
		 * "ERROR_INVALID_LIB_NAME"); //
		 * response.setContentType("application/octet-stream"); //
		 * response.addHeader("Content-Length", "0"); // response.flushBuffer();
		 * System.out.println(111); }
		 */

	@PostMapping(value = "/updatePwd")
	@ApiOperation(value = "4.修改密码(新)", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 4)
	@Log(title = "修改密码", businessType = BusinessType.UPDATE)
	public Result<String> updatepwd(@RequestBody EntRegisterDto entRegisterDto) {
		String oldPwd = entRegisterDto.getOldPwd();// 输入的原密码
		String pw = entRegisterDto.getPw();// 输入的新密码
		String phone = entRegisterDto.getPhone();// 手机号
		String code = entRegisterDto.getCode();// 验证码
		Integer type = entRegisterDto.getPwUpdateType();// 验证方式
		QyzxEmpLogin qyzxEmpLogin = new LambdaQueryChainWrapper<QyzxEmpLogin>(qyzxEmpLoginMapper)
				.eq(!StrUtil.hasBlank(phone), QyzxEmpLogin::getPhone, phone).one();// 员工登录表
		String dbPwd = qyzxEmpLogin.getPw();// 数据库原密码
		if (type == 1) {
			if (!Md5.md5(oldPwd).equals(dbPwd)) {
				return ResultUtil.error("原密码验证失败");
			}
			if (pw.equals(oldPwd)) {
				return ResultUtil.error("新密码与原密码相同,请修改后重试!");
			}
		} else {
			String codeRedis = session.getAttribute(phone) != null ? session.getAttribute(phone).toString() : "";
			if (!code.equals(codeRedis)) {
				return ResultUtil.error("短信验证码错误");
			}
			if (Md5.md5(pw).equals(dbPwd)) {
				return ResultUtil.error("新密码与原密码相同,请修改后重试!");
			}
		}
		qyzxEmpLogin.setPw(Md5.md5(pw));
		qyzxEmpLogin.updateById();
		return ResultUtil.success("修改成功");
	}

	/**
	 * 修改密码
	 * 
	 * @param qyzxEmpLogin
	 * @return
	 */
	@PostMapping(value = "/updatepassword")
	@ApiOperation(value = "3.修改密码", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 3)
	public Result<String> updatepassword(@RequestBody EntRegisterDto entRegisterDto) {
		String phone = entRegisterDto.getPhone();
		String pw = entRegisterDto.getPw();
		String code = entRegisterDto.getCode();
		if (entRegisterDto.getPwUpdateType() != 2) {

			String codeRedis = session.getAttribute(phone) != null ? session.getAttribute(phone).toString() : "";
			if (code == null) {
				return ResultUtil.error("请填写验证码");
			}
			if (!code.toString().equals(codeRedis)) {
				return ResultUtil.error("验证码不符");
			}
			QyzxEmpLogin qyzxEmpLogin = new LambdaQueryChainWrapper<QyzxEmpLogin>(qyzxEmpLoginMapper)
					.eq(!StrUtil.hasBlank(phone), QyzxEmpLogin::getPhone, phone).one();
			if (qyzxEmpLogin != null) {
				qyzxEmpLogin.setPhone(phone);
				qyzxEmpLogin.setPw(Md5.md5(pw));
				qyzxEmpLogin.updateById();
				return ResultUtil.success("修改密码成功");
			} else {
				return ResultUtil.error("修改密码失败,查找不到该人员!");
			}
		} else {
			if (code == null) {
				return ResultUtil.error("请填写原密码");
			}
			if (pw.trim().equals(code.trim())) {
				return ResultUtil.error("新密码与原密码相同!请更改重试");
			}
			QyzxEmpLogin qyzxEmpLogin = new LambdaQueryChainWrapper<QyzxEmpLogin>(qyzxEmpLoginMapper)
					.eq(!StrUtil.hasBlank(phone), QyzxEmpLogin::getPhone, phone).one();
			if (qyzxEmpLogin != null) {
				if (qyzxEmpLogin.getPw().equals(Md5.md5(pw))) {
					qyzxEmpLogin.setPhone(phone);
					qyzxEmpLogin.setPw(Md5.md5(code));
					qyzxEmpLogin.updateById();
					return ResultUtil.success("修改密码成功");
				} else {
					return ResultUtil.error("原密码有误!请核对重试");
				}

			}
			return ResultUtil.error("修改密码失败,查找不到该人员!");
		}
		// return ResultUtil.error("修改密码失败");
	}

	/**
	 * 修改手机号/用户名
	 * 
	 * @param qyzxEmpLogin
	 * @return
	 */
	@PostMapping(value = "/updatephone")
	@ApiOperation(value = "5.修改手机号/用户名", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 5)
	public Result<String> updatephone(@CurrentUser UserBean userBean, @RequestBody EntRegisterDto entRegisterDto) {

		/*
		 * 登录->发送验证码 (参数:新手机号 新手机号验证码 )-> 验证 -> 修改手机号成功 密码初始化为123456 ->登出-> 重新登录
		 */
		Integer empNum = userBean.getEmpNum();
		String phone = entRegisterDto.getPhone();
		String code = entRegisterDto.getCode();
		// String codeRedis = redisTemplate.get(phone).toString();
		String codeRedis = session.getAttribute(phone) != null ? session.getAttribute(phone).toString() : "";

		if (code == null || !code.toString().equals(codeRedis)) {
			return ResultUtil.error("验证码不符/失效");
		}
		QyzxEmpLogin qyzxEmpLogin1 = qyzxEmpLoginMapper.selectById(empNum);
		if (qyzxEmpLogin1 != null) {

			qyzxEmpLogin1.setPhone(phone);
			qyzxEmpLogin1.setPw(Md5.md5(pwd));// 密码初始化

			qyzxEmpLogin1.updateById();

			// 员工信息 手机号修改
			YgglMainEmp.builder().phone(phone).build().update(
					new UpdateWrapper<YgglMainEmp>().lambda().eq(YgglMainEmp::getEmpNum, qyzxEmpLogin1.getId()));
			return ResultUtil.success("修改手机号/用户名成功");
		}

		return ResultUtil.error("修改手机号/用户名失败");
	}

	/**
	 * 是否有账号
	 * 
	 * @return
	 */
	@GetMapping(value = "/user")
	@ApiOperation(value = "5.是否有账号", httpMethod = "GET", notes = "是否有账号")
	@ApiOperationSupport(order = 5)
	public Result<String> updatephone(@CurrentUser UserBean userBean, @RequestParam String phone) {

		QyzxEmpLogin login = new LambdaQueryChainWrapper<QyzxEmpLogin>(qyzxEmpLoginMapper)
				.eq(!StrUtil.hasBlank(phone), QyzxEmpLogin::getPhone, phone).one();

		if (login == null) {
			return ResultUtil.success("0");
		}

		return ResultUtil.success("1");
	}

	@Autowired
	SpmkServiceImpl SpmkService;

	@Autowired
	JxglService jxglService;

	@Autowired
	private KqglAssoLeaveRulesMapper kqglassoleaverulesmapper;

	/**
	 * 注册企业
	 * 
	 * @param entRegisterDto
	 * @return
	 */
	@PostMapping(value = "/register")
	@ApiOperation(value = "6.注册企业", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 6)
	@Log(title = "企业注册", businessType = BusinessType.INSERT)
	public Result<String> register(@RequestBody EntRegisterDto entRegisterDto) throws Exception {

		try {
			String phone = entRegisterDto.getPhone();
			String username = entRegisterDto.getUsername();
			String name = entRegisterDto.getName();
			String pw = entRegisterDto.getPw();
			String email = entRegisterDto.getEmail();

			if ((phone == null || StrUtil.hasBlank(phone)) || (username == null || StrUtil.hasBlank(username))
					|| (name == null || StrUtil.hasBlank(name)) || (pw == null || StrUtil.hasBlank(pw))) {
				return ResultUtil.error("用户信息不能为空");
			}

			QyzxEmpLogin login = new LambdaQueryChainWrapper<QyzxEmpLogin>(qyzxEmpLoginMapper)
					.eq(!StrUtil.hasBlank(phone), QyzxEmpLogin::getPhone, phone).one();
			if (login != null) {
				Integer count = new LambdaQueryChainWrapper<QyzxEmpEntAsso>(qyzxEmpEntAssoMapper)
						.eq(QyzxEmpEntAsso::getEmpNum, login.getId())
						.eq(QyzxEmpEntAsso::getUserType, SysRoleType.U_TYPE_ADMIN.getType()).count();

				if (count > max) {
					return ResultUtil.error("已注册过企业");
				}
			}

			// 企业信息
			QyzxEntInfoM qyzxEntInfoM = QyzxEntInfoM.builder().name(name).registerTime(DateUtil.date()).phone(phone)
					.operName(username).endTime(DateUtil.offsetDay(new Date(), offset))
					.level(CommonEnum.LEVEL_PROBATION.getType()).build();
			boolean b1 = qyzxEntInfoM.insert();
			Integer qyId = qyzxEntInfoM.getId();
			if (!b1) {
				TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
				return ResultUtil.error("注册企业失败1");
			}

			if (login == null) {
				// 员工信息
				QyzxEmpLogin qyzxEmpLogin = QyzxEmpLogin.builder().phone(phone).pw(Md5.md5(pw)).email(email)
						.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(username)
					.phone(phone).workEmail(email).jobType(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());

			// *****************************考勤假期初始化
			// 获取模板数据
//			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);
				}
				System.out.println("操作成功!");
			} else {
				System.out.println("重复初始化数据!");
			}
			
			
			
			//假期规则初始化
			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();
				}
			}
			

			// 绩效设置初始化
			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("注册异常");
		}
	}

	/**
	 * 验证码登录
	 * 
	 * @param qyzxEmpLogin
	 * @return
	 */
	@PostMapping(value = "/code")
	@ApiOperation(value = "7.验证码登录", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 7)
	@Log(title = "用户登录", businessType = BusinessType.OTHER)
	public Result<QyzxEmpLogin> codelogin(@RequestBody EntRegisterDto entRegisterDto, HttpServletRequest request) {

		String code = entRegisterDto.getCode();
		if (StringUtils.isEmpty(code)) {
			return ResultUtil.error("请输入验证码");
		}
		String phone = entRegisterDto.getPhone();

		String codeRedis = session.getAttribute(phone) != null ? session.getAttribute(phone).toString() : "";

		if (codeRedis == null || !code.equals(codeRedis))
			return ResultUtil.error("验证码不符");

		QyzxEmpLogin qyzxEmpLogin1 = new LambdaQueryChainWrapper<QyzxEmpLogin>(qyzxEmpLoginMapper)
				.eq(!StrUtil.hasBlank(phone), QyzxEmpLogin::getPhone, phone).one();

		return loginhan(qyzxEmpLogin1, request);
	}

	private Result<QyzxEmpLogin> loginhan(QyzxEmpLogin qyzxEmpLogin1, HttpServletRequest request) {
		if (qyzxEmpLogin1 == null)
			return ResultUtil.error("帐号不存在!");
		String ip;
		try {
			ip = UserIp.getIpAddr(request);
			qyzxEmpLogin1.setIp(ip);
		} catch (Exception e) {
			e.printStackTrace();
		}

		Integer isLeader = zzglBmgwMMapper
				.selectCount(new QueryWrapper<ZzglBmgwM>().lambda().eq(ZzglBmgwM::getLeader, qyzxEmpLogin1.getId())
						.eq(ZzglBmgwM::getOrgCode, qyzxEmpLogin1.getOrgId())) > 0 ? 0 : 1;

		QyzxEmpEntAsso eEA = qyzxEmpEntAssoMapper.selectOne(new QueryWrapper<QyzxEmpEntAsso>().lambda()
				.select(QyzxEmpEntAsso::getUserType).eq(QyzxEmpEntAsso::getEmpNum, qyzxEmpLogin1.getId())
				.eq(QyzxEmpEntAsso::getOrgCode, qyzxEmpLogin1.getOrgId()));
		qyzxEmpLogin1.setIsLeader(isLeader);
		qyzxEmpLogin1.setUserType(eEA != null ? eEA.getUserType() : null);

		List<QysDto> qys = qyzxEmpLoginMapper.getQys(qyzxEmpLogin1.getId());
		// 查询部门放进去
		for (QysDto qysDto : qys) {
			Integer bmgwId = qysDto.getBmgwId();
			ZzglBmgwM gw = ZzglBmgwM.builder().build()
					.selectOne(new LambdaQueryWrapper<ZzglBmgwM>().eq(ZzglBmgwM::getId, bmgwId));
			if (gw != null) {
				qysDto.setGwName(gw.getName());
				if (gw.getUpId() != null) {
					Integer upId = gw.getUpId();
					ZzglBmgwM bm = ZzglBmgwM.builder().build()
							.selectOne(new LambdaQueryWrapper<ZzglBmgwM>().eq(ZzglBmgwM::getId, upId));
					if (bm != null && bm.getName() != null)
						qysDto.setBmName(bm.getName());
				}
			}
		}

		if (qys.size() == 0)
			return ResultUtil.error("没有任何公司可以查看!");
		qyzxEmpLogin1.setQys(qys);

		QysDto ctrl = qys.get(0);
		if (qyzxEmpLogin1.getOrgId() != null) {

			for (QysDto qysDto : qys) {
				if (qyzxEmpLogin1.getOrgId().equals(qysDto.getId()) && qysDto.getStatus() == 1) {
					ctrl = qysDto;
				}
			}

		}
		YgglMainEmp userInfo = ygglMainEmpMapper.selectOne(new QueryWrapper<YgglMainEmp>().lambda()
				.select(YgglMainEmp::getName, YgglMainEmp::getPhone, YgglMainEmp::getBmgwId)
				.eq(YgglMainEmp::getEmpNum, qyzxEmpLogin1.getId())
				.eq(YgglMainEmp::getOrgCode, qyzxEmpLogin1.getOrgId()));
		if (userInfo == null) {
			return ResultUtil.error("账号不存在");
		}
		qyzxEmpLogin1.setYgglMainEmp(userInfo);

		if (ctrl.getStatus() == null || ctrl.getStatus().equals(0)) {
			return ResultUtil.error("帐号被禁用");
		}
		qyzxEmpLogin1.setOrgId(ctrl.getId());

		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, qyzxEmpLogin1.getOrgId()).list();
			// 传入的部门岗位是登录者的岗位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, qyzxEmpLogin1.getOrgId())
						.and(i -> i.in(ZzglAuth::getBmgwId, list.toArray()));
				List<ZzglAuth> zas = ZzglAuth.builder().build().selectList(wp);
				List<String> menus = new ArrayList<>();
				zas.stream().forEach(o -> menus.add(o.getMenuId()));
				qyzxEmpLogin1.setMenus(menus);
			}
		}
		// 可操作企业

		// 需要更新最后一次登陆信息
		// 用户信息缓存
		session.setAttribute("ui", qyzxEmpLogin1);

		return ResultUtil.data(qyzxEmpLogin1);
	}

	/**
	 * 密码登录
	 * 
	 * @param qyzxEmpLogin
	 * @return
	 */
	@PostMapping(value = "/password")
	@ApiOperation(value = "8.密码登录", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 8)
	@Log(title = "用户登录", businessType = BusinessType.OTHER)
	public Result<QyzxEmpLogin> passwordlogin(@RequestBody EntRegisterDto entRegisterDto, HttpServletRequest request) {

		String phone = entRegisterDto.getPhone();
		String pw = entRegisterDto.getPw();

		if (phone == null || "".equals(phone)) {
			return ResultUtil.error("手机号不能为空!");
		}

		QyzxEmpLogin qyzxEmpLogin1 = new LambdaQueryChainWrapper<QyzxEmpLogin>(qyzxEmpLoginMapper)
				.eq(QyzxEmpLogin::getPhone, phone).one();
		if (qyzxEmpLogin1 != null) {
			if (StrUtil.hasBlank(pw) || !qyzxEmpLogin1.getPw().equals(Md5.md5(pw)))
				return ResultUtil.error("帐号密码错误");

			return loginhan(qyzxEmpLogin1, request);
		} else {
			return ResultUtil.error("帐号不存在-错误");
		}

	}

	/**
	 * 绑定邮箱
	 * 
	 * @param empNum
	 * @return
	 */
	@GetMapping(value = "/band/{empNum}")
	public Result<Object> bandEmail(@PathVariable Integer empNum) {
		QyzxEmpLogin qyzxEmpLogin = QyzxEmpLogin.builder().id(empNum).build().selectById();
		if (qyzxEmpLogin == null)
			return ResultUtil.error("员工不存在");
		Integer emailStatus = qyzxEmpLogin.getEmailStatus();
		if (emailStatus != 0 && emailStatus != 1)
			return ResultUtil.error("请确认邮箱绑定状态");
		if (emailStatus == 1)
			return ResultUtil.error("邮箱已绑定,请勿重复绑定");
		if (QyzxEmpLogin.builder().id(empNum).emailStatus(1).build().updateById())
			return ResultUtil.error("绑定成功");
		return ResultUtil.error("绑定失败");
	}

}