package com.om.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.om.entity.dto.AppBaseDTO;
import com.om.entity.dto.BrandDTO;
import com.om.entity.dto.BrandQueryPageDTO;
import com.om.entity.dto.GuidDTO;
import com.om.entity.po.Brand;
import com.om.entity.po.BrandClient;
import com.om.entity.po.Client;
import com.om.entity.vo.APPBrandVO;
import com.om.entity.vo.BrandQueryPageVO;
import com.om.entity.vo.BrandVO;
import com.om.exception.BadReqException;
import com.om.mapper.BrandMapper;
import com.om.service.IBrandClientService;
import com.om.service.IBrandService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.om.service.IClientService;
import com.om.utils.*;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* 服务实现类
*
*
* @author bmmx
* @since 2024-02-07
*/
@Service
public class BrandServiceImpl extends ServiceImpl implements IBrandService {
@Resource
private IBrandClientService brandClientService;
@Resource
private JwtUtils jwtUtils;
@Resource
private IClientService clientService;
@Override
@Transactional
public Result createBrand(BrandDTO dto) {
if (BeanUtil.isEmpty(dto)) {
throw new BadReqException("数据为空");
}
//保存品牌
Brand brand = BeanUtil.copyProperties(dto, Brand.class);
LocalDateTime now = LocalDateTime.now();
brand.setCreateTime(now);
brand.setUpdateTime(now);
this.save(brand);
//保存客户端和品牌的关联
List clientIds = dto.getClientIds();
if (!CollectionUtil.isEmpty(clientIds)) {
//重新查询一遍
Brand one = this.getById(brand);
List brandClients = new ArrayList<>();
for (Integer clientId : clientIds) {
BrandClient brandClient = new BrandClient();
brandClient.setBrandId(one.getId());
brandClient.setClientId(clientId);
brandClients.add(brandClient);
}
// 批量保存
brandClientService.saveBatch(brandClients);
}
return Result.ok();
}
@Override
@Transactional
public Result deleteBrand(Integer id) {
// 根据id查询数据库
Brand brand = this.getById(id);
// 判断是否存在
if (BeanUtil.isEmpty(brand)) {
throw new BadReqException("该品牌不存在");
}
//先 删除 品牌和客户端的关联表
List list = brandClientService.lambdaQuery()
.eq(BrandClient::getBrandId, brand.getId())
.list();
if (!CollectionUtil.isEmpty(list)) {
List collect = list.stream().map(c -> c.getId()).collect(Collectors.toList());
brandClientService.removeByIds(collect);
}
//删除品牌表
this.removeById(brand);
return Result.ok();
}
@Override
public Result queryById(Integer id) {
//根据id查询
Brand brand = this.getById(id);
//判断是否存在
if (BeanUtil.isEmpty(brand)) {
throw new BadReqException("该品牌不存在");
}
//封装vo
BrandVO brandVO = BeanUtil.copyProperties(brand, BrandVO.class);
//查询 品牌和客户端的关联表
List list = brandClientService.lambdaQuery()
.eq(BrandClient::getBrandId, id)
.list();
if (!CollectionUtil.isEmpty(list)) {
List clientIds = list.stream().map(c -> c.getClientId()).collect(Collectors.toList());
brandVO.setClientIds(clientIds);
}
return Result.ok(brandVO);
}
@Override
@Transactional
public Result updateBrand(BrandDTO dto) {
if (BeanUtil.isEmpty(dto)) {
throw new BadReqException("数据为空");
}
//修改品牌
//根据dto查询数据库
Brand brand = this.getById(dto.getId());
if (BeanUtil.isEmpty(brand)) {
throw new BadReqException("该品牌不存在");
}
BeanUtil.copyProperties(dto, brand);
LocalDateTime now = LocalDateTime.now();
brand.setUpdateTime(now);
this.updateById(brand);
//修改 客户端和品牌的关联
//先删除 后新增
//批量查询
List brandClients = brandClientService.lambdaQuery()
.eq(BrandClient::getBrandId, brand.getId())
.list();
if (!CollectionUtil.isEmpty(brandClients)) {
//删除
List ids = brandClients.stream().map(c -> c.getId()).collect(Collectors.toList());
brandClientService.removeByIds(ids);
}
//新增
List clientIds = dto.getClientIds();
if (!CollectionUtil.isEmpty(clientIds)) {
List brandClientList = new ArrayList<>();
for (Integer clientId : clientIds) {
BrandClient brandClient = new BrandClient();
brandClient.setClientId(clientId);
brandClient.setBrandId(brand.getId());
brandClientList.add(brandClient);
}
// 批量保存
brandClientService.saveBatch(brandClientList);
}
return Result.ok();
}
@Override
public Result> queryList() {
List list = this.list();
List brandVOS = BeanUtil.copyToList(list, BrandVO.class);
if (CollectionUtil.isEmpty(brandVOS)) {
return Result.ok(Collections.emptyList());
}
//根据品牌ids 批量查询
for (BrandVO brandVO : brandVOS) {
List brandClients = brandClientService.lambdaQuery()
.eq(BrandClient::getBrandId, brandVO.getId())
.list();
List collect = brandClients.stream().map(c -> c.getClientId()).collect(Collectors.toList());
brandVO.setClientIds(collect);
}
return Result.ok(brandVOS);
}
@Override
public Result queryPageList(BrandQueryPageDTO dto) {
//从dto中取数据
Integer pageIndex = dto.getPageIndex();
Integer pageSize = dto.getPageSize();
String searchCn = dto.getSearchCn();
String searchEn = dto.getSearchEn();
//分页查询
Page page = this.lambdaQuery()
.like(searchCn != null, Brand::getBrandCn, searchCn)
.like(searchEn != null, Brand::getBrandEn, searchEn)
.orderByDesc(Brand::getCreateTime)
.page(new Page<>(pageIndex, pageSize));
//封装vo
BrandQueryPageVO brandQueryPageVO = new BrandQueryPageVO();
brandQueryPageVO.setCurrent((int) page.getCurrent());
brandQueryPageVO.setSize((int) page.getSize());
brandQueryPageVO.setPages((int) page.getPages());
brandQueryPageVO.setTotal((int) page.getTotal());
if (searchCn !=null || searchEn !=null){
brandQueryPageVO.setSearchCount(true);
}
List records = page.getRecords();
List list = new ArrayList<>();
for (Brand record : records) {
BrandVO brandVO = BeanUtil.copyProperties(record, BrandVO.class);
//根据id查询 关联表
List clients = brandClientService.lambdaQuery()
.eq(BrandClient::getBrandId, record.getId())
.list();
if (!CollectionUtil.isEmpty(clients)){
List collect = clients.stream().map(c -> c.getClientId()).collect(Collectors.toList());
brandVO.setClientIds(collect);
}
list.add(brandVO);
}
brandQueryPageVO.setRecords(list);
return Result.ok(brandQueryPageVO);
}
@Override
public Result getAPPList(AppBaseDTO dto) {
if (BeanUtil.isEmpty(dto)){
return Result.fail("未获取到数据").result(ResultCode.NO_DATA);
}
String guid = dto.getGuid();
GuidDTO guidDTO = AesUtil.getGuidDTOFromGuid(guid);
String clientNum = guidDTO.getClientNum();
//根据客户端编号查询客户端id
Client client = clientService.lambdaQuery()
.eq(Client::getNumber, clientNum)
.one();
if (BeanUtil.isEmpty(client)){
throw new BadReqException("该客户端不存在!!");
}
//根据客户端id查询品牌客户端关联表
List brandClients = brandClientService.lambdaQuery()
.eq(BrandClient::getClientId, client.getId())
.list();
List brandids = brandClients.stream().map(c -> c.getBrandId()).collect(Collectors.toList());
if (brandids.isEmpty()){
return Result.ok();
}
List brands = this.listByIds(brandids);
List brandVOS = new ArrayList<>();
for (Brand brand : brands) {
APPBrandVO brandVO = BeanUtil.copyProperties(brand, APPBrandVO.class);
//查询brand_client
List clientIds = brandClientService.lambdaQuery()
.eq(BrandClient::getBrandId, brand.getId())
.list().stream().map(c -> c.getClientId()).collect(Collectors.toList());
if (clientIds.isEmpty()){
throw new BadReqException("该品牌下没有查询到客户端");
}
brandVO.setClientIds(clientIds);
brandVO.setCreateTime(brand.getCreateTime().toInstant(ZoneOffset.of("+8")).toEpochMilli());
brandVOS.add(brandVO);
}
return Result.ok(brandVOS);
}
}