Authored by wujiexiang

Merge branch 'master' of http://git.yoho.cn/ufo/yohoufo-fore into dev_bid

Conflicts:
	order/src/main/java/com/yohoufo/order/service/BuyerOrderPaymentService.java
	order/src/main/java/com/yohoufo/order/service/cache/CacheKeyBuilder.java
	order/src/main/java/com/yohoufo/order/service/impl/BuyerOrderDetailService.java
	order/src/main/java/com/yohoufo/order/service/impl/BuyerOrderServiceImpl.java
	order/src/main/java/com/yohoufo/order/service/impl/SellerOrderDetailService.java
	order/src/main/java/com/yohoufo/order/service/impl/ShoppingServiceImpl.java
	order/src/main/java/com/yohoufo/order/service/pay/alipay/AlipayServiceAbstract.java
	order/src/main/java/com/yohoufo/order/service/support/ShoppingSupport.java
Showing 92 changed files with 2482 additions and 651 deletions

Too many changes to show.

To preserve performance only 92 of 92+ files are displayed.

package com.yohoufo.common.config;
import com.yoho.core.config.ConfigReader;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
@Slf4j
@Service
public class UfoOrderPayConfigReader {
@Autowired
private ConfigReader configReader;
/**
* 申请寄存返利的单数
*
* @return
*/
public int depositRebateCnt() {
return configReader.getInt("ufo.order.pay.depositRebateCnt", 4);
}
/**
* 申请寄存返利一单返利数目
*
* @return
*/
public BigDecimal depositRebatePerAmount() {
return new BigDecimal(configReader.getDouble("ufo.order.pay.depositRebatePerAmount", 30));
}
public boolean transferWithWalletSwitch() {
return configReader.getBoolean("ufo.order.pay.transferWithWalletSwitch", true);
}
public boolean transferWithAlipayExceedMillionTransferSwitch() {
return configReader.getBoolean("ufo.order.pay.transferWithAlipayExceedMillionTransferSwitch", false);
}
public boolean isStopTransfer() {
boolean isStop = configReader.getBoolean("ufo.order.pay.isStop.transfer", false);
log.info("zk config [ufo.order.pay.isStop.transfer] value {}", isStop);
return isStop;
}
}
... ...
... ... @@ -11,9 +11,11 @@ import com.yohoufo.common.utils.ServletUtils;
import org.apache.commons.httpclient.HttpStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.UnsatisfiedServletRequestParameterException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
... ... @@ -52,8 +54,10 @@ public class GlobalDefaultExceptionHandler {
}
//如果是请求URL匹配不了,则返回400
if (e instanceof UnsatisfiedServletRequestParameterException) {
log.warn("can not find validate request mapping at {}", request.getRequestURI());
if (e instanceof UnsatisfiedServletRequestParameterException
|| e instanceof MissingServletRequestParameterException
|| e instanceof MethodArgumentTypeMismatchException) {
log.warn("can not find validate request mapping at {}, params is {}", request.getRequestURI(), params);
response.setStatus(HttpStatus.SC_BAD_REQUEST);
return new ModelAndView();
}
... ...
package com.yohoufo.common.exception;
/**
* 参数验签不正确
*
*/
public class BodySignatureErrorException extends GatewayException {
/**
* 异常
*
*/
public BodySignatureErrorException() {
super(509, "数据签名有误");
}
}
... ...
package com.yohoufo.common.helper;
import com.yohoufo.common.config.UfoOrderPayConfigReader;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class NoticeMessageFormatter {
@Autowired
private UfoOrderPayConfigReader ufoOrderPayConfigReader;
public String filterWallet(String message) {
if (!ufoOrderPayConfigReader.transferWithWalletSwitch()) {
message = StringUtils.remove(message, ",请至UFO余额查看[我的-我的钱包-UFO余额]");
message = StringUtils.remove(message, ",请至UFO余额查看");
}
return message;
}
}
... ...
package com.yohoufo.common.interceptor;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.ImmutableList;
import com.yohoufo.common.exception.SignatureNotMatchException;
import com.yohoufo.common.utils.MD5Utils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.*;
/**
* 第三方简单验证签名用
*/
public class BodySignatureCheckInterceptor implements HandlerInterceptor {
private final Logger logger = LoggerFactory.getLogger(SecurityInterceptor.class);
//读取配置文件中的private key 配置
private Map<String, String> privateKeyMap = new HashMap<>();
//是否调试模式
private boolean isDebugEnable = false;
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
if (isDebugEnable && "XYZ".equals(httpServletRequest.getParameter("debug"))) {
logger.debug("body sign isIgnore check debug model");
return true;
}
String privateKey = getPrivateKeyByRootPath(httpServletRequest);
if (StringUtils.isEmpty(privateKey)){
logger.debug("root path not need body sign ");
return true;
}
this.validateSign(getParamsFromRequestBody(httpServletRequest), privateKey);
return true;
}
private String getPrivateKeyByRootPath(HttpServletRequest httpServletRequest){
final String requestUri = httpServletRequest.getRequestURI();
for (String businessType : privateKeyMap.keySet()){
if (requestUri.startsWith("/ufo-gateway"+businessType) || requestUri.startsWith(businessType)){
return privateKeyMap.get(businessType);
}
}
return null;
}
public void setKeyConfigMap(Map<String, Object> keyConfigMap) {
List<Map<String, Object>> keys = (List<Map<String,Object>>)keyConfigMap.get("business_types");
for(Map<String,Object> one: keys)
{
privateKeyMap.put((String)one.get("root_path"), (String)one.get("private_key"));
}
}
private void validateSign(Map<String, Object> bodyParam, String privateKey) throws SignatureNotMatchException {
String signParam = Objects.isNull(bodyParam.get("sign")) ? null : bodyParam.get("sign").toString();
if (StringUtils.isEmpty(signParam)){
logger.warn("body sign empty." );
throw new SignatureNotMatchException();
}
String cacuSign = this.getSign(bodyParam, privateKey);
if(!cacuSign.equalsIgnoreCase(signParam))
{
logger.warn("sign not match. request:{}, caculate:{}", signParam, cacuSign );
throw new SignatureNotMatchException();
}
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
//do nothing
}
private static ObjectMapper objectMapper=new ObjectMapper();
/**
* 获取请求体内容
* @return
* @throws IOException
*/
private Map<String, Object> getParamsFromRequestBody(HttpServletRequest request) throws IOException {
return objectMapper.readValue(request.getInputStream(), Map.class);
}
private String getSign(Map<String, Object> bodyParam, String privateKey)throws SignatureNotMatchException
{
//remove some headers
ImmutableList list = ImmutableList.of("sign","business_type");
SortedMap<String,Object> filtedMap = new TreeMap<>();
for(Map.Entry<String,Object> entry : bodyParam.entrySet())
{
String k = entry.getKey();
if(!list.contains(k)){
filtedMap.put(k,entry.getValue());
}
}
//string: k1=v1&k2=v2
List<String> array = new LinkedList<>();
for(Map.Entry<String,Object> entry : filtedMap.entrySet())
{
if (entry.getValue() instanceof ArrayList){
array.add(StringUtils.trim(entry.getKey() + "=" + JSON.toJSONString(entry.getValue())));
}else {
array.add(StringUtils.trim(entry.getKey() + "=" + entry.getValue()));
}
}
String signStr = String.join("&", array);
String sign = "";
try {
sign = MD5Utils.signMd5(signStr + privateKey, "utf-8");
logger.info("signBeforeStr is {}, sign is {}", signStr, sign);
} catch (Exception e) {
logger.error("body param sign failed: {}", e);
throw new SignatureNotMatchException();
}
//sign md5
return sign;
}
public void setIsDebugEnable(boolean isDebugEnable) {
this.isDebugEnable = isDebugEnable;
}
}
... ...
package com.yohoufo.common.interceptor.body;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class BodyReaderFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// do nothing
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
ServletRequest requestWrapper=null;
if(request instanceof HttpServletRequest) {
requestWrapper=new BodyRequestWrapper((HttpServletRequest)request);
}
if(requestWrapper==null) {
chain.doFilter(request, response);
}else {
chain.doFilter(requestWrapper, response);
}
}
@Override
public void destroy() {
// do nothing
}
}
\ No newline at end of file
... ...
package com.yohoufo.common.interceptor.body;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.springframework.util.StreamUtils;
public class BodyRequestWrapper extends HttpServletRequestWrapper{
private byte[] requestBody = null;//用于将流保存下来
public BodyRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
requestBody = StreamUtils.copyToByteArray(request.getInputStream());
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream bais = new ByteArrayInputStream(requestBody);
return new ServletInputStream() {
@Override
public int read() throws IOException {
return bais.read();
}
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
};
}
@Override
public BufferedReader getReader() throws IOException{
return new BufferedReader(new InputStreamReader(getInputStream()));
}
}
\ No newline at end of file
... ...
... ... @@ -108,6 +108,11 @@ class DefaultRedisLock implements RedisLock {
return true;
}
@Override
public String getLockKey() {
return key;
}
private boolean acquire(String value, long expireTimeMillis) {
String script = "return redis.call('SET', KEYS[1], ARGV[1], 'NX', 'PX', ARGV[2]) ";
RedisScript<String> redisScript = new DefaultRedisScript<>(script, String.class);
... ...
... ... @@ -33,6 +33,8 @@ public interface RedisLock {
*/
boolean unlock();
String getLockKey();
static Builder builder() {
return new Builder();
}
... ...
package com.yohoufo.common.utils;
import lombok.extern.slf4j.Slf4j;
import java.util.function.Supplier;
@Slf4j
public class Functions {
public static <T> T doIgnoreException(Supplier<T> supplier) {
try {
return supplier.get();
} catch (Exception e) {
log.info("exec fail", e);
return null;
}
}
}
... ...
... ... @@ -3,10 +3,10 @@
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- secutity configs -->
<bean id="securityConfigMap" class="org.springframework.beans.factory.config.YamlMapFactoryBean">
<bean id="privateKeyMap" class="org.springframework.beans.factory.config.YamlMapFactoryBean">
<property name="resources">
<list>
<value>classpath:security-key.yml</value>
<value>classpath:body-sign-key.yml</value>
</list>
</property>
</bean>
... ... @@ -35,6 +35,14 @@
</property>
<property name="checkSessionMethods" ref="validateMethodMap" />
</bean>
<bean id="bodyParamCheckInterceptor" class="com.yohoufo.common.interceptor.BodySignatureCheckInterceptor">
<property name="isDebugEnable" value="${is_debug_enable:false}" />
<property name="keyConfigMap" ref="privateKeyMap" />
</bean>
<bean id="signatureVerifyInterceptor" class="com.yohoufo.common.interceptor.SignatureVerifyInterceptor">
<property name="isDebugEnable" value="${is_debug_enable:false}" />
<property name="checkMethods" ref="validateMethodMap"/>
... ...
business_types:
- root_path: /erp/fastDelivery
private_key: abe88b1944904917bab581539fe3e12f
\ No newline at end of file
... ...
... ... @@ -4,6 +4,9 @@ package com.yohoufo.dal.order;
import com.yohoufo.dal.order.model.OrdersPayTransfer;
import org.apache.ibatis.annotations.Param;
import java.util.Collection;
import java.util.List;
public interface OrdersPayTransferMapper {
int insert(OrdersPayTransfer record);
... ... @@ -19,4 +22,6 @@ public interface OrdersPayTransferMapper {
int updateByPrimaryKey(OrdersPayTransfer record);
OrdersPayTransfer selectByBuyerOrderCode(long buyerOrderCode);
List<OrdersPayTransfer> selectByBuyerOrderCodeList(@Param("orderCodes") Collection<Long> buyerOrderCode);
}
\ No newline at end of file
... ...
package com.yohoufo.dal.order;
import com.yohobuy.ufo.model.order.resp.FastDeliveryGetShelfDetailResp;
import com.yohoufo.dal.order.model.SellerOrderGoods;
import com.yohoufo.dal.order.model.SellerOrderInfo;
import org.apache.ibatis.annotations.Param;
... ... @@ -47,6 +48,10 @@ public interface SellerOrderGoodsMapper {
int selectCntByUidStatusList(@Param("uid")int uid, @Param("statusList") List<Integer> statusList);
FastDeliveryGetShelfDetailResp selectMultiInfoBySkup(@Param("uid")int uid,
@Param("skup") Integer skup);
List<SellerOrderGoods> selectByUidStatusList(@Param("uid")int uid,
@Param("statusList") List<Integer> statusList,
@Param("offset")Integer offset,
... ...
... ... @@ -34,6 +34,8 @@ public interface SellerOrderMapper {
List<SellerOrder> selectBySkups(@Param("skupList") Collection<Integer> skups);
List<SellerOrder> selectByOrderCodes(@Param("orderCodes")Collection<Long> orderCodes);
/**
* 根据用户id查询卖的单数
* @param uid
... ...
package com.yohoufo.dal.order;
import com.yohoufo.dal.order.model.StorageDeposit;
import com.yohoufo.dal.order.model.StorageDepositCount;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import com.yohoufo.dal.order.model.StorageDeposit;
import com.yohoufo.dal.order.model.StorageDepositCount;
public interface StorageDepositMapper {
... ... @@ -27,12 +28,14 @@ public interface StorageDepositMapper {
List<StorageDeposit> queryUserProductDopositing(@Param("uid") Integer uid, @Param("productId") Integer productId, @Param("start") Integer start, @Param("count") Integer count);
StorageDeposit queryByDepositCode(@Param("uid") Integer uid, @Param("depositCode")String depositCode);
StorageDeposit queryByOwnerSkup(@Param("uid") Integer uid, @Param("skup") Integer newSkup);
StorageDeposit queryByOwnerSkup(@Param("uid") Integer uid, @Param("skup") Integer newSkup);
StorageDeposit queryByOwnerDepositCode(@Param("uid") Integer uid, @Param("depositCode")String depositCode);
int changeSaleStatusOn(@Param("uid") Integer uid, @Param("depositCode") String depositCode, @Param("newSkup") Integer newSkup);
int changeSaleStatusOff(@Param("uid") Integer uid, @Param("newSkup") Integer newSkup);
int sale(@Param("uid") Integer uid, @Param("skup") Integer skup, @Param("orderCode") long orderCode);
int saleSkup(@Param("uid") Integer uid, @Param("skup") Integer skup, @Param("orderCode") long orderCode,@Param("id") Integer id);
int getDepositOffShelvesCount(@Param("uid") Integer uid, @Param("storageId") Integer storageId);
/**
... ... @@ -89,4 +92,21 @@ public interface StorageDepositMapper {
);
int removeStorageLockFlag(int id);
int selectUserValidDepositCnt(@Param("uid")Integer uid, @Param("storageId")Integer storageId);
List<StorageDeposit> selectUserValidDepositList(@Param("uid") Integer uid, @Param("storageId") Integer storageId,
@Param("start") Integer start, @Param("count") Integer count);
int updateNewOrderCode(@Param("newOrderCode")String newOrderCode, @Param("uid")int uid,
@Param("depositCode")String depositCode, @Param("status")Integer status);
StorageDeposit selectByNewOrderCode(@Param("uid")Integer uid, @Param("depositCode")String depositCode, @Param("newOrderCode") Long newOrderCode);
int updateValidStatus(@Param("id")Integer id, @Param("status") Integer status, @Param("preStatus")Integer preStatus);
int updateSellLock(@Param("id")Integer id, @Param("sellLock")Integer sellLock, @Param("preSellLock")Integer preSellLock);
int updateToNotBindShelfCode(@Param("id")Integer id, @Param("status") Integer status, @Param("preStatus")Integer preStatus);
}
\ No newline at end of file
... ...
package com.yohoufo.dal.order;
import java.util.Collection;
import java.util.List;
import java.util.Map;
... ... @@ -33,6 +34,8 @@ public interface TradeBillsMapper {
List<TradeBills> selectByKeyProps(TradeBills condition);
List<TradeBills> selectByOrderCodeList(@Param("orderCodes") Collection<Long> orderCodeList);
int updateLockOfUidTradeStatusAndDealTime(@Param("uid") Integer uid, @Param("tradeStatus") Integer tradeStatus, @Param("dealTime") Integer dealTime,
@Param("tagTradeStatus") Integer tagTradeStatus, @Param("tagDealTime") Integer tagDealTime);
... ...
... ... @@ -32,8 +32,4 @@ public class CmsPay {
private String recommendText1;
private String orderAttribute;
private String orderType;
}
\ No newline at end of file
... ...
... ... @@ -8,6 +8,8 @@ public class OrdersPayTransfer {
public static final Integer INTERFACE_TYPE_TRANSFER_WHEN_EXCEED_MILLION = 2;
public static final Integer INTERFACE_TYPE_TRANSFER_WALLET = 3;
private Integer id;
private Long buyerOrderCode;
... ...
... ... @@ -49,6 +49,8 @@ public class StorageDeposit {
private Integer depositType;
private Long parentOrderCode;
private Integer sellLock;
public Long getParentOrderCode() {
return parentOrderCode;
... ... @@ -233,4 +235,13 @@ public class StorageDeposit {
public void setNewSkup(Integer newSkup) {
this.newSkup = newSkup;
}
public Integer getSellLock() {
return sellLock;
}
public void setSellLock(Integer sellLock) {
this.sellLock = sellLock;
}
}
\ No newline at end of file
... ...
... ... @@ -12,4 +12,6 @@ public interface BrandMapper {
List<Brand> selectAll();
int updateByPrimaryKey(Brand record);
List<Integer> selectExcludeAppraise();
}
\ No newline at end of file
... ...
... ... @@ -8,10 +8,12 @@ import java.util.List;
public interface IdentifyRecordsMapper {
IdentifyRecord selectByTagAndNfcId(@Param("tagId") String tagId, @Param("nfcUid") String nfcUid);
int updateOwner(@Param("tagId") String tagId, @Param("nfcUid") String nfcUid, @Param("owner") Integer owner, @Param("newOrderCode")Long newOrderCode);
int updateAllowPop(@Param("tagId") String tagId, @Param("nfcUid") String nfcUid, @Param("allowPop") Integer allowPop);
IdentifyRecord selectByOrderCode(@Param("orderCode") Long orderCode);
IdentifyRecord selectByTagId(@Param("tagId") String tagId);
}
\ No newline at end of file
... ...
... ... @@ -21,4 +21,7 @@ public interface ProductMapper {
List<Product> selectByProductCode(@Param("productCode") String productCode);
String selectIntroByProductId(Integer id);
List<Product> selectByCodes(List<String> codes);
}
\ No newline at end of file
... ...
... ... @@ -16,7 +16,9 @@ public interface SizeMapper {
int updateByPrimaryKey(Size record);
List<Size> selectByIds(List<Integer> ids);
List<Size> selectByNames(List<String> names);
/**
* 根据品类查询所有的尺码
* @param sortId
... ...
... ... @@ -28,4 +28,6 @@ public interface StorageMapper {
List<Storage> selectByIds(@Param("idList") Collection<Integer> idList);
List<Storage> selectByProductId(@Param("productId") Integer productId);
List<Storage> selectByProductIds(@Param("productIds") List<Integer> productIds);
}
\ No newline at end of file
... ...
... ... @@ -18,7 +18,7 @@ public class ProductProfit {
private Byte delStatus;
private BigDecimal profitMinPrice; // 费率价格下限
private BigDecimal profitMinPrice;
private BigDecimal profitMaxPrice; // 费率价格上限
private BigDecimal profitMaxPrice;
}
\ No newline at end of file
... ...
package com.yohoufo.dal.user;
import com.yohoufo.dal.user.model.UsersNotice;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface UsersNoticeMapper {
int deleteByPrimaryKey(Integer id);
int insert(UsersNotice record);
int insertSelective(UsersNotice record);
UsersNotice selectByPrimaryKey(Integer id);
List<UsersNotice> selectRollList(@Param("showFront") int showFront);
List<UsersNotice> selectPageList(@Param("page") int page,@Param("size") int size);
int selectCount(@Param("showFront") Integer showFront);
int updateByPrimaryKeySelective(UsersNotice record);
int updateByPrimaryKey(UsersNotice record);
}
\ No newline at end of file
... ...
package com.yohoufo.dal.user.model;
public class UsersNotice {
private Integer id;
private String name;
private String url;
private Integer orderBy;
private Integer createTime;
private Integer updateTime;
private Integer showFront;
private Integer delFlag;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name == null ? null : name.trim();
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url == null ? null : url.trim();
}
public Integer getOrderBy() {
return orderBy;
}
public void setOrderBy(Integer orderBy) {
this.orderBy = orderBy;
}
public Integer getCreateTime() {
return createTime;
}
public void setCreateTime(Integer createTime) {
this.createTime = createTime;
}
public Integer getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Integer updateTime) {
this.updateTime = updateTime;
}
public Integer getShowFront() {
return showFront;
}
public void setShowFront(Integer showFront) {
this.showFront = showFront;
}
public Integer getDelFlag() {
return delFlag;
}
public void setDelFlag(Integer delFlag) {
this.delFlag = delFlag;
}
}
\ No newline at end of file
... ...
... ... @@ -36,6 +36,7 @@
<foreach collection="skups" item="skup" separator="," open="(" close=")">
#{skup,jdbcType=INTEGER}
</foreach>
order by id
</select>
<select id="selectByOrderCodeList" resultMap="BaseResultMap">
... ...
... ... @@ -16,12 +16,10 @@
<result column="is_recommend" property="isRecommend" jdbcType="VARCHAR" />
<result column="recommend_text1" property="recommendText1" jdbcType="VARCHAR" />
<result column="recommend_text1_logo" property="recommendText1Logo" jdbcType="VARCHAR" />
<result column="order_attribute" property="orderAttribute" jdbcType="VARCHAR" />
<result column="order_type" property="orderType" jdbcType="VARCHAR" />
</resultMap>
<sql id="Base_Column_List" >
id, pay_name, sort_number, status, create_time, update_time, payment_id, display_first_sight,
no_open_text, start_version, end_version, is_recommend, recommend_text1,recommend_text1_logo, order_attribute, order_type
no_open_text, start_version, end_version, is_recommend, recommend_text1,recommend_text1_logo
</sql>
<select id="selectByStatusOrderBySortNumberDesc" resultMap="BaseResultMap">
... ...
... ... @@ -40,6 +40,16 @@
where buyer_order_code = #{buyerOrderCode,jdbcType=INTEGER}
</select>
<select id="selectByBuyerOrderCodeList" resultMap="BaseResultMap" parameterType="java.lang.Long" >
select
<include refid="Base_Column_List" />
from orders_pay_transfer
where buyer_order_code IN
<foreach collection="orderCodes" item="orderCode" open="(" separator="," close=")">
#{orderCode,jdbcType=BIGINT}
</foreach>
</select>
<select id="selectByUidAndTransferType" resultType="java.lang.Integer" parameterType="java.lang.Integer" >
select
count(1)
... ...
... ... @@ -152,6 +152,21 @@
select count(*) from seller_order_goods where uid = #{uid,jdbcType=INTEGER}
</select>
<select id="selectMultiInfoBySkup" resultType="com.yohobuy.ufo.model.order.resp.FastDeliveryGetShelfDetailResp">
select
sog.uid,
sog.id skup, so.order_code orderCode, sog.storage_id storageId, sog.product_name productName,
sog.size_name sizeName,
sog.product_id productId, sog.status, sog.goods_price price
from seller_order_goods sog, seller_order so
where sog.id=so.skup
and so.uid= #{uid,jdbcType=INTEGER}
and sog.id=#{skup,jdbcType=INTEGER}
limit 1
</select>
<select id="selectByUidStatusList" resultMap="BaseResultMap">
select <include refid="Base_Column_List" /> from seller_order_goods
where <include refid="sql_where_4_select_UidStatusList"/>
... ...
... ... @@ -65,6 +65,18 @@
order by create_time desc
</select>
<select id="selectByOrderCodes" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from seller_order
where order_code IN
<foreach collection="orderCodes" item="orderCode" open="(" separator="," close=")">
#{orderCode,jdbcType=BIGINT}
</foreach>
</select>
<insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.yohoufo.dal.order.model.SellerOrder" useGeneratedKeys="true">
insert into seller_order (order_code, skup, uid,
... ...
... ... @@ -25,6 +25,7 @@
<result column="deposit_type" property="depositType" jdbcType="INTEGER" />
<result column="source" property="source" jdbcType="INTEGER" />
<result column="parent_order_code" property="parentOrderCode" jdbcType="BIGINT" />
<result column="sell_lock" property="sellLock" jdbcType="INTEGER" />
</resultMap>
<resultMap id="CountResultMap" type="com.yohoufo.dal.order.model.StorageDepositCount" >
... ... @@ -38,7 +39,7 @@
<sql id="Base_Column_List" >
id, product_id, goods_id, storage_id, deposit_code, shelf_code, owner_uid, order_code,
skup, status, order_status, update_time, create_time, deposit_start_time, deposit_end_time,
edit_pid, del_status, out_type, new_order_code, new_skup, parent_order_code, source, deposit_type, parent_order_code
edit_pid, del_status, out_type, new_order_code, new_skup, parent_order_code, source, deposit_type, parent_order_code, sell_lock
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
select
... ... @@ -84,11 +85,11 @@
</update>
<select id="queryUserDepositProductCount" resultType="java.lang.Integer" parameterType="java.lang.Integer" >
select count(distinct product_id) from storage_deposit
where owner_uid = #{uid} and status=1 and del_status=0
where owner_uid = #{uid} and status=1 and del_status=0 and out_type!=3
</select>
<select id="queryUserDepositProductId" resultType="java.lang.Integer">
select distinct product_id from storage_deposit
where owner_uid = #{uid} and status=1 and del_status=0 limit #{start}, #{count}
where owner_uid = #{uid} and status=1 and del_status=0 and out_type!=3 limit #{start}, #{count}
</select>
<select id="queryUserDepositProduct" resultMap="CountResultMap">
... ... @@ -97,7 +98,7 @@
count(*) as storage_count,
sum( if( order_status = 0, 1, 0)) as un_shelf_storage_count,
max(skup) as skup from storage_deposit
where owner_uid = #{uid} and status=1 and del_status=0
where owner_uid = #{uid} and status=1 and del_status=0 and out_type !=3
and product_id in
<foreach item="item" index="index" collection="productIdList" open="(" separator="," close=")">
#{item}
... ... @@ -107,55 +108,69 @@
<select id="queryUserDopositBackCount" resultType="java.lang.Integer" parameterType="java.lang.Integer" >
select count(*) from storage_deposit
where owner_uid = #{uid} and status in(2,3,4,5) and out_type in(1, 10) and del_status=0
where owner_uid = #{uid} and status in(2,3,4,5) and out_type in(1, 10) and del_status=0 and out_type!=3
</select>
<select id="queryUserDopositBack" resultMap="BaseResultMap">
select * from storage_deposit
where owner_uid = #{uid} and status in(2,3,4,5) and out_type in(1, 10) and del_status=0 ORDER BY id DESC
where owner_uid = #{uid} and status in(2,3,4,5) and out_type in(1, 10) and del_status=0 and out_type!=3 ORDER BY id DESC
limit #{start}, #{count}
</select>
<select id="queryUserProductDopositingCount" resultType="java.lang.Integer">
select count(*) from storage_deposit
where owner_uid = #{uid} and status in(1) and product_id =#{productId} and del_status=0
where owner_uid = #{uid} and status in(1) and product_id =#{productId} and del_status=0 and out_type!=3
</select>
<select id="queryUserProductDopositing" resultMap="BaseResultMap">
select * from storage_deposit
where owner_uid = #{uid} and status in(1) and product_id =#{productId} and del_status=0
where owner_uid = #{uid} and status in(1) and product_id =#{productId} and del_status=0 and out_type!=3
limit #{start}, #{count}
</select>
<select id="queryByOwnerSkup" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
select
<include refid="Base_Column_List" />
from storage_deposit
where owner_uid = #{uid} and new_skup =#{skup} and del_status=0
where owner_uid = #{uid} and new_skup =#{skup} and del_status=0 and out_type!=3
</select>
<select id="queryByOwnerDepositCode" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from storage_deposit
where owner_uid = #{uid} and deposit_code =#{depositCode} and del_status=0 and out_type!=3
</select>
<update id="sale">
update storage_deposit set del_status=1,
order_status=0,
new_order_code =#{orderCode},
update_time = unix_timestamp(now())
where owner_uid = #{uid} and new_skup =#{skup} and del_status=0
where owner_uid = #{uid} and new_skup =#{skup} and del_status=0 and out_type!=3
</update>
<update id="saleSkup">
update storage_deposit set del_status=1,
order_status=0,
new_order_code =#{orderCode},
new_skup =#{skup},
update_time = unix_timestamp(now())
where id = #{id}
</update>
<select id="getDepositOffShelvesCount" resultType="java.lang.Integer">
select count(*) from storage_deposit
where owner_uid = #{uid} and status=1 and order_status=0 and del_status=0 and storage_id = #{storageId}
where owner_uid = #{uid} and status=1 and order_status=0 and del_status=0 and out_type!=3 and storage_id = #{storageId}
</select>
<select id="getUserDepositCount" resultType="java.lang.Integer">
select count(*) from storage_deposit
where owner_uid = #{uid} and status=1 and del_status=0
where owner_uid = #{uid} and status=1 and del_status=0 and out_type!=3
</select>
<select id="getDepositOffs" resultMap="BaseResultMap">
select * from storage_deposit
where owner_uid = #{uid} and storage_id = #{storageId}
and status=1 and order_status=0 and del_status=0 limit 0, #{count}
and status=1 and order_status=0 and del_status=0 and out_type!=3 and deposit_end_time &gt; unix_timestamp(now()) limit 0, #{count}
</select>
<select id="selectByDepositCode" resultMap="BaseResultMap">
select <include refid="Base_Column_List" /> from storage_deposit
where owner_uid = #{uid} and del_status= 0 AND deposit_code = #{depositCode,jdbcType=VARCHAR}
where owner_uid = #{uid} and del_status= 0 AND deposit_code = #{depositCode,jdbcType=VARCHAR} and sell_lock=0
AND status in
<foreach collection="statusList" close=")" item="status" open="(" separator=",">
#{status}
... ... @@ -193,13 +208,13 @@
<update id="updateDepositEndTime">
update storage_deposit
set deposit_end_time = #{depositEndTime,jdbcType=INTEGER} ,update_time = #{updateTime,jdbcType=INTEGER}
set deposit_end_time = #{depositEndTime,jdbcType=INTEGER} ,update_time = #{updateTime,jdbcType=INTEGER}, remind_status = 0
where id = #{depositId,jdbcType=INTEGER} AND del_status = 0 AND owner_uid = #{uid,jdbcType=INTEGER}
</update>
<select id="selectUserSortDopositingCount" resultType="java.lang.Integer">
select count(1) from storage_deposit
where owner_uid = #{uid} and status in(1) and product_id =#{productId} and del_status = 0
where owner_uid = #{uid} and status in(1) and product_id =#{productId} and del_status = 0 and out_type!=3
<if test="sort == 0" >
AND deposit_end_time &gt; unix_timestamp(now())
</if>
... ... @@ -210,7 +225,7 @@
<select id="selectUserSortDoposit" resultMap="BaseResultMap">
select <include refid="Base_Column_List" /> from storage_deposit
where owner_uid = #{uid} and status in(1) and product_id =#{productId} and del_status=0
where owner_uid = #{uid} and status in(1) and product_id =#{productId} and del_status=0 and out_type!=3
<if test="sort == 0" >
AND deposit_end_time &gt; unix_timestamp(now())
</if>
... ... @@ -219,6 +234,19 @@
</if>
limit #{start}, #{count}
</select>
<select id="selectUserValidDepositCnt" resultType="java.lang.Integer">
select count(1) from storage_deposit
where owner_uid = #{uid} and storage_id =#{storageId} and status=1 and del_status=0 and deposit_type=0 and sell_lock=0
and deposit_end_time &gt; unix_timestamp(now())
</select>
<select id="selectUserValidDepositList" resultMap="BaseResultMap">
select <include refid="Base_Column_List" /> from storage_deposit
where owner_uid = #{uid} and storage_id =#{storageId} and status=1 and del_status=0 and deposit_type=0 and sell_lock=0
and deposit_end_time &gt; unix_timestamp()
limit #{start}, #{count}
</select>
<update id="updateDelStatusByCode">
update storage_deposit
... ... @@ -244,4 +272,39 @@
where id = #{id,jdbcType=INTEGER}
AND lock_flag = 1
</update>
<update id="updateNewOrderCode">
update storage_deposit
set new_order_code=#{newOrderCode}, del_status=1, update_time = unix_timestamp(now()) , order_status = 0
where deposit_code = #{depositCode,jdbcType=VARCHAR}
AND del_status = 0 AND owner_uid = #{uid,jdbcType=INTEGER}
AND status = #{status,jdbcType=INTEGER}
</update>
<select id="selectByNewOrderCode" resultMap="BaseResultMap">
select <include refid="Base_Column_List" /> from storage_deposit
where deposit_code =#{depositCode} and del_status=1 and new_order_code=#{newOrderCode} and owner_uid=#{uid}
limit 1
</select>
<update id="updateValidStatus">
update storage_deposit
set del_status=0, update_time = unix_timestamp(now()), new_order_code = 0, status=#{status}
where id=#{id} and del_status=1 and status=#{preStatus}
</update>
<update id="updateSellLock">
update storage_deposit
set sell_lock = #{sellLock,jdbcType=INTEGER} ,update_time = unix_timestamp(now())
where id = #{id,jdbcType=INTEGER}
AND sell_lock = #{preSellLock,jdbcType=INTEGER}
AND del_status = 0
</update>
<update id="updateToNotBindShelfCode">
update storage_deposit
set shelf_code='', del_status=0, update_time = unix_timestamp(now()), new_order_code = 0, status=#{status}
where id=#{id} and del_status=1 and status=#{preStatus}
</update>
</mapper>
\ No newline at end of file
... ...
... ... @@ -204,6 +204,19 @@
</if>
</select>
<select id="selectByOrderCodeList" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from trade_bills
where 1=1 and order_code in
<foreach collection="orderCodes" item="orderCode" open="(" separator="," close=")">
#{orderCode,jdbcType=BIGINT}
</foreach>
</select>
<update id="updateLockOfUidTradeStatusAndDealTime" >
update trade_bills
set trade_status = #{tagTradeStatus,jdbcType=INTEGER},deal_time = #{tagDealTime,jdbcType=INTEGER}
... ...
... ... @@ -48,4 +48,8 @@
edit_time, edit_pid, order_by
from brand
</select>
<select id="selectExcludeAppraise" resultType="java.lang.Integer">
select id
from brand where ex_raise = 1
</select>
</mapper>
\ No newline at end of file
... ...
... ... @@ -47,4 +47,10 @@
select <include refid="Base_Column_List" />
from identify_records where order_code = #{orderCode} or last_order_code = #{orderCode} limit 1
</select>
<select id="selectByTagId" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from identify_records where tag_id = #{tagId} limit 1
</select>
</mapper>
\ No newline at end of file
... ...
... ... @@ -95,4 +95,11 @@
from product_intro
where product_id = #{productId} limit 1
</select>
<select id="selectByCodes" resultMap="BaseResultMap">
select id, product_name, product_code, series_id from product where product_code in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
</mapper>
\ No newline at end of file
... ...
... ... @@ -45,6 +45,14 @@
</foreach>
order by order_by
</select>
<select id="selectByNames" resultMap="BaseResultMap">
select id, size_name, order_by
from `size` where size_name in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
<select id="selectAllSizeBySortIdList" resultMap="BaseResultMap">
select s.id, s.size_name,ss.order_by
... ...
... ... @@ -89,6 +89,17 @@
</foreach>
</select>
<select id="selectByProductIds" resultMap="BaseResultMap">
select id, product_id, goods_id, size_id, storage_num, update_time, create_time, suggest_low_price, suggest_high_price
from storage
where product_id in
<foreach item="id" collection="productIds" open="(" separator="," close=")">
#{id}
</foreach>
</select>
<select id="selectByProductId" resultMap="BaseResultMap">
select id, product_id, goods_id, size_id, storage_num, suggest_low_price, suggest_high_price
from storage where product_id=#{productId,jdbcType=INTEGER} AND status = 1
... ...
<?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.yohoufo.dal.user.UsersNoticeMapper" >
<resultMap id="BaseResultMap" type="com.yohoufo.dal.user.model.UsersNotice" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="url" property="url" jdbcType="VARCHAR" />
<result column="order_by" property="orderBy" jdbcType="INTEGER" />
<result column="create_time" property="createTime" jdbcType="INTEGER" />
<result column="update_time" property="updateTime" jdbcType="INTEGER" />
<result column="show_front" property="showFront" jdbcType="INTEGER" />
<result column="del_flag" property="delFlag" jdbcType="INTEGER" />
</resultMap>
<sql id="Base_Column_List" >
id, name, url, order_by, create_time, update_time, show_front, del_flag
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
select
<include refid="Base_Column_List" />
from users_notice
where id = #{id,jdbcType=INTEGER}
</select>
<select id="selectRollList" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
select
<include refid="Base_Column_List" />
from users_notice
where show_front = #{showFront,jdbcType=INTEGER} and del_flag=0
order by order_by desc
</select>
<select id="selectCount" resultType="java.lang.Integer" parameterType="java.lang.Integer" >
select count(1)
from users_notice
where del_flag=0
<if test="showFront!=null" >
and show_front = #{showFront,jdbcType=INTEGER}
</if>
</select>
<select id="selectPageList" resultMap="BaseResultMap" >
select
<include refid="Base_Column_List" />
from users_notice
where del_flag=0
order by order_by desc
limit #{page,jdbcType=INTEGER},#{size,jdbcType=INTEGER}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
delete from users_notice
where id = #{id,jdbcType=INTEGER}
</delete>
<insert id="insert" parameterType="com.yohoufo.dal.user.model.UsersNotice" >
insert into users_notice (id, name, url,
order_by, create_time, update_time,
show_front, del_flag)
values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{url,jdbcType=VARCHAR},
#{orderBy,jdbcType=INTEGER}, #{createTime,jdbcType=INTEGER}, #{updateTime,jdbcType=INTEGER},
#{showFront,jdbcType=INTEGER}, #{delFlag,jdbcType=INTEGER})
</insert>
<insert id="insertSelective" parameterType="com.yohoufo.dal.user.model.UsersNotice" >
insert into users_notice
<trim prefix="(" suffix=")" suffixOverrides="," >
<if test="id != null" >
id,
</if>
<if test="name != null" >
name,
</if>
<if test="url != null" >
url,
</if>
<if test="orderBy != null" >
order_by,
</if>
<if test="createTime != null" >
create_time,
</if>
<if test="updateTime != null" >
update_time,
</if>
<if test="showFront != null" >
show_front,
</if>
<if test="delFlag != null" >
del_flag,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides="," >
<if test="id != null" >
#{id,jdbcType=INTEGER},
</if>
<if test="name != null" >
#{name,jdbcType=VARCHAR},
</if>
<if test="url != null" >
#{url,jdbcType=VARCHAR},
</if>
<if test="orderBy != null" >
#{orderBy,jdbcType=INTEGER},
</if>
<if test="createTime != null" >
#{createTime,jdbcType=INTEGER},
</if>
<if test="updateTime != null" >
#{updateTime,jdbcType=INTEGER},
</if>
<if test="showFront != null" >
#{showFront,jdbcType=INTEGER},
</if>
<if test="delFlag != null" >
#{delFlag,jdbcType=INTEGER},
</if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.yohoufo.dal.user.model.UsersNotice" >
update users_notice
<set >
<if test="name != null" >
name = #{name,jdbcType=VARCHAR},
</if>
<if test="url != null" >
url = #{url,jdbcType=VARCHAR},
</if>
<if test="orderBy != null" >
order_by = #{orderBy,jdbcType=INTEGER},
</if>
<if test="createTime != null" >
create_time = #{createTime,jdbcType=INTEGER},
</if>
<if test="updateTime != null" >
update_time = #{updateTime,jdbcType=INTEGER},
</if>
<if test="showFront != null" >
show_front = #{showFront,jdbcType=INTEGER},
</if>
<if test="delFlag != null" >
del_flag = #{delFlag,jdbcType=INTEGER},
</if>
</set>
where id = #{id,jdbcType=INTEGER}
</update>
<update id="updateByPrimaryKey" parameterType="com.yohoufo.dal.user.model.UsersNotice" >
update users_notice
set name = #{name,jdbcType=VARCHAR},
url = #{url,jdbcType=VARCHAR},
order_by = #{orderBy,jdbcType=INTEGER},
create_time = #{createTime,jdbcType=INTEGER},
update_time = #{updateTime,jdbcType=INTEGER},
show_front = #{showFront,jdbcType=INTEGER},
del_flag = #{delFlag,jdbcType=INTEGER}
where id = #{id,jdbcType=INTEGER}
</update>
</mapper>
\ No newline at end of file
... ...
... ... @@ -46,10 +46,10 @@ public class ChargeContextFactory {
int chargeStage,
Function<ShoppingRequest, Pair<AddressInfo, AddressInfo>> userAddressFunc) {
Integer promotionId;
boolean promotionSelected = Objects.nonNull(promotionId = request.getPromotionId());
boolean promotionSelected = Objects.nonNull(promotionId=request.getPromotionId());
//优惠券
boolean activityCouponsSelected = includeActivityCoupons(request);
if (promotionSelected && activityCouponsSelected) {
if (promotionSelected && activityCouponsSelected){
throw new UfoServiceException(400, "促销和优惠券不能同时使用");
}
//
... ... @@ -57,12 +57,12 @@ public class ChargeContextFactory {
boolean canUseCoupon = activityTypeEnum.isCouponFlag();
List<String> couponCodes = request.getCouponCodes();
boolean couponSelected = CollectionUtils.isNotEmpty(couponCodes);
if ((promotionSelected || couponSelected) && !canUseCoupon) {
if((promotionSelected || couponSelected) && !canUseCoupon){
throw new UfoServiceException(400, "活动订单不能使用其他优惠");
}
//是否推荐促销
boolean recommendedPromotion = false;
switch (chargeStage) {
switch (chargeStage){
//结算页 是否可以使用促销取决活动(砍价)
case ChargeParam.PAYMENT:
recommendedPromotion = canUseCoupon;
... ... @@ -71,14 +71,14 @@ public class ChargeContextFactory {
Integer skupAttr = skupInfo.getAttributes();
SkupType skupType = SkupType.getSkupType(skupAttr);
Function<SkupType, FeeNRate> feeNRateFunc = this::getFeeNRate;
Function<SkupType,FeeNRate> feeNRateFunc = this::getFeeNRate;
boolean depositChoose = OrderConstant.Y_STR.equalsIgnoreCase(request.getDepositRequirement());
boolean depositRequirement = SellerGoodsHelper.canDeposit(skupType)
&& depositChoose;
BigDecimal tariffRate = null;
BigDecimal shipFee = null;
if (SkupType.HK_IN_STOCK.equals(skupType)) {
if (SkupType.HK_IN_STOCK.equals(skupType)){
FeeNRate feeNRate = feeNRateFunc.apply(skupType);
tariffRate = feeNRate.getTariffRate();
shipFee = feeNRate.getShipFee();
... ... @@ -86,21 +86,21 @@ public class ChargeContextFactory {
BigDecimal storageManagementFee = null;
BigDecimal quickDeliverServiceFee = null;
//急速商品 非寄存
if (!depositChoose && SkupType.QUICK_DELIVER.equals(skupType)) {
// 闪购商品 非寄存
if (!depositChoose && SkupType.QUICK_DELIVER.equals(skupType)){
FeeNRate feeNRate = feeNRateFunc.apply(skupType);
quickDeliverServiceFee = feeNRate.getQuickDeliverServiceFee();
}
//现货 or 闪购 商品,且选择了寄存
if (depositRequirement) {
if (depositRequirement){
SkupType std = SellerGoodsHelper.isInStock(skupType) ? SkupType.DEPOSIT : skupType;
FeeNRate depositFee = feeNRateFunc.apply(std);
storageManagementFee = depositFee.getStorageManagementFee();
}
Map<String, AmountCutPolicy> acpMap = buildTariffCutPolicy(skupAttr);
Map<String,AmountCutPolicy> acpMap = buildTariffCutPolicy(skupAttr);
ChargeParam chargeParam = ChargeParam.builder().uid(request.getUid())
.chargeStage(chargeStage)
... ... @@ -137,19 +137,19 @@ public class ChargeContextFactory {
}
private boolean includeActivityCoupons(ShoppingRequest request) {
private boolean includeActivityCoupons(ShoppingRequest request){
int uid = request.getUid();
List<String> couponCodes = request.getCouponCodes();
boolean couponSelected = CollectionUtils.isNotEmpty(couponCodes);
boolean result = false;
if (couponSelected) {
if (couponCodes.contains(CouponConstants.AUTO_RECOMMENDED_COUPON_CODE)) {
if (couponSelected){
if (couponCodes.contains(CouponConstants.AUTO_RECOMMENDED_COUPON_CODE)){
return result;
}
List<UserCouponsBo> couponsBos = couponProxyService.checkAndGetCoupons(uid, couponCodes);
if (CollectionUtils.isNotEmpty(couponsBos)) {
if (CollectionUtils.isNotEmpty(couponsBos)){
result = couponsBos.stream()
.filter(userCouponsBo -> userCouponsBo.getCouponType() == CouponTypeEnum.ACTIVITY_COUPON.getCode())
.findAny().isPresent();
... ... @@ -158,52 +158,37 @@ public class ChargeContextFactory {
return result;
}
private FeeNRate getFeeNRate(SkupType skupType) {
if (skupType == null) {
return null;
}
Map<String, FeeNRate> config = metaConfigService.getBuyerOrderFeeNRate();
if (config == null) {
// set default
return buildDefaultFeeNRate(skupType);
private Map<String,AmountCutPolicy> buildTariffCutPolicy(int skupTypeCode){
Map<String,AmountCutPolicy> tcpMap = null;
if (SellerGoodsHelper.isOverseas(skupTypeCode)){
tcpMap = metaConfigService.getOverseasCutPolicy(RegionEnum.HONGKONG);
}
return config.get(skupType.getLocalCacheKey());
}
private FeeNRate buildDefaultFeeNRate(SkupType skupType) {
FeeNRate feeNRate = null;
switch (skupType) {
case HK_IN_STOCK:
feeNRate = new FeeNRate();
feeNRate.setShipFee(new BigDecimal(30));
feeNRate.setShipFee(new BigDecimal(0.091));
break;
case DEPOSIT:
feeNRate = new FeeNRate();
feeNRate.setStorageManagementFee(new BigDecimal(10));
break;
case QUICK_DELIVER:
feeNRate = new FeeNRate();
feeNRate.setStorageManagementFee(new BigDecimal(15));
break;
if (tcpMap == null){
tcpMap = new HashMap<>(2);
AmountCutType tct = AmountCutType.NO_PROMOTION;
AmountCutPolicy tcpOfTariff = AmountCutPolicy.builder().cutType(tct)
.type(tct.getCode()).build();
tcpMap.put(BuyOrderFeeName.TARIFF_AMOUNT, tcpOfTariff);
AmountCutPolicy tcpOfShip = AmountCutPolicy.builder().cutType(tct)
.type(tct.getCode()).build();
tcpMap.put(BuyOrderFeeName.SHIP_FEE, tcpOfShip);
}
return feeNRate;
return tcpMap;
}
protected int buildDeliveryWay(SkupType skupType) {
DeliveryWayEnum deliveryWay;
if (skupType == null) {
DeliveryWayEnum deliveryWay ;
if (skupType==null){
deliveryWay = DeliveryWayEnum.SF;
} else {
}else{
SkupTypeCodeSupport.CodeNode codeNode = SkupTypeCodeSupport.explain(skupType.getCode());
RegionEnum regionEnum = RegionEnum.getByCode(codeNode.getRegion());
if (regionEnum == null) {
if (regionEnum == null){
deliveryWay = DeliveryWayEnum.SF;
} else {
switch (regionEnum) {
}else{
switch (regionEnum){
case HONGKONG:
deliveryWay = DeliveryWayEnum.OVERSEAS_HONGHONG;
break;
... ... @@ -221,22 +206,38 @@ public class ChargeContextFactory {
return deliveryWay.getCode();
}
private Map<String, AmountCutPolicy> buildTariffCutPolicy(int skupTypeCode) {
Map<String, AmountCutPolicy> tcpMap = null;
if (SellerGoodsHelper.isOverseas(skupTypeCode)) {
tcpMap = metaConfigService.getOverseasCutPolicy(RegionEnum.HONGKONG);
private FeeNRate getFeeNRate(SkupType skupType){
if (skupType == null){
return null;
}
if (tcpMap == null) {
tcpMap = new HashMap<>(2);
AmountCutType tct = AmountCutType.NO_PROMOTION;
AmountCutPolicy tcpOfTariff = AmountCutPolicy.builder().cutType(tct)
.type(tct.getCode()).build();
tcpMap.put(BuyOrderFeeName.TARIFF_AMOUNT, tcpOfTariff);
AmountCutPolicy tcpOfShip = AmountCutPolicy.builder().cutType(tct)
.type(tct.getCode()).build();
tcpMap.put(BuyOrderFeeName.SHIP_FEE, tcpOfShip);
Map<String,FeeNRate> config = metaConfigService.getBuyerOrderFeeNRate();
if (config == null){
// set default
return buildDefaultFeeNRate(skupType);
}
return config.get(skupType.getLocalCacheKey());
}
private FeeNRate buildDefaultFeeNRate(SkupType skupType){
FeeNRate feeNRate = null;
switch (skupType){
case HK_IN_STOCK:
feeNRate = new FeeNRate();
feeNRate.setShipFee(new BigDecimal(30));
feeNRate.setShipFee(new BigDecimal(0.091));
break;
case DEPOSIT:
case FAST_DELIVERY:
feeNRate = new FeeNRate();
feeNRate.setStorageManagementFee(new BigDecimal(10));
break;
case QUICK_DELIVER:
feeNRate = new FeeNRate();
feeNRate.setStorageManagementFee(new BigDecimal(15));
break;
}
return tcpMap;
return feeNRate;
}
}
... ...
... ... @@ -24,6 +24,10 @@ public class ChargeGoods {
private int productId;
private int skup;
/**
* 寄存商品
*/
private String depositCode;
private int attributes;
... ...
... ... @@ -330,9 +330,12 @@ public class PromotionService {
boolean depositRequirement = chargeGoods.isDepositRequirement();
OrderAttributes orderAttributes = OrderAttributes.getOrderAttributes(skupType.getCode());
int orderType = orderAttributes.getCode();
//现货寄存(71) , 闪购寄存(72)
//现货寄存(71) , 闪购寄存(72) 急速寄存(73)
if (depositRequirement){
switch (skupType){
case FAST_DELIVERY:
orderType = 73;
break;
case QUICK_DELIVER:
orderType = 72;
break;
... ...
... ... @@ -77,12 +77,14 @@ public class ActionStatusHold {
OrderStatus.MINI_FAULT_ACCEPT.getCode(),
OrderStatus.JUDGE_PASS.getCode(),
OrderStatus.BUYER_CANCEL_BEFORE_SELLER_DELIVER.getCode(),
OrderStatus.BUYER_CANCEL_BEFORE_DEPOT_RECEIVE.getCode());
OrderStatus.BUYER_CANCEL_BEFORE_DEPOT_RECEIVE.getCode(),
OrderStatus.BUYER_CANCEL_BEFORE_DEPOT_RECEIVE_USE_DEPOSIT_GOODS.getCode());
}
static List<Integer> selfCancel ;
static {
selfCancel = Arrays.asList(OrderStatus.BUYER_CANCEL_BEFORE_SELLER_DELIVER.getCode(),
OrderStatus.BUYER_CANCEL_BEFORE_DEPOT_RECEIVE.getCode());
OrderStatus.BUYER_CANCEL_BEFORE_DEPOT_RECEIVE.getCode(),
OrderStatus.BUYER_CANCEL_BEFORE_DEPOT_RECEIVE_USE_DEPOSIT_GOODS.getCode());
}
}
... ...
... ... @@ -5,24 +5,41 @@ package com.yohoufo.order.common;
* Created by chao.chen on 2018/10/24.
*/
public enum BillTradeStatus {
NEW(0),
TRANSFER_WAITING(90),
SUCCESS(100),
FAIL(200),
NOT_EXIST_ALIPAY_ACCOUNT(201),
AMOUNT_IS_ILLEGAL(202),
HK_AMOUNT_WAIT_PAYMENT(203),
YOHO_STORE_AMOUNT_WAIT_PAYMENT(204),
HK_AMOUNT_PAYING(213),
TRANSFER_FAIL(299);
NEW(0, ""),
TRANSFER_WAITING(90 ,"等待付款结果"),
SUCCESS(100, "成功"),
FAIL(200, "失败"),
NOT_EXIST_ALIPAY_ACCOUNT(201, "没有支付宝账号"),
AMOUNT_IS_ILLEGAL(202, "金额不合法"),
HK_AMOUNT_WAIT_PAYMENT(203, "海外卖家等待付款"),
YOHO_STORE_AMOUNT_WAIT_PAYMENT(204, ""),
HK_AMOUNT_PAYING(213, ""),
TRANSFER_FAIL(299, "转账失败");
int code;
String desc;
BillTradeStatus(int code) {
public String getDesc() {
return desc;
}
BillTradeStatus(int code, String desc)
{
this.code = code;
this.desc = desc;
}
public int getCode() {
return code;
}
public static BillTradeStatus getTradeTypeByCode(int code){
for(BillTradeStatus v : values()){
if(v.code == code){
return v;
}
}
return NEW;
}
}
... ...
... ... @@ -173,6 +173,10 @@ public class WeixinPayConfig {
//用户标识,trade_type=JSAPI,此参数必传
public static final String OPEN_ID = "openid";
public static final String LIMIT_PAY = "limit_pay";
public static final String NO_CREDIT = "no_credit";
//-------统一下单接口返回字段----------------------------------------
public static final String RETURN_CODE = "return_code";
... ...
... ... @@ -3,4 +3,5 @@ package com.yohoufo.order.constants;
public interface ClientSpecialSemanticCode {
int needRealName = 440;
int WaitingPayLimit = 512;
int realNameMisMatch = 443;
}
... ...
package com.yohoufo.order.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSONObject;
import com.yohobuy.ufo.model.order.bo.DepositDetailBo;
import com.yohobuy.ufo.model.order.bo.DepositProductBo;
import com.yohobuy.ufo.model.order.req.UserDopositReq;
import com.yohobuy.ufo.model.order.resp.PageResp;
import com.yohobuy.ufo.model.request.product.ProductRequestBo;
import com.yohoufo.common.ApiResponse;
import com.yohoufo.common.annotation.IgnoreSession;
import com.yohoufo.common.annotation.IgnoreSignature;
import com.yohoufo.common.cache.Cachable;
import com.yohoufo.common.cache.ControllerCacheAop;
import com.yohoufo.dal.product.model.StoragePrice;
import com.yohoufo.order.service.DepositService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
public class DepositController {
... ... @@ -250,4 +246,39 @@ public class DepositController {
LOG.info("end insertFakeDeposit uid is {}, appraiseOrderCode is {} result: {}", uid, appraiseOrderCode, count);
return count;
}
@RequestMapping(params = "method=ufo.deposit.list")
@Cachable(expire = 30, pageArgs = {2,3})
public ApiResponse queryListByUidAndStorageId(@RequestParam("uid") Integer uid, @RequestParam("storageId") Integer storageId,
@RequestParam(value = "page", required = false, defaultValue = "1") Integer page,
@RequestParam(value = "limit", required = false, defaultValue = "10") Integer limit) {
LOG.info("ufo.deposit.list in. uid is {}", uid);
if(null == uid || 0 == uid.intValue()) {
return new ApiResponse.ApiResponseBuilder().code(400).message("uid不能为空").build();
}
if(null == storageId || 0 == storageId) {
return new ApiResponse.ApiResponseBuilder().code(400).message("storageId不能为空").build();
}
UserDopositReq builder = UserDopositReq.builder().uid(uid).storageId(storageId).page(page-1).limit(limit).build();
JSONObject result = depositService.queryListByUidAndStorageId(builder);
return new ApiResponse.ApiResponseBuilder().code(200).data(result).message("查询成功").build();
}
@RequestMapping(params = "method=ufo.deposit.count")
@Cachable(expire = 180)
public ApiResponse getUserDepositCount(@RequestParam("uid") Integer uid, @RequestParam("storageId") Integer storageId) {
LOG.info("ufo.deposit.count in. uid is {}", uid);
if(null == uid || 0 == uid.intValue()) {
return new ApiResponse.ApiResponseBuilder().code(400).message("uid不能为空").build();
}
if(null == storageId || 0 == storageId) {
return new ApiResponse.ApiResponseBuilder().code(400).message("storageId不能为空").build();
}
UserDopositReq builder = UserDopositReq.builder().uid(uid).storageId(storageId).build();
int result = depositService.queryCntByUidAndStorageId(builder);
return new ApiResponse.ApiResponseBuilder().code(200).data(result).message("查询成功").build();
}
}
... ...
package com.yohoufo.order.controller;
import com.google.common.base.Throwables;
import com.yohobuy.ufo.model.order.req.*;
import com.yohobuy.ufo.model.order.resp.FastDeliveryBatchOnShelfResp;
import com.yohobuy.ufo.model.order.resp.FastDeliveryGetShelfDetailResp;
import com.yohobuy.ufo.model.response.StorageInfoResp;
import com.yohoufo.common.ApiResponse;
import com.yohoufo.common.annotation.IgnoreSession;
import com.yohoufo.common.annotation.IgnoreSignature;
import com.yohoufo.common.exception.UfoServiceException;
import com.yohoufo.order.service.IErpFastDeliveryService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 极速发货第三方对接接口
*/
@RestController
@RequestMapping("/erp/fastDelivery")
public class ErpFastDeliveryController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
IErpFastDeliveryService erpFastDeliveryService;
/**
* 批量上架
* @param req
* @return
*/
@IgnoreSignature
@IgnoreSession
@RequestMapping("/batchOnShelf")
public ApiResponse batchOnShelf(@RequestBody FastDeliveryBatchOnShelfReq req){
int code =200;
String msg = "成功";
try{
List<FastDeliveryBatchOnShelfResp> resps = erpFastDeliveryService.batchOnShelf(req);
return new ApiResponse.ApiResponseBuilder().data(resps).code(code).message(msg).build();
}catch (Exception ex){
code = 500;
if(ex instanceof UfoServiceException){
code = ((UfoServiceException) ex).getCode();
msg = ex.getMessage();
}else{
msg = "系统错误";
}
logger.warn("batchOnShelf fail, req {}, error {}", req, Throwables.getStackTraceAsString(ex));
return new ApiResponse.ApiResponseBuilder().code(code).message(msg).build();
}
}
/**
* 单个下架
* @param req
* @return
*/
@IgnoreSignature
@IgnoreSession
@RequestMapping("/singleDownSelf")
public ApiResponse singleDownSelf(@RequestBody FastDeliveryDownShelfReq req){
boolean result = erpFastDeliveryService.singleDownSelf(req);
String msg = "下架成功";
if (!result) {
msg = "下架失败";
}
return new ApiResponse.ApiResponseBuilder().data(result).code(200).message(msg).build();
}
/**
* 单个调价
* @param req
* @return
*/
@IgnoreSignature
@IgnoreSession
@RequestMapping("/singleAdjustPrice")
public ApiResponse singleAdjustPrice(@RequestBody FastDeliveryAdjustPriceReq req){
boolean result = erpFastDeliveryService.singleAdjustPrice(req);
String msg = "调价成功";
if (!result) {
msg = "调价失败";
}
return new ApiResponse.ApiResponseBuilder().data(result).code(200).message(msg).build();
}
/**
* 获取货号的各尺寸的最低价
* @param req
* @return
*/
@IgnoreSignature
@IgnoreSession
@RequestMapping("/getLowestPrice")
public ApiResponse getLowestPrice(@RequestBody FastDeliveryLeastPriceReq req){
List<StorageInfoResp> result = erpFastDeliveryService.getLeastPriceByProductCode(req);
return new ApiResponse.ApiResponseBuilder().data(result).code(200).build();
}
/**
* 查询上架商品信息
* @param req
* @return
*/
@IgnoreSignature
@IgnoreSession
@RequestMapping("/getShelfInfo")
public ApiResponse getShelfInfo(@RequestBody FastDeliveryGetShelfReq req){
FastDeliveryGetShelfDetailResp data = erpFastDeliveryService.getShelfInfo(req);
return new ApiResponse.ApiResponseBuilder().data(data).code(200).build();
}
}
... ...
package com.yohoufo.order.controller;
import com.google.common.base.Splitter;
import com.yohobuy.ufo.model.order.common.OrderListType;
import com.yohobuy.ufo.model.order.common.OrderStatus;
import com.yohobuy.ufo.model.order.common.SellerOrderListType;
... ... @@ -18,14 +19,17 @@ import com.yohoufo.order.model.request.OrderRequest;
import com.yohoufo.order.model.request.SaveQualityCheckInfoRequest;
import com.yohoufo.order.service.IBuyerOrderService;
import com.yohoufo.order.service.IPaymentService;
import com.yohoufo.order.service.OrderGoodsFinder;
import com.yohoufo.order.service.impl.*;
import com.yohoufo.order.utils.LoggerUtils;
import lombok.val;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@RestController
@RequestMapping("/erp")
... ... @@ -52,6 +56,9 @@ public class ErpGWOrderController {
@Autowired
private BuyerOrderViewService buyerOrderViewService;
@Autowired
private OrderGoodsFinder orderGoodsFinder;
@RequestMapping(params = "method=ufo.buyer.orderNums")
@IgnoreSession
public BuyerOrderNums getBuyerOrderNums(@RequestParam("uid") int uid){
... ... @@ -208,6 +215,19 @@ public class ErpGWOrderController {
}
@IgnoreSignature
@IgnoreSession
@RequestMapping(value = "/findOrderGoods")
public ApiResponse findOrderGoods(@RequestParam(value = "orderCodes") String orderCodes) {
List<Long> orderCodeList = Splitter.on(",")
.trimResults()
.omitEmptyStrings()
.splitToList(orderCodes).stream()
.map(Long::valueOf)
.collect(Collectors.toList());
val result = orderGoodsFinder.find(orderCodeList);
return new ApiResponse.ApiResponseBuilder().code(200).data(result).build();
}
}
... ...
package com.yohoufo.order.controller;
import com.yohobuy.ufo.model.order.common.TabType;
import com.yohobuy.ufo.model.order.req.SellerDeliverToDepotReq;
import com.yohobuy.ufo.model.order.resp.ExpressInfoRespBo;
import com.yohoufo.common.ApiResponse;
import com.yohoufo.common.utils.AppVersion;
... ... @@ -21,6 +22,7 @@ import static com.yohoufo.order.utils.ServiceExceptions.throwServiceException;
import static com.yohoufo.order.utils.ServiceExceptions.throwServiceExceptionIf;
/**
* 订单物流入口
* @author kun.wang
* @date 2018/9/25
*/
... ... @@ -42,24 +44,26 @@ public class ExpressInfoController {
*/
@RequestMapping(params = "method=ufo.order.deliverToDepot")
public ApiResponse deliverToDepot(@RequestParam("uid") Integer uid,
@RequestParam("expressCompanyId") Integer expressCompanyId,
@RequestParam(value = "expressCompanyId",required = false) Integer expressCompanyId,
@RequestParam("orderCode") Long orderCode,
@RequestParam("wayBillCode") String wayBillCode,
@RequestParam(value ="wayBillCode",required = false) String wayBillCode,
@RequestParam(value = "depotNum", required = false) String depotNum,
@RequestParam(value = "app_version") String appVersion) {
@RequestParam(value = "app_version") String appVersion,
@RequestParam(value = "depositCode", required = false) String depositCode) {
Integer depotNumInt = IntegerUtils.toInteger(depotNum);
if (Objects.isNull(depotNumInt)) {
// 大于6.9.3 版本
if (AppVersion.of(appVersion).greaterThan(AppVersion.of("6.9.3"))) {
throwServiceException("请选择有效的鉴定中心");
}
// 小于等于6.9.3版本,提升升级APP
else {
throwServiceException(500, "请升级至最新版本");
}
}
expressInfoService.deliverToDepot(uid, expressCompanyId, orderCode, wayBillCode, depotNumInt);
SellerDeliverToDepotReq req = SellerDeliverToDepotReq.builder()
.sellerUid(uid)
.expressCompanyId(expressCompanyId)
.orderCode(orderCode)
.wayBillCode(wayBillCode)
.depositCode(depositCode)
.depotNum(depotNumInt)
.appVersion(appVersion)
.build();
LOG.info("enter ufo.order.deliverToDepot req {}", req);
expressInfoService.deliverToDepot(req);
return new ApiResponse();
}
... ...
... ... @@ -9,7 +9,9 @@ import com.yohoufo.common.annotation.InnerApi;
import com.yohoufo.common.lock.RedisLock;
import com.yohoufo.common.lock.RedisLockFactory;
import com.yohoufo.common.utils.ExecutorServiceUtils;
import com.yohoufo.order.model.request.OrderRequest;
import com.yohoufo.order.model.request.TransferMoneyRequest;
import com.yohoufo.order.service.IBuyerOrderService;
import com.yohoufo.order.service.IPaymentService;
import com.yohoufo.order.service.impl.PaymentServiceImpl;
import com.yohoufo.order.service.impl.TransferService;
... ... @@ -49,6 +51,9 @@ public class OrderHelpController {
@Autowired
AlipayOuyinService alipayService;
@Autowired
IBuyerOrderService buyerOrderService;
/**
* 转账
... ... @@ -139,5 +144,18 @@ public class OrderHelpController {
return new ApiResponse.ApiResponseBuilder().code(200).data(alipayService.transferQueryAsOriginalResult(buyerOrderCode)).message("处理成功").build();
}
@IgnoreSession
@IgnoreSignature
@InnerApi
@RequestMapping(value="/buyerCancel")
public ApiResponse buyerCancel(@RequestParam long orderCode, @RequestParam int uid) {
OrderRequest orderRequest = OrderRequest.builder()
.uid(uid)
.orderCode(orderCode)
.build();
buyerOrderService.cancel(orderRequest);
return new ApiResponse.ApiResponseBuilder().code(200).message("处理成功").build();
}
}
... ...
package com.yohoufo.order.controller;
import com.google.common.collect.Lists;
import com.yohoufo.common.ApiResponse;
import com.yohoufo.order.model.response.OrderSummaryResp;
import com.yohoufo.order.service.IBuyerOrderService;
import com.yohoufo.order.service.impl.SellerOrderViewService;
import com.yohoufo.order.utils.LoggerUtils;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class OrderStatisticController {
private Logger logger = LoggerUtils.getBuyerOrderLogger();
@Autowired
private SellerOrderViewService sellerOrderViewService;
@Autowired
private IBuyerOrderService ibuyerOrderService;
/**
* 我的出售记录数,买入记录数
* 准备逐步弃用 from version 6.9.12
* @return
*/
@Deprecated
@RequestMapping(value = "/shopping", params = "method=ufo.order.summary")
public ApiResponse summary(@RequestParam(name = "uid") int uid,
@RequestParam(name = "client_type", required = false) String clientType){
logger.info("in ufo.order.summary, uid {}, clientType is {}", uid, clientType);
OrderSummaryResp orderSummaryResp1 = sellerOrderViewService.selectOrderNumByUid(uid);
OrderSummaryResp orderSummaryResp2 = ibuyerOrderService.selectOrderNumByUid(uid);
return new ApiResponse.ApiResponseBuilder().code(200).data(Lists.newArrayList(orderSummaryResp1, orderSummaryResp2)).message("查询成功").build();
}
@RequestMapping(params = "method=ufo.seller.orderSummary")
public ApiResponse sellerOrderSummary(@RequestParam(name = "uid") int uid,
@RequestParam(name = "client_type", required = false) String clientType){
logger.info("in ufo.seller.orderSummary, uid {}, clientType is {}", uid, clientType);
List<OrderSummaryResp> orderSummaryResps = sellerOrderViewService.getOrderCntListByUid(uid);
return new ApiResponse.ApiResponseBuilder().code(200).data(orderSummaryResps).message("查询成功").build();
}
}
... ...
package com.yohoufo.order.controller;
import com.google.common.collect.Lists;
import com.yohobuy.ufo.model.order.constants.OrderConstant;
import com.yohoufo.common.ApiResponse;
import com.yohoufo.order.constants.ActivityTypeEnum;
import com.yohoufo.order.annotation.BlackUserType;
import com.yohoufo.order.common.BlackTypeEnum;
import com.yohoufo.order.constants.ActivityTypeEnum;
import com.yohoufo.order.constants.CouponConstants;
import com.yohoufo.order.model.request.ShoppingRequest;
import com.yohoufo.order.model.response.*;
import com.yohoufo.order.service.IBuyerOrderService;
import com.yohoufo.order.service.IShoppingService;
import com.yohoufo.order.service.impl.SellerOrderViewService;
import com.yohoufo.order.utils.CouponCodeUtils;
import com.yohoufo.order.utils.LoggerUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/shopping")
... ... @@ -27,15 +26,7 @@ public class ShoppingController {
private Logger logger = LoggerUtils.getBuyerOrderLogger();
@Autowired
IShoppingService buyerOrderService;
@Autowired
private SellerOrderViewService sellerOrderViewService;
@Autowired
IBuyerOrderService ibuyerOrderService;
private IShoppingService buyerOrderService;
/**
* 结算
... ... @@ -170,22 +161,7 @@ public class ShoppingController {
return new ApiResponse.ApiResponseBuilder().code(200).data(submitResponse).message("提交订单SUCCESS").build();
}
/**
* 我的出售记录数,买入记录数
* @return
*/
@RequestMapping(params = "method=ufo.order.summary")
public ApiResponse summary(@RequestParam(name = "uid") int uid,
@RequestParam(name = "client_type", required = false) String clientType){
logger.info("in ufo.order.summary, uid {}, clientType is {}", uid, clientType);
OrderSummaryResp orderSummaryResp1 = sellerOrderViewService.selectOrderNumByUid(uid);
OrderSummaryResp orderSummaryResp2 = ibuyerOrderService.selectOrderNumByUid(uid);
return new ApiResponse.ApiResponseBuilder().code(200).data(Lists.newArrayList(orderSummaryResp1, orderSummaryResp2)).message("查询成功").build();
}
/**
... ...
... ... @@ -31,4 +31,8 @@ public class BeforeDepotReceiveEvent extends Event {
//订单的实付金额(货款+运费)
private BigDecimal amount;
private boolean useDepositGoods;
private String depositCode;
}
... ...
... ... @@ -29,4 +29,8 @@ public class BeforeSellerDeliverEvent extends Event {
//订单的实付金额(货款+运费)
private BigDecimal amount;
private boolean useDepositGoods;
private String depositCode;
}
... ...
package com.yohoufo.order.event;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.util.function.Function;
@ToString(of = {"uid", "depositCode"})
public class DepositGoodsCompensateAsyncEvent extends AsyncEvent {
@Getter@Setter
private int uid;
@Getter@Setter
private String depositCode;
public DepositGoodsCompensateAsyncEvent(Function<DepositGoodsCompensateAsyncEvent,Boolean> function) {
super(function);
}
@Override
AsyncEvent getAsyncEvent() {
return this;
}
}
... ...
... ... @@ -17,6 +17,7 @@ import com.yohoufo.order.model.bo.AmountDetailBo;
import com.yohoufo.order.model.bo.CouponBo;
import com.yohoufo.order.model.bo.CouponBoList;
import com.yohoufo.order.model.dto.OrderBuilder;
import com.yohoufo.order.service.impl.ShoppingServiceImpl;
import com.yohoufo.order.service.seller.support.SkupTypeCodeSupport;
import org.apache.commons.lang3.tuple.Pair;
... ... @@ -26,7 +27,7 @@ import java.util.stream.Collectors;
public class OrderBuilderFactory {
public OrderBuilder create(int uid, long orderCode, String channelNo, String clientType, Pair<AddressInfo, AddressInfo> userAddressPair, SellerOrderGoods psog, ChargeContext chargeContext) {
public OrderBuilder create(int uid, long orderCode, String channelNo, String clientType, Pair<AddressInfo, AddressInfo> userAddressPair, ShoppingServiceImpl.GoodsPrepareData goodsPrepareData, SellerOrderGoods psog, ChargeContext chargeContext) {
//算费结果
ChargeResult chargeResult = chargeContext.getChargeResult();
ChargeGoods chargeGoods = chargeContext.getChargeGoods();
... ... @@ -35,6 +36,7 @@ public class OrderBuilderFactory {
return OrderBuilder.builder()
.uid(uid)
.skup(psog.getId())
.depositCode(goodsPrepareData.getDepositCode())
.orderCode(orderCode)
.productId(psog.getProductId())
.paymentType(OrderConstant.PAYMENT_ONLINE)
... ... @@ -47,6 +49,7 @@ public class OrderBuilderFactory {
.addressInfo(userAddressPair.getLeft())
.clientType(clientType)
.attributes(buildOrderAttribute(psog, chargeGoods.isDepositRequirement()).getCode())
.originalAttributes(psog.getAttributes())
.sellerOrderGoods(psog)
.activityBo(buildOrderActivityBo(chargeResult))
.amountDetailBo(buildOrderAmountDetailBo(chargeResult))
... ... @@ -58,17 +61,17 @@ public class OrderBuilderFactory {
}
protected int buildDeliveryWay(SkupType skupType) {
DeliveryWayEnum deliveryWay;
if (skupType == null) {
DeliveryWayEnum deliveryWay ;
if (skupType==null){
deliveryWay = DeliveryWayEnum.SF;
} else {
}else{
SkupTypeCodeSupport.CodeNode codeNode = SkupTypeCodeSupport.explain(skupType.getCode());
RegionEnum regionEnum = RegionEnum.getByCode(codeNode.getRegion());
if (regionEnum == null) {
if (regionEnum == null){
deliveryWay = DeliveryWayEnum.SF;
} else {
switch (regionEnum) {
}else{
switch (regionEnum){
case HONGKONG:
deliveryWay = DeliveryWayEnum.OVERSEAS_HONGHONG;
break;
... ... @@ -87,24 +90,6 @@ public class OrderBuilderFactory {
}
/**
* 优惠券支付结果
*
* @param chargeResult
* @return
*/
protected CouponBoList buildOrderCouponBoList(ChargeResult chargeResult) {
return CouponBoList.builder().couponBos(chargeResult.getCouponPayResultList().getCouponPayResults().stream()
.map(couponPayResult -> CouponBo.builder()
.couponCode(couponPayResult.getCouponCode())
.couponType(couponPayResult.getCouponType())
.couponAmount(BigDecimal.valueOf(couponPayResult.getCouponAmount()))
.build()
)
.collect(Collectors.toList())
).build();
}
/**
* 获取订单attribute属性
*
* @return
... ... @@ -132,11 +117,28 @@ public class OrderBuilderFactory {
}
/**
* 订单金额明细
* 优惠券支付结果
*
* @param chargeResult
* @return
*/
protected CouponBoList buildOrderCouponBoList(ChargeResult chargeResult) {
return CouponBoList.builder().couponBos(chargeResult.getCouponPayResultList().getCouponPayResults().stream()
.map(couponPayResult -> CouponBo.builder()
.couponCode(couponPayResult.getCouponCode())
.couponType(couponPayResult.getCouponType())
.couponAmount(BigDecimal.valueOf(couponPayResult.getCouponAmount()))
.build()
)
.collect(Collectors.toList())
).build();
}
/**
* 订单金额明细
* @param chargeResult
* @return
*/
protected AmountDetailBo buildOrderAmountDetailBo(ChargeResult chargeResult) {
//订单金额明细
final AmountDetailBo amountDetailBo = new AmountDetailBo();
... ... @@ -155,17 +157,17 @@ public class OrderBuilderFactory {
amountDetailBo.setTariffCutAmount(tariffFee.getCutAmount());
}
SingleFeeDetail shipFeeDetail;
if (Objects.nonNull(shipFeeDetail = chargeResult.getShipFeeDetail())) {
if (Objects.nonNull(shipFeeDetail = chargeResult.getShipFeeDetail())){
amountDetailBo.setShippingActivityCutAmount(shipFeeDetail.getCutAmount());
}
SingleFeeDetail depositFee;
if (Objects.nonNull(depositFee = chargeResult.getDepositFee())) {
if (Objects.nonNull(depositFee=chargeResult.getDepositFee())){
amountDetailBo.setDepositAmount(depositFee.getAmount());
}
SingleFeeDetail quickDeliveFee = chargeResult.getQuickDeliverServiceFee();
if (Objects.nonNull(quickDeliveFee)) {
if (Objects.nonNull(quickDeliveFee)){
amountDetailBo.setQuickDeliveServiceAmount(quickDeliveFee.getAmount());
}
//活动券减免金额
... ... @@ -180,14 +182,14 @@ public class OrderBuilderFactory {
return amountDetailBo;
}
private SingleFeeDetail buildDepositFee(ChargeGoods chargeGoods) {
private SingleFeeDetail buildDepositFee(ChargeGoods chargeGoods){
BigDecimal qdsf = chargeGoods.getQuickDeliverServiceFee();
BigDecimal smf = chargeGoods.getStorageManagementFee();
double amount = 0D;
if (Objects.nonNull(qdsf)) {
if (Objects.nonNull(qdsf)){
amount = qdsf.doubleValue();
}
if (Objects.nonNull(smf)) {
if (Objects.nonNull(smf)){
amount = smf.doubleValue();
}
SingleFeeDetail sfd = SingleFeeDetail.builder().amount(amount).build();
... ...
... ... @@ -28,4 +28,13 @@ public class ImPrdNode{
AddressInfo hiddenBackAddress;
AddressInfo noHiddenBackAddress;
private Integer skupType;
/**
* 货号
*/
String productCode;
/**
* 尺寸
*/
String sizeName;
}
... ...
... ... @@ -8,9 +8,9 @@ import com.yohoufo.order.charge.model.SingleFeeDetail;
import com.yohoufo.order.model.bo.ActivityBo;
import com.yohoufo.order.model.bo.AmountDetailBo;
import com.yohoufo.order.model.bo.CouponBoList;
import lombok.Builder;
import lombok.Data;
import lombok.ToString;
import lombok.Builder;
import java.math.BigDecimal;
import java.util.List;
... ... @@ -21,6 +21,7 @@ import java.util.List;
public class OrderBuilder {
int skup;
String depositCode;
int productId;
long orderCode;
int uid;
... ... @@ -53,6 +54,11 @@ public class OrderBuilder {
Integer attributes;
/**
* skup原始的属性
*/
Integer originalAttributes;
SellerOrderGoods sellerOrderGoods;
/**
... ...
... ... @@ -15,9 +15,6 @@ public class BidPublishResponse {
//Y 已支付,N 为支付
private String paymentStatus;
//支付阶段
private int payLevel;
//提示
private Tip tip;
... ...
package com.yohoufo.order.model.response;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* Created by li.ma on 2018/9/27.
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class OrderSummaryResp {
@JSONField(name = "actor")
private String actor;
private Integer listType;
@JSONField(name = "sum")
private Integer sum;
public OrderSummaryResp() {
}
public OrderSummaryResp(String actor, Integer sum) {
this.actor = actor;
this.sum = sum;
}
public String getActor() {
return actor;
}
public void setActor(String actor) {
this.actor = actor;
}
public Integer getSum() {
return sum;
}
public void setSum(Integer sum) {
this.sum = sum;
}
}
... ...
... ... @@ -63,7 +63,7 @@ public class NotDeliverNoticeDelayMsgConsumer implements YhConsumer {
sog.setProductName(msg.getPrdName());
}
LOGGER.info("ready notice sellerDeliverWithTimes, msg {}", msg);
sellerNoticeFacade.sellerDeliverWithTimes(sog,orderCode, 2, 12, DateUtil.UNIT_HOURS);
sellerNoticeFacade.sellerDeliverWithTimes(sog, buyerOrder, 2, 12, DateUtil.UNIT_HOURS);
}
... ...
... ... @@ -7,7 +7,9 @@ import com.yoho.error.exception.ServiceException;
import com.yohobuy.ufo.model.order.bo.OrderInfo;
import com.yohobuy.ufo.model.order.common.*;
import com.yohobuy.ufo.model.order.constants.OrderConstant;
import com.yohobuy.ufo.model.order.constants.DepotType;
import com.yohobuy.ufo.model.order.constants.SkupType;
import com.yohobuy.ufo.model.order.req.SellerDeliverToDepotReq;
import com.yohoufo.common.alarm.EventBusPublisher;
import com.yohoufo.common.utils.DateUtil;
import com.yohoufo.dal.order.BuyerOrderGoodsMapper;
... ... @@ -25,17 +27,10 @@ import com.yohoufo.order.model.request.PaymentRequest;
import com.yohoufo.order.model.response.PrepayResponse;
import com.yohoufo.order.mq.DelayTime;
import com.yohoufo.order.service.cache.CacheCleaner;
import com.yohoufo.order.service.cache.CacheKeyBuilder;
import com.yohoufo.order.service.impl.AppraiseService;
import com.yohoufo.order.service.impl.MetaConfigService;
import com.yohoufo.order.service.impl.OrderOverTimeService;
import com.yohoufo.order.service.impl.TradeBillsService;
import com.yohoufo.order.service.impl.*;
import com.yohoufo.order.service.listener.BuyerOrderChangeEvent;
import com.yohoufo.order.service.listener.OrderChangeListenerContainer;
import com.yohoufo.order.service.proxy.BuyerNoticeFacade;
import com.yohoufo.order.service.proxy.DeliveryMinutesService;
import com.yohoufo.order.service.proxy.InBoxFacade;
import com.yohoufo.order.service.proxy.OrderStatusFlowService;
import com.yohoufo.order.service.proxy.*;
import com.yohoufo.order.utils.BuyerOrderUtils;
import com.yohoufo.order.utils.SellerGoodsHelper;
import com.yohoufo.order.utils.TimeUtils;
... ... @@ -47,6 +42,8 @@ import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import static com.yohobuy.ufo.model.order.common.EnumExpressDataOperateTransferCode.judge_pass;
... ... @@ -64,7 +61,6 @@ public class BuyerOrderPaymentService extends AbstractOrderPaymentService {
@Autowired
BuyerOrderMetaMapper buyerOrderMetaMapper;
@Autowired
InBoxFacade inBoxFacade;
... ... @@ -105,7 +101,12 @@ public class BuyerOrderPaymentService extends AbstractOrderPaymentService {
private IExpressInfoService expressInfoService;
@Autowired
private DepositService depositService;
FastDeliveryProxyService fastDeliveryProxyService;
private ExecutorService executors = Executors.newFixedThreadPool(1);
@Autowired
private BuyerOrderExpressInfoService buyerOrderExpressInfoService;
private boolean isDepositWithQuickDeliverGoods(int uid, long orderCode, Integer oa){
BuyerOrderGoods pbog = buyerOrderGoodsMapper.selectOnlyByOrderCode(orderCode);
... ... @@ -117,6 +118,8 @@ public class BuyerOrderPaymentService extends AbstractOrderPaymentService {
uid, orderCode, oa, goodsAttr);
return result;
}
/**
* 更新订单状态
* @param orderInfo
... ... @@ -173,6 +176,26 @@ public class BuyerOrderPaymentService extends AbstractOrderPaymentService {
}
}
orderInfo.setStatus(orderStatusCode);
// 极速 不管是寄存还是发货 都需要通知卖家发货
if (fastDeliveryProxyService.isFastDeliveryGoods(orderInfo.getSkup())){
String wayBillCode = fastDeliveryProxyService.getVRWaybillCode(orderInfo.getOrderCode());
// 同时生成物流单号,通知第三方发货
fastDeliveryProxyService.order(orderInfo.getSkup(), wayBillCode);
// 卖家自动发货
executors.submit(()->{
SellerDeliverToDepotReq sdtdReq = SellerDeliverToDepotReq.builder()
.sellerUid(orderInfo.getSellerUid())
.orderCode(orderInfo.getOrderCode())
.wayBillCode(wayBillCode)
.depotNum(DepotType.NJ.getCode())
.expressCompanyId(0)
.build();
expressInfoService.deliverToDepot(sdtdReq);
});
}
return result;
}
... ... @@ -184,8 +207,10 @@ public class BuyerOrderPaymentService extends AbstractOrderPaymentService {
private void processDepositOrderOfQuickDeliverGoods(BuyerOrder buyerOrder, SellerOrderGoods sellerOrderGoods){
Integer buyerUid = buyerOrder.getUid();
Long orderCode = buyerOrder.getOrderCode();
inBoxFacade.noticeWhenDepositOrderOfQuickDeliverGoodsPaid(buyerUid, orderCode, sellerOrderGoods);
inBoxFacade.noticeWhenDepositOrderOfQuickDeliverGoodsPaid(buyerOrder, sellerOrderGoods);
// 插入物流调拨信息
buyerOrderExpressInfoService.addExpressInfo4DepositGoods(buyerOrder);
/*
expressInfoService.saveOperateTransferExpressInfo(OperateTransferExpressInfo.builder()
.uid(buyerUid)
.orderCode(orderCode)
... ... @@ -204,6 +229,7 @@ public class BuyerOrderPaymentService extends AbstractOrderPaymentService {
.expressType(EnumExpressType.EXPRESS_TYPE_2)
.operateTransferCode(EnumExpressDataOperateTransferCode.GOODS_DEPOSIT_IN_STORE)
.build());
*/
}
private void processDepositOrderOfInstockGoods(BuyerOrder buyerOrder, SellerOrderGoods sellerOrderGoods){
... ... @@ -217,7 +243,7 @@ public class BuyerOrderPaymentService extends AbstractOrderPaymentService {
*/
private void processDepositOrder(BuyerOrder buyerOrder, SellerOrderGoods sellerOrderGoods){
SkupType skupType = SkupType.getSkupType(sellerOrderGoods.getAttributes());
//寄存订单 & 闪购商品
//寄存订单 & 闪购商品 & 极速闪购
switch (skupType){
case QUICK_DELIVER:
processDepositOrderOfQuickDeliverGoods(buyerOrder, sellerOrderGoods);
... ... @@ -225,7 +251,29 @@ public class BuyerOrderPaymentService extends AbstractOrderPaymentService {
case IN_STOCK:
processDepositOrderOfInstockGoods(buyerOrder, sellerOrderGoods);
break;
case FAST_DELIVERY:
processFastDelivery(buyerOrder, sellerOrderGoods);
break;
}
}
/**
* 提醒买家已经支付成功&卖家已经发货
* @param orderInfo
* @param sellerOrderGoods
*/
private void processFastDelivery(BuyerOrder orderInfo, SellerOrderGoods sellerOrderGoods){
// 通知买家支付成功
inBoxFacade.buyerPaidFastDelivery(sellerOrderGoods, orderInfo);
// 提醒卖家发货
long orderCode = orderInfo.getOrderCode();
inBoxFacade.sellerSkupPaidByBuyerFastDelivery(sellerOrderGoods, orderInfo);
}
/**
... ... @@ -233,7 +281,7 @@ public class BuyerOrderPaymentService extends AbstractOrderPaymentService {
* @param orderInfo
* @param sellerOrderGoods
*/
private void processInStockOrder(BuyerOrder orderInfo, SellerOrderGoods sellerOrderGoods){
private void processInStockOrder(BuyerOrder orderInfo,SellerOrderGoods sellerOrderGoods){
Integer uid = orderInfo.getUid();
Integer sellerUid = orderInfo.getSellerUid();
long orderCode = orderInfo.getOrderCode();
... ... @@ -283,7 +331,7 @@ public class BuyerOrderPaymentService extends AbstractOrderPaymentService {
}
/**
* 速发货非寄存订单,商品:闪购
* 速发货非寄存订单,商品:闪购
* @param buyerOrder
* @param sellerOrderGoods
*/
... ... @@ -293,7 +341,7 @@ public class BuyerOrderPaymentService extends AbstractOrderPaymentService {
Long orderCode = buyerOrder.getOrderCode();
Integer skup = sellerOrderGoods.getId();
// notice
inBoxFacade.noticeWhenQuickDeliverOrderPaid(buyerOrder.getUid(), buyerOrder.getOrderCode(), sellerOrderGoods);
inBoxFacade.noticeWhenQuickDeliverOrderPaid(buyerOrder, sellerOrderGoods);
// 插入物流调拨信息
expressInfoService.saveOperateTransferExpressInfo(OperateTransferExpressInfo.builder()
... ... @@ -358,16 +406,11 @@ public class BuyerOrderPaymentService extends AbstractOrderPaymentService {
case DEPOSITE:
processDepositOrder(buyerOrder, sellerOrderGoods);
break;
case FAST_DELIVERY: // 极速发货
processFastDelivery(buyerOrder, sellerOrderGoods);
break;
}
cacheCleaner.delete(Arrays.asList(CacheKeyBuilder.orderListKey(sellerUid, TabType.SELL.getValue()),
CacheKeyBuilder.orderListKey(uid, TabType.BUY.getValue()),
CacheKeyBuilder.sellerOrderDetailKey(sellerOrderGoods),
CacheKeyBuilder.orderDetailKey(sellerUid, TabType.SELL.getValue(), orderCode),
CacheKeyBuilder.orderDetailKey(uid, TabType.BUY.getValue(), orderInfo.getOrderCode()),
CacheKeyBuilder.buyerOrderNums(uid)));
cacheCleaner.cleanSellerAndBuyerOrderDetailAndList(sellerUid, uid, orderInfo.getOrderCode());
ErpBuyerOrderEvent erpEvent = new ErpBuyerOrderEvent(uid);
EventBusPublisher.publishEvent(erpEvent);
}
... ... @@ -416,31 +459,29 @@ public class BuyerOrderPaymentService extends AbstractOrderPaymentService {
return false;
}
final static List<Integer> canRefundStatusList = Arrays.asList(
OrderStatus.SELLER_CANCEL_AFTER_PAY.getCode(),
OrderStatus.SEND_OUT_TIMEOUT.getCode(),
OrderStatus.CHECKING_FAKE.getCode(),
OrderStatus.QUALITY_CHECK_FAKE.getCode(),
OrderStatus.MINI_FAULT_REJECT.getCode(),
OrderStatus.MINI_FAULT_OUT_TIME_REJECT.getCode(),
OrderStatus.BUYER_CANCEL_BEFORE_DEPOT_RECEIVE.getCode(),
OrderStatus.BUYER_CANCEL_BEFORE_SELLER_DELIVER.getCode(),
OrderStatus.PLATFORM_APPRAISE_UNSURE.getCode(),
final static List<OrderStatus> canRefundStatusList = Arrays.asList(
OrderStatus.SELLER_CANCEL_AFTER_PAY,
OrderStatus.SEND_OUT_TIMEOUT,
OrderStatus.CHECKING_FAKE,
OrderStatus.QUALITY_CHECK_FAKE,
OrderStatus.MINI_FAULT_REJECT,
OrderStatus.MINI_FAULT_OUT_TIME_REJECT,
OrderStatus.BUYER_CANCEL_BEFORE_DEPOT_RECEIVE,
OrderStatus.BUYER_CANCEL_BEFORE_SELLER_DELIVER,
OrderStatus.PLATFORM_APPRAISE_UNSURE,
// 支付成功回调超时,但已经被超时取消,这种场景是可以退款的
OrderStatus.BUYER_CANCEL_TIMEOUT.getCode(),
OrderStatus.BUYER_CANCEL_BEFORE_PAY.getCode(),
OrderStatus.SELLER_SHAM_SEND_OUT_AUTO.getCode(),
OrderStatus.SELLER_SHAM_SEND_OUT.getCode(),
OrderStatus.BUYER_BLOWN_CUSTOMS_CLEARANCE.getCode(),
OrderStatus.PLATFORM_BLOWN_CUSTOMS_CLEARANCE.getCode(),
OrderStatus.PLATFORM_DETECTION_NOT_PASS.getCode());
OrderStatus.BUYER_CANCEL_TIMEOUT,
OrderStatus.BUYER_CANCEL_BEFORE_PAY,
OrderStatus.SELLER_SHAM_SEND_OUT_AUTO,
OrderStatus.SELLER_SHAM_SEND_OUT,
OrderStatus.BUYER_BLOWN_CUSTOMS_CLEARANCE,
OrderStatus.PLATFORM_BLOWN_CUSTOMS_CLEARANCE,
OrderStatus.BUYER_CANCEL_BEFORE_DEPOT_RECEIVE_USE_DEPOSIT_GOODS,
OrderStatus.PLATFORM_DETECTION_NOT_PASS);
@Override
public boolean canRefund(OrderInfo orderInfo) {
if (orderInfo.getStatus() != null && canRefundStatusList.contains(orderInfo.getStatus().intValue())){
return true;
}
return false;
return orderInfo.getStatus() != null && canRefundStatusList.contains(OrderStatus.getOrderStatus(orderInfo.getStatus()));
}
... ... @@ -539,7 +580,7 @@ public class BuyerOrderPaymentService extends AbstractOrderPaymentService {
// skup --> product_name
SellerOrderGoods sellerOrderGoods = sellerOrderGoodsMapper.selectByPrimaryKey(buyerOrderGoods.getSkup());
OrderInfo orderInfo = buildOrderInfo(buyerOrder);
OrderInfo orderInfo = buildOrderInfo(buyerOrder, buyerOrderGoods);
if (sellerOrderGoods == null){
return orderInfo;
}
... ... @@ -548,8 +589,7 @@ public class BuyerOrderPaymentService extends AbstractOrderPaymentService {
return orderInfo;
}
private OrderInfo buildOrderInfo(BuyerOrder buyerOrder ) {
private OrderInfo buildOrderInfo(BuyerOrder buyerOrder,BuyerOrderGoods buyerOrderGoods) {
OrderInfo orderInfo = OrderInfo.builder()
.id(buyerOrder.getId())
.uid(buyerOrder.getUid())
... ... @@ -562,6 +602,7 @@ public class BuyerOrderPaymentService extends AbstractOrderPaymentService {
.orderCodeType(OrderCodeType.BUYER_TYPE)
.attributes(buyerOrder.getAttributes())
.sourceStatus(buyerOrder.getStatus())
.skup(buyerOrderGoods!=null?buyerOrderGoods.getSkup():0)
.payExpireTime(DelayTime.BUYER_ORDER_WAITING_PAY)
.payExpire(buyerOrder.getCreateTime()+ covertFen(DelayTime.SELLER_ORDER_WAITING_PAY))
.payLevel(buyerOrder.getPayLevel())
... ... @@ -586,7 +627,9 @@ public class BuyerOrderPaymentService extends AbstractOrderPaymentService {
throw new ServiceException(ServiceError.ORDER_NULL);
}
return buildOrderInfo(buyerOrder );
BuyerOrderGoods buyerOrderGoods = buyerOrderGoodsMapper.selectByOrderCode(buyerOrder.getUid(), buyerOrder.getOrderCode());
return buildOrderInfo(buyerOrder,buyerOrderGoods);
}
... ...
package com.yohoufo.order.service;
import java.util.List;
import com.alibaba.fastjson.JSONObject;
import com.yoho.core.dal.datasource.annotation.Database;
import com.yohobuy.ufo.model.order.bo.DepositDetailBo;
import com.yohobuy.ufo.model.order.bo.DepositProductBo;
import com.yohobuy.ufo.model.order.constants.StorageDepositStatusEnum;
import com.yohobuy.ufo.model.order.req.UserDopositReq;
import com.yohobuy.ufo.model.order.resp.PageResp;
import com.yohoufo.common.exception.UfoServiceException;
import com.yohoufo.dal.order.model.StorageDeposit;
import java.util.Collection;
import java.util.List;
public interface DepositService {
PageResp<List<DepositProductBo>> queryUserDoposit(Integer uid, Integer page, Integer limit);
... ... @@ -37,7 +35,7 @@ public interface DepositService {
// 转卖
boolean changeOwner(Integer uid, Integer skup, long buyOrderCode, Integer newUid, boolean isDeposit);
boolean changeOwner(Integer uid, Integer skup, long buyOrderCode, Integer newUid, boolean isDeposit, String depositCode);
// 可上架数量
int getDepositOffShelvesCount(Integer uid, Integer storageId);
// 可上架数量
... ... @@ -105,4 +103,44 @@ public interface DepositService {
* @return
*/
int insertFakeDeposit(Integer uid, long appraiseOrderCode, Long parentAppraiseOrderCode);
/**
* 查询用户所属的寄存商品
* @param req
* @return
*/
JSONObject queryListByUidAndStorageId(UserDopositReq req);
/**
* 查询用户所属的寄存商品数量
* @param req
* @return
*/
int queryCntByUidAndStorageId(UserDopositReq req);
/**
* 更新寄存的状态为待拣货状态
* @param uid
* @param depositCode
* @return
*/
int updateDepositWaitToPick(Integer uid, String depositCode, Long orderCode, Integer skup);
/**
* 取消购买后更新寄存状态
* @param uid
* @param depositCode
* @return
*/
boolean updateDepositAfterCancelBuy(Integer uid, String depositCode);
/**
* 更新出售锁状态
* @param uid
* @param depositCode
* @param sellLock
* @return
*/
int updateSellLock(Integer uid, String depositCode, Integer sellLock);
}
... ...
... ... @@ -22,4 +22,16 @@ public interface IBuyerOrderMetaService {
* @return
*/
AddressInfo getRecallAddressInfo(int uid, long orderCode);
/**
* 买家订单绑定寄存码
* 目前用于场景:现货订单or寄存订单(现货寄存) 卖家使用寄存商品发货
* @param depositCode
* @param uid
* @param orderCode
* @return
*/
int saveDepositCode(String depositCode, int uid, long orderCode);
String getDepositCode(int uid, Long orderCode);
}
... ...
package com.yohoufo.order.service;
import com.yoho.core.dal.datasource.annotation.Database;
import com.yohobuy.ufo.model.order.common.OrderListType;
import com.yohobuy.ufo.model.order.common.OrderStatus;
import com.yohobuy.ufo.model.order.req.SellerDeliverToDepotReq;
import com.yohobuy.ufo.model.order.resp.BuyerOrderNums;
import com.yohobuy.ufo.model.order.resp.OrderCntResp;
import com.yohobuy.ufo.model.order.vo.AddressInfo;
import com.yohoufo.order.model.request.OrderRequest;
import com.yohoufo.order.model.request.SaveQualityCheckInfoRequest;
import com.yohoufo.order.model.response.OrderSummaryResp;
import com.yohoufo.order.service.impl.BuyerOrderAssistant;
public interface IBuyerOrderService {
... ... @@ -67,6 +71,15 @@ public interface IBuyerOrderService {
OrderCntResp getOrderCnt(OrderRequest req, OrderListType listType);
/**
* 现货订单使用寄存商品发货
* @param preparedData
* @param dscNode
*/
int processOrderDeliverByDepositGoods(BuyerOrderAssistant.PreparedData preparedData,
BuyerOrderAssistant.DepositSkuCheckNode dscNode);
int processBuyerOrderWhenSellerDeliver(BuyerOrderAssistant.PreparedData preparedData,
OrderStatus targetOrderStatus,
SellerDeliverToDepotReq req4Log);
}
... ...
package com.yohoufo.order.service;
import com.yohobuy.ufo.model.order.req.*;
import com.yohobuy.ufo.model.order.resp.FastDeliveryBatchOnShelfResp;
import com.yohobuy.ufo.model.order.resp.FastDeliveryGetShelfDetailResp;
import com.yohobuy.ufo.model.response.StorageInfoResp;
import java.util.List;
public interface IErpFastDeliveryService {
/**
* 单个调价
* @param req
* @return
*/
boolean singleAdjustPrice(FastDeliveryAdjustPriceReq req);
/**
* 批量上架
* @param req
*/
List<FastDeliveryBatchOnShelfResp> batchOnShelf(FastDeliveryBatchOnShelfReq req);
/**
* 单个下架
* @param req
*/
boolean singleDownSelf(FastDeliveryDownShelfReq req);
/**
* 查询上架商品的信息
* @param req
*/
FastDeliveryGetShelfDetailResp getShelfInfo(FastDeliveryGetShelfReq req);
/**
* 获取某个货号的最低价
* @param req
* @return
*/
List<StorageInfoResp> getLeastPriceByProductCode(FastDeliveryLeastPriceReq req);
}
... ...
package com.yohoufo.order.service;
import com.yoho.core.dal.datasource.annotation.Database;
import com.yohobuy.ufo.model.order.common.*;
import com.yohobuy.ufo.model.order.req.SellerDeliverToDepotReq;
import com.yohobuy.ufo.model.order.resp.ExpressInfoDetail;
import com.yohobuy.ufo.model.order.resp.ExpressInfoRespBo;
import com.yohoufo.common.constant.ExpressInfoConstant;
... ... @@ -11,6 +13,8 @@ import com.yohoufo.order.common.ActionStatusHold;
import com.yohoufo.order.model.OperateTransferExpressInfo;
import com.yohoufo.order.model.response.AppraiseAddressResp;
import lombok.NonNull;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Arrays;
... ... @@ -59,11 +63,9 @@ public interface IExpressInfoService {
/**
* 卖家发货到鉴定中心
*
* @param expressCompanyId 快递公司id
* @param orderCode 订单号
* @param wayBillCode 快递单号
* @param req
*/
void deliverToDepot(Integer sellerUid,Integer expressCompanyId, Long orderCode, String wayBillCode,Integer depotNum);
void deliverToDepot(SellerDeliverToDepotReq req);
... ...
... ... @@ -33,6 +33,7 @@ import com.yohoufo.order.service.impl.PaymentServiceImpl;
import com.yohoufo.order.service.seller.setting.SellerService;
import com.yohoufo.order.service.seller.setting.SellerWrapper;
import com.yohoufo.order.service.impl.TradeBillsService;
import com.yohoufo.order.utils.SellerHelper;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
... ... @@ -861,7 +862,7 @@ public class MerchantOrderPaymentService extends AbstractOrderPaymentService {
private boolean isSuperWithoutLock(int uid){
SellerWrapper sellerWrapper = sellerService.getBaseSellerWrapper(uid);
SellerBo sellerBo = sellerWrapper.buildSellerBo();
return sellerBo.isNormalSuper() || sellerBo.isLargeSettlementSuper();
return SellerHelper.isSuper(sellerBo.getEntrySellerType());
}
private static class CalculateNode{
... ...
package com.yohoufo.order.service;
import com.google.common.collect.Lists;
import com.yohobuy.ufo.model.order.common.OrderCodeType;
import com.yohobuy.ufo.model.order.resp.OrderGoodsFindBO;
import com.yohobuy.ufo.model.resp.product.ProductResponceBo;
import com.yohoufo.dal.order.BuyerOrderGoodsMapper;
import com.yohoufo.dal.order.SellerOrderGoodsMapper;
import com.yohoufo.dal.order.SellerOrderMapper;
import com.yohoufo.dal.order.model.BuyerOrderGoods;
import com.yohoufo.dal.order.model.SellerOrder;
import com.yohoufo.dal.order.model.SellerOrderGoods;
import com.yohoufo.order.service.support.codegenerator.OrderCodeGenerator;
import lombok.val;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Service
public class OrderGoodsFinder {
@Autowired
private BuyerOrderGoodsMapper buyerOrderGoodsMapper;
@Autowired
private SellerOrderMapper sellerOrderMapper;
@Autowired
private SellerOrderGoodsMapper sellerOrderGoodsMapper;
@Autowired
private OrderCodeGenerator orderCodeGenerator;
public List<OrderGoodsFindBO> find(List<Long> orderCodes) {
val orderCodeHoldList = orderCodes.stream()
.map(orderCode -> Pair.of(orderCode, orderCodeGenerator.expId(orderCode)))
.collect(Collectors.toList());
val buyerOrderCodeList = orderCodeHoldList.stream()
.filter(e -> e.getRight().getType() == OrderCodeType.BUYER_TYPE.getType())
.map(e -> e.getLeft())
.collect(Collectors.toList());
val sellerOrderCodeList = orderCodeHoldList.stream()
.filter(e -> e.getRight().getType() == OrderCodeType.SELLER_TYPE.getType())
.map(e -> e.getLeft())
.collect(Collectors.toList());
List<Pair<Long, Integer>> orderCodeList = Lists.newArrayList();
orderCodeList.addAll(findSkupForSellerOrderCode(sellerOrderCodeList));
orderCodeList.addAll(findSkupForBuyerOrderCode(buyerOrderCodeList));
if (CollectionUtils.isEmpty(orderCodeList)) {
return Lists.newArrayList();
}
val skupList = orderCodeList.stream()
.map(e -> e.getRight())
.collect(Collectors.toList());
List<SellerOrderGoods> sellerOrderGoodsList = sellerOrderGoodsMapper.selectBySkups(skupList);
return orderCodeList.stream()
.map(order -> sellerOrderGoodsList.stream()
.filter(e -> Objects.equals(e.getId(), order.getRight()))
.findFirst()
.map(e -> {
OrderGoodsFindBO bo = new OrderGoodsFindBO();
bo.setOrderCode(order.getLeft());
bo.setProductName(e.getProductName());
return bo;
})
.orElse(null)
)
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
private List<Pair<Long, Integer>> findSkupForSellerOrderCode(List<Long> sellerOrderCodeList) {
if (CollectionUtils.isEmpty(sellerOrderCodeList)) {
return Lists.newArrayList();
}
List<SellerOrder> sellerOrders = sellerOrderMapper.selectByOrderCodes(sellerOrderCodeList);
return sellerOrders.stream()
.map(e -> Pair.of(e.getOrderCode(), e.getSkup()))
.collect(Collectors.toList());
}
private List<Pair<Long, Integer>> findSkupForBuyerOrderCode(List<Long> buyerOrderCodeList) {
if (CollectionUtils.isEmpty(buyerOrderCodeList)) {
return Lists.newArrayList();
}
List<BuyerOrderGoods> buyerOrderGoodsList = buyerOrderGoodsMapper.selectByOrderCodes(buyerOrderCodeList);
return buyerOrderGoodsList.stream()
.map(e -> Pair.of(e.getOrderCode(), e.getSkup()))
.collect(Collectors.toList());
}
}
... ...
package com.yohoufo.order.service;
import com.google.common.collect.Lists;
import com.yohobuy.ufo.model.order.common.OrderAttributes;
import com.yohobuy.ufo.model.order.common.OrderCodeType;
import com.yohobuy.ufo.model.order.common.PayChannelType;
import com.yohoufo.dal.order.AppraiseOrderMapper;
import com.yohoufo.dal.order.BuyerOrderGoodsMapper;
import com.yohoufo.dal.order.BuyerOrderMapper;
import com.yohoufo.dal.order.SellerOrderGoodsMapper;
import com.yohoufo.dal.order.model.AppraiseOrder;
import com.yohoufo.dal.order.model.BuyerOrder;
import com.yohoufo.dal.order.model.BuyerOrderGoods;
import com.yohoufo.dal.order.model.SellerOrderGoods;
import com.yohoufo.order.service.support.codegenerator.OrderCodeGenerator;
import com.yohoufo.order.service.support.codegenerator.bean.CodeMeta;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class PaymentSupportService {
@Autowired
OrderCodeGenerator orderCodeGenerator;
@Autowired
BuyerOrderMapper buyerOrderMapper;
@Autowired
BuyerOrderGoodsMapper buyerOrderGoodsMapper;
@Autowired
SellerOrderGoodsMapper sellerOrderGoodsMapper;
@Autowired
AppraiseOrderMapper appraiseOrderMapper;
/**
* 是否禁止虚拟支付
* @param orderCode
* @return
*/
public boolean isForbidVirtualPayChannel(long orderCode){
List<PayChannelType> payChannelTypeList = getPayChannelType(orderCode);
return payChannelTypeList.size()==1 && payChannelTypeList.contains(PayChannelType.REAL);
}
/**
* 虚拟支付
* @param orderCode
* @return
*/
public List<PayChannelType> getPayChannelType(long orderCode){
CodeMeta codeMeta = orderCodeGenerator.expId(orderCode);
// 商家入驻保证金 ==> 用户入驻缴纳的保证金以及充值的保证金
if (codeMeta.getType() == OrderCodeType.SELLER_RECHARGE_EARNEST_TYPE.getType()){
return Lists.newArrayList(PayChannelType.REAL);
}
// 个人卖家上架保证金 ==> 用户没有入驻,上架商品缴纳的保证金
else if (codeMeta.getType() == OrderCodeType.SELLER_TYPE.getType()){
Pair<Integer, Integer> attributes = getOrderAttributes(orderCode);
// 海外
if (attributes.getRight() != null
&& (attributes.getRight() == OrderAttributes.OVERSEAS_IN_STOCK.getCode()
|| attributes.getRight() == OrderAttributes.OVERSEAS_PRE_SALE.getCode())){
return Lists.newArrayList(PayChannelType.CROSS_BORDER);
}else{
return Lists.newArrayList(PayChannelType.REAL);
}
}
else if (codeMeta.getType() == OrderCodeType.BUYER_TYPE.getType()){
Pair<Integer, Integer> attributes = getOrderAttributes(orderCode);
// 闪购寄存
if (attributes.getLeft()!=null
&& attributes.getRight()!=null
&& attributes.getLeft() == OrderAttributes.DEPOSITE.getCode()
&& attributes.getRight() == OrderAttributes.QUICK_DELIVER.getCode()){
return Lists.newArrayList(PayChannelType.REAL);
}else{
return Lists.newArrayList(PayChannelType.REAL, PayChannelType.VIRTUAL);
}
}
// 寄售保证金 and 实物鉴定
else if (codeMeta.getType() == OrderCodeType.GOODS_SERVICE.getType()){
AppraiseOrder appraiseOrder = appraiseOrderMapper.selectByOrderCode(orderCode);
if (appraiseOrder != null){
if (appraiseOrder.getAttributes() == OrderAttributes.DEPOSITE.getCode()){
return Lists.newArrayList(PayChannelType.REAL);
}else if(appraiseOrder.getAttributes() == OrderAttributes.APPRAISE.getCode()){
return Lists.newArrayList(PayChannelType.REAL, PayChannelType.VIRTUAL);
}
}
}
// 寄存续约费 寄存滞纳金 寄存召回运费
else if(codeMeta.getType() == OrderCodeType.STORAGE_MANAGEMENT.getType()){
return Lists.newArrayList(PayChannelType.REAL);
}
return Lists.newArrayList(PayChannelType.REAL, PayChannelType.VIRTUAL);
}
private Pair<Integer, Integer> getOrderAttributes(long orderCode){
BuyerOrder buyerOrder = buyerOrderMapper.selectByOrderCode(orderCode);
if (buyerOrder != null){
BuyerOrderGoods buyerOrderGoods = buyerOrderGoodsMapper.selectOnlyByOrderCode(orderCode);
if (buyerOrderGoods != null){
SellerOrderGoods sellerOrder = sellerOrderGoodsMapper.selectByPrimaryKey(buyerOrderGoods.getSkup());
return Pair.of(buyerOrder.getAttributes(), sellerOrder.getAttributes());
}
}
return Pair.of(null, null);
}
}
... ...
... ... @@ -157,11 +157,8 @@ public class SellerOrderPaymentService extends AbstractOrderPaymentService {
.sellerUid(orderInfo.getUid()).skup(skup).build();
EventBusPublisher.publishEvent(sopcEvent);
//
cacheCleaner.cleanSellerOrderDetailAndList(sellerOrderGoods, sellerOrder.getOrderCode());
cacheCleaner.delete(Arrays.asList(CacheKeyBuilder.orderListKey(sellerUid, TabType.SELL.getValue()),
CacheKeyBuilder.sellerOrderDetailKey(sellerOrderGoods),
CacheKeyBuilder.orderDetailKey(sellerUid, TabType.SELL.getValue(), sellerOrder.getOrderCode())
));
}
... ...
... ... @@ -10,7 +10,9 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
/**
* Created by chenchao on 2018/10/16.
... ... @@ -23,9 +25,9 @@ public class CacheCleaner {
private YHRedisTemplate redis;
public void cleanList(int uid, String tabType){
RedisKeyBuilder orderListKey = buildOrderList(uid, tabType);
List<RedisKeyBuilder> keyBuilders = Lists.newArrayList(orderListKey);
RedisKeyBuilder orderListKey = CacheKeyBuilder.orderListKey(uid, tabType);
RedisKeyBuilder orderListSummarykey = CacheKeyBuilder.sellerSaleGoodsSummarykey(uid, tabType);
List<RedisKeyBuilder> keyBuilders = Lists.newArrayList(orderListKey, orderListSummarykey);
delete(keyBuilders);
}
... ... @@ -55,8 +57,41 @@ public class CacheCleaner {
}
}
public void cleanBuyerOrder(Integer buyerUid, Long orderCode){
List<RedisKeyBuilder> keyBuilders = Arrays.asList(
CacheKeyBuilder.orderListKey(buyerUid, TabType.BUY.getValue()),
CacheKeyBuilder.orderDetailKey(buyerUid, TabType.BUY.getValue(), orderCode),
CacheKeyBuilder.buyerOrderNums(buyerUid));
delete(keyBuilders);
}
public void cleanSellerOrderDetailAndList(SellerOrderGoods sellerOrderGoods,Long orderCode){
int sellerUid = sellerOrderGoods.getUid();
TabType tabType = TabType.SELL;
List<RedisKeyBuilder> keyBuilders = Lists.newArrayList(CacheKeyBuilder.orderListKey(sellerUid, tabType.getValue()),
CacheKeyBuilder.sellerOrderDetailKey(sellerOrderGoods),
CacheKeyBuilder.sellerSaleGoodsSummarykey(sellerUid, tabType.getValue())
);
if (Objects.nonNull(orderCode)){
keyBuilders.add(CacheKeyBuilder.orderDetailKey(sellerUid, tabType.getValue(), orderCode));
}
delete(keyBuilders);
}
public void cleanSellerAndBuyerOrderDetailAndList(int sellerUid,int buyerUid, Long buyerOrderCode){
List<RedisKeyBuilder> keyBuilders = buildSellerAndBuyerOrderKeys(sellerUid, buyerUid, buyerOrderCode);
delete(keyBuilders);
}
public RedisKeyBuilder buildOrderList(int uid, String tabType){
return CacheKeyBuilder.orderListKey(uid, tabType);
public static List<RedisKeyBuilder> buildSellerAndBuyerOrderKeys(int sellerUid,int buyerUid, Long buyerOrderCode){
List<RedisKeyBuilder> keyBuilders = Arrays.asList(
CacheKeyBuilder.orderListKey(sellerUid, TabType.SELL.getValue()),
CacheKeyBuilder.orderListKey(buyerUid, TabType.BUY.getValue()),
CacheKeyBuilder.orderDetailKey(sellerUid, TabType.SELL.getValue(), buyerOrderCode),
CacheKeyBuilder.orderDetailKey(buyerUid, TabType.BUY.getValue(), buyerOrderCode),
CacheKeyBuilder.buyerOrderNums(buyerUid),
CacheKeyBuilder.sellerSaleGoodsSummarykey(sellerUid, TabType.SELL.getValue()));
return keyBuilders;
}
}
... ...
package com.yohoufo.order.service.cache;
import com.yoho.core.redis.cluster.operations.serializer.RedisKeyBuilder;
import com.yohobuy.ufo.model.order.common.TabType;
import com.yohoufo.common.cache.CacheKeyEnum;
import com.yohoufo.dal.order.model.SellerOrderGoods;
import com.yohoufo.order.model.request.OrderListRequest;
import org.slf4j.helpers.MessageFormatter;
import java.math.BigDecimal;
import java.util.Objects;
/**
* Created by chenchao on 2018/10/16.
*/
public class CacheKeyBuilder {
private static String SEPARATOR = ":";
public enum PatternKeyTemplate{
/**
* 订单列表总数
*/
ORDER_LIST_COUNT("count"),
/**
* 订单列表分页
*/
ORDER_LIST_PAGE_LIMIT("type:{}:page:{}:limit:{}"),
SELLER_ORDER_LIST_PAGE_LIMIT("type:{}:skupList:{}:limit:{}");
private final String keyPattern;
PatternKeyTemplate(String keyPattern) {
this.keyPattern = keyPattern;
}
public String getKey(Object... params) {
return MessageFormatter.arrayFormat(keyPattern, params).getMessage();
}
public String getKeyPattern() {
return keyPattern;
}
}
public enum KeyTemp{
ORDER_LIST("ufo:order:orderList:","uid:{}:tabType:{}"),
ORDER_DETAIL("ufo:order:orderDetail:", "uid:{}:tabType:{}:orderCode:{}"),
SELLER_ORDER_DETAIL("ufo:order:orderDetail:", "uid:{}:tabType:{}:batchNo:{}:price{}:status{}"),
BUYER_ORDER_NUMS("ufo:order:buyer:orderNums:", "uid:{}"),
CMS_PAY("ufo:payment:cms:pay",""),
BUYER_CANCEL_PENALTY("ufo:order:buyer:cancel:penalty:config", ""),
ENTRY_THRESHOLD("ufo:order:seller:entry:threshold", ""),
SELLER_BASE_FUNC_CONFIG("ufo:order:seller:base:func:Config", ""),
SELLER_LEVEL_FUNC_CONFIG("ufo:order:seller:stageLevel:func:Config", ""),
ORDER_DELIVER_NOTICE_TIMES("ufo:order:deliver:","orderCode:{}:date:{}:times"),
SELLER_PENALTY_CONFIG("ufo:order:seller:penalty:config", ""),
SELLER_EARNEST_MONEY_CONFIG("ufo:order:seller:earnestMoney:config",""),
PRESALE_THRESHOLD("ufo:order:presale:threshold", ""),
ORDER_CODE_RULE("ufo:order:code:rule", ""),
SELLER_GOODS_FEE_RATE("ufo:order:seller:goods:service:feeRate", ""),
SELLER_GOODS_PLATFORM_FEE("ufo:order:seller:goods:platform:fee", ""),
BUYER_ORDER_FEE("ufo:order:buyer:order:fee",""),
BUYER_ORDER_CUT_POLICY("ufo:buyer:order:cut:policy:","type:{}"),
LARGE_SETTLEMENT_SUPER_NOTICE_WALLET_NOT_ENOUGH("ufo:seller:largeSettlement:walletNotEnough:notice:","uid:{}:funcLevel:{}:cnt"),
DEPOSIT_PLATFORM_FEE("ufo:order:deposit:platform:fee", ""),
SELLER_SALE_PRICE_LIMIT("ufo:order:seller:salePrice:limit:config",""),
//求购定金
BID_DEPOSIT_FEE("ufo:order:bid:deposit:fee:config","")
;
private String fix;
private String placeHolder;
KeyTemp(String fix, String placeHolder) {
this.fix = fix;
this.placeHolder = placeHolder;
}
public String fillPlaceHolder(Object[] args){
if (placeHolder == null){
return null;
}
return MessageFormatter.arrayFormat(placeHolder, args).getMessage();
}
public RedisKeyBuilder builderKey(Object[] args){
String appendPart = fillPlaceHolder(args);
return new RedisKeyBuilder().appendFixed(fix).appendVar(appendPart);
}
public RedisKeyBuilder builderKeyOnlyFixed(){
return new RedisKeyBuilder().appendFixed(fix);
}
}
public static RedisKeyBuilder orderListKey(int uid, String tabType){
return KeyTemp.ORDER_LIST.builderKey(new Object[]{uid, tabType});
}
public static String orderListHashKey(OrderListRequest req){
return PatternKeyTemplate.ORDER_LIST_PAGE_LIMIT.getKey(req.getType(), req.getPage(), req.getLimit());
}
public static RedisKeyBuilder buyerOrderNums(int uid){
return KeyTemp.BUYER_ORDER_NUMS.builderKey(new Object[]{uid});
}
public static RedisKeyBuilder cmsPay(){
return KeyTemp.CMS_PAY.builderKeyOnlyFixed();
}
public static String skupListHashKey(OrderListRequest req){
return PatternKeyTemplate.SELLER_ORDER_LIST_PAGE_LIMIT.getKey(req.getType(), req.getSkupList(), req.getLimit());
}
public static String orderListCntHashKey(){
return PatternKeyTemplate.ORDER_LIST_COUNT.getKeyPattern();
}
public static RedisKeyBuilder sellerOrderDetailKey(SellerOrderGoods sog){
if (Objects.isNull(sog)){
return null;
}
String actor = TabType.SELL.getValue();
int uid = sog.getUid();
long batchNo = sog.getBatchNo();
BigDecimal price = sog.getGoodsPrice();
Integer status = sog.getStatus();
return KeyTemp.SELLER_ORDER_DETAIL.builderKey(new Object[]{uid, actor, batchNo, price, status});
}
public static RedisKeyBuilder orderDetailKey(int uid, String actor, long orderCode){
return KeyTemp.ORDER_DETAIL.builderKey(new Object[]{uid, actor, orderCode});
}
public static RedisKeyBuilder superEntrySellerListKey(CacheKeyEnum cke){
return cke.getKey();
}
public static RedisKeyBuilder buyerCancelPenaltyConfigKey(){
return KeyTemp.BUYER_CANCEL_PENALTY.builderKeyOnlyFixed();
}
public static RedisKeyBuilder entryThresholdConfigKey(){
return KeyTemp.ENTRY_THRESHOLD.builderKeyOnlyFixed();
}
public static RedisKeyBuilder sellerBaseFuncConfigKey(){
return KeyTemp.SELLER_BASE_FUNC_CONFIG.builderKeyOnlyFixed();
}
public static RedisKeyBuilder sellerFuncLevelConfigKey(){
return KeyTemp.SELLER_LEVEL_FUNC_CONFIG.builderKeyOnlyFixed();
}
public static RedisKeyBuilder orderDeliverNoticeTimesKey(long orderCode, String date){
return KeyTemp.ORDER_DELIVER_NOTICE_TIMES.builderKey(new Object[]{orderCode, date});
}
public static RedisKeyBuilder noticeLargeSettlementSuperWalletNotEnoughKey(int uid, int funcLevel){
return KeyTemp.LARGE_SETTLEMENT_SUPER_NOTICE_WALLET_NOT_ENOUGH.builderKey(new Object[]{uid, funcLevel});
}
}
package com.yohoufo.order.service.cache;
import com.yoho.core.redis.cluster.operations.serializer.RedisKeyBuilder;
import com.yohobuy.ufo.model.order.common.TabType;
import com.yohoufo.common.cache.CacheKeyEnum;
import com.yohoufo.dal.order.model.SellerOrderGoods;
import com.yohoufo.order.model.request.OrderListRequest;
import org.slf4j.helpers.MessageFormatter;
import java.math.BigDecimal;
import java.util.Objects;
/**
* Created by chenchao on 2018/10/16.
*/
public class CacheKeyBuilder {
private final static String DISTRIBUTED_LOCK_PREFIX = "ufo:order:lock:";
private static String SEPARATOR = ":";
public enum PatternKeyTemplate{
/**
* 订单列表总数
*/
ORDER_LIST_COUNT("count"),
/**
* 订单列表分页
*/
ORDER_LIST_PAGE_LIMIT("type:{}:page:{}:limit:{}"),
SELLER_ORDER_LIST_PAGE_LIMIT("type:{}:skupList:{}:limit:{}"),
/**
* 卖家出售列表 tab
*/
SELLER_SALE_GOODS_TABLIST_SUMMARY("saleGoods:tabList:summary");
private final String keyPattern;
PatternKeyTemplate(String keyPattern) {
this.keyPattern = keyPattern;
}
public String getKey(Object... params) {
return MessageFormatter.arrayFormat(keyPattern, params).getMessage();
}
public String getKeyPattern() {
return keyPattern;
}
}
public enum KeyTemp{
ORDER_LIST("ufo:order:orderList:","uid:{}:tabType:{}"),
ORDER_DETAIL("ufo:order:orderDetail:", "uid:{}:tabType:{}:orderCode:{}"),
SELLER_ORDER_DETAIL("ufo:order:orderDetail:", "uid:{}:tabType:{}:batchNo:{}:price{}:status{}"),
BUYER_ORDER_NUMS("ufo:order:buyer:orderNums:", "uid:{}"),
CMS_PAY("ufo:payment:cms:pay",""),
BUYER_CANCEL_PENALTY("ufo:order:buyer:cancel:penalty:config", ""),
ENTRY_THRESHOLD("ufo:order:seller:entry:threshold", ""),
SELLER_BASE_FUNC_CONFIG("ufo:order:seller:base:func:Config", ""),
SELLER_LEVEL_FUNC_CONFIG("ufo:order:seller:stageLevel:func:Config", ""),
ORDER_DELIVER_NOTICE_TIMES("ufo:order:deliver:","orderCode:{}:date:{}:times"),
SELLER_PENALTY_CONFIG("ufo:order:seller:penalty:config", ""),
SELLER_EARNEST_MONEY_CONFIG("ufo:order:seller:earnestMoney:config",""),
PRESALE_THRESHOLD("ufo:order:presale:threshold", ""),
ORDER_CODE_RULE("ufo:order:code:rule", ""),
SELLER_GOODS_FEE_RATE("ufo:order:seller:goods:service:feeRate", ""),
SELLER_GOODS_PLATFORM_FEE("ufo:order:seller:goods:platform:fee", ""),
BUYER_ORDER_FEE("ufo:order:buyer:order:fee",""),
BUYER_ORDER_CUT_POLICY("ufo:buyer:order:cut:policy:","type:{}"),
LARGE_SETTLEMENT_SUPER_NOTICE_WALLET_NOT_ENOUGH("ufo:seller:largeSettlement:walletNotEnough:notice:","uid:{}:funcLevel:{}:cnt"),
DEPOSIT_PLATFORM_FEE("ufo:order:deposit:platform:fee", ""),
SELLER_SALE_PRICE_LIMIT("ufo:order:seller:salePrice:limit:config",""),
//求购定金
BID_DEPOSIT_FEE("ufo:order:bid:deposit:fee:config",""),
DISTRIBUTED_LOCK_DEPOSIT_GOODS(DISTRIBUTED_LOCK_PREFIX, "depositCode:{}"),
SELLER_SALE_GOODS_SUMMARY("ufo:order:summary:","uid:{}:tabType:{}"),
;
private String fix;
private String placeHolder;
KeyTemp(String fix, String placeHolder) {
this.fix = fix;
this.placeHolder = placeHolder;
}
public String fillPlaceHolder(Object[] args){
if (placeHolder == null){
return null;
}
return MessageFormatter.arrayFormat(placeHolder, args).getMessage();
}
public RedisKeyBuilder builderKey(Object[] args){
String appendPart = fillPlaceHolder(args);
return new RedisKeyBuilder().appendFixed(fix).appendVar(appendPart);
}
public RedisKeyBuilder builderKeyOnlyFixed(){
return new RedisKeyBuilder().appendFixed(fix);
}
}
public static RedisKeyBuilder orderListKey(int uid, String tabType){
return KeyTemp.ORDER_LIST.builderKey(new Object[]{uid, tabType});
}
public static String orderListHashKey(OrderListRequest req){
return PatternKeyTemplate.ORDER_LIST_PAGE_LIMIT.getKey(req.getType(), req.getPage(), req.getLimit());
}
public static RedisKeyBuilder buyerOrderNums(int uid){
return KeyTemp.BUYER_ORDER_NUMS.builderKey(new Object[]{uid});
}
public static RedisKeyBuilder cmsPay(){
return KeyTemp.CMS_PAY.builderKeyOnlyFixed();
}
public static String skupListHashKey(OrderListRequest req){
return PatternKeyTemplate.SELLER_ORDER_LIST_PAGE_LIMIT.getKey(req.getType(), req.getSkupList(), req.getLimit());
}
public static String orderListCntHashKey(){
return PatternKeyTemplate.ORDER_LIST_COUNT.getKeyPattern();
}
public static RedisKeyBuilder sellerOrderDetailKey(SellerOrderGoods sog){
if (Objects.isNull(sog)){
return null;
}
String actor = TabType.SELL.getValue();
int uid = sog.getUid();
long batchNo = sog.getBatchNo();
BigDecimal price = sog.getGoodsPrice();
Integer status = sog.getStatus();
return KeyTemp.SELLER_ORDER_DETAIL.builderKey(new Object[]{uid, actor, batchNo, price, status});
}
public static RedisKeyBuilder orderDetailKey(int uid, String actor, long orderCode){
return KeyTemp.ORDER_DETAIL.builderKey(new Object[]{uid, actor, orderCode});
}
public static RedisKeyBuilder superEntrySellerListKey(CacheKeyEnum cke){
return cke.getKey();
}
public static RedisKeyBuilder buyerCancelPenaltyConfigKey(){
return KeyTemp.BUYER_CANCEL_PENALTY.builderKeyOnlyFixed();
}
public static RedisKeyBuilder entryThresholdConfigKey(){
return KeyTemp.ENTRY_THRESHOLD.builderKeyOnlyFixed();
}
public static RedisKeyBuilder sellerBaseFuncConfigKey(){
return KeyTemp.SELLER_BASE_FUNC_CONFIG.builderKeyOnlyFixed();
}
public static RedisKeyBuilder sellerFuncLevelConfigKey(){
return KeyTemp.SELLER_LEVEL_FUNC_CONFIG.builderKeyOnlyFixed();
}
public static RedisKeyBuilder orderDeliverNoticeTimesKey(long orderCode, String date){
return KeyTemp.ORDER_DELIVER_NOTICE_TIMES.builderKey(new Object[]{orderCode, date});
}
public static RedisKeyBuilder noticeLargeSettlementSuperWalletNotEnoughKey(int uid, int funcLevel){
return KeyTemp.LARGE_SETTLEMENT_SUPER_NOTICE_WALLET_NOT_ENOUGH.builderKey(new Object[]{uid, funcLevel});
}
public static RedisKeyBuilder depositGoodsDistributedLockKey(String depositCode){
return KeyTemp.DISTRIBUTED_LOCK_DEPOSIT_GOODS.builderKey(new Object[]{depositCode});
}
public static RedisKeyBuilder sellerSaleGoodsSummarykey(int uid, String tabType){
return KeyTemp.SELLER_SALE_GOODS_SUMMARY.builderKey(new Object[]{uid, tabType});
}
public static String sellerSaleGoodsSummaryHashKey(){
return PatternKeyTemplate.SELLER_SALE_GOODS_TABLIST_SUMMARY.getKeyPattern();
}
}
... ...
... ... @@ -22,4 +22,8 @@ public interface ExpiredTime {
* TODO 以后有需要 细化各个key
*/
int ORDER_BASE_CONFIG = 300;
int DISTRIBUTED_LOCK_DEPOSIT_GOODS = 5;
int SELLER_SALE_GOODS_TAB_LIST_SUMMARY = 300;
}
... ...
package com.yohoufo.order.service.cache;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.yoho.core.redis.cluster.operations.serializer.RedisKeyBuilder;
import com.yohobuy.ufo.model.order.common.TabType;
import com.yohobuy.ufo.model.order.resp.BuyerOrderNums;
... ... @@ -10,12 +12,15 @@ import com.yohoufo.common.cache.SnappyZipUtils;
import com.yohoufo.dal.order.model.SellerOrderGoods;
import com.yohoufo.order.model.request.OrderListRequest;
import com.yohobuy.ufo.model.order.resp.OrderDetailInfo;
import com.yohoufo.order.model.response.OrderSummaryResp;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* Created by chenchao on 2018/10/16.
*/
... ... @@ -46,6 +51,27 @@ public class OrderCacheService {
return cacheClient.hashGet(key, hashKey, Integer.class);
}
public void cacheSellerSaleGoodsTabSummary(int uid,List<OrderSummaryResp> list){
TabType actor = TabType.SELL;
String key = CacheKeyBuilder.sellerSaleGoodsSummarykey(uid, actor.getValue()).getKey();
String hashKey = CacheKeyBuilder.sellerSaleGoodsSummaryHashKey();
String value = JSONObject.toJSONString(list);
cacheClient.hashPut(key, hashKey, value, ExpiredTime.SELLER_SALE_GOODS_TAB_LIST_SUMMARY);
}
public List<OrderSummaryResp> getSellerSaleGoodsTabSummary(int uid){
TabType actor = TabType.SELL;
String key = CacheKeyBuilder.sellerSaleGoodsSummarykey(uid, actor.getValue()).getKey();
String hashKey = CacheKeyBuilder.sellerSaleGoodsSummaryHashKey();
String strValue = cacheClient.hashGet(key, hashKey, String.class);
List<OrderSummaryResp> list = null;
if (StringUtils.isNotBlank(strValue)){
list = JSONObject.parseObject(strValue, new TypeReference<List<OrderSummaryResp>>(){});
logger.info("hit cache key {} hashKey {} value {}", key, hashKey, strValue);
}
return list;
}
public void cacheSkupList(OrderListRequest req, OrderListVo orderListInfos){
String hashKey = CacheKeyBuilder.skupListHashKey(req);
... ...
... ... @@ -10,12 +10,23 @@ import java.util.concurrent.*;
public class ThreadPoolFactory {
static class GoodKids{
private static ForkJoinPool forkJoinPool ;
private static ThreadPoolExecutor threadpool ;
private final static ForkJoinPool forkJoinPool ;
private final static ThreadPoolExecutor threadpool ;
private final static ExecutorService executorService ;
private final static ExecutorService appraiseExecutorService;
private final static ExecutorService depositRebateExecutorService;
static {
int numberOfProcessorsAvailable = Runtime.getRuntime().availableProcessors();
forkJoinPool = new ForkJoinPool(6);
threadpool = new ThreadPoolExecutor(4, 10, 60, TimeUnit.SECONDS,
threadpool = new ThreadPoolExecutor(numberOfProcessorsAvailable, numberOfProcessorsAvailable*2, 60, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(100), NamedThreadFactory.newThreadFactory("buyer-cancel-order"));
executorService = Executors.newFixedThreadPool(numberOfProcessorsAvailable * 2);
//appraise
appraiseExecutorService = new ThreadPoolExecutor(numberOfProcessorsAvailable, numberOfProcessorsAvailable * 2, 60, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(1000), NamedThreadFactory.newThreadFactory("appraise"));
//
depositRebateExecutorService = new ThreadPoolExecutor(numberOfProcessorsAvailable , numberOfProcessorsAvailable * 2, 60, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(10), NamedThreadFactory.newThreadFactory("depositRebate"));
}
... ... @@ -29,4 +40,17 @@ public class ThreadPoolFactory {
public static ThreadPoolExecutor getBuyerCancelThreadPool(){
return GoodKids.threadpool;
}
public static ExecutorService getCommomExecutorService(){
return GoodKids.executorService;
}
public static ExecutorService getAppraiseExecutorService(){
return GoodKids.appraiseExecutorService;
}
public static ExecutorService getDepositRebateExecutorService(){
return GoodKids.depositRebateExecutorService;
}
}
... ...
... ... @@ -4,6 +4,7 @@ import com.google.common.collect.Sets;
import com.yohoufo.order.model.dto.SellerTaskDTO;
import com.yohoufo.order.model.dto.SellerTaskResult;
import com.yohoufo.order.service.cache.CacheCleaner;
import com.yohoufo.order.service.concurrent.ThreadPoolFactory;
import com.yohoufo.order.service.proxy.InBoxFacade;
import com.yohoufo.order.utils.LoggerUtils;
import org.apache.commons.collections.CollectionUtils;
... ... @@ -23,7 +24,7 @@ public abstract class AbstractSellerTaskHandler<T> implements ISellerTaskHandler
protected final Logger log = LoggerUtils.getSellerOrderLogger();
private final static ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);
@Autowired
protected InBoxFacade inBoxFacade;
... ... @@ -51,6 +52,7 @@ public abstract class AbstractSellerTaskHandler<T> implements ISellerTaskHandler
if (CollectionUtils.isEmpty(futureTasks)) {
return;
}
final ExecutorService executorService = ThreadPoolFactory.getCommomExecutorService();
for (FutureTask task : futureTasks) {
//线程池执行
executorService.submit(task);
... ...
... ... @@ -48,8 +48,7 @@ public class BuyerCancelCompensateComputeHandler {
BigDecimal orderActualAmount = buyerOrder.getAmount();
BigDecimal goodsActualAmount = buyerOrderGoods.getGoodsAmount();
OrderAttributes orderAttributes = OrderAttributes.getOrderAttributes(buyerOrder.getAttributes());
BuyerPenaltyCalResult bpcr = calBuyerPenalty(buyerUid, orderCode, targetStatus, orderActualAmount, goodsActualAmount, orderAttributes);
return bpcr;
return calBuyerPenalty(buyerUid, orderCode, targetStatus, orderActualAmount, goodsActualAmount, orderAttributes);
}
/**
... ... @@ -78,14 +77,10 @@ public class BuyerCancelCompensateComputeHandler {
.diffTime(diffTime)
.select()
.orElseThrow(() -> new UfoServiceException(501, "not match calFee"));
BuyerPenaltyCalResult bpcr = calBuyerPenalty(penaltyRule, buyerUid, orderCode, orderActualAmount, goodsActualAmount);
if (bpcr.getLeftAmount().compareTo(BigDecimal.ZERO) <= 0) {
throw new UfoServiceException(501, "left amount not enough");
}
return bpcr;
return calBuyerPenalty(penaltyRule, buyerUid, orderCode, orderActualAmount, goodsActualAmount);
}
public BuyerPenaltyCalResult calBuyerPenalty(PenaltyRule penaltyRule, Integer buyerUid, Long orderCode,
private BuyerPenaltyCalResult calBuyerPenalty(PenaltyRule penaltyRule, Integer buyerUid, Long orderCode,
BigDecimal orderActualAmount, BigDecimal goodsActualAmount) {
BigDecimal penaltyRate = penaltyRule.getPenaltyRate();
BigDecimal penaltyAmount = BigDecimalHelper.halfUp(goodsActualAmount.multiply(penaltyRate));
... ... @@ -95,6 +90,10 @@ public class BuyerCancelCompensateComputeHandler {
if (Objects.nonNull(penaltyRule.getPenaltyMaxAmount()) && penaltyAmount.compareTo(penaltyRule.getPenaltyMaxAmount()) > 0) {
penaltyAmount = penaltyRule.getPenaltyMaxAmount();
}
// 如果赔偿金额大于支付金额
if (penaltyAmount.compareTo(orderActualAmount) > 0){
penaltyAmount = orderActualAmount;
}
BigDecimal leftAmount = orderActualAmount.subtract(penaltyAmount);
BuyerPenaltyCalResult bpcr = BuyerPenaltyCalResult.builder()
.uid(buyerUid).orderCode(orderCode)
... ...
... ... @@ -101,6 +101,12 @@ public class SellerDownShelfTaskHandler extends AbstractSellerTaskHandler<SkupDo
}
try {
if (SellerGoodsHelper.isFastDelivery(sdspDto.getSkupType())){
//清理缓存
cleanCache(uid, skupDtoMap);
return;
}
boolean isQuickDeliver = SellerGoodsHelper.isQuickDeliver(sdspDto.getSkupType());
if (!isQuickDeliver) {
boolean isSuper = sellerService.isSuperEntrySeller(uid);
... ... @@ -180,9 +186,7 @@ public class SellerDownShelfTaskHandler extends AbstractSellerTaskHandler<SkupDo
private void cleanCache(int uid, Map<Integer, SkupDto> skupDtoMap) {
try {
//clean cache
cacheCleaner.delete(Arrays.asList(CacheKeyBuilder.orderListKey(uid, TabType.SELL.getValue()),
CacheKeyBuilder.sellerOrderDetailKey(skupDtoMap.values().iterator().next().getSellerOrderGoods())
));
cacheCleaner.cleanSellerOrderDetailAndList(skupDtoMap.values().iterator().next().getSellerOrderGoods(), null);
} catch (Exception ex) {
log.error("[{}-{}] exception happened when cleanCache", uid, ex);
}
... ...
... ... @@ -7,7 +7,8 @@ import com.yohobuy.ufo.model.order.bo.MerchantOrderAttachInfo;
import com.yohobuy.ufo.model.order.bo.OrderInfo;
import com.yohobuy.ufo.model.order.common.Payment;
import com.yohoufo.common.utils.DateUtil;
import com.yohoufo.dal.order.*;
import com.yohoufo.dal.order.OrdersPayMapper;
import com.yohoufo.dal.order.OrdersPayRefundMapper;
import com.yohoufo.dal.order.model.OrdersPay;
import com.yohoufo.dal.order.model.OrdersPayRefund;
import com.yohoufo.order.constants.RefundContant;
... ... @@ -166,9 +167,13 @@ public class RefundManager {
context.request = payRefundBo;
refundPreHandlers.forEach(refundPreHandler -> refundPreHandler.handle(context));
PayRefundBo refundBo = payService.refundOpenApi(payRefundBo);
PayRefundBo refundBo;
if (BigDecimal.valueOf(refundAmount).compareTo(BigDecimal.ZERO) == 0) {
refundBo = payRefundBo;
refundBo.setRefundStatus(RefundContant.PAYMENT_REFUND_RESULTCODE_SUCCESS);
} else {
refundBo = payService.refundOpenApi(payRefundBo);
}
context.response = refundBo;
refundPostHandlers.forEach(refundPostHandler -> refundPostHandler.handle(context));
... ...
... ... @@ -86,7 +86,8 @@ public class BuyerPenaltyRuleSelector {
triggerCaseKey = "beforeSellerDeliver";
}
//after seller deliver
else if (orderStatus == OrderStatus.BUYER_CANCEL_BEFORE_DEPOT_RECEIVE) {
else if (orderStatus == OrderStatus.BUYER_CANCEL_BEFORE_DEPOT_RECEIVE
|| orderStatus == OrderStatus.BUYER_CANCEL_BEFORE_DEPOT_RECEIVE_USE_DEPOSIT_GOODS) {
triggerCaseKey = "beforeDepotReceive";
} else {
logger.warn("buyer penalty not support order status {}", orderStatus);
... ... @@ -105,6 +106,7 @@ public class BuyerPenaltyRuleSelector {
case FLAW:
case SECOND_HAND:
case DEPOSITE:
case FAST_DELIVERY:
stockCaseName = "goodsInStock";
break;
case ADVANCE_SALE:
... ...
package com.yohoufo.order.service.handler.transfer;
import com.alibaba.fastjson.JSONObject;
import com.yoho.core.config.ConfigReader;
import com.yohoufo.dal.order.model.OrdersPayTransfer;
import com.yohoufo.dal.order.model.TradeBills;
import com.yohoufo.common.config.UfoOrderPayConfigReader;
import com.yohoufo.order.service.proxy.WalletTransferService;
import com.yohoufo.order.service.transfer.TransferResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
... ... @@ -14,31 +16,18 @@ import java.util.Date;
@Slf4j
@Service
public class AlipayTransferChancelSelector {
public class TransferChancelSelector {
private volatile String lastTransferDate = null;
@Autowired
private ConfigReader configReader;
/**
* 申请寄存返利的单数
* @return
*/
public int getDepositRebateOrderCnt(){
return configReader.getInt("ufo.order.pay.depositRebateCnt", 4);
}
private UfoOrderPayConfigReader ufoOrderPayConfigReader;
/**
* 申请寄存返利一单返利数目
* @return
*/
public double getDepositRebateAmount(){
return configReader.getDouble("ufo.order.pay.depositRebatePerAmount", 30);
}
@Autowired
private WalletTransferService walletTransferService;
public boolean isTransferWithAlipayExceedMillionTransfer() {
boolean value = configReader.getBoolean("ufo.order.pay.exceedSwitch", false);
boolean value = ufoOrderPayConfigReader.transferWithAlipayExceedMillionTransferSwitch();
if (value) {
log.info("use exceed million ufo.order.pay.exceedSwitch={}", value);
return true;
... ... @@ -47,11 +36,19 @@ public class AlipayTransferChancelSelector {
return StringUtils.equals(lastTransferDate, nowDate);
}
public boolean isTransferWithWallet(TradeBills bills) {
boolean canTransfer = walletTransferService.canTransfer(bills);
boolean open = ufoOrderPayConfigReader.transferWithWalletSwitch();
return canTransfer && open;
}
public boolean isTransferWithWallet(Integer interfaceType) {
return OrdersPayTransfer.INTERFACE_TYPE_TRANSFER_WALLET.equals(interfaceType);
}
public boolean isStopTransferWithAlipay(){
boolean isStop = configReader.getBoolean("ufo.order.pay.isStop.transfer", false);
log.info("zk config [ufo.order.pay.isStop.transfer] value {}", isStop);
return isStop;
public boolean isStopTransfer() {
return ufoOrderPayConfigReader.isStopTransfer();
}
public boolean isExceedMillion(JSONObject jsonObject) {
... ...
... ... @@ -12,25 +12,22 @@ import com.yohoufo.dal.order.model.AppraiseOrder;
import com.yohoufo.dal.order.model.AppraiseOrderGoods;
import com.yohoufo.dal.order.model.SellerWalletDetail;
import com.yohoufo.order.common.TransferCase;
import com.yohoufo.common.config.UfoOrderPayConfigReader;
import com.yohoufo.order.constants.AlarmConfig;
import com.yohoufo.order.model.request.TranseferCellNode;
import com.yohoufo.order.model.request.TransferMoneyRequest;
import com.yohoufo.order.service.IGoodsService;
import com.yohoufo.order.service.handler.transfer.AlipayTransferChancelSelector;
import com.yohoufo.order.service.concurrent.ThreadPoolFactory;
import com.yohoufo.order.service.proxy.OrderStatusFlowService;
import com.yohoufo.order.service.support.codegenerator.OrderCodeGenerator;
import com.yohoufo.order.utils.LoggerUtils;
import com.yohoufo.order.utils.NamedThreadFactory;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import java.math.BigDecimal;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
public abstract class AbsGoodsServiceOrderService implements IGoodsService {
... ... @@ -45,9 +42,6 @@ public abstract class AbsGoodsServiceOrderService implements IGoodsService {
OrderCodeGenerator orderCodeGenerator;
@Autowired
private AlipayTransferChancelSelector alipayTransferChancelSelector;
@Autowired
TransferService transferService;
@Autowired
... ... @@ -56,9 +50,10 @@ public abstract class AbsGoodsServiceOrderService implements IGoodsService {
@Autowired
AppraiseOrderGoodsMapper appraiseOrderGoodsMapper;
private ExecutorService executorService = new ThreadPoolExecutor(5, 10, 60, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(1000),
NamedThreadFactory.newThreadFactory("appraise"));
@Autowired
UfoOrderPayConfigReader ufoOrderPayConfigReader;
/**
* 申请寄存返利
... ... @@ -86,11 +81,11 @@ public abstract class AbsGoodsServiceOrderService implements IGoodsService {
List<AppraiseOrder> depositCodeList = appraiseOrderList.stream()
.filter(appraiseOrder -> appraiseOrder.getAttributes() == OrderAttributes.DEPOSITE.getCode())
.collect(Collectors.toList());
final ExecutorService executorService = ThreadPoolFactory.getDepositRebateExecutorService();
executorService.execute(() -> {
// 只返4单
int DEFAULT_REBATE_CNT = alipayTransferChancelSelector.getDepositRebateOrderCnt();
BigDecimal rebate = new BigDecimal(alipayTransferChancelSelector.getDepositRebateAmount());
int DEFAULT_REBATE_CNT = ufoOrderPayConfigReader.depositRebateCnt();
BigDecimal rebate = ufoOrderPayConfigReader.depositRebatePerAmount();
depositCodeList.stream().forEach(depositCode -> {
... ...
... ... @@ -22,28 +22,21 @@ import com.yohoufo.dal.order.AppraiseOrderMetaMapper;
import com.yohoufo.dal.order.OrdersPayTransferMapper;
import com.yohoufo.dal.order.model.*;
import com.yohoufo.order.common.ClientType;
import com.yohoufo.order.common.TransferCase;
import com.yohoufo.order.constants.AlarmConfig;
import com.yohoufo.order.constants.MetaKey;
import com.yohoufo.order.convert.AppraiseOrderGoodsConvertor;
import com.yohoufo.order.convert.SellerOrderConvertor;
import com.yohoufo.order.model.dto.AppraiseOrderContext;
import com.yohoufo.order.model.request.TranseferCellNode;
import com.yohoufo.order.model.request.TransferMoneyRequest;
import com.yohoufo.order.service.IExpressInfoService;
import com.yohoufo.order.service.IGoodsService;
import com.yohoufo.order.service.handler.GoodsServiceRefundHandler;
import com.yohoufo.order.service.handler.transfer.AlipayTransferChancelSelector;
import com.yohoufo.order.service.handler.transfer.TransferChancelSelector;
import com.yohoufo.order.service.proxy.InBoxFacade;
import com.yohoufo.order.service.proxy.ProductProxyService;
import com.yohoufo.order.service.proxy.UserProxyService;
import com.yohoufo.order.service.support.codegenerator.OrderCodeGenerator;
import com.yohoufo.order.utils.AddressHelper;
import com.yohoufo.order.utils.LoggerUtils;
import com.yohoufo.order.utils.NamedThreadFactory;
import lombok.Builder;
import lombok.Data;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
... ... @@ -54,10 +47,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
... ... @@ -99,7 +88,7 @@ public class AppraiseOrderService extends AbsGoodsServiceOrderService implements
OrderCodeGenerator orderCodeGenerator;
@Autowired
private AlipayTransferChancelSelector alipayTransferChancelSelector;
private TransferChancelSelector transferChancelSelector;
@Autowired
TransferService transferService;
... ...
package com.yohoufo.order.service.impl;
import static com.yohoufo.order.utils.ServiceExceptions.throwServiceExceptionIf;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import com.google.common.collect.Sets;
import com.yohobuy.ufo.model.enums.InboxBusinessTypeEnum;
import com.yohobuy.ufo.model.order.common.*;
import com.yohobuy.ufo.model.order.vo.AddressInfo;
import com.yohoufo.dal.order.*;
import com.yohoufo.dal.order.model.*;
import com.yohoufo.order.service.*;
import com.yohoufo.order.service.listener.BuyerOrderChangeEvent;
import com.yohoufo.order.service.seller.orderMeta.SellerAddressService;
import com.yohoufo.order.service.support.codegenerator.OrderCodeGenerator;
import com.yohoufo.order.service.support.codegenerator.bean.CodeMeta;
import com.yohoufo.order.utils.NamedThreadFactory;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.yoho.core.rabbitmq.YhProducer;
import com.yoho.error.ServiceError;
import com.yoho.error.exception.ServiceException;
import com.yohobuy.ufo.model.enums.InboxBusinessTypeEnum;
import com.yohobuy.ufo.model.order.bo.AppraiseExpressInfoBo;
import com.yohobuy.ufo.model.order.bo.MerchantOrderAttachInfo;
import com.yohobuy.ufo.model.order.common.*;
import com.yohobuy.ufo.model.order.constants.DepositOutTypeEnum;
import com.yohobuy.ufo.model.order.constants.StorageDepositStatusEnum;
import com.yohobuy.ufo.model.order.vo.AddressInfo;
import com.yohobuy.ufo.model.promotion.request.CouponSendMqBean;
import com.yohobuy.ufo.model.promotion.request.CouponSendType;
import com.yohoufo.common.ApiResponse;
... ... @@ -48,6 +21,8 @@ import com.yohoufo.common.alarm.EventBusPublisher;
import com.yohoufo.common.caller.UfoServiceCaller;
import com.yohoufo.common.constant.EnumPlatformDeliveryStatus;
import com.yohoufo.common.utils.DateUtil;
import com.yohoufo.dal.order.*;
import com.yohoufo.dal.order.model.*;
import com.yohoufo.dal.product.ProductMapper;
import com.yohoufo.dal.product.model.Product;
import com.yohoufo.order.common.RefundCase;
... ... @@ -57,32 +32,45 @@ import com.yohoufo.order.event.BillLogEvent;
import com.yohoufo.order.event.BuyerConfirmEvent;
import com.yohoufo.order.event.BuyerRefundCouponEvent;
import com.yohoufo.order.event.ErpBuyerOrderEvent;
import com.yohoufo.order.model.request.OrderRequest;
import com.yohoufo.order.model.request.PaymentRequest;
import com.yohoufo.order.model.request.SaveQualityCheckInfoRequest;
import com.yohoufo.order.model.request.TranseferCellNode;
import com.yohoufo.order.model.request.TransferMoneyRequest;
import com.yohoufo.order.model.request.*;
import com.yohoufo.order.model.response.AppraiseAddressResp;
import com.yohoufo.order.mq.TopicConstants;
import com.yohoufo.order.service.*;
import com.yohoufo.order.service.cache.CacheCleaner;
import com.yohoufo.order.service.cache.CacheKeyBuilder;
import com.yohoufo.order.service.concurrent.ThreadPoolFactory;
import com.yohoufo.order.service.handler.RefundEarnestMoneyHandler;
import com.yohoufo.order.service.handler.RefundGoodsMoneyHandler;
import com.yohoufo.order.service.handler.penalty.PenaltyResult;
import com.yohoufo.order.service.handler.penalty.SellerEarnestMoney2BuyerPenaltyCalculator;
import com.yohoufo.order.service.impl.function.BuyerNoticeSender;
import com.yohoufo.order.service.listener.BuyerOrderChangeEvent;
import com.yohoufo.order.service.listener.OrderChangeListenerContainer;
import com.yohoufo.order.service.proxy.BuyerNoticeFacade;
import com.yohoufo.order.service.proxy.InBoxFacade;
import com.yohoufo.order.service.proxy.OrderOperateRecordService;
import com.yohoufo.order.service.proxy.OrderStatusFlowService;
import com.yohoufo.order.service.proxy.ProductProxyService;
import com.yohoufo.order.service.proxy.SellerNoticeFacade;
import com.yohoufo.order.service.proxy.*;
import com.yohoufo.order.service.seller.orderMeta.SellerAddressService;
import com.yohoufo.order.service.seller.orderMeta.SellerOrderMetaService;
import com.yohoufo.order.service.seller.setting.SellerService;
import com.yohoufo.order.utils.BuyerOrderUtils;
import com.yohoufo.order.utils.PaymentHelper;
import lombok.Data;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import static com.yohoufo.common.utils.Functions.doIgnoreException;
import static com.yohoufo.order.utils.ServiceExceptions.throwServiceExceptionIf;
/**
* Created by chenchao on 2018/9/27.
... ... @@ -92,9 +80,7 @@ public class AppraiseService {
private static final Logger LOGGER = LoggerFactory.getLogger(AppraiseService.class);
private ExecutorService executorService = new ThreadPoolExecutor(5, 10, 60, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(1000),
NamedThreadFactory.newThreadFactory("appraise"));
private static final ExecutorService executorService = ThreadPoolFactory.getAppraiseExecutorService();
@Autowired
private IExpressInfoService expressInfoService;
... ... @@ -203,6 +189,13 @@ public class AppraiseService {
@Autowired
private AppraiseOrderGoodsMapper appraiseOrderGoodsMapper;
@Autowired
private IBuyerOrderMetaService buyerOrderMetaService;
@Autowired
private SellerOrderMetaService sellerOrderMetaService;
/**
* 触发物流
*/
... ... @@ -261,21 +254,50 @@ public class AppraiseService {
LOGGER.warn("deliveryGoodsToBuyer getOrderInfo order not exist, orderCode is {}", orderCode);
throw new ServiceException(ServiceError.ORDER_NULL);
}
String depositCode = buyerOrderMetaService.getDepositCode(buyerOrder.getUid(), orderCode);
boolean isDeliverByDepositGoods = StringUtils.isNotBlank(depositCode);
boolean isDeliveredBySeller = OrderStatus.SELLER_SEND_OUT.getCode() == buyerOrder.getStatus().intValue();
boolean isWaitingRecycleAppraise = isDeliverByDepositGoods && isDeliveredBySeller;
//重新走鉴定流程的
if (isWaitingRecycleAppraise){
LOGGER.info("deliveryGoodsToBuyer isWaitingRecycleAppraise orderCode {}", orderCode);
setDepositStatusOfDeliverByDepositGoods(orderCode);
return;
}
// 寄存订单 或者闪购的库存
if(BuyerOrderUtils.isDeposit(buyerOrder)){
deliveryDepositGoodsToBuyer(appraiseExpressInfoBo, buyerOrder);
} else {
deliveryNonDepositGoodsToBuyer(appraiseExpressInfoBo, buyerOrder);
}
//设置寄存状态为已发货 寄存订单 或者闪购的库存 需要修改仓库记录的发货状态
setDepositStatus(orderCode);
}
private void setDepositStatusOfDeliverByDepositGoods(Long orderCode){
StorageDeposit deposit = storageDepositMapper.selectByOrderCode(orderCode);
if(null == deposit) {
LOGGER.warn("setDepositStatusOfDeliverByDepositGoods StorageDeposit is null, orderCode {}", orderCode);
return;
}
boolean isWaitingDeliverDepositGoods = deposit.getOutType() == DepositOutTypeEnum.OUTTYPE_DEPOSIT_CHANGE_TO_IN_STOCK.getCode();
if (!isWaitingDeliverDepositGoods){
LOGGER.warn("setDepositStatusOfDeliverByDepositGoods StorageDeposit isWaitingDeliverDepositGoods false, orderCode {}", orderCode);
return;
}
LOGGER.info("setDepositStatusOfDeliverByDepositGoods ready 2 update deposit status, orderCode {}", orderCode);
int num = storageDepositMapper.updateStorageStatusEx(deposit.getDepositCode(), StorageDepositStatusEnum.HAS_OUT.getCode(), StorageDepositStatusEnum.WAITING_OUT.getCode(), null);
if (num>0){
cleanCache(deposit);
}
}
private void setDepositStatus(Long orderCode) {
StorageDeposit deposit = storageDepositMapper.selectByOrderCode(orderCode);
if(null == deposit) {
return;
}
... ... @@ -285,16 +307,20 @@ public class AppraiseService {
int num = storageDepositMapper.updateStorageStatusEx(deposit.getDepositCode(), StorageDepositStatusEnum.HAS_OUT.getCode(), StorageDepositStatusEnum.WAITING_OUT.getCode(), null);
if(num > 0) {
LOGGER.info("method setDepositStatus end, orderCode is {}", orderCode);
//清缓存
ufoServiceCaller.call("ufo.deposit.clearOrderCache", deposit.getOwnerUid(), deposit.getDepositCode()); // 清理库存详情缓存
ufoServiceCaller.call("ufo.deposit.clearUserDeposit", deposit.getOwnerUid(), deposit.getDepositCode());
cleanCache(deposit);
//发mq,延迟7天设置状态为已完成
LOGGER.info("start send storageDeposit mq,topic is {}, depositCode is {}", TopicConstants.DEPOSIT_FINISH_DELIVERY, deposit.getDepositCode());
yhProducer.send(TopicConstants.DEPOSIT_FINISH_DELIVERY, deposit, null, 7 * 24 * 60);
}
}
private void cleanCache(StorageDeposit deposit){
ufoServiceCaller.call("ufo.deposit.clearOrderCache", deposit.getOwnerUid(), deposit.getDepositCode()); // 清理库存详情缓存
ufoServiceCaller.call("ufo.deposit.clearUserDeposit", deposit.getOwnerUid(), deposit.getDepositCode());
}
private void deliveryDepositGoodsToBuyer(AppraiseExpressInfoBo appraiseExpressInfoBo, BuyerOrder buyerOrder) {
if(buyerOrder.getStatus() == OrderStatus.DONE.getCode()){
expressInfoService.deliverGoods(buyerOrder.getUid(),
... ... @@ -455,12 +481,8 @@ public class AppraiseService {
BuyerOrderGoods bog = buyerOrderGoodsMapper.selectByOrderCode(uid, orderCode);
SellerOrderGoods sellerOrderGoods = sellerOrderGoodsMapper.selectByPrimaryKey(bog.getSkup());
LOGGER.info("in appraise service cleanCacheAfterUpdateStatus begin clean cache orderCode {},uid {} ,sellerUid {}", orderCode, uid, sellerUid);
cacheCleaner.delete(Arrays.asList(CacheKeyBuilder.orderListKey(sellerUid, TabType.SELL.getValue()),
CacheKeyBuilder.orderListKey(uid, TabType.BUY.getValue()),
CacheKeyBuilder.sellerOrderDetailKey(sellerOrderGoods),
CacheKeyBuilder.orderDetailKey(sellerUid, TabType.SELL.getValue(), orderCode),
CacheKeyBuilder.orderDetailKey(uid, TabType.BUY.getValue(), orderCode),
CacheKeyBuilder.buyerOrderNums(uid)));
cacheCleaner.cleanSellerAndBuyerOrderDetailAndList(sellerUid, uid, orderCode);
ErpBuyerOrderEvent event = new ErpBuyerOrderEvent(uid);
EventBusPublisher.publishEvent(event);
... ... @@ -618,7 +640,8 @@ public class AppraiseService {
}
}
if (appraiseOrder.getAttributes() == OrderAttributes.DEPOSITE.getCode()) { // 鉴定寄存的订单,需要同步修改寄存表的状态
if (appraiseOrder.getAttributes() == OrderAttributes.DEPOSITE.getCode()) {
// 鉴定寄存的订单,需要同步修改寄存表的状态
setDepositStatus(orderCode);
}
... ... @@ -741,7 +764,7 @@ public class AppraiseService {
skup, orderCode, buyerUid);
//退款给卖家(仅退一次)
PaymentRequest refundReqOfSeller = operateMoneyWhenOk(buyerUid, orderCode, skup, sellerOrder, targetSoStatus);
PaymentRequest refundReqOfSeller = operateMoneyWhenOk(buyerUid, orderCode, sellerOrder, targetSoStatus);
//记录新的调拨信息
//记录调拨信息(只保存卖家一条)
... ... @@ -760,7 +783,7 @@ public class AppraiseService {
//记录操作记录
orderOperateRecordService.addRecord(orderCode, "买家操作", OperateTypeEnum.OPERATE_TYPE_QUALITY_MINI_FAULT_PASS);
sellerNoticeFacade.appraisePass(buyerUid, orderCode, sellerOrderGoods, true);
sellerNoticeFacade.appraisePass(buyerUid, buyerOrder, sellerOrderGoods, true);
} else {
throw new ServiceException(ServiceError.ORDER_STATUS_INVALIDATE); // 更新失败,可能是因为订单状态已经被并发修改
}
... ... @@ -860,7 +883,7 @@ public class AppraiseService {
//将卖家的保证金扣掉10元后,剩余的钱退回给卖家
BigDecimal earnestMoney = sellerOrder.getEarnestMoney().subtract(new BigDecimal(miniFaultRejectPunishFee));
PaymentRequest refundReqOfSeller = refundEarnestMoney(SellerWalletDetail.Type.MINI_FAULT_REJECT, orderCode, sellerUid, sellerOrder, skup, buyerUid, targetSoStatus, earnestMoney.doubleValue());
PaymentRequest refundReqOfSeller = refundEarnestMoney(SellerWalletDetail.Type.MINI_FAULT_REJECT, orderCode, sellerUid, sellerOrder, buyerUid, targetSoStatus, earnestMoney.doubleValue());
LOGGER.info("in miniFaultReject,refund ok, refundReqOfSeller {}", refundReqOfSeller);
//退买家的钱
... ... @@ -1067,7 +1090,14 @@ public class AppraiseService {
}
//退保证金给卖家
private PaymentRequest refundEarnestMoney(SellerWalletDetail.Type swdType, Long orderCode, Integer sellerUid, SellerOrder sellerOrder, int skup, Integer buyerUid, SellerOrderStatus targetSoStatus, double refundMoney) {
private PaymentRequest refundEarnestMoney(SellerWalletDetail.Type swdType,
Long orderCode,
Integer sellerUid,
SellerOrder sellerOrder,
Integer buyerUid,
SellerOrderStatus targetSoStatus,
double refundMoney) {
Integer skup = sellerOrder.getSkup();
Long sellerOrderCode = sellerOrder.getOrderCode();
Integer sop = sellerOrder.getPayment() == null ? 0 : sellerOrder.getPayment();
PaymentRequest refundReqOfSeller = PaymentRequest.builder().uid(sellerUid)
... ... @@ -1093,7 +1123,8 @@ public class AppraiseService {
}
//瑕疵不接受的情况,并且是超级卖家的话,直接走惩罚接口
if (SellerWalletDetail.Type.MINI_FAULT_REJECT == swdType && sellerIsSuper && PaymentHelper.isWallet(sellerOrder.getPayment())) {
if (SellerWalletDetail.Type.MINI_FAULT_REJECT == swdType && sellerIsSuper
&& PaymentHelper.isWallet(sellerOrder.getPayment())) {
LOGGER.info("in refundEarnestMoney call punishEarnest orderCode {} ,swdType {} seller uid {},sellerIsSuper {},seller order code {}, skup {}, refundMoney {},refundReqOfSeller {}"
, orderCode, swdType,
sellerUid, sellerIsSuper, sellerOrderCode, skup, refundMoney, refundReqOfSeller);
... ... @@ -1270,7 +1301,7 @@ public class AppraiseService {
//鉴定不通过
buyerNoticeFacade.qualityCheckNotPass(buyerOrder, sellerOrderGoods);
inBoxFacade.sellerQualityCheckNotPass(sellerOrderGoods, orderCode);
inBoxFacade.sellerQualityCheckNotPass(sellerOrderGoods, buyerOrder);
} catch (Exception ex) {
LOGGER.warn("in judgeCenterNotPass orderStatusFlowService or notice fail orderCode {}", orderCode, ex);
... ... @@ -1308,11 +1339,15 @@ public class AppraiseService {
public ApiResponse qualityCheckReject(SaveQualityCheckInfoRequest request) {
LOGGER.info("qualityCheckReject enter , appraiseExpressInfoBo {} ", request);
Long orderCode = request.getOrderCode();
QualityCheck qualityCheck = request.getQualityCheck();
throwServiceExceptionIf(Objects.isNull(qualityCheck),"质检不合格信息为空");
ApiResponse apiResponse = new ApiResponse();
if (serviceOrderProcessor.isGoodsServiceOrder(orderCode)){
if (serviceOrderProcessor.isGoodsServiceOrder(orderCode)) {
LOGGER.info("qualityCheckReject isGoodsServiceOrder order code {}", orderCode);
ServiceOrderProcessor.ExistenceNode existenceNode = serviceOrderProcessor.findGoodsServiceInstanceAndExt(orderCode);
existenceNode.getGoodsService().findFlaw(existenceNode.getAppraiseOrder());
doIgnoreException(() -> qualityCheckMapper.insert(qualityCheck));
apiResponse.setCode(200);
return apiResponse;
}
... ... @@ -1320,8 +1355,6 @@ public class AppraiseService {
OrderStatus expectStatus = OrderStatus.PLATFORM_RECEIVE;
OrderStatus targetStatus = OrderStatus.QUALITY_CHECK_FAKE;
QualityCheck qualityCheck = request.getQualityCheck();
BuyerOrder buyerOrder = buyerOrderMapper.selectOnlyByOrderCode(orderCode);
... ... @@ -1339,11 +1372,6 @@ public class AppraiseService {
int buyerUid = buyerOrder.getUid();
int sellerUid = buyerOrder.getSellerUid();
//保存质检有问题的图片信息
if (qualityCheck == null) {
LOGGER.warn("in qualityCheckReject qualityCheck is null, orderCode {},uid {} ,sellerUid {}", orderCode, buyerUid, sellerUid);
throw new ServiceException(400, "质检不合格信息为空");
}
qualityCheckMapper.insert(qualityCheck);
LOGGER.info("qualityCheckReject update buyer order {} ", buyerOrder);
... ... @@ -1367,7 +1395,7 @@ public class AppraiseService {
//质检不通过
buyerNoticeFacade.qualityCheckNotPass(buyerOrder, sellerOrderGoods);
inBoxFacade.sellerQualityCheckNotPass(sellerOrderGoods, orderCode);
inBoxFacade.sellerQualityCheckNotPass(sellerOrderGoods, buyerOrder);
} catch (Exception ex) {
LOGGER.warn("in qualityCheckReject orderStatusFlowService or notice fail orderCode {}", orderCode, ex);
... ... @@ -1458,14 +1486,14 @@ public class AppraiseService {
SellerOrderGoods sellerOrderGoods = updateSellerOrderStatusAndCleanCache(sellerUid, sellerOrderCode, expectSOStatus, targetSoStatus,
skup, orderCode, buyerUid);
//退款给卖家(仅退一次)
PaymentRequest refundReqOfSeller = operateMoneyWhenOk(buyerUid, orderCode, skup, sellerOrder, targetSoStatus);
PaymentRequest refundReqOfSeller = operateMoneyWhenOk(buyerUid, orderCode, sellerOrder, targetSoStatus);
try {
//记录订单的状态变更信息
LOGGER.info("in judgeCenterPass record status change, orderCode {},uid {} ,sellerUid {}", orderCode, buyerUid, sellerUid);
orderStatusFlowService.addAsy(buyerOrder.getOrderCode(), targetOrderStatus.getCode());
//TODO 鉴定通过,
sellerNoticeFacade.appraisePass(buyerUid, orderCode, sellerOrderGoods, true);
sellerNoticeFacade.appraisePass(buyerUid, buyerOrder, sellerOrderGoods, true);
if(isDepositOfInStockGoods){
Product product = Optional.ofNullable(sellerOrderGoods).map(SellerOrderGoods::getProductId).map(productMapper::selectByPrimaryKey).orElse(null);
buyerNoticeFacade.noticeBuyerWhenDepositOrderOfInstockPass(buyerUid, orderCode, sellerOrderGoods, product);
... ... @@ -1532,13 +1560,17 @@ public class AppraiseService {
/**
* 通过时 ,操作钱
*/
private PaymentRequest operateMoneyWhenOk(Integer buyerUid, Long orderCode, int skup, SellerOrder sellerOrder, SellerOrderStatus targetSoStatus) {
private PaymentRequest operateMoneyWhenOk(Integer buyerUid,
Long orderCode,
SellerOrder sellerOrder,
SellerOrderStatus targetSoStatus) {
Integer skup = sellerOrder.getSkup();
final Integer sellerUid = sellerOrder.getUid();
transferGoodsMoneyWhenPass(sellerUid, skup, orderCode);
//退保证金给卖家
//refund earnestMoney
BigDecimal earnestMoney = sellerOrder.getEarnestMoney();
PaymentRequest refundReqOfSeller = refundEarnestMoney(SellerWalletDetail.Type.APPRAISE_OK, orderCode, sellerUid, sellerOrder, skup, buyerUid, targetSoStatus, earnestMoney.doubleValue());
PaymentRequest refundReqOfSeller = refundEarnestMoney(SellerWalletDetail.Type.APPRAISE_OK, orderCode, sellerUid, sellerOrder, buyerUid, targetSoStatus, earnestMoney.doubleValue());
LOGGER.info("in appraiseSuccess,refund ok, refundReqOfSeller {}", refundReqOfSeller);
return refundReqOfSeller;
}
... ... @@ -1597,7 +1629,7 @@ public class AppraiseService {
skup, orderCode, buyerUid);
//退款给卖家(仅退一次)
PaymentRequest refundReqOfSeller = operateMoneyWhenOk(buyerUid, orderCode, skup, sellerOrder, targetSoStatus);
PaymentRequest refundReqOfSeller = operateMoneyWhenOk(buyerUid, orderCode, sellerOrder, targetSoStatus);
try {
//鉴定通过后自动发货,这个时候产生:买家确认收货的mq
BuyerConfirmEvent buyerConfirmEvent = BuyerConfirmEvent.builder()
... ... @@ -1618,7 +1650,7 @@ public class AppraiseService {
//平台已发货给买家
buyerNoticeFacade.appraisePassAndDeliveryGoodsToBuyer(buyerOrder, sellerOrderGoods);
sellerNoticeFacade.appraisePass(buyerUid, orderCode, sellerOrderGoods, true);
sellerNoticeFacade.appraisePass(buyerUid, buyerOrder, sellerOrderGoods, true);
} catch (Exception ex) {
LOGGER.warn("in appraiseSuccess,refund fail, refundReqOfSeller {}", refundReqOfSeller, ex);
String content = "鉴定通过时,订单" + orderCode + "退还保证金失败";
... ... @@ -1690,7 +1722,7 @@ public class AppraiseService {
.refundCase(RefundCase.BUYER_GOODS_MONEY)
.and()
// 通知卖家商品无法鉴定
.withNoticeSeller((soa, code) -> sellerNoticeFacade.appraiseUnsure(soa, code)).and()
.withNoticeSeller((soa, buyerOrder) -> sellerNoticeFacade.appraiseUnsure(soa, buyerOrder)).and()
// 通知买家商品无法鉴定(并发券)
.withNoticeBuyer(this::noticeBuyerAndSendCouponForAppraiseUnsure).and()
// 记录一条补充物流
... ... @@ -1730,7 +1762,7 @@ public class AppraiseService {
.refundCase(RefundCase.BUYER_GOODS_MONEY)
.and()
// 通知卖家商品检测不通过
.withNoticeSeller((soa, code) -> sellerNoticeFacade.detectNotPass(soa, code)).and()
.withNoticeSeller((soa, buyerOrder) -> sellerNoticeFacade.detectNotPass(soa, buyerOrder)).and()
// 通知买家商品检测不通过
.withNoticeBuyer(this::noticeBuyerDetectNotPass).and()
// 记录一条补充物流
... ... @@ -1867,11 +1899,41 @@ public class AppraiseService {
orderCode, uid, ex);
}
try {
depositService.changeOwner(sellerUid, skup, orderCode,uid, isDeposit);
String depositCode = sellerOrderMetaService.getDepoistCode(sellerUid, skup);
LOGGER.warn("pay successful, processQuickDeliverOrder invoke depositService.changeOwner sellerUid {}, buyerUid {},orderCode {},skup {} depositCode {}",
sellerUid, uid, orderCode, skup, depositCode);
depositService.changeOwner(sellerUid, skup, orderCode,uid, isDeposit, depositCode);
}catch (Exception ex){
LOGGER.warn("pay successful, processQuickDeliverOrder invoke depositService.changeOwner fail, sellerUid {}, buyerUid {},orderCode {},skup {}",
sellerUid, uid, orderCode, skup);
sellerUid, uid, orderCode, skup, ex);
}
}
/**
*
* @param preparedData 这个是修改状态前的订单 若用到状态需要重新查询 或 重新构建数据结构
*/
public void processInstockDepositOrderAfterDeliver(BuyerOrderAssistant.PreparedData preparedData){
BuyerOrderGoods pbog = preparedData.getBuyerOrderGoods();
BuyerOrder pbo = preparedData.getBuyerOrder();
Long orderCode = pbo.getOrderCode();
Integer buyerUid = pbo.getUid();
Integer sellerUid = pbo.getSellerUid();
Integer skup = pbog.getSkup();
try {
transferGoodsMoneyWhenPass(sellerUid, skup, orderCode);
final SellerOrderStatus targetSoStatus = SellerOrderStatus.FINISH;
SellerOrder sellerOrder = sellerOrderMapper.selectBySkup(skup);
double earnestMoneyDouble = sellerOrder.getEarnestMoney().doubleValue();
PaymentRequest refundReqOfSeller = refundEarnestMoney(SellerWalletDetail.Type.APPRAISE_OK, orderCode, sellerUid, sellerOrder, buyerUid, targetSoStatus, earnestMoneyDouble);
}catch (Exception ex){
LOGGER.warn("in processInstockDepositOrderAfterDeliver transferGoodsMoneyWhenPass fail orderCode {} sellerUid {}",
orderCode, sellerUid, ex);
}
}
}
... ...
... ... @@ -115,7 +115,6 @@ public class BuyerBidOrderSubmitService {
buyerOrder.setUid(orderBuilder.getUid());
buyerOrder.setOrderCode(orderBuilder.getOrderCode());
buyerOrder.setSellerUid(sellerUid);
buyerOrder.setPayment(orderBuilder.getPayment());
buyerOrder.setPaymentType((byte) orderBuilder.getPaymentType());
buyerOrder.setAmount(orderBuilder.getAmount());
buyerOrder.setShipFee(orderBuilder.getShipFee());
... ...
... ... @@ -247,6 +247,7 @@ public class BuyerBidPublishService {
OrderBuilder orderBuilder = new OrderBuilderFactory().create(uid, orderCode,
request.getChannelNo(), request.getClientType(),
getAndCheckAddressInfo(request),
new ShoppingServiceImpl.GoodsPrepareData(),
newSellerOrderGoods(skup, goodsInfo.getProductId(), bidPrice.getPrice()),
chargeContext);
//求购 定金
... ...
package com.yohoufo.order.service.impl;
import com.yohobuy.ufo.model.order.common.OrderAttributes;
import com.yohobuy.ufo.model.order.constants.SkupType;
import com.yohoufo.common.exception.UfoServiceException;
import com.yohoufo.dal.order.BuyerOrderGoodsMapper;
import com.yohoufo.dal.order.BuyerOrderMapper;
import com.yohoufo.dal.order.SellerOrderGoodsMapper;
import com.yohoufo.dal.order.StorageDepositMapper;
import com.yohoufo.dal.order.model.BuyerOrder;
import com.yohoufo.dal.order.model.BuyerOrderGoods;
import com.yohoufo.dal.order.model.SellerOrderGoods;
import com.yohoufo.dal.order.model.StorageDeposit;
import com.yohoufo.order.utils.BuyerOrderUtils;
import com.yohoufo.order.utils.LoggerUtils;
import lombok.Data;
import lombok.experimental.Delegate;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Objects;
/**
* @author chao.chen
* @date 2019.9.9
*/
@Component
public class BuyerOrderAssistant {
private final Logger logger = LoggerUtils.getBuyerOrderLogger();
@Autowired
private BuyerOrderMapper buyerOrderMapper;
@Autowired
private BuyerOrderGoodsMapper buyerOrderGoodsMapper;
@Autowired
private SellerOrderGoodsMapper sellerOrderGoodsMapper;
@Data
public static class PreparedData{
private BuyerOrder buyerOrder;
private BuyerOrderGoods buyerOrderGoods;
private SellerOrderGoods sellerOrderGoods;
}
@Data
public static class BuyerOrderWarpper{
boolean isInstockOrder;
boolean isInstockDepositOrder;
}
@Data
public static class DepositSkuCheckNode{
private String depositCode;
private StorageDeposit psd;
private boolean existDepositGoods;
@Delegate
private BuyerOrderWarpper buyerOrderWarpper;
}
@Autowired
private StorageDepositMapper storageDepositMapper;
public PreparedData prepare(Long orderCode){
BuyerOrder buyerOrder = buyerOrderMapper.selectByOrderCode(orderCode);
int buyerUid;
//获取skup
BuyerOrderGoods buyerOrderGoods = Objects.nonNull(buyerOrder) ? buyerOrderGoodsMapper.selectByOrderCode(buyerUid = buyerOrder.getUid(), orderCode) : null;
int skup ;
SellerOrderGoods psog = Objects.nonNull(buyerOrderGoods) ? sellerOrderGoodsMapper.selectByPrimaryKey(skup = buyerOrderGoods.getSkup()) : null;
PreparedData preparedData = new PreparedData();
preparedData.setBuyerOrder(buyerOrder);
preparedData.setBuyerOrderGoods(buyerOrderGoods);
preparedData.setSellerOrderGoods(psog);
return preparedData;
}
public DepositSkuCheckNode checkExistDepositSku(BuyerOrder buyerOrder,SellerOrderGoods sellerOrderGoods, String depositCode){
DepositSkuCheckNode dsNode = new DepositSkuCheckNode();
int sellerUid = buyerOrder.getSellerUid();
boolean existDepositGoods = false;
boolean isInstockOrder = buyerOrder.getAttributes().equals(OrderAttributes.COMMON_IN_STOCK.getCode());
boolean isInstockDepositOrder = isInstockDepositOrder(buyerOrder, sellerOrderGoods);
boolean depositCodeIsNotBlank = StringUtils.isNotBlank(depositCode);
if (depositCodeIsNotBlank && (isInstockOrder || isInstockDepositOrder)){
depositCode = depositCode.trim();
StorageDeposit psd = storageDepositMapper.queryByDepositCode(sellerUid, depositCode);
boolean isSameSku = false;
existDepositGoods = Objects.nonNull(psd) && (isSameSku= (psd.getStorageId().equals(sellerOrderGoods.getStorageId())));
logger.info("checkExistDepositSku orderCode {} depositCode {} isSameSku {} existDepositGoods {}",
buyerOrder.getOrderCode(), depositCode, isSameSku, existDepositGoods);
dsNode.setPsd(psd);
}
if (!depositCodeIsNotBlank){
logger.warn("checkExistDepositSku depositCode Is Blank, orderCode {} depositCode {}",
buyerOrder.getOrderCode(), depositCode);
}
if (depositCodeIsNotBlank && !existDepositGoods){
logger.warn("checkExistDepositSku depositCode Is Not Blank but not exist DepositGoods, orderCode {} depositCode {}",
buyerOrder.getOrderCode(), depositCode);
throw new UfoServiceException(400, "寄存商品不存在");
}
dsNode.setExistDepositGoods(existDepositGoods);
dsNode.setDepositCode(depositCode);
//
dsNode.setBuyerOrderWarpper(new BuyerOrderWarpper());
dsNode.setInstockDepositOrder(isInstockDepositOrder);
dsNode.setInstockOrder(isInstockOrder);
return dsNode;
}
public boolean isInstockDepositOrder(BuyerOrder pbo, SellerOrderGoods sellerOrderGoods){
SkupType skupType = SkupType.getSkupType(sellerOrderGoods.getAttributes());
Integer pboa = pbo.getAttributes();
return BuyerOrderUtils.isInstockDeposit(skupType, pboa);
}
}
... ...
... ... @@ -22,6 +22,7 @@ import com.yohoufo.order.common.RefundCase;
import com.yohoufo.order.common.TransferCase;
import com.yohoufo.order.constants.AlarmConfig;
import com.yohoufo.order.event.BillLogEvent;
import com.yohoufo.order.service.cache.CacheCleaner;
import com.yohoufo.order.service.listener.BuyerOrderChangeEvent;
import com.yohoufo.order.event.BuyerRefundCouponEvent;
import com.yohoufo.order.model.request.PaymentRequest;
... ... @@ -59,6 +60,7 @@ class BuyerOrderCancelHandler {
private final int uid;
private final long orderCode;
private BuyerOrder buyerOrder;
private Integer sellerUid;
... ... @@ -177,7 +179,7 @@ class BuyerOrderCancelHandler {
log.info("cancel order {} from {} to {}", orderCode, expectStatus, targetStatus);
verify();
// 获取买家订单
BuyerOrder buyerOrder = buyerOrderMapper.selectByOrderCodeUid(orderCode, uid);
buyerOrder = buyerOrderMapper.selectByOrderCodeUid(orderCode, uid);
if (Objects.isNull(buyerOrder)) {
log.info("cancel order {} fail, order is not exist", orderCode);
throwServiceException("订单不存在");
... ... @@ -403,7 +405,7 @@ class BuyerOrderCancelHandler {
if (Objects.nonNull(noticeSeller)) {
try {
log.info("notice seller buyer order has closed by order {}", orderCode);
noticeSeller.sellerNoticeSender().notice(sellerOrderGoods, orderCode);
noticeSeller.sellerNoticeSender().notice(sellerOrderGoods, buyerOrder);
} catch (Exception e) {
log.warn("notice seller buyer order has closed by order {} fail", orderCode, e);
}
... ... @@ -429,12 +431,7 @@ class BuyerOrderCancelHandler {
private void cleanCache(BuyerOrder buyerOrder, SellerOrderGoods sellerOrderGoods) {
val sellerUid = buyerOrder.getSellerUid();
val buyerUid = buyerOrder.getUid();
val keys = Arrays.asList(CacheKeyBuilder.orderListKey(sellerUid, TabType.SELL.getValue()),
CacheKeyBuilder.orderListKey(buyerUid, TabType.BUY.getValue()),
CacheKeyBuilder.sellerOrderDetailKey(sellerOrderGoods),
CacheKeyBuilder.orderDetailKey(sellerUid, TabType.SELL.getValue(), orderCode),
CacheKeyBuilder.orderDetailKey(buyerUid, TabType.BUY.getValue(), orderCode),
CacheKeyBuilder.buyerOrderNums(buyerUid));
val keys = CacheCleaner.buildSellerAndBuyerOrderKeys(sellerUid, buyerUid, orderCode);
try {
cacheCleaner.accept(keys);
} catch (Exception e) {
... ...