package com.product.administration.service;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.product.administration.config.CmnConst;
import com.product.administration.config.SystemCode;
import com.product.common.lang.StringUtils;
import com.product.core.dao.BaseDao;
import com.product.core.entity.DataTableEntity;
import com.product.core.entity.FieldSetEntity;
import com.product.core.exception.BaseException;
import com.product.core.service.support.AbstractBaseService;
import com.product.core.spring.context.SpringMVCContextHolder;
import com.product.module.sys.entity.SystemUser;
/**
* 打卡记录
* Copyright PRODUCT-BASE
* @Title: PRODUCT-BASE-
* @Project: PunchRecordService
* @Date: 2021年8月9日 上午11:30:38
* @Author: 杜洪波
* @Description:
*/
@Component
public class PunchRecordService extends AbstractBaseService{
@Autowired
BaseDao baseDao;
/**
* 考勤打卡列表
* @param fse
* @return
*/
public DataTableEntity listRecordInfo(FieldSetEntity fse) throws ParseException {
DataTableEntity dt=baseDao.listTable(CmnConst.PRODUCT_OA_PUNCH_RECORD, "created_by=?", new Object[] {SpringMVCContextHolder.getCurrentUser().getUser_id()}, null, CmnConst.CREATED_UTC_DATETIME+" DESC", fse.getInteger(CmnConst.PAGESIZE), fse.getInteger(CmnConst.CPAGE));
for (int i=0;i
param1=new ArrayList<>();
param1.add(fieldSetEntity.getValue("created_by").toString());
param1.add(fieldSetEntity.getValue("punch_congfig_uuid").toString());
param1.add(fieldSetEntity.getValue("created_by").toString()+",");
//获取使用到的设置规则
StringBuilder sbPunchTime=new StringBuilder();
sbPunchTime.append(" SELECT c.* ");
sbPunchTime.append(" FROM ( ");
sbPunchTime.append(" SELECT d.* ");
sbPunchTime.append(" FROM product_oa_punch_time d ");
sbPunchTime.append(" left JOIN product_oa_punch_record b ");
sbPunchTime.append(" on d.punch_site_uuid=b.punch_congfig_uuid and d.created_by=? where d.punch_site_uuid= ? ");
sbPunchTime.append(" ) c ");
sbPunchTime.append(" where c.uuid in ( ");
sbPunchTime.append(" SELECT DISTINCT uuid ");
sbPunchTime.append(" FROM product_oa_punch_time ");
sbPunchTime.append(" where LOCATE(?, concat(attendance_object,','))>0 ");
sbPunchTime.append(" ) ");
DataTableEntity dataTableEntity = baseDao.listTable(sbPunchTime.toString(), param1.toArray());
long beLate1 = 0;
long beLate2 = 0;
long beEarily1 = 0;
long beEarily2 = 0;
if(dataTableEntity.getRows()!=0){
String morning_work="";
String morning_work_off="";
String afternoon_work="";
String afternoon_work_off="";
Date morning_work_date;
Date morning_work_off_date;
Date afternoon_work_date;
Date afternoon_work_off_date;
DateTime punch_time_one_date;
DateTime punch_time_two_date;
DateTime punch_time_three_date;
DateTime punch_time_four_date;
SimpleDateFormat dateFormatHHmmss = new SimpleDateFormat("HH:mm:ss");
morning_work = dataTableEntity.getData().get(0).getValue("morning_work").toString();
afternoon_work_off = dataTableEntity.getData().get(0).getValue("afternoon_work_off").toString();
morning_work_date= DateUtil.parse(morning_work.split(" ")[1]);
afternoon_work_off_date= DateUtil.parse(afternoon_work_off.split(" ")[1]);
StringBuilder lateSb=new StringBuilder();
StringBuilder earilySb=new StringBuilder();
StringBuilder supereffective_distance=new StringBuilder();
if(!ObjectUtil.isNotEmpty(dataTableEntity.getData().get(0).getValue("morning_work_off")) && !ObjectUtil.isNotEmpty(dataTableEntity.getData().get(0).getValue("afternoon_work"))){
int distance = Integer.parseInt(dataTableEntity.getData().get(0).getValue("distance").toString());
if(ObjectUtil.isNotEmpty(fieldSetEntity.getValue("punch_time_one"))){
String punch_time_one1 = dateFormatHHmmss.format(fieldSetEntity.getValue("punch_time_one"));
punch_time_one_date = DateUtil.parse(punch_time_one1);
beLate1 = DateUtil.between(punch_time_one_date, morning_work_date, DateUnit.MINUTE);
if(beLate1>0){
lateSb.append("迟到:"+beLate1+"分钟");
}
int punch_range_one = Integer.parseInt(fieldSetEntity.getValue("punch_range_one").toString());
if(punch_range_one>distance){
int distanceMorning = punch_range_one- distance;
fieldSetEntity.setValue("supereffective_distance","上班超有效距离:"+distanceMorning);
}
}else {
lateSb.append("上班未打卡");
}
if(ObjectUtil.isNotEmpty(fieldSetEntity.getValue("punch_time_four"))){
String punch_time_four = dateFormatHHmmss.format(fieldSetEntity.getValue("punch_time_four"));
punch_time_four_date = DateUtil.parse(punch_time_four);
beEarily2 = DateUtil.between(punch_time_four_date, afternoon_work_off_date, DateUnit.MINUTE);
if(beEarily2>0){
earilySb.append("早退:"+beEarily2+"分钟");
}
int punch_range_four = Integer.parseInt(fieldSetEntity.getValue("punch_range_four").toString());
if(punch_range_four>distance){
int distanceMorning = punch_range_four- distance;
fieldSetEntity.setValue("supereffective_distance","下班超有效距离:"+distanceMorning);
}
}else {
earilySb.append("下班未打卡");
}
int punch_range_four = Integer.parseInt(fieldSetEntity.getValue("punch_range_four").toString());
int punch_range_one = Integer.parseInt(fieldSetEntity.getValue("punch_range_one").toString());
if(punch_range_one>distance){
fieldSetEntity.setValue("supereffective_distance",punch_range_one-distance);
}else if(punch_range_four>distance){
fieldSetEntity.setValue("supereffective_distance",punch_range_four-distance);
}else {
fieldSetEntity.setValue("supereffective_distance","正常");
}
}else {
morning_work = dataTableEntity.getData().get(0).getValue("morning_work").toString();
morning_work_date= DateUtil.parse(morning_work.split(" ")[1]);
morning_work_off = dataTableEntity.getData().get(0).getValue("morning_work_off").toString();
morning_work_off_date= DateUtil.parse(morning_work_off.split(" ")[1]);
afternoon_work =dataTableEntity.getData().get(0).getValue("afternoon_work").toString();
afternoon_work_date= DateUtil.parse(afternoon_work.split(" ")[1]);
afternoon_work_off = dataTableEntity.getData().get(0).getValue("afternoon_work_off").toString();
afternoon_work_off_date= DateUtil.parse(afternoon_work_off.split(" ")[1]);
int distance = Integer.parseInt(dataTableEntity.getData().get(0).getValue("distance").toString());
if(ObjectUtil.isNotEmpty(fieldSetEntity.getValue("punch_time_one"))){
String punch_time_one1 = dateFormatHHmmss.format(fieldSetEntity.getValue("punch_time_one"));
punch_time_one_date = DateUtil.parse(punch_time_one1);
beLate1 = DateUtil.between(punch_time_one_date, morning_work_date, DateUnit.MINUTE);
if(beLate1>0){
lateSb.append("早上班迟到:"+beLate1+" ");
}
int punch_range_one = Integer.parseInt(fieldSetEntity.getValue("punch_range_one").toString());
if(punch_range_one>distance){
int distanceMorning = punch_range_one- distance;
supereffective_distance.append("早上班超有效距离:"+distanceMorning);
}
}else {
lateSb.append("早上班未打卡"+" ");
}
if(ObjectUtil.isNotEmpty(fieldSetEntity.getValue("punch_time_two"))){
String punch_time_two= dateFormatHHmmss.format(fieldSetEntity.getValue("punch_time_two"));
punch_time_two_date = DateUtil.parse(punch_time_two);
beEarily1 = DateUtil.between(punch_time_two_date, morning_work_off_date, DateUnit.MINUTE);
if(beEarily1>0){
earilySb.append("早下班早退:"+beEarily1+" ");
}
int punch_range_two = Integer.parseInt(fieldSetEntity.getValue("punch_range_two").toString());
if(punch_range_two>distance){
int distanceMorningoff = punch_range_two- distance;
supereffective_distance.append("早下班超有效距离:"+distanceMorningoff);
}
}else {
earilySb.append("早下班未打卡"+" ");
}
if(ObjectUtil.isNotEmpty(fieldSetEntity.getValue("punch_time_three"))){
String punch_time_three = dateFormatHHmmss.format(fieldSetEntity.getValue("punch_time_three"));
punch_time_three_date = DateUtil.parse(punch_time_three);
beLate2 = DateUtil.between(punch_time_three_date, afternoon_work_date, DateUnit.MINUTE);
if(beLate2>0){
lateSb.append("下午上班迟到:"+beLate2+" ");
}
int punch_range_three = Integer.parseInt(fieldSetEntity.getValue("punch_range_three").toString());
if(punch_range_three>distance){
int distanceAfternoon = punch_range_three- distance;
supereffective_distance.append("下午上班超有效距离:"+distanceAfternoon);
}
}else {
lateSb.append("早上班未打卡"+" ");
}
if(ObjectUtil.isNotEmpty(fieldSetEntity.getValue("punch_time_four"))){
String punch_time_four = dateFormatHHmmss.format(fieldSetEntity.getValue("punch_time_four"));
punch_time_four_date = DateUtil.parse(punch_time_four);
beEarily2 = DateUtil.between(punch_time_four_date, afternoon_work_off_date, DateUnit.MINUTE);
if(beEarily2>0){
earilySb.append("下午下班早退:"+beEarily2+" ");
}
int punch_range_four = Integer.parseInt(fieldSetEntity.getValue("punch_range_four").toString());
if(punch_range_four>distance){
int distanceAfternoonoff = punch_range_four- distance;
supereffective_distance.append("下午下班超有效距离:"+distanceAfternoonoff);
}
}else {
earilySb.append("下午下班未打卡"+" ");
}
}
fieldSetEntity.setValue("be_late",lateSb);
fieldSetEntity.setValue("ealy_leave",earilySb);
fieldSetEntity.setValue("supereffective_distance",supereffective_distance.toString());
}
}
dt.setFieldFormat("punch_time_one", " HH:mm");
dt.setFieldFormat("punch_time_two", " HH:mm");
dt.setFieldFormat("punch_time_three", " HH:mm");
dt.setFieldFormat("punch_time_four", " HH:mm");
baseDao.loadPromptData(dt);
return dt;
}
/**
* 考勤打卡详情
* @param uuid
* @return
*/
public FieldSetEntity findRecordInfo(String uuid) {
return baseDao.getFieldSetEntity(CmnConst.PRODUCT_OA_PUNCH_RECORD, uuid, true);
}
/**
* 考勤打卡新增
* @param fse
* @return
*/
public String addRecordInfo(FieldSetEntity fse) {
SimpleDateFormat df = new SimpleDateFormat(CmnConst.YYYYMMDDHHMMSS);
SystemUser currentUser=SpringMVCContextHolder.getCurrentUser(); //获取打卡人
Date created_datetime=fse.getDate("created_datetime"); //获取打卡时间
// Date created_datetime=new Date(); //获取打卡时间
String string_created_datetime=df.format(created_datetime); //时间转string
//获取公司打卡时间配置信息
FieldSetEntity fseCompanyPunch=baseDao.getFieldSetEntityByFilter("product_oa_punch_time", "org_level_uuid=?", new Object[] {currentUser.getOrg_level_uuid()}, false);
if (fseCompanyPunch==null) {
throw new BaseException(SystemCode.SYSTEM_CONMAPNY_PUNCH_NO_EXIST.getValue(), SystemCode.SYSTEM_CONMAPNY_PUNCH_NO_EXIST.getText(), this.getClass(), "addRecordInfo");
}
//获取当天打卡信息
FieldSetEntity fsePunchInfo=baseDao.getFieldSetEntityByFilter(CmnConst.PRODUCT_OA_PUNCH_RECORD, "created_by=? and DATE_FORMAT(created_utc_datetime,'%Y-%m-%d')like ?", new Object[] {currentUser.getUser_id(),string_created_datetime.substring(0, 10)+"%"}, false);
if (fsePunchInfo==null) {
FieldSetEntity fseNewPunchInfo = new FieldSetEntity();
fseNewPunchInfo.setTableName(CmnConst.PRODUCT_OA_PUNCH_RECORD);
fseNewPunchInfo.setValue(CmnConst.ORG_LEVEL_UUID, currentUser.getOrg_level_uuid());
fseNewPunchInfo.setValue(CmnConst.DEPT_UUID, currentUser.getDept_uuid());
fseNewPunchInfo.setValue(CmnConst.CREATED_BY, currentUser.getUser_id());
fseNewPunchInfo.setValue(CmnConst.CREATED_UTC_DATETIME, created_datetime);
fseNewPunchInfo.setValue("punch_time_one", created_datetime);
//新增打卡信息
return baseDao.add(fseNewPunchInfo);
}else {
//打卡模式(0:双卡 1:四卡)
int punchMode=0;
if (StringUtils.isEmpty(fseCompanyPunch.getString("work_time_two"))) {
punchMode=1;
}
String punch_time_one=fsePunchInfo.getDate("punch_time_one", CmnConst.YYYYMMDDHHMMSS);
String punch_time_two=fsePunchInfo.getDate("punch_time_two", CmnConst.YYYYMMDDHHMMSS);
String punch_time_three=fsePunchInfo.getDate("punch_time_three", CmnConst.YYYYMMDDHHMMSS);
String punch_time_four=fsePunchInfo.getDate("punch_time_four", CmnConst.YYYYMMDDHHMMSS);
List list=new ArrayList<>();
if (punch_time_one!=null) {
list.add(punch_time_one);
}
if (punch_time_two!=null) {
list.add(punch_time_two);
}
if (punch_time_three!=null) {
list.add(punch_time_three);
}
if (punch_time_four!=null) {
list.add(punch_time_four);
}
list.add(string_created_datetime);
Collections.sort(list);
for (int i = 0; i < list.size(); i++) {
if (punchMode==1) {
if (i==0) {
fsePunchInfo.setValue("punch_time_one", list.get(i));
}else if (i==1) {
fsePunchInfo.setValue("punch_time_four", list.get(i));
}
}else {
if (i==0) {
fsePunchInfo.setValue("punch_time_one", list.get(i));
}else if (i==1) {
fsePunchInfo.setValue("punch_time_two", list.get(i));
}else if (i==2) {
fsePunchInfo.setValue("punch_time_three", list.get(i));
}else if (i==3) {
fsePunchInfo.setValue("punch_time_four", list.get(i));
}
}
}
//修改打卡信息
baseDao.update(fsePunchInfo);
return fsePunchInfo.getUUID();
}
}
}