yuhongqi před 1 týdnem
rodič
revize
fb6380cf6e

+ 1 - 0
fs-admin/src/main/java/com/fs/hisStore/controller/FsStorePaymentScrmController.java

@@ -168,6 +168,7 @@ public class FsStorePaymentScrmController extends BaseController
                     String[] order=o.getOrg_req_seq_id().split("-");
                     switch (order[0]) {
                         case "store":
+                        case "live":
                             orderService.payConfirm(1,null,order[1], o.getOrg_hf_seq_id(),o.getOut_trans_id(),o.getParty_order_id());
                             break;
                         case "store_remain":

+ 1 - 0
fs-admin/src/main/java/com/fs/hisStore/task/MallStoreTask.java

@@ -721,6 +721,7 @@ public class MallStoreTask
                 if(orderResult.getStatus().equals("100")){
                     switch (order[0]) {
                         case "store":
+                        case "live":
                             orderService.payConfirm(1,null,order[1], o.getUpOrderId(),orderResult.getBankTrxId(),orderResult.getBankOrderId());
                         case "store_remain":
                             orderService.payRemainConfirm( order[1], o.getUpOrderId(),orderResult.getBankTrxId(),orderResult.getBankOrderId());

+ 7 - 0
fs-company-app/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java

@@ -400,6 +400,13 @@ public class FsUserCourseVideoController extends AppBaseController {
         return openImResponseDTO;
     }
 
+
+    @GetMapping("/realLinkByLink")
+    @ApiOperation("根据短链link查询真实链接")
+    public R getRealLinkByLink(@RequestParam String link) {
+        return courseLinkService.getRealLink(link);
+    }
+
     @Login
     @ApiOperation("app-看课记录(包含今日完课、今日催课)")
     @GetMapping("/courseWatchLog")

+ 6 - 0
fs-company-app/src/main/java/com/fs/app/controller/LiveController.java

@@ -80,4 +80,10 @@ public class LiveController extends AppBaseController {
         return ResponseResult.ok(liveService.getGotoWxAppLiveLink(linkStr, appid));
     }
 
+    @GetMapping("/realLinkByLink")
+    @ApiOperation("根据短链link查询真实链接")
+    public R getRealLinkByLink(@RequestParam String link) {
+        return liveSortLinkService.getRealLinkByLink(link);
+    }
+
 }

+ 4 - 3
fs-service/src/main/java/com/fs/app/service/impl/AppPayServiceImpl.java

@@ -118,15 +118,16 @@ public class AppPayServiceImpl implements AppPayService {
                 inquiryOrderService.payConfirm("", tradeNoArr[1],"","",1,result.getTransactionId(),"");
                 break;
             case "store":
+            case "live":
                 storeOrderService.payConfirm(1, null,tradeNoArr[1],"",result.getTransactionId(),"");
                 break;
                 // 表示app的处方订单
             case "storeOrder":
                 fsStoreOrderService.payConfirm("", tradeNoArr[1],"","",1,result.getTransactionId(),"");
                 break;
-            case "live":
-                liveOrderService.payConfirm(1, null,tradeNoArr[1],"",result.getTransactionId(),"");
-                break;
+//            case "live":
+//                liveOrderService.payConfirm(1, null,tradeNoArr[1],"",result.getTransactionId(),"");
+//                break;
             case "package":
                 packageOrderService.payConfirm("", tradeNoArr[1],"","",1,result.getTransactionId(),"");
                 break;

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

@@ -125,6 +125,11 @@ public interface IFsStoreOrderScrmService
 
     void cancelOrder(Long orderId);
 
+    /**
+     * 退回订单优惠券(商城券 / 直播券)
+     */
+    void refundOrderCoupon(FsStoreOrderScrm order);
+
     void refundPrescribeOrder(Long orderId);
 
     void refundOrder(Long orderId);

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

@@ -1246,6 +1246,8 @@ public class FsStoreAfterSalesScrmServiceImpl implements IFsStoreAfterSalesScrmS
         if(order.getTuiUserId()!=null&&order.getTuiUserId()>0){
             userService.subTuiMoney(order);
         }
+        // 优惠券返回(直播订单走 live_coupon_user 回退)
+        orderService.refundOrderCoupon(order);
         // 删除限购记录
         this.deletePurchaseLimitRecordsForStoreOrder(order);
         return R.ok();
@@ -2050,6 +2052,8 @@ public class FsStoreAfterSalesScrmServiceImpl implements IFsStoreAfterSalesScrmS
             }
         }
 
+        // 优惠券返回(直播订单走 live_coupon_user 回退)
+        orderService.refundOrderCoupon(fsStoreOrder);
 
         return i;
     }

+ 35 - 7
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -108,8 +108,10 @@ import com.fs.huifuPay.domain.HuifuCreateOrderResult;
 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.live.domain.LiveCouponUser;
 import com.fs.live.domain.LiveOrder;
 import com.fs.live.mapper.LiveOrderMapper;
+import com.fs.live.service.ILiveCouponUserService;
 import com.fs.pay.pay.dto.OrderQueryDTO;
 import com.fs.pay.pay.dto.RefundDTO;
 import com.fs.pay.service.IPayService;
@@ -337,6 +339,8 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
     @Autowired
     private IFsStoreCouponUserScrmService couponUserService;
     @Autowired
+    private ILiveCouponUserService liveCouponUserService;
+    @Autowired
     private ICompanyService companyService;
     @Autowired
     private IFsStoreOrderItemScrmService storeOrderItemService;
@@ -2145,14 +2149,36 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
     }
 
 
+    @Override
+    public void refundOrderCoupon(FsStoreOrderScrm order) {
+        refundCoupon(order);
+    }
+
     private void refundCoupon(FsStoreOrderScrm order) {
-        if (order.getCouponId() != null) {
-            FsStoreCouponUserScrm couponUser = couponUserService.selectFsStoreCouponUserById(order.getCouponId());
-            if (couponUser != null) {
-                couponUser.setStatus(0);
-                couponUser.setUseTime(null);
-                couponUserService.updateFsStoreCouponUser(couponUser);
-            }
+        if (order == null || order.getCouponId() == null) {
+            return;
+        }
+        // 直播订单(orderType=2)couponId 存的是 live_coupon_user.id
+        if (order.getOrderType() != null && order.getOrderType() == 2) {
+            refundLiveCoupon(order.getCouponId());
+        }
+//        FsStoreCouponUserScrm couponUser = couponUserService.selectFsStoreCouponUserById(order.getCouponId());
+//        if (couponUser != null) {
+//            couponUser.setStatus(0);
+//            couponUser.setUseTime(null);
+//            couponUserService.updateFsStoreCouponUser(couponUser);
+//        }
+    }
+
+    /**
+     * 直播优惠券回退(与 LiveOrderServiceImpl#refundCoupon 一致)
+     */
+    private void refundLiveCoupon(Long couponUserId) {
+        LiveCouponUser couponUser = liveCouponUserService.selectLiveCouponUserById(couponUserId);
+        if (couponUser != null) {
+            couponUser.setStatus(0);
+            couponUser.setUseTime(null);
+            liveCouponUserService.updateLiveCouponUser(couponUser);
         }
     }
 
@@ -3658,6 +3684,8 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         if (order.getTuiUserId() != null && order.getTuiUserId() > 0) {
             userService.subTuiMoney(order);
         }
+        // 优惠券返回(含直播券)
+        this.refundCoupon(order);
         // 卓美财务要求,如果退款就必须生成售后订单
         // 检查配置,如果delete_after_sales为true,创建退款成功的售后订单
         String deleteAfterSalesConfig = configService.selectConfigByKey("delete_after_sales");

+ 5 - 0
fs-service/src/main/java/com/fs/live/service/ILiveSortLinkService.java

@@ -18,4 +18,9 @@ public interface ILiveSortLinkService {
      */
     R createAppLiveSortLink(FsLiveSortLinkParam param);
 
+    /**
+     * 根据短链 link 后缀查询 realLink
+     */
+    R getRealLinkByLink(String link);
+
 }

+ 43 - 0
fs-service/src/main/java/com/fs/live/service/impl/LiveSortLinkServiceImpl.java

@@ -22,6 +22,8 @@ import com.fs.voice.utils.StringUtil;
 
 import java.util.Calendar;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.UUID;
 
 import static com.fs.course.utils.LinkUtil.generateRandomStringWithLock;
@@ -130,6 +132,47 @@ public class LiveSortLinkServiceImpl implements ILiveSortLinkService {
         return R.error("生成链接失败!");
     }
 
+    @Override
+    public R getRealLinkByLink(String link) {
+        if (StringUtils.isEmpty(link)) {
+            return R.error("link不能为空");
+        }
+        String linkSuffix = extractLinkSuffix(link);
+        FsCourseLink courseLink = fsCourseLinkMapper.selectFsCourseLinkByLink(linkSuffix);
+        if (courseLink == null) {
+            return R.error("链接不存在");
+        }
+        if (courseLink.getUpdateTime() != null && courseLink.getUpdateTime().before(new Date())) {
+            return R.error("链接已过期");
+        }
+        if (StringUtils.isEmpty(courseLink.getRealLink())) {
+            return R.error("真实链接不存在");
+        }
+
+        String json = configService.selectConfigByKey("course.config");
+        CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
+        String domainName = getDomainName(courseLink.getCompanyUserId(), config);
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("link", linkSuffix);
+        map.put("realLink", courseLink.getRealLink());
+        map.put("url", domainName + courseLink.getRealLink());
+        map.put("linkId", courseLink.getLinkId());
+        map.put("liveId", courseLink.getLiveId());
+        return R.ok(map);
+    }
+
+    /**
+     * 支持直接传 link 后缀,或短链完整路径(含 ?s=)
+     */
+    private String extractLinkSuffix(String link) {
+        if (link.contains("s=")) {
+            int index = link.indexOf("s=");
+            return link.substring(index + 2).split("[&#?]")[0];
+        }
+        return link.trim();
+    }
+
     private String getDomainName(Long companyUserId, CourseConfig config) {
         String domainName = companyUserMapper.selectDomainByUserId(companyUserId);
         if (StringUtils.isEmpty(domainName)) {

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

@@ -127,6 +127,7 @@ public class PayScrmController {
         String[] order=o.getLowOrderId().split("-");
         switch (order[0]) {
             case "store":
+            case "live":
                 return orderService.payConfirm(1,null,order[1], o.getUpOrderId(),orderResult.getBankTrxId(),orderResult.getBankOrderId());
             case "store_remain":
                 return orderService.payRemainConfirm( order[1], o.getUpOrderId(),orderResult.getBankTrxId(),orderResult.getBankOrderId());

+ 1 - 0
fs-user-app/src/main/java/com/fs/app/controller/store/WxPayScrmController.java

@@ -79,6 +79,7 @@ public class WxPayScrmController {
                 String[] orderId=outtradeno.split("-");
                 switch (orderId[0]){
                     case "store":
+                    case "live":
                         orderService.payConfirm(1,null,orderId[1], outtradeno,tradeNo,null);
                         break;
                     case "store_remain":