package com.moral.api.service.impl; 
 | 
  
 | 
import com.alibaba.fastjson.JSON; 
 | 
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 
 | 
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; 
 | 
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 
 | 
import com.moral.api.config.mybatis.wrapper.NullFilterWrapper; 
 | 
import com.moral.api.entity.Sensor; 
 | 
import com.moral.api.entity.SysDictData; 
 | 
import com.moral.api.entity.UnitConversion; 
 | 
import com.moral.api.mapper.UnitConversionMapper; 
 | 
import com.moral.api.pojo.dto.unitConversion.UnitConversionDTO; 
 | 
import com.moral.api.pojo.dto.unitConversion.UnitConversionQueryDTO; 
 | 
import com.moral.api.pojo.form.unitConversion.UnitConversionDeleteForm; 
 | 
import com.moral.api.pojo.form.unitConversion.UnitConversionInsertForm; 
 | 
import com.moral.api.pojo.form.unitConversion.UnitConversionQueryForm; 
 | 
import com.moral.api.pojo.form.unitConversion.UnitConversionUpdateForm; 
 | 
import com.moral.api.service.SensorService; 
 | 
import com.moral.api.service.SysDictDataService; 
 | 
import com.moral.api.service.UnitConversionService; 
 | 
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 
 | 
import com.moral.api.util.CacheUtils; 
 | 
import com.moral.api.util.LogUtils; 
 | 
import com.moral.constant.Constants; 
 | 
import com.moral.constant.RedisConstants; 
 | 
import com.moral.constant.ResponseCodeEnum; 
 | 
import com.moral.util.ConvertUtils; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.data.redis.core.RedisTemplate; 
 | 
import org.springframework.stereotype.Service; 
 | 
import org.springframework.transaction.annotation.Transactional; 
 | 
import org.springframework.util.ObjectUtils; 
 | 
  
 | 
import java.util.ArrayList; 
 | 
import java.util.List; 
 | 
import java.util.Map; 
 | 
  
 | 
/** 
 | 
 * <p> 
 | 
 * 单位转换表 服务实现类 
 | 
 * </p> 
 | 
 * 
 | 
 * @author moral 
 | 
 * @since 2021-05-11 
 | 
 */ 
 | 
@Service 
 | 
public class UnitConversionServiceImpl extends ServiceImpl<UnitConversionMapper, UnitConversion> implements UnitConversionService { 
 | 
  
 | 
    @Autowired 
 | 
    UnitConversionMapper unitConversionMapper; 
 | 
    @Autowired 
 | 
    SysDictDataService sysDictDataService; 
 | 
    @Autowired 
 | 
    RedisTemplate redisTemplate; 
 | 
    @Autowired 
 | 
    SensorService sensorService; 
 | 
  
 | 
  
 | 
    @Override 
 | 
    @Transactional 
 | 
    public UnitConversionDTO insertUnitConversion(UnitConversionInsertForm form) { 
 | 
        //创建返回对象 
 | 
        UnitConversionDTO dto = new UnitConversionDTO(); 
 | 
        //取参 
 | 
        UnitConversion unitConversion = form.formConvertEntity(); 
 | 
        //判断原单位和目标单位计算公式是否已经存在于数据库 
 | 
        QueryWrapper<UnitConversion> existWrapper = new QueryWrapper(); 
 | 
        existWrapper.eq("original_unit_key", unitConversion.getOriginalUnitKey()); 
 | 
        existWrapper.eq("target_unit_key", unitConversion.getTargetUnitKey()); 
 | 
        existWrapper.eq("is_delete", Constants.NOT_DELETE); 
 | 
        List<UnitConversion> unitConversions = unitConversionMapper.selectList(existWrapper); 
 | 
        if (ObjectUtils.isEmpty(unitConversion.getSensorCode())) { 
 | 
            if (!ObjectUtils.isEmpty(unitConversions)) { 
 | 
                dto.setCode(ResponseCodeEnum.UNIT_CONVERSION_EXIST.getCode()); 
 | 
                dto.setMsg(ResponseCodeEnum.UNIT_CONVERSION_EXIST.getMsg()); 
 | 
                return dto; 
 | 
            } 
 | 
        } 
 | 
        if (!ObjectUtils.isEmpty(unitConversion.getSensorCode())) { 
 | 
            for (UnitConversion conversion : unitConversions) { 
 | 
                if (ObjectUtils.isEmpty(conversion.getSensorCode())||conversion.getSensorCode().equals(unitConversion.getSensorCode())) { 
 | 
                    dto.setCode(ResponseCodeEnum.UNIT_CONVERSION_EXIST.getCode()); 
 | 
                    dto.setMsg(ResponseCodeEnum.UNIT_CONVERSION_EXIST.getMsg()); 
 | 
                    return dto; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        //插入数据 
 | 
        unitConversionMapper.insert(unitConversion); 
 | 
        //刷新缓存 
 | 
        refreshCache(); 
 | 
        //插入日志 
 | 
        insertLog(unitConversion); 
 | 
        //封装返回数据 
 | 
        dto.setCode(ResponseCodeEnum.SUCCESS.getCode()); 
 | 
        dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg()); 
 | 
        return dto; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public UnitConversionQueryDTO queryUnitConversion(UnitConversionQueryForm form) { 
 | 
        //创建返回对象 
 | 
        UnitConversionQueryDTO dto = new UnitConversionQueryDTO(); 
 | 
        //取参 
 | 
        Integer page = form.getPage(); 
 | 
        Integer size = form.getSize(); 
 | 
        String order = form.getOrder(); 
 | 
        String orderType = form.getOrderType(); 
 | 
        Integer isDelete = form.getIsDelete(); 
 | 
        Integer originalUnitKey = form.getOriginalUnitKey(); 
 | 
        Integer targetUnitKey = form.getTargetUnitKey(); 
 | 
        //组装查询条件 
 | 
        Page<UnitConversion> queryPage = new Page<>(page, size); 
 | 
        NullFilterWrapper<UnitConversion> wrapper = new NullFilterWrapper<>(); 
 | 
        wrapper.eq("original_unit_key", originalUnitKey); 
 | 
        wrapper.eq("target_unit_key", targetUnitKey); 
 | 
        //排序顺序条件构造 
 | 
        if (!ObjectUtils.isEmpty(order) && !ObjectUtils.isEmpty(orderType)) { 
 | 
            if (orderType.equals(Constants.ORDER_ASC)) 
 | 
                wrapper.orderByAsc(ConvertUtils.toLine(order)); 
 | 
            else 
 | 
                wrapper.orderByDesc(ConvertUtils.toLine(order)); 
 | 
        } 
 | 
        //逻辑删除条件构造 
 | 
        if (!ObjectUtils.isEmpty(isDelete)) 
 | 
            wrapper.eq("is_delete", isDelete); 
 | 
        else 
 | 
            wrapper.eq("is_delete", Constants.NOT_DELETE); 
 | 
        //查询结果 
 | 
        Page<UnitConversion> resultPage = unitConversionMapper.selectPage(queryPage, wrapper); 
 | 
        List<UnitConversion> records = resultPage.getRecords(); 
 | 
        //查询每条数据对应的原单位对象和目标单位对象 
 | 
        Map<String, SysDictData> dictDatas = sysDictDataService.getDictDatasByType(Constants.SYSTEM_DICT_TYPE_UNIT); 
 | 
        List<UnitConversionDTO> dtos = new ArrayList<>(); 
 | 
        for (UnitConversion record : records) { 
 | 
            UnitConversionDTO unitConversionDTO = new UnitConversionDTO(); 
 | 
            SysDictData originalUnit = dictDatas.get(record.getOriginalUnitKey()); 
 | 
            SysDictData targetUnit = dictDatas.get(record.getTargetUnitKey()); 
 | 
            unitConversionDTO.setUnitConversion(record); 
 | 
            unitConversionDTO.setOriginalUnit(originalUnit); 
 | 
            unitConversionDTO.setTargetUnit(targetUnit); 
 | 
            dtos.add(unitConversionDTO); 
 | 
        } 
 | 
        //封装返回对象 
 | 
        dto.setUnitConversionDTOs(dtos); 
 | 
        dto.setCurrent(resultPage.getCurrent()); 
 | 
        dto.setPages(resultPage.getPages()); 
 | 
        dto.setSize(resultPage.getSize()); 
 | 
        dto.setTotal(resultPage.getTotal()); 
 | 
        dto.setCode(ResponseCodeEnum.SUCCESS.getCode()); 
 | 
        dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg()); 
 | 
        return dto; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    @Transactional 
 | 
    public UnitConversionDTO updateUnitConversion(UnitConversionUpdateForm form) { 
 | 
        //创建返回对象 
 | 
        UnitConversionDTO dto = new UnitConversionDTO(); 
 | 
        //取参 
 | 
        UnitConversion unitConversion = form.formConvertEntity(); 
 | 
        //查找要更新的公式 用于插入日志 
 | 
        QueryWrapper<UnitConversion> oldWrapper = new QueryWrapper<>(); 
 | 
        UnitConversion oldUnitConversion = new UnitConversion(); 
 | 
        oldUnitConversion.setId(unitConversion.getId()); 
 | 
        oldUnitConversion.setIsDelete(Constants.NOT_DELETE); 
 | 
        oldWrapper.setEntity(oldUnitConversion); 
 | 
        oldUnitConversion = unitConversionMapper.selectOne(oldWrapper); 
 | 
        //更新 
 | 
        unitConversionMapper.updateById(unitConversion); 
 | 
        //刷新缓存 
 | 
        refreshCache(); 
 | 
        //操作插入日志 
 | 
        updateLog(oldUnitConversion,form.getFormula()); 
 | 
        //封装返回结果 
 | 
        dto.setCode(ResponseCodeEnum.SUCCESS.getCode()); 
 | 
        dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg()); 
 | 
        return dto; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    @Transactional 
 | 
    public UnitConversionDTO deleteUnitConversion(UnitConversionDeleteForm form) { 
 | 
        //创建返回对象 
 | 
        UnitConversionDTO dto = new UnitConversionDTO(); 
 | 
        //取参 
 | 
        Integer id = form.getId(); 
 | 
        //查询要删除的公式用于插入日志 
 | 
        QueryWrapper<UnitConversion> oldWrapper = new QueryWrapper<>(); 
 | 
        UnitConversion oldUnitConversion = new UnitConversion(); 
 | 
        oldUnitConversion.setId(id); 
 | 
        oldUnitConversion.setIsDelete(Constants.NOT_DELETE); 
 | 
        oldWrapper.setEntity(oldUnitConversion); 
 | 
        oldUnitConversion = unitConversionMapper.selectOne(oldWrapper); 
 | 
        //执行逻辑删除 
 | 
        UpdateWrapper deleteWrapper = new UpdateWrapper(); 
 | 
        deleteWrapper.set("is_delete", Constants.DELETE); 
 | 
        deleteWrapper.eq("id", id); 
 | 
        unitConversionMapper.update(null, deleteWrapper); 
 | 
        //刷新缓存 
 | 
        refreshCache(); 
 | 
        //操作插入日志 
 | 
        deleteLog(oldUnitConversion); 
 | 
        //封装返回对象 
 | 
        dto.setCode(ResponseCodeEnum.SUCCESS.getCode()); 
 | 
        dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg()); 
 | 
        return dto; 
 | 
    } 
 | 
  
 | 
    /*刷新缓存*/ 
 | 
    @Override 
 | 
    public void refreshCache(){ 
 | 
        //刷新设备缓存 
 | 
        CacheUtils.refreshDeviceAlarmInfo(); 
 | 
        redisTemplate.delete((RedisConstants.UNIT_CONVERSION)); 
 | 
        QueryWrapper<UnitConversion> queryWrapper = new QueryWrapper<>(); 
 | 
        queryWrapper.eq("is_delete",Constants.NOT_DELETE); 
 | 
        List<UnitConversion> unitConversions = unitConversionMapper.selectList(queryWrapper); 
 | 
        if(!ObjectUtils.isEmpty(unitConversions)) 
 | 
            redisTemplate.opsForList().leftPushAll(RedisConstants.UNIT_CONVERSION,unitConversions); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
    * @Description: 插入操作插入日志 
 | 
            * @Param: [unitConversion] 
 | 
            * @return: void 
 | 
            * @Author: 陈凯裕 
 | 
            * @Date: 2021/8/26 
 | 
            */ 
 | 
    private void insertLog(UnitConversion unitConversion){ 
 | 
        //获取单位字典数据 
 | 
        Map<String, SysDictData> units = sysDictDataService.getDictDatasByType("unit"); 
 | 
        String originalUnitKey = unitConversion.getOriginalUnitKey(); 
 | 
        String targetUnitKey = unitConversion.getTargetUnitKey(); 
 | 
        SysDictData originalData = units.get(originalUnitKey); 
 | 
        SysDictData targetData = units.get(targetUnitKey); 
 | 
        String formula = unitConversion.getFormula(); 
 | 
        //公式转换格式 
 | 
        formula = formula.replace(Constants.FORMULA_PLACEHOLDER, "源单位"); 
 | 
        formula = "目标单位"+" = "+formula; 
 | 
        String sensorCode = unitConversion.getSensorCode(); 
 | 
        StringBuilder content = new StringBuilder(); 
 | 
        content.append("添加了单位转换数据;"); 
 | 
        content.append("源单位:"+originalData.getDataValue()+";"); 
 | 
        content.append("目标单位:"+targetData.getDataValue()+";"); 
 | 
        content.append("转换公式:"+formula+";"); 
 | 
        if(sensorCode!=null){ 
 | 
            Sensor sensor = sensorService.getSensorByCode(sensorCode); 
 | 
            if(sensor!=null) 
 | 
                content.append("针对因子:"+sensor.getName()+";"); 
 | 
        } 
 | 
  
 | 
        LogUtils.saveOperationForManage(content.toString(),Constants.INSERT_OPERATE_TYPE); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
    * @Description: 删除操作插入日志 
 | 
            * @Param: [unitConversion] 
 | 
            * @return: void 
 | 
            * @Author: 陈凯裕 
 | 
            * @Date: 2021/8/26 
 | 
            */ 
 | 
    private void deleteLog(UnitConversion unitConversion){ 
 | 
        //获取单位字典数据 源单位 目标单位名称 
 | 
        Map<String, SysDictData> units = sysDictDataService.getDictDatasByType("unit"); 
 | 
        String originalUnitKey = unitConversion.getOriginalUnitKey(); 
 | 
        String targetUnitKey = unitConversion.getTargetUnitKey(); 
 | 
        SysDictData originalData = units.get(originalUnitKey); 
 | 
        SysDictData targetData = units.get(targetUnitKey); 
 | 
        //公式转换格式 
 | 
        String formula = unitConversion.getFormula(); 
 | 
        formula = formula.replace(Constants.FORMULA_PLACEHOLDER, "源单位"); 
 | 
        formula = "目标单位"+" = "+formula; 
 | 
  
 | 
        StringBuilder content = new StringBuilder("删除了转换公式;"); 
 | 
        content.append("源单位:"+originalData.getDataValue()+";"); 
 | 
        content.append("目标单位:"+targetData.getDataValue()+";"); 
 | 
        content.append("转换公式:"+formula+";"); 
 | 
        //如果有针对因子则获取针对因子名称 
 | 
        String sensorCode = unitConversion.getSensorCode(); 
 | 
        if(sensorCode!=null){ 
 | 
            Sensor sensor = sensorService.getSensorByCode(sensorCode); 
 | 
            if(sensor!=null) 
 | 
                content.append("针对因子:"+sensor.getName()+";"); 
 | 
        } 
 | 
        LogUtils.saveOperationForManage(content.toString(),Constants.DELETE_OPERATE_TYPE); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
    * @Description: 更新操作插入日志 
 | 
            * @Param: [unitConversion] 
 | 
            * @return: void 
 | 
            * @Author: 陈凯裕 
 | 
            * @Date: 2021/8/26 
 | 
            */ 
 | 
    private void updateLog(UnitConversion oldUnitConversion,String newFormular){ 
 | 
        StringBuilder content = new StringBuilder("修改了单位转换公式;"); 
 | 
        //获取单位字典数据 源单位 目标单位名称 
 | 
        Map<String, SysDictData> units = sysDictDataService.getDictDatasByType("unit"); 
 | 
        String originalUnitKey = oldUnitConversion.getOriginalUnitKey(); 
 | 
        String targetUnitKey = oldUnitConversion.getTargetUnitKey(); 
 | 
        SysDictData originalData = units.get(originalUnitKey); 
 | 
        SysDictData targetData = units.get(targetUnitKey); 
 | 
        //新公式转换格式 
 | 
        newFormular = newFormular.replace(Constants.FORMULA_PLACEHOLDER, "源单位"); 
 | 
        newFormular = "目标单位"+" = "+newFormular; 
 | 
        //旧公式转换 
 | 
        String oldFormula = oldUnitConversion.getFormula(); 
 | 
        oldFormula = oldFormula.replace(Constants.FORMULA_PLACEHOLDER, "源单位"); 
 | 
        oldFormula = "目标单位"+" = "+oldFormula; 
 | 
  
 | 
        content.append("源单位:"+originalData.getDataValue()+";"); 
 | 
        content.append("目标单位:"+targetData.getDataValue()+";"); 
 | 
        content.append("转换公式:"+oldFormula+"->"+newFormular+";"); 
 | 
        //如果有针对因子则获取针对因子名称 
 | 
        String sensorCode = oldUnitConversion.getSensorCode(); 
 | 
        if(sensorCode!=null){ 
 | 
            Sensor sensor = sensorService.getSensorByCode(sensorCode); 
 | 
            if(sensor!=null) 
 | 
                content.append("针对因子:"+sensor.getName()+";"); 
 | 
        } 
 | 
        LogUtils.saveOperationForManage(content.toString(),Constants.UPDATE_OPERATE_TYPE); 
 | 
    } 
 | 
} 
 |