package com.fdkankan.manage.service.impl;
import com.alibaba.nacos.shaded.org.checkerframework.checker.units.qual.A;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fdkankan.common.constant.Constant;
import com.fdkankan.common.constant.ErrorCode;
import com.fdkankan.common.exception.BusinessException;
import com.fdkankan.common.response.PageInfo;
import com.fdkankan.common.util.DateUtil;
import com.fdkankan.manage.common.CameraTypeEnum;
import com.fdkankan.manage.constant.CameraConstant;
import com.fdkankan.manage.entity.Camera;
import com.fdkankan.manage.entity.CameraDetail;
import com.fdkankan.manage.entity.Company;
import com.fdkankan.manage.mapper.ICameraMapper;
import com.fdkankan.manage.service.*;
import com.fdkankan.manage.util.Dateutils;
import com.fdkankan.manage.vo.request.CameraInOutParam;
import com.fdkankan.manage.vo.request.CameraParam;
import com.fdkankan.manage.vo.response.CameraDetailVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* 相机主表 服务实现类
*
*
* @author
* @since 2022-06-16
*/
@Service
public class CameraServiceImpl extends ServiceImpl implements ICameraService {
@Autowired
ICameraDetailService cameraDetailService;
@Autowired
ISceneService sceneService;
@Autowired
ISceneProService sceneProService;
@Autowired
IUserIncrementService userIncrementService;
@Autowired
ISceneResourceCameraService sceneResourceCameraService;
@Autowired
IScenePlusService scenePlusService;
@Autowired
ICompanyService companyService;
@Value("${upload.type}")
private String ossType;
@Override
public List getListByCameraIdList(List cameraIdList) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.in(Camera::getId,cameraIdList);
return this.list(wrapper);
}
@Override
public Camera getBySnCode(String snCode) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Camera::getSnCode,snCode);
List list = this.list(wrapper);
if(list == null || list.size() <=0 ){
return null;
}
return list.get(0);
}
private List getBySnCodes(List snCodeList) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.in(Camera::getSnCode,snCodeList);
return this.list(wrapper);
}
@Override
public void unbindCamera(Long cameraId) {
cameraDetailService.unbindCamera(cameraId); //取消相机用户关联
userIncrementService.unbindCamera(cameraId); //取消关联用户权益
sceneService.unbindCamera(cameraId); //取消关联场景
sceneProService.unbindCamera(cameraId); //取消关联场景
scenePlusService.unbindCamera(cameraId); //取消关联场景
sceneResourceCameraService.unbindCamera(cameraId); //删除协作相机
}
@Override
public PageInfo pageList(CameraParam param) {
Page voPage = this.getBaseMapper().pageList(new Page<>(param.getPageNum(),param.getPageSize()),param);
return PageInfo.PageInfo(voPage);
}
@Override
public void in(String wifiName) {
if(StringUtils.isEmpty(wifiName) ){
throw new BusinessException(ErrorCode.MISSING_REQUIRED_PARAMETERS);
}
if( !wifiName.contains("_") || !wifiName.contains("4D")){
throw new BusinessException(-1,"wifi名称格式错误");
}
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Camera::getWifiName,wifiName);
long count = this.count(wrapper);
if(count > 0){
throw new BusinessException(-1,"设备wifi名称重复");
}
saveBatchCamera(Collections.singletonList(wifiName));
}
private Integer saveBatchCamera(List wifiNameList){
HashSet wifiNameSet = new HashSet<>(wifiNameList);
List cameraList = new ArrayList<>();
for (String wifiName : wifiNameSet) {
String[] res = wifiName.split("_");
Camera camera = new Camera();
camera.setWifiName(wifiName);
camera.setSnCode(res[1]);
camera.setChildName(res[1]);
camera.setWifiPassword(CameraConstant.WIFI_PASSWORD_VALUE);
camera.setChildPassword(CameraConstant.CHILD_PASSWORD_VALUE);
camera.setActivatedTime(DateUtil.date2String(new Date(),DateUtil.DEFAULT_DATE_FORMAT));
cameraList.add(camera);
}
this.saveBatch(cameraList);
List cameraDetailList = new ArrayList<>();
for (Camera camera : cameraList) {
String wifiName = camera.getWifiName();
Integer type = CameraTypeEnum.getTypeByWifiNamePrefix(wifiName.substring(0,wifiName.lastIndexOf("_") +1));
if(type == null){
throw new BusinessException(-1,"wifi名称前缀错误!");
}
CameraDetail cameraDetail = new CameraDetail();
cameraDetail.setAgency(CameraConstant.DEFAULT_AGENT);
cameraDetail.setCameraId(camera.getId());
cameraDetail.setCountry(0);//默认中国
if("aws".equals(ossType)){
cameraDetail.setCountry(1);//1-国外
}
cameraDetail.setType(type);
if (1 == cameraDetail.getType() || 9 == cameraDetail.getType() || 10 == cameraDetail.getType()){
cameraDetail.setTotalSpace(Long.valueOf(Constant.CAMERA_BASE_SPACE_VALUE));
cameraDetail.setUsedSpace(0L);
}
if(type != 9 && type != 10){
type = type == 0 ? 1: 4;
}
cameraDetail.setGoodsId(Long.valueOf(type));
cameraDetailList.add(cameraDetail);
}
return cameraDetailService.saveBatch(cameraDetailList) ? cameraList.size() : 0;
}
@Override
public Integer ins(List wifiNameList){
List errorRow = getErrorRow(wifiNameList, null);
getResultIn(errorRow);
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.in(Camera::getWifiName,wifiNameList);
List list = this.list(wrapper);
if(list.size() >0){
List newList = list.parallelStream().map(Camera::getWifiName).collect(Collectors.toList());
List errorRow2 = getErrorRow(wifiNameList, newList);
getResultIn(errorRow2);
}
return saveBatchCamera(wifiNameList);
}
private void getResultIn(List errorList){
if(errorList.size() <=0){
return;
}
StringBuilder res = new StringBuilder("第");
for (Integer index : errorList) {
res.append(index).append(",");
}
res.deleteCharAt(res.lastIndexOf(","));
res.append("行存在错误");
throw new BusinessException(-1, res.toString());
}
private List getErrorRow(List wifiNameList, List newList){
List errorIndexList = new ArrayList<>();
boolean bo = false;
if(newList == null){
newList = wifiNameList;
bo = true;
}
for (String wifiName : newList) {
int index = wifiNameList.indexOf(wifiName) + 3;
if(bo){
if( !wifiName.contains("_") || !wifiName.contains("4D")
|| !CameraTypeEnum.typePrefixMap.containsKey(wifiName.split("_")[0])){
errorIndexList.add(index);
}
}else {
errorIndexList.add(index);
}
}
return errorIndexList;
}
@Override
public void out(CameraInOutParam param) {
if(param.getOutType() == null || param.getCompanyName() == null || param.getId() == null){
throw new BusinessException(ErrorCode.MISSING_REQUIRED_PARAMETERS);
}
Company company = companyService.getCompanyByName(param.getCompanyName());
if(company == null){
throw new BusinessException(-1,"客户名称不存在");
}
param.setCompanyId(company.getId());
Camera camera = this.getById(param.getId());
if(camera == null){
throw new BusinessException(-1,"相机不存在");
}
CameraDetail detail = cameraDetailService.getByCameraId(camera.getId());
if(detail ==null){
throw new BusinessException(-1,"该相机未入库");
}
HashMap detailMap = new HashMap<>();
detailMap.put(detail.getCameraId().toString(),detail);
this.saveBatchDetail(detailMap, Collections.singletonList(param));
}
@Override
public Integer outs(List params){
setCompanyIdByDb(params);
HashMap resultMap = getResultMap(params);
HashMap detailMap = (HashMap) resultMap.get("detailMap");
return this.saveBatchDetail(detailMap,params);
}
private Integer saveBatchDetail(HashMap detailMap, List params){
List cameraDetails = new ArrayList<>();
for (CameraInOutParam param : params) {
CameraDetail cameraDetail = detailMap.get(param.getId().toString());
cameraDetail.setOrderSn(param.getOrderSn());
cameraDetail.setOwn(param.getOutType());
cameraDetail.setCompanyId(param.getCompanyId());
cameraDetail.setOutTime(Dateutils.getDate(new Date()));
cameraDetails.add(cameraDetail);
}
return cameraDetailService.saveOrUpdateBatch(cameraDetails) ? cameraDetails.size() : 0;
}
private void checkSnCode(List snCodeList) {
HashMap map = new HashMap<>();
for (String snCode : snCodeList) {
if(map.get(snCode) == null){
map.put(snCode,1);
}else {
map.put(snCode,2);
}
}
List errorSnCode = new ArrayList<>();
for (String snCode : map.keySet()) {
if(map.get(snCode) > 1){
errorSnCode.add(snCode);
}
}
if(errorSnCode.size() >0){
throw new BusinessException(-1,"存在重复的snCode:"+errorSnCode);
}
}
@Override
public void updateCamera(CameraInOutParam param) {
if(param.getId() == null|| param.getOutType() == null){
throw new BusinessException(ErrorCode.MISSING_REQUIRED_PARAMETERS);
}
CameraDetail cameraDetail = cameraDetailService.getByCameraId(param.getId());
if(cameraDetail == null){
throw new BusinessException(ErrorCode.MISSING_REQUIRED_PARAMETERS);
}
if(StringUtils.isNotBlank(param.getCompanyName())){
Company company = companyService.getCompanyByName(param.getCompanyName());
if(company !=null){
cameraDetail.setCompanyId(company.getId());
}
}
cameraDetail.setOwn(param.getOutType());
cameraDetail.setOrderSn(param.getOrderSn());
cameraDetailService.updateById(cameraDetail);
}
@Override
public void deleteCamera(Long id) {
if(id == null){
throw new BusinessException(ErrorCode.MISSING_REQUIRED_PARAMETERS);
}
CameraDetail cameraDetail = cameraDetailService.getByCameraId(id);
if(cameraDetail !=null && cameraDetail.getUserId()!=null){
throw new BusinessException(-1,"相机已绑定,请先解绑后删除");
}
this.removeById(id);
cameraDetailService.deleteByCameraId(id);
}
@Override
public Integer updateCompany(List companyParams) {
setCompanyIdByDb(companyParams);
HashMap resultMap = getResultMap(companyParams);
HashMap detailMap = (HashMap) resultMap.get("detailMap");
HashMap snCodeMap = (HashMap) resultMap.get("snCodeMap");
List updateDetailList = new ArrayList<>();
for (CameraInOutParam companyParam : companyParams) {
Camera camera = snCodeMap.get(companyParam.getSnCode());
CameraDetail cameraDetail = detailMap.get(camera.getId());
cameraDetail.setCompanyId(companyParam.getCompanyId());
updateDetailList.add(cameraDetail);
}
return cameraDetailService.updateBatchById(updateDetailList) ? updateDetailList.size() : 0;
}
private void setCompanyIdByDb(List companyParams){
List companyNames = companyParams.parallelStream().map(CameraInOutParam::getCompanyName).collect(Collectors.toList());
List companyList = companyService.getCompanyByNames(companyNames);
List dbCompanyNames = companyList.parallelStream().map(Company::getCompanyName).collect(Collectors.toList());
List errorRow = this.getErrorRow(companyNames, dbCompanyNames);
getResultIn(errorRow);
HashMap companyNameMap = new HashMap<>();
for (Company company : companyList) {
companyNameMap.put(company.getCompanyName(),company.getId());
}
for (CameraInOutParam companyParam : companyParams) {
companyParam.setCompanyId(companyNameMap.get(companyParam.getCompanyName()));
}
}
private HashMap getResultMap(List params){
HashMap resultMap = new HashMap<>();
List snCodeList = params.parallelStream().map(CameraInOutParam::getSnCode).collect(Collectors.toList());
checkSnCode(snCodeList);
List cameraList = this.getBySnCodes(snCodeList);
List cameraIds = cameraList.parallelStream().map(Camera::getId).collect(Collectors.toList());
List cameraDetails = cameraDetailService.getByCameraIds(cameraIds);
HashMap detailMap = new HashMap<>();
for (CameraDetail cameraDetail : cameraDetails) {
detailMap.put(cameraDetail.getCameraId(),cameraDetail);
}
HashMap snCodeMap = new HashMap<>();
for (Camera camera : cameraList) {
snCodeMap.put(camera.getSnCode(),camera);
}
List errorList = new ArrayList<>();
for (String snCode : snCodeList) {
Camera camera = snCodeMap.get(snCode);
if(camera == null || detailMap.get(camera.getId()) ==null){
errorList.add(snCodeList.indexOf(snCode) +3);
}
}
getResultIn(errorList);
resultMap.put("detailMap",detailMap);
resultMap.put("snCodeMap",snCodeMap);
return resultMap;
}
}