From 05bc2773b96279840e167928369dad13b72ac995 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Fri, 14 Mar 2025 11:47:47 +0800 Subject: [PATCH] 3 --- .../java/com/ycwl/basic/biz/PriceBiz.java | 2 +- .../controller/mobile/AppOrderController.java | 6 +- .../basic/controller/pc/DeviceController.java | 6 + .../pc/device/req/DeviceBatchSortRequest.java | 16 +++ .../model/pc/device/resp/DeviceRespVO.java | 2 + .../service/impl/pc/DeviceServiceImpl.java | 10 ++ .../ycwl/basic/service/pc/DeviceService.java | 3 + .../task/impl/TaskFaceServiceImpl.java | 86 +++++++------- .../com/ycwl/basic/task/VideoPieceGetter.java | 10 +- .../java/com/ycwl/basic/utils/WxMpUtil.java | 2 +- src/main/resources/mapper/DeviceMapper.xml | 3 +- .../com/ycwl/basic/task/FaceCleanerTest.java | 109 ++++++++++++++++++ 12 files changed, 205 insertions(+), 50 deletions(-) create mode 100644 src/main/java/com/ycwl/basic/model/pc/device/req/DeviceBatchSortRequest.java create mode 100644 src/test/java/com/ycwl/basic/task/FaceCleanerTest.java diff --git a/src/main/java/com/ycwl/basic/biz/PriceBiz.java b/src/main/java/com/ycwl/basic/biz/PriceBiz.java index 106f514..a126eec 100644 --- a/src/main/java/com/ycwl/basic/biz/PriceBiz.java +++ b/src/main/java/com/ycwl/basic/biz/PriceBiz.java @@ -77,7 +77,7 @@ public class PriceBiz { IsBuyBatchRespVO respVO = new IsBuyBatchRespVO(); PriceConfigEntity priceConfig = priceRepository.getPriceConfigByScenicTypeGoods(scenicId, type, goodsIds); if (priceConfig == null) { - throw new RuntimeException("该套餐暂未开放购买"); + return null; } ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenicId); if (scenicConfig != null) { diff --git a/src/main/java/com/ycwl/basic/controller/mobile/AppOrderController.java b/src/main/java/com/ycwl/basic/controller/mobile/AppOrderController.java index 80f8a58..114d7e7 100644 --- a/src/main/java/com/ycwl/basic/controller/mobile/AppOrderController.java +++ b/src/main/java/com/ycwl/basic/controller/mobile/AppOrderController.java @@ -99,6 +99,10 @@ public class AppOrderController { @GetMapping("/scenic/{scenicId}/queryBatchPrice") public ApiResponse queryPrice(@PathVariable("scenicId") Long scenicId, @RequestParam("type") Integer type, @RequestParam(value = "goodsIds", required = false) String goodsIds) { Long userId = Long.parseLong(BaseContextHandler.getUserId()); - return ApiResponse.success(priceBiz.isBuy(userId, scenicId, type, goodsIds)); + IsBuyBatchRespVO buy = priceBiz.isBuy(userId, scenicId, type, goodsIds); + if (buy == null) { + return ApiResponse.fail("该套餐暂未开放购买"); + } + return ApiResponse.success(buy); } } diff --git a/src/main/java/com/ycwl/basic/controller/pc/DeviceController.java b/src/main/java/com/ycwl/basic/controller/pc/DeviceController.java index 7b632b7..92887d1 100644 --- a/src/main/java/com/ycwl/basic/controller/pc/DeviceController.java +++ b/src/main/java/com/ycwl/basic/controller/pc/DeviceController.java @@ -3,6 +3,7 @@ package com.ycwl.basic.controller.pc; import com.github.pagehelper.PageInfo; import com.ycwl.basic.model.pc.device.entity.DeviceConfigEntity; import com.ycwl.basic.model.pc.device.req.DeviceAddOrUpdateReq; +import com.ycwl.basic.model.pc.device.req.DeviceBatchSortRequest; import com.ycwl.basic.model.pc.device.req.DeviceReqQuery; import com.ycwl.basic.model.pc.device.req.DeviceSortRequest; import com.ycwl.basic.model.pc.device.resp.DeviceRespVO; @@ -62,6 +63,11 @@ public class DeviceController { return deviceService.sortDevice(request.getDeviceId(), request.getAfterDeviceId()); } + @PostMapping("/scenic/{scenicId}/sortBatch") + public ApiResponse sortDeviceBatch(@PathVariable("scenicId") Long scenicId, @RequestBody DeviceBatchSortRequest request) { + return deviceService.batchSort(scenicId, request); + } + @GetMapping("/config/{id}") public ApiResponse getConfig(@PathVariable("id") Long id) { return ApiResponse.success(deviceService.getConfig(id)); diff --git a/src/main/java/com/ycwl/basic/model/pc/device/req/DeviceBatchSortRequest.java b/src/main/java/com/ycwl/basic/model/pc/device/req/DeviceBatchSortRequest.java new file mode 100644 index 0000000..f315c60 --- /dev/null +++ b/src/main/java/com/ycwl/basic/model/pc/device/req/DeviceBatchSortRequest.java @@ -0,0 +1,16 @@ +package com.ycwl.basic.model.pc.device.req; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceBatchSortRequest { + private List list; + + @Data + public static class SortItem { + private Long id; + private Integer sort; + } +} diff --git a/src/main/java/com/ycwl/basic/model/pc/device/resp/DeviceRespVO.java b/src/main/java/com/ycwl/basic/model/pc/device/resp/DeviceRespVO.java index 49f8665..e772893 100644 --- a/src/main/java/com/ycwl/basic/model/pc/device/resp/DeviceRespVO.java +++ b/src/main/java/com/ycwl/basic/model/pc/device/resp/DeviceRespVO.java @@ -33,6 +33,8 @@ public class DeviceRespVO { private Integer online; private String coverUrl; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date coverTime; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createAt; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date updateAt; diff --git a/src/main/java/com/ycwl/basic/service/impl/pc/DeviceServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/pc/DeviceServiceImpl.java index ddbc19f..26f6cb7 100644 --- a/src/main/java/com/ycwl/basic/service/impl/pc/DeviceServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/impl/pc/DeviceServiceImpl.java @@ -3,6 +3,7 @@ package com.ycwl.basic.service.impl.pc; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.ycwl.basic.model.pc.device.entity.DeviceEntity; +import com.ycwl.basic.model.pc.device.req.DeviceBatchSortRequest; import com.ycwl.basic.model.pc.template.resp.TemplateRespVO; import com.ycwl.basic.model.wvp.WvpSyncReqVo; import com.ycwl.basic.repository.DeviceRepository; @@ -164,4 +165,13 @@ public class DeviceServiceImpl implements DeviceService { }); return ApiResponse.success(true); } + + @Override + public ApiResponse batchSort(Long scenicId, DeviceBatchSortRequest request) { + for (DeviceBatchSortRequest.SortItem item : request.getList()) { + deviceMapper.updateSort(item.getId(), item.getSort()); + deviceRepository.clearDeviceCache(item.getId()); + } + return ApiResponse.success(true); + } } diff --git a/src/main/java/com/ycwl/basic/service/pc/DeviceService.java b/src/main/java/com/ycwl/basic/service/pc/DeviceService.java index 4b1bbaf..e25afd4 100644 --- a/src/main/java/com/ycwl/basic/service/pc/DeviceService.java +++ b/src/main/java/com/ycwl/basic/service/pc/DeviceService.java @@ -3,6 +3,7 @@ package com.ycwl.basic.service.pc; import com.github.pagehelper.PageInfo; import com.ycwl.basic.model.pc.device.entity.DeviceConfigEntity; import com.ycwl.basic.model.pc.device.req.DeviceAddOrUpdateReq; +import com.ycwl.basic.model.pc.device.req.DeviceBatchSortRequest; import com.ycwl.basic.model.pc.device.req.DeviceReqQuery; import com.ycwl.basic.model.pc.device.resp.DeviceRespVO; import com.ycwl.basic.model.wvp.WvpSyncReqVo; @@ -29,4 +30,6 @@ public interface DeviceService { void updateDevices(Long scenicId, WvpSyncReqVo reqVo); ApiResponse sortDevice(Long deviceId, Long afterDeviceId); + + ApiResponse batchSort(Long scenicId, DeviceBatchSortRequest request); } diff --git a/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java b/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java index 470189a..74096ae 100644 --- a/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java @@ -68,6 +68,7 @@ import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import static com.ycwl.basic.constant.FaceConstant.USER_FACE_DB_NAME; @@ -320,10 +321,12 @@ public class TaskFaceServiceImpl implements TaskFaceService { listFaceEntitiesRequest.setDbName(USER_FACE_DB_NAME + String.valueOf(scenicId)); listFaceEntitiesRequest.setOrder("asc"); + listFaceEntitiesRequest.setLimit(200); try { + AtomicInteger count = new AtomicInteger(0); IAcsClient client = getClient(); - AtomicBoolean flag = new AtomicBoolean(false); while (true) { + listFaceEntitiesRequest.setOffset(count.getAndIncrement()); ListFaceEntitiesResponse listFaceEntitiesResponse = client.getAcsResponse(listFaceEntitiesRequest); if (listFaceEntitiesResponse == null || listFaceEntitiesResponse.getData() == null || listFaceEntitiesResponse.getData().getEntities() == null || listFaceEntitiesResponse.getData().getEntities().isEmpty()) { break; @@ -331,61 +334,54 @@ public class TaskFaceServiceImpl implements TaskFaceService { listFaceEntitiesResponse.getData().getEntities().forEach(entity -> { Date createdDate = new Date(entity.getCreatedAt()); if (createdDate.before(endDate)) { - flag.set(true); - log.info("当前景区{},开始删除人脸样本:{}", scenicId, entity.getEntityId()); - deleteFaceSample(String.valueOf(scenicId), entity.getEntityId()); + deleteFaceSample(entity.getDbName(), entity.getEntityId()); } else { + count.incrementAndGet(); log.info("当前景区{},人脸样本:{}未过期", scenicId, entity.getEntityId()); } }); - if (!flag.get()) { - break; - } else { - flag.set(false); - } } } catch (Exception ignored) { } + List devices = deviceRepository.getAllDeviceByScenicId(scenicId); listFaceEntitiesRequest.setDbName(String.valueOf(scenicId)); listFaceEntitiesRequest.setOrder("asc"); - try { - IAcsClient client = getClient(); - AtomicBoolean flag = new AtomicBoolean(false); - while (true) { - ListFaceEntitiesResponse listFaceEntitiesResponse = client.getAcsResponse(listFaceEntitiesRequest); - if (listFaceEntitiesResponse == null || listFaceEntitiesResponse.getData() == null || listFaceEntitiesResponse.getData().getEntities() == null || listFaceEntitiesResponse.getData().getEntities().isEmpty()) { - break; - } - listFaceEntitiesResponse.getData().getEntities().forEach(entity -> { - String entityId = entity.getEntityId(); - String[] split = entityId.split("_"); - if (split.length != 2) { - return; - } - String deviceId = split[0]; - if (StringUtils.isBlank(deviceId)) { - return; - } - String dateString = split[1]; - if (StringUtils.isBlank(dateString)) { - return; - } - if (DateUtils.parse(dateString, DATE_FORMAT).before(endDate)) { - flag.set(true); - log.info("当前景区{},开始删除人脸样本:{}", scenicId, entity.getEntityId()); - deleteFaceSample(String.valueOf(scenicId), entity.getEntityId()); - } else { - log.info("当前景区{},人脸样本:{}未过期", scenicId, entity.getEntityId()); - } - }); - if (!flag.get()) { - break; - } else { - flag.set(false); + devices.forEach(device -> { + AtomicInteger count = new AtomicInteger(0); + listFaceEntitiesRequest.setEntityIdPrefix(device.getId() + "_"); + try { + IAcsClient client = getClient(); + while (true) { + listFaceEntitiesRequest.setOffset(count.get()); + ListFaceEntitiesResponse listFaceEntitiesResponse = client.getAcsResponse(listFaceEntitiesRequest); + if (listFaceEntitiesResponse == null || listFaceEntitiesResponse.getData() == null || listFaceEntitiesResponse.getData().getEntities() == null || listFaceEntitiesResponse.getData().getEntities().isEmpty()) { + break; + } + listFaceEntitiesResponse.getData().getEntities().forEach(entity -> { + String entityId = entity.getEntityId(); + String[] split = entityId.split("_"); + if (split.length != 2) { + return; + } + String deviceId = split[0]; + if (StringUtils.isBlank(deviceId)) { + return; + } + String dateString = split[1]; + if (StringUtils.isBlank(dateString)) { + return; + } + if (DateUtils.parse(dateString, DATE_FORMAT).before(endDate)) { + deleteFaceSample(entity.getDbName(), entity.getEntityId()); + } else { + count.incrementAndGet(); + log.info("当前景区{},人脸样本:{}未过期", scenicId, entity.getEntityId()); + } + }); } + } catch (Exception ignored) { } - } catch (Exception ignored) { - } + }); List faceSampleList = faceSampleMapper.listEntityBeforeDate(scenicId, endDate); if (faceSampleList.isEmpty()) { log.info("当前景区{},人脸样本为空", scenicId); diff --git a/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java b/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java index 06e968e..53458b4 100644 --- a/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java +++ b/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java @@ -128,7 +128,15 @@ public class VideoPieceGetter { .values(); collection.forEach(faceSampleList -> { executor.execute(() -> { - faceSampleList.parallelStream().forEach(faceSample -> { + AtomicBoolean isFirst = new AtomicBoolean(true); + faceSampleList.forEach(faceSample -> { + if (!isFirst.get()) { + try { + Thread.sleep(1000); + } catch (InterruptedException ignore) { + } + } + isFirst.set(false); executor.execute(() -> { DeviceEntity device = deviceRepository.getDevice(faceSample.getDeviceId()); DeviceConfigEntity config = deviceRepository.getDeviceConfig(faceSample.getDeviceId()); diff --git a/src/main/java/com/ycwl/basic/utils/WxMpUtil.java b/src/main/java/com/ycwl/basic/utils/WxMpUtil.java index 254e1d1..6d7138b 100644 --- a/src/main/java/com/ycwl/basic/utils/WxMpUtil.java +++ b/src/main/java/com/ycwl/basic/utils/WxMpUtil.java @@ -62,6 +62,6 @@ public class WxMpUtil { } public static void main(String[] args) throws Exception { - generateWXAQRCode("wxe7ff26af70bfc37c", "5252fbbc68513bc77b7cc0052b9f9695", "trial", "pages/home/index?scenicId=3946669713328836608", "cxzh_t.jpg"); + generateWXAQRCode("wxe7ff26af70bfc37c", "5252fbbc68513bc77b7cc0052b9f9695", "trial", "pages/home/index?scenicId=3955650120997015552", "sxlj_t.jpg"); } } diff --git a/src/main/resources/mapper/DeviceMapper.xml b/src/main/resources/mapper/DeviceMapper.xml index 2283e20..fea2782 100644 --- a/src/main/resources/mapper/DeviceMapper.xml +++ b/src/main/resources/mapper/DeviceMapper.xml @@ -68,7 +68,8 @@