package com.ycwl.basic.controller.extern; import cn.hutool.http.HttpUtil; import com.ycwl.basic.annotation.IgnoreToken; import com.ycwl.basic.image.enhancer.adapter.BceImageEnhancer; import com.ycwl.basic.image.enhancer.entity.BceEnhancerConfig; import com.ycwl.basic.mapper.AioDeviceMapper; import com.ycwl.basic.mapper.MemberMapper; import com.ycwl.basic.model.aio.entity.AioDeviceBannerEntity; import com.ycwl.basic.model.aio.entity.AioDeviceEntity; import com.ycwl.basic.model.aio.entity.AioDevicePriceConfigEntity; import com.ycwl.basic.model.aio.req.AioDeviceCreateOrderReq; import com.ycwl.basic.model.aio.resp.AioDeviceCreateOrderResp; import com.ycwl.basic.model.aio.resp.AioDeviceInfoResp; import com.ycwl.basic.model.jwt.JwtInfo; import com.ycwl.basic.model.mobile.face.FaceRecognizeResp; import com.ycwl.basic.model.mobile.goods.GoodsDetailVO; import com.ycwl.basic.model.mobile.goods.GoodsReqQuery; import com.ycwl.basic.model.pc.face.resp.FaceRespVO; import com.ycwl.basic.model.pc.member.entity.MemberEntity; import com.ycwl.basic.model.pc.member.resp.MemberRespVO; import com.ycwl.basic.pay.entity.PayResponse; import com.ycwl.basic.service.aio.AioDeviceService; import com.ycwl.basic.service.mobile.GoodsService; import com.ycwl.basic.service.pc.FaceService; import com.ycwl.basic.service.pc.OrderService; import com.ycwl.basic.service.pc.ScenicService; import com.ycwl.basic.service.pc.SourceService; import com.ycwl.basic.storage.adapters.IStorageAdapter; import com.ycwl.basic.utils.ApiResponse; import com.ycwl.basic.utils.JwtTokenUtil; import com.ycwl.basic.utils.SnowFlakeUtil; import jakarta.servlet.ServletRequest; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Strings; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; @Slf4j @IgnoreToken @RestController @RequestMapping("/api/aio") public class AioDeviceController { @Autowired private GoodsService goodsService; @Autowired private FaceService faceService; @Autowired private MemberMapper memberMapper; @Autowired private AioDeviceMapper aioDeviceMapper; @Autowired private AioDeviceService aioDeviceService; @Autowired private OrderService orderService; @Autowired private RedisTemplate redisTemplate; @Autowired private SourceService sourceService; @GetMapping("/info") public ApiResponse getDeviceInfo(HttpServletRequest request) { String deviceId = request.getHeader("X-DeviceId"); AioDeviceEntity aioDevice = aioDeviceMapper.getByKey(deviceId); if (aioDevice == null) { return ApiResponse.fail("设备不存在"); } List banners = aioDeviceMapper.getBannerByDeviceId(aioDevice.getId()); return ApiResponse.success(new AioDeviceInfoResp(aioDevice, banners)); } @GetMapping("/banners") public ApiResponse> getBanners(HttpServletRequest request) { String deviceId = request.getHeader("X-DeviceId"); AioDeviceEntity aioDevice = aioDeviceMapper.getByKey(deviceId); if (aioDevice == null) { return ApiResponse.fail("设备不存在"); } List banners = aioDeviceMapper.getBannerByDeviceId(aioDevice.getId()); return ApiResponse.success(banners); } @GetMapping("/config") public ApiResponse getPriceConfig(HttpServletRequest request) { String deviceId = request.getHeader("X-DeviceId"); AioDeviceEntity aioDevice = aioDeviceMapper.getByKey(deviceId); if (aioDevice == null) { return ApiResponse.fail("设备不存在"); } AioDevicePriceConfigEntity config = aioDeviceMapper.getPriceConfigByDeviceId(aioDevice.getId()); return ApiResponse.success(config); } @PostMapping("/faceUpload") public ApiResponse faceUpload(@RequestParam("file") MultipartFile file, HttpServletRequest request) { String deviceId = request.getHeader("X-DeviceId"); AioDeviceEntity aioDevice = aioDeviceMapper.getByKey(deviceId); if (aioDevice == null) { return ApiResponse.fail("设备不存在"); } MemberEntity memberEntity = new MemberEntity(); memberEntity.setScenicId(aioDevice.getScenicId()); memberEntity.setCreateDate(new Date()); memberEntity.setId(SnowFlakeUtil.getLongId()); memberEntity.setNickname("用户"); memberMapper.add(memberEntity); FaceRecognizeResp resp = faceService.faceUpload(file, aioDevice.getScenicId(), memberEntity.getId()); // 尝试超分 new Thread(() -> { try { Thread.sleep(2000L); } catch (InterruptedException e) { return; } GoodsReqQuery query = new GoodsReqQuery(); query.setSourceType(2); query.setFaceId(resp.getFaceId()); List sourcePhotoList = goodsService.sourceGoodsList(query); if (sourcePhotoList == null || sourcePhotoList.isEmpty()) { log.info("无源图片"); redisTemplate.opsForValue().set("aio:faceId:"+resp.getFaceId().toString()+":pass", "1", 1, TimeUnit.DAYS); return; } log.info("超分开始!"); sourcePhotoList.forEach(photo -> { if (StringUtils.contains(photo.getUrl(), "_q_")) { return; } try { File dstFile = new File(photo.getGoodsId()+".jpg"); long fileSize = HttpUtil.downloadFile(photo.getUrl(), dstFile); log.info("超分开始:{}", fileSize); BceImageEnhancer enhancer = getEnhancer(); MultipartFile enhancedFile = enhancer.enhance(dstFile.getName()); log.info("超分结束:{}", photo.getUrl()); String url = sourceService.uploadAndUpdateUrl(photo.getGoodsId(), enhancedFile); log.info("上传结束:->{}", url); } catch (Exception e) { log.error("超分失败:{}", photo.getGoodsId(), e); } finally { File _file = new File(photo.getGoodsId()+".jpg"); if (_file.exists()) { _file.delete(); } } }); redisTemplate.opsForValue().set("aio:faceId:"+sourcePhotoList.getFirst().getFaceId().toString()+":pass", "1", 1, TimeUnit.DAYS); }).start(); return ApiResponse.success(resp); } // 人脸信息 @GetMapping("/{faceId}") public ApiResponse faceInfo(@PathVariable Long faceId) { return faceService.getById(faceId); } @GetMapping("/face/{faceId}/check") public ApiResponse faceCheck(@PathVariable Long faceId) { if (redisTemplate.hasKey("aio:faceId:"+faceId.toString()+":pass")) { return ApiResponse.success(true); } else { return ApiResponse.success(false); } } @GetMapping("/face/{faceId}/bindWxaCode") public ApiResponse bindWxaCode(@PathVariable Long faceId) { return ApiResponse.success(faceService.bindWxaCode(faceId)); } // 照片商品列表 @GetMapping("/{faceId}/photo") public ApiResponse> sourceGoodsList(@PathVariable Long faceId) { GoodsReqQuery query = new GoodsReqQuery(); query.setSourceType(2); query.setFaceId(faceId); List goodsDetailVOS = goodsService.sourceGoodsList(query); return ApiResponse.success(goodsDetailVOS); } // 创建订单 @PostMapping("/order") public ApiResponse createOrder(HttpServletRequest request, @RequestBody AioDeviceCreateOrderReq req) { String deviceId = request.getHeader("X-DeviceId"); AioDeviceEntity aioDevice = aioDeviceMapper.getByKey(deviceId); if (aioDevice == null) { return ApiResponse.fail("设备不存在"); } return ApiResponse.success(aioDeviceService.createOrder(aioDevice, req)); } // 查询订单 @GetMapping("/order/{orderId}") public ApiResponse queryOrder(HttpServletRequest request, @PathVariable("orderId") Long orderId) { String deviceId = request.getHeader("X-DeviceId"); AioDeviceEntity aioDevice = aioDeviceMapper.getByKey(deviceId); if (aioDevice == null) { return ApiResponse.fail("设备不存在"); } return ApiResponse.success(orderService.queryOrder(orderId)); } private BceImageEnhancer getEnhancer() { BceImageEnhancer enhancer = new BceImageEnhancer(); BceEnhancerConfig config = new BceEnhancerConfig(); config.setQps(1); config.setAppId("119554288"); config.setApiKey("OX6QoijgKio3eVtA0PiUVf7f"); config.setSecretKey("dYatXReVriPeiktTjUblhfubpcmYfuMk"); enhancer.setConfig(config); return enhancer; } }