package com.huimv.admin.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.NumberUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.api.R;
import com.huimv.admin.common.utils.Result;
import com.huimv.admin.common.utils.ResultCode;
import com.huimv.admin.common.utils.ResultUtil;
import com.huimv.admin.entity.BasePigpen;
import com.huimv.admin.entity.EnergyEnvDevice;
import com.huimv.admin.entity.EnvDevice;
import com.huimv.admin.entity.dto.BasePigpenDto;
import com.huimv.admin.entity.vo.TreeBasePigpen;
import com.huimv.admin.mapper.BasePigpenMapper;
import com.huimv.admin.mapper.EnergyEnvDeviceMapper;
import com.huimv.admin.mapper.EnvDeviceMapper;
import com.huimv.admin.service.IBasePigpenService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
*
* 服务实现类
*
*
* @author author
* @since 2023-02-13
*/
@Service
public class BasePigpenServiceImpl extends ServiceImpl implements IBasePigpenService {
@Autowired
private BasePigpenMapper basePigpenMapper;
@Autowired
private EnvDeviceMapper envDeviceMapper;
@Autowired
private EnergyEnvDeviceMapper energyEnvDeviceMapper;
@Override
@Transactional
public Result addPigpen(BasePigpenDto basePigpenDto) {
Integer num = basePigpenMapper.selectCount(new QueryWrapper().eq("build_name", basePigpenDto.getBuildName())
.eq("farm_id", basePigpenDto.getFarmId()).ne("other3",1));
if (num > 0) {
return new Result(10001, "栋舍名称已存在!", false);
}
BasePigpen basePigpen = new BasePigpen();
BeanUtil.copyProperties(basePigpenDto, basePigpen);
basePigpen.setParentId(0);
basePigpen.setFType(1);
basePigpen.setOther2("0");
int insert = basePigpenMapper.insert(basePigpen);
Integer id = basePigpen.getId();
String buildName = basePigpen.getBuildName();
Integer floorNum = basePigpenDto.getFloorNum();
for (Integer integer = 1; integer <= floorNum; integer++) {
BasePigpen basePigpen1 = new BasePigpen();
basePigpen1.setFType(2);
basePigpen1.setParentId(id);
basePigpen1.setBuildName(buildName + Convert.numberToChinese(integer, false) + "层");
basePigpen1.setOther1(Convert.numberToChinese(integer, false) + "层");
basePigpen1.setOther2("0," + id);
basePigpen1.setFarmId(basePigpen.getFarmId());
basePigpen1.setStageCode(basePigpen.getStageCode());
basePigpenMapper.insert(basePigpen1);
}
return ResultUtil.addResult(insert);
}
@Override
@Transactional
public Result updatePigpen(BasePigpen basePigpen) {
Integer num = basePigpenMapper.selectCount(new QueryWrapper().eq("build_name", basePigpen.getBuildName())
.eq("farm_id", basePigpen.getFarmId()).ne("id", basePigpen.getId()).ne("other3",1));
if (num > 0) {
return new Result(10001, "栋舍名称已存在!", false);
}
basePigpenMapper.updateById(basePigpen);
Integer id = basePigpen.getId();
List parentId = basePigpenMapper.selectList(new QueryWrapper().eq("parent_id", id));
String buildName = basePigpen.getBuildName();
if (StringUtils.isNotBlank(buildName)) {
for (BasePigpen pigpen : parentId) {
String other1 = pigpen.getOther1();
pigpen.setBuildName(buildName + other1);
basePigpenMapper.updateById(pigpen);
}
}
return ResultUtil.updateResult(1);
}
@Override
@Transactional
public Result deletePigpen(Map map) {
Integer integer = map.get("id");
Integer count1 = energyEnvDeviceMapper.selectCount(new QueryWrapper().eq("unit_id", integer));
Integer integer1 = envDeviceMapper.selectCount(new QueryWrapper().eq("unit_id", integer));
if (integer1 > 0) {
return new Result(10001, "删除失败,该栋舍下有温湿度采集器", false);
}
if (count1 > 0) {
return new Result(10001, "删除失败,该栋舍下有水电表", false);
}
List other2 = basePigpenMapper.selectList(new QueryWrapper().like("other2", integer));
for (BasePigpen basePigpen : other2) {
Integer count = envDeviceMapper.selectCount(new QueryWrapper().eq("unit_id", basePigpen.getId()));
Integer integer2 = envDeviceMapper.selectCount(new QueryWrapper().eq("unit_id", integer));
if (count > 0) {
return new Result(10001, "删除失败,该栋舍下有温湿度采集器", false);
}
if (integer2 > 0) {
return new Result(10001, "删除失败,该栋舍下有水电表", false);
}
basePigpenMapper.deleteById(basePigpen.getId());
}
basePigpenMapper.deleteById(integer);
return ResultUtil.deleteResult(1);
}
@Override
public Result list(String farmCode, String buildName, String stageCode, String type) {
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.like(StringUtils.isNotBlank(buildName), "build_name", buildName);
queryWrapper.like(StringUtils.isNotBlank(stageCode), "stage_code", stageCode);
queryWrapper.eq(StringUtils.isNotBlank(farmCode), "farm_id", farmCode);
queryWrapper.eq("other3", type);
queryWrapper.orderByAsc("sort");
//创建排序
List basePigpens = basePigpenMapper.selectList(queryWrapper);
//将结果List改为树
List treeBasePigpens = parseBizBaseArea(basePigpens);
return new Result(ResultCode.SUCCESS, treeBasePigpens);
}
/**
* 查询结果 转换成树形结构
*
* @param bizBaseAreas 原始数据
* @return 树
*/
private List parseBizBaseArea(List bizBaseAreas) {
//构建需要展示的树形节点结构
Map nodeMap = bizBaseAreas.stream().map(basePigpen -> {
TreeBasePigpen baseVo = new TreeBasePigpen();
baseVo.setId(basePigpen.getId() + "");
baseVo.setFarmCode(basePigpen.getFarmId());
baseVo.setParentId(basePigpen.getParentId());
baseVo.setSort(basePigpen.getSort());
baseVo.setStageCode(basePigpen.getStageCode());
baseVo.setPigpenName(basePigpen.getBuildName());
baseVo.setType(basePigpen.getFType());
baseVo.setChildNode(new ArrayList<>());
return baseVo;
}).collect(Collectors.toMap(TreeBasePigpen::getId, b -> b, (k1, k2) -> k1));
//创建数组存父亲节点
ArrayList roots = new ArrayList<>();
//构建树形
nodeMap.values().forEach(item -> {
String parentCode = item.getParentId() + "";
if (nodeMap.get(parentCode) == null) {
//父节点为空,说明当前节点就已经是父节点了 将该节点存起来
roots.add(item);
} else {
//父节点 不为空,说明有父节点,拿到该节点的父节点的孩子节点(就是我自己),将该节点存起来
nodeMap.get(parentCode).getChildNode().add(item);
}
});
return roots;
}
}