Sfoglia il codice sorgente

Merge remote-tracking branch 'origin/master'

yfh 4 giorni fa
parent
commit
2964cded46
44 ha cambiato i file con 831 aggiunte e 103 eliminazioni
  1. 3 0
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreHealthOrderScrmController.java
  2. 3 0
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java
  3. 7 5
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStorePaymentScrmController.java
  4. 10 6
      fs-admin/src/main/java/com/fs/hisStore/task/LiveTask.java
  5. 6 0
      fs-admin/src/main/java/com/fs/hisStore/task/MallStoreTask.java
  6. 59 13
      fs-admin/src/main/java/com/fs/live/controller/LiveOrderController.java
  7. 45 13
      fs-ipad-task/src/main/java/com/fs/app/service/IpadSendServer.java
  8. 4 1
      fs-service/src/main/java/com/fs/company/mapper/CompanyMapper.java
  9. 5 0
      fs-service/src/main/java/com/fs/company/vo/CompanyVO.java
  10. 2 0
      fs-service/src/main/java/com/fs/course/service/IFsCoursePlaySourceConfigService.java
  11. 6 0
      fs-service/src/main/java/com/fs/course/service/impl/FsCoursePlaySourceConfigServiceImpl.java
  12. 2 1
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseProductOrderServiceImpl.java
  13. 3 1
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderItemScrmMapper.java
  14. 3 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStoreOrderParam.java
  15. 2 1
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreAfterSalesScrmServiceImpl.java
  16. 2 1
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
  17. 3 0
      fs-service/src/main/java/com/fs/hisStore/vo/FsStoreOrderItemExportVO.java
  18. 4 0
      fs-service/src/main/java/com/fs/hisStore/vo/FsStoreOrderVO.java
  19. 3 0
      fs-service/src/main/java/com/fs/live/mapper/LiveCouponMapper.java
  20. 3 0
      fs-service/src/main/java/com/fs/live/mapper/LiveOrderMapper.java
  21. 21 0
      fs-service/src/main/java/com/fs/live/param/LiveNotifyParam.java
  22. 3 0
      fs-service/src/main/java/com/fs/live/param/LiveOrderParam.java
  23. 7 0
      fs-service/src/main/java/com/fs/live/service/ILiveAutoTaskService.java
  24. 2 0
      fs-service/src/main/java/com/fs/live/service/ILiveOrderService.java
  25. 2 1
      fs-service/src/main/java/com/fs/live/service/ILiveService.java
  26. 242 4
      fs-service/src/main/java/com/fs/live/service/impl/LiveAutoTaskServiceImpl.java
  27. 52 0
      fs-service/src/main/java/com/fs/live/service/impl/LiveCouponIssueServiceImpl.java
  28. 84 4
      fs-service/src/main/java/com/fs/live/service/impl/LiveCouponServiceImpl.java
  29. 43 0
      fs-service/src/main/java/com/fs/live/service/impl/LiveGoodsServiceImpl.java
  30. 36 0
      fs-service/src/main/java/com/fs/live/service/impl/LiveLotteryConfServiceImpl.java
  31. 12 2
      fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java
  32. 36 0
      fs-service/src/main/java/com/fs/live/service/impl/LiveRedConfServiceImpl.java
  33. 21 13
      fs-service/src/main/java/com/fs/live/service/impl/LiveServiceImpl.java
  34. 4 0
      fs-service/src/main/java/com/fs/live/vo/LiveOrderVO.java
  35. 3 0
      fs-service/src/main/java/com/fs/live/vo/LiveOrderVoZm.java
  36. 2 2
      fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java
  37. 6 0
      fs-service/src/main/resources/application-config-druid-hzyy.yml
  38. 1 0
      fs-service/src/main/resources/mapper/his/FsUserInformationCollectionMapper.xml
  39. 22 2
      fs-service/src/main/resources/mapper/hisStore/FsStoreOrderScrmMapper.xml
  40. 19 7
      fs-service/src/main/resources/mapper/live/LiveOrderMapper.xml
  41. 2 2
      fs-user-app/src/main/java/com/fs/app/controller/UserController.java
  42. 3 2
      fs-user-app/src/main/java/com/fs/app/controller/live/LiveController.java
  43. 12 1
      fs-user-app/src/main/java/com/fs/app/controller/store/UserScrmController.java
  44. 21 21
      fs-user-app/src/main/java/com/fs/app/param/FsUserEditParam.java

+ 3 - 0
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreHealthOrderScrmController.java

@@ -121,6 +121,7 @@ public class FsStoreHealthOrderScrmController extends BaseController {
                     vo.setPayDelivery(BigDecimal.ZERO);
                     vo.setBarCode("");
                     vo.setCateName("");
+                    vo.setBankTransactionId("");
                 }
 
             }
@@ -308,6 +309,7 @@ public class FsStoreHealthOrderScrmController extends BaseController {
                     vo.setFPrice(BigDecimal.ZERO);
                     vo.setBarCode("");
                     vo.setCateName("");
+                    vo.setBankTransactionId("");
                 }
             }
         }
@@ -359,6 +361,7 @@ public class FsStoreHealthOrderScrmController extends BaseController {
                     vo.setFPrice(BigDecimal.ZERO);
                     vo.setBarCode("");
                     vo.setCateName("");
+                    vo.setBankTransactionId("");
                 }
             }
         }

+ 3 - 0
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java

@@ -217,6 +217,7 @@ public class FsStoreOrderScrmController extends BaseController {
                     vo.setPayDelivery(BigDecimal.ZERO);
                     vo.setBarCode("");
                     vo.setCateName("");
+                    vo.setBankTransactionId("");
                 }
             }
         }
@@ -473,6 +474,7 @@ public class FsStoreOrderScrmController extends BaseController {
                     vo.setFPrice(BigDecimal.ZERO);
                     vo.setBarCode("");
                     vo.setCateName("");
+                    vo.setBankTransactionId("");
                 }
             }
         }
@@ -528,6 +530,7 @@ public class FsStoreOrderScrmController extends BaseController {
                     vo.setFPrice(BigDecimal.ZERO);
                     vo.setBarCode("");
                     vo.setCateName("");
+                    vo.setBankTransactionId("");
                 }
             }
         }

+ 7 - 5
fs-admin/src/main/java/com/fs/hisStore/controller/FsStorePaymentScrmController.java

@@ -194,11 +194,11 @@ public class FsStorePaymentScrmController extends BaseController
 
         if(payment.getPayTypeCode().equals("weixin")){
             String json;
-            if (CloudHostUtils.hasCloudHostName("康年堂")){
+//            if (CloudHostUtils.hasCloudHostName("康年堂")){
                 json = configService.selectConfigByKey("his.pay");
-            } else {
-                json = configService.selectConfigByKey("store.pay");
-            }
+//            } else {
+//                json = configService.selectConfigByKey("store.pay");
+//            }
             if (StringUtils.isBlank(json)) {
                 return R.error("缺少支付相关配置");
             }
@@ -226,6 +226,7 @@ public class FsStorePaymentScrmController extends BaseController
                 Map<String, Object> extendInfoMap = new HashMap<>();
                 extendInfoMap.put("org_party_order_id", payment.getBankSerialNo());
                 request.setExtendInfo(extendInfoMap);
+                logger.info("请求参数:"+request);
                 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"))){
@@ -243,7 +244,8 @@ public class FsStorePaymentScrmController extends BaseController
                     return R.error(refund.getResp_desc());
                 }
 
-            }else if (payment.getPayMode()!=null&&payment.getPayMode().equals("wx")){
+            }
+            else if (payment.getPayMode()!=null&&payment.getPayMode().equals("wx")){
 
             }
 

+ 10 - 6
fs-admin/src/main/java/com/fs/hisStore/task/LiveTask.java

@@ -150,10 +150,14 @@ public class LiveTask {
     private JdbcTemplate jdbcTemplate;
 
     public void PushErp() throws ParseException {
-//        List<Long> ids = liveOrderMapper.selectOrderIdByNoErp();
-//        for (Long id : ids) {
-//            liveOrderService.createOmsOrder(id);
-//        }
+        List<Long> ids = liveOrderMapper.selectOrderIdByNoErp();
+        if(ids == null) return;
+        if (ids.size() > 50) {
+            ids = ids.subList(0, 50);
+        }
+        for (Long id : ids) {
+            liveOrderService.createOmsOrder(id);
+        }
     }
 
     public void redPacketSubMoney() throws Exception {
@@ -182,8 +186,8 @@ public class LiveTask {
     public void deliveryOp() {
         List<LiveOrder> list = liveOrderService.selectUpdateExpress();
         if(list == null || list.isEmpty()) return;
-        if (list.size() > 100) {
-            list = list.subList(0, 100);
+        if (list.size() > 50) {
+            list = list.subList(0, 50);
         }
         for (LiveOrder order : list) {
             ErpOrderQueryRequert request = new ErpOrderQueryRequert();

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

@@ -165,6 +165,9 @@ public class MallStoreTask
         } else {
             ids = fsStoreOrderMapper.selectFsStoreOrderNoCreateOms();
         }
+        if (!ids.isEmpty() && ids.size() > 50) {
+            ids = ids.subList(0, 50);
+        }
         for (Long id : ids) {
             fsStoreOrderService.createOmsOrder(id);
         }
@@ -204,6 +207,9 @@ public class MallStoreTask
     public void deliveryOp()
     {
         List<FsStoreOrderScrm> list = fsStoreOrderMapper.selectUpdateExpress();
+        if (list != null && list.size() > 50) {
+            list = list.subList(0, 50);
+        }
         for (FsStoreOrderScrm order : list){
             ErpOrderQueryRequert request = new ErpOrderQueryRequert();
             request.setCode(order.getExtendOrderId());

+ 59 - 13
fs-admin/src/main/java/com/fs/live/controller/LiveOrderController.java

@@ -31,6 +31,8 @@ import com.fs.his.enums.FsStoreOrderLogEnum;
 import com.fs.his.service.IFsDfAccountService;
 import com.fs.his.service.IFsExpressService;
 import com.fs.his.service.IFsUserService;
+import com.fs.his.utils.ConfigUtil;
+import com.fs.hisStore.config.FsErpConfig;
 import com.fs.hisStore.dto.StoreOrderExpressExportDTO;
 import com.fs.hisStore.param.*;
 import com.fs.hisStore.service.IFsExpressScrmService;
@@ -116,6 +118,27 @@ public class LiveOrderController extends BaseController
 
     @Autowired
     private LiveTask liveTask;
+    @Autowired
+    @Qualifier("erpOrderServiceImpl")
+    private IErpOrderService gyOrderService;
+
+    @Autowired
+    @Qualifier("wdtErpOrderServiceImpl")
+    private IErpOrderService wdtOrderService;
+    @Autowired
+    @Qualifier("hzOMSErpOrderServiceImpl")
+    private IErpOrderService hzOMSErpOrderService;
+    @Autowired
+    @Qualifier("dfOrderServiceImpl")
+    private IErpOrderService dfOrderService;
+    @Autowired
+    @Qualifier("k9OrderScrmServiceImpl")
+    private IErpOrderService k9OrderService;
+    @Autowired
+    @Qualifier("JSTErpOrderServiceImpl")
+    private IErpOrderService jSTOrderService;
+    @Autowired
+    private ConfigUtil configUtil;
 
 
 
@@ -181,6 +204,7 @@ public class LiveOrderController extends BaseController
                 vo.setPayDelivery(BigDecimal.ZERO);
                 vo.setBarCode("");
                 vo.setCateName("");
+                vo.setBankTransactionId("");
             }
             vo.setCost(vo.getCostPrice());
 
@@ -205,11 +229,12 @@ public class LiveOrderController extends BaseController
             vo.setUserAddress(ParseUtils.parseAddress(vo.getUserAddress()));
             // 财务独特字段
             if (loginUser.getPermissions().contains("live:liveOrder:finance") || loginUser.getPermissions().contains("*:*:*")) {
-                vo.setCostPrice(vo.getCostPrice());
+                vo.setCostPrice(vo.getCost());
                 vo.setFPrice(vo.getCostPrice().multiply(BigDecimal.valueOf(Long.parseLong(vo.getTotalNum()))));
             } else {
                 vo.setCostPrice(BigDecimal.ZERO);
                 vo.setFPrice(BigDecimal.ZERO);
+                vo.setBankTransactionId("");
             }
             vo.setCost(vo.getCostPrice());
         }
@@ -435,20 +460,41 @@ public class LiveOrderController extends BaseController
     @PreAuthorize("@ss.hasPermi('live:liveOrder:getEroOrder')")
     @GetMapping("/getEroOrder")
     public R getEroOrder(@RequestParam("extendOrderId") String extendOrderId) {
+        IErpOrderService erpOrderService = getErpService();
         ErpOrderQueryRequert request = new ErpOrderQueryRequert();
         request.setCode(extendOrderId);
-        if(StringUtils.isEmpty(extendOrderId)) return R.error("物流订单ID为空!");
-
-        LiveOrder order = liveOrderService.selectLiveOrderByExtendId(extendOrderId);
-
-        // 根据仓库code找erp
-//        if(com.fs.common.utils.StringUtils.isNotBlank(order.getStoreHouseCode())){
-//            String erp = fsWarehousesMapper.selectErpByCode(order.getStoreHouseCode());
-//            ErpContextHolder.setErpType(erp);
-//        }
-
-//        ErpOrderQueryResponse response = erpOrderService.getOrderLive(request);
-        return R.ok().put("data","123");
+        ErpOrderQueryResponse response = erpOrderService.getLiveOrder(request);
+        return R.ok().put("data",response);
+    }
+    private IErpOrderService getErpService(){
+        //判断是否开启erp
+        IErpOrderService erpOrderService = null;
+        FsErpConfig erpConfig = configUtil.getErpConfig();
+        Integer erpOpen = erpConfig.getErpOpen();
+        if (erpOpen != null && erpOpen == 1) {
+            //判断erp类型
+            Integer erpType = erpConfig.getErpType();
+            if (erpType != null) {
+                if (erpType == 1){
+                    //管易
+                    erpOrderService =  gyOrderService;
+                } else if (erpType == 2){
+                    //旺店通
+                    erpOrderService =  wdtOrderService;
+                } else if (erpType == 3){
+                    //
+                    erpOrderService =  hzOMSErpOrderService;
+                } else if (erpType == 4){
+                    //代服
+                    erpOrderService =  dfOrderService;
+                }else if(erpType == 5){
+                    erpOrderService=jSTOrderService;
+                }else if(erpType == 6){
+                    erpOrderService=k9OrderService;
+                }
+            }
+        }
+        return erpOrderService;
     }
 
     @Log(title = "冻结、解冻佣金", businessType = BusinessType.UPDATE)

+ 45 - 13
fs-ipad-task/src/main/java/com/fs/app/service/IpadSendServer.java

@@ -12,6 +12,8 @@ import com.fs.company.domain.CompanyMiniapp;
 import com.fs.company.service.ICompanyMiniappService;
 import com.fs.course.domain.FsCoursePlaySourceConfig;
 import com.fs.course.domain.FsCourseWatchLog;
+import com.fs.course.mapper.FsCoursePlaySourceConfigMapper;
+import com.fs.course.service.IFsCoursePlaySourceConfigService;
 import com.fs.course.service.IFsCourseWatchLogService;
 import com.fs.his.domain.FsUser;
 import com.fs.his.mapper.FsUserMapper;
@@ -39,6 +41,7 @@ import java.time.LocalDateTime;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -55,34 +58,63 @@ public class IpadSendServer {
     private final IQwUserVideoService qwUserVideoService;
     private final RedisCache redisCache;
     private final ICompanyMiniappService companyMiniappService;
+    private final IFsCoursePlaySourceConfigService playSourceConfigService;
     private final FsUserMapper fsUserMapper;
     private static final List<String> PROJECT_NAMES = Arrays.asList("济南联志健康", "北京存在文化");
     private void sendMiniProgram(BaseVo vo, QwSopCourseFinishTempSetting.Setting content, Map<String, FsCoursePlaySourceConfig> miniMap, Long companyId) {
+        // 发送参数原本的appid
         String appid = content.getMiniprogramAppid();
+        // 判断销售工时ID不为空并且有小程序类型
         if(companyId != null && content.getMiniType() != null){
-            List<CompanyMiniapp> list = companyMiniappService.list(new QueryWrapper<CompanyMiniapp>().eq("company_id", companyId));
-            List<CompanyMiniapp> collect = list.stream().filter(e -> e.getType().equals(content.getMiniType())).collect(Collectors.toList());
-            if(!collect.isEmpty() && collect.get(0) != null && StringUtils.isNotEmpty(collect.get(0).getAppId())){
-                appid = collect.get(0).getAppId();
+            // 获取销售公司下面绑定的主备小程序,并且根据当前应该发送的主备类型查询出数据
+            List<CompanyMiniapp> list = companyMiniappService.list(new QueryWrapper<CompanyMiniapp>().eq("company_id", companyId).eq("type", content.getMiniType()));
+            // 判断当前绑定的最新的小程序,并且覆盖以前的值(可以达到实时替换小程序的功能)
+            if(!list.isEmpty() && list.get(0) != null && StringUtils.isNotEmpty(list.get(0).getAppId())){
+                appid = list.get(0).getAppId();
             }
+            // 获取配置文件里面的项目名称
             String signProjectName = SpringUtils.getProperty("cloud_host.company_name");
-            //区分新老用户,新用户发送备用小程序,老用户发送主小程序
+            //区分新老用户,新用户发送备用小程序,老用户发送主小程序,TODO 需要使用的项目在参数里面加上
             if(PROJECT_NAMES.contains(signProjectName)){
                 log.info("ID:{}, qwUserId:{},externalId:{},进入区分发小程序逻辑", vo.getId(), vo.getQwUserId(), vo.getExId());
+                // 判断消息是否是群聊,不是群聊再进去,TODO 当权无法判断群聊是否可以发送对应的小程序
                 if(!vo.isRoom()){
                     log.info("qwUserId:{},externalId:{},不是群聊", vo.getQwUserId(), vo.getExId());
                     try {
+                        // 获取当前外部联系人
                         QwExternalContact qwExternalContact = qwExternalContactMapper.selectOne(new LambdaQueryWrapper<QwExternalContact>().eq(QwExternalContact::getQwUserId,vo.getQwUserId()).eq(QwExternalContact::getExternalUserId,vo.getExId()).last(" limit 1"));
+                        // 当前外部联系是否绑定用户数据,如果数据为空则是没看过小程序的新用户,不用去判断小程序,跳过判断
                         if(qwExternalContact.getFsUserId() != null){
+                            // 根据用户绑定信息去查询用户信息
                             FsUser fsUser = fsUserMapper.selectFsUserByUserId(qwExternalContact.getFsUserId());
-                            LocalDateTime createTime = DateUtil.dateToLocalDateTime(fsUser.getCreateTime());
-                            log.info("ID:{}, qwUserId:{},externalId:{},已绑定小程序,判断时间:{}", vo.getId(), vo.getQwUserId(), vo.getExId(), createTime);
-                            LocalDateTime lastTime = LocalDateTime.of(2025, 11, 6, 23, 59, 59);
-                            int listIndex = createTime.isAfter(lastTime) ? 1 : 0 ;
-                            List<CompanyMiniapp> collect2 = list.stream().filter(e -> e.getType().equals(listIndex)).collect(Collectors.toList());
-                            if(!collect2.isEmpty() && collect2.get(0) != null && StringUtils.isNotEmpty(collect2.get(0).getAppId())){
-                                appid = collect2.get(0).getAppId();
-                                log.info("ID:{}, qwUserId:{},externalId:{},发送小程序:{}", vo.getId(), vo.getQwUserId(), vo.getExId(), appid);
+                            // 判断用户是否有看过其他的小程序多个
+                            if(StringUtils.isNotEmpty(fsUser.getAppId())){
+                                // 获取用户看过的小程序ID集合
+                                List<String> miniAppList = Arrays.asList(fsUser.getAppId().split(","));
+                                // 根据小程序ID查询小程序列表
+                                List<FsCoursePlaySourceConfig> configList = playSourceConfigService.selectByAppIds(miniAppList);
+                                // 筛选出半封禁的小程序数据,得到这个数据然后优先发这个小程序
+                                Optional<FsCoursePlaySourceConfig> optional = configList.stream().filter(e -> e.getStatus() != null && e.getStatus() == 1).findFirst();
+                                // 判断是否找到
+                                if(optional.isPresent()){
+                                    // 找到半封禁并且在appid里面存在证明这个客户是打开过小程序,优先发送这个
+                                    appid = optional.get().getAppid();
+                                }
+                            }else{
+                                // 获取用户的创建时间
+                                LocalDateTime createTime = DateUtil.dateToLocalDateTime(fsUser.getCreateTime());
+                                log.info("ID:{}, qwUserId:{},externalId:{},已绑定小程序,判断时间:{}", vo.getId(), vo.getQwUserId(), vo.getExId(), createTime);
+                                // 这个时间是写死的,目前判断的芳华封禁的时间,可以更具项目调整
+                                LocalDateTime lastTime = LocalDateTime.of(2025, 11, 6, 23, 59, 59);
+                                // 判断客户创建时间是在这个之前还是之后
+                                int listIndex = createTime.isAfter(lastTime) ? 1 : 0 ;
+                                // 获取公司里面的主备小程序,根据用户创建时间来发送主备,如果创建时间大于上看的时间就发送备用小程序,如果小于就发送主要小程序
+                                List<CompanyMiniapp> collect2 = list.stream().filter(e -> e.getType().equals(listIndex)).collect(Collectors.toList());
+                                // 判断是否获取到了配置
+                                if(!collect2.isEmpty() && collect2.get(0) != null && StringUtils.isNotEmpty(collect2.get(0).getAppId())){
+                                    appid = collect2.get(0).getAppId();
+                                    log.info("ID:{}, qwUserId:{},externalId:{},发送小程序:{}", vo.getId(), vo.getQwUserId(), vo.getExId(), appid);
+                                }
                             }
                         }else{
                             log.info("ID:{}, qwUserId:{},externalId:{},未绑定小程序用户", vo.getId(), vo.getQwUserId(), vo.getExId());

+ 4 - 1
fs-service/src/main/java/com/fs/company/mapper/CompanyMapper.java

@@ -155,7 +155,10 @@ public interface CompanyMapper
 
 
     @Select({"<script> " +
-            "select c.*,cu.user_name,qu.used_num FROM company c LEFT JOIN company_user cu ON c.user_id =cu.user_id  " +
+            "select c.*,cu.user_name,qu.used_num," +
+            "CASE WHEN JSON_VALID(t1.config_value) THEN t1.config_value->>'$.mchId' ELSE NULL END as mchId" +
+            " FROM company c LEFT JOIN company_user cu ON c.user_id =cu.user_id  " +
+            " left join company_config t1 on t1.config_key = 'redPacket:config' and t1.company_id = c.company_id " +
             "LEFT JOIN (select company_id, count(id) as used_num from qw_user where server_id is not null and server_status = 1 group by company_id) qu ON qu.company_id = c.company_id " +
             "where c.is_del=0 " +
             "            <if test=\"companyName != null  and companyName != ''\"> and c.company_name like concat('%', #{companyName}, '%')</if>\n" +

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

@@ -99,4 +99,9 @@ public class CompanyVO implements Serializable
     private BigDecimal redPackageMoney;
 
     private Integer liveShow;
+
+    /**
+     * 新增展示商户号(分公司配置时有值)
+     */
+    private String mchId;
 }

+ 2 - 0
fs-service/src/main/java/com/fs/course/service/IFsCoursePlaySourceConfigService.java

@@ -13,4 +13,6 @@ public interface IFsCoursePlaySourceConfigService extends IService<FsCoursePlayS
      * 查询点播配置列表
      */
     List<FsCoursePlaySourceConfigVO> selectCoursePlaySourceConfigVOListByMap(Map<String, Object> params);
+
+    List<FsCoursePlaySourceConfig> selectByAppIds(List<String> miniAppList);
 }

+ 6 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsCoursePlaySourceConfigServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fs.course.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.course.domain.FsCoursePlaySourceConfig;
 import com.fs.course.mapper.FsCoursePlaySourceConfigMapper;
@@ -24,4 +25,9 @@ public class FsCoursePlaySourceConfigServiceImpl extends ServiceImpl<FsCoursePla
     public List<FsCoursePlaySourceConfigVO> selectCoursePlaySourceConfigVOListByMap(Map<String, Object> params) {
         return baseMapper.selectCoursePlaySourceConfigVOListByMap(params);
     }
+
+    @Override
+    public List<FsCoursePlaySourceConfig> selectByAppIds(List<String> miniAppList) {
+        return baseMapper.selectList(new QueryWrapper<FsCoursePlaySourceConfig>().in("appid", miniAppList));
+    }
 }

+ 2 - 1
fs-service/src/main/java/com/fs/course/service/impl/FsCourseProductOrderServiceImpl.java

@@ -506,7 +506,8 @@ public class FsCourseProductOrderServiceImpl extends ServiceImpl<FsCourseProduct
                     }
                 }
             } else {
-                //TODO 支付金额为0的业务
+                this.payConfirm(courseProductOrder.getOrderCode(),"","","",2,null,null);
+                return R.ok().put("isPay",1);
             }
 
         } else {

+ 3 - 1
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderItemScrmMapper.java

@@ -76,7 +76,9 @@ public interface FsStoreOrderItemScrmMapper
 
     @Select({"<script> " +
             "select i.*,o.user_id,psps.cost,o.pay_postage,o.total_num,o.status,fspcs.cate_name, o.real_name,o.user_phone,o.user_address,o.create_time,o.pay_time,o.delivery_sn,o.delivery_name,o.delivery_id, c.company_name ,cu.nick_name as company_user_nick_name ,cu.phonenumber as company_usere_phonenumber,o.upload_time ,CASE WHEN o.certificates IS NULL OR o.certificates = '' THEN 0 ELSE 1 END AS is_upload   " +
-            " ,p.title as package_name,cts.name as scheduleName from fs_store_order_item_scrm i left join fs_store_order_scrm o on o.id=i.order_id left join fs_user u on o.user_id=u.user_id  " +
+            " ,p.title as package_name,cts.name as scheduleName, os.bank_transaction_id as bankTransactionId from fs_store_order_item_scrm i left join fs_store_order_scrm o on o.id=i.order_id" +
+            " left join fs_store_payment_scrm os on os.business_order_id = o.id " +
+            " left join fs_user u on o.user_id=u.user_id  " +
             " left join fs_store_product_package_scrm p on o.package_id=p.package_id left join company c on c.company_id=o.company_id left join company_user cu on cu.user_id=o.company_user_id left join company_tcm_schedule cts on cts.id = o.schedule_id " +
             " left join fs_store_product_scrm psps on i.product_id=psps.product_id left join fs_store_product_category_scrm fspcs on fspcs.cate_id=psps.cate_id " +
             "where 1=1 " +

+ 3 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsStoreOrderParam.java

@@ -113,4 +113,7 @@ public class FsStoreOrderParam extends BaseEntity implements Serializable
 
     private String appId;
 
+    //银行交易流水号
+    private String bankTransactionId;
+
 }

+ 2 - 1
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreAfterSalesScrmServiceImpl.java

@@ -1423,7 +1423,8 @@ public class FsStoreAfterSalesScrmServiceImpl implements IFsStoreAfterSalesScrmS
         }
         if (payments != null && payments.size() > 0) {
             FsStorePaymentScrm payment = payments.get(0);
-            String json = configService.selectConfigByKey("store.pay");
+//            String json = configService.selectConfigByKey("store.pay");
+            String json = configService.selectConfigByKey("his.pay");
             FsPayConfigScrm fsPayConfig = JSON.parseObject(json, FsPayConfigScrm.class);
             if (payment.getPayMode().equals("wx")) {
                 WxPayConfig payConfig = new WxPayConfig();

+ 2 - 1
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -5004,7 +5004,8 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                 // 获取未结算订单
                 List<FsStoreOrderScrm> orderScrmList = fsStoreOrderMapper.getUnsettledOrder();
 
-                String payConfig = configService.selectConfigByKey("store.pay");
+//                String payConfig = configService.selectConfigByKey("store.pay");
+                String payConfig = configService.selectConfigByKey("his.pay");
                 JSONObject js = JSON.parseObject(payConfig);
                 String appId = js.getString("appId");
 

+ 3 - 0
fs-service/src/main/java/com/fs/hisStore/vo/FsStoreOrderItemExportVO.java

@@ -107,5 +107,8 @@ public class FsStoreOrderItemExportVO implements Serializable
     @Excel(name = "归属档期")
     private String scheduleName;
 
+    //银行交易流水号
+    @Excel(name = "银行交易流水号")
+    private String bankTransactionId;
 
 }

+ 4 - 0
fs-service/src/main/java/com/fs/hisStore/vo/FsStoreOrderVO.java

@@ -267,5 +267,9 @@ public class FsStoreOrderVO implements Serializable
     //erp推送账号
     private String erpAccount;
 
+    /** 银行交易流水号 */
+    @Excel(name = "银行交易流水号")
+    private String bankTransactionId;
+
 
 }

+ 3 - 0
fs-service/src/main/java/com/fs/live/mapper/LiveCouponMapper.java

@@ -125,4 +125,7 @@ public interface LiveCouponMapper
     @Select("select * from live_coupon_issue_relation where live_id = #{liveId}")
     List<LiveCouponIssueRelation> selectCouponRelationByLiveId(@Param("liveId") Long liveId);
 
+    @Select("select * from live_coupon_issue_relation where coupon_issue_id = #{couponIssueId}")
+    List<LiveCouponIssueRelation> selectCouponRelationByCouponIssueId(@Param("couponIssueId") Long couponIssueId);
+
 }

+ 3 - 0
fs-service/src/main/java/com/fs/live/mapper/LiveOrderMapper.java

@@ -444,4 +444,7 @@ public interface LiveOrderMapper {
      * @param dtoList 物流信息列表
      */
     void batchUpdateInOrderCode(@Param("list") List<LiveOrderDeliveryNoteDTO> dtoList);
+
+    @Select("SELECT * FROM live_order WHERE user_id=#{userId} LIMIT 1")
+    LiveOrder selectOrderByUserIdLimit1(@Param("userId") Long userId);
 }

+ 21 - 0
fs-service/src/main/java/com/fs/live/param/LiveNotifyParam.java

@@ -0,0 +1,21 @@
+package com.fs.live.param;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.HashMap;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class LiveNotifyParam {
+
+    private String liveId;
+    private String templateId;
+    private String maOpenId;
+    private Long userId;
+    private String appId;
+
+    HashMap<String,String> data;
+}

+ 3 - 0
fs-service/src/main/java/com/fs/live/param/LiveOrderParam.java

@@ -111,4 +111,7 @@ public class LiveOrderParam extends BaseEntity implements Serializable
     //导出字段
     private String filter;
 
+    //银行交易流水号
+    private String bankTransactionId;
+
 }

+ 7 - 0
fs-service/src/main/java/com/fs/live/service/ILiveAutoTaskService.java

@@ -89,4 +89,11 @@ public interface ILiveAutoTaskService {
     List<LiveAutoTask> selectLiveAutoTaskConsoleList(LiveAutoTask liveAutoTask);
 
     List<LiveAutoTask> consoleList(Long liveId);
+
+    void deleteAutoTasksByCouponId(Long couponId, Long liveId);
+    void deleteAutoTasksByRedId(Long redId, Long liveId);
+    void deleteAutoTasksByLotteryId(Long lotteryId, Long liveId);
+    void deleteAutoTasksByGoodsId(Long goodsId, Long liveId);
+    void deleteLotteryCache(Long lotteryId, Long liveId);
+    void deleteRedCache(Long redId, Long liveId);
 }

+ 2 - 0
fs-service/src/main/java/com/fs/live/service/ILiveOrderService.java

@@ -255,4 +255,6 @@ public interface ILiveOrderService {
      * @return list
      * **/
     List<LiveOrderDeliveryNoteExportVO> getDeliveryNote(LiveOrderParam param);
+
+    LiveOrder selectOrderByUserIdLimit1(Long userId);
 }

+ 2 - 1
fs-service/src/main/java/com/fs/live/service/ILiveService.java

@@ -2,6 +2,7 @@ package com.fs.live.service;
 
 
 import com.fs.common.core.page.PageRequest;
+import com.fs.live.param.LiveNotifyParam;
 import com.fs.live.vo.LiveVo;
 import com.fs.common.core.domain.R;
 import com.fs.live.domain.Live;
@@ -181,7 +182,7 @@ public interface ILiveService
 
     List<Live> liveCompanyList(Long companyId);
 
-    R subNotifyLive(HashMap<String, Object> param);
+    R subNotifyLive(LiveNotifyParam liveNotifyParam);
 
     Integer updateLiveIsAudit(Live live);
 

+ 242 - 4
fs-service/src/main/java/com/fs/live/service/impl/LiveAutoTaskServiceImpl.java

@@ -3,10 +3,7 @@ package com.fs.live.service.impl;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.ZoneId;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
@@ -333,6 +330,13 @@ public class LiveAutoTaskServiceImpl implements ILiveAutoTaskService {
     @Override
     public int deleteLiveAutoTaskByIds(Long[] ids)
     {
+        // 先从缓存中删除所有任务
+        for (Long id : ids) {
+            LiveAutoTask task = baseMapper.selectLiveAutoTaskById(id);
+            if (task != null) {
+                removeTaskFromCache(task);
+            }
+        }
         return baseMapper.deleteLiveAutoTaskByIds(ids);
     }
 
@@ -345,6 +349,12 @@ public class LiveAutoTaskServiceImpl implements ILiveAutoTaskService {
     @Override
     public int deleteLiveAutoTaskById(Long id)
     {
+        // 先查询任务信息
+        LiveAutoTask task = baseMapper.selectLiveAutoTaskById(id);
+        if (task != null) {
+            // 从缓存中删除
+            removeTaskFromCache(task);
+        }
         return baseMapper.deleteLiveAutoTaskById(id);
     }
 
@@ -414,4 +424,232 @@ public class LiveAutoTaskServiceImpl implements ILiveAutoTaskService {
     public List<LiveAutoTask> consoleList(Long liveId) {
         return baseMapper.consoleList(liveId, DateUtils.getNowDate());
     }
+
+    /**
+     * 删除与优惠券相关的自动化任务(taskType=5)
+     * @param couponId 优惠券ID
+     * @param liveId 直播间ID(可为null,null表示所有直播间)
+     */
+    @Override
+    public void deleteAutoTasksByCouponId(Long couponId, Long liveId) {
+        try {
+            List<LiveAutoTask> allTasks;
+            if (liveId != null) {
+                allTasks = baseMapper.selectLiveAutoTaskByLiveId(liveId);
+            } else {
+                // 查询所有直播间的任务
+                LiveAutoTask queryTask = new LiveAutoTask();
+                queryTask.setTaskType(5L); // 优惠券任务
+                allTasks = baseMapper.selectLiveAutoTaskList(queryTask);
+            }
+
+            List<Long> taskIdsToDelete = new ArrayList<>();
+            for (LiveAutoTask task : allTasks) {
+                if (task.getTaskType() != null && task.getTaskType() == 5L) {
+                    try {
+                        LiveCoupon liveCoupon = JSON.parseObject(task.getContent(), LiveCoupon.class);
+                        if (liveCoupon != null && couponId.equals(liveCoupon.getCouponId())) {
+                            taskIdsToDelete.add(task.getId());
+                            // 从缓存中删除
+                            removeTaskFromCache(task);
+                        }
+                    } catch (Exception e) {
+                        log.warn("解析自动化任务content失败,taskId: {}, error: {}", task.getId(), e.getMessage());
+                    }
+                }
+            }
+
+            if (!taskIdsToDelete.isEmpty()) {
+                Long[] ids = taskIdsToDelete.toArray(new Long[0]);
+                baseMapper.deleteLiveAutoTaskByIds(ids);
+                log.info("删除与优惠券ID {} 相关的自动化任务 {} 个", couponId, taskIdsToDelete.size());
+            }
+        } catch (Exception e) {
+            log.error("删除优惠券相关自动化任务失败,couponId: {}", couponId, e);
+        }
+    }
+
+    /**
+     * 删除与红包相关的自动化任务(taskType=2)
+     * @param redId 红包ID
+     * @param liveId 直播间ID
+     */
+    @Override
+    public void deleteAutoTasksByRedId(Long redId, Long liveId) {
+        try {
+            List<LiveAutoTask> allTasks = baseMapper.selectLiveAutoTaskByLiveId(liveId);
+            List<Long> taskIdsToDelete = new ArrayList<>();
+
+            for (LiveAutoTask task : allTasks) {
+                if (task.getTaskType() != null && task.getTaskType() == 2L) {
+                    try {
+                        LiveRedConf liveRedConf = JSON.parseObject(task.getContent(), LiveRedConf.class);
+                        if (liveRedConf != null && redId.equals(liveRedConf.getRedId())) {
+                            taskIdsToDelete.add(task.getId());
+                            // 从缓存中删除
+                            removeTaskFromCache(task);
+                        }
+                    } catch (Exception e) {
+                        log.warn("解析自动化任务content失败,taskId: {}, error: {}", task.getId(), e.getMessage());
+                    }
+                }
+            }
+
+            if (!taskIdsToDelete.isEmpty()) {
+                Long[] ids = taskIdsToDelete.toArray(new Long[0]);
+                baseMapper.deleteLiveAutoTaskByIds(ids);
+                log.info("删除与红包ID {} 相关的自动化任务 {} 个", redId, taskIdsToDelete.size());
+            }
+        } catch (Exception e) {
+            log.error("删除红包相关自动化任务失败,redId: {}, liveId: {}", redId, liveId, e);
+        }
+    }
+
+    /**
+     * 删除与抽奖相关的自动化任务(taskType=4)
+     * @param lotteryId 抽奖ID
+     * @param liveId 直播间ID
+     */
+    @Override
+    public void deleteAutoTasksByLotteryId(Long lotteryId, Long liveId) {
+        try {
+            List<LiveAutoTask> allTasks = baseMapper.selectLiveAutoTaskByLiveId(liveId);
+            List<Long> taskIdsToDelete = new ArrayList<>();
+
+            for (LiveAutoTask task : allTasks) {
+                if (task.getTaskType() != null && task.getTaskType() == 4L) {
+                    try {
+                        LiveLotteryConf liveLotteryConf = JSON.parseObject(task.getContent(), LiveLotteryConf.class);
+                        if (liveLotteryConf != null && lotteryId.equals(liveLotteryConf.getLotteryId())) {
+                            taskIdsToDelete.add(task.getId());
+                            // 从缓存中删除
+                            removeTaskFromCache(task);
+                        }
+                    } catch (Exception e) {
+                        log.warn("解析自动化任务content失败,taskId: {}, error: {}", task.getId(), e.getMessage());
+                    }
+                }
+            }
+
+            if (!taskIdsToDelete.isEmpty()) {
+                Long[] ids = taskIdsToDelete.toArray(new Long[0]);
+                baseMapper.deleteLiveAutoTaskByIds(ids);
+                log.info("删除与抽奖ID {} 相关的自动化任务 {} 个", lotteryId, taskIdsToDelete.size());
+            }
+        } catch (Exception e) {
+            log.error("删除抽奖相关自动化任务失败,lotteryId: {}, liveId: {}", lotteryId, liveId, e);
+        }
+    }
+
+    /**
+     * 删除与商品相关的自动化任务(taskType=1或6)
+     * @param goodsId 商品ID
+     * @param liveId 直播间ID
+     */
+    @Override
+    public void deleteAutoTasksByGoodsId(Long goodsId, Long liveId) {
+        try {
+            List<LiveAutoTask> allTasks = baseMapper.selectLiveAutoTaskByLiveId(liveId);
+            List<Long> taskIdsToDelete = new ArrayList<>();
+
+            for (LiveAutoTask task : allTasks) {
+                if (task.getTaskType() != null && (task.getTaskType() == 1L || task.getTaskType() == 6L)) {
+                    try {
+                        if (task.getTaskType() == 1L) {
+                            // 商品推荐任务
+                            LiveGoodsVo liveGoodsVo = JSON.parseObject(task.getContent(), LiveGoodsVo.class);
+                            if (liveGoodsVo != null && goodsId.equals(liveGoodsVo.getGoodsId())) {
+                                taskIdsToDelete.add(task.getId());
+                                removeTaskFromCache(task);
+                            }
+                        } else if (task.getTaskType() == 6L) {
+                            // 商品上下架任务
+                            com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(task.getContent());
+                            Long taskGoodsId = jsonObject.getLong("goodsId");
+                            if (taskGoodsId != null && goodsId.equals(taskGoodsId)) {
+                                taskIdsToDelete.add(task.getId());
+                                removeTaskFromCache(task);
+                            }
+                        }
+                    } catch (Exception e) {
+                        log.warn("解析自动化任务content失败,taskId: {}, error: {}", task.getId(), e.getMessage());
+                    }
+                }
+            }
+
+            if (!taskIdsToDelete.isEmpty()) {
+                Long[] ids = taskIdsToDelete.toArray(new Long[0]);
+                baseMapper.deleteLiveAutoTaskByIds(ids);
+                log.info("删除与商品ID {} 相关的自动化任务 {} 个", goodsId, taskIdsToDelete.size());
+            }
+        } catch (Exception e) {
+            log.error("删除商品相关自动化任务失败,goodsId: {}, liveId: {}", goodsId, liveId, e);
+        }
+    }
+
+    /**
+     * 从缓存中删除自动化任务
+     * @param task 自动化任务
+     */
+    private void removeTaskFromCache(LiveAutoTask task) {
+        try {
+            if (task.getLiveId() != null && task.getId() != null) {
+                String cacheKey = "live:auto_task:" + task.getLiveId();
+                // 获取ZSet中的所有任务
+                Set<String> allTasks = redisCache.redisTemplate.opsForZSet().range(cacheKey, 0, -1);
+                if (allTasks != null && !allTasks.isEmpty()) {
+                    // 遍历找到匹配的任务ID
+                    for (String taskJson : allTasks) {
+                        try {
+                            LiveAutoTask cachedTask = JSON.parseObject(taskJson, LiveAutoTask.class);
+                            if (cachedTask != null && task.getId().equals(cachedTask.getId())) {
+                                // 找到匹配的任务,从ZSet中删除
+                                redisCache.redisTemplate.opsForZSet().remove(cacheKey, taskJson);
+                                log.debug("从缓存中删除自动化任务,liveId: {}, taskId: {}", task.getLiveId(), task.getId());
+                                break;
+                            }
+                        } catch (Exception e) {
+                            log.warn("解析缓存中的任务失败,taskJson: {}, error: {}", taskJson, e.getMessage());
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.warn("从缓存删除自动化任务失败,taskId: {}, error: {}", task.getId(), e.getMessage());
+        }
+    }
+
+    /**
+     * 删除抽奖缓存
+     * @param lotteryId 抽奖ID
+     * @param liveId 直播间ID
+     */
+    public void deleteLotteryCache(Long lotteryId, Long liveId) {
+        try {
+            String cacheKey = "live:lottery_task:" + liveId;
+            // 从ZSet中删除指定的抽奖ID
+            redisCache.redisTemplate.opsForZSet().remove(cacheKey, String.valueOf(lotteryId));
+            log.info("删除抽奖缓存,lotteryId: {}, liveId: {}", lotteryId, liveId);
+        } catch (Exception e) {
+            log.error("删除抽奖缓存失败,lotteryId: {}, liveId: {}", lotteryId, liveId, e);
+        }
+    }
+
+    /**
+     * 删除红包缓存
+     * @param redId 红包ID
+     * @param liveId 直播间ID
+     */
+    public void deleteRedCache(Long redId, Long liveId) {
+        try {
+            String cacheKey = "live:red_task:" + liveId;
+            // 从ZSet中删除指定的红包ID
+            redisCache.redisTemplate.opsForZSet().remove(cacheKey, String.valueOf(redId));
+            // 同时删除剩余红包数的缓存
+            redisCache.deleteObject("live:red:remainingLots:" + redId);
+            log.info("删除红包缓存,redId: {}, liveId: {}", redId, liveId);
+        } catch (Exception e) {
+            log.error("删除红包缓存失败,redId: {}, liveId: {}", redId, liveId, e);
+        }
+    }
 }

+ 52 - 0
fs-service/src/main/java/com/fs/live/service/impl/LiveCouponIssueServiceImpl.java

@@ -3,7 +3,11 @@ package com.fs.live.service.impl;
 import java.util.Collections;
 import java.util.List;
 import com.fs.common.utils.DateUtils;
+import com.fs.live.domain.LiveCouponIssueRelation;
+import com.fs.live.mapper.LiveCouponMapper;
 import com.fs.live.param.CouponPO;
+import com.fs.live.service.ILiveAutoTaskService;
+import com.fs.live.vo.LiveCouponListVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.fs.live.mapper.LiveCouponIssueMapper;
@@ -21,6 +25,10 @@ public class LiveCouponIssueServiceImpl implements ILiveCouponIssueService
 {
     @Autowired
     private LiveCouponIssueMapper liveCouponIssueMapper;
+    @Autowired
+    private LiveCouponMapper liveCouponMapper;
+    @Autowired
+    private ILiveAutoTaskService liveAutoTaskService;
 
     /**
      * 查询优惠券领取
@@ -79,8 +87,31 @@ public class LiveCouponIssueServiceImpl implements ILiveCouponIssueService
      * @return 结果
      */
     @Override
+    @org.springframework.transaction.annotation.Transactional
     public int deleteLiveCouponIssueByIds(Long[] ids)
     {
+        // 联动删除:删除所有直播间存在的优惠券、定时任务和缓存
+        for (Long couponIssueId : ids) {
+            // 查询优惠券发布信息,获取couponId
+            LiveCouponIssue issue = liveCouponIssueMapper.selectLiveCouponIssueById(couponIssueId);
+            if (issue != null && issue.getCouponId() != null) {
+                // 删除所有直播间相关的自动化任务(liveId为null表示所有直播间)
+                liveAutoTaskService
+                        .deleteAutoTasksByCouponId(issue.getCouponId(), null);
+
+                // 查询所有使用该优惠券发布的直播间关联关系
+                List<LiveCouponIssueRelation> relations =
+                        liveCouponMapper.selectCouponRelationByCouponIssueId(couponIssueId);
+
+                // 删除所有直播间的关联关系
+                for (LiveCouponIssueRelation relation : relations) {
+                    LiveCouponListVo listVo = new LiveCouponListVo();
+                    listVo.setCouponIds(java.util.Arrays.asList(couponIssueId));
+                    listVo.setLiveId(relation.getLiveId().intValue());
+                    liveCouponMapper.handleDeleteSelectedAdmin(listVo);
+                }
+            }
+        }
         return liveCouponIssueMapper.deleteLiveCouponIssueByIds(ids);
     }
 
@@ -91,8 +122,29 @@ public class LiveCouponIssueServiceImpl implements ILiveCouponIssueService
      * @return 结果
      */
     @Override
+    @org.springframework.transaction.annotation.Transactional
     public int deleteLiveCouponIssueById(Long id)
     {
+        // 联动删除:删除所有直播间存在的优惠券、定时任务和缓存
+        // 查询优惠券发布信息,获取couponId
+        LiveCouponIssue issue = liveCouponIssueMapper.selectLiveCouponIssueById(id);
+        if (issue != null && issue.getCouponId() != null) {
+            // 删除所有直播间相关的自动化任务(liveId为null表示所有直播间)
+            liveAutoTaskService
+                    .deleteAutoTasksByCouponId(issue.getCouponId(), null);
+
+            // 查询所有使用该优惠券发布的直播间关联关系
+            List<LiveCouponIssueRelation> relations =
+                    liveCouponMapper.selectCouponRelationByCouponIssueId(id);
+
+            // 删除所有直播间的关联关系
+            for (LiveCouponIssueRelation relation : relations) {
+                LiveCouponListVo listVo = new LiveCouponListVo();
+                listVo.setCouponIds(java.util.Arrays.asList(id));
+                listVo.setLiveId(relation.getLiveId().intValue());
+                liveCouponMapper.handleDeleteSelectedAdmin(listVo);
+            }
+        }
         return liveCouponIssueMapper.deleteLiveCouponIssueById(id);
     }
 

+ 84 - 4
fs-service/src/main/java/com/fs/live/service/impl/LiveCouponServiceImpl.java

@@ -11,19 +11,17 @@ import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.live.domain.*;
+import com.fs.live.mapper.LiveCouponIssueMapper;
 import com.fs.live.mapper.LiveCouponIssueUserMapper;
 import com.fs.live.mapper.LiveMapper;
 import com.fs.live.param.CouponPO;
-import com.fs.live.service.ILiveCouponIssueService;
-import com.fs.live.service.ILiveCouponIssueUserService;
-import com.fs.live.service.ILiveCouponUserService;
+import com.fs.live.service.*;
 import com.fs.live.vo.LiveCouponListVo;
 
 import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.fs.live.mapper.LiveCouponMapper;
-import com.fs.live.service.ILiveCouponService;
 import org.springframework.transaction.annotation.Transactional;
 
 /**
@@ -51,6 +49,10 @@ public class LiveCouponServiceImpl implements ILiveCouponService
     private ILiveCouponIssueService liveCouponIssueService;
     @Autowired
     private LiveCouponIssueUserMapper liveCouponIssueUserMapper;
+    @Autowired
+    private ILiveAutoTaskService liveAutoTaskService;
+    @Autowired
+    private LiveCouponIssueMapper liveCouponIssueMapper;
 
     /**
      * 查询优惠券
@@ -109,8 +111,34 @@ public class LiveCouponServiceImpl implements ILiveCouponService
      * @return 结果
      */
     @Override
+    @Transactional
     public int deleteLiveCouponByIds(Long[] couponIds)
     {
+        // 联动删除:删除所有直播间存在的优惠券、定时任务和缓存
+        for (Long couponId : couponIds) {
+            // 删除所有直播间相关的自动化任务(liveId为null表示所有直播间)
+            liveAutoTaskService
+                    .deleteAutoTasksByCouponId(couponId, null);
+
+            // 查询所有使用该优惠券的优惠券发布记录
+            LiveCouponIssue queryIssue = new LiveCouponIssue();
+            queryIssue.setCouponId(couponId);
+            List<LiveCouponIssue> couponIssues = liveCouponIssueMapper.selectLiveCouponIssueList(queryIssue);
+
+            // 删除所有直播间的关联关系
+            for (LiveCouponIssue issue : couponIssues) {
+                if (issue.getId() != null) {
+                    // 查询所有使用该优惠券发布的直播间关联关系
+                    List<LiveCouponIssueRelation> relations = liveCouponMapper.selectCouponRelationByCouponIssueId(issue.getId());
+                    for (LiveCouponIssueRelation relation : relations) {
+                        LiveCouponListVo listVo = new LiveCouponListVo();
+                        listVo.setCouponIds(java.util.Arrays.asList(issue.getId()));
+                        listVo.setLiveId(relation.getLiveId().intValue());
+                        liveCouponMapper.handleDeleteSelectedAdmin(listVo);
+                    }
+                }
+            }
+        }
         return liveCouponMapper.deleteLiveCouponByIds(couponIds);
     }
 
@@ -121,8 +149,32 @@ public class LiveCouponServiceImpl implements ILiveCouponService
      * @return 结果
      */
     @Override
+    @Transactional
     public int deleteLiveCouponById(Long couponId)
     {
+        // 联动删除:删除所有直播间存在的优惠券、定时任务和缓存
+        // 删除所有直播间相关的自动化任务(liveId为null表示所有直播间)
+        liveAutoTaskService
+                .deleteAutoTasksByCouponId(couponId, null);
+
+        // 查询所有使用该优惠券的优惠券发布记录
+        LiveCouponIssue queryIssue = new LiveCouponIssue();
+        queryIssue.setCouponId(couponId);
+        List<LiveCouponIssue> couponIssues = liveCouponIssueMapper.selectLiveCouponIssueList(queryIssue);
+
+        // 删除所有直播间的关联关系
+        for (LiveCouponIssue issue : couponIssues) {
+            if (issue.getId() != null) {
+                // 查询所有使用该优惠券发布的直播间关联关系
+                List<LiveCouponIssueRelation> relations = liveCouponMapper.selectCouponRelationByCouponIssueId(issue.getId());
+                for (LiveCouponIssueRelation relation : relations) {
+                    LiveCouponListVo listVo = new LiveCouponListVo();
+                    listVo.setCouponIds(java.util.Arrays.asList(issue.getId()));
+                    listVo.setLiveId(relation.getLiveId().intValue());
+                    liveCouponMapper.handleDeleteSelectedAdmin(listVo);
+                }
+            }
+        }
         return liveCouponMapper.deleteLiveCouponById(couponId);
     }
 
@@ -185,13 +237,41 @@ public class LiveCouponServiceImpl implements ILiveCouponService
     }
 
     @Override
+    @Transactional
     public R handleDeleteSelectedAdmin(LiveCouponListVo listVo) {
+        // 在删除前,查询关联关系,获取couponId和liveId,用于联动删除
+        if (listVo.getCouponIds() != null && !listVo.getCouponIds().isEmpty() && listVo.getLiveId() != null) {
+            Long liveId = Long.valueOf(listVo.getLiveId());
+            for (Long couponIssueId : listVo.getCouponIds()) {
+                // 查询优惠券发布信息
+                LiveCouponIssue liveCouponIssue = liveCouponIssueMapper.selectLiveCouponIssueById(couponIssueId);
+                if (liveCouponIssue != null && liveCouponIssue.getCouponId() != null) {
+                    // 删除相关的自动化任务
+                    liveAutoTaskService
+                            .deleteAutoTasksByCouponId(liveCouponIssue.getCouponId(), liveId);
+                }
+            }
+        }
         liveCouponMapper.handleDeleteSelectedAdmin(listVo);
         return R.ok();
     }
 
     @Override
+    @Transactional
     public int delLiveCoupon(LiveCouponListVo vo) {
+        // 在删除前,查询关联关系,获取couponId和liveId,用于联动删除
+        if (vo.getCouponIds() != null && !vo.getCouponIds().isEmpty() && vo.getLiveId() != null) {
+            Long liveId = Long.valueOf(vo.getLiveId());
+            for (Long couponIssueId : vo.getCouponIds()) {
+                // 查询优惠券发布信息
+                LiveCouponIssue liveCouponIssue = liveCouponIssueMapper.selectLiveCouponIssueById(couponIssueId);
+                if (liveCouponIssue != null && liveCouponIssue.getCouponId() != null) {
+                    // 删除相关的自动化任务
+                    liveAutoTaskService
+                            .deleteAutoTasksByCouponId(liveCouponIssue.getCouponId(), liveId);
+                }
+            }
+        }
         liveCouponMapper.handleDeleteSelectedAdmin(vo);
         return 1;
     }

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

@@ -11,6 +11,7 @@ import com.fs.hisStore.domain.FsStoreProductScrm;
 import com.fs.hisStore.mapper.FsStoreProductScrmMapper;
 import com.fs.live.domain.LiveGoods;
 import com.fs.live.mapper.LiveGoodsMapper;
+import com.fs.live.service.ILiveAutoTaskService;
 import com.fs.live.service.ILiveGoodsService;
 import com.fs.live.vo.LiveGoodsListVo;
 import com.fs.live.vo.LiveGoodsVo;
@@ -37,6 +38,8 @@ public class LiveGoodsServiceImpl  implements ILiveGoodsService {
 
     @Autowired
     private LiveGoodsMapper baseMapper;
+    @Autowired
+    private ILiveAutoTaskService liveAutoTaskService;
 
     /**
      * 查询直播商品
@@ -105,8 +108,17 @@ public class LiveGoodsServiceImpl  implements ILiveGoodsService {
      * @return 结果
      */
     @Override
+    @org.springframework.transaction.annotation.Transactional
     public int deleteLiveGoodsByGoodsIds(Long[] goodsIds)
     {
+        // 联动删除:删除相关的自动化任务
+        for (Long goodsId : goodsIds) {
+            LiveGoods goods = baseMapper.selectLiveGoodsByGoodsId(goodsId);
+            if (goods != null && goods.getLiveId() != null) {
+                liveAutoTaskService
+                        .deleteAutoTasksByGoodsId(goodsId, goods.getLiveId());
+            }
+        }
         return baseMapper.deleteLiveGoodsByGoodsIds(goodsIds);
     }
 
@@ -117,8 +129,16 @@ public class LiveGoodsServiceImpl  implements ILiveGoodsService {
      * @return 结果
      */
     @Override
+    @org.springframework.transaction.annotation.Transactional
     public int deleteLiveGoodsByGoodsId(Long goodsId)
     {
+        // 先查询商品信息,获取liveId
+        LiveGoods goods = baseMapper.selectLiveGoodsByGoodsId(goodsId);
+        if (goods != null && goods.getLiveId() != null) {
+            // 删除相关的自动化任务
+            liveAutoTaskService
+                    .deleteAutoTasksByGoodsId(goodsId, goods.getLiveId());
+        }
         return baseMapper.deleteLiveGoodsByGoodsId(goodsId);
     }
 
@@ -276,7 +296,18 @@ public class LiveGoodsServiceImpl  implements ILiveGoodsService {
     }
 
     @Override
+    @org.springframework.transaction.annotation.Transactional
     public R handleDeleteSelected(LiveGoodsListVo listVo) {
+        // 联动删除:删除相关的自动化任务
+        if (listVo.getGoodsIds() != null && !listVo.getGoodsIds().isEmpty()) {
+            Long liveId = listVo.getLiveId() != null ? Long.valueOf(listVo.getLiveId()) : null;
+            for (Long goodsId : listVo.getGoodsIds()) {
+                if (liveId != null) {
+                    liveAutoTaskService
+                            .deleteAutoTasksByGoodsId(goodsId, liveId);
+                }
+            }
+        }
         int deleteCount = baseMapper.deleteBatchList(listVo);
         if (deleteCount > 0) {
             return R.ok("操作成功");
@@ -306,7 +337,19 @@ public class LiveGoodsServiceImpl  implements ILiveGoodsService {
     }
 
     @Override
+    @org.springframework.transaction.annotation.Transactional
     public R handleDeleteSelectedAdmin(LiveGoodsListVo listVo) {
+        // 联动删除:删除相关的自动化任务
+        if (listVo.getGoodsIds() != null && !listVo.getGoodsIds().isEmpty()) {
+            // 需要查询每个商品的liveId
+            for (Long goodsId : listVo.getGoodsIds()) {
+                LiveGoods goods = baseMapper.selectLiveGoodsByGoodsId(goodsId);
+                if (goods != null && goods.getLiveId() != null) {
+                    liveAutoTaskService
+                            .deleteAutoTasksByGoodsId(goodsId, goods.getLiveId());
+                }
+            }
+        }
         baseMapper.handleDeleteSelectedAdmin(listVo);
         return R.ok();
     }

+ 36 - 0
fs-service/src/main/java/com/fs/live/service/impl/LiveLotteryConfServiceImpl.java

@@ -12,6 +12,7 @@ import com.fs.live.mapper.LiveLotteryRegistrationMapper;
 import com.fs.live.param.LiveLotteryProduct;
 import com.fs.live.param.LiveLotteryProductSaveParam;
 import com.fs.live.param.LotteryPO;
+import com.fs.live.service.ILiveAutoTaskService;
 import com.fs.live.service.ILiveLotteryConfService;
 import com.fs.live.vo.LiveLotteryConfVo;
 import com.fs.live.vo.LiveLotteryProductListVo;
@@ -46,6 +47,8 @@ public class LiveLotteryConfServiceImpl implements ILiveLotteryConfService {
 
     @Autowired
     private LiveLotteryConfMapper baseMapper;
+    @Autowired
+    private ILiveAutoTaskService liveAutoTaskService;
     /**
      * 查询直播抽奖配置
      *
@@ -117,8 +120,21 @@ public class LiveLotteryConfServiceImpl implements ILiveLotteryConfService {
      * @return 结果
      */
     @Override
+    @Transactional
     public int deleteLiveLotteryConfByLotteryIds(Long[] lotteryIds)
     {
+        // 联动删除:删除相关的自动化任务和缓存
+        for (Long lotteryId : lotteryIds) {
+            LiveLotteryConf conf = baseMapper.selectLiveLotteryConfByLotteryId(lotteryId);
+            if (conf != null && conf.getLiveId() != null) {
+                // 删除相关的自动化任务
+                liveAutoTaskService
+                        .deleteAutoTasksByLotteryId(lotteryId, conf.getLiveId());
+                // 删除抽奖缓存
+                liveAutoTaskService
+                        .deleteLotteryCache(lotteryId, conf.getLiveId());
+            }
+        }
         return baseMapper.deleteLiveLotteryConfByLotteryIds(lotteryIds);
     }
 
@@ -132,6 +148,16 @@ public class LiveLotteryConfServiceImpl implements ILiveLotteryConfService {
     @Transactional
     public int deleteLiveLotteryConfByLotteryId(Long lotteryId)
     {
+        // 先查询抽奖配置,获取liveId
+        LiveLotteryConf conf = baseMapper.selectLiveLotteryConfByLotteryId(lotteryId);
+        if (conf != null && conf.getLiveId() != null) {
+            // 删除相关的自动化任务
+            liveAutoTaskService
+                    .deleteAutoTasksByLotteryId(lotteryId, conf.getLiveId());
+            // 删除抽奖缓存
+            liveAutoTaskService
+                    .deleteLotteryCache(lotteryId, conf.getLiveId());
+        }
         return baseMapper.deleteLiveLotteryConfByLotteryId(lotteryId);
     }
 
@@ -162,6 +188,16 @@ public class LiveLotteryConfServiceImpl implements ILiveLotteryConfService {
     @Override
     @Transactional
     public void delete(Long lotteryId) {
+        // 先查询抽奖配置,获取liveId
+        LiveLotteryConf conf = mapper.selectById(lotteryId);
+        if (conf != null && conf.getLiveId() != null) {
+            // 删除相关的自动化任务
+            liveAutoTaskService
+                    .deleteAutoTasksByLotteryId(lotteryId, conf.getLiveId());
+            // 删除抽奖缓存
+            liveAutoTaskService
+                    .deleteLotteryCache(lotteryId, conf.getLiveId());
+        }
         mapper.deleteById(lotteryId);
     }
 

+ 12 - 2
fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java

@@ -1171,6 +1171,8 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
                 }
                 return liveAfterSalesService.applyForAfterSales(order.getUserId(), param);
             } else {
+
+
                 jSTOrderService.refundUpdateLive(request);
             }
         }
@@ -1345,6 +1347,7 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
                 }
                 return liveAfterSalesService.applyForAfterSales(order.getUserId(), param);
             } else {
+
                 jSTOrderService.refundUpdateLive(request);
             }
         }
@@ -2769,7 +2772,8 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
             }
             FsUserScrm user = userMapper.selectFsUserById(Long.valueOf(liveOrder.getUserId()));
             if(user == null) return R.error("用户不存在");
-            String json = configService.selectConfigByKey("store.pay");
+//            String json = configService.selectConfigByKey("store.pay");
+            String json = configService.selectConfigByKey("his.pay");
             FsPayConfig fsPayConfig = JSON.parseObject(json, FsPayConfig.class);
             String payCode =  OrderCodeUtils.getOrderSn();
             if(StringUtils.isEmpty(payCode)){
@@ -3017,7 +3021,8 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
                 // 获取未结算订单
                 List<LiveOrder> orderScrmList = liveOrderMapper.getUnsettledOrder();
 
-                String payConfig = configService.selectConfigByKey("store.pay");
+//                String payConfig = configService.selectConfigByKey("store.pay");
+                String payConfig = configService.selectConfigByKey("his.pay");
                 JSONObject js = JSON.parseObject(payConfig);
                 String appId = js.getString("appId");
 
@@ -3262,6 +3267,11 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
         return baseMapper.getDeliveryNote(param);
     }
 
+    @Override
+    public LiveOrder selectOrderByUserIdLimit1(Long userId) {
+        return baseMapper.selectOrderByUserIdLimit1(userId);
+    }
+
 
     @Override
     @Transactional(rollbackFor = Throwable.class,propagation = Propagation.REQUIRED)

+ 36 - 0
fs-service/src/main/java/com/fs/live/service/impl/LiveRedConfServiceImpl.java

@@ -16,6 +16,7 @@ import com.fs.live.mapper.LiveRedConfMapper;
 import com.fs.live.mapper.LiveRewardRecordMapper;
 import com.fs.live.mapper.LiveUserRedRecordMapper;
 import com.fs.live.param.RedPO;
+import com.fs.live.service.ILiveAutoTaskService;
 import com.fs.live.service.ILiveRedConfService;
 
 import org.slf4j.Logger;
@@ -54,6 +55,8 @@ public class LiveRedConfServiceImpl implements ILiveRedConfService {
     private LiveMapper liveMapper;
     @Autowired
     private LiveRewardRecordMapper liveRewardRecordMapper;
+    @Autowired
+    private ILiveAutoTaskService liveAutoTaskService;
 
     private static final String REDPACKET_REMAININGLOTS_KEY = "live:red:remainingLots:";
     private static final String REDPACKET_REMAININGNUM_KEY = "live:red:remainingNum:";
@@ -133,8 +136,20 @@ public class LiveRedConfServiceImpl implements ILiveRedConfService {
      * @return 结果
      */
     @Override
+    @Transactional
     public int deleteLiveRedConfByRedIds(Long[] redIds)
     {
+        // 联动删除:删除相关的自动化任务和缓存
+        for (Long redId : redIds) {
+            LiveRedConf conf = baseMapper.selectLiveRedConfByRedId(redId);
+            if (conf != null && conf.getLiveId() != null) {
+                // 删除相关的自动化任务
+                liveAutoTaskService.deleteAutoTasksByRedId(redId, conf.getLiveId());
+                // 删除红包缓存
+                liveAutoTaskService
+                        .deleteRedCache(redId, conf.getLiveId());
+            }
+        }
         return baseMapper.deleteLiveRedConfByRedIds(redIds);
     }
 
@@ -145,8 +160,19 @@ public class LiveRedConfServiceImpl implements ILiveRedConfService {
      * @return 结果
      */
     @Override
+    @Transactional
     public int deleteLiveRedConfByRedId(Long redId)
     {
+        // 先查询红包配置,获取liveId
+        LiveRedConf conf = baseMapper.selectLiveRedConfByRedId(redId);
+        if (conf != null && conf.getLiveId() != null) {
+            // 删除相关的自动化任务
+            liveAutoTaskService
+                    .deleteAutoTasksByRedId(redId, conf.getLiveId());
+            // 删除红包缓存
+            liveAutoTaskService
+                    .deleteRedCache(redId, conf.getLiveId());
+        }
         return baseMapper.deleteLiveRedConfByRedId(redId);
     }
 
@@ -177,6 +203,16 @@ public class LiveRedConfServiceImpl implements ILiveRedConfService {
     @Override
     @Transactional
     public void delete(Long redId) {
+        // 先查询红包配置,获取liveId
+        LiveRedConf conf = baseMapper.selectById(redId);
+        if (conf != null && conf.getLiveId() != null) {
+            // 删除相关的自动化任务
+            liveAutoTaskService
+                    .deleteAutoTasksByRedId(redId, conf.getLiveId());
+            // 删除红包缓存
+            liveAutoTaskService
+                    .deleteRedCache(redId, conf.getLiveId());
+        }
         baseMapper.deleteById(redId);
     }
 

+ 21 - 13
fs-service/src/main/java/com/fs/live/service/impl/LiveServiceImpl.java

@@ -22,6 +22,7 @@ import com.fs.hisStore.domain.FsStoreProductScrm;
 import com.fs.hisStore.mapper.FsStoreProductScrmMapper;
 import com.fs.live.dto.TemplateMessageSendRequestDTO;
 import com.fs.live.enums.MiniAppNotifyTaskStatusEnum;
+import com.fs.live.param.LiveNotifyParam;
 import com.fs.live.vo.LiveVo;
 import com.fs.common.constant.LiveKeysConstant;
 import com.fs.common.core.domain.R;
@@ -245,20 +246,20 @@ public class LiveServiceImpl implements ILiveService
     }
 
     @Override
-    public R subNotifyLive(HashMap<String, Object> param) {
+    public R subNotifyLive(LiveNotifyParam param) {
         LiveMiniprogramSubNotifyTask notifyTask = new LiveMiniprogramSubNotifyTask();
-        notifyTask.setPage("/pages_course/living?liveId=" + param.get("liveId"));
+        notifyTask.setPage("/pages_course/living?liveId=" + param.getLiveId());
         notifyTask.setTaskName("直播间预约提醒");
-        notifyTask.setTemplateId((String) param.get("templateId"));
-        Long userId = Long.valueOf((Integer) param.get("userId"));
+        notifyTask.setTemplateId(param.getTemplateId());
+        Long userId = param.getUserId();
         Wrapper<FsUserWx> queryWrapper = Wrappers.<FsUserWx>lambdaQuery()
                 .eq(FsUserWx::getFsUserId, userId)
-                .eq(FsUserWx::getAppId, param.getOrDefault("appid", "wx44beed5640bcb1ba"));
+                .eq(FsUserWx::getAppId, StringUtils.isEmpty(param.getAppId()) ? "wx44beed5640bcb1ba" : param.getAppId()); // 卓美小程序
         FsUserWx fsUserWx = fsUserWxMapper.selectOne(queryWrapper);
         String maOpenId = fsUserWx.getOpenId();
-//        if (StringUtils.isEmpty(maOpenId)) {
-//            maOpenId = (String) param.get("maOpenId");
-//        }
+        if (StringUtils.isEmpty(maOpenId)) {
+            maOpenId = param.getMaOpenId();
+        }
         notifyTask.setTouser(maOpenId);
         notifyTask.setPage(String.valueOf(1));
 
@@ -268,7 +269,7 @@ public class LiveServiceImpl implements ILiveService
         notifyTask.setRetryCount(0);
         notifyTask.setMaxRetries(3);
         Map<String, TemplateMessageSendRequestDTO.TemplateDataValue> data = new HashMap<>();
-        HashMap<String,String> mapData = (HashMap<String, String>) param.get("data");
+        HashMap<String,String> mapData =  param.getData();
         // 定义日期时间格式器,注意与字符串格式完全匹配
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
@@ -280,7 +281,7 @@ public class LiveServiceImpl implements ILiveService
         });
         notifyTask.setData(JSON.toJSONString(data));
 //        return R.ok("success");
-        liveMiniprogramSubNotifyTaskMapper.insert(notifyTask);
+//        liveMiniprogramSubNotifyTaskMapper.insert(notifyTask);
 
         return R.ok("success");
     }
@@ -387,6 +388,7 @@ public class LiveServiceImpl implements ILiveService
     @Override
     @Transactional
     public int updateLiveEntity(Live live) {
+        log.error("updateLiveEntity:"+ live.getLiveId());
         return baseMapper.updateLive( live);
     }
 
@@ -524,6 +526,7 @@ public class LiveServiceImpl implements ILiveService
             live.setLiveConfig(JSON.toJSONString(liveReplayParam));
 
         }
+        log.error("updateLive:" + live.getLiveId());
         int result = baseMapper.updateLive(live);
         liveAutoTaskService.recalcLiveAutoTask(live);
 
@@ -659,6 +662,7 @@ public class LiveServiceImpl implements ILiveService
         live.setStatus(1);
         live.setFinishTime(LocalDateTime.now());
         live.setLiveType(2);
+        log.error("closeLiving:" + live.getLiveId());
         baseMapper.updateLive(live);
         return R.ok();
     }
@@ -694,7 +698,7 @@ public class LiveServiceImpl implements ILiveService
             curLive.setRtmpUrl("rtmp://your-srs-server/live/" + streamKey);
             curLive.setUpdateTime(now);
 
-
+            log.error("startLoopPlay:" + live.getLiveId());
             baseMapper.updateLive(curLive);
 
             return R.ok();
@@ -722,6 +726,7 @@ public class LiveServiceImpl implements ILiveService
             // 更新流状态
             curLive.setStatus(2);
             curLive.setUpdateTime(new Date());
+            log.error("stopLoopPlay:" + live.getLiveId());
             baseMapper.updateLive(curLive);
 
             return R.ok();
@@ -733,6 +738,7 @@ public class LiveServiceImpl implements ILiveService
     @Override
     public R handleShelfOrUn(LiveListVo listVo) {
         int updatedCount = baseMapper.updateBatchLiveList(listVo);
+        log.error("有人下架了视频:" + listVo.getLiveIds());
         if (updatedCount > 0) {
             return R.ok("操作成功");
         }
@@ -757,7 +763,7 @@ public class LiveServiceImpl implements ILiveService
         if (exist.getStatus() == 3) {
             return R.error("直播已结束");
         }
-
+        log.error("finishLive:" + live.getLiveId());
         exist.setStatus(3);
         exist.setFinishTime(LocalDateTime.now());
         exist.setUpdateTime(new Date());
@@ -787,7 +793,7 @@ public class LiveServiceImpl implements ILiveService
         Date now = new Date();
         exist.setRtmpUrl(rtmpPushUrl);
         exist.setFlvHlsUrl(hlvPlayUrl);
-
+        log.error("startLive:" + live.getLiveId());
         exist.setStatus(2);
         exist.setUpdateTime(now);
         exist.setFinishTime( null);
@@ -808,6 +814,7 @@ public class LiveServiceImpl implements ILiveService
     @Override
     public R handleShelfOrUnAdmin(LiveListVo listVo) {
         baseMapper.handleShelfOrUnAdmin(listVo);
+        log.error("有人下架了视频:" + listVo.getLiveIds());
         return R.ok();
     }
 
@@ -1208,6 +1215,7 @@ public class LiveServiceImpl implements ILiveService
             JSONObject jsonObject = JSONObject.parseObject(result);
             if (200 == jsonObject.getIntValue("code") && jsonObject.getBooleanValue("success")) {
                 live.setIdCardUrl(payload.get("idCardUrl"));
+                log.error("verifyIdInfo:" + live.getLiveId());
                 baseMapper.updateLive(live);
                 return R.ok();
             }

+ 4 - 0
fs-service/src/main/java/com/fs/live/vo/LiveOrderVO.java

@@ -255,5 +255,9 @@ public class LiveOrderVO implements Serializable
     //erp推送账号
     private String erpAccount;
 
+    /** 银行交易流水号 */
+    @Excel(name = "银行交易流水号")
+    private String bankTransactionId;
+
 
 }

+ 3 - 0
fs-service/src/main/java/com/fs/live/vo/LiveOrderVoZm.java

@@ -476,6 +476,9 @@ public class LiveOrderVoZm{
     private String createTimeStart;
     private String createTimeEnd;
 
+    /** 银行交易流水号 */
+    @Excel(name = "银行交易流水号")
+    private String bankTransactionId;
 
 
 }

+ 2 - 2
fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java

@@ -984,7 +984,7 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
     //递归
     public R  syncMyQwExternalContactRecursion(QwUser qwUser,String getNextCursor )  {
 
-
+        int i=0;
         String qwUserId = qwUser.getQwUserId();
         String corpId = qwUser.getCorpId();
         Long companyId = qwUser.getCompanyId();
@@ -1061,7 +1061,7 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
                         qwExternalContactMapper.insertQwExternalContact(qwExternalContact);
                     }
 
-                    logger.info("成功同步一个用户");
+                    logger.info("成功同步一个用户"+i++);
                 }
 
             }else {

+ 6 - 0
fs-service/src/main/resources/application-config-druid-hzyy.yml

@@ -62,6 +62,12 @@ watch:
 fs :
   commonApi: http://127.0.0.1:7771
   h5CommonApi: http://127.0.0.1:7771
+  jwt:
+    # 加密秘钥
+    secret: f4h2z52034348y86y67cde581c0f9eb5
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 nuonuo:
   key: 10924508
   secret: A2EB20764D304D16

+ 1 - 0
fs-service/src/main/resources/mapper/his/FsUserInformationCollectionMapper.xml

@@ -107,6 +107,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="maps.doctorConfirm != null"> and fui.doctor_confirm = #{maps.doctorConfirm}</if>
             <if test="maps.packageOrderCode != null  and maps.packageOrderCode != ''"> and fui.package_order_code = #{maps.packageOrderCode}</if>
         </where>
+        order by id desc
     </select>
     <select id="selectFsUserInformationCollectionByOrderCode"
             resultType="com.fs.his.domain.FsUserInformationCollection">

+ 22 - 2
fs-service/src/main/resources/mapper/hisStore/FsStoreOrderScrmMapper.xml

@@ -985,7 +985,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </foreach>
     </select>
     <select id="selectFsStoreOrderListVOByErpAccount" resultType="com.fs.hisStore.vo.FsStoreOrderVO">
-        select o.*,u.phone,u.register_code,u.register_date,u.source, c.company_name ,cu.nick_name as company_user_nick_name ,cu.phonenumber as company_usere_phonenumber,,df.login_account as erp_account,
+        select o.*,u.phone,u.register_code,u.register_date,u.source, c.company_name ,cu.nick_name as company_user_nick_name ,cu.phonenumber as company_usere_phonenumber,df.login_account as erp_account,
+        sp_latest.bank_transaction_id as bankTransactionId
         from fs_store_order_scrm o
             left join fs_user u on o.user_id=u.user_id
             left join company c on c.company_id=o.company_id
@@ -1000,6 +1001,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         sp.*,
         ROW_NUMBER() OVER (PARTITION BY sp.business_code ORDER BY sp.create_time DESC) as rn
         FROM fs_store_payment_scrm sp
+        WHERE sp.business_code IS NOT NULL
         ) sp_latest ON sp_latest.business_code = o.order_code AND sp_latest.rn = 1
         LEFT JOIN fs_course_play_source_config csc ON csc.appid = sp_latest.app_id
         <where>
@@ -1015,6 +1017,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="maps.orderCode != null and  maps.orderCode !=''">
                 and o.order_code like CONCAT('%',#{maps.orderCode},'%')
             </if>
+            <if test="maps.bankTransactionId != null and  maps.bankTransactionId !=''">
+                and sp_latest.bank_transaction_id like CONCAT('%',#{maps.bankTransactionId},'%')
+            </if>
             <if test="maps.isPayRemain != null">
                 and o.is_pay_remain =#{maps.isPayRemain}
             </if>
@@ -1181,6 +1186,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="maps.orderCode != null and  maps.orderCode !=''">
                 and o.order_code like CONCAT('%',#{maps.orderCode},'%')
             </if>
+            <if test="maps.bankTransactionId != null and  maps.bankTransactionId !=''">
+                and sp_latest.bank_transaction_id like CONCAT('%',#{maps.bankTransactionId},'%')
+            </if>
             <if test="maps.isPayRemain != null">
                 and o.is_pay_remain =#{maps.isPayRemain}
             </if>
@@ -1324,6 +1332,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="maps.orderCode != null and  maps.orderCode !=''">
                 and o.order_code like CONCAT('%',#{maps.orderCode},'%')
             </if>
+            <if test="maps.bankTransactionId != null and  maps.bankTransactionId !=''">
+                and sp_latest.bank_transaction_id like CONCAT('%',#{maps.bankTransactionId},'%')
+            </if>
             <if test="maps.isPayRemain != null">
                 and o.is_pay_remain =#{maps.isPayRemain}
             </if>
@@ -1468,6 +1479,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="maps.orderCode != null and  maps.orderCode !=''">
                 and o.order_code like CONCAT('%',#{maps.orderCode},'%')
             </if>
+            <if test="maps.bankTransactionId != null and  maps.bankTransactionId !=''">
+                and sp_latest.bank_transaction_id like CONCAT('%',#{maps.bankTransactionId},'%')
+            </if>
             <if test="maps.isPayRemain != null">
                 and o.is_pay_remain =#{maps.isPayRemain}
             </if>
@@ -1576,7 +1590,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="selectFsStoreOrderListVO" resultType="com.fs.hisStore.vo.FsStoreOrderVO">
         select o.id,o.order_code,o.extend_order_id,o.pay_order_id,o.bank_order_id,o.user_id,o.real_name,o.user_phone,o.user_address,o.cart_id,o.freight_price,o.total_num,o.total_price,o.total_postage,o.pay_price,o.pay_postage,o.pay_delivery,o.pay_money,o.deduction_price,o.coupon_id,o.coupon_price,o.paid,o.pay_time,o.pay_type,o.create_time,o.update_time,o.status,o.refund_status,o.refund_reason_wap_img,o.refund_reason_wap_explain,o.refund_reason_time,o.refund_reason_wap,o.refund_reason,o.refund_price,o.delivery_sn,o.delivery_name,o.delivery_type,o.delivery_id,o.gain_integral,o.use_integral,o.pay_integral,o.back_integral,o.mark,o.is_del,o.remark,o.verify_code,o.store_id,o.shipping_type,o.is_channel,o.is_remind,o.is_sys_del,o.is_prescribe,o.prescribe_id,o.company_id,o.company_user_id,o.is_package,o.package_json,o.order_type,o.package_id,o.finish_time,o.delivery_status,o.delivery_pay_status,o.delivery_time,o.delivery_pay_time,o.delivery_pay_money,o.tui_money,o.tui_money_status,o.delivery_import_time,o.tui_user_id,o.tui_user_money_status,o.order_create_type,o.store_house_code,o.dept_id,o.is_edit_money,o.customer_id,o.is_pay_remain,o.delivery_send_time,o.certificates,o.upload_time,o.item_json,o.schedule_id,o.delivery_pay_type,o.order_visit,o.service_fee,o.cycle,o.prescribe_price,o.follow_doctor_id,o.follow_time,o.user_coupon_id,o.order_medium,o.erp_phone
         ,u.phone,u.register_code,u.register_date,u.source, c.company_name ,cu.nick_name as company_user_nick_name ,cu.phonenumber as company_usere_phonenumber
-        , csc.name miniProgramName,fsp.cost, fspc.cate_name,spavs.bar_code
+        , csc.name miniProgramName,fsp.cost, fspc.cate_name,spavs.bar_code, sp_latest.bank_transaction_id as bankTransactionId
         from fs_store_order_scrm o
         left join fs_user u on o.user_id=u.user_id
         left join company c on c.company_id=o.company_id
@@ -1611,6 +1625,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="maps.orderCode != null and  maps.orderCode !=''">
                 and o.order_code like CONCAT('%',#{maps.orderCode},'%')
             </if>
+            <if test="maps.bankTransactionId != null and  maps.bankTransactionId !=''">
+                and sp_latest.bank_transaction_id like CONCAT('%',#{maps.bankTransactionId},'%')
+            </if>
             <if test="maps.isPayRemain != null">
                 and o.is_pay_remain =#{maps.isPayRemain}
             </if>
@@ -1766,6 +1783,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="maps.orderCode != null and  maps.orderCode !=''">
                 and o.order_code like CONCAT('%',#{maps.orderCode},'%')
             </if>
+            <if test="maps.bankTransactionId != null and  maps.bankTransactionId !=''">
+                and sp_latest.bank_transaction_id like CONCAT('%',#{maps.bankTransactionId},'%')
+            </if>
             <if test="maps.isPayRemain != null">
                 and o.is_pay_remain =#{maps.isPayRemain}
             </if>

+ 19 - 7
fs-service/src/main/resources/mapper/live/LiveOrderMapper.xml

@@ -482,7 +482,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="selectLiveOrderListVO" resultType="com.fs.live.vo.LiveOrderVO">
 
     select o.*,u.phone,u.register_code,u.register_date,u.source, c.company_name ,cu.nick_name as company_user_nick_name ,cu.phonenumber as company_usere_phonenumber
-    , csc.name miniProgramName
+    , csc.name miniProgramName, sp_latest.bank_transaction_id as bankTransactionId
     from live_order o
     left join fs_user u on o.user_id=u.user_id
     left join company c on c.company_id=o.company_id
@@ -516,6 +516,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="maps.orderCode != null and  maps.orderCode !=''">
             and o.order_code like CONCAT('%',#{maps.orderCode},'%')
         </if>
+        <if test="maps.bankTransactionId != null and  maps.bankTransactionId !=''">
+            and sp_latest.bank_transaction_id like CONCAT('%',#{maps.bankTransactionId},'%')
+        </if>
         <if test="maps.isPayRemain != null">
             and o.is_pay_remain =#{maps.isPayRemain}
         </if>
@@ -1002,7 +1005,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
             <!-- 门店信息 -->
             spavs.bar_code,
-            spcs.cate_name
+            spcs.cate_name,
+            <!-- 支付信息 -->
+            lop.bank_transaction_id AS bankTransactionId
 
         FROM
             live_order o
@@ -1012,9 +1017,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             LEFT JOIN fs_store_scrm s ON p.store_id = s.store_id
             LEFT JOIN fs_store_product_attr_value_scrm spavs ON p.product_id = spavs.product_id
             LEFT JOIN fs_store_product_category_scrm spcs ON p.cate_id = spcs.cate_id
+            LEFT JOIN (
+                SELECT
+                    sp.*,
+                    ROW_NUMBER() OVER (PARTITION BY sp.business_code ORDER BY sp.create_time DESC) as rn
+                FROM live_order_payment sp
+                WHERE sp.business_code IS NOT NULL
+            ) lop ON lop.business_code = o.order_code AND lop.rn = 1
 
         <where>
-            o.is_del = 0
+            o.is_del = 0 and p.product_id IS NOT NULL
             <if test="orderId != null">
                 AND o.order_id = #{orderId}
             </if>
@@ -1107,7 +1119,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <select id="getDeliveryNote" resultType="com.fs.live.vo.LiveOrderDeliveryNoteExportVO">
         SELECT
-        CONCAT('AC', o.id) AS orderNumber,
+        CONCAT('AC', o.order_id) AS orderNumber,
         o.user_name AS recipient,
         o.user_phone AS recipientPhone,
         o.user_address AS recipientAddress,
@@ -1133,11 +1145,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         LEFT JOIN company_user cu
         ON cu.user_id = o.company_user_id
         LEFT JOIN (
-        SELECT DISTINCT order_id
+        SELECT DISTINCT business_id as order_id
         FROM live_order_payment
-        WHERE is_pay_remain != 0 AND STATUS != 0
+        WHERE  STATUS != 0
         ) fp
-        ON o.id = fp.order_id
+        ON o.order_id = fp.order_id
         WHERE
         o.is_del = 0 and
         1 = 1

+ 2 - 2
fs-user-app/src/main/java/com/fs/app/controller/UserController.java

@@ -201,7 +201,7 @@ public class UserController extends  AppBaseController {
     public R editUser(@RequestBody @Valid FsUserEditParam param, HttpServletRequest request){
         param.setUserId(Long.parseLong(getUserId()));
         log.info("【修改用户头像昵称】:{}",param);
-        if (param.getNickName().length()>50){
+        if (param.getNickname().length()>50){
             return R.error("请授权正确的昵称!");
         }
         if (StringUtils.isEmpty(param.getAvatar())){
@@ -211,7 +211,7 @@ public class UserController extends  AppBaseController {
         user.setUserId(Long.parseLong(getUserId()));
         user.setAvatar(param.getAvatar());
         // 前端传了nickname 和 nickName 但是只有nickName是正确的
-        user.setNickName(StringUtils.isNotEmpty(param.getNickName())?param.getNickName():param.getNickName());
+        user.setNickName(StringUtils.isNotEmpty(param.getNickName())?param.getNickName():param.getNickname());
         if (ObjectUtils.isNotEmpty(param.getIsWeixinAuth())){
             user.setIsWeixinAuth(param.getIsWeixinAuth());
         }

+ 3 - 2
fs-user-app/src/main/java/com/fs/app/controller/live/LiveController.java

@@ -13,6 +13,7 @@ import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.bean.BeanUtils;
 import com.fs.live.domain.Live;
 import com.fs.live.domain.LiveMsg;
+import com.fs.live.param.LiveNotifyParam;
 import com.fs.live.service.*;
 import com.fs.live.vo.LiveVo;
 import com.github.pagehelper.PageHelper;
@@ -266,8 +267,8 @@ public class LiveController extends AppBaseController {
 
 	@PostMapping("/subNotifyLive")
 	@Transactional
-	@Login
-	public R subNotifyLive(@RequestBody HashMap<String,Object> param) {
+//	@Login
+	public R subNotifyLive(@RequestBody LiveNotifyParam param) {
 /*		String userId = getUserId();
 		return liveService.currentActivities(liveId,userId);*/
 		return liveService.subNotifyLive(param);

+ 12 - 1
fs-user-app/src/main/java/com/fs/app/controller/store/UserScrmController.java

@@ -28,6 +28,8 @@ import com.fs.hisStore.vo.FsStoreOrderTuiVO;
 import com.fs.hisStore.vo.FsStoreProductRelationQueryVO;
 import com.fs.hisStore.vo.FsUserExtractVO;
 import com.fs.hisStore.vo.FsUserTuiVO;
+import com.fs.live.domain.LiveOrder;
+import com.fs.live.service.ILiveOrderService;
 import com.fs.utils.FileCacheService;
 import com.fs.wx.miniapp.config.WxMaProperties;
 import com.github.pagehelper.PageHelper;
@@ -90,6 +92,9 @@ public class UserScrmController extends AppBaseController {
     private FileCacheService fileCacheService;
     @Autowired
     private WxMaProperties maProperties;
+    @Autowired
+    private ILiveOrderService liveOrderService;
+
     /**
      * 获取用户信息
      * @param request
@@ -102,9 +107,15 @@ public class UserScrmController extends AppBaseController {
             FsUserScrm user=userService.selectFsUserById(Long.parseLong(getUserId()));
             if (user.getIsShow() !=null && user.getIsShow() == 0){
                 FsStoreOrderScrm order = orderService.selectOrderByUserIdLimit1(user.getUserId());
-                if (order!=null){
+                if (order != null) {
                     user.setIsShow(1);
+                } else {
+                    LiveOrder liveOrder = liveOrderService.selectOrderByUserIdLimit1(user.getUserId());
+                    if (liveOrder!=null){
+                        user.setIsShow(1);
+                    }
                 }
+
             }
             return R.ok().put("user",user);
         } catch (Exception e){

+ 21 - 21
fs-user-app/src/main/java/com/fs/app/param/FsUserEditParam.java

@@ -12,13 +12,13 @@ import java.io.Serializable;
 
 @JsonIgnoreProperties(ignoreUnknown = true)
 public class FsUserEditParam implements Serializable {
-//    @NotNull(message = "用户昵称不能为空!")
-//    @JsonAlias("nickname")
-//    private String nickname;
+    @NotNull(message = "用户昵称不能为空!")
+    @JsonAlias("nickname")
+    private String nickname;
 
     //    @NotBlank(message = "用户头像不能为空!")
     private String avatar;
-    @NotNull(message = "用户昵称不能为空!")
+
     @JsonAlias("nickName")
     private String nickName;
 
@@ -26,13 +26,13 @@ public class FsUserEditParam implements Serializable {
     private Integer isWeixinAuth;
 
 
-//    public @NotNull(message = "用户昵称不能为空!") String getNickname() {
-//        return nickname;
-//    }
-//
-//    public void setNickname(@NotNull(message = "用户昵称不能为空!") String nickname) {
-//        this.nickname = nickname;
-//    }
+    public @NotNull(message = "用户昵称不能为空!") String getNickname() {
+        return nickname;
+    }
+
+    public void setNickname(@NotNull(message = "用户昵称不能为空!") String nickname) {
+        this.nickname = nickname;
+    }
 
     public String getAvatar() {
         return avatar;
@@ -66,14 +66,14 @@ public class FsUserEditParam implements Serializable {
         this.isWeixinAuth = isWeixinAuth;
     }
 
-//    @Override
-//    public String toString() {
-//        return "FsUserEditParam{" +
-//                "nickname='" + nickname + '\'' +
-//                ", avatar='" + avatar + '\'' +
-//                ", nickName='" + nickName + '\'' +
-//                ", userId=" + userId +
-//                ", isWeixinAuth=" + isWeixinAuth +
-//                '}';
-//    }
+    @Override
+    public String toString() {
+        return "FsUserEditParam{" +
+                "nickname='" + nickname + '\'' +
+                ", avatar='" + avatar + '\'' +
+                ", nickName='" + nickName + '\'' +
+                ", userId=" + userId +
+                ", isWeixinAuth=" + isWeixinAuth +
+                '}';
+    }
 }