This commit is contained in:
zt
2025-09-17 22:55:35 +08:00
parent 25690503e5
commit 23f0f2fd16
6 changed files with 178 additions and 51 deletions

View File

@ -738,7 +738,12 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
}
}
// 解密身份证号码
String decrypt = idCardEncryptorUtil.decrypt(constructionUserVo.getSfzNumber());
String decrypt = constructionUserVo.getSfzNumber();
try {
decrypt = idCardEncryptorUtil.decrypt(constructionUserVo.getSfzNumber());
}catch (Exception e) {
log.error("身份证号码解密失败", e);
}
constructionUserVo.setSfzNumber(decrypt);
// 计算年龄
LocalDate sfzBirth = constructionUser.getSfzBirth();

View File

@ -98,7 +98,7 @@ public class BusProjectTeamMemberController extends BaseController {
*/
@SaCheckPermission("project:projectTeamMember:remove")
@Log(title = "项目班组下的成员", businessType = BusinessType.DELETE)
@DeleteMapping("/")
@DeleteMapping()
public R<Void> remove(@RequestBody BusProjectTeamMemberExitReq req) {
return toAjax(busProjectTeamMemberService.deleteById(req));
}

View File

@ -279,58 +279,109 @@ public class BusAttendanceServiceImpl extends ServiceImpl<BusAttendanceMapper, B
}
// 判断当前用户打卡状态
List<BusAttendance> attendances = this.lambdaQuery()
.eq(BusAttendance::getUserId, userId)
.eq(BusAttendance::getClockDate, localDate)
.list();
BusAttendance attendance = new BusAttendance();
if (CollUtil.isEmpty(attendances)) {
// 上班打卡
attendance.setClockType(BusAttendanceCommuterEnum.CLOCKIN.getValue());
//打卡时间
attendance.setRuleTime(busAttendanceRuleVo.getClockInTime());
// 判断是否为迟到
if (isLate(now, busAttendanceRuleVo)) {
attendance.setClockStatus(BusAttendanceClockStatusEnum.LATE.getValue());
attendance.setMinuteCount(getMinutesDifference(now, busAttendanceRuleVo.getClockInTime()));
} else {
attendance.setClockStatus(BusAttendanceClockStatusEnum.NORMAL.getValue());
int clockTypeByTime = getClockTypeByTime(localDate, now, busAttendanceRuleVo);
if (clockTypeByTime == 1 ) {
List<BusAttendance> attendances = this.lambdaQuery()
.eq(BusAttendance::getUserId, userId)
.eq(BusAttendance::getClockDate, localDate)
.eq(BusAttendance::getClockType, BusAttendanceCommuterEnum.CLOCKIN.getValue())
.list();
if(CollectionUtil.isNotEmpty(attendances)){
BusAttendance busAttendance = attendances.getFirst();
if(busAttendance.getClockStatus().equals(BusAttendanceClockStatusEnum.UNCLOCK.getValue())){
throw new ServiceException("上班缺卡记录已生成,不能更新");
}
//更新打卡时间
busAttendance.setClockTime(now);
updateById(busAttendance);
}else{
BusAttendance attendance = new BusAttendance();
// 上班打卡
attendance.setClockType(BusAttendanceCommuterEnum.CLOCKIN.getValue());
//打卡时间
attendance.setRuleTime(busAttendanceRuleVo.getClockInTime());
// 判断是否为迟到
if (isLate(now, busAttendanceRuleVo)) {
attendance.setClockStatus(BusAttendanceClockStatusEnum.LATE.getValue());
attendance.setMinuteCount(getMinutesDifference(now, busAttendanceRuleVo.getClockInTime()));
} else {
attendance.setClockStatus(BusAttendanceClockStatusEnum.NORMAL.getValue());
}
// 填充信息
attendance.setUserId(userId);
attendance.setProjectId(req.getProjectId());
attendance.setClockDate(localDate);
attendance.setClockTime(now);
attendance.setUserName(constructionUser.getUserName());
// 记录打卡坐标
attendance.setLat(req.getLat());
attendance.setLng(req.getLng());
attendance.setClockLocation(req.getLocationName());
// 上传人脸照
SysOssVo upload = ossService.upload(file);
attendance.setFacePic(upload.getOssId().toString());
chatServerHandler.sendSystemMessageToUser(userId, "打卡成功", "1");
boolean save = this.save(attendance);
//插入工资
userSalaryDetailService.insertByAttendance(userId, attendance.getClockDate());
return save;
}
} else if (attendances.size() == 1) {
// 下班打卡
attendance.setClockType(BusAttendanceCommuterEnum.CLOCKOUT.getValue());
attendance.setRuleTime(busAttendanceRuleVo.getClockOutTime());
// 判断是否为早退
if (isLeaveEarly(now, busAttendanceRuleVo)) {
attendance.setClockStatus(BusAttendanceClockStatusEnum.LEAVEEARLY.getValue());
attendance.setMinuteCount(getMinutesDifference(now, busAttendanceRuleVo.getClockOutTime()));
} else {
attendance.setClockStatus(BusAttendanceClockStatusEnum.NORMAL.getValue());
}else if (clockTypeByTime == 2 ) {
List<BusAttendance> attendances = this.lambdaQuery()
.eq(BusAttendance::getUserId, userId)
.eq(BusAttendance::getClockDate, localDate)
.eq(BusAttendance::getClockType, BusAttendanceCommuterEnum.CLOCKOUT.getValue())
.list();
if(CollectionUtil.isNotEmpty(attendances)){
BusAttendance busAttendance = attendances.getFirst();
if(busAttendance.getClockStatus().equals(BusAttendanceClockStatusEnum.UNCLOCK.getValue())){
throw new ServiceException("下班缺卡记录已生成,不能更新");
}
//更新打卡时间
busAttendance.setClockTime(now);
// 判断是否为早退
if (isLeaveEarly(now, busAttendanceRuleVo)) {
busAttendance.setClockStatus(BusAttendanceClockStatusEnum.LEAVEEARLY.getValue());
busAttendance.setMinuteCount(getMinutesDifference(now, busAttendanceRuleVo.getClockOutTime()));
} else {
busAttendance.setClockStatus(BusAttendanceClockStatusEnum.NORMAL.getValue());
}
updateById(busAttendance);
}else {
BusAttendance attendance = new BusAttendance();
// 下班打卡
attendance.setClockType(BusAttendanceCommuterEnum.CLOCKOUT.getValue());
attendance.setRuleTime(busAttendanceRuleVo.getClockOutTime());
// 判断是否为早退
if (isLeaveEarly(now, busAttendanceRuleVo)) {
attendance.setClockStatus(BusAttendanceClockStatusEnum.LEAVEEARLY.getValue());
attendance.setMinuteCount(getMinutesDifference(now, busAttendanceRuleVo.getClockOutTime()));
} else {
attendance.setClockStatus(BusAttendanceClockStatusEnum.NORMAL.getValue());
}
// 填充信息
attendance.setUserId(userId);
attendance.setProjectId(req.getProjectId());
attendance.setClockDate(localDate);
attendance.setClockTime(now);
attendance.setUserName(constructionUser.getUserName());
// 记录打卡坐标
attendance.setLat(req.getLat());
attendance.setLng(req.getLng());
attendance.setClockLocation(req.getLocationName());
// 上传人脸照
SysOssVo upload = ossService.upload(file);
attendance.setFacePic(upload.getOssId().toString());
chatServerHandler.sendSystemMessageToUser(userId, "打卡成功", "1");
boolean save = this.save(attendance);
//插入工资
userSalaryDetailService.insertByAttendance(userId, attendance.getClockDate());
return save;
}
} else if (attendances.size() == 2) {
throw new ServiceException("当前已完成打卡,请勿重复提交", HttpStatus.BAD_REQUEST);
} else {
throw new ServiceException("打卡异常,请联系管理员", HttpStatus.ERROR);
}
// 填充信息
attendance.setUserId(userId);
attendance.setProjectId(req.getProjectId());
attendance.setClockDate(localDate);
attendance.setClockTime(now);
attendance.setUserName(constructionUser.getUserName());
// 记录打卡坐标
attendance.setLat(req.getLat());
attendance.setLng(req.getLng());
attendance.setClockLocation(req.getLocationName());
// 上传人脸照
SysOssVo upload = ossService.upload(file);
attendance.setFacePic(upload.getOssId().toString());
chatServerHandler.sendSystemMessageToUser(userId, "打卡成功", "1");
boolean save = this.save(attendance);
//插入工资
userSalaryDetailService.insertByAttendance(userId, attendance.getClockDate());
return save;
}
return false;
}
@ -595,6 +646,68 @@ public class BusAttendanceServiceImpl extends ServiceImpl<BusAttendanceMapper, B
return null;
}
private int getClockTypeByTime(LocalDate date, LocalDateTime now, BusAttendanceRuleVo busAttendanceRuleVo) {
LocalTime clockInTime = busAttendanceRuleVo.getClockInTime();
LocalTime clockOutTime = busAttendanceRuleVo.getClockOutTime();
LocalTime clockInResultTime = busAttendanceRuleVo.getClockInResultTime();
LocalTime clockOutResultTime = busAttendanceRuleVo.getClockOutResultTime();
// 构建各个时间节点
LocalDateTime clockInDateTime = LocalDateTime.of(date, clockInTime);
LocalDateTime clockInResultDateTime;
LocalDateTime clockOutDateTime;
LocalDateTime clockOutResultDateTime;
// 处理跨天情况
if (clockInResultTime.isBefore(clockInTime)) {
clockInResultDateTime = LocalDateTime.of(date.plusDays(1), clockInResultTime);
} else {
clockInResultDateTime = LocalDateTime.of(date, clockInResultTime);
}
if (clockOutTime.isBefore(clockInTime)) {
clockOutDateTime = LocalDateTime.of(date.plusDays(1), clockOutTime);
} else {
clockOutDateTime = LocalDateTime.of(date, clockOutTime);
}
if (clockOutResultTime.isBefore(clockInTime)) {
clockOutResultDateTime = LocalDateTime.of(date.plusDays(1), clockOutResultTime);
} else {
clockOutResultDateTime = LocalDateTime.of(date, clockOutResultTime);
}
// now在clockInDateTime 和clockInResultDateTime之间左开右闭 属于上班
if (now.isAfter(clockInDateTime) && !now.isAfter(clockInResultDateTime)) {
return 1; // 上班打卡
}
// now在clockInResultDateTime 和clockOutResultDateTime之间左开右闭 属于下班
if (now.isAfter(clockInResultDateTime) && !now.isAfter(clockOutResultDateTime)) {
return 2; // 下班打卡
}
// 特殊情况处理:如果在上班打卡时间之前或者在下班打卡时间之后
if (!now.isAfter(clockInDateTime)) {
return 1; // 上班打卡(早于规定上班时间)
}
if (!now.isBefore(clockOutResultDateTime)) {
// 判断是否更接近上班时间还是下班时间
Duration toClockIn = Duration.between(now, clockInDateTime.plusDays(1));
Duration toClockOut = Duration.between(clockOutResultDateTime, now);
if (toClockIn.compareTo(toClockOut) < 0) {
return 1; // 上班打卡
} else {
return 2; // 下班打卡
}
}
// 默认返回下班打卡
return 2;
}
/**
* 判断是否迟到
*/
@ -1202,4 +1315,7 @@ public class BusAttendanceServiceImpl extends ServiceImpl<BusAttendanceMapper, B
}
}

View File

@ -316,6 +316,7 @@ public class BusProjectTeamMemberServiceImpl extends ServiceImpl<BusProjectTeamM
// 同步修改用户表的team_id字段
LambdaUpdateWrapper<SubConstructionUser> constructionUserLuw = Wrappers.lambdaUpdate(SubConstructionUser.class)
.eq(SubConstructionUser::getId, constructionUser.getId())
.set(SubConstructionUser::getExitStatus, "2")
.set(SubConstructionUser::getTeamId, null)
.set(SubConstructionUser::getLeaveDate, new Date());
constructionUserService.update(constructionUserLuw);

View File

@ -822,7 +822,12 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateAppUserType(Long userId, String appUserType) {
//直接添加权限
return baseMapper.update(null,
new LambdaUpdateWrapper<SysUser>()
.set(SysUser::getAppUserType, appUserType)

View File

@ -18,7 +18,7 @@
</if>
<if test="ew.getSqlSelect == null">
u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex,
u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark
u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,u.app_user_type
</if>
from sys_user u
${ew.getCustomSqlSegment}