瀏覽代碼

鸿森堂--1.分账明细 2.汇付交易确认 3.汇付确认退款 4.公司绑定合作人 5.套餐包新增分账比例 6.套餐包支付新增分账业务 7.互医订单退款新增退款确认业务

wjj 1 周之前
父節點
當前提交
b4a117f68f
共有 28 個文件被更改,包括 962 次插入46 次删除
  1. 8 0
      fs-admin/src/main/java/com/fs/his/controller/FsSubMerchantController.java
  2. 142 1
      fs-admin/src/main/java/com/fs/his/task/Task.java
  3. 5 0
      fs-service/src/main/java/com/fs/company/domain/Company.java
  4. 2 0
      fs-service/src/main/java/com/fs/company/service/ICompanyService.java
  5. 5 0
      fs-service/src/main/java/com/fs/his/domain/FsPackage.java
  6. 40 0
      fs-service/src/main/java/com/fs/his/domain/FsShareAmountDetail.java
  7. 20 0
      fs-service/src/main/java/com/fs/his/domain/FsStorePayment.java
  8. 65 0
      fs-service/src/main/java/com/fs/his/mapper/FsShareAmountDetailMapper.java
  9. 6 0
      fs-service/src/main/java/com/fs/his/mapper/FsStorePaymentMapper.java
  10. 4 0
      fs-service/src/main/java/com/fs/his/mapper/FsSubMerchantMapper.java
  11. 15 0
      fs-service/src/main/java/com/fs/his/param/FsShareAmountDetailParam.java
  12. 64 0
      fs-service/src/main/java/com/fs/his/service/IFsShareAmountDetailService.java
  13. 2 0
      fs-service/src/main/java/com/fs/his/service/IFsSubMerchantService.java
  14. 61 7
      fs-service/src/main/java/com/fs/his/service/impl/FsPackageOrderServiceImpl.java
  15. 96 0
      fs-service/src/main/java/com/fs/his/service/impl/FsShareAmountDetailServiceImpl.java
  16. 83 36
      fs-service/src/main/java/com/fs/his/service/impl/FsStoreAfterSalesServiceImpl.java
  17. 6 0
      fs-service/src/main/java/com/fs/his/service/impl/FsSubMerchantServiceImpl.java
  18. 5 0
      fs-service/src/main/java/com/fs/his/vo/FsPackageVO.java
  19. 37 0
      fs-service/src/main/java/com/fs/his/vo/FsShareAmountDetailVO.java
  20. 19 0
      fs-service/src/main/java/com/fs/huifuPay/domain/HuifuConfirmrefundResult.java
  21. 43 0
      fs-service/src/main/java/com/fs/huifuPay/domain/HuifuOrderConfirm.java
  22. 36 0
      fs-service/src/main/java/com/fs/huifuPay/domain/HuifuOrderConfirmResult.java
  23. 5 0
      fs-service/src/main/java/com/fs/huifuPay/service/HuiFuService.java
  24. 84 0
      fs-service/src/main/java/com/fs/huifuPay/service/impl/HuiFuServiceImpl.java
  25. 5 0
      fs-service/src/main/resources/mapper/company/CompanyMapper.xml
  26. 5 1
      fs-service/src/main/resources/mapper/his/FsPackageMapper.xml
  27. 89 0
      fs-service/src/main/resources/mapper/his/FsShareAmountDetailMapper.xml
  28. 10 1
      fs-service/src/main/resources/mapper/his/FsStorePaymentMapper.xml

+ 8 - 0
fs-admin/src/main/java/com/fs/his/controller/FsSubMerchantController.java

@@ -100,4 +100,12 @@ public class FsSubMerchantController extends BaseController
     {
         return toAjax(fsSubMerchantService.deleteFsSubMerchantByIds(ids));
     }
+
+    /**
+     * 子商户列表选项
+     */
+    @GetMapping("/merchantOptions")
+    public AjaxResult getMerchantOptions(){
+        return AjaxResult.success(fsSubMerchantService.selectFsSubMerchantListOptions());
+    }
 }

+ 142 - 1
fs-admin/src/main/java/com/fs/his/task/Task.java

@@ -7,12 +7,13 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.exception.CustomException;
 import com.fs.common.service.impl.SmsServiceImpl;
 import com.fs.common.utils.CloudHostUtils;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.SecurityUtils;
+import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyMoneyLogs;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.domain.CompanyVoiceCaller;
@@ -21,6 +22,7 @@ import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.company.vo.QwIpadTotalVo;
 import com.fs.company.vo.RedPacketMoneyVO;
+import com.fs.core.utils.OrderCodeUtils;
 import com.fs.course.dto.BatchSendCourseAllDTO;
 import com.fs.course.mapper.FsCourseRedPacketLogMapper;
 import com.fs.course.mapper.FsUserCompanyUserMapper;
@@ -58,7 +60,10 @@ import com.fs.hisStore.mapper.FsStorePaymentScrmMapper;
 import com.fs.hisStore.service.IFsStoreOrderScrmService;
 import com.fs.hisStore.service.IFsStorePaymentScrmService;
 import com.fs.huifuPay.domain.HuiFuQueryOrderResult;
+import com.fs.huifuPay.domain.HuifuOrderConfirm;
+import com.fs.huifuPay.domain.HuifuOrderConfirmResult;
 import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayQueryRequest;
+import com.fs.huifuPay.sdk.opps.core.utils.DateTools;
 import com.fs.huifuPay.service.HuiFuService;
 import com.fs.im.dto.*;
 import com.fs.im.service.IImService;
@@ -87,6 +92,7 @@ import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Component;
 
+import java.math.BigDecimal;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
@@ -243,6 +249,14 @@ public class Task {
     private FsUserCompanyUserMapper fsUserCompanyUserMapper;
     @Autowired
     private FsStoreOrderScrmMapper fsStoreOrderScrmMapper;
+    @Autowired
+    private FsStorePaymentMapper fsStorePaymentMapper;
+
+    @Autowired
+    private FsSubMerchantMapper fsSubMerchantMapper;
+
+    @Autowired
+    private IFsShareAmountDetailService shareAmountDetailService;
 
     @Autowired
     private ConversationSyncService syncService;
@@ -2019,4 +2033,131 @@ public class Task {
     }
 
 
+
+    public void shareAmount(){
+        List<FsStorePayment> payments = fsStorePaymentMapper.selectSharePaymentList();
+        if (CollectionUtil.isEmpty(payments)) return;
+        logger.info("开始处理分享金额");
+        for (FsStorePayment storePayment : payments) {
+            try {
+                Thread.sleep(1000);
+                //查询订单确认金额
+                V2TradePaymentScanpayQueryRequest request = new V2TradePaymentScanpayQueryRequest();
+                request.setOrgReqDate(DateTools.formatYYYYMMDD(storePayment.getPayTime()));
+                request.setOrgReqSeqId(storePayment.getShareCode()+"-"+storePayment.getPayCode());
+                request.setAppId(storePayment.getAppId());
+                HuiFuQueryOrderResult queryOrderResult = huiFuService.queryOrder(request);
+                logger.info("汇付订单查询返回:{}" , queryOrderResult);
+                if (queryOrderResult != null && "00000000".equals(queryOrderResult.getResp_code())) {
+                    //未开启延迟支付的跳出当前循环 执行下次循环
+                    if (queryOrderResult.getDelay_acct_flag().equals("N")) {
+                        FsStorePayment mapPayment = new FsStorePayment();
+                        mapPayment.setPaymentId(storePayment.getPaymentId());
+                        mapPayment.setIsShare(0);
+                        fsStorePaymentService.updateFsStorePayment(mapPayment);
+                        continue;
+                    }
+                    logger.info("分账订单号:{}",storePayment.getBusinessCode());
+
+                    //待确认金额
+                    BigDecimal unConfirmAmt = new BigDecimal(queryOrderResult.getUnconfirm_amt());
+                    //分账金额
+                    BigDecimal divAmount = null;
+                    //默认全部进入收款主账户
+                    BigDecimal mainAmount = unConfirmAmt;
+
+
+                    FsSubMerchant fsSubMerchant = null;
+                    FsPackageOrder order = null;
+
+                    //是否分账到合作人
+                    boolean isDiv = false;
+                    HuifuOrderConfirm confirm = new HuifuOrderConfirm();
+                    confirm.setAppId(storePayment.getAppId());
+
+                    //支付金额大于等于0.1的进行分账 最低分账金额为0.1
+                    if (storePayment.getPayMoney().compareTo(new BigDecimal("0.1")) > -1) {
+                        //分账订单
+                        order = fsPackageOrderMapper.selectFsPackageOrderByOrderSn(storePayment.getBusinessCode());
+                        if (order != null && order.getPackageId() != null && order.getCompanyId() != null) {
+                            //获取套餐包信息
+                            FsPackage fsPackage = fsPackageMapper.selectFsPackageByPackageId(order.getPackageId());
+                            //公司信息
+                            Company company = companyMapper.selectCompanyById(order.getCompanyId());
+                            //分账比列大于0且公司有分账商户
+                            if (fsPackage != null && (fsPackage.getShareRate() != null && fsPackage.getShareRate() > 0)
+                                    && company != null && company.getSubMerchantId() != null) {
+                                //分账商户
+                                fsSubMerchant = fsSubMerchantMapper.selectFsSubMerchantById(company.getSubMerchantId());
+                                if (fsSubMerchant != null && fsSubMerchant.getMerchantNo() != null) {
+                                    //金额全部进入分账商户 分账比列为100
+                                    if (fsPackage.getShareRate() == 100) {
+                                        divAmount = unConfirmAmt;
+                                        mainAmount = BigDecimal.ZERO;
+                                    } else {
+                                        //金额进行分账
+                                        divAmount = unConfirmAmt.multiply(BigDecimal.valueOf(fsPackage.getShareRate())).divide(new BigDecimal(100));
+                                        mainAmount = unConfirmAmt.subtract(divAmount);
+                                    }
+                                    isDiv = true;
+                                }
+                            }
+                        }
+                    }
+                    logger.info("开始确认订单分账..........");
+                    String orderCode = OrderCodeUtils.getOrderSn();
+                    if (StringUtils.isEmpty(orderCode)) {
+                        throw new CustomException("订单生成失败,请重试");
+                    }
+                    confirm.setReqSeqId(orderCode);
+                    if (isDiv) {
+                        //合作人分账金额和商户号
+                        confirm.setDivAmt(divAmount);
+                        confirm.setDivHfId(fsSubMerchant.getMerchantNo());
+                        //分账明细数据
+                        FsShareAmountDetail shareAmountDetail = new FsShareAmountDetail();
+                        shareAmountDetail.setShareAmount(divAmount);
+                        shareAmountDetail.setMerchantId(fsSubMerchant.getId());
+                        shareAmountDetail.setOrderCode(order.getOrderSn());
+                        shareAmountDetail.setOrderId(order.getOrderId());
+                        //添加分账明细
+                        shareAmountDetailService.insertFsShareAmountDetail(shareAmountDetail);
+                    }
+                    confirm.setMainDivAmt(mainAmount);
+                    confirm.setOrgReqDate(queryOrderResult.getOrg_req_date());
+                    confirm.setOrgReqSeqId(queryOrderResult.getOrg_req_seq_id());
+                    confirm.setMainHfId(queryOrderResult.getHuifu_id());
+                    confirm.setTotalAmount(storePayment.getPayMoney());
+
+                    //执行分账
+                    HuifuOrderConfirmResult result = huiFuService.confirmOrder(confirm);
+                    if (result != null && result.getResp_code().equals("00000000") && (result.getTrans_stat().equals("S") || result.getTrans_stat().equals("P"))) {
+                        logger.info("分账成功,订单号:{}",storePayment.getBusinessCode());
+                        FsStorePayment mapPayment = new FsStorePayment();
+                        //分账标识
+                        mapPayment.setPaymentId(storePayment.getPaymentId());
+                        mapPayment.setShareStatus(1);
+                        mapPayment.setShareDate(result.getReq_date());
+                        mapPayment.setShareCode(result.getReq_seq_id());
+                        logger.info("更新支付记录");
+                        fsStorePaymentMapper.updateFsStorePayment(mapPayment);
+                    } else {
+                        throw new CustomException("分账失败");
+                    }
+                } else {
+                    if (queryOrderResult != null) {
+                        throw new CustomException(queryOrderResult.getResp_desc());
+                    }
+                }
+            } catch (Exception e) {
+                FsStorePayment mapPayment = new FsStorePayment();
+                //分账标识
+                mapPayment.setPaymentId(storePayment.getPaymentId());
+                mapPayment.setShareStatus(1);
+                mapPayment.setShareCode(e.getMessage());
+                fsStorePaymentMapper.updateFsStorePayment(mapPayment);
+                logger.info("分账失败,订单号:{},原因:{}", storePayment.getBusinessCode(),e.getMessage());
+            }
+        }
+    }
 }

+ 5 - 0
fs-service/src/main/java/com/fs/company/domain/Company.java

@@ -146,4 +146,9 @@ public class Company extends BaseEntity
 
     @TableField(exist = false)
     private List<Long> showGatewayIds;
+
+    /**
+     * 分账子商户id
+     */
+    private Long subMerchantId;
 }

+ 2 - 0
fs-service/src/main/java/com/fs/company/service/ICompanyService.java

@@ -202,4 +202,6 @@ public interface ICompanyService
     String checkMchTransferStatus(String outBatchNo,Long companyId);
 
     R checkMchTransferStatusByBatchID(String batchId, Long companyId);
+
+
 }

+ 5 - 0
fs-service/src/main/java/com/fs/his/domain/FsPackage.java

@@ -109,4 +109,9 @@ public class FsPackage extends BaseEntity
      */
     @Excel(name = "是否食品/保健品")
     private Integer isHealthProductType;
+
+    /**
+     * 分成比例(0-100)
+     */
+    private Integer shareRate;
 }

+ 40 - 0
fs-service/src/main/java/com/fs/his/domain/FsShareAmountDetail.java

@@ -0,0 +1,40 @@
+package com.fs.his.domain;
+
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+
+/**
+ * 分账明细对象 fs_share_amount_detail
+ *
+ * @author fs
+ * @date 2025-12-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsShareAmountDetail extends BaseEntity{
+
+    /** $column.columnComment */
+    private Long id;
+
+    /** 订单id */
+    @Excel(name = "订单id")
+    private Long orderId;
+
+    /** 订单号 */
+    @Excel(name = "订单号")
+    private String orderCode;
+
+    /** 商户id */
+    @Excel(name = "商户id")
+    private Long merchantId;
+
+    /** 分账金额 */
+    @Excel(name = "分账金额")
+    private BigDecimal shareAmount;
+
+
+}

+ 20 - 0
fs-service/src/main/java/com/fs/his/domain/FsStorePayment.java

@@ -102,6 +102,26 @@ public class FsStorePayment extends BaseEntity
 
     private Long merConfigId;
 
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date shareTime;
+
+    private String shareDate;
+
+    public Date getShareTime() {
+        return shareTime;
+    }
+    public void setShareTime(Date shareTime) {
+        this.shareTime = shareTime;
+    }
+
+    public String getShareDate() {
+        return shareDate;
+    }
+
+    public void setShareDate(String shareDate) {
+        this.shareDate = shareDate;
+    }
+
     public Long getMerConfigId() {
         return merConfigId;
     }

+ 65 - 0
fs-service/src/main/java/com/fs/his/mapper/FsShareAmountDetailMapper.java

@@ -0,0 +1,65 @@
+package com.fs.his.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.his.domain.FsShareAmountDetail;
+import com.fs.his.param.FsShareAmountDetailParam;
+import com.fs.his.vo.FsShareAmountDetailVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 分账明细Mapper接口
+ * 
+ * @author fs
+ * @date 2025-12-02
+ */
+public interface FsShareAmountDetailMapper extends BaseMapper<FsShareAmountDetail>{
+    /**
+     * 查询分账明细
+     * 
+     * @param id 分账明细主键
+     * @return 分账明细
+     */
+    FsShareAmountDetail selectFsShareAmountDetailById(Long id);
+
+    /**
+     * 查询分账明细列表
+     * 
+     * @param fsShareAmountDetail 分账明细
+     * @return 分账明细集合
+     */
+    List<FsShareAmountDetailVO> selectFsShareAmountDetailList(@Param("maps") FsShareAmountDetailParam fsShareAmountDetail);
+
+    /**
+     * 新增分账明细
+     * 
+     * @param fsShareAmountDetail 分账明细
+     * @return 结果
+     */
+    int insertFsShareAmountDetail(FsShareAmountDetail fsShareAmountDetail);
+
+    /**
+     * 修改分账明细
+     * 
+     * @param fsShareAmountDetail 分账明细
+     * @return 结果
+     */
+    int updateFsShareAmountDetail(FsShareAmountDetail fsShareAmountDetail);
+
+    /**
+     * 删除分账明细
+     * 
+     * @param id 分账明细主键
+     * @return 结果
+     */
+    int deleteFsShareAmountDetailById(Long id);
+
+    /**
+     * 批量删除分账明细
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteFsShareAmountDetailByIds(Long[] ids);
+}

+ 6 - 0
fs-service/src/main/java/com/fs/his/mapper/FsStorePaymentMapper.java

@@ -340,4 +340,10 @@ public interface FsStorePaymentMapper
 
     @Select(" select  * from fs_store_payment where status = 0 ")
     List<FsStorePayment> selectAllPayment();
+
+    /**
+     * 今日分账
+     */
+    @Select("SELECT * FROM fs_store_payment WHERE `status` = 1 AND DATE(share_time) = CURDATE() AND is_share = 1 AND share_status = 0")
+    List<FsStorePayment> selectSharePaymentList();
 }

+ 4 - 0
fs-service/src/main/java/com/fs/his/mapper/FsSubMerchantMapper.java

@@ -3,6 +3,7 @@ package com.fs.his.mapper;
 import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.his.domain.FsSubMerchant;
+import org.apache.ibatis.annotations.Select;
 
 /**
  * 汇付-子商户信息Mapper接口
@@ -58,4 +59,7 @@ public interface FsSubMerchantMapper extends BaseMapper<FsSubMerchant>{
      * @return 结果
      */
     int deleteFsSubMerchantByIds(Long[] ids);
+
+    @Select("SELECT id,CONCAT_WS('-',merchant_name,merchant_no) merchant_name FROM fs_sub_merchant")
+    List<FsSubMerchant> selectFsSubMerchantListOptions();
 }

+ 15 - 0
fs-service/src/main/java/com/fs/his/param/FsShareAmountDetailParam.java

@@ -0,0 +1,15 @@
+package com.fs.his.param;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class FsShareAmountDetailParam {
+    private String orderCode;
+    private Integer type;
+    private String merchantName;
+    private String merchantAccount;
+    private Date startTime;
+    private Date endTime;
+}

+ 64 - 0
fs-service/src/main/java/com/fs/his/service/IFsShareAmountDetailService.java

@@ -0,0 +1,64 @@
+package com.fs.his.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.his.domain.FsShareAmountDetail;
+import com.fs.his.param.FsShareAmountDetailParam;
+import com.fs.his.vo.FsShareAmountDetailVO;
+
+import java.util.List;
+
+/**
+ * 分账明细Service接口
+ * 
+ * @author fs
+ * @date 2025-12-02
+ */
+public interface IFsShareAmountDetailService extends IService<FsShareAmountDetail>{
+    /**
+     * 查询分账明细
+     * 
+     * @param id 分账明细主键
+     * @return 分账明细
+     */
+    FsShareAmountDetail selectFsShareAmountDetailById(Long id);
+
+    /**
+     * 查询分账明细列表
+     * 
+     * @param fsShareAmountDetail 分账明细
+     * @return 分账明细集合
+     */
+    List<FsShareAmountDetailVO> selectFsShareAmountDetailList(FsShareAmountDetailParam fsShareAmountDetail);
+
+    /**
+     * 新增分账明细
+     * 
+     * @param fsShareAmountDetail 分账明细
+     * @return 结果
+     */
+    int insertFsShareAmountDetail(FsShareAmountDetail fsShareAmountDetail);
+
+    /**
+     * 修改分账明细
+     * 
+     * @param fsShareAmountDetail 分账明细
+     * @return 结果
+     */
+    int updateFsShareAmountDetail(FsShareAmountDetail fsShareAmountDetail);
+
+    /**
+     * 批量删除分账明细
+     * 
+     * @param ids 需要删除的分账明细主键集合
+     * @return 结果
+     */
+    int deleteFsShareAmountDetailByIds(Long[] ids);
+
+    /**
+     * 删除分账明细信息
+     * 
+     * @param id 分账明细主键
+     * @return 结果
+     */
+    int deleteFsShareAmountDetailById(Long id);
+}

+ 2 - 0
fs-service/src/main/java/com/fs/his/service/IFsSubMerchantService.java

@@ -58,4 +58,6 @@ public interface IFsSubMerchantService extends IService<FsSubMerchant>{
      * @return 结果
      */
     int deleteFsSubMerchantById(Long id);
+
+    List<FsSubMerchant> selectFsSubMerchantListOptions();
 }

+ 61 - 7
fs-service/src/main/java/com/fs/his/service/impl/FsPackageOrderServiceImpl.java

@@ -12,6 +12,7 @@ import java.util.concurrent.TimeUnit;
 
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
@@ -33,7 +34,9 @@ import com.fs.common.exception.CustomException;
 import com.fs.common.utils.*;
 import com.fs.common.utils.ip.IpUtils;
 import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyUser;
+import com.fs.company.mapper.CompanyMapper;
 import com.fs.company.mapper.CompanyUserMapper;
 import com.fs.config.cloud.CloudHostProper;
 import com.fs.core.config.WxMaConfiguration;
@@ -187,6 +190,9 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
     @Autowired
     private IFsUserInformationCollectionService fsUserInformationCollectionService;
 
+    @Autowired
+    private CompanyMapper companyMapper;
+
     /**
      * 查询套餐订单
      *
@@ -1151,6 +1157,7 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
                         fsStorePaymentMapper.updateFsStorePayment(mt);
                         return R.ok().put("isPay", 0).put("data", result).put("type", "tz");
                     }else if (merchantAppConfig.getMerchantType().equals("hf")) {
+                        boolean shareAmount = false;
                         logger.info("创建汇付订单");
                         HuiFuCreateOrder o = new HuiFuCreateOrder();
                         o.setTradeType(StringUtils.isEmpty(param.getPayType()) || param.getPayType().equals("wx") ? "T_MINIAPP" : "A_NATIVE");
@@ -1159,13 +1166,22 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
                         o.setTransAmt(storePayment.getPayMoney().toString());
                         o.setGoodsDesc("套餐包订单支付");
                         o.setAppId(appId);
-                        //公司分账
-                        try {
-                            HuiFuUtils.doDiv(o,fsPackageOrder.getCompanyId(),storePayment.getMerConfigId());
-                            //存储分账明细
-                            HuiFuUtils.saveDivItem(o, fsPackageOrder.getOrderSn(), storePayment.getPayCode());
-                        } catch (Exception e) {
-                            logger.error("-------------分账出错:{}", e.getMessage());
+                        if (CloudHostUtils.hasCloudHostName("鸿森堂")) {
+                            //鸿森堂销售公司分账
+                            try {
+                                shareAmount = shareAmount(o, fsPackageOrder, storePayment);
+                            } catch (Exception e) {
+                                logger.error("-------------鸿森堂分账出错:{}", e.getMessage());
+                            }
+                        } else {
+                            //公司分账
+                            try {
+                                HuiFuUtils.doDiv(o,fsPackageOrder.getCompanyId(),storePayment.getMerConfigId());
+                                //存储分账明细
+                                HuiFuUtils.saveDivItem(o, fsPackageOrder.getOrderSn(), storePayment.getPayCode());
+                            } catch (Exception e) {
+                                logger.error("-------------分账出错:{}", e.getMessage());
+                            }
                         }
                         HuifuCreateOrderResult result = huiFuService.createOrder(o);
                         logger.info("创建汇付支付:"+result);
@@ -1174,6 +1190,15 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
                         mt.setTradeNo(result.getHf_seq_id());
                         //多小程序支付 更新小程序appid
                         mt.setAppId(appId);
+                        if (shareAmount) {
+                            mt.setIsShare(1);
+                            mt.setShareCode("package");
+                            //三天后分账
+                            LocalDate now = LocalDate.now();
+                            LocalDate threeDaysLater = now.plusDays(3);
+                            Date threeDay = Date.from(threeDaysLater.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
+                            mt.setShareTime(threeDay);
+                        }
                         storePaymentService.updateFsStorePayment(mt);
                         return R.ok().put("isPay", 0).put("data", result).put("type", "hf");
                     } else if (merchantAppConfig.getMerchantType().equals("appPay") && "wx".equals(param.getPayType())) {
@@ -2026,4 +2051,33 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
     public FsUserInfoCollectionAndStoreOrderVo selectInformationCollectionByStoreOrderId(Long orderId) {
         return fsPackageOrderMapper.selectInformationCollectionByStoreOrderId(orderId);
     }
+
+    private boolean shareAmount(HuiFuCreateOrder huiFuCreateOrder,FsPackageOrder fsPackageOrder,FsStorePayment payment){
+
+        boolean tag = false;
+        if (! (payment.getPayMoney().compareTo(new  BigDecimal("0.1")) > -1)) {
+            return tag;
+        }
+        if (fsPackageOrder.getCompanyId() == null) {
+            return tag;
+        }
+        Company company = companyMapper.selectCompanyById(fsPackageOrder.getCompanyId());
+        if (company == null) {
+            return tag;
+        }
+        if (company.getSubMerchantId() == null) {
+            return tag;
+        }
+        FsPackage fsPackage = fsPackageMapper.selectFsPackageByPackageId(fsPackageOrder.getPackageId());
+        if (fsPackage == null) {
+            return tag;
+        }
+        if (fsPackage.getShareRate() == null || fsPackage.getShareRate() <= 0) {
+            return tag;
+        }
+        //分账且开启延迟
+        tag = true;
+        huiFuCreateOrder.setDelayAcctFlag("Y");
+        return tag;
+    }
 }

+ 96 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsShareAmountDetailServiceImpl.java

@@ -0,0 +1,96 @@
+package com.fs.his.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.utils.DateUtils;
+import com.fs.his.domain.FsShareAmountDetail;
+import com.fs.his.mapper.FsShareAmountDetailMapper;
+import com.fs.his.param.FsShareAmountDetailParam;
+import com.fs.his.service.IFsShareAmountDetailService;
+import com.fs.his.vo.FsShareAmountDetailVO;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 分账明细Service业务层处理
+ * 
+ * @author fs
+ * @date 2025-12-02
+ */
+@Service
+public class FsShareAmountDetailServiceImpl extends ServiceImpl<FsShareAmountDetailMapper, FsShareAmountDetail> implements IFsShareAmountDetailService {
+
+    /**
+     * 查询分账明细
+     * 
+     * @param id 分账明细主键
+     * @return 分账明细
+     */
+    @Override
+    public FsShareAmountDetail selectFsShareAmountDetailById(Long id)
+    {
+        return baseMapper.selectFsShareAmountDetailById(id);
+    }
+
+    /**
+     * 查询分账明细列表
+     * 
+     * @param fsShareAmountDetail 分账明细
+     * @return 分账明细
+     */
+    @Override
+    public List<FsShareAmountDetailVO> selectFsShareAmountDetailList(FsShareAmountDetailParam fsShareAmountDetail)
+    {
+        return baseMapper.selectFsShareAmountDetailList(fsShareAmountDetail);
+    }
+
+    /**
+     * 新增分账明细
+     * 
+     * @param fsShareAmountDetail 分账明细
+     * @return 结果
+     */
+    @Override
+    public int insertFsShareAmountDetail(FsShareAmountDetail fsShareAmountDetail)
+    {
+        fsShareAmountDetail.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertFsShareAmountDetail(fsShareAmountDetail);
+    }
+
+    /**
+     * 修改分账明细
+     * 
+     * @param fsShareAmountDetail 分账明细
+     * @return 结果
+     */
+    @Override
+    public int updateFsShareAmountDetail(FsShareAmountDetail fsShareAmountDetail)
+    {
+        fsShareAmountDetail.setUpdateTime(DateUtils.getNowDate());
+        return baseMapper.updateFsShareAmountDetail(fsShareAmountDetail);
+    }
+
+    /**
+     * 批量删除分账明细
+     * 
+     * @param ids 需要删除的分账明细主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsShareAmountDetailByIds(Long[] ids)
+    {
+        return baseMapper.deleteFsShareAmountDetailByIds(ids);
+    }
+
+    /**
+     * 删除分账明细信息
+     * 
+     * @param id 分账明细主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsShareAmountDetailById(Long id)
+    {
+        return baseMapper.deleteFsShareAmountDetailById(id);
+    }
+}

+ 83 - 36
fs-service/src/main/java/com/fs/his/service/impl/FsStoreAfterSalesServiceImpl.java

@@ -60,6 +60,8 @@ import com.fs.his.utils.ConfigUtil;
 import com.fs.his.vo.*;
 import com.fs.hisStore.domain.FsPayConfigScrm;
 import com.fs.huifuPay.domain.HuiFuRefundResult;
+import com.fs.huifuPay.domain.HuifuConfirmrefundResult;
+import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentDelaytransConfirmrefundRequest;
 import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayRefundRequest;
 import com.fs.huifuPay.sdk.opps.core.utils.HuiFuUtils;
 import com.fs.huifuPay.service.HuiFuService;
@@ -586,47 +588,69 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
                     throw new CustomException("退款请求失败" + result.getRetMsg());
                 }
             } else if (payment.getPayMode().equals("hf")) {
-                V2TradePaymentScanpayRefundRequest request = new V2TradePaymentScanpayRefundRequest();
+                if (CloudHostUtils.hasCloudHostName("鸿森堂")) {
+                    if (payment.getIsShare() == 1) {
+                        V2TradePaymentDelaytransConfirmrefundRequest confirmRefundRequest = new V2TradePaymentDelaytransConfirmrefundRequest();
+                        String orderCode = OrderCodeUtils.getOrderSn();
+                        if (StringUtils.isEmpty(orderCode)) {
+                            throw new CustomException("订单生成失败,请重试");
+                        }
+                        confirmRefundRequest.setReqSeqId(orderCode);
+                        confirmRefundRequest.setOrgReqSeqId(payment.getShareCode());
+                        confirmRefundRequest.setOrgReqDate(payment.getShareDate());
+                        HuifuConfirmrefundResult result = huiFuService.confirmRefund(confirmRefundRequest, payment.getAppId());
+                        if (result.getResp_code().equals("00000000") && (result.getTrans_stat().equals("S") || result.getTrans_stat().equals("P"))) {
+                            refund(payment,orderType,order.getOrderId());
+                        } else {
+                            throw new CustomException("交易确认退款请求失败" + result.getResp_desc());
+                        }
+                    } else {
+                        refund(payment,orderType,order.getOrderId());
+                    }
+                } else {
+                    V2TradePaymentScanpayRefundRequest request = new V2TradePaymentScanpayRefundRequest();
 //                request.setOrdAmt(payment.getPayMoney().toString());
-                request.setOrdAmt(reMoney.toString());
-                request.setOrgReqDate(new SimpleDateFormat("yyyyMMdd").format(payment.getCreateTime()));
-                request.setReqSeqId("refund-" + payment.getPayCode());
-                Map<String, Object> extendInfoMap = new HashMap<>();
-                request.setAppId(payment.getAppId());
-                extendInfoMap.put("org_req_seq_id", orderType + "-" + payment.getPayCode());
-
-                //处理分账退款
-                //1.判断是否是全额退款
-                CompanyDivItem companyDivItem = null;
-                try {
-                    companyDivItem = HuiFuUtils.doRefundDiv(fsStoreOrder.getPayPrice(), reMoney, payment, extendInfoMap);
-                } catch (Exception e) {
-                    logger.error("-----------------分账退款处理失败{}", e.getMessage());
-                }
-
-                request.setExtendInfo(extendInfoMap);
-                request.setAppId(payment.getAppId());
-                HuiFuRefundResult refund = huiFuService.refund(request);
-                logger.info("订单退款返回结果:退款订单id:" + order.getOrderId() + refund);
-                if ((refund.getResp_code().equals("00000000") || refund.getResp_code().equals("00000100")) && (refund.getTrans_stat().equals("S") || refund.getTrans_stat().equals("P"))) {
-                    FsStorePayment paymentMap = new FsStorePayment();
-                    paymentMap.setPaymentId(payment.getPaymentId());
-                    paymentMap.setStatus(-1);
-                    paymentMap.setRefundTime(DateUtils.getNowDate());
-                    paymentMap.setRefundMoney(payment.getPayMoney());
-                    fsStorePaymentMapper.updateFsStorePayment(paymentMap);
+                    request.setOrdAmt(reMoney.toString());
+                    request.setOrgReqDate(new SimpleDateFormat("yyyyMMdd").format(payment.getCreateTime()));
+                    request.setReqSeqId("refund-" + payment.getPayCode());
+                    Map<String, Object> extendInfoMap = new HashMap<>();
+                    request.setAppId(payment.getAppId());
+                    extendInfoMap.put("org_req_seq_id", orderType + "-" + payment.getPayCode());
+
+                    //处理分账退款
+                    //1.判断是否是全额退款
+                    CompanyDivItem companyDivItem = null;
                     try {
-                        //处理分账退款明细表
-                        if (companyDivItem !=null && companyDivItem.getId() != null) {
-                            companyDivItem.setIsRefund(1);
-                            companyDivItemService.updateCompanyDivItem(companyDivItem);
-                        }
+                        companyDivItem = HuiFuUtils.doRefundDiv(fsStoreOrder.getPayPrice(), reMoney, payment, extendInfoMap);
                     } catch (Exception e) {
-                        logger.error("-----------------分账退款明细处理失败{}", e.getMessage());
+                        logger.error("-----------------分账退款处理失败{}", e.getMessage());
+                    }
+
+                    request.setExtendInfo(extendInfoMap);
+                    request.setAppId(payment.getAppId());
+                    HuiFuRefundResult refund = huiFuService.refund(request);
+                    logger.info("订单退款返回结果:退款订单id:" + order.getOrderId() + refund);
+                    if ((refund.getResp_code().equals("00000000") || refund.getResp_code().equals("00000100")) && (refund.getTrans_stat().equals("S") || refund.getTrans_stat().equals("P"))) {
+                        FsStorePayment paymentMap = new FsStorePayment();
+                        paymentMap.setPaymentId(payment.getPaymentId());
+                        paymentMap.setStatus(-1);
+                        paymentMap.setRefundTime(DateUtils.getNowDate());
+                        paymentMap.setRefundMoney(payment.getPayMoney());
+                        fsStorePaymentMapper.updateFsStorePayment(paymentMap);
+                        try {
+                            //处理分账退款明细表
+                            if (companyDivItem !=null && companyDivItem.getId() != null) {
+                                companyDivItem.setIsRefund(1);
+                                companyDivItemService.updateCompanyDivItem(companyDivItem);
+                            }
+                        } catch (Exception e) {
+                            logger.error("-----------------分账退款明细处理失败{}", e.getMessage());
+                        }
+                    } else {
+                        throw new CustomException("退款请求失败" + refund.getResp_desc());
                     }
-                } else {
-                    throw new CustomException("退款请求失败" + refund.getResp_desc());
                 }
+
             } else if ("appPay".equals(payment.getPayMode()) && "wx".equals(payment.getPayTypeCode())) {
                 // 处理微信退款
                 WxPayService wxPayService = getWxPayService(fsPayConfig);
@@ -1158,4 +1182,27 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
     public List<JSONObject> selectFsStoreAfterSales(Map<String, Object> map) {
         return fsStoreAfterSalesMapper.selectFsStoreAfterSales(map);
     }
+
+    private void refund(FsStorePayment payment,String orderType,Long orderId) {
+        V2TradePaymentScanpayRefundRequest request = new V2TradePaymentScanpayRefundRequest();
+        request.setOrdAmt(payment.getPayMoney().toString());
+        request.setOrgReqDate(new SimpleDateFormat("yyyyMMdd").format(payment.getCreateTime()));
+        request.setReqSeqId("refund-" + payment.getPayCode());
+        request.setAppId(payment.getAppId());
+        Map<String, Object> extendInfoMap = new HashMap<>();
+        extendInfoMap.put("org_req_seq_id", orderType + "-" + payment.getPayCode());
+        request.setExtendInfo(extendInfoMap);
+        HuiFuRefundResult refund = huiFuService.refund(request);
+        logger.info("订单退款返回结果:退款订单id:" + orderId + refund);
+        if ((refund.getResp_code().equals("00000000") || refund.getResp_code().equals("00000100")) && (refund.getTrans_stat().equals("S") || refund.getTrans_stat().equals("P"))) {
+            FsStorePayment paymentMap = new FsStorePayment();
+            paymentMap.setPaymentId(payment.getPaymentId());
+            paymentMap.setStatus(-1);
+            paymentMap.setRefundTime(DateUtils.getNowDate());
+            paymentMap.setRefundMoney(payment.getPayMoney());
+            fsStorePaymentMapper.updateFsStorePayment(paymentMap);
+        } else {
+            throw new CustomException("退款请求失败" + refund.getResp_desc());
+        }
+    }
 }

+ 6 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsSubMerchantServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fs.his.service.impl;
 
+import java.util.Collections;
 import java.util.List;
 import com.fs.common.utils.DateUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -91,4 +92,9 @@ public class FsSubMerchantServiceImpl extends ServiceImpl<FsSubMerchantMapper, F
     {
         return baseMapper.deleteFsSubMerchantById(id);
     }
+
+    @Override
+    public List<FsSubMerchant> selectFsSubMerchantListOptions() {
+        return baseMapper.selectFsSubMerchantListOptions();
+    }
 }

+ 5 - 0
fs-service/src/main/java/com/fs/his/vo/FsPackageVO.java

@@ -126,4 +126,9 @@ public class FsPackageVO {
     private String appIds;
     @Excel(name = "是否食品/保健品")
     private Integer isHealthProductType;
+
+    /**
+     * 分成比例(0-100)
+     */
+    private Integer shareRate;
 }

+ 37 - 0
fs-service/src/main/java/com/fs/his/vo/FsShareAmountDetailVO.java

@@ -0,0 +1,37 @@
+package com.fs.his.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class FsShareAmountDetailVO {
+
+
+    /** 订单号 */
+    @Excel(name = "订单号")
+    private String orderCode;
+
+    /** 商户id */
+    @Excel(name = "分账商户名称")
+    private String merchantName;
+
+    @Excel(name = "分账商户号")
+    private String merchantAccount;
+
+    /** 分账金额 */
+    @Excel(name = "分账金额")
+    private BigDecimal shareAmount;
+
+    @Excel(name = "分账类型",readConverterExp = "1=聚水潭,2=兔灵")
+    private Integer type;
+
+    @Excel(name = "分账时间",dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    private Integer status;
+}

+ 19 - 0
fs-service/src/main/java/com/fs/huifuPay/domain/HuifuConfirmrefundResult.java

@@ -0,0 +1,19 @@
+package com.fs.huifuPay.domain;
+
+import lombok.Data;
+
+@Data
+public class HuifuConfirmrefundResult {
+    private String resp_code;
+    // 响应描述
+    private String resp_desc;
+
+    // 交易状态
+    private String trans_stat; //P:处理中、S:成功、F:失败;示例值:S
+    // 未确认金额
+    private String unconfirm_amt;
+    // 已确认金额
+    private String confirmed_amt;
+
+
+}

+ 43 - 0
fs-service/src/main/java/com/fs/huifuPay/domain/HuifuOrderConfirm.java

@@ -0,0 +1,43 @@
+package com.fs.huifuPay.domain;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class HuifuOrderConfirm {
+    String reqSeqId;
+    //原交易流水号
+    String orgReqSeqId;
+    /**
+     * 交易类型:
+     * 原交易为快捷支付必填:QUICK_PAY;
+     * 原交易为余额支付必填:ACCT_PAYMENT;
+     * 原交易为全域资金必填:REMITTANCE_PAY;
+     */
+    String payType;
+
+    //其它分账金额
+    BigDecimal divAmt;
+
+    //主账户分账金额
+    BigDecimal mainDivAmt;
+
+    String orgReqDate;
+
+    String appId;
+
+    //分账总额
+    BigDecimal totalAmount;
+
+    //主商户号
+    String mainHfId;
+
+    //分账商户号
+    String divHfId;
+
+    String queryCode;
+
+    String queryDate;
+
+}

+ 36 - 0
fs-service/src/main/java/com/fs/huifuPay/domain/HuifuOrderConfirmResult.java

@@ -0,0 +1,36 @@
+package com.fs.huifuPay.domain;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class HuifuOrderConfirmResult {
+    // 响应码
+    private String resp_code;
+    // 响应描述
+    private String resp_desc;
+    // 交易状态
+    private String trans_stat;
+    // 汇付流水号
+    private String hf_seq_id;
+    //已确认总金额
+    private String confirmed_amt;
+    //待确认总金额
+    private String unconfirm_amt;
+
+    private String org_req_date;
+
+    private String org_req_seq_id;
+
+    private String req_date;
+
+    private String req_seq_id;
+
+    private String zyzHuifuId;
+    private String otherHuifuId;
+    private BigDecimal ysyAmount;
+
+    private BigDecimal otherAmount;
+
+}

+ 5 - 0
fs-service/src/main/java/com/fs/huifuPay/service/HuiFuService.java

@@ -39,4 +39,9 @@ public interface HuiFuService {
     /**延迟分账 交易确认接口**/
     HuiFuQueryOrderResult delayTransConfirm(HuiFuConfirmOrder request);
 
+    /**交易确认**/
+    HuifuOrderConfirmResult confirmOrder(HuifuOrderConfirm request);
+
+    HuifuConfirmrefundResult confirmRefund(V2TradePaymentDelaytransConfirmrefundRequest request,String appId);
+
 }

+ 84 - 0
fs-service/src/main/java/com/fs/huifuPay/service/impl/HuiFuServiceImpl.java

@@ -1,6 +1,7 @@
 package com.fs.huifuPay.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.fs.common.exception.CustomException;
@@ -318,6 +319,89 @@ public class HuiFuServiceImpl implements HuiFuService {
         return result;
     }
 
+    @Override
+    public HuifuOrderConfirmResult confirmOrder(HuifuOrderConfirm confirm) {
+        logger.info("交易确认传参============>{}",confirm);
+        HuifuOrderConfirmResult huifuOrderConfirmResult = null;
+        try {
+            if (confirm.getAppId() != null) {
+                //多汇付支付获取配置
+                doInit(getMerConfig(confirm.getAppId()));
+            } else {
+                doInit(getMerConfig());
+            }
+            V2TradePaymentDelaytransConfirmRequest request = new V2TradePaymentDelaytransConfirmRequest();
+            request.setReqDate(DateTools.getCurrentDateYYYYMMDD());
+            request.setReqSeqId(confirm.getReqSeqId());
+            request.setOrgReqSeqId(confirm.getOrgReqSeqId());
+            request.setOrgReqDate(confirm.getOrgReqDate());
+
+            Map<String, Object> extendInfoMap = new HashMap<>();
+            JSONObject acct_split_bunch = new JSONObject();
+            JSONArray acct_infos = new JSONArray();
+
+            //分账数据
+            if (confirm.getDivAmt() == null) {
+                JSONObject acct_main = new JSONObject();
+                acct_main.put("huifu_id", confirm.getMainHfId());
+                acct_main.put("div_amt", confirm.getMainDivAmt());
+                acct_infos.add(acct_main);
+            } else {
+                //主商户不分账
+                if (confirm.getMainDivAmt().compareTo(BigDecimal.ZERO) == 0) {
+                    JSONObject acct_other = new JSONObject();
+                    acct_other.put("huifu_id", confirm.getDivHfId());
+                    acct_other.put("div_amt", confirm.getDivAmt());
+                    acct_infos.add(acct_other);
+                } else {
+                    JSONObject acct_main = new JSONObject();
+                    acct_main.put("huifu_id", confirm.getMainHfId());
+                    acct_main.put("div_amt", confirm.getMainDivAmt());
+                    acct_infos.add(acct_main);
+                    JSONObject acct_other = new JSONObject();
+                    acct_other.put("huifu_id", confirm.getDivHfId());
+                    acct_other.put("div_amt", confirm.getDivAmt());
+                    acct_infos.add(acct_other);
+                }
+            }
+            acct_split_bunch.put("acct_infos", acct_infos);
+            extendInfoMap.put("acct_split_bunch",JSON.toJSONString(acct_split_bunch));
+            request.setExtendInfo(extendInfoMap);
+            logger.info("交易确认传参:{}",JSON.toJSONString(request));
+            Map<String, Object> response = doExecute(request);
+            logger.info("交易确认返回:{}",response);
+            String jsonString = JSONObject.toJSONString(response);
+            logger.info("交易确认返回:{}",jsonString);
+            huifuOrderConfirmResult = JSON.parseObject(jsonString, HuifuOrderConfirmResult.class);
+        } catch (Exception e) {
+            logger.info("交易确认失败 :{}",e.getMessage());
+            throw new CustomException("交易确认失败");
+        }
+        return huifuOrderConfirmResult;
+    }
+
+    @Override
+    public HuifuConfirmrefundResult confirmRefund(V2TradePaymentDelaytransConfirmrefundRequest request, String appId) {
+        logger.info("交易确认退款传参:{}", request);
+        HuifuConfirmrefundResult huifuConfirmrefundResult = null;
+        try {
+            if (appId != null) {
+                //多汇付支付获取配置
+                doInit(getMerConfig(appId));
+            } else {
+                doInit(getMerConfig());
+            }
+            request.setReqDate(DateTools.getCurrentDateYYYYMMDD());
+            Map<String, Object> response = doExecute(request);
+            String jsonString = JSONObject.toJSONString(response);
+            huifuConfirmrefundResult = JSON.parseObject(jsonString, HuifuConfirmrefundResult.class);
+        } catch (Exception e) {
+            logger.error("创建交易确认退款失败{},", e.getMessage());
+            throw new RuntimeException("创建交易确认退款失败");
+        }
+        return huifuConfirmrefundResult;
+    }
+
 
     public MerConfig getMerConfig(){
         SysConfigMapper sysConfigMapper= SpringUtils.getBean(SysConfigMapper.class);

+ 5 - 0
fs-service/src/main/resources/mapper/company/CompanyMapper.xml

@@ -42,6 +42,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="groupName"    column="group_name"    />
         <result property="maxPadNum"    column="max_pad_num"    />
         <result property="deptId"   column="dept_id" />
+        <result property="subMerchantId"   column="sub_merchant_id" />
     </resultMap>
 
     <sql id="selectCompanyVo">
@@ -123,6 +124,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="maxPadNum != null">max_pad_num,</if>
             <if test="deptId != null">dept_id,</if>
             <if test="isOpenRestReminder != null">is_open_rest_reminder,</if>
+            <if test="subMerchantId != null">sub_merchant_id,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="companyName != null">#{companyName},</if>
@@ -160,6 +162,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="maxPadNum != null">#{maxPadNum},</if>
             <if test="deptId != null">#{deptId},</if>
             <if test="isOpenRestReminder != null">is_open_rest_reminder = #{isOpenRestReminder},</if>
+            <if test="subMerchantId != null">sub_merchant_id = #{subMerchantId},</if>
          </trim>
     </insert>
 
@@ -204,6 +207,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="deptId != null">dept_id = #{deptId},</if>
             <if test="redPackageMoney != null">red_package_money = #{redPackageMoney},</if>
             <if test="isOpenRestReminder != null">is_open_rest_reminder = #{isOpenRestReminder},</if>
+            <if test="subMerchantId != null">sub_merchant_id = #{subMerchantId},</if>
+            <if test="subMerchantId == null">sub_merchant_id = NULL,</if>
         </trim>
         where company_id = #{companyId}
     </update>

+ 5 - 1
fs-service/src/main/resources/mapper/his/FsPackageMapper.xml

@@ -50,10 +50,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="solarTerm"    column="solar_term"    />
         <result property="appIds"    column="app_ids"    />
         <result property="isHealthProductType"    column="is_health_product_type"    />
+        <result property="shareRate"    column="share_rate"    />
     </resultMap>
 
     <sql id="selectFsPackageVo">
-        select package_id,description,usage_per_use_count,icd_code,images,doctor_remark,second_name,follow_temp_id,product_cost_price,inquiry_cost_price,total_cost_price,follow_num,`explain`,indication,store_id,private_type,recipe_type,counts,usage_frequency_unit, package_name,img_url,is_show,total_price,cycle,duration,`desc`,product_type,price,tags,sales,disease_type,num,package_sub_type,describe_json,pay_type,package_type, sort, product_json, status, create_time, update_time, is_del,solar_term,app_ids, is_health_product_type from fs_package
+        select package_id,description,usage_per_use_count,icd_code,images,doctor_remark,second_name,follow_temp_id,product_cost_price,inquiry_cost_price,total_cost_price,follow_num,`explain`,indication,store_id,private_type,recipe_type,counts,usage_frequency_unit, package_name,img_url,is_show,total_price,cycle,duration,`desc`,product_type,price,tags,sales,disease_type,num,package_sub_type,describe_json,pay_type,package_type, sort, product_json, status, create_time, update_time, is_del,solar_term,app_ids, is_health_product_type,share_rate from fs_package
     </sql>
 
     <select id="selectFsPackageList" parameterType="FsPackage" resultMap="FsPackageResult">
@@ -181,6 +182,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="solarTerm != null">solar_term,</if>
             <if test="appIds != null">app_ids,</if>
             <if test="isHealthProductType != null">is_health_product_type,</if>
+            <if test="shareRate != null">share_rate,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="packageName != null">#{packageName},</if>
@@ -227,6 +229,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="solarTerm != null">#{solarTerm},</if>
             <if test="appIds != null">#{appIds},</if>
             <if test="isHealthProductType != null">#{isHealthProductType},</if>
+            <if test="shareRate != null">#{shareRate},</if>
         </trim>
     </insert>
 
@@ -277,6 +280,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="solarTerm != null">solar_term = #{solarTerm},</if>
             <if test="appIds != null ">app_ids = #{appIds},</if>
             <if test="isHealthProductType != null ">is_health_product_type = #{isHealthProductType},</if>
+            <if test="shareRate != null">share_rate = #{shareRate},</if>
         </trim>
         where package_id = #{packageId}
     </update>

+ 89 - 0
fs-service/src/main/resources/mapper/his/FsShareAmountDetailMapper.xml

@@ -0,0 +1,89 @@
+<?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.fs.his.mapper.FsShareAmountDetailMapper">
+    
+    <resultMap type="FsShareAmountDetail" id="FsShareAmountDetailResult">
+        <result property="id"    column="id"    />
+        <result property="orderId"    column="order_id"    />
+        <result property="orderCode"    column="order_code"    />
+        <result property="merchantId"    column="merchant_id"    />
+        <result property="shareAmount"    column="share_amount"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectFsShareAmountDetailVo">
+        select id, order_id, order_code, merchant_id, share_amount, create_time, update_time from fs_share_amount_detail
+    </sql>
+
+    <select id="selectFsShareAmountDetailList"  resultType="com.fs.his.vo.FsShareAmountDetailVO">
+        select d.order_code, d.share_amount, d.create_time, m.merchant_name,m.merchant_account,m.type , o.`status`
+        from fs_share_amount_detail d
+        LEFT JOIN fs_amounts_share_merchant m ON d.merchant_id = m.id
+        LEFT JOIN fs_store_order o ON o.order_code = d.order_code
+        <where>
+            <if test="maps.orderCode != null  and maps.orderCode != ''"> and d.order_code = #{maps.orderCode}</if>
+            <if test="maps.merchantAccount != null  and maps.merchantAccount != ''"> and m.merchant_account = #{maps.merchantAccount}</if>
+            <if test="maps.type != null "> and m.type = #{maps.type} </if>
+            <if test="maps.merchantName != null and maps.merchantName "> and m.merchant_name like concat('%', #{maps.merchantName}, '%') </if>
+            <if test="maps.startTime != null">
+                and DATE(d.create_time) &gt;= DATE(#{maps.startTime})
+            </if>
+            <if test="maps.endTime != null">
+                and DATE(d.create_time) &lt;= DATE(#{maps.endTime})
+            </if>
+        </where>
+         order by d.create_time desc
+    </select>
+    
+    <select id="selectFsShareAmountDetailById" parameterType="Long" resultMap="FsShareAmountDetailResult">
+        <include refid="selectFsShareAmountDetailVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertFsShareAmountDetail" parameterType="FsShareAmountDetail" useGeneratedKeys="true" keyProperty="id">
+        insert into fs_share_amount_detail
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="orderId != null">order_id,</if>
+            <if test="orderCode != null">order_code,</if>
+            <if test="merchantId != null">merchant_id,</if>
+            <if test="shareAmount != null">share_amount,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="orderId != null">#{orderId},</if>
+            <if test="orderCode != null">#{orderCode},</if>
+            <if test="merchantId != null">#{merchantId},</if>
+            <if test="shareAmount != null">#{shareAmount},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateFsShareAmountDetail" parameterType="FsShareAmountDetail">
+        update fs_share_amount_detail
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="orderId != null">order_id = #{orderId},</if>
+            <if test="orderCode != null">order_code = #{orderCode},</if>
+            <if test="merchantId != null">merchant_id = #{merchantId},</if>
+            <if test="shareAmount != null">share_amount = #{shareAmount},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteFsShareAmountDetailById" parameterType="Long">
+        delete from fs_share_amount_detail where id = #{id}
+    </delete>
+
+    <delete id="deleteFsShareAmountDetailByIds" parameterType="String">
+        delete from fs_share_amount_detail where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 10 - 1
fs-service/src/main/resources/mapper/his/FsStorePaymentMapper.xml

@@ -32,10 +32,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="shareMoney"    column="share_money"    />
         <result property="isShare"    column="is_share"    />
         <result property="appId"    column="app_id"    />
+        <result property="appId"    column="app_id"    />
+        <result property="shareTime" column="share_time"  />
+        <result property="shareDate" column="share_date"  />
     </resultMap>
 
     <sql id="selectFsStorePaymentVo">
-        select payment_id, pay_code,is_share,share_status,share_code,share_money,business_code,pay_mode, pay_type_code,company_id,company_user_id, pay_money, pay_time, create_time, trade_no, user_id, open_id, business_type, business_id, status, remark, bank_transaction_id, bank_serial_no, refund_money, refund_time, store_id,app_id, mer_config_id from fs_store_payment
+        select payment_id, pay_code,is_share,share_status,share_code,share_money,business_code,pay_mode, pay_type_code,company_id,company_user_id, pay_money, pay_time, create_time, trade_no, user_id, open_id, business_type, business_id, status, remark, bank_transaction_id, bank_serial_no, refund_money, refund_time, store_id,app_id, mer_config_id, share_time, share_date from fs_store_payment
     </sql>
 
     <select id="selectFsStorePaymentList" parameterType="FsStorePayment" resultMap="FsStorePaymentResult">
@@ -98,6 +101,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isShare != null">is_share,</if>
             <if test="appId != null">app_id,</if>
             <if test="merConfigId != null">mer_config_id,</if>
+            <if test="shareTime != null">share_time,</if>
+            <if test="shareDate != null">share_date,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="payCode != null">#{payCode},</if>
@@ -127,6 +132,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isShare != null">#{isShare},</if>
             <if test="appId != null">#{appId},</if>
             <if test="merConfigId != null">#{merConfigId},</if>
+            <if test="shareTime != null">#{shareTime},</if>
+            <if test="shareDate != null">#{shareDate},</if>
          </trim>
     </insert>
 
@@ -159,6 +166,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="shareMoney != null">share_money = #{shareMoney},</if>
             <if test="isShare != null">is_share = #{isShare},</if>
             <if test="appId != null">app_id = #{appId},</if>
+            <if test="shareTime != null">share_time = #{shareTime},</if>
+            <if test="shareDate != null">share_date = #{shareDate},</if>
         </trim>
         where payment_id = #{paymentId}
     </update>