package com.zhitan.basicdata.services.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.zhitan.basicdata.domain.MeterImplement; import com.zhitan.basicdata.domain.MeterImplementExcel; import com.zhitan.basicdata.mapper.MeterImplementMapper; import com.zhitan.basicdata.services.IMeterImplementService; import com.zhitan.common.core.domain.entity.SysDictData; import com.zhitan.common.core.domain.model.LoginUser; import com.zhitan.common.enums.IndexType; import com.zhitan.common.exception.CustomException; import com.zhitan.common.utils.DateUtils; import com.zhitan.common.utils.StringUtils; import com.zhitan.gatewaysetting.domain.GatewaySetting; import com.zhitan.gatewaysetting.mapper.GatewaySettingMapper; import com.zhitan.model.domain.DaqTemplate; import com.zhitan.model.domain.EnergyIndex; import com.zhitan.model.mapper.DaqTemplateMapper; import com.zhitan.model.mapper.EnergyIndexMapper; import com.zhitan.system.mapper.SysDictDataMapper; import com.zhitan.system.service.impl.SysUserServiceImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; /** * 计量器具档案维护Service业务层处理 * * @author zhaowei * @date 2020-02-12 */ @Service public class MeterImplementServiceImpl implements IMeterImplementService { @Autowired private MeterImplementMapper meterImplementMapper; @Autowired private DaqTemplateMapper daqTemplateMapper; @Autowired private EnergyIndexMapper energyIndexMapper; @Autowired private SysDictDataMapper dictDataMapper; private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class); @Autowired private GatewaySettingMapper gatewaySettingMapper; /** * 查询计量器具档案维护 * * @param id 计量器具档案维护ID * @return 计量器具档案维护 */ @Override public MeterImplement selectMeterImplementById(String id) { return meterImplementMapper.selectMeterImplementById(id); } /** * 查询计量器具档案维护 * * @param meterImplement 计量器具档案维护 编号 * @return 计量器具档案维护 */ @Override public MeterImplement selectMeterImplementByCode(MeterImplement meterImplement) { return meterImplementMapper.selectMeterImplementByCode(meterImplement); } /** * 查询计量器具档案维护列表 * * @param meterImplement 计量器具档案维护 * @return 计量器具档案维护 */ @Override public List selectMeterImplementList(MeterImplement meterImplement) { return meterImplementMapper.selectMeterImplementList(meterImplement); } /** * 导出计量器具档案维护列表 * * @param meterImplement 计量器具档案维护 * @return 计量器具档案维护 */ @Override public List exectMeterImplementList(MeterImplement meterImplement) { return meterImplementMapper.exectMeterImplementList(meterImplement); } /** * 新增计量器具档案维护 * * @param meterImplement 计量器具档案维护 * @return 结果 */ @Override public int insertMeterImplement(MeterImplement meterImplement) { meterImplement.setCreateTime(DateUtils.getNowDate()); final int i = meterImplementMapper.insertMeterImplement(meterImplement); DaqTemplate query = new DaqTemplate(); query.setDeviceType(meterImplement.getMeterType()); List daqTemplates = daqTemplateMapper.selectDaqTemplateList(query); if (daqTemplates.isEmpty()) { return i; } List energyIndices = new ArrayList<>(); daqTemplates.forEach(daqTemplate -> { EnergyIndex energyIndex = new EnergyIndex(); energyIndex.setIndexId(UUID.randomUUID().toString()); energyIndex.setCode(meterImplement.getCode() + "_" + daqTemplate.getCode()); energyIndex.setName(daqTemplate.getName()); energyIndex.setUnitId(daqTemplate.getUnit()); energyIndex.setIndexType(IndexType.COLLECT); energyIndex.setMeterId(meterImplement.getId()); energyIndices.add(energyIndex); }); energyIndexMapper.deleteIndexByMeterId(meterImplement.getId()); energyIndexMapper.insertEnergyIndices(energyIndices); //判断是否关联网关信息,增加信息 if (StringUtils.isNotBlank(meterImplement.getGatewayId())) { GatewaySetting gatewaySetting = new GatewaySetting(); gatewaySetting.setId(meterImplement.getGatewayId()); gatewaySetting.setDeviceNum(1); gatewaySetting.setPtNum(energyIndices.size()); //更新数据 gatewaySettingMapper.addNum(gatewaySetting); } return i; } /** * 修改计量器具档案维护 * * @param meterImplement 计量器具档案维护 * @return 结果 */ @Override public int updateMeterImplement(MeterImplement meterImplement) { meterImplement.setUpdateTime(DateUtils.getNowDate()); //判断之前是否已经绑定,如果已经绑定,将原网关关联的计量器具删除,并在新关联的网关内增加(计量器具数和测点数量) //之前未绑定,修改时绑定了:在关联的网关上增加 MeterImplement beforeUpdate = meterImplementMapper.selectMeterImplementById(meterImplement.getId()); if (StringUtils.isBlank(beforeUpdate.getGatewayId()) && StringUtils.isNotBlank(meterImplement.getGatewayId())) { //原网关没关联,修改时关联的新网关:直接增加 //更新数据 gatewaySettingMapper.addNum(getGatewaySetting(meterImplement)); }else if (StringUtils.isNotBlank(beforeUpdate.getGatewayId()) && StringUtils.isNotBlank(meterImplement.getGatewayId()) && !beforeUpdate.getGatewayId().equals(meterImplement.getGatewayId())){ //原网关关联,修改时换了网关:原网关数量扣减,新网关数量增加 //更新原网关 gatewaySettingMapper.subNum(getGatewaySetting(beforeUpdate)); //更新新网关 gatewaySettingMapper.addNum(getGatewaySetting(meterImplement)); }else if (StringUtils.isNotBlank(beforeUpdate.getGatewayId()) && StringUtils.isBlank(meterImplement.getGatewayId())){ //原来关联了网关,修改时删除掉了,扣减数量 gatewaySettingMapper.subNum(getGatewaySetting(beforeUpdate)); } return meterImplementMapper.updateMeterImplement(meterImplement); } /** * 根据关联的网关主键获取测点数量 * @param meterImplement * @return */ public GatewaySetting getGatewaySetting(MeterImplement meterImplement) { GatewaySetting gatewaySetting = new GatewaySetting(); gatewaySetting.setId(meterImplement.getGatewayId()); gatewaySetting.setDeviceNum(1); QueryWrapper energyIndexQueryWrapper = new QueryWrapper<>(); energyIndexQueryWrapper.eq("meter_id", meterImplement.getId()); int ptNum=energyIndexMapper.selectList(energyIndexQueryWrapper).size(); gatewaySetting.setPtNum(ptNum); gatewaySetting.setUpdateBy(meterImplement.getUpdateBy()); return gatewaySetting; } /** * 批量删除计量器具档案维护 * * @param ids 需要删除的计量器具档案维护ID * @return 结果 */ @Override public int deleteMeterImplementByIds(String[] ids) { return meterImplementMapper.deleteMeterImplementByIds(ids); } /** * 删除计量器具档案维护信息 * * @param id 计量器具档案维护ID * @return 结果 */ @Override public int deleteMeterImplementById(String id) { return meterImplementMapper.deleteMeterImplementById(id); } /** * Excel导入 计量器具档案维护信息 * * @param meterImplementList 要导入的计量器具档案集合 * @param loginUser 登录用户对象 * @return 结果 */ @Override public String excelImpSave(List meterImplementList, LoginUser loginUser) { if (StringUtils.isNull(meterImplementList) || meterImplementList.size() == 0) { throw new CustomException("导入计量器具档案不能为空!"); } int successNum = 0; int failureNum = 0; StringBuilder successMsg = new StringBuilder(); StringBuilder failureMsg = new StringBuilder(); //1、字典数据翻译 //计量器具状态 List meterStatusList = dictDataMapper.selectDictDataByType("meter_status"); Map meterStatusMap = this.initDictMap(meterStatusList); //计量器具类型 List meterTypeList = dictDataMapper.selectDictDataByType( "sys_device_type"); Map meterTypeMap = this.initDictMap(meterTypeList); for (MeterImplement meterImplement : meterImplementList) { try { // 检定周期、提醒周期 定义的Integer类型,如果数据不匹配会默认为0 meterImplement.setCheckCycle(meterImplement.getCheckCycle()==null?1:meterImplement.getCheckCycle()); meterImplement.setReminderCycle(meterImplement.getReminderCycle()==null?1:meterImplement.getReminderCycle()); // 2验证 编码是否存在 MeterImplement chekcMeterImplement = meterImplementMapper.selectMeterImplementByCode(meterImplement); if (StringUtils.isNull(chekcMeterImplement)) { //设置主键 meterImplement.setId(UUID.randomUUID().toString()); //翻译器具状态 无或者值不对则设置为空字符串 String meterStatus= StringUtils.nvl(meterStatusMap.get(meterImplement.getMeterStatus()+""),""); //判断状态是否正确 if(StringUtils.isEmpty(meterStatus)) { failureNum++; failureMsg.append("
" + failureNum + "、编号 " + meterImplement.getCode() + " 的状态错误"); continue; } meterImplement.setMeterStatus(meterStatus); //翻译器具种类 无或者值不对则设置为空字符串 String meterType= StringUtils.nvl(meterTypeMap.get(meterImplement.getMeterType()+""),""); if(StringUtils.isEmpty(meterType)) { failureNum++; failureMsg.append("
" + failureNum + "、编号 " + meterImplement.getCode() + " 的种类错误"); continue; } meterImplement.setMeterType(meterType); //设置建立人和建立时间 meterImplement.setCreateBy(loginUser.getUsername()); meterImplement.setCreateTime(new Date()); //存储一条数据 this.insertMeterImplement(meterImplement); successNum++; successMsg.append("
" + successNum + "、编号 " + meterImplement.getCode() + " 导入成功"); } else { failureNum++; failureMsg.append("
" + failureNum + "、编号 " + meterImplement.getCode() + " 已存在"); } } catch (Exception e) { failureNum++; String msg = "
" + failureNum + "、编号 " + meterImplement.getCode() + " 导入失败:"; failureMsg.append(msg + e.getMessage()); log.error(msg, e); } } if (failureNum > 0) { failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); throw new CustomException(failureMsg.toString()); } else { successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); } return successMsg.toString(); } /** * 根据id集合查询计量器具信息 * * @param meterIdList 计量器具id * @return */ @Override public List listMeterImplementByIds(List meterIdList) { return meterImplementMapper.listMeterImplementByIds(meterIdList); } /** * 将字典类型 对应的 字典集合 存入map中使用 * * @param sysDictDataList * @return */ public Map initDictMap(List sysDictDataList) { Map map = new HashMap(); for (SysDictData sysDictData : sysDictDataList) { //存放 key=标签名字 value是 设置值 map.put(sysDictData.getDictLabel(), sysDictData.getDictValue()); } return map; } @Override public Page selectMeterImplementPage(MeterImplement meterImplement, Long pageNum, Long pageSize) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.like(StringUtils.isNotEmpty(meterImplement.getCode()),MeterImplement::getCode,meterImplement.getCode()); queryWrapper.like(StringUtils.isNotEmpty(meterImplement.getMeterName()),MeterImplement::getMeterName,meterImplement.getMeterName()); queryWrapper.eq(StringUtils.isNotEmpty(meterImplement.getMeterType()),MeterImplement::getMeterType,meterImplement.getMeterType()); queryWrapper.orderByDesc(MeterImplement::getCreateTime); final Page meterImplementPage = meterImplementMapper.selectPage(new Page<>(pageNum, pageSize), queryWrapper); return meterImplementPage; } }