package com.gkhy.exam.system.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.gkhy.exam.common.api.CommonPage;
import com.gkhy.exam.common.api.CommonResult;
import com.gkhy.exam.common.domain.entity.SysDept;
import com.gkhy.exam.common.utils.PageUtils;
import com.gkhy.exam.common.utils.SecurityUtils;
import com.gkhy.exam.system.domain.InternalAuditCheck;
import com.gkhy.exam.system.domain.InternalAuditCheckPerson;
import com.gkhy.exam.system.domain.vo.InternalAuditCheckVo;
import com.gkhy.exam.system.mapper.InternalAuditCheckMapper;
import com.gkhy.exam.system.mapper.InternalAuditCheckPersonMapper;
import com.gkhy.exam.system.mapper.SysDeptMapper;
import com.gkhy.exam.system.mapper.SysUserMapper;
import com.gkhy.exam.system.service.InternalAuditCheckService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
*
* 内审检查 服务实现类
*
*
* @author hh
* @since 2025-07-10 15:11:50
*/
@Service
public class InternalAuditCheckServiceImpl extends ServiceImpl implements InternalAuditCheckService {
@Autowired
private InternalAuditCheckMapper internalAuditCheckMapper;
@Autowired
private InternalAuditCheckPersonMapper internalAuditCheckPersonMapper;
@Autowired
private SysUserMapper sysUserMapper;
@Autowired
private SysDeptMapper sysDeptMapper;
@Override
public CommonPage selectInternalAuditCheckList(Integer companyId) {
PageUtils.startPage();
List internalAuditChecks = internalAuditCheckMapper.selectInternalAuditCheckList(companyId);
return CommonPage.restPage(internalAuditChecks);
}
@Override
@Transactional
public CommonResult insertInternalAuditCheck(InternalAuditCheckVo internalAuditCheck) {
InternalAuditCheck internalAuditCheck1 = new InternalAuditCheck();
BeanUtils.copyProperties(internalAuditCheck,internalAuditCheck1);
internalAuditCheck1.setCreateTime(LocalDateTime.now());
internalAuditCheck1.setCreateBy(SecurityUtils.getUsername());
int insert = internalAuditCheckMapper.insert(internalAuditCheck1);
if (insert > 0) {
if (ObjectUtil.isNotEmpty(internalAuditCheck.getInternalAuditCheckPeople())){
batchInsert(internalAuditCheck.getInternalAuditCheckPeople(),internalAuditCheck1.getId());
}
return CommonResult.success();
}
return CommonResult.failed();
}
private void batchInsert(List internalAuditCheckPeople,Long auditId) {
internalAuditCheckPeople.forEach(e -> {
e.setAuditId(auditId);
e.setCreateTime(LocalDateTime.now());
e.setCreateBy(SecurityUtils.getUsername());
});
internalAuditCheckPersonMapper.batchInsert(internalAuditCheckPeople);
}
private void batchUpdate(List internalAuditCheckPeople) {
internalAuditCheckPeople.forEach(e -> {
e.setUpdateTime(LocalDateTime.now());
e.setUpdateBy(SecurityUtils.getUsername());
});
internalAuditCheckPersonMapper.batchUpdate(internalAuditCheckPeople);
}
@Override
public CommonResult updateInternalAuditCheck(InternalAuditCheckVo internalAuditCheck) {
InternalAuditCheck internalAuditCheck1 = new InternalAuditCheck();
BeanUtils.copyProperties(internalAuditCheck,internalAuditCheck1);
internalAuditCheck1.setUpdateTime(LocalDateTime.now());
internalAuditCheck1.setUpdateBy(SecurityUtils.getUsername());
int update = internalAuditCheckMapper.updateById(internalAuditCheck1);
if (update > 0) {
List internalAuditCheckPeople = internalAuditCheck.getInternalAuditCheckPeople();
if (ObjectUtil.isNotEmpty(internalAuditCheckPeople)){
Set collect = internalAuditCheckPeople.stream().map(InternalAuditCheckPerson::getAuditUserId)
.collect(Collectors.toSet());
if (collect.size() != internalAuditCheckPeople.size()){
throw new RuntimeException("受审人员重复");
}
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(InternalAuditCheckPerson::getAuditId, internalAuditCheck.getId());
queryWrapper.eq(InternalAuditCheckPerson::getDelFlag, 0);
List internalAuditCheckPeople1 = internalAuditCheckPersonMapper.selectList(queryWrapper);
List idsAll = internalAuditCheckPeople1.stream()
.map(InternalAuditCheckPerson::getId)
.collect(Collectors.toList());
List idsUpdate = internalAuditCheckPeople.stream()
.map(InternalAuditCheckPerson::getId)
.filter(id -> id != null) // 过滤掉 null 值
.collect(Collectors.toList());
if (!idsUpdate.isEmpty() && !idsAll.isEmpty()){
//不存在的删除
List result = idsAll.stream()
.filter(id -> !idsUpdate.contains(id))
.collect(Collectors.toList());
if (!result.isEmpty()){
batchDel(internalAuditCheck.getId(),result);
}
}
List withId = internalAuditCheckPeople.stream()
.filter(e -> e.getId() != null)
.collect(Collectors.toList());
//修改的
if (!withId.isEmpty()){
batchUpdate(withId);
}
List withoutId = internalAuditCheckPeople.stream()
.filter(e -> e.getId() == null)
.collect(Collectors.toList());
//新增的
if (!withoutId.isEmpty()){
batchInsert(withoutId,internalAuditCheck.getId());
}
}else {
batchDel(internalAuditCheck.getId(),null);
}
return CommonResult.success(update);
}
return CommonResult.failed();
}
private void batchDel(Long id,List ids){
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(InternalAuditCheckPerson::getAuditId, id);
if (ObjectUtil.isNotEmpty(ids)){
queryWrapper.in(InternalAuditCheckPerson::getId, ids);
}
InternalAuditCheckPerson internalAuditCheckPerson = new InternalAuditCheckPerson();
internalAuditCheckPerson.setDelFlag(1);
internalAuditCheckPerson.setUpdateTime(LocalDateTime.now());
internalAuditCheckPerson.setUpdateBy(SecurityUtils.getUsername());
internalAuditCheckPersonMapper.update(internalAuditCheckPerson,queryWrapper);
}
@Override
@Transactional
public CommonResult deletedInternalAuditCheck(Integer id) {
int delete = internalAuditCheckMapper.deleteById(id);
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(InternalAuditCheckPerson::getAuditId, id);
InternalAuditCheckPerson internalAuditCheckPerson = new InternalAuditCheckPerson();
internalAuditCheckPerson.setDelFlag(1);
internalAuditCheckPerson.setUpdateTime(LocalDateTime.now());
internalAuditCheckPerson.setUpdateBy(SecurityUtils.getUsername());
internalAuditCheckPersonMapper.update(internalAuditCheckPerson,queryWrapper);
return CommonResult.success();
}
@Override
public CommonResult internalAuditCheckInfo(Integer id) {
InternalAuditCheck internalAuditCheck = internalAuditCheckMapper.selectById(id);
InternalAuditCheckVo internalAuditCheckVo = new InternalAuditCheckVo();
BeanUtils.copyProperties(internalAuditCheck,internalAuditCheckVo);
internalAuditCheckVo.setDeptName(sysDeptMapper.selectDeptById(internalAuditCheck.getDeptId()).getDeptName());
internalAuditCheckVo.setAuditName(sysUserMapper.selectById(internalAuditCheck.getAuditId()).getName());
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(InternalAuditCheckPerson::getAuditId, id);
queryWrapper.eq(InternalAuditCheckPerson::getDelFlag, 0);
List internalAuditCheckPeople = internalAuditCheckPersonMapper.selectList(queryWrapper);
internalAuditCheckVo.setInternalAuditCheckPeople(internalAuditCheckPeople);
return CommonResult.success(internalAuditCheckVo);
}
}