Authored by mali

Merge branch 'master' into gray

Showing 19 changed files with 745 additions and 176 deletions
... ... @@ -4,17 +4,13 @@ package com.yohoufo.dal.order;
import com.yohoufo.dal.order.model.InviteActivity;
public interface InviteActivityMapper {
int deleteByPrimaryKey(Integer id);
int insert(InviteActivity record);
int insertSelective(InviteActivity record);
InviteActivity selectByPrimaryKey(Integer id);
InviteActivity selectLastActivtiy();
int updateByPrimaryKeySelective(InviteActivity record);
int updateByPrimaryKey(InviteActivity record);
}
\ No newline at end of file
... ...
... ... @@ -2,10 +2,10 @@ package com.yohoufo.dal.order;
import com.yohoufo.dal.order.model.InviteSettlementItem;
import com.yohoufo.dal.order.model.InviteSettlementItemStats;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.math.BigDecimal;
public interface InviteSettlementItemMapper {
... ... @@ -17,19 +17,68 @@ public interface InviteSettlementItemMapper {
@Param("tagStatus") Integer tagStatus,
@Param("inviteSettlementId") Integer inviteSettlementId);
int updateStatusByUidAndInviteSettlementId(@Param("uid") Integer uid, @Param("inviteSettlementId") Integer inviteSettlementId,
@Param("status") Integer status);
InviteSettlementItem selectByUidAndBuyerOrderCode(@Param("uid") Integer uid, @Param("buyerOrderCode") Long buyerOrderCode);
InviteSettlementItem selectOneByUidAndStatus(@Param("uid") Integer uid, @Param("status") Integer status);
InviteSettlementItem selectOneByUidAndStatus(@Param("uid") Integer uid,
@Param("status") Integer status);
int selectCountByUidTypeAndInviteSettlementId(@Param("uid") Integer uid,
@Param("type") Integer type,
@Param("inviteSettlementId") Integer inviteSettlementId);
int updateByPrimaryKeySelective(InviteSettlementItem record);
List<InviteSettlementItemStats> selectStatsByUidTypeAndInviteSettlementIdGroupBySellerUid(@Param("uid") Integer uid,
@Param("type") Integer type,
@Param("inviteSettlementId") Integer inviteSettlementId);
List<InviteSettlementItem> selectByUidTypeInviteSettlementIdAndSellerUid(@Param("uid") Integer uid,
@Param("type") Integer type,
@Param("inviteSettlementId") Integer inviteSettlementId,
@Param("sellerUid") Integer sellerUid);
/**
* 查询type1 结算方式的待结算、已结算和已付款订单数
* @param inviterUid
* @return
*/
List<InviteSettlementItem> selectOrderNumByInviterUid(@Param("inviterUid") Integer inviterUid);
int updateByPrimaryKeySelective(InviteSettlementItem record);
BigDecimal selectTotalOrderAmountByUidTypeAndInviteSettlementId(@Param("uid") Integer uid,
@Param("type") Integer type,
@Param("inviteSettlementId") Integer inviteSettlementId);
/**
* 根据条件查询,待结算、已结算和已付款的统计数据
* @param uid
* @param type
* @param startTime
* @param endTime
* @return
*/
InviteSettlementItemStats selectStats(@Param("uid") Integer uid,
@Param("statusList") List<Integer> statusList,
@Param("type") Integer type,
@Param("startTime") Integer startTime,
@Param("endTime") Integer endTime);
/**
* 根据条件查询,待结算、已结算和已付款的数据
* @param uid
* @param type
* @param startTime
* @param endTime
* @param start
* @param limit
* @return
*/
List<InviteSettlementItem> select(@Param("uid") Integer uid,
@Param("statusList") List<Integer> statusList,
@Param("type") Integer type,
@Param("startTime") Integer startTime,
@Param("endTime") Integer endTime,
@Param("start") Integer start,
@Param("limit") Integer limit);
}
\ No newline at end of file
... ...
... ... @@ -17,4 +17,8 @@ public interface InviteSettlementMapper {
@Param("uid") Integer uid, @Param("status") Integer status,
@Param("start") Integer start, @Param("limit") Integer limit);
List<InviteSettlement> selectByUidAndIds(@Param("uid") Integer uid, @Param("ids") List<Integer> ids);
List<InviteSettlement> selectByIds(@Param("ids") List<Integer> ids);
}
\ No newline at end of file
... ...
package com.yohoufo.dal.order.model;
import lombok.Data;
@Data
public class InviteActivity {
private Integer id;
private String name;
... ... @@ -11,53 +15,10 @@ public class InviteActivity {
private Integer rewardDays;
private Integer createTime;
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();
}
private String productSortLimit;
public Integer getStartTime() {
return startTime;
}
private String orderAttributesLimit;
public void setStartTime(Integer startTime) {
this.startTime = startTime;
}
public Integer getEndTime() {
return endTime;
}
public void setEndTime(Integer endTime) {
this.endTime = endTime;
}
public Integer getRewardDays() {
return rewardDays;
}
public void setRewardDays(Integer rewardDays) {
this.rewardDays = rewardDays;
}
public Integer getCreateTime() {
return createTime;
}
private Integer createTime;
public void setCreateTime(Integer createTime) {
this.createTime = createTime;
}
}
\ No newline at end of file
... ...
... ... @@ -22,6 +22,11 @@ public class InviteSettlementItem {
*/
public static final int STATUS_SETTLED = 3;
/**
* 结算项状态:已付款
*/
public static final int STATUS_PAID = 4;
private Integer id;
private Integer uid;
... ... @@ -38,6 +43,8 @@ public class InviteSettlementItem {
private Integer type;
private BigDecimal settleAmount;
private Integer inviteSettlementId;
private Integer status;
... ...
package com.yohoufo.dal.order.model;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author LUOXC
* @date 2019/4/11 9:41
*/
@Data
public class InviteSettlementItemStats {
Integer sellerUid;
Integer totalElements;
BigDecimal totalOrderAmount;
BigDecimal totalSettleAmount;
BigDecimal totalPaidAmount;
BigDecimal totalWaitPayAmount;
}
... ...
... ... @@ -7,10 +7,12 @@
<result column="start_time" property="startTime" jdbcType="INTEGER" />
<result column="end_time" property="endTime" jdbcType="INTEGER" />
<result column="reward_days" property="rewardDays" jdbcType="INTEGER" />
<result column="product_sort_limit" property="productSortLimit" jdbcType="VARCHAR" />
<result column="order_attributes_limit" property="orderAttributesLimit" jdbcType="VARCHAR" />
<result column="create_time" property="createTime" jdbcType="INTEGER" />
</resultMap>
<sql id="Base_Column_List" >
id, name, start_time, end_time, reward_days, create_time
id, name, start_time, end_time, reward_days,product_sort_limit,order_attributes_limit, create_time
</sql>
... ... @@ -29,63 +31,29 @@
where id = #{id,jdbcType=INTEGER}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
delete from invite_activity
where id = #{id,jdbcType=INTEGER}
</delete>
<insert id="insert" parameterType="com.yohoufo.dal.order.model.InviteActivity" >
insert into invite_activity (id, name, start_time,
end_time, reward_days, create_time
)
values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{startTime,jdbcType=INTEGER},
#{endTime,jdbcType=INTEGER}, #{rewardDays,jdbcType=INTEGER}, #{createTime,jdbcType=INTEGER}
)
</insert>
<insert id="insertSelective" parameterType="com.yohoufo.dal.order.model.InviteActivity" >
insert into invite_activity
<trim prefix="(" suffix=")" suffixOverrides="," >
<if test="id != null" >
id,
</if>
<if test="name != null" >
name,
</if>
<if test="startTime != null" >
start_time,
</if>
<if test="endTime != null" >
end_time,
</if>
<if test="rewardDays != null" >
reward_days,
</if>
<if test="createTime != null" >
create_time,
</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="startTime != null" >
#{startTime,jdbcType=INTEGER},
</if>
<if test="endTime != null" >
#{endTime,jdbcType=INTEGER},
</if>
<if test="rewardDays != null" >
#{rewardDays,jdbcType=INTEGER},
</if>
<if test="createTime != null" >
#{createTime,jdbcType=INTEGER},
</if>
</trim>
insert into invite_activity (
id,
name,
start_time,
end_time,
reward_days,
product_sort_limit,
order_attributes_limit,
create_time
)
values (
#{id,jdbcType=INTEGER},
#{name,jdbcType=VARCHAR},
#{startTime,jdbcType=INTEGER},
#{endTime,jdbcType=INTEGER},
#{rewardDays,jdbcType=INTEGER},
#{productSortLimit,jdbcType=VARCHAR},
#{orderAttributesLimit,jdbcType=VARCHAR},
#{createTime,jdbcType=INTEGER}
)
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.yohoufo.dal.order.model.InviteActivity" >
update invite_activity
<set >
... ... @@ -107,13 +75,5 @@
</set>
where id = #{id,jdbcType=INTEGER}
</update>
<update id="updateByPrimaryKey" parameterType="com.yohoufo.dal.order.model.InviteActivity" >
update invite_activity
set name = #{name,jdbcType=VARCHAR},
start_time = #{startTime,jdbcType=INTEGER},
end_time = #{endTime,jdbcType=INTEGER},
reward_days = #{rewardDays,jdbcType=INTEGER},
create_time = #{createTime,jdbcType=INTEGER}
where id = #{id,jdbcType=INTEGER}
</update>
</mapper>
\ No newline at end of file
... ...
... ... @@ -10,6 +10,7 @@
<result column="order_amount" property="orderAmount" jdbcType="DECIMAL" />
<result column="order_create_time" property="orderCreateTime" jdbcType="INTEGER" />
<result column="type" property="type" jdbcType="INTEGER" />
<result column="settle_amount" property="settleAmount" jdbcType="DECIMAL" />
<result column="invite_settlement_id" property="inviteSettlementId" jdbcType="INTEGER" />
<result column="status" property="status" jdbcType="INTEGER" />
<result column="status_desc" property="statusDesc" jdbcType="VARCHAR" />
... ... @@ -17,25 +18,52 @@
<result column="order_num" property="orderNum" jdbcType="INTEGER" />
</resultMap>
<sql id="Base_Column_List" >
id, uid, buyer_uid, buyer_order_code, seller_uid, order_amount,order_create_time,type, invite_settlement_id,
id, uid, buyer_uid, buyer_order_code, seller_uid, order_amount,order_create_time,type,settle_amount, invite_settlement_id,
status, status_desc, create_time
</sql>
<insert id="insert" parameterType="com.yohoufo.dal.order.model.InviteSettlementItem" >
insert into invite_settlement_item (id, uid, buyer_uid,
buyer_order_code, seller_uid, order_amount,order_create_time,type,
invite_settlement_id, status, status_desc,
insert into invite_settlement_item (id,
uid,
buyer_uid,
buyer_order_code,
seller_uid,
order_amount,
order_create_time,
type,
settle_amount,
invite_settlement_id,
status,
status_desc,
create_time)
values (#{id,jdbcType=INTEGER}, #{uid,jdbcType=INTEGER}, #{buyerUid,jdbcType=INTEGER},
#{buyerOrderCode,jdbcType=BIGINT}, #{sellerUid,jdbcType=INTEGER}, #{orderAmount,jdbcType=DECIMAL}, #{orderCreateTime,jdbcType=INTEGER}, #{type,jdbcType=INTEGER},
#{inviteSettlementId,jdbcType=INTEGER}, #{status,jdbcType=INTEGER}, #{statusDesc,jdbcType=VARCHAR},
values (#{id,jdbcType=INTEGER},
#{uid,jdbcType=INTEGER},
#{buyerUid,jdbcType=INTEGER},
#{buyerOrderCode,jdbcType=BIGINT},
#{sellerUid,jdbcType=INTEGER},
#{orderAmount,jdbcType=DECIMAL},
#{orderCreateTime,jdbcType=INTEGER},
#{type,jdbcType=INTEGER},
#{settleAmount,jdbcType=DECIMAL},
#{inviteSettlementId,jdbcType=INTEGER},
#{status,jdbcType=INTEGER},
#{statusDesc,jdbcType=VARCHAR},
#{createTime,jdbcType=INTEGER})
</insert>
<update id="updateToSettled">
update invite_settlement_item
set status = #{tagStatus,jdbcType=INTEGER},
set status = #{tagStatus,jdbcType=INTEGER},
invite_settlement_id = #{inviteSettlementId,jdbcType=INTEGER}
where uid = #{uid,jdbcType=INTEGER} and type = #{type,jdbcType=INTEGER} and status = #{srcStatus,jdbcType=INTEGER}
where uid = #{uid,jdbcType=INTEGER}
and type = #{type,jdbcType=INTEGER}
and status = #{srcStatus,jdbcType=INTEGER}
</update>
<update id="updateStatusByUidAndInviteSettlementId">
update invite_settlement_item
set status = #{status,jdbcType=INTEGER}
where uid = #{uid,jdbcType=INTEGER}
and invite_settlement_id = #{inviteSettlementId,jdbcType=INTEGER}
</update>
<select id="selectByUidAndBuyerOrderCode" resultMap="BaseResultMap" >
... ... @@ -49,29 +77,85 @@
select
<include refid="Base_Column_List" />
from invite_settlement_item
where uid = #{uid,jdbcType=INTEGER} and status = #{status,jdbcType=INTEGER}
where uid = #{uid,jdbcType=INTEGER}
and status = #{status,jdbcType=INTEGER}
limit 1
</select>
<select id="selectCountByUidTypeAndInviteSettlementId" resultType="java.lang.Integer" >
select
count(1)
from invite_settlement_item
where uid = #{uid,jdbcType=INTEGER} and type = #{type,jdbcType=INTEGER} and invite_settlement_id = #{inviteSettlementId,jdbcType=INTEGER}
</select>
<select id="selectStatsByUidTypeAndInviteSettlementIdGroupBySellerUid" resultType="com.yohoufo.dal.order.model.InviteSettlementItemStats" >
select
seller_uid as 'sellerUid',
count(1) as 'totalElements',
sum(order_amount) as 'totalOrderAmount',
sum(settle_amount) as 'totalSettleAmount'
from invite_settlement_item
where uid = #{uid,jdbcType=INTEGER}
and type = #{type,jdbcType=INTEGER}
and invite_settlement_id = #{inviteSettlementId,jdbcType=INTEGER}
group by seller_uid
</select>
<select id="selectByUidTypeInviteSettlementIdAndSellerUid" resultMap="BaseResultMap" >
select
<include refid="Base_Column_List" />
from invite_settlement_item
where uid = #{uid,jdbcType=INTEGER}
and type = #{type,jdbcType=INTEGER}
and invite_settlement_id = #{inviteSettlementId,jdbcType=INTEGER}
and seller_uid = #{sellerUid,jdbcType=INTEGER}
</select>
<select id="selectOrderNumByInviterUid" resultMap="BaseResultMap" >
select
seller_uid, count(buyer_order_code) order_num
from invite_settlement_item
where uid = #{inviterUid,jdbcType=INTEGER} and status in (1,3)
where uid = #{inviterUid,jdbcType=INTEGER}
and type = 1
and status in (1,3,4)
GROUP by seller_uid
</select>
<select id="selectCountByUidTypeAndInviteSettlementId" resultType="java.lang.Integer" >
<select id="selectStats" resultType="com.yohoufo.dal.order.model.InviteSettlementItemStats" >
select
count(1)
count(1) as 'totalElements',
sum(order_amount) as 'totalOrderAmount',
sum(settle_amount) as 'totalSettleAmount',
sum(if(status=4,settle_amount,0)) as 'totalPaidAmount',
sum(if(status!=4,settle_amount,0)) as 'totalWaitPayAmount'
from invite_settlement_item
where uid = #{uid,jdbcType=INTEGER} and type = #{type,jdbcType=INTEGER} and invite_settlement_id = #{inviteSettlementId,jdbcType=INTEGER}
where uid = #{uid,jdbcType=INTEGER}
and type = #{type,jdbcType=INTEGER}
and status in
<foreach collection="statusList" item="status" open="(" separator="," close=")">
#{status}
</foreach>
and order_create_time between #{startTime,jdbcType=INTEGER} and #{endTime,jdbcType=INTEGER}
</select>
<select id="selectTotalOrderAmountByUidTypeAndInviteSettlementId" resultType="java.math.BigDecimal" >
<select id="select" resultMap="BaseResultMap" >
select
sum(order_amount)
<include refid="Base_Column_List" />
from invite_settlement_item
where uid = #{uid,jdbcType=INTEGER} and type = #{type,jdbcType=INTEGER} and invite_settlement_id = #{inviteSettlementId,jdbcType=INTEGER}
where uid = #{uid,jdbcType=INTEGER}
and type = #{type,jdbcType=INTEGER}
and status in
<foreach collection="statusList" item="status" open="(" separator="," close=")">
#{status}
</foreach>
and order_create_time between #{startTime,jdbcType=INTEGER} and #{endTime,jdbcType=INTEGER}
order by order_create_time desc
limit #{start,jdbcType=INTEGER},#{limit,jdbcType=INTEGER}
</select>
</mapper>
\ No newline at end of file
... ...
... ... @@ -49,4 +49,25 @@
limit #{start,jdbcType=INTEGER}, #{limit,jdbcType=INTEGER}
</select>
<select id="selectByUidAndIds" resultMap="BaseResultMap" >
select
<include refid="Base_Column_List" />
from invite_settlement
where uid = #{uid,jdbcType=INTEGER}
and id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
<select id="selectByIds" resultMap="BaseResultMap" >
select
<include refid="Base_Column_List" />
from invite_settlement
where id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
</mapper>
\ No newline at end of file
... ...
package com.yohoufo.order.controller;
import com.yohoufo.common.ApiResponse;
import com.yohoufo.order.model.InviteSettlementItemListVO;
import com.yohoufo.order.model.InviteSettlementListVO;
import com.yohoufo.order.service.IInviteSettlementService;
import lombok.extern.slf4j.Slf4j;
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.util.List;
/**
* @author LUOXC
* @date 2019/4/2 14:58
... ... @@ -18,7 +22,7 @@ import org.springframework.web.bind.annotation.RestController;
public class InviteSettlementController {
@Autowired
private IInviteSettlementService inviterService;
private IInviteSettlementService inviteSettlementService;
/**
* 我的收款记录
... ... @@ -29,13 +33,36 @@ public class InviteSettlementController {
@RequestMapping(params = "method=ufo.invite.getInviteSettlementList")
public ApiResponse getInviteSettlementList(@RequestParam(value = "uid") int uid) {
log.info("get inviter settlement list, uid is {}", uid);
InviteSettlementListVO inviteSettlementListVO = inviterService.getInviteSettlementList(uid);
InviteSettlementListVO inviteSettlementListVO = inviteSettlementService.getInviteSettlementList(uid);
return new ApiResponse.ApiResponseBuilder().code(200).data(inviteSettlementListVO).message("ok").build();
}
/**
* 我的收款记录明细
*
* @param uid
* @return
*/
@RequestMapping(params = "method=ufo.invite.getInviteSettlementItemList")
public ApiResponse getInviteSettlementItemList(@RequestParam(value = "uid") Integer uid,
@RequestParam(value = "tab") Integer tab,
@RequestParam(value = "month") String month,
@RequestParam(value = "page", required = false, defaultValue = "1") Integer page,
@RequestParam(value = "limit", required = false, defaultValue = "10") Integer limit) {
log.info("get inviter settlement item list, uid is {}", uid);
InviteSettlementItemListVO resp = inviteSettlementService.getInviteSettlementItemList(uid, tab, month, page, limit);
return new ApiResponse.ApiResponseBuilder().code(200).data(resp).message("ok").build();
}
@RequestMapping(value = "/erp/invite/settlement/help/settle")
public ApiResponse settle() {
inviterService.settle();
inviteSettlementService.settle();
return new ApiResponse.ApiResponseBuilder().code(200).message("ok").build();
}
@RequestMapping(value = "/erp/invite/settlement/help/paid")
public ApiResponse paid(@RequestBody List<Integer> ids) {
inviteSettlementService.paid(ids);
return new ApiResponse.ApiResponseBuilder().code(200).message("ok").build();
}
... ...
package com.yohoufo.order.model;
import lombok.Data;
import lombok.experimental.Accessors;
import lombok.experimental.Builder;
import java.util.List;
/**
* @author LUOXC
* @date 2019/4/2 15:00
*/
@Builder
@Data
public class InviteSettlementItemListVO {
int page;
int pageTotal;
int pageSize;
int totalElements;
String totalSettleAmount;
String totalPaidAmount;
String totalWaitPayAmount;
List<InviteSettlementItemVO> list;
@Data
@Accessors(chain = true)
public static class InviteSettlementItemVO {
String buyerOrderCode;
String sellerName;
String orderAmount;
String orderCreateTime;
String settleAmount;
String statusDesc;
}
}
... ...
... ... @@ -19,8 +19,12 @@ public class InviteSettlementItemCreateRequest {
private Integer orderCreateTime;
private Integer orderAttributes;
private Integer sellerUid;
private Integer sellerOrderPayment;
private Integer skup;
}
... ...
package com.yohoufo.order.service;
import com.yohoufo.order.model.InviteSettlementItemListVO;
import com.yohoufo.order.model.InviteSettlementListVO;
import java.util.List;
public interface IInviteSettlementService {
/**
... ... @@ -12,12 +15,20 @@ public interface IInviteSettlementService {
*/
InviteSettlementListVO getInviteSettlementList(Integer uid);
InviteSettlementItemListVO getInviteSettlementItemList(Integer uid, Integer tab, String month, Integer page, Integer limit);
/**
* 结算
*/
void settle();
/**
* 将结算单和结算项标志成已付款
* @param ids
*/
void paid(List<Integer> ids);
/**
* 创建结算项
*
* @param buyerOrderCode
... ...
package com.yohoufo.order.service.impl;
import com.google.common.base.Splitter;
import com.yohobuy.ufo.model.order.common.OrderStatus;
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.StoragePriceMapper;
import com.yohoufo.dal.product.model.Product;
import com.yohoufo.dal.product.model.StoragePrice;
import com.yohoufo.order.common.Payment;
import com.yohoufo.order.constants.InviteConstant;
import com.yohoufo.order.model.request.InviteSettlementItemCreateRequest;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Objects;
import static com.yohoufo.order.constants.InviteConstant.INVITER_TYPE_AGENT;
import static com.yohoufo.order.constants.InviteConstant.INVITER_TYPE_STORED_SELLER;
import static com.yohoufo.order.utils.InviteSettlementUtils.calculateSettleAmountOfType1;
/**
* @author LUOXC
... ... @@ -44,6 +53,12 @@ public class InviteSettlementItemCreator {
@Autowired
private InviteActivityMapper inviteActivityMapper;
@Autowired
private StoragePriceMapper storagePriceMapper;
@Autowired
private ProductMapper productMapper;
public void createInviteSettlementItem(Long buyerOrderCode, Integer status) {
if (status == OrderStatus.WAITING_RECEIVE.getCode() || status == OrderStatus.DONE.getCode()) {
BuyerOrder buyerOrder = buyerOrderMapper.selectByOrderCode(buyerOrderCode);
... ... @@ -54,6 +69,8 @@ public class InviteSettlementItemCreator {
request.setBuyerOrderCode(buyerOrder.getOrderCode());
request.setSellerUid(buyerOrder.getSellerUid());
request.setOrderAmount(buyerOrder.getAmount());
request.setOrderAttributes(buyerOrder.getAttributes());
request.setSkup(buyerOrderGoods.getSkup());
// 卖家商家单子上架时间
request.setOrderCreateTime(sellerOrder.getCreateTime());
request.setSellerOrderPayment(sellerOrder.getPayment());
... ... @@ -67,11 +84,6 @@ public class InviteSettlementItemCreator {
String tag = String.format("create invite settlement item %s-%s", request.getSellerUid(), buyerOrderCode);
log.info("{} start", tag);
if (request.getSellerOrderPayment() != Payment.WALLET.getCode()) {
log.info("{} fail, seller order is not a stored create", tag);
return;
}
InviteRecord invitee = inviteRecordMapper.selectByInviteeUid(request.getSellerUid());
if (Objects.isNull(invitee)) {
log.info("{} fail, seller is not a invitee", tag);
... ... @@ -79,7 +91,7 @@ public class InviteSettlementItemCreator {
}
int inviterUid = invitee.getInviterUid();
int orderCreateTime = request.getOrderCreateTime();
Inviter inviter = inviterMapper.selectByPrimaryKey(invitee.getInviterId());
if (Objects.isNull(inviter)) {
log.warn("{} fail, can not find inviter", tag);
... ... @@ -90,12 +102,14 @@ public class InviteSettlementItemCreator {
return;
}
if (!checkWithInviteActivity(tag, invitee, orderCreateTime, inviter)){
if (!checkActivity(tag, request, invitee, inviter)) {
return;
}
log.info("{}, start create", tag);
InviteSettlementItem inviteSettlementItem = buildInviteSettlementItem(request, invitee, inviter);
inviteSettlementItemMapper.insert(inviteSettlementItem);
log.info("{} success", tag);
... ... @@ -115,56 +129,111 @@ public class InviteSettlementItemCreator {
inviteSettlementItem.setOrderCreateTime(request.getOrderCreateTime());
// 结算方式选择
Integer inviteSettlementItemType = buildInviteSettlementItemType(inviter);
inviteSettlementItem.setType(inviteSettlementItemType);
if (inviteSettlementItemType == 1) {
inviteSettlementItem.setSettleAmount(calculateSettleAmountOfType1(1));
}
// 待结算订单状态
Pair<Integer, String> status = buildInviteSettlementItemStatus(request, invitee, inviter);
inviteSettlementItem.setStatus(status.getLeft());
inviteSettlementItem.setStatusDesc(status.getRight());
inviteSettlementItem.setCreateTime(DateUtil.getCurrentTimeSecond());
return inviteSettlementItem;
}
private Integer buildInviteSettlementItemType(Inviter inviter) {
// 入驻商家角色以type1方式结算
if (inviter.getType() == INVITER_TYPE_STORED_SELLER) {
inviteSettlementItem.setType(1);
return 1;
}
// 一级代理角色以type2方式结算
else if (inviter.getType() == INVITER_TYPE_AGENT) {
inviteSettlementItem.setType(2);
return 2;
}
// 其他以type1方式结算
else {
inviteSettlementItem.setType(1);
return 1;
}
}
// 待结算订单状态
private Pair<Integer, String> buildInviteSettlementItemStatus(InviteSettlementItemCreateRequest request, InviteRecord invitee, Inviter inviter) {
// 受邀人无效
if (invitee.getStatus() == InviteRecord.STATUS_DISABLE) {
inviteSettlementItem.setStatus(InviteSettlementItem.STATUS_DISABLE);
inviteSettlementItem.setStatusDesc(invitee.getStatusDesc());
return Pair.of(InviteSettlementItem.STATUS_DISABLE, Objects.nonNull(invitee.getStatusDesc()) ? invitee.getStatusDesc() : "INVITEE_DISABLE");
}
// 邀请人无效
else if (inviter.getStatus() == InviteConstant.INVITER_STATUS_DISABLE) {
inviteSettlementItem.setStatus(InviteSettlementItem.STATUS_DISABLE);
inviteSettlementItem.setStatusDesc(inviter.getStatusDesc());
return Pair.of(InviteSettlementItem.STATUS_DISABLE, Objects.nonNull(inviter.getStatusDesc()) ? inviter.getStatusDesc() : "INVITER_DISABLE");
}
// 受邀人非入驻商家
else if (nonStoredSellerOfInvitee(request)) {
return Pair.of(InviteSettlementItem.STATUS_DISABLE, "NON_STORED_SELLER");
} else {
inviteSettlementItem.setStatus(InviteSettlementItem.STATUS_ENABLE);
return Pair.of(InviteSettlementItem.STATUS_ENABLE, "OK");
}
}
inviteSettlementItem.setCreateTime(DateUtil.getCurrentTimeSecond());
return inviteSettlementItem;
private boolean nonStoredSellerOfInvitee(InviteSettlementItemCreateRequest request) {
return request.getSellerOrderPayment() != Payment.WALLET.getCode();
}
private boolean checkWithInviteActivity(String tag, InviteRecord invitee, int orderCreateTime, Inviter inviter) {
int inviterType = inviter.getType();
int inviteTime = invitee.getCreateTime();
private boolean checkActivity(String tag, InviteSettlementItemCreateRequest request, InviteRecord invitee, Inviter inviter) {
// 入驻商家
if (inviterType == INVITER_TYPE_STORED_SELLER) {
if (inviter.getType() == INVITER_TYPE_STORED_SELLER) {
InviteActivity activity = inviteActivityMapper.selectByPrimaryKey(invitee.getInviteActivityId());
if (Objects.isNull(activity)) {
log.warn("{} fail, can not find inviter ", tag);
return false;
}
// 验证品类是否满足条件
if (!checkActivityProductSortLimit(request.getSkup(), activity.getProductSortLimit())) {
log.warn("{} fail, can not hit product sort limit is {}", tag, activity.getProductSortLimit());
return false;
}
// 验证订单属性是否满足条件
if (!checkActivityOrderAttributesLimit(request.getOrderAttributes(), activity.getOrderAttributesLimit())) {
log.warn("{} fail, can not hit order attributes limit is {}", tag, activity.getOrderAttributesLimit());
return false;
}
// 验证是否过了奖励时间
int days = activity.getRewardDays() * 24 * 60 * 60;
if (inviteTime + days < orderCreateTime) {
if (!checkActivityRewardDays(request, invitee, activity.getRewardDays())) {
log.warn("{} fail, reward end.", tag);
return false;
}
}
return true;
}
private boolean checkActivityProductSortLimit(Integer skup, String productSortLimit) {
if (StringUtils.isBlank(productSortLimit)) {
return true;
}
List<String> productSortLimitList = Splitter.on(",").splitToList(productSortLimit);
StoragePrice storagePrice = storagePriceMapper.selectBySkup(skup);
Product product = productMapper.selectByPrimaryKey(storagePrice.getProductId());
String maxSortId = product.getMaxSortId().toString();
return productSortLimitList.contains(maxSortId);
}
private boolean checkActivityOrderAttributesLimit(Integer orderAttributes, String orderAttributesLimit) {
if (StringUtils.isBlank(orderAttributesLimit)) {
return true;
}
List<String> orderAttributesLimitList = Splitter.on(",").splitToList(orderAttributesLimit);
return orderAttributesLimitList.contains(orderAttributes.toString());
}
private boolean checkActivityRewardDays(InviteSettlementItemCreateRequest request, InviteRecord invitee, int rewardDays) {
int orderCreateTime = request.getOrderCreateTime();
int inviteTime = invitee.getCreateTime();
int rewardTime = inviteTime + (rewardDays * 24 * 60 * 60);
return rewardTime >= orderCreateTime;
}
}
... ...
package com.yohoufo.order.service.impl;
import com.yohoufo.common.utils.DateUtil;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.Lists;
import com.yohoufo.dal.order.InviteSettlementItemMapper;
import com.yohoufo.dal.order.InviteSettlementMapper;
import com.yohoufo.dal.order.InviterMapper;
import com.yohoufo.dal.order.model.InviteSettlement;
import com.yohoufo.dal.order.model.InviteSettlementItem;
import com.yohoufo.dal.order.model.InviteSettlementItemStats;
import com.yohoufo.dal.order.model.Inviter;
import com.yohoufo.order.model.InviteSettlementItemListVO;
import com.yohoufo.order.model.InviteSettlementListVO;
import com.yohoufo.order.service.IInviteSettlementService;
import com.yohoufo.order.utils.IdUtils;
import com.yohoufo.order.service.proxy.UserProxyService;
import com.yohoufo.order.utils.InviteSettlementUtils;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.RoundingMode;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import static com.yohoufo.common.utils.DateUtil.formatYYMMddHHmmssPoint;
import static com.yohoufo.dal.order.model.InviteSettlement.STATUS_WAIT_SETTLE;
import static com.yohoufo.order.utils.InviteSettlementUtils.RMB_FLAG;
import static com.yohoufo.order.utils.InviteSettlementUtils.formatAmount;
import static com.yohoufo.order.utils.ServiceExceptions.throwServiceException;
/**
* @author LUOXC
* @date 2019/4/2 15:27
... ... @@ -37,8 +57,14 @@ public class InviteSettlementServiceImpl implements IInviteSettlementService {
private InviteSettlementMapper inviteSettlementMapper;
@Autowired
private InviteSettlementItemMapper inviteSettlementItemMapper;
@Autowired
private InviteSettlementItemCreator inviteSettlementItemCreator;
@Autowired
UserProxyService userProxyService;
@Override
public InviteSettlementListVO getInviteSettlementList(Integer uid) {
... ... @@ -46,14 +72,14 @@ public class InviteSettlementServiceImpl implements IInviteSettlementService {
List<InviteSettlement> inviteSettlementList = inviteSettlementMapper.selectByUidAndStatusWithLimit(uid, InviteSettlement.STATUS_PAID, 0, 100);
// build vo
ZoneOffset zoneOffset = ZoneOffset.of("+8");
List<InviteSettlementListVO.InviteSettlementVO> items = inviteSettlementList.stream()
.map(inviteSettlement -> {
InviteSettlementListVO.InviteSettlementVO item = new InviteSettlementListVO.InviteSettlementVO();
item.setSettleCode(String.format("%010d", inviteSettlement.getSettleCode()));
item.setSettleAmount("+" + inviteSettlement.getSettleAmount().setScale(1, RoundingMode.FLOOR));
item.setSettleTime(DateUtil.formatYYMMddHHmmssPoint(inviteSettlement.getSettleTime()));
item.setPaidTime(DateUtil.formatYYMMddHHmmssPoint(inviteSettlement.getPaidTime()));
item.setSettleAmount(formatAmount("+%s", inviteSettlement.getSettleAmount()));
item.setSettleTime(formatYYMMddHHmmssPoint(inviteSettlement.getSettleTime()));
item.setPaidTime(formatYYMMddHHmmssPoint(inviteSettlement.getPaidTime()));
return item;
})
.collect(Collectors.toList());
... ... @@ -63,6 +89,107 @@ public class InviteSettlementServiceImpl implements IInviteSettlementService {
}
@Override
public InviteSettlementItemListVO getInviteSettlementItemList(Integer uid, Integer tab, String month, Integer page, Integer limit) {
if (!ObjectUtils.allNotNull(uid, tab, month, page, limit) || uid <= 0 || page <= 0 || limit <= 0) {
throwServiceException("参数不正确");
}
Pair<Integer, Integer> time = getTimeRangeOfMonth(month);
List<Integer> statusList = getStatusList(tab);
// 只查询结算规则1的记录
int settlementType = 1;
InviteSettlementItemStats stats = inviteSettlementItemMapper.selectStats(uid, statusList, settlementType, time.getLeft(), time.getRight());
int totalElements = Objects.isNull(stats.getTotalElements()) ? 0 : stats.getTotalElements();
InviteSettlementItemStats statsAll;
if (tab != 0) {
statsAll = inviteSettlementItemMapper.selectStats(uid, getStatusList(0), settlementType, time.getLeft(), time.getRight());
} else {
statsAll = stats;
}
BigDecimal totalSettleAmount = Objects.isNull(statsAll.getTotalSettleAmount()) ? BigDecimal.ZERO : statsAll.getTotalSettleAmount();
BigDecimal totalPaidAmount = Objects.isNull(statsAll.getTotalPaidAmount()) ? BigDecimal.ZERO : statsAll.getTotalPaidAmount();
BigDecimal totalWaitPayAmount = Objects.isNull(statsAll.getTotalWaitPayAmount()) ? BigDecimal.ZERO : statsAll.getTotalWaitPayAmount();
InviteSettlementItemListVO.InviteSettlementItemListVOBuilder builder = InviteSettlementItemListVO.builder();
builder.page(page)
.pageSize(limit)
.pageTotal((totalElements % limit == 0) ? (totalElements / limit) : (totalElements / limit + 1))
.totalElements(totalElements)
.totalSettleAmount(formatAmount("%s%s", RMB_FLAG, totalSettleAmount))
.totalPaidAmount(formatAmount("%s%s", RMB_FLAG, totalPaidAmount))
.totalWaitPayAmount(formatAmount("%s%s", RMB_FLAG, totalWaitPayAmount));
if (totalElements == 0) {
return builder
.list(Lists.newArrayList())
.build();
}
int start = (page - 1) * limit;
List<InviteSettlementItem> list = inviteSettlementItemMapper.select(uid, statusList, settlementType, time.getLeft(), time.getRight(), start, limit);
Map<Integer, Integer> settlementStatusMap = buildInviteSettlementIdStatusMap(uid, list);
Map<Integer, String> sellerUidNickNameMap = userProxyService.getNickNameByUids(list.stream()
.map(InviteSettlementItem::getSellerUid)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList()));
Predicate<InviteSettlementItem> itemHasPaid = item -> {
int status = settlementStatusMap.getOrDefault(item.getInviteSettlementId(), STATUS_WAIT_SETTLE).intValue();
return InviteSettlement.STATUS_PAID == status;
};
return builder
.list(list.stream()
.map(item -> new InviteSettlementItemListVO.InviteSettlementItemVO()
.setBuyerOrderCode(item.getBuyerOrderCode().toString())
.setSellerName(sellerUidNickNameMap.get(item.getSellerUid()))
.setOrderAmount(formatAmount("%s%s", RMB_FLAG, item.getOrderAmount()))
.setOrderCreateTime(formatYYMMddHHmmssPoint(item.getOrderCreateTime()))
.setSettleAmount(formatAmount("%s%s", RMB_FLAG, item.getSettleAmount()))
.setStatusDesc(itemHasPaid.test(item) ? "已付款" : "待付款"))
.collect(Collectors.toList()))
.build();
}
private List<Integer> getStatusList(Integer tab) {
if (tab == 0) {
return Lists.newArrayList(InviteSettlementItem.STATUS_ENABLE, InviteSettlementItem.STATUS_SETTLED, InviteSettlementItem.STATUS_PAID);
}
if (tab == 1) {
return Lists.newArrayList(InviteSettlementItem.STATUS_ENABLE, InviteSettlementItem.STATUS_SETTLED);
}
if (tab == 2) {
return Lists.newArrayList(InviteSettlementItem.STATUS_PAID);
}
throwServiceException("参数不正确");
return Lists.newArrayList();
}
private Map<Integer, Integer> buildInviteSettlementIdStatusMap(Integer uid, List<InviteSettlementItem> list) {
val inviteSettlementIds = list.stream()
.map(InviteSettlementItem::getInviteSettlementId)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(inviteSettlementIds)) {
return Collections.emptyMap();
} else {
return inviteSettlementMapper.selectByUidAndIds(uid, inviteSettlementIds).stream()
.collect(Collectors.toMap(InviteSettlement::getId, InviteSettlement::getStatus));
}
}
@VisibleForTesting
Pair<Integer, Integer> getTimeRangeOfMonth(String month) {
LocalDateTime start = null;
ZoneOffset zoneOffset = InviteSettlementUtils.zoneOffset();
try {
start = LocalDateTime.parse(month + "01 00:00:00", DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss"));
} catch (Exception e) {
throwServiceException("日期格式不正确");
}
return Pair.of((int) start.toEpochSecond(zoneOffset), (int) start.plusMonths(1).toEpochSecond(zoneOffset) - 1);
}
@Override
public void settle() {
inviterMapper.selectAll().stream()
.map(Inviter::getUid)
... ... @@ -71,6 +198,21 @@ public class InviteSettlementServiceImpl implements IInviteSettlementService {
}
@Override
public void paid(List<Integer> ids) {
if (CollectionUtils.isEmpty(ids)) {
return;
}
List<InviteSettlement> settlements = inviteSettlementMapper.selectByIds(ids);
settlements.stream().forEach(settlement -> {
log.info("mark settlement to paid, settle id is {}", settlement.getId());
settlement.setStatus(InviteSettlement.STATUS_PAID);
inviteSettlementMapper.updateByUidAndId(settlement);
inviteSettlementItemMapper.updateStatusByUidAndInviteSettlementId(settlement.getUid(), settlement.getId(), InviteSettlementItem.STATUS_PAID);
});
}
@Override
public void createInviteSettlementItem(Long buyerOrderCode, Integer status) {
inviteSettlementItemCreator.createInviteSettlementItem(buyerOrderCode, status);
}
... ...
... ... @@ -5,19 +5,28 @@ import com.github.rholder.retry.RetryerBuilder;
import com.github.rholder.retry.StopStrategies;
import com.github.rholder.retry.WaitStrategies;
import com.yohoufo.common.utils.DateUtil;
import com.yohoufo.dal.order.InviteRecordMapper;
import com.yohoufo.dal.order.InviteSettlementItemMapper;
import com.yohoufo.dal.order.InviteSettlementMapper;
import com.yohoufo.dal.order.model.InviteRecord;
import com.yohoufo.dal.order.model.InviteSettlement;
import com.yohoufo.dal.order.model.InviteSettlementItem;
import com.yohoufo.dal.order.model.InviteSettlementItemStats;
import com.yohoufo.order.utils.IdUtils;
import com.yohoufo.order.utils.InviteSettlementUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static com.yohoufo.order.utils.InviteSettlementUtils.newLocalDateTimeOfEpochSecond;
/**
* @author LUOXC
... ... @@ -33,6 +42,9 @@ public class InviterSettleService {
@Autowired
private InviteSettlementItemMapper inviteSettlementItemMapper;
@Autowired
private InviteRecordMapper inviteRecordMapper;
public void settle(int uid) {
log.info("settle for {}", uid);
int now = DateUtil.getCurrentTimeSecond();
... ... @@ -101,19 +113,37 @@ public class InviterSettleService {
InviteSettlementItem.STATUS_ENABLE,
InviteSettlementItem.STATUS_SETTLED,
settlementId);
int storedSellerCount = inviteSettlementItemMapper.selectCountByUidTypeAndInviteSettlementId(uid, type, settlementId);
return BigDecimal.TEN.multiply(BigDecimal.valueOf(storedSellerCount));
int totalElements = inviteSettlementItemMapper.selectCountByUidTypeAndInviteSettlementId(uid, type, settlementId);
return InviteSettlementUtils.calculateSettleAmountOfType1(totalElements);
}
/**
* TODO 计算type2方式结算金额
* 计算type2方式结算金额
*
* @param uid
* @param settlementId
* @return
*/
private BigDecimal calculateSettleAmountOfType2(int uid, int settlementId) {
return BigDecimal.ZERO;
int type = 2;
inviteSettlementItemMapper.updateToSettled(
uid,
type,
InviteSettlementItem.STATUS_ENABLE,
InviteSettlementItem.STATUS_SETTLED,
settlementId);
// 待结算用户统计
List<InviteSettlementItemStats> statsList = inviteSettlementItemMapper.selectStatsByUidTypeAndInviteSettlementIdGroupBySellerUid(uid, type, settlementId);
// 被邀请时间
Map<Integer, Integer> invitees = inviteRecordMapper.selectByInviterUid(uid).stream()
.collect(Collectors.toMap(InviteRecord::getInviteeUid, InviteRecord::getCreateTime));
return statsList.stream()
.map(stats -> InviteSettlementUtils.calculateSettleAmountOfType2(
newLocalDateTimeOfEpochSecond(invitees.getOrDefault(stats.getSellerUid(), 0)),
inviteSettlementItemMapper.selectByUidTypeInviteSettlementIdAndSellerUid(uid, type, settlementId, stats.getSellerUid())
))
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
}
... ...
... ... @@ -12,6 +12,7 @@ import com.yohoufo.common.ApiResponse;
import com.yohoufo.order.convert.AddressInfoConvertor;
import com.yohobuy.ufo.model.order.vo.AddressInfo;
import com.yohoufo.order.service.IStoredSellerService;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
... ... @@ -161,6 +162,9 @@ public class UserProxyService {
* @return
*/
public Map<Integer, String> getNickNameByUids(List<Integer> uids){
if(CollectionUtils.isEmpty(uids)){
return Maps.newHashMap();
}
String url = uicUrl + NICK_NAME_API;
Map<String,Object> params = Maps.newHashMap();
params.put("uids", uids.stream().map(String::valueOf).collect(Collectors.joining(",")));
... ...
package com.yohoufo.order.utils;
import com.yohoufo.dal.order.model.InviteSettlementItem;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.List;
import java.util.Objects;
import java.util.function.BiPredicate;
/**
* @author LUOXC
* @date 2019/4/11 11:04
*/
public class InviteSettlementUtils {
public static String RMB_FLAG = "¥";
public static String formatAmount(BigDecimal src) {
return formatAmount("%s", src);
}
public static String formatAmount(String format, Object... args) {
if (Objects.isNull(args)) {
return null;
} else {
Object[] tmp = new Object[args.length];
for (int i = 0; i < args.length; i++) {
Object arg = args[i];
if (arg instanceof BigDecimal) {
tmp[i] = ((BigDecimal) arg).setScale(1, RoundingMode.FLOOR);
} else {
tmp[i] = arg;
}
}
return String.format(format, tmp);
}
}
/**
* type1 计算结算金额
*
* @param totalElements 待结算订单数量
* @return
*/
public static BigDecimal calculateSettleAmountOfType1(int totalElements) {
return BigDecimal.TEN.multiply(BigDecimal.valueOf(totalElements));
}
/**
* type2 计算结算金额
*
* @param inviteTime 被邀请时间
* @param items 待结算订单
* @return
*/
public static BigDecimal calculateSettleAmountOfType2(LocalDateTime inviteTime, List<InviteSettlementItem> items) {
// 一个月内
BigDecimal inOneMonthTotalSettleAmount = items.stream()
.filter(item -> newLocalDateTimeOfEpochSecond(item.getCreateTime()).isBefore(inviteTime.plusMonths(1)))
.map(InviteSettlementItem::getOrderAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add)
.multiply(BigDecimal.valueOf(0.02));
BiPredicate<InviteSettlementItem, Integer> iaAfterOrEqual = (item, months) -> {
LocalDateTime createTime = newLocalDateTimeOfEpochSecond(item.getCreateTime());
LocalDateTime afterInviteMonth = inviteTime.plusMonths(months);
return createTime.isAfter(afterInviteMonth) || createTime.isEqual(afterInviteMonth);
};
// 五个月内
BigDecimal inFiveMonthTotalSettleAmount;
BigDecimal inFiveMonthTotalOrderAmount = items.stream()
.filter(item -> iaAfterOrEqual.test(item, 1))
.filter(item -> newLocalDateTimeOfEpochSecond(item.getCreateTime()).isBefore(inviteTime.plusMonths(5)))
.map(InviteSettlementItem::getOrderAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add);
if (inFiveMonthTotalOrderAmount.compareTo(BigDecimal.valueOf(100_0000)) < 0) {
inFiveMonthTotalSettleAmount = inFiveMonthTotalOrderAmount.multiply(BigDecimal.ZERO);
} else if (inFiveMonthTotalOrderAmount.compareTo(BigDecimal.valueOf(180_0000)) <= 0) {
inFiveMonthTotalSettleAmount = inFiveMonthTotalOrderAmount.multiply(BigDecimal.valueOf(0.008));
} else if (inFiveMonthTotalOrderAmount.compareTo(BigDecimal.valueOf(300_0000)) <= 0) {
inFiveMonthTotalSettleAmount = inFiveMonthTotalOrderAmount.multiply(BigDecimal.valueOf(0.015));
} else {
inFiveMonthTotalSettleAmount = inFiveMonthTotalOrderAmount.multiply(BigDecimal.valueOf(0.020));
}
// 五个月以后
BigDecimal outFiveMonthTotalSettleAmount;
BigDecimal outFiveMonthTotalOrderAmount = items.stream()
.filter(item -> iaAfterOrEqual.test(item, 5))
.map(InviteSettlementItem::getOrderAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add);
if (outFiveMonthTotalOrderAmount.compareTo(BigDecimal.valueOf(180_0000)) < 0) {
outFiveMonthTotalSettleAmount = outFiveMonthTotalOrderAmount.multiply(BigDecimal.ZERO);
} else if (outFiveMonthTotalOrderAmount.compareTo(BigDecimal.valueOf(300_0000)) <= 0) {
outFiveMonthTotalSettleAmount = outFiveMonthTotalOrderAmount.multiply(BigDecimal.valueOf(0.010));
} else if (outFiveMonthTotalOrderAmount.compareTo(BigDecimal.valueOf(500_0000)) <= 0) {
outFiveMonthTotalSettleAmount = outFiveMonthTotalOrderAmount.multiply(BigDecimal.valueOf(0.012));
} else {
outFiveMonthTotalSettleAmount = outFiveMonthTotalOrderAmount.multiply(BigDecimal.valueOf(0.018));
}
return inOneMonthTotalSettleAmount.add(inFiveMonthTotalSettleAmount).add(outFiveMonthTotalSettleAmount);
}
public static ZoneOffset zoneOffset() {
return ZoneOffset.of("+8");
}
public static LocalDateTime newLocalDateTimeOfEpochSecond(int epochSecond) {
return LocalDateTime.ofEpochSecond(epochSecond, 0, ZoneOffset.of("+8"));
}
}
... ...
package com.yohoufo.order.service.impl;
import org.apache.commons.lang3.tuple.Pair;
import org.junit.Assert;
import org.junit.Test;
import static org.junit.Assert.*;
public class InviteSettlementServiceImplTest {
@Test
public void getTimeRangeOfMonth() {
Pair<Integer, Integer> integerIntegerPair = new InviteSettlementServiceImpl().getTimeRangeOfMonth("201903");
Assert.assertEquals(integerIntegerPair.getLeft().intValue(),1551369600);
Assert.assertEquals(integerIntegerPair.getRight().intValue(),1554047999);
}
}
\ No newline at end of file
... ...