package com.fdkankan.manage.service.impl;
import cn.dev33.satoken.stp.StpUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fdkankan.fyun.face.FYunFileServiceInterface;
import com.fdkankan.manage.common.FilePath;
import com.fdkankan.manage.common.ResultCode;
import com.fdkankan.manage.exception.BusinessException;
import com.fdkankan.manage.common.PageInfo;
import com.fdkankan.common.util.DateUtil;
import com.fdkankan.common.util.FileUtils;
import com.fdkankan.manage.entity.SysUser;
import com.fdkankan.manage.service.ISysUserService;
import com.fdkankan.manage.entity.SpaceSdk;
import com.fdkankan.manage.mapper.ISpaceSdkMapper;
import com.fdkankan.manage.service.ISpaceSdkService;
import com.fdkankan.manage.vo.request.SpaceSdkParam;
import com.fdkankan.manage.vo.response.SpaceSdkVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
*
* space sdk表 服务实现类
*
*
* @author
* @since 2022-06-14
*/
@Service
@Slf4j
public class SpaceSdkServiceImpl extends ServiceImpl implements ISpaceSdkService {
private static String DIR_NAME = "new4dkk/v2/images/_/common/data/";
@Autowired
FYunFileServiceInterface fYunFileServiceInterface;
@Autowired
ISysUserService sysUserService;
@Value("${space-sdk.bucket:4dscene}")
private String sdkBucket;
@Value("${space-sdk.url:https://4dscene.4dage.com/}")
private String prefixAli;
@Override
public String upload(MultipartFile file, String version, String imprintCh, String imprintEn, Integer isTop, Integer platformType) throws IOException {
if (!file.isEmpty()&& file.getSize() <= 0) {
throw new BusinessException(ResultCode.UPLOAD_FILE_ERROR);
}
String fullFileName = "";
if(platformType == 1){
fullFileName = "SpaceTarget_Unity3D";
}else if(platformType == 2){
fullFileName = "SpaceTarget_UE4";
}
String fileNameAll = "";
// 文件名全名
fileNameAll = file.getOriginalFilename();
// 将文件转字节-> 字符串
// 获取类路径
String resourcePath = FilePath.sdkLocalPath;
log.info("resourcePath: {}", resourcePath);
// 创建目录
String dirPath = resourcePath + DIR_NAME;
FileUtils.createDir(dirPath);
// 拼接唯一文件名
String fileName = fullFileName + "_" + version + "_" + DateUtil.dateStr() + fileNameAll;
// 文件保存路径
String filePath = dirPath + DateUtil.dateStr() + fileNameAll;
// 写文件到本地
File file1 = new File(filePath);
file.transferTo(file1);
log.info("filePath: {}", filePath);
// 上传到阿里云sso
fYunFileServiceInterface.uploadFile(sdkBucket,filePath, DIR_NAME + fileName);
log.info("upload success");
String url = prefixAli + DIR_NAME + fileName;
log.info("upload url: {}" + url);
SpaceSdk managerSdkEntity = new SpaceSdk();
managerSdkEntity.setVersion(version);
managerSdkEntity.setImprintCh(imprintCh);
managerSdkEntity.setImprintEn(imprintEn);
managerSdkEntity.setIsTop(isTop);
managerSdkEntity.setStatus(0);
managerSdkEntity.setPlatformType(platformType.toString());
managerSdkEntity.setFileUrl(url);
managerSdkEntity.setFileName(fullFileName);
managerSdkEntity.setSysUserId(Long.valueOf(StpUtil.getLoginId().toString()));
this.save(managerSdkEntity);
if(isTop == 1){
this.updateTopFBySdkId(managerSdkEntity.getId());//取消所有置顶
}
this.updateById(managerSdkEntity);
// 删除本地文件
FileUtils.deleteFile(filePath);
return url;
}
@Override
public void updateByEntity(SpaceSdk param) {
if(param.getId() == null || StringUtils.isEmpty(param.getPlatformType()) || param.getIsTop()==null){
throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
}
if(param.getIsTop().equals(1)){
this.updateTopFBySdkId(param.getId());//取消所有置顶
}
this.updateById(param);
}
@Override
public void online(SpaceSdkParam param) {
if(param.getId() == null || param.getStatus() == null){
throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
}
SpaceSdk managerSdkEntity = this.getById(param.getId());
if(managerSdkEntity == null ){
throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
}
if(managerSdkEntity.getPublishTime()!=null){
this.updateBySdkId(param.getId(),param.getStatus());
}else{
this.updateBySdkIdPublish(param.getId(),param.getStatus());
}
}
@Override
public void top(SpaceSdkParam param) {
if(param.getId() == null || param.getIsTop()==null){
throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
}
if(param.getIsTop().equals(1)){
this.updateTopFBySdkId(param.getId());//取消所有置顶
}
LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(SpaceSdk::getIsTop,param.getIsTop())
.eq(SpaceSdk::getId,param.getId());
this.update(updateWrapper);
}
@Override
public PageInfo pageList(SpaceSdkParam param) {
LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery();
if(param.getStatus()!=null){
queryWrapper.eq(SpaceSdk::getStatus,param.getStatus());
}
if(StringUtils.isNotEmpty(param.getVersion())){
queryWrapper.like(SpaceSdk::getVersion,param.getVersion());
}
if(param.getPlatformType() == null){
param.setPlatformType(1);
}
queryWrapper.eq(SpaceSdk::getPlatformType,param.getPlatformType());
queryWrapper.orderByDesc(SpaceSdk::getIsTop);
queryWrapper.orderByDesc(SpaceSdk::getStatus);
queryWrapper.orderByDesc(SpaceSdk::getCreateTime);
Page page = this.page(new Page<>(param.getPageNum(),param.getPageSize()), queryWrapper);
List voList = new ArrayList<>();
for (SpaceSdk record : page.getRecords()) {
SpaceSdkVo vo = new SpaceSdkVo();
BeanUtils.copyProperties(record,vo);
if(record.getSysUserId() !=null){
SysUser user = sysUserService.getById(record.getSysUserId());
if(user != null){
vo.setCreateName(user.getNickName());
}
}
voList.add(vo);
}
Page voPage = new Page<>(param.getPageNum(),param.getPageSize());
voPage.setRecords(voList);
voPage.setTotal(page.getTotal());
return PageInfo.PageInfo(voPage);
}
private void updateBySdkId(Long id, Integer status) {
LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(SpaceSdk::getStatus,status == 2 ? 0:status)
.eq(SpaceSdk::getId,id);
this.update(updateWrapper);
}
private void updateTopFBySdkId(Long sdkId) {
SpaceSdk sdk = this.getById(sdkId);
if(sdk!=null){
LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(SpaceSdk::getIsTop,0)
.eq(SpaceSdk::getPlatformType,sdk.getPlatformType());
this.update(updateWrapper);
}
}
private void updateBySdkIdPublish(Long id, Integer status) {
LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(SpaceSdk::getStatus,status == 2 ? 0 :status)
.set(SpaceSdk::getPublishTime,new Date())
.eq(SpaceSdk::getId,id);
this.update(updateWrapper);
}
}