Authored by caoyan

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

Showing 39 changed files with 676 additions and 208 deletions
... ... @@ -23,6 +23,13 @@ public class InviteSettlement {
private Integer settleTime;
// bankcard
private String name;
private String idCardNo;
private String bankName;
private String bankBranch;
private String bankCardNo;
private Integer paidTime;
private Integer status;
... ...
... ... @@ -7,18 +7,28 @@
<result column="settle_code" property="settleCode" jdbcType="INTEGER" />
<result column="settle_amount" property="settleAmount" jdbcType="DECIMAL" />
<result column="settle_time" property="settleTime" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="id_card_no" property="idCardNo" jdbcType="VARCHAR" />
<result column="bank_name" property="bankName" jdbcType="VARCHAR" />
<result column="bank_branch" property="bankBranch" jdbcType="VARCHAR" />
<result column="bank_card_no" property="bankCardNo" jdbcType="VARCHAR" />
<result column="paid_time" property="paidTime" jdbcType="INTEGER" />
<result column="status" property="status" jdbcType="INTEGER" />
<result column="create_time" property="createTime" jdbcType="INTEGER" />
</resultMap>
<sql id="Base_Column_List" >
id, uid, settle_code, settle_amount, settle_time,paid_time, status, create_time
id, uid, settle_code, settle_amount, settle_time, name, id_card_no, bank_name, bank_branch, bank_card_no, paid_time, status, create_time
</sql>
<insert id="insert" parameterType="com.yohoufo.dal.order.model.InviteSettlement" useGeneratedKeys="true" keyProperty="id">
insert into invite_settlement (id, uid, settle_code, settle_amount, settle_time, status, create_time)
values (#{id,jdbcType=INTEGER}, #{uid,jdbcType=INTEGER}, #{settleCode,jdbcType=DECIMAL}, #{settleAmount,jdbcType=DECIMAL},
#{settleTime,jdbcType=INTEGER}, #{status,jdbcType=INTEGER}, #{createTime,jdbcType=INTEGER})
insert into invite_settlement (id, uid,
settle_code, settle_amount, settle_time,
name, id_card_no, bank_name, bank_branch, bank_card_no,
status, create_time)
values (#{id,jdbcType=INTEGER}, #{uid,jdbcType=INTEGER},
#{settleCode,jdbcType=DECIMAL}, #{settleAmount,jdbcType=DECIMAL}, #{settleTime,jdbcType=INTEGER},
#{name,jdbcType=VARCHAR},#{idCardNo,jdbcType=VARCHAR},#{bankName,jdbcType=VARCHAR},#{bankBranch,jdbcType=VARCHAR},#{bankCardNo,jdbcType=VARCHAR},
#{status,jdbcType=INTEGER}, #{createTime,jdbcType=INTEGER})
</insert>
<update id="updateByUidAndId" parameterType="com.yohoufo.dal.order.model.InviteSettlement" >
... ...
package com.yohoufo.order.controller;
import com.google.common.collect.Maps;
import com.yoho.core.rest.client.ServiceCaller;
import com.yoho.error.exception.ServiceException;
import com.yohoufo.common.ApiResponse;
import com.yohoufo.order.service.proxy.BankCardService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
... ... @@ -13,7 +12,6 @@ import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* @author LUOXC
... ... @@ -21,10 +19,10 @@ import java.util.concurrent.TimeUnit;
*/
@Slf4j
@RestController
public class BankcardController {
public class BankCardController {
@Autowired
ServiceCaller serviceCaller;
BankCardService bankCardService;
@Value("${erp-gateway.url}")
private String erpGatewayUrl;
... ... @@ -35,7 +33,7 @@ public class BankcardController {
String url = erpGatewayUrl + "/erp/union/bankcard/getBankCard";
Map<String, Object> params = Maps.newHashMap();
params.put("uid", uid);
return proxyGet("ufo.bankcard.getBankCard", url, params);
return bankCardService.proxyGet("ufo.bankcard.getBankCard", url, params);
}
@RequestMapping(params = "method=ufo.bankcard.getBankList")
... ... @@ -45,7 +43,7 @@ public class BankcardController {
String url = erpGatewayUrl + "/erp/union/bankcard/getBankList";
Map<String, Object> params = Maps.newHashMap();
params.put("uid", uid);
return proxyGet("ufo.bankcard.getBankList", url, params);
return bankCardService.proxyGet("ufo.bankcard.getBankList", url, params);
}
/**
... ... @@ -71,7 +69,7 @@ public class BankcardController {
params.put("bankCardNo", bankCardNo);
params.put("bankBranch", bankBranch);
params.put("bankCode", bankCode);
return proxyPost("ufo.bankcard.bindBankCard", url, params);
return bankCardService.proxyPost("ufo.bankcard.bindBankCard", url, params);
}
/**
... ... @@ -97,30 +95,7 @@ public class BankcardController {
params.put("bankCardNo", bankCardNo);
params.put("bankBranch", bankBranch);
params.put("bankCode", bankCode);
return proxyPost("ufo.bankcard.checkBankCard", url, params);
}
private ApiResponse proxyGet(String serviceName, String url, Map<String, Object> params) {
return proxyCall(serviceName, url, params);
}
private ApiResponse proxyPost(String serviceName, String url, Map<String, Object> params) {
return proxyCall(serviceName, url, params);
}
private ApiResponse proxyCall(String serviceName, String url, Map<String, Object> params) {
try {
// 接口调用者:1 UFO, 0 CPS
params.put("source", 1);
ApiResponse response = serviceCaller.get(serviceName, url, params, ApiResponse.class, null).get(500, TimeUnit.MILLISECONDS);
return response;
} catch (ServiceException e) {
throw e;
} catch (Exception e) {
log.warn("bank card service call fail, url is {} params is {}", url, params, e);
return new ApiResponse.ApiResponseBuilder().code(500).message("服务访问异常").build();
}
return bankCardService.proxyPost("ufo.bankcard.checkBankCard", url, params);
}
}
... ...
... ... @@ -9,6 +9,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Objects;
/**
* @author LUOXC
* @date 2019/4/2 14:58
... ... @@ -34,8 +36,12 @@ public class InviteSettlementController {
}
@RequestMapping(value = "/erp/invite/settlement/help/settle")
public ApiResponse settle() {
inviterService.settle();
public ApiResponse settle(@RequestParam(value = "uid", required = false) Integer uid) {
if (Objects.nonNull(uid)) {
inviterService.settle(uid);
} else {
inviterService.settle();
}
return new ApiResponse.ApiResponseBuilder().code(200).message("ok").build();
}
... ...
... ... @@ -498,4 +498,35 @@ public class SellerOrderController {
return new ApiResponse.ApiResponseBuilder().data(result).code(200).message(msg).build();
}
/**
* 发布出售二手or 瑕疵(全新)商品,生成保证金订单
* @param uid
* @param storage_id
* @param price
* @param address_id
* @return
* @throws GatewayException
*/
@RequestMapping(params = "method=ufo.seller.publishImperfectPrd")
@ResponseBody
public ApiResponse publishImperfectPrd(@RequestParam(name = "uid")int uid,
@RequestParam(name = "storage_id")int storage_id,
@RequestParam(name="price")String price,
@RequestParam(name="address_id")String address_id,
@RequestParam(name="num", defaultValue = "1", required = false)int num,
@RequestParam(name="skupType") Integer skupType) {
ImperfectOrderSubmitReq req = ImperfectOrderSubmitReq.builder()
.uid(uid)
.storageId(storage_id)
.price(price)
.addressId(address_id)
.skupType(skupType)
.build();
logger.info("in ufo.sellerOrder.publishImperfectPrd, req {}", req);
OrderSubmitResp resp = sellerOrderService.publishImperfectPrd(req);
return new ApiResponse.ApiResponseBuilder().data(resp).code(200).message("发布成功").build();
}
}
... ...
... ... @@ -58,7 +58,12 @@ public final class SellerOrderConvertor {
}
/**
* 可以动态配置服务费率提示
* @param computeResult
* @param tipsConfig 服务费率提示
* @return
*/
public static SoldPrdComputeBo computeResult2SoldPrdComputeBo(SellerOrderComputeResult computeResult,
Map<String,String> tipsConfig){
//保证金(28-200(按照卖家发布商品的货款金额5%计算,最低28,封顶200))
... ...
package com.yohoufo.order.model;
/**
* Created by chao.chen on 2019/4/3.
*/
public class ImperfectOrderContext extends SellerOrderContext {
}
... ...
package com.yohoufo.order.model.bo;
import lombok.Data;
/**
* @author LUOXC
* @date 2019/4/8 11:22
*/
@Data
public class BankCard {
private String name;
private String idCardNo;
private String bankName;
private String bankBranch;
private String bankCardNo;
}
... ...
package com.yohoufo.order.model.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Builder;
import java.math.BigDecimal;
/**
* Created by chao.chen on 2019/4/8.
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ImperfectComputePreparedNode {
private int uid;
private Integer storageId;
private BigDecimal salePrice;
private SellerOrderComputeResult computeResult;
}
... ...
... ... @@ -18,6 +18,11 @@ public interface IInviteSettlementService {
void settle();
/**
* 结算
*/
void settle(int uid);
/**
* 创建结算项
*
* @param buyerOrderCode
... ...
... ... @@ -59,9 +59,9 @@ public class SellerOrderPriceChangeHandler implements IEventHandler<SellerOrderP
logger.warn("Subscribe SellerOrderPriceChangeEvent msg return SellerOrderGoods is null, event {}", event);
return ;
}
boolean isAdvance = OrderAssist.skupIsAdvance(sog.getAttributes());
if(SkupStatus.CAN_SELL.getCode()!=sog.getStatus()||isAdvance){
logger.warn("Subscribe SellerOrderPriceChangeEvent msg return SellerOrderGoods status is not can sell or is Advance , event {} ,isAdvance {}, sog {}", event,isAdvance,sog);
boolean pushFlag = OrderAssist.skupPushWhenHasLowerPrice(sog.getAttributes());
if(SkupStatus.CAN_SELL.getCode()!=sog.getStatus()||!pushFlag){
logger.warn("Subscribe SellerOrderPriceChangeEvent msg return SellerOrderGoods status is not can sell or is not push type , event {} ,pushFlag {}, sog {}", event,pushFlag,sog);
return ;
}
int changedSellerUid = sog.getUid();
... ... @@ -71,7 +71,7 @@ public class SellerOrderPriceChangeHandler implements IEventHandler<SellerOrderP
List<SellerOrderGoods> noticeList= sellerOrderGoodsViewMapper.selectCanSellByStorageId(storageId);
//把自己过滤掉,只保留价格高于当前价格
//非预售的订单才push
noticeList = noticeList.stream().filter(r-> !OrderAssist.skupIsAdvance(r.getAttributes())&&r.getGoodsPrice().compareTo(changedPrice)>0&&changedSellerUid!=r.getUid().intValue()).collect(Collectors.toList());
noticeList = noticeList.stream().filter(r-> OrderAssist.skupPushWhenHasLowerPrice(r.getAttributes())&&r.getGoodsPrice().compareTo(changedPrice)>0&&changedSellerUid!=r.getUid().intValue()).collect(Collectors.toList());
if(CollectionUtils.isEmpty(noticeList)){
logger.warn("Subscribe SellerOrderPriceChangeEvent msg return because of empty non advance SellerOrderGoods list with same storage id , event {} ,sog {}", event,sog);
return ;
... ...
... ... @@ -7,15 +7,12 @@ import com.yohoufo.dal.order.model.InviteSettlement;
import com.yohoufo.dal.order.model.Inviter;
import com.yohoufo.order.model.InviteSettlementListVO;
import com.yohoufo.order.service.IInviteSettlementService;
import com.yohoufo.order.utils.IdUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;
... ... @@ -71,6 +68,11 @@ public class InviteSettlementServiceImpl implements IInviteSettlementService {
}
@Override
public void settle(int uid) {
inviterSettleService.settle(uid);
}
@Override
public void createInviteSettlementItem(Long buyerOrderCode, Integer status) {
inviteSettlementItemCreator.createInviteSettlementItem(buyerOrderCode, status);
}
... ...
... ... @@ -9,6 +9,8 @@ import com.yohoufo.dal.order.InviteSettlementItemMapper;
import com.yohoufo.dal.order.InviteSettlementMapper;
import com.yohoufo.dal.order.model.InviteSettlement;
import com.yohoufo.dal.order.model.InviteSettlementItem;
import com.yohoufo.order.model.bo.BankCard;
import com.yohoufo.order.service.proxy.BankCardService;
import com.yohoufo.order.utils.IdUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
... ... @@ -33,6 +35,9 @@ public class InviterSettleService {
@Autowired
private InviteSettlementItemMapper inviteSettlementItemMapper;
@Autowired
private BankCardService bankCardService;
public void settle(int uid) {
log.info("settle for {}", uid);
int now = DateUtil.getCurrentTimeSecond();
... ... @@ -42,6 +47,11 @@ public class InviterSettleService {
log.info("settle for {} end it has no item to settle.", uid);
return;
}
BankCard bankCard = bankCardService.getBankCard(uid);
if (Objects.isNull(bankCard)) {
log.warn("settle for {} end bank card is null.", uid);
return;
}
// 新建结算单
log.info("settle for {} create a new settlement.", uid);
InviteSettlement settlement = new InviteSettlement();
... ... @@ -50,6 +60,11 @@ public class InviterSettleService {
settlement.setSettleCode(0);
settlement.setSettleAmount(BigDecimal.ZERO);
settlement.setSettleTime(0);
settlement.setName(bankCard.getName());
settlement.setIdCardNo(bankCard.getIdCardNo());
settlement.setBankName(bankCard.getBankName());
settlement.setBankBranch(bankCard.getBankBranch());
settlement.setBankCardNo(bankCard.getBankCardNo());
settlement.setStatus(InviteSettlement.STATUS_WAIT_SETTLE);
inviteSettlementMapper.insert(settlement);
// 计算结算金额
... ...
... ... @@ -44,7 +44,7 @@ public class OrderDynamicConfig {
private Double payChannelRate = 0.006D;
/**
* 保证金上下限阈值
* 现货保证金上下限阈值
*/
private BigDecimal[] EARNEST_MONEY_RANGE = new BigDecimal[2];
... ... @@ -112,6 +112,7 @@ public class OrderDynamicConfig {
@PostConstruct
private void init() {
//现货
EARNEST_MONEY_RANGE[0] = new BigDecimal(earnestmoney_min);
EARNEST_MONEY_RANGE[1] = new BigDecimal(earnestmoney_max);
... ...
... ... @@ -392,7 +392,8 @@ public class SellerOrderDetailService extends AbsOrderDetailService implements I
resetPriceOfProduct(goodsInfo,skupStatus.getCode(), skupType);
orderDetailInfo.setGoodsInfo(goodsInfo);
//tips :最低价格时刻在变,不能缓存
resetDetailDesc(isAdvance,skupStatus,goodsInfo,statusDetail,appVersion);
boolean pushFlag = OrderAssist.skupPushWhenHasLowerPrice(soga);
resetDetailDesc(isAdvance,skupStatus,goodsInfo,statusDetail,appVersion,pushFlag);
// 支付状态
setPayment(orderDetailInfo, order.getPayment());
... ... @@ -425,9 +426,9 @@ public class SellerOrderDetailService extends AbsOrderDetailService implements I
private void resetDetailDesc(boolean isAdvance,
SkupStatus skupStatus,
GoodsInfo goodsInfo,
OrderDetailInfo.StatusDetail statusDetail,String appVersion){
OrderDetailInfo.StatusDetail statusDetail,String appVersion,boolean pushWhenHasLowerPriceFlag){
if(!isAdvance && sellerOrderViewService.showOverFlowPrice(skupStatus.getCode())) {
if(pushWhenHasLowerPriceFlag && sellerOrderViewService.showOverFlowPrice(skupStatus.getCode())) {
String tips = buildOverPriceTips(goodsInfo,appVersion);
if (StringUtils.isNotBlank(tips)) {
statusDetail.setDetailDesc(tips);
... ... @@ -550,7 +551,8 @@ public class SellerOrderDetailService extends AbsOrderDetailService implements I
SkupType skupType = SkupType.getSkupType(soga);
GoodsInfo goodsInfo = orderDetailInfo.getGoodsInfo();
resetPriceOfProduct(goodsInfo, skupStatusCode, skupType);
resetDetailDesc( isAdvance, skupStatus, goodsInfo, orderDetailInfo.getStatusDetail(),appVersion);
boolean pushFlag = OrderAssist.skupPushWhenHasLowerPrice(soga);
resetDetailDesc( isAdvance, skupStatus, goodsInfo, orderDetailInfo.getStatusDetail(),appVersion,pushFlag);
}
}
}
... ...
... ... @@ -315,7 +315,9 @@ public class SellerOrderListService extends AbsOrderListService implements IOrde
orderListInfo.setGoodsInfo(goodsInfo);
orderListInfo.setSecendLevelCreateTime(sellerOrder.getCreateTime());
orderListInfo.setCreateTime(DateUtil.formatDate(sellerOrder.getCreateTime(), DateUtil.yyyy_MM_dd_HH_mm_SS));
if (!isAdvance && sellerOrderViewService.showOverFlowPrice(skupStatus.getCode())){
boolean pushFlag = OrderAssist.skupPushWhenHasLowerPrice(soga);
if (pushFlag && sellerOrderViewService.showOverFlowPrice(skupStatus.getCode())){
String tips = overPriceTipsMap.get(OrderAssist.overFlowPriceKey(sellerOrderGoods.getStorageId(), sellerOrderGoods.getGoodsPrice()));
//若用户当前价格大于建议售价,仅显示价格隐藏提示
... ...
... ... @@ -42,6 +42,7 @@ import com.yohoufo.order.service.cache.OrderCacheService;
import com.yohoufo.order.service.concurrent.ThreadPoolFactory;
import com.yohoufo.order.service.handler.*;
import com.yohoufo.order.service.proxy.ResourcesProxyService;
import com.yohoufo.order.service.seller.imperfect.ImperfectGoodsService;
import com.yohoufo.order.service.seller.processor.*;
import com.yohoufo.order.service.impl.visitor.OffShelveCancelCase;
import com.yohoufo.order.service.impl.visitor.UserCancelCase;
... ... @@ -173,22 +174,13 @@ public class SellerOrderService implements IOrderListService, IOrderDetailServic
public SoldPrdComputeBo computePublishPrd(SellerOrderComputeReq req) throws GatewayException {
log.info("in computePublishPrd, req {}", req);
PriceComputePrepareProcessor.PriceComputeNode pcn = priceComputePrepareProcessor.checkBasePrice(req);
PriceComputePrepareProcessor.PriceComputeNode pcn = priceComputePrepareProcessor.checkAndAcquire(req);
int uid = pcn.getUid();
Integer storageId = pcn.getStorageId();
int num = pcn.getNum();
BigDecimal salePrice = pcn.getPrdPrice();
String tips = null;
PrdQueryReq pqr = PrdQueryReq.builder().uid(uid)
.storageId(storageId).prdPrice(salePrice).build();
PrdPrice prdPrice = priceComputePrepareProcessor.checkPulishAuthNPriceRange(pqr, true);
SkupType skupType = SkupType.getSkupType(req.getSkupType());
try {
priceComputePrepareProcessor.checkSuggestPrice(prdPrice, salePrice, skupType);
}catch (UfoServiceException ex){
tips = ex.getErrorMessage();
}
BigDecimal salePrice = pcn.getSalePrice();
PrdPrice prdPrice = pcn.getPrdPrice();
SkupType skupType = pcn.getSkupType();
String tips = priceComputePrepareProcessor.checkSuggestPrice(prdPrice, salePrice, skupType);
boolean isSuper = sellerService.isSuperEntrySeller(uid);
SoldPrdComputeBo spc = buildSoldPrdComputeBo(uid, num, salePrice, isSuper, skupType, prdPrice);
spc.setTips(tips);
... ... @@ -926,5 +918,12 @@ public class SellerOrderService implements IOrderListService, IOrderDetailServic
return occr;
}
@Autowired
private ImperfectGoodsService imperfectGoodsService;
public OrderSubmitResp publishImperfectPrd(ImperfectOrderSubmitReq req){
return imperfectGoodsService.publish(req);
}
}
... ...
... ... @@ -557,7 +557,8 @@ public class SkupListService {
orderListInfo.setGoodsInfo(productInfo);
//tips
if (!isAdvance){
boolean pushFlag = OrderAssist.skupPushWhenHasLowerPrice(soga);
if (pushFlag){
String tips = overPriceTipsMap.get(OrderAssist.overFlowPriceKey(sellerOrderGoods.getStorageId(), sellerOrderGoods.getGoodsPrice()));
//若用户当前价格大于建议售价,仅显示价格隐藏提示
... ...
package com.yohoufo.order.service.proxy;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.yoho.core.rest.client.ServiceCaller;
import com.yoho.error.exception.ServiceException;
import com.yohoufo.common.ApiResponse;
import com.yohoufo.order.model.bo.BankCard;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
/**
* @author LUOXC
* @date 2019/4/8 11:21
*/
@Slf4j
@Service
public class BankCardService {
@Autowired
ServiceCaller serviceCaller;
@Value("${erp-gateway.url}")
private String erpGatewayUrl;
public BankCard getBankCard(int uid) {
log.info("get bank card, uid is {}", uid);
String url = erpGatewayUrl + "/erp/union/bankcard/getBankCardUfo";
Map<String, Object> params = Maps.newHashMap();
params.put("uid", uid);
ApiResponse response = proxyGet("ufo.bankcard.getBankCardUfo", url, params);
if (response.getCode() != 200) {
return null;
}
if (Objects.isNull(response.getData())) {
return null;
}
if (response.getData() instanceof JSONObject) {
return ((JSONObject) response.getData()).toJavaObject(BankCard.class);
} else {
return JSONObject.parseObject(JSONObject.toJSONString(response.getData()), BankCard.class);
}
}
public ApiResponse proxyGet(String serviceName, String url, Map<String, Object> params) {
return proxyCall(serviceName, url, params);
}
public ApiResponse proxyPost(String serviceName, String url, Map<String, Object> params) {
return proxyCall(serviceName, url, params);
}
private ApiResponse proxyCall(String serviceName, String url, Map<String, Object> params) {
try {
// 接口调用者:1 UFO, 0 CPS
params.put("source", 1);
ApiResponse response = serviceCaller.get(serviceName, url, params, ApiResponse.class, null).get(500, TimeUnit.MILLISECONDS);
return response;
} catch (ServiceException e) {
throw e;
} catch (Exception e) {
log.warn("bank card service call fail, url is {} params is {}", url, params, e);
return new ApiResponse.ApiResponseBuilder().code(500).message("服务访问异常").build();
}
}
}
... ...
... ... @@ -164,16 +164,14 @@ public class UserProxyService {
*/
public Map<Integer, String> getNickNameByUids(List<Integer> uids){
String url = uicUrl + NICK_NAME_API;
UicUserReqBO uicUserReqBO = new UicUserReqBO();
uicUserReqBO.setUids(uids.stream().map(String::valueOf).collect(Collectors.joining(",")));
Map<String,Object> params = Maps.newHashMap();
params.put("uids", uids.stream().map(String::valueOf).collect(Collectors.joining(",")));
UserInfoRspBO[] userInfo ;
try {
userInfo = serviceCaller.post("uic.getNickName", url, uicUserReqBO,
userInfo = serviceCaller.post("uic.getNickName", url, params,
UserInfoRspBO[].class, null).get(500, TimeUnit.MILLISECONDS);
Map<Integer, String> nickNameMap = Arrays.stream(userInfo).collect(Collectors.toMap(UserInfoRspBO::getUid, UserInfoRspBO::getNickName));
Map<Integer, String> nickNameMap = Arrays.stream(userInfo).collect(Collectors.toMap(UserInfoRspBO::getYohoUid, UserInfoRspBO::getNickName));
return nickNameMap;
}catch (Exception ex){
... ...
package com.yohoufo.order.service.seller.changePrice;
import com.yohobuy.ufo.model.order.req.SellerOrderSubmitReq;
import com.yohoufo.order.model.NESCPOrderContext;
import com.yohoufo.order.model.SellerOrderContext;
import com.yohoufo.order.model.response.OrderSubmitResp;
import com.yohoufo.order.service.impl.SellerOrderService;
... ... @@ -14,7 +15,7 @@ import org.springframework.stereotype.Service;
* Created by chao.chen on 2019/3/22.
*/
@Service
public class NESChangePricePublishExcutor implements PublishExcutor<SellerOrderContext, OrderSubmitResp> {
public class NESChangePricePublishExcutor implements PublishExcutor<NESCPOrderContext, OrderSubmitResp> {
private Logger logger = LoggerUtils.getSellerOrderLogger();
... ... @@ -24,7 +25,7 @@ public class NESChangePricePublishExcutor implements PublishExcutor<SellerOrderC
SellerOrderService sellerOrderService;
@Override
public OrderSubmitResp publish(SellerOrderContext ctx) {
public OrderSubmitResp publish(NESCPOrderContext ctx) {
SellerOrderSubmitReq req = SellerOrderSubmitReq.builder()
.uid(ctx.getUid())
... ...
... ... @@ -21,7 +21,6 @@ import com.yohoufo.order.model.response.OrderSubmitResp;
import com.yohoufo.order.service.impl.SellerOrderCancelService;
import com.yohoufo.order.service.proxy.ProductProxyService;
import com.yohoufo.order.service.proxy.ResourcesProxyService;
import com.yohoufo.order.service.seller.SellerChangePriceRecordService;
import com.yohoufo.order.service.seller.processor.NESChangePricePrepareProcessor;
import com.yohoufo.order.service.seller.processor.NESChangePricePublishPrepareProcessor;
import com.yohoufo.order.utils.LoggerUtils;
... ...
package com.yohoufo.order.service.seller;
package com.yohoufo.order.service.seller.changePrice;
import com.yohobuy.ufo.model.order.constants.ChangePriceStatus;
import com.yohoufo.common.utils.DateUtil;
... ...
package com.yohoufo.order.service.seller.imperfect;
import com.yohobuy.ufo.model.order.constants.SkupType;
import com.yohoufo.order.model.dto.EarnestMoney;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
/**
* Created by chao.chen on 2019/4/3.
*/
@Service
public class FlamGoodsComputeHandler extends ImperfectGoodsComputeHandler {
@Override
EarnestMoney getDefaultEarnestMoney() {
EarnestMoney earnestMoney = new EarnestMoney();
earnestMoney.setRate(new BigDecimal(0.05));
earnestMoney.setMin(new BigDecimal(28));
earnestMoney.setMax(new BigDecimal(200));
return earnestMoney;
}
@Override
SkupType getSkupType() {
return SkupType.FLAW;
}
}
... ...
package com.yohoufo.order.service.seller.imperfect;
import com.yohobuy.ufo.model.order.constants.SkupType;
import com.yohoufo.order.model.dto.BuyerPenalty;
import com.yohoufo.order.model.dto.EarnestMoney;
import com.yohoufo.order.model.dto.ServiceFeeRate;
import com.yohoufo.order.service.impl.MetaConfigService;
import com.yohoufo.order.service.seller.AbsSellerOrderComputeHandler;
import com.yohoufo.order.service.seller.OrderComputeHandler;
import org.springframework.beans.factory.annotation.Autowired;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Objects;
/**
* Created by chao.chen on 2019/4/3.
*/
public abstract class ImperfectGoodsComputeHandler extends AbsSellerOrderComputeHandler implements OrderComputeHandler {
@Autowired
private MetaConfigService metaConfigService;
abstract EarnestMoney getDefaultEarnestMoney();
abstract SkupType getSkupType();
/**
* 相对独立 不涉及到计算其他费用
* @param prdPrice
* @return
*/
protected EarnestMoney calEarnestMoney(BigDecimal prdPrice){
//根据配置(来自于数据库或缓存 zk ,某一种数据存储方式)
EarnestMoney earnestMoney = new EarnestMoney();
earnestMoney.setPrdSalePrice(prdPrice);
//earnestMoney.rate 需要调整为动态可配
EarnestMoney emc = metaConfigService.getSellerEarnestMoney(getSkupType());
EarnestMoney defaultEM = getDefaultEarnestMoney();
BigDecimal rate = (emc==null || Objects.isNull(rate = emc.getRate())) ? defaultEM.getRate() : rate;
BigDecimal real = halfUp(prdPrice.multiply(rate));
BigDecimal min = (emc==null || Objects.isNull(min=emc.getMin())) ? defaultEM.getMin() : min;
BigDecimal max = (emc==null || Objects.isNull(max=emc.getMax())) ? defaultEM.getMax() : max;
real = calCrossWithThreshold(min, max, real);
earnestMoney.setMin(min);
earnestMoney.setMax(max);
earnestMoney.setRate(rate);
earnestMoney.setEarnestMoney(real);
return earnestMoney;
}
@Override
protected ServiceFeeRate buildServiceFeeRate(ServiceFeeRate psfr) {
//
ServiceFeeRate serviceFeeRate = orderDynamicConfig.cloneServiceFeeRate();
BigDecimal pgpr;
if (psfr !=null
&& (pgpr = psfr.getGoodsPaymentRate()) !=null){
serviceFeeRate.setGoodsPaymentRate(pgpr);
}
return serviceFeeRate;
}
@Override
protected Collection<BuyerPenalty.Fee> buildStagedCollection() {
return null;
}
}
... ...
package com.yohoufo.order.service.seller.imperfect;
import com.yohobuy.ufo.model.order.bo.PrdPrice;
import com.yohobuy.ufo.model.order.constants.SkupType;
import com.yohobuy.ufo.model.order.req.SellerOrderComputeReq;
import com.yohoufo.common.exception.UfoServiceException;
import com.yohoufo.order.model.dto.ImperfectComputePreparedNode;
import com.yohoufo.order.model.dto.SellerOrderComputeResult;
import com.yohoufo.order.model.request.PrdQueryReq;
import com.yohoufo.order.service.seller.OrderComputeHandler;
import com.yohoufo.order.service.seller.OrderComputeProvider;
import com.yohoufo.order.service.seller.processor.PriceComputePrepareProcessor;
import com.yohoufo.order.utils.LoggerUtils;
import com.yohoufo.order.utils.OrderAssist;
import com.yohoufo.order.utils.SellerGoodsHelper;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
/**
* Created by chao.chen on 2019/4/8.
*/
@Service
public class ImperfectGoodsComputePrepareProcessor {
private final Logger logger = LoggerUtils.getSellerOrderLogger();
@Autowired
private PriceComputePrepareProcessor priceComputePrepareProcessor;
@Autowired
OrderComputeProvider orderComputeProvider;
public ImperfectComputePreparedNode checkAndAcquire(SellerOrderComputeReq req){
int uid = req.getUid();
if(uid <= 0){
logger.warn("in ImperfectGoodsComputePrepareProcessor.checkAndAcquire uid illegal , req {}", req);
throw new UfoServiceException(400, "用户ID错误");
}
//
Integer storageId = req.getStorageId();
if (storageId <=0 ){
logger.warn("in ImperfectGoodsComputePrepareProcessor.checkAndAcquire storageId illegal , req {}", req);
throw new UfoServiceException(400, "storageId 错误");
}
Integer skupTypeCode = req.getSkupType();
SkupType skupType = SkupType.getSkupType(skupTypeCode);
if (!SellerGoodsHelper.isImperfectGoods(skupType)){
logger.warn("in ImperfectGoodsComputePrepareProcessor.checkAndAcquire skup-type illegal , req {}", req);
throw new UfoServiceException(400, "参数skupType非法");
}
BigDecimal salePrice = priceComputePrepareProcessor.checkAndAcquireSalePrice(req.getPrice(), skupType);
PrdQueryReq pqr = PrdQueryReq.builder()
.uid(uid).prdPrice(salePrice).storageId(storageId).build();
PrdPrice prdPrice = priceComputePrepareProcessor.checkPriceRange(pqr, true);
OrderComputeHandler computeHandler = orderComputeProvider.findBySkupType(skupType);
//TODO imperfect goods whether need to use special fee of platform service
SellerOrderComputeResult pcc = OrderAssist.buildPersonalComputeConfig(prdPrice);
SellerOrderComputeResult computeResult = computeHandler.compute(salePrice, pcc);
return ImperfectComputePreparedNode.builder()
.uid(uid).storageId(storageId)
.salePrice(salePrice).computeResult(computeResult).build();
}
}
... ...
package com.yohoufo.order.service.seller.imperfect;
import com.yohobuy.ufo.model.order.req.ImperfectOrderSubmitReq;
import com.yohoufo.order.model.ImperfectOrderContext;
import com.yohoufo.order.model.response.OrderSubmitResp;
import com.yohoufo.order.service.seller.PublishExcutor;
import org.springframework.stereotype.Service;
/**
* Created by chao.chen on 2019/4/3.
*/
@Service
public class ImperfectGoodsPublishExcutor implements PublishExcutor<ImperfectOrderContext,OrderSubmitResp> {
@Override
public OrderSubmitResp publish(ImperfectOrderContext o) {
return null;
}
}
... ...
package com.yohoufo.order.service.seller.imperfect;
import com.yohobuy.ufo.model.order.bo.SoldPrdComputeBo;
import com.yohobuy.ufo.model.order.req.ImperfectOrderSubmitReq;
import com.yohobuy.ufo.model.order.req.SellerOrderComputeReq;
import com.yohoufo.order.convert.SellerOrderConvertor;
import com.yohoufo.order.model.ImperfectOrderContext;
import com.yohoufo.order.model.dto.ImperfectComputePreparedNode;
import com.yohoufo.order.model.response.OrderSubmitResp;
import com.yohoufo.order.utils.LoggerUtils;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* Created by chao.chen on 2019/4/3.
* @version 6.9.1
*/
@Service
public class ImperfectGoodsService {
private Logger logger = LoggerUtils.getSellerOrderLogger();
@Autowired
private ImperfectGoodsComputePrepareProcessor imperfectGoodsComputePrepareProcessor;
@Autowired
ImperfectGoodsPublishExcutor imperfectGoodsPublishExcutor;
/**
* 算费
* @param req
* @return
*/
public SoldPrdComputeBo compute(SellerOrderComputeReq req){
logger.info("in ImperfectGoodsService.compute,req {}", req);
ImperfectComputePreparedNode icpNode = imperfectGoodsComputePrepareProcessor.checkAndAcquire(req);
SoldPrdComputeBo spcb = SellerOrderConvertor.pureComputeResult2SoldPrdComputeBo(icpNode.getComputeResult());
return spcb;
}
public OrderSubmitResp publish(ImperfectOrderSubmitReq req){
logger.info("in ImperfectGoodsService.publish req {}", req);
//todo check req and build context of submit
ImperfectOrderContext ctx = null;
return imperfectGoodsPublishExcutor.publish(ctx);
}
}
... ...
package com.yohoufo.order.service.seller.imperfect;
import com.yohobuy.ufo.model.order.constants.SkupType;
import com.yohoufo.order.model.dto.EarnestMoney;
import com.yohoufo.order.service.seller.OrderComputeHandler;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
/**
* Created by chao.chen on 2019/4/3.
*/
@Service
public class SecondHandGoodsComputeHandler extends ImperfectGoodsComputeHandler implements OrderComputeHandler {
@Override
EarnestMoney getDefaultEarnestMoney() {
EarnestMoney earnestMoney = new EarnestMoney();
earnestMoney.setRate(new BigDecimal(0.08));
earnestMoney.setMin(new BigDecimal(28));
earnestMoney.setMax(new BigDecimal(200));
return earnestMoney;
}
@Override
SkupType getSkupType() {
return SkupType.SECOND_HAND;
}
}
... ...
package com.yohoufo.order.service.handler;
import com.yohobuy.ufo.model.order.constants.SkupType;
import com.yohoufo.order.model.dto.BuyerPenalty;
import com.yohoufo.order.model.dto.EarnestMoney;
import com.yohoufo.order.model.dto.SellerOrderComputeResult;
import com.yohoufo.order.model.dto.ServiceFeeRate;
import com.yohoufo.order.service.impl.MetaConfigService;
import com.yohoufo.order.service.seller.AbsSellerOrderComputeHandler;
import com.yohoufo.order.service.seller.OrderComputeHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Objects;
/**
* Created by chenchao on 2018/9/14.
*/
@Component
public class SellerOrderComputeHandler extends AbsSellerOrderComputeHandler implements OrderComputeHandler {
@Autowired
private MetaConfigService metaConfigService;
/**
* 相对独立 不涉及到计算其他费用
* @param prdPrice
* @return
*/
protected EarnestMoney calEarnestMoney(BigDecimal prdPrice){
BigDecimal[] EARNEST_MONEY_RANGE = orderDynamicConfig.getEMR();
EarnestMoney earnestMoney = new EarnestMoney();
// earnestMoney.rate 动态可配
EarnestMoney emc = metaConfigService.getSellerEarnestMoney(SkupType.IN_STOCK);
BigDecimal rate = (emc==null || Objects.isNull(rate = emc.getRate())) ? new BigDecimal(0.08D) : rate;
earnestMoney.setRate(rate);
//
BigDecimal real = halfUp(prdPrice.multiply(rate));
final BigDecimal min = EARNEST_MONEY_RANGE[0] == null ? earnestMoney.getMin() : EARNEST_MONEY_RANGE[0];
final BigDecimal max = EARNEST_MONEY_RANGE[1] == null ? earnestMoney.getMax() : EARNEST_MONEY_RANGE[1];
real = calCrossWithThreshold(min, max, real);
earnestMoney.setMin(min);
earnestMoney.setMax(max);
earnestMoney.setEarnestMoney(real);
earnestMoney.setPrdSalePrice(prdPrice);
return earnestMoney;
}
@Override
protected ServiceFeeRate buildServiceFeeRate(ServiceFeeRate psfr) {
//
ServiceFeeRate serviceFeeRate = orderDynamicConfig.cloneServiceFeeRate();
BigDecimal pgpr;
if (psfr !=null
&& (pgpr = psfr.getGoodsPaymentRate()) !=null){
serviceFeeRate.setGoodsPaymentRate(pgpr);
}
return serviceFeeRate;
}
@Override
protected Collection<BuyerPenalty.Fee> buildStagedCollection() {
return null;
}
}
package com.yohoufo.order.service.seller.inStock;
import com.yohobuy.ufo.model.order.constants.SkupType;
import com.yohoufo.order.model.dto.BuyerPenalty;
import com.yohoufo.order.model.dto.EarnestMoney;
import com.yohoufo.order.model.dto.SellerOrderComputeResult;
import com.yohoufo.order.model.dto.ServiceFeeRate;
import com.yohoufo.order.service.impl.MetaConfigService;
import com.yohoufo.order.service.seller.AbsSellerOrderComputeHandler;
import com.yohoufo.order.service.seller.OrderComputeHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Objects;
/**
* 现货商品
* Created by chenchao on 2018/9/14.
*/
@Component
public class SellerOrderComputeHandler extends AbsSellerOrderComputeHandler implements OrderComputeHandler {
@Autowired
private MetaConfigService metaConfigService;
/**
* 相对独立 不涉及到计算其他费用
* @param prdPrice
* @return
*/
protected EarnestMoney calEarnestMoney(BigDecimal prdPrice){
BigDecimal[] EARNEST_MONEY_RANGE = orderDynamicConfig.getEMR();
EarnestMoney earnestMoney = new EarnestMoney();
// earnestMoney.rate 动态可配
EarnestMoney emc = metaConfigService.getSellerEarnestMoney(SkupType.IN_STOCK);
BigDecimal rate = (emc==null || Objects.isNull(rate = emc.getRate())) ? new BigDecimal(0.08D) : rate;
earnestMoney.setRate(rate);
//
BigDecimal real = halfUp(prdPrice.multiply(rate));
final BigDecimal min = EARNEST_MONEY_RANGE[0] == null ? earnestMoney.getMin() : EARNEST_MONEY_RANGE[0];
final BigDecimal max = EARNEST_MONEY_RANGE[1] == null ? earnestMoney.getMax() : EARNEST_MONEY_RANGE[1];
real = calCrossWithThreshold(min, max, real);
earnestMoney.setMin(min);
earnestMoney.setMax(max);
earnestMoney.setEarnestMoney(real);
earnestMoney.setPrdSalePrice(prdPrice);
return earnestMoney;
}
@Override
protected ServiceFeeRate buildServiceFeeRate(ServiceFeeRate psfr) {
//
ServiceFeeRate serviceFeeRate = orderDynamicConfig.cloneServiceFeeRate();
BigDecimal pgpr;
if (psfr !=null
&& (pgpr = psfr.getGoodsPaymentRate()) !=null){
serviceFeeRate.setGoodsPaymentRate(pgpr);
}
return serviceFeeRate;
}
@Override
protected Collection<BuyerPenalty.Fee> buildStagedCollection() {
return null;
}
}
... ...
package com.yohoufo.order.service.seller;
package com.yohoufo.order.service.seller.preSale;
import com.yohobuy.ufo.model.order.constants.SkupType;
import com.yohoufo.order.model.dto.BuyerPenalty;
import com.yohoufo.order.model.dto.EarnestMoney;
import com.yohoufo.order.model.dto.ServiceFeeRate;
import com.yohoufo.order.service.impl.MetaConfigService;
import com.yohoufo.order.service.seller.AbsSellerOrderComputeHandler;
import com.yohoufo.order.service.seller.OrderComputeHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
... ...
... ... @@ -52,8 +52,8 @@ public abstract class AbsEntryChangePricePrepareProcessor<T extends SellerBaseCh
//检查是否有买家下单,返回的是可售 待买家付款的skup
Map<Integer, SkupDto> skupOfSalingMap = checkExistWaitingBuyerPay(req);
BigDecimal salePrice = priceComputePrepareProcessor.checkAndAcquireSalePrice(req.getPrice());
SkupType skupType = SkupType.getSkupType(req.getSkupType());
BigDecimal salePrice = priceComputePrepareProcessor.checkAndAcquireSalePrice(req.getPrice(), skupType);
//若needChangePriceSkupList中有skup出现不存在于skupOfSalingMap keys中,说明该skup走到了其他状态中
Map<Integer, SkupDto> skupMap = checkNeedProcessSkups(getExpectedSkups(req), req.getOldPrice(), salePrice, skupOfSalingMap);
// //
... ... @@ -66,18 +66,11 @@ public abstract class AbsEntryChangePricePrepareProcessor<T extends SellerBaseCh
BigDecimal sourceEM = sellerOrder.getEarnestMoney();
int storageId = sampleSog.getStorageId();
String tips = null;
PrdQueryReq pqr = PrdQueryReq.builder().uid(uid).storageId(storageId)
.prdPrice(salePrice).build();
PrdPrice prdPrice;
prdPrice = priceComputePrepareProcessor.checkPriceRange(pqr, req.isShowPriceError());
SkupType skupType = SkupType.getSkupType(req.getSkupType());
try {
priceComputePrepareProcessor.checkSuggestPrice(prdPrice, salePrice, skupType);
}catch (UfoServiceException ex){
tips = ex.getErrorMessage();
}
String tips = priceComputePrepareProcessor.checkSuggestPrice(prdPrice, salePrice, skupType);
// compute every fee from price
SellerOrderComputeResult pcc = OrderAssist.buildPersonalComputeConfig(prdPrice);
OrderComputeHandler computeHandler = orderComputeProvider.findBySkupType(skupType);
... ...
... ... @@ -58,10 +58,6 @@ public class NESChangePricePrepareProcessor extends AbsChangePricePrepareProcess
logger.warn("ChangePrice checkAndAcquire uid illegal , req {}", req);
throw new UfoServiceException(400, "参数[uid]错误");
}
if (uid <=0){
logger.warn("in ChangePrice uid illegal, req {}", req);
throw new UfoServiceException(400, "参数uid非法");
}
int skup = req.getSkup();
if (skup<=0){
logger.warn("in ChangePrice find illegal skup code, req {}", req);
... ... @@ -83,24 +79,20 @@ public class NESChangePricePrepareProcessor extends AbsChangePricePrepareProcess
SkupDto skupOfUnChange = checkExistWaitingBuyerPay(psog);
//检查是否有买家下单
checkGoodsStatus(psog);
BigDecimal salePrice = priceComputePrepareProcessor.checkAndAcquireSalePrice(req.getPrice());
SkupType skupType = SkupType.getSkupType(psog.getAttributes());
BigDecimal salePrice = priceComputePrepareProcessor.checkAndAcquireSalePrice(req.getPrice(), skupType);
BigDecimal preSalePrice = psog.getGoodsPrice();
//check old price vs new price
checkChangeNecessary(skup, preSalePrice, salePrice);
String tips = null;
PrdPrice prdPrice;
int storageId = psog.getStorageId();
PrdQueryReq pqr = PrdQueryReq.builder()
.uid(uid).prdPrice(salePrice).storageId(storageId).build();
prdPrice = priceComputePrepareProcessor.checkPriceRange(pqr, true);
SkupType skupType = SkupType.getSkupType(psog.getAttributes());
try {
priceComputePrepareProcessor.checkSuggestPrice(prdPrice, salePrice, skupType);
}catch (UfoServiceException ex){
tips = ex.getErrorMessage();
}
String tips = priceComputePrepareProcessor.checkSuggestPrice(prdPrice, salePrice, skupType);
// compute every fee from price
SellerOrderComputeResult pcc = OrderAssist.buildPersonalComputeConfig(prdPrice);
OrderComputeHandler computeHandler = orderComputeProvider.findBySkupType(skupType);
... ...
... ... @@ -83,22 +83,19 @@ public class NESChangePricePublishPrepareProcessor extends AbsPublishPrepareProc
SkupDto skupOfUnChange = nesChangePricePrepareProcessor.checkExistWaitingBuyerPay(psog);
//检查是否有买家下单
nesChangePricePrepareProcessor.checkGoodsStatus(psog);
BigDecimal salePrice = priceComputePrepareProcessor.checkAndAcquireSalePrice(req.getPrice());
SkupType skupType = SkupType.getSkupType(psog.getAttributes());
BigDecimal salePrice = priceComputePrepareProcessor.checkAndAcquireSalePrice(req.getPrice(), skupType);
BigDecimal preSalePrice = psog.getGoodsPrice();
//check old price vs new price
checkChangeNecessary(skup, preSalePrice, salePrice);
String tips = null;
PrdPrice prdPrice;
int storageId = psog.getStorageId();
PrdQueryReq pqr = PrdQueryReq.builder()
.uid(uid).prdPrice(salePrice).storageId(storageId).build();
prdPrice = priceComputePrepareProcessor.checkPriceRange(pqr, true);
SkupType skupType = SkupType.getSkupType(psog.getAttributes());
try {
priceComputePrepareProcessor.checkSuggestPrice(prdPrice, salePrice, skupType);
}catch (UfoServiceException ex){
tips = ex.getErrorMessage();
}
String tips = priceComputePrepareProcessor.checkSuggestPrice(prdPrice, salePrice, skupType);
// compute every fee from price
SellerOrderComputeResult pcc = OrderAssist.buildPersonalComputeConfig(prdPrice);
OrderComputeHandler computeHandler = orderComputeProvider.findBySkupType(skupType);
... ...
... ... @@ -12,7 +12,10 @@ import com.yohoufo.order.model.request.PrdQueryReq;
import com.yohoufo.order.service.proxy.ProductProxyService;
import com.yohoufo.order.utils.LoggerUtils;
import com.yohoufo.order.utils.SellerGoodsHelper;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Builder;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
... ... @@ -38,21 +41,32 @@ public class PriceComputePrepareProcessor {
private SellerAuthCheckService sellerAuthCheckService;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class PriceComputeNode{
int uid;
Integer storageId;
int num;
BigDecimal prdPrice;
BigDecimal salePrice;
PrdPrice prdPrice;
SkupType skupType;
}
public PriceComputeNode(int uid, Integer storageId, int num, BigDecimal prdPrice) {
this.uid = uid;
this.storageId = storageId;
this.num = num;
this.prdPrice = prdPrice;
/**
* 检查是否以9结尾
* @param price
*/
public void checkTailWith9(String price){
if(!price.endsWith("9")){
log.warn("in checkAndAcquireSalePrice price illegal , price {}", price);
throw new UfoServiceException(400, "出售价格必须以9结尾");
}
}
public BigDecimal checkAndAcquireSalePrice(String price){
public BigDecimal checkAndAcquireSalePrice(String price, SkupType skupType){
/*商品鉴定费 ¥10.00
商品包装费 ¥10.00
... ... @@ -78,14 +92,13 @@ public class PriceComputePrepareProcessor {
throw new UfoServiceException(401, "价格只能为正整数");
}
if(!price.endsWith("9")){
log.warn("in checkAndAcquireSalePrice price illegal , price {}", price);
throw new UfoServiceException(400, "出售价格必须以9结尾");
if (!SellerGoodsHelper.isImperfectGoods(skupType)){
checkTailWith9(price);
}
return prdPrice;
}
public PriceComputeNode checkBasePrice(SellerOrderComputeReq req) {
public PriceComputeNode checkAndAcquire(SellerOrderComputeReq req) {
int uid = req.getUid();
if(uid <= 0){
log.warn("in computePublishPrd uid illegal , req {}", req);
... ... @@ -102,10 +115,19 @@ public class PriceComputePrepareProcessor {
log.warn("in computePublishPrd num illegal , req {}", req);
throw new UfoServiceException(400, "非法数量值");
}
BigDecimal prdPrice = checkAndAcquireSalePrice(req.getPrice());
return new PriceComputeNode(uid, storageId, num, prdPrice);
SkupType skupType = SkupType.getSkupType(req.getSkupType());
BigDecimal salePrice = checkAndAcquireSalePrice(req.getPrice(), skupType);
PrdQueryReq pqr = PrdQueryReq.builder().uid(uid)
.storageId(storageId).prdPrice(salePrice).build();
PrdPrice prdPrice = checkPulishAuthNPriceRange(pqr, true);
return PriceComputeNode.builder()
.uid(uid)
.num(num)
.salePrice(salePrice)
.storageId(storageId)
.prdPrice(prdPrice)
.skupType(skupType)
.build();
}
public void checkPublishAuth(Integer uid,int storageId, BigDecimal prdPrice, PrdPrice prdPriceRange){
... ... @@ -163,15 +185,18 @@ public class PriceComputePrepareProcessor {
}
}
public void checkSuggestPrice(PrdPrice prdPrice, BigDecimal salePrice, SkupType skupType){
public String checkSuggestPrice(PrdPrice prdPrice, BigDecimal salePrice, SkupType skupType){
if (Objects.nonNull(skupType) && SkupType.ADVANCE.equals(skupType)){
return;
return null;
}
BigDecimal suggestMaxPrice = prdPrice.getSuggestMaxPrice();
if (SellerGoodsHelper.isOverSuggestMaxPrice(suggestMaxPrice, salePrice)){
log.warn("in computePublishPrd,prdPrice {}, prdPriceRange {}", salePrice, prdPrice);
throw new UfoServiceException(TIPS_ERROR_CODE, OrderConstant.Tips.SUGGEST_MAX_PRICE_OVERFLOW);
log.warn("in checkSuggestPrice,prdPrice {}, prdPriceRange {}", salePrice, prdPrice);
return OrderConstant.Tips.SUGGEST_MAX_PRICE_OVERFLOW;
}
return null;
}
public void checkIncome(int storageId, BigDecimal income) {
... ...
... ... @@ -90,8 +90,8 @@ public class SellerOrderPrepareProcessor extends AbsPublishPrepareProcessor<Sell
log.warn("storageId illegal , uid {}", uid);
throw new UfoServiceException(400, "storageId 错误");
}
BigDecimal salePrice = priceComputePrepareProcessor.checkAndAcquireSalePrice(req.getPrice());
SkupType skupType = SkupType.getSkupType(req.getSkupType());
BigDecimal salePrice = priceComputePrepareProcessor.checkAndAcquireSalePrice(req.getPrice(), skupType);
int addressId = AddressUtil.getDecryptStr(req.getAddressId());
if (addressId < 0){
... ... @@ -117,7 +117,7 @@ public class SellerOrderPrepareProcessor extends AbsPublishPrepareProcessor<Sell
context.setBackAddress(noHiddenBackAddress);
context.setBackHiddenAddress(hiddenBackAddress);
//
SkupType skupType = SkupType.getSkupType(req.getSkupType());
context.setSkupType(skupType);
//step 1: rpc get product detail by storage id
//ufo.product.storage.data
... ... @@ -132,11 +132,10 @@ public class SellerOrderPrepareProcessor extends AbsPublishPrepareProcessor<Sell
.uid(uid).prdPrice(salePrice).storageId(storageId).build();
PrdPrice prdPrice = priceComputePrepareProcessor.checkPulishAuthNPriceRange(pqr, true);
String tips = priceComputePrepareProcessor.checkSuggestPrice(prdPrice, salePrice, skupType);
try {
priceComputePrepareProcessor.checkSuggestPrice(prdPrice, salePrice, skupType);
}catch (UfoServiceException ex){
context.setPriceOverFlowTips( ex.getErrorMessage());
if(tips != null){
context.setPriceOverFlowTips( tips);
}
// compute every fee from price
... ...
... ... @@ -2,6 +2,7 @@ package com.yohoufo.order.utils;
import com.yohobuy.ufo.model.order.bo.PrdPrice;
import com.yohobuy.ufo.model.order.common.OrderAttributes;
import com.yohobuy.ufo.model.order.common.PrdAttributes;
import com.yohobuy.ufo.model.order.constants.SkupType;
import com.yohoufo.order.model.dto.PlatformFeeDto;
import com.yohoufo.order.model.dto.SellerOrderComputeResult;
... ... @@ -25,6 +26,17 @@ public class OrderAssist {
return Objects.nonNull(attribute) && SkupType.ADVANCE.getCode() == attribute;
}
/**
* 更低价push的类型:1:普通现货, 2:线下店,
* 不提醒 :3:急速发货, 4:普通预售 ,5 瑕疵,6 二手
* @param attribute
* @return
*/
public static boolean skupPushWhenHasLowerPrice(Integer attribute){
return Objects.nonNull(attribute) && (PrdAttributes.COMMON_IN_STOCK.getCode() == attribute
||PrdAttributes.OFFLINE.getCode() == attribute );
}
public static String getSkupIsAdvance(Integer attribute){
return skupIsAdvance(attribute) ? Y : N;
}
... ...
package com.yohoufo.order.utils;
import com.yohobuy.ufo.model.order.constants.SkupType;
import java.math.BigDecimal;
import java.util.Objects;
... ... @@ -12,5 +14,8 @@ public final class SellerGoodsHelper {
return Objects.nonNull(suggestMaxPrice) && prdPrice.compareTo(suggestMaxPrice) > 0;
}
public static boolean isImperfectGoods(SkupType skupType){
return skupType!=null
&& (SkupType.FLAW.equals(skupType) || SkupType.SECOND_HAND.equals(skupType));
}
}
... ...
package com.yohoufo.order.service;
import com.alibaba.fastjson.JSONObject;
import com.yohobuy.ufo.model.order.bo.SoldPrdComputeBo;
import com.yohoufo.order.model.dto.SellerOrderComputeResult;
import com.yohoufo.order.service.handler.SellerOrderComputeHandler;
import com.yohoufo.order.service.impl.SellerOrderService;
import com.yohoufo.order.utils.OrderAssist;
import com.yohoufo.order.service.seller.inStock.SellerOrderComputeHandler;
import org.junit.Test;
import java.math.BigDecimal;
... ...