Kaynağa Gözat

撤回 反审批 工时确认

huchenghua 5 ay önce
ebeveyn
işleme
528f21444b

+ 15 - 13
src/com/kingdee/eas/hr/project/app/ProjectChangeControllerBean.java

@@ -28,6 +28,7 @@ import com.kingdee.eas.hr.project.ProjectChangeFactory;
 import com.kingdee.eas.hr.project.ProjectChangeInfo;
 import com.kingdee.eas.hr.project.ProjectManagementFactory;
 import com.kingdee.eas.hr.project.ProjectManagementInfo;
+import com.kingdee.eas.util.app.DbUtil;
 import com.kingdee.eas.framework.CoreBaseInfo;
 import com.kingdee.bos.dao.IObjectPK;
 import com.kingdee.bos.metadata.entity.SelectorItemCollection;
@@ -56,29 +57,30 @@ public class ProjectChangeControllerBean extends AbstractProjectChangeController
     	logger.info("***starting**************execute");
     	super._setAudited(ctx, billID);
     	//处理反写逻辑
-    	
     	IProjectChange iProjectChange = ProjectChangeFactory.getLocalInstance(ctx);
-    	
     	ProjectChangeInfo projectChangeInfo = iProjectChange.getProjectChangeInfo(new ObjectUuidPK(billID));
     	
-    	ProjectManagementInfo changeProjectInfo = projectChangeInfo.getChangeProject();
+    	ProjectManagementInfo changeProjectInfo = ProjectManagementFactory.getLocalInstance(ctx)
+    			.getProjectManagementInfo(new ObjectUuidPK(projectChangeInfo.getChangeProject().getId()));
     	
-    	BigDecimal chaManDays = projectChangeInfo.getChaManDays();
+    	BigDecimal chaManDays = projectChangeInfo.getChaManDays(); //变更人天
     	BigDecimal oriManDays = projectChangeInfo.getOriManDays();
-    	BigDecimal changedManDays = chaManDays.subtract(oriManDays);
-    	
-    
-    	changeProjectInfo.setChangedManDays(changedManDays.ONE);
-    	
-    	BigDecimal totalPersonDays1 = changeProjectInfo.getTotalPersonDays();
-    	BigDecimal totalPersonDays2 = totalPersonDays1.add(changedManDays);
-    	changeProjectInfo.setTotalPersonDays(totalPersonDays2);
-    	
+    	changeProjectInfo.setChangedManDays(chaManDays); //变更人天
+    	changeProjectInfo.setTotalPersonDays(chaManDays.add(oriManDays)); //总人天
+    	changeProjectInfo.setBeingChanged(false); //取消变更
+    	changeProjectInfo.setSourceBillId(null);
     	IProjectManagement iProjectManagement = ProjectManagementFactory.getLocalInstance(ctx);
     	SelectorItemCollection sic=new SelectorItemCollection();
     	sic.add(new SelectorItemInfo("changedManDays"));
     	sic.add(new SelectorItemInfo("totalPersonDays"));
+    	sic.add(new SelectorItemInfo("beingChanged"));
+    	sic.add(new SelectorItemInfo("sourceBillId"));
     	iProjectManagement.updatePartial(changeProjectInfo, sic);
     	logger.info("***end**************execute");
     }
+    
+    protected void _delete(Context ctx, IObjectPK pk) throws BOSException, EASBizException {
+    	DbUtil.execute(ctx, "update CT_PRO_ProjectManagement set CFBEINGCHANGED = '0' , FSOURCEBILLID = '' where FSOURCEBILLID = '"+pk+"'");
+    	super._delete(ctx, pk);
+    }
 }

+ 289 - 152
src/com/kingdee/eas/hr/project/app/WorkHoursFacadeControllerBean.java

@@ -1,6 +1,7 @@
 package com.kingdee.eas.hr.project.app;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.sql.SQLException;
 import java.sql.Timestamp;
 import java.text.ParseException;
@@ -28,6 +29,7 @@ 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;
@@ -47,153 +49,278 @@ public class WorkHoursFacadeControllerBean extends AbstractWorkHoursFacadeContro
      */
     protected void _initWorkHoursConfirm(Context ctx, String number, String star, String end, int day)
     		throws BOSException, EASBizException {
-    	IRowSet rs = null;
-    	List<String> keyList = new ArrayList<String>();
-    	IWorkHoursConfirm  biz = WorkHoursConfirmFactory.getLocalInstance(ctx); 
-    	
-    	WorkHoursConfirmInfo wInfo = null;
-    	SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-    	List<WorkHoursConfirmInfo> listInfo = null;
-    	List<String> listproid = new ArrayList<String>();
-    	Map<String,String> mapdate = new HashMap<String,String>();
-    	Map<String,String> mapproid = new HashMap<String,String>();
-    	//存放打卡数据 map
-    	Map<String,List<WorkHoursConfirmInfo>> mapInfo = new HashMap<String,List<WorkHoursConfirmInfo>>();
-    	StringBuffer sb = new StringBuffer("/*dialect*/");
-    	if(day <= 0) {
-    		//默认3天
-    		day = 3;
-    	}
+      	IRowSet rs = null;
+      	List<String> keyList = new ArrayList<String>();
+      	IWorkHoursConfirm  biz = WorkHoursConfirmFactory.getLocalInstance(ctx); 
+      	
+      	WorkHoursConfirmInfo wInfo = null;
+      	SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+      	List<WorkHoursConfirmInfo> listInfo = null;
+      	List<String> listproid = new ArrayList<String>();
+      	Map<String,String> mapdate = new HashMap<String,String>();
+      	Map<String,String> mapproid = new HashMap<String,String>();
+      	//存放打卡数据 map
+      	Map<String,List<WorkHoursConfirmInfo>> mapInfo = new HashMap<String,List<WorkHoursConfirmInfo>>();
+      	StringBuffer sb = new StringBuffer("/*dialect*/");
+      	if(day <= 0) {
+      		//默认3天
+      		day = 3;
+      	}
+      	
     	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,t3en.CFCLOCKLOCATION 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("	left join CT_PRO_ProjectManagementEntry t3en on t3en.FPARENTID = t3.fid  ").append(" \n");
-    	sb.append("	where t3.CFExpectedStartTime <FPUNCHCARDTIME and t3.CFExpectedEndTime >= FPUNCHCARDTIME ").append(" \n");
-    	sb.append("	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());
-    	try {
+      	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 and t3.CFExpectedEndTime >= 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<String,List<String>> proCFCLOCKLOCATION = new HashMap<String,List<String>>();
+  		//人员+年月日 有几个项目
+  		Map<String,List<String>> keypro = new HashMap<String,List<String>>();
+  		
+  		List<String> CFCLOCKLOCATIONList = new ArrayList<String>();
+  		List<String> proList = new ArrayList<String>();
+      	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<String>();
+          			}
+          			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<String>();
+              			}
+          				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 and t3.CFExpectedEndTime >= 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 CFCLOCKLOCATION = rs.getString("CFCLOCKLOCATION"); //项目打卡位置
-				String FPUNCHCARDPLACE = rs.getString("FPUNCHCARDPLACE"); //考勤位置打卡
-				String CFCLOCKTIME = rs.getString("CFCLOCKTIME"); //年月日时分秒 打卡时间
-				String CFCLOCKTIME1 = rs.getString("CFCLOCKTIME1"); //年月日--------当前
-				String key = pid+CFCLOCKTIME1;//员工id+年月日为 一个 唯一组合
-				//同一天不在多个项目情况下进行标记
-				if(!listproid.contains(key) && mapproid.containsKey(key) && mapproid.get(key).equals(proid)) {
-					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<WorkHoursConfirmInfo>();
-					keyList.add(key);
-					mapproid.put(key, proid);
-					mapdate.put(key, CFCLOCKTIME);
-				}
-				wInfo = getWConfirmInfo(ctx,pid, proid,CFCLOCKLOCATION,FPUNCHCARDPLACE,simpleDateFormat.parse(CFCLOCKTIME),tfid);
-				listInfo.add(wInfo);
-				mapInfo.put(key, listInfo);
-			}
-		} catch (SQLException | ParseException e) {
-			e.printStackTrace();
-		}
-    	//写入打卡数据
-    	CoreBaseCollection addSubColl = new CoreBaseCollection();
-    	CoreBaseCollection addAudColl = new CoreBaseCollection();
-    	//多个项目且不在同一个项目情况下
-    	List<String> notList = new ArrayList<String>();
-    	if(listproid.size() > 0) {
-        	for (int i = 0; i < listproid.size(); i++) {
-        		String key = listproid.get(i);
-        		listInfo = mapInfo.get(key);
-        		String oldprojid = null;
-        		boolean isoneprojid = true;
-        		for (int j = 0; j < listInfo.size(); j++) {
-        			wInfo = listInfo.get(j);
-        			if(j == 0) {
-        				if(wInfo.getProject().getId() != null) {
-        					oldprojid = wInfo.getProject().getId().toString();
-        				}else {
-        					oldprojid = "0";
-        				}
-        			}else {
-        				//不在同一个项目
-            			if(!oldprojid.equals(wInfo.getProject().getId().toString()) || wInfo.getProject().getId() == null) {
-            				isoneprojid = false;
-            				break;
-            			}
-        			}
+    				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<WorkHoursConfirmInfo>();
+    					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);
     			}
-        		//不在同一个项目
-        		if(!isoneprojid) {
-        			for (int j = 0; j < listInfo.size(); j++) {
-            			wInfo = listInfo.get(j);
-            			wInfo.setProject(null); //所属项目
-            			wInfo.setBillState(HRBillStateEnum.SAVED);//暂存
-            			addSubColl.add(wInfo);
-        			}
-        			notList.add(key);
-        		}
+    		} catch (SQLException | ParseException e) {
+    			e.printStackTrace();
     		}
-    	}
-    	//剩余数据处理
-    	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);
-        			}
-    			}
+      	//写入打卡数据
+      	WorkHoursConfirmCollection addSubColl = new WorkHoursConfirmCollection();
+      	WorkHoursConfirmCollection addAudColl = new WorkHoursConfirmCollection();
+      	
+      	//多个项目且不在同一个项目情况下
+      	List<String> notList = new ArrayList<String>();
+      	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<String> addList = new ArrayList<String>();
+          				List<String> locaProList = new ArrayList<String>();
+          				List<String> idProList = new ArrayList<String>();
+          				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<String> 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<String> addList = new ArrayList<String>();
+      		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(addSubColl.size() > 0) {
-    		biz.submit(addSubColl);
-    	}
-    	if(addAudColl.size() > 0) {
-    		//保存处理-审核通过
-        	Result re = biz.addnew(addAudColl);
-        	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())); //-审核通过
-    			}
-        	}
-    	}
+      		if(addSubCollnew.size() > 0) {
+      			biz.submit(addSubCollnew);
+      		}
+      	}
+      	if(addAudColl.size() > 0) {
+      		CoreBaseCollection addAudCollNew = new CoreBaseCollection();
+	      	List<String> addList = new ArrayList<String>();
+	  		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())); //-审核通过
+	      			}
+	          	}
+      		}
+      	}
     }
     
     /**
@@ -205,7 +332,7 @@ public class WorkHoursFacadeControllerBean extends AbstractWorkHoursFacadeContro
      * @param clockTime
      * @return
      */
-    private WorkHoursConfirmInfo getWConfirmInfo(Context ctx,String pid,String proid,String p1,String p2,Date clockTime,String FSOURCEBILLID) {
+    private WorkHoursConfirmInfo getWConfirmInfo(Context ctx,String pid,String proid,Map<String,List<String>> map,String p2,Date clockTime,String FSOURCEBILLID) {
     	WorkHoursConfirmInfo wInfo = new WorkHoursConfirmInfo();
     	PersonInfo pinfo = new PersonInfo();pinfo.setId(BOSUuid.read(pid)); //人员
     	
@@ -229,9 +356,16 @@ public class WorkHoursFacadeControllerBean extends AbstractWorkHoursFacadeContro
 		Timestamp t = new Timestamp(clockTime.getTime());
 		wInfo.setClockTime(t); //打卡--------------------------------------------------------------------------------------------------------------
 		//打卡位置 clockLocation 
-		if(p1.equals(p2)) {
-			wInfo.setClockLocation(p2);
-			wInfo.setBillState(HRBillStateEnum.AUDITED);//审核通过
+		if(map != null) {
+			List<String> plist = map.get(proid);
+			System.out.println("p2:"+p2);
+			if(plist.contains(p2)) {
+				wInfo.setClockLocation(p2);
+				wInfo.setBillState(HRBillStateEnum.AUDITED);//审核通过
+			}else {
+				wInfo.setProject(null); //所属项目
+				wInfo.setBillState(HRBillStateEnum.SAVED);//暂存
+			}
 		}else {
 			wInfo.setProject(null); //所属项目
 			wInfo.setBillState(HRBillStateEnum.SAVED);//暂存
@@ -440,17 +574,18 @@ public class WorkHoursFacadeControllerBean extends AbstractWorkHoursFacadeContro
     	if(proidList.size() > 0) {
     		for (int i = 0; i < proidList.size(); i++) {
     			String proid = proidList.get(i);
-    			rs = DbUtil.executeQuery(ctx, " SELECT tt.CFPLANNEDMANDAYS CFPLANNEDMANDAYS,sum(CASE when tt.CFWORKINGHOURS >= 8 THEN 8 ELSE tt.CFWORKINGHOURS END) CFWORKINGHOURS"
+    			String sql = " SELECT tt.CFPLANNEDMANDAYS CFPLANNEDMANDAYS,sum(CASE when tt.CFWORKINGHOURS >= 8 THEN 8 ELSE tt.CFWORKINGHOURS END) CFWORKINGHOURS"
     					+ " FROM  (" + 
     					" SELECT t2.CFPLANNEDMANDAYS CFPLANNEDMANDAYS ,to_char(t1.CFDATA,'YYYY-MM-DD') CFDATA,sum(t1.CFWORKINGHOURS) CFWORKINGHOURS FROM CT_PRO_WorkHoursReport t" + 
     					" inner join CT_PRO_WorkHoursReportentry t1 on t1.FPARENTID = t.fid" + 
     					" inner join CT_PRO_ProjectManagement t2 on t2.fid = t.CFAFFILIATEDPROJEC" + 
-    					" where t.FBILLSTATE = '3' and t.fid = '"+proid+"'" + 
+    					" where t.FBILLSTATE = '3' and t2.fid = '"+proid+"'" + 
     					" group by t2.CFPLANNEDMANDAYS,to_char(t1.CFDATA,'YYYY-MM-DD')" + 
     					" )tt group by  tt.CFPLANNEDMANDAYS " + 
-    					"");
+    					"";
+    			rs = DbUtil.executeQuery(ctx,sql );
     			try {
-    			
+    				System.out.println("sql:"+sql);
 					if (rs.next()) {
 						BigDecimal FPRODAYCONSUMPTION = BigDecimal.ZERO;
 						BigDecimal CFPLANNEDMANDAYS = rs.getBigDecimal("CFPLANNEDMANDAYS"); //项目总人天
@@ -460,9 +595,11 @@ public class WorkHoursFacadeControllerBean extends AbstractWorkHoursFacadeContro
 							//项目总人天除以 申报人天  
 							//申报人天= 总数/8
 							CFWORKINGHOURS = CFWORKINGHOURS.divide(new BigDecimal(8),2,BigDecimal.ROUND_HALF_UP); //8小时 四舍五入 保留2位小数
-							FPRODAYCONSUMPTION = CFPLANNEDMANDAYS.divide(CFWORKINGHOURS,2,BigDecimal.ROUND_HALF_UP);
+							FPRODAYCONSUMPTION = CFWORKINGHOURS.divide(CFPLANNEDMANDAYS,4,BigDecimal.ROUND_HALF_UP);
+							FPRODAYCONSUMPTION = FPRODAYCONSUMPTION.multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP);
 						}
-						DbUtil.execute(ctx, "update CT_PRO_ProjectManagement set FPRODAYCONSUMPTION ="+FPRODAYCONSUMPTION+" where fid = '"+proid+"'");
+						DbUtil.execute(ctx, "update CT_PRO_ProjectManagement "
+								+ " set FPRODAYCONSUMPTION ="+FPRODAYCONSUMPTION+",FWORKERDAYSREPORTED= "+CFWORKINGHOURS+" where fid = '"+proid+"'");
 					}
 				} catch (SQLException e) {
 					e.printStackTrace();

+ 564 - 0
websrc/com/kingdee/eas/custom/server/MyShrMobileNewService.java

@@ -1,6 +1,7 @@
 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;
@@ -21,9 +22,30 @@ 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 MyShrMobileNewService implements IHRMsfService{
@@ -70,4 +92,546 @@ public class MyShrMobileNewService implements IHRMsfService{
 	        keyGenerator.init(KEY_SIZE, new SecureRandom(password.getBytes()));
 	        return new SecretKeySpec(keyGenerator.generateKey().getEncoded(), ALGORITHM);
 	}
+
+    /**
+     * 生成打卡确认单
+     */
+    private void _initWorkHoursConfirm(Context ctx, String number, String star, String end, int day)
+    		throws BOSException, EASBizException {
+      	IRowSet rs = null;
+      	List<String> keyList = new ArrayList<String>();
+      	IWorkHoursConfirm  biz = WorkHoursConfirmFactory.getLocalInstance(ctx); 
+      	
+      	WorkHoursConfirmInfo wInfo = null;
+      	SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+      	List<WorkHoursConfirmInfo> listInfo = null;
+      	List<String> listproid = new ArrayList<String>();
+      	Map<String,String> mapdate = new HashMap<String,String>();
+      	Map<String,String> mapproid = new HashMap<String,String>();
+      	//存放打卡数据 map
+      	Map<String,List<WorkHoursConfirmInfo>> mapInfo = new HashMap<String,List<WorkHoursConfirmInfo>>();
+      	StringBuffer sb = new StringBuffer("/*dialect*/");
+      	if(day <= 0) {
+      		//默认3天
+      		day = 3;
+      	}
+      	
+    	sb = new StringBuffer("/*dialect*/");
+      	sb.append("	select t3.fid pid,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("	left join CT_PRO_ProjectClock t3en on t3en.CFPROJECTID = t3.fid and t3en.CFSTATE = '1' ").append(" \n"); 
+      	sb.append("	where t3.CFExpectedStartTime <FPUNCHCARDTIME and t3.CFExpectedEndTime >= 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());
+      	
+      	try {
+      		Map<String,List<String>> proCFCLOCKLOCATION = new HashMap<String,List<String>>();
+      		List<String> CFCLOCKLOCATIONList = new ArrayList<String>();
+          	if(rs != null && rs.size() > 0) {
+          		while (rs.next()) {
+          			String proid = rs.getString("pid");
+          			String CFCLOCKLOCATION = rs.getString("CFCLOCKLOCATION");
+          			if(CFCLOCKLOCATION != null && CFCLOCKLOCATION.length() > 0) {
+          				if(proCFCLOCKLOCATION.containsKey(proid)) {
+              				CFCLOCKLOCATIONList = proCFCLOCKLOCATION.get(proid);
+              			}else {
+              				CFCLOCKLOCATIONList = new ArrayList<String>();
+              			}
+          				if(!CFCLOCKLOCATIONList.contains(CFCLOCKLOCATION)) {
+          					CFCLOCKLOCATIONList.add(CFCLOCKLOCATION);
+          				}
+              			proCFCLOCKLOCATION.put(proid, CFCLOCKLOCATIONList);
+          			}
+          		}
+          	}
+          	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 and t3.CFExpectedEndTime >= FPUNCHCARDTIME ").append(" \n"); 
+          	sb.append("	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) && mapproid.containsKey(key) && mapproid.get(key).equals(proid)) {
+    					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<WorkHoursConfirmInfo>();
+    					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<String> notList = new ArrayList<String>();
+      	System.out.println("notList: "+notList.size());
+      	if(listproid.size() > 0) {
+          	for (int i = 0; i < listproid.size(); i++) {
+          		String key = listproid.get(i);
+          		listInfo = mapInfo.get(key);
+          		String oldprojid = null;
+          		boolean isoneprojid = true;
+          		for (int j = 0; j < listInfo.size(); j++) {
+          			wInfo = listInfo.get(j);
+          			if(j == 0) {
+          				if(wInfo.getProject() != null && wInfo.getProject().getId() != null) {
+          					oldprojid = wInfo.getProject().getId().toString();
+          				}else {
+          					oldprojid = "0";
+          				}
+          			}else {
+          				//不在同一个项目
+              			if((wInfo.getProject() != null && !oldprojid.equals(wInfo.getProject().getId().toString())) 
+              					|| wInfo.getProject() == null ||wInfo.getProject().getId() == null) {
+              				isoneprojid = false;
+              				break;
+              			}
+          			}
+      			}
+          		//不在同一个项目
+          		if(!isoneprojid) {
+          			for (int j = 0; j < listInfo.size(); j++) {
+              			wInfo = listInfo.get(j);
+              			wInfo.setProject(null); //所属项目
+              			wInfo.setBillState(HRBillStateEnum.SAVED);//暂存
+              			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<String> addList = new ArrayList<String>();
+      		for (int i = 0; i < addSubColl.size(); i++) {
+      			WorkHoursConfirmInfo getinfo = addSubColl.get(i);
+      			if(!addList.contains(getinfo.getSourceBillId())) {
+      				addList.add(getinfo.getSourceBillId());
+      				addSubCollnew.add(getinfo);
+      			}
+			}
+      		System.out.println("addSubCollnew: "+addSubCollnew.size());
+      		biz.submit(addSubCollnew);
+      	}
+      	if(addAudColl.size() > 0) {
+      		CoreBaseCollection addAudCollNew = new CoreBaseCollection();
+	      	List<String> addList = new ArrayList<String>();
+	  		for (int i = 0; i < addAudColl.size(); i++) {
+	  			WorkHoursConfirmInfo getinfo = addAudColl.get(i);
+	  			if(!addList.contains(getinfo.getSourceBillId())) {
+	  				addList.add(getinfo.getSourceBillId());
+	  				addAudCollNew.add(getinfo);
+	  			}
+			}
+	  		System.out.println("addAudCollNew: "+addAudCollNew.size());
+      		//保存处理-审核通过
+          	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<String,List<String>> 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<String> plist = map.get(proid);
+			System.out.println("p2:"+p2);
+			if(plist != null && plist.contains(p2)) {
+				wInfo.setClockLocation(p2);
+				wInfo.setBillState(HRBillStateEnum.AUDITED);//审核通过
+			}else {
+				wInfo.setProject(null); //所属项目
+				wInfo.setBillState(HRBillStateEnum.SAVED);//暂存
+			}
+		}else {
+			wInfo.setProject(null); //所属项目
+			wInfo.setBillState(HRBillStateEnum.SAVED);//暂存
+		}
+		return wInfo;
+    }
+    
+    /**
+     * 工时计算
+     */
+    private void _updateWorkHoursReport(Context ctx, String number, String star, String end, int day,String type)
+    		throws BOSException, EASBizException {
+    	
+    	List<String> proidList = new ArrayList<String>();
+    	//获取工时确认单生成工时单
+    	String CFCLOCKTIME = null; //年月日-时分秒
+		String CFCLOCKDATE = null; //年月日
+		String CFPROJECTID = null; //项目id
+		String CFEMPLOYEEID = null; //人员id
+		String CFCLOCKLOCATION = null; //位置
+		String fid = null; //fid
+    	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    	SimpleDateFormat sdfs = new SimpleDateFormat("HH:mm:ss");
+    	IWorkHoursReport biz = WorkHoursReportFactory.getLocalInstance(ctx);
+    	CoreBaseCollection coll = new CoreBaseCollection();
+    	WorkHoursReportInfo info = null;
+    	List<String> listDate = new ArrayList<String>(); //一天天的判断
+    	Map<String,List<Map<String,String>>> dateMap = null;
+    	List<Map<String,String>> listMap = null;
+    	Map<String,List<String>> mapListPersonid = new HashMap<String,List<String>>(); //每天有多少人
+    	List<String> personidList = null;
+    	Map<String,String> map = null;
+    	Map<String,Map<String,List<Map<String,String>>>> mapRs = new HashMap<String,Map<String,List<Map<String,String>>>>();
+    	if(day <= 0) {
+    		//默认3天
+    		day = 3;
+    	}
+    	StringBuffer sb = new StringBuffer("/*dialect*/");
+    	sb.append("	select fid fid,CFPROJECTID CFPROJECTID,CFEMPLOYEEID CFEMPLOYEEID"
+    			+ " ,TO_CHAR(CFCLOCKDATE, 'YYYY-MM-DD') CFCLOCKDATE"
+    			+ " ,TO_CHAR(CFCLOCKTIME, 'YYYY-MM-DD HH24:MI:SS') CFCLOCKTIME "
+    			+ " FROM CT_PRO_WorkHoursConfirm where FBILLSTATE ='3' "
+    			+ " and CFPROJECTID is not null ").append(" \n");
+    	//按照时间过滤
+    	if(star != null && star.length() > 0) {
+    		sb.append("	and CFCLOCKDATE  >= TO_DATE('"+star+"', 'YYYY-MM-DD HH24:MI:SS')").append(" \n");
+    	}else if(end != null && end.length() > 0) {
+    		sb.append("	and CFCLOCKDATE  <= TO_DATE('"+end+"', 'YYYY-MM-DD HH24:MI:SS')").append(" \n");
+    	}else {
+    		sb.append("	and CFCLOCKDATE >= sysdate -"+day).append(" \n");
+    	}
+    	if(number !=null && number.length() > 0) {
+    		sb.append("	and CFEMPLOYEEID in (select fid from (").append(number).append(")) \n");
+    	}
+    	sb.append("	 order by  CFEMPLOYEEID,CFCLOCKTIME asc").append(" \n");//排序
+    	//获取打卡数据-审核通过的数据
+    	IRowSet rs = DbUtil.executeQuery(ctx, sb.toString());
+    	System.out.println("sb:"+sb);
+		try {
+			while (rs.next()) {
+				CFCLOCKTIME = rs.getString("CFCLOCKTIME"); //年月日-时分秒
+				CFCLOCKDATE = rs.getString("CFCLOCKDATE"); //年月日
+				CFPROJECTID = rs.getString("CFPROJECTID"); //项目id
+				CFEMPLOYEEID = rs.getString("CFEMPLOYEEID"); //人员id
+				CFCLOCKLOCATION = "";//rs.getString("CFCLOCKLOCATION"); //位置
+				fid = rs.getString("fid"); //fid
+				map = new HashMap<String,String>();
+				map.put("CFCLOCKTIME", CFCLOCKTIME);
+				map.put("CFCLOCKDATE", CFCLOCKDATE);
+				map.put("CFPROJECTID", CFPROJECTID);
+				map.put("CFEMPLOYEEID", CFEMPLOYEEID);
+				map.put("fid", fid);
+				if(!listDate.contains(CFCLOCKDATE)){
+					listDate.add(CFCLOCKDATE);
+					dateMap = new HashMap<String,List<Map<String,String>>>();
+					personidList = new ArrayList<String>();
+				}else {
+					dateMap = mapRs.get(CFCLOCKDATE);
+					personidList = mapListPersonid.get(CFCLOCKDATE);
+				}
+				//重复人员
+				if(!personidList.contains(CFEMPLOYEEID)) {
+					personidList.add(CFEMPLOYEEID);
+					listMap = new ArrayList<Map<String,String>>();
+				}else {
+					listMap = dateMap.get(CFEMPLOYEEID);
+				}
+				listMap.add(map);
+				
+				dateMap.put(CFEMPLOYEEID,listMap);
+				mapListPersonid.put(CFCLOCKDATE, personidList); 
+				mapRs.put(CFCLOCKDATE, dateMap);
+			}
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+		List<String> delist = new ArrayList<String>();
+    	//一天一天的处理
+		for (int i = 0; i < listDate.size(); i++) {
+			CFCLOCKDATE = listDate.get(i);
+			dateMap = mapRs.get(CFCLOCKDATE);
+			personidList = mapListPersonid.get(CFCLOCKDATE);
+			for (int j = 0; j < personidList.size(); j++) {
+				CFEMPLOYEEID = personidList.get(j);//人员id
+				listMap = dateMap.get(CFEMPLOYEEID); //这个人有多少打卡数据
+				String oldCFPROJECTID = null; //旧的项目
+				String oldCFCLOCKTIME = null;   //旧的打卡时间
+				String oldfid = null;   //旧的fid
+				String deleteWhere = " CFEMPLOYEEID='"+CFEMPLOYEEID+"' and to_char(CFDATA,'YYYY-MM-DD') = '"+CFCLOCKDATE+"'";
+				for (int j2 = 0; j2 < listMap.size(); j2++) {
+					map = listMap.get(j2);
+					CFCLOCKTIME = map.get("CFCLOCKTIME"); //年月日-时分秒
+					CFPROJECTID = map.get("CFPROJECTID"); //项目id
+					CFEMPLOYEEID = map.get("CFEMPLOYEEID"); //人员id
+					CFCLOCKLOCATION = map.get("CFEMPLOYEEID"); //位置
+					fid = map.get("fid"); //fid
+					//第一次记录最早的
+					if(j2 == 0){
+						oldCFPROJECTID = CFPROJECTID;
+						oldCFCLOCKTIME = CFCLOCKTIME;
+						oldfid = fid;
+					}
+					//跟上一次的不一致情况下
+					if(!oldCFPROJECTID.equals(CFPROJECTID)) {
+						map = listMap.get(j2-1);
+						CFCLOCKTIME = map.get("CFCLOCKTIME"); //年月日-时分秒
+						CFPROJECTID = map.get("CFPROJECTID"); //项目id
+						CFEMPLOYEEID = map.get("CFEMPLOYEEID"); //人员id
+						CFCLOCKLOCATION = map.get("CFEMPLOYEEID"); //位置
+						fid = map.get("fid"); //fid
+						//取上一次的数据与第一次数据进行比较计算
+						//计算两者时间差几个小时
+						try {
+							Date oldDate = sdf.parse(oldCFCLOCKTIME);
+							Date date = sdf.parse(CFCLOCKTIME);
+					        long diffInMillies = date.getTime() - oldDate.getTime();
+					        // 将毫秒数转换为小时
+					        long diffInHours = diffInMillies / (60 * 60 * 1000);
+					        BigDecimal hours = new BigDecimal(diffInHours);
+					        //组装数据
+					        info = initInfo(ctx,CFEMPLOYEEID, oldCFPROJECTID, date, sdf.format(sdf.parse(CFCLOCKTIME)), null, hours,oldfid+","+fid);
+					        if(!delist.contains(deleteWhere)) {
+					        	delist.add(deleteWhere);
+					        }
+					        coll.add(info);
+						} catch (ParseException ee) {
+							ee.printStackTrace();
+						}
+						//当前重新开始
+						map = listMap.get(j2);
+						CFCLOCKTIME = map.get("CFCLOCKTIME"); //年月日-时分秒
+						CFPROJECTID = map.get("CFPROJECTID"); //项目id
+						CFEMPLOYEEID = map.get("CFEMPLOYEEID"); //人员id
+						CFCLOCKLOCATION = map.get("CFEMPLOYEEID"); //位置
+						fid = map.get("fid"); //fid
+						oldCFPROJECTID = CFPROJECTID;
+						oldCFCLOCKTIME = CFCLOCKTIME;
+						oldfid = fid;
+					}
+					
+					//最后一次记录
+					if(j2 == listMap.size()-1){
+						if(oldCFPROJECTID.equals(CFPROJECTID) && !oldCFCLOCKTIME.equals(CFCLOCKTIME)) { //项目相同时间相同情况下
+							try {
+								Date oldDate = sdf.parse(oldCFCLOCKTIME);
+								Date date = sdf.parse(CFCLOCKTIME);
+						        long diffInMillies = date.getTime() - oldDate.getTime();
+						        // 将毫秒数转换为小时
+						        long diffInHours = diffInMillies / (60 * 60 * 1000);
+						        BigDecimal hours = new BigDecimal(diffInHours);
+						        //组装数据
+						        info = initInfo(ctx,CFEMPLOYEEID, oldCFPROJECTID, date, sdf.format(sdf.parse(CFCLOCKTIME)), null, hours,oldfid+","+fid);
+						        if(!delist.contains(deleteWhere)) {
+						        	delist.add(deleteWhere);
+						        }
+						        coll.add(info);
+							} catch (ParseException ee) {
+								ee.printStackTrace();
+							}
+						}
+					}
+				}
+			}
+		}
+		//删除情况下
+		if(type.equals("update") && delist.size() > 0) {
+			//删除当天
+			for (int i = 0; i < delist.size(); i++) {
+				DbUtil.execute(ctx, " delete from CT_PRO_WorkHoursReport where CFDATASOURCE = 'workHoursCal' and  FBILLSTATE = '3' "
+						+ "and CFFILLINGSTARTDATE = CFFILLINGENDDATE and fid in(select FParentID from CT_PRO_WorkHoursReportentry where "+delist.get(i)+") ");
+				DbUtil.execute(ctx, " delete from CT_PRO_WorkHoursReportentry where "+delist.get(i)+" ");
+			}
+    	}
+		//保存处理-审核通过
+		System.out.println("coll:"+coll.toString());
+    	if(coll.size() > 0) {
+    		for (int i = 0; i < coll.size(); i++) {
+    			info = (WorkHoursReportInfo) coll.get(i);
+    			proidList.add(info.getAffiliatedProject().getId().toString());//项目id
+    			IObjectPK pk = biz.addnew(info);
+    			biz.setAudited(BOSUuid.read(pk.toString())); //-审核通过
+			}
+    	}
+    	
+    	//计算比例
+    	if(proidList.size() > 0) {
+    		for (int i = 0; i < proidList.size(); i++) {
+    			String proid = proidList.get(i);
+    			String sql = " SELECT tt.CFPLANNEDMANDAYS CFPLANNEDMANDAYS,sum(CASE when tt.CFWORKINGHOURS >= 8 THEN 8 ELSE tt.CFWORKINGHOURS END) CFWORKINGHOURS"
+    					+ " FROM  (" + 
+    					" SELECT t2.CFPLANNEDMANDAYS CFPLANNEDMANDAYS ,to_char(t1.CFDATA,'YYYY-MM-DD') CFDATA,sum(t1.CFWORKINGHOURS) CFWORKINGHOURS FROM CT_PRO_WorkHoursReport t" + 
+    					" inner join CT_PRO_WorkHoursReportentry t1 on t1.FPARENTID = t.fid" + 
+    					" inner join CT_PRO_ProjectManagement t2 on t2.fid = t.CFAFFILIATEDPROJEC" + 
+    					" where t.FBILLSTATE = '3' and t2.fid = '"+proid+"'" + 
+    					" group by t2.CFPLANNEDMANDAYS,to_char(t1.CFDATA,'YYYY-MM-DD')" + 
+    					" )tt group by  tt.CFPLANNEDMANDAYS " + 
+    					"";
+    			rs = DbUtil.executeQuery(ctx,sql );
+    			try {
+    				System.out.println("sql:"+sql);
+					if (rs.next()) {
+						BigDecimal FPRODAYCONSUMPTION = BigDecimal.ZERO;
+						BigDecimal CFPLANNEDMANDAYS = rs.getBigDecimal("CFPLANNEDMANDAYS"); //项目总人天
+						BigDecimal CFWORKINGHOURS = rs.getBigDecimal("CFWORKINGHOURS");  //申报人天 已审核通过
+						if(CFPLANNEDMANDAYS.compareTo(FPRODAYCONSUMPTION) == 1
+								&& CFWORKINGHOURS.compareTo(FPRODAYCONSUMPTION) == 1) {
+							//项目总人天除以 申报人天  
+							//申报人天= 总数/8
+							CFWORKINGHOURS = CFWORKINGHOURS.divide(new BigDecimal(8),2,BigDecimal.ROUND_HALF_UP); //8小时 四舍五入 保留2位小数
+							FPRODAYCONSUMPTION = CFWORKINGHOURS.divide(CFPLANNEDMANDAYS,4,BigDecimal.ROUND_HALF_UP);
+							FPRODAYCONSUMPTION = FPRODAYCONSUMPTION.multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP);
+						}
+						DbUtil.execute(ctx, "update CT_PRO_ProjectManagement set FPRODAYCONSUMPTION ="+FPRODAYCONSUMPTION+" where fid = '"+proid+"'");
+					}
+				} catch (SQLException e) {
+					e.printStackTrace();
+				}
+			}
+    	}
+    }
+    
+    /**
+     * 组装工时单据
+     * @param pid
+     * @param proid
+     * @param data
+     * @param ClockTime
+     * @param ClockLocation
+     * @param hours
+     * @return
+     */
+    private WorkHoursReportInfo initInfo(Context ctx,String pid,String proid,Date data,String ClockTime
+    		,String ClockLocation,BigDecimal hours,String ids) {
+    	WorkHoursReportInfo info = new WorkHoursReportInfo();
+    	WorkHoursReportEntryInfo einfo = new WorkHoursReportEntryInfo();
+    	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)); //所属项目
+		info.setHrOrgUnit(pinfo.getHrOrgUnit());
+		info.setCU(pinfo.getCU());
+		info.setDataSource(dataSource.workHoursCal);
+    	info.setAffiliatedProject(proinfo);
+    	info.setBillState(HRBillStateEnum.AUDITED); //审核通过
+    	info.setFillingStartDate(data); //默认当天
+    	info.setFillingEndDate(data); //默认当天
+    	info.setSourceBillId(ids);
+    	einfo.setEmployee(pinfo);
+//    	einfo.setClockLocation("工时计算");
+    	einfo.setClockTime(ClockTime); //打卡时间
+    	einfo.setData(data); //日期
+    	einfo.setWorkingHours(hours); //工时
+    	info.getEntrys().add(einfo);
+    	return info;
+    }
 }

+ 392 - 0
websrc/com/kingdee/eas/custom/server/WorhHoursService.java

@@ -0,0 +1,392 @@
+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<String> keyList = new ArrayList<String>();
+      	IWorkHoursConfirm  biz = WorkHoursConfirmFactory.getLocalInstance(ctx); 
+      	
+      	WorkHoursConfirmInfo wInfo = null;
+      	SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+      	List<WorkHoursConfirmInfo> listInfo = null;
+      	List<String> listproid = new ArrayList<String>();
+      	Map<String,String> mapdate = new HashMap<String,String>();
+      	Map<String,String> mapproid = new HashMap<String,String>();
+      	//存放打卡数据 map
+      	Map<String,List<WorkHoursConfirmInfo>> mapInfo = new HashMap<String,List<WorkHoursConfirmInfo>>();
+      	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 and t3.CFExpectedEndTime >= 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<String,List<String>> proCFCLOCKLOCATION = new HashMap<String,List<String>>();
+  		//人员+年月日 有几个项目
+  		Map<String,List<String>> keypro = new HashMap<String,List<String>>();
+  		
+  		List<String> CFCLOCKLOCATIONList = new ArrayList<String>();
+  		List<String> proList = new ArrayList<String>();
+      	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<String>();
+          			}
+          			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<String>();
+              			}
+          				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 and t3.CFExpectedEndTime >= 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<WorkHoursConfirmInfo>();
+    					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<String> notList = new ArrayList<String>();
+      	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<String> addList = new ArrayList<String>();
+          				List<String> locaProList = new ArrayList<String>();
+          				List<String> idProList = new ArrayList<String>();
+          				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<String> 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<String> addList = new ArrayList<String>();
+      		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<String> addList = new ArrayList<String>();
+	  		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<String,List<String>> 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<String> 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;
+    }
+    
+}

+ 139 - 0
websrc/com/kingdee/eas/hr/project/handler/ProjectChangeEditHandler.java

@@ -0,0 +1,139 @@
+package com.kingdee.eas.hr.project.handler;
+
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
+import com.kingdee.bos.metadata.entity.SelectorItemCollection;
+import com.kingdee.bos.metadata.entity.SelectorItemInfo;
+import com.kingdee.eas.common.EASBizException;
+import com.kingdee.eas.framework.CoreBaseInfo;
+import com.kingdee.eas.hr.project.IProjectChange;
+import com.kingdee.eas.hr.project.IProjectManagement;
+import com.kingdee.eas.hr.project.ProjectChangeFactory;
+import com.kingdee.eas.hr.project.ProjectChangeInfo;
+import com.kingdee.eas.hr.project.ProjectManagementFactory;
+import com.kingdee.eas.hr.project.ProjectManagementInfo;
+import com.kingdee.shr.base.syssetting.context.SHRContext;
+import com.kingdee.shr.base.syssetting.exception.SHRWebException;
+import com.kingdee.shr.base.syssetting.exception.ShrWebBizException;
+import com.kingdee.shr.base.syssetting.web.handler.EditHandler;
+import com.kingdee.shr.common.util.StringUtils;
+import java.util.HashMap;
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.ui.ModelMap;
+
+public class ProjectChangeEditHandler extends EditHandler
+{
+  private static final Logger logger = LoggerFactory.getLogger(ProjectChangeEditHandler.class);
+
+  protected void verifyModel(HttpServletRequest request, HttpServletResponse response, CoreBaseInfo model)
+    throws SHRWebException
+  {
+    try
+    {
+      super.verifyModel(request, response, model);
+      if ((model instanceof ProjectChangeInfo))
+      {
+        ProjectChangeInfo info = (ProjectChangeInfo)model;
+        ObjectUuidPK objectUuidPK = new ObjectUuidPK(info.getChangeProject().getId());
+        IProjectManagement iProjectManagement = ProjectManagementFactory.getRemoteInstance();
+        ProjectManagementInfo projectManagementInfo = iProjectManagement.getProjectManagementInfo(objectUuidPK);
+        if(info.getId() != null ) {
+        	if(projectManagementInfo.isBeingChanged() && !projectManagementInfo.getSourceBillId().equals(info.getId().toString())){
+        		throw new ShrWebBizException("保存失败,项目正在变更,不能二次变更!");
+        	}
+        }else {
+        	if (projectManagementInfo.isBeingChanged()) {
+            	throw new ShrWebBizException("保存失败,项目正在变更,不能二次变更!");
+            }
+        }
+        
+      }
+    } catch (EASBizException e) {
+      e.printStackTrace();
+    } catch (BOSException e) {
+      e.printStackTrace();
+    }
+  }
+
+  public String submitAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap)
+    throws SHRWebException
+  {
+    Context ctx = SHRContext.getInstance().getContext();
+    String billId = request.getParameter("billId");
+    Map result = new HashMap();
+    if (!StringUtils.isEmpty(billId)) {
+      try {
+        IProjectChange iProjectChange = ProjectChangeFactory.getLocalInstance(ctx);
+        ProjectChangeInfo projectChangeInfo = iProjectChange.getProjectChangeInfo("where id = '" + billId + "'");
+        ProjectManagementInfo changeProjectInfo = projectChangeInfo.getChangeProject();
+        changeProjectInfo.setBeingChanged(true);
+        changeProjectInfo.setSourceBillId(projectChangeInfo.getId().toString());
+        IProjectManagement iProjectManagement = ProjectManagementFactory.getLocalInstance(ctx);
+        SelectorItemCollection sic = new SelectorItemCollection();
+        sic.add(new SelectorItemInfo("beingChanged"));
+        sic.add(new SelectorItemInfo("sourceBillId"));
+        iProjectManagement.updatePartial(changeProjectInfo, sic);
+      } catch (Exception var9) {
+        logger.error(var9.getMessage(), var9);
+        throw new ShrWebBizException("项目失败!", var9);
+      }
+    }
+    return super.submitAction(request, response, modelMap);
+  }
+  
+//  public void auditPorjectAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap)
+//    throws SHRWebException, BOSException, EASBizException
+//  {
+//    Context ctx = SHRContext.getInstance().getContext();
+//    String billId = request.getParameter("billId");
+//    Map result = new HashMap();
+//    if (!StringUtils.isEmpty(billId))
+//      try {
+//        IProjectChange iProjectChange = ProjectChangeFactory.getLocalInstance(ctx);
+//        ProjectChangeInfo projectChangeInfo = iProjectChange.getProjectChangeInfo("where id = '" + billId + "'");
+//
+//        BigDecimal chaManDays = projectChangeInfo.getChaManDays();
+//        BigDecimal oriManDays = projectChangeInfo.getOriManDays();
+//        BigDecimal changedManDays = chaManDays.subtract(oriManDays);
+//
+//        ProjectManagementInfo changeProject = projectChangeInfo.getChangeProject();
+//        changeProject.setChangedManDays(changedManDays);
+//        System.out.print("变更人天值赋值成功" + changedManDays);
+//        changeProject.setBeingChanged(false);
+//        System.out.print("是否变更中值为false");
+//
+//        BigDecimal oriManDays2 = projectChangeInfo.getOriManDays();
+//        System.out.print("项目总人天的值获取成功" + oriManDays2);
+//        BigDecimal add = oriManDays2.add(changedManDays);
+//        System.out.print("变更人天的值累加成功" + add);
+//
+//        changeProject.setTotalPersonDays(add);
+//        System.out.print("把累加后的值赋值给项目总人天成功");
+//
+//        IProjectManagement iProjectManagement = ProjectManagementFactory.getLocalInstance(ctx);
+//        SelectorItemCollection sic = new SelectorItemCollection();
+//
+//        sic.add(new SelectorItemInfo("changedManDays"));
+//        sic.add(new SelectorItemInfo("beingChanged"));
+//        System.out.print("变更人天更新成功");
+//
+//        sic.add(new SelectorItemInfo("totalPersonDays"));
+//        System.out.print("项目总人天更新成功成功");
+//
+//        iProjectManagement.updatePartial(changeProject, sic);
+//      } catch (Exception var9) {
+//        logger.error(var9.getMessage(), var9);
+//        throw new ShrWebBizException("审核项目失败!", var9);
+//      }
+//    else {
+//      result.put("errorMsg", "数据异常,billId为空!");
+//    }
+//
+//    JSONUtils.writeJson(response, result);
+//  }
+}

+ 74 - 0
websrc/com/kingdee/eas/hr/project/handler/ProjectChangeListHandler.java

@@ -0,0 +1,74 @@
+package com.kingdee.eas.hr.project.handler;
+
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
+import com.kingdee.bos.metadata.entity.EntityViewInfo;
+import com.kingdee.bos.metadata.entity.FilterInfo;
+import com.kingdee.bos.metadata.entity.FilterItemCollection;
+import com.kingdee.bos.metadata.entity.FilterItemInfo;
+import com.kingdee.bos.metadata.entity.SelectorItemCollection;
+import com.kingdee.bos.metadata.entity.SelectorItemInfo;
+import com.kingdee.bos.metadata.query.util.CompareType;
+import com.kingdee.eas.common.EASBizException;
+import com.kingdee.eas.hr.base.IHRBillBase;
+import com.kingdee.eas.hr.project.IProjectChange;
+import com.kingdee.eas.hr.project.IProjectManagement;
+import com.kingdee.eas.hr.project.ProjectChangeCollection;
+import com.kingdee.eas.hr.project.ProjectChangeFactory;
+import com.kingdee.eas.hr.project.ProjectChangeInfo;
+import com.kingdee.eas.hr.project.ProjectManagementFactory;
+import com.kingdee.eas.hr.project.ProjectManagementInfo;
+import com.kingdee.shr.base.syssetting.context.SHRContext;
+import com.kingdee.shr.base.syssetting.exception.SHRWebException;
+import com.kingdee.shr.base.syssetting.exception.ShrWebBizException;
+import com.kingdee.shr.base.syssetting.web.handler.ListHandler;
+import com.kingdee.util.StringUtils;
+import java.io.PrintStream;
+import java.math.BigDecimal;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.apache.log4j.Logger;
+import org.springframework.ui.ModelMap;
+
+public class ProjectChangeListHandler extends ListHandler
+{
+  private static Logger logger = Logger.getLogger(ProjectChangeListHandler.class);
+  
+  public void abortBillAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap)
+			throws SHRWebException {
+		String billId = this.getBillId(request);
+		if (!StringUtils.isEmpty(billId)) {
+			IHRBillBase iHRBillBase = (IHRBillBase) this.getBizInterface(request);
+			try {
+				iHRBillBase.getHRBillBaseInfo(new ObjectUuidPK(billId));
+				iHRBillBase.abortBizBill(billId);
+				com.kingdee.shr.base.syssetting.web.json.JSONUtils.SUCCESS(billId);
+			} catch (EASBizException var11) {
+				throw new ShrWebBizException("撤回失败!请联系管理员!"+var11.getMessage());
+			} catch (BOSException var12) {
+				throw new SHRWebException(var12.getMessage(), var12);
+			}
+		}
+	}
+
+	public void untiCheckAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap)
+			throws SHRWebException {
+		String billId = this.getBillId(request);
+		if (!StringUtils.isEmpty(billId)) {
+			IHRBillBase iHRBillBase = (IHRBillBase) this.getBizInterface(request);
+
+			try {
+				iHRBillBase.untiCheckBizBill(billId);
+				com.kingdee.shr.base.syssetting.web.json.JSONUtils.SUCCESS(billId);
+			} catch (EASBizException var7) {
+				logger.error(var7.getMessage(), var7);
+				throw new ShrWebBizException(var7.getMessage(), var7);
+			} catch (BOSException var8) {
+				logger.error(var8.getMessage(), var8);
+				throw new SHRWebException(var8);
+			}
+		}
+
+	}
+}

+ 177 - 0
websrc/com/kingdee/eas/hr/project/handler/WorkHoursConfirmListHandler.java

@@ -0,0 +1,177 @@
+package com.kingdee.eas.hr.project.handler;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.log4j.Logger;
+import org.springframework.ui.ModelMap;
+
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
+//import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
+//import com.kingdee.bos.metadata.entity.EntityViewInfo;
+//import com.kingdee.bos.metadata.entity.FilterInfo;
+//import com.kingdee.bos.metadata.entity.FilterItemInfo;
+//import com.kingdee.bos.metadata.entity.SelectorItemCollection;
+//import com.kingdee.bos.metadata.entity.SelectorItemInfo;
+//import com.kingdee.bos.metadata.query.util.CompareType;
+import com.kingdee.eas.common.EASBizException;
+import com.kingdee.eas.custom.server.WorhHoursService;
+import com.kingdee.eas.hr.base.HRBillBaseInfo;
+import com.kingdee.eas.hr.base.IHRBillBase;
+//import com.kingdee.eas.hr.project.IWorkHoursConfirm;
+//import com.kingdee.eas.hr.project.WorkHoursConfirmCollection;
+//import com.kingdee.eas.hr.project.WorkHoursConfirmFactory;
+//import com.kingdee.eas.hr.project.WorkHoursConfirmInfo;
+//import com.kingdee.shr.base.syssetting.api.bean.BatchMessageTipsBody;
+//import com.kingdee.shr.base.syssetting.api.bean.BatchMessageTipsHeader;
+import com.kingdee.shr.base.syssetting.context.SHRContext;
+import com.kingdee.shr.base.syssetting.exception.SHRWebException;
+import com.kingdee.shr.base.syssetting.exception.ShrWebBizException;
+import com.kingdee.shr.base.syssetting.ml.SHRWebResource;
+//import com.kingdee.shr.base.syssetting.exception.ShrWebBizException;
+//import com.kingdee.shr.base.syssetting.util.WebConvertUtils;
+import com.kingdee.shr.base.syssetting.web.handler.ListHandler;
+import com.kingdee.util.StringUtils;
+
+public class WorkHoursConfirmListHandler extends ListHandler
+{
+  private static Logger logger = Logger.getLogger(WorkHoursConfirmListHandler.class);
+  
+//  private WorkHoursConfirmCollection getProject(Context ctx, String billIds, IWorkHoursConfirm biz)
+//    throws BOSException
+//  {
+//    EntityViewInfo evi = new EntityViewInfo();
+//    FilterInfo filter = new FilterInfo();
+//    filter.getFilterItems()
+//      .add(new FilterItemInfo("id", WebConvertUtils.getStringSet(billIds.split(",")), CompareType.INCLUDE));
+//    evi.setFilter(filter);
+//    SelectorItemCollection sic = evi.getSelector();
+//    sic.add(new SelectorItemInfo("billState"));
+//    WorkHoursConfirmCollection coll = biz.getWorkHoursConfirmCollection(evi);
+//    return coll;
+//  }
+//
+//  public void deleteOneAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap)
+//    throws SHRWebException
+//  {
+//    Context ctx = SHRContext.getInstance().getContext();
+//    String billIds = request.getParameter("billId");
+//    BatchMessageTipsHeader batchMessageTipsHeader = new BatchMessageTipsHeader();
+//    int success = 0;
+//    int failure = 0;
+//    String billId = "";
+//    WorkHoursConfirmCollection coll = null;
+//    IWorkHoursConfirm iWorkHoursConfirm  = null;
+//    if (!StringUtils.isEmpty(billIds))
+//    {
+//      try
+//      {
+//         iWorkHoursConfirm = WorkHoursConfirmFactory.getLocalInstance(ctx);
+//        coll = getProject(ctx, billIds, iWorkHoursConfirm);
+//      }
+//      catch (BOSException var17)
+//      {
+//        logger.error(var17.getMessage(), var17);
+//        throw new ShrWebBizException("数据异常!获取项目异常");
+//      }
+//     
+//      int i = 0;
+//
+//      for (int length = coll.size(); i < length; i++) {
+//        WorkHoursConfirmInfo getProject = coll.get(i);
+//        billId = getProject.getId().toString();
+//        BatchMessageTipsBody body = new BatchMessageTipsBody();
+//        body.setId(billId);
+//        try
+//        {
+//          if ((getProject.getBillState() != null) && (getProject.getBillState().getValue() != 0) && 
+//            (getProject.getBillState().getValue() != 4)) {
+//            failure++;
+//            body.setMuitTipsState(Boolean.FALSE.booleanValue());
+//            body.setMuitTipsMessage("只能删除“未提交”和“审批不通过”的项目!");
+//            batchMessageTipsHeader.addResult(body);
+//          } else {
+//            iWorkHoursConfirm.delete(new ObjectUuidPK(billId));
+//            CustomMenuDetailFactory.getLocalInstance(ctx).delete("where businessId ='" + billId + "'");
+//            success++;
+//            body.setMuitTipsState(Boolean.TRUE.booleanValue());
+//            body.setMuitTipsMessage("删除成功!");
+//            batchMessageTipsHeader.addResult(body);
+//          }
+//        } catch (EASBizException var18) {
+//          logger.error(var18.getMessage(), var18);
+//          failure++;
+//          body.setMuitTipsState(Boolean.FALSE.booleanValue());
+//          body.setMuitTipsMessage("删除失败!" + var18.getMessage());
+//          batchMessageTipsHeader.addResult(body);
+//        } catch (BOSException var19) {
+//          logger.error(var19.getMessage(), var19);
+//          failure++;
+//          body.setMuitTipsState(Boolean.FALSE.booleanValue());
+//          body.setMuitTipsMessage("删除失败!" + var19.getMessage());
+//          batchMessageTipsHeader.addResult(body);
+//        }
+//      }
+//    }
+//
+//    batchMessageTipsHeader.setBillId(billIds);
+//    batchMessageTipsHeader.setFailureCount(failure);
+//    batchMessageTipsHeader.setSuccessCount(success);
+//    writeSuccessData(batchMessageTipsHeader);
+//  }
+//  
+  public void initWorkHoursAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap)
+		    throws SHRWebException
+  {
+	  Context ctx = SHRContext.getInstance().getContext();
+	  WorhHoursService sever = new WorhHoursService();
+	  try {
+		sever.process(ctx, null);
+	} catch (EASBizException e) {
+		e.printStackTrace();
+	} catch (BOSException e) {
+		e.printStackTrace();
+	}
+	  
+  }
+  
+	public void abortBillAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap)
+			throws SHRWebException {
+		String billId = this.getBillId(request);
+		if (!StringUtils.isEmpty(billId)) {
+			IHRBillBase iHRBillBase = (IHRBillBase) this.getBizInterface(request);
+			try {
+				iHRBillBase.getHRBillBaseInfo(new ObjectUuidPK(billId));
+				iHRBillBase.abortBizBill(billId);
+				com.kingdee.shr.base.syssetting.web.json.JSONUtils.SUCCESS(billId);
+			} catch (EASBizException var11) {
+				throw new ShrWebBizException("撤回失败!请联系管理员!"+var11.getMessage());
+			} catch (BOSException var12) {
+				throw new SHRWebException(var12.getMessage(), var12);
+			}
+		}
+	}
+
+	public void untiCheckAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap)
+			throws SHRWebException {
+		String billId = this.getBillId(request);
+		if (!StringUtils.isEmpty(billId)) {
+			IHRBillBase iHRBillBase = (IHRBillBase) this.getBizInterface(request);
+
+			try {
+				iHRBillBase.untiCheckBizBill(billId);
+				com.kingdee.shr.base.syssetting.web.json.JSONUtils.SUCCESS(billId);
+			} catch (EASBizException var7) {
+				logger.error(var7.getMessage(), var7);
+				throw new ShrWebBizException(var7.getMessage(), var7);
+			} catch (BOSException var8) {
+				logger.error(var8.getMessage(), var8);
+				throw new SHRWebException(var8);
+			}
+		}
+
+	}
+  
+}

+ 41 - 0
websrc/com/kingdee/eas/hr/project/handler/WorkHoursReportListHandler.java

@@ -8,13 +8,17 @@ import org.springframework.ui.ModelMap;
 
 import com.kingdee.bos.BOSException;
 import com.kingdee.bos.Context;
+import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
 import com.kingdee.eas.common.EASBizException;
+import com.kingdee.eas.hr.base.IHRBillBase;
 import com.kingdee.eas.hr.project.WorkHoursFacadeFactory;
 import com.kingdee.shr.base.syssetting.api.bean.BatchMessageTipsBody;
 import com.kingdee.shr.base.syssetting.api.bean.BatchMessageTipsHeader;
 import com.kingdee.shr.base.syssetting.context.SHRContext;
 import com.kingdee.shr.base.syssetting.exception.SHRWebException;
+import com.kingdee.shr.base.syssetting.exception.ShrWebBizException;
 import com.kingdee.shr.base.syssetting.web.handler.ListHandler;
+import com.kingdee.util.StringUtils;
 
 public class WorkHoursReportListHandler extends ListHandler {
 
@@ -60,4 +64,41 @@ public class WorkHoursReportListHandler extends ListHandler {
 		batchMessageTipsHeader.setSuccessCount(success);
 		this.writeSuccessData(batchMessageTipsHeader);
 	}
+	
+	public void abortBillAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap)
+			throws SHRWebException {
+		String billId = this.getBillId(request);
+		if (!StringUtils.isEmpty(billId)) {
+			IHRBillBase iHRBillBase = (IHRBillBase) this.getBizInterface(request);
+			try {
+				iHRBillBase.getHRBillBaseInfo(new ObjectUuidPK(billId));
+				iHRBillBase.abortBizBill(billId);
+				com.kingdee.shr.base.syssetting.web.json.JSONUtils.SUCCESS(billId);
+			} catch (EASBizException var11) {
+				throw new ShrWebBizException("撤回失败!请联系管理员!"+var11.getMessage());
+			} catch (BOSException var12) {
+				throw new SHRWebException(var12.getMessage(), var12);
+			}
+		}
+	}
+
+	public void untiCheckAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap)
+			throws SHRWebException {
+		String billId = this.getBillId(request);
+		if (!StringUtils.isEmpty(billId)) {
+			IHRBillBase iHRBillBase = (IHRBillBase) this.getBizInterface(request);
+
+			try {
+				iHRBillBase.untiCheckBizBill(billId);
+				com.kingdee.shr.base.syssetting.web.json.JSONUtils.SUCCESS(billId);
+			} catch (EASBizException var7) {
+				logger.error(var7.getMessage(), var7);
+				throw new ShrWebBizException(var7.getMessage(), var7);
+			} catch (BOSException var8) {
+				logger.error(var8.getMessage(), var8);
+				throw new SHRWebException(var8);
+			}
+		}
+
+	}
 }