源码文件 仅修改 GetKqReportCmd
This commit is contained in:
parent
6efd593e65
commit
f81928788c
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,239 @@
|
|||
package com.engine.kq.biz;
|
||||
|
||||
import weaver.cache.*;
|
||||
import weaver.conn.RecordSet;
|
||||
import weaver.general.Util;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
/**
|
||||
* 报表自定义字段
|
||||
*/
|
||||
public class KQReportFieldComInfo extends CacheBase{
|
||||
protected static String TABLE_NAME = "kq_report_field";
|
||||
/** sql中的where信息,不要以where开始 */
|
||||
protected static String TABLE_WHERE = null;
|
||||
/** sql中的order by信息,不要以order by开始 */
|
||||
protected static String TABLE_ORDER = "showorder";
|
||||
|
||||
@PKColumn(type = CacheColumnType.NUMBER)
|
||||
protected static String PK_NAME = "id";
|
||||
|
||||
@CacheColumn(name = "fieldname")
|
||||
protected static int fieldname;
|
||||
|
||||
@CacheColumn(name = "fieldlabel")
|
||||
protected static int fieldlabel;
|
||||
|
||||
@CacheColumn(name = "unittype")
|
||||
protected static int unittype;
|
||||
|
||||
@CacheColumn(name = "width")
|
||||
protected static int width;
|
||||
|
||||
@CacheColumn(name = "parentid")
|
||||
protected static int parentid;
|
||||
|
||||
@CacheColumn(name = "isdefinedcolumn")
|
||||
protected static int isdefinedcolumn;
|
||||
|
||||
@CacheColumn(name = "defaultshow")
|
||||
protected static int defaultshow;
|
||||
|
||||
@CacheColumn(name = "isleavetype")
|
||||
protected static int isleavetype;
|
||||
|
||||
@CacheColumn(name = "reporttype")
|
||||
protected static int reporttype;
|
||||
|
||||
@CacheColumn(name = "reporttype1")
|
||||
protected static int reporttype1;
|
||||
|
||||
@CacheColumn(name = "isdataColumn")
|
||||
protected static int isdataColumn;
|
||||
|
||||
@CacheColumn(name = "showDetial")
|
||||
protected static int showDetial;
|
||||
|
||||
@CacheColumn(name = "groupid")
|
||||
protected static int groupid;
|
||||
|
||||
@CacheColumn(name = "isenable")
|
||||
protected static int isenable;
|
||||
|
||||
// #1276494 概述:满足薪酬指标项关联考勤报表列数据需求 By T.W
|
||||
@CacheColumn(name = "if_salary_need")
|
||||
protected static int ifSalaryNeed;
|
||||
|
||||
@CacheColumn(name = "formula")
|
||||
protected static int formula;
|
||||
|
||||
@CacheColumn(name = "issystem")
|
||||
protected static int issystem;
|
||||
|
||||
@CacheColumn(name = "cascadekey")
|
||||
protected static int cascadekey;
|
||||
|
||||
@CacheColumn(name = "dailyShowOrder")
|
||||
protected static int dailyShowOrder;
|
||||
|
||||
public static ConcurrentHashMap<String, String> cascadekey2fieldname = new ConcurrentHashMap<String, String>();
|
||||
public static ConcurrentHashMap<String, String> field2Id = new ConcurrentHashMap<String, String>();
|
||||
|
||||
@Override
|
||||
protected CacheMap initCache() throws Exception {
|
||||
CacheMap localData = createCacheMap();
|
||||
RecordSet rs = new RecordSet();
|
||||
cascadekey2fieldname.clear();
|
||||
field2Id.clear();
|
||||
// String sql = " select a.id,fieldname,fieldlabel,width,unittype,parentid,isdefinedcolumn,defaultshow,isleavetype," +
|
||||
// " reporttype,isdatacolumn,showdetial,a.showorder,groupid,isenable,formula,issystem,cascadekey " +
|
||||
// " from kq_report_field a left join kq_report_field_group b on a.groupid = b.id " +
|
||||
// " order by b.showorder asc, a.showorder asc ";
|
||||
|
||||
// #1276494 概述:满足薪酬指标项关联考勤报表列数据需求 By T.W
|
||||
String sql = " SELECT id, fieldname,fieldlabel, unittype,width,parentid,isdefinedcolumn,defaultshow,isleavetype,'month' as reporttype, reporttype as reporttype1,isdataColumn," +
|
||||
" showDetial,groupid,isenable,if_salary_need,formula,issystem,cascadekey,dailyShowOrder FROM kq_report_field where fieldname= 'lastname' ";
|
||||
rs.executeQuery(sql);
|
||||
while (rs.next()) {
|
||||
if(Util.null2String(rs.getString("cascadekey")).length()>0){
|
||||
String[] arrCascadekey = Util.splitString(rs.getString("cascadekey"),",");
|
||||
for(int i=0;i<arrCascadekey.length;i++){
|
||||
cascadekey2fieldname.put(arrCascadekey[i],rs.getString("fieldname"));
|
||||
}
|
||||
}
|
||||
String id = Util.null2String(rs.getString(PK_NAME))+""+Util.null2String(rs.getString("reporttype"));
|
||||
field2Id.put(Util.null2String(rs.getString("fieldname")),id);
|
||||
CacheItem cacheItem = createCacheItem();
|
||||
parseResultSetToCacheItem(rs, cacheItem);
|
||||
modifyCacheItem(id, cacheItem);
|
||||
localData.put(id, cacheItem);
|
||||
}
|
||||
// #1276494 概述:满足薪酬指标项关联考勤报表列数据需求 By T.W
|
||||
sql = " SELECT id, fieldname,fieldlabel, unittype,width,parentid,isdefinedcolumn,defaultshow,isleavetype,'month' as reporttype, reporttype as reporttype1,isdataColumn," +
|
||||
" showDetial,groupid,isenable,if_salary_need,formula,issystem,cascadekey,dailyShowOrder FROM (" +
|
||||
" SELECT CASE WHEN b.showorder IS NULL THEN 999 ELSE b.showorder END AS tmp_showorder," +
|
||||
" a.* " +
|
||||
" FROM kq_report_field a LEFT JOIN kq_report_field_group b ON a.groupid = b.id where reportType in('all','month')) a" +
|
||||
" ORDER BY a.tmp_showorder ASC, a.showorder ASC ";
|
||||
rs.executeQuery(sql);
|
||||
while (rs.next()) {
|
||||
if(Util.null2String(rs.getString("cascadekey")).length()>0){
|
||||
String[] arrCascadekey = Util.splitString(rs.getString("cascadekey"),",");
|
||||
for(int i=0;i<arrCascadekey.length;i++){
|
||||
cascadekey2fieldname.put(arrCascadekey[i],rs.getString("fieldname"));
|
||||
}
|
||||
}
|
||||
String id = Util.null2String(rs.getString(PK_NAME))+""+Util.null2String(rs.getString("reporttype"));
|
||||
field2Id.put(Util.null2String(rs.getString("fieldname")),id);
|
||||
CacheItem cacheItem = createCacheItem();
|
||||
parseResultSetToCacheItem(rs, cacheItem);
|
||||
modifyCacheItem(id, cacheItem);
|
||||
localData.put(id, cacheItem);
|
||||
}
|
||||
// #1276494 概述:满足薪酬指标项关联考勤报表列数据需求 By T.W
|
||||
sql = " SELECT id, fieldname,fieldlabel, unittype,width,parentid,isdefinedcolumn,defaultshow,isleavetype,'daily' as reporttype,reporttype as reporttype1, isdataColumn," +
|
||||
" showDetial,groupid,isenable,if_salary_need,formula,issystem,cascadekey,dailyShowOrder" +
|
||||
" FROM kq_report_field a where reportType in('all','daily') ORDER BY dailyShowOrder ASC ";
|
||||
rs.executeQuery(sql);
|
||||
while (rs.next()) {
|
||||
String id = Util.null2String(rs.getString(PK_NAME))+""+Util.null2String(rs.getString("reporttype"));
|
||||
CacheItem cacheItem = createCacheItem();
|
||||
parseResultSetToCacheItem(rs, cacheItem);
|
||||
modifyCacheItem(id, cacheItem);
|
||||
localData.put(id, cacheItem);
|
||||
}
|
||||
return localData;
|
||||
}
|
||||
|
||||
public String getId(){
|
||||
return (String)getRowValue(PK_INDEX);
|
||||
}
|
||||
|
||||
public String getFieldname() { return (String)getRowValue(fieldname); }
|
||||
|
||||
public String getFieldname(String key)
|
||||
{
|
||||
return (String)getValue(fieldname,key);
|
||||
}
|
||||
|
||||
public String getFieldlabel() { return (String)getRowValue(fieldlabel); }
|
||||
public String getFieldlabel(String key)
|
||||
{
|
||||
return (String)getValue(fieldlabel,key);
|
||||
}
|
||||
|
||||
public String getUnittype() { return (String)getRowValue(unittype); }
|
||||
public String getUnittype(String key)
|
||||
{
|
||||
return (String)getValue(unittype,key);
|
||||
}
|
||||
|
||||
public String getWidth() { return (String)getRowValue(width); }
|
||||
public String getWidth(String key)
|
||||
{
|
||||
return (String)getValue(width,key);
|
||||
}
|
||||
|
||||
public String getParentid() { return (String)getRowValue(parentid); }
|
||||
public String getParentid(String key)
|
||||
{
|
||||
return (String)getValue(parentid,key);
|
||||
}
|
||||
|
||||
public String getIsDefinedColumn() { return (String)getRowValue(isdefinedcolumn); }
|
||||
public String getIsDefinedColumn(String key)
|
||||
{
|
||||
return (String)getValue(isdefinedcolumn,key);
|
||||
}
|
||||
|
||||
public String getDefaultShow() { return (String)getRowValue(defaultshow); }
|
||||
public String getDefaultShow(String key)
|
||||
{
|
||||
return (String)getValue(defaultshow,key);
|
||||
}
|
||||
|
||||
public String getIsLeaveType() { return (String)getRowValue(isleavetype); }
|
||||
public String getIsLeaveType(String key) { return (String)getValue(isleavetype,key); }
|
||||
|
||||
public String getReportType() { return (String)getRowValue(reporttype); }
|
||||
public String getReportType(String key) { return (String)getValue(reporttype,key); }
|
||||
|
||||
public String getReportType1() { return (String)getRowValue(reporttype1); }
|
||||
public String getReportType1(String key) { return (String)getValue(reporttype1,key); }
|
||||
|
||||
public String getIsdataColumn() { return (String)getRowValue(isdataColumn); }
|
||||
public String getIsdataColumn(String key) { return (String)getValue(isdataColumn,key); }
|
||||
|
||||
public String getShowDetial() { return (String)getRowValue(showDetial); }
|
||||
public String getShowDetial(String key) { return (String)getValue(showDetial,key); }
|
||||
|
||||
public String getGroupid() { return (String)getRowValue(groupid); }
|
||||
public String getGroupid(String key) { return (String)getValue(groupid,key); }
|
||||
|
||||
public String getIsenable() { return (String)getRowValue(isenable); }
|
||||
public String getIsenable(String key) { return (String)getValue(isenable,key); }
|
||||
|
||||
// #1276494 概述:满足薪酬指标项关联考勤报表列数据需求 By T.W
|
||||
public String getIfSalaryNeed() {
|
||||
return (String) getRowValue(ifSalaryNeed);
|
||||
}
|
||||
|
||||
public String getIfSalaryNeed(String key) {
|
||||
return (String) getValue(ifSalaryNeed, key);
|
||||
}
|
||||
|
||||
public String getFormula() { return (String)getRowValue(formula); }
|
||||
public String getFormula(String key) { return (String)getValue(formula,key); }
|
||||
|
||||
public String getIsSystem() { return (String)getRowValue(issystem); }
|
||||
public String getIsSystem(String key) { return (String)getValue(issystem,key); }
|
||||
|
||||
public String getCascadekey() { return (String)getRowValue(cascadekey); }
|
||||
public String getCascadekey(String key) { return (String)getValue(cascadekey,key); }
|
||||
|
||||
public String getDailyShowOrder() { return (String)getRowValue(dailyShowOrder); }
|
||||
public String getDailyShowOrder(String key) { return (String)getValue(dailyShowOrder,key); }
|
||||
}
|
||||
|
|
@ -6,6 +6,8 @@ import com.engine.common.biz.AbstractCommonCommand;
|
|||
import com.engine.common.entity.BizLogContext;
|
||||
import com.engine.core.interceptor.CommandContext;
|
||||
import com.engine.kq.biz.*;
|
||||
import com.engine.xmgsecond.entity.KqFormatTotal;
|
||||
import com.engine.xmgsecond.util.KqCalulateUtil;
|
||||
import com.weaver.file.Prop;
|
||||
import com.engine.kq.util.KQDurationCalculatorUtil;
|
||||
import com.engine.kq.util.PageUidFactory;
|
||||
|
|
@ -102,6 +104,12 @@ public class GetKQReportCmd extends AbstractCommonCommand<Map<String, Object>> {
|
|||
List<Object> childColumns = null;
|
||||
KQReportFieldComInfo kqReportFieldComInfo = new KQReportFieldComInfo();
|
||||
while (kqReportFieldComInfo.next()){
|
||||
//QC3685035 考勤汇总表去除严重迟到,严重早退(+对应时长)4列
|
||||
if ("graveBeLate".equals(kqReportFieldComInfo.getFieldname())) continue;
|
||||
if ("graveLeaveEarly".equals(kqReportFieldComInfo.getFieldname())) continue;
|
||||
if ("graveBeLateMins".equals(kqReportFieldComInfo.getFieldname())) continue;
|
||||
if ("graveLeaveEarlyMins".equals(kqReportFieldComInfo.getFieldname())) continue;
|
||||
|
||||
if(Util.null2String(kqReportFieldComInfo.getParentid()).length()>0)continue;
|
||||
if(kqReportFieldComInfo.getFieldname().equals("kqCalendar"))continue;
|
||||
if(KQReportFieldComInfo.cascadekey2fieldname.keySet().contains(kqReportFieldComInfo.getFieldname()))continue;
|
||||
|
|
@ -398,7 +406,17 @@ public class GetKQReportCmd extends AbstractCommonCommand<Map<String, Object>> {
|
|||
}
|
||||
data.put("jobtitleId",tmpJobtitleId);
|
||||
fieldValue = jobTitlesComInfo.getJobTitlesname(tmpJobtitleId);
|
||||
}else if(fieldName.equals("rlzqqxs")){
|
||||
}else if("kqGroup".equals(fieldName)){
|
||||
//QC3685035 考勤月度报表增加所属所属考勤组
|
||||
KQGroupComInfo kqGroupComInfo = new KQGroupComInfo();
|
||||
KQGroupMemberComInfo kqGroupMemberComInfo = new KQGroupMemberComInfo();
|
||||
String groupId = kqGroupMemberComInfo.getKQGroupId(id, toDate);
|
||||
fieldValue = kqGroupComInfo.getGroupname(groupId);
|
||||
}else if("absenteeismDays".equals(fieldName)){
|
||||
//QC3685035 考勤月度报表增加缺勤天数
|
||||
List<KqFormatTotal> kqFormatTotalList = KqCalulateUtil.abnormalAttendance(id, fromDate, toDate);
|
||||
fieldValue = String.format("%.1f", kqFormatTotalList.stream().mapToDouble(KqFormatTotal::getAbsenceDays).sum());
|
||||
} else if(fieldName.equals("rlzqqxs")){
|
||||
String rlzqqxsTime = getXcqts(fromDate,id);
|
||||
fieldValue = rlzqqxsTime;
|
||||
}else if(fieldName.equals("attendanceSerial")){
|
||||
|
|
|
|||
|
|
@ -1,17 +1,25 @@
|
|||
package com.engine.kq.cmd.shiftschedule;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.engine.common.biz.AbstractCommonCommand;
|
||||
import com.engine.common.biz.SimpleBizLogger;
|
||||
import com.engine.common.constant.BizLogSmallType4Hrm;
|
||||
import com.engine.common.constant.BizLogType;
|
||||
import com.engine.common.entity.BizLogContext;
|
||||
import com.engine.core.interceptor.CommandContext;
|
||||
import com.engine.kq.bean.KqShiftscheduleOperateLog;
|
||||
import com.engine.kq.biz.*;
|
||||
import com.engine.kq.cmd.shiftmanagement.toolkit.ShiftManagementToolKit;
|
||||
import com.engine.kq.util.UtilKQ;
|
||||
import com.ibm.db2.jcc.uw.bb;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import weaver.common.DateUtil;
|
||||
import weaver.conn.BatchRecordSet;
|
||||
import weaver.conn.DBUtil;
|
||||
import weaver.conn.RecordSet;
|
||||
import weaver.general.BaseBean;
|
||||
import weaver.general.TimeUtil;
|
||||
import weaver.general.Util;
|
||||
import weaver.hrm.HrmUserVarify;
|
||||
import weaver.hrm.User;
|
||||
|
|
@ -23,15 +31,30 @@ import java.util.*;
|
|||
public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String, Object>> {
|
||||
|
||||
private SimpleBizLogger logger;
|
||||
// 添加日志功能
|
||||
private List<List<Object>> operateLogParams = new ArrayList<>();
|
||||
// 操作类型 操作人 考勤组名称+id 被修改人 被修改班次日期 被修改班次+id 排班设置行id
|
||||
private List<Object> operateLogParam = null;
|
||||
|
||||
public SaveBatchShiftScheduleCmd(Map<String, Object> params, User user) {
|
||||
this.user = user;
|
||||
this.params = params;
|
||||
this.logger = new SimpleBizLogger();
|
||||
|
||||
String data = Util.null2String(params.get("data"));
|
||||
JSONObject jsonObj = JSON.parseObject(data);
|
||||
String groupId = Util.null2String(jsonObj.get("groupId"));//考勤组id
|
||||
BizLogContext bizLogContext = new BizLogContext();
|
||||
bizLogContext.setLogType(BizLogType.HRM_ENGINE);//模块类型
|
||||
bizLogContext.setBelongType(BizLogSmallType4Hrm.HRM_ENGINE_Schedule_Set);//所属大类型
|
||||
bizLogContext.setLogSmallType(BizLogSmallType4Hrm.HRM_ENGINE_Schedule_Set);//当前小类型
|
||||
bizLogContext.setParams(params);//当前request请求参数
|
||||
logger.setUser(user);//当前操作人
|
||||
String mainSql = "select * from kq_group where id = " + groupId + " and (isdelete is null or isdelete <> '1') ";
|
||||
logger.setMainSql(mainSql, "id");//主表sql
|
||||
logger.setMainPrimarykey("id");//主日志表唯一key
|
||||
logger.setMainTargetNameColumn("groupname");
|
||||
SimpleBizLogger.SubLogInfo subLogInfo1 = logger.getNewSubLogInfo();
|
||||
String subSql1 = "select * from kq_shiftschedule where groupid = " + groupId + " and (isdelete is null or isdelete <> '1') ";
|
||||
subLogInfo1.setSubSql(subSql1,"id");
|
||||
logger.addSubLogInfo(subLogInfo1);
|
||||
logger.before(bizLogContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -67,6 +90,12 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
|
|||
String serialId = Util.null2String(jsonObj.get("serialId"));//班次
|
||||
String shiftcycleId = Util.null2String(jsonObj.get("shiftcycleId"));//排班周期Id
|
||||
|
||||
String meetworkDays = Util.null2String(jsonObj.get("meetworkDays"));//遇调配工作日
|
||||
String serialIdSx = Util.null2String(jsonObj.get("serialIdSx"));//双休班次
|
||||
String serialIdJjr = Util.null2String(jsonObj.get("serialIdJjr"));//节假日班次
|
||||
String serialIdXxr = Util.null2String(jsonObj.get("serialIdXxr"));//调配休息日班次
|
||||
String serialIdGzr = Util.null2String(jsonObj.get("serialIdGzr"));//调配工作日班次
|
||||
|
||||
// 某个管理员所拥有的维护人员的权限
|
||||
List<String> managerRoleUserIdList = new KqShiftScheduleRoleBiz().getUfKqShiftScheduleRoleValue(""+user.getUID(), groupId);
|
||||
KqMembersValidateBiz kqMembersValidateBiz = new KqMembersValidateBiz();
|
||||
|
|
@ -108,111 +137,84 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
|
|||
excludeidList = Util.splitString2List(excludeid,",");
|
||||
}
|
||||
}
|
||||
String oriDate = "";
|
||||
Map<String,Object> mapShiftSchedule = new HashMap<>();
|
||||
sql = " select id, resourceid, kqdate, serialid from kq_shiftschedule where (isdelete is null or isdelete <> '1') and groupid=? ";
|
||||
Map<String,Object> mapShiftScheduleOri = new HashMap<>();
|
||||
sql = " select id, resourceid, kqdate from kq_shiftschedule where (isdelete is null or isdelete <> '1') and groupid=? ";
|
||||
//有客户提下面的sql有性能问题,在表数据较多,并且该表数据改动较为频率不适合建索引,所以对mapShiftSchedule先缓存的数据范围过滤下,没必要全表缓存
|
||||
if("1".equals(shiftScheduleType)){//按天排班
|
||||
sql += " and kqdate='"+shiftScheduleDate+"' ";
|
||||
oriDate = shiftScheduleDate;
|
||||
}else if("2".equals(shiftScheduleType)){
|
||||
sql += " and kqdate>='"+shiftScheduleBeginDate+"' and kqdate<='"+shiftScheduleEndDate+"' ";
|
||||
oriDate = shiftScheduleBeginDate;
|
||||
}
|
||||
rs.executeQuery(sql,groupId);
|
||||
while(rs.next()){
|
||||
mapShiftSchedule.put(rs.getString("kqdate")+"|"+Util.null2String(rs.getString("resourceid")), Util.null2String(rs.getString("id"))+"#"+Util.null2String(rs.getString("serialid")));
|
||||
mapShiftSchedule.put(rs.getString("kqdate")+"|"+rs.getString("resourceid"),rs.getString("id"));
|
||||
}
|
||||
String id = "";
|
||||
String oldSerialid = "";
|
||||
boolean needChange = false;
|
||||
KQShiftManagementComInfo kqShiftScheduleComInfo = new KQShiftManagementComInfo();
|
||||
ResourceComInfo rci = new ResourceComInfo();
|
||||
KqShiftscheduleOperateLog bean = null;
|
||||
if(shiftScheduleType.equals("1")){//按天排班
|
||||
if(SaveShiftScheduleCmd.isDate(shiftScheduleDate)) {
|
||||
for (String resourceid : lsGroupMembers) {
|
||||
// 排除无需考勤人员
|
||||
if (excludeidList != null && excludeidList.contains(resourceid)) {
|
||||
for(String resourceid:lsGroupMembers){
|
||||
// 排除无需考勤人员
|
||||
if(excludeidList != null && excludeidList.contains(resourceid)) {
|
||||
continue;
|
||||
}
|
||||
if(!managerRoleUserIdList.isEmpty()) {
|
||||
if(!managerRoleUserIdList.contains(resourceid)) {
|
||||
continue;
|
||||
}
|
||||
if (!managerRoleUserIdList.isEmpty()) {
|
||||
if (!managerRoleUserIdList.contains(resourceid)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
String shiftScheduleValue = Util.null2String(mapShiftSchedule.get(shiftScheduleDate + "|" + resourceid));
|
||||
if (!"".equals(shiftScheduleValue)) {
|
||||
id = shiftScheduleValue.split("#")[0];
|
||||
oldSerialid = shiftScheduleValue.split("#")[1];
|
||||
}
|
||||
// 如果超过了有效期,就不存储数据
|
||||
List<String> validateList = validateResult.get(resourceid);
|
||||
boolean isInRange = kqMembersValidateBiz.isInRange(shiftScheduleDate, validateList);
|
||||
if (!isInRange && oldSerialid.length() > 0) {
|
||||
if (delIds.length() > 0) {
|
||||
delIds += ",";
|
||||
}
|
||||
delIds += id;
|
||||
bean = new KqShiftscheduleOperateLog(2, user.getLastname(), kqGroupComInfo.getGroupname(groupId) + "(id:" + groupId + ")", rci.getLastname(resourceid),
|
||||
shiftScheduleDate, ("-1".equals(oldSerialid) ? SystemEnv.getHtmlLabelName(26593, user.getLanguage()) : kqShiftScheduleComInfo.getSerial(oldSerialid) + "(id:" + oldSerialid + ")"), id, "", user.getLanguage());
|
||||
addLog(bean);
|
||||
continue;
|
||||
}
|
||||
//if(weaver.common.DateUtil.timeInterval(shiftScheduleDate,today)>0)continue;//今天之前的无需处理
|
||||
if (id.length() > 0) {
|
||||
if (serialId.length() == 0 && oldSerialid.length() > 0) {
|
||||
if (delIds.length() > 0) {
|
||||
delIds += ",";
|
||||
}
|
||||
delIds += id;
|
||||
bean = new KqShiftscheduleOperateLog(2, user.getLastname(), kqGroupComInfo.getGroupname(groupId) + "(id:" + groupId + ")", rci.getLastname(resourceid),
|
||||
shiftScheduleDate, ("-1".equals(oldSerialid) ? SystemEnv.getHtmlLabelName(26593, user.getLanguage()) : kqShiftScheduleComInfo.getSerial(oldSerialid) + "(id:" + oldSerialid + ")"), id, "", user.getLanguage());
|
||||
addLog(bean);
|
||||
} else {
|
||||
if (!oldSerialid.equals(serialId) && oldSerialid.length() > 0) {
|
||||
needChange = true;
|
||||
params = new ArrayList<Object>();
|
||||
params.add(serialId);
|
||||
params.add(id);
|
||||
paramUpdate.add(params);
|
||||
bean = new KqShiftscheduleOperateLog(1, user.getLastname(), kqGroupComInfo.getGroupname(groupId) + "(id:" + groupId + ")", rci.getLastname(resourceid),
|
||||
shiftScheduleDate, ("-1".equals(oldSerialid) ? SystemEnv.getHtmlLabelName(26593, user.getLanguage()) : kqShiftScheduleComInfo.getSerial(oldSerialid) + "(id:" + oldSerialid + ")"), id, ("-1".equals(serialId) ? SystemEnv.getHtmlLabelName(26593, user.getLanguage()) : kqShiftScheduleComInfo.getSerial(serialId) + "(id:" + serialId + ")"), user.getLanguage());
|
||||
addLog(bean);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (serialId.length() == 0) continue;
|
||||
if(!oldSerialid.equals(serialId)) {
|
||||
needChange = true;
|
||||
params = new ArrayList<Object>();
|
||||
params.add(shiftScheduleDate);
|
||||
params.add(serialId);
|
||||
params.add(resourceid);
|
||||
params.add(groupId);
|
||||
paramInsert.add(params);
|
||||
bean = new KqShiftscheduleOperateLog(0, user.getLastname(), kqGroupComInfo.getGroupname(groupId) + "(id:" + groupId + ")", rci.getLastname(resourceid),
|
||||
shiftScheduleDate, "", id, ("-1".equals(serialId) ? SystemEnv.getHtmlLabelName(26593, user.getLanguage()) : kqShiftScheduleComInfo.getSerial(serialId) + "(id:" + serialId + ")"), user.getLanguage());
|
||||
addLog(bean);
|
||||
}
|
||||
}
|
||||
if (needChange) {
|
||||
if (DateUtil.timeInterval(shiftScheduleDate, today) >= 0) {
|
||||
formatParams = new ArrayList<>();
|
||||
formatParams.add(resourceid);
|
||||
formatParams.add(shiftScheduleDate);
|
||||
lsFormatParams.add(formatParams);
|
||||
}
|
||||
|
||||
deleteParams = new ArrayList<>();
|
||||
deleteParams.add(resourceid);
|
||||
deleteParams.add(shiftScheduleDate);
|
||||
lsDeleteParams.add(deleteParams);
|
||||
|
||||
checkSerialParams = new ArrayList<>();
|
||||
checkSerialParams.add(resourceid);
|
||||
checkSerialParams.add(shiftScheduleDate);
|
||||
checkSerialParams.add(serialId);
|
||||
lscheckSerialParams.add(checkSerialParams);
|
||||
}
|
||||
}
|
||||
id = Util.null2String(mapShiftSchedule.get(shiftScheduleDate+"|"+resourceid));
|
||||
// 如果超过了有效期,就不存储数据
|
||||
List<String> validateList = validateResult.get(resourceid);
|
||||
boolean isInRange = kqMembersValidateBiz.isInRange(shiftScheduleDate, validateList);
|
||||
if(!isInRange) {
|
||||
if(delIds.length()>0)delIds+=",";
|
||||
delIds+=id;
|
||||
continue;
|
||||
}
|
||||
//if(weaver.common.DateUtil.timeInterval(shiftScheduleDate,today)>0)continue;//今天之前的无需处理
|
||||
if(id.length()>0){
|
||||
if(serialId.length()==0){
|
||||
if(delIds.length()>0)delIds+=",";
|
||||
delIds+=id;
|
||||
}else {
|
||||
params = new ArrayList<Object>();
|
||||
params.add(serialId);
|
||||
params.add(id);
|
||||
params.add(shiftScheduleDate);
|
||||
params.add(resourceid);
|
||||
paramUpdate.add(params);
|
||||
}
|
||||
}else{
|
||||
if(serialId.length()==0)continue;;
|
||||
params = new ArrayList<Object>();
|
||||
params.add(shiftScheduleDate);
|
||||
params.add(serialId);
|
||||
params.add(resourceid);
|
||||
params.add(groupId);
|
||||
paramInsert.add(params);
|
||||
}
|
||||
|
||||
if(DateUtil.timeInterval(shiftScheduleDate,today)>=0) {
|
||||
formatParams = new ArrayList<>();
|
||||
formatParams.add(resourceid);
|
||||
formatParams.add(shiftScheduleDate);
|
||||
lsFormatParams.add(formatParams);
|
||||
}
|
||||
|
||||
deleteParams = new ArrayList<>();
|
||||
deleteParams.add(resourceid);
|
||||
deleteParams.add(shiftScheduleDate);
|
||||
lsDeleteParams.add(deleteParams);
|
||||
|
||||
checkSerialParams = new ArrayList<>();
|
||||
checkSerialParams.add(resourceid);
|
||||
checkSerialParams.add(shiftScheduleDate);
|
||||
checkSerialParams.add(serialId);
|
||||
lscheckSerialParams.add(checkSerialParams);
|
||||
mapShiftScheduleOri.put(shiftScheduleDate+"|"+resourceid,serialId);
|
||||
}
|
||||
}else if(shiftScheduleType.equals("2")){//按周期排班
|
||||
List<String> lsDate = new ArrayList<>();
|
||||
|
|
@ -255,55 +257,44 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
|
|||
boolean needShiftSchedule = false;
|
||||
int dayCount = 0;
|
||||
for(int i=0;i<lsDate.size();i++) {
|
||||
needChange = false;
|
||||
id= "";
|
||||
oldSerialid = "";
|
||||
//if(weaver.common.DateUtil.timeInterval(date,today)>0)continue;//今天之前的无需处理
|
||||
String date = lsDate.get(i);
|
||||
if(!SaveShiftScheduleCmd.isDate(date)) {
|
||||
continue;
|
||||
}
|
||||
String shiftScheduleValue = Util.null2String(mapShiftSchedule.get(date+"|"+resourceid));
|
||||
if(!"".equals(shiftScheduleValue)) {
|
||||
id = shiftScheduleValue.split("#")[0];
|
||||
oldSerialid = shiftScheduleValue.split("#")[1];
|
||||
}
|
||||
id = Util.null2String(mapShiftSchedule.get(date+"|"+resourceid));
|
||||
|
||||
// 如果超过了有效期,就不存储数据
|
||||
List<String> validateList = validateResult.get(resourceid);
|
||||
boolean isInRange = kqMembersValidateBiz.isInRange(date, validateList);
|
||||
if(!isInRange) {
|
||||
if(oldSerialid.length() > 0) {
|
||||
if (delIds.length() > 0) {
|
||||
delIds += ",";
|
||||
}
|
||||
delIds += id;
|
||||
bean = new KqShiftscheduleOperateLog(2, user.getLastname(), kqGroupComInfo.getGroupname(groupId) + "(id:" + groupId + ")", rci.getLastname(resourceid),
|
||||
date, ("-1".equals(oldSerialid) ? SystemEnv.getHtmlLabelName(26593, user.getLanguage()) : kqShiftScheduleComInfo.getSerial(oldSerialid) + "(id:" + oldSerialid + ")"), id, "", user.getLanguage());
|
||||
addLog(bean);
|
||||
}
|
||||
if(delIds.length()>0)delIds+=",";
|
||||
delIds+=id;
|
||||
continue;
|
||||
}
|
||||
|
||||
needShiftSchedule = true;
|
||||
int changeType= KQHolidaySetBiz.getChangeType(groupId, date);
|
||||
if (changeType != 1 && changeType != 3 && !holidayType.equals("1")) {//遇双休日继续排班
|
||||
if (changeType != 1 && changeType != 3 && holidayType.equals("2")) {//遇双休日继续排班
|
||||
int weekDay = DateUtil.getWeek(date);
|
||||
if(weekDay>5){
|
||||
needShiftSchedule = false;
|
||||
}
|
||||
}
|
||||
if(!meetHolidays.equals("1")){//遇节假日继续排班
|
||||
if(meetHolidays.equals("2")){//遇节假日继续排班
|
||||
if(changeType==1){
|
||||
needShiftSchedule = false;
|
||||
}
|
||||
}
|
||||
if(!meetRestDays.equals("1")){//遇调配休息日继续排班
|
||||
if(meetRestDays.equals("2")){//遇调配休息日继续排班
|
||||
if(changeType==3){
|
||||
needShiftSchedule = false;
|
||||
}
|
||||
}
|
||||
|
||||
if(meetworkDays.equals("2")){//遇调配工作日日继续排班
|
||||
if(changeType==2){
|
||||
needShiftSchedule = false;
|
||||
}
|
||||
}
|
||||
|
||||
if(needShiftSchedule){
|
||||
dayCount++;
|
||||
int idx = dayCount % shiftcycleday;
|
||||
|
|
@ -312,83 +303,323 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
|
|||
} else {
|
||||
serialId = Util.null2String(shiftcycleserialids[idx-1]);
|
||||
}
|
||||
new BaseBean().writeLog("serialId中"+serialId);
|
||||
if (changeType !=1 && changeType != 3 && holidayType.equals("3")) {//遇双休日指定排班
|
||||
int weekDay = DateUtil.getWeek(date);
|
||||
if(weekDay>5){
|
||||
serialId = serialIdSx;
|
||||
}
|
||||
}
|
||||
if(meetHolidays.equals("3")){//遇节假日指定排班
|
||||
if(changeType == 1){
|
||||
serialId = serialIdJjr;
|
||||
}
|
||||
}
|
||||
if(meetRestDays.equals("3")){//遇调配休息日指定排班
|
||||
if(changeType == 3){
|
||||
serialId = serialIdXxr;
|
||||
}
|
||||
}
|
||||
if(meetworkDays.equals("3")){//遇调配工作日指定排班
|
||||
if(changeType == 2){
|
||||
serialId = serialIdGzr;
|
||||
}
|
||||
}
|
||||
new BaseBean().writeLog("serialId后"+serialId);
|
||||
if(id.length()>0){
|
||||
if(serialId.length()==0 && oldSerialid.length() > 0){
|
||||
if(delIds.length()>0) {
|
||||
delIds+=",";
|
||||
}
|
||||
if(serialId.length()==0){
|
||||
if(delIds.length()>0)delIds+=",";
|
||||
delIds+=id;
|
||||
bean = new KqShiftscheduleOperateLog(2, user.getLastname(), kqGroupComInfo.getGroupname(groupId) + "(id:" + groupId + ")", rci.getLastname(resourceid),
|
||||
date, ("-1".equals(oldSerialid) ? SystemEnv.getHtmlLabelName(26593, user.getLanguage()) : kqShiftScheduleComInfo.getSerial(oldSerialid) + "(id:" + oldSerialid + ")"), id, "",user.getLanguage());
|
||||
addLog(bean);
|
||||
}else {
|
||||
if(!oldSerialid.equals(serialId) && oldSerialid.length() > 0) {
|
||||
needChange = true;
|
||||
params = new ArrayList<Object>();
|
||||
params.add(serialId);
|
||||
params.add(id);
|
||||
paramUpdate.add(params);
|
||||
bean = new KqShiftscheduleOperateLog(1,user.getLastname(),kqGroupComInfo.getGroupname(groupId)+"(id:"+groupId+")",rci.getLastname(resourceid),
|
||||
date, ("-1".equals(oldSerialid) ? SystemEnv.getHtmlLabelName(26593, user.getLanguage()) : kqShiftScheduleComInfo.getSerial(oldSerialid)+"(id:"+oldSerialid+")"), id, ("-1".equals(serialId) ? SystemEnv.getHtmlLabelName(26593, user.getLanguage()) : kqShiftScheduleComInfo.getSerial(serialId)+"(id:"+serialId+")"),user.getLanguage());
|
||||
addLog(bean);
|
||||
}
|
||||
params = new ArrayList<Object>();
|
||||
params.add(serialId);
|
||||
params.add(id);
|
||||
params.add(date);
|
||||
params.add(resourceid);
|
||||
paramUpdate.add(params);
|
||||
}
|
||||
}else{
|
||||
if(serialId.length()>0){
|
||||
if(!oldSerialid.equals(serialId)) {
|
||||
needChange = true;
|
||||
params = new ArrayList<Object>();
|
||||
params.add(date);
|
||||
params.add(serialId);
|
||||
params.add(resourceid);
|
||||
params.add(groupId);
|
||||
paramInsert.add(params);
|
||||
bean = new KqShiftscheduleOperateLog(0, user.getLastname(), kqGroupComInfo.getGroupname(groupId) + "(id:" + groupId + ")", rci.getLastname(resourceid),
|
||||
date, "", id, ("-1".equals(serialId) ? SystemEnv.getHtmlLabelName(26593, user.getLanguage()) : kqShiftScheduleComInfo.getSerial(serialId) + "(id:" + serialId + ")"), user.getLanguage());
|
||||
addLog(bean);
|
||||
}
|
||||
params = new ArrayList<Object>();
|
||||
params.add(date);
|
||||
params.add(serialId);
|
||||
params.add(resourceid);
|
||||
params.add(groupId);
|
||||
paramInsert.add(params);
|
||||
}
|
||||
}
|
||||
mapShiftScheduleOri.put(date+"|"+resourceid,serialId);
|
||||
}else{
|
||||
if(oldSerialid.length() > 0) {
|
||||
deleteCancelParams = new ArrayList<>();
|
||||
deleteCancelParams.add(resourceid);
|
||||
deleteCancelParams.add(date);
|
||||
lsDeleteCancelParams.add(deleteCancelParams);
|
||||
bean = new KqShiftscheduleOperateLog(2, user.getLastname(), kqGroupComInfo.getGroupname(groupId) + "(id:" + groupId + ")", rci.getLastname(resourceid),
|
||||
date, ("-1".equals(oldSerialid) ? SystemEnv.getHtmlLabelName(26593, user.getLanguage()) : kqShiftScheduleComInfo.getSerial(oldSerialid) + "(id:" + oldSerialid + ")"), id, "",user.getLanguage());
|
||||
addLog(bean);
|
||||
}
|
||||
deleteCancelParams = new ArrayList<>();
|
||||
deleteCancelParams.add(resourceid);
|
||||
deleteCancelParams.add(date);
|
||||
lsDeleteCancelParams.add(deleteCancelParams);
|
||||
}
|
||||
if(needChange) {
|
||||
if(DateUtil.timeInterval(date,today)>=0) {
|
||||
formatParams = new ArrayList<>();
|
||||
formatParams.add(resourceid);
|
||||
formatParams.add(date);
|
||||
lsFormatParams.add(formatParams);
|
||||
}
|
||||
|
||||
deleteParams = new ArrayList<>();
|
||||
deleteParams.add(resourceid);
|
||||
deleteParams.add(date);
|
||||
lsDeleteParams.add(deleteParams);
|
||||
|
||||
checkSerialParams = new ArrayList<>();
|
||||
checkSerialParams.add(resourceid);
|
||||
checkSerialParams.add(shiftScheduleDate);
|
||||
checkSerialParams.add(serialId);
|
||||
lscheckSerialParams.add(checkSerialParams);
|
||||
if(DateUtil.timeInterval(date,today)>=0) {
|
||||
formatParams = new ArrayList<>();
|
||||
formatParams.add(resourceid);
|
||||
formatParams.add(date);
|
||||
lsFormatParams.add(formatParams);
|
||||
}
|
||||
|
||||
deleteParams = new ArrayList<>();
|
||||
deleteParams.add(resourceid);
|
||||
deleteParams.add(date);
|
||||
lsDeleteParams.add(deleteParams);
|
||||
|
||||
checkSerialParams = new ArrayList<>();
|
||||
checkSerialParams.add(resourceid);
|
||||
checkSerialParams.add(shiftScheduleDate);
|
||||
checkSerialParams.add(serialId);
|
||||
lscheckSerialParams.add(checkSerialParams);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//二开获取排班校验规则
|
||||
String getPbCheckValue = getpbCheckValue(groupId);
|
||||
|
||||
BaseBean bb = new BaseBean();
|
||||
String fromDate = TimeUtil.getMonthBeginDay(oriDate);
|
||||
String toDate = TimeUtil.getMonthEndDay(oriDate);
|
||||
List<String> lsDateNew = new ArrayList<>();
|
||||
Calendar calNew = DateUtil.getCalendar();
|
||||
boolean isEndNew = false;
|
||||
for(String date=fromDate; !isEndNew;) {
|
||||
if(date.equals(toDate)) isEndNew = true;
|
||||
lsDateNew.add(date);
|
||||
calNew.setTime(DateUtil.parseToDate(date));
|
||||
date = DateUtil.getDate(calNew.getTime(), 1);
|
||||
}
|
||||
Map<String,Object> mapShiftScheduleAll = new HashMap<>();
|
||||
Set<String> unSavePerson = new HashSet<>();
|
||||
|
||||
if("3".equals(getPbCheckValue) || "2".equals(getPbCheckValue)){
|
||||
//上四休二校验,生成预排班数据结构
|
||||
for(String resourceid:lsGroupMembers){
|
||||
Map<String,Object> mapShiftScheduleChild = new HashMap<>();
|
||||
String sqlChild = " select id, resourceid, kqdate,serialid from kq_shiftschedule where (isdelete is null or isdelete <> '1') and groupid=? ";
|
||||
//有客户提下面的sql有性能问题,在表数据较多,并且该表数据改动较为频率不适合建索引,所以对mapShiftSchedule先缓存的数据范围过滤下,没必要全表缓存
|
||||
sqlChild += " and kqdate>='"+fromDate+"' and kqdate<='"+toDate+"' ";
|
||||
rs.executeQuery(sqlChild,groupId);
|
||||
while(rs.next()){
|
||||
mapShiftScheduleChild.put(rs.getString("kqdate")+"|"+rs.getString("resourceid"),rs.getString("serialid"));
|
||||
}
|
||||
//生成这个人员这个月的预生成排班
|
||||
for(int i=0;i<lsDateNew.size();i++) {
|
||||
String date = lsDateNew.get(i);
|
||||
String bcidNew = Util.null2String(mapShiftScheduleOri.get(date+"|"+resourceid));
|
||||
if(StringUtils.isNotBlank(bcidNew)){
|
||||
//本次排班预生成班次id
|
||||
mapShiftScheduleAll.put(date+"|"+resourceid,bcidNew);
|
||||
}else{
|
||||
//本次排班未预生成id,检查历史生成的班次id,若历史也没有生效班次,且当天不是节假日,则不让保存
|
||||
String bcidOld = Util.null2String(mapShiftScheduleChild.get(date+"|"+resourceid));
|
||||
if(StringUtils.isNotBlank(bcidOld)){
|
||||
mapShiftScheduleAll.put(date+"|"+resourceid,bcidOld);
|
||||
}else{
|
||||
int changeType = getChangeType(groupId, date);
|
||||
if(changeType != 1){
|
||||
//该人员不让保存
|
||||
unSavePerson.add(resourceid);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
bb.writeLog("unSavePerson"+JSONObject.toJSONString(unSavePerson));
|
||||
bb.writeLog("mapShiftScheduleAll"+JSONObject.toJSONString(mapShiftScheduleAll));
|
||||
if("2".equals(getPbCheckValue)){
|
||||
//获取当月正常工作天数
|
||||
Integer xcqtsAll = 0;
|
||||
for (String date : lsDateNew) {
|
||||
Integer zcgzts = 0;
|
||||
KQHolidaySetComInfo holidaySetComInfo = new KQHolidaySetComInfo();
|
||||
String changeTypeNew = holidaySetComInfo.getChangeType(groupId, date);
|
||||
if("2".equals(changeTypeNew)){
|
||||
//调配工作日计正常工作天数
|
||||
zcgzts = 1;
|
||||
}
|
||||
if(DateUtil.getWeek(date) != 6 && DateUtil.getWeek(date) != 7){
|
||||
//不为周六周日
|
||||
if(!"1".equals(changeTypeNew) && !"3".equals(changeTypeNew)){
|
||||
//不为节假日和休息日
|
||||
zcgzts = 1;
|
||||
}
|
||||
}
|
||||
xcqtsAll = xcqtsAll+zcgzts;
|
||||
}
|
||||
bb.writeLog("xcqtsAll"+xcqtsAll);
|
||||
for(String resourceid:lsGroupMembers){
|
||||
bb.writeLog("resourceid"+resourceid);
|
||||
Integer bcNum = 0;
|
||||
//遍历这个人员这个月的预生成排班
|
||||
for(int i=0;i<lsDateNew.size();i++) {
|
||||
String date = lsDateNew.get(i);
|
||||
String bcid = Util.null2String(mapShiftScheduleAll.get(date+"|"+resourceid));
|
||||
bb.writeLog("dateTwo"+date+"bcid"+bcid);
|
||||
if(StringUtils.isNotBlank(bcid)){
|
||||
//班次是否是休息班,是的话往后判断是否是两个连续休息班
|
||||
boolean checkXxb = checkXxr(bcid);
|
||||
if(checkXxb){
|
||||
//是休息班,不统计
|
||||
bb.writeLog("是休息班,不统计");
|
||||
}else{
|
||||
//是工作班,统计
|
||||
bb.writeLog("是工作班,统计");
|
||||
bcNum++;
|
||||
}
|
||||
}
|
||||
}
|
||||
bb.writeLog("bcNum"+bcNum);
|
||||
if(bcNum != xcqtsAll){
|
||||
//当月日历工作日天数+调配工作日天数必须等于当月工作班天数,不等于则不让保存
|
||||
unSavePerson.add(resourceid);
|
||||
}
|
||||
}
|
||||
}
|
||||
if("3".equals(getPbCheckValue)){
|
||||
// 校验是否满足上四休二规则:从当月第一个连续两天的休息班作为锚点,判断此休息班前后排班是否满足固定4天工作+2天休息的模式,
|
||||
// 如果当月存在法定节假日则默认跳过后继续排班。例如:周三为节假日,且当周一为第一天工作日,那么当周的排班结果为:周一~周二:
|
||||
// 2天工作日、周三:跳过、周四~周五:2天工作日、周六周日:2天休息班
|
||||
for(String resourceid:lsGroupMembers){
|
||||
bb.writeLog("resourceid"+resourceid);
|
||||
//遍历这个人员这个月的预生成排班
|
||||
for(int i=0;i<lsDateNew.size();i++) {
|
||||
String date = lsDateNew.get(i);
|
||||
String bcid = Util.null2String(mapShiftScheduleAll.get(date+"|"+resourceid));
|
||||
bb.writeLog("date"+date+"bcid"+bcid);
|
||||
if(StringUtils.isNotBlank(bcid)){
|
||||
//班次是否是休息班,是的话往后判断是否是两个连续休息班
|
||||
boolean checkXxb = checkXxr(bcid);
|
||||
if(checkXxb){
|
||||
//是休息班,往后找
|
||||
bb.writeLog("是休息班,往后找");
|
||||
boolean findNextXxb = true;
|
||||
Integer day = 1;
|
||||
while (findNextXxb){
|
||||
calNew.setTime(DateUtil.parseToDate(date));
|
||||
String dateNext = DateUtil.getDate(calNew.getTime(), day);
|
||||
day++;
|
||||
String bcidNext = Util.null2String(mapShiftScheduleAll.get(dateNext+"|"+resourceid));
|
||||
bb.writeLog("dateNext"+dateNext+"day"+day+"bcidNext"+bcidNext);
|
||||
if(StringUtils.isNotBlank(bcidNext)){
|
||||
//找到了第一个有班次的
|
||||
bb.writeLog("找到了第一个有班次的");
|
||||
findNextXxb = false;
|
||||
boolean checkXxbNext = checkXxr(bcidNext);
|
||||
if(checkXxbNext){
|
||||
//再往后找一个班次,该班次需要为工作日
|
||||
//是休息班,往后找
|
||||
bb.writeLog("也是休息班,再往后找");
|
||||
boolean findNextXxb1 = true;
|
||||
Integer day1 = 1;
|
||||
while (findNextXxb1){
|
||||
calNew.setTime(DateUtil.parseToDate(dateNext));
|
||||
String dateNext1 = DateUtil.getDate(calNew.getTime(), day1);
|
||||
day1++;
|
||||
String bcidNext1 = Util.null2String(mapShiftScheduleAll.get(dateNext1+"|"+resourceid));
|
||||
bb.writeLog("bcidNext1"+bcidNext1+"dateNext1"+dateNext1+"day1"+day1);
|
||||
if(StringUtils.isNotBlank(bcidNext1)){
|
||||
//不往后找了
|
||||
boolean checkXxbNext1 = checkXxr(bcidNext1);
|
||||
findNextXxb1 = false;
|
||||
bb.writeLog("checkXxbNext1"+checkXxbNext1);
|
||||
if(checkXxbNext1){
|
||||
//存在三个连续的休息班,不符合上四休二
|
||||
bb.writeLog("存在三个连续的休息班,不符合上四休二");
|
||||
unSavePerson.add(resourceid);
|
||||
}else{
|
||||
i++;
|
||||
}
|
||||
}else{
|
||||
i++;
|
||||
}
|
||||
//到最后一天也没找到,暂不处理
|
||||
if(DateUtil.timeInterval(toDate,dateNext1)>=0){
|
||||
findNextXxb1 = false;
|
||||
}
|
||||
}
|
||||
//将date作为一个锚点,往前找并判断是否满足上四休二
|
||||
boolean findBefore = true;
|
||||
Integer dayB = -1;
|
||||
//工作班数量
|
||||
Integer gzbnum = 0;
|
||||
//判断前面是否还有休息班标识
|
||||
Integer xxbNo = 0;
|
||||
while (findBefore){
|
||||
calNew.setTime(DateUtil.parseToDate(date));
|
||||
String dateBefore = DateUtil.getDate(calNew.getTime(), dayB);
|
||||
dayB--;
|
||||
String bcidBefore = Util.null2String(mapShiftScheduleAll.get(dateBefore+"|"+resourceid));
|
||||
bb.writeLog("bcidBefore"+bcidBefore+"dateBefore"+dateBefore+"dayB"+dayB);
|
||||
if(StringUtils.isNotBlank(bcidBefore)){
|
||||
boolean checkXxbBefore = checkXxr(bcidBefore);
|
||||
if(checkXxbBefore){
|
||||
//找到了第一个休息班,判断间隔了多少个非休息班,不再找了
|
||||
bb.writeLog("找到了第一个休息班,判断间隔了多少个非休息班,不再找了");
|
||||
findBefore = false;
|
||||
xxbNo = 1;
|
||||
}else{
|
||||
gzbnum ++;
|
||||
}
|
||||
}
|
||||
//找到月初一号了,不找了
|
||||
if(DateUtil.timeInterval(dateBefore,fromDate)>=0){
|
||||
findBefore = false;
|
||||
}
|
||||
}
|
||||
bb.writeLog("gzbnum"+gzbnum);
|
||||
if(xxbNo == 1){
|
||||
//当前锚点前面有休息班,若间隔工作班数量不为4,则不符合
|
||||
if(gzbnum != 4){
|
||||
bb.writeLog("当前锚点前面有休息班,若间隔工作班数量不为4,则不符合");
|
||||
unSavePerson.add(resourceid);
|
||||
}
|
||||
}else{
|
||||
//当前锚点是第一个休息班
|
||||
if(gzbnum>4){
|
||||
//锚点往前有超过四个工作班,不符合
|
||||
bb.writeLog("当前锚点是第一个休息班,锚点往前有超过四个工作班,不符合");
|
||||
unSavePerson.add(resourceid);
|
||||
}
|
||||
}
|
||||
|
||||
}else{
|
||||
//找到的不是休息班,也认为不符合上四休二
|
||||
bb.writeLog("找到的不是休息班,也认为不符合上四休二");
|
||||
unSavePerson.add(resourceid);
|
||||
}
|
||||
}else{
|
||||
i++;
|
||||
}
|
||||
|
||||
//到最后一天也没找到,暂不处理
|
||||
if(DateUtil.timeInterval(toDate,dateNext)>=0){
|
||||
findNextXxb = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
bb.writeLog("unSavePerson"+JSONObject.toJSONString(unSavePerson));
|
||||
}
|
||||
|
||||
}
|
||||
bb.writeLog("paramUpdate"+JSONObject.toJSONString(paramUpdate));
|
||||
sql = " update kq_shiftschedule set serialid=?,isDelete=0 where id = ? ";
|
||||
for (int i = 0; paramUpdate != null && i < paramUpdate.size(); i++) {
|
||||
List<Object> update_params = paramUpdate.get(i);
|
||||
String serialid = Util.null2String(update_params.get(0));
|
||||
String tmp_id = Util.null2String(update_params.get(1));
|
||||
rs.executeUpdate(sql, serialid,tmp_id);
|
||||
String resourceid = Util.null2String(update_params.get(3));
|
||||
if(unSavePerson.contains(resourceid) && !"1".equals(getPbCheckValue)){
|
||||
//该人员不符合规则,不生效
|
||||
}else{
|
||||
rs.executeUpdate(sql, serialid,tmp_id);
|
||||
}
|
||||
}
|
||||
|
||||
sql = "insert into kq_shiftschedule (kqdate,serialid,resourceid,groupid,isDelete) values(?,?,?,?,0)";
|
||||
|
|
@ -398,7 +629,12 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
|
|||
String serialid = Util.null2String(insert_params.get(1));
|
||||
String resourceid = Util.null2String(insert_params.get(2));
|
||||
String groupid = Util.null2String(insert_params.get(3));
|
||||
rs.executeUpdate(sql, kqdate,serialid,resourceid,groupid);
|
||||
if(unSavePerson.contains(resourceid) && !"1".equals(getPbCheckValue)){
|
||||
//该人员不符合规则,不生效
|
||||
}else{
|
||||
rs.executeUpdate(sql, kqdate,serialid,resourceid,groupid);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(delIds.length()>0){
|
||||
|
|
@ -413,7 +649,11 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
|
|||
List<Object> delete_params = lsDeleteCancelParams.get(i);
|
||||
String resourceid = Util.null2String(delete_params.get(0));
|
||||
String kqdate = Util.null2String(delete_params.get(1));
|
||||
rs.executeUpdate(sql, resourceid,kqdate);
|
||||
if(unSavePerson.contains(resourceid) && !"1".equals(getPbCheckValue)){
|
||||
//该人员不符合规则,不生效
|
||||
}else{
|
||||
rs.executeUpdate(sql, resourceid,kqdate);
|
||||
}
|
||||
}
|
||||
|
||||
//删除之前的排的班次,一天只能有一个班次
|
||||
|
|
@ -422,7 +662,11 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
|
|||
List<Object> delete_params = lsDeleteParams.get(i);
|
||||
String resourceid = Util.null2String(delete_params.get(0));
|
||||
String kqdate = Util.null2String(delete_params.get(1));
|
||||
rs.executeUpdate(sql, resourceid,kqdate);
|
||||
if(unSavePerson.contains(resourceid) && !"1".equals(getPbCheckValue)){
|
||||
//该人员不符合规则,不生效
|
||||
}else{
|
||||
rs.executeUpdate(sql, resourceid,kqdate);
|
||||
}
|
||||
}
|
||||
|
||||
sql = " update kq_shiftschedule set isdelete =1 where (isdelete is null or isdelete <> '1') and resourceid = ? and kqdate = ? and serialid != ? ";
|
||||
|
|
@ -431,16 +675,33 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
|
|||
String resourceid = Util.null2String(check_params.get(0));
|
||||
String kqdate = Util.null2String(check_params.get(1));
|
||||
String serialid = Util.null2String(check_params.get(2));
|
||||
rs.executeUpdate(sql, resourceid,kqdate,serialid);
|
||||
if(unSavePerson.contains(resourceid) && !"1".equals(getPbCheckValue)){
|
||||
//该人员不符合规则,不生效
|
||||
}else{
|
||||
rs.executeUpdate(sql, resourceid,kqdate,serialid);
|
||||
}
|
||||
}
|
||||
|
||||
sql = "insert into kq_shiftscheduleoperate_log(operatetype,operator,kqgroupname,changeduser,changedshiftdate,changedshiftname,kqshiftid) values(?,?,?,?,?,?,?)";
|
||||
bRs.executeBatchSqlNew(sql, operateLogParams);
|
||||
|
||||
new KQShiftScheduleComInfo().removeCache();
|
||||
|
||||
//刷新报表数据
|
||||
new KQFormatBiz().format(lsFormatParams,16);
|
||||
new KQFormatBiz().format(lsFormatParams);
|
||||
|
||||
if(unSavePerson.size()>0 && !"1".equals(getPbCheckValue)){
|
||||
List<String> personNameList = new ArrayList<>();
|
||||
for(String personid:unSavePerson){
|
||||
personNameList.add(resourceComInfo.getLastname(personid));
|
||||
}
|
||||
String msg = "";
|
||||
if("2".equals(getPbCheckValue)){
|
||||
msg = "做五休二";
|
||||
}else if("3".equals(getPbCheckValue)){
|
||||
msg = "做四休二";
|
||||
}
|
||||
retmap.put("status", "-1");
|
||||
retmap.put("message", "【"+StringUtils.join(personNameList,",")+"】上述员工当前月份排班不符合"+msg+"规则或存在未排班日期");
|
||||
return retmap;
|
||||
}
|
||||
|
||||
retmap.put("status", "1");
|
||||
retmap.put("message", SystemEnv.getHtmlLabelName(18758, user.getLanguage()));
|
||||
|
|
@ -452,16 +713,69 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
|
|||
return retmap;
|
||||
}
|
||||
|
||||
private void addLog(KqShiftscheduleOperateLog bean) {
|
||||
operateLogParam = new ArrayList<>();
|
||||
operateLogParam.add(bean.getOperatetype());
|
||||
operateLogParam.add(bean.getOperator());
|
||||
operateLogParam.add(bean.getKqgroupname());
|
||||
operateLogParam.add(bean.getChangeduser());
|
||||
operateLogParam.add(bean.getChangedshiftdate());
|
||||
operateLogParam.add(bean.getChangedshiftname());
|
||||
operateLogParam.add(bean.getKqshiftid());
|
||||
operateLogParams.add(operateLogParam);
|
||||
/**
|
||||
* 判断是否是休息班
|
||||
* @param serialid
|
||||
* @return
|
||||
*/
|
||||
private static Boolean checkXxr(String serialid){
|
||||
RecordSet rs = new RecordSet();
|
||||
String sql = "select * from kq_ShiftManagement where id = "+serialid+" and is_rest = 1";
|
||||
rs.execute(sql);
|
||||
Boolean check = false;
|
||||
if (rs.getCounts()>0){
|
||||
check = true;
|
||||
}
|
||||
return check;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前日期是何种类型(这里只考虑节假日设置)
|
||||
*
|
||||
* @param groupId 考勤组ID
|
||||
* @param date 指定日期
|
||||
* @return 1-节假日、2-工作日、3-休息日、-1-没有设置过数据
|
||||
*/
|
||||
public static int getChangeType(String groupId, String date) {
|
||||
int changeType = -1;//默认没有设置过节假日(节假日设置的类型:1-公众假日、2-调配工作日、3-调配休息日)
|
||||
KQHolidaySetComInfo kqHolidaySetComInfo = new KQHolidaySetComInfo();
|
||||
String tmpChangetype = kqHolidaySetComInfo.getChangeType(groupId, date);
|
||||
if(null != tmpChangetype){
|
||||
changeType = Util.getIntValue(tmpChangetype, -1);
|
||||
}
|
||||
|
||||
return changeType;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取排班校验规则
|
||||
* @param groupid
|
||||
* @return
|
||||
*/
|
||||
private static String getpbCheckValue(String groupid){
|
||||
RecordSet rs = new RecordSet();
|
||||
String sql = "select pbcheck from kq_group where id = "+groupid;
|
||||
rs.execute(sql);
|
||||
String pbcheck = "";
|
||||
if (rs.next()){
|
||||
pbcheck = Util.null2String(rs.getString("pbcheck"));
|
||||
}
|
||||
return pbcheck;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
String fromDate = TimeUtil.getMonthBeginDay("2025-04-07");
|
||||
String toDate = TimeUtil.getMonthEndDay("2025-04-07");
|
||||
List<String> lsDate = new ArrayList<>();
|
||||
Calendar cal = DateUtil.getCalendar();
|
||||
boolean isEnd = false;
|
||||
for(String date=toDate; !isEnd;) {
|
||||
if(date.equals(fromDate)) isEnd = true;
|
||||
lsDate.add(date);
|
||||
cal.setTime(DateUtil.parseToDate(date));
|
||||
date = DateUtil.getDate(cal.getTime(), -1);
|
||||
}
|
||||
System.out.println(lsDate);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -0,0 +1,59 @@
|
|||
package com.engine.xmgsecond.entity;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @Author liang.cheng
|
||||
* @Date 2025/5/14 16:11
|
||||
* @Description:
|
||||
* @Version 1.0
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class KqFormatTotal {
|
||||
|
||||
private Integer resourceId;
|
||||
|
||||
private Integer absenteeism;
|
||||
|
||||
private Integer forgotCheck;
|
||||
|
||||
private Integer beLateMins;
|
||||
|
||||
private Integer gravebeLateMins;
|
||||
|
||||
private Integer leaveEearly;
|
||||
|
||||
private Integer graveLeaveEarly;
|
||||
|
||||
/**
|
||||
* 是否统计缺勤
|
||||
*/
|
||||
private boolean isAbsence;
|
||||
|
||||
/**
|
||||
* 缺勤天数
|
||||
*/
|
||||
private double absenceDays;
|
||||
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "KqFormatTotal{" +
|
||||
"resourceId=" + resourceId +
|
||||
", absenteeism=" + absenteeism +
|
||||
", forgotCheck=" + forgotCheck +
|
||||
", beLateMins=" + beLateMins +
|
||||
", gravebeLateMins=" + gravebeLateMins +
|
||||
", leaveEearly=" + leaveEearly +
|
||||
", graveLeaveEarly=" + graveLeaveEarly +
|
||||
", isAbsence=" + isAbsence +
|
||||
", absenceDays=" + absenceDays +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,98 @@
|
|||
package com.engine.xmgsecond.util;
|
||||
|
||||
import com.engine.xmgsecond.entity.KqFormatTotal;
|
||||
import weaver.conn.RecordSet;
|
||||
import weaver.general.BaseBean;
|
||||
import weaver.general.Util;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
/**
|
||||
* @Author liang.cheng
|
||||
* @Date 2025/5/14 16:16
|
||||
* @Description:
|
||||
* @Version 1.0
|
||||
*/
|
||||
public class KqCalulateUtil {
|
||||
|
||||
|
||||
/**
|
||||
* @Description: 时间范围内 考勤异常汇总成缺勤天数
|
||||
* @Author: liang.cheng
|
||||
* @Date: 2025/5/14 16:22
|
||||
* @param: [resourceId, fromDate, toDate]
|
||||
* @return: java.util.List<com.engine.xmgsecond.entity.KqFormatTotal>
|
||||
*/
|
||||
public static List<KqFormatTotal> abnormalAttendance(String resourceId,String fromDate,String toDate) {
|
||||
RecordSet rs = new RecordSet();
|
||||
List<KqFormatTotal> kqFormatTotalList = new ArrayList<>();
|
||||
rs.executeQuery("select resourceid, forgotCheck, absenteeism, beLateMins, gravebeLateMins, leaveEearly, " +
|
||||
" graveLeaveEarly from kq_format_total where resourceid = ? and kqdate >= '"+fromDate+"' and kqdate <= '"+toDate+"'",resourceId);
|
||||
while (rs.next()) {
|
||||
boolean isAbsence;
|
||||
int absenteeism = Util.getIntValue(rs.getString("absenteeism"));
|
||||
int forgotCheck = Util.getIntValue(rs.getString("forgotCheck"));
|
||||
int beLateMins = Util.getIntValue(rs.getString("beLateMins"),0);
|
||||
int gravebeLateMins = Util.getIntValue(rs.getString("gravebeLateMins"),0);
|
||||
int leaveEearly = Util.getIntValue(rs.getString("leaveEearly"));
|
||||
int graveLeaveEarly = Util.getIntValue(rs.getString("graveLeaveEarly"));
|
||||
|
||||
//规则1
|
||||
isAbsence = isPositive(absenteeism) ||
|
||||
isPositive(forgotCheck) ||
|
||||
sumPositive(leaveEearly, graveLeaveEarly) > 0;
|
||||
|
||||
kqFormatTotalList.add(KqFormatTotal.builder()
|
||||
.resourceId(Util.getIntValue(rs.getString("resourceid")))
|
||||
.beLateMins(beLateMins)
|
||||
.gravebeLateMins(gravebeLateMins)
|
||||
.isAbsence(isAbsence)
|
||||
.absenceDays(isAbsence ? 1 : 0)
|
||||
.build());
|
||||
}
|
||||
|
||||
|
||||
//规则2
|
||||
AtomicInteger graceCounter = new AtomicInteger(0);
|
||||
kqFormatTotalList.forEach(record -> {
|
||||
if (!record.isAbsence()) {
|
||||
int lateMinutes = sumNullSafe(record.getBeLateMins(), record.getGravebeLateMins());
|
||||
record.setAbsenceDays(calculateAbsenceDays(lateMinutes, graceCounter));
|
||||
}
|
||||
});
|
||||
|
||||
rs.writeLog("kqFormatTotalList2:"+kqFormatTotalList.toString());
|
||||
|
||||
return kqFormatTotalList;
|
||||
|
||||
}
|
||||
|
||||
public static boolean isPositive(Integer num) {
|
||||
return Optional.ofNullable(num).orElse(0) > 0;
|
||||
}
|
||||
|
||||
// 辅助方法:安全求和(处理 null 情况)
|
||||
public static int sumPositive(Integer a, Integer b) {
|
||||
return Optional.ofNullable(a).orElse(0) + Optional.ofNullable(b).orElse(0);
|
||||
}
|
||||
|
||||
private static double calculateAbsenceDays(int lateMinutes, AtomicInteger graceCounter) {
|
||||
if (lateMinutes <= 0) {
|
||||
return 0;
|
||||
}
|
||||
if (graceCounter.get() < 3 && lateMinutes > 0 && lateMinutes <= 15) {
|
||||
graceCounter.incrementAndGet();
|
||||
return 0;
|
||||
}
|
||||
return (lateMinutes > 0 && lateMinutes <= 240) ? 0.5 : 1;
|
||||
}
|
||||
|
||||
private static int sumNullSafe(Integer a, Integer b) {
|
||||
return Optional.ofNullable(a).orElse(0) + Optional.ofNullable(b).orElse(0);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue