package com.estate.expert.admin.service.impl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.estate.expert.admin.domain.business.check.Check;
import com.estate.expert.admin.domain.business.client.Client;
import com.estate.expert.admin.domain.business.onduty.OnDuty;
import com.estate.expert.admin.domain.business.onduty.OnDutyVo;
import com.estate.expert.admin.domain.business.position.Position;
import com.estate.expert.admin.domain.common.request.AddOnDutyRequest;
import com.estate.expert.admin.domain.common.request.EditOnDutyRequest;
import com.estate.expert.admin.domain.common.request.OnDutyRequest;
import com.estate.expert.admin.domain.common.request.PageReq;
import com.estate.expert.admin.domain.common.response.PageRespMp;
import com.estate.expert.admin.domain.exam.task.check.CheckTask;
import com.estate.expert.admin.domain.project.Project;
import com.estate.expert.admin.domain.project.ProjectRepository;
import com.estate.expert.admin.domain.repository.OnDutyMapper;
import com.estate.expert.admin.domain.user.User;
import com.estate.expert.admin.service.CheckTaskService;
import com.estate.expert.admin.service.ClientService;
import com.estate.expert.admin.service.OnDutyService;
import com.estate.expert.admin.service.PositionService;
import com.estate.expert.common.exception.BizException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
*
* 在岗情况 服务实现类
*
*
* @author administrator
* @since 2026-01-12
*/
@Service
public class OnDutyServiceImpl extends ServiceImpl implements OnDutyService {
@Resource
private ProjectRepository projectRepository;
@Resource
private PositionService positionService;
@Autowired
private CheckTaskService checkTaskService;
@Autowired
private ClientService clientService;
@Override
public List pageList(Page page, OnDutyRequest request) {
String sTime =null;
String eTime =null;
if(request.getTime()!=null && !request.getTime().isEmpty()){
sTime = request.getTime().split(" - ")[0] + " 00:00:00";
eTime = request.getTime().split(" - ")[1] + " 23:59:59";
}
List list = this.baseMapper.pageList(page, request,sTime,eTime);
return list;
}
@Override
public OnDutyVo detail(Integer id) {
return this.baseMapper.detail(id);
}
@Override
@Transactional
public OnDuty add(User creator, AddOnDutyRequest request) {
//1.校验任务id
CheckTask checkTask = checkTaskService.get(request.getCheckTaskIdId());
if (Objects.isNull(checkTask)) {
throw new BizException("检查任务不存在");
}
Client client = clientService.get(checkTask.getProject().getClient().getId());
if (Objects.isNull(client)) {
throw new BizException("委托方不存在");
}
// 2. 查询岗位信息,获取 positionName(MyBatis Plus 方式)
Position position = positionService.getById(request.getPositionId());
if (position == null) {
throw new BizException("岗位不存在");
}
String positionName = position.getName();
//校验该岗位是否已添加
Long count = lambdaQuery().eq(OnDuty::getCheckTaskIdId, request.getCheckTaskIdId()).eq(OnDuty::getPositionId, request.getPositionId()).count();
if (count > 0) {
throw new BizException("该岗位已上传");
}
// 3. 处理图片列表(逗号分隔)
String imgStr = null;
if (!CollectionUtils.isEmpty(request.getImages())) {
imgStr = String.join(",", request.getImages());
}
// 4. 构建 OnDuty 实体
OnDuty onDuty = new OnDuty();
onDuty.setCheckTaskIdId(request.getCheckTaskIdId());
onDuty.setContent("人员在岗"); // 固定值
onDuty.setPositionId(request.getPositionId());
onDuty.setPositionName(positionName);
onDuty.setRemark(request.getRemark());
onDuty.setImg(imgStr);
onDuty.setState(request.getState());
onDuty.setPlanId(checkTask.getPlan().getId());
onDuty.setProjectId(checkTask.getProject().getId());
onDuty.setClientId(client.getId());
// 5. 设置创建者
onDuty.setCreatorId(creator.getId());
// 6. 设置时间字段
// time: 当前日期(00:00:00)
LocalDate today = LocalDate.now();
Date timeDate = Date.from(today.atStartOfDay(ZoneId.systemDefault()).toInstant());
onDuty.setTime(timeDate);
// createTime: 当前时间戳
onDuty.setCreateTime(new Date());
// 6. 保存到数据库
this.save(onDuty);
return onDuty;
}
/**
* 分页查询在岗情况列表(JPA 实现)
* 用于新的列表查询接口,支持"全部/我创建的"筛选
*/
@Override
public PageRespMp listOnDutyRecords(Integer checkTaskId, Integer creatorId, PageReq pageReq) {
Page page = lambdaQuery().eq(OnDuty::getCheckTaskIdId, checkTaskId).eq(Objects.nonNull(creatorId), OnDuty::getCreatorId, creatorId)
.orderByDesc(OnDuty::getCreateTime)
.page(new Page<>(pageReq.getPage(), pageReq.getSize()));
//转换为 PageRespMp
return PageRespMp.of(page);
}
/**
* 编辑在岗情况记录
*/
@Override
@Transactional
public OnDuty edit(EditOnDutyRequest request) {
// 1. 查询现有记录
OnDuty onDuty = this.getById(request.getId());
if (onDuty == null) {
throw new BizException("在岗记录不存在");
}
// 2. 如果岗位ID发生变化,需要更新岗位名称(MyBatis Plus 方式)
if (!onDuty.getPositionId().equals(request.getPositionId())) {
Position position = positionService.getById(request.getPositionId());
if (position == null) {
throw new BizException("岗位不存在");
}
onDuty.setPositionName(position.getName());
}
// 3. 更新可编辑字段
onDuty.setPositionId(request.getPositionId());
onDuty.setState(request.getState());
onDuty.setRemark(request.getRemark());
// 4. 处理图片列表(逗号分隔)
String imgStr = null;
if (!CollectionUtils.isEmpty(request.getImages())) {
imgStr = String.join(",", request.getImages());
}
onDuty.setImg(imgStr);
// 5. 保存更新(MyBatis-Plus 的 updateById)
this.updateById(onDuty);
return onDuty;
}
/**
* 批量删除在岗情况记录
*/
@Override
@Transactional
public void deleteByIds(List ids) {
// 使用 MyBatis-Plus 的批量删除方法(物理删除)
this.removeByIds(ids);
}
@Override
public List exportList(OnDutyRequest query) {
String sTime =null;
String eTime =null;
if(query.getTime()!=null && !query.getTime().isEmpty()){
sTime = query.getTime().split(" - ")[0] + " 00:00:00";
eTime = query.getTime().split(" - ")[1] + " 23:59:59";
}
List list = this.baseMapper.exportList( query,sTime,eTime);
return list;
}
}