From f0bd5ba1e566b055f06846fbe3949e49aac1f949 Mon Sep 17 00:00:00 2001 From: dashixiong Date: Wed, 18 Feb 2026 16:27:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- configure/dev/application.properties | 2 +- configure/prod/application.properties | 2 +- .../fuint/common/config/SwaggerConfig.java | 4 +- .../java/com/fuint/common/dto/TaskDto.java | 16 + .../fuint/common/enums/BookStatusEnum.java | 6 +- .../com/fuint/common/param/LookWorkPage.java | 30 + .../fuint/common/param/TaskRecordPage.java | 36 ++ .../com/fuint/common/service/LookService.java | 63 ++ .../com/fuint/common/service/TaskService.java | 11 + .../service/impl/BookItemServiceImpl.java | 24 +- .../common/service/impl/LookServiceImpl.java | 541 ++++++++++++++++++ .../common/service/impl/TaskServiceImpl.java | 479 +++++++++++++++- .../controller/BackendLookController.java | 91 +++ .../controller/BackendTaskController.java | 67 +++ .../controller/ClientBookController.java | 10 + .../controller/ClientLookController.java | 235 ++++++++ .../controller/ClientTaskController.java | 5 + .../src/main/resources/application.properties | 2 +- .../mapper/MtLookCommentMapper.java | 17 + .../repository/mapper/MtLookLikeMapper.java | 12 + .../repository/mapper/MtLookWorkMapper.java | 21 + .../repository/mapper/MtOrderMapper.java | 9 + .../fuint/repository/model/MtLookComment.java | 61 ++ .../fuint/repository/model/MtLookLike.java | 52 ++ .../fuint/repository/model/MtLookWork.java | 67 +++ .../com/fuint/repository/model/MtTask.java | 16 + .../resources/mapper/MtLookCommentMapper.xml | 11 + .../resources/mapper/MtLookWorkMapper.xml | 19 + .../main/resources/mapper/MtOrderMapper.xml | 30 + 29 files changed, 1918 insertions(+), 21 deletions(-) create mode 100644 fuint-application/src/main/java/com/fuint/common/param/LookWorkPage.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/TaskRecordPage.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/LookService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/LookServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendLookController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientLookController.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtLookCommentMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtLookLikeMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtLookWorkMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtLookComment.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtLookLike.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtLookWork.java create mode 100644 fuint-repository/src/main/resources/mapper/MtLookCommentMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtLookWorkMapper.xml diff --git a/configure/dev/application.properties b/configure/dev/application.properties index 829d60a..2f263e5 100644 --- a/configure/dev/application.properties +++ b/configure/dev/application.properties @@ -26,7 +26,7 @@ spring.redis.pool.min-idle=0 spring.redis.timeout=0 # 系统名称 -system.name = fuint会员营销管理系统 +system.name = 手工王国 # 前端h5地址 website.url=https://www.fuint.cn/h5/ diff --git a/configure/prod/application.properties b/configure/prod/application.properties index ea07e89..da2ae7f 100644 --- a/configure/prod/application.properties +++ b/configure/prod/application.properties @@ -26,7 +26,7 @@ spring.redis.pool.min-idle=0 spring.redis.timeout=0 # 系统名称 -system.name = fuint会员营销管理系统 +system.name = 手工王国 # 前端h5地址 website.url=https://www.fuint.cn/h5/ diff --git a/fuint-application/src/main/java/com/fuint/common/config/SwaggerConfig.java b/fuint-application/src/main/java/com/fuint/common/config/SwaggerConfig.java index 32febeb..a980c9c 100644 --- a/fuint-application/src/main/java/com/fuint/common/config/SwaggerConfig.java +++ b/fuint-application/src/main/java/com/fuint/common/config/SwaggerConfig.java @@ -34,8 +34,8 @@ public class SwaggerConfig implements WebMvcConfigurer { @Bean public ApiInfo apiInfo() { return new ApiInfoBuilder() - .title("fuint会员营销系统接口文档") - .description("fuint会员营销系统接口文档,“/clientApi”目录接口为会员端相关接口,“/backendApi”目录接口为后台管理端相关接口。") + .title("手工王国接口文档") + .description("手工王国接口文档,“/clientApi”目录接口为会员端相关接口,“/backendApi”目录接口为后台管理端相关接口。") .termsOfServiceUrl("https://www.fuint.cn/") .contact(new Contact("海南延禾信息技术有限公司","https://www.fuint.cn/", "fushengqian@qq.com")) .version("1.0") diff --git a/fuint-application/src/main/java/com/fuint/common/dto/TaskDto.java b/fuint-application/src/main/java/com/fuint/common/dto/TaskDto.java index dc49ebf..e613c0b 100644 --- a/fuint-application/src/main/java/com/fuint/common/dto/TaskDto.java +++ b/fuint-application/src/main/java/com/fuint/common/dto/TaskDto.java @@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Date; /** @@ -42,6 +43,21 @@ public class TaskDto implements Serializable { @ApiModelProperty("奖励积分") private Integer rewardPoint; + @ApiModelProperty("奖励余额") + private BigDecimal rewardBalance; + + @ApiModelProperty("银币阈值(订单使用银币数量)") + private Integer pointThreshold; + + @ApiModelProperty("余额阈值(订单使用余额金额)") + private BigDecimal balanceThreshold; + + @ApiModelProperty("指定商品ID,多个逗号分隔,空表示全部商品") + private String targetGoodsIds; + + @ApiModelProperty("完成阈值(订单金额/点赞数)") + private BigDecimal completeThreshold; + @ApiModelProperty("每日可领取次数") private Integer dailyLimit; diff --git a/fuint-application/src/main/java/com/fuint/common/enums/BookStatusEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/BookStatusEnum.java index ff20ee8..f797df5 100644 --- a/fuint-application/src/main/java/com/fuint/common/enums/BookStatusEnum.java +++ b/fuint-application/src/main/java/com/fuint/common/enums/BookStatusEnum.java @@ -13,9 +13,9 @@ import java.util.stream.Collectors; * CopyRight https://www.fuint.cn */ public enum BookStatusEnum { - CREATED("A", "待确认"), - CONFIRM("B", "待签到"), - FAIL("F", "预约失败"), + CREATED("A", "已预约"), + CONFIRM("B", "进行中"), + WAIT_PAY("F", "待付款"), CANCEL("C", "已取消"), DELETE("D", "已删除"), COMPLETE("E", "已完成"); diff --git a/fuint-application/src/main/java/com/fuint/common/param/LookWorkPage.java b/fuint-application/src/main/java/com/fuint/common/param/LookWorkPage.java new file mode 100644 index 0000000..dea5861 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/LookWorkPage.java @@ -0,0 +1,30 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 看看作品分页参数 + * + * Created by Codex + */ +@Data +public class LookWorkPage extends PageParam implements Serializable { + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("标题") + private String title; + + @ApiModelProperty("状态") + private String status; +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/TaskRecordPage.java b/fuint-application/src/main/java/com/fuint/common/param/TaskRecordPage.java new file mode 100644 index 0000000..b680634 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/TaskRecordPage.java @@ -0,0 +1,36 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 任务完成记录分页请求参数 + * + * Created by Codex + */ +@Data +public class TaskRecordPage extends PageParam implements Serializable { + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("任务ID") + private Integer taskId; + + @ApiModelProperty("任务名称") + private String taskName; + + @ApiModelProperty("任务日期(yyyy-MM-dd)") + private String taskDate; + + @ApiModelProperty("会员号") + private String userNo; + + @ApiModelProperty("手机号") + private String mobile; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/LookService.java b/fuint-application/src/main/java/com/fuint/common/service/LookService.java new file mode 100644 index 0000000..3cfc745 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/LookService.java @@ -0,0 +1,63 @@ +package com.fuint.common.service; + +import com.fuint.common.param.LookWorkPage; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtLookWork; + +import java.util.List; +import java.util.Map; + +/** + * 看看功能业务接口 + * + * Created by Codex + */ +public interface LookService { + + PaginationResponse> queryWorkListForAdmin(LookWorkPage page) throws BusinessCheckException; + + PaginationResponse> queryWorkListForClient(Integer merchantId, + Integer storeId, + Integer userId, + Integer page, + Integer pageSize, + boolean onlyMine) throws BusinessCheckException; + + Map getWorkDetail(Integer workId, Integer userId) throws BusinessCheckException; + + Map getWorkDetailForAdmin(Integer workId) throws BusinessCheckException; + + MtLookWork saveWork(Integer merchantId, + Integer storeId, + Integer userId, + String title, + String description, + List images, + String operator) throws BusinessCheckException; + + void removeWork(Integer workId, Integer userId, String operator) throws BusinessCheckException; + + PaginationResponse> queryCommentList(Integer workId, + Integer page, + Integer pageSize, + Integer userId) throws BusinessCheckException; + + Map saveComment(Integer workId, + Integer userId, + String content, + List images, + String operator) throws BusinessCheckException; + + Map toggleWorkLike(Integer workId, + Integer userId, + Integer merchantId, + Integer storeId) throws BusinessCheckException; + + Map toggleCommentLike(Integer commentId, + Integer userId, + Integer merchantId, + Integer storeId) throws BusinessCheckException; + + void updateWorkStatus(Integer workId, String status, String operator, Integer merchantId) throws BusinessCheckException; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/TaskService.java b/fuint-application/src/main/java/com/fuint/common/service/TaskService.java index 7f4ffdf..751c997 100644 --- a/fuint-application/src/main/java/com/fuint/common/service/TaskService.java +++ b/fuint-application/src/main/java/com/fuint/common/service/TaskService.java @@ -3,6 +3,7 @@ package com.fuint.common.service; import com.baomidou.mybatisplus.extension.service.IService; import com.fuint.common.dto.TaskDto; import com.fuint.common.param.TaskPage; +import com.fuint.common.param.TaskRecordPage; import com.fuint.framework.exception.BusinessCheckException; import com.fuint.framework.pagination.PaginationResponse; import com.fuint.repository.model.MtTask; @@ -22,6 +23,11 @@ public interface TaskService extends IService { */ PaginationResponse queryTaskListByPagination(TaskPage taskPage) throws BusinessCheckException; + /** + * 分页查询任务完成记录 + */ + PaginationResponse> queryTaskRecordListByPagination(TaskRecordPage taskRecordPage) throws BusinessCheckException; + /** * 添加任务 */ @@ -56,4 +62,9 @@ public interface TaskService extends IService { * 领取任务奖励 */ Map claimTask(Integer merchantId, Integer storeId, Integer userId, Integer taskId, String operator) throws BusinessCheckException; + + /** + * 导入公共任务(merchantId=0, storeId=0)到指定商户/店铺 + */ + Map importPublicTask(Integer merchantId, Integer storeId, List taskIds, String operator) throws BusinessCheckException; } diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/BookItemServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/BookItemServiceImpl.java index fb4f507..6e7a235 100644 --- a/fuint-application/src/main/java/com/fuint/common/service/impl/BookItemServiceImpl.java +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/BookItemServiceImpl.java @@ -156,6 +156,8 @@ public class BookItemServiceImpl extends ServiceImpl bookable = bookService.isBookable(param); - if (bookable.size() <= 0) { - throw new BusinessCheckException("当前时间段不可预约,请重新选择!"); + if (!quickSign) { + BookableParam param = new BookableParam(); + param.setBookId(mtBookItem.getBookId()); + param.setDate(mtBookItem.getServiceDate()); + param.setTime(mtBookItem.getServiceTime()); + List bookable = bookService.isBookable(param); + if (bookable.size() <= 0) { + throw new BusinessCheckException("当前时间段不可预约,请重新选择!"); + } } LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); @@ -185,13 +189,13 @@ public class BookItemServiceImpl extends ServiceImpl 0) { queryWrapper.eq(MtBookItem::getGoodsId, mtBookItem.getGoodsId()); } - queryWrapper.in(MtBookItem::getStatus, BookStatusEnum.CREATED.getKey(), BookStatusEnum.CONFIRM.getKey()); + queryWrapper.in(MtBookItem::getStatus, BookStatusEnum.CREATED.getKey(), BookStatusEnum.CONFIRM.getKey(), BookStatusEnum.WAIT_PAY.getKey()); List data = mtBookItemMapper.selectList(queryWrapper); - if (data != null && data.size() > 0) { + if (!quickSign && data != null && data.size() > 0) { throw new BusinessCheckException("您在该时段已有预约,请勿重复提交!"); } - mtBookItem.setStatus(BookStatusEnum.CONFIRM.getKey()); + mtBookItem.setStatus(BookStatusEnum.CREATED.getKey()); mtBookItem.setUpdateTime(new Date()); mtBookItem.setCreateTime(new Date()); mtBookItem.setVerifyCode(SeqUtil.getRandomNumber(4)); diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/LookServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/LookServiceImpl.java new file mode 100644 index 0000000..c34226a --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/LookServiceImpl.java @@ -0,0 +1,541 @@ +package com.fuint.common.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.param.LookWorkPage; +import com.fuint.common.service.LookService; +import com.fuint.common.service.MemberService; +import com.fuint.common.service.SettingService; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.mapper.MtLookCommentMapper; +import com.fuint.repository.mapper.MtLookLikeMapper; +import com.fuint.repository.mapper.MtLookWorkMapper; +import com.fuint.repository.model.MtLookComment; +import com.fuint.repository.model.MtLookLike; +import com.fuint.repository.model.MtLookWork; +import com.fuint.repository.model.MtUser; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 看看功能服务实现 + * + * Created by Codex + */ +@Service +@AllArgsConstructor(onConstructor_ = {@Lazy}) +public class LookServiceImpl implements LookService { + + private static final String TARGET_TYPE_WORK = "WORK"; + private static final String TARGET_TYPE_COMMENT = "COMMENT"; + + private MtLookWorkMapper mtLookWorkMapper; + + private MtLookCommentMapper mtLookCommentMapper; + + private MtLookLikeMapper mtLookLikeMapper; + + private MemberService memberService; + + private SettingService settingService; + + @Override + public PaginationResponse> queryWorkListForAdmin(LookWorkPage page) { + Page pageHelper = PageHelper.startPage(page.getPage(), page.getPageSize()); + + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.ne(MtLookWork::getStatus, StatusEnum.DISABLE.getKey()); + + if (StringUtils.isNotBlank(page.getTitle())) { + wrapper.like(MtLookWork::getTitle, page.getTitle()); + } + if (StringUtils.isNotBlank(page.getStatus())) { + wrapper.eq(MtLookWork::getStatus, page.getStatus()); + } + if (page.getMerchantId() != null && page.getMerchantId() > 0) { + wrapper.eq(MtLookWork::getMerchantId, page.getMerchantId()); + } + if (page.getStoreId() != null && page.getStoreId() > 0) { + wrapper.eq(MtLookWork::getStoreId, page.getStoreId()); + } + wrapper.orderByDesc(MtLookWork::getId); + + List list = mtLookWorkMapper.selectList(wrapper); + List> dataList = toWorkListResult(list, null, true); + + PageRequest pageRequest = PageRequest.of(page.getPage(), page.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse> paginationResponse = new PaginationResponse(pageImpl, Map.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + return paginationResponse; + } + + @Override + public PaginationResponse> queryWorkListForClient(Integer merchantId, + Integer storeId, + Integer userId, + Integer page, + Integer pageSize, + boolean onlyMine) { + int currentPage = page == null || page < 1 ? 1 : page; + int size = pageSize == null || pageSize < 1 ? 10 : pageSize; + + Page pageHelper = PageHelper.startPage(currentPage, size); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(MtLookWork::getMerchantId, merchantId) + .ne(MtLookWork::getStatus, StatusEnum.DISABLE.getKey()); + + if (onlyMine && userId != null && userId > 0) { + wrapper.eq(MtLookWork::getUserId, userId) + .ne(MtLookWork::getStatus, StatusEnum.DISABLE.getKey()); + } else { + wrapper.eq(MtLookWork::getStatus, StatusEnum.ENABLED.getKey()); + } + + if (storeId != null && storeId > 0) { + wrapper.and(wq -> wq.eq(MtLookWork::getStoreId, 0).or().eq(MtLookWork::getStoreId, storeId)); + } + + wrapper.orderByDesc(MtLookWork::getId); + List list = mtLookWorkMapper.selectList(wrapper); + List> dataList = toWorkListResult(list, userId, false); + + PageRequest pageRequest = PageRequest.of(currentPage, size); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse> paginationResponse = new PaginationResponse(pageImpl, Map.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + return paginationResponse; + } + + @Override + public Map getWorkDetail(Integer workId, Integer userId) throws BusinessCheckException { + MtLookWork work = mtLookWorkMapper.selectById(workId); + if (work == null || StatusEnum.DISABLE.getKey().equals(work.getStatus())) { + throw new BusinessCheckException("作品不存在"); + } + if (StatusEnum.ENABLED.getKey().equals(work.getStatus()) || (userId != null && userId.equals(work.getUserId()))) { + Map result = toWorkItemResult(work, userId, false); + return result; + } + throw new BusinessCheckException("作品已下架"); + } + + @Override + public Map getWorkDetailForAdmin(Integer workId) throws BusinessCheckException { + MtLookWork work = mtLookWorkMapper.selectById(workId); + if (work == null || StatusEnum.DISABLE.getKey().equals(work.getStatus())) { + throw new BusinessCheckException("作品不存在"); + } + return toWorkItemResult(work, null, true); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public MtLookWork saveWork(Integer merchantId, + Integer storeId, + Integer userId, + String title, + String description, + List images, + String operator) throws BusinessCheckException { + if (merchantId == null || merchantId <= 0) { + throw new BusinessCheckException("商户信息异常"); + } + if (userId == null || userId <= 0) { + throw new BusinessCheckException("用户信息异常"); + } + if (StringUtils.isBlank(title)) { + throw new BusinessCheckException("作品标题不能为空"); + } + if (StringUtils.isBlank(description)) { + throw new BusinessCheckException("作品描述不能为空"); + } + if (images == null || images.isEmpty()) { + throw new BusinessCheckException("请至少上传1张作品图"); + } + + MtLookWork work = new MtLookWork(); + work.setMerchantId(merchantId); + work.setStoreId(storeId == null ? 0 : storeId); + work.setUserId(userId); + work.setTitle(title); + work.setDescription(description); + work.setImages(joinImages(images)); + work.setCover(images.get(0)); + work.setLikeNum(0); + work.setCommentNum(0); + work.setStatus(StatusEnum.ENABLED.getKey()); + work.setOperator(StringUtils.isBlank(operator) ? String.valueOf(userId) : operator); + work.setCreateTime(new Date()); + work.setUpdateTime(new Date()); + + mtLookWorkMapper.insert(work); + return work; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void removeWork(Integer workId, Integer userId, String operator) throws BusinessCheckException { + MtLookWork work = mtLookWorkMapper.selectById(workId); + if (work == null || StatusEnum.DISABLE.getKey().equals(work.getStatus())) { + throw new BusinessCheckException("作品不存在"); + } + if (userId == null || !userId.equals(work.getUserId())) { + throw new BusinessCheckException("无权删除该作品"); + } + + MtLookWork update = new MtLookWork(); + update.setId(workId); + update.setStatus(StatusEnum.DISABLE.getKey()); + update.setOperator(StringUtils.isBlank(operator) ? String.valueOf(userId) : operator); + update.setUpdateTime(new Date()); + mtLookWorkMapper.updateById(update); + } + + @Override + public PaginationResponse> queryCommentList(Integer workId, + Integer page, + Integer pageSize, + Integer userId) throws BusinessCheckException { + MtLookWork work = mtLookWorkMapper.selectById(workId); + if (work == null || StatusEnum.DISABLE.getKey().equals(work.getStatus())) { + throw new BusinessCheckException("作品不存在"); + } + + int currentPage = page == null || page < 1 ? 1 : page; + int size = pageSize == null || pageSize < 1 ? 20 : pageSize; + + Page pageHelper = PageHelper.startPage(currentPage, size); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(MtLookComment::getWorkId, workId) + .eq(MtLookComment::getStatus, StatusEnum.ENABLED.getKey()) + .orderByDesc(MtLookComment::getId); + List list = mtLookCommentMapper.selectList(wrapper); + List> dataList = toCommentListResult(list, userId); + + PageRequest pageRequest = PageRequest.of(currentPage, size); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse> paginationResponse = new PaginationResponse(pageImpl, Map.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + return paginationResponse; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Map saveComment(Integer workId, + Integer userId, + String content, + List images, + String operator) throws BusinessCheckException { + MtLookWork work = mtLookWorkMapper.selectById(workId); + if (work == null || !StatusEnum.ENABLED.getKey().equals(work.getStatus())) { + throw new BusinessCheckException("作品不存在或已下架"); + } + if (StringUtils.isBlank(content) && (images == null || images.isEmpty())) { + throw new BusinessCheckException("请输入留言内容或上传图片"); + } + if (userId == null || userId <= 0) { + throw new BusinessCheckException("用户信息异常"); + } + + MtLookComment comment = new MtLookComment(); + comment.setMerchantId(work.getMerchantId()); + comment.setStoreId(work.getStoreId()); + comment.setWorkId(workId); + comment.setUserId(userId); + comment.setContent(StringUtils.isBlank(content) ? "" : content); + comment.setImages(joinImages(images)); + comment.setLikeNum(0); + comment.setStatus(StatusEnum.ENABLED.getKey()); + comment.setOperator(StringUtils.isBlank(operator) ? String.valueOf(userId) : operator); + comment.setCreateTime(new Date()); + comment.setUpdateTime(new Date()); + + mtLookCommentMapper.insert(comment); + mtLookWorkMapper.incrCommentNum(workId); + return toCommentItemResult(comment, userId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Map toggleWorkLike(Integer workId, + Integer userId, + Integer merchantId, + Integer storeId) throws BusinessCheckException { + if (userId == null || userId <= 0) { + throw new BusinessCheckException("请先登录"); + } + MtLookWork work = mtLookWorkMapper.selectById(workId); + if (work == null || !StatusEnum.ENABLED.getKey().equals(work.getStatus())) { + throw new BusinessCheckException("作品不存在或已下架"); + } + if (merchantId != null && merchantId > 0 && !merchantId.equals(work.getMerchantId())) { + throw new BusinessCheckException("作品不存在"); + } + if (storeId != null && storeId > 0 && work.getStoreId() != null && work.getStoreId() > 0 && !storeId.equals(work.getStoreId())) { + throw new BusinessCheckException("作品不存在"); + } + + MtLookLike like = queryLike(userId, TARGET_TYPE_WORK, workId); + boolean liked; + if (like == null) { + like = new MtLookLike(); + like.setMerchantId(work.getMerchantId()); + like.setStoreId(work.getStoreId()); + like.setUserId(userId); + like.setTargetType(TARGET_TYPE_WORK); + like.setTargetId(workId); + like.setStatus(StatusEnum.ENABLED.getKey()); + like.setCreateTime(new Date()); + like.setUpdateTime(new Date()); + mtLookLikeMapper.insert(like); + mtLookWorkMapper.incrLikeNum(workId); + liked = true; + } else if (StatusEnum.ENABLED.getKey().equals(like.getStatus())) { + like.setStatus(StatusEnum.FORBIDDEN.getKey()); + like.setUpdateTime(new Date()); + mtLookLikeMapper.updateById(like); + mtLookWorkMapper.decrLikeNum(workId); + liked = false; + } else { + like.setStatus(StatusEnum.ENABLED.getKey()); + like.setUpdateTime(new Date()); + mtLookLikeMapper.updateById(like); + mtLookWorkMapper.incrLikeNum(workId); + liked = true; + } + + MtLookWork latest = mtLookWorkMapper.selectById(workId); + Map result = new HashMap<>(); + result.put("liked", liked); + result.put("likeCount", latest.getLikeNum() == null ? 0 : latest.getLikeNum()); + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Map toggleCommentLike(Integer commentId, + Integer userId, + Integer merchantId, + Integer storeId) throws BusinessCheckException { + if (userId == null || userId <= 0) { + throw new BusinessCheckException("请先登录"); + } + MtLookComment comment = mtLookCommentMapper.selectById(commentId); + if (comment == null || !StatusEnum.ENABLED.getKey().equals(comment.getStatus())) { + throw new BusinessCheckException("评论不存在"); + } + MtLookWork work = mtLookWorkMapper.selectById(comment.getWorkId()); + if (work == null || !StatusEnum.ENABLED.getKey().equals(work.getStatus())) { + throw new BusinessCheckException("作品不存在或已下架"); + } + if (merchantId != null && merchantId > 0 && !merchantId.equals(comment.getMerchantId())) { + throw new BusinessCheckException("评论不存在"); + } + if (storeId != null && storeId > 0 && comment.getStoreId() != null && comment.getStoreId() > 0 && !storeId.equals(comment.getStoreId())) { + throw new BusinessCheckException("评论不存在"); + } + + MtLookLike like = queryLike(userId, TARGET_TYPE_COMMENT, commentId); + boolean liked; + if (like == null) { + like = new MtLookLike(); + like.setMerchantId(comment.getMerchantId()); + like.setStoreId(comment.getStoreId()); + like.setUserId(userId); + like.setTargetType(TARGET_TYPE_COMMENT); + like.setTargetId(commentId); + like.setStatus(StatusEnum.ENABLED.getKey()); + like.setCreateTime(new Date()); + like.setUpdateTime(new Date()); + mtLookLikeMapper.insert(like); + mtLookCommentMapper.incrLikeNum(commentId); + liked = true; + } else if (StatusEnum.ENABLED.getKey().equals(like.getStatus())) { + like.setStatus(StatusEnum.FORBIDDEN.getKey()); + like.setUpdateTime(new Date()); + mtLookLikeMapper.updateById(like); + mtLookCommentMapper.decrLikeNum(commentId); + liked = false; + } else { + like.setStatus(StatusEnum.ENABLED.getKey()); + like.setUpdateTime(new Date()); + mtLookLikeMapper.updateById(like); + mtLookCommentMapper.incrLikeNum(commentId); + liked = true; + } + + MtLookComment latest = mtLookCommentMapper.selectById(commentId); + Map result = new HashMap<>(); + result.put("liked", liked); + result.put("likeCount", latest.getLikeNum() == null ? 0 : latest.getLikeNum()); + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateWorkStatus(Integer workId, String status, String operator, Integer merchantId) throws BusinessCheckException { + MtLookWork work = mtLookWorkMapper.selectById(workId); + if (work == null || StatusEnum.DISABLE.getKey().equals(work.getStatus())) { + throw new BusinessCheckException("作品不存在"); + } + if (merchantId != null && merchantId > 0 && !merchantId.equals(work.getMerchantId())) { + throw new BusinessCheckException("无权操作该作品"); + } + + MtLookWork update = new MtLookWork(); + update.setId(workId); + update.setStatus(status); + update.setOperator(operator); + update.setUpdateTime(new Date()); + mtLookWorkMapper.updateById(update); + } + + private MtLookLike queryLike(Integer userId, String targetType, Integer targetId) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(MtLookLike::getUserId, userId) + .eq(MtLookLike::getTargetType, targetType) + .eq(MtLookLike::getTargetId, targetId) + .ne(MtLookLike::getStatus, StatusEnum.DISABLE.getKey()) + .last("limit 1"); + return mtLookLikeMapper.selectOne(wrapper); + } + + private List> toWorkListResult(List list, Integer userId, boolean adminMode) { + List> result = new ArrayList<>(); + for (MtLookWork item : list) { + result.add(toWorkItemResult(item, userId, adminMode)); + } + return result; + } + + private Map toWorkItemResult(MtLookWork item, Integer userId, boolean adminMode) { + Map result = new HashMap<>(); + result.put("id", item.getId()); + result.put("merchantId", item.getMerchantId()); + result.put("storeId", item.getStoreId()); + result.put("userId", item.getUserId()); + result.put("title", item.getTitle()); + result.put("desc", item.getDescription()); + result.put("description", item.getDescription()); + result.put("cover", resolveImage(item.getCover())); + result.put("images", splitImages(item.getImages()).stream().map(this::resolveImage).collect(Collectors.toList())); + result.put("likes", item.getLikeNum() == null ? 0 : item.getLikeNum()); + result.put("comments", item.getCommentNum() == null ? 0 : item.getCommentNum()); + result.put("status", item.getStatus()); + result.put("createTime", item.getCreateTime()); + result.put("updateTime", item.getUpdateTime()); + result.put("operator", item.getOperator()); + + MtUser user = null; + try { + user = memberService.queryMemberById(item.getUserId()); + } catch (BusinessCheckException e) { + // ignore + } + result.put("author", user == null ? "手作玩家" : user.getName()); + result.put("authorAvatar", user == null ? "" : user.getAvatar()); + + if (!adminMode && userId != null && userId > 0) { + MtLookLike like = queryLike(userId, TARGET_TYPE_WORK, item.getId()); + result.put("isLiked", like != null && StatusEnum.ENABLED.getKey().equals(like.getStatus())); + } else { + result.put("isLiked", false); + } + return result; + } + + private List> toCommentListResult(List list, Integer userId) { + List> result = new ArrayList<>(); + for (MtLookComment item : list) { + result.add(toCommentItemResult(item, userId)); + } + return result; + } + + private Map toCommentItemResult(MtLookComment item, Integer userId) { + Map result = new HashMap<>(); + result.put("id", item.getId()); + result.put("workId", item.getWorkId()); + result.put("authorId", item.getUserId()); + result.put("content", item.getContent()); + result.put("images", splitImages(item.getImages()).stream().map(this::resolveImage).collect(Collectors.toList())); + result.put("likeCount", item.getLikeNum() == null ? 0 : item.getLikeNum()); + result.put("createTime", item.getCreateTime()); + + MtUser user = null; + try { + user = memberService.queryMemberById(item.getUserId()); + } catch (BusinessCheckException e) { + // ignore + } + result.put("author", user == null ? "匿名用户" : user.getName()); + result.put("authorAvatar", user == null ? "" : user.getAvatar()); + + if (userId != null && userId > 0) { + MtLookLike like = queryLike(userId, TARGET_TYPE_COMMENT, item.getId()); + result.put("isLiked", like != null && StatusEnum.ENABLED.getKey().equals(like.getStatus())); + } else { + result.put("isLiked", false); + } + return result; + } + + private String joinImages(List images) { + if (images == null || images.isEmpty()) { + return ""; + } + List valid = images.stream().filter(StringUtils::isNotBlank).collect(Collectors.toList()); + return String.join(",", valid); + } + + private List splitImages(String images) { + if (StringUtils.isBlank(images)) { + return new ArrayList<>(); + } + return Arrays.stream(images.split(",")).filter(StringUtils::isNotBlank).collect(Collectors.toList()); + } + + private String resolveImage(String path) { + if (StringUtils.isBlank(path)) { + return ""; + } + if (path.startsWith("http://") || path.startsWith("https://")) { + return path; + } + String base = settingService.getUploadBasePath(); + if (StringUtils.isBlank(base)) { + return path; + } + if (base.endsWith("/") && path.startsWith("/")) { + return base + path.substring(1); + } + if (!base.endsWith("/") && !path.startsWith("/")) { + return base + "/" + path; + } + return base + path; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/TaskServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/TaskServiceImpl.java index 7319f09..e2c4bf0 100644 --- a/fuint-application/src/main/java/com/fuint/common/service/impl/TaskServiceImpl.java +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/TaskServiceImpl.java @@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fuint.common.dto.TaskDto; import com.fuint.common.enums.StatusEnum; import com.fuint.common.param.TaskPage; +import com.fuint.common.param.TaskRecordPage; +import com.fuint.common.service.BalanceService; import com.fuint.common.service.PointService; import com.fuint.common.service.StoreService; import com.fuint.common.service.TaskService; @@ -13,13 +15,20 @@ import com.fuint.common.util.DateUtil; import com.fuint.framework.annoation.OperationServiceLog; import com.fuint.framework.exception.BusinessCheckException; import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.mapper.MtBalanceMapper; +import com.fuint.repository.mapper.MtLookWorkMapper; +import com.fuint.repository.mapper.MtOrderMapper; import com.fuint.repository.mapper.MtPointMapper; import com.fuint.repository.mapper.MtTaskMapper; import com.fuint.repository.mapper.MtTaskRecordMapper; +import com.fuint.repository.mapper.MtUserMapper; +import com.fuint.repository.model.MtBalance; +import com.fuint.repository.model.MtLookWork; import com.fuint.repository.model.MtPoint; import com.fuint.repository.model.MtStore; import com.fuint.repository.model.MtTask; import com.fuint.repository.model.MtTaskRecord; +import com.fuint.repository.model.MtUser; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import lombok.AllArgsConstructor; @@ -33,11 +42,16 @@ import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; /** * 任务中心服务实现 @@ -49,15 +63,27 @@ import java.util.Map; public class TaskServiceImpl extends ServiceImpl implements TaskService { private static final Logger logger = LoggerFactory.getLogger(TaskServiceImpl.class); + private static final String TASK_CODE_ORDER_COMPLETE_BY_AMOUNT = "ORDER_COMPLETE_BY_AMOUNT"; + private static final String TASK_CODE_LOOK_PUBLISH_BY_LIKE = "LOOK_PUBLISH_BY_LIKE"; private MtTaskMapper mtTaskMapper; private MtTaskRecordMapper mtTaskRecordMapper; + private MtUserMapper mtUserMapper; + private MtPointMapper mtPointMapper; + private MtBalanceMapper mtBalanceMapper; + + private MtOrderMapper mtOrderMapper; + + private MtLookWorkMapper mtLookWorkMapper; + private PointService pointService; + private BalanceService balanceService; + private StoreService storeService; @Override @@ -94,6 +120,154 @@ public class TaskServiceImpl extends ServiceImpl implement return paginationResponse; } + @Override + public PaginationResponse> queryTaskRecordListByPagination(TaskRecordPage taskRecordPage) { + List matchTaskIds = null; + if (StringUtils.isNotBlank(taskRecordPage.getTaskName())) { + LambdaQueryWrapper taskWrapper = Wrappers.lambdaQuery(); + taskWrapper.select(MtTask::getId) + .like(MtTask::getTaskName, taskRecordPage.getTaskName()) + .ne(MtTask::getStatus, StatusEnum.DISABLE.getKey()); + if (taskRecordPage.getMerchantId() != null) { + taskWrapper.eq(MtTask::getMerchantId, taskRecordPage.getMerchantId()); + } + if (taskRecordPage.getStoreId() != null) { + taskWrapper.and(wq -> wq.eq(MtTask::getStoreId, 0).or().eq(MtTask::getStoreId, taskRecordPage.getStoreId())); + } + List taskList = mtTaskMapper.selectList(taskWrapper); + matchTaskIds = new ArrayList<>(); + for (MtTask task : taskList) { + matchTaskIds.add(task.getId()); + } + if (matchTaskIds.isEmpty()) { + return emptyTaskRecordPage(taskRecordPage); + } + } + + List matchUserIds = null; + if (StringUtils.isNotBlank(taskRecordPage.getUserNo()) || StringUtils.isNotBlank(taskRecordPage.getMobile())) { + LambdaQueryWrapper userWrapper = Wrappers.lambdaQuery(); + userWrapper.select(MtUser::getId) + .ne(MtUser::getStatus, StatusEnum.DISABLE.getKey()); + if (taskRecordPage.getMerchantId() != null) { + userWrapper.eq(MtUser::getMerchantId, taskRecordPage.getMerchantId()); + } + if (StringUtils.isNotBlank(taskRecordPage.getUserNo())) { + userWrapper.like(MtUser::getUserNo, taskRecordPage.getUserNo()); + } + if (StringUtils.isNotBlank(taskRecordPage.getMobile())) { + userWrapper.like(MtUser::getMobile, taskRecordPage.getMobile()); + } + List userList = mtUserMapper.selectList(userWrapper); + matchUserIds = new ArrayList<>(); + for (MtUser user : userList) { + matchUserIds.add(user.getId()); + } + if (matchUserIds.isEmpty()) { + return emptyTaskRecordPage(taskRecordPage); + } + } + + Page pageHelper = PageHelper.startPage(taskRecordPage.getPage(), taskRecordPage.getPageSize()); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.ne(MtTaskRecord::getStatus, StatusEnum.DISABLE.getKey()); + if (taskRecordPage.getMerchantId() != null) { + wrapper.eq(MtTaskRecord::getMerchantId, taskRecordPage.getMerchantId()); + } + if (taskRecordPage.getStoreId() != null) { + wrapper.and(wq -> wq.eq(MtTaskRecord::getStoreId, 0).or().eq(MtTaskRecord::getStoreId, taskRecordPage.getStoreId())); + } + if (taskRecordPage.getTaskId() != null && taskRecordPage.getTaskId() > 0) { + wrapper.eq(MtTaskRecord::getTaskId, taskRecordPage.getTaskId()); + } + if (StringUtils.isNotBlank(taskRecordPage.getTaskDate())) { + wrapper.eq(MtTaskRecord::getTaskDate, taskRecordPage.getTaskDate()); + } + if (matchTaskIds != null) { + wrapper.in(MtTaskRecord::getTaskId, matchTaskIds); + } + if (matchUserIds != null) { + wrapper.in(MtTaskRecord::getUserId, matchUserIds); + } + + wrapper.orderByDesc(MtTaskRecord::getTaskDate) + .orderByDesc(MtTaskRecord::getLastCompleteTime) + .orderByDesc(MtTaskRecord::getId); + + List recordList = mtTaskRecordMapper.selectList(wrapper); + if (recordList == null) { + recordList = Collections.emptyList(); + } + + Set taskIdSet = new HashSet<>(); + Set userIdSet = new HashSet<>(); + for (MtTaskRecord record : recordList) { + if (record.getTaskId() != null && record.getTaskId() > 0) { + taskIdSet.add(record.getTaskId()); + } + if (record.getUserId() != null && record.getUserId() > 0) { + userIdSet.add(record.getUserId()); + } + } + + Map taskMap = new HashMap<>(); + if (!taskIdSet.isEmpty()) { + LambdaQueryWrapper taskWrapper = Wrappers.lambdaQuery(); + taskWrapper.in(MtTask::getId, taskIdSet); + List taskList = mtTaskMapper.selectList(taskWrapper); + for (MtTask task : taskList) { + taskMap.put(task.getId(), task); + } + } + + Map userMap = new HashMap<>(); + if (!userIdSet.isEmpty()) { + LambdaQueryWrapper userWrapper = Wrappers.lambdaQuery(); + userWrapper.in(MtUser::getId, userIdSet); + List userList = mtUserMapper.selectList(userWrapper); + for (MtUser user : userList) { + userMap.put(user.getId(), user); + } + } + + List> content = new ArrayList<>(); + for (MtTaskRecord record : recordList) { + MtTask task = taskMap.get(record.getTaskId()); + MtUser user = userMap.get(record.getUserId()); + + Map item = new HashMap<>(); + item.put("id", record.getId()); + item.put("merchantId", record.getMerchantId()); + item.put("storeId", record.getStoreId()); + item.put("taskId", record.getTaskId()); + item.put("taskCode", task == null ? "" : task.getTaskCode()); + item.put("taskName", task == null ? "" : task.getTaskName()); + item.put("taskType", task == null ? "" : task.getTaskType()); + item.put("userId", record.getUserId()); + item.put("userNo", user == null ? "" : user.getUserNo()); + item.put("name", user == null ? "" : user.getName()); + item.put("mobile", user == null ? "" : user.getMobile()); + item.put("taskDate", record.getTaskDate()); + item.put("completeNum", record.getCompleteNum() == null ? 0 : record.getCompleteNum()); + item.put("claimNum", record.getClaimNum() == null ? 0 : record.getClaimNum()); + item.put("lastCompleteTime", record.getLastCompleteTime()); + item.put("lastClaimTime", record.getLastClaimTime()); + item.put("createTime", record.getCreateTime()); + item.put("updateTime", record.getUpdateTime()); + item.put("operator", record.getOperator()); + item.put("status", record.getStatus()); + content.add(item); + } + + PageRequest pageRequest = PageRequest.of(taskRecordPage.getPage(), taskRecordPage.getPageSize()); + PageImpl pageImpl = new PageImpl(content, pageRequest, pageHelper.getTotal()); + PaginationResponse> paginationResponse = new PaginationResponse(pageImpl, Map.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(content); + return paginationResponse; + } + @Override @OperationServiceLog(description = "新增任务") public MtTask addTask(TaskDto taskDto) throws BusinessCheckException { @@ -128,6 +302,11 @@ public class TaskServiceImpl extends ServiceImpl implement mtTask.setStoreId(storeId); mtTask.setRewardPoint(mtTask.getRewardPoint() == null ? 0 : mtTask.getRewardPoint()); + mtTask.setRewardBalance(mtTask.getRewardBalance() == null ? BigDecimal.ZERO : mtTask.getRewardBalance()); + mtTask.setPointThreshold(mtTask.getPointThreshold() == null ? 0 : mtTask.getPointThreshold()); + mtTask.setBalanceThreshold(mtTask.getBalanceThreshold() == null ? BigDecimal.ZERO : mtTask.getBalanceThreshold()); + mtTask.setTargetGoodsIds(normalizeGoodsIds(mtTask.getTargetGoodsIds())); + mtTask.setCompleteThreshold(mtTask.getCompleteThreshold() == null ? BigDecimal.ZERO : mtTask.getCompleteThreshold()); mtTask.setDailyLimit(mtTask.getDailyLimit() == null ? 1 : mtTask.getDailyLimit()); mtTask.setSort(mtTask.getSort() == null ? 0 : mtTask.getSort()); mtTask.setStatus(StringUtils.isBlank(mtTask.getStatus()) ? StatusEnum.ENABLED.getKey() : mtTask.getStatus()); @@ -187,6 +366,21 @@ public class TaskServiceImpl extends ServiceImpl implement if (taskDto.getRewardPoint() != null) { mtTask.setRewardPoint(taskDto.getRewardPoint()); } + if (taskDto.getRewardBalance() != null) { + mtTask.setRewardBalance(taskDto.getRewardBalance()); + } + if (taskDto.getPointThreshold() != null) { + mtTask.setPointThreshold(taskDto.getPointThreshold()); + } + if (taskDto.getBalanceThreshold() != null) { + mtTask.setBalanceThreshold(taskDto.getBalanceThreshold()); + } + if (taskDto.getTargetGoodsIds() != null) { + mtTask.setTargetGoodsIds(normalizeGoodsIds(taskDto.getTargetGoodsIds())); + } + if (taskDto.getCompleteThreshold() != null) { + mtTask.setCompleteThreshold(taskDto.getCompleteThreshold()); + } if (taskDto.getDailyLimit() != null) { mtTask.setDailyLimit(taskDto.getDailyLimit()); } @@ -258,6 +452,10 @@ public class TaskServiceImpl extends ServiceImpl implement int claimNum = record == null || record.getClaimNum() == null ? 0 : record.getClaimNum(); int dailyLimit = task.getDailyLimit() == null ? 1 : task.getDailyLimit(); int rewardPoint = task.getRewardPoint() == null ? 0 : task.getRewardPoint(); + BigDecimal rewardBalance = task.getRewardBalance() == null ? BigDecimal.ZERO : task.getRewardBalance(); + BigDecimal completeThreshold = task.getCompleteThreshold() == null ? BigDecimal.ZERO : task.getCompleteThreshold(); + Integer pointThreshold = task.getPointThreshold() == null ? 0 : task.getPointThreshold(); + BigDecimal balanceThreshold = task.getBalanceThreshold() == null ? BigDecimal.ZERO : task.getBalanceThreshold(); Map item = new HashMap<>(); item.put("id", task.getId()); @@ -267,6 +465,11 @@ public class TaskServiceImpl extends ServiceImpl implement item.put("taskDesc", task.getTaskDesc()); item.put("jumpUrl", task.getJumpUrl()); item.put("rewardPoint", rewardPoint); + item.put("rewardBalance", rewardBalance); + item.put("pointThreshold", pointThreshold); + item.put("balanceThreshold", balanceThreshold); + item.put("targetGoodsIds", task.getTargetGoodsIds()); + item.put("completeThreshold", completeThreshold); item.put("dailyLimit", dailyLimit); item.put("sort", task.getSort()); item.put("completeNum", completeNum); @@ -290,6 +493,7 @@ public class TaskServiceImpl extends ServiceImpl implement String taskDate = DateUtil.getNow(DateUtil.PATTERN_ISO_DATE); Date nowTime = new Date(); MtTaskRecord record = getOrCreateRecord(merchantId, storeId, userId, taskId, taskDate, operator, nowTime); + validateTaskCompleteCondition(taskInfo, merchantId, storeId, userId, record, taskDate); int effect = mtTaskRecordMapper.incrCompleteNum(record.getId(), dailyLimit, nowTime); if (effect < 1) { @@ -308,8 +512,9 @@ public class TaskServiceImpl extends ServiceImpl implement } int dailyLimit = taskInfo.getDailyLimit() == null ? 1 : taskInfo.getDailyLimit(); int rewardPoint = taskInfo.getRewardPoint() == null ? 0 : taskInfo.getRewardPoint(); - if (rewardPoint <= 0) { - throw new BusinessCheckException("该任务未配置奖励积分"); + BigDecimal rewardBalance = taskInfo.getRewardBalance() == null ? BigDecimal.ZERO : taskInfo.getRewardBalance(); + if (rewardPoint <= 0 && rewardBalance.compareTo(BigDecimal.ZERO) <= 0) { + throw new BusinessCheckException("该任务未配置奖励"); } String taskDate = DateUtil.getNow(DateUtil.PATTERN_ISO_DATE); @@ -363,13 +568,113 @@ public class TaskServiceImpl extends ServiceImpl implement reqPointDto.setAmount(rewardPoint); reqPointDto.setDescription("任务奖励:" + taskInfo.getTaskName() + " +" + rewardPoint + "积分"); reqPointDto.setOperator(operator); - pointService.addPoint(reqPointDto); + if (rewardPoint > 0) { + pointService.addPoint(reqPointDto); + } + } + + // 幂等发余额:同任务同日期同轮次固定 orderSn,只会发一次 + if (rewardBalance.compareTo(BigDecimal.ZERO) > 0) { + LambdaQueryWrapper balanceWrapper = Wrappers.lambdaQuery(); + balanceWrapper.eq(MtBalance::getUserId, userId) + .eq(MtBalance::getOrderSn, orderSn) + .eq(MtBalance::getStatus, StatusEnum.ENABLED.getKey()); + MtBalance balanceExisted = mtBalanceMapper.selectOne(balanceWrapper); + if (balanceExisted == null) { + MtBalance reqBalance = new MtBalance(); + reqBalance.setUserId(userId); + reqBalance.setOrderSn(orderSn); + reqBalance.setAmount(rewardBalance); + reqBalance.setDescription("任务奖励:" + taskInfo.getTaskName() + " +" + rewardBalance + "余额"); + reqBalance.setOperator(operator); + balanceService.addBalance(reqBalance, true); + } } MtTaskRecord latest = mtTaskRecordMapper.selectById(record.getId()); return buildTaskProgress(taskInfo, latest); } + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "导入公共任务") + public Map importPublicTask(Integer merchantId, Integer storeId, List taskIds, String operator) throws BusinessCheckException { + if (merchantId == null || merchantId <= 0) { + throw new BusinessCheckException("当前账号未绑定商户,无法导入"); + } + if (taskIds == null || taskIds.isEmpty()) { + throw new BusinessCheckException("请选择要导入的任务"); + } + + Integer targetStoreId = storeId == null ? 0 : storeId; + if (targetStoreId > 0) { + MtStore mtStore = storeService.queryStoreById(targetStoreId); + if (mtStore == null || !merchantId.equals(mtStore.getMerchantId())) { + throw new BusinessCheckException("目标店铺不存在或不属于当前商户"); + } + } + + List validTaskIds = new ArrayList<>(); + Set uniqueSet = new HashSet<>(); + for (Integer taskId : taskIds) { + if (taskId == null || taskId <= 0 || uniqueSet.contains(taskId)) { + continue; + } + uniqueSet.add(taskId); + validTaskIds.add(taskId); + } + if (validTaskIds.isEmpty()) { + throw new BusinessCheckException("请选择有效的任务"); + } + + LambdaQueryWrapper sourceWrapper = Wrappers.lambdaQuery(); + sourceWrapper.eq(MtTask::getMerchantId, 0) + .eq(MtTask::getStoreId, 0) + .in(MtTask::getId, validTaskIds) + .ne(MtTask::getStatus, StatusEnum.DISABLE.getKey()); + List sourceList = mtTaskMapper.selectList(sourceWrapper); + if (sourceList == null || sourceList.isEmpty()) { + throw new BusinessCheckException("未找到可导入的公共任务"); + } + Map sourceMap = new HashMap<>(); + for (MtTask source : sourceList) { + sourceMap.put(source.getId(), source); + } + + int importedCount = 0; + int skippedCount = 0; + List importedTaskIds = new ArrayList<>(); + Date now = new Date(); + for (Integer taskId : validTaskIds) { + MtTask source = sourceMap.get(taskId); + if (source == null) { + skippedCount++; + continue; + } + + LambdaQueryWrapper existedWrapper = Wrappers.lambdaQuery(); + existedWrapper.eq(MtTask::getMerchantId, merchantId) + .eq(MtTask::getStoreId, targetStoreId) + .eq(MtTask::getTaskCode, source.getTaskCode()) + .ne(MtTask::getStatus, StatusEnum.DISABLE.getKey()); + if (mtTaskMapper.selectCount(existedWrapper) > 0) { + skippedCount++; + continue; + } + + MtTask target = copyTaskForImport(source, merchantId, targetStoreId, operator, now); + mtTaskMapper.insert(target); + importedCount++; + importedTaskIds.add(target.getId()); + } + + Map result = new HashMap<>(); + result.put("importedCount", importedCount); + result.put("skippedCount", skippedCount); + result.put("importedTaskIds", importedTaskIds); + return result; + } + private MtTask queryTaskByScope(Integer merchantId, Integer storeId, Integer taskId) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); wrapper.eq(MtTask::getId, taskId) @@ -381,6 +686,17 @@ public class TaskServiceImpl extends ServiceImpl implement return mtTaskMapper.selectOne(wrapper); } + private PaginationResponse> emptyTaskRecordPage(TaskRecordPage taskRecordPage) { + List> content = new ArrayList<>(); + PageRequest pageRequest = PageRequest.of(taskRecordPage.getPage(), taskRecordPage.getPageSize()); + PageImpl pageImpl = new PageImpl(content, pageRequest, 0); + PaginationResponse> paginationResponse = new PaginationResponse(pageImpl, Map.class); + paginationResponse.setTotalPages(0); + paginationResponse.setTotalElements(0); + paginationResponse.setContent(content); + return paginationResponse; + } + private MtTaskRecord getOrCreateRecord(Integer merchantId, Integer storeId, Integer userId, Integer taskId, String taskDate, String operator, Date nowTime) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); wrapper.eq(MtTaskRecord::getMerchantId, merchantId) @@ -432,4 +748,161 @@ public class TaskServiceImpl extends ServiceImpl implement result.put("finished", claimNum >= dailyLimit); return result; } + + private void validateTaskCompleteCondition(MtTask taskInfo, + Integer merchantId, + Integer storeId, + Integer userId, + MtTaskRecord record, + String taskDate) throws BusinessCheckException { + if (taskInfo == null) { + return; + } + String taskCode = taskInfo.getTaskCode() == null ? "" : taskInfo.getTaskCode(); + String taskType = taskInfo.getTaskType() == null ? "" : taskInfo.getTaskType(); + if ("ORDER".equals(taskType) || TASK_CODE_ORDER_COMPLETE_BY_AMOUNT.equals(taskCode)) { + validateOrderTask(taskInfo, merchantId, storeId, userId, record, taskDate); + return; + } + if ("LOOK".equals(taskType) || TASK_CODE_LOOK_PUBLISH_BY_LIKE.equals(taskCode)) { + validateLookLikeTask(taskInfo, merchantId, storeId, userId, record, taskDate); + } + } + + private void validateOrderTask(MtTask taskInfo, + Integer merchantId, + Integer storeId, + Integer userId, + MtTaskRecord record, + String taskDate) throws BusinessCheckException { + Integer pointThreshold = taskInfo.getPointThreshold() == null ? 0 : taskInfo.getPointThreshold(); + BigDecimal balanceThreshold = taskInfo.getBalanceThreshold() == null ? BigDecimal.ZERO : taskInfo.getBalanceThreshold(); + List goodsIdList = parseGoodsIds(taskInfo.getTargetGoodsIds()); + + Integer pointThresholdFilter = pointThreshold > 0 ? pointThreshold : null; + BigDecimal balanceThresholdFilter = balanceThreshold.compareTo(BigDecimal.ZERO) > 0 ? balanceThreshold : null; + Date startTime = getDateStart(taskDate); + Date endTime = getDateEnd(taskDate); + + Integer matchNum = mtOrderMapper.countCompleteTaskOrder(merchantId, storeId, userId, startTime, endTime, + pointThresholdFilter, balanceThresholdFilter, goodsIdList); + int completeNum = record == null || record.getCompleteNum() == null ? 0 : record.getCompleteNum(); + if (matchNum == null || matchNum <= completeNum) { + throw new BusinessCheckException("未达到完成条件:今日订单未满足阈值或指定商品条件"); + } + } + + private void validateLookLikeTask(MtTask taskInfo, + Integer merchantId, + Integer storeId, + Integer userId, + MtTaskRecord record, + String taskDate) throws BusinessCheckException { + BigDecimal threshold = taskInfo.getCompleteThreshold() == null ? BigDecimal.ZERO : taskInfo.getCompleteThreshold(); + if (threshold.compareTo(BigDecimal.ZERO) <= 0) { + throw new BusinessCheckException("请先配置作品点赞阈值"); + } + int thresholdLike = threshold.intValue(); + Date startTime = getDateStart(taskDate); + Date endTime = getDateEnd(taskDate); + + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(MtLookWork::getMerchantId, merchantId) + .eq(MtLookWork::getUserId, userId) + .eq(MtLookWork::getStatus, StatusEnum.ENABLED.getKey()) + .ge(MtLookWork::getCreateTime, startTime) + .lt(MtLookWork::getCreateTime, endTime) + .ge(MtLookWork::getLikeNum, thresholdLike); + if (storeId != null && storeId > 0) { + wrapper.and(wq -> wq.eq(MtLookWork::getStoreId, 0).or().eq(MtLookWork::getStoreId, storeId)); + } + Integer matchNum = mtLookWorkMapper.selectCount(wrapper); + int completeNum = record == null || record.getCompleteNum() == null ? 0 : record.getCompleteNum(); + if (matchNum == null || matchNum <= completeNum) { + throw new BusinessCheckException("未达到完成条件:今日发布作品点赞数不足"); + } + } + + private Date getDateStart(String taskDate) { + Date date; + try { + date = DateUtil.parseDate(taskDate, DateUtil.PATTERN_ISO_DATE); + } catch (Exception e) { + date = new Date(); + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + return calendar.getTime(); + } + + private Date getDateEnd(String taskDate) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(getDateStart(taskDate)); + calendar.add(Calendar.DAY_OF_MONTH, 1); + return calendar.getTime(); + } + + private MtTask copyTaskForImport(MtTask source, Integer merchantId, Integer storeId, String operator, Date now) { + MtTask target = new MtTask(); + target.setMerchantId(merchantId); + target.setStoreId(storeId == null ? 0 : storeId); + target.setTaskCode(source.getTaskCode()); + target.setTaskName(source.getTaskName()); + target.setTaskType(source.getTaskType()); + target.setTaskDesc(source.getTaskDesc()); + target.setJumpUrl(source.getJumpUrl()); + target.setRewardPoint(source.getRewardPoint() == null ? 0 : source.getRewardPoint()); + target.setRewardBalance(source.getRewardBalance() == null ? BigDecimal.ZERO : source.getRewardBalance()); + target.setPointThreshold(source.getPointThreshold() == null ? 0 : source.getPointThreshold()); + target.setBalanceThreshold(source.getBalanceThreshold() == null ? BigDecimal.ZERO : source.getBalanceThreshold()); + target.setTargetGoodsIds(normalizeGoodsIds(source.getTargetGoodsIds())); + target.setCompleteThreshold(source.getCompleteThreshold() == null ? BigDecimal.ZERO : source.getCompleteThreshold()); + target.setDailyLimit(source.getDailyLimit() == null ? 1 : source.getDailyLimit()); + target.setSort(source.getSort() == null ? 0 : source.getSort()); + target.setOperator(operator); + target.setStatus(StringUtils.isBlank(source.getStatus()) ? StatusEnum.ENABLED.getKey() : source.getStatus()); + target.setCreateTime(now); + target.setUpdateTime(now); + return target; + } + + private String normalizeGoodsIds(String goodsIds) { + List goodsIdList = parseGoodsIds(goodsIds); + if (goodsIdList.isEmpty()) { + return ""; + } + List result = new ArrayList<>(); + for (Integer goodsId : goodsIdList) { + result.add(String.valueOf(goodsId)); + } + return String.join(",", result); + } + + private List parseGoodsIds(String goodsIds) { + List result = new ArrayList<>(); + if (StringUtils.isBlank(goodsIds)) { + return result; + } + String[] parts = goodsIds.split("[,,]"); + Set uniqueSet = new HashSet<>(); + for (String part : parts) { + if (StringUtils.isBlank(part)) { + continue; + } + String value = part.trim(); + if (!value.matches("\\d+")) { + continue; + } + Integer goodsId = Integer.parseInt(value); + if (goodsId > 0 && !uniqueSet.contains(goodsId)) { + uniqueSet.add(goodsId); + result.add(goodsId); + } + } + return result; + } } diff --git a/fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendLookController.java b/fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendLookController.java new file mode 100644 index 0000000..4f07544 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendLookController.java @@ -0,0 +1,91 @@ +package com.fuint.module.backendApi.controller; + +import com.fuint.common.dto.AccountInfo; +import com.fuint.common.param.LookWorkPage; +import com.fuint.common.service.LookService; +import com.fuint.common.util.TokenUtil; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.framework.web.BaseController; +import com.fuint.framework.web.ResponseObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; + +/** + * 看看作品管理 controller + * + * Created by Codex + */ +@Api(tags = "管理端-看看作品相关接口") +@RestController +@AllArgsConstructor +@RequestMapping(value = "/backendApi/look") +public class BackendLookController extends BaseController { + + private LookService lookService; + + @ApiOperation(value = "作品列表查询") + @RequestMapping(value = "/list", method = RequestMethod.GET) + @CrossOrigin + @PreAuthorize("@pms.hasPermission('content:look:index')") + public ResponseObject list(@ModelAttribute LookWorkPage page) throws BusinessCheckException { + AccountInfo accountInfo = TokenUtil.getAccountInfo(); + if (accountInfo.getMerchantId() != null && accountInfo.getMerchantId() > 0) { + page.setMerchantId(accountInfo.getMerchantId()); + } + if (accountInfo.getStoreId() != null && accountInfo.getStoreId() > 0) { + page.setStoreId(accountInfo.getStoreId()); + } + + PaginationResponse> paginationResponse = lookService.queryWorkListForAdmin(page); + Map result = new HashMap<>(); + result.put("dataList", paginationResponse); + return getSuccessResult(result); + } + + @ApiOperation(value = "作品详情") + @RequestMapping(value = "/info/{id}", method = RequestMethod.GET) + @CrossOrigin + @PreAuthorize("@pms.hasPermission('content:look:index')") + public ResponseObject info(@PathVariable("id") Integer id) throws BusinessCheckException { + AccountInfo accountInfo = TokenUtil.getAccountInfo(); + Map workInfo = lookService.getWorkDetailForAdmin(id); + + Integer merchantId = workInfo.get("merchantId") == null ? 0 : Integer.parseInt(workInfo.get("merchantId").toString()); + if (accountInfo.getMerchantId() != null && accountInfo.getMerchantId() > 0 && !accountInfo.getMerchantId().equals(merchantId)) { + return getFailureResult(1004); + } + + Map result = new HashMap<>(); + result.put("workInfo", workInfo); + return getSuccessResult(result); + } + + @ApiOperation(value = "更新作品状态") + @RequestMapping(value = "/updateStatus", method = RequestMethod.POST) + @CrossOrigin + @PreAuthorize("@pms.hasPermission('content:look:edit')") + public ResponseObject updateStatus(@RequestBody Map params) throws BusinessCheckException { + Integer id = params.get("id") == null ? 0 : Integer.parseInt(params.get("id").toString()); + String status = params.get("status") == null ? "A" : params.get("status").toString(); + if (id <= 0) { + return getFailureResult(201, "作品ID不能为空"); + } + + AccountInfo accountInfo = TokenUtil.getAccountInfo(); + lookService.updateWorkStatus(id, status, accountInfo.getAccountName(), accountInfo.getMerchantId()); + return getSuccessResult(true); + } +} diff --git a/fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendTaskController.java b/fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendTaskController.java index 4cc4df5..3aa1c5d 100644 --- a/fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendTaskController.java +++ b/fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendTaskController.java @@ -4,6 +4,7 @@ import com.fuint.common.dto.AccountInfo; import com.fuint.common.dto.TaskDto; import com.fuint.common.enums.StatusEnum; import com.fuint.common.param.TaskPage; +import com.fuint.common.param.TaskRecordPage; import com.fuint.common.service.StoreService; import com.fuint.common.service.TaskService; import com.fuint.common.util.TokenUtil; @@ -20,6 +21,7 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import java.util.HashMap; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -61,6 +63,39 @@ public class BackendTaskController extends BaseController { return getSuccessResult(result); } + @ApiOperation(value = "公共任务列表查询") + @RequestMapping(value = "/publicList", method = RequestMethod.GET) + @CrossOrigin + @PreAuthorize("@pms.hasPermission('content:task:index')") + public ResponseObject publicList(@ModelAttribute TaskPage taskPage) throws BusinessCheckException { + taskPage.setMerchantId(0); + taskPage.setStoreId(0); + PaginationResponse paginationResponse = taskService.queryTaskListByPagination(taskPage); + + Map result = new HashMap<>(); + result.put("dataList", paginationResponse); + return getSuccessResult(result); + } + + @ApiOperation(value = "任务完成记录列表查询") + @RequestMapping(value = "/recordList", method = RequestMethod.GET) + @CrossOrigin + @PreAuthorize("@pms.hasPermission('content:task:index')") + public ResponseObject recordList(@ModelAttribute TaskRecordPage taskRecordPage) throws BusinessCheckException { + AccountInfo accountInfo = TokenUtil.getAccountInfo(); + if (accountInfo.getMerchantId() != null && accountInfo.getMerchantId() > 0) { + taskRecordPage.setMerchantId(accountInfo.getMerchantId()); + } + if (accountInfo.getStoreId() != null && accountInfo.getStoreId() > 0) { + taskRecordPage.setStoreId(accountInfo.getStoreId()); + } + + PaginationResponse> paginationResponse = taskService.queryTaskRecordListByPagination(taskRecordPage); + Map result = new HashMap<>(); + result.put("dataList", paginationResponse); + return getSuccessResult(result); + } + @ApiOperation(value = "获取任务详情") @RequestMapping(value = "/info/{id}", method = RequestMethod.GET) @CrossOrigin @@ -125,4 +160,36 @@ public class BackendTaskController extends BaseController { return getSuccessResult(true); } + + @ApiOperation(value = "导入公共任务") + @RequestMapping(value = "/importPublic", method = RequestMethod.POST) + @CrossOrigin + @PreAuthorize("@pms.hasPermission('content:task:add')") + public ResponseObject importPublic(@RequestBody Map params) throws BusinessCheckException { + AccountInfo accountInfo = TokenUtil.getAccountInfo(); + Integer merchantId = accountInfo.getMerchantId(); + if (merchantId == null || merchantId <= 0) { + throw new BusinessCheckException("当前账号未绑定商户,无法导入"); + } + + Integer storeId = accountInfo.getStoreId() == null ? 0 : accountInfo.getStoreId(); + if (storeId <= 0 && params.get("storeId") != null) { + storeId = Integer.parseInt(params.get("storeId").toString()); + } + + List taskIds = new ArrayList<>(); + Object taskIdsObj = params.get("taskIds"); + if (taskIdsObj instanceof List) { + List sourceList = (List) taskIdsObj; + for (Object item : sourceList) { + if (item == null) { + continue; + } + taskIds.add(Integer.parseInt(item.toString())); + } + } + + Map importResult = taskService.importPublicTask(merchantId, storeId, taskIds, accountInfo.getAccountName()); + return getSuccessResult(importResult); + } } diff --git a/fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientBookController.java b/fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientBookController.java index 7217291..973a347 100644 --- a/fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientBookController.java +++ b/fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientBookController.java @@ -201,6 +201,7 @@ public class ClientBookController extends BaseController { MtBookItem update = new MtBookItem(); update.setId(bookItemId); update.setCheckinStartTime(new java.util.Date()); + update.setStatus(BookStatusEnum.CONFIRM.getKey()); update.setOperator(loginInfo.getId().toString()); bookItemService.updateBookItem(update); @@ -239,11 +240,20 @@ public class ClientBookController extends BaseController { update.setId(bookItemId); update.setCheckinEndTime(endTime); update.setCheckinDurationHours(hours); + boolean isZeroDuration = hours == null || hours.compareTo(BigDecimal.ZERO) <= 0; + update.setStatus(isZeroDuration ? BookStatusEnum.COMPLETE.getKey() : BookStatusEnum.WAIT_PAY.getKey()); update.setOperator(loginInfo.getId().toString()); bookItemService.updateBookItem(update); + if (isZeroDuration && bookItem.getOrderId() != null && bookItem.getOrderId() > 0) { + OrderDto orderDto = new OrderDto(); + orderDto.setId(bookItem.getOrderId()); + orderDto.setStatus(OrderStatusEnum.COMPLETE.getKey()); + orderService.updateOrder(orderDto); + } Map result = new HashMap<>(); result.put("checkinEndTime", endTime); result.put("checkinDurationHours", hours); + result.put("status", update.getStatus()); return getSuccessResult(result); } diff --git a/fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientLookController.java b/fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientLookController.java new file mode 100644 index 0000000..f182c92 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientLookController.java @@ -0,0 +1,235 @@ +package com.fuint.module.clientApi.controller; + +import com.fuint.common.dto.UserInfo; +import com.fuint.common.service.LookService; +import com.fuint.common.service.MerchantService; +import com.fuint.common.util.TokenUtil; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.framework.web.BaseController; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.model.MtLookWork; +import com.fuint.utils.StringUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 看看功能会员端 controller + * + * Created by Codex + */ +@Api(tags = "会员端-看看作品相关接口") +@RestController +@AllArgsConstructor +@RequestMapping(value = "/clientApi/look") +public class ClientLookController extends BaseController { + + private LookService lookService; + + private MerchantService merchantService; + + @ApiOperation(value = "看看作品列表") + @RequestMapping(value = "/list", method = RequestMethod.POST) + @CrossOrigin + public ResponseObject list(HttpServletRequest request, @RequestBody Map params) throws BusinessCheckException { + String merchantNo = request.getHeader("merchantNo") == null ? "" : request.getHeader("merchantNo"); + Integer storeId = StringUtil.isEmpty(request.getHeader("storeId")) ? 0 : Integer.parseInt(request.getHeader("storeId")); + Integer merchantId = merchantService.getMerchantId(merchantNo); + if (merchantId <= 0) { + return getFailureResult(201, "商户信息异常"); + } + + Integer page = params.get("page") == null ? 1 : Integer.parseInt(params.get("page").toString()); + Integer pageSize = params.get("pageSize") == null ? 10 : Integer.parseInt(params.get("pageSize").toString()); + String mineFlag = params.get("mine") == null ? "0" : params.get("mine").toString(); + Boolean mine = "1".equals(mineFlag) || "true".equalsIgnoreCase(mineFlag); + + UserInfo loginInfo = TokenUtil.getUserInfo(); + Integer userId = loginInfo == null ? 0 : loginInfo.getId(); + if (mine && userId <= 0) { + return getFailureResult(1001); + } + + PaginationResponse> paginationResponse = lookService.queryWorkListForClient( + merchantId, + storeId, + userId, + page, + pageSize, + mine + ); + + Map result = new HashMap<>(); + result.put("content", paginationResponse.getContent()); + result.put("pageSize", paginationResponse.getPageSize()); + result.put("pageNumber", paginationResponse.getCurrentPage()); + result.put("totalRow", paginationResponse.getTotalElements()); + result.put("totalPage", paginationResponse.getTotalPages()); + return getSuccessResult(result); + } + + @ApiOperation(value = "看看作品详情") + @RequestMapping(value = "/detail", method = RequestMethod.POST) + @CrossOrigin + public ResponseObject detail(@RequestBody Map params) throws BusinessCheckException { + Integer workId = params.get("workId") == null ? 0 : Integer.parseInt(params.get("workId").toString()); + if (workId <= 0) { + return getFailureResult(201, "作品ID不能为空"); + } + + UserInfo loginInfo = TokenUtil.getUserInfo(); + Integer userId = loginInfo == null ? 0 : loginInfo.getId(); + Map workInfo = lookService.getWorkDetail(workId, userId); + + Map result = new HashMap<>(); + result.put("workInfo", workInfo); + return getSuccessResult(result); + } + + @ApiOperation(value = "发布作品") + @RequestMapping(value = "/save", method = RequestMethod.POST) + @CrossOrigin + public ResponseObject save(HttpServletRequest request, @RequestBody Map params) throws BusinessCheckException { + UserInfo loginInfo = TokenUtil.getUserInfo(); + if (loginInfo == null) { + return getFailureResult(1001); + } + String merchantNo = request.getHeader("merchantNo") == null ? "" : request.getHeader("merchantNo"); + Integer storeId = StringUtil.isEmpty(request.getHeader("storeId")) ? 0 : Integer.parseInt(request.getHeader("storeId")); + Integer merchantId = merchantService.getMerchantId(merchantNo); + if (merchantId <= 0) { + return getFailureResult(201, "商户信息异常"); + } + + String title = params.get("title") == null ? "" : params.get("title").toString(); + String desc = params.get("desc") == null ? "" : params.get("desc").toString(); + List images = new ArrayList<>(); + if (params.get("images") instanceof List) { + images = (List) params.get("images"); + } + + MtLookWork work = lookService.saveWork(merchantId, storeId, loginInfo.getId(), title, desc, images, String.valueOf(loginInfo.getId())); + Map result = new HashMap<>(); + result.put("id", work.getId()); + return getSuccessResult(result); + } + + @ApiOperation(value = "删除我的作品") + @RequestMapping(value = "/remove", method = RequestMethod.POST) + @CrossOrigin + public ResponseObject remove(@RequestBody Map params) throws BusinessCheckException { + UserInfo loginInfo = TokenUtil.getUserInfo(); + if (loginInfo == null) { + return getFailureResult(1001); + } + Integer workId = params.get("workId") == null ? 0 : Integer.parseInt(params.get("workId").toString()); + if (workId <= 0) { + return getFailureResult(201, "作品ID不能为空"); + } + lookService.removeWork(workId, loginInfo.getId(), String.valueOf(loginInfo.getId())); + return getSuccessResult(true); + } + + @ApiOperation(value = "评论列表") + @RequestMapping(value = "/commentList", method = RequestMethod.POST) + @CrossOrigin + public ResponseObject commentList(@RequestBody Map params) throws BusinessCheckException { + Integer workId = params.get("workId") == null ? 0 : Integer.parseInt(params.get("workId").toString()); + Integer page = params.get("page") == null ? 1 : Integer.parseInt(params.get("page").toString()); + Integer pageSize = params.get("pageSize") == null ? 20 : Integer.parseInt(params.get("pageSize").toString()); + if (workId <= 0) { + return getFailureResult(201, "作品ID不能为空"); + } + + UserInfo loginInfo = TokenUtil.getUserInfo(); + Integer userId = loginInfo == null ? 0 : loginInfo.getId(); + + PaginationResponse> paginationResponse = lookService.queryCommentList(workId, page, pageSize, userId); + Map result = new HashMap<>(); + result.put("content", paginationResponse.getContent()); + result.put("pageSize", paginationResponse.getPageSize()); + result.put("pageNumber", paginationResponse.getCurrentPage()); + result.put("totalRow", paginationResponse.getTotalElements()); + result.put("totalPage", paginationResponse.getTotalPages()); + return getSuccessResult(result); + } + + @ApiOperation(value = "发布评论") + @RequestMapping(value = "/commentSave", method = RequestMethod.POST) + @CrossOrigin + public ResponseObject commentSave(@RequestBody Map params) throws BusinessCheckException { + UserInfo loginInfo = TokenUtil.getUserInfo(); + if (loginInfo == null) { + return getFailureResult(1001); + } + + Integer workId = params.get("workId") == null ? 0 : Integer.parseInt(params.get("workId").toString()); + String content = params.get("content") == null ? "" : params.get("content").toString(); + List images = new ArrayList<>(); + if (params.get("images") instanceof List) { + images = (List) params.get("images"); + } + if (workId <= 0) { + return getFailureResult(201, "作品ID不能为空"); + } + + Map commentInfo = lookService.saveComment(workId, loginInfo.getId(), content, images, String.valueOf(loginInfo.getId())); + Map result = new HashMap<>(); + result.put("commentInfo", commentInfo); + return getSuccessResult(result); + } + + @ApiOperation(value = "作品点赞/取消点赞") + @RequestMapping(value = "/toggleLike", method = RequestMethod.POST) + @CrossOrigin + public ResponseObject toggleLike(HttpServletRequest request, @RequestBody Map params) throws BusinessCheckException { + UserInfo loginInfo = TokenUtil.getUserInfo(); + if (loginInfo == null) { + return getFailureResult(1001); + } + Integer workId = params.get("workId") == null ? 0 : Integer.parseInt(params.get("workId").toString()); + if (workId <= 0) { + return getFailureResult(201, "作品ID不能为空"); + } + + String merchantNo = request.getHeader("merchantNo") == null ? "" : request.getHeader("merchantNo"); + Integer storeId = StringUtil.isEmpty(request.getHeader("storeId")) ? 0 : Integer.parseInt(request.getHeader("storeId")); + Integer merchantId = merchantService.getMerchantId(merchantNo); + + Map result = lookService.toggleWorkLike(workId, loginInfo.getId(), merchantId, storeId); + return getSuccessResult(result); + } + + @ApiOperation(value = "评论点赞/取消点赞") + @RequestMapping(value = "/toggleCommentLike", method = RequestMethod.POST) + @CrossOrigin + public ResponseObject toggleCommentLike(HttpServletRequest request, @RequestBody Map params) throws BusinessCheckException { + UserInfo loginInfo = TokenUtil.getUserInfo(); + if (loginInfo == null) { + return getFailureResult(1001); + } + Integer commentId = params.get("commentId") == null ? 0 : Integer.parseInt(params.get("commentId").toString()); + if (commentId <= 0) { + return getFailureResult(201, "评论ID不能为空"); + } + + String merchantNo = request.getHeader("merchantNo") == null ? "" : request.getHeader("merchantNo"); + Integer storeId = StringUtil.isEmpty(request.getHeader("storeId")) ? 0 : Integer.parseInt(request.getHeader("storeId")); + Integer merchantId = merchantService.getMerchantId(merchantNo); + + Map result = lookService.toggleCommentLike(commentId, loginInfo.getId(), merchantId, storeId); + return getSuccessResult(result); + } +} diff --git a/fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientTaskController.java b/fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientTaskController.java index 170d4f1..2b4ada9 100644 --- a/fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientTaskController.java +++ b/fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientTaskController.java @@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -53,15 +54,19 @@ public class ClientTaskController extends BaseController { List> taskList = taskService.queryClientTaskList(merchantId, storeId, userId); int totalDailyPoints = 0; + BigDecimal totalDailyBalance = BigDecimal.ZERO; for (Map task : taskList) { int rewardPoint = task.get("rewardPoint") == null ? 0 : Integer.parseInt(task.get("rewardPoint").toString()); + BigDecimal rewardBalance = task.get("rewardBalance") == null ? BigDecimal.ZERO : new BigDecimal(task.get("rewardBalance").toString()); int dailyLimit = task.get("dailyLimit") == null ? 1 : Integer.parseInt(task.get("dailyLimit").toString()); totalDailyPoints += rewardPoint * dailyLimit; + totalDailyBalance = totalDailyBalance.add(rewardBalance.multiply(new BigDecimal(dailyLimit))); } Map outParams = new HashMap<>(); outParams.put("taskList", taskList); outParams.put("totalDailyPoints", totalDailyPoints); + outParams.put("totalDailyBalance", totalDailyBalance); return getSuccessResult(outParams); } diff --git a/fuint-application/src/main/resources/application.properties b/fuint-application/src/main/resources/application.properties index 051d157..4dc44c7 100644 --- a/fuint-application/src/main/resources/application.properties +++ b/fuint-application/src/main/resources/application.properties @@ -1,7 +1,7 @@ # \u57FA\u672C\u914D\u7F6E server.port=5918 env.profile=prod -env.properties.path=/www/wwwroot/configure/ +env.properties.path=configure/ # \u6570\u636E\u5E93\u914D\u7F6E spring.datasource.type=com.zaxxer.hikari.HikariDataSource diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtLookCommentMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtLookCommentMapper.java new file mode 100644 index 0000000..da26f99 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtLookCommentMapper.java @@ -0,0 +1,17 @@ +package com.fuint.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fuint.repository.model.MtLookComment; +import org.apache.ibatis.annotations.Param; + +/** + * 看看评论 Mapper + * + * Created by Codex + */ +public interface MtLookCommentMapper extends BaseMapper { + + Integer incrLikeNum(@Param("id") Integer id); + + Integer decrLikeNum(@Param("id") Integer id); +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtLookLikeMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtLookLikeMapper.java new file mode 100644 index 0000000..c0a83c8 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtLookLikeMapper.java @@ -0,0 +1,12 @@ +package com.fuint.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fuint.repository.model.MtLookLike; + +/** + * 看看点赞 Mapper + * + * Created by Codex + */ +public interface MtLookLikeMapper extends BaseMapper { +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtLookWorkMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtLookWorkMapper.java new file mode 100644 index 0000000..d256f69 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtLookWorkMapper.java @@ -0,0 +1,21 @@ +package com.fuint.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fuint.repository.model.MtLookWork; +import org.apache.ibatis.annotations.Param; + +/** + * 看看作品 Mapper + * + * Created by Codex + */ +public interface MtLookWorkMapper extends BaseMapper { + + Integer incrLikeNum(@Param("id") Integer id); + + Integer decrLikeNum(@Param("id") Integer id); + + Integer incrCommentNum(@Param("id") Integer id); + + Integer decrCommentNum(@Param("id") Integer id); +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtOrderMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtOrderMapper.java index 21c12a4..8578e26 100644 --- a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtOrderMapper.java +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtOrderMapper.java @@ -43,4 +43,13 @@ public interface MtOrderMapper extends BaseMapper { List getTobeCommissionOrderList(@Param("dateTime") String dateTime); + Integer countCompleteTaskOrder(@Param("merchantId") Integer merchantId, + @Param("storeId") Integer storeId, + @Param("userId") Integer userId, + @Param("startTime") Date startTime, + @Param("endTime") Date endTime, + @Param("pointThreshold") Integer pointThreshold, + @Param("balanceThreshold") BigDecimal balanceThreshold, + @Param("goodsIdList") List goodsIdList); + } diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtLookComment.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtLookComment.java new file mode 100644 index 0000000..79ee3cc --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtLookComment.java @@ -0,0 +1,61 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 看看作品评论 + * + * Created by Codex + */ +@Data +@TableName("mt_look_comment") +@ApiModel(value = "MtLookComment对象", description = "看看作品评论") +public class MtLookComment implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("作品ID") + private Integer workId; + + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("评论内容") + private String content; + + @ApiModelProperty("评论图片,逗号分隔") + private String images; + + @ApiModelProperty("点赞数") + private Integer likeNum; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态(A启用,N禁用,D删除)") + private String status; +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtLookLike.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtLookLike.java new file mode 100644 index 0000000..85193e1 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtLookLike.java @@ -0,0 +1,52 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 看看点赞记录 + * + * Created by Codex + */ +@Data +@TableName("mt_look_like") +@ApiModel(value = "MtLookLike对象", description = "看看点赞记录") +public class MtLookLike implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("对象类型(WORK/COMMENT)") + private String targetType; + + @ApiModelProperty("对象ID") + private Integer targetId; + + @ApiModelProperty("状态(A已赞,N取消,D删除)") + private String status; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtLookWork.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtLookWork.java new file mode 100644 index 0000000..7132e91 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtLookWork.java @@ -0,0 +1,67 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 看看作品 + * + * Created by Codex + */ +@Data +@TableName("mt_look_work") +@ApiModel(value = "MtLookWork对象", description = "看看作品") +public class MtLookWork implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("标题") + private String title; + + @ApiModelProperty("描述") + private String description; + + @ApiModelProperty("封面图") + private String cover; + + @ApiModelProperty("图片列表,逗号分隔") + private String images; + + @ApiModelProperty("点赞数") + private Integer likeNum; + + @ApiModelProperty("评论数") + private Integer commentNum; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态(A启用,N禁用,D删除)") + private String status; +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtTask.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtTask.java index aa2112d..2712605 100644 --- a/fuint-repository/src/main/java/com/fuint/repository/model/MtTask.java +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtTask.java @@ -8,6 +8,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Date; /** @@ -50,6 +51,21 @@ public class MtTask implements Serializable { @ApiModelProperty("奖励积分") private Integer rewardPoint; + @ApiModelProperty("奖励余额") + private BigDecimal rewardBalance; + + @ApiModelProperty("银币阈值(订单使用银币数量)") + private Integer pointThreshold; + + @ApiModelProperty("余额阈值(订单使用余额金额)") + private BigDecimal balanceThreshold; + + @ApiModelProperty("指定商品ID,多个逗号分隔,空表示全部商品") + private String targetGoodsIds; + + @ApiModelProperty("完成阈值(订单金额/点赞数)") + private BigDecimal completeThreshold; + @ApiModelProperty("每日可领取次数") private Integer dailyLimit; diff --git a/fuint-repository/src/main/resources/mapper/MtLookCommentMapper.xml b/fuint-repository/src/main/resources/mapper/MtLookCommentMapper.xml new file mode 100644 index 0000000..b009e8f --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtLookCommentMapper.xml @@ -0,0 +1,11 @@ + + + + + update mt_look_comment t set t.LIKE_NUM = IFNULL(t.LIKE_NUM, 0) + 1 where t.ID = #{id} + + + + update mt_look_comment t set t.LIKE_NUM = if(IFNULL(t.LIKE_NUM, 0) > 0, t.LIKE_NUM - 1, 0) where t.ID = #{id} + + diff --git a/fuint-repository/src/main/resources/mapper/MtLookWorkMapper.xml b/fuint-repository/src/main/resources/mapper/MtLookWorkMapper.xml new file mode 100644 index 0000000..fd9c133 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtLookWorkMapper.xml @@ -0,0 +1,19 @@ + + + + + update mt_look_work t set t.LIKE_NUM = IFNULL(t.LIKE_NUM, 0) + 1 where t.ID = #{id} + + + + update mt_look_work t set t.LIKE_NUM = if(IFNULL(t.LIKE_NUM, 0) > 0, t.LIKE_NUM - 1, 0) where t.ID = #{id} + + + + update mt_look_work t set t.COMMENT_NUM = IFNULL(t.COMMENT_NUM, 0) + 1 where t.ID = #{id} + + + + update mt_look_work t set t.COMMENT_NUM = if(IFNULL(t.COMMENT_NUM, 0) > 0, t.COMMENT_NUM - 1, 0) where t.ID = #{id} + + diff --git a/fuint-repository/src/main/resources/mapper/MtOrderMapper.xml b/fuint-repository/src/main/resources/mapper/MtOrderMapper.xml index cceb953..6c77302 100644 --- a/fuint-repository/src/main/resources/mapper/MtOrderMapper.xml +++ b/fuint-repository/src/main/resources/mapper/MtOrderMapper.xml @@ -71,4 +71,34 @@ + +