9060 пре 1 месец
родитељ
комит
467bec70c2

+ 43 - 11
GDYSL/js/shr/addon/customer/web/js/atsOverTimeBillBatchEditEx.js

@@ -4,27 +4,28 @@ shr.defineClass("shr.customer.gtiit.AtsOverTimeBillBatchEditEx", shr.ats.AtsOver
         shr.customer.gtiit.AtsOverTimeBillBatchEditEx.superClass.initalizeDOM.call(this);
         var that = this;
         var entries_cont = waf("#entries");
-        // var colModel = entries_cont.getGridParam().colModel;
-        // for(var i=0;i<colModel.length;i++){
-        //    var model = colModel[i];
-        //     if("startTime"==model.name||"endTime"==model.name||"restStartTime"==model.name||"restEndTime"==model.name){
-        //         model.width=130;
-        //         model.widthOrg=130;
-        //     }
-        // }
         entries_cont.jqGrid("option", {
              
             onChange: function (rowid, cellname, value, iRow, iCol) {
                 console.log(rowid, cellname, value, iRow, iCol, 123123);
             },
+              // 其他配置...
+            beforeEditCell: function (rowid, cellname, value, iRow, iCol) {
+                console.log("进入编辑前:", rowid, cellname, value, iRow, iCol);
+               
+            },
+   
             beforeSaveCell: function (
                 rowid,
                 cellname,
                 value,
                 iRow,
                 iCol
-            ) {},
+            ) {
+               
+            },
             afterSaveCell: function (rowid, cellname, value, iRow, iCol) {
+          
                 if (value["adminOrgUnit.id"]) {
                     $("#entries").jqGrid(
                         "setCell",
@@ -277,7 +278,38 @@ shr.defineClass("shr.customer.gtiit.AtsOverTimeBillBatchEditEx", shr.ats.AtsOver
 
             }
         });
-         $("#entries").setGridParam({colModel:colModel});
+       this.updateCalWidth();
+    },
+    updateCalWidth:function(inWidth){
+        // 获取jqGrid的引用
+        var $grid = $("#entries");
+        // 获取列模型
+        var colModel = $grid.jqGrid('getGridParam', 'colModel');
+        
+        // 找到 'startTime' 列的索引
+        var columnIndex = -1;
+        $.each(colModel, function (i, col) {
+            if (col.name === 'startTime' || col.name === 'endTime' 
+                || col.name === 'restStartTime' || col.name === 'restEndTime' 
+                || col.name === 'restStartTime2' || col.name === 'restEndTime2'
+                || col.name === 'realStartTime' || col.name === 'realEndTime') {
+                columnIndex = i;
+                // 设置新的列宽
+                var newWidth = inWidth?inWidth:75; // 新的宽度值
+            
+                // 调整列标题的宽度
+                $('.ui-jqgrid-labels > th:eq(' + columnIndex + ')').css('width', newWidth + 'px');
+            
+                // 调整列内容的宽度
+                $grid.find('tbody tr').each(function () {
+                    var $td = $(this).find('td:eq(' + columnIndex + ')');
+                    $td.css('width', newWidth + 'px');
+                });
+            
+                // 调整jqGrid的列宽(确保jqGrid内部状态更新)
+                $grid.jqGrid('setColProp', col.name, { width: newWidth });
+            }
+        });
     },
     calculateOTtimes: function (rowid) {
         var startTime = $("#entries").jqGrid("getCell", rowid, "startTime");
@@ -679,7 +711,7 @@ waf.defineCustomeClass("cellformatter.shrTextArea", cellformatter.defaultFormatt
     },
     format: function (cellval, rwd) {
         if (!$.type.isEmpty(cellval)) {
-            return "<pre class='required' style='color:rgb(153, 153, 153)'>" + cellval + "</pre>";
+            return "<pre class='required' style='width:98%;color:rgb(153, 153, 153)'>" + cellval + "</pre>";
         } else {
             return cellformatter.defaultFormatter.prototype.format.call(this, cellval, rwd);
         }

+ 46 - 3
GDYSL/js/shr/addon/customer/web/js/atsOverTimeBillBatchEditForPerEx.js

@@ -9,8 +9,18 @@ shr.defineClass("shr.customer.gtiit.AtsOverTimeBillBatchEditForPerEx", shr.ats.a
         var entries_cont=waf("#entries");
         entries_cont.jqGrid("option", { 
               beforeSaveCell:function (rowid, cellname, value, iRow, iCol) {
-              }
-              ,afterSaveCell:function (rowid, cellname, value, iRow, iCol) {
+                  
+              },
+             beforeEditCell: function (rowid, cellname, value, iRow, iCol) {
+        console.log("进入编辑前:", rowid, cellname, value, iRow, iCol);
+       
+    },
+    afterEditCell: function (rowid, cellname, value, iRow, iCol) {
+        console.log("进入编辑后:", rowid, cellname, value, iRow, iCol);
+        // 在这里可以进行一些后续操作,如设置焦点
+        // that.updateCalWidth(90)
+    },
+              afterSaveCell:function (rowid, cellname, value, iRow, iCol) {
 
                   if(value["adminOrgUnit.id"]){
                         $("#entries").jqGrid('setCell',rowid,"adminOrgUnit.id",value["adminOrgUnit.id"]);
@@ -60,6 +70,39 @@ shr.defineClass("shr.customer.gtiit.AtsOverTimeBillBatchEditForPerEx", shr.ats.a
                 _self.saveEditCellValue(rowid,cellname, value,iRow,iCol) ;
               }
         });
+        
+    this.updateCalWidth();
+    },
+    updateCalWidth:function(inWidth){
+        // 获取jqGrid的引用
+        var $grid = $("#entries");
+        // 获取列模型
+        var colModel = $grid.jqGrid('getGridParam', 'colModel');
+        
+        // 找到 'startTime' 列的索引
+        var columnIndex = -1;
+        $.each(colModel, function (i, col) {
+            if (col.name === 'startTime' || col.name === 'endTime' 
+                || col.name === 'restStartTime' || col.name === 'restEndTime' 
+                || col.name === 'restStartTime2' || col.name === 'restEndTime2'
+                || col.name === 'realStartTime' || col.name === 'realEndTime') {
+                columnIndex = i;
+                // 设置新的列宽
+                var newWidth = inWidth?inWidth:75; // 新的宽度值
+            
+                // 调整列标题的宽度
+                $('.ui-jqgrid-labels > th:eq(' + columnIndex + ')').css('width', newWidth + 'px');
+            
+                // 调整列内容的宽度
+                $grid.find('tbody tr').each(function () {
+                    var $td = $(this).find('td:eq(' + columnIndex + ')');
+                    $td.css('width', newWidth + 'px');
+                });
+            
+                // 调整jqGrid的列宽(确保jqGrid内部状态更新)
+                $grid.jqGrid('setColProp', col.name, { width: newWidth });
+            }
+        });
     },
     afterSaveCellTrigger: function(rowid, cellname, value, iRow, iCol)
     {   
@@ -451,7 +494,7 @@ waf.defineCustomeClass("cellformatter.shrTextArea", cellformatter.defaultFormatt
     },
     format: function (cellval, rwd) {
         if (!$.type.isEmpty(cellval)) {
-            return "<pre class='required' style='color:rgb(153, 153, 153)'>" + cellval + "</pre>";
+            return "<pre class='required' style='width:98%;color:rgb(153, 153, 153)'>" + cellval + "</pre>";
         } else {
             return cellformatter.defaultFormatter.prototype.format.call(this, cellval, rwd);
         }

+ 173 - 0
GDYSL/websrc/com/kingdee/shr/customer/gtiit/handler/AtsOverTimeBillListHandlerEx.java

@@ -0,0 +1,173 @@
+package com.kingdee.shr.customer.gtiit.handler;
+
+import com.google.common.collect.Lists;
+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.eas.basedata.person.PersonInfo;
+import com.kingdee.eas.common.EASBizException;
+import com.kingdee.eas.framework.CoreBaseInfo;
+import com.kingdee.eas.hr.ats.*;
+import com.kingdee.eas.util.app.DbUtil;
+import com.kingdee.jdbc.rowset.IRowSet;
+import com.kingdee.shr.ats.web.handler.AtsOverTimeBillListHandler;
+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.json.JSONUtils;
+import org.springframework.ui.ModelMap;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.sql.SQLException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * description: AtsOverTimeBillListHandlerEx <br>
+ * date: 2025/3/31 10:11 <br>
+ * author: lhbj <br>
+ * version: 1.0 <br>
+ */
+public class AtsOverTimeBillListHandlerEx extends AtsOverTimeBillListHandler {
+
+
+    public void submitEffectAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws SHRWebException, BOSException {
+        Context ctx = SHRContext.getInstance().getContext();
+        String billIds = request.getParameter("billId");
+        String[] billIsArr = billIds.split(",");
+        HashMap res = new HashMap();
+        boolean bool = false;
+        StringBuilder msg = new StringBuilder();
+        try {
+            IAtsOverTimeBill iaAtsOverTimeBill = AtsOverTimeBillFactory.getLocalInstance(ctx);
+            SelectorItemCollection selectorItemCollection = new SelectorItemCollection();
+            selectorItemCollection.add("id");
+            selectorItemCollection.add("entries.otDate");
+            selectorItemCollection.add("entries.person.id");
+            for(String id : billIsArr){
+                AtsOverTimeBillInfo ats = iaAtsOverTimeBill.getAtsOverTimeBillInfo(new ObjectUuidPK(id),selectorItemCollection);
+                msg.append(this.checkOnlyTakeOneBill(ctx,ats,billIsArr));
+
+            }
+            if (msg.length()<=0) {
+                super.submitAction(request, response, modelMap);
+            }else {
+                int submitNum = billIsArr.length;
+                res.put("submitNum", submitNum);
+                res.put("submitSuccessNum", 0);
+                JSONUtils.writeJson(response, res);
+            }
+        } catch (BOSException | EASBizException e) {
+            e.printStackTrace();
+        }
+    }
+    public String submitAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws SHRWebException {
+        Context ctx = SHRContext.getInstance().getContext();
+        String billIds = request.getParameter("billId");
+        String[] billIsArr = billIds.split(",");
+        HashMap res = new HashMap();
+        res.put("alreadyInProcessQueueException", 0);
+        boolean bool = false;
+        StringBuilder msg = new StringBuilder();
+        try {
+            IAtsOverTimeBill iaAtsOverTimeBill = AtsOverTimeBillFactory.getLocalInstance(ctx);
+            SelectorItemCollection selectorItemCollection = new SelectorItemCollection();
+            selectorItemCollection.add("id");
+            selectorItemCollection.add("entries.otDate");
+            selectorItemCollection.add("entries.person");
+            selectorItemCollection.add("entries.person.id");
+            selectorItemCollection.add("entries.person.name");
+            for(String id : billIsArr){
+                AtsOverTimeBillInfo ats = iaAtsOverTimeBill.getAtsOverTimeBillInfo(new ObjectUuidPK(id),selectorItemCollection);
+                msg.append(this.checkOnlyTakeOneBill(ctx,ats,billIsArr));
+
+            }
+            if (msg.length()<=0) {
+                super.submitAction(request, response, modelMap);
+            }else {
+                int submitNum = billIsArr.length;
+                res.put("submitNum", submitNum);
+                res.put("submitSuccessNum", 0);
+                JSONUtils.writeJson(response, res);
+            }
+        } catch (BOSException | EASBizException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+    /**
+     * 一位员工每个自然月只能提一张加班单校验
+     * @param ctx
+     * @param model
+     */
+    protected StringBuilder checkOnlyTakeOneBill(Context ctx, CoreBaseInfo model,String[] billIsArr) throws ShrWebBizException {
+        boolean bool = true;
+        StringBuilder msg = new StringBuilder();
+        try {
+            AtsOverTimeBillInfo billInfo = (AtsOverTimeBillInfo) model;
+            AtsOverTimeBillEntryCollection entries = billInfo.getEntries();
+            StringBuilder sql = new StringBuilder();
+            sql.append(" select count(b.fid) lens,e.fpersonid from T_HR_ATS_OVERTIMEBILL b  ");
+            sql.append(" left join T_HR_ATS_OVERTIMEBILLentry e on b.fid= e.fbillid ");
+            sql.append(" where b.fbillstate != '4' ");
+            sql.append(" and to_char(e.fotdate,'yyyy-MM-dd')>= ? and to_char(e.fotdate,'yyyy-MM-dd')<= ? ");
+            List<String> list = Lists.newArrayList();
+            list.add("");
+            list.add("");
+            if(null!=billIsArr) {
+                sql.append(" or b.fid in(''");
+                for (int i = 0; i < billIsArr.length; i++) {
+                    sql.append(",?");
+                    list.add(billIsArr[i]);
+                }
+                sql.append(" ) ");
+            }
+            sql.append(" group by e.fpersonid ");
+            System.out.println("checkOnlyTakeOneBill:"+sql.toString());
+            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
+            BigDecimal one = BigDecimal.ONE;
+            for (int i = 0; i < entries.size(); i++) {
+                AtsOverTimeBillEntryInfo ats = entries.get(i);
+                Date otdate = ats.getOtDate();
+                PersonInfo personInfo = ats.getPerson();
+                Calendar calendar = Calendar.getInstance();
+                calendar.setTime(otdate);
+                calendar.set(Calendar.DAY_OF_MONTH, 1);
+                String fotdate1 = sf.format(calendar.getTime());
+                calendar.add(Calendar.MONTH, 1);
+                calendar.add(Calendar.DAY_OF_MONTH, -1);
+                String fotdate2 = sf.format(calendar.getTime());
+                list.set(0,fotdate1);
+                list.set(1,fotdate2);
+                System.out.println("checkOnlyTakeOneBill_values:"+list.toString());
+                IRowSet rs = DbUtil.executeQuery(ctx, sql.toString(), list.toArray());
+                while (rs.next()){
+                    String fpersonid = rs.getString("fpersonid");
+                    BigDecimal lens = rs.getBigDecimal("lens");
+                    System.out.println("checkOnlyTakeOneBill_fpersonid:"+fpersonid);
+                    System.out.println("checkOnlyTakeOneBill_personid:"+personInfo.getId().toString());
+                    System.out.println("checkOnlyTakeOneBill_lens:"+lens.toString());
+                    System.out.println("checkOnlyTakeOneBill_one:"+one.toString());
+                    if(fpersonid.equals(personInfo.getId().toString()) && one.compareTo(lens) <= 0){
+                        bool=false;
+                        msg.append("Each employee can apply for overtime only once per natural month.Employee ("+personInfo.getName()+") has already applied.\r\n");
+                        System.out.println("checkOnlyTakeOneBill_msg:"+msg.toString());
+                        break;
+                    }
+                }
+            }
+        }catch (BOSException | SQLException e){
+            e.printStackTrace();
+            bool=false;
+        }finally {
+
+        }
+        return msg;
+    }
+}

+ 307 - 0
GDYSL/websrc/com/kingdee/shr/customer/gtiit/handler/PerAtsOverTimeBillBatchEditHandlerTestEx.java

@@ -0,0 +1,307 @@
+package com.kingdee.shr.customer.gtiit.handler;
+
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.Context;
+import com.kingdee.eas.basedata.person.PersonInfo;
+import com.kingdee.eas.framework.CoreBaseInfo;
+import com.kingdee.eas.hr.ats.AtsOverTimeBillEntryCollection;
+import com.kingdee.eas.hr.ats.AtsOverTimeBillEntryInfo;
+import com.kingdee.eas.hr.ats.AtsOverTimeBillInfo;
+import com.kingdee.eas.hr.ats.AttendFileStateEnum;
+import com.kingdee.eas.util.app.DbUtil;
+import com.kingdee.jdbc.rowset.IRowSet;
+import com.kingdee.shr.ats.web.handler.PerAtsOverTimeBillBatchEditHandler;
+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.json.JSONUtils;
+import com.kingdee.shr.customer.gtiit.util.BaseUtil;
+import com.kingdee.shr.customer.gtiit.util.DateTimeUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.log4j.Logger;
+import org.springframework.ui.ModelMap;
+import org.springframework.util.LinkedMultiValueMap;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.sql.SQLException;
+import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.LocalTime;
+import java.time.ZoneId;
+import java.util.*;
+
+/**
+ * test
+ */
+public class PerAtsOverTimeBillBatchEditHandlerTestEx extends PerAtsOverTimeBillBatchEditHandler {
+	private static Logger logger = Logger
+			.getLogger("com.kingdee.shr.customer.gtiit.handler.PerAtsOverTimeBillBatchEditHandlerExExEx");
+
+
+	public void workMultipleAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap)
+			throws SHRWebException {
+		Context ctx = SHRContext.getInstance().getContext();
+		String otDate = request.getParameter("otDate");
+		logger.error("加班日期:" + otDate);
+		String sql = "SELECT b.CFWORKMULTIPLE FROM T_HR_ATS_LegalHoliday a left join T_HR_ATS_LegalHolidayItem b on a.fid = b.FGROUPID where a.FSTATE = '1' and b.FSTARTDATE <= '"
+				+ otDate + "' and b.FENDDATE >= '" + otDate + "'";
+		logger.error("查询加班类型SQL:" + sql);
+		Map<String, Map<String, String>> overTimeTypeMap = BaseUtil.getOverTimeType(ctx);
+		Map<String, String> returnMap = new HashMap<String, String>();
+		try {
+			IRowSet iRowSet = DbUtil.executeQuery(ctx, sql);
+			while (iRowSet.next()) {
+				if (iRowSet.getString("CFWORKMULTIPLE").equals("1")) {
+					// 工作日加班
+					returnMap = overTimeTypeMap.get("001");
+				} else if (iRowSet.getString("CFWORKMULTIPLE").equals("2")) {
+					// 休息日加班
+					returnMap = overTimeTypeMap.get("002");
+				} else if (iRowSet.getString("CFWORKMULTIPLE").equals("3")) {
+					// 法定节假日加班
+					returnMap = overTimeTypeMap.get("003");
+				}
+			}
+		} catch (BOSException e) {
+			e.printStackTrace();
+		} catch (SQLException throwables) {
+			throwables.printStackTrace();
+		}
+		JSONUtils.writeJson(response, returnMap);
+	}
+
+	public void jobTypeAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap)
+			throws SHRWebException {
+		Calendar calendar = Calendar.getInstance();
+		Context ctx = SHRContext.getInstance().getContext();
+		Map<String, Map<String, String>> overTimeTypeMap = BaseUtil.getOverTimeType(ctx);
+		Map<String, String> returnMap = new HashMap<String, String>();
+		String otDate = request.getParameter("otDate");
+		logger.error("加班日期:" + otDate);
+		Date parseDate = DateTimeUtils.parseDate(otDate, "yyyy-MM-dd");
+		calendar.setTime(parseDate);
+		int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
+		if (dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY) {
+			// 休息日加班
+			returnMap = overTimeTypeMap.get("002");
+		} else {
+			// 工作日加班
+			returnMap = overTimeTypeMap.get("001");
+		}
+		JSONUtils.writeJson(response, returnMap);
+	}
+
+	@Override
+	protected void verifyModel(HttpServletRequest request, HttpServletResponse response, CoreBaseInfo model)
+			throws SHRWebException {
+		super.verifyModel(request, response, model);
+
+		checkOverTime(model);
+		checkCompensate(model);
+		//增加一位员工每个自然月只能提一张加班单校验
+		checkOnlyTakeOneBill(request, response, model);
+	}
+
+	@Override
+	protected void beforeSubmit(HttpServletRequest request, HttpServletResponse response, CoreBaseInfo model)
+			throws SHRWebException {
+		super.beforeSubmit(request, response, model);
+		//增加一位员工每个自然月只能提一张加班单校验
+		checkOnlyTakeOneBill(request, response, model);
+		checkOverTime(model);
+		checkCompensate(model);
+	}
+
+	private void checkCompensate(CoreBaseInfo model) throws ShrWebBizException {
+		Context ctx = SHRContext.getInstance().getContext();
+		AtsOverTimeBillInfo billInfo = (AtsOverTimeBillInfo) model;
+		AtsOverTimeBillEntryCollection entries = billInfo.getEntries();
+
+		Set<String> personIdSet = new HashSet<String>();
+		String compenSql = "select fid from T_HR_ATS_OverTimeCompens where fnumber='002'";
+		String compenId = "";
+		try {
+			IRowSet compenRowSet = DbUtil.executeQuery(ctx, compenSql);
+			if (compenRowSet.next()) {
+				compenId = compenRowSet.getString("fid");
+			}
+		} catch (SQLException e1) {
+			e1.printStackTrace();
+		} catch (BOSException e) {
+			e.printStackTrace();
+		}
+		for (int i = 0; i < entries.size(); i++) {
+			AtsOverTimeBillEntryInfo entryInfo = entries.get(i);
+			if (StringUtils.equals(entryInfo.getOtCompens().getId().toString(), compenId)) {
+				personIdSet.add(entryInfo.getPerson().getId().toString());
+			}
+		}
+		logger.error("员工ID集合:" + personIdSet.toString());
+		StringBuffer strBuffer = new StringBuffer();
+		for (String personId : personIdSet) {
+			strBuffer.append("'" + personId + "',");
+		}
+
+		if (strBuffer.length() > 0) {
+			strBuffer = strBuffer.deleteCharAt(strBuffer.length() - 1);
+			Map<String, String> personIdByNameMap = BaseUtil.getPersonIdByName(ctx, personIdSet);
+			String sql = "SELECT p.fid,emp.jobgradename FROM t_bd_person p "
+					+ "left join (select gra.fname_l2 jobgradename,e.fpersonid from "
+					+ "(SELECT FPERSONID,max(fleffdt) as maxDate FROM T_HR_EmpPostExperienceHis group by  FPERSONID) as h "
+					+ "left join T_HR_EmpPostExperienceHis e on e.fpersonid= h.FPERSONID and fleffdt = h.maxDate "
+					+ "left join (SELECT * FROM T_HR_EmpPostRank where fislatest='1') r on r.fpersonid = e.fpersonid "
+					+ "left join T_HR_JobGrade gra on gra.fid=r.fjobgradeid) emp on p.fid=emp.fpersonid "
+					+ "where p.fid in (" + strBuffer.toString() + ")";
+			try {
+				IRowSet rowSet = DbUtil.executeQuery(ctx, sql);
+				while (rowSet.next()) {
+					String jobGradeName = rowSet.getString("jobgradename");
+					if (StringUtils.isNotBlank(jobGradeName)) {
+						jobGradeName = jobGradeName.replace("L", "");
+						int gradeLevel = Integer.parseInt(jobGradeName);
+						if (gradeLevel >= 8) {
+							throw new ShrWebBizException("Employee (" + personIdByNameMap.get(rowSet.getString("fid"))
+									+ ") with a rank greater than or equal to L8 is not allowed to submit overtime compensation forms with overtime pay as the compensation type");
+						}
+					}
+				}
+
+				String personTypeSql = "SELECT a.fid,e.fnumber FROM T_BD_Person a "
+						+ "left join (select b.fpersonid,c.CFWorkercategoryID from (SELECT FPERSONID,max(FEFFDT) as maxDate FROM T_HR_EmpOrgRelation where fassignType = '1' group by FPERSONID) b "
+						+ "left join T_HR_EmpOrgRelation c on b.fpersonid = c.fpersonid and b.maxdate=c.FEFFDT and c.fassignType = '1') d on a.fid=d.fpersonid "
+						+ "left join CT_MP_WorkerCategory e on e.fid=d.CFWorkercategoryID " + "where a.fid in ("
+						+ strBuffer.toString() + ")";
+				IRowSet personTypeRow = DbUtil.executeQuery(ctx, personTypeSql);
+				while (personTypeRow.next()) {
+					String workCategoryNumber = personTypeRow.getString("fnumber");
+					if (StringUtils.equals("GTIIT_FACULTY", workCategoryNumber)
+							|| StringUtils.equals("GTIIT_OTHER", workCategoryNumber)) {
+						throw new ShrWebBizException("Employee ("
+								+ personIdByNameMap.get(personTypeRow.getString("fid"))
+								+ ") is an academic staff member and cannot submit overtime compensation forms with overtime pay as the compensation method");
+					}
+				}
+			} catch (BOSException e) {
+				e.printStackTrace();
+			} catch (SQLException e) {
+				e.printStackTrace();
+			}
+
+		}
+
+	}
+
+	private void checkOverTime(CoreBaseInfo model) throws ShrWebBizException {
+		Context ctx = SHRContext.getInstance().getContext();
+		AtsOverTimeBillInfo billInfo = (AtsOverTimeBillInfo) model;
+		AtsOverTimeBillEntryCollection entries = billInfo.getEntries();
+		LinkedMultiValueMap<String, Map<String, Date>> multiMap = new LinkedMultiValueMap<>();
+		StringBuffer personIdBuffer = new StringBuffer();
+		for (int i = 0; i < entries.size(); i++) {
+			AtsOverTimeBillEntryInfo entryInfo = entries.get(i);
+			if (!entryInfo.getOtType().getString("id").equals("rBy0u1YgQ9C1OxcM85mxyY6C/nU=")) {
+				continue;
+			}
+			Date otDate = entryInfo.getOtDate();
+			String dateFormat = DateTimeUtils.dateFormat(otDate, "yyyy-MM-dd");
+			String sql = "SELECT b.CFWORKMULTIPLE FROM T_HR_ATS_LegalHoliday a left join T_HR_ATS_LegalHolidayItem b on a.fid = b.FGROUPID where a.FSTATE = '1' and b.FSTARTDATE <= '"
+					+ dateFormat + "' and b.FENDDATE >= '" + dateFormat + "'";
+			try {
+				IRowSet iRowSet = DbUtil.executeQuery(ctx, sql);
+				if (iRowSet.next()) {
+					continue;
+				}
+			} catch (BOSException e) {
+				e.printStackTrace();
+			} catch (SQLException e) {
+				e.printStackTrace();
+			}
+			Map<String, Date> map = new HashMap<>();
+			map.put("startTime", entryInfo.getStartTime());
+			map.put("endTime", entryInfo.getEndTime());
+			multiMap.add(entryInfo.getPerson().getString("id"), map);
+			personIdBuffer.append("'" + entryInfo.getPerson().getString("id") + "',");
+		}
+		Map<String, String> personIdByNameMap = BaseUtil.getPersonIdByName(ctx, multiMap.keySet());
+		if (personIdBuffer.length() > 0) {
+			String sql = "SELECT a.FPROPOSERID,c.FRESTPRETIME,c.FRESTNEXTTIME FROM T_HR_ATS_AttendanceFile a left join T_HR_ATS_Shift b on a.FATSSHIFTID = b.fid left join T_HR_ATS_ShiftItem c on c.FGROUPID = b.fid "
+					+ "where FPROPOSERID in (" + personIdBuffer.deleteCharAt(personIdBuffer.length() - 1)
+					+ ") and  a.FATTENDFILESTATE = '" + AttendFileStateEnum.ENABLE_VALUE + "'";
+			try {
+				IRowSet rowSet = DbUtil.executeQuery(ctx, sql);
+				while (rowSet.next()) {
+					String personId = rowSet.getString("FPROPOSERID");
+					String restStart = rowSet.getObject("FRESTPRETIME") == null ? "12:00"
+							: rowSet.getString("FRESTPRETIME");
+					String restEnd = rowSet.getObject("FRESTNEXTTIME") == null ? "13:30"
+							: rowSet.getString("FRESTNEXTTIME");
+					List<Map<String, Date>> list = multiMap.get(personId);
+					for (Map<String, Date> dateMap : list) {
+						Date startTime = dateMap.get("startTime");
+						Date endTime = dateMap.get("endTime");
+						Instant startInstant = startTime.toInstant();
+						Instant endInstant = endTime.toInstant();
+						LocalTime startLocalTime = startInstant.atZone(ZoneId.systemDefault()).toLocalTime();
+						LocalTime endLocalTime = endInstant.atZone(ZoneId.systemDefault()).toLocalTime();
+
+						LocalTime shiftStartTime = LocalTime.parse(restStart);
+						LocalTime shiftendTime = LocalTime.parse(restEnd);
+						if (startLocalTime.compareTo(shiftendTime) >= 0
+								|| endLocalTime.compareTo(shiftStartTime) <= 0) {
+							continue;
+						}
+						if ((startLocalTime.compareTo(shiftStartTime) >= 0
+								&& startLocalTime.compareTo(shiftendTime) <= 0)
+								|| (endLocalTime.compareTo(shiftStartTime) >= 0
+								&& endLocalTime.compareTo(shiftendTime) <= 0)) {
+							throw new ShrWebBizException("Employee (" + personIdByNameMap.get(personId)
+									+ ") cannot work overtime during rest time on weekdays");
+						}
+					}
+				}
+			} catch (BOSException e) {
+				e.printStackTrace();
+			} catch (SQLException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+
+	/**
+	 * 一位员工每个自然月只能提一张加班单校验
+	 * @param request
+	 * @param response
+	 * @param model
+	 */
+	protected void checkOnlyTakeOneBill(HttpServletRequest request, HttpServletResponse response, CoreBaseInfo model) throws ShrWebBizException {
+		Context ctx = SHRContext.getInstance().getContext();
+		try {
+			AtsOverTimeBillInfo billInfo = (AtsOverTimeBillInfo) model;
+			AtsOverTimeBillEntryCollection entries = billInfo.getEntries();
+			StringBuilder sql = new StringBuilder(" select e.fid from T_HR_ATS_OVERTIMEBILL b ");
+			sql.append(" left join T_HR_ATS_OVERTIMEBILLentry e on b.fid= e.fbillid ");
+			sql.append(" where e.fpersonid=? and b.fbillstate in ('1','2','3') and to_char(e.fotdate,'yyyy-MM-dd')>= ? and to_char(e.fotdate,'yyyy-MM-dd')<= ? ");
+			SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
+			for (int i = 0; i < entries.size(); i++) {
+				AtsOverTimeBillEntryInfo ats = entries.get(i);
+				Date otdate = ats.getOtDate();
+				PersonInfo personInfo = ats.getPerson();
+				Calendar calendar = Calendar.getInstance();
+				calendar.setTime(otdate);
+				calendar.set(Calendar.DAY_OF_MONTH, 1);
+				String fotdate1 = sf.format(calendar.getTime());
+				calendar.add(Calendar.MONTH, 1);
+				calendar.add(Calendar.DAY_OF_MONTH, -1);
+				String fotdate2 = sf.format(calendar.getTime());
+				IRowSet rs = DbUtil.executeQuery(ctx, sql.toString(), new String[]{personInfo.getId().toString(), fotdate1, fotdate2});
+				if(rs.size()>0){
+					throw new ShrWebBizException("Each employee can apply for overtime only once per natural month.Employee ("+personInfo.getName()+") has already applied.");
+				}
+			}
+		}catch (BOSException e){
+			e.printStackTrace();
+		}
+	}
+}

Разлика између датотеке није приказан због своје велике величине
+ 207 - 0
GDYSL/websrc/com/kingdee/shr/customer/gtiit/osf/GetPersonPartPosOrgInfoServiceEx.java


+ 47 - 7
GDYSL/websrc/com/kingdee/shr/customer/gtiit/rpt/PersonRosterAListHandler.java

@@ -38,6 +38,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.sql.SQLException;
 import java.text.MessageFormat;
+import java.text.SimpleDateFormat;
 import java.util.*;
 
 /**人员花名册
@@ -251,6 +252,7 @@ public class PersonRosterAListHandler extends ListHandler {
                     entityViewInfo.setFilter(new FilterInfo(filterItems));
                 }
             }
+            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
             System.out.println("entityViewInfo:" + entityViewInfo.getFilter().toSql());
             Long start = System.currentTimeMillis();
             StringBuilder sel = new StringBuilder();
@@ -376,11 +378,49 @@ public class PersonRosterAListHandler extends ListHandler {
             sel.append("   left join T_HR_EMPORGRELATION eor on eor.fpersonid = ehis.fpersonid ");
             sel.append("   and eor.feffdt >= ehis.feffdt ");
             sel.append("   and eor.fleffdt <= ehis.fleffdt ");
+            sel.append("   UNION all ");
+            sel.append("   SELECT ehis.fid, ");
+            sel.append("       ehis.feffdt, ");
+            sel.append("       ehis.fleffdt, ");
+            sel.append("       ehis.feffdt as eorEffdt, ");
+            sel.append("       rEntry.FBIZDATE  as eorLeffdt, ");
+            sel.append("       ehis.FPERSONID, ");
+            sel.append("       rEntry.fadminorgid, ");
+            sel.append("       p.CFWorkercategoryID, ");
+            sel.append("       '', ");
+            sel.append("       rEntry.fpositionid, ");
+            sel.append("       p.CFFtorptID, ");
+            sel.append("       p.CFPersontypeID, ");
+            sel.append("       ehis.FEnterDate, ");
+            sel.append("       ehis.FTryoutMonth, ");
+            sel.append("       ehis.FPlanFormalDate, ");
+            sel.append("       ehis.flaborrelationstateid ");
+            sel.append("   from T_HR_RESIGNBIZBILLENTRY rEntry ");
+            sel.append("   left join t_hr_emplaborrelationhis ehis on rEntry.FPERSONID = ehis.fpersonid ");
+            sel.append("   left join t_bd_person p on p.fid= ehis.fpersonid ");
+            sel.append("   where   ");
+            sel.append("   rEntry.fbizdate >= { "+sf.format(new Date())+" } ");
+            if (null != entityViewInfo && entityViewInfo.getFilter() != null) {
+                FilterItemCollection fc = entityViewInfo.getFilter().getFilterItems();
+                FilterInfo filterInfo1 = new FilterInfo();
+                for (int i = 0; i < fc.size(); i++) {
+                    FilterItemInfo itemInfo = fc.get(i);
+                    if ("deadline1".equals(itemInfo.getPropertyName())) {
+                        filterInfo1.getFilterItems().add(itemInfo);
+                    }
+                    String andSql = filterInfo1.toSql();
+                    if (org.apache.commons.lang3.StringUtils.isNotBlank(andSql)) {
+                        andSql = andSql.replaceAll("deadline1", "rEntry.fbizdate");
+                        sel.append(" and " + andSql + " ");
+                    } else {
+                        sel.append(" and rEntry.fbizdate = ehis.fleffdt ");
+                    }
+                }
+            }
             sel.append(" ) b ");
             sel.append(" left join t_bd_person person on person.fid = b.FPERSONID ");
-            sel.append(" left join T_HR_BDEmployeeType bt on bt.fid = b.flaborrelationstateid ");
-            sel.append(" left join T_HR_RESIGNBIZBILLENTRY rEntry on rEntry.fid = b.FPERSONID ");
-            sel.append(" and rEntry.fbizdate = b.fleffdt ");
+            sel.append(" left join T_HR_RESIGNBIZBILLENTRY rEntry on rEntry.FPERSONID = b.FPERSONID ");
+            sel.append(" left join T_HR_BDEmployeeType bt on bt.fid = isnull(rEntry.femptypeid,b.flaborrelationstateid) ");
             sel.append(" left join T_HR_VariationReason vr on person.fid = rEntry.fvariationreasonid ");
             sel.append(" left join T_HR_personPosition pePos on pePos.fpersonid = person.FID ");
             sel.append(" left join t_org_admin c on b.FAdminOrgID = c.FID ");
@@ -628,14 +668,14 @@ public class PersonRosterAListHandler extends ListHandler {
             sel.append("  ) preEntry ");
             if ((null != entityViewInfo) && (entityViewInfo.getFilter() != null)) {
                 FilterItemCollection fc = entityViewInfo.getFilter().getFilterItems();
-                FilterInfo filterInfo1 = new FilterInfo();
                 for (int i = 0; i < fc.size(); i++) {
                     FilterItemInfo itemInfo = fc.get(i);
-                    if (!"deadline2".equals(itemInfo.getPropertyName())) {
-                        filterInfo1.getFilterItems().add(itemInfo);
+                    if ("deadline2".equals(itemInfo.getPropertyName())) {
+                        itemInfo.setCompareValue("1");
+                        itemInfo.setPropertyName("1");
                     }
                 }
-                String andSql = filterInfo1.toSql();
+                String andSql = entityViewInfo.getFilter().toSql();
                 if (org.apache.commons.lang3.StringUtils.isNotBlank(andSql)) {
                     andSql = andSql.replaceAll("personType.id", "personTypeId");
                     andSql = andSql.replaceAll("person.id", "personId");

Неке датотеке нису приказане због велике количине промена