Commit 5caa0de0 by 吕明尚

添加点评北极星平台接口

parent 62df8d6b
......@@ -174,3 +174,7 @@ meituan:
developerId: 123456
signKey: abcdefghijklmnopqrstuvwxyz
appAuthToken: abcdefghijklmnopqrstuvwxyz
dianping:
appKey: abcdefghijklmnopqrstuvwxyz
appSecret: abcdefghijklmnopqrstuvwxyz
authCode: abcdefghijklmnopqrstuvwxyz
package share.web.controller.system;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import share.common.core.domain.R;
import share.system.service.QPService;
@RestController
@RequestMapping("/front/chessCards")
@Api(tags = "首页-验券")
public class QPController {
@Autowired
private QPService qpService;
//输码验券校验接口
@GetMapping("/prepare")
public R prepare(String code) {
return R.ok(qpService.prepare(code));
}
//验券接口
@GetMapping("/consume")
public R consume(String code, int count) {
return R.ok(qpService.consume(code, count));
}
//撤销验券接口
@GetMapping("/reverseconsume")
public R reverseconsume(String code, String appDealId) {
return R.ok(qpService.reverseconsume(code, appDealId));
}
//查询已验券信息接口
@GetMapping("/getconsumed")
public R getconsumed(String code) {
return R.ok(qpService.getconsumed(code));
}
//用户验券接口
@GetMapping("/consumeByUser")
public R consumeByUser(String code, int count) {
return R.ok(qpService.consumeByUser(code, count));
}
//用户销券接口
@GetMapping("/reverseconsumeByUser")
public R reverseconsumeByUser(String code, String appDealId) {
return R.ok(qpService.reverseconsumeByUser(code, appDealId));
}
}
package share.web.controller.system;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import share.common.core.controller.BaseController;
import share.common.core.domain.AjaxResult;
import share.common.core.domain.R;
import share.common.core.page.TableDataInfo;
import share.system.domain.SConsumer;
import share.system.domain.SConsumerCoupon;
import share.system.domain.vo.FrontTokenComponent;
import share.system.request.CouponRequest;
import share.system.service.ISConsumerCouponService;
import java.util.List;
......@@ -21,6 +26,7 @@ import java.util.List;
*/
@RestController
@RequestMapping("/front/consumerCoupon")
@Api(tags = "优惠券")
public class SConsumerCouponController extends BaseController {
@Autowired
private ISConsumerCouponService sConsumerCouponService;
......@@ -53,14 +59,9 @@ public class SConsumerCouponController extends BaseController {
// @PreAuthorize("@ss.hasPermi('system:coupon:list')")
@ApiOperation(value = "优惠券-查询可用优惠券")
@PostMapping("/query")
public List<SConsumerCoupon> query(@RequestBody SConsumerCoupon sConsumerCoupon) {
SConsumer user = FrontTokenComponent.getWxSConsumerEntry();
sConsumerCoupon.setUseStatus("0");
sConsumerCoupon.setConsumerId(user.getId());
return sConsumerCouponService.selectSConsumerCouponList(sConsumerCoupon);
public R<List<SConsumerCoupon>> query(@RequestBody @Validated CouponRequest couponRequest) {
return R.ok(sConsumerCouponService.availableCouponList(couponRequest));
}
}
......@@ -179,3 +179,7 @@ meituan:
developerId: 123456
signKey: abcdefghijklmnopqrstuvwxyz
appAuthToken: abcdefghijklmnopqrstuvwxyz
dianping:
appKey: abcdefghijklmnopqrstuvwxyz
appSecret: abcdefghijklmnopqrstuvwxyz
authCode: abcdefghijklmnopqrstuvwxyz
......@@ -99,7 +99,35 @@
<version>1.7.25</version>
</dependency>
<!--美团SDK引入加相关依赖结束-->
<dependency>
<groupId>dianping-openapi</groupId>
<artifactId>dianping-openapi</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/lib/dianping-openapi-java-sdk-qa-1.1.240.jar</systemPath>
</dependency>
<dependency>
<groupId>dianping-openapi-sources</groupId>
<artifactId>dianping-openapi-sources</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/lib/dianping-openapi-java-sdk-qa-1.1.240-sources.jar</systemPath>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.2-android</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.4</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
......@@ -4,6 +4,7 @@ import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
......@@ -89,6 +90,7 @@ public class SConsumer
private Date lastLoginTime;
@ApiModelProperty(value = "优惠卷数量")
@TableField(exist = false)
private Integer number;
}
......@@ -114,4 +114,16 @@ public class SConsumerCoupon extends BaseEntity
@Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date deleteTime;
/**
* 是否可用 (0:可用,1:不可以)
*/
//是否可用 (0:可用,1:不可以)
@TableField(select = false)
private Integer isAvailable;
/**
* 原因
*/
@TableField(select = false)
private String reason;
}
package share.system.request;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value = "CouponRequest对象", description = "优惠卷请求对象")
public class CouponRequest {
@ApiModelProperty(value = "门店ID", required = true)
@NotBlank(message = "门店ID不能为空")
private Long storeId;
@ApiModelProperty(value = "房间ID", required = true)
@NotBlank(message = "房间ID不能为空")
private Long roomId;
/**
* 预约开始时间
*/
@ApiModelProperty(value = "预约开始时间 yyyy-MM-dd HH:mm", required = true)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
@NotNull(message = "预约开始时间不能为空")
private Date preStartDate;
/**
* 预约结束时间
*/
@ApiModelProperty(value = "预约结束时间 yyyy-MM-dd HH:mm", required = true)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
@NotNull(message = "预约结束时间不能为空")
private Date preEndDate;
}
......@@ -3,6 +3,7 @@ package share.system.service;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import share.system.domain.SConsumerCoupon;
import share.system.request.CouponRequest;
/**
* 优惠券领取记录Service接口
......@@ -61,4 +62,6 @@ public interface ISConsumerCouponService extends IService<SConsumerCoupon>
public int deleteSConsumerCouponById(Long id);
int selectSConsumerCouponConut(SConsumerCoupon sConsumerCoupon);
List<SConsumerCoupon> availableCouponList(CouponRequest couponRequest);
}
package share.system.service;
import com.dianping.openapi.sdk.api.tuangou.entity.TuangouReceiptConsumeResponseEntity;
import com.dianping.openapi.sdk.api.tuangou.entity.TuangouReceiptGetConsumedReponseEntity;
import com.dianping.openapi.sdk.api.tuangou.entity.TuangouReceiptPrepareResponseEntity;
import com.dianping.openapi.sdk.api.tuangou.entity.TuangouReceiptReverseConsumeResponseEntity;
import java.util.List;
public interface QPService {
TuangouReceiptPrepareResponseEntity prepare(String code);
List<TuangouReceiptConsumeResponseEntity> consume(String code, int count);
List<TuangouReceiptReverseConsumeResponseEntity> reverseconsume(String code, String appDealId);
TuangouReceiptGetConsumedReponseEntity getconsumed(String code);
String consumeByUser(String code, int count);
String reverseconsumeByUser(String code, String appDealId);
}
package share.system.service.impl;
import com.dianping.openapi.sdk.api.oauth.DynamicToken;
import com.dianping.openapi.sdk.api.oauth.entity.DynamicTokenRequest;
import com.dianping.openapi.sdk.api.oauth.entity.DynamicTokenResponse;
import com.dianping.openapi.sdk.api.oauth.enums.GrantType;
import com.dianping.openapi.sdk.api.tuangou.TuangouReceiptConsume;
import com.dianping.openapi.sdk.api.tuangou.TuangouReceiptGetConsumed;
import com.dianping.openapi.sdk.api.tuangou.TuangouReceiptPrepare;
import com.dianping.openapi.sdk.api.tuangou.TuangouReceiptReverseConsume;
import com.dianping.openapi.sdk.api.tuangou.entity.*;
import com.dianping.openapi.sdk.httpclient.DefaultOpenAPIClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import share.system.domain.SConsumer;
import share.system.domain.SConsumerCoupon;
import share.system.domain.SCoupon;
import share.system.domain.vo.FrontTokenComponent;
import share.system.service.ISConsumerCouponService;
import share.system.service.ISCouponService;
import share.system.service.QPService;
import java.util.List;
@Service
public class QPServiceImpl implements QPService {
@Value("${dianping.appKey}")
private String APP_KEY;
@Value("${dianping.appSecret}")
private String APP_SECRET;
@Value("${dianping.authCode}")
private String AUTH_CODE;
@Autowired
private ISCouponService isCouponService;
@Autowired
private ISConsumerCouponService isConsumerCouponService;
/**
* 用户验卷接口
*/
@Override
public String consumeByUser(String code, int count) {
//验券准备
TuangouReceiptPrepareResponseEntity prepare = prepare(code);
SCoupon sCoupon = isCouponService.selectSCouponByName(prepare.getDeal_title());
if (sCoupon == null) {
throw new RuntimeException("未找到对应的优惠券");
}
//执行验券
List<TuangouReceiptConsumeResponseEntity> consume = consume(code, count);
consume.forEach(item -> {
SConsumer user = FrontTokenComponent.getWxSConsumerEntry();
SConsumerCoupon sConsumerCoupon = new SConsumerCoupon();
sConsumerCoupon.setConsumerId(user.getId());
//取订单ID,如果为空,则取套餐ID
sConsumerCoupon.setCouponId(Long.valueOf(item.getOrder_id()) != null ? Long.valueOf(item.getOrder_id()) : item.getDeal_id());
sConsumerCoupon.setCouponCode(code);
sConsumerCoupon.setName(item.getDeal_title());
sConsumerCoupon.setCouponType(String.valueOf(sCoupon.getCouponType()));
sConsumerCoupon.setStoreType(sCoupon.getStoreType());
sConsumerCoupon.setRoomType(sCoupon.getRoomType());
sConsumerCoupon.setMinDuration(sCoupon.getMinDuration());
sConsumerCoupon.setMaxDuration(sCoupon.getMaxDuration());
sConsumerCoupon.setDuration(sCoupon.getDuration());
sConsumerCoupon.setMinPrice(sCoupon.getMinPrice());
sConsumerCoupon.setSubPrice(sCoupon.getSubPrice());
sConsumerCoupon.setSourceType("3");
sConsumerCoupon.setPlatformType("2");
sConsumerCoupon.setStartDate(sCoupon.getStartDate());
sConsumerCoupon.setEndDate(item.getReceiptEndDate());
sConsumerCoupon.setCreateBy(String.valueOf(user.getId()));
isConsumerCouponService.insertSConsumerCoupon(sConsumerCoupon);
});
return "验券成功";
}
@Override
public String reverseconsumeByUser(String code, String appDealId) {
TuangouReceiptGetConsumedReponseEntity getconsumed = getconsumed(code);
return null;
}
/**
* 验卷准备接口
* 根据团购券码,查询券码对应的dealid下,该用户可使用的券数据量
*/
@Override
public TuangouReceiptPrepareResponseEntity prepare(String code) {
TuangouReceiptPrepareRequest request = new TuangouReceiptPrepareRequest(APP_KEY, APP_SECRET, "session", code, "");
TuangouReceiptPrepare tuangouReceiptPrepare = new TuangouReceiptPrepare(request);
DefaultOpenAPIClient client = new DefaultOpenAPIClient();
TuangouReceiptPrepareResponse invoke = client.invoke(tuangouReceiptPrepare);
if (invoke.getCode() != 200) {
throw new RuntimeException(invoke.getMsg());
}
return invoke.getData();
}
/**
* 验卷接口
* 根据团购券码,一次性验证同一订单下的若干团购券 同一个用户,同一个dealid下的券码
*/
@Override
public List<TuangouReceiptConsumeResponseEntity> consume(String code, int count) {
TuangouReceiptConsumeRequest request = new TuangouReceiptConsumeRequest(APP_KEY, APP_SECRET, "session",
"requestid", code, count, "open_shop_uuid",
"app_shop_account", "app_shop_accountname");
DefaultOpenAPIClient openAPIClient = new DefaultOpenAPIClient();
TuangouReceiptConsume tuangouReceiptConsume = new TuangouReceiptConsume(request);
TuangouReceiptConsumeResponse invoke = openAPIClient.invoke(tuangouReceiptConsume);
if (invoke.getCode() != 200) {
throw new RuntimeException(invoke.getMsg());
}
return invoke.getData();
}
/**
* 撤销验卷接口
* 撤销已经核销的券码(只可撤销当天核销且未超过10分钟的团购券)
*/
@Override
public List<TuangouReceiptReverseConsumeResponseEntity> reverseconsume(String code, String appDealId) {
TuangouReceiptReverseConsumeRequest tuangouReceiptReverseConsumeRequest = new TuangouReceiptReverseConsumeRequest(APP_KEY, APP_SECRET, "session",
"app_deal_id", code, appDealId, "app_shop_account",
"app_shop_accountname", "open_shop_uuid");
DefaultOpenAPIClient openAPIClient = new DefaultOpenAPIClient();
TuangouReceiptReverseConsume tuangouReceiptReverseConsume = new TuangouReceiptReverseConsume(tuangouReceiptReverseConsumeRequest);
TuangouReceiptReverseConsumeResponse response = openAPIClient.invoke(tuangouReceiptReverseConsume);
if (response.getCode() != 200) {
throw new RuntimeException(response.getMsg());
}
return response.getData();
}
/**
* 查询已验券信息接口
* 查询已经验证的券码信息,仅支持已经验证的券码
*/
@Override
public TuangouReceiptGetConsumedReponseEntity getconsumed(String code) {
DefaultOpenAPIClient openAPIClient = new DefaultOpenAPIClient();
TuangouReceiptGetConsumedRequest request = new TuangouReceiptGetConsumedRequest(APP_KEY, APP_SECRET,
"7bd6cc83aecf6fe937d4cd774e1682aeb87773ad", code, "app_shop_id");
TuangouReceiptGetConsumed tuangouReceiptGetConsumed = new TuangouReceiptGetConsumed(request);
TuangouReceiptGetConsumedReponse response = openAPIClient.invoke(tuangouReceiptGetConsumed);
if (response.getCode() != 200) {
throw new RuntimeException(response.getMsg());
}
return response.getData();
}
//商家通过接入授权UI,可获取到对应的auth_code,通过此接口获取此次发起授权的session。
public DynamicTokenResponse oauthToken() {
DefaultOpenAPIClient openAPIClient = new DefaultOpenAPIClient();
DynamicTokenRequest request = new DynamicTokenRequest(APP_KEY,
APP_SECRET, GrantType.AUTHORIZATION_CODE.getValue(),
AUTH_CODE);
DynamicToken dynamicToken = new DynamicToken(request);
DynamicTokenResponse response = openAPIClient.invoke(dynamicToken);
return response;
}
}
package share.system.service.impl;
import java.util.List;
import java.lang.reflect.Array;
import java.math.BigDecimal;
import java.util.*;
import cn.hutool.json.JSONArray;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.util.CollectionUtils;
import share.common.enums.RoomStatusEnum;
import share.common.enums.RoomType;
import share.common.enums.StoreType;
import share.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import share.system.domain.SConsumer;
import share.system.domain.SRoom;
import share.system.domain.SStore;
import share.system.domain.vo.FrontTokenComponent;
import share.system.domain.vo.SRoomVo;
import share.system.mapper.SConsumerCouponMapper;
import share.system.domain.SConsumerCoupon;
import share.system.request.CouponRequest;
import share.system.service.ISConsumerCouponService;
import share.system.service.ISRoomService;
import share.system.service.ISStoreService;
/**
* 优惠券领取记录Service业务层处理
......@@ -21,6 +37,12 @@ public class SConsumerCouponServiceImpl extends ServiceImpl<SConsumerCouponMappe
@Autowired
private SConsumerCouponMapper sConsumerCouponMapper;
@Autowired
private ISRoomService sRoomService;
@Autowired
private ISStoreService sStoreService;
/**
* 查询优惠券领取记录
*
......@@ -99,4 +121,125 @@ public class SConsumerCouponServiceImpl extends ServiceImpl<SConsumerCouponMappe
public int selectSConsumerCouponConut(SConsumerCoupon sConsumerCoupon) {
return sConsumerCouponMapper.selectSConsumerCouponConut(sConsumerCoupon);
}
@Override
public List<SConsumerCoupon> availableCouponList(CouponRequest couponRequest) {
SConsumerCoupon sConsumerCoupon = new SConsumerCoupon();
SConsumer user = FrontTokenComponent.getWxSConsumerEntry();
sConsumerCoupon.setUseStatus("0");
sConsumerCoupon.setConsumerId(user.getId());
//查询用户未使用的优惠券
List<SConsumerCoupon> sConsumerCoupons = sConsumerCouponMapper.selectSConsumerCouponList(sConsumerCoupon);
//计算时长
BigDecimal bigDecimal = DateUtils.differentHour(couponRequest.getPreStartDate(), couponRequest.getPreEndDate());
if (CollectionUtils.isEmpty(sConsumerCoupons)) {
throw new RuntimeException("用户没有可用的优惠券");
}
//迭代
sConsumerCoupons.forEach(item -> {
if (item.getStartDate().compareTo(couponRequest.getPreStartDate()) > 0) {
SStore sStore = sStoreService.getById(couponRequest.getStoreId());
SRoom byId = sRoomService.getById(couponRequest.getRoomId());
BigDecimal subtract = new BigDecimal(item.getMinDuration());
if (item.getCouponType().equals("3")) {
//判断门槛时长
if (bigDecimal.compareTo(subtract) > 0) {
//判断门店类型
if (item.getStoreType().contains(sStore.getStoreType())) {
//判断房间类型
if (item.getRoomType().contains(byId.getRoomType())) {
item.setIsAvailable(0);
} else {
item.setIsAvailable(1);
final List<String> list = new JSONArray(item.getRoomType()).toList(String.class);
Map<String, String> colorMap = new HashMap<>();
EnumSet<RoomType> colors = EnumSet.allOf(RoomType.class);
for (RoomType color : colors) {
colorMap.put(color.getCode(), color.getName());
}
StringBuilder roomType = new StringBuilder();
for (String type : list) {
roomType.append(colorMap.get(type)).append(",");
}
item.setReason("房间类型不支持,支持的房间类型为:" + roomType);
}
} else {
item.setIsAvailable(1);
final List<String> list = new JSONArray(item.getStoreType()).toList(String.class);
Map<String, String> colorMap = new HashMap<>();
EnumSet<StoreType> colors = EnumSet.allOf(StoreType.class);
for (StoreType color : colors) {
colorMap.put(color.getCode(), color.getName());
}
StringBuilder storeType = new StringBuilder();
for (String type : list) {
storeType.append(colorMap.get(type)).append(",");
}
item.setReason("门店类型不支持,支持的门店类型为:" + storeType);
}
} else {
item.setIsAvailable(1);
item.setReason("下单时长等于" + bigDecimal + "小时,不满足优惠券门槛时长");
}
} else {
//计算价格
BigDecimal multiply = bigDecimal.multiply(byId.getPrice());
//判断是否满足优惠券门槛
if (item.getMinPrice().compareTo(multiply) > 0) {
//判断门槛时长
if (bigDecimal.compareTo(subtract) > 0) {
//判断门店类型
if (item.getStoreType().contains(sStore.getStoreType())) {
//判断房间类型
if (item.getRoomType().contains(byId.getRoomType())) {
item.setIsAvailable(0);
} else {
item.setIsAvailable(1);
final List<String> list = new JSONArray(item.getRoomType()).toList(String.class);
Map<String, String> colorMap = new HashMap<>();
EnumSet<RoomType> colors = EnumSet.allOf(RoomType.class);
for (RoomType color : colors) {
colorMap.put(color.getCode(), color.getName());
}
StringBuilder roomType = new StringBuilder();
for (String type : list) {
roomType.append(colorMap.get(type)).append(",");
}
item.setReason("房间类型不支持,支持的房间类型为:" + roomType);
}
} else {
item.setIsAvailable(1);
final List<String> list = new JSONArray(item.getStoreType()).toList(String.class);
Map<String, String> colorMap = new HashMap<>();
EnumSet<StoreType> colors = EnumSet.allOf(StoreType.class);
for (StoreType color : colors) {
colorMap.put(color.getCode(), color.getName());
}
StringBuilder storeType = new StringBuilder();
for (String type : list) {
storeType.append(colorMap.get(type)).append(",");
}
item.setReason("门店类型不支持,支持的门店类型为:" + storeType);
}
} else {
item.setIsAvailable(1);
item.setReason("下单时长低于" + item.getMinDuration() + "小时 ");
}
} else {
item.setIsAvailable(1);
item.setReason("消费金额低于" + item.getMinPrice() + "元");
}
}
} else {
item.setIsAvailable(1);
item.setReason("优惠卷未生效,优惠卷生效时间为" + item.getStartDate() + "-" + item.getEndDate());
}
});
return sConsumerCoupons;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment