package com.om.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.om.entity.dto.*; import com.om.entity.po.*; import com.om.entity.vo.DiagnosisVersionSearchVO; import com.om.entity.vo.DiagnosisVersionVO; import com.om.exception.BadReqException; import com.om.exception.BizException; import com.om.mapper.DiagnosisVersionInfoMapper; import com.om.service.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.om.utils.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; 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.Comparator; import java.util.List; import java.util.function.Predicate; import java.util.stream.Collectors; /** *

* 服务实现类 *

* * @author bmmx * @since 2024-03-06 */ @Service @Slf4j public class DiagnosisVersionInfoServiceImpl extends ServiceImpl implements IDiagnosisVersionInfoService { @Resource IDiagnosisVersionDescribeService describeService; @Resource IBrandService brandService; @Resource IClientService clientService; @Resource IUserService userService; @Resource IDiagClientsService diagClientsService; @Resource private JwtUtils jwtUtils; @Resource private HuaweiObsUtil obsUtil; @Resource private PushUtil pushUtil; @Resource private IClientDevicetokenService clientDevicetokenService; @Override @Transactional public Result add(DiagnosisVersionVO diagnosisVersionVO) { DiagnosisVersionInfo info = new DiagnosisVersionInfo(); //客户端编号,需要取id,后面在进行设置 String[] clientNums = diagnosisVersionVO.getClientNums(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < clientNums.length; i++) { sb.append(clientNums[i]); if (clientNums.length != 1 && i != clientNums.length - 1) { sb.append(","); } } //文件地址 info.setFile(diagnosisVersionVO.getFileUrl()); //文件大小 info.setDiagnosisFileSize(diagnosisVersionVO.getDiagnosisFileSize()); //品牌代码 info.setBrandCode(diagnosisVersionVO.getBrandCode()); info.setClientNumber(sb.toString()); //诊断程序名称 info.setDiagnosisName(diagnosisVersionVO.getDiagnosisName()); //程序状态 info.setStatus(0); //设置用户名 info.setUsername(diagnosisVersionVO.getUsername()); //版本号 info.setVersion(diagnosisVersionVO.getVersion()); //保存地址 info.setSavePath(diagnosisVersionVO.getSavePath()); info.setFileName(diagnosisVersionVO.getFileName()); info.setLifecycle(0); info.setCreateTime(LocalDateTime.now()); info.setUpdateTime(LocalDateTime.now()); //保存 this.save(info); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(DiagnosisVersionInfo::getId, info.getId()); //保存后获取 DiagnosisVersionInfo versionInfo = getOne(queryWrapper); log.info("==========={}=========", versionInfo); for (int i = 0; i < diagnosisVersionVO.getDescriptionList().length; i++) { DiagnosisVersionDescribe describe = new DiagnosisVersionDescribe(); describe.setDiagnosisId(versionInfo.getId()); describe.setDescription(diagnosisVersionVO.getDescriptionList()[i]); describe.setLanguage(diagnosisVersionVO.getLanguage()[i]); describeService.save(describe); } for (int i = 0; i < diagnosisVersionVO.getClientNums().length; i++) { DiagClients diagClients = new DiagClients(); diagClients.setDiagId(versionInfo.getId()); diagClients.setClientNum(diagnosisVersionVO.getClientNums()[i]); diagClientsService.save(diagClients); } return Result.ok(); } @Override public Result downloadFile(Integer id) { DiagnosisVersionInfo diagnosisVersionInfo = this.getById(id); if (BeanUtil.isEmpty(diagnosisVersionInfo)) { throw new BadReqException("该诊断程序不存在"); } String uploadUrl = obsUtil.getUploadUrl(diagnosisVersionInfo.getFileName(), "program"); return Result.ok(uploadUrl); } @Override public Result edit(DiagnosisVersionVO diagnosisVersionVO) { Integer diaId = diagnosisVersionVO.getId(); DiagnosisVersionVO versionVO = getVO(diaId); BeanUtil.copyProperties(diagnosisVersionVO, versionVO); DiagnosisVersionInfo info = new DiagnosisVersionInfo(); DiagnosisVersionInfo info2 = this.getById(diaId);//查询到copy过去 BeanUtil.copyProperties(info2, info); BeanUtil.copyProperties(diagnosisVersionVO, info); log.info("----修改用户信息{}-----", info); LambdaQueryWrapper queryWrappeInfo = new LambdaQueryWrapper<>(); queryWrappeInfo.eq(DiagnosisVersionInfo::getId, diaId); this.update(info, queryWrappeInfo); //客户端编号也要更改 String[] clientNums = diagnosisVersionVO.getClientNums(); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(DiagClients::getDiagId, diaId); //先删除 diagClientsService.remove(queryWrapper); //在增加 for (int i = 0; i < clientNums.length; i++) { DiagClients diagClients = new DiagClients(); diagClients.setClientNum(clientNums[i]); diagClients.setDiagId(diaId); log.info("----修改客户端名称{}-----", diagClients); diagClientsService.save(diagClients); } log.info("----修改完成-----"); // 描述 String[] language = diagnosisVersionVO.getLanguage(); String[] descriptionList = diagnosisVersionVO.getDescriptionList(); List diagnosisVersionDescribes = describeService.lambdaQuery() .eq(DiagnosisVersionDescribe::getDiagnosisId, diagnosisVersionVO.getId()) .list(); describeService.removeBatchByIds(diagnosisVersionDescribes); diagnosisVersionDescribes.clear(); for (int i = 0; i < language.length; i++) { DiagnosisVersionDescribe diagnosisVersionDescribe = new DiagnosisVersionDescribe(); diagnosisVersionDescribe.setLanguage(language[i]); diagnosisVersionDescribe.setDescription(descriptionList[i]); diagnosisVersionDescribe.setDiagnosisId(diagnosisVersionVO.getId()); diagnosisVersionDescribes.add(diagnosisVersionDescribe); } describeService.saveBatch(diagnosisVersionDescribes); return Result.ok(); } @Override public DiagnosisVersionVO getVO(Integer id) { log.info("-------查询信息------"); DiagnosisVersionInfo versionInfo = this.getById(id); DiagnosisVersionVO versionVO = new DiagnosisVersionVO(); BeanUtil.copyProperties(versionInfo, versionVO); LambdaQueryWrapper clientQueryWrapper = new LambdaQueryWrapper<>(); clientQueryWrapper.eq(DiagClients::getDiagId, id); List diagClients = diagClientsService.list(clientQueryWrapper); String[] s = new String[diagClients.size()]; for (int i = 0; i < diagClients.size(); i++) { s[i] = diagClients.get(i).getClientNum(); } versionVO.setClientNums(s); //语言和描述 LambdaQueryWrapper describeLambdaQueryWrapper = new LambdaQueryWrapper<>(); describeLambdaQueryWrapper.eq(DiagnosisVersionDescribe::getDiagnosisId, id); List describes = describeService.list(describeLambdaQueryWrapper); String[] l = new String[describes.size()]; String[] d = new String[describes.size()]; for (int i = 0; i < describes.size(); i++) { l[i] = describes.get(i).getLanguage(); d[i] = describes.get(i).getDescription(); } versionVO.setDescriptionList(d); versionVO.setLanguage(l); log.info("=====getByUserId={}======", versionVO); return versionVO; } @Override public Result getByUserId(Integer id) { DiagnosisVersionVO versionVO = this.getVO(id); return Result.ok(versionVO); } @Override public Result getPageList(Integer pageIndex, Integer pageSize, String username) { Page page = this.lambdaQuery() .like(StringUtils.isNotBlank(username), DiagnosisVersionInfo::getUsername, username) .orderByDesc(DiagnosisVersionInfo::getBrandCode) .orderByDesc(DiagnosisVersionInfo::getVersion) .page(new Page<>(pageIndex, pageSize)); //获取总的数据 List diagLists = page.getRecords(); List diagVOLists = new ArrayList<>(); for (int i = 0; i < diagLists.size(); i++) { //然后取得客户端编号 DiagnosisVersionInfo info = diagLists.get(i); //创建前端传输数据 DiagnosisVersionSearchVO versionVO = new DiagnosisVersionSearchVO(); BeanUtil.copyProperties(info, versionVO); Integer diagId = info.getId(); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(DiagClients::getDiagId, diagId); List diagClients = diagClientsService.list(queryWrapper); log.info("====diagClients={}", diagClients); String[] s = new String[diagClients.size()]; String[] nums = new String[diagClients.size()]; for (int j = 0; j < diagClients.size(); j++) { Client client = clientService.lambdaQuery() .eq(Client::getNumber, diagClients.get(j).getClientNum()) .one(); if (BeanUtil.isEmpty(client)) { throw new BadReqException("该客户端编号" + diagClients.get(j).getClientNum() + "不存在"); } nums[j] = client.getNumber(); s[j] = client.getName(); } //传入客户端num versionVO.setClientNames(s); versionVO.setClientNum(nums); //传输描述和语言集合 LambdaQueryWrapper describeQueryWrapper = new LambdaQueryWrapper<>(); describeQueryWrapper.eq(DiagnosisVersionDescribe::getDiagnosisId, diagId); List describeList = describeService.list(describeQueryWrapper); log.info("List describeList ={}", describeList); String[] language = new String[describeList.size()]; String[] description = new String[describeList.size()]; for (int i1 = 0; i1 < describeList.size(); i1++) { DiagnosisVersionDescribe describe = describeList.get(i1); language[i1] = describe.getLanguage(); description[i1] = describe.getDescription(); } //根据品牌编号查询名称 Brand brand = brandService.lambdaQuery() .eq(Brand::getBrandCode, info.getBrandCode()) .one(); if (BeanUtil.isEmpty(brand)) { throw new BadReqException(info.getDiagnosisName() + "此诊断程序中品牌编号有误"); } //传入客户端 versionVO.setLanguage(language); versionVO.setDescriptionList(description); versionVO.setBrandName(brand.getBrandCn()); diagVOLists.add(versionVO); } Page pageVO = new Page<>(); BeanUtil.copyProperties(page, pageVO); pageVO.setRecords(diagVOLists); log.info("====={}=======", pageVO.getRecords()); return Result.ok(pageVO); } @Override public Result release(Integer id) { DiagnosisVersionInfo info = this.getById(id); String brandCode = info.getBrandCode(); List diagnosisVersionInfoList = this.lambdaQuery() .eq(DiagnosisVersionInfo::getBrandCode, brandCode) .eq(DiagnosisVersionInfo::getStatus, 1) .list(); info.setStatus(1); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(DiagnosisVersionInfo::getId, id); this.update(info, queryWrapper); if (CollectionUtil.isNotEmpty(diagnosisVersionInfoList)) { for (DiagnosisVersionInfo diagnosisVersionInfo : diagnosisVersionInfoList) { diagnosisVersionInfo.setStatus(2); } this.updateBatchById(diagnosisVersionInfoList); } return Result.ok(); } @Override public Result repeal(Integer id) { DiagnosisVersionInfo info = this.getById(id); info.setStatus(2); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(DiagnosisVersionInfo::getId, id); String brandCode = info.getBrandCode(); List list = this.lambdaQuery() .eq(DiagnosisVersionInfo::getBrandCode, brandCode) .eq(DiagnosisVersionInfo::getStatus, 2) .list(); DiagnosisVersionInfo diagnosisVersionInfo = list.stream().max(new Comparator() { @Override public int compare(DiagnosisVersionInfo o1, DiagnosisVersionInfo o2) { return VersionComparator.compareVersions(o1.getVersion(), o2.getVersion()); } }).get(); diagnosisVersionInfo.setStatus(1); this.updateById(diagnosisVersionInfo); this.update(info, queryWrapper); return Result.ok(); } /* 修改状态 */ @Override @Transactional public Result upStatus(Integer id) { DiagnosisVersionInfo info = this.getById(id); info.setStatus(2); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(DiagnosisVersionInfo::getId, id); String brandCode = info.getBrandCode(); List list = this.lambdaQuery() .eq(DiagnosisVersionInfo::getBrandCode, brandCode) .eq(DiagnosisVersionInfo::getStatus, 2) .list(); DiagnosisVersionInfo diagnosisVersionInfo = list.stream().max(new Comparator() { @Override public int compare(DiagnosisVersionInfo o1, DiagnosisVersionInfo o2) { return VersionComparator.compareVersions(o1.getVersion(), o2.getVersion()); } }).get(); diagnosisVersionInfo.setStatus(1); this.updateById(diagnosisVersionInfo); this.update(info, queryWrapper); return Result.ok(); } @Override public Result diagnosisVersionInfoUpdate(AppDiagVersionUpdateDTO dto) { if (BeanUtil.isEmpty(dto)) { return Result.fail("未获取到数据").result(ResultCode.NO_DATA); } String language = dto.getLanguage(); List brandInfo = dto.getBrandInfo(); String guid = dto.getGuid(); GuidDTO guidDTO = AesUtil.getGuidDTOFromGuid(guid); Integer userId = guidDTO.getUserId(); String clientNum = guidDTO.getClientNum(); if (brandInfo.isEmpty()) { throw new BadReqException("该诊断程序不存在"); } User user = userService.getById(userId); if (BeanUtil.isEmpty(user)) { return Result.fail(240339, "该客户端账号不存在", null); } List voList = new ArrayList<>(); for (AppBrandInfo vehicleDates : brandInfo) { String version = vehicleDates.getVersion(); List diagnosisVersionInfos = this.lambdaQuery() .eq(DiagnosisVersionInfo::getBrandCode, vehicleDates.getBrandCode()) .eq(user.getUserType() == 0, DiagnosisVersionInfo::getStatus, 1) .eq(user.getUserType() == 1, DiagnosisVersionInfo::getStatus, 0) .apply("CONCAT(',', client_number, ',') LIKE {0}", "%," + clientNum + ",%") //.gt(StringUtils.isNotBlank(version),DiagnosisVersionInfo::getVersion, version) .orderByDesc(DiagnosisVersionInfo::getVersion) .list(); if (CollectionUtil.isEmpty(diagnosisVersionInfos)) { continue; } diagnosisVersionInfos = diagnosisVersionInfos.stream().filter(diagnosisVersionInfo -> VersionComparator.compareVersions(diagnosisVersionInfo.getVersion(), version) >= 0) .collect(Collectors.toList()); if (CollectionUtil.isEmpty(diagnosisVersionInfos)) { continue; } DiagnosisVersionInfo diagnosisVersionInfo = diagnosisVersionInfos.get(0); //根据品牌id查询品牌 Brand brand = brandService.lambdaQuery() .eq(Brand::getBrandCode, diagnosisVersionInfo.getBrandCode()) .one(); VehicleDates vehicleDates1 = BeanUtil.copyProperties(diagnosisVersionInfo, VehicleDates.class); //根据语言获取对应描述 DiagnosisVersionDescribe diagnosisVersionDescribe = describeService.lambdaQuery() .eq(DiagnosisVersionDescribe::getLanguage, language) .eq(DiagnosisVersionDescribe::getDiagnosisId, diagnosisVersionInfo.getId()) .one(); if (!BeanUtil.isEmpty(diagnosisVersionDescribe)) { vehicleDates1.setDescription(diagnosisVersionDescribe.getDescription()); } else { vehicleDates1.setDescription(""); } //获取下载链接 String uploadUrl = obsUtil.getUploadUrl(diagnosisVersionInfo.getFileName(), "program"); vehicleDates1.setUrl(uploadUrl); vehicleDates1.setVersion(diagnosisVersionInfo.getVersion()); double v = Double.valueOf(diagnosisVersionInfo.getDiagnosisFileSize()) * 1024 * 1024; vehicleDates1.setStatus(diagnosisVersionInfo.getStatus()); vehicleDates1.setFileSize((long) v); vehicleDates1.setBrandCn(brand.getBrandCn()); vehicleDates1.setBrandEn(brand.getBrandEn()); vehicleDates1.setFileName(diagnosisVersionInfo.getFileName()); vehicleDates1.setPath(diagnosisVersionInfo.getSavePath()); vehicleDates1.setCreateTime(diagnosisVersionInfo.getCreateTime().toInstant(ZoneOffset.of("+8")).toEpochMilli()); voList.add(vehicleDates1); } return Result.ok(voList); } @Override public Result pushDiagnosis(Integer id) { DiagnosisVersionInfo diagnosisVersionInfo = this.getById(id); if (BeanUtil.isEmpty(diagnosisVersionInfo)) { throw new BadReqException("该诊断程序不存在"); } PushInfo pushInfo = new PushInfo(); pushInfo.setPushInfoType(2); VehicleInfo vehicleInfo = new VehicleInfo(); BeanUtil.copyProperties(diagnosisVersionInfo, vehicleInfo); Brand brand = brandService.lambdaQuery() .eq(Brand::getBrandCode, diagnosisVersionInfo.getBrandCode()) .one(); if (BeanUtil.isEmpty(brand)) { throw new BadReqException("该品牌" + diagnosisVersionInfo.getBrandCode() + "不存在"); } vehicleInfo.setBrandName(brand.getBrandCn()); vehicleInfo.setBrandNameEn(brand.getBrandEn()); if (diagnosisVersionInfo.getDiagnosisName() != null) { vehicleInfo.setSortLetter(diagnosisVersionInfo.getDiagnosisName().substring(0, 1)); } vehicleInfo.setUrl(diagnosisVersionInfo.getSavePath()); List describeList = new ArrayList<>(); List diagnosisVersionDescribes = describeService.lambdaQuery() .eq(DiagnosisVersionDescribe::getDiagnosisId, diagnosisVersionInfo.getId()) .list(); if (!diagnosisVersionDescribes.isEmpty()) { for (DiagnosisVersionDescribe diagnosisVersionDescribe : diagnosisVersionDescribes) { Describe describe = new Describe(); describe.setDescription(diagnosisVersionDescribe.getDescription()); describe.setLanguage(diagnosisVersionDescribe.getLanguage()); describeList.add(describe); } } vehicleInfo.setDescribeList(describeList); List diagClients = diagClientsService.lambdaQuery() .eq(DiagClients::getDiagId, diagnosisVersionInfo.getId()) .list(); String[] tokens = null; if (!diagClients.isEmpty()) { List clientNums = diagClients.stream().map(c -> c.getClientNum()).collect(Collectors.toList()); List tokenList = new ArrayList<>(); for (String clientNum : clientNums) { tokenList.addAll(getTokenByClientNum(clientNum)); } tokens = tokenList.toArray(new String[tokenList.size()]); //调用工具类 pushInfo.setJson(GsonUtils.toJsonString(vehicleInfo)); try { pushUtil.sendAndroidListcastJSON(tokens, pushInfo); } catch (Exception e) { throw new BizException("推送失败!!!"); } } return Result.ok(tokens); } @Override public Result getDesc(DiagnosisVersionVO diagnosisVersionVO) { return null; } @Override public List getTokenByClientNum(String clientNum) { Client client = clientService.lambdaQuery() .eq(Client::getNumber, clientNum) .one(); if (BeanUtil.isNotEmpty(client)) { List list = clientDevicetokenService.lambdaQuery() .eq(ClientDevicetoken::getClientId, client.getId()) .list(); return list.stream().map(c -> c.getDeviceToken()).collect(Collectors.toList()); } return null; } }