考勤上线后问题处理
parent
7a0a3e889c
commit
98b6e1847f
@ -0,0 +1,379 @@
|
||||
package com.engine.kq.cmd.attendanceButton;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.cloudstore.dev.api.util.EMManager;
|
||||
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.kq.entity.KQGroupEntity;
|
||||
import com.engine.kq.entity.WorkTimeEntity;
|
||||
import com.engine.kq.log.KQLog;
|
||||
import com.engine.kq.wfset.util.SplitActionUtil;
|
||||
import com.google.common.collect.Maps;
|
||||
import org.apache.commons.codec.digest.DigestUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import weaver.common.DateUtil;
|
||||
import weaver.conn.RecordSet;
|
||||
import weaver.dateformat.DateTransformer;
|
||||
import weaver.dateformat.TimeZoneVar;
|
||||
import weaver.general.BaseBean;
|
||||
import weaver.general.Util;
|
||||
import weaver.hrm.User;
|
||||
import weaver.systeminfo.SystemEnv;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* 外勤签到签退
|
||||
*/
|
||||
public class PunchOutButtonCmd extends AbstractCommonCommand<Map<String, Object>> {
|
||||
private HttpServletRequest request;
|
||||
public KQLog kqLog = new KQLog();
|
||||
BaseBean bb = new BaseBean();
|
||||
private Map<String,Object> logMap = Maps.newHashMap();
|
||||
private Map<String,Object> workTimeEntityLogMap = Maps.newHashMap();
|
||||
|
||||
public PunchOutButtonCmd(HttpServletRequest request, Map<String, Object> params, User user) {
|
||||
this.request = request;
|
||||
this.user = user;
|
||||
this.params = params;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, Object> execute(CommandContext commandContext) {
|
||||
Map<String, Object> retmap = new HashMap<String, Object>();
|
||||
try{
|
||||
|
||||
insertSign(retmap);
|
||||
|
||||
}catch (Exception e) {
|
||||
retmap.put("status", "-1");
|
||||
retmap.put("message", SystemEnv.getHtmlLabelName(382661,user.getLanguage()));
|
||||
writeLog(e);
|
||||
}
|
||||
|
||||
KQCardLogBiz.logCardInfo(user.getUID()+"", logMap, workTimeEntityLogMap, "punchOutButton");
|
||||
return retmap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 检验ip是否在考勤组设置的范围要求内
|
||||
*/
|
||||
private boolean checkIsInIp() {
|
||||
KQGroupBiz kqGroupBiz = new KQGroupBiz();
|
||||
String clientAddress = Util.getIpAddr(request);
|
||||
return kqGroupBiz.getIsInScope(user.getUID()+"", clientAddress);
|
||||
}
|
||||
|
||||
private void insertSign(Map<String, Object> retmap) {
|
||||
logMap.put("lastname", user.getLastname());
|
||||
logMap.put("params", params);
|
||||
// signSection: 2019-03-20 08:30#2019-03-20 18:30
|
||||
|
||||
RecordSet rs = new RecordSet();
|
||||
RecordSet rs1 = new RecordSet();
|
||||
String serialid = Util.null2String(params.get("serialid"));
|
||||
//应上班 工作时间点
|
||||
String time = Util.null2String(params.get("time"));
|
||||
//应上班 工作时间 带日期
|
||||
String datetime = Util.null2String(params.get("datetime"));
|
||||
//允许打卡时段 带日期
|
||||
String signSectionTime = Util.null2String(params.get("signSectionTime"));
|
||||
//打卡所属worksection的对应的点
|
||||
String type = Util.null2String(params.get("type"));
|
||||
//所属打卡日期
|
||||
String belongdate = Util.null2String(params.get("belongdate"));
|
||||
boolean belongdateIsNull = belongdate.length()==0;
|
||||
String islastsign = Util.null2String(params.get("islastsign"));
|
||||
|
||||
String isPunchOpen = Util.null2String(params.get("isPunchOpen"));
|
||||
|
||||
String workmins = Util.null2String(params.get("workmins"));
|
||||
//针对非工作时段 签退的时候记录的签到数据 用于计算加班
|
||||
String signInTime4Out = Util.null2String(params.get("signInTime4Out"));
|
||||
//允许打卡的范围
|
||||
String signsection = Util.null2String(params.get("signSection"));
|
||||
|
||||
//手机打卡部分
|
||||
String longitude = Util.null2String(params.get("longitude"));
|
||||
String latitude = Util.null2String(params.get("latitude"));
|
||||
double d_longitude = Util.getDoubleValue(longitude);
|
||||
double d_latitude = Util.getDoubleValue(latitude);
|
||||
if(d_latitude <= 0){
|
||||
latitude = "";
|
||||
}
|
||||
if(d_longitude <= 0){
|
||||
longitude = "";
|
||||
}
|
||||
String address = Util.null2String(params.get("address"));
|
||||
String ismobile = Util.null2String(params.get("ismobile"));
|
||||
String remark = Util.null2String(params.get("remark"));
|
||||
String attachment = Util.null2String(params.get("fileids"));
|
||||
//区分是来自于钉钉还是EM7
|
||||
String browser = Util.null2String(params.get("browser"));
|
||||
//客户
|
||||
String crm = Util.null2String(params.get("crm"));
|
||||
//是否开启外勤签到转考勤
|
||||
String outsidesign = "";
|
||||
KQGroupMemberComInfo kqGroupMemberComInfo = new KQGroupMemberComInfo();
|
||||
KQGroupEntity kqGroupEntity = kqGroupMemberComInfo.getUserKQGroupInfo(user.getUID()+"");
|
||||
String kqGroupEntityInfo = kqGroupEntity != null ? JSON.toJSONString(kqGroupEntity): "";
|
||||
logMap.put("kqGroupEntityInfo", kqGroupEntityInfo);
|
||||
if (kqGroupEntity != null) {
|
||||
outsidesign = kqGroupEntity.getOutsidesign();
|
||||
}
|
||||
kqLog.info(user.getLastname()+":params:"+params+":outsidesign:"+outsidesign);
|
||||
|
||||
int userId = user.getUID();
|
||||
String signfrom = "e9_mobile_out";
|
||||
DateTimeFormatter allFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
||||
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
|
||||
LocalDateTime localTime = LocalDateTime.now();
|
||||
String signTime =localTime.format(dateTimeFormatter);
|
||||
String signDate = localTime.format(dateFormatter);
|
||||
|
||||
KQWorkTime kqWorkTime = new KQWorkTime();
|
||||
WorkTimeEntity workTimeEntity = kqWorkTime.getWorkTime(user.getUID()+"", signDate);
|
||||
String userinfo = "#userid#"+user.getUID()+"#getUserSubCompany1#"+user.getUserSubCompany1()+"#getUserSubCompany1#"+user.getUserDepartment()
|
||||
+"#getJobtitle#"+user.getJobtitle();
|
||||
workTimeEntityLogMap.put("resourceid", userinfo);
|
||||
workTimeEntityLogMap.put("splitDate", signDate);
|
||||
workTimeEntityLogMap.put("workTimeEntity", workTimeEntity);
|
||||
|
||||
//处理多时区
|
||||
String timeZoneConversion = Util.null2String(new weaver.general.BaseBean().getPropValue("weaver_timezone_conversion","timeZoneConversion")).trim();
|
||||
logMap.put("timeZoneConversion", timeZoneConversion);
|
||||
if("1".equals(timeZoneConversion)) {
|
||||
DateTransformer dateTransformer=new DateTransformer();
|
||||
String[] zone_localTime = dateTransformer.getLocaleDateAndTime(signDate,signTime);
|
||||
if(zone_localTime != null && zone_localTime.length == 2){
|
||||
signDate = zone_localTime[0];
|
||||
signTime = zone_localTime[1];
|
||||
}
|
||||
}
|
||||
String timeZone = Util.null2String(TimeZoneVar.getTimeZone(),"");
|
||||
String signData = Util.null2String(params.get("signData"));
|
||||
String groupid = workTimeEntity.getGroupId();
|
||||
String text ="wea"+ userId + groupid;
|
||||
kqLog.writeLog("PunchOutButtonCmd>text=" + text);
|
||||
String ma5Text = DigestUtils.md5Hex(text)+"ver";
|
||||
kqLog.writeLog("PunchOutButtonCmd>ma5Text=" + ma5Text+";signData=" + signData);
|
||||
if(!signData.equals(ma5Text)){
|
||||
retmap.put("status", "0");
|
||||
retmap.put("message", SystemEnv.getHtmlLabelName(382661,user.getLanguage()));
|
||||
return ;
|
||||
}
|
||||
String mobile_sign_sql = "insert into mobile_sign(operater,operate_type,operate_date,operate_time,longitude,latitude,address,remark,attachment,crm,timezone) "
|
||||
+ " values(?,?,?,?,?,?,?,?,?,?,?) ";
|
||||
rs1.executeUpdate(mobile_sign_sql, userId,signfrom,signDate,signTime,longitude,latitude,address,remark,attachment,crm,timeZone);
|
||||
|
||||
logMap.put("outsidesign", outsidesign);
|
||||
if("1".equalsIgnoreCase(outsidesign)){
|
||||
|
||||
JSONObject jsonObject = null;
|
||||
String deviceInfo = Util.null2String(params.get("deviceInfo"));
|
||||
if(deviceInfo.length() > 0){
|
||||
jsonObject = JSON.parseObject(deviceInfo);
|
||||
JSONObject jsonObject1 = new JSONObject();
|
||||
Set<Entry<String, Object>> jsonSet = jsonObject.entrySet();
|
||||
for(Entry<String, Object> js : jsonSet){
|
||||
String key = js.getKey();
|
||||
String value = Util.null2String(js.getValue());
|
||||
jsonObject1.put(key, value);
|
||||
}
|
||||
if(!jsonObject1.isEmpty()){
|
||||
deviceInfo = jsonObject1.toJSONString();
|
||||
}
|
||||
}
|
||||
|
||||
if("DingTalk".equalsIgnoreCase(browser)){
|
||||
signfrom = "DingTalk_out";
|
||||
}else if("Wechat".equalsIgnoreCase(browser)){
|
||||
signfrom = "Wechat_out";
|
||||
String weChat_deviceid = Util.null2String(request.getSession().getAttribute(EMManager.DeviceId));
|
||||
kqLog.info("EMManager.DeviceId:"+EMManager.DeviceId+":weChat_deviceid:"+weChat_deviceid);
|
||||
logMap.put("weChat_deviceid", weChat_deviceid);
|
||||
|
||||
if(weChat_deviceid.length() > 0){
|
||||
//微信打卡的设备号需要单独处理
|
||||
if(jsonObject != null){
|
||||
jsonObject.put("deviceId", weChat_deviceid);
|
||||
}else{
|
||||
jsonObject = new JSONObject();
|
||||
jsonObject.put("deviceId", weChat_deviceid);
|
||||
}
|
||||
if(!jsonObject.isEmpty()){
|
||||
deviceInfo = jsonObject.toJSONString();
|
||||
}
|
||||
}
|
||||
}
|
||||
//自由班制处理
|
||||
String isfree = Util.null2String(params.get("isfree"));
|
||||
|
||||
String userType = user.getLogintype();
|
||||
String signType = "on".equalsIgnoreCase(type) ? "1" : "2";
|
||||
String clientAddress = Util.getIpAddr(request);
|
||||
boolean isInIp = true;
|
||||
|
||||
String isInCom = isInIp ? "1" : "0";
|
||||
|
||||
String datetime_timezone = signDate+" "+signTime;
|
||||
LocalDateTime nowDateTime = LocalDateTime.parse(datetime_timezone,allFormatter);
|
||||
kqLog.info("timeZone:"+timeZone+":signDate:"+signDate+":signTime:"+signTime+":nowDateTime:"+nowDateTime);
|
||||
|
||||
boolean isInScope = true;
|
||||
if(signsection != null && signsection.length() > 0){
|
||||
List<String> signsectionList = Util.TokenizerString(signsection, ",");
|
||||
for(int i = 0 ; i < signsectionList.size() ; i++){
|
||||
String signsections = Util.null2String(signsectionList.get(i));
|
||||
String[] signsection_arr = signsections.split("#");
|
||||
if(signsection_arr != null && signsection_arr.length == 2){
|
||||
String canStart = signsection_arr[0];
|
||||
String canEnd = signsection_arr[1];
|
||||
LocalDateTime startSignDateTime = LocalDateTime.parse(canStart,allFormatter);
|
||||
LocalDateTime endSignDateTime = LocalDateTime.parse(canEnd,allFormatter);
|
||||
if(nowDateTime.isBefore(startSignDateTime) || nowDateTime.isAfter(endSignDateTime)){
|
||||
isInScope = false;
|
||||
}else{
|
||||
isInScope = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!isInScope){
|
||||
//外勤的不在范围内也不管,全部计入考勤表
|
||||
// retmap.put("status", "1");
|
||||
// retmap.put("message", SystemEnv.getHtmlLabelName(503597 , user.getLanguage()));
|
||||
// return ;
|
||||
}
|
||||
if(belongdate.length() == 0){
|
||||
belongdate = signDate;
|
||||
}
|
||||
deviceInfo = deviceInfo.replaceAll("\\?", "");
|
||||
String punchSql = "insert into HrmScheduleSign(userId,userType,signType,signDate,signTime,clientAddress,isInCom,timeZone,belongdate,signfrom,longitude,latitude,addr,deviceInfo) "+
|
||||
" values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
|
||||
boolean isok = rs.executeUpdate(punchSql,userId,userType,signType,signDate,signTime,clientAddress,isInCom,
|
||||
timeZone,belongdate,signfrom,longitude,latitude,address,deviceInfo);
|
||||
|
||||
logMap.put("punchSql", punchSql);
|
||||
logMap.put("punchSql_isok", isok);
|
||||
//同步更新考勤数据到考勤报表
|
||||
if(belongdateIsNull){
|
||||
//外勤签到没有归属日期,遇到跨天班次打卡可能归属前一天,需要格式化前一天考勤
|
||||
kqLog.info("PunchOutButtonCmd:userId:"+userId+":belongdate:"+DateUtil.getYesterday());
|
||||
new KQFormatBiz().formatDate(""+userId,DateUtil.getYesterday());
|
||||
}
|
||||
kqLog.info("PunchOutButtonCmd:userId:"+userId+":belongdate:"+(belongdate.length() == 0 ? DateUtil.getCurrentDate() : belongdate));
|
||||
if(belongdate.length()==0){
|
||||
//外勤签到没有归属日期,遇到跨天班次打卡可能归属前一天,需要格式化前一天考勤
|
||||
new KQFormatBiz().formatDate(""+userId,DateUtil.getYesterday());
|
||||
}
|
||||
new KQFormatBiz().formatDate(""+userId,(belongdate.length() == 0 ? DateUtil.getCurrentDate() : belongdate));
|
||||
//外勤签到转的考勤 处理加班规则
|
||||
SplitActionUtil.pushOverTimeTasksAll(belongdate,belongdate,""+userId);
|
||||
}
|
||||
/*考勤二开--外出出差流程外勤打卡start*/
|
||||
else {
|
||||
bb.writeLog("外勤打卡转考勤卡start");
|
||||
//先判断是否有外出出差流程
|
||||
String evectionTableName = Util.null2String(bb.getPropValue("project_hostar","evectionTableName"));
|
||||
String outTableName = Util.null2String(bb.getPropValue("project_hostar","outTableName"));
|
||||
|
||||
if ( StringUtils.isNotBlank(evectionTableName) && StringUtils.isNotBlank(outTableName) ) {
|
||||
Integer number = -1;
|
||||
String acqEvecAndOutSql = " select sum(a.number) as number " +
|
||||
" from ( " +
|
||||
" SELECT " +
|
||||
" count(*) as number " +
|
||||
" FROM " +
|
||||
" workflow_requestbase " +
|
||||
" WHERE " +
|
||||
" requestid IN ( SELECT requestid FROM " + evectionTableName + " WHERE sqr = '" + userId + "' and ksrq <='" + belongdate + "' and yjjsrq >='" + belongdate + "' ) " +
|
||||
" AND currentnodetype = 3 " +
|
||||
" UNION all " +
|
||||
" SELECT " +
|
||||
" count(*) as number " +
|
||||
" FROM " +
|
||||
" workflow_requestbase " +
|
||||
" WHERE " +
|
||||
" requestid IN ( SELECT requestid FROM " + outTableName + " WHERE sqr = '" + userId + "' and ksrq <='" + belongdate + "' and yjjsrq >='" + belongdate + "') " +
|
||||
// " AND currentnodetype = 3 " +
|
||||
") a ";
|
||||
rs.executeQuery(acqEvecAndOutSql);
|
||||
// bb.writeLog("acqEvecAndOutSql: " + acqEvecAndOutSql);
|
||||
|
||||
while (rs.next()) {
|
||||
number = Util.getIntValue(Util.null2String(rs.getString("number")));
|
||||
}
|
||||
bb.writeLog("number: " + number);
|
||||
|
||||
if (number > 0) {
|
||||
boolean isInIp = true;
|
||||
String userType = user.getLogintype();
|
||||
String signType = "on".equalsIgnoreCase(type) ? "1" : "2";
|
||||
String clientAddress = Util.getIpAddr(request);
|
||||
String isInCom = isInIp ? "1" : "0";
|
||||
JSONObject jsonObject = null;
|
||||
String deviceInfo = Util.null2String(params.get("deviceInfo"));
|
||||
if(deviceInfo.length() > 0){
|
||||
jsonObject = JSON.parseObject(deviceInfo);
|
||||
JSONObject jsonObject1 = new JSONObject();
|
||||
Set<Entry<String, Object>> jsonSet = jsonObject.entrySet();
|
||||
for(Entry<String, Object> js : jsonSet){
|
||||
String key = js.getKey();
|
||||
String value = Util.null2String(js.getValue());
|
||||
jsonObject1.put(key, value);
|
||||
}
|
||||
if(!jsonObject1.isEmpty()){
|
||||
deviceInfo = jsonObject1.toJSONString();
|
||||
}
|
||||
}
|
||||
|
||||
String punchSql = "insert into HrmScheduleSign(userId,userType,signType,signDate,signTime,clientAddress,isInCom,timeZone,belongdate,signfrom,longitude,latitude,addr,deviceInfo) "+
|
||||
" values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
|
||||
boolean isok = rs.executeUpdate(punchSql,userId,userType,signType,signDate,signTime,clientAddress,isInCom,
|
||||
timeZone,belongdate,signfrom,longitude,latitude,address,deviceInfo);
|
||||
bb.writeLog("isok: " + isok);
|
||||
//同步更新考勤数据到考勤报表
|
||||
if(belongdateIsNull){
|
||||
//外勤签到没有归属日期,遇到跨天班次打卡可能归属前一天,需要格式化前一天考勤
|
||||
bb.writeLog("PunchOutButtonCmd:userId:"+userId+":belongdate:"+DateUtil.getYesterday());
|
||||
new KQFormatBiz().formatDate(""+userId,DateUtil.getYesterday());
|
||||
}
|
||||
bb.writeLog("PunchOutButtonCmd:userId:"+userId+":belongdate:"+(belongdate.length() == 0 ? DateUtil.getCurrentDate() : belongdate));
|
||||
if(belongdate.length()==0){
|
||||
//外勤签到没有归属日期,遇到跨天班次打卡可能归属前一天,需要格式化前一天考勤
|
||||
new KQFormatBiz().formatDate(""+userId,DateUtil.getYesterday());
|
||||
}
|
||||
new KQFormatBiz().formatDate(""+userId,(belongdate.length() == 0 ? DateUtil.getCurrentDate() : belongdate));
|
||||
//外勤签到转的考勤 处理加班规则
|
||||
SplitActionUtil.pushOverTimeTasksAll(belongdate,belongdate,""+userId);
|
||||
}
|
||||
|
||||
}
|
||||
bb.writeLog("外勤打卡转考勤卡end");
|
||||
}
|
||||
/*考勤二开--外出出差流程外勤打卡end*/
|
||||
retmap.put("status", "1");
|
||||
retmap.put("signdate", signDate);
|
||||
retmap.put("signtime", signTime);
|
||||
logMap.put("retmap", retmap);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BizLogContext getLogContext() {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue