|
|
|
@ -11,16 +11,14 @@ import com.baiye.modules.settlement.dao.CallCostRepository;
|
|
|
|
|
import com.baiye.modules.settlement.entity.CallSettlement;
|
|
|
|
|
import com.baiye.modules.settlement.service.CallCostService;
|
|
|
|
|
|
|
|
|
|
import com.baiye.modules.system.domain.MessageNotification;
|
|
|
|
|
import com.baiye.modules.system.domain.PayTemplate;
|
|
|
|
|
import com.baiye.modules.system.domain.PayTemplateUser;
|
|
|
|
|
import com.baiye.modules.system.domain.User;
|
|
|
|
|
import com.baiye.modules.system.repository.MessageNotificationRepository;
|
|
|
|
|
import com.baiye.modules.system.repository.PayTemplateRepository;
|
|
|
|
|
import com.baiye.modules.system.repository.PayTemplateUserRepository;
|
|
|
|
|
import com.baiye.modules.system.repository.UserRepository;
|
|
|
|
|
import com.baiye.modules.system.service.CompanyService;
|
|
|
|
|
import com.baiye.modules.system.service.UserMessageService;
|
|
|
|
|
import com.baiye.modules.system.service.OrganizeService;
|
|
|
|
|
import com.baiye.modules.system.service.dto.CompanyDto;
|
|
|
|
|
import com.baiye.util.DateTimeUtil;
|
|
|
|
|
import com.baiye.util.RedisUtils;
|
|
|
|
@ -49,13 +47,11 @@ public class CallCostServiceImpl implements CallCostService {
|
|
|
|
|
private final CallCostRepository callCostRepository;
|
|
|
|
|
private final CompanyService companyService;
|
|
|
|
|
private final UserRepository userRepository;
|
|
|
|
|
private final MessageNotificationRepository messageNotificationRepository;
|
|
|
|
|
private final UserMessageService userMessageService;
|
|
|
|
|
private final OnlineUserService onlineUserService;
|
|
|
|
|
private final UserReportRepository userReportRepository;
|
|
|
|
|
private final RedisUtils redisUtils;
|
|
|
|
|
private final SmsUtil smsUtil;
|
|
|
|
|
private final double price = 0.18;
|
|
|
|
|
private final OrganizeService organizeService;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 计算当天的通话时长和费用
|
|
|
|
@ -98,10 +94,15 @@ public class CallCostServiceImpl implements CallCostService {
|
|
|
|
|
//账户余额
|
|
|
|
|
CompanyDto companyById = companyService.findCompanyById(companyId);
|
|
|
|
|
|
|
|
|
|
int callMode = organizeService.getOrganizeByUserId(userId).getCallMode();
|
|
|
|
|
//公司账号
|
|
|
|
|
User manager = userRepository.getOne(companyById.getUserId());
|
|
|
|
|
double price = callMode == 0 ? manager.getDoubleCallFee() : manager.getRollCallFee();
|
|
|
|
|
|
|
|
|
|
//今日计算预扣
|
|
|
|
|
double estimateAmountToDay = getEstimateAmount(list);
|
|
|
|
|
double estimateAmountToDay = getEstimateAmount(list, price);
|
|
|
|
|
|
|
|
|
|
CallSettlement callSettlement = deduction(info, durationToday, estimateAmountToDay, companyId, companyById);
|
|
|
|
|
CallSettlement callSettlement = deduction(info, durationToday, estimateAmountToDay, companyId, companyById, manager, price);
|
|
|
|
|
callSettlement.setCreateTime(DateUtil.date());
|
|
|
|
|
callSettlement.setCompanyId(companyId);
|
|
|
|
|
callSettlement.setMemberId(userId);
|
|
|
|
@ -120,10 +121,12 @@ public class CallCostServiceImpl implements CallCostService {
|
|
|
|
|
* @param estimateAmountToDay 今日 预扣金额
|
|
|
|
|
* @param companyId
|
|
|
|
|
* @param companyById 公司信息
|
|
|
|
|
* @param manager 公司账号信息
|
|
|
|
|
* @param price 呼叫单价
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
public CallSettlement deduction(PayTemplateUser info, Long durationToday, Double estimateAmountToDay, Long companyId, CompanyDto companyById) {
|
|
|
|
|
private CallSettlement deduction(PayTemplateUser info, Long durationToday, Double estimateAmountToDay, Long companyId, CompanyDto companyById, User manager, Double price) {
|
|
|
|
|
CallSettlement callSettlement = new CallSettlement();
|
|
|
|
|
long userId = info.getUserId();
|
|
|
|
|
Double userBalance = companyById.getUserBalance();
|
|
|
|
@ -136,8 +139,9 @@ public class CallCostServiceImpl implements CallCostService {
|
|
|
|
|
//最近的一次预扣 减金额
|
|
|
|
|
estimateAmount = callSettlementSort.get(0).getEstimateAmount();
|
|
|
|
|
}
|
|
|
|
|
double deductAmount = NumberUtil.mul(durationToday.intValue(), price);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
double deductAmount = NumberUtil.mul(durationToday.intValue(), price.doubleValue());
|
|
|
|
|
//余额足够
|
|
|
|
|
if (estimateAmount + userBalance > deductAmount + estimateAmountToDay) {
|
|
|
|
|
companyService.updateUserBalanceByCompanyId(userBalance + estimateAmount - (deductAmount + estimateAmountToDay), companyId);
|
|
|
|
@ -149,8 +153,7 @@ public class CallCostServiceImpl implements CallCostService {
|
|
|
|
|
//判断当前公司是否已经短信通知过
|
|
|
|
|
Object o = redisUtils.get("call_sms:" + companyId);
|
|
|
|
|
if (o == null || (int) o == 0) {
|
|
|
|
|
User one = userRepository.getOne(companyById.getUserId());
|
|
|
|
|
smsUtil.sendAliYunSmsNotice(one.getPhone(), "{\"name\":\"" + one.getUsername() + "\"}");
|
|
|
|
|
smsUtil.sendAliYunSmsNotice(manager.getPhone(), "{\"name\":\"" + manager.getUsername() + "\"}");
|
|
|
|
|
//短信通知后 缓存在redis
|
|
|
|
|
redisUtils.set("call_sms:" + companyId, 1);
|
|
|
|
|
}
|
|
|
|
@ -188,7 +191,7 @@ public class CallCostServiceImpl implements CallCostService {
|
|
|
|
|
* @param list
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
private Double getEstimateAmount(List<UserReport> list) {
|
|
|
|
|
private Double getEstimateAmount(List<UserReport> list, Double price) {
|
|
|
|
|
List<UserReport> sortList = list.stream().sorted(Comparator.comparing(UserReport::getCreateTime).reversed()).collect(Collectors.toList());
|
|
|
|
|
//取最近的7天数据 去最大和最小值求平均数
|
|
|
|
|
List<UserReport> list1;
|
|
|
|
@ -201,16 +204,11 @@ public class CallCostServiceImpl implements CallCostService {
|
|
|
|
|
|
|
|
|
|
int sumScore = 0;
|
|
|
|
|
int sumTimes = 0;
|
|
|
|
|
for (int i = 0; i < collect.size(); i++) {
|
|
|
|
|
if (collect.get(i).equals(collect.get(0)) || collect.get(i).equals(collect.get(collect.size() - 1))) {
|
|
|
|
|
continue;
|
|
|
|
|
} else {
|
|
|
|
|
sumScore += collect.get(i);
|
|
|
|
|
sumTimes++;
|
|
|
|
|
}
|
|
|
|
|
for (int i = 1; i < collect.size() - 1; i++) {
|
|
|
|
|
sumScore += collect.get(i);
|
|
|
|
|
sumTimes++;
|
|
|
|
|
}
|
|
|
|
|
return NumberUtil.mul((double) (sumScore / sumTimes), price);
|
|
|
|
|
return NumberUtil.mul((double) (sumScore / sumTimes), price.doubleValue());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|