2 Revize 477048624c ... 7603b03919

Autor SHA1 Zpráva Datum
  xgb 7603b03919 分账功能修改 před 6 dny
  xgb d2b83b526f 分账配置 před 1 týdnem
20 změnil soubory, kde provedl 484 přidání a 18 odebrání
  1. 84 4
      fs-admin/src/main/java/com/fs/his/controller/FsCompanyController.java
  2. 24 0
      fs-admin/src/main/java/com/fs/his/controller/FsCompanyDivItemController.java
  3. 5 0
      fs-service/src/main/java/com/fs/company/domain/CompanyDivItem.java
  4. 5 0
      fs-service/src/main/java/com/fs/company/service/ICompanyDivItemService.java
  5. 19 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyDivItemServiceImpl.java
  6. 1 0
      fs-service/src/main/java/com/fs/erp/service/impl/WdtErpOrderServiceImpl.java
  7. 3 1
      fs-service/src/main/java/com/fs/his/service/impl/FsStoreAfterSalesServiceImpl.java
  8. 1 1
      fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java
  9. 5 0
      fs-service/src/main/java/com/fs/hisStore/domain/FsStorePaymentScrm.java
  10. 23 0
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreAfterSalesScrmServiceImpl.java
  11. 23 0
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
  12. 27 0
      fs-service/src/main/java/com/fs/huifuPay/domain/HuiFuConfirmOrder.java
  13. 30 1
      fs-service/src/main/java/com/fs/huifuPay/sdk/opps/core/request/V2TradePaymentDelaytransConfirmRequest.java
  14. 15 0
      fs-service/src/main/java/com/fs/huifuPay/sdk/opps/core/request/V2TradePaymentScanpayRefundRequest.java
  15. 149 9
      fs-service/src/main/java/com/fs/huifuPay/sdk/opps/core/utils/HuiFuUtils.java
  16. 3 0
      fs-service/src/main/java/com/fs/huifuPay/service/HuiFuService.java
  17. 37 1
      fs-service/src/main/java/com/fs/huifuPay/service/impl/HuiFuServiceImpl.java
  18. 6 1
      fs-service/src/main/resources/mapper/company/CompanyDivItemMapper.xml
  19. 16 0
      fs-user-app/src/main/java/com/fs/app/controller/store/PayScrmController.java
  20. 8 0
      fs-user-app/src/main/java/com/fs/app/controller/store/StoreOrderScrmController.java

+ 84 - 4
fs-admin/src/main/java/com/fs/his/controller/FsCompanyController.java

@@ -15,11 +15,9 @@ import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyDeduct;
 import com.fs.company.domain.CompanyRecharge;
 import com.fs.company.param.CompanyDeductParam;
+import com.fs.company.param.CompanyDivConfigUpdateParam;
 import com.fs.company.param.CompanyRechargeParam;
-import com.fs.company.service.ICompanyDeductService;
-import com.fs.company.service.ICompanyRechargeService;
-import com.fs.company.service.ICompanyService;
-import com.fs.company.service.ICompanyUserService;
+import com.fs.company.service.*;
 import com.fs.company.vo.CompanyVO;
 import com.fs.core.utils.OrderCodeUtils;
 import com.fs.course.config.CourseConfig;
@@ -70,6 +68,8 @@ public class FsCompanyController extends BaseController
     private ICompanyDeductService deductService;
     @Autowired
     private ISysConfigService configService;
+    @Autowired
+    private ICompanyDivConfigService companyDivConfigService;
     /**
      * 查询诊所管理列表
      */
@@ -217,6 +217,65 @@ public class FsCompanyController extends BaseController
 
     }
 
+
+    /**
+     * @Description: 红包充值功能 因公司余额的变动关联的地方太多,现在把充值红包的金额单独提出来 不合计到公司余额中
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2025/11/3 11:08
+     */
+    @PreAuthorize("@ss.hasPermi('his:company:redRecharge')")
+    @Log(title = "红包充值", businessType = BusinessType.INSERT)
+    @PostMapping(value = "/redRecharge")
+    @Transactional
+    @RepeatSubmit
+    public R redRecharge(@RequestBody CompanyRechargeParam param)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        CompanyRecharge redRecharge=new CompanyRecharge();
+        String orderSn =  OrderCodeUtils.getOrderSn();
+        if(StringUtils.isEmpty(orderSn)){
+            return R.error("订单生成失败,请重试");
+        }
+        redRecharge.setRechargeNo(orderSn);
+        redRecharge.setCompanyId(param.getCompanyId());
+        redRecharge.setMoney(param.getMoney());
+        redRecharge.setCreateUserId(loginUser.getUser().getUserId());
+        redRecharge.setIsAudit(0);
+        redRecharge.setStatus(0);
+        redRecharge.setRemark(param.getRemark());
+        redRecharge.setPayType(3);
+        redRecharge.setBusinessType(1);// 红包充值
+        rechargeService.insertCompanyRecharge(redRecharge);
+        return R.ok("提交成功,等待审核");
+
+    }
+
+    @PreAuthorize("@ss.hasPermi('his:company:redDeduct')")
+    @Log(title = "企业扣款", businessType = BusinessType.INSERT)
+    @PostMapping(value = "/redDeduct")
+    @Transactional
+    @RepeatSubmit
+    public R redDeduct(@RequestBody CompanyDeductParam param)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        CompanyDeduct deduct=new CompanyDeduct();
+        String orderSn =  OrderCodeUtils.getOrderSn();
+        if(StringUtils.isEmpty(orderSn)){
+            return R.error("订单生成失败,请重试");
+        }
+        deduct.setDeductNo(orderSn);
+        deduct.setCompanyId(param.getCompanyId());
+        deduct.setMoney(param.getMoney());
+        deduct.setCreateUserId(loginUser.getUser().getUserId());
+        deduct.setIsAudit(0);
+        deduct.setRemark(param.getRemark());
+        deduct.setBusinessType(1); // 红包扣款
+        deductService.insertCompanyDeduct(deduct);
+        return R.ok("提交成功,等待审核");
+    }
+
     @PreAuthorize("@ss.hasPermi('his:company:deduct')")
     @Log(title = "企业扣款", businessType = BusinessType.INSERT)
     @PostMapping(value = "/deduct")
@@ -241,4 +300,25 @@ public class FsCompanyController extends BaseController
         deductService.insertCompanyDeduct(deduct);
         return R.ok("提交成功,等待审核");
     }
+
+    /**
+     * 获取公司分账配置详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('his:companyDivConfig:query')")
+    @GetMapping(value = "/getDivConfig/{companyId}")
+    public AjaxResult getDivConfig(@PathVariable("companyId") Long companyId)
+    {
+        return AjaxResult.success(companyDivConfigService.selectCompanyDivConfigByCompanyId(companyId));
+    }
+
+    /**
+     * 公司分账配置
+     */
+    @PreAuthorize("@ss.hasPermi('his:companyDivConfig:set')")
+    @Log(title = "公司分账配置", businessType = BusinessType.UPDATE)
+    @PostMapping("/setDiv")
+    public R setDiv(@RequestBody CompanyDivConfigUpdateParam param)
+    {
+        return companyDivConfigService.setDiv(param);
+    }
 }

+ 24 - 0
fs-admin/src/main/java/com/fs/his/controller/FsCompanyDivItemController.java

@@ -1,6 +1,8 @@
 package com.fs.his.controller;
 
 import java.util.List;
+
+import com.fs.common.core.domain.R;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -68,6 +70,28 @@ public class FsCompanyDivItemController extends BaseController
         return AjaxResult.success(companyDivItemService.selectCompanyDivItemById(id));
     }
 
+    /**
+     * 分账确认
+     */
+    @PreAuthorize("@ss.hasPermi('his:divItem:confirm')")
+    @Log(title = "延迟分账确认", businessType = BusinessType.UPDATE)
+    @PostMapping("/confirm")
+    public R confirm(@RequestBody List<String> payCodes)
+    {
+        return companyDivItemService.confirmByPayCodes(payCodes);
+    }
+
+    /**
+     * 分账确认Scrm
+     */
+    @PreAuthorize("@ss.hasPermi('his:divItem:confirm')")
+    @Log(title = "延迟分账确认", businessType = BusinessType.UPDATE)
+    @PostMapping("/confirmScrm")
+    public R confirmScrm(@RequestBody List<String> payCodes)
+    {
+        return companyDivItemService.confirmByPayCodesScrm(payCodes);
+    }
+
 //    /**
 //     * 新增分账明细
 //     */

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

@@ -52,4 +52,9 @@ public class CompanyDivItem extends BaseEntity{
     private Integer isRefund;
 
 
+    /** 延迟交易状态: (实时分账 null) 0:未确认 1:已确认 */
+    @Excel(name = "是否退款 0否 1是")
+    private Integer delayStatus;
+
+
 }

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

@@ -2,6 +2,7 @@ package com.fs.company.service;
 
 import java.util.List;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.common.core.domain.R;
 import com.fs.company.domain.CompanyDivItem;
 
 /**
@@ -62,4 +63,8 @@ public interface ICompanyDivItemService extends IService<CompanyDivItem>{
     CompanyDivItem selectCompanyDivItemByOrderCode(String orderCode);
 
     CompanyDivItem selectCompanyDivItemByPayCode(String payCode);
+
+    R confirmByPayCodes(List<String> payCodes);
+
+    R confirmByPayCodesScrm(List<String> payCodes);
 }

+ 19 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyDivItemServiceImpl.java

@@ -1,8 +1,11 @@
 package com.fs.company.service.impl;
 
 import java.util.List;
+
+import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.huifuPay.sdk.opps.core.utils.HuiFuUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.fs.company.mapper.CompanyDivItemMapper;
@@ -101,4 +104,20 @@ public class CompanyDivItemServiceImpl extends ServiceImpl<CompanyDivItemMapper,
     public CompanyDivItem selectCompanyDivItemByPayCode(String payCode) {
         return baseMapper.selectCompanyDivItemByPayCode(payCode);
     }
+
+    @Override
+    public R confirmByPayCodes(List<String> payCodes) {
+        if (payCodes != null && !payCodes.isEmpty()) {
+            payCodes.forEach(HuiFuUtils::confirmByPayCode);
+        }
+        return R.ok();
+    }
+
+    @Override
+    public R confirmByPayCodesScrm(List<String> payCodes) {
+        if (payCodes != null && !payCodes.isEmpty()) {
+            payCodes.forEach(HuiFuUtils::confirmByPayCodeScrm);
+        }
+        return R.ok();
+    }
 }

+ 1 - 0
fs-service/src/main/java/com/fs/erp/service/impl/WdtErpOrderServiceImpl.java

@@ -1363,6 +1363,7 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
                 log.info("订单推送成功: {}", response);
                 ErpOrderResponse erpOrderResponse = new ErpOrderResponse();
                 erpOrderResponse.setCode(order.getPlatform_code());
+                erpOrderResponse.setSuccess(true);
                 return erpOrderResponse;
             } else {
                 // throw new RuntimeException(String.format("订单推送失败,原因: %s",erpWdtApiResponse.getMessage()));

+ 3 - 1
fs-service/src/main/java/com/fs/his/service/impl/FsStoreAfterSalesServiceImpl.java

@@ -557,18 +557,20 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
                 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);
+                    companyDivItem = HuiFuUtils.doRefundDiv(fsStoreOrder.getPayPrice(), reMoney, payment.getPayCode(), 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"))) {

+ 1 - 1
fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java

@@ -520,7 +520,7 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
                 //1.判断是否是全额退款
                 CompanyDivItem companyDivItem = null;
                 try {
-                    companyDivItem = HuiFuUtils.doRefundDiv(fsStorePayment.getPayMoney(), fsStorePayment.getPayMoney(), fsStorePayment, extendInfoMap);
+                    companyDivItem = HuiFuUtils.doRefundDiv(fsStorePayment.getPayMoney(), fsStorePayment.getPayMoney(), fsStorePayment.getPayCode(), extendInfoMap);
                 } catch (Exception e) {
                     logger.error("-----------------分账退款处理失败{}", e.getMessage());
                 }

+ 5 - 0
fs-service/src/main/java/com/fs/hisStore/domain/FsStorePaymentScrm.java

@@ -101,5 +101,10 @@ public class FsStorePaymentScrm extends BaseEntity
     private BigDecimal shareMoney;
     private Integer isShare;
 
+    //小程序appId(用于多汇付支付/退款)
+    private String appId;
+
+    // 商户配置ID (用于多汇付支付/退款) 切换汇付后需要查询历史汇付配置信息退款
+    private Long merConfigId;
 
 }

+ 23 - 0
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreAfterSalesScrmServiceImpl.java

@@ -14,6 +14,8 @@ import com.fs.common.exception.CustomException;
 import com.fs.common.utils.CloudHostUtils;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
+import com.fs.company.domain.CompanyDivItem;
+import com.fs.company.service.ICompanyDivItemService;
 import com.fs.company.service.ICompanyService;
 import com.fs.core.config.WxPayProperties;
 import com.fs.core.utils.OrderCodeUtils;
@@ -38,6 +40,7 @@ import com.fs.hisStore.mapper.*;
 import com.fs.hisStore.param.*;
 import com.fs.huifuPay.domain.HuiFuRefundResult;
 import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayRefundRequest;
+import com.fs.huifuPay.sdk.opps.core.utils.HuiFuUtils;
 import com.fs.huifuPay.service.HuiFuService;
 import com.fs.pay.service.IPayService;
 import com.fs.hisStore.config.StoreConfig;
@@ -191,6 +194,9 @@ public class FsStoreAfterSalesScrmServiceImpl implements IFsStoreAfterSalesScrmS
     @Autowired
     private IFsStoreOrderLogsService fsStoreOrderLogsService;
 
+    @Autowired
+    private ICompanyDivItemService companyDivItemService;
+
     /**
      * 查询售后记录
      *
@@ -757,6 +763,14 @@ public class FsStoreAfterSalesScrmServiceImpl implements IFsStoreAfterSalesScrmS
                         Map<String, Object> extendInfoMap = new HashMap<>();
                         extendInfoMap.put("org_party_order_id", payment.getBankSerialNo());
                         request.setExtendInfo(extendInfoMap);
+                        //处理分账退款
+                        //1.判断是否是全额退款
+                        CompanyDivItem companyDivItem = null;
+                        try {
+                            companyDivItem = HuiFuUtils.doRefundDiv(payment.getPayMoney(), refundAmount, payment.getPayCode(), extendInfoMap);
+                        } catch (Exception e) {
+                            logger.error("-----------------分账退款处理失败{}", e.getMessage());
+                        }
                         HuiFuRefundResult refund = huiFuService.refund(request);
                         logger.info("退款:"+refund);
                         if((refund.getResp_code().equals("00000000")||refund.getResp_code().equals("00000100"))&&(refund.getTrans_stat().equals("S")||refund.getTrans_stat().equals("P"))){
@@ -764,6 +778,15 @@ public class FsStoreAfterSalesScrmServiceImpl implements IFsStoreAfterSalesScrmS
                             payment.setStatus(-1);
                             payment.setRefundTime(new Date());
                             paymentService.updateFsStorePayment(payment);
+                            try {
+                                //处理分账退款明细表
+                                if (companyDivItem !=null && companyDivItem.getId() != null) {
+                                    companyDivItem.setIsRefund(1);
+                                    companyDivItemService.updateCompanyDivItem(companyDivItem);
+                                }
+                            } catch (Exception e) {
+                                logger.error("-----------------分账退款明细处理失败{}", e.getMessage());
+                            }
                         }else {
                             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                             return R.error(refund.getResp_desc());

+ 23 - 0
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -31,6 +31,7 @@ import com.fs.company.mapper.CompanyMapper;
 import com.fs.company.mapper.CompanyMoneyLogsMapper;
 import com.fs.company.mapper.CompanyUserUserMapper;
 import com.fs.company.service.ICompanyDeptService;
+import com.fs.company.service.ICompanyDivItemService;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.core.config.WxMaConfiguration;
@@ -68,6 +69,7 @@ import com.fs.hisapi.param.RecipeDetailParam;
 import com.fs.hisapi.service.HisApiService;
 import com.fs.huifuPay.domain.HuiFuRefundResult;
 import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayRefundRequest;
+import com.fs.huifuPay.sdk.opps.core.utils.HuiFuUtils;
 import com.fs.huifuPay.service.HuiFuService;
 import com.fs.pay.pay.dto.RefundDTO;
 import com.fs.pay.service.IPayService;
@@ -314,6 +316,9 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
     @Autowired
     private FsPackageOrderMapper fsPackageOrderMapper;
 
+    @Autowired
+    private ICompanyDivItemService companyDivItemService;
+
     /**
      * 查询订单
      *
@@ -2169,6 +2174,15 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                         Map<String, Object> extendInfoMap = new HashMap<>();
                         extendInfoMap.put("org_party_order_id", payment.getBankSerialNo());
                         request.setExtendInfo(extendInfoMap);
+
+                        //处理分账退款
+                        //1.判断是否是全额退款
+                        CompanyDivItem companyDivItem = null;
+                        try {
+                            companyDivItem = HuiFuUtils.doRefundDiv(payment.getPayMoney(), payment.getPayMoney(), payment.getPayCode(), extendInfoMap);
+                        } catch (Exception e) {
+                            logger.error("-----------------分账退款处理失败{}", e.getMessage());
+                        }
                         HuiFuRefundResult refund = huiFuService.refund(request);
                         logger.info("退款:"+refund);
                         if((refund.getResp_code().equals("00000000")||refund.getResp_code().equals("00000100"))&&(refund.getTrans_stat().equals("S")||refund.getTrans_stat().equals("P"))){
@@ -2176,6 +2190,15 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                             payment.setStatus(-1);
                             payment.setRefundTime(new Date());
                             paymentService.updateFsStorePayment(payment);
+                            try {
+                                //处理分账退款明细表
+                                if (companyDivItem !=null && companyDivItem.getId() != null) {
+                                    companyDivItem.setIsRefund(1);
+                                    companyDivItemService.updateCompanyDivItem(companyDivItem);
+                                }
+                            } catch (Exception e) {
+                                logger.error("-----------------分账退款明细处理失败{}", e.getMessage());
+                            }
                         }else {
                             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                             return R.error(refund.getResp_desc());

+ 27 - 0
fs-service/src/main/java/com/fs/huifuPay/domain/HuiFuConfirmOrder.java

@@ -0,0 +1,27 @@
+package com.fs.huifuPay.domain;
+
+import lombok.Data;
+
+@Data
+public class HuiFuConfirmOrder {
+//    T_JSAPI: 微信公众号
+//    T_MINIAPP: 微信小程序
+//    A_JSAPI: 支付宝JS
+//    A_NATIVE: 支付宝正扫
+//    U_NATIVE: 银联正扫
+//    U_JSAPI: 银联JS
+//    D_NATIVE: 数字人民币正扫
+//    T_H5:微信直连H5支付
+//    T_APP:微信APP支付(只支持直连)
+//    T_NATIVE:微信正扫(只支持直连)
+    String tradeType;
+    String reqSeqId;
+    String transAmt;
+    String goodsDesc;
+    String openid;
+    String appId; //多小程序支付
+    String acctSplitBunch; //公司分账参数
+    String delayAcctFlag; //延时交易 延迟分账需要
+    String orgReqSeqId; //原交易请求流水号
+    String orgReqDate; //原交易请求日期
+}

+ 30 - 1
fs-service/src/main/java/com/fs/huifuPay/sdk/opps/core/request/V2TradePaymentDelaytransConfirmRequest.java

@@ -27,6 +27,18 @@ public class V2TradePaymentDelaytransConfirmRequest extends BaseRequest {
     @JSONField(name = "huifu_id")
     private String huifuId;
 
+    /**
+     * 原交易请求流水号
+     */
+    @JSONField(name = "org_req_seq_id")
+    private String orgReqSeqId;
+
+    /**
+     * 原交易请求日期
+     */
+    @JSONField(name = "org_req_date")
+    private String orgReqDate;
+
     @Override
     public FunctionCodeEnum getFunctionCode() {
         return FunctionCodeEnum.V2_TRADE_PAYMENT_DELAYTRANS_CONFIRM;
@@ -35,10 +47,12 @@ public class V2TradePaymentDelaytransConfirmRequest extends BaseRequest {
     public V2TradePaymentDelaytransConfirmRequest() {
     }
 
-    public V2TradePaymentDelaytransConfirmRequest(String reqDate, String reqSeqId, String huifuId) {
+    public V2TradePaymentDelaytransConfirmRequest(String reqDate, String reqSeqId, String huifuId,String orgReqSeqId,String orgReqDate) {
         this.reqDate = reqDate;
         this.reqSeqId = reqSeqId;
         this.huifuId = huifuId;
+        this.orgReqSeqId = orgReqSeqId;
+        this.orgReqDate = orgReqDate;
     }
 
     public String getReqDate() {
@@ -65,4 +79,19 @@ public class V2TradePaymentDelaytransConfirmRequest extends BaseRequest {
         this.huifuId = huifuId;
     }
 
+    public String getOrgReqSeqId() {
+        return orgReqSeqId;
+    }
+
+    public void setOrgReqSeqId(String orgReqSeqId) {
+        this.orgReqSeqId = orgReqSeqId;
+    }
+
+    public String getOrgReqDate() {
+        return orgReqDate;
+    }
+
+    public void setOrgReqDate(String orgReqDate) {
+        this.orgReqDate = orgReqDate;
+    }
 }

+ 15 - 0
fs-service/src/main/java/com/fs/huifuPay/sdk/opps/core/request/V2TradePaymentScanpayRefundRequest.java

@@ -52,6 +52,12 @@ public class V2TradePaymentScanpayRefundRequest extends BaseRequest {
     private String acctSplitBunch;
 
 
+    /**
+     *小程序
+     * **/
+    private String appId;
+
+
     @Override
     public FunctionCodeEnum getFunctionCode() {
         return FunctionCodeEnum.V2_TRADE_PAYMENT_SCANPAY_REFUND;
@@ -124,4 +130,13 @@ public class V2TradePaymentScanpayRefundRequest extends BaseRequest {
     public void setAcctSplitBunch(String acctSplitBunch) {
         this.acctSplitBunch = acctSplitBunch;
     }
+
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
 }

+ 149 - 9
fs-service/src/main/java/com/fs/huifuPay/sdk/opps/core/utils/HuiFuUtils.java

@@ -2,6 +2,7 @@ package com.fs.huifuPay.sdk.opps.core.utils;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.spring.SpringUtils;
 import com.fs.company.domain.CompanyDivItem;
@@ -19,17 +20,26 @@ import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
 import com.google.gson.Gson;
+import com.fs.his.mapper.FsStorePaymentMapper;
+import com.fs.hisStore.domain.FsStorePaymentScrm;
+import com.fs.hisStore.mapper.FsStorePaymentScrmMapper;
+import com.fs.huifuPay.domain.HuiFuConfirmOrder;
+import com.fs.huifuPay.domain.HuiFuCreateOrder;
+import com.fs.huifuPay.domain.HuiFuQueryOrderResult;
+import com.fs.huifuPay.service.HuiFuService;
+import lombok.extern.slf4j.Slf4j;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
+@Slf4j
 public class HuiFuUtils {
     private static ICompanyDivConfigService companyDivConfigService = SpringUtils.getBean(ICompanyDivConfigService.class);
     private static ICompanyDivItemService companyDivItemService = SpringUtils.getBean(ICompanyDivItemService.class);
+    private static FsStorePaymentMapper fsStorePaymentMapper = SpringUtils.getBean(FsStorePaymentMapper.class);
+    private static FsStorePaymentScrmMapper fsStorePaymentScrmMapper = SpringUtils.getBean(FsStorePaymentScrmMapper.class);
+    private static HuiFuService huiFuService = SpringUtils.getBean(HuiFuService.class);
 
     /**
      *  处理分账
@@ -148,18 +158,25 @@ public class HuiFuUtils {
 
     public static void saveDivItem(HuiFuCreateOrder o, String orderCode, String payCode) {
         CompanyDivItem companyDivItem = new CompanyDivItem();
-        if (StringUtils.isNotBlank(o.getAcctSplitBunch())){
+        if (StringUtils.isNotBlank(o.getAcctSplitBunch())) {
             companyDivItem.setOrderCode(orderCode);
             companyDivItem.setPayCode(payCode);
             companyDivItem.setDetail(o.getAcctSplitBunch());
             companyDivItem.setIsRefund(0); //支付
-            companyDivItem.setIsDelay(0); //延迟分账
+            if (StringUtils.isNotBlank(o.getDelayAcctFlag()) && o.getDelayAcctFlag().equals("Y")) {
+                companyDivItem.setIsDelay(1); //延迟分账
+
+            } else {
+                companyDivItem.setIsDelay(0);
+                companyDivItem.setDelayStatus(0);
+            }
             companyDivItemService.insertCompanyDivItem(companyDivItem);
         }
     }
 
     /**
      * 回调修改分账明细状态
+     *
      * @param payCode
      */
     public static void updateDivItem(String payCode) {
@@ -168,6 +185,24 @@ public class HuiFuUtils {
         if (companyDivItem != null) {
             companyDivItem.setIsPay(1);
             companyDivItemService.updateCompanyDivItem(companyDivItem);
+            try {
+                //查询是否分账payment
+                FsStorePayment fsStorePayment = fsStorePaymentMapper.selectFsStorePaymentByPaymentCode(payCode);
+                if (fsStorePayment == null) {
+                    FsStorePaymentScrm fsStorePaymentScrm = fsStorePaymentScrmMapper.selectFsStorePaymentByPaymentCode(payCode);
+                    if (fsStorePaymentScrm != null) {
+                        fsStorePaymentScrm.setShareStatus(1);
+                        fsStorePaymentScrm.setShareMoney(fsStorePaymentScrm.getPayMoney());
+                        fsStorePaymentScrmMapper.updateFsStorePayment(fsStorePaymentScrm);
+                    }
+                } else {
+                    fsStorePayment.setShareStatus(1);
+                    fsStorePayment.setShareMoney(fsStorePayment.getPayMoney());
+                    fsStorePaymentMapper.updateFsStorePayment(fsStorePayment);
+                }
+            } catch (Exception e) {
+                log.error("更新payment表分账状态失败{}", e.getMessage());
+            }
         }
     }
 
@@ -177,12 +212,12 @@ public class HuiFuUtils {
      * 处理分账退款
      *
      * @param reMoney
-     * @param payment
+     * @param payCode
      * @param extendInfoMap
      */
-    public static CompanyDivItem doRefundDiv(BigDecimal payPrice,BigDecimal reMoney, FsStorePayment payment, Map<String, Object> extendInfoMap) {
+    public static CompanyDivItem doRefundDiv(BigDecimal payPrice,BigDecimal reMoney,String payCode , Map<String, Object> extendInfoMap) {
         CompanyDivItem companyDivItem = null;
-        companyDivItem = companyDivItemService.selectCompanyDivItemByPayCode(payment.getPayCode());
+        companyDivItem = companyDivItemService.selectCompanyDivItemByPayCode(payCode);
         if (companyDivItem != null) {
             if (payPrice.compareTo(reMoney) > 0) {
                 //部分退款
@@ -251,4 +286,109 @@ public class HuiFuUtils {
         return companyDivItem;
 
     }
+
+    public static void confirmByOrderCode(String orderCode) {
+        FsStorePayment queryParam = new FsStorePayment();
+        queryParam.setBusinessCode(orderCode);
+        queryParam.setStatus(1);
+        List<FsStorePayment> fsStorePayments = fsStorePaymentMapper.selectFsStorePaymentList(queryParam);
+        if (!fsStorePayments.isEmpty()) {
+            FsStorePayment fsStorePayment = fsStorePayments.get(0);
+            Integer businessType = fsStorePayment.getBusinessType();
+            String appId = fsStorePayment.getAppId();
+            Date payTime = fsStorePayment.getPayTime();
+            String payCode = fsStorePayment.getPayCode();
+            confirm(payCode, businessType, appId, payTime);
+        }
+    }
+
+    public static void confirmByPayCode(String payCode) {
+        FsStorePayment fsStorePayment = fsStorePaymentMapper.selectFsStorePaymentByPaymentCode(payCode);
+        if (fsStorePayment == null){
+            confirmByPayCodeScrm(payCode);
+        } else {
+            Integer businessType = fsStorePayment.getBusinessType();
+            String appId = fsStorePayment.getAppId();
+            Date payTime = fsStorePayment.getPayTime();
+            confirm(payCode, businessType, appId, payTime);
+        }
+    }
+
+
+    public static void confirmByPayCodeScrm(String payCode) {
+        FsStorePaymentScrm fsStorePayment = fsStorePaymentScrmMapper.selectFsStorePaymentByPaymentCode(payCode);
+        if (fsStorePayment != null) {
+            Integer businessType = fsStorePayment.getBusinessType();
+            String appId = fsStorePayment.getAppId();
+            Date payTime = fsStorePayment.getPayTime();
+            confirm(payCode, businessType, appId, payTime);
+        }
+    }
+
+    private static void confirm(String payCode, Integer businessType, String appId,Date payTime) {
+        CompanyDivItem companyDivItem = companyDivItemService.selectCompanyDivItemByPayCode(payCode);
+        if (companyDivItem != null) {
+            if (companyDivItem.getIsDelay() != null && companyDivItem.getIsDelay() == 1) {
+                //延时分账 确认订单分账
+                HuiFuConfirmOrder confirmOrder = new HuiFuConfirmOrder();
+                String orgReqSeqId = payCode;
+                switch (businessType) {
+                    case 1:
+                        orgReqSeqId = "inquiry-" + orgReqSeqId;
+                        break;
+                    case 2:
+                        orgReqSeqId = "store-" + orgReqSeqId;
+                        break;
+                    case 3:
+                        orgReqSeqId = "package-" + orgReqSeqId;
+                        break;
+                    case 4:
+                        orgReqSeqId = "course-" + orgReqSeqId;
+                        break;
+                    case 5:
+                        orgReqSeqId = "appvip-" + orgReqSeqId;
+                        break;
+                    case 6:
+                        orgReqSeqId = "integral-" + orgReqSeqId;
+                        break;
+                    case 7:
+                        orgReqSeqId = "payment-" + orgReqSeqId;
+                        break;
+                }
+                confirmOrder.setOrgReqSeqId(orgReqSeqId);
+                if (payTime == null) {
+                    return;
+                }
+                confirmOrder.setOrgReqDate(DateUtils.parseDateToStr("yyyyMMdd", payTime));
+                confirmOrder.setAppId(appId);
+                HuiFuQueryOrderResult huiFuResult = huiFuService.delayTransConfirm(confirmOrder);
+                /**
+                 * {
+                 * 	"org_req_date": "20251111",
+                 * 	"resp_desc": "交易成功",
+                 * 	"trans_stat": "S",
+                 * 	"org_hf_seq_id": "002900TOP2A251111092843P250ac139c1400000",
+                 * 	"confirmed_amt": "0.02",
+                 * 	"hf_seq_id": "003500TOP3A251111101202P443ac13696f00000",
+                 * 	"org_mer_ord_id": "package-1988056235747835904",
+                 * 	"org_req_seq_id": "package-1988056235747835904",
+                 * 	"unconfirm_amt": "0.00",
+                 * 	"req_seq_id": "202511111011597366vxgcpozqvirxg",
+                 * 	"req_date": "20251111",
+                 * 	"resp_code": "00000000",
+                 * 	"acct_resp_desc": "成功",
+                 * 	"huifu_id": "6666000171179317",
+                 * 	"acct_split_bunch": "{\"acct_infos\":[{\"acct_id\":\"F13245119\",\"div_amt\":\"0.01\",\"huifu_id\":\"6666000181121137\",\"split_fee_acct_id\":\"F13245119\",\"split_fee_amt\":\"0.00\",\"split_fee_huifu_id\":\"6666000181121137\"},{\"acct_id\":\"F08847757\",\"div_amt\":\"0.01\",\"huifu_id\":\"6666000171179317\"}]}",
+                 * 	"acct_resp_code": "000"
+                 * }
+                 */
+                if (huiFuResult != null) {
+                    if ("00000000".equals(huiFuResult.getResp_code())) {
+                        companyDivItem.setDelayStatus(1);
+                        companyDivItemService.updateCompanyDivItem(companyDivItem);
+                    }
+                }
+            }
+        }
+    }
 }

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

@@ -36,4 +36,7 @@ public interface HuiFuService {
     /**余额支付退款查询**/
     acctPayRefundQueryResult acctPayRefundQuery(V2TradeAcctpaymentRefundQueryRequest request)throws Exception;
 
+    /**延迟分账 交易确认接口**/
+    HuiFuQueryOrderResult delayTransConfirm(HuiFuConfirmOrder request);
+
 }

+ 37 - 1
fs-service/src/main/java/com/fs/huifuPay/service/impl/HuiFuServiceImpl.java

@@ -70,7 +70,12 @@ public class HuiFuServiceImpl implements HuiFuService {
             // 禁用信用卡标记
             extendInfoMap.put("limit_pay_type", "NO_CREDIT");
             // 是否延迟交易
-            extendInfoMap.put("delay_acct_flag", "N");
+            if(StringUtils.isNotBlank(order.getDelayAcctFlag()) && order.getDelayAcctFlag().equals("Y")){
+                extendInfoMap.put("delay_acct_flag", "Y");
+            } else {
+                extendInfoMap.put("delay_acct_flag", "N");
+            }
+
             extendInfoMap.put("pay_scene", "02");
             if (StringUtils.isNotBlank(order.getAcctSplitBunch())){
                 extendInfoMap.put("acct_split_bunch", order.getAcctSplitBunch());
@@ -271,6 +276,37 @@ public class HuiFuServiceImpl implements HuiFuService {
         return result;
     }
 
+    @Override
+    public HuiFuQueryOrderResult delayTransConfirm(HuiFuConfirmOrder order){
+        HuiFuQueryOrderResult result =null;
+        try {
+            if (order.getAppId() != null) {
+                //多汇付支付获取配置
+                doInit(getMerConfig());
+            } else {
+                doInit(getMerConfig());
+            }
+            V2TradePaymentDelaytransConfirmRequest request = new V2TradePaymentDelaytransConfirmRequest();
+            request.setReqDate(DateTools.getCurrentDateYYYYMMDD());
+            request.setReqSeqId(SequenceTools.getReqSeqId32());
+            request.setOrgReqSeqId(order.getOrgReqSeqId()); //	原交易请求流水号
+            request.setOrgReqDate(order.getOrgReqDate()); //	原交易请求流水号
+
+            logger.info("汇付确认交易传参:"+JSON.toJSONString(request));
+            Map<String, Object> response = doExecute(request);
+            logger.info("汇付返回:"+response);
+            String jsonString = JSONObject.toJSONString(response);
+            logger.info("汇付返回:"+jsonString);
+            result = JSON.parseObject(jsonString, HuiFuQueryOrderResult.class);
+
+        }catch (Exception e){
+            logger.info("汇付确认交易失败 :"+e);
+            e.printStackTrace();
+            throw  new CustomException("汇付确认交易失败");
+        }
+        return result;
+    }
+
 
     public MerConfig getMerConfig(){
         SysConfigMapper sysConfigMapper= SpringUtils.getBean(SysConfigMapper.class);

+ 6 - 1
fs-service/src/main/resources/mapper/company/CompanyDivItemMapper.xml

@@ -19,7 +19,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 
     <sql id="selectCompanyDivItemVo">
-        select id, order_code, pay_code, detail,refund_detail,is_pay, is_delay, is_refund, create_time, update_time from company_div_item
+        select id, order_code, pay_code, detail,refund_detail,is_pay, is_delay, is_refund, create_time, update_time,delay_status from company_div_item
     </sql>
 
     <select id="selectCompanyDivItemList" parameterType="CompanyDivItem" resultMap="CompanyDivItemResult">
@@ -32,6 +32,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isPay != null "> and is_pay = #{isPay}</if>
             <if test="isDelay != null "> and is_delay = #{isDelay}</if>
             <if test="isRefund != null "> and is_refund = #{isRefund}</if>
+            <if test="delayStatus != null "> and (delay_status = #{delayStatus} or delay_status is null)</if>
         </where>
         order by id desc
     </select>
@@ -61,6 +62,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isRefund != null">is_refund,</if>
             <if test="createTime != null">create_time,</if>
             <if test="updateTime != null">update_time,</if>
+            <if test="delayStatus != null">delay_status,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="orderCode != null and orderCode != ''">#{orderCode},</if>
@@ -72,6 +74,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isRefund != null">#{isRefund},</if>
             <if test="createTime != null">#{createTime},</if>
             <if test="updateTime != null">#{updateTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="delayStatus != null">#{delayStatus},</if>
          </trim>
     </insert>
 
@@ -87,6 +91,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isRefund != null">is_refund = #{isRefund},</if>
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="delayStatus != null">delay_status = #{delayStatus},</if>
         </trim>
         where id = #{id}
     </update>

+ 16 - 0
fs-user-app/src/main/java/com/fs/app/controller/store/PayScrmController.java

@@ -10,6 +10,7 @@ import com.fs.company.service.ICompanyUserService;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.hisStore.service.*;
 import com.fs.huifuPay.domain.HuiFuResult;
+import com.fs.huifuPay.sdk.opps.core.utils.HuiFuUtils;
 import com.fs.ybPay.domain.OrderCallback;
 import com.fs.ybPay.domain.OrderResult;
 import com.fs.pay.pay.dto.OrderQueryDTO;
@@ -77,10 +78,25 @@ public class PayScrmController {
             String[] order=o.getReq_seq_id().split("-");
             switch (order[0]) {
                 case "store":
+                    try {
+                        HuiFuUtils.updateDivItem(order[1]);
+                    } catch (Exception e) {
+                        logger.error("-------分账明细回调错误{}", e.getMessage());
+                    }
                     return orderService.payConfirm(1,null,order[1], o.getHf_seq_id(),o.getOut_trans_id(),o.getParty_order_id());
                 case "store_remain":
+                    try {
+                        HuiFuUtils.updateDivItem(order[1]);
+                    } catch (Exception e) {
+                        logger.error("-------分账明细回调错误{}", e.getMessage());
+                    }
                     return orderService.payRemainConfirm( order[1], o.getHf_seq_id(),o.getOut_trans_id(),o.getParty_order_id());
                 case "payment":
+                    try {
+                        HuiFuUtils.updateDivItem(order[1]);
+                    } catch (Exception e) {
+                        logger.error("-------分账明细回调错误{}", e.getMessage());
+                    }
                     return storePaymentService.payConfirm(order[1],o.getHf_seq_id(),o.getOut_trans_id(),o.getParty_order_id());
             }
 

+ 8 - 0
fs-user-app/src/main/java/com/fs/app/controller/store/StoreOrderScrmController.java

@@ -32,6 +32,7 @@ import com.fs.hisStore.vo.FsMyStoreOrderListQueryVO;
 import com.fs.hisStore.vo.FsStoreOrderItemVO;
 import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.huifuPay.domain.HuifuCreateOrderResult;
+import com.fs.huifuPay.sdk.opps.core.utils.HuiFuUtils;
 import com.fs.huifuPay.service.HuiFuService;
 import com.fs.pay.pay.dto.OrderQueryDTO;
 import com.fs.pay.service.IPayService;
@@ -368,6 +369,13 @@ public class StoreOrderScrmController extends AppBaseController {
                     if (param != null && StringUtils.isNotBlank(param.getAppId())) {
                         o.setAppId(param.getAppId());
                     }
+                    try {
+                        HuiFuUtils.doDiv(o,order.getCompanyId());
+                        //存储分账明细
+                        HuiFuUtils.saveDivItem(o, order.getOrderCode(), storePayment.getPayCode());
+                    } catch (Exception e) {
+                        logger.error("-------------分账出错:{}", e.getMessage());
+                    }
                     HuifuCreateOrderResult result = huiFuService.createOrder(o);
                     if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
                         FsStorePaymentScrm mt=new FsStorePaymentScrm();