东方骏驰打卡数据 补卡数据更新建模表
parent
fe7fde8ac0
commit
b851526e98
@ -1,10 +1,13 @@
|
|||||||
package com.api.kqsolution.web;
|
package com.api.kqsolution.web;
|
||||||
|
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author liang.cheng
|
* @Author liang.cheng
|
||||||
* @Date 2023/9/18 11:42 AM
|
* @Date 2023/9/18 11:42 AM
|
||||||
* @Description: 打卡数据及补卡数更新
|
* @Description: 打卡数据及补卡数更新建模表
|
||||||
* @Version 1.0
|
* @Version 1.0
|
||||||
*/
|
*/
|
||||||
public class SignDataSummaryAction {
|
@Path("/kqsolution/cube")
|
||||||
|
public class SignDataSummaryAction extends com.engine.kqsolution.web.SignDataSummaryAction{
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,52 @@
|
|||||||
|
package com.engine.kqsolution.entity;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author liang.cheng
|
||||||
|
* @Date 2023/9/18 2:22 PM
|
||||||
|
* @Description:
|
||||||
|
* @Version 1.0
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class SignDataPO {
|
||||||
|
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
private String attendanceMonth;
|
||||||
|
|
||||||
|
private String attendanceDate;
|
||||||
|
|
||||||
|
private Integer resourceId;
|
||||||
|
|
||||||
|
private Integer company;
|
||||||
|
|
||||||
|
private Integer department;
|
||||||
|
|
||||||
|
private Integer jobTitle;
|
||||||
|
|
||||||
|
private String signInDate;
|
||||||
|
|
||||||
|
private String signInTime;
|
||||||
|
|
||||||
|
private String signOutDate;
|
||||||
|
|
||||||
|
private String signOutTime;
|
||||||
|
|
||||||
|
private String signMins;
|
||||||
|
|
||||||
|
private Double signHours;
|
||||||
|
|
||||||
|
private Double workHours;
|
||||||
|
|
||||||
|
private Integer status;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
package com.engine.kqsolution.entity;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import weaver.general.StringUtil;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author liang.cheng
|
||||||
|
* @Date 2023/9/18 2:14 PM
|
||||||
|
* @Description: TODO
|
||||||
|
* @Version 1.0
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class SignDataParams {
|
||||||
|
|
||||||
|
private String attendanceDate;
|
||||||
|
|
||||||
|
private String formModeId;
|
||||||
|
|
||||||
|
private String ids;
|
||||||
|
|
||||||
|
public List<Integer> getIds() {
|
||||||
|
if(StringUtil.isEmpty(ids)){
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
return Arrays.stream(ids.split(",")).map(Integer::parseInt).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
}
|
@ -1,10 +1,189 @@
|
|||||||
package com.engine.kqsolution.service.impl;
|
package com.engine.kqsolution.service.impl;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.hutool.core.thread.ThreadUtil;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import com.engine.core.impl.Service;
|
||||||
|
import com.engine.kqsolution.entity.SignDataPO;
|
||||||
|
import com.engine.kqsolution.entity.SignDataParams;
|
||||||
|
import com.engine.kqsolution.service.SignDataSummaryService;
|
||||||
|
import lombok.SneakyThrows;
|
||||||
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import weaver.conn.RecordSet;
|
||||||
|
import weaver.conn.RecordSetTrans;
|
||||||
|
import weaver.general.BaseBean;
|
||||||
|
import weaver.general.Util;
|
||||||
|
import weaver.hrm.resource.ResourceComInfo;
|
||||||
|
|
||||||
|
import java.text.DecimalFormat;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author liang.cheng
|
* @Author liang.cheng
|
||||||
* @Date 2023/9/18 11:45 AM
|
* @Date 2023/9/18 11:45 AM
|
||||||
* @Description: TODO
|
* @Description:
|
||||||
* @Version 1.0
|
* @Version 1.0
|
||||||
*/
|
*/
|
||||||
public class SignDataSummaryServiceImpl {
|
public class SignDataSummaryServiceImpl extends Service implements SignDataSummaryService {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static final DateTimeFormatter MONTH_FORMATTER_PATTERN = DateTimeFormatter.ofPattern("yyyy-MM");
|
||||||
|
|
||||||
|
@SneakyThrows
|
||||||
|
@Override
|
||||||
|
public Map<String, Object> recordSignData(SignDataParams signDataParams) {
|
||||||
|
Map<String,Object> data = new HashMap<>(4);
|
||||||
|
DecimalFormat decimalFormat = new DecimalFormat("0.00");
|
||||||
|
RecordSetTrans rst = new RecordSetTrans();
|
||||||
|
List<SignDataPO> list = buildSignData(signDataParams);
|
||||||
|
ResourceComInfo rcom = new ResourceComInfo();
|
||||||
|
int corePoolSize = 5;
|
||||||
|
int maxPoolSize = 10;
|
||||||
|
int batchSize = 200;
|
||||||
|
List<List<SignDataPO>> splittedLists = splitList(list,batchSize);
|
||||||
|
// 创建线程池
|
||||||
|
ExecutorService executorService = ThreadUtil.newExecutor(corePoolSize, maxPoolSize);
|
||||||
|
for (List<SignDataPO> subList : splittedLists) {
|
||||||
|
executorService.submit(() -> {
|
||||||
|
for (SignDataPO signDataPo : subList) {
|
||||||
|
String resourceId = String.valueOf(signDataPo.getResourceId());
|
||||||
|
Integer signMins = Util.getIntValue(signDataPo.getSignMins(),0);
|
||||||
|
double hours = (double) signMins / 60;
|
||||||
|
signDataPo.setCompany(Integer.parseInt(rcom.getSubCompanyID(resourceId)));
|
||||||
|
signDataPo.setDepartment(Integer.parseInt(rcom.getDepartmentID(resourceId)));
|
||||||
|
signDataPo.setJobTitle(Integer.parseInt(rcom.getJobTitle(resourceId)));
|
||||||
|
signDataPo.setSignHours(Double.parseDouble(decimalFormat.format(hours)));
|
||||||
|
signDataPo.setWorkHours(Double.parseDouble(decimalFormat.format(hours)));
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// 关闭线程池
|
||||||
|
executorService.shutdown();
|
||||||
|
while (!executorService.isTerminated()) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
rst.setAutoCommit(false);
|
||||||
|
if (CollectionUtils.isNotEmpty(signDataParams.getIds())) {
|
||||||
|
for (SignDataPO item : list) {
|
||||||
|
rst.executeUpdate("update uf_kqgs set qdrq = ?,qdsj = ?,qtrq = ?,qtsj = ?,dkgssc = ?,sjgssc = ? where id = ?",item.getSignInDate(),
|
||||||
|
item.getSignInTime(),item.getSignOutDate(),item.getSignOutTime(),item.getSignHours(),item.getWorkHours(),item.getId());
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
//同一考勤日期执行多次
|
||||||
|
rst.executeUpdate("delete from uf_kqgs where kqrq = ?",signDataParams.getAttendanceDate());
|
||||||
|
for (SignDataPO item : list) {
|
||||||
|
rst.executeUpdate("insert into uf_kqgs(formmodeid,xm,kqy,kqrq,zt,fb,bm,gw,qdrq,qdsj,qtrq,qtsj,dkgssc,sjgssc) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)",signDataParams.getFormModeId(),item.getResourceId(),
|
||||||
|
item.getAttendanceMonth(),item.getAttendanceDate(),item.getStatus(),item.getCompany(),item.getDepartment(),
|
||||||
|
item.getJobTitle(),item.getSignInDate(),item.getSignInTime(),item.getSignOutDate(),item.getSignOutTime(),
|
||||||
|
item.getSignHours(),item.getWorkHours());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rst.commit();
|
||||||
|
data.put("count",list.size());
|
||||||
|
}catch (Exception e) {
|
||||||
|
rst.rollback();
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造数据
|
||||||
|
* @param signDataParams
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private List<SignDataPO> buildSignData(SignDataParams signDataParams) {
|
||||||
|
RecordSet rs = new RecordSet();
|
||||||
|
List<SignDataPO> pos = new ArrayList<>();
|
||||||
|
String formatYearMonth = getFormatLocalDate(LocalDate.now(),MONTH_FORMATTER_PATTERN);
|
||||||
|
if (CollectionUtils.isNotEmpty(signDataParams.getIds())) {
|
||||||
|
String ids = StringUtils.join(signDataParams.getIds(),",");
|
||||||
|
rs.executeQuery("select u.id,u.xm,u.kqrq,u.kqy,k.signindate,k.signintime,k.signoutdate,k.signouttime,k.signMins from uf_kqgs u inner join kq_format_detail k" +
|
||||||
|
" on u.xm = k.resourceid and u.kqrq = k.kqdate and u.zt = 0 and u.id in ("+ids+")");
|
||||||
|
while (rs.next()) {
|
||||||
|
String signInTime = Util.null2String(rs.getString("signintime"));
|
||||||
|
String signOutTime = Util.null2String(rs.getString("signouttime"));
|
||||||
|
if (!"".equals(signInTime)){
|
||||||
|
signInTime = signInTime.substring(0,5);
|
||||||
|
}
|
||||||
|
if (!"".equals(signOutTime)){
|
||||||
|
signOutTime = signOutTime.substring(0,5);
|
||||||
|
}
|
||||||
|
SignDataPO build = SignDataPO.builder()
|
||||||
|
.id(Util.getIntValue(rs.getString("id")))
|
||||||
|
.resourceId(Util.getIntValue(rs.getString("xm")))
|
||||||
|
.attendanceMonth(Util.null2String(rs.getString("kqy")))
|
||||||
|
.attendanceDate(Util.null2String(rs.getString("kqrq")))
|
||||||
|
.signInDate(Util.null2String(rs.getString("signindate")))
|
||||||
|
.signInTime(signInTime)
|
||||||
|
.signOutDate(Util.null2String(rs.getString("signoutdate")))
|
||||||
|
.signOutTime(signOutTime)
|
||||||
|
.signMins(Util.null2String(rs.getString("signMins")))
|
||||||
|
.build();
|
||||||
|
pos.add(build);
|
||||||
|
}
|
||||||
|
|
||||||
|
}else {
|
||||||
|
rs.executeQuery("select resourceid,kqdate,signindate,signintime,signoutdate,signouttime,signMins from kq_format_detail where kqdate = ?",signDataParams.getAttendanceDate());
|
||||||
|
while (rs.next()) {
|
||||||
|
String signInTime = Util.null2String(rs.getString("signintime"));
|
||||||
|
String signOutTime = Util.null2String(rs.getString("signouttime"));
|
||||||
|
if (!"".equals(signInTime)){
|
||||||
|
signInTime = signInTime.substring(0,5);
|
||||||
|
}
|
||||||
|
if (!"".equals(signOutTime)){
|
||||||
|
signOutTime = signOutTime.substring(0,5);
|
||||||
|
}
|
||||||
|
SignDataPO build = SignDataPO.builder()
|
||||||
|
.resourceId(Util.getIntValue(rs.getString("resourceid")))
|
||||||
|
.attendanceMonth(formatYearMonth)
|
||||||
|
.attendanceDate(Util.null2String(rs.getString("kqdate")))
|
||||||
|
.status(0)
|
||||||
|
.signInDate(Util.null2String(rs.getString("signindate")))
|
||||||
|
.signInTime(signInTime)
|
||||||
|
.signOutDate(Util.null2String(rs.getString("signoutdate")))
|
||||||
|
.signOutTime(signOutTime)
|
||||||
|
.signMins(Util.null2String(rs.getString("signMins")))
|
||||||
|
.build();
|
||||||
|
pos.add(build);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 集合分割
|
||||||
|
* @Author: liang.cheng
|
||||||
|
* @Date: 2023/9/13 2:46 PM
|
||||||
|
* @param: [list, batchSize]
|
||||||
|
* @return: java.util.List<java.util.List<T>>
|
||||||
|
*/
|
||||||
|
private <T> List<List<T>> splitList(List<T> list, int batchSize) {
|
||||||
|
List<List<T>> splittedLists = new ArrayList<>();
|
||||||
|
for (int i = 0; i < list.size(); i += batchSize) {
|
||||||
|
int endIndex = Math.min(i + batchSize, list.size());
|
||||||
|
List<T> subList = list.subList(i, endIndex);
|
||||||
|
splittedLists.add(subList);
|
||||||
|
}
|
||||||
|
return splittedLists;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFormatLocalDate(LocalDate localDate,DateTimeFormatter type) {
|
||||||
|
if (localDate == null) {
|
||||||
|
return StringUtils.EMPTY;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return localDate.format(type);
|
||||||
|
} catch (Exception e) {
|
||||||
|
return StringUtils.EMPTY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,52 @@
|
|||||||
package com.engine.kqsolution.web;
|
package com.engine.kqsolution.web;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.alibaba.fastjson.serializer.SerializerFeature;
|
||||||
|
import com.engine.common.util.ParamUtil;
|
||||||
|
import com.engine.common.util.ServiceUtil;
|
||||||
|
import com.engine.kqsolution.entity.SignDataParams;
|
||||||
|
import com.engine.kqsolution.service.SignDataSummaryService;
|
||||||
|
import com.engine.kqsolution.service.impl.SignDataSummaryServiceImpl;
|
||||||
|
import io.swagger.v3.oas.annotations.parameters.RequestBody;
|
||||||
|
import weaver.hrm.HrmUserVarify;
|
||||||
|
import weaver.hrm.User;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import javax.ws.rs.POST;
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
import javax.ws.rs.Produces;
|
||||||
|
import javax.ws.rs.core.Context;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author liang.cheng
|
* @Author liang.cheng
|
||||||
* @Date 2023/9/18 11:43 AM
|
* @Date 2023/9/18 11:43 AM
|
||||||
* @Description: TODO
|
* @Description:
|
||||||
* @Version 1.0
|
* @Version 1.0
|
||||||
*/
|
*/
|
||||||
public class SignDataSummaryAction {
|
public class SignDataSummaryAction {
|
||||||
|
|
||||||
|
private SignDataSummaryService getService(User user) {
|
||||||
|
return ServiceUtil.getService(SignDataSummaryServiceImpl.class, user);
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/recordSignData")
|
||||||
|
@Produces(MediaType.TEXT_PLAIN)
|
||||||
|
public String recordSignData(@Context HttpServletRequest request, @Context HttpServletResponse response,@RequestBody SignDataParams signDataParams){
|
||||||
|
Map<String, Object> data = new HashMap<>(8);
|
||||||
|
try {
|
||||||
|
User user = HrmUserVarify.getUser(request, response);
|
||||||
|
data.putAll(getService(user).recordSignData(signDataParams));
|
||||||
|
data.put("status", true);
|
||||||
|
} catch (Exception e) {
|
||||||
|
data.put("status", false);
|
||||||
|
data.put("msg", "catch exception : " + e.getMessage());
|
||||||
|
}
|
||||||
|
return JSONObject.toJSONString(data, SerializerFeature.DisableCircularReferenceDetect);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,57 @@
|
|||||||
package weaver.interfaces.kqsolution.crob;
|
package weaver.interfaces.kqsolution.crob;
|
||||||
|
|
||||||
|
import com.engine.kqsolution.entity.SignDataParams;
|
||||||
|
import com.engine.kqsolution.service.impl.SignDataSummaryServiceImpl;
|
||||||
|
import weaver.interfaces.schedule.BaseCronJob;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author liang.cheng
|
* @Author liang.cheng
|
||||||
* @Date 2023/9/18 11:46 AM
|
* @Date 2023/9/18 11:46 AM
|
||||||
* @Description: 建模表定时刷新打卡及补卡流程数据
|
* @Description: 建模表定时刷新打卡及补卡流程数据
|
||||||
* @Version 1.0
|
* @Version 1.0
|
||||||
*/
|
*/
|
||||||
public class SignDataSummaryCrob {
|
public class SignDataSummaryCrob extends BaseCronJob {
|
||||||
|
|
||||||
|
public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
||||||
|
|
||||||
|
private String attendanceDate;
|
||||||
|
|
||||||
|
private String formModeId;
|
||||||
|
|
||||||
|
public String getFormModeId() {
|
||||||
|
return formModeId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFormModeId(String formModeId) {
|
||||||
|
this.formModeId = formModeId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAttendanceDate() {
|
||||||
|
return attendanceDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAttendanceDate(String attendanceDate) {
|
||||||
|
this.attendanceDate = attendanceDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute() {
|
||||||
|
|
||||||
|
SignDataSummaryServiceImpl summaryService = new SignDataSummaryServiceImpl();
|
||||||
|
|
||||||
|
if (Objects.isNull(attendanceDate)) {
|
||||||
|
attendanceDate = summaryService.getFormatLocalDate(LocalDate.now().minusDays(1),DATE_FORMATTER);
|
||||||
|
}
|
||||||
|
|
||||||
|
SignDataParams build = SignDataParams.builder()
|
||||||
|
.formModeId(formModeId)
|
||||||
|
.attendanceDate(attendanceDate)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
summaryService.recordSignData(build);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue