1、示例代码:

/*** output package name*/
package com.kingdee.eas.custom.rpt.client;import java.awt.Color;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.apache.log4j.Logger;import com.kingdee.bos.BOSException;
import com.kingdee.bos.ctrl.kdf.table.IColumn;
import com.kingdee.bos.ctrl.kdf.table.IRow;
import com.kingdee.bos.ctrl.kdf.table.KDTMergeManager;
import com.kingdee.bos.ui.face.CoreUIObject;
import com.kingdee.eas.basedata.org.CtrlUnitInfo;
import com.kingdee.eas.basedata.org.OrgUnitInfo;
import com.kingdee.eas.common.client.SysContext;
import com.kingdee.eas.custom.gzkd.util.GzKDUtils;
import com.kingdee.eas.custom.gzkd.util.GzKdDateUtils;
import com.kingdee.eas.custom.rpt.TimesheetDetailDataRptFacadeFactory;
import com.kingdee.eas.custom.rpt.util.TimeSheetRptConstant;
import com.kingdee.eas.framework.report.ICommRptBase;
import com.kingdee.eas.framework.report.client.CommRptBaseConditionUI;
import com.kingdee.eas.framework.report.util.RptRowSet;/*** output class name*  * * 修改记录:  *   新增状态过滤并且显示工时的单号,并且只查询工时为提交、审核中、审核通过的状态   修改人:XXX   对接人:XXX  20181107*   序时簿界面显示工时汇总的单号                                    修改人:XXX  对接人:XXX  20181114*   *   * 报表逻辑个人备注XXX:*  通过SQL显示查询员工的所有工时数,按 组织名称+员工名称+工时日期 排序。*  如果员工当天有工时时,这把状态设置为submit,并且把填报天数+1,和工时单号汇总在工时单号栏。*  如果没有工时数,则把当天的状态设置为 miss,并且累计漏填天数+1。节假日的工时不在统计范围。*  */
public class TimesheetDetailDataRptUI extends AbstractTimesheetDetailDataRptUI {private static final Logger logger = CoreUIObject.getLogger(TimesheetDetailDataRptUI.class);/*** output class constructor*/public TimesheetDetailDataRptUI() throws Exception {super();}/*** 创建表头*/protected void createHeader(RptRowSet rptSet) {int colIndex = getFixCount();/** 删除动态加载列 */List<Integer> removeCol = new ArrayList<Integer>();for (int n = 0; n < getMainTab().getColumnCount(); n++) {if (n >= getFixCount()) {removeCol.add(n);}}Collections.reverse(removeCol);for (int index : removeCol) {getMainTab().removeColumn(index);}String columnKey = null;String columnTitle = null;String columnTitle2 = null;String upColumnTitle = null;IRow row1 = getMainTab().getHeadRow(0);IRow row2 = getMainTab().getHeadRow(1);int thisTitleCount = 0;KDTMergeManager mm = getMainTab().getHeadMergeManager();Date startDate = (Date) params.getObject(TimeSheetRptConstant.STARTDATE);Date endDate = (Date) params.getObject(TimeSheetRptConstant.ENDDATE);Calendar calendar = Calendar.getInstance();calendar.setTime(startDate);Calendar endCalendar = Calendar.getInstance();endCalendar.setTime(endDate);getMainTab().getColumn("timeSheetHours").getStyleAttributes().setHided(params.getBoolean(TimeSheetRptConstant.NOTSHOWSUMITDAYS));getMainTab().getColumn("lessHours").getStyleAttributes().setHided(params.getBoolean(TimeSheetRptConstant.NOTSHOWMISSDAYS));getMainTab().getColumn("workDays").getStyleAttributes().setHided(!params.getBoolean(TimeSheetRptConstant.SHOWWORKDAYS));while (endCalendar.compareTo(calendar) >= 0) {columnTitle = getYearMonth(calendar);columnTitle2 = String.valueOf(calendar.get(Calendar.DAY_OF_MONTH));columnKey = String.valueOf(getYearMonthTitle(calendar));if (GzKdDateUtils.isHoliday(null, calendar.getTime(), null)) {columnKey = columnKey + "_HOLIDAY";}IColumn column = getMainTab().addColumn(colIndex);column.setKey(columnKey);row1.getCell(colIndex).setValue(columnTitle);row2.getCell(colIndex).setValue(columnTitle2);column.setWidth(50);if (org.apache.commons.lang.StringUtils.isNotEmpty(upColumnTitle) && !columnTitle.equals(upColumnTitle)) {mm.mergeBlock(0, colIndex - thisTitleCount, 0, colIndex - 1);thisTitleCount = 0;}colIndex++;thisTitleCount++;upColumnTitle = columnTitle;calendar.add(Calendar.DAY_OF_MONTH, 1);}mm.mergeBlock(0, colIndex - thisTitleCount, 0, colIndex - 1);}private int getYearMonthTitle(Calendar calendar) {if (calendar == null) {return 0;} else {int year = calendar.get(Calendar.YEAR);int month = calendar.get(Calendar.MONTH) + 1;int day = calendar.get(Calendar.DAY_OF_MONTH);return (year * 10000) + (month * 100) + day;}}private String getYearMonth(Calendar calendar) {if (calendar == null) {return "";} else {int year = calendar.get(Calendar.YEAR);int month = calendar.get(Calendar.MONTH) + 1;return year + "-" + month;}}/** (non-Javadoc)* * @see* com.kingdee.eas.custom.gzkd.rpt.client.GzKdRptBaseUI#doAfterQuery(com* .kingdee.eas.framework.report.util.RptRowSet)*/@Overrideprotected void doAfterQuery(RptRowSet rs) throws Exception {/** 个人备注谈荣涛: 按照  组织  员工  日期  排序,统计工时详情。 *         填报天数 = 员工的工作天数(也是就时submit的天数)*   漏填天数 = 工作天数-填报天数*   工时单号 = 统计时间内的工时单号+ ”,“ 的汇总(去重复)*   */getMainTab().gerGroupManager().setGroup(true);getMainTab().getColumn("orgName").setGroup(true);String person = null;String upPerson = null;IRow addRow = null;String columnKey;String oldKey = "";int actualSubmitDays = 0;//实际提交天数,即统计报表中工作日期中表格值为"submit"的天数,用于计算漏填天数 = 工作天数-实际提交天数int submitDays = 0;int workDays = 0;int missDays = 0;String organdperson1 = null;    //用于汇总工时单号(判断是否新行)String organdperson2 = null;    //用于汇总工时单号(判断是否新行)String workHoursNos = null;     //用于汇总工时单号Map<Object, Object> whMap = new HashMap<Object, Object>(); //用于汇总工时单号while (rs.next()) {person = rs.getString("PERSONNAME");System.out.println(person);if (!person.equals((upPerson))) {if (addRow != null) {addRow.getCell(5).setValue(actualSubmitDays);//addRow.getCell(5).setValue(submitDays);//human 说提交天数应该是报表里显示的为submit的天数 注释by lws 2017-06-08//addRow.getCell(6).setValue(workDays - submitDays);if((workDays - actualSubmitDays)<0){//漏填天数 = 工作天数-实际提交天数addRow.getCell(6).setValue(0);//漏填日期,如漏填天数计算得出的值小于零,则显示为0即可。禅道5227}else {addRow.getCell(6).setValue(workDays - actualSubmitDays);//漏填日期}}submitDays = 0;workDays = 0;actualSubmitDays = 0;addRow = getMainTab().addRow();addRow.getCell(0).setValue(person);addRow.getCell(1).setValue(rs.getObject("ORGNAME"));//组织addRow.getCell(2).setValue(rs.getObject("PERSONNAME"));//职员addRow.getCell(3).setValue(rs.getObject("PERSONNAMEEN"));//职员英文名addRow.getCell(4).setValue(rs.getObject("FZRNAME"));//职员上级领导addRow.getCell(8).setValue(rs.getObject("workHoursNos")); //工时单号int n = getFixCount();int allCount = getMainTab().getColumnCount();for (int index = n; index < allCount; index++) {String key = getMainTab().getColumn(index).getKey();if (key.endsWith("_HOLIDAY")) {addRow.getCell(key).getStyleAttributes().setBackground(Color.gray);addRow.getCell(key).setValue(null);} else {workDays++;addRow.getCell(index).getStyleAttributes().setBackground(Color.yellow);addRow.getCell(index).setValue("miss");}}addRow.getCell(7).setValue(workDays);//工作天数}Object dateKey = rs.getObject("TIMESHEEDATE");if (dateKey instanceof Timestamp) {Timestamp dateTime = (Timestamp) dateKey;Calendar date = Calendar.getInstance();date.setTimeInMillis(dateTime.getTime());columnKey = String.valueOf(getYearMonthTitle(date));if (getMainTab().getColumnIndex(columnKey) != -1) {if(!oldKey.equals(columnKey)){//统计工作日期中的提交天数如果同一个工作日期有多条记录,只统计一次,避免出现重复统计actualSubmitDays++;}submitDays++;//同一天同一个人可能出现多条记录addRow.getCell(columnKey).getStyleAttributes().setBackground(Color.white);addRow.getCell(columnKey).setValue("submit");oldKey = columnKey;//工时单号汇总 organdperson1 = rs.getObject("ORGNAME").toString()+rs.getObject("PERSONNAME").toString();organdperson2 = addRow.getCell(1).getValue().toString()+addRow.getCell(2).getValue().toString();String only = rs.getObject("ORGNAME").toString()+rs.getObject("PERSONNAME").toString()+rs.getObject("workHoursNos");if(whMap.isEmpty()){whMap.put(only, rs.getObject("workHoursNos"));}else{if(!whMap.containsKey(only)){workHoursNos = addRow.getCell(8).getValue() +","+ rs.getObject("workHoursNos");addRow.getCell(8).setValue(workHoursNos);whMap.clear();whMap.put(only, rs.getObject("workHoursNos"));}}}}upPerson = person;}if (addRow != null) {addRow.getCell(5).setValue(actualSubmitDays);//addRow.getCell(5).setValue(submitDays);//填报天数if((workDays - actualSubmitDays)<0){addRow.getCell(6).setValue(0);//漏填日期,如漏填天数计算得出的值小于零,则显示为0即可。禅道5227}else {addRow.getCell(6).setValue(workDays - actualSubmitDays);//漏填日期}}getMainTab().gerGroupManager().group(); // 合并}public int getFixCount() {return 9;}protected ICommRptBase getRemoteInstance() throws BOSException {return TimesheetDetailDataRptFacadeFactory.getRemoteInstance();}/*** 返回用户查询面板实例*/protected CommRptBaseConditionUI getQueryDialogUserPanel() throws Exception {return new TimesheetDetailDataFilterUI();}
}

2、工具类:

/*** */
package com.kingdee.eas.custom.gzkd.util;import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;import com.kingdee.bos.BOSException;
import com.kingdee.bos.Context;
import com.kingdee.bos.dao.query.server.ISQLDataAccess;
import com.kingdee.bos.dao.query.server.SQLDataAccessFactory;
import com.kingdee.jdbc.rowset.IRowSet;/*** @功能描述 时间工具类* @修改记录:*       2018-10-15 构造方法,增加获取节假日方法*       2018-10-22 增加时间格式化方法*/
public class GzKdDateUtils {/*** 从工作日历表查找日期是否设置为节假日* * @param ctx* @param date* @param cuID* @return* @throws BOSException*/public static boolean isHoliday(Context ctx, Date date, String cuID) {Calendar calendar = Calendar.getInstance();calendar.setTime(date);// 如果为周六周日默认为节假日int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);boolean isHoliday = false;if (1 == dayOfWeek || 7 == dayOfWeek) {isHoliday = true;} else {isHoliday = false;}// 从工作日历中查找当前日期的设置,dateType为1是工作日。SimpleDateFormat dateFm = new SimpleDateFormat("yyyy-MM-dd");String strDate = dateFm.format(date);StringBuffer sql = new StringBuffer();sql.append(" select entry.FDateType dateType  ");sql.append(" \n\t from T_WorkCalendarDayEntry entry ");sql.append(" \n\t left join T_WorkCalendar bill on bill.fid = entry.FWorkCanlendarID ");sql.append(" \n\t where bill.FOrgUnitID = '00000000-0000-0000-0000-000000000000CCE7AED4'");sql.append(" \n\t  and  to_char(entry.fworkdate,'yyyy-MM-dd') =  '");sql.append(strDate).append("'");try {ISQLDataAccess iServer = SQLDataAccessFactory.getRemoteInstance();if (ctx == null) {iServer = SQLDataAccessFactory.getRemoteInstance();} else {iServer = SQLDataAccessFactory.getLocalInstance(ctx);}IRowSet row = iServer.getRowSet(sql.toString());if (null != row) {if (row.next()) {int dateType = row.getInt("dateType");if (1 == dateType) {isHoliday = false;} else {isHoliday = true;}}}} catch (SQLException e) {e.printStackTrace();} catch (BOSException e) {e.printStackTrace();}return isHoliday;}/*** 得到指定日期所属星期的星期天*/public static Date getSunDay(Date day) {
//      System.out.println("DAY:" + getYearMonthDay(day));Calendar c = Calendar.getInstance();c.setTime(day);int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);int lastSunday = dayOfWeek -1 ;c.add(Calendar.DAY_OF_MONTH, -lastSunday);
//      System.out.println(getYearMonthDay(c.getTime()));return c.getTime();}/*** 根据日期获取Title*/public  static int getYearMonthDay(Date date) {Calendar calendar = Calendar.getInstance();calendar.setTime(date);if (calendar == null) {return 0;} else {int year = calendar.get(Calendar.YEAR);int month = calendar.get(Calendar.MONTH) + 1;int day = calendar.get(Calendar.DAY_OF_MONTH);return (year * 10000) + (month * 100) + day;}}/*** 时间格式化*/public static String getDataStr(String simFormat,Date date){SimpleDateFormat sf = new SimpleDateFormat(simFormat);return sf.format(date);}}

3、界面效果:

EAS BOS 序时簿动态列的实现相关推荐

  1. 金蝶EAS,序时簿界面ListUI数据不允许修改、删除

    业务场景:特定状态下数据不允许修改或删除,在序时簿界面和编辑界面需要重写修改.删除对应的功能. 以下代码片段用于序时簿界面,编辑界面对应的写法请参考对应的博客内容. /*** 已启用数据不允许修改*/ ...

  2. 金蝶DEP编辑界面审核反审核,序时簿界面审核反审核代码

    编辑界面审核代码 var easNames = JavaImporter(); easNames.importPackage(Packages.com.kingdee.bos.dao.query); ...

  3. python自动化:uiautomation、pyautogui操作会计记账系统(3):处理序时簿

    python自动化:uiautomation.pyautogui操作会计记账系统(1):处理序时簿 #coding=utf-8 #chronological book,查询序时簿 import xlr ...

  4. 金蝶凭证序时簿在哪_来了!金蝶日常账务处理大全

    上一期给宝宝们更新了金蝶软件建账的一些处理流程,宝宝们已经迫不及待要求后续了. 在日常处理部分主要是以下几个方面 一.凭证审核 1.凭证录入 点击主窗口中的[凭证],单击[凭证]录入 在凭证录入窗口中 ...

  5. EAS BOS 代码隐藏分录列、锁定列、锁定单元格

    kdtEntry.getColumn("unit").getStyleAttributes().setHided(true);//隐藏列 kdtEntry.getColumn(&q ...

  6. 金蝶k3 wise 15.0单据序时簿二维码打印后打印预览时提示没有注册类

    金蝶K3 wise 15.0 销售出库单打开二维码打印后这个界面在点击布局设计或打印预览时提示没有注册类,提示如下: 解决方案: 请在K3安装目录C:\Program Files (x86)\King ...

  7. [转]bootstrap table 动态列数

    原文地址:https://my.oschina.net/u/2356355/blog/1595563 据说bootstrap table非常好用,从入门教程中了解到它的以下主要功能: 由于固定表头意味 ...

  8. easyexcel 动态列_easyexcel动态表头列导出SequenceDiagram 阅读源码事半功倍

    EasyExcel简介 Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢 ...

  9. Vue+Element表格动态列+表格分页

    LayUI表格动态列及分页LayUI+JavaScript表格动态列+表格分页 效果如图: 代码: 引用JQuery,Vue,Element等文件,换成自己的路径 <!DOCTYPE html& ...

最新文章

  1. 【 Verilog HDL 】清晰的时序逻辑描述方法之计数器的描述范例
  2. bzoj1089: [SCOI2003]严格n元树
  3. Android系统服务
  4. Zend Studio 高亮显示dwt和lbi
  5. MongoDB的查询操作
  6. 2020年跨行业跨领域工业互联网平台
  7. 三议(巧用:before和inline-block伪元素解决)跨浏览器不定长宽,中心为基点,百分比定位~...
  8. 【前端】—每日5道面试题打卡(十六)
  9. 社会化生态农场品,社群+农产品,大有搞头
  10. 并发包 concurrent(一) Atomic
  11. 基于词典和弱标注信息的电影评论情感分析系统
  12. 硬盘划分主分区、扩展分区、逻辑分区、活动分区有什么不同?
  13. iOS杂谈15—APP被苹果APPStore拒绝的各种原因
  14. django-DIL模板自定义过滤器,自定义标签,自定义包含标签
  15. Excel如何批量在空白单元格录入相同内容
  16. 【angular5】浅谈angular5与serviceWorker——(2)
  17. 【深入UCSC Genome Brower】写在前面
  18. 详解U盘怎么装windows7系统
  19. 水利工程建设标准强制性条文 2016
  20. python语音输入转化成文字_利用百度语音识别接口将语音转换成文字教程

热门文章

  1. django创建应用程序_使用Django创建基于机器学习的Web应用程序
  2. 基于C++的鬼脚图抽签游戏
  3. abaqus软件使用笔记
  4. 网站配色,CSS主色调配色方案
  5. 2019计算机导论课本样式,美英桥word课本网
  6. Springboot+web3j(4.7)+实战+填坑
  7. 阶梯电价 (15 分)
  8. XRD测试的68个问题(五)
  9. Adobe Photoshop (PS)修改图片像素教程
  10. win10系统同时配置有线网络和无线网络多个网络