package org.dromara.eims.service.impl; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.SneakyThrows; import org.dromara.common.core.constant.DictConstants; import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.service.RepairResService; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.eims.domain.*; import org.dromara.eims.domain.vo.EimsEquVo; import org.dromara.eims.domain.vo.EimsFixtureVo; import org.dromara.eims.domain.vo.EimsRepairReqVo; import org.dromara.eims.mapper.*; import org.dromara.eims.utils.DataFilterUtil; import org.dromara.system.domain.SysDept; import org.dromara.system.domain.vo.SysDeptVo; import org.dromara.system.mapper.SysDeptMapper; import org.redisson.misc.LogHelper; import org.springframework.stereotype.Service; import org.dromara.eims.domain.bo.EimsRepairResBo; import org.dromara.eims.domain.vo.EimsRepairResVo; import org.dromara.eims.service.IEimsRepairResService; import org.springframework.transaction.annotation.Transactional; import java.util.*; /** * 维修工单Service业务层处理 * * @author zhuguifei * @date 2025-02-25 */ @RequiredArgsConstructor @Service public class EimsRepairResServiceImpl implements IEimsRepairResService, RepairResService { private final EimsRepairResMapper baseMapper; private final EimsRepairReqMapper reqMapper; private final SysDeptMapper deptMapper; private final EimsRepairRecordMapper recordMapper; private final EimsEquMapper equMapper; private final EimsFixtureMapper fixtureMapper; /** * 查询维修工单 * * @param id 主键 * @return 维修工单 */ @Override public EimsRepairResVo queryById(Long id) { EimsRepairResVo resVo = baseMapper.selectVoById(id); Long reqId = resVo.getReqId(); if(reqId!=null){ EimsRepairReqVo reqVo = reqMapper.selectVoById(reqId); resVo.setReqType(reqVo.getReqType()); resVo.setReqCode(reqVo.getCode()); if(reqVo.getEquId()!=null){ EimsEquVo equVo = equMapper.selectVoById(reqVo.getEquId()); if(equVo!=null){ resVo.setAssetNo(equVo.getAssetNo()); resVo.setEquName(equVo.getEquName()); } } if(reqVo.getFixtureId()!=null){ EimsFixtureVo fixtureVo = fixtureMapper.selectVoById(reqVo.getFixtureId()); if(fixtureVo!=null){ resVo.setFixtureName(fixtureVo.getFixtureName()); resVo.setAssetNo(fixtureVo.getAssetNo()); } } } return resVo; } /** * 分页查询维修工单列表 * * @param bo 查询条件 * @param pageQuery 分页参数 * @return 维修工单分页列表 */ @Override public TableDataInfo queryPageList(EimsRepairResBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); return TableDataInfo.build(result); } /** * 查询符合条件的维修工单列表 * * @param bo 查询条件 * @return 维修工单列表 */ @Override public List queryList(EimsRepairResBo bo) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); List eimsRepairResVos = baseMapper.selectVoList(lqw); return eimsRepairResVos; } private LambdaQueryWrapper buildQueryWrapper(EimsRepairResBo bo) { Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.eq(bo.getResUser() != null, EimsRepairRes::getResUser, bo.getResUser()); lqw.eq(bo.getResDept() != null, EimsRepairRes::getResDept, bo.getResDept()); lqw.eq(StringUtils.isNotBlank(bo.getStatus()), EimsRepairRes::getStatus, bo.getStatus()); lqw.between(params.get("beginStartTime") != null && params.get("endStartTime") != null, EimsRepairRes::getStartTime, params.get("beginStartTime"), params.get("endStartTime")); lqw.between(params.get("beginEndTime") != null && params.get("endEndTime") != null, EimsRepairRes::getEndTime, params.get("beginEndTime"), params.get("endEndTime")); // 按创建时间倒序 lqw.orderByDesc(EimsRepairRes::getCreateTime); return lqw; } /** * 新增维修工单 * * @param bo 维修工单 * @return 是否新增成功 */ @Transactional(rollbackFor = Exception.class) @Override public synchronized Boolean insertByBo(EimsRepairResBo bo) { EimsRepairRes add = MapstructUtils.convert(bo, EimsRepairRes.class); validEntityBeforeSave(add); boolean flag = baseMapper.insert(add) > 0; if (flag) { bo.setId(add.getId()); // 新增维修工单的时候更新报修单数据 EimsRepairReqVo reqVo = reqMapper.selectVoById(bo.getReqId()); reqVo.setRepairId(add.getId()); reqVo.setStatus(DictConstants.REPAIR_REQ_STATUS_DETAIL.YIJIEDAN); EimsRepairReq req = MapstructUtils.convert(reqVo, EimsRepairReq.class); reqMapper.updateById(req); //将新增报修单时维修记录的维修工单id更新 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(EimsRepairRecord::getReqId, add.getReqId()); EimsRepairRecord one = recordMapper.selectOne(queryWrapper); if(one!=null){ one.setResId(add.getId()); recordMapper.updateById(one); } //生成维修记录 EimsRepairRecord record = new EimsRepairRecord(); record.setReqId(add.getReqId()); record.setResId(add.getId()); record.setHandleTime(new Date()); //接单状态 record.setOpera(DictConstants.REPAIR_RECORD_HANDLE_DETAIL.YIJIEDAN); record.setOperaUser(add.getCreateBy()); record.setOperaResult("生成维修工单"); //新增时生成记录 recordMapper.insert(record); } return flag; } @SneakyThrows @Transactional(rollbackFor = Exception.class) @Override public Boolean insertBatchByBo(EimsRepairResBo bo){ String batchReqIds = bo.getBatchReqIds(); boolean result = StringUtils.isNotEmpty(batchReqIds); for (String reqId : batchReqIds.split(",")) { EimsRepairReqVo reqVo = reqMapper.selectVoById(reqId); EimsRepairResBo insert = new EimsRepairResBo(); insert.setReqId(reqVo.getId()); insert.setReqUser(reqVo.getReqUser()); insert.setReqDept(reqVo.getReqDept()); insert.setResCode(reqVo.getCode().replace("BXD","WXD")); insert.setResUser(bo.getResUser()); insert.setResDept(bo.getResDept()); insert.setStatus(DictConstants.REPAIR_RES_STATUS_DETAIL.YIJIEDAN); Boolean b = insertByBo(insert); if(!b)throw new Exception(""); } return result; } /** * 修改维修工单 * * @param bo 维修工单 * @return 是否修改成功 */ @Transactional(rollbackFor = Exception.class) @Override public Boolean updateByBo(EimsRepairResBo bo) { LoginUser loginUser = LoginHelper.getLoginUser(); EimsRepairRes update = MapstructUtils.convert(bo, EimsRepairRes.class); EimsRepairResVo resVo = baseMapper.selectVoById(bo.getId()); String status = resVo.getStatus(); //维修工单开始维修,同步更新报修单 以及 维修记录 if (bo.getStatus().equals(DictConstants.REPAIR_RES_STATUS_DETAIL.WEIXIU) && status.equals(DictConstants.REPAIR_RES_STATUS_DETAIL.YIJIEDAN)) { //1.设置开始维修时间 //2.更新报修单为维修状态 EimsRepairReqVo reqVo = reqMapper.selectVoById(bo.getReqId()); reqVo.setStatus(DictConstants.REPAIR_REQ_STATUS_DETAIL.WEIXIU); EimsRepairReq req = MapstructUtils.convert(reqVo, EimsRepairReq.class); reqMapper.updateById(req); //3.生成维修记录 EimsRepairRecord record = new EimsRepairRecord(); record.setResId(bo.getId()); record.setReqId(bo.getReqId()); record.setHandleTime(new Date()); record.setOpera(DictConstants.REPAIR_RECORD_HANDLE_DETAIL.WEIXIU); assert loginUser != null; record.setOperaUser(loginUser.getUserId()); record.setOperaResult("开始维修"); recordMapper.insert(record); } //维修工单完成,同步更新报修单 以及 维修记录 if (bo.getStatus().equals(DictConstants.REPAIR_RES_STATUS_DETAIL.WANCHENG) && status.equals(DictConstants.REPAIR_RES_STATUS_DETAIL.WEIXIU)) { //1.设置结束维修时间 //2.更新报修单为完成状态 EimsRepairReqVo reqVo = reqMapper.selectVoById(bo.getReqId()); reqVo.setStatus(DictConstants.REPAIR_REQ_STATUS_DETAIL.WANCHENG); EimsRepairReq req = MapstructUtils.convert(reqVo, EimsRepairReq.class); reqMapper.updateById(req); //3.生成维修记录 EimsRepairRecord record = new EimsRepairRecord(); record.setResId(bo.getId()); record.setReqId(bo.getReqId()); record.setHandleTime(new Date()); record.setOpera(DictConstants.REPAIR_RECORD_HANDLE_DETAIL.WANCHENG); assert loginUser != null; record.setOperaUser(loginUser.getUserId()); record.setOperaResult("完成维修工单"); recordMapper.insert(record); } validEntityBeforeSave(update); return baseMapper.updateById(update) > 0; } /** * 保存前的数据校验 */ private void validEntityBeforeSave(EimsRepairRes entity) { //TODO 做一些数据校验,如唯一约束 } /** * 校验并批量删除维修工单信息 * * @param ids 待删除的主键集合 * @param isValid 是否进行有效性校验 * @return 是否删除成功 */ @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 } return baseMapper.deleteByIds(ids) > 0; } @Override public TableDataInfo queryPageListCustom(EimsRepairResBo bo, PageQuery pageQuery) { DataFilterUtil.getInstance().filterRepairRes(bo); Page page = baseMapper.selectRepairResList(pageQuery.build(), buildWrapper(bo)); return TableDataInfo.build(page); } private QueryWrapper buildWrapper(EimsRepairResBo bo) { Map params = bo.getParams(); QueryWrapper qw = Wrappers.query(); qw.like(StringUtils.isNotBlank(bo.getResCode()), "res.res_code", bo.getResCode()); qw.like(StringUtils.isNotBlank(bo.getReqCode()), "req.code", bo.getReqCode()); qw.eq(bo.getResUser() != null, "res.res_user", bo.getResUser()); qw.eq(bo.getReqType() != null, "req.req_type", bo.getReqType()); qw.eq(bo.getReqUser() != null, "res.req_user", bo.getReqUser()); qw.eq(bo.getAssetNo() != null, "equ.asset_no", bo.getAssetNo()); qw.between(params.get("beginReqTime") != null && params.get("endReqTime") != null, "req.req_time", params.get("beginReqTime"), params.get("endReqTime")); List resDeptIds = getAllDescendantIds(bo.getResDept()); qw.in(bo.getResDept() != null, "res.res_dept", resDeptIds); List reqDeptIds = getAllDescendantIds(bo.getReqDept()); qw.in(bo.getReqDept() != null, "res.req_dept", reqDeptIds); qw.eq(StringUtils.isNotBlank(bo.getStatus()), "res.status", bo.getStatus()); qw.orderByDesc("res.create_time"); return qw; } /** * 根据id,获取所有后代id * * @param rootId * @return */ public List getAllDescendantIds(Long rootId) { List result = new ArrayList<>(); result.add(rootId); collectDescendants(rootId, result); return result; } private void collectDescendants(Long currentId, List collector) { QueryWrapper sysDeptWrapper = new QueryWrapper<>(); sysDeptWrapper.lambda().eq(SysDept::getParentId, currentId); List children = deptMapper.selectVoList(sysDeptWrapper); if (children != null && !children.isEmpty()) { for (SysDeptVo child : children) { Long childId = child.getDeptId(); collector.add(childId); collectDescendants(childId, collector); } } } @Override public String selectRepairResCodeByIds(String resIds) { List list = new ArrayList<>(); for (Long id : StringUtils.splitTo(resIds, Convert::toLong)) { EimsRepairResVo vo = SpringUtils.getAopProxy(this).queryById(id); if (ObjectUtil.isNotNull(vo)) { list.add(vo.getResCode()); } } return String.join(StringUtils.SEPARATOR, list); } }