用户管理修改回显尝试,薪资管理时间戳修正,工人批量导入(无需模版,且删除后重复数据自动覆盖)

This commit is contained in:
朱昊天
2026-04-16 20:01:21 +08:00
parent 595b9fbd68
commit 6aa1d581e7
12 changed files with 289 additions and 58 deletions

View File

@@ -93,4 +93,6 @@ public class GearWorkerController extends BaseController {
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] workerIds) {
return toAjax(iGearWorkerService.deleteWithValidByIds(Arrays.asList(workerIds), true));
}
}

View File

@@ -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;

View File

@@ -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<GearWorkerMapper, GearWorker, GearWorkerVo> {
/**
* 根据工号查询所有记录(包括逻辑删除的),绕过 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);
}

View File

@@ -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<GearWorker> buildQueryWrapper(GearWorkerBo bo) {
LambdaQueryWrapper<GearWorker> 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<Long> 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.<GearWorker>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 : "");
}