package org.dromara.eims.service.impl; import com.alibaba.excel.EasyExcel; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.MapstructUtils; 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.eims.domain.EimsEqu; import org.dromara.eims.domain.vo.EimsEquVo; import org.dromara.eims.domain.vo.EimsMaintPlanVo; import org.dromara.eims.domain.vo.InspectCheckItemVo; import org.dromara.eims.listener.EasyExcelCellListener; import org.dromara.eims.listener.InspectCheckItemImportListener; import org.dromara.eims.mapper.EimsEquMapper; import org.dromara.system.domain.SysDept; import org.dromara.system.domain.vo.SysDeptVo; import org.dromara.system.mapper.SysDeptMapper; import org.springframework.stereotype.Service; import org.dromara.eims.domain.bo.EimsInspectPlanBo; import org.dromara.eims.domain.vo.EimsInspectPlanVo; import org.dromara.eims.domain.EimsInspectPlan; import org.dromara.eims.mapper.EimsInspectPlanMapper; import org.dromara.eims.service.IEimsInspectPlanService; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.*; /** * 点检计划Service业务层处理 * * @author zhuguifei * @date 2025-03-12 */ @RequiredArgsConstructor @Service public class EimsInspectPlanServiceImpl implements IEimsInspectPlanService { private final EimsInspectPlanMapper baseMapper; private final SysDeptMapper sysDeptMapper; private final EimsEquMapper equMapper; /** * 查询点检计划 * * @param id 主键 * @return 点检计划 */ @Override public EimsInspectPlanVo queryById(Long id){ return baseMapper.selectVoById(id); } /** * 分页查询点检计划列表 * * @param bo 查询条件 * @param pageQuery 分页参数 * @return 点检计划分页列表 */ @Override public TableDataInfo queryPageList(EimsInspectPlanBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); return TableDataInfo.build(result); } @Override public TableDataInfo queryPageListCustom(EimsInspectPlanBo bo, PageQuery pageQuery) { Page page = baseMapper.selectInspPlanList(pageQuery.build(), buildWrapper(bo)); return TableDataInfo.build(page); } /** * 查询符合条件的点检计划列表 * * @param bo 查询条件 * @return 点检计划列表 */ @Override public List queryList(EimsInspectPlanBo bo) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); return baseMapper.selectVoList(lqw); } private LambdaQueryWrapper buildQueryWrapper(EimsInspectPlanBo bo) { Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.eq(bo.getEquId() != null, EimsInspectPlan::getEquId, bo.getEquId()); lqw.eq(StringUtils.isNotBlank(bo.getInspType()), EimsInspectPlan::getInspType, bo.getInspType()); lqw.like(StringUtils.isNotBlank(bo.getInspName()), EimsInspectPlan::getInspName, bo.getInspName()); lqw.eq(bo.getInspNo() != null, EimsInspectPlan::getInspNo, bo.getInspNo()); lqw.eq(bo.getInspCycle() != null, EimsInspectPlan::getInspCycle, bo.getInspCycle()); lqw.eq(StringUtils.isNotBlank(bo.getInspCycleUnit()), EimsInspectPlan::getInspCycleUnit, bo.getInspCycleUnit()); lqw.eq(StringUtils.isNotBlank(bo.getInspRule()), EimsInspectPlan::getInspRule, bo.getInspRule()); lqw.eq(bo.getInspUser() != null, EimsInspectPlan::getInspUser, bo.getInspUser()); lqw.eq(bo.getInspDept() != null, EimsInspectPlan::getInspDept, bo.getInspDept()); lqw.eq(StringUtils.isNotBlank(bo.getStatus()), EimsInspectPlan::getStatus, bo.getStatus()); return lqw; } private QueryWrapper buildWrapper(EimsInspectPlanBo bo) { Map params = bo.getParams(); QueryWrapper qw = Wrappers.query(); qw.eq(bo.getEquId() != null, "ip.equ_id", bo.getEquId()); qw.like(bo.getEquName() != null, "equ.equ_name", bo.getEquName()); qw.like(bo.getAssetNo() != null, "equ.asset_no", bo.getAssetNo()); qw.eq(StringUtils.isNotBlank(bo.getInspType()), "ip.insp_type", bo.getInspType()); qw.eq(StringUtils.isNotBlank(bo.getInspCycleUnit()), "ip.insp_cycle_unit", bo.getInspCycleUnit()); qw.eq(StringUtils.isNotBlank(bo.getInspRule()), "ip.insp_rule", bo.getInspRule()); qw.eq(bo.getInspUser() != null, "ip.insp_user", bo.getInspUser()); qw.in(bo.getInspDept() != null, "ip.insp_dept", getAllDescendantIds(bo.getInspDept())); qw.eq(bo.getStatus() != null, "ip.status", bo.getStatus()); qw.between(params.get("beginPlanTime") != null && params.get("endPlanTime") != null, "a.plam_time", params.get("beginPlanTime"), params.get("endPlanTime")); qw.orderByDesc("ip.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 = sysDeptMapper.selectVoList(sysDeptWrapper); if (children != null && !children.isEmpty()) { for (SysDeptVo child : children) { Long childId = child.getDeptId(); collector.add(childId); collectDescendants(childId, collector); } } } /** * 新增点检计划 * * @param bo 点检计划 * @return 是否新增成功 */ @Override public Boolean insertByBo(EimsInspectPlanBo bo) { EimsInspectPlan add = MapstructUtils.convert(bo, EimsInspectPlan.class); validEntityBeforeSave(add); boolean flag = baseMapper.insert(add) > 0; if (flag) { bo.setId(add.getId()); } return flag; } /** * 修改点检计划 * * @param bo 点检计划 * @return 是否修改成功 */ @Override public Boolean updateByBo(EimsInspectPlanBo bo) { EimsInspectPlan update = MapstructUtils.convert(bo, EimsInspectPlan.class); validEntityBeforeSave(update); return baseMapper.updateById(update) > 0; } /** * 保存前的数据校验 */ private void validEntityBeforeSave(EimsInspectPlan 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 String importData(MultipartFile file, boolean updateSupport) throws IOException, IOException { int successNum = 0; int failureNum = 0; StringBuilder successMsg = new StringBuilder(); StringBuilder failureMsg = new StringBuilder(); // 点检项目列表(假设存在对应的点检项VO) InspectCheckItemImportListener checkItemImportListener = new InspectCheckItemImportListener(updateSupport); EasyExcel.read(file.getInputStream(), InspectCheckItemVo.class, checkItemImportListener).headRowNumber(3).sheet().doRead(); List successList = checkItemImportListener.getSuccessList(); // 读取固定资产编号(假设位置不同) EasyExcelCellListener assetNoListener = new EasyExcelCellListener(2, 23); EasyExcel.read(file.getInputStream(), assetNoListener).headRowNumber(0).sheet().doReadSync(); String assetNo = Optional.ofNullable(assetNoListener.getCellValue()) .map(value -> { int colonIndex = Math.max(value.indexOf(":"), value.indexOf(":")); // 合并冒号处理 return colonIndex != -1 ? value.substring(colonIndex + 1) : value; }) .map(String::trim) .orElseThrow(() -> new ServiceException("导入失败,无法读取固定资产编号")); // 查询设备信息 QueryWrapper query = new QueryWrapper<>(); query.eq("asset_no", assetNo); EimsEquVo equVo = equMapper.selectVoOne(query); if (equVo == null) throw new ServiceException("设备未找到,请先在设备台帐中添加"); for (InspectCheckItemVo itemVo : successList) { if ("设备状态卡状态".equals(itemVo.getItemName())) break; EimsInspectPlanBo bo = new EimsInspectPlanBo(); bo.setEquId(equVo.getEquId()); bo.setInspName(itemVo.getItemName()); bo.setStatus("0"); bo.setInspType("1"); bo.setInspRule("0"); if (!insertByBo(bo)) { failureNum++; failureMsg.append(failureNum).append("、导入失败
"); } else { successNum++; successMsg.append(successNum).append("、导入成功
"); } } return failureNum > 0 ? failureMsg.toString() : successMsg.toString(); } }