提交 0233947d 编写于 作者: L luojing

考勤新增部分更新打卡记录接口

上级 819c0b70
......@@ -535,6 +535,29 @@ public class AttendanceDetailFactory extends AbstractFactory {
return em.createQuery(cq.where(p)).getResultList();
}
//根据人员和打卡日期查找打卡记录
public List<String> listDetailByNameAndDate( String user, String dateStr ) throws Exception {
if( user == null || user.isEmpty() ||dateStr == null ){
return null;
}
EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
cq.select( root.get(AttendanceDetail_.id ));
//一般始终为true, id is not null
Predicate p = cb.isNotNull( root.get(AttendanceDetail_.id) );
if( StringUtils.isNotEmpty( user ) ){
p = cb.and(p, cb.equal( root.get(AttendanceDetail_.empName), user ));
}
if( StringUtils.isNotEmpty( dateStr ) ){
p = cb.and(p, cb.equal( root.get(AttendanceDetail_.recordDateString), dateStr ));
}
return em.createQuery(cq.where(p)).getResultList();
}
//@MethodDescribe("按年份月份查询某组织的打卡数据记录列表")
public List<String> listUnitAttendanceDetailByYearAndMonth( List<String> unitNames, String year, String month) throws Exception {
EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
......
package com.x.attendance.assemble.control.jaxrs.attendancedetail;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.persistence.Column;
import javax.servlet.http.HttpServletRequest;
import com.google.gson.JsonElement;
import com.x.attendance.assemble.common.date.DateOperation;
import com.x.attendance.assemble.control.ExceptionWrapInConvert;
import com.x.attendance.assemble.control.ThisApplication;
import com.x.attendance.entity.AttendanceDetail;
import com.x.attendance.entity.AttendanceScheduleSetting;
import com.x.attendance.entity.AttendanceSelfHoliday;
import com.x.attendance.entity.AttendanceStatisticalCycle;
import com.x.attendance.entity.AttendanceWorkDayConfig;
import com.x.base.core.entity.JpaObject;
import com.x.base.core.entity.annotation.CheckPersist;
import com.x.base.core.project.annotation.FieldDescribe;
import com.x.base.core.project.http.ActionResult;
import com.x.base.core.project.http.EffectivePerson;
import com.x.base.core.project.jaxrs.WoId;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.base.core.project.organization.Person;
import com.x.base.core.project.tools.ListTools;
import org.apache.commons.lang3.StringUtils;
public class ActionReciveSingleAttendance extends BaseAction {
/*
* =============================================================================
* =====用于部分更新打卡数据,例如只更新下午打卡数据而不影响上午的打卡数据
* =============================================================================
* =====
*/
private static Logger logger = LoggerFactory.getLogger( ActionReciveSingleAttendance.class );
protected ActionResult<Wo> execute( HttpServletRequest request, EffectivePerson effectivePerson, JsonElement jsonElement ) throws Exception {
ActionResult<Wo> result = new ActionResult<>();
DateOperation dateOperation = new DateOperation();
AttendanceDetail attendanceDetail = null;
Boolean check = true;
List<String> ids = null;
Wi wrapIn = null;
try {
wrapIn = this.convertToWrapIn(jsonElement, Wi.class);
} catch (Exception e) {
check = false;
Exception exception = new ExceptionWrapInConvert(e, jsonElement);
result.error(exception);
logger.error(e, effectivePerson, request, null);
}
if (check) {
if (wrapIn.getRecordDateString() == null || wrapIn.getRecordDateString().isEmpty()) {
check = false;
Exception exception = new ExceptionRecordDateEmpty();
result.error(exception);
}
}
if (check) {
if (wrapIn.getEmpName() == null || wrapIn.getEmpName().isEmpty()) {
check = false;
Exception exception = new ExceptionPersonNameEmpty();
result.error(exception);
}
}
Date datetime = null;
if (check) {
try {
ids = attendanceDetailServiceAdv.listDetailByNameAndDate( wrapIn.getEmpName(), wrapIn.getRecordDateString() );
if(ListTools.isNotEmpty(ids)){
attendanceDetail = attendanceDetailServiceAdv.get(ids.get(0));
if(attendanceDetail==null){
/*try {
datetime = dateOperation.getDateFromString(wrapIn.getRecordDateString());
attendanceDetail.setRecordDate(datetime);
attendanceDetail.setRecordDateString(dateOperation.getDateStringFromDate(datetime, "YYYY-MM-DD"));
attendanceDetail.setYearString(dateOperation.getYear(datetime));
attendanceDetail.setMonthString(dateOperation.getMonth(datetime));
} catch (Exception e) {
check = false;
Exception exception = new ExceptionAttendanceDetailProcess(e, "员工打卡信息中打卡日期格式异常,格式: yyyy-mm-dd. 日期:" + wrapIn.getRecordDateString());
result.error(exception);
logger.error(e, effectivePerson, request, null);
}
}else{*/
check = false;
Exception exception = new ExceptionDetailNotExists(ids.get(0));
result.error(exception);
}
}else{
check = false;
Exception exception = new ExceptionSingleDetailNotExists();
result.error(exception);
}
} catch (Exception e) {
check = false;
Exception exception = new ExceptionAttendanceDetailProcess(e,
"系统在根据员工姓名,打卡日期查询打卡详细信息ID列表时发生异常!"
+ "Name:" + wrapIn.getEmpName() + ", RecordDate:" + wrapIn.getRecordDateString());
result.error(exception);
logger.error(e, effectivePerson, request, null);
}
}
if (check) {
if (wrapIn.getOnDutyTime() != null && wrapIn.getOnDutyTime().trim().length() > 0) {
try {
datetime = dateOperation.getDateFromString(wrapIn.getOnDutyTime());
attendanceDetail.setOnDutyTime(dateOperation.getDateStringFromDate(datetime, "HH:mm:ss")); // 上班打卡时间
} catch (Exception e) {
check = false;
Exception exception = new ExceptionAttendanceDetailProcess(e, "员工上班打卡时间格式异常,格式: HH:mm:ss. 日期:" + wrapIn.getOnDutyTime());
result.error(exception);
logger.error(e, effectivePerson, request, null);
}
}
}
if (check) {
if (wrapIn.getOffDutyTime() != null && wrapIn.getOffDutyTime().trim().length() > 0) {
try {
datetime = dateOperation.getDateFromString(wrapIn.getOffDutyTime());
attendanceDetail.setOffDutyTime(dateOperation.getDateStringFromDate(datetime, "HH:mm:ss")); // 上班打卡时间
} catch (Exception e) {
check = false;
Exception exception = new ExceptionAttendanceDetailProcess(e, "员工下班打卡时间格式异常,格式: HH:mm:ss. 日期:" + wrapIn.getOffDutyTime());
result.error(exception);
logger.error(e, effectivePerson, request, null);
}
}
}
if( check ){
String distinguishedName = wrapIn.getEmpName();
if( StringUtils.isEmpty( distinguishedName )){
distinguishedName = effectivePerson.getDistinguishedName();
}
Person person = userManagerService.getPersonObjByName( distinguishedName );
if( person != null ){
attendanceDetail.setEmpName( person.getDistinguishedName() );
if( StringUtils.isEmpty( wrapIn.getEmpNo() )){
if( person != null ){
if( StringUtils.isNotEmpty( person.getEmployee() )){
attendanceDetail.setEmpNo(person.getEmployee());
}else{
attendanceDetail.setEmpNo( distinguishedName );
}
}
}
}else{
//人员不存在
check = false;
Exception exception = new ExceptionAttendanceDetailProcess(
"考勤人员不存在.DistinguishedName:" + distinguishedName );
result.error(exception);
}
}
if (check) {
try {
attendanceDetail = attendanceDetailServiceAdv.save(attendanceDetail);
result.setData( new Wo( attendanceDetail.getId() ));
} catch (Exception e) {
check = false;
Exception exception = new ExceptionAttendanceDetailProcess( e, "系统在保存员工打卡信息时发生异常。" );
result.error(exception);
logger.error(e, effectivePerson, request, null);
}
}
if (check) {
//分析保存好的考勤数据
try {
ThisApplication.detailAnalyseQueue.send( attendanceDetail.getId() );
} catch ( Exception e1 ) {
e1.printStackTrace();
}
}
return result;
}
public static class Wi {
@FieldDescribe( "员工标识,<font color='red'>必填</font>,员工的distinguishedName." )
private String empName = null;
private String empNo = null;
@FieldDescribe( "打卡日期,格式yyyy-mm-dd,可以为空." )
private String recordDateString = null;
@FieldDescribe( "上午上班打卡时间,格式hh24:mi:ss,可以为空,为空就是未打卡." )
private String onDutyTime = null;
@FieldDescribe("上班下午打卡签退时间,打卡策略2和3时使用,格式hh24:mi:ss,可以为空,为空就是未打卡.")
private String morningOffdutyTime;
@FieldDescribe("下午上班打卡签到时间,打卡策略2和3时使用,格式hh24:mi:ss,可以为空,为空就是未打卡.")
private String afternoonOnDutyTime;
@FieldDescribe( "下午下班打卡时间,hh24:mi:ss,可以为空,为空就是未打卡." )
private String offDutyTime = null;
public String getMorningOffdutyTime() { return morningOffdutyTime; }
public void setMorningOffdutyTime(String morningOffdutyTime) { this.morningOffdutyTime = morningOffdutyTime; }
public String getAfternoonOnDutyTime() { return afternoonOnDutyTime; }
public void setAfternoonOnDutyTime(String afternoonOnDutyTime) { this.afternoonOnDutyTime = afternoonOnDutyTime; }
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public String getEmpNo() {
return empNo;
}
public void setEmpNo(String empNo) {
this.empNo = empNo;
}
public String getRecordDateString() {
return recordDateString;
}
public void setRecordDateString(String recordDateString) {
this.recordDateString = recordDateString;
}
public String getOnDutyTime() {
return onDutyTime;
}
public void setOnDutyTime(String onDutyTime) {
this.onDutyTime = onDutyTime;
}
public String getOffDutyTime() {
return offDutyTime;
}
public void setOffDutyTime(String offDutyTime) {
this.offDutyTime = offDutyTime;
}
}
public static class Wo extends WoId {
public Wo( String id ) {
setId( id );
}
}
}
\ No newline at end of file
......@@ -398,6 +398,32 @@ public class AttendanceDetailAction extends StandardJaxrsAction {
}
asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
}
/**
* 部分更新打卡记录
*/
@JaxrsMethodDescribe(value = "部分更新打卡记录,接入完成后直接分析", action = ActionReciveSingleAttendance.class)
@Path("reciveSingle")
@POST
@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
@Consumes(MediaType.APPLICATION_JSON)
public void reciveSingle(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
JsonElement jsonElement) {
ActionResult<ActionReciveSingleAttendance.Wo> result = new ActionResult<>();
EffectivePerson effectivePerson = this.effectivePerson(request);
Boolean check = true;
if (check) {
try {
result = new ActionReciveSingleAttendance().execute(request, effectivePerson, jsonElement);
} catch (Exception e) {
result = new ActionResult<>();
Exception exception = new ExceptionAttendanceDetailProcess(e, "接入上下班打卡信息时发生异常!");
result.error(exception);
logger.error(e, effectivePerson, request, null);
}
}
asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
}
@JaxrsMethodDescribe(value = "根据ID删除打卡信息记录", action = ActionDelete.class)
@DELETE
......
package com.x.attendance.assemble.control.jaxrs.attendancedetail;
import com.x.base.core.project.exception.PromptException;
class ExceptionSingleDetailNotExists extends PromptException {
private static final long serialVersionUID = 1859164370743532895L;
public ExceptionSingleDetailNotExists( ) {
super("根据人员和打卡日期查找员工打卡信息不存在!" );
}
}
......@@ -109,6 +109,12 @@ public class AttendanceDetailService {
Business business = new Business( emc );
return business.getAttendanceDetailFactory().listDetailByCycleYearAndMonthWithOutStatus( user, year, month );
}
//根据人员和打卡日期查找打卡记录
public List<String> listDetailByNameAndDate( EntityManagerContainer emc, String user, String datestr ) throws Exception {
Business business = new Business( emc );
return business.getAttendanceDetailFactory().listDetailByNameAndDate( user, datestr );
}
public List<String> listUserAttendanceDetailByCycleYearAndMonth(EntityManagerContainer emc, String q_empName, String cycleYear,
String cycleMonth) throws Exception {
......@@ -206,9 +212,10 @@ public class AttendanceDetailService {
attendanceDetail_old.setRecordDateString( attendanceDetail.getRecordDateString() );
attendanceDetail_old.setRecordStatus( 0 );
attendanceDetail_old.setOnDutyTime( attendanceDetail.getOnDutyTime() );
attendanceDetail_old.setOffDutyTime( attendanceDetail.getOnWorkTime() );
attendanceDetail_old.setOffDutyTime( attendanceDetail.getOffDutyTime() );
emc.beginTransaction( AttendanceSetting.class );
//emc.beginTransaction( AttendanceSetting.class );
emc.beginTransaction( AttendanceDetail.class );
emc.check( attendanceDetail_old, CheckPersistType.all);
emc.commit();
attendanceDetail = attendanceDetail_old;
......@@ -224,6 +231,17 @@ public class AttendanceDetailService {
return attendanceDetail;
}
public AttendanceDetail saveSingle( EntityManagerContainer emc, AttendanceDetail attendanceDetail ) throws Exception {
if( attendanceDetail == null ){
throw new Exception("attendanceDetail can not be null!");
}
emc.beginTransaction( AttendanceDetail.class );
emc.persist( attendanceDetail, CheckPersistType.all);
emc.commit();
return attendanceDetail;
}
// public AttendanceDetail save( EntityManagerContainer emc, AttendanceDetail attendanceDetail ) throws Exception {
// if( attendanceDetail == null ){
// throw new Exception("attendanceDetail can not be null!");
......
......@@ -104,6 +104,15 @@ public class AttendanceDetailServiceAdv {
throw e;
}
}
//根据人员和打卡日期查找打卡记录
public List<String> listDetailByNameAndDate( String q_empName, String datestr ) throws Exception {
try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
return attendanceDetailService.listDetailByNameAndDate( emc, q_empName, datestr);
} catch ( Exception e ) {
throw e;
}
}
public List<String> listUserAttendanceDetailByCycleYearAndMonth( String q_empName, String cycleYear, String cycleMonth ) throws Exception {
try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
......@@ -188,6 +197,17 @@ public class AttendanceDetailServiceAdv {
throw e;
}
}
public synchronized AttendanceDetail saveSingle(AttendanceDetail attendanceDetail) throws Exception {
if( attendanceDetail == null ){
throw new Exception("attendanceDetail is null!");
}
try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
return attendanceDetailService.saveSingle( emc, attendanceDetail );
} catch ( Exception e ) {
throw e;
}
}
public AttendanceDetailMobile save(AttendanceDetailMobile attendanceDetailMobile) throws Exception {
if( attendanceDetailMobile == null ){
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册