提交 1ac3bc13 authored 作者: jacksmith1988's avatar jacksmith1988

//add code

上级 425a771c
package me.zohar.runscore.config.security;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import java.io.IOException;
......@@ -9,12 +10,13 @@ import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component
@WebFilter(filterName = "CorsFilter")
@Configuration
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
......
......@@ -8,7 +8,6 @@ import lombok.Getter;
*
* @author zohar
* @date 2019年1月7日
*
*/
@Getter
@AllArgsConstructor
......@@ -64,6 +63,8 @@ public enum BizError {
商户未接入("1015", "商户未接入"),
系统无可用商户("1015", "系统无可用商户"),
商户订单不存在("1015", "商户订单不存在"),
不支持该支付类型("1015", "不支持该支付类型"),
......@@ -168,7 +169,8 @@ public enum BizError {
不是上级账号无权查看该账号及下级的充值记录("1014", "不是上级账号无权查看该账号及下级的充值记录"),
不是上级账号无权查看该账号及下级的提现记录("1014", "不是上级账号无权查看该账号及下级的提现记录"),;
不是上级账号无权查看该账号及下级的提现记录("1014", "不是上级账号无权查看该账号及下级的提现记录"),
;
private String code;
......
......@@ -124,6 +124,8 @@ public class Constant {
public static final String 账变日志类型_奖励金返点 = "12";
public static final String 账变日志类型_订单结算 = "13";
public static final String 充提日志订单类型_充值 = "1";
public static final String 充提日志订单类型_提现 = "2";
......
package me.zohar.runscore.merchant.domain;
import java.math.BigDecimal;
import java.util.Date;
import javax.persistence.Column;
......@@ -77,4 +78,10 @@ public class Merchant {
@JoinColumn(name = "relevance_account_id", updatable = false, insertable = false, foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
private UserAccount relevanceAccount;
private BigDecimal alipayRate;
private BigDecimal wechatRate;
private BigDecimal bankcardRate;
}
......@@ -110,6 +110,11 @@ public class MerchantOrder {
*/
private Double bounty;
/**
* 扣除手续费的金额
*/
private Double settleAmount;
/**
* 乐观锁版本号
*/
......@@ -134,6 +139,11 @@ public class MerchantOrder {
@JoinColumn(name = "pay_info_id", updatable = false, insertable = false, foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
private MerchantOrderPayInfo payInfo;
public void updateSettleAmount(Double settleAmount) {
this.setSettleAmount(settleAmount);
}
public void updateBounty(Double bounty) {
this.setBounty(bounty);
}
......
package me.zohar.runscore.merchant.service;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.Map.Entry;
import java.util.concurrent.TimeUnit;
......@@ -28,6 +22,7 @@ import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import com.zengtengpeng.annotation.Lock;
......@@ -113,7 +108,6 @@ public class MerchantOrderService {
private OrderRebateRepo orderRebateRepo;
@Transactional(readOnly = true)
public MerchantOrderDetailsVO findMerchantOrderDetailsById(@NotBlank String orderId) {
MerchantOrderDetailsVO vo = MerchantOrderDetailsVO.convertFor(merchantOrderRepo.getOne(orderId));
......@@ -219,7 +213,7 @@ public class MerchantOrderService {
return gatheringCode;
}
}
return null;
return new GatheringCode();
}
@Transactional
......@@ -234,7 +228,8 @@ public class MerchantOrderService {
}
platformOrder.confirmToPaid(null);
merchantOrderRepo.save(platformOrder);
receiveOrderBountySettlement(platformOrder);
merchantSettlement(platformOrder);
// receiveOrderBountySettlement(platformOrder);
}
/**
......@@ -251,7 +246,51 @@ public class MerchantOrderService {
}
platformOrder.confirmToPaid(note);
merchantOrderRepo.save(platformOrder);
receiveOrderBountySettlement(platformOrder);
merchantSettlement(platformOrder);
// receiveOrderBountySettlement(platformOrder);
}
/**
* 商户加钱
*/
@Transactional
public void merchantSettlement(MerchantOrder merchantOrder) {
UserAccount userAccount = merchantOrder.getReceivedAccount();
Merchant merchant = merchantOrder.getMerchant();
BigDecimal rate = new BigDecimal(0);
switch (merchantOrder.getGatheringChannelCode()) {
case Constant.支付渠道_微信码:
rate = Optional.ofNullable(merchant.getWechatRate()).orElse(new BigDecimal(0));
break;
case Constant.支付渠道_支付宝码:
rate = Optional.ofNullable(merchant.getAlipayRate()).orElse(new BigDecimal(0));
break;
case Constant.支付渠道_银行卡:
rate = Optional.ofNullable(merchant.getBankcardRate()).orElse(new BigDecimal(0));
break;
default:
break;
}
double rateFee = NumberUtil.round(merchantOrder.getGatheringAmount() * rate.doubleValue(), 4)
.doubleValue();
double merchantSettleAmount = merchantOrder.getGatheringAmount() - rateFee;
merchantOrder.updateSettleAmount(merchantSettleAmount);
//商户结算
UserAccount merchantAccount = merchant.getRelevanceAccount();
double cashDeposit = merchantAccount.getCashDeposit() + merchantSettleAmount;
merchantAccount.setCashDeposit(NumberUtil.round(cashDeposit, 4).doubleValue());
userAccountRepo.save(merchantAccount);
accountChangeLogRepo.save(AccountChangeLog.buildWithMerchantSettle(userAccount, merchantOrder));
}
/**
......@@ -419,8 +458,9 @@ public class MerchantOrderService {
merchantOrderPayInfoRepo.save(payInfo);
//todo this is temporary code 这里要匹配有资源的用户接单
List<UserAccount> userAccounts = userAccountRepo.findAllByAccountType(Constant.账号类型_会员);
;
List<UserAccount> userAccounts = userAccountRepo.findAllByAccountTypeAndState(Constant.账号类型_会员, Constant.账号状态_启用).orElseThrow(() -> new BizException(BizError.系统无可用商户));
this.receiveOrder(userAccounts.get(RandomUtil.randomInt(0, userAccounts.size())).getId(), merchantOrder.getId());
return MerchantOrderVO.convertFor(merchantOrder);
......@@ -446,7 +486,7 @@ public class MerchantOrderService {
String gatheringCodeStorageId = getGatheringCodeStorageId(userAccountId,
platformOrder.getGatheringChannelCode(), platformOrder.getGatheringAmount());
//支付宝和微信才有收款码
if (StrUtil.isBlank(gatheringCodeStorageId) && !platformOrder.getGatheringChannelCode().equals(Constant.支付渠道_银行卡) ) {
if (StrUtil.isBlank(gatheringCodeStorageId) && !platformOrder.getGatheringChannelCode().equals(Constant.支付渠道_银行卡)) {
throw new BizException(BizError.无法接单找不到对应金额的收款码);
}
// 校验用户是否达到接单上限,若达到上限,则不能接单
......
......@@ -11,6 +11,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import lombok.Data;
import me.zohar.runscore.constants.Constant;
import me.zohar.runscore.dictconfig.ConfigHolder;
import me.zohar.runscore.dictconfig.DictHolder;
import me.zohar.runscore.merchant.domain.MerchantOrder;
......@@ -136,7 +137,14 @@ public class MerchantOrderVO {
if (StrUtil.isNotBlank(merchantOrder.getReceivedAccountId()) && merchantOrder.getReceivedAccount() != null) {
vo.setReceiverUserName(merchantOrder.getReceivedAccount().getUserName());
}
if(merchantOrder.getGatheringChannelCode().equals(Constant.支付渠道_银行卡))
{
vo.setPayUrl(ConfigHolder.getConfigValue("merchantOrderPayUrlForCard") + vo.getOrderNo());
}else
{
vo.setPayUrl(ConfigHolder.getConfigValue("merchantOrderPayUrl") + vo.getOrderNo());
}
vo.setPayInfo(MerchantOrderPayInfoVO.convertFor(merchantOrder.getPayInfo()));
return vo;
}
......
......@@ -35,6 +35,6 @@ public class TotalAccountReceiveOrderSituation {
private Long paidOrderNum;
private Double rebateAmount;
//private Double rebateAmount;
}
......@@ -302,4 +302,24 @@ public class AccountChangeLog {
return log;
}
/**
* 构建商户结算账变日志
*
* @param userAccount
* @param merchantOrder
* @return
*/
public static AccountChangeLog buildWithMerchantSettle(UserAccount userAccount, MerchantOrder merchantOrder) {
AccountChangeLog log = new AccountChangeLog();
log.setId(IdUtils.getId());
log.setOrderNo(merchantOrder.getId());
log.setAccountChangeTime(new Date());
log.setAccountChangeTypeCode(Constant.账变日志类型_订单结算);
log.setAccountChangeAmount(NumberUtil.round(merchantOrder.getSettleAmount(), 4).doubleValue());
log.setCashDeposit(userAccount.getCashDeposit());
log.setUserAccountId(userAccount.getId());
return log;
}
}
......@@ -4,6 +4,7 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.List;
import java.util.Optional;
import me.zohar.runscore.useraccount.domain.UserAccount;
......@@ -15,4 +16,6 @@ public interface UserAccountRepo extends JpaRepository<UserAccount, String>, Jpa
Long countByInviterId(String inviterId);
List<UserAccount> findAllByAccountType(String accountType);
Optional<List<UserAccount>> findAllByAccountTypeAndState(String accountType, String state);
}
......@@ -86,4 +86,9 @@ public class PageController {
return "pay";
}
@GetMapping("/bankpay")
public String bankpay() {
return "bankpay";
}
}
package me.zohar.runscore.config.security;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import java.io.IOException;
......@@ -9,12 +10,13 @@ import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component
@WebFilter(filterName = "CorsFilter")
@Configuration
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
......
......@@ -18,7 +18,7 @@
<li class="nav-item" v-bind:class="{'active': currentPathName == '/appeal-record'}" v-on:click="navTo('/appeal-record')"><a class="nav-link">申诉记录</a></li>
</ul>
<form class="form-inline" style="float: right;">
<span style="padding-right: 20px;">商户端:{{userName}}</span>
<span style="padding-right: 20px;">商户端:{{userName}} 当前余额:{{cashDeposit}}</span>
<button type="button" class="btn btn-light btn-sm" v-on:click="logout">退出登录</button>
</form>
</nav>
......@@ -41,7 +41,8 @@
el : '#header',
data : {
userName : '',
currentPathName : ''
currentPathName : '',
cashDeposit:''
},
computed : {},
created : function() {
......@@ -63,6 +64,7 @@
that.isLoggedInFlag = false;
} else {
that.userName = res.body.data.userName;
that.cashDeposit = res.body.data.cashDeposit;
}
});
},
......
package me.zohar.runscore.config.security;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import java.io.IOException;
......@@ -9,12 +10,13 @@ import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component
@WebFilter(filterName = "CorsFilter")
@Configuration
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
......
......@@ -866,7 +866,7 @@ CREATE TABLE `v_merchant_everyday_statistical` (
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
/*-- ----------------------------
-- Table structure for v_merchant_month_statistical
-- ----------------------------
DROP TABLE IF EXISTS `v_merchant_month_statistical`;
......@@ -901,7 +901,7 @@ CREATE TABLE `v_merchant_total_statistical` (
`trade_amount` double DEFAULT NULL,
PRIMARY KEY (`merchant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
*/
-- ----------------------------
-- Table structure for v_rebate_situation
-- ----------------------------
......
/*
MySQL Backup
Database: runscore
Backup Time: 2021-11-13 10:39:45
*/
SET FOREIGN_KEY_CHECKS=0;
DROP VIEW IF EXISTS `runscore`.`v_merchant_month_statistical`;
DROP VIEW IF EXISTS `runscore`.`v_merchant_today_statistical`;
DROP VIEW IF EXISTS `runscore`.`v_merchant_total_statistical`;
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `v_merchant_month_statistical` AS select `po`.`merchant_id` AS `merchant_id`,round(sum(`po`.`gathering_amount`),4) AS `gathering_amount`,count(1) AS `order_num`,round(sum((case when (`po`.`order_state` = '4') then `po`.`gathering_amount` else 0 end)),4) AS `trade_amount`,sum((case when (`po`.`order_state` = '4') then 1 else 0 end)) AS `paid_order_num` from (`merchant_order` `po` left join `merchant` `ua` on((`po`.`merchant_id` = `ua`.`id`))) where ((`po`.`received_account_id` is not null) and (`po`.`submit_time` >= str_to_date(date_format(curdate(),'%Y-%m-01 00:00:00'),'%Y-%m-%d %H:%i:%s')) and (`po`.`submit_time` < (str_to_date(date_format(curdate(),'%Y-%m-01 00:00:00'),'%Y-%m-%d %H:%i:%s') + interval 1 month))) group by `po`.`merchant_id`;
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `v_merchant_today_statistical` AS select `po`.`merchant_id` AS `merchant_id`,round(sum(`po`.`gathering_amount`),4) AS `gathering_amount`,count(1) AS `order_num`,round(sum((case when (`po`.`order_state` = '4') then `po`.`gathering_amount` else 0 end)),4) AS `trade_amount`,sum((case when (`po`.`order_state` = '4') then 1 else 0 end)) AS `paid_order_num` from (`merchant_order` `po` left join `merchant` `ua` on((`po`.`merchant_id` = `ua`.`id`))) where ((`po`.`received_account_id` is not null) and (`po`.`received_time` >= str_to_date(date_format(now(),'%Y-%m-%d'),'%Y-%m-%d %H:%i:%s')) and (`po`.`received_time` < (str_to_date(date_format(now(),'%Y-%m-%d'),'%Y-%m-%d %H:%i:%s') + interval 1 day))) group by `po`.`merchant_id`;
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `v_merchant_total_statistical` AS select `po`.`merchant_id` AS `merchant_id`,round(sum(`po`.`gathering_amount`),4) AS `gathering_amount`,count(1) AS `order_num`,round(sum((case when (`po`.`order_state` = '4') then `po`.`gathering_amount` else 0 end)),4) AS `trade_amount`,sum((case when (`po`.`order_state` = '4') then 1 else 0 end)) AS `paid_order_num` from (`merchant_order` `po` left join `merchant` `ua` on((`po`.`merchant_id` = `ua`.`id`))) where (`po`.`received_account_id` is not null) group by `po`.`merchant_id`;
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论