Commit c2efc288 authored by shiyu's avatar shiyu

计算介绍佣金

parent 00dd1533
......@@ -6,9 +6,11 @@ import com.wwdz.ch.core.consts.CommConsts;
import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.core.util.IdUtils;
import com.wwdz.ch.db.dao.distribution.DistributorProfitDao;
import com.wwdz.ch.db.dao.distribution.UserAccountDetailDao;
import com.wwdz.ch.db.dao.distribution.UserBillDao;
import com.wwdz.ch.db.domain.distribution.DistributionOrder;
import com.wwdz.ch.db.domain.distribution.DistributorProfit;
import com.wwdz.ch.db.domain.distribution.UserAccountDetail;
import com.wwdz.ch.db.domain.distribution.UserBill;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
......@@ -40,6 +42,9 @@ public class SysUserBillServiceImpl implements SysUserBillService {
@Autowired
DistributorProfitDao distributorProfitDao;
@Autowired
UserAccountDetailDao userAccountDetailDao;
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
public Result finishCalculate(DistributionOrder distributionOrder){
......@@ -86,6 +91,12 @@ public class SysUserBillServiceImpl implements SysUserBillService {
updateBill.setTotalEntryAmount(updateBill.getOrderEntryAmount() + userBill.getIntroduceEntryAmount());
}
userBillDao.updateByPrimaryKey(updateBill);
//计算介绍人的佣金(介绍人非卖家自己和平台)
if (!distributionOrder.getShareRecordId().equals(distributionOrder.getSellerId().toString())
&& distributionOrder.getSellerId().longValue() != CommConsts.SYSTEM_ACCOUNT) {
calculateIntroduceAmount(distributionOrder.getDistributionOrderId(), accountPeriod);
}
return Result.success();
} catch (Exception e) {
logger.error("************ 订单完成后计算订单账单ERROR: {}", e);
......@@ -98,4 +109,35 @@ public class SysUserBillServiceImpl implements SysUserBillService {
}
return Result.failed();
}
/**
* 计算介绍佣金
*/
private void calculateIntroduceAmount(String distributionOrderId, String accountPeriod) {
UserAccountDetail userAccountDetail = userAccountDetailDao.find(distributionOrderId, BillEnum.AccountDetailTypeEnum.INTRODUCE.getCode());
if (userAccountDetail == null) {
logger.error("********** 交易id:{}, 查询不到佣金记录 **********", distributionOrderId);
return;
}
long userId = userAccountDetail.getUserId();
long amount = userAccountDetail.getAmount();
//查询介绍人是否有账单
UserBill userBill = userBillDao.findOne(accountPeriod, userId, BillEnum.BillStateEnum.NOT_PAID.getCode());
if (userBill == null) {
logger.error("********* 订单完成,介绍人: {}, 尚未创建 {} 账单 *********", userId, accountPeriod);
}
UserBill updateBill = new UserBill();
long newTotalWaitEntryAmount = userBill.getTotalWaitEntryAmount() - amount;
long newIntroduceWaitEntryAmount = userBill.getIntroduceWaitEntryAmount() - amount;
long newIntroduceEntryAmount = userBill.getIntroduceWaitEntryAmount() + amount;
long newTotalEntryAmount = userBill.getTotalEntryAmount() + amount;
updateBill.setId(userBill.getId());
updateBill.setTotalWaitEntryAmount(newTotalWaitEntryAmount);
updateBill.setIntroduceWaitEntryAmount(newIntroduceWaitEntryAmount);
updateBill.setTotalEntryAmount(newTotalEntryAmount);
updateBill.setIntroduceEntryAmount(newIntroduceEntryAmount);
userBillDao.updateByPrimaryKey(updateBill);
}
}
......@@ -15,6 +15,14 @@ public interface UserAccountDetailDao {
List<UserAccountDetail> findList(UserAccountDetailRequestDto dto);
/**
* 根据交易id和收支类型查询账单明细
* @param transactionId
* @param type
* @return
*/
UserAccountDetail find(String transactionId, int type);
/**
* 按照筛选条件汇总账户金额
* @param dto
......
......@@ -66,6 +66,15 @@ public class UserAccountDetailDaoImpl implements UserAccountDetailDao {
}
@Override
public UserAccountDetail find(String transactionId, int type) {
UserAccountDetailExample example = new UserAccountDetailExample();
UserAccountDetailExample.Criteria criteria = example.createCriteria();
criteria.andTransactionIdEqualTo(transactionId);
criteria.andTypeEqualTo(type);
return userAccountDetailMapper.selectOneByExample(example);
}
@Override
public long summaryAmount(UserAccountDetailRequestDto dto) {
UserAccountDetailExample example = new UserAccountDetailExample();
......
......@@ -5,9 +5,11 @@ import com.wwdz.ch.core.consts.CommConsts;
import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.core.util.IdUtils;
import com.wwdz.ch.db.dao.distribution.DistributorProfitDao;
import com.wwdz.ch.db.dao.distribution.UserAccountDetailDao;
import com.wwdz.ch.db.dao.distribution.UserBillDao;
import com.wwdz.ch.db.domain.distribution.DistributionOrder;
import com.wwdz.ch.db.domain.distribution.DistributorProfit;
import com.wwdz.ch.db.domain.distribution.UserAccountDetail;
import com.wwdz.ch.db.domain.distribution.UserBill;
import com.wwdz.ch.wx.service.distribution.UserBillService;
import org.redisson.api.RLock;
......@@ -40,6 +42,9 @@ public class UserBillServiceImpl implements UserBillService {
@Autowired
DistributorProfitDao distributorProfitDao;
@Autowired
UserAccountDetailDao userAccountDetailDao;
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
public Result payCalculate(DistributionOrder distributionOrder, DistributorProfit distributorProfit) {
......@@ -93,13 +98,18 @@ public class UserBillServiceImpl implements UserBillService {
updateBill.setId(userBill.getId());
updateBill.setTotalWaitEntryAmount(newTotalWaitEntryAmount);
updateBill.setOrderWaitEntryAmount(newOrderWaitEntryAmount);
if (distributionOrder.getShareRecordId().equals(distributionOrder.getSellerId())) {
if (distributionOrder.getShareRecordId().equals(distributionOrder.getSellerId().toString())) {
//表示介绍人是卖家自己
long newIntroduceWaitEntryAmount = userBill.getIntroduceWaitEntryAmount() + introduceCost;
updateBill.setIntroduceWaitEntryAmount(newIntroduceWaitEntryAmount);
}
userBillDao.updateByPrimaryKey(updateBill);
}
//计算介绍人的佣金(介绍人非卖家自己和平台)
if (!distributionOrder.getShareRecordId().equals(distributionOrder.getSellerId().toString())
&& distributionOrder.getSellerId().longValue() != CommConsts.SYSTEM_ACCOUNT) {
calculateIntroduceAmount(distributionOrder.getDistributionOrderId(), accountPeriod);
}
return Result.success();
} catch (Exception e) {
logger.error("************ 计算订单账单ERROR: {}", e);
......@@ -113,8 +123,43 @@ public class UserBillServiceImpl implements UserBillService {
return Result.failed();
}
private void calculate() {
/**
* 计算介绍佣金
*/
private void calculateIntroduceAmount(String distributionOrderId, String accountPeriod) {
UserAccountDetail userAccountDetail = userAccountDetailDao.find(distributionOrderId, BillEnum.AccountDetailTypeEnum.INTRODUCE.getCode());
if (userAccountDetail == null) {
logger.error("********** 交易id:{}, 查询不到佣金记录 **********", distributionOrderId);
return;
}
long userId = userAccountDetail.getUserId();
long amount = userAccountDetail.getAmount();
//查询介绍人是否有账单
UserBill userBill = userBillDao.findOne(accountPeriod, userId, BillEnum.BillStateEnum.NOT_PAID.getCode());
if (userBill == null) {
UserBill newBill = new UserBill();
String billId = IdUtils.getOrderNumber(CommConsts.USER_BILL_PREFIX);
newBill.setBillId(billId);
newBill.setAccountPeriod(accountPeriod);
newBill.setUserId(userId);
newBill.setTotalWaitEntryAmount(0L);
newBill.setTotalEntryAmount(0L);
newBill.setOrderWaitEntryAmount(0L);
newBill.setOrderEntryAmount(0L);
newBill.setIntroduceWaitEntryAmount(amount);
newBill.setIntroduceEntryAmount(0L);
newBill.setCreateTime(new Date());
newBill.setUpdateTime(new Date());
newBill.setState(BillEnum.BillStateEnum.NOT_PAID.getCode());
userBillDao.insert(newBill);
} else {
UserBill updateBill = new UserBill();
long newTotalWaitEntryAmount = userBill.getTotalWaitEntryAmount() + amount;
long newIntroduceWaitEntryAmount = userBill.getIntroduceWaitEntryAmount() + amount;
updateBill.setId(userBill.getId());
updateBill.setTotalWaitEntryAmount(newTotalWaitEntryAmount);
updateBill.setIntroduceWaitEntryAmount(newIntroduceWaitEntryAmount);
userBillDao.updateByPrimaryKey(updateBill);
}
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment