package com.linghu.controller; import com.alibaba.excel.EasyExcel; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.linghu.mapper.ReferenceMapper; import com.linghu.model.common.ResponseResult; import com.linghu.model.entity.Platform; import com.linghu.model.entity.Reference; import com.linghu.model.entity.Type; import com.linghu.model.excel.PlatformExcel; import com.linghu.service.PlatformService; import com.linghu.service.TypeService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.stream.Collectors; @RestController @RequestMapping("/platform") @Api(value = "平台相关接口", tags = "设置-平台") public class PlatformController { @Autowired private PlatformService platformService; @Autowired private TypeService typeService; @Autowired private ReferenceMapper referenceMapper; @PostMapping @ApiOperation(value = "添加平台") public ResponseResult add(@RequestBody Platform platform) { // 校验平台名称和域名不能为空 if (!StringUtils.hasText(platform.getPlatform_name())) { return ResponseResult.error("平台名称不能为空"); } if (!StringUtils.hasText(platform.getDomain())) { return ResponseResult.error("平台域名不能为空"); } boolean success = platformService.save(platform); if (success) { return ResponseResult.success(platform); } return ResponseResult.error("添加平台失败"); } @DeleteMapping("/{platformId}") @ApiOperation(value = "删除平台") public ResponseResult delete(@PathVariable Integer platformId) { //平台被引用了没 Integer count = referenceMapper.selectCount(new LambdaQueryWrapper().eq(Reference::getPlatform_id, platformId)); if (count > 0) { return ResponseResult.error("该平台被引用中,不能删除"); } boolean success = platformService.removeById(platformId); if (success) { return ResponseResult.success(); } return ResponseResult.error("删除平台失败"); } @PutMapping @ApiOperation(value = "更新平台") public ResponseResult update(@RequestBody Platform platform) { // 校验平台名称和域名不能为空 if (!StringUtils.hasText(platform.getPlatform_name())) { return ResponseResult.error("平台名称不能为空"); } if (!StringUtils.hasText(platform.getDomain())) { return ResponseResult.error("平台域名不能为空"); } boolean success = platformService.updateById(platform); if (success) { return ResponseResult.success(); } return ResponseResult.error("更新平台失败"); } @GetMapping("/{platformId}") @ApiOperation("根据id获取平台") public ResponseResult getById(@PathVariable Integer platformId) { Platform platform = platformService.getById(platformId); if (platform != null) { return ResponseResult.success(platform); } return ResponseResult.error("平台不存在"); } @GetMapping("/list") @ApiOperation("查询平台列表") public ResponseResult> list( @RequestParam(required = false,defaultValue = "1") Integer page, @RequestParam(required = false,defaultValue = "10") Integer pageSize) { Page pageInfo = new Page<>(page, pageSize); Page result = platformService.page(pageInfo); return ResponseResult.success(result); } @GetMapping("/download") @ApiOperation("下载平台模板") public ResponseEntity downloadTemplate() throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); EasyExcel.write(out, PlatformExcel.class).sheet("平台模板").doWrite(new ArrayList<>()); return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=platform_template.xlsx") .contentType(MediaType.APPLICATION_OCTET_STREAM) .body(out.toByteArray()); } @PostMapping("/import") @ApiOperation("导入平台数据") public ResponseResult importPlatforms(@RequestParam("file") MultipartFile file) { try { // 检查文件是否为空 if (file.isEmpty()) { return ResponseResult.error("上传文件不能为空"); } // 读取Excel数据 List excelList = EasyExcel.read(file.getInputStream()) .head(PlatformExcel.class) .sheet() .doReadSync(); // 数据转换与验证 List platforms = new ArrayList<>(); List errorMessages = new ArrayList<>(); for (PlatformExcel excel : excelList) { // 检查必要字段 if (!StringUtils.hasText(excel.getPlatform_name())) { errorMessages.add("平台名称不能为空"); continue; } if (!StringUtils.hasText(excel.getType_name())) { errorMessages.add("平台类型不能为空"); continue; } if (!StringUtils.hasText(excel.getDomain())) { errorMessages.add("平台域名不能为空"); continue; } // 查找类型 Type typeByName = typeService.getTypeByName(excel.getType_name()); if (typeByName == null) { errorMessages.add("未知的平台类型: " + excel.getType_name()); continue; } // 构建平台对象 Platform platform = new Platform(); platform.setPlatform_name(excel.getPlatform_name()); platform.setDomain(excel.getDomain()); platform.setType_id(typeByName.getType_id()); // 设置创建时间(解决之前的数据库错误) platform.setCreate_time(LocalDateTime.now()); platforms.add(platform); } // 处理错误 if (!errorMessages.isEmpty()) { return ResponseResult.error("数据验证失败: " + String.join("; ", errorMessages)); } // 批量保存 if (!platforms.isEmpty()) { platformService.saveBatch(platforms); return ResponseResult.success("成功导入" + platforms.size() + "条数据"); } else { return ResponseResult.error("没有有效数据可导入"); } } catch (Exception e) { // 记录详细异常信息 return ResponseResult.error("文件解析失败:" + e.getMessage()); } } }