Procházet zdrojové kódy

组织考勤计算进度-项目工时

qingwu před 6 měsíci
rodič
revize
e6f2638b57

+ 517 - 0
websrc/com/kingdee/eas/custom/adminorgatscalculate/handler/AdminOrgAtsCalculateListHandler.java

@@ -0,0 +1,517 @@
+package com.kingdee.eas.custom.adminorgatscalculate.handler;
+
+import com.alibaba.fastjson.JSONObject;
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.ctrl.swing.StringUtils;
+import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
+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.query.util.CompareType;
+import com.kingdee.eas.basedata.org.AdminOrgUnitFactory;
+import com.kingdee.eas.basedata.org.AdminOrgUnitInfo;
+import com.kingdee.eas.basedata.org.IAdminOrgUnit;
+import com.kingdee.eas.common.EASBizException;
+import com.kingdee.eas.hr.ats.AttendancePeriodFactory;
+import com.kingdee.eas.hr.ats.AttendancePeriodInfo;
+import com.kingdee.eas.hr.ats.IAttendancePeriod;
+import com.kingdee.eas.util.app.DbUtil;
+import com.kingdee.jdbc.rowset.IRowSet;
+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.json.GridDataEntity;
+import com.kingdee.shr.base.syssetting.web.handler.ListHandler;
+import com.kingdee.util.DateTimeUtils;
+import org.apache.log4j.Logger;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.sql.SQLException;
+import java.util.*;
+
+/**
+ * @author qingwu
+ * @date 2025/6/18
+ * @apiNote 组织考勤计算进度报表
+ */
+public class AdminOrgAtsCalculateListHandler extends ListHandler {
+    Context ctx = SHRContext.getInstance().getContext();
+    private static Logger logger = Logger.getLogger(AdminOrgAtsCalculateListHandler.class);
+
+    @Override
+    protected FilterInfo getTreeDomainFilter(HttpServletRequest request) throws SHRWebException {
+        FilterInfo filterInfo = null;
+        String fastFilterItems = request.getParameter("fastFilterItems");
+        JSONObject tofastFilterItems = JSONObject.parseObject(fastFilterItems);
+        String adminOrgId = tofastFilterItems.getJSONObject("adminOrg").getString("values");
+        try {
+            if (!StringUtils.isEmpty(adminOrgId)) {
+                IAdminOrgUnit iAdminOrgUnit = AdminOrgUnitFactory.getLocalInstance(ctx);
+                AdminOrgUnitInfo adminOrgUnitInfo = iAdminOrgUnit.getAdminOrgUnitInfo(new ObjectUuidPK(adminOrgId));
+                filterInfo = new FilterInfo();
+                FilterItemCollection filterItems = filterInfo.getFilterItems();
+                Integer includeSub = tofastFilterItems.getJSONObject("adminOrg").getInteger("includeSub");
+                //是否包含下级
+                if (tofastFilterItems.getJSONObject("adminOrg").getBoolean("isIncludeSub")) {
+                    if (includeSub == 0) {
+                        filterItems.add(new FilterItemInfo("longNumber", adminOrgUnitInfo.getLongNumber()));
+                        filterItems.add(new FilterItemInfo("longNumber", adminOrgUnitInfo.getLongNumber() + "!%", CompareType.LIKE));
+                        filterItems.add(new FilterItemInfo("isSealUp", 0));
+                        filterInfo.setMaskString("(#0 or (#1)) and #2");
+                    } else {
+                        filterItems.add(new FilterItemInfo("longNumber", adminOrgUnitInfo.getLongNumber()));
+                        filterItems.add(new FilterItemInfo("longNumber", adminOrgUnitInfo.getLongNumber() + "!%", CompareType.LIKE));
+                        filterItems.add(new FilterItemInfo("level", includeSub + 1, CompareType.LESS_EQUALS));
+                        filterInfo.setMaskString("(#0 or #1) and #2");
+                    }
+                } else {
+                    filterItems.add(new FilterItemInfo("longNumber", adminOrgUnitInfo.getLongNumber()));
+                    //filterItems.add(new FilterItemInfo("longNumber", adminOrgUnitInfo.getLongNumber() + "!%", CompareType.LIKE));
+                    filterItems.add(new FilterItemInfo("isSealUp", 0));
+                    filterInfo.setMaskString("#0 and #1");
+                }
+            }
+        } catch (BOSException e) {
+            throw new RuntimeException(e);
+        } catch (EASBizException e) {
+            throw new RuntimeException(e);
+        }
+
+        return filterInfo;
+    }
+
+    @Override
+    protected void afterGetListData(HttpServletRequest request, HttpServletResponse response, GridDataEntity gridDataEntity) throws SHRWebException {
+        List rows = gridDataEntity.getRows();
+        // 获取过滤条件
+        String fastFilterItems = request.getParameter("fastFilterItems");
+        JSONObject tofastFilterItems = JSONObject.parseObject(fastFilterItems);
+        String attendancePeriodId = tofastFilterItems.getJSONObject("attendancePeriod").getString("values");
+        if (StringUtils.isEmpty(attendancePeriodId)) {
+            throw new ShrWebBizException("请选择考勤周期!");
+        }
+        try {
+            IAttendancePeriod iAttendancePeriod = AttendancePeriodFactory.getLocalInstance(ctx);
+            IAdminOrgUnit iAdminOrgUnit = AdminOrgUnitFactory.getLocalInstance(ctx);
+            AttendancePeriodInfo attendancePeriodInfo = iAttendancePeriod.getAttendancePeriodInfo(new ObjectUuidPK(attendancePeriodId));
+            Date startDate = attendancePeriodInfo.getStartDate();
+            Date endDate = attendancePeriodInfo.getEndDate();
+            String adminOrgId = tofastFilterItems.getJSONObject("adminOrg").getString("values");
+            //isIncludeSub = 是否包含下级
+            Boolean isIncludeSub = tofastFilterItems.getJSONObject("adminOrg").getBoolean("isIncludeSub");
+            //未计算Map
+            Map<String, List> unCalculateMap = getUnCalculateSql(DateTimeUtils.format(startDate, "yyyy-MM-dd"), DateTimeUtils.format(endDate, "yyyy-MM-dd"));
+            logger.error("unCalculateMap--" + unCalculateMap.size());
+            //已计算
+            Map<String, List> hasCalculateMap = getHasCalculateSql(DateTimeUtils.format(startDate, "yyyy-MM-dd"), DateTimeUtils.format(endDate, "yyyy-MM-dd"));
+            logger.error("hasCalculateMap--" + hasCalculateMap.size());
+            //已审批
+            Map<String, List> hasAuditMap = getHasAuditSql(DateTimeUtils.format(startDate, "yyyy-MM-dd"), DateTimeUtils.format(endDate, "yyyy-MM-dd"));
+            logger.error("hasAuditMap--" + hasAuditMap.size());
+            //未审批
+            Map<String, List> unAuditMap = getUnAuditSql(DateTimeUtils.format(startDate, "yyyy-MM-dd"), DateTimeUtils.format(endDate, "yyyy-MM-dd"));
+            logger.error("unAuditMap--" + unCalculateMap.size());
+            //已转薪资
+            Map<String, List> transferSalaryMap = getTransferSalarySql(DateTimeUtils.format(startDate, "yyyy-MM-dd"), DateTimeUtils.format(endDate, "yyyy-MM-dd"));
+            logger.error("transferSalaryMap--" + transferSalaryMap.size());
+            logger.error("isIncludeSub--" + isIncludeSub);
+            for (int i = 0; i < rows.size(); i++) {
+                Map map = (Map) rows.get(i);
+                adminOrgId = map.get("id").toString().trim();
+                logger.error("adminOrgId--" + adminOrgId);
+                List list = childAdminOrg(adminOrgId);
+                logger.error("list--" + list);
+                int unCalculate = 0;
+                int hasCalculate = 0;
+                int unAudit = 0;
+                int hasAudit = 0;
+                int transferSalary = 0;
+                int personNum = getPersonNum(adminOrgId);
+                if (isIncludeSub) {
+                    for (String key : unCalculateMap.keySet()) {
+                        if (list.contains(key)) {
+                            unCalculate += unCalculateMap.get(key).size();
+                        }
+                    }
+                    for (String key : hasCalculateMap.keySet()) {
+                        if (list.contains(key)) {
+                            hasCalculate += hasCalculateMap.get(key).size();
+                            logger.error("hasCalculate--" + hasCalculate);
+                        }
+                    }
+                    for (String key : unAuditMap.keySet()) {
+                        if (list.contains(key)) {
+                            unAudit += unAuditMap.get(key).size();
+                        }
+                    }
+                    for (String key : hasAuditMap.keySet()) {
+                        if (list.contains(key)) {
+                            hasAudit += hasAuditMap.get(key).size();
+                        }
+                    }
+                    for (String key : transferSalaryMap.keySet()) {
+                        if (list.contains(key)) {
+                            transferSalary += transferSalaryMap.get(key).size();
+                        }
+                    }
+                    personNum -= (hasAudit + unAudit + transferSalary);
+                } else {
+                    unCalculate = unCalculateMap.get(adminOrgId) == null ? 0 : unCalculateMap.get(adminOrgId).size();
+                    hasCalculate = hasCalculateMap.get(adminOrgId) == null ? 0 : hasCalculateMap.get(adminOrgId).size();
+                    unAudit = unAuditMap.get(adminOrgId) == null ? 0 : unAuditMap.get(adminOrgId).size();
+                    hasAudit = hasAuditMap.get(adminOrgId) == null ? 0 : hasAuditMap.get(adminOrgId).size();
+                    transferSalary = transferSalaryMap.get(adminOrgId) == null ? 0 : transferSalaryMap.get(adminOrgId).size();
+                }
+                int sum = (hasAudit + unAudit + transferSalary);
+                personNum = sum <= 0 ? 0 : personNum - sum;
+                map.put("unCollect", personNum);//未汇总
+                map.put("transferSalary", transferSalary);//已转薪资
+                map.put("hasAudit", hasAudit);//已审核
+                map.put("unAudit", unAudit);//未审批
+                map.put("hasCalculate", hasCalculate);//已计算
+                map.put("unCalculate", unCalculate);//未计算
+
+
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new SHRWebException(e);
+        }
+    }
+
+    // 辅助方法:统计子组织中各项数量
+    private int countItemsInMaps(List<String> childOrgs, Map<String, ?> targetMap) {
+        return targetMap.entrySet().stream()
+                .filter(entry -> childOrgs.contains(entry.getKey()))
+                .mapToInt(entry -> ((Collection<?>) entry.getValue()).size())
+                .sum();
+    }
+
+    // 辅助方法:安全获取Map大小
+    private int getMapSize(Map<String, ?> map, String key) {
+        Collection<?> collection = (Collection<?>) map.get(key);
+        return collection == null ? 0 : collection.size();
+    }
+
+    @Override
+    protected FilterInfo getFastFilter(HttpServletRequest request) throws SHRWebException {
+        return new FilterInfo();
+    }
+
+    /**
+     * 获取未计算数据
+     *
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    public Map getUnCalculateSql(String startDate, String endDate) throws BOSException, SQLException {
+        Map<String, List> map = new HashMap();
+        List list = null;
+        StringBuilder sb = new StringBuilder();
+        sb.append("select  \"ADMINORGUNIT\".fid as adminOrgId,\"PERSON\".fid as personId FROM  T_HR_ATS_DATESET AS \"DATESET\"").append("\n");
+        sb.append(" LEFT JOIN  T_HR_ATS_ATTENDANCEFILEHIS AS \"FILEHIS\" ON \"FILEHIS\".FEFFDT<=\"DATESET\".FDATE AND \"FILEHIS\".FLEFFDT>=\"DATESET\".FDATE").append("\n");
+        sb.append(" LEFT JOIN  T_BD_PERSON AS \"PERSON\" ON \"PERSON\".FID=\"FILEHIS\".FPROPOSERID").append("\n");
+        sb.append(" LEFT JOIN  T_HR_ATS_ATTENDANCERESULT AS \"ATS_RESULT\" ON \"ATS_RESULT\".FProposerID=\"FILEHIS\".FPROPOSERID AND (\"ATS_RESULT\".FAttenceDate=\"DATESET\".FDate and \"ATS_RESULT\".FAttenceDate<= {ts '" + endDate + "'} and \"ATS_RESULT\".FAttenceDate>= {ts '" + startDate + "'})").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_ADMIN AS \"ADMINORGRESULT\" ON \"ADMINORGRESULT\".FID=\"ATS_RESULT\".FADMINORGUNITID").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_HRO AS \"HRORGRESULT\" ON \"HRORGRESULT\".FID=\"ATS_RESULT\".FATTHRORGUNITID").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_HRO AS \"HRORG\" ON \"HRORG\".FID=\"FILEHIS\".FHRORGUNITID").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_ADMIN AS \"ATTADMINRESULT\" ON \"ATTADMINRESULT\".FID=\"ATS_RESULT\".FATTADMINORGUNITID").append("\n");
+        sb.append(" LEFT JOIN  T_HR_ATS_SCHEDULESHIFT AS \"SCHEDULESHIFT\" ON \"SCHEDULESHIFT\".FProposerID=\"FILEHIS\".FPROPOSERID AND (\"SCHEDULESHIFT\".FAttendDate=\"DATESET\".FDate)").append("\n");
+        sb.append(" LEFT JOIN  T_HR_ATS_SHIFT AS \"ATSSHIFT\" ON \"ATSSHIFT\".FID=\"SCHEDULESHIFT\".FDEFAULTSHIFTID").append("\n");
+        sb.append(" LEFT JOIN  T_HR_ATS_SHIFTITEM AS \"ITEMTWO\" ON \"ITEMTWO\".FGroupID=\"ATSSHIFT\".FID AND (\"ITEMTWO\".FSegment= '2')").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_ADMIN AS \"ADMINORGUNIT\" ON \"ADMINORGUNIT\".FID=\"FILEHIS\".FADMINORGUNITID WHERE (    \"HRORG\".FID in ('00000000-0000-0000-0000-000000000000CCE7AED4') and \"DATESET\".FDate>= {ts '" + startDate + "'} and \"DATESET\".FDate<= {ts '" + endDate + "'} ) ").append("\n");
+        sb.append("and (  \"ATS_RESULT\".FAttenceStatus is null)").append("\n");
+        sb.append(" GROUP BY \"ADMINORGUNIT\".fid,\"PERSON\".fid").append("\n");
+        logger.error("getUnCalculateSql--" + sb.toString());
+        IRowSet rs = DbUtil.executeQuery(this.ctx, sb.toString());
+        while (rs.next()) {
+            String adminOrgId = rs.getString("adminOrgId");
+            String personId = rs.getString("personId");
+            if (map.containsKey(adminOrgId)) {
+                list = map.get(adminOrgId);
+                list.add(personId);
+            } else {
+                list = new ArrayList();
+                list.add(personId);
+                map.put(adminOrgId, list);
+            }
+        }
+        return map;
+    }
+
+    /**
+     * 获取已计算数据
+     *
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    public Map getHasCalculateSql(String startDate, String endDate) throws BOSException, SQLException {
+        Map<String, List> map = new HashMap();
+        List list = null;
+        StringBuilder sb = new StringBuilder();
+        sb.append("select  \"ADMINORGUNIT\".fid as adminOrgId,\"PERSON\".fid as personId FROM  T_HR_ATS_DATESET AS \"DATESET\"").append("\n");
+        sb.append(" LEFT JOIN  T_HR_ATS_ATTENDANCEFILEHIS AS \"FILEHIS\" ON \"FILEHIS\".FEFFDT<=\"DATESET\".FDATE AND \"FILEHIS\".FLEFFDT>=\"DATESET\".FDATE").append("\n");
+        sb.append(" LEFT JOIN  T_BD_PERSON AS \"PERSON\" ON \"PERSON\".FID=\"FILEHIS\".FPROPOSERID").append("\n");
+        sb.append(" LEFT JOIN  T_HR_ATS_ATTENDANCERESULT AS \"ATS_RESULT\" ON \"ATS_RESULT\".FProposerID=\"FILEHIS\".FPROPOSERID AND (\"ATS_RESULT\".FAttenceDate=\"DATESET\".FDate and \"ATS_RESULT\".FAttenceDate<= {ts '" + endDate + "'} and \"ATS_RESULT\".FAttenceDate>= {ts '" + startDate + "'})").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_ADMIN AS \"ADMINORGRESULT\" ON \"ADMINORGRESULT\".FID=\"ATS_RESULT\".FADMINORGUNITID").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_HRO AS \"HRORGRESULT\" ON \"HRORGRESULT\".FID=\"ATS_RESULT\".FATTHRORGUNITID").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_HRO AS \"HRORG\" ON \"HRORG\".FID=\"FILEHIS\".FHRORGUNITID").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_ADMIN AS \"ATTADMINRESULT\" ON \"ATTADMINRESULT\".FID=\"ATS_RESULT\".FATTADMINORGUNITID").append("\n");
+        sb.append(" LEFT JOIN  T_HR_ATS_SCHEDULESHIFT AS \"SCHEDULESHIFT\" ON \"SCHEDULESHIFT\".FProposerID=\"FILEHIS\".FPROPOSERID AND (\"SCHEDULESHIFT\".FAttendDate=\"DATESET\".FDate)").append("\n");
+        sb.append(" LEFT JOIN  T_HR_ATS_SHIFT AS \"ATSSHIFT\" ON \"ATSSHIFT\".FID=\"SCHEDULESHIFT\".FDEFAULTSHIFTID").append("\n");
+        sb.append(" LEFT JOIN  T_HR_ATS_SHIFTITEM AS \"ITEMTWO\" ON \"ITEMTWO\".FGroupID=\"ATSSHIFT\".FID AND (\"ITEMTWO\".FSegment= '2')").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_ADMIN AS \"ADMINORGUNIT\" ON \"ADMINORGUNIT\".FID=\"FILEHIS\".FADMINORGUNITID WHERE (    \"HRORG\".FID in ('00000000-0000-0000-0000-000000000000CCE7AED4') and \"DATESET\".FDate>= {ts '" + startDate + "'} and \"DATESET\".FDate<= {ts '" + endDate + "'} ) ").append("\n");
+        sb.append("and (  \"ATS_RESULT\".FAttenceStatus =1) ").append("\n");
+        sb.append(" GROUP BY \"ADMINORGUNIT\".fid,\"PERSON\".fid ").append("\n");
+        logger.error("getHasCalculateSql--" + sb.toString());
+        IRowSet rs = DbUtil.executeQuery(this.ctx, sb.toString());
+        while (rs.next()) {
+            String adminOrgId = rs.getString("adminOrgId");
+            String personId = rs.getString("personId");
+            if (map.containsKey(adminOrgId)) {
+                list = map.get(adminOrgId);
+                list.add(personId);
+            } else {
+                list = new ArrayList();
+                list.add(personId);
+                map.put(adminOrgId, list);
+            }
+        }
+        return map;
+    }
+
+    /**
+     * 获取已审批数据
+     *
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    public Map getHasAuditSql(String startDate, String endDate) throws BOSException, SQLException {
+        Map<String, List> map = new HashMap();
+        List list = null;
+        StringBuilder sb = new StringBuilder();
+        sb.append("select  \"ADMINORGUNIT\".fid as adminOrgId ,attendResultSum.fid as attendResultSumId from T_HR_ATS_AttendanceResultSum  attendResultSum").append("\n");
+        sb.append("left join T_HR_ATS_AttendancePeriod attendReriod on attendReriod.fid = attendResultSum.FAttendancePeriodID").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_ADMIN AS \"ADMINORGUNIT\" ON \"ADMINORGUNIT\".FID = attendResultSum.FAdminOrgUnitID").append("\n");
+        sb.append("where (FStartDate>= {ts  '" + startDate + "'} and FStartDate <= {ts  '" + endDate + "'}) and (FEndDate>={ts  '" + startDate + "'} and FEndDate <= {ts  '" + endDate + "'})").append("\n");
+        sb.append("and FSalaryStatus =3 ").append("\n");
+        sb.append("  GROUP BY \"ADMINORGUNIT\".fid,attendResultSum.fid ").append("\n");
+        logger.error("getHasAuditSql--" + sb.toString());
+        IRowSet rs = DbUtil.executeQuery(this.ctx, sb.toString());
+        while (rs.next()) {
+            String adminOrgId = rs.getString("adminOrgId");
+            String personId = rs.getString("attendResultSumId");
+            if (map.containsKey(adminOrgId)) {
+                list = map.get(adminOrgId);
+                list.add(personId);
+            } else {
+                list = new ArrayList();
+                list.add(personId);
+                map.put(adminOrgId, list);
+            }
+        }
+        return map;
+    }
+
+    /**
+     * 获取未审批数据
+     *
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    public Map getUnAuditSql(String startDate, String endDate) throws BOSException, SQLException {
+        Map<String, List> map = new HashMap();
+        List list = null;
+        StringBuilder sb = new StringBuilder();
+        sb.append("select  \"ADMINORGUNIT\".fid as adminOrgId ,attendResultSum.fid as attendResultSumId from T_HR_ATS_AttendanceResultSum  attendResultSum").append("\n");
+        sb.append("left join T_HR_ATS_AttendancePeriod attendReriod on attendReriod.fid = attendResultSum.FAttendancePeriodID").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_ADMIN AS \"ADMINORGUNIT\" ON \"ADMINORGUNIT\".FID = attendResultSum.FAdminOrgUnitID").append("\n");
+        sb.append("where (FStartDate>= {ts  '" + startDate + "'} and FStartDate <= {ts  '" + endDate + "'}) and (FEndDate>={ts  '" + startDate + "'} and FEndDate <= {ts  '" + endDate + "'})").append("\n");
+        sb.append("and FSalaryStatus =2 ").append("\n");
+        sb.append("  GROUP BY \"ADMINORGUNIT\".fid,attendResultSum.fid ").append("\n");
+        logger.error("getUnAuditSql--" + sb.toString());
+        IRowSet rs = DbUtil.executeQuery(this.ctx, sb.toString());
+        while (rs.next()) {
+            String adminOrgId = rs.getString("adminOrgId");
+            String personId = rs.getString("attendResultSumId");
+            if (map.containsKey(adminOrgId)) {
+                list = map.get(adminOrgId);
+                list.add(personId);
+            } else {
+                list = new ArrayList();
+                list.add(personId);
+                map.put(adminOrgId, list);
+            }
+        }
+        return map;
+    }
+
+    /**
+     * 获取已转薪资数据
+     *
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    public Map getTransferSalarySql(String startDate, String endDate) throws BOSException, SQLException {
+        Map<String, List> map = new HashMap();
+        List list = null;
+        StringBuilder sb = new StringBuilder();
+        sb.append("select  \"ADMINORGUNIT\".fid as adminOrgId ,attendResultSum.fid as attendResultSumId from T_HR_ATS_AttendanceResultSum  attendResultSum").append("\n");
+        sb.append("left join T_HR_ATS_AttendancePeriod attendReriod on attendReriod.fid = attendResultSum.FAttendancePeriodID").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_ADMIN AS \"ADMINORGUNIT\" ON \"ADMINORGUNIT\".FID = attendResultSum.FAdminOrgUnitID").append("\n");
+        sb.append("where (FStartDate>= {ts  '" + startDate + "'} and FStartDate <= {ts  '" + endDate + "'}) and (FEndDate>={ts  '" + startDate + "'} and FEndDate <= {ts  '" + endDate + "'})").append("\n");
+        sb.append("and FSalaryStatus =1 ").append("\n");
+        sb.append("  GROUP BY \"ADMINORGUNIT\".fid,attendResultSum.fid ").append("\n");
+        logger.error("getTransferSalarySql--" + sb.toString());
+        IRowSet rs = DbUtil.executeQuery(this.ctx, sb.toString());
+        while (rs.next()) {
+            String adminOrgId = rs.getString("adminOrgId");
+            String personId = rs.getString("attendResultSumId");
+            if (map.containsKey(adminOrgId)) {
+                list = map.get(adminOrgId);
+                list.add(personId);
+            } else {
+                list = new ArrayList();
+                list.add(personId);
+                map.put(adminOrgId, list);
+            }
+        }
+        return map;
+    }
+
+    /**
+     * 获取所以下级组织
+     *
+     * @param adminOrgId
+     * @return
+     * @throws BOSException
+     * @throws SQLException
+     */
+    public List childAdminOrg(String adminOrgId) throws BOSException, SQLException {
+        List list = new ArrayList();
+        StringBuilder sb = new StringBuilder();
+        sb.append("select child.fid as id  from T_ORG_Admin adcount ").append("\n");
+        sb.append("left join T_ORG_Admin child on (charindex(concat(adcount.flongnumber,'!'),child.flongnumber) = 1 or adcount.flongnumber = child.flongnumber)").append("\n");
+        sb.append("where  adcount.fid = '" + adminOrgId + "'").append("\n");
+        //logger.error("childAdminOrgSql--" + sb.toString());
+        IRowSet rs = DbUtil.executeQuery(this.ctx, sb.toString());
+
+        while (rs.next()) {
+            list.add(rs.getString("id"));
+        }
+        return list;
+    }
+
+    public String getSql(String startDate, String endDate, String adminOrgNumber, boolean isIncludeSub) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("").append("\n");
+        sb.append("select ").append("\n");
+        sb.append("(").append("\n");
+        sb.append("select count(1) from  (").append("\n");
+        sb.append("select \"PERSON\".fid FROM  T_HR_ATS_DATESET AS \"DATESET\"").append("\n");
+        sb.append(" LEFT JOIN  T_HR_ATS_ATTENDANCEFILEHIS AS \"FILEHIS\" ON \"FILEHIS\".FEFFDT<=\"DATESET\".FDATE AND \"FILEHIS\".FLEFFDT>=\"DATESET\".FDATE").append("\n");
+        sb.append(" LEFT JOIN  T_BD_PERSON AS \"PERSON\" ON \"PERSON\".FID=\"FILEHIS\".FPROPOSERID").append("\n");
+        sb.append(" LEFT JOIN  T_HR_ATS_ATTENDANCERESULT AS \"ATS_RESULT\" ON \"ATS_RESULT\".FProposerID=\"FILEHIS\".FPROPOSERID AND (\"ATS_RESULT\".FAttenceDate=\"DATESET\".FDate and \"ATS_RESULT\".FAttenceDate<= {ts '" + endDate + "'} and \"ATS_RESULT\".FAttenceDate>= {ts '" + startDate + "'})").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_ADMIN AS \"ADMINORGRESULT\" ON \"ADMINORGRESULT\".FID=\"ATS_RESULT\".FADMINORGUNITID").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_HRO AS \"HRORGRESULT\" ON \"HRORGRESULT\".FID=\"ATS_RESULT\".FATTHRORGUNITID").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_HRO AS \"HRORG\" ON \"HRORG\".FID=\"FILEHIS\".FHRORGUNITID").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_ADMIN AS \"ATTADMINRESULT\" ON \"ATTADMINRESULT\".FID=\"ATS_RESULT\".FATTADMINORGUNITID").append("\n");
+        sb.append(" LEFT JOIN  T_HR_ATS_SCHEDULESHIFT AS \"SCHEDULESHIFT\" ON \"SCHEDULESHIFT\".FProposerID=\"FILEHIS\".FPROPOSERID AND (\"SCHEDULESHIFT\".FAttendDate=\"DATESET\".FDate)").append("\n");
+        sb.append(" LEFT JOIN  T_HR_ATS_SHIFT AS \"ATSSHIFT\" ON \"ATSSHIFT\".FID=\"SCHEDULESHIFT\".FDEFAULTSHIFTID").append("\n");
+        sb.append(" LEFT JOIN  T_HR_ATS_SHIFTITEM AS \"ITEMTWO\" ON \"ITEMTWO\".FGroupID=\"ATSSHIFT\".FID AND (\"ITEMTWO\".FSegment= '2')").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_ADMIN AS \"ADMINORGUNIT\" ON \"ADMINORGUNIT\".FID=\"FILEHIS\".FADMINORGUNITID WHERE (    \"HRORG\".FID in ('00000000-0000-0000-0000-000000000000CCE7AED4') and \"DATESET\".FDate>= {ts '" + startDate + "'} and \"DATESET\".FDate<= {ts '" + endDate + "'} ) ").append("\n");
+        sb.append("and (  \"ATS_RESULT\".FAttenceStatus is null) ").append("\n");
+        if (isIncludeSub) {
+            sb.append("   and  \"ADMINORGUNIT\".FLongNumber LIKE '%" + adminOrgNumber + "%'").append("\n");
+        } else {
+            sb.append(" and  \"ADMINORGUNIT\".fnumber = '" + adminOrgNumber + "'").append("\n");
+        }
+        sb.append(" GROUP BY \"PERSON\".fid )as temp ").append("\n");
+        sb.append(") as unCalculate,").append("\n");
+        sb.append("(").append("\n");
+        sb.append("select count(1) from  (").append("\n");
+        sb.append("select \"PERSON\".fid FROM  T_HR_ATS_DATESET AS \"DATESET\"").append("\n");
+        sb.append(" LEFT JOIN  T_HR_ATS_ATTENDANCEFILEHIS AS \"FILEHIS\" ON \"FILEHIS\".FEFFDT<=\"DATESET\".FDATE AND \"FILEHIS\".FLEFFDT>=\"DATESET\".FDATE").append("\n");
+        sb.append(" LEFT JOIN  T_BD_PERSON AS \"PERSON\" ON \"PERSON\".FID=\"FILEHIS\".FPROPOSERID").append("\n");
+        sb.append(" LEFT JOIN  T_HR_ATS_ATTENDANCERESULT AS \"ATS_RESULT\" ON \"ATS_RESULT\".FProposerID=\"FILEHIS\".FPROPOSERID AND (\"ATS_RESULT\".FAttenceDate=\"DATESET\".FDate and \"ATS_RESULT\".FAttenceDate<= {ts '" + endDate + "'} and \"ATS_RESULT\".FAttenceDate>= {ts '" + startDate + "'})").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_ADMIN AS \"ADMINORGRESULT\" ON \"ADMINORGRESULT\".FID=\"ATS_RESULT\".FADMINORGUNITID").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_HRO AS \"HRORGRESULT\" ON \"HRORGRESULT\".FID=\"ATS_RESULT\".FATTHRORGUNITID").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_HRO AS \"HRORG\" ON \"HRORG\".FID=\"FILEHIS\".FHRORGUNITID").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_ADMIN AS \"ATTADMINRESULT\" ON \"ATTADMINRESULT\".FID=\"ATS_RESULT\".FATTADMINORGUNITID").append("\n");
+        sb.append(" LEFT JOIN  T_HR_ATS_SCHEDULESHIFT AS \"SCHEDULESHIFT\" ON \"SCHEDULESHIFT\".FProposerID=\"FILEHIS\".FPROPOSERID AND (\"SCHEDULESHIFT\".FAttendDate=\"DATESET\".FDate)").append("\n");
+        sb.append(" LEFT JOIN  T_HR_ATS_SHIFT AS \"ATSSHIFT\" ON \"ATSSHIFT\".FID=\"SCHEDULESHIFT\".FDEFAULTSHIFTID").append("\n");
+        sb.append(" LEFT JOIN  T_HR_ATS_SHIFTITEM AS \"ITEMTWO\" ON \"ITEMTWO\".FGroupID=\"ATSSHIFT\".FID AND (\"ITEMTWO\".FSegment= '2')").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_ADMIN AS \"ADMINORGUNIT\" ON \"ADMINORGUNIT\".FID=\"FILEHIS\".FADMINORGUNITID WHERE (    \"HRORG\".FID in ('00000000-0000-0000-0000-000000000000CCE7AED4') and \"DATESET\".FDate>= {ts '" + startDate + "'} and \"DATESET\".FDate<= {ts '" + endDate + "'} ) ").append("\n");
+        sb.append("and (  \"ATS_RESULT\".FAttenceStatus=1) ").append("\n");
+        if (isIncludeSub) {
+            sb.append("   and  \"ADMINORGUNIT\".FLongNumber LIKE '%" + adminOrgNumber + "%'").append("\n");
+        } else {
+            sb.append(" and  \"ADMINORGUNIT\".fnumber = '" + adminOrgNumber + "'").append("\n");
+        }
+        sb.append(" GROUP BY \"PERSON\".fid )as temp ").append("\n");
+        sb.append(") as hasCalculate,").append("\n");
+        sb.append("(").append("\n");
+        sb.append("select count(*) from T_HR_ATS_AttendanceResultSum  attendResultSum").append("\n");
+        sb.append("left join T_HR_ATS_AttendancePeriod attendReriod on attendReriod.fid = attendResultSum.FAttendancePeriodID").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_ADMIN AS \"ADMINORGUNIT\" ON \"ADMINORGUNIT\".FID = attendResultSum.FAdminOrgUnitID").append("\n");
+        sb.append("where (FStartDate>= {ts  '" + startDate + "'} and FStartDate <= {ts  '" + endDate + "'}) and (FEndDate>={ts  '" + startDate + "'} and FEndDate <= {ts  '" + endDate + "'})").append("\n");
+        sb.append("and FSalaryStatus =3 ").append("\n");
+        if (isIncludeSub) {
+            sb.append("   and  \"ADMINORGUNIT\".FLongNumber LIKE '%" + adminOrgNumber + "%'").append("\n");
+        } else {
+            sb.append(" and  \"ADMINORGUNIT\".fnumber = '" + adminOrgNumber + "'").append("\n");
+        }
+        sb.append(") as hasAudit,").append("\n");
+        sb.append("(").append("\n");
+        sb.append("select count(*) from T_HR_ATS_AttendanceResultSum  attendResultSum").append("\n");
+        sb.append("left join T_HR_ATS_AttendancePeriod attendReriod on attendReriod.fid = attendResultSum.FAttendancePeriodID").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_ADMIN AS \"ADMINORGUNIT\" ON \"ADMINORGUNIT\".FID = attendResultSum.FAdminOrgUnitID").append("\n");
+        sb.append("where (FStartDate>= {ts  '" + startDate + "'} and FStartDate <= {ts  '" + endDate + "'}) and (FEndDate>={ts  '" + startDate + "'} and FEndDate <= {ts  '" + endDate + "'})").append("\n");
+        sb.append("and FSalaryStatus =2 ").append("\n");
+        if (isIncludeSub) {
+            sb.append("   and  \"ADMINORGUNIT\".FLongNumber LIKE '%" + adminOrgNumber + "%'").append("\n");
+        } else {
+            sb.append(" and  \"ADMINORGUNIT\".fnumber = '" + adminOrgNumber + "'").append("\n");
+        }
+        sb.append(") as unAudit,").append("\n");
+        sb.append("(").append("\n");
+        sb.append("select count(*) from T_HR_ATS_AttendanceResultSum  attendResultSum").append("\n");
+        sb.append("left join T_HR_ATS_AttendancePeriod attendReriod on attendReriod.fid = attendResultSum.FAttendancePeriodID").append("\n");
+        sb.append(" LEFT JOIN  T_ORG_ADMIN AS \"ADMINORGUNIT\" ON \"ADMINORGUNIT\".FID = attendResultSum.FAdminOrgUnitID").append("\n");
+        sb.append("where (FStartDate>= {ts  '" + startDate + "'} and FStartDate <= {ts  '" + endDate + "'}) and (FEndDate>={ts  '" + startDate + "'} and FEndDate <= {ts  '" + endDate + "'})").append("\n");
+        sb.append("and FSalaryStatus =1 ").append("\n");
+        if (isIncludeSub) {
+            sb.append("   and  \"ADMINORGUNIT\".FLongNumber LIKE '%" + adminOrgNumber + "%'").append("\n");
+        } else {
+            sb.append(" and  \"ADMINORGUNIT\".fnumber = '" + adminOrgNumber + "'").append("\n");
+        }
+        sb.append(") as transferSalary").append("\n");
+        sb.append(" from T_ORG_ADMIN ").append("\n");
+        if (!StringUtils.isEmpty(adminOrgNumber)) {
+            sb.append(" where  fnumber = '" + adminOrgNumber + "'").append("\n");
+        }
+        logger.equals("getSql--" + sb.toString());
+        return sb.toString();
+    }
+
+    public int getPersonNum(String adminOrgNumber) throws BOSException, SQLException {
+        StringBuilder sb = new StringBuilder();
+        sb.append("select count(*) as num  from T_HR_ATS_AttendanceFile AttendanceFile where FAdminOrgUnitID in(select child.fid from T_ORG_Admin adcount ").append("\n");
+        sb.append("left join T_ORG_Admin child on (charindex(concat(adcount.flongnumber,'!'),child.flongnumber) = 1 or adcount.flongnumber = child.flongnumber)").append("\n");
+        sb.append("where  adcount.fid = '" + adminOrgNumber + "'").append("\n");
+        sb.append(")").append("\n");
+        int num = 0;
+        IRowSet rs = DbUtil.executeQuery(this.ctx, sb.toString());
+        if (rs.next()) {
+            num = rs.getInt("num");
+        }
+        return num;
+    }
+}

+ 106 - 0
websrc/com/kingdee/eas/custom/adminorgatscalculate/handler/WorkHoursReportListHandlerEx.java

@@ -0,0 +1,106 @@
+package com.kingdee.eas.custom.adminorgatscalculate.handler;
+
+import com.alibaba.fastjson.JSONObject;
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.metadata.entity.SelectorItemCollection;
+import com.kingdee.eas.base.permission.UserInfo;
+import com.kingdee.eas.common.EASBizException;
+import com.kingdee.eas.hr.ats.AtsUtil;
+import com.kingdee.eas.hr.project.IWorkHoursReport;
+import com.kingdee.eas.hr.project.WorkHoursReportCollection;
+import com.kingdee.eas.hr.project.WorkHoursReportFactory;
+import com.kingdee.eas.hr.project.WorkHoursReportInfo;
+import com.kingdee.eas.hr.project.handler.WorkHoursReportListHandler;
+import com.kingdee.eas.util.StringUtil;
+import com.kingdee.eas.util.app.ContextUtil;
+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.util.StringUtils;
+import org.apache.log4j.Logger;
+import org.springframework.ui.ModelMap;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.sql.Timestamp;
+import java.util.Date;
+
+/**
+ * @author qingwu
+ * @date 2025/6/19
+ * @apiNote 项目工时提报 uipk:com.kingdee.eas.hr.project.app.WorkHoursReport.list
+ */
+public class WorkHoursReportListHandlerEx extends WorkHoursReportListHandler {
+    private static Logger logger = Logger.getLogger(WorkHoursReportListHandlerEx.class);
+    private Context ctx = SHRContext.getInstance().getContext();
+
+    /**
+     * 保存数据
+     *
+     * @param request
+     * @param response
+     * @param modelMap
+     */
+    public void updateWorkHoursReportAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws SHRWebException {
+        logger.error("saveWorkHoursReportAction");
+        try {
+            IWorkHoursReport iWorkHoursReport = WorkHoursReportFactory.getLocalInstance(ctx);
+            //项目角色类型
+            String projectType = request.getParameter("projectType");
+            //项目角色
+            String projectRole = request.getParameter("projectRole");
+            if (StringUtils.isEmpty(projectType) && StringUtils.isEmpty(projectType)) {
+                throw new ShrWebBizException("请填写项目角色组和项目角色类别!");
+            }
+            //当前登录人
+            UserInfo user = ContextUtil.getCurrentUserInfo(ctx);
+            SelectorItemCollection sic = new SelectorItemCollection();
+            sic.add("oldUpdateUser");
+            sic.add("oldUpdateTime");
+            JSONObject projectRoleJson = JSONObject.parseObject(projectRole);
+            logger.error("projectRoleJson--" + projectRoleJson);
+            JSONObject projectTypeJson = JSONObject.parseObject(projectType);
+            logger.error("projectTypeJson--" + projectTypeJson);
+            String billId = this.getBillId(request);
+            WorkHoursReportCollection workHoursReportCollection = iWorkHoursReport.getWorkHoursReportCollection("select * ,oldProjectRole,oldProjectType where id in (" + AtsUtil.getStrFromString(billId) + ")");
+            for (int i = 0; i < workHoursReportCollection.size(); i++) {
+                WorkHoursReportInfo workHoursReportInfo = workHoursReportCollection.get(i);
+                //旧项目角色
+                Object oldProjectRole = workHoursReportInfo.get("oldProjectRole");
+                logger.error("oldProjectRole--" + oldProjectRole);
+                //旧项目角色类别
+                Object oldProjectType = workHoursReportInfo.get("oldProjectType");
+                logger.error("oldProjectType--" + oldProjectType);
+                if (oldProjectRole == null && !StringUtils.isEmpty(projectRoleJson.get("id").toString())) {
+                    logger.error("oldProjectRole--true");
+                    sic.add("projectRole");
+                    sic.add("oldProjectRole");
+                    workHoursReportInfo.put("oldProjectRole", workHoursReportInfo.get("projectRole"));
+                    workHoursReportInfo.put("projectRole", projectRoleJson.get("id"));
+                } else if (!StringUtils.isEmpty(projectRoleJson.get("id").toString())) {
+                    workHoursReportInfo.put("projectRole", projectRoleJson.get("id"));
+                    sic.add("projectRole");
+                }
+                if (oldProjectType == null && !StringUtils.isEmpty(projectTypeJson.get("id").toString())) {
+                    logger.error("oldProjectType--true");
+                    sic.add("projectType");
+                    sic.add("oldProjectType");
+                    workHoursReportInfo.put("oldProjectType", workHoursReportInfo.get("projectType"));
+                    workHoursReportInfo.put("projectType", projectTypeJson.get("id"));
+                } else if (!StringUtils.isEmpty(projectTypeJson.get("id").toString())) {
+                    workHoursReportInfo.put("projectType", projectTypeJson.get("id"));
+                    sic.add("projectType");
+                }
+                workHoursReportInfo.put("oldUpdateUser", user.getId());
+                workHoursReportInfo.put("oldUpdateTime", new Date());
+                iWorkHoursReport.updatePartial(workHoursReportInfo, sic);
+            }
+            JSONUtils.SUCCESS(projectTypeJson.toString() + projectTypeJson.toJSONString());
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new SHRWebException(e);
+        }
+    }
+}