|
@@ -1,15 +1,29 @@
|
|
|
package cn.iocoder.yudao.module.attendance.service.info;
|
|
|
|
|
|
+import cn.hutool.core.collection.CollUtil;
|
|
|
+import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
|
|
+import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
|
|
|
+import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils;
|
|
|
+import cn.iocoder.yudao.framework.security.core.LoginUser;
|
|
|
+import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
|
|
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
|
|
|
+import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceInfoImportExcelVO;
|
|
|
+import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceInfoImportRespVO;
|
|
|
import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceInfoPageReqVO;
|
|
|
import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceInfoSaveReqVO;
|
|
|
import cn.iocoder.yudao.module.attendance.dal.dataobject.info.AttendanceInfoDO;
|
|
|
import cn.iocoder.yudao.module.attendance.dal.mysql.info.AttendanceInfoMapper;
|
|
|
+import cn.iocoder.yudao.module.employee.controller.admin.info.vo.EmployeeInfoPageReqVO;
|
|
|
+import cn.iocoder.yudao.module.employee.dal.dataobject.info.EmployeeInfoDO;
|
|
|
+import cn.iocoder.yudao.module.employee.service.info.EmployeeInfoService;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
|
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
@@ -18,6 +32,8 @@ import javax.annotation.Resource;
|
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
import static cn.iocoder.yudao.module.attendance.enums.ErrorCodeConstants.*;
|
|
|
+import static cn.iocoder.yudao.module.employee.enums.ErrorCodeConstants.EMPLOYEE_INFO_NOT_EXISTS;
|
|
|
+import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
|
|
|
|
|
|
/**
|
|
|
* 考勤信息 Service 实现类
|
|
@@ -30,6 +46,8 @@ public class AttendanceInfoServiceImpl implements AttendanceInfoService {
|
|
|
|
|
|
@Resource
|
|
|
private AttendanceInfoMapper infoMapper;
|
|
|
+ @Resource
|
|
|
+ private EmployeeInfoService employeeInfoService;
|
|
|
|
|
|
@Override
|
|
|
@TenantIgnore
|
|
@@ -79,4 +97,75 @@ public class AttendanceInfoServiceImpl implements AttendanceInfoService {
|
|
|
return infoMapper.selectPage(pageReqVO);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ @TenantIgnore
|
|
|
+ @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入
|
|
|
+ public AttendanceInfoImportRespVO importAttendanceInfoList(List<AttendanceInfoImportExcelVO> importAttendanceInfos) {
|
|
|
+ if (CollUtil.isEmpty(importAttendanceInfos)) {
|
|
|
+ throw exception(ATTENDANCE_INFO_IMPORT_LIST_IS_EMPTY);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取用户信息和租户ID
|
|
|
+ LoginUser user = SecurityFrameworkUtils.getLoginUser();
|
|
|
+ Long tenantId = user != null && user.getTenantId() != null ? user.getTenantId() : 0L;
|
|
|
+
|
|
|
+ // 初始化响应对象
|
|
|
+ AttendanceInfoImportRespVO respVO = AttendanceInfoImportRespVO.builder()
|
|
|
+ .createEmployeeNames(new ArrayList<>())
|
|
|
+ .deleteEmployeeNames(new ArrayList<>())
|
|
|
+ .failureEmployeeNames(new LinkedHashMap<>())
|
|
|
+ .build();
|
|
|
+
|
|
|
+ // 收集要删除和创建的数据
|
|
|
+ List<AttendanceInfoDO> toInsert = new ArrayList<>();
|
|
|
+ List<Long> toDeleteIds = new ArrayList<>();
|
|
|
+ List<String> failedEmployeeNames = new ArrayList<>();
|
|
|
+
|
|
|
+ for (AttendanceInfoImportExcelVO importAttendance : importAttendanceInfos) {
|
|
|
+ try {
|
|
|
+ // 验证员工是否存在
|
|
|
+ validateEmployeeExists(importAttendance.getEmployeeName(), importAttendance.getEmployeeMobile(), tenantId);
|
|
|
+
|
|
|
+ // 查找并收集要删除的数据
|
|
|
+ List<AttendanceInfoDO> existingInfos = infoMapper.selectPage(
|
|
|
+ new AttendanceInfoPageReqVO().setAttendanceDate(importAttendance.getAttendanceDate()).setEmployeeMobile(importAttendance.getEmployeeMobile())
|
|
|
+ ).getList();
|
|
|
+ toDeleteIds.addAll(existingInfos.stream().map(AttendanceInfoDO::getId).collect(Collectors.toList()));
|
|
|
+
|
|
|
+ // 准备要插入的数据
|
|
|
+ AttendanceInfoDO attendanceInfoDO = BeanUtils.toBean(importAttendance, AttendanceInfoDO.class);
|
|
|
+ toInsert.add(attendanceInfoDO);
|
|
|
+
|
|
|
+ } catch (ServiceException ex) {
|
|
|
+ failedEmployeeNames.add(importAttendance.getEmployeeName());
|
|
|
+ respVO.getFailureEmployeeNames().put(importAttendance.getEmployeeName(), ex.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 批量删除
|
|
|
+ if (!toDeleteIds.isEmpty()) {
|
|
|
+ infoMapper.deleteBatchIds(toDeleteIds);
|
|
|
+ toDeleteIds.forEach(id -> respVO.getDeleteEmployeeNames().add(this.getInfo(id).getEmployeeName())); // 假设有一个findEmployeeNameById方法来获取员工名
|
|
|
+ }
|
|
|
+
|
|
|
+ // 批量插入
|
|
|
+ if (!toInsert.isEmpty()) {
|
|
|
+ infoMapper.insertBatch(toInsert);
|
|
|
+ toInsert.forEach(info -> respVO.getCreateEmployeeNames().add(info.getEmployeeName()));
|
|
|
+ }
|
|
|
+ return respVO;
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean validateEmployeeExists(String employeeName, String employeeMobile, Long tenantId) {
|
|
|
+ // 关闭数据权限,避免因为没有数据权限,查询不到数据,进而导致唯一校验不正确
|
|
|
+ return DataPermissionUtils.executeIgnore(() -> {
|
|
|
+ List<EmployeeInfoDO> list = employeeInfoService.getInfoPage(new EmployeeInfoPageReqVO().setName(employeeName).setPhone(employeeMobile).setTenantId(tenantId)).getList();
|
|
|
+ if (CollUtil.isEmpty(list)) {
|
|
|
+ throw exception(EMPLOYEE_INFO_NOT_EXISTS);
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|