diff --git a/src/main/java/com/ycwl/basic/controller/pc/SourceController.java b/src/main/java/com/ycwl/basic/controller/pc/SourceController.java index b1063f53..b3a68b91 100644 --- a/src/main/java/com/ycwl/basic/controller/pc/SourceController.java +++ b/src/main/java/com/ycwl/basic/controller/pc/SourceController.java @@ -95,4 +95,34 @@ public class SourceController { return sourceService.pageByFaceId(sourceReqQuery); } + /** + * 管理员取消关联(软删除) + * @param id member_source 记录 ID + * @return 操作结果 + */ + @PostMapping("/admin/cancel/{id}") + public ApiResponse cancelRelation(@PathVariable("id") Long id) { + return sourceService.cancelRelation(id); + } + + /** + * 管理员恢复已取消的关联 + * @param id member_source 记录 ID + * @return 操作结果 + */ + @PostMapping("/admin/reactivate/{id}") + public ApiResponse reactivateRelation(@PathVariable("id") Long id) { + return sourceService.reactivateRelation(id); + } + + /** + * 管理员查询已取消的关联记录 + * @param sourceReqQuery 查询参数(需设置faceId,可选type/scenicId) + * @return 分页已取消关联列表 + */ + @PostMapping("/admin/pageDeletedByFaceId") + public ApiResponse pageDeletedByFaceId(@RequestBody SourceReqQuery sourceReqQuery) { + return sourceService.pageDeletedByFaceId(sourceReqQuery); + } + } diff --git a/src/main/java/com/ycwl/basic/mapper/SourceMapper.java b/src/main/java/com/ycwl/basic/mapper/SourceMapper.java index 142e8499..7064792c 100644 --- a/src/main/java/com/ycwl/basic/mapper/SourceMapper.java +++ b/src/main/java/com/ycwl/basic/mapper/SourceMapper.java @@ -195,4 +195,12 @@ public interface SourceMapper { * @return source响应列表 */ List pageByFaceId(SourceReqQuery sourceReqQuery); + + int softDeleteRelation(Long id); + + int reactivateRelation(Long id); + + List pageDeletedByFaceId(SourceReqQuery sourceReqQuery); + + MemberSourceEntity getMemberSourceById(Long id); } diff --git a/src/main/java/com/ycwl/basic/model/pc/source/entity/MemberSourceEntity.java b/src/main/java/com/ycwl/basic/model/pc/source/entity/MemberSourceEntity.java index aeadd5d5..01d2736a 100644 --- a/src/main/java/com/ycwl/basic/model/pc/source/entity/MemberSourceEntity.java +++ b/src/main/java/com/ycwl/basic/model/pc/source/entity/MemberSourceEntity.java @@ -3,6 +3,8 @@ package com.ycwl.basic.model.pc.source.entity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; +import java.util.Date; + @Data @TableName("member_source") public class MemberSourceEntity { @@ -15,4 +17,6 @@ public class MemberSourceEntity { private Integer isBuy; private Long orderId; private Integer isFree; + private Integer deleted; + private Date deletedAt; } diff --git a/src/main/java/com/ycwl/basic/model/pc/source/resp/SourceRespVO.java b/src/main/java/com/ycwl/basic/model/pc/source/resp/SourceRespVO.java index 39732833..500d75e8 100644 --- a/src/main/java/com/ycwl/basic/model/pc/source/resp/SourceRespVO.java +++ b/src/main/java/com/ycwl/basic/model/pc/source/resp/SourceRespVO.java @@ -46,4 +46,6 @@ public class SourceRespVO { // 是否购买:0未购买,1已购买 private int isBuy; private int isFree; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date deletedAt; } diff --git a/src/main/java/com/ycwl/basic/service/pc/SourceService.java b/src/main/java/com/ycwl/basic/service/pc/SourceService.java index c3b95e71..bb071d00 100644 --- a/src/main/java/com/ycwl/basic/service/pc/SourceService.java +++ b/src/main/java/com/ycwl/basic/service/pc/SourceService.java @@ -38,4 +38,25 @@ public interface SourceService { * @return 分页结果 */ ApiResponse> pageByFaceId(SourceReqQuery sourceReqQuery); + + /** + * 管理员软删除(取消)关联记录 + * @param id member_source 记录 ID + * @return 操作结果 + */ + ApiResponse cancelRelation(Long id); + + /** + * 管理员恢复已取消的关联记录 + * @param id member_source 记录 ID + * @return 操作结果 + */ + ApiResponse reactivateRelation(Long id); + + /** + * 分页查询已取消的关联记录(管理员用) + * @param sourceReqQuery 查询参数(需设置faceId) + * @return 分页结果 + */ + ApiResponse> pageDeletedByFaceId(SourceReqQuery sourceReqQuery); } diff --git a/src/main/java/com/ycwl/basic/service/pc/impl/SourceServiceImpl.java b/src/main/java/com/ycwl/basic/service/pc/impl/SourceServiceImpl.java index 310ebc41..a162d206 100644 --- a/src/main/java/com/ycwl/basic/service/pc/impl/SourceServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/pc/impl/SourceServiceImpl.java @@ -3,6 +3,7 @@ package com.ycwl.basic.service.pc.impl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.ycwl.basic.exception.BaseException; +import com.ycwl.basic.biz.FaceStatusManager; import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2DTO; import com.ycwl.basic.mapper.SourceMapper; import com.ycwl.basic.model.pc.device.entity.DeviceEntity; @@ -12,6 +13,7 @@ import com.ycwl.basic.model.pc.source.entity.SourceEntity; import com.ycwl.basic.model.pc.source.req.SourceReqQuery; import com.ycwl.basic.model.pc.source.resp.SourceRespVO; import com.ycwl.basic.repository.DeviceRepository; +import com.ycwl.basic.repository.MemberRelationRepository; import com.ycwl.basic.repository.ScenicRepository; import com.ycwl.basic.repository.SourceRepository; import com.ycwl.basic.service.pc.ScenicService; @@ -54,6 +56,10 @@ public class SourceServiceImpl implements SourceService { private ScenicRepository scenicRepository; @Autowired private DeviceRepository deviceRepository; + @Autowired + private MemberRelationRepository memberRelationRepository; + @Autowired + private FaceStatusManager faceStatusManager; @Override public ApiResponse> pageQuery(SourceReqQuery sourceReqQuery) { @@ -232,4 +238,47 @@ public class SourceServiceImpl implements SourceService { PageInfo pageInfo = new PageInfo<>(list); return ApiResponse.success(pageInfo); } + + @Override + public ApiResponse cancelRelation(Long id) { + MemberSourceEntity entity = sourceMapper.getMemberSourceById(id); + if (entity == null) { + return ApiResponse.fail("关联记录不存在"); + } + int rows = sourceMapper.softDeleteRelation(id); + if (rows == 0) { + return ApiResponse.fail("记录已取消或不存在"); + } + invalidateCacheByFace(entity.getFaceId()); + return ApiResponse.success(null); + } + + @Override + public ApiResponse reactivateRelation(Long id) { + MemberSourceEntity entity = sourceMapper.getMemberSourceById(id); + if (entity == null) { + return ApiResponse.fail("关联记录不存在"); + } + int rows = sourceMapper.reactivateRelation(id); + if (rows == 0) { + return ApiResponse.fail("记录未处于取消状态"); + } + invalidateCacheByFace(entity.getFaceId()); + return ApiResponse.success(null); + } + + @Override + public ApiResponse> pageDeletedByFaceId(SourceReqQuery sourceReqQuery) { + PageHelper.startPage(sourceReqQuery.getPageNum(), sourceReqQuery.getPageSize()); + List list = sourceMapper.pageDeletedByFaceId(sourceReqQuery); + PageInfo pageInfo = new PageInfo<>(list); + return ApiResponse.success(pageInfo); + } + + private void invalidateCacheByFace(Long faceId) { + if (faceId != null) { + memberRelationRepository.clearSCacheByFace(faceId); + faceStatusManager.invalidatePuzzleSourceVersion(faceId); + } + } } diff --git a/src/main/resources/mapper/FaceMapper.xml b/src/main/resources/mapper/FaceMapper.xml index 9e36d7da..e0042730 100644 --- a/src/main/resources/mapper/FaceMapper.xml +++ b/src/main/resources/mapper/FaceMapper.xml @@ -136,7 +136,7 @@ FROM `zt`.`face` WHERE `scenic_id` = #{scenicId} AND `create_at` < #{endDate} - and `id` not in (select face_id from member_source where is_buy = 1) + and `id` not in (select face_id from member_source where is_buy = 1 AND deleted = 0) and `id` not in (select face_id from member_video where is_buy = 1) diff --git a/src/main/resources/mapper/OrderMapper.xml b/src/main/resources/mapper/OrderMapper.xml index ce0ca732..3624502f 100644 --- a/src/main/resources/mapper/OrderMapper.xml +++ b/src/main/resources/mapper/OrderMapper.xml @@ -94,14 +94,14 @@ FROM member_source ms LEFT JOIN face f ON ms.face_id = f.id LEFT JOIN source s ON ms.source_id = s.id - WHERE s.id IS NOT NULL + WHERE s.id IS NOT NULL AND ms.deleted = 0 ), member_source_aicam_data AS ( SELECT ms.member_id, ms.source_id, ms.face_id, f.face_url, s.url FROM member_source ms LEFT JOIN face f ON ms.face_id = f.id LEFT JOIN source s ON ms.source_id = s.id - WHERE s.id IS NOT NULL AND ms.type = 3 + WHERE s.id IS NOT NULL AND ms.type = 3 AND ms.deleted = 0 ), member_photo_data AS ( SELECT mp.member_id, 3 as type, mp.id, mp.crop_url as url, mp.quantity, mp.status, mp.create_time diff --git a/src/main/resources/mapper/ScenicDeviceStatsMapper.xml b/src/main/resources/mapper/ScenicDeviceStatsMapper.xml index 26c6bb4e..3b55a7cc 100644 --- a/src/main/resources/mapper/ScenicDeviceStatsMapper.xml +++ b/src/main/resources/mapper/ScenicDeviceStatsMapper.xml @@ -22,7 +22,7 @@ select s.scenic_id, s.device_id from member_source ms left join source s on ms.source_id = s.id - where ms.type = 1 and s.id is not null + where ms.type = 1 and s.id is not null and ms.deleted = 0 and s.create_time >= #{start} and s.create_time <= #{end} group by s.scenic_id, s.device_id, ms.face_id @@ -53,7 +53,7 @@ select s.scenic_id, s.device_id from member_source ms left join source s on ms.source_id = s.id - where ms.type = 2 and s.id is not null + where ms.type = 2 and s.id is not null and ms.deleted = 0 and s.create_time >= #{start} and s.create_time <= #{end} group by s.scenic_id, s.device_id, ms.face_id diff --git a/src/main/resources/mapper/SourceMapper.xml b/src/main/resources/mapper/SourceMapper.xml index ecf2a2f9..3d241be2 100644 --- a/src/main/resources/mapper/SourceMapper.xml +++ b/src/main/resources/mapper/SourceMapper.xml @@ -165,11 +165,11 @@ delete from member_source - where scenic_id = #{scenicId} and is_buy = 0 and create_time <= #{endDate} + where scenic_id = #{scenicId} and is_buy = 0 and create_time <= #{endDate} and deleted = 0 delete from member_source - where member_id = #{userId} and face_id = #{faceId} and is_buy = 0 + where member_id = #{userId} and face_id = #{faceId} and is_buy = 0 and deleted = 0 delete from source where id not in (select source_id from member_source) and face_sample_id not in (select id from face_sample) @@ -195,7 +195,7 @@ from member_source ms left join source so on ms.source_id = so.id - where so.id = #{id} and ms.member_id = #{userId} and so.id is not null + where so.id = #{id} and ms.member_id = #{userId} and so.id is not null and ms.deleted = 0 select count(1) from member_source - where member_id = #{memberId} and source_id = #{sourceId} and type = #{type} + where member_id = #{memberId} and source_id = #{sourceId} and type = #{type} and deleted = 0 select * from member_source ms - where ms.face_id = #{faceId} + where ms.face_id = #{faceId} and ms.deleted = 0 and ms.type = #{type} @@ -400,7 +402,7 @@ select s.* from source s inner join member_source ms on s.id = ms.source_id - where ms.face_id = #{faceId} and s.type = 2 + where ms.face_id = #{faceId} and s.type = 2 and ms.deleted = 0 @@ -467,6 +471,7 @@ WHERE ms.face_id = #{faceId} AND s.device_id = #{deviceId} AND s.type = #{type} + AND ms.deleted = 0 ORDER BY s.create_time DESC @@ -505,19 +510,19 @@ DELETE FROM member_source - WHERE face_id = #{faceId} AND `type` = #{type} + WHERE face_id = #{faceId} AND `type` = #{type} AND deleted = 0 SELECT source_id, face_id FROM member_source - WHERE source_id IN + WHERE deleted = 0 AND source_id IN #{item} @@ -537,10 +542,31 @@ ms.is_free, so.create_time, ms.is_buy, so.device_id FROM member_source ms LEFT JOIN source so ON ms.source_id = so.id - WHERE ms.face_id = #{faceId} AND so.id IS NOT NULL + WHERE ms.face_id = #{faceId} AND so.id IS NOT NULL AND ms.deleted = 0 AND ms.type = #{type} AND ms.scenic_id = #{scenicId} AND ms.is_buy = #{isBuy} ORDER BY so.create_time DESC + + UPDATE member_source SET deleted = 1, deleted_at = NOW() + WHERE id = #{id} AND deleted = 0 + + + UPDATE member_source SET deleted = 0, deleted_at = NULL + WHERE id = #{id} AND deleted = 1 + + +