6c
2025-07-18 07ac3f874dda4318b3ba00b5ea08388a33f43d53
src/main/java/com/product/administration/service/WorkAttendanceKanbanService.java
@@ -1,10 +1,11 @@
package com.product.administration.service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.time.LocalDate;
import java.util.*;
import java.time.YearMonth;
import cn.hutool.core.util.ObjectUtil;
import com.product.util.UnifySQLFunction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -26,7 +27,7 @@
   @Autowired
   BaseDao baseDao;
   /**
    *    考勤报表
    * @param dept_uuid      部门
@@ -37,8 +38,8 @@
      Integer monthNum=Integer.valueOf(year_of_month.substring(5, 7));   //获取月份
      Integer yearNum=Integer.valueOf(year_of_month.substring(0,4));      //获取年份
      Integer totalDays=WorkDayUtil.getTotalDays(yearNum, monthNum);
      StringBuilder sb=new StringBuilder();
      sb.append(" SELECT USER_ID, ");
      for (int i = 1; i <= totalDays; i++) {
@@ -69,10 +70,10 @@
      sb.append(" )a GROUP BY USER_ID,DATETIME ORDER BY USER_ID,DATETIME  ");
      sb.append(" )a ");
      sb.append(" GROUP BY USER_ID ");
      return baseDao.listTable(sb.toString(), new Object[] {year_of_month,year_of_month,year_of_month});
   }
   /**
    *    打卡月看板
    * @param fse
@@ -83,48 +84,48 @@
      SystemUser currentUser=SpringMVCContextHolder.getCurrentUser();
      Integer user_id=currentUser.getUser_id();   //user_id
      String org_level_uuid=currentUser.getOrg_level_uuid();   //公司uuid
      //获取公司工作时间配置信息
      FieldSetEntity fseCompanyPunch=baseDao.getFieldSetEntityByFilter(CmnConst.PRODUCT_OA_PUNCH_TIME, "org_level_uuid=?", new Object[] {org_level_uuid}, false);
      if (fseCompanyPunch==null) {
         throw new BaseException(SystemCode.COMPANY_PUNCH_TIME_NOT_CONFIG.getValue(), SystemCode.COMPANY_PUNCH_TIME_NOT_CONFIG.getText(), this.getClass(), "listMonthKanBan");
      }
      //获取查询月份
      String yearAndMonth=fse.getString("yearAndMonth");
      if (StringUtils.isEmpty(yearAndMonth)) {
         yearAndMonth=DateUtils.formatDate(new Date(), "yyyy-MM");
      }
      int workTimeMethod=0;
      if (!StringUtils.isEmpty(fseCompanyPunch.getString("work_time_two")) && !StringUtils.isEmpty(fseCompanyPunch.getString("work_time_three"))) {
         workTimeMethod=1;
      }
      StringBuilder sb=new StringBuilder();
      List<Object> param=new ArrayList<>();
      sb.append(" SELECT ");
      sb.append(" DATE_FORMAT(created_utc_datetime,'%Y-%m-%d')punch_date, ");
      sb.append(" punch_time_one,IF(punch_time_one IS TRUE,IF(DATE_FORMAT(punch_time_one,'%H:%i:%S')>?,'迟到','正常'),'上午上班未打卡')result_one, ");
      param.add(fseCompanyPunch.getDate("work_time_one","HH:mm:ss"));
      if (workTimeMethod==1) {
         sb.append(" punch_time_two,IF(punch_time_two IS TRUE,IF(DATE_FORMAT(punch_time_two,'%H:%i:%S')<?,'早退','正常'),'上午下班未打卡')result_two, ");
         param.add(fseCompanyPunch.getDate("work_time_two","HH:mm:ss"));
         sb.append(" punch_time_three,IF(punch_time_three IS TRUE,IF(DATE_FORMAT(punch_time_three,'%H:%i:%S')>?,'迟到','正常'),'下午上班未打卡')result_three, ");
         param.add(fseCompanyPunch.getDate("work_time_three","HH:mm:ss"));
      }
      sb.append(" punch_time_four,IF(punch_time_four IS TRUE,IF(DATE_FORMAT(punch_time_four,'%H:%i:%S')<?,'早退','正常'),'下午上班未打卡')result_four ");
      param.add(fseCompanyPunch.getDate("work_time_four","HH:mm:ss"));
      sb.append(" FROM product_oa_punch_record WHERE created_by=?");
      sb.append(" AND DATE_FORMAT(created_utc_datetime,'%Y-%m')=? ");
      sb.append(" AND DATE_FORMAT(created_utc_datetime,'%Y-%m-%d') NOT IN (SELECT DATE_FORMAT(date_holiday,'%Y-%m-%d')FROM product_sys_company_holiday WHERE org_level_uuid=?) ");
      param.add(user_id);
      param.add(yearAndMonth);
      param.add(org_level_uuid);
      return baseDao.listTable(sb.toString(), param.toArray());
   }
   /**
@@ -141,101 +142,143 @@
      //获取查询月份
      String yearAndMonth=fse.getString("yearAndMonth");
      String day;
      if (StringUtils.isEmpty(yearAndMonth)) {
         yearAndMonth=DateUtils.formatDate(new Date(), "yyyy-MM");
         day = DateUtils.formatDate(new Date(), "yyyy-MM-dd");
      } else {
         Calendar calendar = Calendar.getInstance();
         calendar.setTime(DateUtils.parseDate(yearAndMonth + "-01"));
         calendar.add(Calendar.MONTH, 1);
         calendar.add(Calendar.DATE, -1);
         day = DateUtils.formatDate(calendar.getTime(), "yyyy-MM-dd");
      }
      StringBuilder sb=new StringBuilder();
      List<Object> param=new ArrayList<>();
      sb.append(" SELECT a.punch_date,e.bk, ");
      sb.append(" CONCAT(if(d.punch_range_one is not null and d.punch_range_one>f.distance,'超出打卡范围',0) ");
      sb.append(" ,',',if(d.punch_range_two is not null and d.punch_range_two>f.distance,'超出打卡范围',0) ");
      sb.append(" ,',',if(d.punch_time_three is not null and d.punch_time_three>f.distance,'超出打卡范围',0) ");
      sb.append(" ,',',if(d.punch_range_four is not null and d.punch_range_four>f.distance,'超出打卡范围',0)) dkfw, ");
      sb.append(" CASE  WHEN b.uuid is not null THEN c.dict_label ELSE  ");
      sb.append(" CASE  WHEN d.uuid is not null THEN   ");
      sb.append(" CONCAT(IF(d.punch_time_one IS TRUE, IF ( DATE_FORMAT(d.punch_time_one, '%H:%i:%S' )>=DATE_FORMAT(f.morning_work, '%H:%i:%S'), CONCAT('上午迟到',TIMESTAMPDIFF(MINUTE, DATE_FORMAT(CONCAT(a.punch_date,' ',DATE_FORMAT(f.morning_work, '%H:%i:%S')),'%Y-%m-%d %H:%i:%S'),d.punch_time_one),'分钟'), 0 ), '上午上班未打卡' ) ");
      sb.append(" ,',',IF(d.punch_time_two IS TRUE, IF ( DATE_FORMAT(d.punch_time_two, '%H:%i:%S' )<=DATE_FORMAT(f.morning_work_off, '%H:%i:%S') and f.morning_work_off is not null, CONCAT('上午早退',TIMESTAMPDIFF(MINUTE,d.punch_time_two,DATE_FORMAT(CONCAT(a.punch_date,' ',DATE_FORMAT(f.morning_work_off, '%H:%i:%S')),'%Y-%m-%d %H:%i:%S')),'分钟'), 0 ), '上午下班未打卡' ) ");
      sb.append(" ,',',IF(d.punch_time_three IS TRUE, IF ( DATE_FORMAT(d.punch_time_three, '%H:%i:%S' )>=DATE_FORMAT(f.afternoon_work, '%H:%i:%S') and f.afternoon_work is not null, CONCAT('下午迟到',TIMESTAMPDIFF(MINUTE, DATE_FORMAT(CONCAT(a.punch_date,' ',DATE_FORMAT(f.afternoon_work, '%H:%i:%S')),'%Y-%m-%d %H:%i:%S'),d.punch_time_three),'分钟'), 0 ), '下午上班未打卡' ) ");
      sb.append(" ,',',IF(d.punch_time_four IS TRUE, IF ( DATE_FORMAT(d.punch_time_four, '%H:%i:%S' )<=DATE_FORMAT(f.afternoon_work_off, '%H:%i:%S'), CONCAT('下午早退',TIMESTAMPDIFF(MINUTE,d.punch_time_four,DATE_FORMAT(CONCAT(a.punch_date,' ',DATE_FORMAT(f.afternoon_work_off, '%H:%i:%S')),'%Y-%m-%d %H:%i:%S')),'分钟'), 0 ), '下午下班未打卡' )) ");
      sb.append(" ELSE '全天未打卡' END END reidis,CASE  WHEN b.uuid is not null THEN 1 ELSE CASE  WHEN d.uuid is not null THEN 0 ELSE 2 END END type ");
      sb.append(" FROM (SELECT CONCAT(DATE_FORMAT(?, '%Y-%m-'),IF(i<9,CONCAT('0',i + 1),i + 1)) punch_date  ");
      sb.append(" SELECT a.punch_date, ");
//      sb.append(" CASE  WHEN b.uuid is not null THEN '请假' ELSE ");
//      sb.append(" CASE  WHEN d.created_by is not null THEN ");
//      sb.append(" CONCAT(d.punch_type1,',',d.punch_type2,',',d.punch_type3,',',d.punch_type4) ");
//
//      sb.append(" ELSE '全天未打卡' END END reidis, ");
//      sb.append(" CASE  WHEN b.uuid is not null THEN 1 ELSE ");
//      sb.append(" CASE  WHEN d.created_by is not null THEN 0 ELSE 2 END END type, ");
      sb.append(" e.bk FROM  (");
      /*=================*/
      sb.append("\n    SELECT *");
      sb.append("\n    FROM (");
      sb.append("\n       SELECT ").append(UnifySQLFunction.dateAdd("t.month_start", "d.day", "DAY")).append(" punch_date");
      sb.append("\n       FROM (SELECT ? month_start) t");
      param.add(yearAndMonth+"-01");
      sb.append(" FROM (SELECT @row := @row + 1 as i FROM ");
      sb.append(" (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) t1, ");
      sb.append(" (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) t2, ");
      sb.append(" (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) t3, ");
      sb.append(" (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) t4, ");
      sb.append(" (SELECT @row := -1) t0) d WHERE i < DAY(last_day(DATE_FORMAT(?, '%Y-%m-01')))) a ");
      param.add(yearAndMonth+"-01");
      sb.append(" LEFT JOIN (SELECT * FROM product_oa_ask_for_leave WHERE user_id=?) b ");
      sb.append("\n       INNER JOIN (");
      sb.append("\n          SELECT 0 as day UNION ALL SELECT 1 as day UNION ALL SELECT 2 as day UNION ALL SELECT 3 as day UNION ALL SELECT 4 as day UNION ALL SELECT 5 as day UNION ALL SELECT 6 as day UNION ALL SELECT 7 as day UNION ALL SELECT 8 as day UNION ALL SELECT 9 as day UNION ALL SELECT 10 as day UNION ALL SELECT 11 as day UNION ALL SELECT 12 as day UNION ALL SELECT 13 as day UNION ALL SELECT 14 as day UNION ALL SELECT 15 as day UNION ALL SELECT 16 as day UNION ALL SELECT 17 as day UNION ALL SELECT 18 as day UNION ALL SELECT 19 as day UNION ALL SELECT 20 as day UNION ALL SELECT 21 as day UNION ALL SELECT 22 as day UNION ALL SELECT 23 as day UNION ALL SELECT 24 as day UNION ALL SELECT 25 as day UNION ALL SELECT 26 as day UNION ALL SELECT 27 as day UNION ALL SELECT 28 as day UNION ALL SELECT 29 as day UNION ALL SELECT 30 as day");
      sb.append("\n       ) d ON 1=1");
      sb.append("\n    ) t1");
      sb.append("\n    WHERE t1.punch_date<=?");
      param.add(day);
      /*==================*/
      sb.append(") a ");
      sb.append(" LEFT JOIN (SELECT * FROM product_oa_ask_for_leave WHERE user_id=? and flow_flag=2) b ");
      param.add(user_id);
      sb.append(" on DATE_FORMAT( a.punch_date, '%Y-%m-%d' )>= DATE_FORMAT( b.start_time, '%Y-%m-%d' ) and DATE_FORMAT( a.punch_date, '%Y-%m-%d' )<= DATE_FORMAT( b.end_time, '%Y-%m-%d' ) ");
      sb.append(" LEFT JOIN (SELECT * FROM product_sys_dict where dict_name='Leave_Type') c on b.leave_type =c.dict_value ");
      sb.append(" LEFT JOIN product_oa_punch_record d on a.punch_date=DATE_FORMAT( d.punch_time_one, '%Y-%m-%d' ) ");
      sb.append(" LEFT JOIN (SELECT applicant,DATE_FORMAT( replenish_date, '%Y-%m-%d') replenish_date,max(replacement_card_type) bk FROM product_oa_replenish_punch ");
      sb.append(" where applicant=? GROUP BY applicant,DATE_FORMAT( replenish_date, '%Y-%m-%d')) e on a.punch_date=e.replenish_date  ");
      sb.append(" on ").append(UnifySQLFunction.dateFormat("a.punch_date", "yyyy-MM-dd")).append(">= ").append(UnifySQLFunction.dateFormat("b.start_time", "yyyy-MM-dd")).append(" and ").append(UnifySQLFunction.dateFormat("a.punch_date", "yyyy-MM-dd")).append("<= ").append(UnifySQLFunction.dateFormat("b.end_time", "yyyy-MM-dd")).append(" ");
      sb.append(" LEFT JOIN (SELECT * FROM product_oa_punch_record_v where created_by=?) d on a.punch_date=d.punch_time ");
      param.add(user_id);
      sb.append(" LEFT JOIN  product_oa_punch_time f on d.punch_congfig_uuid =f.punch_site_uuid  ");
      sb.append(" where a.punch_date NOT IN (SELECT DATE_FORMAT( date_holiday, '%Y-%m-%d' ) FROM product_sys_company_holiday) ");
      sb.append(" LEFT JOIN (SELECT applicant,").append(UnifySQLFunction.dateFormat("replenish_date", "yyyy-MM-dd")).append(" replenish_date,").append(UnifySQLFunction.groupConcat("replacement_card_type")).append(" bk FROM product_oa_replenish_punch ");
      sb.append(" where applicant=? and flow_flag=2 GROUP BY applicant,").append(UnifySQLFunction.dateFormat("replenish_date", "yyyy-MM-dd")).append(") e on a.punch_date=e.replenish_date  ");
      param.add(user_id);
      sb.append(" where a.punch_date NOT IN (SELECT ").append(UnifySQLFunction.dateFormat("date_holiday", "yyyy-MM-dd")).append(" FROM product_sys_company_holiday) ");
      DataTableEntity dt = baseDao.listTable(sb.toString(), param.toArray());
      FieldSetEntity time = baseDao.getFieldSetByFilter(com.product.org.admin.config.CmnConst.PRODUCT_OA_PUNCH_TIME, "CONCAT(',',attendance_object,',') like CONCAT('%',?,'%')", new String[]{","+user_id+","},false);
      for (int i = 0; i < dt.getRows(); i++) {
         FieldSetEntity fs = dt.getFieldSetEntity(i);
         //当天打卡处理
         if (fs.getString("punch_date").equals(day)){
            if (null!=fs.getString("reidis")&&fs.getString("reidis").equals("全天未打卡")){
               fs.setValue("reidis",null);
               fs.setValue("dkfw",null);
            }else {
               String[] reidis = fs.getString("reidis").split(",");
               for (int j = 0; j <reidis.length ; j++) {
                  if (reidis[j].contains("未打卡")){
                     reidis[j]="0";
                  }
               }
               String string="";
               if(reidis.length!=1){
                  string = Arrays.toString(reidis);
               }else {
                  string=fs.getString("reidis");
               }
               fs.setValue("reidis",string);
            }
         }
         //获取补卡标识
         List<String> bk=new ArrayList<>();
         if (!StringUtils.isEmpty(fs.getString("bk"))){
            bk= Arrays.asList(fs.getString("bk").split(","));
         }
         if (fs.getString("reidis").equals("全天未打卡")&&!StringUtils.isEmpty(fs.getString("bk"))){
            if (!bk.contains("1")){
         if (!StringUtils.isEmpty(fs.getString("reidis"))&&fs.getString("reidis").equals("全天未打卡")&&!StringUtils.isEmpty(fs.getString("bk"))){
               if (!bk.contains("1")){
               fs.setValue("result_one", "上午上班未打卡");
            }
            if (!bk.contains("2")){
            if (!bk.contains("2")&&!StringUtils.isEmpty(time.getString("morning_work_off"))){
               fs.setValue("result_two", "上午下班未打卡");
            }
            if (!bk.contains("3")){
            if (!bk.contains("3")&&!StringUtils.isEmpty(time.getString("afternoon_work"))){
               fs.setValue("result_three", "下午上班未打卡");
            }
            if (!bk.contains("4")){
               if (!bk.contains("4")){
               fs.setValue("result_four", "下午下班未打卡");
            }
            if (StringUtils.isEmpty(fs.getString("result_one"))&&StringUtils.isEmpty(fs.getString("result_two"))&&StringUtils.isEmpty(fs.getString("result_three"))&&StringUtils.isEmpty(fs.getString("result_four"))){
               fs.setValue("type",1);
               fs.setValue("result_one","已补卡");
            }
            continue;
         }
         if ("0".equals(fs.getString("type"))){
            String[] reidis = fs.getString("reidis").split(",");
            String[] dkfwsArr = fs.getString("dkfw").split(",");
            String a="1";
            for (int j = 0; j < reidis.length; j++) {
               String dkfws="";
               if (!dkfwsArr[j].equals("0")){
                  dkfws=dkfwsArr[j];
               }
               if (reidis[j].contains("上午迟到")) {
                  if (!bk.contains("1")) {
                     fs.setValue("result_one", reidis[j]+dkfws);
                     fs.setValue("result_one", reidis[j]);
                     a = "2";
                  }
               }
               if (reidis[j].contains("上午早退")) {
                  if (!bk.contains("2")) {
                     fs.setValue("result_two", reidis[j]+dkfws);
                     fs.setValue("result_two", reidis[j]);
                     a = "2";
                  }
               }
               if (reidis[j].contains("下午迟到")) {
                  if (!bk.contains("3")) {
                     fs.setValue("result_three", reidis[j]+dkfws);
                     fs.setValue("result_three", reidis[j]);
                     a = "2";
                  }
               }
               if (reidis[j].contains("下午早退")) {
                  if (!bk.contains("3")) {
                     fs.setValue("result_four", reidis[j]+dkfws);
                     fs.setValue("result_four", reidis[j]);
                     a = "2";
                  }
               }
               if (reidis[j].contains("上午上班未打卡")) {
                     fs.setValue("result_one", reidis[j]);
               }
               if (reidis[j].contains("上午下班未打卡")&&!StringUtils.isEmpty(time.getString("morning_work_off"))) {
                     fs.setValue("result_two", reidis[j]);
                  }
               if (reidis[j].contains("下午上班未打卡")&&!StringUtils.isEmpty(time.getString("afternoon_work"))) {
                     fs.setValue("result_three", reidis[j]);
               }
               if (reidis[j].contains("下午下班未打卡")) {
                     fs.setValue("result_four", reidis[j]);
               }
            }
            if ("1".equals(a)){
@@ -249,128 +292,270 @@
      }
      return dt;
   }
//   public DataTableEntity listMonthKanBanNew(FieldSetEntity fse) {
//      //获取当前人信息
//      Integer user_id=fse.getInteger("user_id");   //user_id
//      if(user_id==null){
//         return null;
//      }
//
//      //获取查询月份
//      String yearAndMonth=fse.getString("yearAndMonth");
//      if (StringUtils.isEmpty(yearAndMonth)) {
//         yearAndMonth=DateUtils.formatDate(new Date(), "yyyy-MM");
//      }
//
//      //
//      String day=DateUtils.formatDate(new Date(), "yyyy-MM-dd");
//
//      StringBuilder sb=new StringBuilder();
//      List<Object> param=new ArrayList<>();
//
//      sb.append(" SELECT a.punch_date,e.bk,f.morning_work,f.morning_work_off,f.afternoon_work,f.afternoon_work_off, ");
//
//      sb.append(" CONCAT(if(d.punch_range_one is not null and d.punch_range_one>f.distance,'超出打卡范围',0) ");
//      sb.append(" ,',',if(d.punch_range_two is not null and d.punch_range_two>f.distance,'超出打卡范围',0) ");
//      sb.append(" ,',',if(d.punch_time_three is not null and d.punch_time_three>f.distance,'超出打卡范围',0) ");
//      sb.append(" ,',',if(d.punch_range_four is not null and d.punch_range_four>f.distance,'超出打卡范围',0)) dkfw, ");
//      sb.append(" CASE  WHEN b.uuid is not null THEN '请假' ELSE  ");
//      sb.append(" CASE  WHEN d.uuid is not null THEN   ");
//      sb.append(" CONCAT(IF(d.punch_time_one IS TRUE, IF ( DATE_FORMAT(d.punch_time_one, '%H:%i:%S' )>DATE_FORMAT(f.morning_work, '%H:%i:%S'), CONCAT('上午迟到',TIMESTAMPDIFF(MINUTE, DATE_FORMAT(CONCAT(a.punch_date,' ',DATE_FORMAT(f.morning_work, '%H:%i:%S')),'%Y-%m-%d %H:%i:%S'),d.punch_time_one),'分钟'), 0 ), '上午上班未打卡' ) ");
//      sb.append(" ,',',IF(d.punch_time_two IS TRUE, IF ( DATE_FORMAT(d.punch_time_two, '%H:%i:%S' )<DATE_FORMAT(f.morning_work_off, '%H:%i:%S') and f.morning_work_off is not null, CONCAT('上午早退',TIMESTAMPDIFF(MINUTE,d.punch_time_two,DATE_FORMAT(CONCAT(a.punch_date,' ',DATE_FORMAT(f.morning_work_off, '%H:%i:%S')),'%Y-%m-%d %H:%i:%S')),'分钟'), 0 ), '上午下班未打卡' ) ");
//      sb.append(" ,',',IF(d.punch_time_three IS TRUE, IF ( DATE_FORMAT(d.punch_time_three, '%H:%i:%S' )>DATE_FORMAT(f.afternoon_work, '%H:%i:%S') and f.afternoon_work is not null, CONCAT('下午迟到',TIMESTAMPDIFF(MINUTE, DATE_FORMAT(CONCAT(a.punch_date,' ',DATE_FORMAT(f.afternoon_work, '%H:%i:%S')),'%Y-%m-%d %H:%i:%S'),d.punch_time_three),'分钟'), 0 ), '下午上班未打卡' ) ");
//      sb.append(" ,',',IF(d.punch_time_four IS TRUE, IF ( DATE_FORMAT(d.punch_time_four, '%H:%i:%S' )<DATE_FORMAT(f.afternoon_work_off, '%H:%i:%S'), CONCAT('下午早退',TIMESTAMPDIFF(MINUTE,d.punch_time_four,DATE_FORMAT(CONCAT(a.punch_date,' ',DATE_FORMAT(f.afternoon_work_off, '%H:%i:%S')),'%Y-%m-%d %H:%i:%S')),'分钟'), 0 ), '下午下班未打卡' )) ");
//      sb.append(" ELSE '全天未打卡' END END reidis,CASE  WHEN b.uuid is not null THEN 1 ELSE CASE  WHEN d.uuid is not null THEN 0 ELSE 2 END END type ");
//      sb.append(" FROM (SELECT CONCAT(DATE_FORMAT(?, '%Y-%m-'),IF(i<9,CONCAT('0',i + 1),i + 1)) punch_date   ");
//      param.add(yearAndMonth+"-01");
//      sb.append(" FROM (SELECT @row := @row + 1 as i FROM ");
//      sb.append(" (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) t1, ");
//      sb.append(" (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) t2, ");
//      sb.append(" (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) t3, ");
//      sb.append(" (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) t4, ");
//      sb.append(" (SELECT @row := -1) t0) d WHERE i < DAY(last_day(DATE_FORMAT(?, '%Y-%m-01'))) and   CONCAT(DATE_FORMAT(?, '%Y-%m-'),IF(i<9,CONCAT('0',i + 1),i + 1))<=?  ) a ");
//      param.add(yearAndMonth+"-01");
//      param.add(yearAndMonth+"-01");
//      param.add(day);
//      sb.append(" LEFT JOIN (SELECT * FROM product_oa_ask_for_leave WHERE user_id=? and flow_flag=2) b ");
//      param.add(user_id);
//      sb.append(" on DATE_FORMAT( a.punch_date, '%Y-%m-%d' )>= DATE_FORMAT( b.start_time, '%Y-%m-%d' ) and DATE_FORMAT( a.punch_date, '%Y-%m-%d' )<= DATE_FORMAT( b.end_time, '%Y-%m-%d' ) ");
//      sb.append(" LEFT JOIN product_oa_punch_record d on a.punch_date=DATE_FORMAT( d.punch_time_one, '%Y-%m-%d' ) ");
//      sb.append(" LEFT JOIN (SELECT applicant,DATE_FORMAT( replenish_date, '%Y-%m-%d') replenish_date,max(replacement_card_type) bk FROM product_oa_replenish_punch ");
//      sb.append(" where applicant=? and flow_flag=2 GROUP BY applicant,DATE_FORMAT( replenish_date, '%Y-%m-%d')) e on a.punch_date=e.replenish_date  ");
//      param.add(user_id);
//      sb.append(" LEFT JOIN  product_oa_punch_time f on d.punch_congfig_uuid =f.punch_site_uuid  ");
//      sb.append(" where a.punch_date NOT IN (SELECT DATE_FORMAT( date_holiday, '%Y-%m-%d' ) FROM product_sys_company_holiday) ");
//      DataTableEntity dt = baseDao.listTable(sb.toString(), param.toArray());
//      for (int i = 0; i < dt.getRows(); i++) {
//         FieldSetEntity fs = dt.getFieldSetEntity(i);
//         //当天打卡处理
//         if (fs.getString("punch_date").equals(day)){
//            if (null!=fs.getString("reidis")&&fs.getString("reidis").equals("全天未打卡")){
//               fs.setValue("reidis",null);
//               fs.setValue("dkfw",null);
//            }else {
//               String[] reidis = fs.getString("reidis").split(",");
//               for (int j = 0; j <reidis.length ; j++) {
//                  if (reidis[j].contains("未打卡")){
//                     reidis[j]="0";
//                  }
//               }
//               String string="";
//               if(reidis.length!=1){
//                  string = Arrays.toString(reidis);
//               }else {
//                  string=fs.getString("reidis");
//               }
//               fs.setValue("reidis",string);
//            }
//         }
//         //获取补卡标识
//         List<String> bk=new ArrayList<>();
//         if (!StringUtils.isEmpty(fs.getString("bk"))){
//            bk= Arrays.asList(fs.getString("bk").split(","));
//         }
//         if (!StringUtils.isEmpty(fs.getString("reidis"))&&fs.getString("reidis").equals("全天未打卡")&&!StringUtils.isEmpty(fs.getString("bk"))){
//            if (!bk.contains("1")){
//               fs.setValue("result_one", "上午上班未打卡");
//            }
//            if (!bk.contains("2")&&!StringUtils.isEmpty(fs.getString("morning_work_off"))){
//               fs.setValue("result_two", "上午下班未打卡");
//            }
//            if (!bk.contains("3")&&!StringUtils.isEmpty(fs.getString("afternoon_work"))){
//               fs.setValue("result_three", "下午上班未打卡");
//            }
//            if (!bk.contains("4")){
//               fs.setValue("result_four", "下午下班未打卡");
//            }
//            continue;
//         }
//         if ("0".equals(fs.getString("type"))){
//            String[] reidis = fs.getString("reidis").split(",");
//            String[] dkfwsArr = fs.getString("dkfw").split(",");
//            String a="1";
//            for (int j = 0; j < reidis.length; j++) {
//               String dkfws="";
//               if (!dkfwsArr[j].equals("0")){
//                  dkfws=dkfwsArr[j];
//               }
//               if (reidis[j].contains("上午迟到")) {
//                  if (!bk.contains("1")) {
//                     fs.setValue("result_one", reidis[j]+dkfws);
//                     a = "2";
//                  }
//               }
//               if (reidis[j].contains("上午早退")) {
//                  if (!bk.contains("2")) {
//                     fs.setValue("result_two", reidis[j]+dkfws);
//                     a = "2";
//                  }
//               }
//               if (reidis[j].contains("下午迟到")) {
//                  if (!bk.contains("3")) {
//                     fs.setValue("result_three", reidis[j]+dkfws);
//                     a = "2";
//                  }
//               }
//               if (reidis[j].contains("下午早退")) {
//                  if (!bk.contains("3")) {
//                     fs.setValue("result_four", reidis[j]+dkfws);
//                     a = "2";
//                  }
//               }
//               if (reidis[j].contains("上午上班未打卡")) {
//                  fs.setValue("result_one", reidis[j]);
//               }
//               if (reidis[j].contains("上午下班未打卡")) {
//                  fs.setValue("result_two", reidis[j]);
//               }
//               if (reidis[j].contains("下午上班未打卡")) {
//                  fs.setValue("result_three", reidis[j]);
//               }
//               if (reidis[j].contains("下午下班未打卡")) {
//                  fs.setValue("result_four", reidis[j]);
//               }
//            }
//            if ("1".equals(a)){
//               fs.setValue("type",a);
//               fs.setValue("result_one","正常打卡");
//            }
//
//         }else {
//            fs.setValue("result_one",fs.getString("reidis"));
//         }
//      }
//      return dt;
//   }
   /**
    *    考勤统计报表
    * @param fse
    * @return
    */
   public DataTableEntity listMonthReport(FieldSetEntity fse) {
      //获取当前人信息
      SystemUser currentUser=SpringMVCContextHolder.getCurrentUser();
      String org_level_uuid=currentUser.getOrg_level_uuid();
      //获取公司工作时间配置信息
      FieldSetEntity fseCompanyPunch=baseDao.getFieldSetEntityByFilter(CmnConst.PRODUCT_OA_PUNCH_TIME, "", new Object[] {}, false);
      if (fseCompanyPunch==null) {
         throw new BaseException(SystemCode.COMPANY_PUNCH_TIME_NOT_CONFIG.getValue(), SystemCode.COMPANY_PUNCH_TIME_NOT_CONFIG.getText(), this.getClass(), "listMonthReport");
      }
      //获取查询月份
      String yearAndMonth=fse.getString("yearAndMonth");
      if (StringUtils.isEmpty(yearAndMonth)) {
         yearAndMonth=DateUtils.formatDate(new Date(), "yyyy-MM");
      }
      //获取每月天数
      int dayOfMonth = DateUtils.getMonthHasDays(DateUtils.parseDate(yearAndMonth));
      //获取本月节假日
      DataTableEntity dtHoliday=baseDao.listTable("product_sys_company_holiday", "date_holiday like ?", new Object[] {yearAndMonth+"%"});
      //获取每月应上班天数
      int dayOfWork = 0;
      if (BaseUtil.dataTableIsEmpty(dtHoliday)) {
         dayOfWork=dayOfMonth;
      }else {
         dayOfWork=dayOfMonth-dtHoliday.getRows();
      }
      //workTimeMethod 0:上午上班,下午下班  1:一卡 2:四卡  3:上午上班,下午上班
      int workTimeMethod=0;
       if (StringUtils.isEmpty(fseCompanyPunch.getString("work_time_two")) && StringUtils.isEmpty(fseCompanyPunch.getString("work_time_three")) && StringUtils.isEmpty(fseCompanyPunch.getString("work_time_four"))) {
          workTimeMethod=1;
      } else if (!StringUtils.isEmpty(fseCompanyPunch.getString("work_time_two")) && !StringUtils.isEmpty(fseCompanyPunch.getString("work_time_three")) && !StringUtils.isEmpty(fseCompanyPunch.getString("work_time_four"))) {
         workTimeMethod=2;
      } else if (StringUtils.isEmpty(fseCompanyPunch.getString("work_time_two")) && StringUtils.isEmpty(fseCompanyPunch.getString("work_time_four"))) {
         workTimeMethod=3;
      }
         //获取查询月份
         String yearAndMonth=fse.getString("yearAndMonth");
         if (StringUtils.isEmpty(yearAndMonth)) {
            yearAndMonth=DateUtils.formatDate(new Date(), "yyyy-MM");
         }
      int year = Integer.parseInt(yearAndMonth.split("-")[0]);
      int month = Integer.parseInt(yearAndMonth.split("-")[1]);
      LocalDate monthEndDate = YearMonth.of(year, month).atEndOfMonth();
         //获取每月天数
         int dayOfMonth = DateUtils.getMonthHasDays(DateUtils.parseDate(yearAndMonth));
         //获取本月节假日
         DataTableEntity dtHoliday=baseDao.listTable("product_sys_company_holiday", "date_holiday like ?", new Object[] {yearAndMonth+"%"});
         //获取每月应上班天数
         int dayOfWork = 0;
         if (BaseUtil.dataTableIsEmpty(dtHoliday)) {
            dayOfWork=dayOfMonth;
         }else {
            dayOfWork=dayOfMonth-dtHoliday.getRows();
         }
      ArrayList<String> param = new ArrayList<>();
      StringBuilder sb=new StringBuilder();
      List<Object>param=new ArrayList<>();
      sb.append(" SELECT ");
      sb.append(" b.user_id,( SELECT user_name FROM product_sys_users WHERE user_id = b.user_id ) created_by, ");
      sb.append(" ( SELECT org_level_name FROM product_sys_org_levels WHERE uuid = dept_uuid ) dept_uuid, ");
      sb.append(" "+dayOfWork+" dayOfWork,workDayOfMonth,lateCome,leaveEarly,total_hours,askForLeave,("+dayOfWork+" - workDayOfMonth-askForLeave) absenteeism  ");
      sb.append(" FROM(SELECT b.created_by,b.workDayOfMonth+bb.replenish_date workDayOfMonth,b.dept_uuid,b.lateCome1 lateCome,b.leaveEarly2 leaveEarly FROM ");
      sb.append(" (SELECT a.created_by,COUNT( day_of_month ) workDayOfMonth,a.dept_uuid, ");
      sb.append(" COUNT(IF( result1 like '%迟到%', TRUE, NULL )) lateCome1,");
      sb.append(" COUNT(IF( result3 like '%迟到%', TRUE, NULL )) lateCome2,");
      sb.append(" COUNT(IF( result2 like '%早退%', TRUE, NULL )) leaveEarly1, ");
      sb.append(" COUNT(IF( result4 like '%早退%', TRUE, NULL )) leaveEarly2 ");
      sb.append(" FROM(SELECT d.created_by,d.dept_uuid,DATE_FORMAT( d.punch_time, '%Y-%m-%d' ) day_of_month,punch_type1 result1,punch_type2 result2,punch_type3 result3,punch_type4 result4 ");
      sb.append(" FROM product_oa_punch_record_v d ");
      sb.append(" LEFT JOIN product_oa_punch_time e ON e.attendance_object like  CONCAT('%',d.created_by,'%') ");
      sb.append(" where DATE_FORMAT( d.punch_time, '%Y-%m' )=? ");
      param.add(yearAndMonth);
      sb.append(" AND DATE_FORMAT( d.punch_time, '%Y-%m-%d' ) NOT IN ( SELECT date_holiday FROM product_sys_company_holiday )) a  ");
      sb.append(" GROUP BY a.created_by,a.dept_uuid ) b  ");
      sb.append(" LEFT JOIN (SELECT applicant,COUNT( 1 ) replenish_date FROM ");
      sb.append(" (SELECT applicant,DATE_FORMAT(replenish_date, '%Y-%m-%d') replenish_date FROM product_oa_replenish_punch a ");
      sb.append(" LEFT JOIN product_oa_punch_record_v b on DATE_FORMAT(a.replenish_date, '%Y-%m-%d')=b.punch_time and a.applicant=b.created_by ");
      sb.append(" where b.created_by is  null and DATE_FORMAT(replenish_date, '%Y-%m')=? GROUP BY DATE_FORMAT(replenish_date, '%Y-%m-%d'),applicant)a ");
      param.add(yearAndMonth);
      sb.append(" GROUP BY applicant,DATE_FORMAT(replenish_date, '%Y-%m')) bb on b.created_by=bb.applicant ");
      sb.append(" ) a ");
      sb.append(" RIGHT JOIN (SELECT user_id,sum( duration ) total_hours FROM product_oa_work_overtime o ");
      sb.append(" LEFT JOIN product_oa_work_overtime_sub b ON o.uuid = b.main_uuid AND DATE_FORMAT( b.start_time, '%Y-%m' )=? ");
      param.add(yearAndMonth);
      sb.append(" GROUP BY o.user_id ) b ON a.created_by = b.user_id ");
      sb.append(" LEFT JOIN ");
      sb.append("(SELECT a.created_by,sum(askForLeave) askForLeave FROM (SELECT a.created_by,a.askForLeave-COUNT(1) askForLeave FROM ");
      sb.append(" (SELECT created_by,DATEDIFF(if(DATE_FORMAT(end_time, '%Y-%m-%d')<=?,DATE_FORMAT(end_time, '%Y-%m-%d'),?), if(DATE_FORMAT(start_time, '%Y-%m-%d' )>=?,DATE_FORMAT(start_time, '%Y-%m-%d' ),?))+1 askForLeave,start_time,end_time ");
      sb.append(" FROM product_oa_ask_for_leave a where (DATE_FORMAT( start_time, '%Y-%m' )=? or DATE_FORMAT( end_time, '%Y-%m' )=?) AND flow_flag = 2 ) a ");
      param.add(String.valueOf(monthEndDate));
      param.add(String.valueOf(monthEndDate));
      param.add(yearAndMonth+"-01");
      param.add(yearAndMonth+"-01");
      param.add(yearAndMonth);
      param.add(yearAndMonth);
      sb.append(" LEFT JOIN product_sys_company_holiday b on b.date_holiday<= a.end_time and b.date_holiday>=a.start_time and DATE_FORMAT(b.date_holiday, '%Y-%m')=?");
      sb.append(" GROUP BY a.created_by,a.askForLeave) a GROUP BY created_by )");
      param.add(yearAndMonth);
      sb.append(" SELECT ");
      sb.append(" (SELECT user_name FROM product_sys_users WHERE user_id=a.created_by)created_by, ");
      sb.append(" (SELECT org_level_name FROM product_sys_org_levels WHERE uuid=dept_uuid)dept_uuid, ");
      sb.append(" dayOfWork,workDayOfMonth,lateCome,leaveEarly,total_hours,casual_leave,medical_leave,marriage_leave,paid_leave,other_leave,(dayOfWork-workDayOfMonth)absenteeism ");
      sb.append(" FROM ( ");
      sb.append(" SELECT ");
      sb.append(" a.created_by,"+dayOfWork+" dayOfWork,COUNT(day_of_month)workDayOfMonth,a.dept_uuid, ");
      if (workTimeMethod==0) {
         sb.append(" COUNT(IF(result1='迟到',TRUE,NULL)) lateCome, ");
         sb.append(" COUNT(IF(result4='早退',TRUE,NULL)) leaveEarly ");
      }else if (workTimeMethod==1) {
         sb.append(" COUNT(IF(result1='迟到',TRUE,NULL)) lateCome, ");
         sb.append(" 0 leaveEarly ");
      }else if (workTimeMethod==2) {
         sb.append(" COUNT(IF(result1='迟到',TRUE,NULL))+COUNT(IF(result3='迟到',TRUE,NULL)) lateCome, ");
         sb.append(" COUNT(IF(result2='早退',TRUE,NULL))+COUNT(IF(result4='早退',TRUE,NULL)) leaveEarly ");
      }else if (workTimeMethod==3) {
         sb.append(" COUNT(IF(result1='迟到',TRUE,NULL))+COUNT(IF(result3='迟到',TRUE,NULL)) lateCome, ");
         sb.append(" 0 leaveEarly ");
      sb.append(" c ON b.user_id = c.created_by ");
      sb.append(" ORDER BY dept_uuid,a.created_by");
      DataTableEntity dataTableEntityReport = baseDao.listTable(sb.toString(), param.toArray());
      for (int i = 0; i <dataTableEntityReport.getRows() ; i++) {
         FieldSetEntity fs = dataTableEntityReport.getFieldSetEntity(i);
         if (StringUtils.isEmpty(fs.getString("dept_uuid"))){
            FieldSetEntity org_level_name = baseDao.getFieldSetEntityBySQL("SELECT org_level_name FROM `product_sys_staffs` a LEFT JOIN product_sys_org_levels b on a.dept_uuid=b.uuid where a.user_id=?", new String[]{fs.getString("user_id")}, false);
            fs.setValue("dept_uuid",org_level_name.getString("org_level_name"));
         }
      }
      /*
      if (workTimeMethod==1) {
         sb.append(" COUNT(IF(result1='迟到',TRUE,NULL))+COUNT(IF(result3='迟到',TRUE,NULL)) lateCome, ");
         sb.append(" COUNT(IF(result2='早退',TRUE,NULL))+COUNT(IF(result4='早退',TRUE,NULL)) leaveEarly ");
      } else if (workTimeMethod==2) {
         sb.append("");
      } else if (workTimeMethod==3) {
      } else {
         sb.append(" COUNT(IF(result1='迟到',TRUE,NULL)) lateCome, ");
         sb.append(" COUNT(IF(result4='早退',TRUE,NULL)) leaveEarly ");
      }
      */
      sb.append(" FROM ( ");
      sb.append(" SELECT ");
      sb.append(" created_by,dept_uuid, ");
      sb.append(" DATE_FORMAT(created_utc_datetime,'%Y-%m-%d') day_of_month, ");
      sb.append(" punch_time_one,IF(punch_time_one IS TRUE,IF(DATE_FORMAT(punch_time_one,'%H:%i:%S')>'09:00:00','迟到','正常'),'未打卡') result1 ");
//      sb.append(" punch_time_two,IF(punch_time_two IS TRUE,IF(DATE_FORMAT(punch_time_two,'%H:%i:%S')<'12:00:00','早退','正常'),'未打卡') result2, ");
//      sb.append(" punch_time_three,IF(punch_time_three IS TRUE,IF(DATE_FORMAT(punch_time_three,'%H:%i:%S')>'14:00:00','迟到','正常'),'未打卡') result3, ");
//      sb.append(" punch_time_four,IF(punch_time_four IS TRUE,IF(DATE_FORMAT(punch_time_four,'%H:%i:%S')<'17:00:00','早退','正常'),'未打卡') result4 ");
      if (workTimeMethod==0) {
         sb.append(", punch_time_four,IF(punch_time_four IS TRUE,IF(DATE_FORMAT(punch_time_four,'%H:%i:%S')<'17:00:00','早退','正常'),'未打卡') result4 ");
      }else if (workTimeMethod==2) {
         sb.append(", punch_time_two,IF(punch_time_two IS TRUE,IF(DATE_FORMAT(punch_time_two,'%H:%i:%S')<'12:00:00','早退','正常'),'未打卡') result2 ");
         sb.append(", punch_time_three,IF(punch_time_three IS TRUE,IF(DATE_FORMAT(punch_time_three,'%H:%i:%S')>'14:00:00','迟到','正常'),'未打卡') result3 ");
         sb.append(", punch_time_four,IF(punch_time_four IS TRUE,IF(DATE_FORMAT(punch_time_four,'%H:%i:%S')<'17:00:00','早退','正常'),'未打卡') result4 ");
      }else if (workTimeMethod==3) {
         sb.append(", punch_time_three,IF(punch_time_three IS TRUE,IF(DATE_FORMAT(punch_time_three,'%H:%i:%S')>'14:00:00','迟到','正常'),'未打卡') result3 ");
      }
      sb.append(" FROM product_oa_punch_record ");
      sb.append(" WHERE DATE_FORMAT(created_utc_datetime,'%Y-%m')=? AND DATE_FORMAT(punch_time_one,'%Y-%m-%d') NOT IN(SELECT date_holiday FROM product_sys_company_holiday) ");
      sb.append(" )a  ");
      sb.append(" GROUP BY a.created_by,a.dept_uuid ");
      sb.append(" )a ");
      sb.append(" LEFT JOIN (SELECT user_id,sum(total_hours)total_hours FROM product_oa_work_overtime WHERE flow_flag=2 AND DATE_FORMAT(start_time,'%Y-%m')=? GROUP BY user_id)b  ");
      sb.append(" ON a.created_by=b.user_id ");
      sb.append(" LEFT JOIN ( ");
      sb.append(" SELECT ");
      sb.append(" created_by,sum(IF(leave_type=1,TRUE,0))casual_leave,sum(IF(leave_type=2,TRUE,0))medical_leave, ");
      sb.append(" sum(IF(leave_type=9,TRUE,0))marriage_leave,sum(IF(leave_type=4,TRUE,0))paid_leave, ");
      sb.append(" sum(IF(leave_type!=1 && leave_type!=2 && leave_type!=4 && leave_type!=9,TRUE,0))other_leave ");
      sb.append(" FROM product_oa_ask_for_leave ");
      sb.append(" WHERE DATE_FORMAT(start_time,'%Y-%m')=? ");
      sb.append(" GROUP BY created_by ");
      sb.append(" )c ");
      sb.append(" ON a.created_by=c.created_by ");
      sb.append(" ORDER BY dept_uuid,a.created_by ");
      return baseDao.listTable(sb.toString(), param.toArray());
      //处理补卡的情况
//      List<Object>param2= new ArrayList<>();
//      param2.add(fse.getString("yearAndMonth"));
//
//      StringBuilder sbReplenish=new StringBuilder();
//      sbReplenish.append(" SELECT DISTINCT replenish_date ");
//      sbReplenish.append(" FROM product_oa_replenish_punch ");
//      sbReplenish.append(" WHERE");
//      sbReplenish.append(" applicant =? and flow_flag=2");
//      sbReplenish.append(" AND DATE_FORMAT( replenish_date, '%Y-%m' )=? ");
//      sbReplenish.append(" and DATE_FORMAT( replenish_date, '%Y-%m-%d') ");
//      sbReplenish.append(" not in (");
//      sbReplenish.append(" SELECT DISTINCT record_data FROM ");
//      sbReplenish.append(" ( ");
//      sbReplenish.append(" select  DATE_FORMAT(punch_time, '%Y-%m-%d') as record_data  from  product_oa_punch_record_v ");
//      sbReplenish.append(" )n )");
//      DataTableEntity dataTableEntityReplenish = baseDao.listTable(sbReplenish.toString(), param2.toArray());
//      if(dataTableEntityReplenish.getRows()!=0){
//         dataTableEntityReport.getData().get(0).setValue("workDayOfMonth",Integer.parseInt(dataTableEntityReport.getData().get(0).getString("workDayOfMonth"))+dataTableEntityReplenish.getRows());
//         dataTableEntityReport.getData().get(0).setValue("dayOfWork",Integer.parseInt(dataTableEntityReport.getData().get(0).getString("dayOfWork"))-dataTableEntityReplenish.getRows());
//      }
      return  dataTableEntityReport;
   }
}