|
@@ -1,820 +0,0 @@
|
|
|
-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;
|
|
|
- }
|
|
|
-}
|