Commit 7f6638fe by hanghang.wang

Merge branch 'feature/20210527_自定义取餐码_wanghanghang'

# Conflicts:
#	order-application-service/src/main/java/cn/freemud/adapter/OrderAdapter.java
parents e661f0e3 bf0faadb
......@@ -72,6 +72,8 @@ public class ConfirmOrderRequest extends BaseConfig {
*/
private String mealCodeRule;
private String pickUpGoodsNo;
/**
* 团号
*/
......
......@@ -291,6 +291,7 @@ public class OrderCenterSdkServiceImpl implements OrderCenterSdkService {
request.setCompleteOrderCode(confirmOrderRequest.getCompleteOrderCode());
request.setOrderCode(confirmOrderRequest.getOrderId());
request.setMealCodeRule(confirmOrderRequest.getMealCodeRule());
request.setPickUpGoodsNo(confirmOrderRequest.getPickUpGoodsNo());
// 引入门店基础服务 查询自动制作完成配置时间,预约单单独超时任务设置
request.setTimeout(getPaySuccessTimeout(confirmOrderRequest,request));
......
......@@ -54,7 +54,7 @@
<dependency>
<groupId>cn.freemud</groupId>
<artifactId>assortment-ordercenter-sdk</artifactId>
<version>2.1.67-RELEASE</version>
<version>2.3.09-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.freemud.application.service.sdk</groupId>
......@@ -133,7 +133,7 @@
<dependency>
<artifactId>assortment-data-manager</artifactId>
<groupId>com.freemud.sdk.api.assortment</groupId>
<version>5.4.4-SNAPSHOT</version>
<version>5.5.10-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cn.freemud.commons</groupId>
......
......@@ -88,6 +88,15 @@ public class RedisKeyConstant {
*/
public final static String KGD_NO_ORDER_STORE_DATE = "obs:no:order:store:date:";
/**
* 支付成功,取餐码key
*/
public final static String PAY_SUCCESS_TACK_CODE_KEY = "pay_success_tack_code_key:";
public final static String TAKECODEKEY = "takecode:";
/**
* cocoNotMadeGoods:商户号:门店号:yyyy-MM-dd
*
......
......@@ -52,6 +52,13 @@ public class QueryOrdersResponseDto {
@NoArgsConstructor
@Data
public static class OrderBean {
/**
* 下单渠道 1:自营微信小程序 2:i点餐 3:自营支付宝小程序 4:自营H5 5:自营安卓APP 6:自营苹果APP 7:自营PC-WEB
* 8:饿了么 9:饿百 10:京东 11:美团外卖 12:自营APP 13:i应用会员 14:i应用订货 15:POS 16:百度外卖 18:i拼团 19:i围餐
*/
private String orderClient;
private Integer bizType;
private boolean isParent;
......
package cn.freemud.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.function.Function;
@Getter
@AllArgsConstructor
public enum OrderTackCodeFactory {
DEFAULT("99",((Integer code) -> new Integer(code).toString()));
private String orderClient;
private Function<Integer,String> generateTackCodeFunc;
public static OrderTackCodeFactory getByOrderClient(String orderClient){
return Arrays.stream(OrderTackCodeFactory.values())
.filter(e -> e.orderClient.equals(orderClient)).findFirst()
.orElseGet(() -> OrderTackCodeFactory.DEFAULT);
}
}
package cn.freemud.enums;
/**
* @author freemud
* @title: TackCodeRuleEnum
* @projectName micro_openplatform_service
* @description: TODO
* @date 2021/5/26下午9:11
*/
public enum OrderTackCodeRuleEnum {
RANDOM_NUMBER_ONE((byte) 1, "每天第一个随机数,递增1"),
RANDOM_NUMBER((byte)2, "随机数"),
THE_CUSTOM((byte)3, "自定义");
private byte code;
private String message;
OrderTackCodeRuleEnum(byte code, String message) {
this.code = code;
this.message = message;
}
public byte getCode() {
return code;
}
public void setCode(byte code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
......@@ -19,20 +19,24 @@ import java.util.ArrayList;
import java.util.List;
public enum OrderType {
TAKE_OUT(1, "外卖"),
PRE_ORDER(2, "预订单"),
MALL(3, "商城"),
COLLECT_GOODS(4, "打包带走"),
EAT_IN(5, "店内就餐")
TAKE_OUT(1, "外卖","takeOut"),
PRE_ORDER(2, "预订单","preOrder"),
MALL(3, "商城","mall"),
COLLECT_GOODS(4, "打包带走","collectGoods"),
EAT_IN(5, "店内就餐","eatIn")
;
private Integer code;
private String desc;
/**
* 对应取餐码key规则
*/
private String tackDesc;
OrderType(Integer code, String desc) {
OrderType(Integer code, String desc,String tackDesc) {
this.code = code;
this.desc = desc;
this.tackDesc = tackDesc;
}
public static List<Integer> getAllCodes() {
......@@ -86,4 +90,12 @@ public enum OrderType {
public void setDesc(String desc) {
this.desc = desc;
}
public String getTackDesc() {
return tackDesc;
}
public void setTackDesc(String tackDesc) {
this.tackDesc = tackDesc;
}
}
package cn.freemud.manager;
import cn.freemud.constant.RedisKeyConstant;
import cn.freemud.enums.OrderType;
import cn.freemud.enums.OrderTackCodeRuleEnum;
import com.freemud.api.assortment.datamanager.entity.db.AssortmentTackCodeRule;
import com.freemud.api.assortment.datamanager.manager.AssortmentTackCodeRuleManager;
import com.freemud.sdk.api.assortment.order.request.order.ConfirmOrderRequest;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
/**
* @author freemud
* @title: OrderTackCodeManager
* @projectName order-group
* @description: TODO
* @date 2021/5/31上午9:36
*/
@Slf4j
@Component
public class OrderTackCodeManager {
@Autowired
private AssortmentTackCodeRuleManager assortmentTackCodeRuleManager;
@Autowired
protected RedisTemplate redisTemplate;
public final static String numberChar = "0123456789";
public final static String numberCharWithoutZero = "12345";
/**
* 生成取餐码
*
* @param partnerId 商户ID
* @param storeId 门店ID
* @return
*/
public String generateTackCode(Integer orderType, String partnerId, String storeId, ConfirmOrderRequest var1, Function<Integer, String> fun) {
String key = this.getOrderTackCodeKey(partnerId);
String randomKey = getRandomOrderTackCodeKey(partnerId, storeId);
redisTemplate.delete(randomKey);
String rule = (String) redisTemplate.opsForHash().entries(key).get("rule");
log.info("tackCode rule1 : " + rule );
AssortmentTackCodeRule assortmentTackCodeRule = null;
if (Objects.isNull(rule) || rule.isEmpty()) {
assortmentTackCodeRule = assortmentTackCodeRuleManager.queryTackCodeRule(partnerId);
if (Objects.isNull(assortmentTackCodeRule)) {
rule = String.valueOf(OrderTackCodeRuleEnum.RANDOM_NUMBER_ONE.getCode());
} else {
rule = assortmentTackCodeRule.getRule().toString();
}
redisTemplate.opsForHash().put(key, "rule", rule);
redisTemplate.expire(key, 24, TimeUnit.HOURS);
}
if(!Objects.isNull(var1)){var1.setMealCodeRule(rule);}
if (StringUtils.isNotEmpty(rule) && rule.equals(OrderTackCodeRuleEnum.RANDOM_NUMBER.getCode()+"")) {
//6位码
String number = generateNumber(6);
if (!redisTemplate.opsForHash().hasKey(randomKey, storeId + number)) {
redisTemplate.opsForHash().put(randomKey, storeId + number, number);
redisTemplate.expire(randomKey, getSecondsNextEarlyMorning(), TimeUnit.SECONDS);
return number;
}
} else if (StringUtils.isNotEmpty(rule) && rule.equals(OrderTackCodeRuleEnum.THE_CUSTOM.getCode()+"")) {
//规则自定义
Map<Object, Object> tackCodeSettingMap = redisTemplate.opsForHash().entries(randomKey);
// log.info("tackCode rule3 : " + assortmentTackCodeRule );
if (tackCodeSettingMap.isEmpty()) {
if (Objects.isNull(assortmentTackCodeRule)) {
// log.info("tackCode rule4 : " + assortmentTackCodeRule );
assortmentTackCodeRule = assortmentTackCodeRuleManager.queryTackCodeRule(partnerId);
}
// log.info("tackCode rule5 : " + assortmentTackCodeRule );
initTackCodeSettingHash(assortmentTackCodeRule,randomKey,tackCodeSettingMap);
}
//判断订单类型
String head = "",code = "";
OrderType orderTypeEnum = OrderType.getByCode(orderType);
if(!Objects.isNull(orderTypeEnum)){
String tackDesc = orderTypeEnum.getTackDesc();
head = tackCodeSettingMap.get(tackDesc+"Head").toString();
Integer length = (Integer) tackCodeSettingMap.get(tackDesc+"Length");
code = tackCodeSettingMap.get(tackDesc+"Code").toString();
String incrementCode = redisTemplate.opsForHash().increment(randomKey, tackDesc+"Code", 1).toString();
if (incrementCode.length() > length) {
//处理并发情况下,同时含有超过上限的数字。在第一次已经变更为1之后,再次塞1进缓存导致取餐吗重复。暂时无效,后续调整
if(incrementCode.length() < length){
code = redisTemplate.opsForHash().increment(randomKey, tackDesc+"Code", 1).toString();
}else{
redisTemplate.opsForHash().put(randomKey, tackDesc + "Code", 1);
}
}
code = String.format("%0" + length + "d", Integer.parseInt(code));
}
log.info("tackCode rule7 : " + head + code );
return head + code;
} else {
if (!redisTemplate.opsForHash().hasKey(key, storeId)) {
redisTemplate.opsForHash().put(key, storeId, Integer.parseInt(generateNumber(4)));
redisTemplate.expire(key, 24, TimeUnit.HOURS);
}
}
return fun.apply(redisTemplate.opsForHash().increment(key, storeId, 1).intValue());
}
public String getOrderTackCodeKey(String partnerId) {
Date currentDay = new Date();
String todayStr = formatDate(currentDay);
StringBuilder key = new StringBuilder(RedisKeyConstant.PAY_SUCCESS_TACK_CODE_KEY)
.append(partnerId)
.append(":")
.append(todayStr);
return key.toString();
}
/**
* 获取取餐码key
*
* @param partnerId
* @param storeId
* @return
*/
public String getRandomOrderTackCodeKey(String partnerId, String storeId) {
Date currentDay = new Date();
String todayStr = formatDate(currentDay);
StringBuilder key = new StringBuilder(RedisKeyConstant.PAY_SUCCESS_TACK_CODE_KEY)
.append(partnerId)
.append(":")
.append(storeId)
.append(":")
.append(todayStr);
return key.toString();
}
public static Long getSecondsNextEarlyMorning() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_YEAR, 1);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.MILLISECOND, 0);
return (cal.getTimeInMillis() - System.currentTimeMillis()) / 1000;
}
public static SimpleDateFormat defaultDateFormater = new SimpleDateFormat("yyyy-MM-dd");
private String formatDate(Date date) {
return defaultDateFormater.format(date);
}
public String generateNumber(int length) {
StringBuffer sb = new StringBuffer();
Random random = new Random();
for (int i = 0; i < length; i++) {
if (i == 0) {
sb.append(numberCharWithoutZero.charAt(random.nextInt(numberCharWithoutZero.length())));
} else {
sb.append(numberChar.charAt(random.nextInt(numberChar.length())));
}
}
return sb.toString();
}
private void initTackCodeSettingHash(AssortmentTackCodeRule assortmentTackCodeRule,String randomKey, Map<Object, Object> tackCodeSettingMap){
tackCodeSettingMap.put("eatInHead", assortmentTackCodeRule.getEatInHead());
tackCodeSettingMap.put("eatInCode", Integer.valueOf(assortmentTackCodeRule.getEatInCode()));
tackCodeSettingMap.put("eatInLength", assortmentTackCodeRule.getEatInCode().length());
tackCodeSettingMap.put("collectGoodsHead", assortmentTackCodeRule.getCollectGoodsHead());
tackCodeSettingMap.put("collectGoodsCode", Integer.valueOf(assortmentTackCodeRule.getCollectGoodsCode()));
tackCodeSettingMap.put("collectGoodsLength", assortmentTackCodeRule.getCollectGoodsCode().length());
tackCodeSettingMap.put("takeOutHead", assortmentTackCodeRule.getTakeOutHead());
tackCodeSettingMap.put("takeOutCode", Integer.valueOf(assortmentTackCodeRule.getTakeOutCode()));
tackCodeSettingMap.put("takeOutLength", assortmentTackCodeRule.getTakeOutCode().length());
redisTemplate.opsForHash().putAll(randomKey, tackCodeSettingMap);
redisTemplate.expire(randomKey, 24, TimeUnit.HOURS);
}
}
......@@ -64,6 +64,7 @@ import cn.freemud.management.entities.dto.response.activity.GroupWorkRefundRespo
import cn.freemud.management.entities.dto.response.pay.PayBatchRefundResponse;
import cn.freemud.management.service.handle.ActivityHandle;
import cn.freemud.management.thirdparty.MulitiPaymentClient;
import cn.freemud.manager.OrderTackCodeManager;
import cn.freemud.manager.SpellGroupOrderDataManager;
import cn.freemud.redis.RedisCache;
import cn.freemud.service.BuriedPointService;
......@@ -333,6 +334,9 @@ public class OrderServiceImpl implements Orderservice {
@Autowired
private ActivityHandle activityHandle;
@Autowired
private OrderTackCodeManager orderTackCodeManager;
@Override
public BaseResponse checkBeforeCreateOrder(CheckBeforeCreateOrderRequestVo requestVo) {
String trackingNo = LogTreadLocal.getTrackingNo();
......@@ -478,6 +482,8 @@ public class OrderServiceImpl implements Orderservice {
}
}
@Override
public String paySuccessCallback(PaysuccessNoticeMessage message, ConfirmOrderDto confirmOrderDto, Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans) {
OrderBean orderBean = orderBeans.get(OrderBeanType.SAASORDER.getCode());
......@@ -538,6 +544,8 @@ public class OrderServiceImpl implements Orderservice {
if (CollectionUtils.isNotEmpty(notAutomaticTwistPartnerId) && notAutomaticTwistPartnerId.contains(partnerId)) {
var1.setNotAutomaticTwistTime(notAutomaticTwistTime);
}
String pickUpGoodsNo = orderTackCodeManager.generateTackCode(orderBean.getType(),partnerId,storeId,var1,OrderTackCodeFactory.getByOrderClient(orderBean.getOrderClient()).getGenerateTackCodeFunc());
var1.setPickUpGoodsNo(pickUpGoodsNo);
// 订单支付成功
com.freemud.sdk.api.assortment.order.response.order.PayAccessResponse payAccessRes = orderCenterSdkService.payAccess(var1);
String string2 = JSONObject.toJSONString(payAccessRes);
......
package cn.freemud.manager;
import cn.freemud.adapter.OrderAdapter;
import cn.freemud.entities.db.Partner;
import cn.freemud.enums.OrderTackCodeFactory;
import cn.freemud.service.impl.StoreServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.function.Function;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Title: PartnerManagerTest
* @Package cn.freemud.manager
* @Description: 简单描述下这个类是做什么用的
* @author: zhenghuan.yang
* @date: 2018/6/22 16:32
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class TackCodeManagerTest {
@Autowired
private OrderTackCodeManager orderTackCodeManager;
Function<Integer,String> function;
@Test
public void selectTackCode(){
String code = orderTackCodeManager.generateTackCode(5,"1864","1000221",null, OrderTackCodeFactory.getByOrderClient("2").getGenerateTackCodeFunc());
log.debug("code=="+code);
}
}
......@@ -56,6 +56,9 @@ public class PaySuccessReq {
//取餐码生成规则
private String mealCodeRule;
//取餐码
private String pickUpGoodsNo;
//订单拓展表字段-团号
private String spellGroupCode;
}
......@@ -61,7 +61,7 @@
<dependency>
<artifactId>assortment-data-manager</artifactId>
<groupId>com.freemud.sdk.api.assortment</groupId>
<version>5.4.4-SNAPSHOT</version>
<version>5.5.10-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.freemud.application.service.sdk</groupId>
......
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