Authored by mali

仓库记录续约

... ... @@ -38,4 +38,8 @@ public class DepositOrder {
private BigDecimal shipFee;
private Integer initStatus;
private BigDecimal lateFee; // 滞纳金
private BigDecimal renewFee; // 续约费用
}
\ No newline at end of file
... ...
... ... @@ -15,10 +15,12 @@
<result column="status" property="status" jdbcType="INTEGER" />
<result column="create_time" property="createTime" jdbcType="INTEGER" />
<result column="update_time" property="updateTime" jdbcType="INTEGER" />
<result column="late_fee" property="lateFee" jdbcType="DECIMAL" />
<result column="renew_fee" property="renewFee" jdbcType="DECIMAL" />
</resultMap>
<sql id="Base_Column_List" >
id, uid, order_code, deposit_code, amount, payment, client_type, event_type, status,
create_time, update_time, ship_fee, contract_fee
create_time, update_time, ship_fee, contract_fee, late_fee, renew_fee
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
select
... ... @@ -31,14 +33,14 @@
insert into deposit_order (id, uid, order_code,
deposit_code, amount, payment,
client_type, event_type, status,
create_time, update_time, contract_fee,ship_fee)
create_time, update_time, contract_fee,ship_fee, late_fee, renew_fee)
values (#{id,jdbcType=INTEGER}, #{uid,jdbcType=INTEGER}, #{orderCode,jdbcType=BIGINT},
#{depositCode,jdbcType=VARCHAR}, #{amount,jdbcType=DECIMAL}, #{payment,jdbcType=INTEGER},
#{clientType,jdbcType=INTEGER}, #{eventType,jdbcType=INTEGER}, #{status,jdbcType=INTEGER},
#{createTime,jdbcType=INTEGER}, #{updateTime,jdbcType=INTEGER}, #{contractFee,jdbcType=DECIMAL}, #{shipFee,jdbcType=DECIMAL})
#{createTime,jdbcType=INTEGER}, #{updateTime,jdbcType=INTEGER}, #{contractFee,jdbcType=DECIMAL}, #{shipFee,jdbcType=DECIMAL}
, #{lateFee,jdbcType=DECIMAL}, #{renewFee,jdbcType=DECIMAL})
</insert>
<update id="updatePayment" parameterType="com.yohoufo.dal.order.model.DepositOrder">
update deposit_order
set payment = #{payment,jdbcType=INTEGER},
... ...
... ... @@ -118,4 +118,46 @@ public class DepositOrderController {
depositOrderService.clearDepositOrderCache(build, this.getClass());
return new ApiResponse(200, "缓存清除成功!", Boolean.TRUE);
}
/**
* 根据库存货号,计算续约的费用
* @param uid
* @param deposit_code 库存货号
* @param price
* @return
* @throws GatewayException
* http://java-yohoufo-fore.test3.ingress.dev.yohocorp.com/ufo-gateway/?debug=XYZ&method=ufo.deposit.computeRecall&uid=500031974&deposit_code=56257845&address_id=JJK1Ry05yFHv+DIkz2ti3A==
*/
@RequestMapping(params = "method=ufo.deposit.computeRenew")
@ResponseBody
public ApiResponse computeRenewPrd(@RequestParam(name = "uid", required = true)int uid,
@RequestParam(name = "deposit_code", required = true)String depositCode) throws GatewayException {
DepositOrderComputeReq req = DepositOrderComputeReq.builder().uid(uid).depositCode(depositCode).build();
LOG.info("in ufo.deposit.computeRenew, req {}", req);
DepositOrderComputeResp resp = depositOrderService.computeRenewPrd(req);
return new ApiResponse.ApiResponseBuilder().code(200).data(resp).message("算费成功").build();
}
/**
* 创建续约订单
* @param uid
* @param deposit_code 库存货号
* @param price
* @return
* @throws GatewayException
* http://java-yohoufo-fore.test3.ingress.dev.yohocorp.com/ufo-gateway/?debug=XYZ&method=ufo.deposit.publishDepositOrder&uid=500031974&deposit_code=56257845&address_id=JJK1Ry05yFHv+DIkz2ti3A==
*/
@RequestMapping(params = "method=ufo.deposit.publishRenewOrder")
@ResponseBody
public ApiResponse publishRenewOrder(@RequestParam(name = "uid", required = true)int uid,
@RequestParam(name = "deposit_code", required = true)String depositCode) throws GatewayException {
DepositOrderComputeReq req = DepositOrderComputeReq.builder().uid(uid).depositCode(depositCode).build();
LOG.info("in ufo.deposit.publishRenewOrder, req {}", req);
OrderSubmitResponse resp = depositOrderService.publishDepositRenewOrder(req);
return new ApiResponse.ApiResponseBuilder().code(200).data(resp).message("创建成功").build();
}
}
... ...
... ... @@ -103,7 +103,7 @@ public class DepositOrderService {
GoodsInfo goodsInfo = getGoodsInfo(skup); // 查询购买商品的详细信息
AddressInfo addressInfo = buyerOrderMetaService.getHiddenAddressInfo(req.getUid(), orderCode);
AddressInfo addressInfo = buyerOrderMetaService.getHiddenAddressInfo(req.getUid(), orderCode); // 获取用户的地址
addressInfo.setAddress_id_str(AddressUtil.getEncryptStr(String.valueOf(addressInfo.getAddress_id())));// 加密addressId
... ... @@ -112,7 +112,7 @@ public class DepositOrderService {
setBuyerPrice(orderCode, priceInfo); // 设置入手价
return DepositOrderComputeResp.builder().depositRemainDay(getReplacedContent(DepositOrderComputeResp.DEPOSITREMAINDAY_TIP, depositRemainDay))
return DepositOrderComputeResp.builder().depositRemainDay(getRemainDayDesc(depositRemainDay))
.userAddress(addressInfo).priceInfo(priceInfo).goodsInfo(goodsInfo).build();
}
... ... @@ -121,9 +121,7 @@ public class DepositOrderService {
public OrderSubmitResponse publishDepositOrder(DepositOrderComputeReq req) {
Integer uid = req.getUid();
if (uid == null || uid <= 0){
throw new ServiceException(ServiceError.ORDER_REQUEST_PARM_IS_EMPTY);
}
checkUid(uid);
StorageDeposit storageDeposit = checkStorageDeposit(req,
Lists.newArrayList(StorageDepositStatusEnum.HAS_IN.getCode())); //查看在库状态的库存
... ... @@ -135,6 +133,8 @@ public class DepositOrderService {
DepositOrder depositOrder = DepositOrder.builder().uid(uid).amount(new BigDecimal(priceInfo.getAmount()))
.contractFee(new BigDecimal(priceInfo.getContractFee()))
.shipFee(new BigDecimal(priceInfo.getShipFee()))
.lateFee(BigDecimal.valueOf(0.00))
.renewFee(BigDecimal.valueOf(0.00))
.createTime(now).depositCode(req.getDepositCode())
.eventType(DepositEventTypeEnum.DEPOSIT_RECALL_FEE.getCode()).orderCode(orderCode).payment(0).status(0).updateTime(now).build();
... ... @@ -256,7 +256,25 @@ public class DepositOrderService {
return DepositOrderComputeResp.PriceInfo.builder().contractFee(formatFee(contractFee)).shipFee(formatFee(shipFee)).amount(formatFee(amount)).build();
}
private String getRemainDayDesc(Integer remainDay) {
String content = null;
if (remainDay > 0) {
content = DepositOrderComputeResp.DEPOSITREMAINDAY_TIP;
} else if (isFeedback(remainDay)) { // 24小时反馈时间
content = null;
} else {
content = DepositOrderComputeResp.DEPOSIT_OVERDUE_DAY_TIP;
remainDay += DepositOrderComputeResp.FEEDBACK_DAY; // 逾期的天数 需要排除一下反馈天数
}
return StringUtil.getReplacedContent(content, remainDay);
}
private String getReplacedContent(String content ,Object... params) {
if (StringUtils.isEmpty(content)) {
return null;
}
return StringUtil.getReplacedContent(content, params);
}
... ... @@ -279,8 +297,6 @@ public class DepositOrderService {
ExpressRecord expressInfoByOrderCode = expressInfoService.getExpressInfoByOrderCode(depositDetailBo.getOrderCode(), EnumExpressType.EXPRESS_TYPE_2.getCode());
depositDetailBo.setWaybill_code(Optional.ofNullable(expressInfoByOrderCode).map(ExpressRecord::getWaybillCode).orElse(""));
//depositDetailBo.setOrderCode(null);
}
public static String formatFee(BigDecimal fee){
... ... @@ -289,4 +305,102 @@ public class DepositOrderService {
}
return BigDecimalHelper.formatNumber(fee, BigDecimalHelper.FORMAT_TWOBITAFTERPOINT);
}
/**
* 续约试算
* @param req
* @return
*/
public DepositOrderComputeResp computeRenewPrd(DepositOrderComputeReq req) {
StorageDeposit storageDeposit = checkStorageDeposit(req,
Lists.newArrayList(StorageDepositStatusEnum.HAS_IN.getCode())); // 不存在的时候有异常
int depositRemainDay = depositService.getRemainDay(req.getUid(), req.getDepositCode()); // 还可存放多久 单位天
Integer skup = storageDeposit.getSkup();
Long orderCode = storageDeposit.getOrderCode();
GoodsInfo goodsInfo = getGoodsInfo(skup); // 查询购买商品的详细信息
DepositOrderComputeResp.PriceInfo priceInfo = getRenewFeeInfo(depositRemainDay, storageDeposit); // 获取续约各种费用
setBuyerPrice(orderCode, priceInfo); // 设置入手价
return DepositOrderComputeResp.builder().depositRemainDay(getRemainDayDesc(depositRemainDay))
.priceInfo(priceInfo).goodsInfo(goodsInfo).build();
}
/**
* 获取续约费用
* @param orderCode
* @param storageDeposit 调用者保证数据记录必须存在
* @return
*/
private DepositOrderComputeResp.PriceInfo getRenewFeeInfo(int depositRemainDay, StorageDeposit storageDeposit) {
DepositFee depositFee = metaConfigService.getDepositFeeMap(); // 查询配置表里面的配置
LOG.info("metaConfigService.getDepositFeeMap is {}, storageDeposit is {}", depositFee, storageDeposit);
BigDecimal lateFee = null; // 滞纳金
if (!isFeedback(depositRemainDay) && depositRemainDay < 0) { // 如果不在反馈时间 且已经逾期,则需要算滞纳金
DepositFee.DepositFeePolicy expired = depositFee.getExpired();
BigDecimal amount = expired.getAmount();
BigDecimal bigDecimal = new BigDecimal((depositRemainDay + DepositOrderComputeResp.FEEDBACK_DAY) * -1.00); // 总计滞纳了几天
lateFee = bigDecimal.divide(BigDecimal.valueOf(expired.getDay())).multiply(expired.getAmount());
}
DepositFee.DepositFeePolicy renew = depositFee.getRenew();
BigDecimal renewFee = renew.getAmount(); // 续约费用一定存在
BigDecimal amount = renewFee.add(null == lateFee ? new BigDecimal(0.00) : lateFee);
return DepositOrderComputeResp.PriceInfo.builder().renewFee(formatFee(renewFee))
.renewDesc(getReplacedContent(DepositOrderComputeResp.DEPOSIT_RENEW_DAY_TIP, renew.getDay()))
.lateFee(formatFee(lateFee)).amount(formatFee(amount)).build();
}
/**
* 创建续约订单成功
* @param req
* @return
*/
public OrderSubmitResponse publishDepositRenewOrder(DepositOrderComputeReq req) {
Integer uid = req.getUid();
checkUid(uid);
StorageDeposit storageDeposit = checkStorageDeposit(req,
Lists.newArrayList(StorageDepositStatusEnum.HAS_IN.getCode())); //查看在库状态的库存
long orderCode = orderCodeGenerator.generate(OrderCodeType.STORAGE_MANAGEMENT); // 获取续约的订单号
int now = (int) (System.currentTimeMillis()/1000);
int depositRemainDay = depositService.getRemainDay(req.getUid(), req.getDepositCode()); // 还可存放多久 单位天
LOG.info("depositService.getRemainDay is {}, storageDeposit is {}", depositRemainDay, storageDeposit);
DepositOrderComputeResp.PriceInfo priceInfo = getRenewFeeInfo(depositRemainDay, storageDeposit); // 获取续约各种费用
DepositOrder depositOrder = DepositOrder.builder().uid(uid).amount(new BigDecimal(priceInfo.getAmount()))
.lateFee(new BigDecimal(priceInfo.getLateFee()))
.renewFee(new BigDecimal(priceInfo.getRenewFee()))
.contractFee(BigDecimal.valueOf(0.00))
.shipFee(BigDecimal.valueOf(0.00))
.createTime(now).depositCode(req.getDepositCode())
.eventType(DepositEventTypeEnum.DEPOSIT_RENEW_FEE.getCode()).orderCode(orderCode).payment(0).status(0).updateTime(now).build();
LOG.info("enter publishDepositOrder begin save depositOrder {} ",depositOrder);
int num = depositOrderMapper.insert(depositOrder); // 生成订单数据,insert db
LOG.info("enter publishDepositOrder end save depositOrder {} ,num {}",depositOrder, num);
return OrderSubmitResponse.builder().orderCode(orderCode).paymentStatus(OrderConstant.N_STR).build();
}
private void checkUid(Integer uid) {
if (uid == null || uid <= 0){
throw new ServiceException(ServiceError.ORDER_REQUEST_PARM_IS_EMPTY);
}
}
// 是否 24小时反馈时间 如果是则返回true
private boolean isFeedback(int depositRemainDay) {
return -1 * DepositOrderComputeResp.FEEDBACK_DAY <= depositRemainDay && depositRemainDay <= 0;
}
}
... ...
... ... @@ -6,7 +6,7 @@
<parent>
<groupId>com.yoho</groupId>
<artifactId>parent</artifactId>
<version>1.6.1-SNAPSHOT</version>
<version>1.6.2-SNAPSHOT</version>
</parent>
<groupId>com.yohoufo.fore</groupId>
... ...