Commit 16a28fa1 by huluobin

update

parent 0d112cd3
......@@ -2,7 +2,9 @@ package com.gogirl.application.market.coupon;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gogirl.domain.market.coupon.Coupon;
import com.gogirl.infrastructure.common.exception.RRException;
import java.util.Collection;
import java.util.List;
......@@ -49,4 +51,24 @@ public interface CouponService extends IService<Coupon> {
* @param couponIds 外部券配置id list
*/
void techSubmitCoupons(Integer orderId, List<Integer> couponIds);
/**
* 卡券集合中是否存在冲突的卡券
*
* @param couponIdList 卡券配置id
* @return
*/
Boolean existCouponConflict(Collection<Integer> couponIdList);
/**
* 卡券集合中是否存在冲突的卡券 如果存在 抛出异常
*
* @param couponIdList 卡券配置id
* @return
*/
void checkCouponConflict(Collection<Integer> couponIdList) throws RRException;
}
package com.gogirl.application.market.coupon;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gogirl.domain.market.coupon.CouponExcludeDetailed;
/**
* <p>
* 券 排斥明细 服务类
* </p>
*
* @author robbendev
* @since 2020-06-10
*/
public interface ICouponExcludeDetailedService extends IService<CouponExcludeDetailed> {
}
package com.gogirl.application.market.coupon;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gogirl.domain.market.coupon.CouponStore;
/**
* <p>
* 优惠券限定使用店铺 服务类
* </p>
*
* @author robbendev
* @since 2020-06-10
*/
public interface ICouponStoreService extends IService<CouponStore> {
}
......@@ -54,13 +54,13 @@ public class CouponCustomerRelevanceServiceImpl extends ServiceImpl<CouponCustom
/*1、查询订单服务和订单*/
List<OrderServe> orderServeList = orderServeMapper.selectList(new LambdaQueryWrapper<OrderServe>().eq(OrderServe::getOrderId, orderId));
OrderManage orderManage = orderManageMapper.selectById(orderId);
return couponCustomerRelevanceMapper
.selectList(new LambdaQueryWrapper<CouponCustomerRelevance>()
.eq(CouponCustomerRelevance::getCustomerId, currentCustomerId)
//只查询内部券
.eq(CouponCustomerRelevance::getSourceType, 0)
//只查询正常状态的卡券
.eq(CouponCustomerRelevance::getState, 1))
return couponCustomerRelevanceMapper.getOrderCoupon(currentCustomerId, orderManage.getDepartmentId())
// .selectList(new LambdaQueryWrapper<CouponCustomerRelevance>()
// .eq(CouponCustomerRelevance::getCustomerId, currentCustomerId)
// //只查询内部券
// .eq(CouponCustomerRelevance::getSourceType, 0)
// //只查询正常状态的卡券
// .eq(CouponCustomerRelevance::getState, 1))
//
.stream()
//只返回可以使用的优惠券
......@@ -81,14 +81,14 @@ public class CouponCustomerRelevanceServiceImpl extends ServiceImpl<CouponCustom
canUserServeIds.retainAll(orderServeList.stream()
.filter(orderServe -> orderServe.getBindOuterCoupon() == 2)
.filter(orderServe -> orderServe.getBindTimesCard() == 2)
.filter(orderServe -> orderServe.getPayPrice().compareTo(BigDecimal.ZERO)>0)
.filter(orderServe -> orderServe.getPayPrice().compareTo(BigDecimal.ZERO) > 0)
.map(OrderServe::getServeId)
.collect(Collectors.toList()));
} else {
canUserServeIds.retainAll(orderServeList.stream()
.filter(orderServe -> orderServe.getBindOuterCoupon() == 2)
.filter(orderServe -> orderServe.getBindTimesCard() == 2)
.filter(orderServe -> orderServe.getPayPrice().compareTo(BigDecimal.ZERO)>0)
.filter(orderServe -> orderServe.getPayPrice().compareTo(BigDecimal.ZERO) > 0)
//不是活动价格
.filter(orderServe -> !orderServe.isActivity())
.map(OrderServe::getServeId)
......
package com.gogirl.application.market.coupon.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gogirl.application.market.coupon.ICouponExcludeDetailedService;
import com.gogirl.domain.market.coupon.CouponExcludeDetailed;
import com.gogirl.infrastructure.mapper.market.coupon.CouponExcludeDetailedMapper;
import org.springframework.stereotype.Service;
/**
* <p>
* 券 排斥明细 服务实现类
* </p>
*
* @author robbendev
* @since 2020-06-10
*/
@Service
public class CouponExcludeDetailedServiceImpl extends ServiceImpl<CouponExcludeDetailedMapper, CouponExcludeDetailed> implements ICouponExcludeDetailedService {
}
......@@ -7,6 +7,7 @@ import com.gogirl.application.market.coupon.CouponService;
import com.gogirl.application.market.coupon.MarketService;
import com.gogirl.domain.market.coupon.Coupon;
import com.gogirl.domain.market.coupon.CouponCustomerRelevance;
import com.gogirl.domain.market.coupon.CouponExcludeDetailed;
import com.gogirl.domain.order.serve.OrderManage;
import com.gogirl.domain.order.serve.OrderServe;
import com.gogirl.domain.xcx.GogirlConfig;
......@@ -14,6 +15,7 @@ import com.gogirl.infrastructure.common.exception.RRException;
import com.gogirl.infrastructure.common.util.ListUtil;
import com.gogirl.infrastructure.common.util.StringUtils;
import com.gogirl.infrastructure.mapper.market.coupon.CouponCustomerRelevanceMapper;
import com.gogirl.infrastructure.mapper.market.coupon.CouponExcludeDetailedMapper;
import com.gogirl.infrastructure.mapper.market.coupon.CouponMapper;
import com.gogirl.infrastructure.mapper.order.serve.OrderManageMapper;
import com.gogirl.infrastructure.mapper.order.serve.OrderServeMapper;
......@@ -24,6 +26,8 @@ import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
......@@ -48,6 +52,8 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
@Lazy
@Resource
private MarketService marketService;
@Resource
CouponExcludeDetailedMapper couponExcludeDetailedMapper;
@Override
public Coupon checkNewCustomer(Integer customerId) {
......@@ -124,9 +130,7 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
OrderManage orderManage = orderManageMapper.selectById(orderId);
List<OrderServe> orderServeList = orderServeMapper.selectList(new LambdaQueryWrapper<OrderServe>().eq(OrderServe::getOrderId, orderId));
return couponMapper
.selectList(new LambdaQueryWrapper<Coupon>()
.eq(Coupon::getSourceType, 1)
.eq(Coupon::getState, 1))
.getOrderExternalCoupon(orderManage.getDepartmentId())
.stream()
//过滤所有可用在服务上的
.filter(coupon -> {
......@@ -163,4 +167,67 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
marketService.calcOrderAmount(orderId);
}
@Override
public Boolean existCouponConflict(Collection<Integer> couponIdList) {
LinkedList<Integer> linkList = new LinkedList<>(couponIdList);
if (linkList.size() < 2) {
return false;
}
//终止条件
else if (linkList.size() == 2) {
CouponExcludeDetailed couponExcludeDetailed = couponExcludeDetailedMapper.selectExcludeDetailed(linkList.get(0), linkList.get(1));
return couponExcludeDetailed != null;
}
//
else {
boolean existCouponConflict = false;
Integer first = linkList.pollFirst();
for (Integer couponId : linkList) {
CouponExcludeDetailed couponExcludeDetailed = couponExcludeDetailedMapper.selectExcludeDetailed(couponId, first);
if (couponExcludeDetailed != null) {
existCouponConflict = true;
break;
}
}
if (existCouponConflict) {
return true;
}
return this.existCouponConflict(linkList);
}
}
@Override
public void checkCouponConflict(Collection<Integer> couponIdList) throws RRException {
LinkedList<Integer> linkList = new LinkedList<>(couponIdList);
//终止条件
if (linkList.size() == 2) {
Integer couponId = linkList.get(0);
Integer excludeCouponId = linkList.get(1);
CouponExcludeDetailed couponExcludeDetailed = couponExcludeDetailedMapper.selectExcludeDetailed(couponId, excludeCouponId);
if (couponExcludeDetailed != null) {
Coupon coupon = this.getById(couponId);
Coupon excludeCoupon = this.getById(excludeCouponId);
throw new RRException("卡券:{}和卡券{}不同同时使用", coupon.getName(), excludeCoupon.getName());
}
}
//
else {
Integer first = linkList.pollFirst();
for (Integer couponId : linkList) {
CouponExcludeDetailed couponExcludeDetailed = couponExcludeDetailedMapper.selectExcludeDetailed(couponId, first);
if (couponExcludeDetailed != null) {
Coupon coupon = this.getById(couponExcludeDetailed.getCouponId());
Coupon excludeCoupon = this.getById(couponExcludeDetailed.getExcludeCouponId());
throw new RRException("卡券:{}和卡券{}不同同时使用", coupon.getName(), excludeCoupon.getName());
}
}
this.checkCouponConflict(linkList);
}
}
}
package com.gogirl.application.market.coupon.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gogirl.application.market.coupon.ICouponStoreService;
import com.gogirl.domain.market.coupon.CouponStore;
import com.gogirl.infrastructure.mapper.market.coupon.CouponStoreMapper;
import org.springframework.stereotype.Service;
/**
* <p>
* 优惠券限定使用店铺 服务实现类
* </p>
*
* @author robbendev
* @since 2020-06-10
*/
@Service
public class CouponStoreServiceImpl extends ServiceImpl<CouponStoreMapper, CouponStore> implements ICouponStoreService {
}
......@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.gogirl.application.market.coupon.CouponCustomerRelevanceService;
import com.gogirl.application.market.coupon.CouponOrderRelevanceService;
import com.gogirl.application.market.coupon.CouponService;
import com.gogirl.application.market.coupon.MarketService;
import com.gogirl.application.market.timescard.TimesCardCustomerRelevanceService;
import com.gogirl.application.market.timescard.TimesCardUsedRecordService;
......@@ -101,6 +102,9 @@ public class MarketServiceImpl implements MarketService {
@Resource
ICouponOrderService couponOrderService;
@Resource
CouponService couponService;
@Transactional(rollbackFor = Exception.class)
@Override
public void setUpInnerCoupon(SetUpInnerCouponCommand cmd) {
......@@ -136,6 +140,7 @@ public class MarketServiceImpl implements MarketService {
List<CouponCustomerRelevance> couponCustomerRelevanceList = (List<CouponCustomerRelevance>) couponCustomerRelevanceService
.listByIds(cmd.getInnerCouponCustomerRelevanceIds());
if (ListUtil.isNotEmpty(couponCustomerRelevanceList)) {
couponCustomerRelevanceList.forEach(couponCustomerRelevance -> {
Integer usedOrderId = couponCustomerRelevance.getOrderId();
......@@ -158,6 +163,14 @@ public class MarketServiceImpl implements MarketService {
}
});
}
couponService.checkCouponConflict(couponCustomerRelevanceMapper.selectList(new LambdaQueryWrapper<CouponCustomerRelevance>()
.eq(CouponCustomerRelevance::getOrderId, cmd.getOrderId())
.eq(CouponCustomerRelevance::getState, CouponCustomerRelevance.STATE_CHOSE))
.stream()
.map(CouponCustomerRelevance::getCouponId)
.collect(Collectors.toList()));
}
}
......@@ -174,6 +187,7 @@ public class MarketServiceImpl implements MarketService {
.eq(CouponCustomerRelevance::getSourceType, CouponCustomerRelevance.SOURCE_TYPE_OUTER)
);
cmd.getOuterCouponIds().forEach(outerCouponId -> {
Coupon coupon = couponMapper.selectById(outerCouponId);
......@@ -190,6 +204,13 @@ public class MarketServiceImpl implements MarketService {
couponCustomerRelevanceService.save(couponCustomerRelevance);
});
couponService.checkCouponConflict(couponCustomerRelevanceMapper.selectList(new LambdaQueryWrapper<CouponCustomerRelevance>()
.eq(CouponCustomerRelevance::getOrderId, cmd.getOrderId())
.eq(CouponCustomerRelevance::getState, CouponCustomerRelevance.STATE_CHOSE))
.stream()
.map(CouponCustomerRelevance::getCouponId)
.collect(Collectors.toList()));
}
@Override
......
package com.gogirl.domain.market.coupon;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* 券 排斥明细
* </p>
*
* @author robbendev
* @since 2020-06-10
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="CouponExcludeDetailed对象", description="券 排斥明细")
public class CouponExcludeDetailed implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "优惠券id")
private Integer couponId;
@ApiModelProperty(value = "不能跟他一同使用的券的id")
private Integer excludeCouponId;
}
package com.gogirl.domain.market.coupon;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* 优惠券限定使用店铺
* </p>
*
* @author robbendev
* @since 2020-06-10
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="CouponStore对象", description="优惠券限定使用店铺")
public class CouponStore implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "卡券配置id")
private Integer couponId;
@ApiModelProperty(value = "卡券能够使用的店铺id")
private Integer storeId;
}
......@@ -51,6 +51,11 @@ public class RRException extends RuntimeException implements Serializable {
this.message = message;
}
public RRException(String format, Object... args) {
this.code = 500;
this.message = String.format(format, args);
}
public RRException(int code, String message) {
super(message);
......
package com.gogirl.infrastructure.common.util;
import java.util.ArrayList;
import java.util.List;
/**
* <p>
*
* </p>
*
* @author robbendev
* @since 2020/6/10 2:00 下午
*/
public class Combine {
public static void main(String[] args) {
List<Character> data = new ArrayList<Character>();
data.add('a');
data.add('b');
data.add('c');
data.add('d');
Combine t = new Combine();
List<Character> result = new ArrayList<>();
t.combinerSelect(data, result, 2);
}
/**
* 步骤::每次递归时,把原始数据和满足条件的工作空间复制一份,所有的操作均在复制文件中进行,目的就是保证不破坏原始数据,
* 从而可以让一轮递归结束后可以正常进行下一轮。
* 其次,把数据的第一个元素添加到工作空间中,判断工作空间的大小,如果小于k,则需要继续递归,但此时,传入递归函数的
* 参数需要注意:假设当前插入的节点的下标是i,因为是顺序插入的,所以i之前的所有数据都应该舍去,只传入i之后的未使用过的数据。
* 因此在传参之前,应该对copydata作以处理;当大于k的时候,则表明已经找到满足条件的第一种情况,然后只需修改该情况的最后一个结果即可。
* 如:找到abc时,则只需替换c为d即可完成该轮递归。
*
* @param data 原始数据
* @param workSpace 自定义一个临时空间,用来存储每次符合条件的值
* @param k C(n,k)中的k
*/
public <E> void combinerSelect(List<E> data, List<E> workSpace, int k) {
List<E> copyData;
List<E> copyWorkSpace;
if (workSpace.size() == k) {
for (Object c : workSpace)
System.out.print(c);
System.out.println();
}
for (int i = 0; i < data.size(); i++) {
copyData = new ArrayList<>(data);
copyWorkSpace = new ArrayList<>(workSpace);
copyWorkSpace.add(copyData.get(i));
copyData.subList(0, i + 1).clear();
combinerSelect(copyData, copyWorkSpace, k);
}
}
}
package com.gogirl.infrastructure.common.util.thread;
import java.util.ArrayList;
import java.util.List;
/**
* <p>
*
* </p>
*
* @author robbendev
* @since 2020/6/10 2:03 下午
*/
public class Arrange {
public static void main(String[] args) {
Arrange arrange = new Arrange();
List<Character> data = new ArrayList<Character>();
data.add('a');
data.add('b');
data.add('c');
data.add('d');
//输出A(n,n)的全排列
for (int i = 1; i <= data.size(); i++)
arrange.arrangeSelect(data, new ArrayList<Character>(), i);
}
/**
* 计算A(n,k)
*
* @param data
* @param target
* @param k
*/
public <E> void arrangeSelect(List<E> data, List<E> target, int k) {
List<E> copyData;
List<E> copyTarget;
if (target.size() == k) {
for (E i : target)
System.out.print(i);
System.out.println();
}
for (int i = 0; i < data.size(); i++) {
copyData = new ArrayList<E>(data);
copyTarget = new ArrayList<E>(target);
copyTarget.add(copyData.get(i));
copyData.remove(i);
arrangeSelect(copyData, copyTarget, k);
}
}
}
\ No newline at end of file
......@@ -41,4 +41,13 @@ public interface CouponCustomerRelevanceMapper extends BaseMapper<CouponCustomer
List<CouponCustomerRelevance> couponCustomerRelevanceError();
/**
* 获取订单可用的卡券
*
* @param currentCustomerId
* @param departmentId
* @return
*/
List<CouponCustomerRelevance> getOrderCoupon(@Param("currentCustomerId") Integer currentCustomerId, @Param("departmentId") Integer departmentId);
}
package com.gogirl.infrastructure.mapper.market.coupon;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gogirl.domain.market.coupon.CouponExcludeDetailed;
import org.apache.ibatis.annotations.Param;
/**
* <p>
* 券 排斥明细 Mapper 接口
* </p>
*
* @author robbendev
* @since 2020-06-10
*/
public interface CouponExcludeDetailedMapper extends BaseMapper<CouponExcludeDetailed> {
/**
* 查询两个卡券是否存在排斥
*
* @param couponId
* @param excludeCouponId
* @return
*/
CouponExcludeDetailed selectExcludeDetailed(@Param("couponId") Integer couponId, @Param("excludeCouponId") Integer excludeCouponId);
}
......@@ -3,8 +3,11 @@ package com.gogirl.infrastructure.mapper.market.coupon;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gogirl.domain.market.coupon.Coupon;
import java.util.List;
public interface CouponMapper extends BaseMapper<Coupon> {
List<Coupon> getOrderExternalCoupon(Integer departmentId);
}
package com.gogirl.infrastructure.mapper.market.coupon;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gogirl.domain.market.coupon.CouponStore;
/**
* <p>
* 优惠券限定使用店铺 Mapper 接口
* </p>
*
* @author robbendev
* @since 2020-06-10
*/
public interface CouponStoreMapper extends BaseMapper<CouponStore> {
}
package com.gogirl.interfaces.market.coupon;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 券 排斥明细 前端控制器
* </p>
*
* @author robbendev
* @since 2020-06-10
*/
@RestController
@RequestMapping("/coupon-exclude-detailed")
public class CouponExcludeDetailedController {
}
package com.gogirl.interfaces.market.coupon;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 优惠券限定使用店铺 前端控制器
* </p>
*
* @author robbendev
* @since 2020-06-10
*/
@RestController
@RequestMapping("/coupon-store")
public class CouponStoreController {
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gogirl.infrastructure.mapper.market.coupon.CouponExcludeDetailedMapper">
<select id="selectExcludeDetailed" resultType="com.gogirl.domain.market.coupon.CouponExcludeDetailed">
SELECT *
from coupon_exclude_detailed
where (coupon_id = #{couponId}
and exclude_coupon_id = #{excludeCouponId})
or (coupon_id = #{excludeCouponId}
and exclude_coupon_id = #{couponId})
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gogirl.infrastructure.mapper.market.coupon.CouponStoreMapper">
</mapper>
......@@ -31,8 +31,22 @@
where t2.finish_time > '2020-01-01'
and t1.state = 2
</select>
<select id="couponCustomerRelevanceError" resultType="com.gogirl.domain.market.coupon.CouponCustomerRelevance">
select * from coupon_customer_relevance where valid_end_time &lt; valid_start_time and state =3
select *
from coupon_customer_relevance
where valid_end_time &lt; valid_start_time
and state = 3
</select>
<select id="getOrderCoupon" resultType="com.gogirl.domain.market.coupon.CouponCustomerRelevance">
SELECT *
from coupon_customer_relevance t1
LEFT JOIN coupon_store t2 on t1.coupon_id = t2.coupon_id
where t1.source_type = 0
and t1.state = 1
and (t2.store_id = #{departmentId} or t2.store_id = -1 or t2.store_id is null)
and t1.customer_id = #{currentCustomerId}
</select>
<update id="setCouponExpire" parameterType="java.util.Date">
......
......@@ -3,4 +3,12 @@
<mapper namespace="com.gogirl.infrastructure.mapper.market.coupon.CouponMapper">
<select id="getOrderExternalCoupon" resultType="com.gogirl.domain.market.coupon.Coupon">
SELECT *
from coupon t1
LEFT JOIN coupon_store t2 on t1.id = t2.coupon_id
where t1.source_type = 1
and t1.state = 1
and (t2.store_id = #{departmentId} or t2.store_id = -1 or t2.store_id is null)
</select>
</mapper>
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