Authored by mingdan.ge

cps活动处理

... ... @@ -16,7 +16,8 @@ public enum ShareOrdersStatusEnum {
ORDER_CANCEL(2,"91","不可结算取消"),
ORDER_RETURN(2,"92","不可结算退货"),
ORDER_EXCHANGE(2,"93","不可结算换货"),
ORDER_DISCARD(2,"100","因拆单作废");//前台不展示100类
ORDER_DISCARD(2,"100","因拆单作废"),//前台不展示100类
ACTIVITY_DISCARD(2,"200","活动作废");//前台不展示200类
private int level;//低level可以变为高level
private String code;
... ...
... ... @@ -28,6 +28,7 @@ public interface UnionShareOrdersMapper {
List<UnionShareOrders> selectAllListByUids(@Param("beginTime") int beginTime,@Param("endTime") int endTime,@Param("uid") Integer uid,@Param("orderCode") String orderCode);
List<UnionShareOrders> selectListByOrderUidForActivity(@Param("beginTime") int beginTime,@Param("endTime") int endTime,@Param("orderUid") Integer orderUid,@Param("promoteUid") Integer promoteUid);
UnionShareOrders selectActivityOrderByUid(@Param("activityId") int activityId,@Param("orderUid") Integer orderUid,@Param("promoteUid") Integer promoteUid);
int selectCountByCondition(@Param("promoteUid")int promoteUid, @Param("status")String status);
... ...
... ... @@ -326,7 +326,7 @@
<select id="selectListByOrderUidForActivity" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from union_share_orders where status in (10,20,30,40)
from union_share_orders where order_code is not null and status in (10,20,30,40)
and order_uid = #{orderUid} and promote_uid = #{promoteUid}
<if test="beginTime != 0" >
and order_time &gt; #{beginTime}
... ... @@ -335,6 +335,13 @@
and order_time &lt;#{endTime}
</if>
</select>
<select id="selectActivityOrderByUid" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from union_share_orders
where order_uid = #{orderUid} and promote_uid = #{promoteUid} and activity_id = #{activityId}
limit 1
</select>
<select id="selectListBySearchCodition" resultMap="BaseResultMap">
select <include refid="Base_Column_List" /> from union_share_orders where 1=1
<if test="uid!=null">
... ...
... ... @@ -1018,7 +1018,7 @@ public class UnionShareServiceImpl implements IUnionShareService,IBusinessExport
UnionShareOrders unionShareOrders = unionShareOrdersMapper.selectByCode(bo.getOrderCode());
//新增
if (unionShareOrders == null) {
if (null == unionShareOrders) {
insertOrder(bo);
//清缓存
clearShareOrderRedis(bo.getPromoteUid());
... ... @@ -1037,7 +1037,7 @@ public class UnionShareServiceImpl implements IUnionShareService,IBusinessExport
logger.info("saveOrUpdateOrder enter,update nothing,req is {}",bo);
//没有更新到数据,应该有并发更新事件,查询新的再试一下
unionShareOrders = unionShareOrdersMapper.selectByCode(bo.getOrderCode());
if (unionShareOrders == null) {
if (null == unionShareOrders) {
logger.info("saveOrUpdateOrder end,can not find the orderCode,req is {}",bo);
//查不到数据,不该出现的情况,目前没有硬删数据的途径
return;
... ... @@ -1049,82 +1049,183 @@ public class UnionShareServiceImpl implements IUnionShareService,IBusinessExport
}
result=unionShareOrdersMapper.updateStatusById(unionShareOrders.getId(), unionShareOrders.getStatus(), bo.getStatus(), DateUtil.getCurrentTimeSecond());
}
if (result > 0 &&ShareOrdersStatusEnum.isFailOrder(unionShareOrders.getStatus())) {
rehandExtraActivity(unionShareOrders);
if (result > 0 && unionShareOrders.getExtraActivityId() != null) {
if (ShareOrdersStatusEnum.isFailOrder(unionShareOrders.getStatus())) {
//订单不可参与活动,重新处理该单参与的满单返
rehandExtraActivity(unionShareOrders);
}
if (ShareOrdersStatusEnum.CAN_SETTLE.getCode().equals(unionShareOrders.getStatus())
|| ShareOrdersStatusEnum.getLevelByCode(unionShareOrders.getStatus()) > ShareOrdersStatusEnum.CAN_SETTLE.getLevel()) {
//有效订单已完结,判断是否需要把该单的满返活动状态改成可结算
changeExtraActivityStatus(unionShareOrders);
}
}
//清缓存
clearShareOrderRedis(bo.getPromoteUid());
}
//重新处理订单相关的满单返活动
private void rehandExtraActivity(UnionShareOrders unionShareOrders) {
UnionShareOrdersActivityLogs updateLogs = new UnionShareOrdersActivityLogs();
updateLogs.setOrderId(unionShareOrders.getId());
updateLogs.setUpdateTime(DateUtil.getCurrentTimeSecond());
updateLogs.setStatus(0);//类型:1-有效,0-作废
unionShareOrdersActivityLogsMapper.updateStatusByOrderId(updateLogs);
//查询是否参与满单返
List<UnionShareOrdersActivityLogs> activityLogs=unionShareOrdersActivityLogsMapper.selectByOrderCode(unionShareOrders.getOrderCode());
/**
* 获取订单参与的满单返活动返利单
* */
private UnionShareOrders getRelatedActivityOrder(UnionShareOrders unionShareOrders) {
UnionShareOrdersActivity activity = queryActivity(unionShareOrders.getExtraActivityId());
if (null == activity || activity.getType() != 3) {
return null;
}
//
UnionShareOrders activityOrder = queryOrderActivity(unionShareOrders.getOrderUid(), unionShareOrders.getPromoteUid(), unionShareOrders.getActivityId());
if (null == activityOrder) {
return null;
}
return activityOrder;
}
/**
* 获取订单参与的满单返活动日志
* */
private UnionShareOrdersActivityLogs getRelatedActivityLogs(UnionShareOrders unionShareOrders) {
UnionShareOrders activityOrder = getRelatedActivityOrder(unionShareOrders);
if (null == activityOrder) {
return null;
}
List<UnionShareOrdersActivityLogs> activityLogs=unionShareOrdersActivityLogsMapper.selectByOrderId(activityOrder.getId());
if (CollectionUtils.isEmpty(activityLogs)) {
return null;
}
return activityLogs.get(0);
}
/**
* 判断是否需要重新处理订单相关的满单返活动
* */
private void rehandExtraActivity(UnionShareOrders unionShareOrders) {
//判断满返是否作废,若作废,查询是否满足该活动其他门槛条件
UnionShareOrdersActivityLogs activityLog = getRelatedActivityLogs(unionShareOrders);
if (null == activityLog) {
return;
}
for(UnionShareOrdersActivityLogs activityLog:activityLogs){
//活动类型:1-订单返利比例升级,2-订单返利翻x倍,3-额外返
if (activityLog.getActivityType() != 3) {
continue;
}
String[] orders=activityLog.getOrders().split(",");
for (int i = 0; i < orders.length; i++) {
if (orders[i].equals(unionShareOrders.getOrderCode())) {
//判断满返是否作废,若作废,查询是否满足该活动低一阶段条件
// 获取某时间段可参与活动的单数
List<String> orderCodeList = Arrays.stream(orders).collect(Collectors.toList());
List<UnionShareOrders> orderList = unionShareOrdersMapper.selectListByOrderCodesForActivity(orderCodeList);
UnionShareOrdersActivityItem item = unionShareOrdersActivityItemMapper.selectByPrimaryKey(activityLog.getActivityItemId());
if (orderList.size() <item.getOrderMinNum()) {
//作废已参加的满单活动
UnionShareOrdersActivityLogs updatelogs = new UnionShareOrdersActivityLogs();
updatelogs.setId(activityLog.getId());
updatelogs.setStatus(0);//类型:1-有效,0-作废
updateLogs.setUpdateTime(DateUtil.getCurrentTimeSecond());
unionShareOrdersActivityLogsMapper.updateByPrimaryKeySelective(updatelogs);
//重新参加活动
boolean joinResult = joinExtraActivity(activityLog.getOrderUid(), activityLog.getPromoteUid(), activityLog.getActivityId());
if (!joinResult) {
//已不满足此活动条件
// clearOrderRelated(orderCodeList);
}
}
}
List<String> orderCodeList = Arrays.stream(activityLog.getOrders().split(",")).collect(Collectors.toList());
// 获取参与此活动的有效订单
List<UnionShareOrders> orderList = unionShareOrdersMapper.selectListByOrderCodesForActivity(orderCodeList);
UnionShareOrdersActivityItem item = queryActivityItem(activityLog.getActivityItemId());
if (orderList.size() <item.getOrderMinNum()) {
reJoinExtraActivity(activityLog);
}
}
private boolean reJoinExtraActivity(UnionShareOrdersActivityLogs activityLog){
int now = DateUtil.getCurrentTimeSecond();
//作废已参加的满单活动
UnionShareOrdersActivityLogs updatelogs = new UnionShareOrdersActivityLogs();
updatelogs.setId(activityLog.getId());
updatelogs.setStatus(0);//类型:1-有效,0-作废
updatelogs.setUpdateTime(now);
unionShareOrdersActivityLogsMapper.updateByPrimaryKeySelective(updatelogs);
unionShareOrdersMapper.updateStatusById(activityLog.getOrderId(), ShareOrdersStatusEnum.PAY.getCode(), ShareOrdersStatusEnum.ACTIVITY_DISCARD.getCode(), now);
//尝试重新参加活动
boolean joinResult = joinExtraActivity(activityLog.getOrderUid(), activityLog.getPromoteUid(), activityLog.getActivityId());
if (!joinResult) {
//已不满足此活动条件
// clearOrderRelated(orderCodeList);
}
//todo 清缓存
return joinResult;
}
/**
* 尝试更新订单参与的,满返活动单的状态
* */
private boolean changeExtraActivityStatus(UnionShareOrders unionShareOrders) {
UnionShareOrdersActivityLogs activityLog = getRelatedActivityLogs(unionShareOrders);
if (null == activityLog) {
return false;
}
int now = DateUtil.getCurrentTimeSecond();
List<String> orderCodeList = Arrays.stream(activityLog.getOrders().split(",")).collect(Collectors.toList());
// 获取参与此活动的有效订单
List<UnionShareOrders> orderList = unionShareOrdersMapper.selectListByOrderCodesForActivity(orderCodeList);
for(UnionShareOrders order :orderList ) {
if (order.getStatus().equals(ShareOrdersStatusEnum.PAY.getCode())) {
//活动满单返有已支付不可结算的订单,活动返利还不可以结算
return false;
}
//一个订单最多可以参加一个满单返活动
return;
}
UnionShareOrdersActivityItem item = queryActivityItem(activityLog.getActivityItemId());
if (orderList.size() < item.getOrderMinNum()) {
//订单有效数不符合参加的满单活动,warn
return reJoinExtraActivity(activityLog);
}
//更新满返单状态为可结算
unionShareOrdersMapper.updateStatusById(activityLog.getOrderId(), ShareOrdersStatusEnum.PAY.getCode(), ShareOrdersStatusEnum.CAN_SETTLE.getCode(), now);
//清缓存
return true;
}
//查询进行中的活动
private List<UnionShareOrdersActivity> queryActivity() {
//todo 读写缓存
List<UnionShareOrdersActivity> activities=unionShareOrdersActivityMapper.selectByDate(DateUtil.getCurrentTimeSecond());
return activities;
}
//获取某时间段可参与活动的单数
private List<UnionShareOrders> queryUidActivity(int orderUid,int promoteUid,int beginTime,int endTime) {
//todo 读写缓存
List<UnionShareOrders> orders = unionShareOrdersMapper.selectListByOrderUidForActivity(beginTime, endTime, orderUid,promoteUid);
return orders;
}
// 参加满x单返活动
private boolean joinExtraActivity(int orderUid ,int promoteUid ,int activityId){
//获取某时间段可参与活动的单数
private UnionShareOrders queryOrderActivity(int orderUid,int promoteUid,int activityId) {
//todo 读写缓存
UnionShareOrders activityOrder = unionShareOrdersMapper.selectActivityOrderByUid(activityId, orderUid,promoteUid);
return activityOrder;
}
private UnionShareOrdersActivity queryActivity(Integer activityId) {
if (activityId == null || activityId == 0) {
return null;
}
//todo 读写缓存
UnionShareOrdersActivity activity = unionShareOrdersActivityMapper.selectByPrimaryKey(activityId);
if (activity == null || activity.getType() != 3) {
return activity;
}
private UnionShareOrdersActivityItem queryActivityItem(int activityItemId) {
//todo 读写缓存
UnionShareOrdersActivityItem item = unionShareOrdersActivityItemMapper.selectByPrimaryKey(activityItemId);
return item;
}
/**
* 查询满x单返活动条目(正常状态)
* */
private List<UnionShareOrdersActivityItem> queryActivityItemList(int activityId) {
//todo 读写缓存
List<UnionShareOrdersActivityItem> items = unionShareOrdersActivityItemMapper.selectByActivityId(activityId);
return items;
}
public void clearActivityCache(int activityId) {
//todo 清除某活动缓存
}
/**
* 参加满x单额外返活动
* */
//todo 需加定时任务每天10点调用此方法,把前一天结束的活动该预发放的奖励单发下去
public boolean joinExtraActivity(int orderUid ,int promoteUid ,int activityId){
UnionShareOrdersActivity activity = queryActivity(activityId);
if (null == activity || activity.getType() != 3) {
return false;
}
List<UnionShareOrders> orders = queryUidActivity(orderUid,promoteUid, activity.getStartTime(), activity.getEndTime());
if (orders.size() == 0) {
return false;
}
//查询满x单返活动条目
List<UnionShareOrdersActivityItem> items = unionShareOrdersActivityItemMapper.selectByActivityId(activityId);
//查询满x单返活动条目(正常状态)
List<UnionShareOrdersActivityItem> items = queryActivityItemList(activityId);
for (UnionShareOrdersActivityItem item : items) {
if (orders.size() >= item.getOrderMinNum() && orders.size() <= item.getOrderMaxNum()) {
//满足此项标准
... ... @@ -1132,7 +1233,7 @@ public class UnionShareServiceImpl implements IUnionShareService,IBusinessExport
List<Integer> orderIds = new ArrayList<>();
String status=ShareOrdersStatusEnum.CAN_SETTLE.getCode();
for(UnionShareOrders order:orders){
if(ShareOrdersStatusEnum.getLevelByCode(order.getStatus())<2){
if(ShareOrdersStatusEnum.getLevelByCode(order.getStatus())<ShareOrdersStatusEnum.CAN_SETTLE.getLevel()){
status = order.getStatus();
}
ordersStr.append(order.getOrderCode()).append(',');
... ... @@ -1172,15 +1273,12 @@ public class UnionShareServiceImpl implements IUnionShareService,IBusinessExport
return true;
}
}
return false;
}
// 是否可以参与满单返活动
private boolean canJoinExtraActivity(){
return false;
}
//参加加倍返活动
/**
* 参加加倍返活动
* */
private boolean participateActivity(UnionShareOrders order,UnionShareOrdersActivity activity) {
//1、判断是否符合活动条件
//1.1 活动类型:1-订单返利比例升级,2-订单返利翻x倍,3-额外返
... ... @@ -1282,7 +1380,7 @@ public class UnionShareServiceImpl implements IUnionShareService,IBusinessExport
List<UnionShareOrdersActivity> activityList = queryActivity();
for (UnionShareOrdersActivity a :activityList ) {
if(participateActivity(insertReq,a)) {
//参加了活动
//参加了活动,参加一个加返活动就可以了
break;
}
}
... ... @@ -1514,9 +1612,7 @@ public class UnionShareServiceImpl implements IUnionShareService,IBusinessExport
BeanUtils.copyProperties(o,b);
orderList.add(b);
});
}
//查询活动额外返的返利单
List<Integer> ids = unionShareOrdersMapper.selectIdForActivity(settlementCode);
List<UnionShareOrdersActivityBo> activityBos = new ArrayList<>();
... ...
... ... @@ -79,6 +79,7 @@ datasources:
- com.yoho.unions.dal.UnionShareUserApplyMapper
- com.yoho.unions.dal.UnionShareOrdersActivityLogsMapper
- com.yoho.unions.dal.UnionShareOrdersActivityMapper
- com.yoho.unions.dal.UnionShareOrdersActivityItemMapper
- com.yoho.unions.dal.unionShareOrdersMonthMapper
... ...
... ... @@ -71,6 +71,7 @@ datasources:
- com.yoho.unions.dal.UnionShareUserApplyMapper
- com.yoho.unions.dal.UnionShareOrdersActivityLogsMapper
- com.yoho.unions.dal.UnionShareOrdersActivityMapper
- com.yoho.unions.dal.UnionShareOrdersActivityItemMapper
- com.yoho.unions.dal.unionShareOrdersMonthMapper
bigdata_yh_unions:
... ...