|
@@ -0,0 +1,820 @@
|
|
|
+package com.management.platform.service.impl;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.management.platform.controller.AuditWorkflowSettingController;
|
|
|
+import com.management.platform.entity.*;
|
|
|
+import com.management.platform.entity.vo.SysRichFunction;
|
|
|
+import com.management.platform.mapper.*;
|
|
|
+import com.management.platform.service.*;
|
|
|
+import com.management.platform.util.HttpRespMsg;
|
|
|
+import com.management.platform.util.MessageUtils;
|
|
|
+import com.management.platform.util.WorkDayCalculateUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.util.StringUtils;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * <p>
|
|
|
+ * 服务实现类
|
|
|
+ * </p>
|
|
|
+ *
|
|
|
+ * @author Seyason
|
|
|
+ * @since 2021-12-09
|
|
|
+ */
|
|
|
+@Service
|
|
|
+@Transactional
|
|
|
+public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSheet> implements LeaveSheetService {
|
|
|
+ public static final Integer exLeaveDay = 6;
|
|
|
+ public static final String[] LEAVE_TYPES = new String[]{"事假","病假","年假","产假","婚假","丧假","调休假","陪产假","其他"};
|
|
|
+ @Resource
|
|
|
+ private UserMapper userMapper;
|
|
|
+ @Resource
|
|
|
+ private LeaveSheetMapper leaveSheetMapper;
|
|
|
+ @Resource
|
|
|
+ private TimeTypeMapper timeTypeMapper;
|
|
|
+ @Resource
|
|
|
+ private ReportMapper reportMapper;
|
|
|
+ @Resource
|
|
|
+ private AuditWorkflowSettingService auditWorkflowSettingService;
|
|
|
+ @Resource
|
|
|
+ private AuditWorkflowSettingMapper auditWorkflowSettingMapper;
|
|
|
+ @Resource
|
|
|
+ private DepartmentMapper departmentMapper;
|
|
|
+ @Resource
|
|
|
+ private HttpServletRequest request;
|
|
|
+ @Resource
|
|
|
+ SysFunctionMapper sysFunctionMapper;
|
|
|
+ @Resource
|
|
|
+ DepartmentService departmentService;
|
|
|
+ @Resource
|
|
|
+ WxCorpInfoMapper wxCorpInfoMapper;
|
|
|
+ @Resource
|
|
|
+ ExcelExportService excelExportService;
|
|
|
+ @Resource
|
|
|
+ LeaveAuditLogMapper leaveAuditLogMapper;
|
|
|
+ @Resource
|
|
|
+ WxCorpInfoService wxCorpInfoService;
|
|
|
+ @Resource
|
|
|
+ InformationMapper informationMapper;
|
|
|
+
|
|
|
+ @Value(value = "${upload.path}")
|
|
|
+ private String path;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public HttpRespMsg add(LeaveSheet sheet, String userId) {
|
|
|
+ HttpRespMsg msg = new HttpRespMsg();
|
|
|
+ boolean isNew = false;
|
|
|
+ if (sheet.getId() == null) {
|
|
|
+ isNew = true;
|
|
|
+ }
|
|
|
+ sheet.setOperatorId(userId);//设置操作人id
|
|
|
+ User user = userMapper.selectById(userId);
|
|
|
+ sheet.setOwnerName(userMapper.selectById(sheet.getOwnerId()).getName());
|
|
|
+ sheet.setCompanyId(user.getCompanyId());
|
|
|
+ sheet.setStatus(1);//待审核状态
|
|
|
+ TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
|
|
|
+ if (sheet.getTimeType() == 0) {
|
|
|
+ //按天请假时,计算小时数
|
|
|
+ float v = timeType.getAllday() * sheet.getTimeDays();
|
|
|
+ sheet.setTimeHours(v);
|
|
|
+ }
|
|
|
+ if (isNew) {
|
|
|
+ //检查该时间段是否已经有按天请假
|
|
|
+ QueryWrapper<LeaveSheet> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.eq("owner_id", sheet.getOwnerId());
|
|
|
+ queryWrapper.le("start_date", sheet.getEndDate()).ge("end_date", sheet.getStartDate());
|
|
|
+
|
|
|
+ int count = leaveSheetMapper.selectCount(queryWrapper);
|
|
|
+ if (count > 0) {
|
|
|
+ //msg.setError("该时间段已有请假申请,不能重复请假");
|
|
|
+ msg.setError(MessageUtils.message("leave.repeatedLeave"));
|
|
|
+ return msg;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //获取第一个审批人
|
|
|
+ User owner = userMapper.selectById(sheet.getOwnerId());
|
|
|
+ if (owner.getDepartmentId() == 0) {
|
|
|
+ //没有部门,不能提交请假申请
|
|
|
+ msg.setError("请联系管理员设置您所在部门");
|
|
|
+ return msg;
|
|
|
+ } else {
|
|
|
+ List<AuditWorkflowSetting> auditList = auditWorkflowSettingService.get(owner.getDepartmentId(), AuditWorkflowSettingController.TYPE_LEAVE);
|
|
|
+ if (auditList.size() > 0) {
|
|
|
+ AuditWorkflowSetting workflowNode = auditList.get(0);
|
|
|
+ if (workflowNode.getAuditorType() == 1) {
|
|
|
+ //部门负责人
|
|
|
+ Department dept = departmentMapper.selectById(workflowNode.getAuditDeptId());
|
|
|
+ if (dept.getManagerId() == null) {
|
|
|
+ msg.setError("请联系管理员设置您所在部门的主要负责人");
|
|
|
+ return msg;
|
|
|
+ }
|
|
|
+ sheet.setAuditorId(dept.getManagerId());
|
|
|
+ sheet.setAuditorName(userMapper.selectById(dept.getManagerId()).getName());
|
|
|
+ } else if (workflowNode.getAuditorType() == 2) {
|
|
|
+ //指定一个人审批
|
|
|
+ sheet.setAuditorId(workflowNode.getUserId());
|
|
|
+ sheet.setAuditorName(workflowNode.getUserName());
|
|
|
+ }
|
|
|
+ sheet.setCurAuditSettingId(workflowNode.getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isNew) {
|
|
|
+ leaveSheetMapper.insert(sheet);
|
|
|
+ } else {
|
|
|
+ //编辑修改
|
|
|
+ leaveSheetMapper.updateById(sheet);
|
|
|
+ //之前的审批流程要删除
|
|
|
+ leaveAuditLogMapper.delete(new QueryWrapper<LeaveAuditLog>().eq("sheet_id", sheet.getId()));
|
|
|
+ }
|
|
|
+ sheet = leaveSheetMapper.selectById(sheet.getId());
|
|
|
+ saveNotifyToAuditor(sheet);
|
|
|
+ WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
|
|
|
+ if (wxCorpInfo != null) {
|
|
|
+ sendAuditNotifyMsg(wxCorpInfo, user, sheet);
|
|
|
+ }
|
|
|
+ return msg;
|
|
|
+ }
|
|
|
+
|
|
|
+ //发送审核结果消息提醒
|
|
|
+ private void sendAuditResult(WxCorpInfo wxCorpInfo, User auditor, LeaveSheet sheet, String denyReason) {
|
|
|
+ //推送到企业微信
|
|
|
+ JSONObject json=new JSONObject();
|
|
|
+ JSONArray dataJson=new JSONArray();
|
|
|
+ JSONObject jsonObj=new JSONObject();
|
|
|
+ jsonObj.put("key", "审核结果");
|
|
|
+ jsonObj.put("value",sheet.getStatus() == 0?"通过":"驳回");
|
|
|
+// jsonObj.put("value",("$userName="+applier.getCorpwxUserid()+"$"));
|
|
|
+ JSONObject jsonObj1=new JSONObject();
|
|
|
+ jsonObj1.put("key", "审核人");
|
|
|
+ jsonObj1.put("value",("$userName="+auditor.getCorpwxUserid()+"$"));
|
|
|
+ String applyTimeDesc = "";
|
|
|
+ DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("M月d日");
|
|
|
+ if (sheet.getStartDate().isEqual(sheet.getEndDate())) {
|
|
|
+ applyTimeDesc = dateTimeFormatter.format(sheet.getStartDate()) + ", "+sheet.getTimeHours()+"小时";
|
|
|
+ } else {
|
|
|
+ applyTimeDesc = dateTimeFormatter.format(sheet.getStartDate()) +"至" + dateTimeFormatter.format(sheet.getEndDate()) + ", "+sheet.getTimeHours()+"小时";
|
|
|
+ }
|
|
|
+
|
|
|
+ JSONObject jsonObj2=new JSONObject();
|
|
|
+ jsonObj2.put("key", "请假时间");
|
|
|
+ jsonObj2.put("value",applyTimeDesc);
|
|
|
+ JSONObject jsonObj4=new JSONObject();
|
|
|
+ jsonObj4.put("key", "备注");
|
|
|
+ jsonObj4.put("value",sheet.getStatus()==2?("原因:"+denyReason):"请假申请通过了");
|
|
|
+ dataJson.add(jsonObj);
|
|
|
+ dataJson.add(jsonObj1);
|
|
|
+ dataJson.add(jsonObj2);
|
|
|
+ dataJson.add(jsonObj4);
|
|
|
+ json.put("template_id","tty9TkCAAARfwRKiqfj47qNE70KvGhqg");
|
|
|
+ json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwdd1137a65ce0fc87&redirect_uri=http://crm.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=leave#wechat_redirect");
|
|
|
+ json.put("content_item",dataJson);
|
|
|
+ String ownerId = sheet.getOwnerId();
|
|
|
+ User owner = userMapper.selectById(ownerId);
|
|
|
+ wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfo,owner.getCorpwxUserid(), json);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void saveNotifyToApplier(LeaveSheet sheet) {
|
|
|
+ //推送到企业微信
|
|
|
+ String applyTimeDesc = "";
|
|
|
+ DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("M月d日");
|
|
|
+ if (sheet.getStartDate().isEqual(sheet.getEndDate())) {
|
|
|
+ applyTimeDesc = dateTimeFormatter.format(sheet.getStartDate()) + ", "+sheet.getTimeHours()+"小时";
|
|
|
+ } else {
|
|
|
+ applyTimeDesc = dateTimeFormatter.format(sheet.getStartDate()) +"至" + dateTimeFormatter.format(sheet.getEndDate()) + ", "+sheet.getTimeHours()+"小时";
|
|
|
+ }
|
|
|
+ String ownerId = sheet.getOwnerId();
|
|
|
+ User owner = userMapper.selectById(ownerId);
|
|
|
+ User auditor = userMapper.selectById(sheet.getAuditorId());
|
|
|
+ //系统内消息
|
|
|
+ Information information=new Information();
|
|
|
+ information.setUserId(owner.getId());
|
|
|
+ information.setTime(new Date());
|
|
|
+ information.setMsg("您"+applyTimeDesc + "请假申请审核"+(sheet.getStatus() == 0?"已通过":"已驳回")+", 审核人:"
|
|
|
+ +(auditor.getCorpwxUserid() != null ? ("$userName="+auditor.getCorpwxUserid()+"$"):auditor.getName()));
|
|
|
+ information.setType(4);
|
|
|
+ information.setContent(sheet.getId()+"");
|
|
|
+ information.setPath("/leave-sheet");
|
|
|
+ informationMapper.insert(information);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void saveNotifyToAuditor(LeaveSheet sheet) {
|
|
|
+ //系统内消息
|
|
|
+ Information information=new Information();
|
|
|
+ information.setUserId(sheet.getAuditorId());
|
|
|
+ information.setTime(new Date());
|
|
|
+ User owner = userMapper.selectById(sheet.getOwnerId());
|
|
|
+ information.setMsg("请假待审核, 请假人:" + (owner.getCorpwxUserid() != null?("$userName="+owner.getCorpwxUserid()+"$"):owner.getName()));
|
|
|
+ information.setType(4);
|
|
|
+ information.setContent(sheet.getId()+"");
|
|
|
+ information.setPath("/leave-sheet");
|
|
|
+ informationMapper.insert(information);
|
|
|
+ }
|
|
|
+
|
|
|
+ //发送待审核提醒
|
|
|
+ private void sendAuditNotifyMsg(WxCorpInfo wxCorpInfo, User applier, LeaveSheet sheet) {
|
|
|
+ //推送到企业微信
|
|
|
+ JSONObject json=new JSONObject();
|
|
|
+ JSONArray dataJson=new JSONArray();
|
|
|
+ JSONObject jsonObj=new JSONObject();
|
|
|
+ jsonObj.put("key", "请假人");
|
|
|
+ jsonObj.put("value",("$userName="+applier.getCorpwxUserid()+"$"));
|
|
|
+ JSONObject jsonObj1=new JSONObject();
|
|
|
+ jsonObj1.put("key", "请假类型");
|
|
|
+ jsonObj1.put("value",LEAVE_TYPES[sheet.getLeaveType()]);
|
|
|
+ String applyTimeDesc = "";
|
|
|
+ DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("M月d日");
|
|
|
+ if (sheet.getStartDate().isEqual(sheet.getEndDate())) {
|
|
|
+ applyTimeDesc = dateTimeFormatter.format(sheet.getStartDate()) + ", "+sheet.getTimeHours()+"小时";
|
|
|
+ } else {
|
|
|
+ applyTimeDesc = dateTimeFormatter.format(sheet.getStartDate()) +"至" + dateTimeFormatter.format(sheet.getEndDate()) + ", "+sheet.getTimeHours()+"小时";
|
|
|
+ }
|
|
|
+
|
|
|
+ JSONObject jsonObj2=new JSONObject();
|
|
|
+ jsonObj2.put("key", "请假时间");
|
|
|
+ jsonObj2.put("value",applyTimeDesc);
|
|
|
+ JSONObject jsonObj4=new JSONObject();
|
|
|
+ jsonObj4.put("key", "备注");
|
|
|
+ jsonObj4.put("value",sheet.getRemark()==null?"":sheet.getRemark());
|
|
|
+ dataJson.add(jsonObj);
|
|
|
+ dataJson.add(jsonObj1);
|
|
|
+ dataJson.add(jsonObj2);
|
|
|
+ dataJson.add(jsonObj4);
|
|
|
+ json.put("template_id","tty9TkCAAA4WvYmTnsAVoUmdYxHdSG9A");
|
|
|
+ json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwdd1137a65ce0fc87&redirect_uri=http://crm.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=leave#wechat_redirect");
|
|
|
+ json.put("content_item",dataJson);
|
|
|
+ String auditorId = sheet.getAuditorId();
|
|
|
+ User auditor = userMapper.selectById(auditorId);
|
|
|
+ wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfo,auditor.getCorpwxUserid(), json);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public HttpRespMsg delete(Integer id) {
|
|
|
+ leaveSheetMapper.deleteById(id);
|
|
|
+ return new HttpRespMsg();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public HttpRespMsg queryList(LeaveSheet sheet, Integer pageIndex, Integer pageSize) {
|
|
|
+ QueryWrapper<LeaveSheet> queryWrapper = new QueryWrapper<LeaveSheet>();
|
|
|
+ String token = request.getHeader("TOKEN");
|
|
|
+ User user = userMapper.selectById(token);
|
|
|
+
|
|
|
+ List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全部请假单");
|
|
|
+ if (functionList.size() == 0) {
|
|
|
+ //部门负责人可以看这个部门的
|
|
|
+ List<Integer> mdids = departmentService.getAllManagedDeptIdList(user, null);
|
|
|
+// List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", user.getId()));
|
|
|
+ if (mdids.size() > 0) {
|
|
|
+ //负责的部门的人员
|
|
|
+ //先是自己的
|
|
|
+ List<String> userIds = new ArrayList<>();
|
|
|
+ userIds.add(user.getId());
|
|
|
+ List<User> userList = userMapper.selectList(new QueryWrapper<User>().select("id").in("department_id", mdids));
|
|
|
+ List<String> collect = userList.stream().map(User::getId).collect(Collectors.toList());
|
|
|
+ userIds.addAll(collect);
|
|
|
+ queryWrapper.in("owner_id", userIds);
|
|
|
+ } else {
|
|
|
+ //普通员工只能看自己的
|
|
|
+ sheet.setOwnerId(user.getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ sheet.setCompanyId(user.getCompanyId());
|
|
|
+
|
|
|
+ HttpRespMsg httpRespMsg = new HttpRespMsg();
|
|
|
+ queryWrapper.eq("company_id", sheet.getCompanyId()).orderByDesc("id");
|
|
|
+
|
|
|
+ //增加状态
|
|
|
+ if (sheet.getStatus() != null) {
|
|
|
+ queryWrapper.eq("status", sheet.getStatus());
|
|
|
+ }
|
|
|
+ if (!StringUtils.isEmpty(sheet.getOwnerId())) {
|
|
|
+ queryWrapper.eq("owner_id", sheet.getOwnerId());
|
|
|
+ }
|
|
|
+ if (sheet.getLeaveType() != null) {
|
|
|
+ queryWrapper.eq("leave_type", sheet.getLeaveType());
|
|
|
+ }
|
|
|
+ if (sheet.getStartDate() != null && sheet.getEndDate() != null) {
|
|
|
+ queryWrapper.le("start_date", sheet.getEndDate()).ge("end_date", sheet.getStartDate());
|
|
|
+ }
|
|
|
+ IPage<LeaveSheet> listIPager = leaveSheetMapper.selectPage(new Page<>(pageIndex, pageSize),
|
|
|
+ queryWrapper);
|
|
|
+ List<LeaveSheet> records = listIPager.getRecords();
|
|
|
+ List<String> userIds = records.stream().map(LeaveSheet::getOwnerId).collect(Collectors.toList());
|
|
|
+ if (userIds.size() > 0) {
|
|
|
+ List<User> userList = userMapper.getUserWithDept(new QueryWrapper<User>().in("id", userIds));
|
|
|
+ records.stream().forEach(r->{
|
|
|
+ Optional<User> find = userList.stream().filter(u->u.getId().equals(r.getOwnerId())).findFirst();
|
|
|
+ if (find.isPresent()) {
|
|
|
+ r.setDept(find.get().getDepartmentName());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ Long total = listIPager.getTotal();
|
|
|
+
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
+ map.put("records", records);
|
|
|
+ map.put("total", total);
|
|
|
+ httpRespMsg.data = map;
|
|
|
+ return httpRespMsg;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public HttpRespMsg approve(Integer id) {
|
|
|
+ String token = request.getHeader("TOKEN");
|
|
|
+ //检查操作人权限
|
|
|
+ User user = userMapper.selectById(token);
|
|
|
+ HttpRespMsg httpRespMsg = new HttpRespMsg();
|
|
|
+ LeaveSheet originSheet = leaveSheetMapper.selectById(id);
|
|
|
+ if (user.getId().equals(originSheet.getAuditorId())) {
|
|
|
+ //是当前的审核人,获取下个审核节点
|
|
|
+ AuditWorkflowSetting auditWorkflowSetting = auditWorkflowSettingMapper.selectById(originSheet.getCurAuditSettingId());
|
|
|
+ LeaveSheet sheet = new LeaveSheet();
|
|
|
+ sheet.setId(id);
|
|
|
+ if (auditWorkflowSetting == null) {
|
|
|
+ //当前审核节点已不存在,直接审核通过
|
|
|
+ sheet.setStatus(0);
|
|
|
+ } else {
|
|
|
+ Integer seq = auditWorkflowSetting.getSeq();
|
|
|
+ AuditWorkflowSetting nextAuditNode = auditWorkflowSettingMapper.selectOne(new QueryWrapper<AuditWorkflowSetting>().eq("type", 1).eq("seq", (seq + 1)).eq("dept_id", auditWorkflowSetting.getDeptId()));
|
|
|
+ if (nextAuditNode == null) {
|
|
|
+ sheet.setStatus(0);
|
|
|
+ } else {
|
|
|
+ //进入下个审核节点
|
|
|
+ if (nextAuditNode.getAuditorType() == 1) {
|
|
|
+ //部门负责人审核
|
|
|
+ Department department = departmentMapper.selectById(nextAuditNode.getAuditDeptId());
|
|
|
+ if (department == null) {
|
|
|
+ //部门已被删除,直接审核通过
|
|
|
+ sheet.setStatus(0);
|
|
|
+ } else {
|
|
|
+ if (department.getManagerId() == null) {
|
|
|
+ httpRespMsg.setError("尚未设置下个节点的部门负责人,请联系管理员");
|
|
|
+ return httpRespMsg;
|
|
|
+ } else {
|
|
|
+ sheet.setCurAuditSettingId(nextAuditNode.getId());
|
|
|
+ sheet.setAuditorId(department.getManagerId());
|
|
|
+ sheet.setAuditorName(userMapper.selectById(department.getManagerId()).getName());
|
|
|
+ sheet.setAuditorType(nextAuditNode.getAuditorType());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (nextAuditNode.getAuditorType() == 2){
|
|
|
+ //指定人员审核
|
|
|
+ sheet.setCurAuditSettingId(nextAuditNode.getId());
|
|
|
+ sheet.setAuditorId(nextAuditNode.getUserId());
|
|
|
+ sheet.setAuditorName(nextAuditNode.getUserName());
|
|
|
+ sheet.setAuditorType(nextAuditNode.getAuditorType());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ leaveSheetMapper.updateById(sheet);
|
|
|
+ //保存审核记录
|
|
|
+ saveAgreeLog(id, auditWorkflowSetting, user);
|
|
|
+ //最终审核通过,发送通过消息
|
|
|
+ sheet = leaveSheetMapper.selectById(id);
|
|
|
+ WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
|
|
|
+ if (wxCorpInfo != null) {
|
|
|
+ if (sheet.getStatus() == 0) {
|
|
|
+ //最终通过
|
|
|
+ sendAuditResult(wxCorpInfo, user, sheet, null);
|
|
|
+ } else {
|
|
|
+ //通知下个节点的审核人去审核
|
|
|
+ sendAuditNotifyMsg(wxCorpInfo, user, sheet);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (sheet.getStatus() == 0) {
|
|
|
+ //最终通过
|
|
|
+ saveNotifyToApplier(sheet);
|
|
|
+ } else {
|
|
|
+ //通知下个节点的审核人去审核
|
|
|
+ saveNotifyToAuditor(sheet);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return httpRespMsg;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void saveAgreeLog(int sheetId, AuditWorkflowSetting curAuditNode, User operator) {
|
|
|
+ LeaveAuditLog log = new LeaveAuditLog();
|
|
|
+ log.setSheetId(sheetId);
|
|
|
+ if (curAuditNode != null) {
|
|
|
+ log.setAuditNodeId(curAuditNode.getId());
|
|
|
+ }
|
|
|
+ log.setAuditorId(operator.getId());
|
|
|
+ log.setAuditorName(operator.getName());
|
|
|
+ log.setIsPass(1);
|
|
|
+ leaveAuditLogMapper.insert(log);
|
|
|
+ }
|
|
|
+ private void saveDenyLog(int sheetId, AuditWorkflowSetting curAuditNode, User operator, String reason) {
|
|
|
+ LeaveAuditLog log = new LeaveAuditLog();
|
|
|
+ log.setSheetId(sheetId);
|
|
|
+ if (curAuditNode != null) {
|
|
|
+ log.setAuditNodeId(curAuditNode.getId());
|
|
|
+ }
|
|
|
+ log.setAuditorId(operator.getId());
|
|
|
+ log.setAuditorName(operator.getName());
|
|
|
+ log.setIsPass(0);
|
|
|
+ log.setDenyReason(reason);
|
|
|
+ leaveAuditLogMapper.insert(log);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public HttpRespMsg deny(Integer id, String reason) {
|
|
|
+ String token = request.getHeader("TOKEN");
|
|
|
+ //检查操作人权限
|
|
|
+ User user = userMapper.selectById(token);
|
|
|
+ HttpRespMsg httpRespMsg = new HttpRespMsg();
|
|
|
+ LeaveSheet originSheet = leaveSheetMapper.selectById(id);
|
|
|
+ if (user.getId().equals(originSheet.getAuditorId())) {
|
|
|
+ //是当前的审核人,获取当前审核节点
|
|
|
+ AuditWorkflowSetting auditWorkflowSetting = auditWorkflowSettingMapper.selectById(originSheet.getCurAuditSettingId());
|
|
|
+ LeaveSheet sheet = new LeaveSheet();
|
|
|
+ sheet.setId(id);
|
|
|
+ sheet.setStatus(2);
|
|
|
+ leaveSheetMapper.updateById(sheet);
|
|
|
+ saveDenyLog(id, auditWorkflowSetting, user, reason);
|
|
|
+ sheet = leaveSheetMapper.selectById(id);
|
|
|
+ WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
|
|
|
+ if (wxCorpInfo != null) {
|
|
|
+ sendAuditResult(wxCorpInfo, user, sheet, reason);
|
|
|
+ }
|
|
|
+ saveNotifyToApplier(sheet);
|
|
|
+ }
|
|
|
+
|
|
|
+ return httpRespMsg;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public HttpRespMsg summaryData(String keyword, String startDate, String endDate, String userId) {
|
|
|
+ Integer companyId = userMapper.selectById(userId).getCompanyId();
|
|
|
+ HttpRespMsg msg = new HttpRespMsg();
|
|
|
+ msg.data = leaveSheetMapper.summaryData(keyword, startDate, endDate, companyId);
|
|
|
+ return msg;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public HttpRespMsg getOTAvaiDays(String userId) {
|
|
|
+ HttpRespMsg msg = new HttpRespMsg();
|
|
|
+ String startDate = null;
|
|
|
+ User user = userMapper.selectById(userId);
|
|
|
+
|
|
|
+ if (user.getCompanyId() == 7) {
|
|
|
+ //火石闪信,从2023年8月1日开始计算加班工时
|
|
|
+ startDate = "2023-08-01";
|
|
|
+ //获取startDate之前的,2023年的全部非工作日加班
|
|
|
+ String firstDay = "2023-01-01";
|
|
|
+ String endDate = startDate;
|
|
|
+ List<String> allHolidays = WorkDayCalculateUtils.getAllHolidays(firstDay, endDate);
|
|
|
+ double beforeHours = 0;
|
|
|
+ if (allHolidays.size() > 0) {
|
|
|
+ List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().select("IFNULL(sum(overtime_hours),0) as working_time").in("create_date", allHolidays).eq("creator_id", userId));
|
|
|
+ double sum = reportList.stream().mapToDouble(Report::getWorkingTime).sum();
|
|
|
+ beforeHours = sum;
|
|
|
+ }
|
|
|
+
|
|
|
+ //只统计2023年1月1日之后的调休假
|
|
|
+ List<LeaveSheet> list = leaveSheetMapper.selectList(new QueryWrapper<LeaveSheet>()
|
|
|
+ .eq("owner_id", userId).eq("leave_type", exLeaveDay).ne("status", 2).ne("status", 3).ge("start_date", firstDay));
|
|
|
+ double alreadyHours = list.stream().mapToDouble(LeaveSheet::getTimeHours).sum();
|
|
|
+ double overtime = reportMapper.getMyOvertime(userId, startDate);
|
|
|
+ double leftHours = beforeHours + overtime - alreadyHours;
|
|
|
+ if (leftHours < 0) {
|
|
|
+ leftHours = 0;
|
|
|
+ }
|
|
|
+ float allDayHours = timeTypeMapper.selectById(userMapper.selectById(userId).getCompanyId()).getAllday();
|
|
|
+ double d = leftHours/allDayHours;
|
|
|
+ msg.data = d;
|
|
|
+ } else {
|
|
|
+ //非驳回和撤回状态的都要统计进去
|
|
|
+ List<LeaveSheet> list = leaveSheetMapper.selectList(new QueryWrapper<LeaveSheet>().eq("owner_id", userId).eq("leave_type", exLeaveDay).ne("status", 2).ne("status", 3));
|
|
|
+ double alreadyHours = list.stream().mapToDouble(LeaveSheet::getTimeHours).sum();
|
|
|
+ double overtime = reportMapper.getMyOvertime(userId, startDate);
|
|
|
+ double leftHours = overtime - alreadyHours;
|
|
|
+ if (leftHours < 0) {
|
|
|
+ leftHours = 0;
|
|
|
+ }
|
|
|
+ float allDayHours = timeTypeMapper.selectById(userMapper.selectById(userId).getCompanyId()).getAllday();
|
|
|
+ double d = leftHours/allDayHours;
|
|
|
+ msg.data = d;
|
|
|
+ }
|
|
|
+
|
|
|
+ return msg;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public HttpRespMsg exportLeaveData(String userId,Integer status,Integer leaveType,String startTime,String endTime) {
|
|
|
+ HttpRespMsg httpRespMsg = new HttpRespMsg();
|
|
|
+ Integer companyId = userMapper.selectById(userId).getCompanyId();
|
|
|
+ WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
|
|
|
+ List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).select("id","name","corpwx_userid"));
|
|
|
+ String token = request.getHeader("TOKEN");
|
|
|
+ User user = userMapper.selectById(token);
|
|
|
+ QueryWrapper<LeaveSheet> queryWrapper = new QueryWrapper<>();
|
|
|
+ LeaveSheet sheet = new LeaveSheet();
|
|
|
+ List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全部请假单");
|
|
|
+ if (functionList.size() == 0) {
|
|
|
+ //部门负责人可以看这个部门的
|
|
|
+ List<Integer> mdids = departmentService.getAllManagedDeptIdList(user, null);
|
|
|
+// List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", user.getId()));
|
|
|
+ if (mdids.size() > 0) {
|
|
|
+ //负责的部门的人员
|
|
|
+ //先是自己的
|
|
|
+ List<String> userIds = new ArrayList<>();
|
|
|
+ userIds.add(user.getId());
|
|
|
+ List<User> deptUserList = userMapper.selectList(new QueryWrapper<User>().select("id").in("department_id", mdids));
|
|
|
+ List<String> collect = deptUserList.stream().map(User::getId).collect(Collectors.toList());
|
|
|
+ userIds.addAll(collect);
|
|
|
+ queryWrapper.in("owner_id", userIds);
|
|
|
+ } else {
|
|
|
+ //普通员工只能看自己的
|
|
|
+ sheet.setOwnerId(user.getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ sheet.setCompanyId(user.getCompanyId());
|
|
|
+
|
|
|
+ queryWrapper.eq("company_id", sheet.getCompanyId()).orderByDesc("id");
|
|
|
+ //增加状态
|
|
|
+ if (sheet.getStatus() != null) {
|
|
|
+ queryWrapper.eq("status", sheet.getStatus());
|
|
|
+ }
|
|
|
+ if (!StringUtils.isEmpty(sheet.getOwnerId())) {
|
|
|
+ queryWrapper.eq("owner_id", sheet.getOwnerId());
|
|
|
+ }
|
|
|
+ if (sheet.getLeaveType() != null) {
|
|
|
+ queryWrapper.eq("leave_type", leaveType);
|
|
|
+ }
|
|
|
+ if (sheet.getStartDate() != null && sheet.getEndDate() != null) {
|
|
|
+ queryWrapper.le("start_date", startTime).ge("end_date", endTime);
|
|
|
+ }
|
|
|
+
|
|
|
+ List<LeaveSheet> leaveSheets = leaveSheetMapper.selectList(queryWrapper);
|
|
|
+ if (leaveSheets.size()==0){
|
|
|
+ return httpRespMsg;
|
|
|
+ };
|
|
|
+ List<List<String>> allList = new ArrayList<>();
|
|
|
+ List<String> headList = new ArrayList<String>();
|
|
|
+// headList.add("请假人");
|
|
|
+// headList.add("电话");
|
|
|
+// headList.add("请假类型");
|
|
|
+// headList.add("请假开始时间");
|
|
|
+// headList.add("请假结束时间");
|
|
|
+// headList.add("请假天数");
|
|
|
+// headList.add("请假时长");
|
|
|
+// headList.add("状态");
|
|
|
+// headList.add("备注");
|
|
|
+ headList.add(MessageUtils.message("leave.perForLeave"));
|
|
|
+ headList.add(MessageUtils.message("leave.telephone"));
|
|
|
+ headList.add(MessageUtils.message("leave.leaveType"));
|
|
|
+ headList.add(MessageUtils.message("leave.LStartTime"));
|
|
|
+ headList.add(MessageUtils.message("leave.LEndTime"));
|
|
|
+ headList.add(MessageUtils.message("leave.LDays"));
|
|
|
+ headList.add(MessageUtils.message("leave.duration"));
|
|
|
+ headList.add(MessageUtils.message("leave.state"));
|
|
|
+ headList.add(MessageUtils.message("leave.remark"));
|
|
|
+ allList.add(headList);
|
|
|
+ for (LeaveSheet leaveSheet : leaveSheets) {
|
|
|
+ List<String> item = new ArrayList<>();
|
|
|
+ Boolean present = userList.stream().filter(ul -> ul.getId().equals(leaveSheet.getOwnerId())).findFirst().isPresent();
|
|
|
+ if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
|
|
|
+ if (present){
|
|
|
+ User us = userList.stream().filter(ul -> ul.getId().equals(leaveSheet.getOwnerId())).findFirst().get();
|
|
|
+ item.add("$userName="+(us.getCorpwxUserid()==null?"":us.getCorpwxUserid())+"$");
|
|
|
+ }else {
|
|
|
+ item.add("");
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ item.add(leaveSheet.getOwnerName()==null?"":leaveSheet.getOwnerName());
|
|
|
+ }
|
|
|
+ item.add(leaveSheet.getTel()==null?"":leaveSheet.getTel());
|
|
|
+ String lts = "";
|
|
|
+ switch (leaveSheet.getLeaveType()){
|
|
|
+ case 0:
|
|
|
+ lts = MessageUtils.message("leave.thing");
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ lts = MessageUtils.message("leave.illness");
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ lts = MessageUtils.message("leave.year");
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ lts = MessageUtils.message("leave.maternity");
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ lts = MessageUtils.message("leave.marry");
|
|
|
+ break;
|
|
|
+ case 5:
|
|
|
+ lts = MessageUtils.message("leave.die");
|
|
|
+ break;
|
|
|
+ case 6:
|
|
|
+ lts = MessageUtils.message("leave.compensatory");
|
|
|
+ break;
|
|
|
+ case 7:
|
|
|
+ lts = MessageUtils.message("leave.paternity");
|
|
|
+ break;
|
|
|
+ case 8:
|
|
|
+ lts = MessageUtils.message("leave.other");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ item.add(lts);
|
|
|
+ DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
+ String sds = leaveSheet.getStartDate().format(df);
|
|
|
+ String eds = leaveSheet.getEndDate().format(df);
|
|
|
+ item.add(sds);
|
|
|
+ item.add(eds);
|
|
|
+ item.add(leaveSheet.getTimeDays()==null?"":leaveSheet.getTimeDays().toString());
|
|
|
+ item.add(leaveSheet.getTimeHours()==null?"":leaveSheet.getTimeHours().toString());
|
|
|
+ Optional<User> first = userList.stream().filter(u -> u.getId().equals(leaveSheet.getAuditorId())).findFirst();
|
|
|
+ String auditorName = first.isPresent()?first.get().getName():"";
|
|
|
+ //转译处理
|
|
|
+ if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1) {
|
|
|
+ auditorName = "$userName="+auditorName+"$";
|
|
|
+ }
|
|
|
+ String statusS = "";
|
|
|
+ switch (leaveSheet.getStatus()){
|
|
|
+ case 0:
|
|
|
+ //statusS = "审核通过";
|
|
|
+ statusS = MessageUtils.message("stages.approved");
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ //statusS = "待审核";
|
|
|
+ statusS = MessageUtils.message("stages.reviewed")
|
|
|
+ + "-" + auditorName;
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ //statusS = "驳回";
|
|
|
+ statusS = MessageUtils.message("stages.reject");
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ //statusS = "已撤销";
|
|
|
+ statusS = MessageUtils.message("stages.withdrawn");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ item.add(statusS);
|
|
|
+ item.add(leaveSheet.getRemark());
|
|
|
+ allList.add(item);
|
|
|
+ }
|
|
|
+ //String fileName = "请假信息_"+System.currentTimeMillis();
|
|
|
+ String fileName = MessageUtils.message("fileName.leaveInfo")+System.currentTimeMillis();
|
|
|
+ try {
|
|
|
+ return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , allList, path);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return httpRespMsg;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public HttpRespMsg cancel(Integer id, String userId) {
|
|
|
+ HttpRespMsg msg = new HttpRespMsg();
|
|
|
+ LeaveSheet oldSheet = leaveSheetMapper.selectById(id);
|
|
|
+ if (oldSheet.getStatus() == 0) {
|
|
|
+ msg.setError("当前请假申请已通过,无法撤销");
|
|
|
+ } else if (oldSheet.getStatus() == 2) {
|
|
|
+ msg.setError("当前请假申请已驳回,无法撤销");
|
|
|
+ } else {
|
|
|
+ LeaveSheet sheet = new LeaveSheet();
|
|
|
+ sheet.setId(id);
|
|
|
+ sheet.setStatus(3);//撤销状态
|
|
|
+ leaveSheetMapper.updateById(sheet);
|
|
|
+ //删除相关的审批记录
|
|
|
+ leaveAuditLogMapper.delete(new QueryWrapper<LeaveAuditLog>().eq("sheet_id", id));
|
|
|
+ }
|
|
|
+ return msg;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public HttpRespMsg auditList(LeaveSheet sheet, Integer pageIndex, Integer pageSize) {
|
|
|
+ QueryWrapper<LeaveSheet> queryWrapper = new QueryWrapper<LeaveSheet>();
|
|
|
+ String token = request.getHeader("TOKEN");
|
|
|
+ User user = userMapper.selectById(token);
|
|
|
+
|
|
|
+ sheet.setCompanyId(user.getCompanyId());
|
|
|
+
|
|
|
+ HttpRespMsg httpRespMsg = new HttpRespMsg();
|
|
|
+ queryWrapper.eq("company_id", sheet.getCompanyId()).orderByDesc("id");
|
|
|
+ queryWrapper.eq("status", 1);
|
|
|
+ queryWrapper.eq("auditor_id", user.getId());
|
|
|
+
|
|
|
+ if (!StringUtils.isEmpty(sheet.getOwnerId())) {
|
|
|
+ queryWrapper.eq("owner_id", sheet.getOwnerId());
|
|
|
+ }
|
|
|
+ if (sheet.getLeaveType() != null) {
|
|
|
+ queryWrapper.eq("leave_type", sheet.getLeaveType());
|
|
|
+ }
|
|
|
+ if (sheet.getStartDate() != null && sheet.getEndDate() != null) {
|
|
|
+ queryWrapper.le("start_date", sheet.getEndDate()).ge("end_date", sheet.getStartDate());
|
|
|
+ }
|
|
|
+ IPage<LeaveSheet> listIPager = leaveSheetMapper.selectPage(new Page<>(pageIndex, pageSize),
|
|
|
+ queryWrapper);
|
|
|
+ List<LeaveSheet> records = listIPager.getRecords();
|
|
|
+ List<String> userIds = records.stream().map(LeaveSheet::getOwnerId).collect(Collectors.toList());
|
|
|
+ if (userIds.size() > 0) {
|
|
|
+ List<User> userList = userMapper.getUserWithDept(new QueryWrapper<User>().in("id", userIds));
|
|
|
+ records.stream().forEach(r->{
|
|
|
+ Optional<User> find = userList.stream().filter(u->u.getId().equals(r.getOwnerId())).findFirst();
|
|
|
+ if (find.isPresent()) {
|
|
|
+ r.setDept(find.get().getDepartmentName());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ Long total = listIPager.getTotal();
|
|
|
+
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
+ map.put("records", records);
|
|
|
+ map.put("total", total);
|
|
|
+ httpRespMsg.data = map;
|
|
|
+ return httpRespMsg;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 返回某段时间内请假时间总和
|
|
|
+ * @param companyId
|
|
|
+ * @param startDate
|
|
|
+ * @param endDate
|
|
|
+ * @param standardHours 该月总工时
|
|
|
+ * @param allDay 该公司每天工时
|
|
|
+ * @param leaveSheets
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public float leaveTimeSum(Integer companyId, String startDate, String endDate, float standardHours, float allDay, List<LeaveSheet> leaveSheets) {
|
|
|
+ DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
+ LocalDate localStartDate = LocalDate.parse(startDate, dateTimeFormatter);
|
|
|
+ LocalDate localEndDate = LocalDate.parse(endDate, dateTimeFormatter);
|
|
|
+ float leaveTime = 0;
|
|
|
+ for (LeaveSheet leaveSheet : leaveSheets) {
|
|
|
+ //请假期间的工作日
|
|
|
+ int leaveDays = WorkDayCalculateUtils.getWorkDaysListInRange(leaveSheet.getStartDate().toString(), leaveSheet.getEndDate().toString(), 0).size();
|
|
|
+ //当请假时间在筛选时间段内
|
|
|
+ if ((leaveSheet.getStartDate().isEqual(localStartDate) || leaveSheet.getStartDate().isAfter(localStartDate)) && (leaveSheet.getEndDate().isEqual(localEndDate) || leaveSheet.getEndDate().isBefore(localEndDate))){
|
|
|
+ //请假期间的非工作日
|
|
|
+ int nonWorkDays = WorkDayCalculateUtils.getNonWorkDaysListInRange(leaveSheet.getStartDate().toString(), leaveSheet.getEndDate().toString()).size();
|
|
|
+ if (leaveSheet.getStartDate().isEqual(leaveSheet.getEndDate()) || nonWorkDays == 0){
|
|
|
+ leaveTime+=leaveSheet.getTimeHours();
|
|
|
+ }else {
|
|
|
+ leaveTime+= leaveDays * allDay;
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ //请假时间首尾超出
|
|
|
+ if(leaveSheet.getStartDate().isBefore(localStartDate) && leaveSheet.getEndDate().isAfter(localEndDate)){
|
|
|
+ leaveTime+= standardHours;
|
|
|
+ }else {
|
|
|
+ //当请假时间开始时间超出
|
|
|
+ if (leaveSheet.getStartDate().isBefore(localStartDate)){
|
|
|
+ //超出的天数
|
|
|
+ int startDay = WorkDayCalculateUtils.getWorkDaysListInRange(leaveSheet.getStartDate().toString(), localStartDate.minusDays(1).toString(), 0).size();
|
|
|
+ float DifDay = leaveDays - startDay;
|
|
|
+ leaveTime+= allDay*DifDay;
|
|
|
+ }else {
|
|
|
+ //当请假时间结束时间超出
|
|
|
+ //超出的天数
|
|
|
+ int endDay = WorkDayCalculateUtils.getWorkDaysListInRange(localEndDate.plusDays(1).toString(),leaveSheet.getEndDate().toString(), 0).size();
|
|
|
+ float DifDay = leaveDays - endDay;
|
|
|
+ leaveTime+= allDay*DifDay;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ leaveTime = new BigDecimal(leaveTime).setScale(1,BigDecimal.ROUND_HALF_UP).floatValue();
|
|
|
+ return leaveTime;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算两个日期之间的工作日
|
|
|
+ * @param startDate
|
|
|
+ * @param endDate
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public HttpRespMsg leaveDays(String startDate, String endDate) {
|
|
|
+ HttpRespMsg httpRespMsg = new HttpRespMsg();
|
|
|
+ Integer leaveDays = 0;
|
|
|
+ DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
+ LocalDate localStartDate = LocalDate.parse(startDate, dateTimeFormatter);
|
|
|
+ LocalDate localEndDate = LocalDate.parse(endDate, dateTimeFormatter);
|
|
|
+ if (localStartDate.isBefore(localEndDate) || localStartDate.isEqual(localEndDate)){
|
|
|
+ leaveDays = WorkDayCalculateUtils.getWorkDaysListInRange(startDate, endDate, 0).size();
|
|
|
+ }
|
|
|
+ httpRespMsg.data = leaveDays;
|
|
|
+ return httpRespMsg;
|
|
|
+ }
|
|
|
+}
|