package cn.iocoder.yudao.module.mes.service.em.meter; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.em.meter.vo.MesEmMeterPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.em.meter.vo.MesEmMeterRespVO; import cn.iocoder.yudao.module.mes.controller.admin.em.meter.vo.MesEmMeterSaveReqVO; import cn.iocoder.yudao.module.mes.controller.admin.em.meter.vo.MesEmOptionRespVO; import cn.iocoder.yudao.module.mes.dal.dataobject.dv.machinery.MesDvMachineryDO; import cn.iocoder.yudao.module.mes.dal.dataobject.em.meter.MesEmMeterDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkshopDO; import cn.iocoder.yudao.module.mes.dal.mysql.dv.machinery.MesDvMachineryMapper; import cn.iocoder.yudao.module.mes.dal.mysql.em.meter.MesEmMeterMapper; import cn.iocoder.yudao.module.mes.dal.mysql.em.record.MesEmRecordMapper; import cn.iocoder.yudao.module.mes.dal.mysql.md.workstation.MesMdWorkshopMapper; import cn.iocoder.yudao.module.mes.enums.em.MesEmEnergyTypeEnum; import cn.iocoder.yudao.module.mes.enums.em.MesEmMeterStatusEnum; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; /** * MES 能耗计量点 Service 实现类 * * @author 超级管理员 */ @Service @Validated public class MesEmMeterServiceImpl implements MesEmMeterService { @Resource private MesEmMeterMapper meterMapper; @Resource private MesEmRecordMapper recordMapper; @Resource private MesMdWorkshopMapper workshopMapper; @Resource private MesDvMachineryMapper machineryMapper; @Resource private AdminUserApi adminUserApi; @Override public Long createMeter(MesEmMeterSaveReqVO createReqVO) { validateMeterCodeUnique(null, createReqVO.getCode()); MesEmMeterDO meter = BeanUtils.toBean(createReqVO, MesEmMeterDO.class); fillMeterDefaultsAndNames(meter); meterMapper.insert(meter); return meter.getId(); } @Override public void updateMeter(MesEmMeterSaveReqVO updateReqVO) { validateMeterExists(updateReqVO.getId()); validateMeterCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); MesEmMeterDO meter = BeanUtils.toBean(updateReqVO, MesEmMeterDO.class); fillMeterDefaultsAndNames(meter); meterMapper.updateById(meter); } @Override public void deleteMeter(Long id) { validateMeterExists(id); if (recordMapper.selectCountByMeterId(id) > 0) { throw exception(EM_METER_HAS_RECORD); } meterMapper.deleteById(id); } @Override public MesEmMeterDO getMeter(Long id) { return meterMapper.selectById(id); } @Override public void validateMeterExists(Long id) { if (meterMapper.selectById(id) == null) { throw exception(EM_METER_NOT_EXISTS); } } private void validateMeterCodeUnique(Long id, String code) { if (StrUtil.isBlank(code)) { return; } MesEmMeterDO meter = meterMapper.selectByCode(code); if (meter == null) { return; } if (ObjUtil.notEqual(meter.getId(), id)) { throw exception(EM_METER_CODE_DUPLICATE); } } /** * 补全单位、倍率、折标煤系数,并冗余车间/产线/设备名称 */ private void fillMeterDefaultsAndNames(MesEmMeterDO meter) { MesEmEnergyTypeEnum energyType = MesEmEnergyTypeEnum.getByType(meter.getEnergyType()); if (StrUtil.isBlank(meter.getUnit()) && energyType != null) { meter.setUnit(energyType.getUnit()); } if (meter.getRatio() == null) { meter.setRatio(BigDecimal.ONE); } if (meter.getInitialReading() == null) { meter.setInitialReading(BigDecimal.ZERO); } if (meter.getCoalFactor() == null && energyType != null) { meter.setCoalFactor(energyType.getCoalFactor()); } if (meter.getStatus() == null) { meter.setStatus(MesEmMeterStatusEnum.ENABLE.getStatus()); } // 车间 if (meter.getWorkshopId() != null) { MesMdWorkshopDO workshop = workshopMapper.selectById(meter.getWorkshopId()); if (workshop == null) { throw exception(EM_METER_OBJECT_NOT_EXISTS); } meter.setWorkshopName(workshop.getName()); } else { meter.setWorkshopName(null); } // 产线 if (meter.getLineId() != null) { MesEmOptionRespVO line = meterMapper.selectLineOptionById(meter.getLineId()); if (line == null) { throw exception(EM_METER_OBJECT_NOT_EXISTS); } meter.setLineName(line.getName()); } else { meter.setLineName(null); } // 设备;未选择车间时自动带入设备所属车间 if (meter.getMachineryId() != null) { MesDvMachineryDO machinery = machineryMapper.selectById(meter.getMachineryId()); if (machinery == null) { throw exception(EM_METER_OBJECT_NOT_EXISTS); } meter.setMachineryName(machinery.getName()); if (meter.getWorkshopId() == null && machinery.getWorkshopId() != null) { MesMdWorkshopDO workshop = workshopMapper.selectById(machinery.getWorkshopId()); if (workshop != null) { meter.setWorkshopId(workshop.getId()); meter.setWorkshopName(workshop.getName()); } } } else { meter.setMachineryName(null); } } @Override public PageResult getMeterPage(MesEmMeterPageReqVO pageReqVO) { return meterMapper.selectPage(pageReqVO); } @Override public List getMeterList() { return meterMapper.selectList(); } @Override public List getMeterList(Collection ids) { if (CollUtil.isEmpty(ids)) { return Collections.emptyList(); } return meterMapper.selectByIds(ids); } @Override public List getMeterRespVOList(List list) { if (CollUtil.isEmpty(list)) { return Collections.emptyList(); } Map userMap = CollUtil.isNotEmpty(convertSet(list, MesEmMeterDO::getChargeUserId)) ? adminUserApi.getUserMap(convertSet(list, MesEmMeterDO::getChargeUserId)) : Collections.emptyMap(); return BeanUtils.toBean(list, MesEmMeterRespVO.class, vo -> { vo.setEnergyTypeName(MesEmEnergyTypeEnum.getName(vo.getEnergyType())); vo.setStatusName(MesEmMeterStatusEnum.getName(vo.getStatus())); MapUtils.findAndThen(userMap, vo.getChargeUserId(), user -> vo.setChargeUserName(user.getNickname())); }); } @Override public List getMeterSimpleList() { List list = meterMapper.selectListByStatus(MesEmMeterStatusEnum.ENABLE.getStatus()); return list.stream().map(meter -> { MesEmOptionRespVO option = new MesEmOptionRespVO(); option.setId(meter.getId()); option.setCode(meter.getCode()); option.setName(meter.getName()); option.setEnergyType(meter.getEnergyType()); option.setUnit(meter.getUnit()); option.setWorkshopId(meter.getWorkshopId()); option.setWorkshopName(meter.getWorkshopName()); option.setLineId(meter.getLineId()); option.setLineName(meter.getLineName()); return option; }).collect(Collectors.toList()); } @Override public List getWorkshopOptions() { return meterMapper.selectWorkshopOptions(); } @Override public List getLineOptions() { return meterMapper.selectLineOptions(); } @Override public List getMachineryOptions() { List options = meterMapper.selectMachineryOptions(); if (CollUtil.isEmpty(options)) { return options; } Map workshopMap = workshopMapper.selectList().stream() .collect(Collectors.toMap(MesMdWorkshopDO::getId, Function.identity(), (a, b) -> a)); options.forEach(option -> { MesMdWorkshopDO workshop = workshopMap.get(option.getWorkshopId()); if (workshop != null) { option.setWorkshopName(workshop.getName()); } }); return options; } }