You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
weaver-hostar/src/com/engine/kq/cmd/attendanceButton/PunchOutButtonCmd.java

380 lines
17 KiB
Java

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;
}
}