Selaa lähdekoodia

第三方支付

qin 2 vuotta sitten
vanhempi
commit
1a5a14087e
19 muutettua tiedostoa jossa 582 lisäystä ja 34 poistoa
  1. 179 3
      src/main/java/com/poteviohealth/ym/ipos/controller/feign/IposFeignController.java
  2. 12 0
      src/main/java/com/poteviohealth/ym/ipos/mapper/SplitRecordsDetailMapper.java
  3. 12 0
      src/main/java/com/poteviohealth/ym/ipos/mapper/SplitRecordsMapper.java
  4. 23 0
      src/main/java/com/poteviohealth/ym/ipos/model/merchant/dto/ImageListDto.java
  5. 5 0
      src/main/java/com/poteviohealth/ym/ipos/model/merchant/dto/UserDto.java
  6. 40 0
      src/main/java/com/poteviohealth/ym/ipos/model/split/SplitRecords.java
  7. 31 0
      src/main/java/com/poteviohealth/ym/ipos/model/split/SplitRecordsDetail.java
  8. 2 0
      src/main/java/com/poteviohealth/ym/ipos/model/split/detail/DelayConfirmQueryRequest.java
  9. 4 2
      src/main/java/com/poteviohealth/ym/ipos/model/split/detail/SplitInfoConfirm.java
  10. 14 0
      src/main/java/com/poteviohealth/ym/ipos/service/ISplitRecordsDetailService.java
  11. 14 0
      src/main/java/com/poteviohealth/ym/ipos/service/ISplitRecordsService.java
  12. 9 21
      src/main/java/com/poteviohealth/ym/ipos/service/ISplitService.java
  13. 74 7
      src/main/java/com/poteviohealth/ym/ipos/service/impl/MerchantServiceImpl.java
  14. 16 0
      src/main/java/com/poteviohealth/ym/ipos/service/impl/SplitRecordsDetailServiceImpl.java
  15. 16 0
      src/main/java/com/poteviohealth/ym/ipos/service/impl/SplitRecordsServiceImpl.java
  16. 122 0
      src/main/java/com/poteviohealth/ym/ipos/service/impl/SplitServiceImpl.java
  17. 4 0
      src/main/resources/mapper/ipos/SplitRecordsDetailMapper.xml
  18. 4 0
      src/main/resources/mapper/ipos/SplitRecordsMapper.xml
  19. 1 1
      src/main/resources/uat/application.yml

+ 179 - 3
src/main/java/com/poteviohealth/ym/ipos/controller/feign/IposFeignController.java

@@ -1,9 +1,10 @@
 package com.poteviohealth.ym.ipos.controller.feign;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.google.common.collect.Lists;
 import com.poteviohealth.cgp.common.controller.BaseFeignController;
-import com.poteviohealth.cgp.common.integrated.ipos.model.RefundQuery;
+import com.poteviohealth.cgp.common.integrated.ipos.model.*;
 import com.poteviohealth.cgp.common.integrated.order.model.PayBefor;
 import com.poteviohealth.cgp.common.integrated.order.model.PayInfoAppOutDTO;
 import com.poteviohealth.cgp.common.integrated.order.model.RefundReceive;
@@ -11,12 +12,16 @@ import com.poteviohealth.cgp.common.model.VaultsResponse;
 import com.poteviohealth.cgp.common.utils.CgpTool;
 import com.poteviohealth.cgp.common.utils.DateUtils;
 import com.poteviohealth.ym.ipos.model.payment.PaymentRecords;
-import com.poteviohealth.ym.ipos.service.IPaymentRecordsService;
-import com.poteviohealth.ym.ipos.service.IPaymentService;
+import com.poteviohealth.ym.ipos.model.split.SplitRecords;
+import com.poteviohealth.ym.ipos.model.split.SplitRecordsDetail;
+import com.poteviohealth.ym.ipos.service.*;
 import com.poteviohealth.ym.ipos.utils.YmUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import jodd.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.time.DateFormatUtils;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -24,8 +29,11 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 第三方支付
@@ -40,6 +48,15 @@ public class IposFeignController extends BaseFeignController {
     private IPaymentRecordsService paymentRecordsService;
     @Resource
     private IPaymentService paymentService;
+    @Resource
+    private ISplitRecordsService splitRecordsService;
+    @Resource
+    private ISplitRecordsDetailService splitRecordsDetailService;
+    @Resource
+    private ISplitService splitService;
+
+    @Value("${pay.field.split}")
+    private String split;
 
     @ApiOperation(value = "第三方支付信息")
     @RequestMapping(value = "/returnPay", method = RequestMethod.POST)
@@ -80,4 +97,163 @@ public class IposFeignController extends BaseFeignController {
         }
         return VaultsResponse.success(returnList);
     }
+
+    @ApiOperation(value = "分账信息")
+    @RequestMapping(value = "/splitOrder", method = RequestMethod.POST)
+    @ResponseBody
+    public VaultsResponse<List<SplitPay>> splitOrder(@RequestBody List<SplitInfo> list) {
+
+        List<SplitPay> returnList = Lists.newArrayList();
+        List<SplitRecords> splitRecordsList = Lists.newArrayList();
+        List<SplitRecordsDetail> details = Lists.newArrayList();
+        for (SplitInfo splitInfo : list) {
+            SplitRecords records = new SplitRecords();
+            records.setOperatorId(splitInfo.getOperatorId());
+            records.setSplitId(CgpTool.generateKey());
+            records.setPayId(splitInfo.getPayId());
+            records.setPaySn(splitInfo.getPaySn());
+            records.setSumPrice(splitInfo.getSumPrice());
+            SplitPay sp = new SplitPay();
+            sp.setPayId(records.getPayId());
+            sp.setSplitId(records.getSplitId());
+            //平台分成
+            SplitRecordsDetail pt = new SplitRecordsDetail();
+            pt.setSplitId(records.getSplitId());
+            pt.setSourceId(0);
+
+            BigDecimal ptAmount = BigDecimal.ZERO;
+            BigDecimal tzAmount = BigDecimal.ZERO;
+            BigDecimal ptyysAmount = BigDecimal.ZERO;
+            BigDecimal supplierOneAmount = BigDecimal.ZERO;
+            BigDecimal supplierTwoAmount = BigDecimal.ZERO;
+            BigDecimal supplierAmount = BigDecimal.ZERO;
+            //团长分成
+            SplitRecordsDetail tz = new SplitRecordsDetail();
+            tz.setSplitId(records.getSplitId());
+            pt.setSourceId(3);
+
+            for (SplitDetail detail : splitInfo.getDetails()) {
+                //运算价格
+                BigDecimal price = new BigDecimal(detail.getPrice());
+
+                //平台金额
+                BigDecimal ptDecimal = new BigDecimal(split).multiply(new BigDecimal(detail.getPrice()));
+                BigDecimal valDecimal = ptDecimal.longValue() == 0L ? new BigDecimal(1) : ptDecimal;
+                price = price.subtract(valDecimal);
+                ptAmount.add(valDecimal);
+
+                //团长金额
+                if (StringUtil.isNotEmpty(detail.getGroupLeaderMerchantId())) {
+                    tz.setMerchantId(detail.getGroupLeaderMerchantId());
+                    BigDecimal tbd = detail.getGroupCommission().multiply(new BigDecimal(detail.getPrice()));
+                    price = price.subtract(tbd);
+                    tzAmount.add(tbd);
+                }
+                detail.setPrice(price.longValue());
+            }
+            pt.setDivAmt(ptAmount.toString());
+            details.add(pt);
+            if (tzAmount.compareTo(BigDecimal.ZERO) == 1) {
+                tz.setDivAmt(tzAmount.toString());
+                details.add(tz);
+            }
+
+            //一级供应商
+            Map<String, List<SplitDetail>> oneMaps = splitInfo.getDetails().stream().filter(s -> StringUtils.isNotEmpty(s.getSupplierOneMerchantId()) && s.getBelong().equals(1)).collect(Collectors.groupingBy(SplitDetail::getSupplierOneMerchantId));
+
+            for (String s : oneMaps.keySet()) {
+                SplitRecordsDetail supplierOne = new SplitRecordsDetail();
+                supplierOne.setSplitId(records.getSplitId());
+                supplierOne.setSourceId(2);
+                supplierOne.setMerchantId(s);
+                for (SplitDetail detail : oneMaps.get(s)) {
+                    supplierOneAmount = supplierOneAmount.add(new BigDecimal(detail.getConsignmentPrice()));
+                    detail.setPrice(detail.getPrice() - detail.getConsignmentPrice());
+                }
+
+                if (supplierOneAmount.compareTo(BigDecimal.ZERO) == 1) {
+                    supplierOne.setDivAmt(supplierOneAmount.toString());
+                    details.add(supplierOne);
+                }
+            }
+
+            //二级供应商
+            Map<String, List<SplitDetail>> twoMaps = splitInfo.getDetails().stream().filter(s -> StringUtils.isNotEmpty(s.getServiceStationMerchantId()) && s.getBelong().equals(2)).collect(Collectors.groupingBy(SplitDetail::getServiceStationMerchantId));
+
+            for (String s : twoMaps.keySet()) {
+                SplitRecordsDetail supplierTwo = new SplitRecordsDetail();
+                supplierTwo.setSplitId(records.getSplitId());
+                supplierTwo.setSourceId(2);
+                supplierTwo.setMerchantId(s);
+                for (SplitDetail detail : oneMaps.get(s)) {
+                    supplierTwoAmount = supplierTwoAmount.add(new BigDecimal(detail.getConsignmentPrice()));
+                    detail.setPrice(detail.getPrice() - detail.getConsignmentPrice());
+                }
+
+                if (supplierTwoAmount.compareTo(BigDecimal.ZERO) == 1) {
+                    supplierTwo.setDivAmt(supplierTwoAmount.toString());
+                    details.add(supplierTwo);
+                }
+            }
+
+            //供应商
+            Map<String, List<SplitDetail>> maps = splitInfo.getDetails().stream().filter(s -> StringUtils.isNotEmpty(s.getSupplierMerchantId()) && s.getBelong().equals(0)).collect(Collectors.groupingBy(SplitDetail::getSupplierMerchantId));
+
+            for (String s : maps.keySet()) {
+                SplitRecordsDetail supplier = new SplitRecordsDetail();
+                supplier.setSplitId(records.getSplitId());
+                supplier.setSourceId(2);
+                supplier.setMerchantId(s);
+                for (SplitDetail detail : oneMaps.get(s)) {
+                    supplierAmount = supplierAmount.add(new BigDecimal(detail.getSettlementPrice()));
+                    detail.setPrice(detail.getPrice() - detail.getSettlementPrice());
+                }
+
+                if (supplierAmount.compareTo(BigDecimal.ZERO) == 1) {
+                    supplier.setDivAmt(supplierAmount.toString());
+                    details.add(supplier);
+                }
+            }
+
+            //平台运营商
+            SplitRecordsDetail ptyys = new SplitRecordsDetail();
+            ptyys.setSplitId(records.getSplitId());
+            ptyys.setSourceId(1);
+            for (SplitDetail detail : splitInfo.getDetails()) {
+                ptyysAmount = ptyysAmount.add(new BigDecimal(detail.getPrice()));
+            }
+            ptyys.setMerchantId(splitInfo.getOperatorMerchantId());
+            ptyys.setDivAmt(ptyysAmount.toString());
+            details.add(ptyys);
+            VaultsResponse vaultsResponse = splitService.delayConfirm(records.getSplitId());
+            if(!vaultsResponse.validate()){
+                records.setComment(vaultsResponse.getMessage());
+            }
+            records.setStatus(2);
+            splitRecordsList.add(records);
+            splitRecordsService.saveBatch(splitRecordsList);
+            splitRecordsDetailService.saveBatch(details);
+            returnList.add(sp);
+        }
+        return VaultsResponse.success(returnList);
+    }
+
+    @ApiOperation(value = "延时交易确认查询")
+    @RequestMapping(value = "/delayConfirmQuery", method = RequestMethod.POST)
+    @ResponseBody
+    public VaultsResponse<List<DelayConfirmQuery>> delayConfirmQuery(@RequestBody List<DelayConfirmQuery> list){
+
+        for (DelayConfirmQuery dcfq : list) {
+            VaultsResponse vaultsResponse =  splitService.delayConfirmQuery(dcfq.getSplitId().toString(),dcfq.getOperatorId().toString());
+            if(vaultsResponse.validate()){
+                dcfq.setStatus(1);
+            }
+            SplitRecords splitRecords = new SplitRecords();
+            splitRecords.setStatus(1);
+            QueryWrapper<SplitRecords> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("split_id",dcfq.getSplitId());
+            splitRecordsService.update(splitRecords,queryWrapper);
+        }
+        return VaultsResponse.success(list);
+    }
 }

+ 12 - 0
src/main/java/com/poteviohealth/ym/ipos/mapper/SplitRecordsDetailMapper.java

@@ -0,0 +1,12 @@
+package com.poteviohealth.ym.ipos.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.poteviohealth.ym.ipos.model.split.SplitRecordsDetail;
+
+/**
+ * 分账记录详情
+ * @author Qin
+ */
+public interface SplitRecordsDetailMapper extends BaseMapper<SplitRecordsDetail> {
+
+}

+ 12 - 0
src/main/java/com/poteviohealth/ym/ipos/mapper/SplitRecordsMapper.java

@@ -0,0 +1,12 @@
+package com.poteviohealth.ym.ipos.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.poteviohealth.ym.ipos.model.split.SplitRecords;
+
+/**
+ * 分账记录
+ * @author Qin
+ */
+public interface SplitRecordsMapper extends BaseMapper<SplitRecords> {
+
+}

+ 23 - 0
src/main/java/com/poteviohealth/ym/ipos/model/merchant/dto/ImageListDto.java

@@ -0,0 +1,23 @@
+package com.poteviohealth.ym.ipos.model.merchant.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 图片上传dto
+ * @author Qin
+ */
+@Data
+public class ImageListDto {
+    @ApiModelProperty(value = "图片id")
+    private String file_id;
+
+    @ApiModelProperty(value = "名称")
+    private String file_name;
+
+    @ApiModelProperty(value = "图片类型")
+    private String file_type;
+
+    @ApiModelProperty(value = "图片地址")
+    private String file_url;
+}

+ 5 - 0
src/main/java/com/poteviohealth/ym/ipos/model/merchant/dto/UserDto.java

@@ -3,6 +3,8 @@ package com.poteviohealth.ym.ipos.model.merchant.dto;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.List;
+
 /**
  * 商户开户/入驻dto
  * @author Qin
@@ -131,4 +133,7 @@ public class UserDto {
 
     @ApiModelProperty(value = "商户状态,0:待进件,-1:进件失败(开户失败),2:进件成功(已开户并且业务入驻成功),3:通道开户成功(已开户,但未做业务入驻或业务入驻失败)")
     private String incoming_status;
+
+    @ApiModelProperty(value = "图片信息")
+    private List<ImageListDto> image_list;
 }

+ 40 - 0
src/main/java/com/poteviohealth/ym/ipos/model/split/SplitRecords.java

@@ -0,0 +1,40 @@
+package com.poteviohealth.ym.ipos.model.split;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.poteviohealth.cgp.common.model.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * 分账记录
+ * @author Qin
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("ipos_split_records")
+public class SplitRecords extends BaseEntity {
+
+    @ApiModelProperty(value = "运营商id")
+    private Integer operatorId;
+
+    @ApiModelProperty(value = "分账Id")
+    private Long splitId;
+
+    @ApiModelProperty(value = "支付Id")
+    private Long payId;
+
+    @ApiModelProperty(value = "支付单号")
+    private String paySn;
+
+    @ApiModelProperty(value = "总金额")
+    private Long sumPrice;
+
+    @ApiModelProperty(value = "分账状态:0,未分账.1.成功,2.交易处理中")
+    private Integer status;
+
+    @ApiModelProperty(value = "失败原因")
+    private String comment;
+}

+ 31 - 0
src/main/java/com/poteviohealth/ym/ipos/model/split/SplitRecordsDetail.java

@@ -0,0 +1,31 @@
+package com.poteviohealth.ym.ipos.model.split;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.poteviohealth.cgp.common.model.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * 分账记录详情
+ * @author Qin
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("ipos_split_records_detail")
+public class SplitRecordsDetail extends BaseEntity {
+
+    @ApiModelProperty(value = "分账Id")
+    private Long splitId;
+
+    @ApiModelProperty(value = "商户号")
+    private String merchantId;
+
+    @ApiModelProperty(value = "来源:0.平台,1.平台运营商,2.供应商,3.团长")
+    private Integer sourceId;
+
+    @ApiModelProperty(value = "分账金额")
+    private String divAmt;
+}

+ 2 - 0
src/main/java/com/poteviohealth/ym/ipos/model/split/detail/DelayConfirmQueryRequest.java

@@ -1,11 +1,13 @@
 package com.poteviohealth.ym.ipos.model.split.detail;
 
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 /**
  * 被查询的延时确认请求流水号
  * @author Qin
  */
+@Data
 public class DelayConfirmQueryRequest {
 
 

+ 4 - 2
src/main/java/com/poteviohealth/ym/ipos/model/split/detail/SplitInfoConfirm.java

@@ -3,6 +3,8 @@ package com.poteviohealth.ym.ipos.model.split.detail;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.List;
+
 /**
  * 分账信息
  * @author Qin
@@ -10,9 +12,9 @@ import lombok.Data;
 @Data
 public class SplitInfoConfirm {
 
-    @ApiModelProperty(value = "分账方自留金额,单位为分,可传0表示不自留\t",required = true)
+    @ApiModelProperty(value = "分账方自留金额,单位为分,可传0表示不自留",required = true)
     private String keep_amt;
 
     @ApiModelProperty(value = "分账明细",required = true)
-    private SplitListConfirm split_list;
+    private List<SplitListConfirm> split_list;
 }

+ 14 - 0
src/main/java/com/poteviohealth/ym/ipos/service/ISplitRecordsDetailService.java

@@ -0,0 +1,14 @@
+package com.poteviohealth.ym.ipos.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.poteviohealth.ym.ipos.model.split.SplitRecordsDetail;
+
+/**
+ * 分账记录详情
+ * @author Qin
+ */
+public interface ISplitRecordsDetailService extends IService<SplitRecordsDetail> {
+
+
+
+}

+ 14 - 0
src/main/java/com/poteviohealth/ym/ipos/service/ISplitRecordsService.java

@@ -0,0 +1,14 @@
+package com.poteviohealth.ym.ipos.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.poteviohealth.ym.ipos.model.split.SplitRecords;
+
+/**
+ * 分账记录
+ * @author Qin
+ */
+public interface ISplitRecordsService extends IService<SplitRecords> {
+
+
+
+}

+ 9 - 21
src/main/java/com/poteviohealth/ym/ipos/service/ISplitService.java

@@ -1,13 +1,10 @@
 package com.poteviohealth.ym.ipos.service;
 
+import com.poteviohealth.cgp.common.model.VaultsResponse;
 import com.poteviohealth.ym.ipos.model.back.BaseBack;
 import com.poteviohealth.ym.ipos.model.payment.PayRefundQuery;
-import com.poteviohealth.ym.ipos.model.split.PayConfirm;
-import com.poteviohealth.ym.ipos.model.split.PayConfirmQuery;
 import com.poteviohealth.ym.ipos.model.split.PayConfirmRefund;
 import com.poteviohealth.ym.ipos.model.split.SettlementQuery;
-import com.poteviohealth.ym.ipos.model.split.back.PayConfirmBack;
-import com.poteviohealth.ym.ipos.model.split.back.PayConfirmQueryBack;
 import com.poteviohealth.ym.ipos.model.split.back.SettlementQueryBack;
 
 /**
@@ -18,46 +15,37 @@ public interface ISplitService {
 
     /**
      * 延时交易确认
-     * @param payConfirm
+     * @param splitId
      * @return
      */
-    default PayConfirmBack delayConfirm(PayConfirm payConfirm){
-        return null;
-    }
+    VaultsResponse delayConfirm(Long splitId);
 
     /**
      * 延时交易确认查询
-     * @param payConfirmQuery
+     * @param splitId
+     * @param operatorId
      * @return
      */
-    default PayConfirmQueryBack delayConfirmQuery(PayConfirmQuery payConfirmQuery){
-        return null;
-    }
+    VaultsResponse delayConfirmQuery(String splitId,String operatorId);
 
     /**
      * 延时交易确认退回
      * @param payConfirmRefund
      * @return
      */
-    default BaseBack delayConfirmRefund(PayConfirmRefund payConfirmRefund){
-        return null;
-    }
+    BaseBack delayConfirmRefund(PayConfirmRefund payConfirmRefund);
 
     /**
      * 延时交易确认退回查询
      * @param payRefundQuery
      * @return
      */
-    default BaseBack delayRefundQuery(PayRefundQuery payRefundQuery){
-        return null;
-    }
+     BaseBack delayRefundQuery(PayRefundQuery payRefundQuery);
 
     /**
      * 结算记录查询
      * @param settlementQuery
      * @return
      */
-    default SettlementQueryBack merchantSettlementQuery(SettlementQuery settlementQuery){
-        return null;
-    }
+    SettlementQueryBack merchantSettlementQuery(SettlementQuery settlementQuery);
 }

+ 74 - 7
src/main/java/com/poteviohealth/ym/ipos/service/impl/MerchantServiceImpl.java

@@ -15,6 +15,7 @@ import com.poteviohealth.ym.ipos.model.merchant.back.UserBack;
 import com.poteviohealth.ym.ipos.model.merchant.back.UserSearchBack;
 import com.poteviohealth.ym.ipos.model.merchant.detail.*;
 import com.poteviohealth.ym.ipos.model.merchant.dto.ImageDto;
+import com.poteviohealth.ym.ipos.model.merchant.dto.ImageListDto;
 import com.poteviohealth.ym.ipos.model.merchant.dto.UserDto;
 import com.poteviohealth.ym.ipos.model.payment.dto.BindDto;
 import com.poteviohealth.ym.ipos.service.IAreaService;
@@ -294,8 +295,28 @@ public class MerchantServiceImpl implements IMerchantService {
         }
         iUpdateDetail.setIdentity_validity_type(dto.getIdentity_validity_type());
         iUpdateDetail.setContact_phone(dto.getContact_phone());
-        iUpdateDetail.setCert_photo_a(this.merchantPicture(dto.getCert_photo_a()).getData());
-        iUpdateDetail.setCert_photo_b(this.merchantPicture(dto.getCert_photo_b()).getData());
+        if(StringUtils.isEmpty(dto.getCert_photo_a().getBase64Str())){
+            for (ImageListDto imageListDto : dto.getImage_list()) {
+                if(imageListDto.getFile_type().equals("01")){
+                    iUpdateDetail.setCert_photo_a(imageListDto.getFile_id());
+                    break;
+                }
+            }
+        }else{
+            iUpdateDetail.setCert_photo_a(this.merchantPicture(dto.getCert_photo_a()).getData());
+        }
+
+        if(StringUtils.isEmpty(dto.getCert_photo_a().getBase64Str())){
+            for (ImageListDto imageListDto : dto.getImage_list()) {
+                if(imageListDto.getFile_type().equals("02")){
+                    iUpdateDetail.setCert_photo_a(imageListDto.getFile_id());
+                    break;
+                }
+            }
+        }else{
+            iUpdateDetail.setCert_photo_b(this.merchantPicture(dto.getCert_photo_b()).getData());
+        }
+
 
         iUpdate.setMerchant_indvmodify_request(iUpdateDetail);
         BaseBack back = null;
@@ -389,9 +410,37 @@ public class MerchantServiceImpl implements IMerchantService {
         iUpdateDetail.setIdentity_validity_type(dto.getIdentity_validity_type());
         iUpdateDetail.setContact_name(dto.getContact_name());
         iUpdateDetail.setContact_phone(dto.getContact_phone());
-        iUpdateDetail.setLicense_photo(this.merchantPicture(dto.getLicense_photo()).getData());
-        iUpdateDetail.setCert_photo_a(this.merchantPicture(dto.getCert_photo_a()).getData());
-        iUpdateDetail.setCert_photo_b(this.merchantPicture(dto.getCert_photo_b()).getData());
+        if(StringUtils.isEmpty(dto.getLicense_photo().getBase64Str())){
+            for (ImageListDto imageListDto : dto.getImage_list()) {
+                if(imageListDto.getFile_type().equals("03")){
+                    iUpdateDetail.setLicense_photo(imageListDto.getFile_id());
+                    break;
+                }
+            }
+        }else{
+            iUpdateDetail.setLicense_photo(this.merchantPicture(dto.getLicense_photo()).getData());
+        }
+        if(StringUtils.isEmpty(dto.getCert_photo_a().getBase64Str())){
+            for (ImageListDto imageListDto : dto.getImage_list()) {
+                if(imageListDto.getFile_type().equals("01")){
+                    iUpdateDetail.setCert_photo_a(imageListDto.getFile_id());
+                    break;
+                }
+            }
+        }else{
+            iUpdateDetail.setCert_photo_a(this.merchantPicture(dto.getCert_photo_a()).getData());
+        }
+
+        if(StringUtils.isEmpty(dto.getCert_photo_b().getBase64Str())){
+            for (ImageListDto imageListDto : dto.getImage_list()) {
+                if(imageListDto.getFile_type().equals("02")){
+                    iUpdateDetail.setCert_photo_b(imageListDto.getFile_id());
+                    break;
+                }
+            }
+        }else{
+            iUpdateDetail.setCert_photo_b(this.merchantPicture(dto.getCert_photo_b()).getData());
+        }
 
         iUpdate.setMerchant_entmodify_request(iUpdateDetail);
         BaseBack back = null;
@@ -449,8 +498,26 @@ public class MerchantServiceImpl implements IMerchantService {
         detail.setCity(areaList.get(1));
         detail.setBranch_bank_code(dto.getBranch_bank_code());
         detail.setBranch_bank_name(dto.getBranch_bank_name());
-        detail.setSettle_photo_a(this.merchantPicture(dto.getSettle_photo_a()).getData());
-        detail.setSettle_photo_b(this.merchantPicture(dto.getSettle_photo_b()).getData());
+        if(StringUtils.isEmpty(dto.getSettle_photo_a().getBase64Str())){
+            for (ImageListDto imageListDto : dto.getImage_list()) {
+                if(imageListDto.getFile_type().equals("13")){
+                    detail.setSettle_photo_a(imageListDto.getFile_id());
+                    break;
+                }
+            }
+        }else{
+            detail.setSettle_photo_a(this.merchantPicture(dto.getSettle_photo_a()).getData());
+        }
+        if(StringUtils.isEmpty(dto.getSettle_photo_b().getBase64Str())){
+            for (ImageListDto imageListDto : dto.getImage_list()) {
+                if(imageListDto.getFile_type().equals("14")){
+                    detail.setSettle_photo_b(imageListDto.getFile_id());
+                    break;
+                }
+            }
+        }else{
+            detail.setSettle_photo_b(this.merchantPicture(dto.getSettle_photo_b()).getData());
+        }
         detail.setRemained_amt(dto.getRemained_amt());
         detail.setSettle_abstract(dto.getSettle_abstract());
         return detail;

+ 16 - 0
src/main/java/com/poteviohealth/ym/ipos/service/impl/SplitRecordsDetailServiceImpl.java

@@ -0,0 +1,16 @@
+package com.poteviohealth.ym.ipos.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.poteviohealth.ym.ipos.mapper.SplitRecordsDetailMapper;
+import com.poteviohealth.ym.ipos.model.split.SplitRecordsDetail;
+import com.poteviohealth.ym.ipos.service.ISplitRecordsDetailService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 分账记录详情
+ * @author Qin
+ */
+@Service
+public class SplitRecordsDetailServiceImpl extends ServiceImpl<SplitRecordsDetailMapper, SplitRecordsDetail> implements ISplitRecordsDetailService {
+
+}

+ 16 - 0
src/main/java/com/poteviohealth/ym/ipos/service/impl/SplitRecordsServiceImpl.java

@@ -0,0 +1,16 @@
+package com.poteviohealth.ym.ipos.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.poteviohealth.ym.ipos.mapper.SplitRecordsMapper;
+import com.poteviohealth.ym.ipos.model.split.SplitRecords;
+import com.poteviohealth.ym.ipos.service.ISplitRecordsService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 分账记录
+ * @author Qin
+ */
+@Service
+public class SplitRecordsServiceImpl extends ServiceImpl<SplitRecordsMapper, SplitRecords> implements ISplitRecordsService {
+
+}

+ 122 - 0
src/main/java/com/poteviohealth/ym/ipos/service/impl/SplitServiceImpl.java

@@ -0,0 +1,122 @@
+package com.poteviohealth.ym.ipos.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.google.common.collect.Lists;
+import com.poteviohealth.cgp.common.model.VaultsResponse;
+import com.poteviohealth.ym.ipos.model.back.BaseBack;
+import com.poteviohealth.ym.ipos.model.payment.PayRefundQuery;
+import com.poteviohealth.ym.ipos.model.split.*;
+import com.poteviohealth.ym.ipos.model.split.back.PayConfirmBack;
+import com.poteviohealth.ym.ipos.model.split.back.PayConfirmQueryBack;
+import com.poteviohealth.ym.ipos.model.split.back.SettlementQueryBack;
+import com.poteviohealth.ym.ipos.model.split.detail.*;
+import com.poteviohealth.ym.ipos.service.ISplitRecordsDetailService;
+import com.poteviohealth.ym.ipos.service.ISplitRecordsService;
+import com.poteviohealth.ym.ipos.service.ISplitService;
+import com.poteviohealth.ym.ipos.utils.YmUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 分账
+ * @author Qin
+ */
+@Service
+public class SplitServiceImpl implements ISplitService {
+
+    @Value("${pay.field.code}")
+    private String code;
+    @Resource
+    private ISplitRecordsService splitRecordsService;
+    @Resource
+    private ISplitRecordsDetailService splitRecordsDetailService;
+
+    @Override
+    public VaultsResponse delayConfirm(Long splitId) {
+        QueryWrapper queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("split_id",splitId);
+        SplitRecords splitRecords = splitRecordsService.getOne(queryWrapper);
+        PayConfirm payConfirm = new PayConfirm();
+        payConfirm.setPos_id(code);
+        payConfirm.setPos_seq(splitId.toString());
+        payConfirm.setStore_id(splitRecords.getOperatorId().toString());
+        PayConfirmDetail detail = new PayConfirmDetail();
+        detail.setOrg_pos_seq(splitRecords.getPayId().toString());
+        ExtendParamsConfirm extendParamsConfirm = new ExtendParamsConfirm();
+        SplitInfoConfirm splitInfoConfirm = new SplitInfoConfirm();
+        List<SplitListConfirm> list = Lists.newArrayList();
+        String amt = "";
+        List<SplitRecordsDetail> detailList = splitRecordsDetailService.list(queryWrapper);
+        for (SplitRecordsDetail recordsDetail : detailList) {
+            if(recordsDetail.getSourceId().equals(0)){
+                amt = recordsDetail.getDivAmt();
+                continue;
+            }
+            SplitListConfirm slc = new SplitListConfirm();
+            slc.setMerchant_id(recordsDetail.getMerchantId());
+            slc.setDiv_amt(recordsDetail.getDivAmt());
+            list.add(slc);
+        }
+
+        splitInfoConfirm.setKeep_amt(amt);
+        splitInfoConfirm.setSplit_list(list);
+        extendParamsConfirm.setSplit_info(splitInfoConfirm);
+        detail.setExtend_params(extendParamsConfirm);
+        payConfirm.setDelay_confirm_request(detail);
+
+        PayConfirmBack back = null;
+        try {
+            back = (PayConfirmBack) YmUtil.resultBack(payConfirm,new PayConfirmBack());
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+            return VaultsResponse.failed(e.getMessage());
+        }
+
+        if(YmUtil.SUCCESS.equals(back.getResult().getId()) || YmUtil.FAIL.equals(back.getResult().getId())){
+            return VaultsResponse.success(back.getResult().getId());
+        }
+
+        return VaultsResponse.failed(back.getResult().getComment());
+    }
+
+    @Override
+    public VaultsResponse delayConfirmQuery(String splitId,String operatorId) {
+        PayConfirmQuery paymentQuery =  new PayConfirmQuery();
+        paymentQuery.setPos_id(code);
+        paymentQuery.setStore_id(operatorId);
+        DelayConfirmQueryRequest detail = new DelayConfirmQueryRequest();
+        detail.setOrg_pos_seq(splitId);
+        paymentQuery.setDelay_confirmquery_request(detail);
+        PayConfirmQueryBack back = null;
+        try {
+            back = (PayConfirmQueryBack) YmUtil.resultBack(paymentQuery,new PayConfirmQueryBack());
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+            return VaultsResponse.failed(e.getMessage());
+        }
+
+        if(YmUtil.SUCCESS.equals(back.getResult().getId())){
+            return VaultsResponse.success(back.getRefund_status());
+        }
+
+        return VaultsResponse.failed(back.getResult().getComment());
+    }
+
+    @Override
+    public BaseBack delayConfirmRefund(PayConfirmRefund payConfirmRefund) {
+        return null;
+    }
+
+    @Override
+    public BaseBack delayRefundQuery(PayRefundQuery payRefundQuery) {
+        return null;
+    }
+
+    @Override
+    public SettlementQueryBack merchantSettlementQuery(SettlementQuery settlementQuery) {
+        return null;
+    }
+}

+ 4 - 0
src/main/resources/mapper/ipos/SplitRecordsDetailMapper.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.poteviohealth.ym.ipos.mapper.SplitRecordsDetailMapper">
+</mapper>

+ 4 - 0
src/main/resources/mapper/ipos/SplitRecordsMapper.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.poteviohealth.ym.ipos.mapper.SplitRecordsMapper">
+</mapper>

+ 1 - 1
src/main/resources/uat/application.yml

@@ -48,7 +48,7 @@ pay:
   field:
     code: ZKY
     ip: 101.201.117.73
-    split: 0.7
+    split: 0.007
     notifyUrl : https://dev.poteviohealth.com/gateway/ipos/receive/payNotify
 
 ribbon: