新增功能

This commit is contained in:
2026-02-18 16:27:34 +08:00
parent fb0cbea2dc
commit f0bd5ba1e5
29 changed files with 1918 additions and 21 deletions

View File

@ -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")

View File

@ -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;

View File

@ -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", "已完成");

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<Map<String, Object>> queryWorkListForAdmin(LookWorkPage page) throws BusinessCheckException;
PaginationResponse<Map<String, Object>> queryWorkListForClient(Integer merchantId,
Integer storeId,
Integer userId,
Integer page,
Integer pageSize,
boolean onlyMine) throws BusinessCheckException;
Map<String, Object> getWorkDetail(Integer workId, Integer userId) throws BusinessCheckException;
Map<String, Object> getWorkDetailForAdmin(Integer workId) throws BusinessCheckException;
MtLookWork saveWork(Integer merchantId,
Integer storeId,
Integer userId,
String title,
String description,
List<String> images,
String operator) throws BusinessCheckException;
void removeWork(Integer workId, Integer userId, String operator) throws BusinessCheckException;
PaginationResponse<Map<String, Object>> queryCommentList(Integer workId,
Integer page,
Integer pageSize,
Integer userId) throws BusinessCheckException;
Map<String, Object> saveComment(Integer workId,
Integer userId,
String content,
List<String> images,
String operator) throws BusinessCheckException;
Map<String, Object> toggleWorkLike(Integer workId,
Integer userId,
Integer merchantId,
Integer storeId) throws BusinessCheckException;
Map<String, Object> toggleCommentLike(Integer commentId,
Integer userId,
Integer merchantId,
Integer storeId) throws BusinessCheckException;
void updateWorkStatus(Integer workId, String status, String operator, Integer merchantId) throws BusinessCheckException;
}

View File

@ -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<MtTask> {
*/
PaginationResponse<MtTask> queryTaskListByPagination(TaskPage taskPage) throws BusinessCheckException;
/**
* 分页查询任务完成记录
*/
PaginationResponse<Map<String, Object>> queryTaskRecordListByPagination(TaskRecordPage taskRecordPage) throws BusinessCheckException;
/**
* 添加任务
*/
@ -56,4 +62,9 @@ public interface TaskService extends IService<MtTask> {
* 领取任务奖励
*/
Map<String, Object> claimTask(Integer merchantId, Integer storeId, Integer userId, Integer taskId, String operator) throws BusinessCheckException;
/**
* 导入公共任务merchantId=0, storeId=0到指定商户/店铺
*/
Map<String, Object> importPublicTask(Integer merchantId, Integer storeId, List<Integer> taskIds, String operator) throws BusinessCheckException;
}

View File

@ -156,6 +156,8 @@ public class BookItemServiceImpl extends ServiceImpl<MtBookItemMapper, MtBookIte
@OperationServiceLog(description = "新增预约订单")
public MtBookItem addBookItem(MtBookItem mtBookItem) throws BusinessCheckException, ParseException {
Integer storeId = mtBookItem.getStoreId() == null ? 0 : mtBookItem.getStoreId();
// 首页“立即签到”场景放开预约校验,允许直接生成预约单
boolean quickSign = StringUtil.isNotEmpty(mtBookItem.getRemark()) && mtBookItem.getRemark().contains("快速签到");
if (mtBookItem.getMerchantId() == null || mtBookItem.getMerchantId() <= 0) {
throw new BusinessCheckException("新增预约订单失败:所属商户不能为空!");
}
@ -166,13 +168,15 @@ public class BookItemServiceImpl extends ServiceImpl<MtBookItemMapper, MtBookIte
}
}
BookableParam param = new BookableParam();
param.setBookId(mtBookItem.getBookId());
param.setDate(mtBookItem.getServiceDate());
param.setTime(mtBookItem.getServiceTime());
List<String> 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<String> bookable = bookService.isBookable(param);
if (bookable.size() <= 0) {
throw new BusinessCheckException("当前时间段不可预约,请重新选择!");
}
}
LambdaQueryWrapper<MtBookItem> queryWrapper = Wrappers.lambdaQuery();
@ -185,13 +189,13 @@ public class BookItemServiceImpl extends ServiceImpl<MtBookItemMapper, MtBookIte
if (mtBookItem.getGoodsId() != null && mtBookItem.getGoodsId() > 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<MtBookItem> 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));

View File

@ -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<Map<String, Object>> queryWorkListForAdmin(LookWorkPage page) {
Page<MtLookWork> pageHelper = PageHelper.startPage(page.getPage(), page.getPageSize());
LambdaQueryWrapper<MtLookWork> 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<MtLookWork> list = mtLookWorkMapper.selectList(wrapper);
List<Map<String, Object>> dataList = toWorkListResult(list, null, true);
PageRequest pageRequest = PageRequest.of(page.getPage(), page.getPageSize());
PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal());
PaginationResponse<Map<String, Object>> paginationResponse = new PaginationResponse(pageImpl, Map.class);
paginationResponse.setTotalPages(pageHelper.getPages());
paginationResponse.setTotalElements(pageHelper.getTotal());
paginationResponse.setContent(dataList);
return paginationResponse;
}
@Override
public PaginationResponse<Map<String, Object>> 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<MtLookWork> pageHelper = PageHelper.startPage(currentPage, size);
LambdaQueryWrapper<MtLookWork> 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<MtLookWork> list = mtLookWorkMapper.selectList(wrapper);
List<Map<String, Object>> dataList = toWorkListResult(list, userId, false);
PageRequest pageRequest = PageRequest.of(currentPage, size);
PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal());
PaginationResponse<Map<String, Object>> paginationResponse = new PaginationResponse(pageImpl, Map.class);
paginationResponse.setTotalPages(pageHelper.getPages());
paginationResponse.setTotalElements(pageHelper.getTotal());
paginationResponse.setContent(dataList);
return paginationResponse;
}
@Override
public Map<String, Object> 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<String, Object> result = toWorkItemResult(work, userId, false);
return result;
}
throw new BusinessCheckException("作品已下架");
}
@Override
public Map<String, Object> 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<String> 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<Map<String, Object>> 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<MtLookComment> pageHelper = PageHelper.startPage(currentPage, size);
LambdaQueryWrapper<MtLookComment> wrapper = Wrappers.lambdaQuery();
wrapper.eq(MtLookComment::getWorkId, workId)
.eq(MtLookComment::getStatus, StatusEnum.ENABLED.getKey())
.orderByDesc(MtLookComment::getId);
List<MtLookComment> list = mtLookCommentMapper.selectList(wrapper);
List<Map<String, Object>> dataList = toCommentListResult(list, userId);
PageRequest pageRequest = PageRequest.of(currentPage, size);
PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal());
PaginationResponse<Map<String, Object>> 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<String, Object> saveComment(Integer workId,
Integer userId,
String content,
List<String> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<MtLookLike> 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<Map<String, Object>> toWorkListResult(List<MtLookWork> list, Integer userId, boolean adminMode) {
List<Map<String, Object>> result = new ArrayList<>();
for (MtLookWork item : list) {
result.add(toWorkItemResult(item, userId, adminMode));
}
return result;
}
private Map<String, Object> toWorkItemResult(MtLookWork item, Integer userId, boolean adminMode) {
Map<String, Object> 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<Map<String, Object>> toCommentListResult(List<MtLookComment> list, Integer userId) {
List<Map<String, Object>> result = new ArrayList<>();
for (MtLookComment item : list) {
result.add(toCommentItemResult(item, userId));
}
return result;
}
private Map<String, Object> toCommentItemResult(MtLookComment item, Integer userId) {
Map<String, Object> 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<String> images) {
if (images == null || images.isEmpty()) {
return "";
}
List<String> valid = images.stream().filter(StringUtils::isNotBlank).collect(Collectors.toList());
return String.join(",", valid);
}
private List<String> 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;
}
}

View File

@ -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<MtTaskMapper, MtTask> 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<MtTaskMapper, MtTask> implement
return paginationResponse;
}
@Override
public PaginationResponse<Map<String, Object>> queryTaskRecordListByPagination(TaskRecordPage taskRecordPage) {
List<Integer> matchTaskIds = null;
if (StringUtils.isNotBlank(taskRecordPage.getTaskName())) {
LambdaQueryWrapper<MtTask> 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<MtTask> taskList = mtTaskMapper.selectList(taskWrapper);
matchTaskIds = new ArrayList<>();
for (MtTask task : taskList) {
matchTaskIds.add(task.getId());
}
if (matchTaskIds.isEmpty()) {
return emptyTaskRecordPage(taskRecordPage);
}
}
List<Integer> matchUserIds = null;
if (StringUtils.isNotBlank(taskRecordPage.getUserNo()) || StringUtils.isNotBlank(taskRecordPage.getMobile())) {
LambdaQueryWrapper<MtUser> 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<MtUser> userList = mtUserMapper.selectList(userWrapper);
matchUserIds = new ArrayList<>();
for (MtUser user : userList) {
matchUserIds.add(user.getId());
}
if (matchUserIds.isEmpty()) {
return emptyTaskRecordPage(taskRecordPage);
}
}
Page<MtTaskRecord> pageHelper = PageHelper.startPage(taskRecordPage.getPage(), taskRecordPage.getPageSize());
LambdaQueryWrapper<MtTaskRecord> 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<MtTaskRecord> recordList = mtTaskRecordMapper.selectList(wrapper);
if (recordList == null) {
recordList = Collections.emptyList();
}
Set<Integer> taskIdSet = new HashSet<>();
Set<Integer> 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<Integer, MtTask> taskMap = new HashMap<>();
if (!taskIdSet.isEmpty()) {
LambdaQueryWrapper<MtTask> taskWrapper = Wrappers.lambdaQuery();
taskWrapper.in(MtTask::getId, taskIdSet);
List<MtTask> taskList = mtTaskMapper.selectList(taskWrapper);
for (MtTask task : taskList) {
taskMap.put(task.getId(), task);
}
}
Map<Integer, MtUser> userMap = new HashMap<>();
if (!userIdSet.isEmpty()) {
LambdaQueryWrapper<MtUser> userWrapper = Wrappers.lambdaQuery();
userWrapper.in(MtUser::getId, userIdSet);
List<MtUser> userList = mtUserMapper.selectList(userWrapper);
for (MtUser user : userList) {
userMap.put(user.getId(), user);
}
}
List<Map<String, Object>> content = new ArrayList<>();
for (MtTaskRecord record : recordList) {
MtTask task = taskMap.get(record.getTaskId());
MtUser user = userMap.get(record.getUserId());
Map<String, Object> 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<Map<String, Object>> 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<MtTaskMapper, MtTask> 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<MtTaskMapper, MtTask> 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<MtTaskMapper, MtTask> 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<String, Object> item = new HashMap<>();
item.put("id", task.getId());
@ -267,6 +465,11 @@ public class TaskServiceImpl extends ServiceImpl<MtTaskMapper, MtTask> 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<MtTaskMapper, MtTask> 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<MtTaskMapper, MtTask> 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<MtTaskMapper, MtTask> 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<MtBalance> 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<String, Object> importPublicTask(Integer merchantId, Integer storeId, List<Integer> 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<Integer> validTaskIds = new ArrayList<>();
Set<Integer> 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<MtTask> sourceWrapper = Wrappers.lambdaQuery();
sourceWrapper.eq(MtTask::getMerchantId, 0)
.eq(MtTask::getStoreId, 0)
.in(MtTask::getId, validTaskIds)
.ne(MtTask::getStatus, StatusEnum.DISABLE.getKey());
List<MtTask> sourceList = mtTaskMapper.selectList(sourceWrapper);
if (sourceList == null || sourceList.isEmpty()) {
throw new BusinessCheckException("未找到可导入的公共任务");
}
Map<Integer, MtTask> sourceMap = new HashMap<>();
for (MtTask source : sourceList) {
sourceMap.put(source.getId(), source);
}
int importedCount = 0;
int skippedCount = 0;
List<Integer> importedTaskIds = new ArrayList<>();
Date now = new Date();
for (Integer taskId : validTaskIds) {
MtTask source = sourceMap.get(taskId);
if (source == null) {
skippedCount++;
continue;
}
LambdaQueryWrapper<MtTask> 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<String, Object> 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<MtTask> wrapper = Wrappers.lambdaQuery();
wrapper.eq(MtTask::getId, taskId)
@ -381,6 +686,17 @@ public class TaskServiceImpl extends ServiceImpl<MtTaskMapper, MtTask> implement
return mtTaskMapper.selectOne(wrapper);
}
private PaginationResponse<Map<String, Object>> emptyTaskRecordPage(TaskRecordPage taskRecordPage) {
List<Map<String, Object>> content = new ArrayList<>();
PageRequest pageRequest = PageRequest.of(taskRecordPage.getPage(), taskRecordPage.getPageSize());
PageImpl pageImpl = new PageImpl(content, pageRequest, 0);
PaginationResponse<Map<String, Object>> 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<MtTaskRecord> wrapper = Wrappers.lambdaQuery();
wrapper.eq(MtTaskRecord::getMerchantId, merchantId)
@ -432,4 +748,161 @@ public class TaskServiceImpl extends ServiceImpl<MtTaskMapper, MtTask> 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<Integer> 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<MtLookWork> 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<Integer> goodsIdList = parseGoodsIds(goodsIds);
if (goodsIdList.isEmpty()) {
return "";
}
List<String> result = new ArrayList<>();
for (Integer goodsId : goodsIdList) {
result.add(String.valueOf(goodsId));
}
return String.join(",", result);
}
private List<Integer> parseGoodsIds(String goodsIds) {
List<Integer> result = new ArrayList<>();
if (StringUtils.isBlank(goodsIds)) {
return result;
}
String[] parts = goodsIds.split("[,]");
Set<Integer> 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;
}
}

View File

@ -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<Map<String, Object>> paginationResponse = lookService.queryWorkListForAdmin(page);
Map<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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);
}
}

View File

@ -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<MtTask> paginationResponse = taskService.queryTaskListByPagination(taskPage);
Map<String, Object> 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<Map<String, Object>> paginationResponse = taskService.queryTaskRecordListByPagination(taskRecordPage);
Map<String, Object> 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<String, Object> 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<Integer> 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<String, Object> importResult = taskService.importPublicTask(merchantId, storeId, taskIds, accountInfo.getAccountName());
return getSuccessResult(importResult);
}
}

View File

@ -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<String, Object> result = new HashMap<>();
result.put("checkinEndTime", endTime);
result.put("checkinDurationHours", hours);
result.put("status", update.getStatus());
return getSuccessResult(result);
}

View File

@ -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<String, Object> 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<Map<String, Object>> paginationResponse = lookService.queryWorkListForClient(
merchantId,
storeId,
userId,
page,
pageSize,
mine
);
Map<String, Object> 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<String, Object> 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<String, Object> workInfo = lookService.getWorkDetail(workId, userId);
Map<String, Object> 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<String, Object> 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<String> images = new ArrayList<>();
if (params.get("images") instanceof List) {
images = (List<String>) params.get("images");
}
MtLookWork work = lookService.saveWork(merchantId, storeId, loginInfo.getId(), title, desc, images, String.valueOf(loginInfo.getId()));
Map<String, Object> 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<String, Object> 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<String, Object> 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<Map<String, Object>> paginationResponse = lookService.queryCommentList(workId, page, pageSize, userId);
Map<String, Object> 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<String, Object> 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<String> images = new ArrayList<>();
if (params.get("images") instanceof List) {
images = (List<String>) params.get("images");
}
if (workId <= 0) {
return getFailureResult(201, "作品ID不能为空");
}
Map<String, Object> commentInfo = lookService.saveComment(workId, loginInfo.getId(), content, images, String.valueOf(loginInfo.getId()));
Map<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> result = lookService.toggleCommentLike(commentId, loginInfo.getId(), merchantId, storeId);
return getSuccessResult(result);
}
}

View File

@ -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<Map<String, Object>> taskList = taskService.queryClientTaskList(merchantId, storeId, userId);
int totalDailyPoints = 0;
BigDecimal totalDailyBalance = BigDecimal.ZERO;
for (Map<String, Object> 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<String, Object> outParams = new HashMap<>();
outParams.put("taskList", taskList);
outParams.put("totalDailyPoints", totalDailyPoints);
outParams.put("totalDailyBalance", totalDailyBalance);
return getSuccessResult(outParams);
}

View File

@ -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