diff --git a/src/main/java/com/ycwl/basic/controller/task/TaskTaskController.java b/src/main/java/com/ycwl/basic/controller/task/TaskTaskController.java index 177ea1b..8f92c29 100644 --- a/src/main/java/com/ycwl/basic/controller/task/TaskTaskController.java +++ b/src/main/java/com/ycwl/basic/controller/task/TaskTaskController.java @@ -3,6 +3,7 @@ package com.ycwl.basic.controller.task; import com.ycwl.basic.annotation.IgnoreToken; import com.ycwl.basic.model.pc.template.resp.TemplateRespVO; import com.ycwl.basic.model.task.req.TaskReqVo; +import com.ycwl.basic.model.task.req.TaskSuccessReqVo; import com.ycwl.basic.model.task.req.WorkerAuthReqVo; import com.ycwl.basic.model.task.resp.TaskSyncRespVo; import com.ycwl.basic.service.task.TaskService; @@ -49,7 +50,7 @@ public class TaskTaskController { } @PostMapping("/{taskId}/success") - public ApiResponse taskSuccess(@PathVariable Long taskId, @RequestBody WorkerAuthReqVo req) { + public ApiResponse taskSuccess(@PathVariable Long taskId, @RequestBody TaskSuccessReqVo req) { taskService.taskSuccess(taskId, req); return ApiResponse.success("OK"); } diff --git a/src/main/java/com/ycwl/basic/model/pc/order/entity/OrderEntity.java b/src/main/java/com/ycwl/basic/model/pc/order/entity/OrderEntity.java index 6aaa50b..abd7b76 100644 --- a/src/main/java/com/ycwl/basic/model/pc/order/entity/OrderEntity.java +++ b/src/main/java/com/ycwl/basic/model/pc/order/entity/OrderEntity.java @@ -26,7 +26,11 @@ public class OrderEntity { */ private String openId; /** - * 价格 + * 划线价 + */ + private BigDecimal slashPrice; + /** + * 优惠价格 */ private BigDecimal price; /** diff --git a/src/main/java/com/ycwl/basic/model/pc/scenic/req/ScenicAddOrUpdateReq.java b/src/main/java/com/ycwl/basic/model/pc/scenic/req/ScenicAddOrUpdateReq.java index 62424cc..048a96d 100644 --- a/src/main/java/com/ycwl/basic/model/pc/scenic/req/ScenicAddOrUpdateReq.java +++ b/src/main/java/com/ycwl/basic/model/pc/scenic/req/ScenicAddOrUpdateReq.java @@ -31,6 +31,8 @@ public class ScenicAddOrUpdateReq { */ @ApiModelProperty("景区介绍") private String introduction; + private String logoUrl; + @ApiModelProperty("封面图") private String coverUrl; /** diff --git a/src/main/java/com/ycwl/basic/model/pc/scenic/resp/ScenicRespVO.java b/src/main/java/com/ycwl/basic/model/pc/scenic/resp/ScenicRespVO.java index 0d839da..bf81da1 100644 --- a/src/main/java/com/ycwl/basic/model/pc/scenic/resp/ScenicRespVO.java +++ b/src/main/java/com/ycwl/basic/model/pc/scenic/resp/ScenicRespVO.java @@ -38,6 +38,7 @@ public class ScenicRespVO { */ @ApiModelProperty("景区介绍") private String introduction; + private String logoUrl; @ApiModelProperty("封面图") private String coverUrl; /** diff --git a/src/main/java/com/ycwl/basic/model/pc/source/resp/SourceRespVO.java b/src/main/java/com/ycwl/basic/model/pc/source/resp/SourceRespVO.java index 3ce66c6..c2423f0 100644 --- a/src/main/java/com/ycwl/basic/model/pc/source/resp/SourceRespVO.java +++ b/src/main/java/com/ycwl/basic/model/pc/source/resp/SourceRespVO.java @@ -35,6 +35,7 @@ public class SourceRespVO { */ @ApiModelProperty("来源设备id") private Long deviceId; + private String deviceName; private Long faceId; @ApiModelProperty("原素材类型:1视频,2图像") private Integer type; diff --git a/src/main/java/com/ycwl/basic/model/pc/video/resp/VideoRespVO.java b/src/main/java/com/ycwl/basic/model/pc/video/resp/VideoRespVO.java index f293ebe..29b344d 100644 --- a/src/main/java/com/ycwl/basic/model/pc/video/resp/VideoRespVO.java +++ b/src/main/java/com/ycwl/basic/model/pc/video/resp/VideoRespVO.java @@ -25,10 +25,9 @@ public class VideoRespVO { @ApiModelProperty("景区名称") private String scenicName; /** - * 用户id + * 人脸ID */ - @ApiModelProperty("用户id") - private Long memberId; + @ApiModelProperty("人脸ID") private Long faceId; /** * 模版id diff --git a/src/main/java/com/ycwl/basic/model/task/req/TaskSuccessReqVo.java b/src/main/java/com/ycwl/basic/model/task/req/TaskSuccessReqVo.java new file mode 100644 index 0000000..46ea60d --- /dev/null +++ b/src/main/java/com/ycwl/basic/model/task/req/TaskSuccessReqVo.java @@ -0,0 +1,10 @@ +package com.ycwl.basic.model.task.req; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class TaskSuccessReqVo extends WorkerAuthReqVo { + private VideoInfoReq videoInfo; +} diff --git a/src/main/java/com/ycwl/basic/model/task/req/VideoInfoReq.java b/src/main/java/com/ycwl/basic/model/task/req/VideoInfoReq.java new file mode 100644 index 0000000..b9f6457 --- /dev/null +++ b/src/main/java/com/ycwl/basic/model/task/req/VideoInfoReq.java @@ -0,0 +1,7 @@ +package com.ycwl.basic.model.task.req; + +public class VideoInfoReq { + private Integer height; + private Integer width; + private Float duration; +} diff --git a/src/main/java/com/ycwl/basic/profitsharing/entity/ProfitSharingConfig.java b/src/main/java/com/ycwl/basic/profitsharing/entity/ProfitSharingConfig.java new file mode 100644 index 0000000..9850314 --- /dev/null +++ b/src/main/java/com/ycwl/basic/profitsharing/entity/ProfitSharingConfig.java @@ -0,0 +1,12 @@ +package com.ycwl.basic.profitsharing.entity; + +import lombok.Data; + +import java.util.List; + +@Data +public class ProfitSharingConfig { + private boolean enabled; + private Long scenicId; + private List profitSharingList; +} diff --git a/src/main/java/com/ycwl/basic/profitsharing/entity/ProfitSharingUser.java b/src/main/java/com/ycwl/basic/profitsharing/entity/ProfitSharingUser.java new file mode 100644 index 0000000..2bf06bd --- /dev/null +++ b/src/main/java/com/ycwl/basic/profitsharing/entity/ProfitSharingUser.java @@ -0,0 +1,15 @@ +package com.ycwl.basic.profitsharing.entity; + +import com.ycwl.basic.profitsharing.enums.ProfitSharingUserType; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class ProfitSharingUser { + private ProfitSharingUserType type; + private Integer amount; + private String description; + private BigDecimal wxRate; + private BigDecimal realRate; +} diff --git a/src/main/java/com/ycwl/basic/profitsharing/enums/ProfitSharingUserType.java b/src/main/java/com/ycwl/basic/profitsharing/enums/ProfitSharingUserType.java new file mode 100644 index 0000000..5f80dcc --- /dev/null +++ b/src/main/java/com/ycwl/basic/profitsharing/enums/ProfitSharingUserType.java @@ -0,0 +1,23 @@ +package com.ycwl.basic.profitsharing.enums; + +public enum ProfitSharingUserType { + MERCHANT("MERCHANT_ID", "商户号"), + PERSON_SUB("PERSONAL_SUB_OPENID", "子商户个人"), + PERSON_PARENT("PERSONAL_OPENID", "父商户个人"); + + private final String code; + private final String desc; + + ProfitSharingUserType(String code, String desc) { + this.code = code; + this.desc = desc; + } + + public String getCode() { + return code; + } + + public String getDesc() { + return desc; + } +} diff --git a/src/main/java/com/ycwl/basic/service/impl/mobile/GoodsServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/mobile/GoodsServiceImpl.java index 362d8f5..3f5acc6 100644 --- a/src/main/java/com/ycwl/basic/service/impl/mobile/GoodsServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/impl/mobile/GoodsServiceImpl.java @@ -2,18 +2,21 @@ package com.ycwl.basic.service.impl.mobile; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.ycwl.basic.biz.OrderBiz; import com.ycwl.basic.constant.BaseContextHandler; import com.ycwl.basic.mapper.*; import com.ycwl.basic.model.mobile.goods.*; +import com.ycwl.basic.model.mobile.order.IsBuyRespVO; +import com.ycwl.basic.model.mobile.order.PriceObj; import com.ycwl.basic.model.pc.face.resp.FaceRespVO; import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; -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.task.entity.TaskEntity; import com.ycwl.basic.model.pc.video.entity.MemberVideoEntity; import com.ycwl.basic.model.pc.video.req.VideoReqQuery; import com.ycwl.basic.model.pc.video.resp.VideoRespVO; +import com.ycwl.basic.repository.OrderRepository; import com.ycwl.basic.repository.ScenicRepository; import com.ycwl.basic.repository.VideoTaskRepository; import com.ycwl.basic.service.mobile.GoodsService; @@ -54,6 +57,10 @@ public class GoodsServiceImpl implements GoodsService { private TaskService taskTaskService; @Autowired private ScenicRepository scenicRepository; + @Autowired + private OrderRepository orderRepository; + @Autowired + private OrderBiz orderBiz; public ApiResponse> goodsList(GoodsReqQuery query) { //查询原素材 @@ -174,39 +181,6 @@ public class GoodsServiceImpl implements GoodsService { return ApiResponse.success(goodsDetailVOList); } - @Override - public ApiResponse queryPrice(GoodsPriceQueryReq queryPriceData) { - Integer goodsType = queryPriceData.getGoodsType(); - - if (goodsType == 0) {//成片vlog - //成片的价格就是成片所用template的价格 - Long videoId = queryPriceData.getGoodsId(); - VideoRespVO videoRespVO = videoMapper.getById(videoId); - if (videoRespVO == null) { - return ApiResponse.fail("该vlog不存在或已失效"); - } - BigDecimal templatePrice = videoRespVO.getTemplatePrice(); - if (templatePrice == null) { - return ApiResponse.fail("该vlog使用的模板价格或状态异常,请联系管理员"); - } - return ApiResponse.success(templatePrice); - - } else if (goodsType == 1 || 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("不合法的商品,请联系管理员"); - } - @Override public ApiResponse videoGoodsDetail(Long userId, Long videoId) { VideoGoodsDetailVO goodsDetailVO = new VideoGoodsDetailVO(); @@ -222,21 +196,31 @@ public class GoodsServiceImpl implements GoodsService { goodsDetailVO.setVideoUrl(videoRespVO.getVideoUrl()); goodsDetailVO.setTemplateCoverUrl(videoRespVO.getTemplateCoverUrl()); goodsDetailVO.setCreateTime(videoRespVO.getCreateTime()); - MemberVideoEntity entity = videoMapper.queryUserVideo(userId, videoId); - if (entity == null) { + if (userId == null) { goodsDetailVO.setIsBuy(0); goodsDetailVO.setShare(true); goodsDetailVO.setPrice("未登录"); - } else if (entity.getIsBuy() == 1) { - goodsDetailVO.setIsBuy(1); } else { - goodsDetailVO.setIsBuy(0); - BigDecimal templatePrice = videoRespVO.getTemplatePrice(); - BigDecimal slashPrice = videoRespVO.getSlashPrice(); - // 使用DecimalFormat格式化输出 - DecimalFormat df = new DecimalFormat("0.00"); - goodsDetailVO.setPrice(templatePrice == null ? "" : df.format(templatePrice.setScale(2, RoundingMode.HALF_UP))); - goodsDetailVO.setSlashPrice(slashPrice == null ? null : df.format(slashPrice.setScale(2, RoundingMode.HALF_UP))); + MemberVideoEntity entity = videoMapper.queryUserVideo(userId, videoId); + if (entity == null) { + goodsDetailVO.setIsBuy(0); + goodsDetailVO.setShare(true); + goodsDetailVO.setPrice("未登录"); + } else { + goodsDetailVO.setShare(false); + goodsDetailVO.setFaceId(entity.getFaceId()); + goodsDetailVO.setIsBuy(entity.getIsBuy()); + if (Integer.valueOf(0).equals(entity.getIsBuy())) { + PriceObj priceObj = orderBiz.queryPrice(videoRespVO.getScenicId(), 0, videoId); + if (priceObj.isFree()) { + goodsDetailVO.setIsBuy(1); + } else { + goodsDetailVO.setIsBuy(0); + goodsDetailVO.setPrice(priceObj.getPrice().toString()); + goodsDetailVO.setSlashPrice(priceObj.getSlashPrice().toString()); + } + } + } } TaskEntity task = videoTaskRepository.getTaskById(videoRespVO.getTaskId()); JSONObject paramJson = JSON.parseObject(task.getTaskParams()); @@ -248,9 +232,6 @@ public class GoodsServiceImpl implements GoodsService { deviceCount = paramJson.keySet().stream().filter(StringUtils::isNumeric).count(); } goodsDetailVO.setLensNum((int) deviceCount); - if (entity != null) { - goodsDetailVO.setFaceId(entity.getFaceId()); - } return ApiResponse.success(goodsDetailVO); } diff --git a/src/main/java/com/ycwl/basic/service/impl/pc/OrderServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/pc/OrderServiceImpl.java index df92e9f..9932192 100644 --- a/src/main/java/com/ycwl/basic/service/impl/pc/OrderServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/impl/pc/OrderServiceImpl.java @@ -8,6 +8,7 @@ import com.ycwl.basic.constant.NumberConstant; import com.ycwl.basic.enums.*; import com.ycwl.basic.exception.AppException; import com.ycwl.basic.mapper.*; +import com.ycwl.basic.model.mobile.order.IsBuyRespVO; import com.ycwl.basic.model.mobile.order.OrderAppPageReq; import com.ycwl.basic.model.mobile.order.PriceObj; import com.ycwl.basic.model.mobile.order.RefundOrderReq; @@ -267,6 +268,10 @@ public class OrderServiceImpl implements OrderService { @Override @Transactional(rollbackFor = Exception.class) public ApiResponse createOrder(Long userId, CreateOrderReqVO createOrderReqVO) throws Exception { + IsBuyRespVO isBuy = orderBiz.isBuy(userId, createOrderReqVO.getScenicId(), createOrderReqVO.getGoodsType(), createOrderReqVO.getGoodsId()); + if (isBuy.isBuy()) { + return ApiResponse.fail("您已购买此内容,无需重复购买!"); + } OrderEntity order = new OrderEntity(); Long orderId = SnowFlakeUtil.getLongId(); order.setId(orderId); @@ -281,11 +286,17 @@ public class OrderServiceImpl implements OrderService { orderItem.setOrderId(orderId); orderItems.add(orderItem); PriceObj priceObj = orderBiz.queryPrice(order.getScenicId(), createOrderReqVO.getGoodsType(), createOrderReqVO.getGoodsId()); + order.setSlashPrice(priceObj.getSlashPrice()); order.setPrice(priceObj.getPrice()); // promo code // coupon order.setPayPrice(priceObj.getPrice()); - order.setStatus(OrderStateEnum.UNPAID.getState()); + if (order.getPayPrice().equals(BigDecimal.ZERO)) { + order.setStatus(OrderStateEnum.PAID.getState()); + order.setPayAt(new Date()); + } else { + order.setStatus(OrderStateEnum.UNPAID.getState()); + } orderMapper.add(order); int addOrderItems = orderMapper.addOrderItems(orderItems); if (addOrderItems == NumberConstant.ZERO) { diff --git a/src/main/java/com/ycwl/basic/service/impl/task/TaskTaskServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/task/TaskTaskServiceImpl.java index e59589f..26fccbf 100644 --- a/src/main/java/com/ycwl/basic/service/impl/task/TaskTaskServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/impl/task/TaskTaskServiceImpl.java @@ -33,6 +33,7 @@ import com.ycwl.basic.model.pc.video.entity.MemberVideoEntity; import com.ycwl.basic.model.pc.video.entity.VideoEntity; import com.ycwl.basic.model.task.req.ClientStatusReqVo; import com.ycwl.basic.model.task.req.TaskReqVo; +import com.ycwl.basic.model.task.req.TaskSuccessReqVo; import com.ycwl.basic.model.task.req.WorkerAuthReqVo; import com.ycwl.basic.model.task.resp.TaskSyncRespVo; import com.ycwl.basic.notify.NotifyFactory; @@ -345,7 +346,7 @@ public class TaskTaskServiceImpl implements TaskService { } @Override - public void taskSuccess(@NonNull Long taskId, @NonNull WorkerAuthReqVo req) { + public void taskSuccess(@NonNull Long taskId, @NonNull TaskSuccessReqVo req) { TaskRespVO task = taskMapper.getById(taskId); if (task == null) { return; diff --git a/src/main/java/com/ycwl/basic/service/mobile/GoodsService.java b/src/main/java/com/ycwl/basic/service/mobile/GoodsService.java index 94c8a93..cfdae2c 100644 --- a/src/main/java/com/ycwl/basic/service/mobile/GoodsService.java +++ b/src/main/java/com/ycwl/basic/service/mobile/GoodsService.java @@ -3,7 +3,6 @@ package com.ycwl.basic.service.mobile; import com.ycwl.basic.model.mobile.goods.*; import com.ycwl.basic.utils.ApiResponse; -import java.math.BigDecimal; import java.util.List; /** @@ -28,13 +27,6 @@ public interface GoodsService { */ ApiResponse> sourceGoodsList(Long userId, GoodsReqQuery query); - /** - * 查询订单应付价格 - * @param queryPriceData - * @return - */ - ApiResponse queryPrice(GoodsPriceQueryReq queryPriceData); - /** * @param userId 商品(vlog)id * @param videoId diff --git a/src/main/java/com/ycwl/basic/service/task/TaskService.java b/src/main/java/com/ycwl/basic/service/task/TaskService.java index 46d1faf..7abee20 100644 --- a/src/main/java/com/ycwl/basic/service/task/TaskService.java +++ b/src/main/java/com/ycwl/basic/service/task/TaskService.java @@ -2,6 +2,7 @@ package com.ycwl.basic.service.task; import com.ycwl.basic.model.pc.template.resp.TemplateRespVO; import com.ycwl.basic.model.task.req.TaskReqVo; +import com.ycwl.basic.model.task.req.TaskSuccessReqVo; import com.ycwl.basic.model.task.req.WorkerAuthReqVo; import com.ycwl.basic.model.task.resp.TaskSyncRespVo; @@ -17,7 +18,7 @@ public interface TaskService { void createTaskByFaceIdAndTempalteId(Long faceId, Long templateId, int automatic); - void taskSuccess(Long taskId, WorkerAuthReqVo req); + void taskSuccess(Long taskId, TaskSuccessReqVo req); void taskFail(Long taskId, WorkerAuthReqVo req); diff --git a/src/main/resources/mapper/OrderMapper.xml b/src/main/resources/mapper/OrderMapper.xml index d3d9ed2..1ff0cc9 100644 --- a/src/main/resources/mapper/OrderMapper.xml +++ b/src/main/resources/mapper/OrderMapper.xml @@ -111,8 +111,8 @@ - insert into `order`(id, member_id, openid, price, pay_price, remark, broker_id, promo_code, scenic_id) - VALUES (#{id}, #{memberId}, #{openId}, #{price}, #{payPrice}, #{remark}, #{brokerId}, #{promoCode}, #{scenicId}) + insert into `order`(id, member_id, openid, slash_price, price, pay_price, remark, broker_id, promo_code, scenic_id, status) + VALUES (#{id}, #{memberId}, #{openId}, #{slashPrice}, #{price}, #{payPrice}, #{remark}, #{brokerId}, #{promoCode}, #{scenicId}, #{status}) insert into order_item(order_id,goods_type, goods_id) VALUES @@ -343,5 +343,6 @@ and oi.goods_id = #{goodsId} and oi.goods_type = #{goodsType} and o.status = 1 + limit 1 \ No newline at end of file diff --git a/src/main/resources/mapper/ScenicMapper.xml b/src/main/resources/mapper/ScenicMapper.xml index 4f69104..866a7bc 100644 --- a/src/main/resources/mapper/ScenicMapper.xml +++ b/src/main/resources/mapper/ScenicMapper.xml @@ -2,8 +2,8 @@ - insert into scenic(id, `name`, introduction, phone, cover_url, longitude, latitude, radius, province, city, area, address, price, kf_code_url, kf_phone) - values (#{id}, #{name}, #{introduction}, #{phone}, #{coverUrl},#{longitude}, #{latitude}, #{radius}, #{province}, #{city}, #{area}, #{address}, #{price}, #{kfCodeUrl}, #{kfPhone}) + insert into scenic(id, `name`, introduction, phone, cover_url, longitude, latitude, radius, province, city, area, address, price, kf_code_url, kf_phone, logo_url) + values (#{id}, #{name}, #{introduction}, #{phone}, #{coverUrl},#{longitude}, #{latitude}, #{radius}, #{province}, #{city}, #{area}, #{address}, #{price}, #{kfCodeUrl}, #{kfPhone}, #{logoUrl}) insert into scenic_config(id, scenic_id, create_time) @@ -46,12 +46,15 @@ address=#{address}, - + kf_code_url=#{kfCodeUrl}, - + kf_phone=#{kfPhone}, + + logo_url=#{logoUrl}, + where id = #{id} @@ -96,7 +99,7 @@ delete from scenic_config where scenic_id = #{scenicId} @@ -202,6 +205,7 @@ + diff --git a/src/main/resources/mapper/SourceMapper.xml b/src/main/resources/mapper/SourceMapper.xml index ab3c6c1..34b0c94 100644 --- a/src/main/resources/mapper/SourceMapper.xml +++ b/src/main/resources/mapper/SourceMapper.xml @@ -43,11 +43,12 @@ - select v.id, v.scenic_id, member_id, template_id, task_id, worker_id, video_url, v.create_time, v.update_time, - s.name scenicName, s.latitude, s.longitude, t.name templateName, t.price templatePrice,t.cover_url templateCoverUrl,v.is_buy + select v.id, v.scenic_id, template_id, task_id, worker_id, video_url, v.create_time, v.update_time, + s.name scenicName, s.latitude, s.longitude, t.name templateName, t.price templatePrice,t.cover_url templateCoverUrl from video v left join scenic s on s.id = v.scenic_id left join template t on v.template_id = t.id and v.scenic_id = #{scenicId} - and member_id = #{memberId} and template_id = #{templateId} - - and task_id = #{taskId} - + and task_id = #{taskId} and worker_id = #{workerId} - - and is_buy = #{isBuy} - and v.create_time >= #{startTime} and v.create_time <= #{endTime} @@ -73,7 +65,7 @@ order by v.create_time desc