package com.engine.jucailinkq.attendance.component.persongroup.commonutil; import com.engine.jucailinkq.attendance.enums.PersonGroupListTypeEnum; import com.engine.jucailinkq.common.util.DateUtil; import com.engine.jucailinkq.common.util.DbTools; import com.engine.jucailinkq.common.util.Utils; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; import weaver.conn.RecordSet; import weaver.general.Util; import java.util.*; import java.util.stream.Collectors; @Slf4j public class PersongroupCommonUtil { /** * * @param calendarMap key:年份,value:明细数据 * @return */ public static Map>> getDayByCalendarMap(Map calendarMap){ Map>> dataList = Maps.newHashMap(); String sql = "select mainid,rq,mc,rqlx,xq,sc from uf_qyrl_dt1 where mainid in "; String mainids = ""; for(Map.Entry entry : calendarMap.entrySet()){ mainids = mainids + entry.getValue() +","; } mainids = mainids.substring(0,mainids.length()-1); sql = sql +" ("+mainids+") "; log.debug("sql : {}",sql); List> list = DbTools.getSqlToList(sql); Map>> collect = list.stream().collect(Collectors.groupingBy(e -> e.get("mainid").toString())); calendarMap.entrySet().forEach(e -> { dataList.put(e.getKey(),collect.get(e.getValue())); }); return dataList; } public static int getBetweenDays(Map data){ //主表数据id String id = Util.null2String(data.get("id")); //规律排班模块Id String modeId = Util.null2String(data.get("modeId")); //排班结果模块Id String formmodeid = Util.null2String(data.get("formmodeid")); //生成天数 int day = Integer.valueOf(Util.null2String(data.get("day"))); //企业日历 String qyrl = Util.null2String(data.get("qyrl")); //节假日处理 0:改班,1:跳过,2:不处理 String jjrcl = Util.null2String(data.get("jjrcl")); //公休日处理 0:改班,1:跳过,2:不处理 String gxrcl = Util.null2String(data.get("gxrcl")); //生效日期 String bdate = Util.null2String(data.get("bdate")); //执行日期 String nowDate = Util.null2String(data.get("executeDate")); //排班方式 String pbfs = Util.null2String(data.get("pbfs")); //改班班次 String gbbc = Util.null2String(data.get("gbbc")); //规律排班明细表数据 String sql = "select ksts,jsts,hxbz,bcmc from uf_jcl_kq_glpb_dt1 where mainid=?"; List> detailDataList = DbTools.getSqlToList(sql,id); //规律排班适用组织数据 sql = "select dx,dxlx,aqjb from uf_jcl_syzz where modeid=? and dataid=?"; // List> organizationList = DbTools.getSqlToList(sql,modeId,id); //规律排班所用企业日历数据 sql = "select rlmc,nd,rq,rqlx from uf_jcl_kq_rlxx where rlmc=?"; // List> calendarList = DbTools.getSqlToList(sql,qyrl); // Map calendarMap = calendarList.stream().collect(Collectors.toMap(e->Util.null2String(e.get("nd")),e->Util.null2String(e.get("id")))); // log.debug("calendarMap : {}",calendarMap); // Map>> detailDataGroupingByYear = calendarList.stream().collect(Collectors.groupingBy(e ->e.get("nd").toString())); // //生效日期与当前日期相差年份 int betweenYears = DateUtil.getBetWeenYears(bdate,nowDate); //循环总天数 // int circulateDays = Integer.valueOf(detailDataList.get(detailDataList.size()-1).get("jsts").toString()); int betweenDays = DateUtil.getBetWeenDays(bdate,nowDate); /**计算生效日期到当前日期的总天数*/ if (betweenYears == 0){ String dateCondition = "rq >='"+bdate+"' and rq <'"+nowDate+"'"; int needSkipDay = getNeedSkipDay(jjrcl,gxrcl,qyrl,dateCondition); log.debug("needSkipDay : [{}]",needSkipDay); betweenDays = betweenDays-needSkipDay; }else if(betweenYears > 0){ int needSkipDay = 0; int bgYear = Integer.valueOf(bdate.split("-")[0]); for(int i=0;i<=betweenYears;i++){ int currentYear = bgYear +i; String endTime = currentYear+"-12-31"; if(i == 0){ String dateCondition = "rq >='"+bdate+"' and rq <='"+endTime+"'"; needSkipDay += getNeedSkipDay(jjrcl,gxrcl,qyrl,dateCondition); }else if (i == betweenYears){ String beginTime = currentYear + "-01-01"; String dateCondition = "rq >='"+beginTime+"' and rq <'"+nowDate+"'"; needSkipDay += getNeedSkipDay(jjrcl,gxrcl,qyrl,dateCondition); }else { String beginTime = currentYear + "-01-01"; String dateCondition = "rq >='"+beginTime+"' and rq <='"+endTime+"'"; needSkipDay += getNeedSkipDay(jjrcl,gxrcl,qyrl,dateCondition); } } log.debug("needSkipDay : [{}]",needSkipDay); betweenDays = betweenDays-needSkipDay; } return betweenDays; } public static int getNeedSkipDay(String jjrcl,String gxrcl,String rlmc,String dateCondition){ String sql = "select count(0) num from uf_jcl_kq_rlxx where rlmc=? and "+dateCondition; String conditionSql = ""; if ("1".equals(jjrcl)){ //节假日为跳过 conditionSql = conditionSql + " rqlx=1"; } if ("1".equals(gxrcl)){ //公休日为跳过 if ("".equals(conditionSql)){ conditionSql = conditionSql + " rqlx=2 or rqlx=3"; }else { conditionSql = conditionSql + " or rqlx=2 or rqlx=3"; } } if (!"".equals(conditionSql)){ sql = sql + " and ( "+conditionSql+")"; } log.debug("getNeedSkipDay sql : {},rlmc : {}",sql,rlmc); Map objectMap = DbTools.getSqlToMap(sql,rlmc); int needSkipDay = Integer.valueOf(objectMap.get("num").toString()); return needSkipDay; } /** * 规律排班插入排班结果公共方法 * @param organizationList * @param insertDataList * @param formmodeid * @return */ public static boolean insertShiftSchedulingResults(List> organizationList,List> insertDataList,String formmodeid){ RecordSet rs = new RecordSet(); List addlist = Lists.newArrayList(); String sql = "delete from uf_pbjg where bcrq>= ? and bcrq<=? and pbtj="+insertDataList.get(0).get("pbtj"); String startDate = Util.null2String(insertDataList.get(0).get("bcrq")); String endDate = Util.null2String(insertDataList.get(insertDataList.size()-1).get("bcrq")); Set psersons = Sets.newHashSet(); Set psersonsGroups = Sets.newHashSet(); Set departments = Sets.newHashSet(); Set subCompanys = Sets.newHashSet(); for (Map organization: organizationList){ String rqlx = Util.null2String(organization.get("rqlx")); for (Map insertData : insertDataList){ ArrayList list = new ArrayList<>(); list.add(insertData.get("bcbdsj")); list.add(insertData.get("pbtj")); list.add(insertData.get("pbgl")); list.add(organization.get("dxlx")); if ("0".equals(organization.get("dxlx"))){ //人员 list.add(Util.null2String(organization.get("dx")).split("-")[0]); list.add(null); list.add(null); list.add(null); psersons.add(Util.null2String(organization.get("dx")).split("-")[0]); }else if ("1".equals(organization.get("dxlx"))){ //人员分组 list.add(null); list.add(Util.null2String(organization.get("dx")).split("-")[0]); list.add(null); list.add(null); psersonsGroups.add(Util.null2String(organization.get("dx")).split("-")[0]); }else if ("2".equals(organization.get("dxlx"))){ //部门 list.add(null); list.add(null); list.add(Util.null2String(organization.get("dx")).split("-")[0]); list.add(null); departments.add(Util.null2String(organization.get("dx")).split("-")[0]); }else if ("3".equals(organization.get("dxlx"))){ //分部 list.add(null); list.add(null); list.add(null); list.add(Util.null2String(organization.get("dx")).split("-")[0]); subCompanys.add(Util.null2String(organization.get("dx")).split("-")[0]); } list.add(insertData.get("bcrq")); if (!rqlx.equals("")){ list.add(rqlx); }else { list.add(insertData.get("rqlx")); } list.add(insertData.get("sfxx")); list.add(insertData.get("sfdkpp")); list.add(insertData.get("bcxx")); list.add(insertData.get("hxbz")); list.add(insertData.get("pbrq")); list.add(insertData.get("pbsj")); list.add(formmodeid); list.add(1); list.add(0); list.add(DateUtil.getCurrentDate()); list.add(DateUtil.getCurrentTime().split(" ")[1]); list.add(UUID.randomUUID().toString()); addlist.add(list); } } boolean result = false; if (insertDataList.size() >0){ //老的排班结果删除 String pbgl = insertDataList.get(0).get("pbgl").toString(); String deleteSql = sql + " and pbgl = ?"; log.debug("deleteSql : {}",deleteSql); DbTools.update(rs,deleteSql,startDate,endDate,pbgl); } if (addlist.size() >0){ log.debug("addlist :[{}]",addlist); String insertSql = "insert into uf_pbjg (bcbdsj,pbtj,pbgl,dxlx,pbdxry,pbdxryfz,pbdxbm,pbdxfb,bcrq,rqlx,sfxx,sfdkpp,bcxx,hxbz,pbrq,pbsj,formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,MODEUUID) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; result =rs.executeBatchSql(insertSql,addlist); log.debug("result :[{}]",result); } return result; } /** * 删除过期规律排班数据 */ public static void deleteExpireData(String regularId,String edate){ String sql = "delete from uf_pbjg where pbgl=? and bcrq > ?"; DbTools.update(sql,regularId,edate); } /** * 日历排班插入排班结果公共方法 * @param organizationList * @param formmodeid * @return */ public static boolean insertSchedulingResults(List> organizationList,String formmodeid){ RecordSet rs = new RecordSet(); List addlist = Lists.newArrayList(); Set psersons = Sets.newHashSet(); Set psersonsGroups = Sets.newHashSet(); Set departments = Sets.newHashSet(); Set subCompanys = Sets.newHashSet(); for (Map organization: organizationList){ String rqlx = Util.null2String(organization.get("rqlx")); ArrayList list = new ArrayList<>(); list.add(organization.get("bcsdxx")); list.add(organization.get("pbtj")); list.add(organization.get("pbgl")); list.add(organization.get("dxlx")); if ("0".equals(organization.get("dxlx"))){ //人员 list.add(Util.null2String(organization.get("dx")).split("-")[0]); list.add(null); list.add(null); list.add(null); psersons.add(Util.null2String(organization.get("dx")).split("-")[0]); }else if ("1".equals(organization.get("dxlx"))){ //人员分组 list.add(null); list.add(Util.null2String(organization.get("dx")).split("-")[0]); list.add(null); list.add(null); psersonsGroups.add(Util.null2String(organization.get("dx")).split("-")[0]); }else if ("2".equals(organization.get("dxlx"))){ //部门 list.add(null); list.add(null); list.add(Util.null2String(organization.get("dx")).split("-")[0]); list.add(null); departments.add(Util.null2String(organization.get("dx")).split("-")[0]); }else if ("3".equals(organization.get("dxlx"))){ //分部 list.add(null); list.add(null); list.add(null); list.add(Util.null2String(organization.get("dx")).split("-")[0]); subCompanys.add(Util.null2String(organization.get("dx")).split("-")[0]); } list.add(organization.get("bcrq")); if (!rqlx.equals("")){ list.add(rqlx); }else { list.add(organization.get("rqlx")); } list.add(organization.get("sfxx")); list.add(organization.get("sfdkpp")); list.add(organization.get("bcxx")); list.add(organization.get("hxbz")); list.add(organization.get("pbrq")); list.add(organization.get("pbsj")); list.add(formmodeid); list.add(1); list.add(0); list.add(DateUtil.getCurrentDate()); list.add(DateUtil.getCurrentTime().split(" ")[1]); list.add(UUID.randomUUID().toString()); addlist.add(list); } boolean result = false; if (addlist.size() >0){ log.debug("addlist :[{}]",addlist); String insertSql = "insert into uf_pbjg (bcbdsj,pbtj,pbgl,dxlx,pbdxry,pbdxryfz,pbdxbm,pbdxfb,bcrq,rqlx,sfxx,sfdkpp,bcxx,hxbz,pbrq,pbsj,formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,MODEUUID) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; result =rs.executeBatchSql(insertSql,addlist); log.debug("result :[{}]",result); } return result; } /*** * 获得人员所在在的人员分组id * @param personnelGrouping 人员分组集合 * @param userId 人员id * @return 人员分组主键ID集合 */ public static Set getPersonnelGroupingByPerson(List> personnelGrouping,String userId,String date){ Map>> collect = personnelGrouping.stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("mainid")))); Set personnelGroupIds = Sets.newHashSet(); log.debug("getPersonnelGroupingByPerson collect : {}",collect); if (userId == null || "".equals(userId)){ return personnelGroupIds; } personnelGroupIds = getPersonnelGroupByPerson(personnelGrouping,userId,date).stream().map(e->e.get("mainid").toString()).collect(Collectors.toSet()); return personnelGroupIds; } /*** * 获得人员所在人员分组 * @param personnelGrouping 人员分组集合 * @param userId 人员id * @return 人员分组主键ID集合 */ public static List> getPersonnelGroupByPerson(List> personnelGrouping,String userId,String date){ Map>> collect = personnelGrouping.stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("mainid")))); List> resultList = Lists.newArrayList(); log.debug("getPersonnelGroupingByPerson collect : {}",collect); if (userId == null || "".equals(userId)){ return resultList; } for (Map.Entry>> e : collect.entrySet()){ List> value = e.getValue(); for (Map data :value ){ String edate = Util.null2String(data.get("edate")); String bdate = Util.null2String(data.get("bdate")); if (date != null && !date.equals("")){ if ((!"".equals(bdate) && DateUtil.getTime(date).compareTo(DateUtil.getTime(bdate)) <0) || (!"".equals(edate) && DateUtil.getTime(date).compareTo(DateUtil.getTime(edate)) > 0)){ continue; } } String empid = Util.null2String(data.get("empid")); String filters = Util.null2String(data.get("filters")); String sqltj = Util.null2String(data.get("sqltj")); log.debug(" empid : {},userId : {}",empid,userId); if (empid.equals(userId)){ resultList.add(data); }else if (!"".equals(filters)){ filters = filters.replace("and","and"); filters = filters.replace("or","or"); //条件清单 String sql = "select id,seclevel from hrmresource where 1=1 "; if (filters.contains("field")){ sql = "select a.id,a.seclevel from hrmresource a left join cus_fielddata b on a.id=b.id where scope='HrmCustomFieldByInfoType' and "+filters; }else { sql = sql+ " and "+filters; } log.debug("getPersonnelGroupingByPerson filter sql : {}",sql); List> dataList = DbTools.getSqlToList(sql); for (Map dataMap :dataList){ String hrmId = Util.null2String(dataMap.get("id")); if (hrmId.equals(userId)){ resultList.add(data); } } }else if (!"".equals(sqltj)){ sqltj = Utils.converSQL(sqltj); log.debug("getPersonnelGroupingByPerson sqltj : [{}]",sqltj); List> dataList = DbTools.getSqlToList(sqltj); for (Map dataMap :dataList){ String hrmId = Util.null2String(dataMap.get("id")); if (hrmId.equals(userId)){ resultList.add(data); } } } } } return resultList; } /** * 获得人员分组所包含的所有用户id * @param personnelGroupingList 人员分组集合 * @return userIDs 人员集合 */ public static Set getUserIdsByPersonnelGrouping(List> personnelGroupingList,String date){ Set userIds = Sets.newHashSet(); log.debug("getUserIdsByPersonnelGrouping personnelGroupingList :[{}]",personnelGroupingList); for (Map data:personnelGroupingList){ //生效日期 String bdate = Util.null2String(data.get("bdate")); //失效日期 String edate = Util.null2String(data.get("edate")); if ((!"".equals(bdate) && DateUtil.getTime(date).compareTo(DateUtil.getTime(bdate)) <0) || (!"".equals(edate) && DateUtil.getTime(date).compareTo(DateUtil.getTime(edate)) > 0)){ continue; } String empid = Util.null2String(data.get("empid")); String filters = Util.null2String(data.get("filters")); String list_type = Util.null2String(data.get("list_type")); String sqltj = Util.null2String(data.get("sqltj")); if (PersonGroupListTypeEnum.PERSON.getKey().equals(list_type) && !"".equals(empid)){ //人员清单 userIds.add(empid); }else if (PersonGroupListTypeEnum.CONDITION.getKey().equals(list_type) && !"".equals(filters)){ filters = filters.replace("and","and"); filters = filters.replace("or","or"); //条件清单 String sql = "select id,seclevel from hrmresource where 1=1 "; if (filters.contains("field")){ sql = "select a.id,a.seclevel from hrmresource a left join cus_fielddata b on a.id=b.id where scope='HrmCustomFieldByInfoType' and "+filters; }else { sql = sql+ " and "+filters; } log.debug("getPersonnelGroupingByPerson filter sql : {}",sql); List> dataList = DbTools.getSqlToList(sql); for (Map dataMap :dataList){ String hrmId = Util.null2String(dataMap.get("id")); userIds.add(hrmId); } }else if (PersonGroupListTypeEnum.SQLCONDITION.getKey().equals(list_type) && !"".equals(sqltj)){ sqltj = Utils.converSQL(sqltj); log.info("getPersonnelGroupingByPerson sqltj : [{}]",sqltj); List> dataList = DbTools.getSqlToList(sqltj); for (Map dataMap :dataList){ String hrmId = Util.null2String(dataMap.get("id")); userIds.add(hrmId); } } } log.debug("userIds size :[{}]",userIds.size()); return userIds; } /** * 获得人员对应的人员分组 * @return */ public static Map>> getAllpersonBelongGroup(){ String sql = "select a.list_type,a.userfor,b.mainid,b.empid,b.filters,b.bdate,b.edate,b.sqltj from uf_ryqz a left join uf_ryqz_dt1 b on a.id=b.mainid"; Map>> resultMap = Maps.newHashMap(); List> personGroupList = DbTools.getSqlToList(sql); for (Map personGroup:personGroupList){ String empid = Util.null2String(personGroup.get("empid")); String filters = Util.null2String(personGroup.get("filters")); String list_type = Util.null2String(personGroup.get("list_type")); String sqltj = Util.null2String(personGroup.get("sqltj")); if (PersonGroupListTypeEnum.PERSON.getKey().equals(list_type) && !"".equals(empid)){ //人员清单 addpersonBelongGroup(resultMap,empid,personGroup,null); }else if (PersonGroupListTypeEnum.CONDITION.getKey().equals(list_type) && !"".equals(filters)){ filters = filters.replace("and","and"); filters = filters.replace("or","or"); //条件清单 sql = "select id,seclevel from hrmresource where 1=1 "; if (filters.contains("field")){ sql = "select a.id,a.seclevel from hrmresource a left join cus_fielddata b on a.id=b.id where scope='HrmCustomFieldByInfoType' and "+filters; }else { sql = sql+ " and "+filters; } log.debug("getPersonnelGroupingByPerson filter sql : {}",sql); List> dataList = DbTools.getSqlToList(sql); for (Map dataMap :dataList){ String hrmId = Util.null2String(dataMap.get("id")); String seclevel = Util.null2String(dataMap.get("seclevel")); addpersonBelongGroup(resultMap,hrmId,personGroup,seclevel); } }else if (PersonGroupListTypeEnum.SQLCONDITION.getKey().equals(list_type) && !"".equals(sqltj)){ sqltj = Utils.converSQL(sqltj); log.info("getPersonnelGroupingByPerson sqltj : [{}]",sqltj); List> dataList = DbTools.getSqlToList(sqltj); for (Map dataMap :dataList){ String hrmId = Util.null2String(dataMap.get("id")); addpersonBelongGroup(resultMap,hrmId,personGroup,null); } } } return resultMap; } public static void addpersonBelongGroup(Map>> resultMap,String empid,Map personGroup,String seclevel){ List> personGroups = resultMap.get(empid); if (personGroups == null){ personGroups = Lists.newArrayList(); resultMap.put(empid,personGroups); } Map map = Maps.newHashMap(); map.put("userfor",personGroup.get("userfor")); map.put("mainid",personGroup.get("mainid")); map.put("bdate",personGroup.get("bdate")); map.put("edate",personGroup.get("edate")); map.put("seclevel",seclevel); personGroups.add(map); } /** * 获得人员分组集合 * @return */ public static Map getPersonGroup(){ String sql = "select id,name from uf_ryqz"; return DbTools.getSqlToMapList(sql); } /** * 获得部门集合 * @return */ public static Map getDepartMent(){ String sql = "select id,departmentname name from hrmdepartment"; return DbTools.getSqlToMapList(sql); } /** * 获得分部集合 * @return */ public static Map getSubCompany(){ String sql = "select id,subcompanyname name from hrmsubcompany"; return DbTools.getSqlToMapList(sql); } /** * 获得班次信息集合 * @return */ public static Map getClassesInformation(){ String sql = "select id,mc name from uf_jcl_kq_bcxx"; return DbTools.getSqlToMapList(sql); } /** * 获得候选班次集合 * @return */ public static Map getCandidateTeam(){ String sql = "select id,mc name from uf_jcl_kq_hxbz"; return DbTools.getSqlToMapList(sql); } /** * 获得班次信息名称与简称集合 * @return */ public static Map getClassesAndSimpleNameInformation(){ String sql = "select id,mc name,jc simplename,ys from uf_jcl_kq_bcxx"; return DbTools.getSimpleNameMap(sql); } }