提交 f36d7c18 编写于 作者: O o2null

Merge branch 'fix/attendance_1222' into 'wrdp'

考勤,新增周末设置,并应用到考勤计算中

See merge request o2oa/o2oa!2598
......@@ -13,6 +13,7 @@ import javax.persistence.criteria.Root;
import com.x.attendance.assemble.common.date.DateOperation;
import com.x.attendance.assemble.control.AbstractFactory;
import com.x.attendance.assemble.control.Business;
import com.x.attendance.assemble.control.service.AttendanceSettingServiceAdv;
import com.x.attendance.entity.AttendanceWorkDayConfig;
import com.x.attendance.entity.AttendanceWorkDayConfig_;
import com.x.base.core.project.exception.ExceptionWhen;
......@@ -23,7 +24,8 @@ import com.x.base.core.project.exception.ExceptionWhen;
public class AttendanceWorkDayConfigFactory extends AbstractFactory {
private DateOperation dateOperation = new DateOperation();
private AttendanceSettingServiceAdv attendanceSettingServiceAdv = new AttendanceSettingServiceAdv();
public AttendanceWorkDayConfigFactory(Business business) throws Exception {
super(business);
}
......@@ -32,8 +34,8 @@ public class AttendanceWorkDayConfigFactory extends AbstractFactory {
public AttendanceWorkDayConfig get( String id ) throws Exception {
return this.entityManagerContainer().find(id, AttendanceWorkDayConfig.class, ExceptionWhen.none);
}
// @MethodDescribe("列示全部的AttendanceWorkDayConfig信息列表")
// @MethodDescribe("列示全部的AttendanceWorkDayConfig信息列表")
@SuppressWarnings("unused")
public List<AttendanceWorkDayConfig> listAll() throws Exception {
EntityManager em = this.entityManagerContainer().get(AttendanceWorkDayConfig.class);
......@@ -42,7 +44,7 @@ public class AttendanceWorkDayConfigFactory extends AbstractFactory {
Root<AttendanceWorkDayConfig> root = cq.from( AttendanceWorkDayConfig.class);
return em.createQuery(cq).getResultList();
}
//@MethodDescribe("列示指定Id的AttendanceWorkDayConfig信息列表")
public List<AttendanceWorkDayConfig> list(List<String> ids) throws Exception {
if( ids == null || ids.size() == 0 ){
......@@ -55,7 +57,7 @@ public class AttendanceWorkDayConfigFactory extends AbstractFactory {
Predicate p = root.get(AttendanceWorkDayConfig_.id).in(ids);
return em.createQuery(cq.where(p)).getResultList();
}
//@MethodDescribe("根据年份月份列示全部的AttendanceWorkDayConfig信息列表")
public List<String> listByYearAndMonth( String year, String month ) throws Exception {
if( year == null ){
......@@ -64,20 +66,20 @@ public class AttendanceWorkDayConfigFactory extends AbstractFactory {
if( "0".equals(month) || "00".equals(month) || "(0)".equals(month)){
month = null;
}
EntityManager em = this.entityManagerContainer().get(AttendanceWorkDayConfig.class);
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<AttendanceWorkDayConfig> root = cq.from( AttendanceWorkDayConfig.class);
cq.select(root.get(AttendanceWorkDayConfig_.id));
Predicate p = cb.equal( root.get(AttendanceWorkDayConfig_.configYear), year);
if( month != null ){
p = cb.and( p, cb.equal( root.get(AttendanceWorkDayConfig_.configMonth), month));
}
return em.createQuery(cq.where(p)).getResultList();
}
//@MethodDescribe("根据年份和节假日名称列示全部的AttendanceWorkDayConfig信息列表")
public List<String> listByYearAndName( String year, String configName ) throws Exception {
if( year == null ){
......@@ -88,14 +90,14 @@ public class AttendanceWorkDayConfigFactory extends AbstractFactory {
CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<AttendanceWorkDayConfig> root = cq.from( AttendanceWorkDayConfig.class);
cq.select(root.get(AttendanceWorkDayConfig_.id));
Predicate p = cb.equal( root.get(AttendanceWorkDayConfig_.configYear), year);
if( configName != null ){
p = cb.and( p, cb.equal( root.get(AttendanceWorkDayConfig_.configName), configName));
}
return em.createQuery(cq.where(p)).getResultList();
}
//@MethodDescribe("根据节假日名称列示全部的AttendanceWorkDayConfig信息列表")
public List<String> listByName( String configName ) throws Exception {
EntityManager em = this.entityManagerContainer().get(AttendanceWorkDayConfig.class);
......@@ -103,9 +105,9 @@ public class AttendanceWorkDayConfigFactory extends AbstractFactory {
CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<AttendanceWorkDayConfig> root = cq.from( AttendanceWorkDayConfig.class);
cq.select(root.get(AttendanceWorkDayConfig_.id));
Predicate p = cb.equal( root.get(AttendanceWorkDayConfig_.configName), configName);
return em.createQuery(cq.where(p)).getResultList();
}
......@@ -129,7 +131,8 @@ public class AttendanceWorkDayConfigFactory extends AbstractFactory {
isHoliday = true;
dateString = s_year + "-" + _month + "-" + (i<10?"0"+i:i);
//判断当天是否周末
if( !dateOperation.isWeekend( dateOperation.getDateFromString( dateString )) ){
//if( !dateOperation.isWeekend( dateOperation.getDateFromString( dateString )) ){
if( !attendanceSettingServiceAdv.isWeekend( dateOperation.getDateFromString( dateString )) ){
//如果不是周末
if( workDayConfigList != null && workDayConfigList.size() > 0 ){
//遍历所有的节假日配置进行判断,是否法定节假日
......@@ -161,7 +164,7 @@ public class AttendanceWorkDayConfigFactory extends AbstractFactory {
}
return workDaysCountForMonth;
}
//@MethodDescribe("根据节假日配置计算一个周期内的应出勤天数")
public Integer getWorkDaysCountForMonth( Date startDate, Date endDate, List<AttendanceWorkDayConfig> workDayConfigList ) throws Exception {
/**
......@@ -181,7 +184,7 @@ public class AttendanceWorkDayConfigFactory extends AbstractFactory {
workDaysCountForMonth = dateStringList.size();
for( String dateString : dateStringList){
//判断当天是否周末
if( !dateOperation.isWeekend( dateOperation.getDateFromString( dateString )) ){
if(!attendanceSettingServiceAdv.isWeekend( dateOperation.getDateFromString( dateString )) ){
//如果不是周末
if( workDayConfigList != null && workDayConfigList.size() > 0 ){
//遍历所有的节假日配置进行判断,是否法定节假日
......
......@@ -6,6 +6,7 @@ import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
......@@ -126,9 +127,13 @@ public class ActionExportHolidayDetail extends BaseAction {
attendanceSelfHoliday = holidayList.get(i);
if( attendanceSelfHoliday != null ){
row = sheet.createRow(i + 1);
String empName = attendanceSelfHoliday.getEmployeeName();
if(StringUtils.isNotEmpty(empName) && StringUtils.contains(empName,"@")){
empName = empName.split("@")[0];
}
row.createCell(0).setCellValue(attendanceSelfHoliday.getTopUnitName());
row.createCell(1).setCellValue(attendanceSelfHoliday.getUnitName());
row.createCell(2).setCellValue(attendanceSelfHoliday.getEmployeeName());
row.createCell(2).setCellValue(empName);
row.createCell(3).setCellValue(attendanceSelfHoliday.getLeaveType());
if( attendanceSelfHoliday.getStartTime() != null ){
......
......@@ -86,7 +86,14 @@ public class ActionReciveAttendanceMobile extends BaseAction {
attendanceDetailMobile.setLongitude( wrapIn.getLongitude() );
}
}
if( check ){
//是否在范围外打卡,默认否
if( wrapIn.getIsExternal() ){
attendanceDetailMobile.setIsExternal(true);
}else{
attendanceDetailMobile.setIsExternal(false);
}
}
if( check ){
String distinguishedName = wrapIn.getEmpName();
if( StringUtils.isEmpty( distinguishedName )){
......@@ -240,6 +247,12 @@ public class ActionReciveAttendanceMobile extends BaseAction {
@FieldDescribe( "操作设备类别:Mac|Windows|IOS|Android|其他, 可以为空." )
private String optSystemName = "其他";
@FieldDescribe( "工作地点描述, 可以为空." )
private String workAddress = "未知";
@FieldDescribe("是否范围外打卡")
private Boolean isExternal = false;
public String getRecordDateString() {
return recordDateString;
}
......@@ -316,6 +329,18 @@ public class ActionReciveAttendanceMobile extends BaseAction {
public void setCheckin_type(String checkin_type) { this.checkin_type = checkin_type; }
public long getCheckin_time() { return checkin_time; }
public void setCheckin_time(long checkin_time) { this.checkin_time = checkin_time; }
public String getWorkAddress() {
return workAddress;
}
public void setWorkAddress(String workAddress) {
this.workAddress = workAddress;
}
public Boolean getIsExternal() {
return isExternal;
}
public void setIsExternal(Boolean isExternal) {
this.isExternal = isExternal;
}
}
public static class Wo extends WoId {
......
......@@ -40,6 +40,7 @@ public class AttendanceDetailAnalyseService {
private AttendanceDetailAnalyseCoreService attendanceDetailAnalyseCoreService = new AttendanceDetailAnalyseCoreService();
private DateOperation dateOperation = new DateOperation();
private UserManagerService userManagerService = new UserManagerService();
private AttendanceSettingServiceAdv attendanceSettingServiceAdv = new AttendanceSettingServiceAdv();
/**
* 根据员工姓名\开始日期\结束日期查询日期范围内所有的打卡记录信息ID列表<br/>
......@@ -336,7 +337,8 @@ public class AttendanceDetailAnalyseService {
if( check ){
try{
detail.setIsWeekend( dateOperation.isWeekend( detail.getRecordDate() ));
System.out.println("isWeekend="+attendanceSettingServiceAdv.isWeekend( detail.getRecordDate()));
detail.setIsWeekend( attendanceSettingServiceAdv.isWeekend( detail.getRecordDate() ));
}catch( Exception e ){
check = false;
logger.warn( "system analyse record date may be weekend got an exception." + detail.getRecordDateString() );
......
......@@ -24,6 +24,7 @@ public class AttendanceDetailServiceAdv {
private AttendanceDetailService attendanceDetailService = new AttendanceDetailService();
private AttendanceDetailMobileService attendanceDetailMobileService = new AttendanceDetailMobileService();
private AttendanceScheduleSettingService attendanceScheduleSettingService = new AttendanceScheduleSettingService();
private AttendanceSettingService attendanceSettingService = new AttendanceSettingService();
// protected AttendanceDetailAnalyseServiceAdv attendanceDetailAnalyseServiceAdv = new AttendanceDetailAnalyseServiceAdv();
// protected AttendanceWorkDayConfigServiceAdv attendanceWorkDayConfigServiceAdv = new AttendanceWorkDayConfigServiceAdv();
// protected AttendanceStatisticalCycleServiceAdv attendanceStatisticCycleServiceAdv = new AttendanceStatisticalCycleServiceAdv();
......@@ -282,6 +283,16 @@ public class AttendanceDetailServiceAdv {
* @throws Exception
*/
public void pushToDetail(String distinguishedName, String recordDateString, Boolean debugger ) throws Exception {
//查询外勤打卡配置
Boolean ATTENDANCE_FIELD = false;
try (EntityManagerContainer em = EntityManagerContainerFactory.instance().create()) {
AttendanceSetting attendanceSettingField = attendanceSettingService.getByCode(em,"ATTENDANCE_FIELD");
if(attendanceSettingField !=null && StringUtils.equalsIgnoreCase(attendanceSettingField.getConfigValue(),"true")){
ATTENDANCE_FIELD = true;
}
}catch ( Exception e0 ) {
throw e0;
}
try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
List<AttendanceDetailMobile> mobileDetails = attendanceDetailMobileService.listAttendanceDetailMobileWithEmployee( emc, distinguishedName, recordDateString );
if( ListTools.isNotEmpty( mobileDetails )) {
......@@ -292,7 +303,11 @@ public class AttendanceDetailServiceAdv {
if( scheduleSetting == null ){
throw new Exception("scheduleSetting is null, empName:" + distinguishedName );
}
for( AttendanceDetailMobile detailMobile : mobileDetails ) {
if(detailMobile.getIsExternal()){
ATTENDANCE_FIELD = true;
}
}
//获取打卡策略:两次,三次还是四次
//根据考勤打卡规则来判断启用何种规则来进行考勤结果分析
if( 2 == scheduleSetting.getSignProxy() ){
......@@ -305,6 +320,7 @@ public class AttendanceDetailServiceAdv {
//1、一天只打上下班两次卡
detail = new ComposeDetailWithMobileInSignProxy1().compose( mobileDetails, scheduleSetting, debugger);
}
detail.setIsExternal(ATTENDANCE_FIELD);
if( detail_old == null ) {
detail.setBatchName( "FromMobile_" + dateOperation.getNowTimeChar() );
detail.setRecordStatus(1);
......
......@@ -8,11 +8,13 @@ import com.x.attendance.entity.AttendanceDetail;
import com.x.attendance.entity.AttendanceSetting;
import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.container.factory.EntityManagerContainerFactory;
import java.util.Calendar;
import java.util.Date;
public class AttendanceSettingServiceAdv {
private AttendanceSettingService attendanceSettingService = new AttendanceSettingService();
private DateOperation dateOperation = new DateOperation();
public List<AttendanceSetting> listAll() throws Exception {
try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
......@@ -109,4 +111,29 @@ public class AttendanceSettingServiceAdv {
attendanceAppealInfo.setEndTime( endTime );
return attendanceAppealInfo;
}
/**
* 判断是否周末
* @param recordDate
* @return
*/
public boolean isWeekend( Date recordDate ) throws Exception {
boolean iflag = false;
Calendar cal = Calendar.getInstance();
cal.setTime( recordDate );
if(cal.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY || cal.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY){
AttendanceSetting attendanceSetting = this.getByCode("ATTENDANCE_WEEKEND");
String configValue = attendanceSetting.getConfigValue();
if(attendanceSetting != null){
if( (configValue.indexOf("周六")>-1 && cal.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY) || (configValue.indexOf("周日")>-1 && cal.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY)){
iflag = true;
}
}else{
iflag = true;
}
}
return iflag;
}
}
......@@ -336,6 +336,12 @@ public class AttendanceDetail extends SliceJpaObject {
@CheckPersist(allowEmpty = true)
private String archiveTime;
public static final String isExternal_FIELDNAME = "isExternal";
@FieldDescribe("是否范围外打卡")
@Column(name = ColumnNamePrefix + isExternal_FIELDNAME)
@CheckPersist(allowEmpty = true)
private Boolean isExternal = false;
public String getMorningOffDutyTime() {
return morningOffDutyTime;
}
......@@ -1170,6 +1176,14 @@ public class AttendanceDetail extends SliceJpaObject {
isWeekend = weekend;
}
public Boolean getIsExternal() {
return isExternal;
}
public void setIsExternal(Boolean isExternal) {
this.isExternal = isExternal;
}
/**
* 清除对该条数据信息的分析结果
*/
......
......@@ -159,6 +159,18 @@ public class AttendanceDetailMobile extends SliceJpaObject {
@Column( name = ColumnNamePrefix + recordStatus_FIELDNAME )
private Integer recordStatus = 0;
public static final String workAddress_FIELDNAME = "workAddress";
@FieldDescribe("打卡地点描述")
@Column( length = JpaObject.length_255B, name = ColumnNamePrefix + workAddress_FIELDNAME )
@CheckPersist(allowEmpty = true)
private String workAddress;
public static final String isExternal_FIELDNAME = "isExternal";
@FieldDescribe("是否范围外打卡")
@Column(name = ColumnNamePrefix + isExternal_FIELDNAME)
@CheckPersist(allowEmpty = true)
private Boolean isExternal = false;
public String getEmpNo() {
return empNo;
}
......@@ -270,4 +282,20 @@ public class AttendanceDetailMobile extends SliceJpaObject {
public long getCheckin_time() { return checkin_time; }
public void setCheckin_time(long checkin_time) { this.checkin_time = checkin_time; }
public String getWorkAddress() {
return workAddress;
}
public void setWorkAddress(String workAddress) {
this.workAddress = workAddress;
}
public Boolean getIsExternal() {
return isExternal;
}
public void setIsExternal(Boolean isExternal) {
this.isExternal = isExternal;
}
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册