Procházet zdrojové kódy

Merge remote-tracking branch 'origin/master'

吴树波 před 1 týdnem
rodič
revize
9103c45e23
27 změnil soubory, kde provedl 299 přidání a 97 odebrání
  1. 43 31
      fs-admin/src/main/java/com/fs/course/controller/FsUserCourseCompanyStatisticsController.java
  2. 8 8
      fs-admin/src/main/java/com/fs/hisStore/task/LiveTask.java
  3. 1 1
      fs-admin/src/main/java/com/fs/live/controller/LiveAutoTaskController.java
  4. 11 5
      fs-admin/src/main/java/com/fs/live/controller/LiveOrderController.java
  5. 1 1
      fs-company/src/main/java/com/fs/company/controller/live/LiveAutoTaskController.java
  6. 12 0
      fs-live-app/src/main/java/com/fs/live/websocket/service/WebSocketServer.java
  7. 11 23
      fs-service/src/main/java/com/fs/course/domain/FsUserCourseCompanyStatistics.java
  8. 1 1
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  9. 2 0
      fs-service/src/main/java/com/fs/his/config/FsSmsConfig.java
  10. 17 10
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsMenuScrmServiceImpl.java
  11. 1 1
      fs-service/src/main/java/com/fs/live/mapper/LiveOrderMapper.java
  12. 2 0
      fs-service/src/main/java/com/fs/live/service/ILiveOrderPaymentService.java
  13. 3 1
      fs-service/src/main/java/com/fs/live/service/impl/LiveAfterSalesServiceImpl.java
  14. 5 0
      fs-service/src/main/java/com/fs/live/service/impl/LiveOrderPaymentServiceImpl.java
  15. 47 0
      fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java
  16. 3 2
      fs-service/src/main/resources/application-config-dev.yml
  17. 1 0
      fs-service/src/main/resources/application-config-druid-heyantang.yml
  18. 6 5
      fs-service/src/main/resources/application-config-druid-sft.yml
  19. 1 0
      fs-service/src/main/resources/application-config-zkzh.yml
  20. 4 0
      fs-service/src/main/resources/application-druid-kyt.yml
  21. 1 2
      fs-service/src/main/resources/mapper/course/FsUserCompanyBindMapper.xml
  22. 1 1
      fs-service/src/main/resources/mapper/course/FsUserCourseCompanyStatisticsMapper.xml
  23. 75 0
      fs-user-app/src/main/java/com/fs/app/controller/AppLoginController.java
  24. 17 0
      fs-user-app/src/main/java/com/fs/app/controller/CommonController.java
  25. 15 3
      fs-user-app/src/main/java/com/fs/app/controller/live/LiveController.java
  26. 2 2
      fs-user-app/src/main/java/com/fs/app/controller/live/LiveOrderController.java
  27. 8 0
      fs-user-app/src/main/java/com/fs/app/controller/store/IndexScrmController.java

+ 43 - 31
fs-admin/src/main/java/com/fs/course/controller/FsUserCourseCompanyStatisticsController.java

@@ -89,44 +89,56 @@ public class FsUserCourseCompanyStatisticsController extends BaseController
     @PreAuthorize("@ss.hasPermi('course:statistics:export')")
     @Log(title = "会员每日看课统计", businessType = BusinessType.EXPORT)
     @GetMapping("/export")
-    public AjaxResult export(FsUserCourseCompanyStatistics fsUserCourseCompanyStatistics)
-    {
+    public AjaxResult export(FsUserCourseCompanyStatistics fsUserCourseCompanyStatistics) {
+
         List<FsUserCourseCompanyStatistics> list =
                 fsUserCourseCompanyStatisticsService.selectFsUserCourseCompanyStatisticsTotal(fsUserCourseCompanyStatistics);
 
-        Optional.ofNullable(list).orElse(Collections.emptyList())
-                .forEach(item -> {
-                    // 计算完播率 (完播次数 / 观看次数 * 100)
-                    item.setCompleteRate(
-                            Optional.ofNullable(item.getWatchCount())
-                                    .filter(watchCount -> watchCount > 0)
-                                    .map(watchCount -> BigDecimal.valueOf(
-                                                    Optional.ofNullable(item.getCompleteWatchCount()).orElse(0L))
-                                            .multiply(BigDecimal.valueOf(100))
-                                            .divide(BigDecimal.valueOf(watchCount), 2, RoundingMode.HALF_UP)
-                                            .longValue()
-                                    )
-                                    .orElse(0L)
-                    );
-
-                    // 计算正确率 (正确人次 / 答题人次 * 100)
-                    item.setCorrectRate(
-                            Optional.ofNullable(item.getAnswerCount())
-                                    .filter(answerCount -> answerCount > 0)
-                                    .map(answerCount -> BigDecimal.valueOf(
-                                                    Optional.ofNullable(item.getCorrectCount()).orElse(0L))
-                                            .multiply(BigDecimal.valueOf(100))
-                                            .divide(BigDecimal.valueOf(answerCount), 2, RoundingMode.HALF_UP)
-                                            .longValue()
-                                    )
-                                    .orElse(0L)
-                    );
-                });
+        if (list == null) {
+            list = Collections.emptyList();
+        }
+
+        for (FsUserCourseCompanyStatistics item : list) {
 
-        ExcelUtil<FsUserCourseCompanyStatistics> util = new ExcelUtil<FsUserCourseCompanyStatistics>(FsUserCourseCompanyStatistics.class);
+            Long watchCount = item.getWatchCount();
+            Long completeWatchCount = Optional.ofNullable(item.getCompleteWatchCount()).orElse(0L);
+
+            // 完播率 = 完播次数 / 观看次数 * 100  (放大100倍存入long,再格式化两位小数)
+            if (watchCount != null && watchCount > 0) {
+                Long rateValue = BigDecimal.valueOf(completeWatchCount)
+                        .multiply(BigDecimal.valueOf(10000)) // 100*100
+                        .divide(BigDecimal.valueOf(watchCount), 0, RoundingMode.HALF_UP)
+                        .longValue();
+                item.setCompleteRate(rateValue);
+                item.setCompleteRateStr(String.format("%.2f%%", rateValue / 100.0));  // Excel 格式化
+            } else {
+                item.setCompleteRate(0L);
+                item.setCompleteRateStr("0.00%");
+            }
+
+            Long answerCount = item.getAnswerCount();
+            Long correctCount = Optional.ofNullable(item.getCorrectCount()).orElse(0L);
+
+            // 正确率 = 正确人次 / 答题人次 * 100
+            if (answerCount != null && answerCount > 0) {
+                Long rateValue = BigDecimal.valueOf(correctCount)
+                        .multiply(BigDecimal.valueOf(10000))
+                        .divide(BigDecimal.valueOf(answerCount), 0, RoundingMode.HALF_UP)
+                        .longValue();
+                item.setCorrectRate(rateValue);
+                item.setCorrectRateStr(String.format("%.2f%%", rateValue / 100.0));
+            } else {
+                item.setCorrectRate(0L);
+                item.setCorrectRateStr("0.00%");
+            }
+        }
+
+        ExcelUtil<FsUserCourseCompanyStatistics> util = new ExcelUtil<>(FsUserCourseCompanyStatistics.class);
         return util.exportExcel(list, "会员每日看课统计数据");
     }
 
+
+
     /**
      * 获取会员每日看课统计详细信息
      */

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

@@ -150,10 +150,10 @@ 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();
+//        for (Long id : ids) {
+//            liveOrderService.createOmsOrder(id);
+//        }
     }
 
     public void redPacketSubMoney() throws Exception {
@@ -317,10 +317,10 @@ public class LiveTask {
     }
 
     public void updateOrderItem() throws ParseException {
-        List<Long> ids = liveOrderService.selectOrderIdByNoErp();
-        for (Long id : ids) {
-            liveOrderService.createOmsOrder(id);
-        }
+//        List<Long> ids = liveOrderService.selectOrderIdByNoErp();
+//        for (Long id : ids) {
+//            liveOrderService.createOmsOrder(id);
+//        }
     }
 
     //每天执行一次

+ 1 - 1
fs-admin/src/main/java/com/fs/live/controller/LiveAutoTaskController.java

@@ -66,7 +66,7 @@ public class LiveAutoTaskController extends BaseController
         return getDataTable(list);
     }
 
-    @PreAuthorize("@ss.hasPermi('live:task:list')")
+//    @PreAuthorize("@ss.hasPermi('live:task:list')")
     @GetMapping("/consoleList")
     public TableDataInfo consoleList(LiveAutoTask liveAutoTask)
     {

+ 11 - 5
fs-admin/src/main/java/com/fs/live/controller/LiveOrderController.java

@@ -484,8 +484,12 @@ public class LiveOrderController extends BaseController
     {
         logger.info("手动推管易 订单号: {}",orderCode);
         LiveOrder order=liveOrderService.selectOrderIdByOrderCode(orderCode);
-        liveOrderService.createOmsOrder(order.getOrderId());
-        return R.ok();
+        if (orderPaymentService.selectByBussinessId(order.getOrderId()) != null) {
+            liveOrderService.createOmsOrder(order.getOrderId());
+            return R.ok();
+        }
+        return R.error("订单未支付!");
+
     }
 
     @Log(title = "同步管易物流单号", businessType = BusinessType.UPDATE)
@@ -636,9 +640,11 @@ public class LiveOrderController extends BaseController
                     orderLogsService.create(orderId, FsStoreOrderLogEnum.SET_PUSH_ACCOUNT.getValue(),
                             nickName + " " +FsStoreOrderLogEnum.SET_PUSH_ACCOUNT.getDesc() + ":" + df.getLoginAccount());
                 }
-                liveOrderService.createOmsOrder(orderId);
-                orderLogsService.create(orderId, FsStoreOrderLogEnum.PUSH_ORDER_ERP.getValue(),
-                        nickName + " " +FsStoreOrderLogEnum.PUSH_ORDER_ERP.getDesc() + ":" + df.getLoginAccount());
+                if (orderPaymentService.selectByBussinessId(orderId) != null) {
+                    liveOrderService.createOmsOrder(orderId);
+                    orderLogsService.create(orderId, FsStoreOrderLogEnum.PUSH_ORDER_ERP.getValue(),
+                            nickName + " " +FsStoreOrderLogEnum.PUSH_ORDER_ERP.getDesc() + ":" + df.getLoginAccount());
+                }
             } catch (ParseException e) {
                 throw new RuntimeException(e);
             }

+ 1 - 1
fs-company/src/main/java/com/fs/company/controller/live/LiveAutoTaskController.java

@@ -55,7 +55,7 @@ public class LiveAutoTaskController extends BaseController
         return getDataTable(list);
     }
 
-    @PreAuthorize("@ss.hasPermi('live:task:list')")
+//    @PreAuthorize("@ss.hasPermi('live:task:list')")
     @GetMapping("/consoleList")
     public TableDataInfo consoleList(LiveAutoTask liveAutoTask)
     {

+ 12 - 0
fs-live-app/src/main/java/com/fs/live/websocket/service/WebSocketServer.java

@@ -365,6 +365,9 @@ public class WebSocketServer {
                 case "goods":
                     sendGoodsMessage(msg);
                     break;
+                case "deleteMsg":
+                    deleteMsg(liveId,msg);
+                    break;
                 case "red":
                     processRed(liveId, msg);
                     break;
@@ -385,6 +388,15 @@ public class WebSocketServer {
         }
     }
 
+    private void deleteMsg(long liveId,SendMsgVo msg) {
+        SendMsgVo sendMsgVo = new SendMsgVo();
+        sendMsgVo.setLiveId(liveId);
+        sendMsgVo.setUserType(0L);
+        sendMsgVo.setCmd("deleteMsg");
+        sendMsgVo.setMsg(msg.getMsg());
+        broadcastMessage(liveId, JSONObject.toJSONString(R.ok().put("data", sendMsgVo)));
+    }
+
     private void processCoupon(long liveId, SendMsgVo msg) {
         JSONObject jsonObject = JSON.parseObject(msg.getData());
         Integer status = jsonObject.getInteger("status");

+ 11 - 23
fs-service/src/main/java/com/fs/course/domain/FsUserCourseCompanyStatistics.java

@@ -17,67 +17,55 @@ import lombok.EqualsAndHashCode;
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
-public class FsUserCourseCompanyStatistics extends BaseEntity{
+public class FsUserCourseCompanyStatistics extends BaseEntity {
 
-    /** 主键ID */
     private Long id;
 
-    /** 项目ID */
-//    @Excel(name = "项目ID")
     private Long projectId;
 
-    /** 完播次数(人次) */
-    @Excel(name = "完播次数", readConverterExp = "人=次")
+    @Excel(name = "完播次数")
     private Long completeWatchCount;
 
-    /** 观看次数(人次) */
-    @Excel(name = "观看次数", readConverterExp = "人=次")
+    @Excel(name = "观看次数")
     private Long watchCount;
 
-    /** 完播率(完播次数/观看次数) */
-    @Excel(name = "完播率", readConverterExp = "完=播次数/观看次数")
+    /** DB字段,存放放大100倍后的比例整数值,例 12.34% -> 1234 */
     private Long completeRate;
 
-    /** 答题人次 */
     @Excel(name = "答题人次")
     private Long answerCount;
 
-    /** 正确人次 */
     @Excel(name = "正确人次")
     private Long correctCount;
 
-    /** 正确率(正确人次/答题人次) */
-    @Excel(name = "正确率", readConverterExp = "正=确人次/答题人次")
+    /** DB字段,同样放大100倍后存储 */
     private Long correctRate;
 
-    /** 领取次数 */
     @Excel(name = "领取次数")
     private Long receiveCount;
 
-    /** 领取金额(元) */
-    @Excel(name = "领取金额", readConverterExp = "元=")
+    @Excel(name = "领取金额(元)")
     private BigDecimal receiveAmount;
 
-    /** 会员数量 */
     @Excel(name = "会员数量")
     private Long userCount;
 
-    /** 会员黑名单数量 */
     @Excel(name = "会员黑名单数量")
     private Long userBlacklistCount;
 
-    /** 公司ID */
-//    @Excel(name = "公司ID")
     private Long companyId;
 
-    /** 公司名称 */
     @Excel(name = "公司名称")
     private String companyName;
 
-    /** 统计日期 */
     @JsonFormat(pattern = "yyyy-MM-dd")
     @Excel(name = "统计日期", width = 30, dateFormat = "yyyy-MM-dd")
     private Date createDate;
 
+    /** 用于 Excel 导出显示的字符串,不入库 */
+    @Excel(name = "完播率(%)")
+    private String completeRateStr;
 
+    @Excel(name = "正确率(%)")
+    private String correctRateStr;
 }

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

@@ -1498,7 +1498,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             // 更新观看记录的奖励类型
             log.setRewardType(config.getRewardType());
             courseWatchLogMapper.updateFsCourseWatchLog(log);
-            return R.ok("红包发送成功");
+            return R.ok("答题成功!");
         }
 
     }

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

@@ -21,4 +21,6 @@ public class FsSmsConfig {
     private String dhPassword2;
     private String dhSign;
 
+    private Integer isSmsVerification; //是否开启短信验证
+
 }

+ 17 - 10
fs-service/src/main/java/com/fs/hisStore/service/impl/FsMenuScrmServiceImpl.java

@@ -3,6 +3,8 @@ package com.fs.hisStore.service.impl;
 import java.util.List;
 import com.fs.common.utils.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 import com.fs.hisStore.mapper.FsMenuScrmMapper;
 import com.fs.hisStore.domain.FsMenuScrm;
@@ -10,7 +12,7 @@ import com.fs.hisStore.service.IFsMenuScrmService;
 
 /**
  * 用户端菜单管理Service业务层处理
- * 
+ *
  * @author fs
  * @date 2022-03-15
  */
@@ -22,7 +24,7 @@ public class FsMenuScrmServiceImpl implements IFsMenuScrmService
 
     /**
      * 查询用户端菜单管理
-     * 
+     *
      * @param menuId 用户端菜单管理ID
      * @return 用户端菜单管理
      */
@@ -34,23 +36,25 @@ public class FsMenuScrmServiceImpl implements IFsMenuScrmService
 
     /**
      * 查询用户端菜单管理列表
-     * 
-     * @param fsMenu 用户端菜单管理
+     *
+     * @param param 用户端菜单管理
      * @return 用户端菜单管理
      */
     @Override
-    public List<FsMenuScrm> selectFsMenuList(FsMenuScrm fsMenu)
+    @Cacheable(value = "selectFsMenuList", key = "#param")
+    public List<FsMenuScrm> selectFsMenuList(FsMenuScrm param)
     {
-        return fsMenuMapper.selectFsMenuList(fsMenu);
+        return fsMenuMapper.selectFsMenuList(param);
     }
 
     /**
      * 新增用户端菜单管理
-     * 
+     *
      * @param fsMenu 用户端菜单管理
      * @return 结果
      */
     @Override
+    @CacheEvict(value = "selectFsMenuList",allEntries = true)
     public int insertFsMenu(FsMenuScrm fsMenu)
     {
         fsMenu.setCreateTime(DateUtils.getNowDate());
@@ -59,11 +63,12 @@ public class FsMenuScrmServiceImpl implements IFsMenuScrmService
 
     /**
      * 修改用户端菜单管理
-     * 
+     *
      * @param fsMenu 用户端菜单管理
      * @return 结果
      */
     @Override
+    @CacheEvict(value = "selectFsMenuList",allEntries = true)
     public int updateFsMenu(FsMenuScrm fsMenu)
     {
         fsMenu.setUpdateTime(DateUtils.getNowDate());
@@ -72,11 +77,12 @@ public class FsMenuScrmServiceImpl implements IFsMenuScrmService
 
     /**
      * 批量删除用户端菜单管理
-     * 
+     *
      * @param menuIds 需要删除的用户端菜单管理ID
      * @return 结果
      */
     @Override
+    @CacheEvict(value = "selectFsMenuList",allEntries = true)
     public int deleteFsMenuByIds(Long[] menuIds)
     {
         return fsMenuMapper.deleteFsMenuByIds(menuIds);
@@ -84,11 +90,12 @@ public class FsMenuScrmServiceImpl implements IFsMenuScrmService
 
     /**
      * 删除用户端菜单管理信息
-     * 
+     *
      * @param menuId 用户端菜单管理ID
      * @return 结果
      */
     @Override
+    @CacheEvict(value = "selectFsMenuList",allEntries = true)
     public int deleteFsMenuById(Long menuId)
     {
         return fsMenuMapper.deleteFsMenuById(menuId);

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

@@ -110,7 +110,7 @@ public interface LiveOrderMapper {
     @Select("select order_id from live_order where `status` = 2")
     List<Long> selectSyncExpressIds();
 
-    @Select("select order_id from live_order where `status` = 1 and extend_order_id is null ")
+    @Select("select order_id from live_order where `status` = 1 and extend_order_id is null and is_pay='1'")
     List<Long> selectOrderIdByNoErp();
 
     @Select("select * from live_order where extend_order_id is not null and `status`=2")

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

@@ -65,4 +65,6 @@ public interface ILiveOrderPaymentService {
     LiveOrderPaymentVo selectLiveOrderPaymentByPaymentIdNew(Long paymentId);
 
     List<LiveOrderPayment> selectLiveOrderPaymentByOrderId(Long id);
+
+    LiveOrderPayment selectByBussinessId(Long orderCode);
 }

+ 3 - 1
fs-service/src/main/java/com/fs/live/service/impl/LiveAfterSalesServiceImpl.java

@@ -873,7 +873,9 @@ public class LiveAfterSalesServiceImpl implements ILiveAfterSalesService {
                 }
 
                 try {
-                    liveOrderService.createOmsOrder(order.getOrderId());
+                    if (liveOrderPaymentMapper.selectByBuissnessId(Long.valueOf(order.getOrderCode())) != null) {
+                        liveOrderService.createOmsOrder(order.getOrderId());
+                    }
                 } catch (Exception e) {
                     log.error("推送ERP订单失败!",e);
                 }

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

@@ -62,6 +62,11 @@ public class LiveOrderPaymentServiceImpl implements ILiveOrderPaymentService {
         return baseMapper.selectLiveOrderPaymentByOrderId(id);
     }
 
+    @Override
+    public LiveOrderPayment selectByBussinessId(Long orderId) {
+        return baseMapper.selectByBuissnessId(orderId);
+    }
+
     /**
      * 新增支付明细
      *

+ 47 - 0
fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java

@@ -624,6 +624,47 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
 //        return R.error();
 //
 //    }
+    private void createOmsOrderCall(LiveOrder inOrder)  throws ParseException {
+        LiveOrder order = liveOrderMapper.selectLiveOrderByOrderId(String.valueOf(inOrder.getOrderId()));
+        LiveOrderPayment liveOrderPayment = liveOrderPaymentMapper.selectByBuissnessId(order.getOrderId());
+        if (liveOrderPayment == null) {
+            log.info("订单:{},未找到支付信息,不进行推送", order.getOrderCode());
+            return ;
+        }
+        FsSysConfig erpConfig = configUtil.generateStructConfigByKey(SysConfigEnum.HIS_CONFIG.getKey(), FsSysConfig.class);
+        List<Long> noErpCompany = erpConfig.getNoErpCompany();
+        if (noErpCompany != null && noErpCompany.contains(order.getCompanyId())) {
+            log.info("订单:{},相关公司不推送erp", order.getOrderCode());
+            return ;
+        }
+        IErpOrderService erpOrderService = getErpService();
+        if (erpOrderService == null) {
+            log.info("未启用erp");
+            return;
+        }
+        if (!StringUtils.isEmpty(order.getExtendOrderId()) && order.getStatus() != 1) {
+            return ;
+        }
+        if(order.getUserName() == null || StringUtils.isEmpty(order.getUserName())) return;
+        ErpOrder erpOrder = getErpOrder(order);
+        if(erpOrder == null ){
+            log.info("组合码为空,订单ID:" + order.getOrderCode());
+            return ;
+        }
+
+        if (erpOrderService == jSTOrderService) {
+            erpOrder.setShop_code(erpConfig.getErpJstShopCode());
+        }
+        ErpOrderResponse response = erpOrderService.addLiveOrder(erpOrder);
+
+        //写入日志
+        log.info("ErpCreate:" + order.getOrderCode() + ":" + JSONUtil.toJsonStr(response));
+        //支付成功后 将订单号写入待发货的REDIS中
+        redisCache.setCacheObject(DELIVERY + ":" + response.getCode(), order.getOrderCode());
+        //写入外部订单号
+        order.setExtendOrderId(response.getCode());
+        liveOrderMapper.updateLiveOrder(order);
+    }
 
     @Override
     @Transactional(rollbackFor = Throwable.class,propagation = Propagation.REQUIRED)
@@ -687,6 +728,7 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
             order.setPayTime(LocalDateTime.now());
             order.setIsPay("1");
             baseMapper.updateLiveOrder(order);
+            this.createOmsOrderCall(order);
             return "SUCCESS";
         }catch (Exception e){
             log.info("支付错误:"+e.getMessage());
@@ -1504,6 +1546,11 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
     @Override
     public R createOmsOrder(Long orderId)  throws ParseException {
         LiveOrder order = liveOrderMapper.selectLiveOrderByOrderId(String.valueOf(orderId));
+        LiveOrderPayment liveOrderPayment = liveOrderPaymentMapper.selectByBuissnessId(orderId);
+        if (liveOrderPayment == null) {
+            log.info("订单:{},未找到支付信息", order.getOrderCode());
+            return R.error("订单:" + order.getOrderCode() + ",未找到支付信息");
+        }
         FsSysConfig erpConfig = configUtil.generateStructConfigByKey(SysConfigEnum.HIS_CONFIG.getKey(), FsSysConfig.class);
         List<Long> noErpCompany = erpConfig.getNoErpCompany();
         if (noErpCompany != null && noErpCompany.contains(order.getCompanyId())) {

+ 3 - 2
fs-service/src/main/resources/application-config-dev.yml

@@ -92,10 +92,10 @@ nuonuo:
 tencent_cloud_config:
   secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT
   secret_key: u5SuS80342xzx8FRBukza9lVNHKNMSaB
-  bucket: jkj-1323137866
+  bucket: cqsft-1323137866
   app_id: 1323137866
   region: ap-chongqing
-  proxy: jkj
+  proxy: cqsft
 tmp_secret_config:
   secret_id: AKIDCj7NSNAovtqeJpBau8GZ4CGB71thXIxX
   secret_key: lTB5zwqqz7CNhzDOWivFWedgfTBgxgBT
@@ -109,6 +109,7 @@ cloud_host:
 headerImg:
   imgUrl: https://jz-cos-1356808054.cos.ap-chengdu.myqcloud.com/fs/20250515/0877754b59814ea8a428fa3697b20e68.png
 ipad:
+  url:
   ipadUrl: http://ipad.cdwjyyh.com
   aiApi: http://152.136.202.157:3000/api
   voiceApi:

+ 1 - 0
fs-service/src/main/resources/application-config-druid-heyantang.yml

@@ -83,6 +83,7 @@ cloud_host:
 headerImg:
   imgUrl: https
 ipad:
+  url:
   ipadUrl: https://qwipad.yytcdtb.cn
   aiApi: http://127.0.0.1:3000/api
   voiceApi:

+ 6 - 5
fs-service/src/main/resources/application-config-druid-sft.yml

@@ -67,12 +67,12 @@ nuonuo:
   secret: A2EB20764D304D16
 # 存储捅配置
 tencent_cloud_config:
-  secret_id: AKIDpY8d3KcptqdCaoqeVHuKYZMvITULzQta
-  secret_key: cBShmjU4SwNejgS2PYUFnR7dzAC6pW3Q
-  bucket: sft-1361917636
-  app_id: 1361917636
+  secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT
+  secret_key: u5SuS80342xzx8FRBukza9lVNHKNMSaB
+  bucket: cqsft-1323137866
+  app_id: 1323137866
   region: ap-chongqing
-  proxy: fs
+  proxy: cqsft
 cloud_host:
   company_name: 四福堂
   projectCode: SFT
@@ -80,6 +80,7 @@ cloud_host:
 headerImg:
   imgUrl: https://sft-1361917636.cos.ap-chongqing.myqcloud.com/sft/20250606/b08b1a6212f44f2998423c8c5d7712ee.png
 ipad:
+  url:
   ipadUrl: http://qwipad.cqsft.vip
   aiApi:
   voiceApi:

+ 1 - 0
fs-service/src/main/resources/application-config-zkzh.yml

@@ -144,6 +144,7 @@ nuonuo:
   key: 10924508
   secret: A2EB20764D304D16
 ipad:
+  url:
   ipadUrl: http://qwipad.muyi88.com
   aiApi: http://152.136.202.157:3000/api
   voiceApi:

+ 4 - 0
fs-service/src/main/resources/application-druid-kyt.yml

@@ -153,3 +153,7 @@ im:
 isNewWxMerchant: true
 
 enableRedPackAccount: 0
+
+ipad:
+  url: https://manwatch.ylrzcloud.com/prod-api
+  companyId: 99999

+ 1 - 2
fs-service/src/main/resources/mapper/course/FsUserCompanyBindMapper.xml

@@ -134,8 +134,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         b.nick_name fsUserName,
         c.dict_label projectName,
         e.course_name,
-        IF(g.company_user_id = #{userId}, g.qw_user_name, '其他') qwUserName,
---         g.qw_user_name,
+        g.qw_user_name,
         f.title videoName,
         qc.corp_name
         from

+ 1 - 1
fs-service/src/main/resources/mapper/course/FsUserCourseCompanyStatisticsMapper.xml

@@ -239,7 +239,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 AND DATE(create_date) <![CDATA[ <= ]]> #{endTime}
             </if>
         </where>
-
+        group by company_id,DATE(create_date)
         <!-- 排序:合计行放最后 -->
         ORDER BY create_time DESC
     </select>

+ 75 - 0
fs-user-app/src/main/java/com/fs/app/controller/AppLoginController.java

@@ -120,6 +120,81 @@ public class AppLoginController extends AppBaseController{
         }
     }
 
+    @PostMapping("/registerSendCode")
+    public R registerSendCode(@RequestBody Map<String, String> body){
+        String phone = body.get("phone");
+        String encryptPhone = encryptPhone(phone);
+        List<FsUser> user = userService.selectFsUserListByPhone(encryptPhone);
+        if(CollectionUtil.isEmpty(user)){
+            user = userService.selectFsUserListByPhone(encryptPhoneOldKey(phone));
+        }
+        if (!CollectionUtil.isEmpty(user)){
+            return R.error("此电话号码已注册");
+        }
+
+        // 验证码 key(存验证码,3分钟有效)
+        String smsCodeKey = "sms:code:" + phone;
+        // 发送冷却 key(限制60秒内不能再次发送)
+        String smsCooldownKey = "sms:cooldown:" + phone;
+
+        // 判断是否在60秒冷却时间内
+        if (redisCache.getCacheObject(smsCooldownKey) != null) {
+            return R.error("验证码已发送,请稍后再试");
+        }
+
+        // 生成新的验证码
+        String smsCode = VerifyCodeUtil.generateCode();
+
+        // 发送短信
+        smsService.sendCaptcha(phone, smsCode, "验证码");
+
+        // 缓存验证码(3分钟有效)
+        redisCache.setCacheObject(smsCodeKey, smsCode, 180, TimeUnit.SECONDS);
+        // 设置冷却时间(60秒内不能再发)
+        redisCache.setCacheObject(smsCooldownKey, "1", 60, TimeUnit.SECONDS);
+
+        return R.ok("验证码已发送");
+    }
+
+
+    @PostMapping("/registerByPhone")
+    public R registerByPhone(@RequestBody Map<String,String> map){
+        String phone = map.get("phone");
+        String code = map.get("code");
+        String password = map.get("password");
+        String encryptPhone = encryptPhone(phone);
+        List<FsUser> users = userService.selectFsUserListByPhone(encryptPhone);
+        if (users == null || CollectionUtil.isEmpty(users)){
+            String s = encryptPhoneOldKey(phone);
+            users = userService.selectFsUserListByPhone(s);
+        }
+        if (!CollectionUtil.isEmpty(users)){
+            return R.error("此账号已经注册");
+        }
+        String redisCode = redisCache.getCacheObject("sms:code:" + phone);
+        if (StringUtils.isEmpty(redisCode)){
+            return R.error("验证码已过期,请重新发送");
+        }
+        if (!redisCode.equals(code)) {
+            return R.error("验证码错误");
+        }
+        FsUser user = new FsUser();
+        // 创建新用户
+        user.setPhone(phone);
+        user.setJpushId(map.get("jpushId"));
+        user.setSource(map.get("source"));
+        user.setNickName("app用户" + phone.substring(phone.length() - 4));
+        user.setStatus(1);
+        user.setAvatar("https://cos.his.cdwjyyh.com/fs/20240926/420728ee06e54575ba82665dedb4756b.png");
+        user.setPassword(Md5Utils.hash(password));
+        user.setCreateTime(new Date());
+        if (userService.insertFsUser(user) > 0) {
+            return R.ok("注册成功");
+        } else {
+            return R.error("注册失败");
+        }
+    }
+
 
 
 

+ 17 - 0
fs-user-app/src/main/java/com/fs/app/controller/CommonController.java

@@ -41,6 +41,7 @@ import com.fs.event.TemplateEvent;
 import com.fs.event.TemplateListenEnum;
 import com.fs.event.WeixinTemplateService;
 import com.fs.framework.config.ServerConfig;
+import com.fs.his.config.FsSmsConfig;
 import com.fs.his.config.FsSysConfig;
 import com.fs.his.domain.*;
 import com.fs.his.param.FsInquiryOrderFinishParam;
@@ -662,4 +663,20 @@ public class CommonController {
 
 		return R.ok().put("addressUrl", addressUrl).put("imgpath", imgPath).put("sendType", sendType);
 	}
+
+	@GetMapping(value = "/isSmsVerification")
+	@ApiOperation("获取app是否短信验证配置")
+	public R isSmsVerification()
+	{
+		String config=configService.selectConfigByKey("his.sms");
+		if (StringUtils.isBlank(config)){
+			return  R.ok().put("isSmsVerification",0);
+		}
+		FsSmsConfig sms = JSON.parseObject(config, FsSmsConfig.class);
+		if (sms != null && sms.getIsSmsVerification() != null){
+			return R.ok().put("isSmsVerification",sms.getIsSmsVerification());
+		}
+		return  R.ok().put("isSmsVerification",0);
+
+	}
 }

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

@@ -8,6 +8,7 @@ import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.domain.BaseEntity;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.page.PageRequest;
+import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.bean.BeanUtils;
 import com.fs.live.domain.Live;
@@ -23,6 +24,7 @@ import lombok.AllArgsConstructor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
@@ -53,6 +55,17 @@ public class LiveController extends AppBaseController {
 	@Autowired
 	private LiveFacadeService liveFacadeService;
 
+	/**
+	 * 查询未结束直播间
+	 */
+	@GetMapping("/listToLiveNoEnd")
+	public TableDataInfo listToLiveNoEnd(Live live)
+	{
+		startPage();
+		List<Live> list = liveService.listToLiveNoEnd(live);
+		return getDataTable(list);
+	}
+
 
 
 
@@ -115,15 +128,14 @@ public class LiveController extends AppBaseController {
 	@GetMapping("/liveListAll")
 	@ApiResponse(code = 200, message = "", response = LiveInfoVo.class)
 	public R liveListAll(PageRequest pageRequest) {
-/*		PageHelper.startPage(Integer.parseInt(ServletUtils.getParameter("pageNum")) ,Integer.parseInt(ServletUtils.getParameter("pageSize")) );
+		PageHelper.startPage(Integer.parseInt(ServletUtils.getParameter("pageNum")) ,Integer.parseInt(ServletUtils.getParameter("pageSize")) );
 		try {
 			List<Live> list = liveService.liveList();
 			PageInfo<Live> result = new PageInfo<>(list);
 			return R.ok().put("data", result);
 		} catch (Exception e) {
 			return R.error("操作异常");
-		}*/
-		return liveService.liveListAll(pageRequest);
+		}
 	}
 
 	@Login

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

@@ -165,7 +165,7 @@ public class LiveOrderController extends AppBaseController
     @ApiOperation("获取我的订单列表")
     @GetMapping("/getMyStoreOrderList")
     public R getMyStoreOrderList(FsMyLiveOrderQueryParam param, HttpServletRequest request){
-        PageHelper.startPage(param.getPage(), param.getPageSize());
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
         param.setUserId(Long.parseLong(getUserId()));
         List<FsMyLiveOrderListQueryVO> list=orderService.selectFsMyLiveOrderListVO(param);
         PageInfo<FsMyLiveOrderListQueryVO> listPageInfo=new PageInfo<>(list);
@@ -176,7 +176,7 @@ public class LiveOrderController extends AppBaseController
     @ApiOperation("获取销售公司订单列表")
     @GetMapping("/getCompanyStoreOrderList")
     public R getCompanyStoreOrderList(FsMyLiveOrderQueryParam param, HttpServletRequest request){
-        PageHelper.startPage(param.getPage(), param.getPageSize());
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
         List<FsMyLiveOrderListQueryVO> list=orderService.selectFsCompanyLiveOrderListVO(param);
         PageInfo<FsMyLiveOrderListQueryVO> listPageInfo=new PageInfo<>(list);
         return R.ok().put("data",listPageInfo);

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

@@ -91,6 +91,14 @@ public class IndexScrmController extends AppBaseController {
 		return R.ok().put("data",list);
 	}
 
+	@ApiOperation("读取菜单配置")
+	@GetMapping("/getMenuList")
+	public R getMenuList(FsMenuScrm map){
+		map.setIsShow(1);
+		List<FsMenuScrm> list=menuService.selectFsMenuList(map);
+		return R.ok().put("data",list);
+	}
+
 	@ApiOperation("读取个人中心")
 	@GetMapping("/getMenuUser")
 	@Cacheable("menuUser")