diff --git a/gear-oa/src/main/java/com/gear/oa/controller/GearWorkerController.java b/gear-oa/src/main/java/com/gear/oa/controller/GearWorkerController.java index 212424a..0f54460 100644 --- a/gear-oa/src/main/java/com/gear/oa/controller/GearWorkerController.java +++ b/gear-oa/src/main/java/com/gear/oa/controller/GearWorkerController.java @@ -93,4 +93,6 @@ public class GearWorkerController extends BaseController { public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] workerIds) { return toAjax(iGearWorkerService.deleteWithValidByIds(Arrays.asList(workerIds), true)); } + + } diff --git a/gear-oa/src/main/java/com/gear/oa/domain/GearWorker.java b/gear-oa/src/main/java/com/gear/oa/domain/GearWorker.java index 88f0e31..56f58a2 100644 --- a/gear-oa/src/main/java/com/gear/oa/domain/GearWorker.java +++ b/gear-oa/src/main/java/com/gear/oa/domain/GearWorker.java @@ -7,9 +7,6 @@ import com.gear.common.core.domain.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; -/** - * 工人主数据对象 gear_worker - */ @Data @EqualsAndHashCode(callSuper = true) @TableName("gear_worker") @@ -26,19 +23,16 @@ public class GearWorker extends BaseEntity { private String phone; - /** - * 默认计费类型(1小时工 2计件工 3天工) - */ private String defaultBillingType; private String defaultWorkTypeName; - /** - * 状态(0在职 1离职) - */ private String status; - @TableLogic + /** + * 逻辑删除标记:0-未删除,2-已删除 + */ + @TableLogic(value = "0", delval = "2") private String delFlag; private String remark; diff --git a/gear-oa/src/main/java/com/gear/oa/mapper/GearWorkerMapper.java b/gear-oa/src/main/java/com/gear/oa/mapper/GearWorkerMapper.java index 01b4a50..646afbc 100644 --- a/gear-oa/src/main/java/com/gear/oa/mapper/GearWorkerMapper.java +++ b/gear-oa/src/main/java/com/gear/oa/mapper/GearWorkerMapper.java @@ -3,9 +3,40 @@ package com.gear.oa.mapper; import com.gear.common.core.mapper.BaseMapperPlus; import com.gear.oa.domain.GearWorker; import com.gear.oa.domain.vo.GearWorkerVo; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; /** * 工人主数据Mapper接口 */ public interface GearWorkerMapper extends BaseMapperPlus { + /** + * 根据工号查询所有记录(包括逻辑删除的),绕过 MyBatis-Plus 自动过滤 + * + * @param workerNo 工号 + * @return 工人记录(可能为 null) + */ + @Select("SELECT * FROM gear_worker WHERE worker_no = #{workerNo}") + GearWorker selectByWorkerNoIncludeDeleted(@Param("workerNo") String workerNo); + + /** + * 强制恢复并更新已删除的工人记录 + * 直接将 del_flag 更新为 0,并更新其他字段 + * + * @param worker 包含新数据的工人对象(必须包含 workerNo 和需要更新的字段) + * @return 影响行数 + */ + @Update("UPDATE gear_worker SET " + + "worker_name = #{workerName}, " + + "phone = #{phone}, " + + "default_billing_type = #{defaultBillingType}, " + + "default_work_type_name = #{defaultWorkTypeName}, " + + "status = #{status}, " + + "del_flag = '0', " + + "remark = #{remark}, " + + "update_by = #{updateBy}, " + + "update_time = NOW() " + + "WHERE worker_no = #{workerNo}") + int recoverByWorkerNo(GearWorker worker); } diff --git a/gear-oa/src/main/java/com/gear/oa/service/impl/GearWorkerServiceImpl.java b/gear-oa/src/main/java/com/gear/oa/service/impl/GearWorkerServiceImpl.java index b72e8b1..cc1f0e1 100644 --- a/gear-oa/src/main/java/com/gear/oa/service/impl/GearWorkerServiceImpl.java +++ b/gear-oa/src/main/java/com/gear/oa/service/impl/GearWorkerServiceImpl.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.gear.common.core.domain.PageQuery; import com.gear.common.core.page.TableDataInfo; +import com.gear.common.exception.ServiceException; import com.gear.common.utils.StringUtils; import com.gear.oa.domain.GearWorker; import com.gear.oa.domain.bo.GearWorkerBo; @@ -14,14 +15,13 @@ import com.gear.oa.domain.vo.GearWorkerVo; import com.gear.oa.mapper.GearWorkerMapper; import com.gear.oa.service.IGearWorkerService; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.Collection; import java.util.List; -/** - * 工人主数据Service业务层处理 - */ +@Slf4j @RequiredArgsConstructor @Service public class GearWorkerServiceImpl implements IGearWorkerService { @@ -48,6 +48,8 @@ public class GearWorkerServiceImpl implements IGearWorkerService { private LambdaQueryWrapper buildQueryWrapper(GearWorkerBo bo) { LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + // 只查询未删除的数据(del_flag = '0') + lqw.eq(GearWorker::getDelFlag, "0"); lqw.eq(bo.getWorkerId() != null, GearWorker::getWorkerId, bo.getWorkerId()); lqw.eq(StringUtils.isNotBlank(bo.getWorkerNo()), GearWorker::getWorkerNo, bo.getWorkerNo()); lqw.like(StringUtils.isNotBlank(bo.getWorkerName()), GearWorker::getWorkerName, bo.getWorkerName()); @@ -59,17 +61,48 @@ public class GearWorkerServiceImpl implements IGearWorkerService { @Override public Boolean insertByBo(GearWorkerBo bo) { + // 使用自定义方法查询所有记录(包括逻辑删除的) + GearWorker existing = baseMapper.selectByWorkerNoIncludeDeleted(bo.getWorkerNo()); + + if (existing != null) { + // 记录存在 + if ("0".equals(existing.getDelFlag())) { + throw new ServiceException("工号 " + bo.getWorkerNo() + " 已存在且未删除,不能重复添加"); + } else { + // 已删除,执行强制恢复更新 + GearWorker update = BeanUtil.toBean(bo, GearWorker.class); + // 必须设置工号,用于 WHERE 条件 + update.setWorkerNo(bo.getWorkerNo()); + // 调用自定义恢复方法,直接更新数据库 + int rows = baseMapper.recoverByWorkerNo(update); + if (rows > 0) { + bo.setWorkerId(existing.getWorkerId()); + log.info("恢复并更新已删除工人成功,workerNo={}", bo.getWorkerNo()); + return true; + } else { + throw new ServiceException("恢复工人数据失败,请稍后重试"); + } + } + } + + // 完全新增 + log.info("新增工人,workerNo={}", bo.getWorkerNo()); GearWorker add = BeanUtil.toBean(bo, GearWorker.class); validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setWorkerId(add.getWorkerId()); - } - return flag; + baseMapper.insert(add); + bo.setWorkerId(add.getWorkerId()); + return true; } @Override public Boolean updateByBo(GearWorkerBo bo) { + GearWorker existing = baseMapper.selectById(bo.getWorkerId()); + if (existing == null) { + throw new ServiceException("记录不存在"); + } + if (!"0".equals(existing.getDelFlag())) { + throw new ServiceException("该记录已被删除,无法更新"); + } GearWorker update = BeanUtil.toBean(bo, GearWorker.class); validEntityBeforeSave(update); return baseMapper.updateById(update) > 0; @@ -82,10 +115,14 @@ public class GearWorkerServiceImpl implements IGearWorkerService { if (StringUtils.isBlank(entity.getDefaultBillingType())) { entity.setDefaultBillingType("1"); } + if (StringUtils.isBlank(entity.getDelFlag())) { + entity.setDelFlag("0"); + } } @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + // 由于 @TableLogic(value="0", delval="2") 配置,此处会执行 UPDATE gear_worker SET del_flag='2' return baseMapper.deleteBatchIds(ids) > 0; } @@ -103,24 +140,43 @@ public class GearWorkerServiceImpl implements IGearWorkerService { msg.append("[工号/姓名为空]"); continue; } - GearWorker exist = baseMapper.selectOne(Wrappers.lambdaQuery() - .eq(GearWorker::getWorkerNo, item.getWorkerNo())); - if (exist == null) { - GearWorker add = BeanUtil.toBean(item, GearWorker.class); - validEntityBeforeSave(add); - baseMapper.insert(add); - success++; - } else if (Boolean.TRUE.equals(updateSupport)) { - GearWorker update = BeanUtil.toBean(item, GearWorker.class); - update.setWorkerId(exist.getWorkerId()); - validEntityBeforeSave(update); - baseMapper.updateById(update); - success++; - } else { - fail++; - msg.append("[工号重复:").append(item.getWorkerNo()).append("]"); + // 使用自定义方法查询所有记录(包括逻辑删除的) + GearWorker existing = baseMapper.selectByWorkerNoIncludeDeleted(item.getWorkerNo()); + + if (existing != null) { + if ("0".equals(existing.getDelFlag())) { + // 未删除,根据 updateSupport 决定 + if (Boolean.TRUE.equals(updateSupport)) { + GearWorker update = BeanUtil.toBean(item, GearWorker.class); + update.setWorkerId(existing.getWorkerId()); + validEntityBeforeSave(update); + baseMapper.updateById(update); + success++; + } else { + fail++; + msg.append("[工号重复:").append(item.getWorkerNo()).append("]"); + } + } else { + // 已删除,强制恢复 + GearWorker recover = BeanUtil.toBean(item, GearWorker.class); + recover.setWorkerNo(item.getWorkerNo()); + int rows = baseMapper.recoverByWorkerNo(recover); + if (rows > 0) { + success++; + } else { + fail++; + msg.append("[恢复失败:").append(item.getWorkerNo()).append("]"); + } + } + continue; } + + // 完全新增 + GearWorker add = BeanUtil.toBean(item, GearWorker.class); + validEntityBeforeSave(add); + baseMapper.insert(add); + success++; } return "导入完成,成功" + success + "条,失败" + fail + "条" + (msg.length() > 0 ? "," + msg : ""); } diff --git a/gear-ui3/src/api/oa/worker.js b/gear-ui3/src/api/oa/worker.js index 4360bef..93a87d4 100644 --- a/gear-ui3/src/api/oa/worker.js +++ b/gear-ui3/src/api/oa/worker.js @@ -35,10 +35,26 @@ export function updateWorker(data) { }) } -// 删除工人 -export function delWorker(workerId) { +// // 删除工人 +// export function delWorker(workerIds) { +// return request({ +// url: '/oa/worker/' + workerId, +// // url: '/oa/worker/' + workerIds.join(','), +// method: 'delete' +// }) +// } +// 删除工人(修复后,支持单个+批量删除) +export function delWorker(workerIds) { + let url = '' + if (Array.isArray(workerIds)) { + // 数组 → 拼接成 1,2,3 + url = '/oa/worker/' + workerIds.join(',') + } else { + // 单个ID + url = '/oa/worker/' + workerIds + } return request({ - url: '/oa/worker/' + workerId, + url: url, method: 'delete' }) } diff --git a/gear-ui3/src/assets/styles/index.scss b/gear-ui3/src/assets/styles/index.scss index 87898e6..b204410 100644 --- a/gear-ui3/src/assets/styles/index.scss +++ b/gear-ui3/src/assets/styles/index.scss @@ -1,3 +1,4 @@ + @use './mixin.scss'; @use './transition.scss'; @use './element-ui.scss'; @@ -176,4 +177,5 @@ aside { vertical-align: middle; margin-bottom: 10px; } + } diff --git a/gear-ui3/src/components/TopNav/index.vue b/gear-ui3/src/components/TopNav/index.vue index 62028af..b190e5d 100644 --- a/gear-ui3/src/components/TopNav/index.vue +++ b/gear-ui3/src/components/TopNav/index.vue @@ -170,8 +170,8 @@ onMounted(() => { }) -