package cn.com.lzt.attendancewarnmsg.service.impl; import java.io.Serializable; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.UUID; import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; import org.jeecgframework.core.common.service.impl.CommonServiceImpl; import org.jeecgframework.core.constant.Globals; import org.jeecgframework.core.util.ApplicationContextUtil; import org.jeecgframework.core.util.DataUtils; import org.jeecgframework.core.util.ListUtils; import org.jeecgframework.core.util.MyClassLoader; import org.jeecgframework.core.util.StringUtil; import org.jeecgframework.core.util.oConvertUtils; import org.jeecgframework.minidao.pojo.MiniDaoPage; import org.jeecgframework.web.cgform.enhance.CgformEnhanceJavaInter; import org.jeecgframework.web.system.pojo.base.TSBaseUser; import org.jeecgframework.web.system.pojo.base.TSDepart; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import cn.com.lzt.attendancewarnmsg.dao.AttendanceWarnMsgMinidao; import cn.com.lzt.attendancewarnmsg.dto.AttendanceWarnMsgDto; import cn.com.lzt.attendancewarnmsg.dto.ProjectAbnormalDetailDto; import cn.com.lzt.attendancewarnmsg.entity.AttendanceWarnMsgEntity; import cn.com.lzt.attendancewarnmsg.service.AttendanceWarnMsgServiceI; import cn.com.lzt.attendancewarnmsgdetail.entity.AttendanceWarnMsgDetailEntity; import cn.com.lzt.common.push.JPushProcessor; import cn.com.lzt.projarrangedetail.entity.ProjarrangeDetailEntity; import cn.com.lzt.userattendancedetail.dto.AttendanceDetailJsonObj; import cn.com.lzt.userattendancedetail.dto.UserAttendanceDetailDto; import cn.com.lzt.userattendancedetail.service.UserAttendanceDetailServiceI; import cn.com.lzt.userattendancetotal.entity.UserAttendanceTotalEntity; @Service("attendanceWarnMsgService") @Transactional public class AttendanceWarnMsgServiceImpl extends CommonServiceImpl implements AttendanceWarnMsgServiceI { @Autowired AttendanceWarnMsgMinidao attendanceWarnMsgMinidao; @Autowired UserAttendanceDetailServiceI userAttendanceDetailService; @Autowired private JPushProcessor pushProcessor; public void delete(AttendanceWarnMsgEntity entity) throws Exception{ super.delete(entity); //执行删除操作增强业务 this.doDelBus(entity); } public Serializable save(AttendanceWarnMsgEntity entity) throws Exception{ Serializable t = super.save(entity); //执行新增操作增强业务 this.doAddBus(entity); return t; } public void saveOrUpdate(AttendanceWarnMsgEntity entity) throws Exception{ super.saveOrUpdate(entity); //执行更新操作增强业务 this.doUpdateBus(entity); } /** * 新增操作增强业务 * @param t * @return */ private void doAddBus(AttendanceWarnMsgEntity t) throws Exception{ //-----------------sql增强 start---------------------------- //-----------------sql增强 end------------------------------ //-----------------java增强 start--------------------------- //-----------------java增强 end----------------------------- } /** * 更新操作增强业务 * @param t * @return */ private void doUpdateBus(AttendanceWarnMsgEntity t) throws Exception{ //-----------------sql增强 start---------------------------- //-----------------sql增强 end------------------------------ //-----------------java增强 start--------------------------- //-----------------java增强 end----------------------------- } /** * 删除操作增强业务 * @param id * @return */ private void doDelBus(AttendanceWarnMsgEntity t) throws Exception{ //-----------------sql增强 start---------------------------- //-----------------sql增强 end------------------------------ //-----------------java增强 start--------------------------- //-----------------java增强 end----------------------------- } private Map populationMap(AttendanceWarnMsgEntity t){ Map map = new HashMap(); map.put("id", t.getId()); map.put("msg_type", t.getMsgType()); map.put("msg_title", t.getMsgTitle()); map.put("msg_content", t.getMsgContent()); map.put("send_status", t.getSendStatus()); map.put("org_id", t.getOrgId()); map.put("create_date", t.getCreateDate()); map.put("send_time", t.getSendTime()); map.put("user_id", t.getUserId()); return map; } /** * 替换sql中的变量 * @param sql * @param t * @return */ public String replaceVal(String sql,AttendanceWarnMsgEntity t){ sql = sql.replace("#{id}",String.valueOf(t.getId())); sql = sql.replace("#{msg_type}",String.valueOf(t.getMsgType())); sql = sql.replace("#{msg_title}",String.valueOf(t.getMsgTitle())); sql = sql.replace("#{msg_content}",String.valueOf(t.getMsgContent())); sql = sql.replace("#{send_status}",String.valueOf(t.getSendStatus())); sql = sql.replace("#{org_id}",String.valueOf(t.getOrgId())); sql = sql.replace("#{create_date}",String.valueOf(t.getCreateDate())); sql = sql.replace("#{send_time}",String.valueOf(t.getSendTime())); sql = sql.replace("#{user_id}",String.valueOf(t.getUserId())); sql = sql.replace("#{UUID}",UUID.randomUUID().toString()); return sql; } /** * 执行JAVA增强 */ private void executeJavaExtend(String cgJavaType,String cgJavaValue,Map data) throws Exception { if(StringUtil.isNotEmpty(cgJavaValue)){ Object obj = null; try { if("class".equals(cgJavaType)){ //因新增时已经校验了实例化是否可以成功,所以这块就不需要再做一次判断 obj = MyClassLoader.getClassByScn(cgJavaValue).newInstance(); }else if("spring".equals(cgJavaType)){ obj = ApplicationContextUtil.getContext().getBean(cgJavaValue); } if(obj instanceof CgformEnhanceJavaInter){ CgformEnhanceJavaInter javaInter = (CgformEnhanceJavaInter) obj; javaInter.execute("t_bus_attendance_warn_msg",data); } } catch (Exception e) { e.printStackTrace(); throw new Exception("执行JAVA增强出现异常!"); } } } @Override public MiniDaoPage getAttendanceWarnMsgDtoPage( AttendanceWarnMsgDto attendanceWarnMsgDto, int page, int rows, String authSql) throws Exception { // TODO Auto-generated method stub return attendanceWarnMsgMinidao.getAttendanceWarnMsgDtoPage(attendanceWarnMsgDto, page, rows, authSql); } @Override public void updateAttendanceWarnMsgBytasker(String ymdDatestr ) throws Exception { if (oConvertUtils.isEmpty( ymdDatestr )) { ymdDatestr = DataUtils.date2Str(DataUtils.date_sdf); } Date ymdDate = DataUtils.str2Date(ymdDatestr, DataUtils.date_sdf); Calendar calendar =DataUtils.getCalendar(); calendar.setTime(ymdDate); calendar.add(Calendar.DATE, -1); Date yesterdayDate = calendar.getTime(); String yearmonth = DataUtils.date2Str(ymdDate,new SimpleDateFormat("yyyy-MM")); CriteriaQuery cq = new CriteriaQuery( ProjarrangeDetailEntity.class); cq.eq("yearmonth", yearmonth); cq.add(); // 查询当前月份有排班记录的员工 //计算员工当天的考勤预警信息。 List projarrangeDetailEntities = getListByCriteriaQuery( cq, false); if (!ListUtils.isNullOrEmpty(projarrangeDetailEntities)) { for (ProjarrangeDetailEntity pjde : projarrangeDetailEntities) { UserAttendanceTotalEntity userAttendanceTotalEntity = new UserAttendanceTotalEntity(); userAttendanceTotalEntity.setUserId(pjde.getUserid()); userAttendanceTotalEntity.setYearmonth(pjde.getYearmonth()); List dtolist = userAttendanceDetailService.getallUsefulField(userAttendanceTotalEntity, null, ymdDate); saveOrUpdateWarnMsg(pjde,dtolist,ymdDate); } } //查询昨天是夜班的员工, 计算该员工在今天的迟到早退情况。 projarrangeDetailEntities = attendanceWarnMsgMinidao.getSpecialDutyBydateAndDutyType(Globals.DUTYTYPE_yeban115,DataUtils.date2Str(yesterdayDate, DataUtils.date_sdf)); if (!ListUtils.isNullOrEmpty(projarrangeDetailEntities)) { for (ProjarrangeDetailEntity pjde : projarrangeDetailEntities) { UserAttendanceTotalEntity userAttendanceTotalEntity = new UserAttendanceTotalEntity(); userAttendanceTotalEntity.setUserId(pjde.getUserid()); userAttendanceTotalEntity.setYearmonth(pjde.getYearmonth()); List dtolist = userAttendanceDetailService.getallUsefulField(userAttendanceTotalEntity, null, yesterdayDate); saveOrUpdateWarnMsg(pjde,dtolist,ymdDate); } } //通过项目维度 统计计算预警消息 List padtolist = attendanceWarnMsgMinidao.getProjectAbnormalDetail(ymdDatestr); if (!ListUtils.isNullOrEmpty(padtolist)) { for (ProjectAbnormalDetailDto dto :padtolist) { AttendanceWarnMsgEntity msgEntity = new AttendanceWarnMsgEntity(); String msgContent = ""; if (Globals.msg_type_chidao.equals(dto.getMsgtype())) { msgEntity.setMsgType(dto.getMsgtype()); /*迟到总人数达 10 人 已达总人数的 20 %*/ msgContent ="迟到总人数达 "+dto.getErrorcount()+" 人 已达总人数的 "+dto.getTotalpercent()+" %"; } if (Globals.msg_type_kuanggong.equals(dto.getMsgtype())) { msgEntity.setMsgType(dto.getMsgtype()); /*旷工总人数达 5 人 已达总人数的 10 %*/ msgContent ="旷工总人数达 "+dto.getErrorcount()+" 人 已达总人数的 "+dto.getTotalpercent()+" %"; } if (Globals.msg_type_zaotui.equals(dto.getMsgtype())) { msgEntity.setMsgType(dto.getMsgtype()); /*早退总人数达 10 人 已达总人数的 20 %*/ msgContent ="早退总人数达 "+dto.getErrorcount()+" 人 已达总人数的 "+dto.getTotalpercent()+" %"; } if (Globals.msg_type_chidaozaotui.equals(dto.getMsgtype())) { msgEntity.setMsgType(dto.getMsgtype()); /*早退总人数达 10 人 已达总人数的 20 %*/ msgContent ="既迟到又早退总人数达 "+dto.getErrorcount()+" 人 已达总人数的 "+dto.getTotalpercent()+" %"; } if (Globals.msg_type_weidaka.equals(dto.getMsgtype())) { msgEntity.setMsgType(dto.getMsgtype()); /*早退总人数达 10 人 已达总人数的 20 %*/ msgContent ="未打卡总人数达 "+dto.getErrorcount()+" 人 已达总人数的 "+dto.getTotalpercent()+" %"; } if (oConvertUtils.isNotEmpty(msgEntity.getMsgType())) { String projectname = ""; if (oConvertUtils.isNotEmpty(oConvertUtils.getString(dto.getPid()))) { TSDepart depart = get(TSDepart.class, dto.getPid()); if (null!=depart) { projectname =depart.getDepartname(); } } msgEntity.setMsgContent(msgContent); msgEntity.setOrgId(dto.getPid()); msgEntity.setMsgTitle(projectname); msgEntity.setSendTime(ymdDate); saveWarnMsg(1,msgEntity); } } } } private void saveOrUpdateWarnMsg(ProjarrangeDetailEntity pjde, List dtolist, Date sendDate) throws Exception { if (!ListUtils.isNullOrEmpty(dtolist)) { for (UserAttendanceDetailDto dto : dtolist) { AttendanceWarnMsgEntity msgEntity = new AttendanceWarnMsgEntity(); String msgContent = ""; //如果员工迟到 if (dto.isBelate()) { msgEntity.setMsgType(Globals.msg_type_chidao); /*张红 迟到 30分钟*/ msgContent ="迟到 "+dto.getBelatemins()+"分钟"; } //如果员工早退 if ( dto.isLeaveEarly()) { msgEntity.setMsgType(Globals.msg_type_zaotui); /*李丽 早退 30分钟*/ msgContent ="早退 "+dto.getLeaveEarlymins()+"分钟"; } //如果员工迟到+早退 if (dto.isBelate() && dto.isLeaveEarly()) { msgEntity.setMsgType(Globals.msg_type_chidaozaotui); /*张红 迟到 30分钟*/ msgContent ="迟到 "+dto.getBelatemins()+"分钟;"+"早退 "+dto.getLeaveEarlymins()+"分钟"; } //如果员工旷工 if (dto.getAbsenteeism().compareTo(BigDecimal.ZERO)>0) { /*张三 旷工*/ msgEntity.setMsgType(Globals.msg_type_kuanggong); msgContent ="旷工"; //+" "+dto.getAbsenteeism()+"天"; } AttendanceDetailJsonObj jsonObj = dto.getJsonObj(); //如果员工未打卡 if (null!=jsonObj&&jsonObj.getNoPunchCard()!=0) { msgEntity.setMsgType(Globals.msg_type_weidaka); /*张三 未打卡*/ msgContent ="未打卡"; //+" "+dto.getAbsenteeism()+"天"; } if (oConvertUtils.isNotEmpty(msgEntity.getMsgType())) { String userrealname = ""; if (oConvertUtils.isNotEmpty(oConvertUtils.getString(dto.getUserid()))) { TSBaseUser user = get(TSBaseUser.class, dto.getUserid()); if (null!=user) { userrealname = user.getRealName(); } } String projectname = ""; if (oConvertUtils.isNotEmpty(oConvertUtils.getString(dto.getPid()))) { TSDepart depart = get(TSDepart.class, dto.getPid()); if (null!=depart) { projectname =depart.getDepartname(); } } msgEntity.setMsgContent(userrealname+" "+msgContent); msgEntity.setUserId(dto.getUserid()); msgEntity.setOrgId(pjde.getPid()); msgEntity.setMsgTitle(projectname); msgEntity.setSendTime(sendDate); saveWarnMsg(0,msgEntity); } } } } /** * 保存预警消息 * 先校验某人某天是否有某种类型下的预警消息, 如果没有 则入库 如果有, 则不再入库 * @author hualong.zhao * @date 2017-12-20 * @param i 表示位 , 0 时 为单个人的预警消息, 1 时 表示项目维度统计的预警消息 * @param msgEntity * @throws Exception */ private void saveWarnMsg(int i, AttendanceWarnMsgEntity msgEntity) throws Exception { CriteriaQuery cq = new CriteriaQuery(AttendanceWarnMsgEntity.class); if ( i==0) { cq.eq("userId", msgEntity.getUserId()); cq.add(); } if ( i==1) { cq.eq("orgId", msgEntity.getOrgId()); cq.add(); cq.isNull("userId"); cq.add(); } cq.eq("msgType", msgEntity.getMsgType()); cq.add(); cq.eq("sendTime", msgEntity.getSendTime()); cq.add(); List msglist = getListByCriteriaQuery( cq, false); ArrayList userIdList=new ArrayList(); if (ListUtils.isNullOrEmpty(msglist)) { save(msgEntity); if ( i==0) { List msgdetaillist = new ArrayList<>(); //将msg 发送给项目经理 String pid = msgEntity.getOrgId(); String mngid = null; TSDepart depart = get(TSDepart.class, pid); if (null!=depart) { mngid = depart.getDeptProjManagerid(); } if (oConvertUtils.isNotEmpty(mngid)) { AttendanceWarnMsgDetailEntity detailEntity = new AttendanceWarnMsgDetailEntity(); detailEntity.setMsgId(msgEntity.getId()); detailEntity.setReceivedId(mngid); detailEntity.setReadStatus(Globals.read_status_0); msgdetaillist.add(detailEntity); userIdList.add(mngid); } // 根据用户userIdList和消息具体类型批量推送 batchSave(msgdetaillist); pushProcessor.pushCommon(userIdList, Globals.msg_type_3); } if (i==1) { userIdList=new ArrayList(); HashSet useridHashSet = new HashSet(); List msgDtolist = new ArrayList(); //将msg 发送给系统的人事部人员 和管理层人员 List attendanceWarnMsgDtolist = attendanceWarnMsgMinidao.getAllLeaderUserIdList(); if (null==attendanceWarnMsgDtolist) { attendanceWarnMsgDtolist = new ArrayList(); } for (AttendanceWarnMsgDto dto: attendanceWarnMsgDtolist) { if (useridHashSet.contains(dto.getUserId())) { }else { msgDtolist.add(dto); useridHashSet.add(dto.getUserId()); } } //将msg 发送给区域管理人员 String orgid = msgEntity.getOrgId(); // 查询当前员工的区域组织机构 TSDepart tsDepart = getQyDepartByorgid(orgid); if (oConvertUtils.isEmpty(tsDepart)||oConvertUtils.isEmpty(tsDepart.getId())) { } else{ //根据departid 查询该区域的区域总经理 List attendanceWarnMsgDtos= attendanceWarnMsgMinidao.getAllQYJLUserIdListByOrgid(tsDepart.getId()); for (AttendanceWarnMsgDto dto: attendanceWarnMsgDtos) { if (useridHashSet.contains(dto.getUserId())) { }else { msgDtolist.add(dto); useridHashSet.add(dto.getUserId()); } } } List msgdetaillist = new ArrayList<>(); if (!ListUtils.isNullOrEmpty(msgDtolist)) { for (AttendanceWarnMsgDto dto : msgDtolist) { AttendanceWarnMsgDetailEntity detailEntity = new AttendanceWarnMsgDetailEntity(); detailEntity.setMsgId(msgEntity.getId()); detailEntity.setReceivedId(dto.getUserId()); detailEntity.setReadStatus(Globals.read_status_0); msgdetaillist.add(detailEntity); userIdList.add(dto.getUserId()); } batchSave(msgdetaillist); // 根据用户userIdList和消息具体类型批量推送 pushProcessor.pushCommon(userIdList, Globals.msg_type_3); } } } } private TSDepart getQyDepartByorgid(String orgid) { TSDepart tsDepart = get(TSDepart.class, orgid); if (tsDepart.getOrgType().equals(Globals.org_type_4)) { return tsDepart; } else { TSDepart parentdepart = tsDepart.getTSPDepart(); if (oConvertUtils.isEmpty(parentdepart)||oConvertUtils.isEmpty(parentdepart.getId())) { return null; } else { return getQyDepartByorgid(tsDepart.getTSPDepart().getId()); } } } }