src/main/java/com/ruoyi/staff/controller/PersonalAttendanceLocationConfigController.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.framework.web.domain.R; import com.ruoyi.staff.pojo.PersonalAttendanceLocationConfig; @@ -32,8 +33,10 @@ @Operation(summary = "新增/修改人员打卡规则配置") @PostMapping("/add") public R add(@RequestBody PersonalAttendanceLocationConfig personalAttendanceLocationConfig){ if (personalAttendanceLocationConfig.getId() != null && !personalAttendanceLocationConfigService.canEdit(personalAttendanceLocationConfig.getId())) { return R.fail("该班次配置已被排班并产生打卡记录,不能编辑"); } // 班次需要不能够重复 if (personalAttendanceLocationConfig.getId() == null && personalAttendanceLocationConfigService.lambdaQuery().eq(PersonalAttendanceLocationConfig::getShift, personalAttendanceLocationConfig.getShift()).one() != null) { return R.fail("班次不能重复"); @@ -53,13 +56,25 @@ if (query.getShift() != null && !query.getShift().isEmpty()) { wrapper.eq(PersonalAttendanceLocationConfig::getShift, query.getShift()); } return R.ok(personalAttendanceLocationConfigService.page(page, wrapper)); IPage<PersonalAttendanceLocationConfig> result = personalAttendanceLocationConfigService.page(page, wrapper); result.getRecords().forEach(item -> { boolean locked = personalAttendanceLocationConfigService.hasAttendanceUsage(item.getId()); item.setUsageLocked(locked); item.setCanEdit(!locked); item.setCanDelete(!locked); }); return R.ok(result); } @Operation(summary = "删除人员打卡规则配置") @DeleteMapping("/del") public R del(@RequestBody List<Integer> ids) { for (Integer id : ids) { if (!personalAttendanceLocationConfigService.canDelete(id)) { return R.fail("存在已排班且已有打卡记录的班次配置,不能删除"); } } return R.ok(personalAttendanceLocationConfigService.removeBatchByIds(ids)); } src/main/java/com/ruoyi/staff/mapper/PersonalShiftMapper.java
@@ -31,4 +31,6 @@ List<Map<String, Object>> performanceShiftYearList(@Param("time") String time, @Param("userName") String userName, @Param("sysDeptId") Integer sysDeptId); List<PerformanceShiftMapDto> performanceShiftList(@Param("time") String time, @Param("userName") String userName, @Param("sysDeptId") Integer sysDeptId); boolean existsAttendanceUsedByConfig(@Param("configId") Integer configId); } src/main/java/com/ruoyi/staff/pojo/PersonalAttendanceLocationConfig.java
@@ -61,6 +61,28 @@ @Schema(description = "班次") private String shift; /** * 是否已被排班且已有打卡记录使用 */ @Schema(description = "是否已被排班且已有打卡记录使用") @TableField(exist = false) private Boolean usageLocked; /** * 是否可编辑 */ @Schema(description = "是否可编辑") @TableField(exist = false) private Boolean canEdit; /** * 是否可删除 */ @Schema(description = "是否可删除") @TableField(exist = false) private Boolean canDelete; @Schema(description = "创建用户") @TableField(fill = FieldFill.INSERT) private Integer createUser; src/main/java/com/ruoyi/staff/service/PersonalAttendanceLocationConfigService.java
@@ -13,4 +13,19 @@ */ public interface PersonalAttendanceLocationConfigService extends IService<PersonalAttendanceLocationConfig> { /** * 判断班次配置是否已被排班且已有打卡记录使用。 */ boolean hasAttendanceUsage(Integer configId); /** * 判断班次配置是否允许编辑。 */ boolean canEdit(Integer configId); /** * 判断班次配置是否允许删除。 */ boolean canDelete(Integer configId); } src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceLocationConfigServiceImpl.java
@@ -1,15 +1,12 @@ package com.ruoyi.staff.service.impl; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.staff.pojo.PersonalAttendanceLocationConfig; import com.ruoyi.staff.mapper.PersonalAttendanceLocationConfigMapper; import com.ruoyi.staff.service.PersonalAttendanceLocationConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import com.ruoyi.staff.mapper.PersonalAttendanceLocationConfigMapper; import com.ruoyi.staff.mapper.PersonalShiftMapper; import com.ruoyi.staff.pojo.PersonalAttendanceLocationConfig; import com.ruoyi.staff.service.PersonalAttendanceLocationConfigService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.List; /** * <p> @@ -20,6 +17,26 @@ * @since 2026-02-11 09:41:34 */ @Service @RequiredArgsConstructor public class PersonalAttendanceLocationConfigServiceImpl extends ServiceImpl<PersonalAttendanceLocationConfigMapper, PersonalAttendanceLocationConfig> implements PersonalAttendanceLocationConfigService { private final PersonalShiftMapper personalShiftMapper; @Override public boolean hasAttendanceUsage(Integer configId) { if (configId == null) { return false; } return personalShiftMapper.existsAttendanceUsedByConfig(configId); } @Override public boolean canEdit(Integer configId) { return !hasAttendanceUsage(configId); } @Override public boolean canDelete(Integer configId) { return !hasAttendanceUsage(configId); } } src/main/resources/mapper/staff/PersonalShiftMapper.xml
@@ -112,4 +112,15 @@ order by s.create_time </select> <select id="existsAttendanceUsedByConfig" resultType="boolean"> SELECT EXISTS ( SELECT 1 FROM personal_shift ps INNER JOIN personal_attendance_records par ON par.staff_on_job_id = ps.staff_on_job_id AND par.date = DATE(ps.work_time) WHERE ps.personal_attendance_location_config_id = #{configId} ) </select> </mapper>