Browse Source

Merge branch 'adapay_max_receipt' into online1

周箭河 4 years ago
parent
commit
a7fea53714

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/HfMemberDao.java

@@ -18,8 +18,15 @@ public interface HfMemberDao extends BaseDAO<Integer, HfMember> {
 
     /**
      * 根据名字获取商户信息
+     *
      * @param name
      * @return
      */
     HfMember getByName(@Param("name") String name);
+
+    /**
+     * 获取分佣账户中需要验证每月收最大金额的账户
+     * @return
+     */
+    List<HfMember> getNeedRouteMerNos();
 }

+ 10 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysPaymentConfigDao.java

@@ -10,6 +10,7 @@ import java.util.List;
 public interface SysPaymentConfigDao extends BaseDAO<Integer, SysPaymentConfig> {
     /**
      * 获取分部的收费配置
+     *
      * @param organId
      * @return
      */
@@ -17,6 +18,7 @@ public interface SysPaymentConfigDao extends BaseDAO<Integer, SysPaymentConfig>
 
     /**
      * 根据分部ids获取收费配置
+     *
      * @param organIds
      * @return
      */
@@ -25,14 +27,21 @@ public interface SysPaymentConfigDao extends BaseDAO<Integer, SysPaymentConfig>
 
     /**
      * 根据支付渠道获取账户
+     *
      * @param payType
      * @return
      */
     List<SysPaymentConfig> getPaymentConfigs(@Param("payType") PaymentChannelEnum payType);
 
     /**
-     *
      * @return
      */
     List<SysPaymentConfig> getOutAccounts(@Param("payType") PaymentChannelEnum payType);
+
+    /**
+     * 根据汇付账户获取配置
+     * @param merNo
+     * @return
+     */
+    SysPaymentConfig findPaymentConfigByMerNo(@Param("merNo") String merNo);
 }

+ 34 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/HfMember.java

@@ -3,6 +3,7 @@ package com.ym.mec.biz.dal.entity;
 import io.swagger.annotations.ApiModelProperty;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
 public class HfMember {
@@ -71,6 +72,15 @@ public class HfMember {
     @ApiModelProperty(value = "备注",required = true)
     private String memo;
 
+    @ApiModelProperty(value = "每月最大收款金额",required = true)
+    private BigDecimal monthMaxReceipt;
+
+    @ApiModelProperty(value = "满额后收款账户",required = true)
+    private String routeMemberId;
+
+    @ApiModelProperty(value = "满额后收款分部",required = true)
+    private Integer routeOrganId;
+
     public Integer getId() {
         return Id;
     }
@@ -246,4 +256,28 @@ public class HfMember {
     public void setMemo(String memo) {
         this.memo = memo;
     }
+
+    public BigDecimal getMonthMaxReceipt() {
+        return monthMaxReceipt;
+    }
+
+    public void setMonthMaxReceipt(BigDecimal monthMaxReceipt) {
+        this.monthMaxReceipt = monthMaxReceipt;
+    }
+
+    public String getRouteMemberId() {
+        return routeMemberId;
+    }
+
+    public void setRouteMemberId(String routeMemberId) {
+        this.routeMemberId = routeMemberId;
+    }
+
+    public Integer getRouteOrganId() {
+        return routeOrganId;
+    }
+
+    public void setRouteOrganId(Integer routeOrganId) {
+        this.routeOrganId = routeOrganId;
+    }
 }

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysPaymentConfigService.java

@@ -39,4 +39,11 @@ public interface SysPaymentConfigService extends BaseService<Integer, SysPayment
      * @return
      */
     AccountType checkAccountType(PaymentChannelEnum payType, String merNos);
+
+    /**
+     * 根据汇付获取配置
+     * @param merNo
+     * @return
+     */
+    SysPaymentConfig findPaymentConfigByMerNo(String merNo);
 }

+ 84 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/PayServiceImpl.java

@@ -1,33 +1,30 @@
 package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
-import com.ym.mec.biz.dal.dao.MusicGroupDao;
+import com.ym.mec.biz.dal.dao.HfMemberDao;
 import com.ym.mec.biz.dal.dao.StudentPaymentRouteOrderDao;
 import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.dto.AmountChannelDto;
 import com.ym.mec.biz.dal.dto.RouteScaleDto;
-import com.ym.mec.biz.dal.entity.Group;
-import com.ym.mec.biz.dal.entity.StudentPaymentRouteOrder;
-import com.ym.mec.biz.dal.entity.SysAccount;
-import com.ym.mec.biz.dal.entity.SysPaymentConfig;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.FeeTypeEnum;
 import com.ym.mec.biz.dal.enums.PaymentChannelEnum;
-import com.ym.mec.biz.dal.enums.PaymentChannelTypeEnum;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.redis.service.RedisCache;
 import com.ym.mec.thirdparty.adapay.ConfigInit;
 import com.ym.mec.thirdparty.adapay.Payment;
-import com.ym.mec.thirdparty.union.UnionPay;
-import com.ym.mec.thirdparty.union.UnionPayFeignService;
 import com.ym.mec.thirdparty.yqpay.YqPayUtil;
 import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -45,6 +42,10 @@ public class PayServiceImpl implements PayService {
     private StudentPaymentRouteOrderDao studentPaymentRouteOrderDao;
     @Autowired
     private SellOrderService sellOrderService;
+    @Autowired
+    private HfMemberDao hfMemberDao;
+    @Autowired
+    private RedisCache<String, Object> redisCache;
 
     @Override
     public Map<String, Object> getPayMap(BigDecimal amount, BigDecimal balanceAmount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody, Integer organId, String receiver) throws Exception {
@@ -73,6 +74,11 @@ public class PayServiceImpl implements PayService {
             routeScaleDtos = getPaymentConfigChannel(organId, amount);
         }
 
+        //验证最大收款金额
+        for (RouteScaleDto routeScaleDto : routeScaleDtos) {
+            checkMaxReceipt(routeScaleDto, routeScaleDto.getMerNo());
+        }
+
         return getPayRoute(amount, balanceAmount, orderNo, notifyUrl, returnUrl, orderSubject, orderBody, routeScaleDtos);
     }
 
@@ -290,6 +296,24 @@ public class PayServiceImpl implements PayService {
     }
 
     private Map<String, Object> getPayRoute(BigDecimal amount, BigDecimal balanceAmount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody, List<RouteScaleDto> routeScaleDtos) throws Exception {
+        Map<String, List<RouteScaleDto>> routeScaleDtosMap = routeScaleDtos.stream().collect(Collectors.groupingBy(RouteScaleDto::getMerNo));
+
+        //合并同账号的数据
+        List<RouteScaleDto> newRouteScaleDtos = new ArrayList<>();
+        for (Map.Entry<String, List<RouteScaleDto>> groupRouteScaleDtos : routeScaleDtosMap.entrySet()) {
+            RouteScaleDto routeScaleDto = null;
+            for (RouteScaleDto scaleDto : groupRouteScaleDtos.getValue()) {
+                if (routeScaleDto == null) {
+                    routeScaleDto = scaleDto;
+                } else {
+                    routeScaleDto.setAmount(routeScaleDto.getAmount().add(scaleDto.getAmount()));
+                    routeScaleDto.setBalance(routeScaleDto.getBalance().add(scaleDto.getBalance()));
+                }
+            }
+            newRouteScaleDtos.add(routeScaleDto);
+        }
+        routeScaleDtos = newRouteScaleDtos;
+
         Map<String, Object> unionPay = new HashMap<>();
         Map<String, Object> payMap = null;
 
@@ -498,4 +522,56 @@ public class PayServiceImpl implements PayService {
         }
         return newRouteScaleDtos;
     }
+
+
+    /**
+     * 收款已满转到其他收款账户
+     *
+     * @param routeScaleDto
+     * @param merNo
+     * @return
+     */
+    private RouteScaleDto checkMaxReceipt(RouteScaleDto routeScaleDto, String merNo) {
+        HfMember hfmember = hfMemberDao.getByMemberId(routeScaleDto.getMerNo());
+        if (hfmember == null || hfmember.getMonthMaxReceipt().compareTo(BigDecimal.ZERO) <= 0) {
+            return routeScaleDto;
+        }
+
+        BigDecimal monthMaxReceipt = hfmember.getMonthMaxReceipt(); //每月限定金额
+        Date monthStartTime = DateUtil.getFirstDayOfMonth(new Date());
+
+        //已收金额
+        List<PaymentChannelEnum> paymentChannelList = new ArrayList<>();
+        paymentChannelList.add(PaymentChannelEnum.ADAPAY);
+
+//        String key = "month_max_receipt_"+routeScaleDto.getOrganId();
+//        if(redisCache.exists(key)){
+//            RedisTemplate<String, Object> redisTemplate = redisCache.getRedisTemplate();
+//            try {
+//                ValueOperations<String, Object> valueOper = redisTemplate.opsForValue();
+//                Long index = valueOper.increment(key, 1);
+//            } catch (Exception ex) {
+//                log.error("分布式订单号生成失败异常。。。。。", ex);
+//            } finally {
+//                redisTemplate.expire(key, 600, TimeUnit.SECONDS);// 保留10分钟内的key
+//            }
+//        }else {
+            BigDecimal monthHasReceipt = studentPaymentRouteOrderDao.getRouteOrderAmount(routeScaleDto.getOrganId(), paymentChannelList, monthStartTime);
+            monthHasReceipt = monthHasReceipt == null ? BigDecimal.ZERO : monthHasReceipt;
+//            monthHasReceipt.multiply(new BigDecimal(100));
+//
+//        }
+
+
+
+        if (routeScaleDto.getAmount().add(monthHasReceipt).compareTo(monthMaxReceipt) > 0) {
+            routeScaleDto.setMerNo(hfmember.getRouteMemberId());
+            routeScaleDto.setOrganId(hfmember.getRouteOrganId());
+            if (routeScaleDto.getMerNo().equals(merNo)) {
+                return routeScaleDto;
+            }
+            return checkMaxReceipt(routeScaleDto, merNo);
+        }
+        return routeScaleDto;
+    }
 }

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysPaymentConfigServiceImpl.java

@@ -63,4 +63,9 @@ public class SysPaymentConfigServiceImpl extends BaseServiceImpl<Integer, SysPay
         }
         return accountType;
     }
+
+    @Override
+    public SysPaymentConfig findPaymentConfigByMerNo(String merNo) {
+        return sysPaymentConfigDao.findPaymentConfigByMerNo(merNo);
+    }
 }

+ 21 - 1
mec-biz/src/main/resources/config/mybatis/HfMemberMapper.xml

@@ -21,6 +21,9 @@
         <result column="settle_account_id_" property="settleAccountId"/>
         <result column="status_" property="status"/>
         <result column="memo_" property="memo"/>
+        <result column="month_max_receipt_" property="monthMaxReceipt"/>
+        <result column="route_member_id_" property="routeMemberId"/>
+        <result column="route_organ_id_" property="routeOrganId"/>
         <result column="create_time_" property="createTime"/>
         <result column="update_time_" property="updateTime"/>
     </resultMap>
@@ -28,7 +31,9 @@
         <!--@mbg.generated-->
         id_, name_, member_id_, prov_code_, area_code_, social_credit_code_, social_credit_code_expires_,
         business_scope_, legal_person_, legal_cert_id_, legal_cert_id_expires_, legal_mp_,
-        address_, zip_code_, card_no_, bank_code_,settle_account_id_,status_, create_time_, update_time_
+        address_, zip_code_, card_no_,
+        bank_code_,settle_account_id_,status_,month_max_receipt_,route_member_id_,route_organ_id_, create_time_,
+        update_time_
     </sql>
     <select id="get" parameterType="java.lang.Integer" resultMap="hfMember">
         <!--@mbg.generated-->
@@ -116,6 +121,15 @@
             <if test="status != null">
                 status_ = #{status},
             </if>
+            <if test="monthMaxReceipt != null">
+                month_max_receipt_ = #{monthMaxReceipt},
+            </if>
+            <if test="routeMemberId != null">
+                route_member_id_ = #{routeMemberId},
+            </if>
+            <if test="routeOrganId != null">
+                route_organ_id_ = #{routeOrganId},
+            </if>
             <if test="createTime != null">
                 create_time_ = #{createTime},
             </if>
@@ -167,4 +181,10 @@
         WHERE name_ = #{name}
         LIMIT 1
     </select>
+
+    <select id="getNeedRouteMerNos" resultMap="hfMember">
+        SELECT *
+        FROM hf_member
+        WHERE month_max_receipt_ > 0
+    </select>
 </mapper>

+ 3 - 0
mec-biz/src/main/resources/config/mybatis/SysPaymentConfigMapper.xml

@@ -230,4 +230,7 @@
             AND hf_mer_no_ != ''
         </if>
     </select>
+    <select id="findPaymentConfigByMerNo" resultMap="SysPaymentConfig">
+        SELECT * FROM sys_payment_config WHERE hf_mer_no_ = #{merNo} LIMIT 1
+    </select>
 </mapper>

+ 25 - 7
mec-web/src/main/java/com/ym/mec/web/controller/AdapayController.java

@@ -168,21 +168,21 @@ public class AdapayController extends BaseController {
                         paymentMap.put("status", "交易失败");
                     }
                     if (paymentMap.get("pay_mode").equals("delay")) {
-                        if(!paymentMap.containsKey("payment_confirms")){
+                        if (!paymentMap.containsKey("payment_confirms")) {
                             Map<String, Object> confirmMap = Payment.queryConfirmList(paymentMap.get("id").toString());
-                            if(confirmMap.containsKey("payment_confirms")) {
+                            if (confirmMap.containsKey("payment_confirms")) {
                                 paymentMap.put("payment_confirms", confirmMap.get("payment_confirms"));
                             }
                         }
-                        if(!paymentMap.containsKey("payment_confirms")){
-                            paymentMap.put("memo","没有提交分账信息,请联系技术核查");
+                        if (!paymentMap.containsKey("payment_confirms")) {
+                            paymentMap.put("memo", "没有提交分账信息,请联系技术核查");
                             data.add(paymentMap);
                             continue;
                         }
                         JSONArray confirms = (JSONArray) paymentMap.get("payment_confirms");
                         for (Object confirm : confirms) {
                             Map<String, Object> divMemberMap = (Map<String, Object>) confirm;
-                            paymentMap.put("fee_amt",divMemberMap.get("fee_amt"));
+                            paymentMap.put("fee_amt", divMemberMap.get("fee_amt"));
                             divMemberMap.putAll(paymentMap);
 
                             JSONArray divMembers = (JSONArray) divMemberMap.get("div_members");
@@ -217,8 +217,8 @@ public class AdapayController extends BaseController {
 
         OutputStream outputStream = response.getOutputStream();
         try {
-            String[] header = {"支付流水号", "订单号", "支付渠道", "交易金额", "商户号", "分润金额", "是否承担手续费", "手续费", "第三方订单号", "支付宝/微信订单号", "交易时间", "交易状态","备注"};
-            String[] body = {"id", "order_no", "pay_channel", "pay_amt", "member_id", "amount", "fee_flag", "fee_amt", "party_order_id", "out_trans_id", "created_time", "status",""};
+            String[] header = {"支付流水号", "订单号", "支付渠道", "交易金额", "商户号", "分润金额", "是否承担手续费", "手续费", "第三方订单号", "支付宝/微信订单号", "交易时间", "交易状态", "备注"};
+            String[] body = {"id", "order_no", "pay_channel", "pay_amt", "member_id", "amount", "fee_flag", "fee_amt", "party_order_id", "out_trans_id", "created_time", "status", ""};
 
             HSSFWorkbook workbook = POIUtil.exportExcel(header, body, data);
             response.setContentType("application/octet-stream");
@@ -239,4 +239,22 @@ public class AdapayController extends BaseController {
             }
         }
     }
+
+    @ApiOperation("修改每月最大收款金额(succeeded 状态才能使用)")
+    @PostMapping(value = "updateMonthMaxReceipt")
+    @PreAuthorize("@pcs.hasPermissions('adapay/updateMonthMaxReceipt')")
+    public HttpResponseResult<HfMember> updateMonthMaxReceipt(Integer id, BigDecimal monthMaxReceipt, String routeMemberId,Integer organId) throws Exception {
+        HfMember hfMember = hfMemberService.get(id);
+        if (hfMember == null) {
+            return failed("您修改的数据不存在");
+        }
+        hfMember.setMonthMaxReceipt(monthMaxReceipt);
+        hfMember.setRouteMemberId(routeMemberId);
+        hfMember.setRouteOrganId(organId);
+        hfMember.setUpdateTime(new Date());
+        if (hfMemberService.update(hfMember) <= 0) {
+            return failed("修改失败,请重试");
+        }
+        return succeed(hfMember);
+    }
 }

+ 14 - 0
mec-web/src/main/java/com/ym/mec/web/controller/SysPaymentConfigController.java

@@ -34,6 +34,13 @@ public class SysPaymentConfigController extends BaseController {
         if (paymentConfig != null) {
             return failed("此分部配置已经存在");
         }
+        if(StringUtils.isNotBlank(sysPaymentConfig.getHfMerNo())){
+            SysPaymentConfig nowConfig = sysPaymentConfigService.findPaymentConfigByMerNo(sysPaymentConfig.getHfMerNo());
+            if(nowConfig != null){
+                return failed("汇付商户号已配置,不同分部请勿配置相同商户号");
+            }
+        }
+
         Date nowDate = new Date();
         sysPaymentConfig.setCreateTime(nowDate);
         sysPaymentConfig.setUpdateTime(nowDate);
@@ -56,6 +63,13 @@ public class SysPaymentConfigController extends BaseController {
     @PostMapping("/update")
     @PreAuthorize("@pcs.hasPermissions('paymentConfig/update')")
     public Object update(SysPaymentConfig sysPaymentConfig) {
+        if(StringUtils.isNotBlank(sysPaymentConfig.getHfMerNo())){
+            SysPaymentConfig nowConfig = sysPaymentConfigService.findPaymentConfigByMerNo(sysPaymentConfig.getHfMerNo());
+            if(nowConfig != null && !nowConfig.getOrganId().equals(sysPaymentConfig.getOrganId())){
+                return failed("汇付商户号已配置,不同分部请勿配置相同商户号");
+            }
+        }
+
         sysPaymentConfig.setUpdateTime(new Date());
         sysPaymentConfigService.update(sysPaymentConfig);
         return succeed();