package com.kingdee.eas.custom.server; import java.math.BigDecimal; import java.math.RoundingMode; import java.security.SecureRandom; import java.sql.SQLException; import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Base64; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import com.kingdee.bos.BOSException; import com.kingdee.bos.Context; import com.kingdee.bos.bsf.service.app.IHRMsfService; import com.kingdee.bos.dao.IObjectPK; import com.kingdee.bos.util.BOSUuid; import com.kingdee.eas.base.permission.UserInfo; import com.kingdee.eas.basedata.person.PersonCollection; import com.kingdee.eas.basedata.person.PersonFactory; import com.kingdee.eas.basedata.person.PersonInfo; import com.kingdee.eas.common.EASBizException; import com.kingdee.eas.framework.CoreBaseCollection; import com.kingdee.eas.framework.LineResult; import com.kingdee.eas.framework.Result; import com.kingdee.eas.hr.base.HRBillStateEnum; import com.kingdee.eas.hr.project.IWorkHoursConfirm; import com.kingdee.eas.hr.project.IWorkHoursReport; import com.kingdee.eas.hr.project.ProjectManagementInfo; import com.kingdee.eas.hr.project.WorkHoursConfirmCollection; import com.kingdee.eas.hr.project.WorkHoursConfirmFactory; import com.kingdee.eas.hr.project.WorkHoursConfirmInfo; import com.kingdee.eas.hr.project.WorkHoursReportEntryInfo; import com.kingdee.eas.hr.project.WorkHoursReportFactory; import com.kingdee.eas.hr.project.WorkHoursReportInfo; import com.kingdee.eas.hr.project.dataSource; import com.kingdee.eas.util.app.ContextUtil; import com.kingdee.eas.util.app.DbUtil; import com.kingdee.jdbc.rowset.IRowSet; import com.kingdee.shr.empresume.util.ErrorCodeUtil; public class WorhHoursService implements IHRMsfService{ private static final String ALGORITHM = "AES"; private static final int KEY_SIZE = 128; public Object process(Context ctx, Map param) throws EASBizException, BOSException { _initWorkHoursConfirm(ctx, null, null, null, 100); return null; } /** * 生成打卡确认单 */ private void _initWorkHoursConfirm(Context ctx, String number, String star, String end, int day) throws BOSException, EASBizException { IRowSet rs = null; List keyList = new ArrayList(); IWorkHoursConfirm biz = WorkHoursConfirmFactory.getLocalInstance(ctx); WorkHoursConfirmInfo wInfo = null; SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); List listInfo = null; List listproid = new ArrayList(); Map mapdate = new HashMap(); Map mapproid = new HashMap(); //存放打卡数据 map Map> mapInfo = new HashMap>(); StringBuffer sb = new StringBuffer("/*dialect*/"); if(day <= 0) { //默认3天 day = 3; } sb = new StringBuffer("/*dialect*/"); sb.append(" select distinct t1.fid pfid,t3.fid pid,TO_CHAR(t.FPUNCHCARDTIME, 'YYYY-MM-DD') CFCLOCKTIME1,t3en.fname_l2 CFCLOCKLOCATION from T_HR_ATS_PunchCardRecord t ").append(" \n"); sb.append(" inner join T_BD_Person t1 on t1.fid = t.FPROPOSERID ").append(" \n"); sb.append(" inner join CT_PRO_MemberManagement t2 on t2.CFEmployeeID = t1.fid ").append(" \n"); sb.append(" inner join CT_PRO_ProjectManagement t3 on t3.fid = t2.CFProjectManagemenID ").append(" \n"); sb.append(" inner join CT_PRO_ProjectClock t3en on t3en.CFPROJECTID = t3.fid and t3en.CFSTATE = '1' ").append(" \n"); sb.append(" where t.FPUNCHCARDPLACE is not null ").append(" \n"); // sb.append(" where t3.CFExpectedStartTime = FPUNCHCARDTIME ").append(" \n"); //按照时间过滤 if(star != null && star.length() > 0) { sb.append(" and t.FPUNCHCARDTIME >= TO_DATE('"+star+"', 'YYYY-MM-DD HH24:MI:SS')").append(" \n"); }else if(end != null && end.length() > 0) { sb.append(" and t.FPUNCHCARDTIME <= TO_DATE('"+end+"', 'YYYY-MM-DD HH24:MI:SS')").append(" \n"); }else { sb.append(" and t.FPUNCHCARDTIME >= sysdate -"+day).append(" \n"); } if(number !=null && number.length() > 0) { sb.append(" and t1.fnumber in (").append(number).append(") \n"); } //获取打卡数据 rs = DbUtil.executeQuery(ctx, sb.toString()); //项目对应的所有位置 Map> proCFCLOCKLOCATION = new HashMap>(); //人员+年月日 有几个项目 Map> keypro = new HashMap>(); List CFCLOCKLOCATIONList = new ArrayList(); List proList = new ArrayList(); try { if(rs != null && rs.size() > 0) { while (rs.next()) { String pfid = rs.getString("pfid"); String CFCLOCKTIME1 = rs.getString("CFCLOCKTIME1"); String proid = rs.getString("pid"); String CFCLOCKLOCATION = rs.getString("CFCLOCKLOCATION"); String key = pfid+CFCLOCKTIME1; //人员+年月日 if(keypro.containsKey(key)) { proList = keypro.get(key); }else { proList = new ArrayList(); } if(!proList.contains(proid)) { proList.add(proid); } keypro.put(key, proList); if(CFCLOCKLOCATION != null && CFCLOCKLOCATION.length() > 0) { if(proCFCLOCKLOCATION.containsKey(proid)) { CFCLOCKLOCATIONList = proCFCLOCKLOCATION.get(proid); }else { CFCLOCKLOCATIONList = new ArrayList(); } if(!CFCLOCKLOCATIONList.contains(CFCLOCKLOCATION)) { CFCLOCKLOCATIONList.add(CFCLOCKLOCATION); } proCFCLOCKLOCATION.put(proid, CFCLOCKLOCATIONList); } } } System.out.println("keypro"+keypro.toString()); System.out.println("proCFCLOCKLOCATION"+proCFCLOCKLOCATION.toString()); sb = new StringBuffer("/*dialect*/"); sb.append(" select t.fid tfid,t1.fid pid,t1.fnumber,t1.fname_l2,t3.fid proid,t3.fnumber,t3.CFProjectName ,TO_CHAR(t.FPUNCHCARDTIME, 'YYYY-MM-DD') CFCLOCKTIME1 " + ",TO_CHAR(t.FPUNCHCARDTIME, 'YYYY-MM-DD HH24:MI:SS') CFCLOCKTIME,t.FPUNCHCARDPLACE FPUNCHCARDPLACE from T_HR_ATS_PunchCardRecord t ").append(" \n"); sb.append(" inner join T_BD_Person t1 on t1.fid = t.FPROPOSERID ").append(" \n"); sb.append(" inner join CT_PRO_MemberManagement t2 on t2.CFEmployeeID = t1.fid ").append(" \n"); sb.append(" inner join CT_PRO_ProjectManagement t3 on t3.fid = t2.CFProjectManagemenID ").append(" \n"); // sb.append(" where t3.CFExpectedStartTime = FPUNCHCARDTIME ").append(" \n"); sb.append(" where t.FPUNCHCARDPLACE is not null and t.fid not in (select FSOURCEBILLID from CT_PRO_WorkHoursConfirm where FSOURCEBILLID is not null ) ").append(" \n"); //按照时间过滤 if(star != null && star.length() > 0) { sb.append(" and t.FPUNCHCARDTIME >= TO_DATE('"+star+"', 'YYYY-MM-DD HH24:MI:SS')").append(" \n"); }else if(end != null && end.length() > 0) { sb.append(" and t.FPUNCHCARDTIME <= TO_DATE('"+end+"', 'YYYY-MM-DD HH24:MI:SS')").append(" \n"); }else { sb.append(" and t.FPUNCHCARDTIME >= sysdate -"+day).append(" \n"); } if(number !=null && number.length() > 0) { sb.append(" and t1.fnumber in (").append(number).append(") \n"); } sb.append(" order by t1.fid, t.FPUNCHCARDTIME desc ").append(" \n");//排序 rs = DbUtil.executeQuery(ctx, sb.toString()); while (rs.next()) { String pid = rs.getString("pid"); String tfid = rs.getString("tfid"); String proid = rs.getString("proid"); String FPUNCHCARDPLACE = rs.getString("FPUNCHCARDPLACE"); //考勤位置打卡 String CFCLOCKTIME = rs.getString("CFCLOCKTIME"); //年月日时分秒 打卡时间 String CFCLOCKTIME1 = rs.getString("CFCLOCKTIME1"); //年月日--------当前 String key = pid+CFCLOCKTIME1;//员工id+年月日为 一个 唯一组合 //同一天不在多个项目情况下进行标记 if(!listproid.contains(key)) { listproid.add(key); } //去重-年月日时分秒匹配-跳过 if(mapdate.containsKey(key) && mapproid.get(key).equals(CFCLOCKTIME)) { continue; } if(mapInfo.containsKey(key)) { listInfo = mapInfo.get(key); }else { listInfo = new ArrayList(); keyList.add(key); mapproid.put(key, proid); mapdate.put(key, CFCLOCKTIME); } wInfo = getWConfirmInfo(ctx,pid, proid,proCFCLOCKLOCATION,FPUNCHCARDPLACE,simpleDateFormat.parse(CFCLOCKTIME),tfid); listInfo.add(wInfo); mapInfo.put(key, listInfo); } } catch (SQLException | ParseException e) { e.printStackTrace(); } //写入打卡数据 WorkHoursConfirmCollection addSubColl = new WorkHoursConfirmCollection(); WorkHoursConfirmCollection addAudColl = new WorkHoursConfirmCollection(); //多个项目且不在同一个项目情况下 List notList = new ArrayList(); if(listproid.size() > 0) { for (int i = 0; i < listproid.size(); i++) { String key = listproid.get(i); if(keypro.containsKey(key)) { proList = keypro.get(key); //当天有多个项目 if(proList.size() > 1) { listInfo = mapInfo.get(key); List addList = new ArrayList(); List locaProList = new ArrayList(); List idProList = new ArrayList(); boolean boolismu = false; //同一个打卡位置关联了多个项目 for (int j = 0; j < listInfo.size(); j++) { wInfo = listInfo.get(j); if(wInfo.getProject() != null && wInfo.getClockLocation() != null) { String proid = wInfo.getProject().getId().toString(); List getclock = proCFCLOCKLOCATION.get(proid); if(getclock != null) { for (int k = 0; k < getclock.size(); k++) { if(getclock.get(k).contains(wInfo.getClockLocation())){ if(locaProList.contains(wInfo.getClockLocation())) { if(!idProList.contains(proid)) { boolismu = true; } }else { if(!idProList.contains(proid)){ idProList.add(proid); } locaProList.add(wInfo.getClockLocation()); } } } } } } if(boolismu) { for (int j = 0; j < listInfo.size(); j++) { wInfo = listInfo.get(j); if(locaProList.contains(wInfo.getClockLocation())) { wInfo.setProject(null); //所属项目 wInfo.setBillState(HRBillStateEnum.SAVED);//暂存 addSubColl.add(wInfo); } } } for (int j = 0; j < listInfo.size(); j++) { wInfo = listInfo.get(j); if(wInfo.getClockLocation() != null && wInfo.getProject() != null && !addList.contains(wInfo.getSourceBillId())) { addList.add(wInfo.getSourceBillId()); if(wInfo.getBillState().compareTo(HRBillStateEnum.AUDITED) == 0) { addAudColl.add(wInfo); }else { //匹配不上的 addSubColl.add(wInfo); } } } for (int j = 0; j < listInfo.size(); j++) { wInfo = listInfo.get(j); if(wInfo.getClockLocation() != null && !addList.contains(wInfo.getSourceBillId())) { addList.add(wInfo.getSourceBillId()); if(wInfo.getBillState().compareTo(HRBillStateEnum.AUDITED) == 0) { addAudColl.add(wInfo); }else { //匹配不上的 addSubColl.add(wInfo); } } } notList.add(key); } } } } //剩余数据处理 if (keyList.size() > 0){ for (int i = 0; i < keyList.size(); i++) { String key = keyList.get(i); if(notList.contains(key)) { continue; } listInfo = mapInfo.get(key); for (int j = 0; j < listInfo.size(); j++) { wInfo = listInfo.get(j); //直接生效 if(wInfo.getBillState().compareTo(HRBillStateEnum.AUDITED) == 0) { addAudColl.add(wInfo); }else { //匹配不上的 addSubColl.add(wInfo); } } } } //提交工作流 if(addSubColl.size() > 0) { CoreBaseCollection addSubCollnew = new CoreBaseCollection(); List addList = new ArrayList(); for (int i = 0; i < addSubColl.size(); i++) { WorkHoursConfirmInfo getinfo = addSubColl.get(i); if(getinfo.getClockLocation() != null && !addList.contains(getinfo.getSourceBillId())) { addList.add(getinfo.getSourceBillId()); addSubCollnew.add(getinfo); } } if(addSubCollnew.size() > 0) { biz.submit(addSubCollnew); } } if(addAudColl.size() > 0) { CoreBaseCollection addAudCollNew = new CoreBaseCollection(); List addList = new ArrayList(); for (int i = 0; i < addAudColl.size(); i++) { WorkHoursConfirmInfo getinfo = addAudColl.get(i); if(getinfo.getClockLocation() != null && !addList.contains(getinfo.getSourceBillId())) { addList.add(getinfo.getSourceBillId()); addAudCollNew.add(getinfo); } } if(addAudCollNew.size() > 0) { //保存处理-审核通过 Result re = biz.addnew(addAudCollNew); LineResult lr = null; if(re != null && re.size() > 0){ for (int i = 0; i < re.size(); i++) { lr = re.getLineResult(i); biz.setAudited(BOSUuid.read(lr.getPk().toString())); //-审核通过 } } } } } /** * 解析为工时确认单 * @param pid * @param proid * @param p1 * @param p2 * @param clockTime * @return */ private WorkHoursConfirmInfo getWConfirmInfo(Context ctx,String pid,String proid,Map> map,String p2,Date clockTime,String FSOURCEBILLID) { WorkHoursConfirmInfo wInfo = new WorkHoursConfirmInfo(); PersonInfo pinfo = new PersonInfo();pinfo.setId(BOSUuid.read(pid)); //人员 PersonCollection personCollection = null; try { personCollection = PersonFactory.getLocalInstance(ctx).getPersonCollection(" select * where id = '"+pid+"'"); } catch (BOSException e) { e.printStackTrace(); } if(personCollection != null && personCollection.size()>0){ pinfo = personCollection.get(0); } ProjectManagementInfo proinfo = new ProjectManagementInfo();proinfo.setId(BOSUuid.read(proid)); //所属项目 wInfo.setEmployee(pinfo); wInfo.setProject(proinfo); //所属项目 wInfo.setClockDate(clockTime); //打卡日期 wInfo.setSourceBillId(FSOURCEBILLID);//来源id wInfo.setHrOrgUnit(pinfo.getHrOrgUnit()); wInfo.setCU(pinfo.getCU()); Timestamp t = new Timestamp(clockTime.getTime()); wInfo.setClockTime(t); //打卡-------------------------------------------------------------------------------------------------------------- //打卡位置 clockLocation if(map != null) { List plist = map.get(proid); if(plist != null && plist.contains(p2)) { wInfo.setClockLocation(p2); wInfo.setBillState(HRBillStateEnum.AUDITED);//审核通过 }else { if(p2 != null && p2.length() > 0){ wInfo.setClockLocation(p2); } wInfo.setProject(null); //所属项目 wInfo.setBillState(HRBillStateEnum.SAVED);//暂存 } }else { wInfo.setProject(null); //所属项目 wInfo.setBillState(HRBillStateEnum.SAVED);//暂存 } return wInfo; } }