package org.dromara.eims.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.SneakyThrows; import org.dromara.common.core.constant.DictConstants; import org.dromara.common.core.domain.R; 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.EimsMaintOrder; import org.dromara.eims.domain.EimsMaintSt; import org.dromara.eims.domain.bo.EimsMaintStBo; import org.dromara.eims.domain.vo.EimsMaintOrderVo; import org.dromara.eims.domain.vo.EimsMaintStVo; import org.dromara.eims.mapper.EimsEquMapper; import org.dromara.eims.mapper.EimsMaintOrderMapper; import org.springframework.stereotype.Service; import org.dromara.eims.mapper.EimsMaintStMapper; import org.dromara.eims.service.IEimsMaintStService; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; import java.time.ZoneId; import java.time.temporal.TemporalAdjusters; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Collection; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; /** * 保养工单汇总Service业务层处理 * * @author zhuguifei * @date 2025-03-12 */ @RequiredArgsConstructor @Service public class EimsMaintStServiceImpl implements IEimsMaintStService { private final EimsMaintStMapper baseMapper; private final EimsEquMapper equMapper; private final EimsMaintOrderMapper orderMapper; /** * 查询保养工单汇总 * * @param id 主键 * @return 保养工单汇总 */ @Override public EimsMaintStVo queryById(Long id) { return baseMapper.selectVoById(id); } /** * 分页查询保养工单汇总列表 * * @param bo 查询条件 * @param pageQuery 分页参数 * @return 保养工单汇总分页列表 */ @Override public TableDataInfo queryPageList(EimsMaintStBo bo, PageQuery pageQuery) { Page result = baseMapper.selectMaintStList(pageQuery.build(), buildWrapper(bo)); // 填充数据 fillStData(result); return TableDataInfo.build(result); } private void fillStData(Page result) { List records = result.getRecords(); for (int i = 0; i < records.size(); i++) { EimsMaintStVo stVo = records.get(i); //1.填充设备 EimsEqu eimsEqu = equMapper.selectById(stVo.getEquId()); stVo.setAssetNo(eimsEqu.getAssetNo()); //2.统计数据 LambdaQueryWrapper orderLqw = Wrappers.lambdaQuery(); orderLqw.eq(EimsMaintOrder::getEquId, stVo.getEquId()); LocalDate planTime = stVo.getPlanTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); LocalDate startOfMonth = planTime.with(TemporalAdjusters.firstDayOfMonth()); LocalDate endOfMonth = planTime.with(TemporalAdjusters.lastDayOfMonth()); orderLqw.between(EimsMaintOrder::getPlanTime, startOfMonth, endOfMonth); // 执行查询 List orderList = orderMapper.selectVoList(orderLqw); // TODO 根据字典maint_order_status Map cMap = orderList.stream() .filter(order -> List.of("0", "1", "2", "3").contains(order.getStatus())) .collect(Collectors.groupingBy(EimsMaintOrderVo::getStatus, Collectors.counting())); stVo.setOrderCount(orderList.size()); stVo.setDbyCount(cMap.getOrDefault("0", 0L).intValue()); stVo.setByCount(cMap.getOrDefault("1", 0L).intValue()); stVo.setDyzCount(cMap.getOrDefault("2", 0L).intValue()); stVo.setWcCount(cMap.getOrDefault("3", 0L).intValue()); } } /** * 查询符合条件的保养工单汇总列表 * * @param bo 查询条件 * @return 保养工单汇总列表 */ @Override public List queryList(EimsMaintStBo bo) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); return baseMapper.selectVoList(lqw); } private LambdaQueryWrapper buildQueryWrapper(EimsMaintStBo bo) { Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.eq(StringUtils.isNotBlank(bo.getTitle()), EimsMaintSt::getTitle, bo.getTitle()); lqw.eq(bo.getPlanTime() != null, EimsMaintSt::getPlanTime, bo.getPlanTime()); lqw.eq(bo.getMaintUser() != null, EimsMaintSt::getMaintUser, bo.getMaintUser()); lqw.eq(bo.getVerifyUser() != null, EimsMaintSt::getVerifyUser, bo.getVerifyUser()); return lqw; } private QueryWrapper buildWrapper(EimsMaintStBo bo) { Map params = bo.getParams(); QueryWrapper qw = Wrappers.query(); qw.like(StringUtils.isNotBlank(bo.getTitle()), "st.title", bo.getTitle()); qw.like(StringUtils.isNotBlank(bo.getEquName()), "equ.equ_name", bo.getEquName()); qw.like(StringUtils.isNotBlank(bo.getAssetNo()), "equ.asset_no", bo.getAssetNo()); qw.between(params.get("beginPlanTime") != null && params.get("endPlanTime") != null, "st.plan_time", params.get("beginPlanTime"), params.get("endPlanTime")); qw.eq(bo.getMaintUser() != null, "st.maint_user", bo.getMaintUser()); qw.eq(bo.getVerifyUser() != null, "st.verify_user", bo.getVerifyUser()); qw.eq(bo.getStatus() != null, "st.status", bo.getStatus()); qw.orderByDesc( "st.create_time"); return qw; } /** * 新增保养工单汇总 * * @param bo 保养工单汇总 * @return 是否新增成功 */ @Override public Boolean insertByBo(EimsMaintStBo bo) { EimsMaintSt add = MapstructUtils.convert(bo, EimsMaintSt.class); validEntityBeforeSave(add); boolean flag = baseMapper.insert(add) > 0; if (flag) { bo.setId(add.getId()); } return flag; } /** * 修改保养工单汇总 * * @param bo 保养工单汇总 * @return 是否修改成功 */ @Override public Boolean updateByBo(EimsMaintStBo bo) { EimsMaintSt update = MapstructUtils.convert(bo, EimsMaintSt.class); if(bo.getVerifyUser()!=null){ EimsMaintSt eimsMaintSt = baseMapper.selectById(bo.getId()); String status = eimsMaintSt.getStatus(); if(status==null || status.equals(DictConstants.MAINT_ORDER_ST_STATUS_DETAIL.N)){ if(update.getVerifyTime()==null) update.setStatus(DictConstants.MAINT_ORDER_ST_STATUS_DETAIL.Y); if(update.getVerifyTime()==null) update.setVerifyTime(new Date()); } } validEntityBeforeSave(update); return baseMapper.updateById(update) > 0; } /** * 保存前的数据校验 */ private void validEntityBeforeSave(EimsMaintSt entity) { //TODO 做一些数据校验,如唯一约束 } /** * 校验并批量删除保养工单汇总信息 * * @param ids 待删除的主键集合 * @param isValid 是否进行有效性校验 * @return 是否删除成功 */ @Transactional(rollbackFor = Exception.class) @SneakyThrows @Override public R deleteWithValidByIds(Collection ids, Boolean isValid) { if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 } AtomicBoolean flag = new AtomicBoolean(false); ids.stream().anyMatch(id -> { EimsMaintStVo stVo = baseMapper.selectVoById(id); LocalDate planTime = stVo.getPlanTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); LocalDate startOfMonth = planTime.with(TemporalAdjusters.firstDayOfMonth()); LocalDate endOfMonth = planTime.with(TemporalAdjusters.lastDayOfMonth()); LambdaQueryWrapper orderLqw = Wrappers.lambdaQuery(EimsMaintOrder.class) .eq(EimsMaintOrder::getEquId, stVo.getEquId()) .between(EimsMaintOrder::getPlanTime, startOfMonth, endOfMonth); List orderList = orderMapper.selectVoList(orderLqw); if (!orderList.isEmpty()) { flag.set(true); return true; // 有匹配结果,停止遍历 } return false; }); if (flag.get()) { return R.fail("存在子项,不能删除!"); } boolean result = baseMapper.deleteByIds(ids) > 0; return result ? R.ok("操作成功!") : R.fail("操作失败!"); } }