Authored by chenchao

add log

... ... @@ -19,6 +19,8 @@ public interface SellerOrderGoodsMapper {
List<SellerOrderGoods> selectBySkups(@Param("list") List<Integer> skup);
List<SellerOrderGoods> selectBySkupsNStatus(@Param("list") List<Integer> skup, @Param("statusList") Collection<Integer> statusList);
int updateByPrimaryKeySelective(SellerOrderGoods record);
int updateByPrimaryKey(SellerOrderGoods record);
... ...
... ... @@ -69,6 +69,24 @@
</if>
</select>
<select id="selectBySkupsNStatus" parameterType="java.lang.Integer" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from seller_order_goods
where 1=1
<if test="list != null">
and id in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</if>
and status in
<foreach collection="statusList" item="status" open="(" close=")" separator=",">
#{status, jdbcType=TINYINT}
</foreach>
</select>
<sql id="sql_where_4_select_UidStatusList">
uid = #{uid,jdbcType=INTEGER} and is_del = 1
<if test="statusList != null">
... ...
... ... @@ -117,6 +117,7 @@ public class SellerOrderDetailService extends AbsOrderDetailService implements I
return null;
}
boolean isEntry = userProxyService.isEntryShop(uid)
&& Objects.nonNull(sellerOrder.getPayment())
&& OrderCodeType.SELLER_RECHARGE_EARNEST_TYPE.getType() == sellerOrder.getPayment();
SellerType sellerType = isEntry ? SellerType.ENTRY : SellerType.COMMON;
Integer skup = sellerOrder.getSkup();
... ...
... ... @@ -199,6 +199,7 @@ public class SellerOrderListService extends AbsOrderListService implements IOrde
orderListInfo.setStatuStr(skupStatus.getDesc());
//异常扯淡,兼容老数据,
final SellerType lst = (st == SellerType.ENTRY
&& sellerOrder.getPayment()!=null
&& OrderCodeType.SELLER_RECHARGE_EARNEST_TYPE.getType() == sellerOrder.getPayment()) ?
SellerType.ENTRY : SellerType.COMMON;
// 按钮显示
... ...
... ... @@ -20,10 +20,7 @@ import com.yohoufo.common.utils.PageHelper;
import com.yohoufo.dal.order.BuyerOrderMapper;
import com.yohoufo.dal.order.SellerOrderGoodsMapper;
import com.yohoufo.dal.order.SellerOrderMapper;
import com.yohoufo.dal.order.model.BuyerOrder;
import com.yohoufo.dal.order.model.SellerOrder;
import com.yohoufo.dal.order.model.SellerOrderGoods;
import com.yohoufo.dal.order.model.SellerWallet;
import com.yohoufo.dal.order.model.*;
import com.yohoufo.order.common.ActionStatusHold;
import com.yohoufo.order.common.DelStatus;
import com.yohoufo.order.convert.SellerOrderConvertor;
... ... @@ -49,6 +46,7 @@ import com.yohoufo.order.service.concurrent.ThreadPoolFactory;
import com.yohoufo.order.service.handler.SellerOrderComputeHandler;
import com.yohoufo.order.service.handler.SellerOrderSubmitHandler;
import com.yohoufo.order.service.impl.processor.ChangePricePrepareProcessor;
import com.yohoufo.order.service.impl.processor.SellerBatchCancelPrepareProcessor;
import com.yohoufo.order.service.impl.processor.SellerOrderPrepareProcessor;
import com.yohoufo.order.service.impl.visitor.OffShelveCancelCase;
import com.yohoufo.order.service.impl.visitor.UserCancelCase;
... ... @@ -220,8 +218,10 @@ public class SellerOrderService implements IOrderListService, IOrderDetailServi
boolean isEntryShop = context.isEntryShop();
OrderSubmitResp resp ;
if(isEntryShop){
log.info("in publishPrd use batchPublishPrds, req {}", req);
resp = batchPublishPrds(context, req);
}else{
log.info("in publishPrd use publishSinglePrd, req {}", req);
resp = publishSinglePrd(req, context);
}
return resp;
... ... @@ -286,24 +286,44 @@ public class SellerOrderService implements IOrderListService, IOrderDetailServi
return true;
}
@Autowired
private SellerBatchCancelPrepareProcessor sellerBatchCancelPrepareProcessor;
/**
* 总指导思想:先下架商品
* @param req
* @return
*/
public boolean batchCancel(SellerOrderBatchCancelReq req){
//TODO check
boolean result = false;
//check
SellerBatchCancelPrepareProcessor.DataNode sbcppdn = sellerBatchCancelPrepareProcessor.checkAndAcquire(req);
//1 商品下架
Long batchNo = sbcppdn.getBatchNo();
List<Integer> needOffShelveSkups = sbcppdn.getNeedOffShelveSkups();
Map<Integer, SkupDto> tskupMap = sbcppdn.getTskupMap();
Set<Integer> skupSet = tskupMap.keySet();
if(productProxyService.sellerBatchUpdateStatus(new ArrayList<>(skupSet), ProductProxyService.PrdShelvelStatus.off)){
//1.1 商品下架成功后
//TODO 2 划账(退还下架成功的skup对应的保证金)
List<SellerOrder> soList = sellerOrderMapper.selectBySkups(skupSet);
BigDecimal totalRefundEM = new BigDecimal(0);
for(SellerOrder so : soList ){
totalRefundEM = totalRefundEM.add(so.getEarnestMoney());
}
merchantOrderPaymentService.refundEarnest(req.getUid(), totalRefundEM, null, 0L, SellerWalletDetail.Type.SELLER_OFF );
//2.1 划账成功
//TODO 3 修改 seller_order(状态)sell_order_goods(状态)
//TODO 4 划账记录
result = true;
}else {
//TODO 1 商品下架
//1.1 商品下架成功后
//TODO 2 划账(退还下架成功的skup对应的保证金)
//2.1 划账成功
//TODO 3 修改 seller_order(状态)sell_order_goods(状态)
//TODO 4 划账记录
//1.2 商品下架失败后
//1.2 商品下架失败后
result = false;
}
return true;
return result;
}
public boolean cancel(SellerOrderCancelReq req){
... ...
... ... @@ -71,8 +71,8 @@ public class ChangePricePrepareProcessor {
logger.warn("ChangePrice checkAndAcquire uid illegal , req {}", req);
throw new UfoServiceException(400, "参数[skupList]为空");
}
//todo 若考虑到并发,需要进行过滤,将不是出售中状态的skup排除掉;
//todo 不做过滤导致后面的数量 扣费检查都可能不对
//考虑到并发,需要进行过滤,将不是出售中状态的skup排除掉;
//不做过滤导致后面的数量 扣费检查都可能不对
List<String> skupStrList = Splitter.on(',').trimResults().omitEmptyStrings().splitToList(skupList);
List<Integer> needChangePriceSkupList = skupStrList.parallelStream().map(Integer::valueOf).collect(Collectors.toList());
//check batch no
... ... @@ -99,8 +99,7 @@ public class ChangePricePrepareProcessor {
sellerOrderPrepareProcessor.checkPrice(storageId, salePrice, true);
// compute every fee from price
SellerOrderComputeResult computeResult = computeHandler.compute(salePrice);
//todo 这个数量不是准确的
int num = needChangePriceSkupList.size();
int num = skupMap.size();
//作为入驻商户 检查钱包
BigDecimal targetEM = computeResult.getEarnestMoney().getEarnestMoney();
BigDecimal diffEarnestMoney = calDiffOfEM(sourceEM,targetEM);
... ...
package com.yohoufo.order.service.impl.processor;
import com.google.common.base.Splitter;
import com.yohobuy.ufo.model.order.common.SkupStatus;
import com.yohobuy.ufo.model.order.req.SellerOrderBatchCancelReq;
import com.yohoufo.common.exception.UfoServiceException;
import com.yohoufo.dal.order.SellerOrderGoodsMapper;
import com.yohoufo.dal.order.model.SellerOrderGoods;
import com.yohoufo.order.model.dto.SkupDto;
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 java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* Created by chao.chen on 2018/11/22.
*/
@Service
public class SellerBatchCancelPrepareProcessor {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private SellerOrderPrepareProcessor sellerOrderPrepareProcessor;
@Autowired
private SellerOrderGoodsMapper sellerOrderGoodsMapper;
@Data
public static class DataNode{
Long batchNo;
List<Integer> needOffShelveSkups;
Map<Integer, SkupDto> tskupMap;
public DataNode(Long batchNo, List<Integer> needOffShelveSkups, Map<Integer, SkupDto> tskupMap) {
this.batchNo = batchNo;
this.needOffShelveSkups = needOffShelveSkups;
this.tskupMap = tskupMap;
}
}
public DataNode checkAndAcquire(SellerOrderBatchCancelReq req){
int uid = req.getUid();
if (uid <= 0){
logger.warn("batch off shelve checkAndAcquire uid illegal , req {}", req);
throw new UfoServiceException(400, "参数[uid]错误");
}
if(!sellerOrderPrepareProcessor.checkIsEntry(uid)){
logger.warn("batch off shelve checkAndAcquire uid is not entry shop , req {}", req);
throw new UfoServiceException(400, "您不是入驻商家");
}
String skupList = req.getSkupList();
if (StringUtils.isBlank(skupList)){
logger.warn("batch off shelve checkAndAcquire uid illegal , req {}", req);
throw new UfoServiceException(400, "参数[skupList]为空");
}
//考虑到并发,需要进行过滤,将不是出售中状态的skup排除掉;
//不做过滤导致后面的数量 扣费检查都可能不对
List<String> skupStrList = Splitter.on(',').trimResults().omitEmptyStrings().splitToList(skupList);
List<Integer> needOffShelveSkups = skupStrList.parallelStream().map(Integer::valueOf).collect(Collectors.toList());
//check batch no
Long batchNo = checkNAcquireBatchNo(req.getBatchNo(), req);
//检查
Map<Integer, SkupDto> skupMap = checkNeedProcessSkups(needOffShelveSkups,req);
DataNode node = new DataNode(batchNo, needOffShelveSkups, skupMap);
return node;
}
final static List<Integer> CAN_OFF_STATUS = Arrays.asList(SkupStatus.CAN_SELL.getCode());
private Map<Integer, SkupDto> checkNeedProcessSkups(List<Integer> needChangePriceSkupList, SellerOrderBatchCancelReq req){
List<SellerOrderGoods> sellerOrderGoodList = sellerOrderGoodsMapper.selectBySkupsNStatus(needChangePriceSkupList, CAN_OFF_STATUS);
if (CollectionUtils.isEmpty(sellerOrderGoodList)){
logger.warn("batch off shelve checkAndAcquire not find skups by batchNo, req {}", req);
throw new UfoServiceException(501, "商品不存在");
}
List<Integer> skups = sellerOrderGoodList.parallelStream().map(SellerOrderGoods::getId).collect(Collectors.toList());
logger.info("batch off shelve price checkExistWaitingBuyerPay req {} skups in db {}", req, skups);
return sellerOrderGoodList.parallelStream().collect(Collectors.toMap(SellerOrderGoods::getId,
(sog)-> SkupDto.builder().skup(sog.getId()).sellerOrderGoods(sog).batchNo(sog.getBatchNo()).build()));
}
private Long checkNAcquireBatchNo(String batchNoStr, SellerOrderBatchCancelReq req){
Long batchNo = null;
boolean isIllegalBatchNo;
try {
isIllegalBatchNo = (StringUtils.isBlank(batchNoStr) || (batchNo = Long.valueOf(batchNoStr)) <= 0L);
}catch (Exception ex){
isIllegalBatchNo = true;
logger.warn("batch off shelve checkAndAcquire batchNoStr illegal , req {}", req, ex);
}
if (isIllegalBatchNo){
throw new UfoServiceException(400, "参数[batchNoStr]非法");
}
return batchNo;
}
}
... ...
... ... @@ -225,9 +225,9 @@ public class ProductProxyService {
}
public boolean sellerBatchUpdateStatus(List<Integer> skupList, PrdShelvelStatus prdShelvelStatus){
logger.info("begin call {} skupList {} prdShelvelStatus {}", sellerBatchUpdateStatus, skupList, prdShelvelStatus);
ApiResponse resp = ufoServiceCaller.call(sellerBatchUpdateStatus, skupList, prdShelvelStatus.code);
logger.info("call {} skupList {} resp {}", sellerBatchUpdateStatus, skupList, resp);
logger.info("finish call {} skupList {} prdShelvelStatus {} resp {}", sellerBatchUpdateStatus, skupList, prdShelvelStatus, resp);
return (null == resp || null == resp.getData())? false : (boolean)resp.getData();
}
... ...