diff --git a/src/com/api/kqsolution/web/SignDataSummaryAction.java b/src/com/api/kqsolution/web/SignDataSummaryAction.java index 31891ad..04357a5 100644 --- a/src/com/api/kqsolution/web/SignDataSummaryAction.java +++ b/src/com/api/kqsolution/web/SignDataSummaryAction.java @@ -1,10 +1,13 @@ package com.api.kqsolution.web; +import javax.ws.rs.Path; + /** * @Author liang.cheng * @Date 2023/9/18 11:42 AM - * @Description: 打卡数据及补卡数更新 + * @Description: 打卡数据及补卡数更新建模表 * @Version 1.0 */ -public class SignDataSummaryAction { +@Path("/kqsolution/cube") +public class SignDataSummaryAction extends com.engine.kqsolution.web.SignDataSummaryAction{ } diff --git a/src/com/engine/kqsolution/entity/SignDataPO.java b/src/com/engine/kqsolution/entity/SignDataPO.java new file mode 100644 index 0000000..b117eeb --- /dev/null +++ b/src/com/engine/kqsolution/entity/SignDataPO.java @@ -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; + + + +} diff --git a/src/com/engine/kqsolution/entity/SignDataParams.java b/src/com/engine/kqsolution/entity/SignDataParams.java new file mode 100644 index 0000000..2b63c55 --- /dev/null +++ b/src/com/engine/kqsolution/entity/SignDataParams.java @@ -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 getIds() { + if(StringUtil.isEmpty(ids)){ + return new ArrayList<>(); + } + return Arrays.stream(ids.split(",")).map(Integer::parseInt).collect(Collectors.toList()); + } +} diff --git a/src/com/engine/kqsolution/service/SignDataSummaryService.java b/src/com/engine/kqsolution/service/SignDataSummaryService.java index a4db65c..7cd6d60 100644 --- a/src/com/engine/kqsolution/service/SignDataSummaryService.java +++ b/src/com/engine/kqsolution/service/SignDataSummaryService.java @@ -1,5 +1,9 @@ package com.engine.kqsolution.service; +import com.engine.kqsolution.entity.SignDataParams; + +import java.util.Map; + /** * @Author liang.cheng * @Date 2023/9/18 11:44 AM @@ -7,4 +11,13 @@ package com.engine.kqsolution.service; * @Version 1.0 */ public interface SignDataSummaryService { + + /** + * @Description: 建模表更新打卡数据 + * @Author: liang.cheng + * @Date: 2023/9/18 2:18 PM + * @param: [signDataParams] + * @return: java.util.Map + */ + Map recordSignData(SignDataParams signDataParams); } diff --git a/src/com/engine/kqsolution/service/impl/SignDataSummaryServiceImpl.java b/src/com/engine/kqsolution/service/impl/SignDataSummaryServiceImpl.java index 1b204db..5d27d92 100644 --- a/src/com/engine/kqsolution/service/impl/SignDataSummaryServiceImpl.java +++ b/src/com/engine/kqsolution/service/impl/SignDataSummaryServiceImpl.java @@ -1,10 +1,189 @@ 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 * @Date 2023/9/18 11:45 AM - * @Description: TODO + * @Description: * @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 recordSignData(SignDataParams signDataParams) { + Map data = new HashMap<>(4); + DecimalFormat decimalFormat = new DecimalFormat("0.00"); + RecordSetTrans rst = new RecordSetTrans(); + List list = buildSignData(signDataParams); + ResourceComInfo rcom = new ResourceComInfo(); + int corePoolSize = 5; + int maxPoolSize = 10; + int batchSize = 200; + List> splittedLists = splitList(list,batchSize); + // 创建线程池 + ExecutorService executorService = ThreadUtil.newExecutor(corePoolSize, maxPoolSize); + for (List 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 buildSignData(SignDataParams signDataParams) { + RecordSet rs = new RecordSet(); + List 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> + */ + private List> splitList(List list, int batchSize) { + List> splittedLists = new ArrayList<>(); + for (int i = 0; i < list.size(); i += batchSize) { + int endIndex = Math.min(i + batchSize, list.size()); + List 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; + } + } + } diff --git a/src/com/engine/kqsolution/web/SignDataSummaryAction.java b/src/com/engine/kqsolution/web/SignDataSummaryAction.java index b6eaa34..358b701 100644 --- a/src/com/engine/kqsolution/web/SignDataSummaryAction.java +++ b/src/com/engine/kqsolution/web/SignDataSummaryAction.java @@ -1,10 +1,52 @@ 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 * @Date 2023/9/18 11:43 AM - * @Description: TODO + * @Description: * @Version 1.0 */ 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 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); + } + } diff --git a/src/weaver/interfaces/kqsolution/crob/SignDataSummaryCrob.java b/src/weaver/interfaces/kqsolution/crob/SignDataSummaryCrob.java index 9a75178..520d980 100644 --- a/src/weaver/interfaces/kqsolution/crob/SignDataSummaryCrob.java +++ b/src/weaver/interfaces/kqsolution/crob/SignDataSummaryCrob.java @@ -1,10 +1,57 @@ 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 * @Date 2023/9/18 11:46 AM * @Description: 建模表定时刷新打卡及补卡流程数据 * @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); + } }