实现商品信息查询和商品价格查询逻辑

This commit is contained in:
longbinbin
2024-12-05 17:05:59 +08:00
parent 3114fc7046
commit 92dfc1ceff
22 changed files with 399 additions and 11 deletions

View File

@ -0,0 +1,50 @@
package com.ycwl.basic.controller.mobile;
import com.ycwl.basic.model.mobile.goods.GoodsPriceQueryReq;
import com.ycwl.basic.model.mobile.goods.GoodsReqQuery;
import com.ycwl.basic.model.mobile.goods.GoodsVO;
import com.ycwl.basic.model.pc.source.resp.SourceRespVO;
import com.ycwl.basic.service.mobile.GoodsService;
import com.ycwl.basic.utils.ApiResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @Authorlongbinbin
* @Date2024/12/5 14:49
* 成片video和源素材source都可作为商品订单中可购买多个
*/
@RestController
@RequestMapping("/api/mobile/goods/v1")
@Api(tags = "商品相关接口")
public class AppGoodsController {
@Autowired
private GoodsService goodsService;
@ApiOperation("商品列表")
@PostMapping("/goodsList")
public ApiResponse<List<GoodsVO>> goodsList(@RequestBody GoodsReqQuery query) {
return goodsService.goodsList(query);
}
@ApiOperation("源素材(原片/照片)商品列表")
@PostMapping("/sourceGoodsList")
public ApiResponse<List<SourceRespVO>> sourceGoodsList(@RequestBody GoodsReqQuery query) {
return goodsService.sourceGoodsList(query);
}
@ApiOperation("查询价格")
@PostMapping("/queryPrice")
public ApiResponse queryPrice(@RequestBody GoodsPriceQueryReq queryPriceData) {
//TODO 处理购买逻辑
return goodsService.queryPrice(queryPriceData);
}
}

View File

@ -10,6 +10,8 @@ import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
/**
* @Authorlongbinbin
* @Date2024/12/4 17:16
@ -59,4 +61,5 @@ public class AppOrderController {
return orderService.getOrderCountByUserId(userId);
}
}

View File

@ -19,4 +19,11 @@ public interface SourceMapper {
int add(SourceEntity source);
int deleteById(Long id);
int update(SourceEntity source);
/**
*
* @param sourceReqQuery
* @return
*/
List<SourceRespVO> listGroupByType(SourceReqQuery sourceReqQuery);
}

View File

@ -0,0 +1,20 @@
package com.ycwl.basic.model.mobile.goods;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Authorlongbinbin
* @Date2024/12/5 16:35
*/
@Data
@ApiModel("查询商品价格请求参数")
public class GoodsPriceQueryReq {
@ApiModelProperty("景区id")
private Long scenicId;
@ApiModelProperty("商品类型 1:成片vlog 2:源素材")
private Integer goodsType;
@ApiModelProperty("商品id goodsType=1时才有值")
private Long goodsId;
}

View File

@ -0,0 +1,22 @@
package com.ycwl.basic.model.mobile.goods;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Authorlongbinbin
* @Date2024/12/5 15:40
*/
@Data
@ApiModel(value = "商品查询对象")
public class GoodsReqQuery {
@ApiModelProperty("是否已购买 0否 1是")
private Integer isBuy;
@ApiModelProperty("用户id")
private Long memberId;
@ApiModelProperty("景区id")
private Long scenicId;
@ApiModelProperty("源素材商品类型 1视频 2图像")
private Integer sourceType;
}

View File

@ -0,0 +1,37 @@
package com.ycwl.basic.model.mobile.goods;
import com.ycwl.basic.model.pc.source.resp.SourceRespVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* @Authorlongbinbin
* @Date2024/12/5 15:10
*/
@Data
@ApiModel("商品")
public class GoodsVO {
@ApiModelProperty("商品名称")
private String goodsName;
@ApiModelProperty("景区id")
private Long scenicId;
@ApiModelProperty("景区名称")
private String scenicName;
@ApiModelProperty("经度")
private BigDecimal longitude;
@ApiModelProperty("纬度")
private BigDecimal latitude;
@ApiModelProperty("商品类型 1:成片视频 2:源素材")
private Integer goodsType;
@ApiModelProperty("源素材类型 1:视频 2:图片")
private Integer sourceType;
@ApiModelProperty("商品id goodsType为1时才有值")
private Long goodsId;
@ApiModelProperty("视频链接 goodsType为1时才有值")
private String videoUrl;
}

View File

@ -2,6 +2,7 @@ package com.ycwl.basic.model.pc.scenic.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@ -59,4 +60,8 @@ public class ScenicEntity {
private String status;
private Date createTime;
private Date updateTime;
/**
* 景区源素材价格,元
*/
private BigDecimal price;
}

View File

@ -73,4 +73,6 @@ public class ScenicAddOrUpdateReq {
private Date updateTime;
@ApiModelProperty("景区配置")
private ScenicConfigEntity scenicConfig;
@ApiModelProperty("景区源素材价格,元")
private BigDecimal price;
}

View File

@ -74,4 +74,6 @@ public class ScenicRespVO {
private Date updateTime;
@ApiModelProperty("景区配置")
private ScenicConfigEntity scenicConfig;
@ApiModelProperty("景区源素材价格,元")
private BigDecimal price;
}

View File

@ -2,6 +2,7 @@ package com.ycwl.basic.model.pc.source.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@ -29,10 +30,22 @@ public class SourceEntity {
* 所属用户
*/
private Long memberId;
/**
* 原素材类型1视频2图像
*/
private Integer type;
/**
* 文件存储地址
*/
private String url;
/**
* 视频文件存储地址
*/
private String videoUrl;
/**
* 是否被购买 0未购买 1已购买
*/
private Integer isBuy;
private Date createTime;
private Date updateTime;
}

View File

@ -35,11 +35,15 @@ public class SourceReqQuery extends BaseQueryParameterReq {
*/
@ApiModelProperty("所属用户")
private Long memberId;
@ApiModelProperty("原素材类型1视频2图像")
private Integer type;
/**
* 文件存储地址
*/
@ApiModelProperty("文件存储地址")
private String url;
@ApiModelProperty("是否被购买0未购买1已购买")
private Integer isBuy;
private Date startTime;
private Date endTime;
}

View File

@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
@ -25,6 +26,10 @@ public class SourceRespVO {
private Long scenicId;
@ApiModelProperty("景区名称")
private String scenicName;
@ApiModelProperty("经度")
private BigDecimal longitude;
@ApiModelProperty("纬度")
private BigDecimal latitude;
/**
* 来源设备id
*/
@ -35,11 +40,15 @@ public class SourceRespVO {
*/
@ApiModelProperty("所属用户")
private Long memberId;
@ApiModelProperty("原素材类型1视频2图像")
private Integer type;
/**
* 文件存储地址
*/
@ApiModelProperty("文件存储地址")
@ApiModelProperty("图片文件存储地址")
private String url;
@ApiModelProperty("视频文件存储地址")
private String videoUrl;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

View File

@ -2,6 +2,7 @@ package com.ycwl.basic.model.pc.video.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@ -40,6 +41,10 @@ public class VideoEntity {
* 视频链接
*/
private String videoUrl;
/**
* 是否购买 1是 0否
*/
private Integer isBuy;
private Date createTime;
private Date updateTime;
}

View File

@ -47,6 +47,8 @@ public class VideoReqQuery extends BaseQueryParameterReq {
*/
@ApiModelProperty("视频链接")
private String videoUrl;
@ApiModelProperty("是否购买 1是 0否")
private Integer isBuy;
private Date startTime;
private Date endTime;
}

View File

@ -7,6 +7,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
@ -23,6 +24,8 @@ public class VideoRespVO {
*/
@ApiModelProperty("景区id")
private Long scenicId;
@ApiModelProperty("景区名称")
private String scenicName;
/**
* 用户id
*/
@ -33,6 +36,14 @@ public class VideoRespVO {
*/
@ApiModelProperty("模版id")
private Long templateId;
@ApiModelProperty("模版名称")
private String templateName;
@ApiModelProperty("模版价格")
private BigDecimal tmplatePrice;
@ApiModelProperty("经度")
private BigDecimal longitude;
@ApiModelProperty("纬度")
private BigDecimal latitude;
/**
* 任务id
*/
@ -48,6 +59,8 @@ public class VideoRespVO {
*/
@ApiModelProperty("视频链接")
private String videoUrl;
@ApiModelProperty("是否购买 1是 0否")
private Integer isBuy;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

View File

@ -0,0 +1,130 @@
package com.ycwl.basic.service.impl.mobile;
import com.github.pagehelper.PageInfo;
import com.ycwl.basic.mapper.pc.ScenicMapper;
import com.ycwl.basic.mapper.pc.SourceMapper;
import com.ycwl.basic.mapper.pc.VideoMapper;
import com.ycwl.basic.model.mobile.goods.GoodsPriceQueryReq;
import com.ycwl.basic.model.mobile.goods.GoodsReqQuery;
import com.ycwl.basic.model.mobile.goods.GoodsVO;
import com.ycwl.basic.model.pc.order.resp.OrderItemVO;
import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO;
import com.ycwl.basic.model.pc.source.req.SourceReqQuery;
import com.ycwl.basic.model.pc.source.resp.SourceRespVO;
import com.ycwl.basic.model.pc.video.req.VideoReqQuery;
import com.ycwl.basic.model.pc.video.resp.VideoRespVO;
import com.ycwl.basic.service.mobile.GoodsService;
import com.ycwl.basic.utils.ApiResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* @Authorlongbinbin
* @Date2024/12/5 15:04
*/@Service
public class GoodsServiceImpl implements GoodsService {
@Autowired
private VideoMapper videoMapper;
@Autowired
private SourceMapper sourceMapper;
@Autowired
private ScenicMapper scenicMapper;
public ApiResponse<List<GoodsVO>> goodsList(GoodsReqQuery query) {
//查询原素材
List<GoodsVO> goodsList = new ArrayList<>();
VideoReqQuery videoReqQuery = new VideoReqQuery();
videoReqQuery.setScenicId(query.getScenicId());
videoReqQuery.setIsBuy(query.getIsBuy());
videoReqQuery.setMemberId(query.getMemberId());
//查询成片vlog
List<VideoRespVO> videoList = videoMapper.list(videoReqQuery);
videoList.forEach(videoRespVO -> {
GoodsVO goodsVO = new GoodsVO();
goodsVO.setGoodsName(videoRespVO.getTemplateName());
goodsVO.setScenicId(videoRespVO.getScenicId());
goodsVO.setScenicName(videoRespVO.getScenicName());
goodsVO.setLongitude(videoRespVO.getLongitude());
goodsVO.setLatitude(videoRespVO.getLatitude());
goodsVO.setGoodsType(1);
goodsVO.setGoodsId(videoRespVO.getId());
goodsVO.setVideoUrl(videoRespVO.getVideoUrl());
goodsList.add(goodsVO);
});
SourceReqQuery sourceReqQuery = new SourceReqQuery();
videoReqQuery.setScenicId(query.getScenicId());
videoReqQuery.setIsBuy(query.getIsBuy());
videoReqQuery.setMemberId(query.getMemberId());
//查询源素材
List<SourceRespVO> sourceList = sourceMapper.listGroupByType(sourceReqQuery);
sourceList.forEach(sourceRespVO -> {
GoodsVO goodsVO = new GoodsVO();
Integer type = sourceRespVO.getType();
if(type==1){
goodsVO.setGoodsName("原片集");
}else {
goodsVO.setGoodsName("照片集");
}
goodsVO.setScenicId(sourceRespVO.getScenicId());
goodsVO.setScenicName(sourceRespVO.getScenicName());
goodsVO.setLongitude(sourceRespVO.getLongitude());
goodsVO.setLatitude(sourceRespVO.getLatitude());
goodsVO.setGoodsType(2);
goodsVO.setSourceType(type);
goodsList.add(goodsVO);
});
return ApiResponse.success(goodsList);
}
@Override
public ApiResponse<List<SourceRespVO>> sourceGoodsList(GoodsReqQuery query) {
SourceReqQuery sourceReqQuery = new SourceReqQuery();
sourceReqQuery.setScenicId(query.getScenicId());
sourceReqQuery.setIsBuy(query.getIsBuy());
sourceReqQuery.setMemberId(query.getMemberId());
sourceReqQuery.setType(query.getSourceType());
List<SourceRespVO> list = sourceMapper.list(sourceReqQuery);
return ApiResponse.success(list);
}
@Override
public ApiResponse queryPrice(GoodsPriceQueryReq queryPriceData) {
Integer goodsType = queryPriceData.getGoodsType();
if(goodsType==1){//成片vlog
//成片的价格就是成片所用template的价格
Long videoId = queryPriceData.getGoodsId();
VideoRespVO videoRespVO = videoMapper.getById(videoId);
if(videoRespVO==null){
return ApiResponse.fail("该vlog不存在或已失效");
}
BigDecimal tmplatePrice = videoRespVO.getTmplatePrice();
if(tmplatePrice==null){
return ApiResponse.fail("该vlog使用的模板价格或状态异常请联系管理员");
}
return ApiResponse.success(tmplatePrice);
}else if(goodsType==2){//原素材
//原素材的价格就是原素材对应景区定的价格
Long scenicId = queryPriceData.getScenicId();
ScenicRespVO scenicRespVO = scenicMapper.getById(scenicId);
if(scenicRespVO==null){
return ApiResponse.fail("该景区不存在或状态异常,请联系管理员");
}
BigDecimal price = scenicRespVO.getPrice();
if(price==null){
return ApiResponse.fail("该景区的原片价格未设定或状态异常,请联系管理员");
}
return ApiResponse.success(price);
}
return ApiResponse.fail("不合法的商品,请联系管理员");
}
}

View File

@ -119,4 +119,5 @@ public class OrderServiceImpl implements OrderService {
}
return ApiResponse.success(orderAppRespVO);
}
}

View File

@ -0,0 +1,37 @@
package com.ycwl.basic.service.mobile;
import com.ycwl.basic.model.mobile.goods.GoodsPriceQueryReq;
import com.ycwl.basic.model.mobile.goods.GoodsReqQuery;
import com.ycwl.basic.model.mobile.goods.GoodsVO;
import com.ycwl.basic.model.pc.source.resp.SourceRespVO;
import com.ycwl.basic.utils.ApiResponse;
import java.util.List;
/**
* @Authorlongbinbin
* @Date2024/12/5 15:03
*/
public interface GoodsService {
/**
* 查询商品列表
* @param query 查询条件
* @return
*/
ApiResponse<List<GoodsVO>> goodsList(GoodsReqQuery query);
/**
* 查询源素材商品列表
* @param query
* @return
*/
ApiResponse<List<SourceRespVO>> sourceGoodsList(GoodsReqQuery query);
/**
* 查询订单应付价格
* @param queryPriceData
* @return
*/
ApiResponse queryPrice(GoodsPriceQueryReq queryPriceData);
}

View File

@ -1,7 +1,6 @@
package com.ycwl.basic.service.pc;
import com.github.pagehelper.PageInfo;
import com.ycwl.basic.model.pc.order.entity.OrderEntity;
import com.ycwl.basic.model.pc.order.req.OrderAddOrUpdateReq;
import com.ycwl.basic.model.pc.order.req.OrderReqQuery;
import com.ycwl.basic.model.pc.order.resp.OrderAppRespVO;
@ -26,4 +25,6 @@ public interface OrderService {
ApiResponse<PageInfo<OrderAppRespVO>> appPageQuery(OrderReqQuery orderReqQuery);
ApiResponse<OrderAppRespVO> appDetail(Long id);
}