Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
caopu16
whatsmars
提交
d4e1bf4b
W
whatsmars
项目概览
caopu16
/
whatsmars
与 Fork 源项目一致
Fork自
武汉红喜 / whatsmars
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
W
whatsmars
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
d4e1bf4b
编写于
1月 16, 2018
作者:
武汉红喜
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
guava cache
上级
254ff02f
变更
6
展开全部
显示空白变更内容
内联
并排
Showing
6 changed file
with
53 addition
and
1435 deletion
+53
-1435
whatsmars-earth/whatsmars-earth-dao/src/main/java/org/hongxi/whatsmars/earth/dao/CityDao.java
...src/main/java/org/hongxi/whatsmars/earth/dao/CityDao.java
+13
-0
whatsmars-earth/whatsmars-earth-domain/src/main/java/org/hongxi/whatsmars/earth/domain/pojo/City.java
...ain/java/org/hongxi/whatsmars/earth/domain/pojo/City.java
+7
-0
whatsmars-earth/whatsmars-earth-service/src/main/java/org/hongxi/whatsmars/earth/service/CityService.java
.../java/org/hongxi/whatsmars/earth/service/CityService.java
+23
-13
whatsmars-earth/whatsmars-earth-service/src/main/java/org/hongxi/whatsmars/earth/service/impl/AccountServiceImpl.java
...ngxi/whatsmars/earth/service/impl/AccountServiceImpl.java
+10
-2
whatsmars-earth/whatsmars-earth-service/src/main/java/org/hongxi/whatsmars/earth/service/mongo-example.txt
...java/org/hongxi/whatsmars/earth/service/mongo-example.txt
+0
-1258
whatsmars-earth/whatsmars-earth-service/src/main/java/org/hongxi/whatsmars/earth/service/transaction-example.txt
...rg/hongxi/whatsmars/earth/service/transaction-example.txt
+0
-162
未找到文件。
whatsmars-earth/whatsmars-earth-dao/src/main/java/org/hongxi/whatsmars/earth/dao/CityDao.java
0 → 100644
浏览文件 @
d4e1bf4b
package
org.hongxi.whatsmars.earth.dao
;
import
org.hongxi.whatsmars.earth.domain.pojo.City
;
import
java.util.List
;
/**
* Created by shenhongxi on 2018/1/16.
*/
public
interface
CityDao
{
List
<
City
>
getByPid
(
String
pid
);
}
whatsmars-earth/whatsmars-earth-domain/src/main/java/org/hongxi/whatsmars/earth/domain/pojo/City.java
0 → 100644
浏览文件 @
d4e1bf4b
package
org.hongxi.whatsmars.earth.domain.pojo
;
/**
* Created by shenhongxi on 2018/1/16.
*/
public
class
City
{
}
whatsmars-earth/whatsmars-earth-service/src/main/java/org/hongxi/whatsmars/earth/service/
guava-cache-example.txt
→
whatsmars-earth/whatsmars-earth-service/src/main/java/org/hongxi/whatsmars/earth/service/
CityService.java
浏览文件 @
d4e1bf4b
p
ublic class YibaoCityManagerImpl implements YibaoCityManager{
p
ackage
org.hongxi.whatsmars.earth.service
;
import
com.google.common.cache.Cache
;
import
com.google.common.cache.CacheBuilder
;
import
org.hongxi.whatsmars.earth.dao.CityDao
;
import
org.hongxi.whatsmars.earth.domain.pojo.City
;
private YibaoCityDao yibaoCityDao;
import
java.util.Collections
;
import
java.util.List
;
import
java.util.concurrent.Callable
;
import
java.util.concurrent.TimeUnit
;
private static Cache<String,List<YibaoCityDO>> cache = CacheBuilder.newBuilder().maximumSize(2048).expireAfterAccess(15, TimeUnit.MINUTES).build();
/**
* Created by shenhongxi on 2018/1/16.
*/
public
class
CityService
{
public void setYibaoCityDao(YibaoCityDao yibaoCityDao) {
this.yibaoCityDao = yibaoCityDao;
}
private
CityDao
cityDao
;
private
static
Cache
<
String
,
List
<
City
>>
cache
=
CacheBuilder
.
newBuilder
().
maximumSize
(
2048
).
expireAfterAccess
(
15
,
TimeUnit
.
MINUTES
).
build
();
public
void
setCityDao
(
CityDao
cityDao
)
{
this
.
cityDao
=
cityDao
;
}
@Override
public List<YibaoCityDO> getByPid(final String pid) {
public
List
<
City
>
getByPid
(
final
String
pid
)
{
try
{
//cache.get方法首先从Cache中查询key是否存在,如果存在则返回对应的value。
//如果不存在,则调用Callable.call方法。并把call方法返回的结果保存在cache中。
return cache.get(pid, new Callable<List<
YibaoCityDO
>>() {
return
cache
.
get
(
pid
,
new
Callable
<
List
<
City
>>()
{
@Override
public List<
YibaoCityDO
> call() throws Exception {
public
List
<
City
>
call
()
throws
Exception
{
return
load
(
pid
);
}
});
...
...
@@ -37,12 +48,11 @@ public class YibaoCityManagerImpl implements YibaoCityManager{
* @return
* @throws Exception
*/
protected List<
YibaoCityDO
> load(final String pid) throws Exception{
List<
YibaoCityDO> result = this.yibaoC
ityDao.getByPid(pid);
protected
List
<
City
>
load
(
final
String
pid
)
throws
Exception
{
List
<
City
>
result
=
this
.
c
ityDao
.
getByPid
(
pid
);
if
(
result
==
null
)
{
throw
new
NullPointerException
(
"pid not existed"
);
}
return
result
;
}
}
whatsmars-earth/whatsmars-earth-service/src/main/java/org/hongxi/whatsmars/earth/service/impl/AccountServiceImpl.java
浏览文件 @
d4e1bf4b
...
...
@@ -4,6 +4,9 @@ import org.hongxi.whatsmars.common.pojo.Result;
import
org.hongxi.whatsmars.earth.dao.AccountDao
;
import
org.hongxi.whatsmars.earth.service.AccountService
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.TransactionStatus
;
import
org.springframework.transaction.support.TransactionCallback
;
import
org.springframework.transaction.support.TransactionTemplate
;
/**
* Created by shenhongxi on 2016/4/1.
...
...
@@ -14,7 +17,7 @@ public class AccountServiceImpl implements AccountService {
private
AccountDao
accountDao
;
//@Autowired
//
private TransactionTemplate transactionTemplate;
//
private TransactionTemplate transactionTemplate;
public
Result
hello
(
String
name
)
{
Result
result
=
new
Result
();
...
...
@@ -26,7 +29,12 @@ public class AccountServiceImpl implements AccountService {
// boolean isSuccess = transactionTemplate.execute(new TransactionCallback<Boolean>() {
// @Override
// public Boolean doInTransaction(TransactionStatus transactionStatus) {
//
// try {
// // ...
// return true;
// } catch (Exception e) {
// transactionStatus.setRollbackOnly();
// }
// return false;
// }
// });
...
...
whatsmars-earth/whatsmars-earth-service/src/main/java/org/hongxi/whatsmars/earth/service/mongo-example.txt
已删除
100644 → 0
浏览文件 @
254ff02f
此差异已折叠。
点击以展开。
whatsmars-earth/whatsmars-earth-service/src/main/java/org/hongxi/whatsmars/earth/service/transaction-example.txt
已删除
100644 → 0
浏览文件 @
254ff02f
@Override
public Result withdraw(final Double withdraw, String clientIp, String dealPassword, String phoneCode) {
final Result result = new Result();
Integer lenderId = LoginContextHolder.getLoginUser().getId();
try {
final LenderAccountDO account = this.lenderAccountManager.validateDealPassword(lenderId, dealPassword);
if (account == null) {
result.setResultCode(ResultCode.VALIDATE_FAILURE);
result.setMessage("交易密码不正确");
return result;
}
if (StringUtils.isBlank(account.getBankName()) || StringUtils.isBlank(account.getBankCardId())){
result.setResultCode(ResultCode.VALIDATE_FAILURE);
result.setMessage("您还未绑定银行卡");
return result;
}
if(account.getBalance() <= 0 || account.getBalanceFrozen() < 0) {
result.setResultCode(ResultCode.VALIDATE_FAILURE);
result.setMessage("账户余额不足,无法提现");
return result;
}
//校验手机校验码是否正确
final LenderDO lender = lenderManager.getById(lenderId);
MongoCollection<Document> dbCollection = mongoDBClient.getCollection(Constants.MONGO_SMS_SEND_OPERATION_COLLECTION);
Bson parentFilter = Filters.and(Filters.eq("phone", lender.getPhone()), Filters.eq("type", withdrawPhoneCode));
Document document = dbCollection.find(parentFilter).limit(1).first();
result.setResultCode(ResultCode.VALIDATE_FAILURE);
result.addModel("flag", "code_error");
if (document == null) {
result.setMessage("验证码非法");
return result;
}
Long created = document.getLong("created");
if (created + 20 * 60000L <= System.currentTimeMillis()) {
result.setMessage("验证码已经过期");
return result;
}
if (!phoneCode.equals(document.get("checkCode"))) {
result.setMessage("验证码错误");
return result;
}
// 提现金额+手续费=交易总额
final Double amount = CalculatorUtils.format(withdraw + 2);
if (amount.compareTo(account.getBalance()) > 0){
result.setResultCode(ResultCode.VALIDATE_FAILURE);
result.setMessage("账户余额不足");
return result;
}
final long time = System.currentTimeMillis();
//计算出商家订单号
final String orderId = "LW" + lenderId + "-" + time;
/**
* 发送提现请求
*/
String bankCardId = account.getBankCardId();
String top = bankCardId.substring(0, 6);
String last = bankCardId.substring(bankCardId.length() - 4, bankCardId.length());
final WithdrawRequestEntity requestEntity = new WithdrawRequestEntity();
requestEntity.setRequestId(orderId);
requestEntity.setIdentityId(lender.getCardId());
requestEntity.setCardTop(top);
requestEntity.setCardLast(last);
requestEntity.setAmount(((Double) (withdraw * 100)).intValue());
requestEntity.setClientIp(clientIp);
//事务操作
boolean isSuccess = transactionTemplate.execute(new TransactionCallback<Boolean>() {
@Override
public Boolean doInTransaction(TransactionStatus transactionStatus) {
try {
//修改投资人账户
Double balanceBefore = account.getBalance();
Double balanceAfter = CalculatorUtils.format(balanceBefore - amount);
Double frozenBefore = account.getBalanceFrozen();
Double frozenAfter = CalculatorUtils.format(frozenBefore + amount);
account.setBalance(balanceAfter);
account.setBalanceFrozen(frozenAfter);
lenderAccountManager.updateBalance(account);
//新建一条投资人流水
final LenderAccountFlowDO flow = new LenderAccountFlowDO();
flow.setLenderId(lender.getId());
flow.setLenderName(lender.getName());
flow.setLenderRealName(lender.getRealName());
flow.setPhone(lender.getPhone());
flow.setType(LenderFlowTypeEnum.WITHDRAW.code);
flow.setOrderId(orderId);
flow.setAmount(amount);
flow.setWithdraw(withdraw);
flow.setFee(2.0D);
flow.setDescription("提现金额:" + withdraw + "元;手续费2元。");
flow.setBalanceBefore(balanceBefore);
flow.setBalanceAfter(balanceAfter);
flow.setFrozenBefore(frozenBefore);
flow.setFrozenAfter(frozenAfter);
//将流水状态设为提现处理中
flow.setStatus(FlowStatusEnum.ONGOING.code);
lenderAccountFlowManager.insert(flow);
JSONObject responseJson = null;
try {
responseJson = TZTUtils.withdraw(requestEntity);
withdrawLogger.error(responseJson.toString());
} catch (Exception e) {
logger.error("lender withdraw request error, lenderId:" + lender.getId(), e);
result.setMessage("第三方支付系统繁忙,请稍后再试");
throw new RuntimeException(e);
}
if (responseJson.containsKey("error_code")) {
result.setResultCode(ResultCode.VALIDATE_FAILURE);
result.setMessage("{" + responseJson.getString("error_code") + ":" + responseJson.getString("error_msg") + "}");
throw new RuntimeException("{" + responseJson.getString("error_code") + ":" + responseJson.getString("error_msg") + "}");
}
if (responseJson.containsKey("clientSignError")) {
result.setResultCode(ResultCode.VALIDATE_FAILURE);
result.setMessage(responseJson.getString("clientSignError"));
throw new RuntimeException(responseJson.getString("clientSignError"));
}
//提现请求状态:FAILURE:请求失败 SUCCESS:请求成功 UNKNOW:未知
String withdrawStatus = responseJson.getString("status");
if (withdrawStatus.equals("FAILURE")) {
result.setResultCode(ResultCode.VALIDATE_FAILURE);
result.setMessage("提现请求失败,请稍后重试!");
throw new RuntimeException("提现请求失败,状态:" + withdrawStatus);
}
//易宝返回的商家订单号
String requestId = responseJson.getString("requestid");
if (!orderId.equals(requestId)) {
result.setResultCode(ResultCode.VALIDATE_FAILURE);
result.setMessage("订单号不一致,订单号:" + orderId);
throw new RuntimeException("订单号不一致,订单号:" + orderId);
}
//提现流水日志
buildFlowLog(flow, time);
return true;
} catch (Exception e) {
transactionStatus.setRollbackOnly();
}
return false;
}
});
result.setSuccess(isSuccess);
} catch (Exception e) {
logger.error("withdraw error, lenderId:" + lenderId, e);
result.setResultCode(ResultCode.SYSTEM_ERROR);
result.setMessage("系统错误,请稍后再试!");
}
return result;
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录