Authored by qinchao

我的资产接口

package com.yohoufo.dal.order;
import com.yohoufo.dal.order.model.TradeBills;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
public interface TradeBillsMapper {
TradeBills selectByPrimaryKey(Integer id);
int selectCountGoodsIncomeOrCompensateIncomeByUid(@Param("uid") Integer uid);
int insert(TradeBills record);
//根据用户uid ,获取流水(分页)
List<TradeBills> selectTradeBillsWithPageByUid(@Param("uid") Integer uid,@Param("start") Integer start,@Param("limit") Integer limit);
//根据用户uid,获取用户总收入
List<Map<String, Object>> selectIncomeAmountByUid(@Param("uid") Integer uid);
//根据用户uid,获取用户总支出
List<Map<String, Object>> selectSpendAmountByUid(@Param("uid") Integer uid);
}
... ...
package com.yohoufo.dal.order.model;
import lombok.Data;
import java.math.BigDecimal;
/**
* 交易流水表
*/
@Data
public class TradeBills {
private Integer id;
private Integer uid;
private Long orderCode;
//1:买家uid; 2:卖家uid
private Integer userType;
//1:支付宝; 2:微信
private Integer payType;
//1:保证金;2:货款;3:补偿款
private Integer tradeType;
//1:用户收入; 2:用户支出
private Integer incomeOutcome;
private BigDecimal amount;
//yoho收入
private BigDecimal systemAmount;
//0:订单未完结;1:订单完结
private Integer tradeStatus;
private Integer createTime;
}
... ...
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yohoufo.dal.order.TradeBillsMapper">
<resultMap id="BaseResultMap" type="com.yohoufo.dal.order.model.TradeBills">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="uid" jdbcType="INTEGER" property="uid" />
<result column="order_code" jdbcType="BIGINT" property="orderCode" />
<result column="user_type" jdbcType="TINYINT" property="userType" />
<result column="pay_type" jdbcType="TINYINT" property="payType" />
<result column="trade_type" jdbcType="INTEGER" property="tradeType" />
<result column="income_outcome" jdbcType="TINYINT" property="incomeOutcome" />
<result column="amount" jdbcType="DECIMAL" property="amount" />
<result column="system_amount" jdbcType="DECIMAL" property="systemAmount" />
<result column="trade_status" jdbcType="TINYINT" property="tradeStatus" />
<result column="create_time" jdbcType="INTEGER" property="createTime" />
</resultMap>
<sql id="Base_Column_List">
id,uid, order_code, user_type,pay_type,trade_type,
income_outcome,amount,system_amount,trade_status,create_time
</sql>
<select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from trade_bills
where id = #{id,jdbcType=INTEGER}
</select>
<select id="selectCountGoodsIncomeOrCompensateIncomeByUid" resultType="java.lang.Integer" parameterType="java.lang.Integer" >
select
count(id)
from trade_bills
where uid = #{uid,jdbcType=INTEGER} and ( trade_type = 2 or trade_type = 3 )
</select>
<insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.yohoufo.dal.order.model.TradeBills" useGeneratedKeys="true">
insert into trade_bills (uid, order_code, user_type,pay_type,trade_type,
income_outcome,amount,system_amount,trade_status,create_time)
values (#{uid},#{orderCode},#{userType},#{payType},#{tradeType},
#{incomeOutcome},#{amount},#{systemAmount},
#{tradeStatus},#{createTime})
</insert>
<select id="selectTradeBillsWithPageByUid" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from trade_bills
where uid = #{uid,jdbcType=INTEGER}
order by id desc
limit #{start,jdbcType=INTEGER},#{limit,jdbcType=INTEGER}
</select>
<select id="selectIncomeAmountByUid" resultType="java.util.HashMap">
select trade_type as tradeType,sum(amount) as allAmount from trade_bills
where uid = #{uid} and income_outcome = 1 group by trade_type
</select>
<select id="selectSpendAmountByUid" resultType="java.util.HashMap">
select trade_type as tradeType,sum(amount) as allAmount from trade_bills
where uid = #{uid} and income_outcome = 2 group by trade_type
</select>
</mapper>
\ No newline at end of file
... ...
package com.yohoufo.order.common;
public enum TradeType {
compensateIncome(3, "补偿款"),
goods_income(2, "货款"),
guarantee_cash(1, "保证金");
int code;
String desc;
TradeType(int code, String desc) {
this.code = code;
this.desc = desc;
}
public int getCode() {
return code;
}
public String getDesc() {
return desc;
}
/**
* 检查是否存在该支付方式
* @param code
* @return
*/
public static TradeType getTradeTypeByCode(int code){
for(TradeType v : values()){
if(v.code == code){
return v;
}
}
return null;
}
}
... ...
... ... @@ -5,6 +5,8 @@ import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Builder;
import java.math.BigDecimal;
/**
* Created by chenchao on 2018/9/28.
*/
... ... @@ -15,4 +17,21 @@ import lombok.experimental.Builder;
public class TradeBillsBo {
private int uid;
private Long orderCode;
//1:保证金;2:货款;3:补偿款
private Integer tradeType;
private String tradeTypeDesc;
//1:用户收入; 2:用户支出
private Integer incomeOutcome;
private BigDecimal amount;
}
... ...
package com.yohoufo.order.service.impl;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.yoho.core.cache.LocalCache;
import com.yohoufo.dal.order.TradeBillsMapper;
import com.yohoufo.dal.order.model.TradeBills;
import com.yohoufo.order.common.TradeType;
import com.yohoufo.order.model.bo.TradeBillsBo;
import com.yohoufo.order.model.bo.TradeBillsSummaryBo;
import com.yohoufo.order.model.response.AssetsResp;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
/**资产
* Created by chenchao on 2018/9/28.
*/
@Service
public class AssetsService {
final Logger logger = LoggerFactory.getLogger(getClass());
private Cache<String,List<TradeBillsBo>> localContentCache = CacheBuilder.newBuilder().maximumSize(1000).expireAfterAccess(5, TimeUnit.MINUTES).build();
private Cache<Integer,TradeBillsSummaryBo> localTradeBillsSummaryBoCache = CacheBuilder.newBuilder().maximumSize(1000).expireAfterAccess(2, TimeUnit.MINUTES).build();
@Autowired
private TradeBillsMapper tradeBillsMapper;
public AssetsResp getAssetsDetails(int uid, int page, int pageSize){
//TODO get count
int total = 0;
int total = tradeBillsMapper.selectCountGoodsIncomeOrCompensateIncomeByUid(uid);
TradeBillsSummaryBo summary = null;
List<TradeBillsBo> detailList = null;
if (total>0){
detailList = buildTradeBills(uid, page, pageSize);
summary = buildTradeBillsSummary(uid);
detailList = buildTradeBills(uid, page, pageSize);
}
AssetsResp assetsResp = new AssetsResp();
assetsResp.setSummary(summary);
assetsResp.setData(detailList);
... ... @@ -42,9 +64,41 @@ public class AssetsService {
* @return
*/
List<TradeBillsBo> buildTradeBills(int uid,int page, int pageSize){
List<TradeBillsBo> detailList = null;
//把第一页缓存
String key=uid+"-"+page+"-"+pageSize;
if(page==1){
try{
return localContentCache.get(key, new Callable<List<TradeBillsBo>>() {
@Override
public List<TradeBillsBo> call() throws Exception {
return detailList;
return loadTradeBillFromDb(uid,page,pageSize);
}
});
}catch (ExecutionException e){
throw new RuntimeException(e);
}
}else{
return loadTradeBillFromDb(uid,page,pageSize);
}
}
private List<TradeBillsBo> loadTradeBillFromDb(int uid,int page, int pageSize){
List<TradeBills> detailList = tradeBillsMapper.selectTradeBillsWithPageByUid(uid,pageSize*(page-1),pageSize);
List<TradeBillsBo> rtnList=new ArrayList<>();
for(TradeBills bills:detailList){
TradeBillsBo bo = new TradeBillsBo();
bo.setUid(uid);
bo.setAmount(bills.getAmount());
bo.setIncomeOutcome(bills.getIncomeOutcome());
bo.setOrderCode(bills.getOrderCode());
bo.setTradeType(bills.getTradeType());
bo.setTradeTypeDesc(TradeType.getTradeTypeByCode(bills.getTradeType()).getDesc());
rtnList.add(bo);
}
return rtnList;
}
/**
... ... @@ -53,11 +107,66 @@ public class AssetsService {
* @return
*/
TradeBillsSummaryBo buildTradeBillsSummary(int uid){
TradeBillsSummaryBo summary = null;
//TODO 使用 sql sum 货款
//TODO 使用 sql sum 补偿款
try{
return localTradeBillsSummaryBoCache.get(uid,new Callable<TradeBillsSummaryBo>() {
@Override
public TradeBillsSummaryBo call() throws Exception {
TradeBillsSummaryBo summary = new TradeBillsSummaryBo();
BigDecimal sum_goods_income=new BigDecimal(0);
BigDecimal compensate_income=new BigDecimal(0);
//计算收入
List<Map<String, Object>> incomeList=tradeBillsMapper.selectIncomeAmountByUid(uid);
if(CollectionUtils.isNotEmpty(incomeList)){
for(Map<String, Object> tmpMap:incomeList){
if(tmpMap.get("tradeType")==null){
continue;
}
Integer key = (Integer)tmpMap.get("tradeType");
if(TradeType.goods_income.getCode()==key){
sum_goods_income.add((BigDecimal)tmpMap.get("allAmount"));
}
if(TradeType.compensateIncome.getCode()==key){
compensate_income.add((BigDecimal)tmpMap.get("allAmount"));
}
//TODO 内存中计算total
return summary;
}
}
//计算支出
List<Map<String, Object>> spendList=tradeBillsMapper.selectSpendAmountByUid(uid);
if(CollectionUtils.isNotEmpty(spendList)){
for(Map<String, Object> tmpMap:incomeList){
if(tmpMap.get("tradeType")==null){
continue;
}
Integer key = (Integer)tmpMap.get("tradeType");
if(TradeType.goods_income.getCode()==key){
sum_goods_income.subtract((BigDecimal)tmpMap.get("allAmount"));
}
if(TradeType.compensateIncome.getCode()==key){
compensate_income.subtract((BigDecimal)tmpMap.get("allAmount"));
}
}
}
//TODO 内存中计算total
summary.setGoods_income(sum_goods_income);
summary.setGoodsIncome(String.valueOf(sum_goods_income));
summary.setCompensate_income(compensate_income);
summary.setCompensateIncome(String.valueOf(compensate_income));
summary.setTotal_income(sum_goods_income.add(compensate_income));
summary.setTotalIncome(String.valueOf(compensate_income));
return summary;
}
});
}catch (ExecutionException e){
throw new RuntimeException(e);
}
}
}
... ...
package com.yohoufo.order.service.proxy;
import com.yoho.error.exception.ServiceException;
import com.yohoufo.common.ApiResponse;
import com.yohoufo.common.caller.UfoServiceCaller;
import com.yohoufo.common.exception.GatewayException;
... ...
... ... @@ -53,6 +53,7 @@ datasources:
- com.yohoufo.dal.order.OrdersPayRefundMapper
- com.yohoufo.dal.order.ExpressCompanyMapper
- com.yohoufo.dal.order.AppraiseAddressMapper
- com.yohoufo.dal.order.TradeBillsMapper
yh_passport:
servers:
... ...
... ... @@ -64,6 +64,7 @@ datasources:
- com.yohoufo.dal.order.OrdersPayMapper
- com.yohoufo.dal.order.OrdersPayRefundMapper
- com.yohoufo.dal.order.AppraiseAddressMapper
- com.yohoufo.dal.order.TradeBillsMapper
ufo_resource:
servers:
... ...