Przeglądaj źródła

Merge branch 'master' of http://1.14.104.71:10880/root/ylrz_his_scrm_java

caoliqin 19 godzin temu
rodzic
commit
95efa59382
25 zmienionych plików z 309 dodań i 49 usunięć
  1. 25 4
      fs-admin/src/main/java/com/fs/his/controller/FsStorePaymentController.java
  2. 5 4
      fs-company-app/src/main/java/com/fs/app/controller/FsUserController.java
  3. 13 0
      fs-company/src/main/java/com/fs/company/controller/qw/QwSopTempController.java
  4. 5 3
      fs-live-app/src/main/java/com/fs/live/task/Task.java
  5. 7 3
      fs-live-app/src/main/java/com/fs/live/websocket/service/WebSocketServer.java
  6. 1 1
      fs-service/src/main/java/com/fs/fastGpt/service/impl/AiHookServiceImpl.java
  7. 5 0
      fs-service/src/main/java/com/fs/his/domain/FsStorePaymentError.java
  8. 2 2
      fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java
  9. 9 0
      fs-service/src/main/java/com/fs/his/service/IFsStorePaymentErrorService.java
  10. 21 0
      fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentErrorServiceImpl.java
  11. 44 5
      fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java
  12. 3 3
      fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java
  13. 1 1
      fs-service/src/main/java/com/fs/live/domain/LiveOrder.java
  14. 14 12
      fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java
  15. 5 5
      fs-service/src/main/java/com/fs/live/service/impl/LiveVideoServiceImpl.java
  16. 11 0
      fs-service/src/main/java/com/fs/qw/domain/QwCompany.java
  17. 4 0
      fs-service/src/main/java/com/fs/qw/service/impl/QwUserServiceImpl.java
  18. 6 0
      fs-service/src/main/java/com/fs/sop/mapper/QwSopTempRulesMapper.java
  19. 22 0
      fs-service/src/main/java/com/fs/sop/params/BatchOpenOrCloseOfficialParam.java
  20. 10 0
      fs-service/src/main/java/com/fs/sop/service/IQwSopTempService.java
  21. 30 0
      fs-service/src/main/java/com/fs/sop/service/impl/QwSopTempServiceImpl.java
  22. 11 1
      fs-service/src/main/resources/mapper/his/FsStorePaymentErrorMapper.xml
  23. 13 4
      fs-service/src/main/resources/mapper/his/FsUserMapper.xml
  24. 16 1
      fs-service/src/main/resources/mapper/qw/QwCompanyMapper.xml
  25. 26 0
      fs-service/src/main/resources/mapper/sop/QwSopTempRulesMapper.xml

+ 25 - 4
fs-admin/src/main/java/com/fs/his/controller/FsStorePaymentController.java

@@ -5,10 +5,10 @@ import java.util.List;
 
 import com.fs.common.core.domain.R;
 import com.fs.common.utils.SecurityUtils;
-import com.fs.his.domain.FsExportTask;
+import com.fs.his.domain.*;
 import com.fs.his.mapper.FsPrescribeMapper;
 import com.fs.his.param.FsStorePaymentParam;
-import com.fs.his.service.IFsExportTaskService;
+import com.fs.his.service.*;
 import com.fs.his.vo.FsStorePaymentExcelVO;
 import com.fs.his.vo.FsStorePaymentVO;
 import lombok.extern.slf4j.Slf4j;
@@ -26,8 +26,6 @@ import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.enums.BusinessType;
-import com.fs.his.domain.FsStorePayment;
-import com.fs.his.service.IFsStorePaymentService;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.common.core.page.TableDataInfo;
 
@@ -44,11 +42,17 @@ public class FsStorePaymentController extends BaseController
 {
     @Autowired
     private IFsStorePaymentService fsStorePaymentService;
+
+    @Autowired
+    private IFsStorePaymentErrorService fsStorePaymentErrorService;
     @Autowired
     FsPrescribeMapper fsPrescribeMapper;
 
     @Autowired
     private IFsExportTaskService exportTaskService;
+    @Autowired
+    private IFsPackageOrderService fsPackageOrderService;
+
     /**
      * 查询支付明细列表
      */
@@ -169,4 +173,21 @@ public class FsStorePaymentController extends BaseController
     {
         return toAjax(fsStorePaymentService.deleteFsStorePaymentByPaymentIds(paymentIds));
     }
+
+    /**
+     * 查询支付错误明细
+     */
+    @GetMapping("/error/list")
+    public TableDataInfo list(FsStorePaymentError fsStorePaymentError)
+    {
+        startPage();
+        List<FsStorePaymentError> list = fsStorePaymentErrorService.selectFsStorePaymentErrorList(fsStorePaymentError);
+        for (FsStorePaymentError vo : list){
+            if (vo.getBusinessType() != null && vo.getBusinessType()==3 &&  vo.getOrderId() != null) {
+                FsPackageOrder fsPackageOrder = fsPackageOrderService.selectFsPackageOrderByOrderId(vo.getOrderId());
+                vo.setOrderNo(fsPackageOrder.getOrderSn());
+            }
+        }
+        return getDataTable(list);
+    }
 }

+ 5 - 4
fs-company-app/src/main/java/com/fs/app/controller/FsUserController.java

@@ -45,10 +45,7 @@ import java.io.InputStream;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 
 import static com.fs.his.utils.PhoneUtil.encryptPhone;
 
@@ -216,6 +213,8 @@ public class FsUserController extends AppBaseController {
             @ApiParam(value = "类型,1-按完播率,2-按正确率", required = true) @RequestParam Integer type
     ) {
         long userId = Long.parseLong(getUserId());
+        // 中康的数据太多太卡不要这个
+//        return ResponseResult.ok(Collections.emptyList());
         return ResponseResult.ok(fsUserService.userRanking(userId, startTime, endTime, periodId, videoId, order, type));
     }
 
@@ -231,6 +230,8 @@ public class FsUserController extends AppBaseController {
             @ApiParam(value = "类型,1-按完播率,2-按正确率", required = true) @RequestParam Integer type
     ) {
         long userId = Long.parseLong(getUserId());
+        // 中康的数据太多太卡不要这个
+//        return ResponseResult.ok(Collections.emptyList());
         return ResponseResult.ok(fsUserService.courseRanking(userId, startTime, endTime, courseId, videoId, order, type));
     }
 

+ 13 - 0
fs-company/src/main/java/com/fs/company/controller/qw/QwSopTempController.java

@@ -20,6 +20,7 @@ import com.fs.qw.vo.SortDayVo;
 import com.fs.sop.domain.QwSop;
 import com.fs.sop.domain.QwSopTemp;
 import com.fs.sop.domain.QwSopTempDay;
+import com.fs.sop.params.BatchOpenOrCloseOfficialParam;
 import com.fs.sop.params.QwSopShareTempParam;
 import com.fs.sop.service.IQwSopTempService;
 import com.fs.sop.vo.UpdateRedVo;
@@ -362,4 +363,16 @@ public class QwSopTempController extends BaseController
     public R getSelectableRange(){
         return R.ok().put("data", qwSopTempService.getSelectableRange());
     }
+
+    /**
+     * sop模板update一键开关官方群发
+     * @param param
+     * @return
+     */
+    @PreAuthorize("@ss.hasPermi('qw:sopTemp:edit') or @ss.hasPermi('qw:sopTemp:myEdit') or @ss.hasPermi('qw:sopTemp:deptEdit')")
+    @Log(title = "sop模板update一键开关官方群发", businessType = BusinessType.UPDATE)
+    @PostMapping("/batchOpenOrCloseOfficial")
+    public R batchOpenOrCloseOfficial(@RequestBody BatchOpenOrCloseOfficialParam param){
+        return qwSopTempService.batchOpenOrCloseOfficial(param);
+    }
 }

+ 5 - 3
fs-live-app/src/main/java/com/fs/live/task/Task.java

@@ -415,7 +415,7 @@ public class Task {
         for (Live openRewardLive : openRewardLives) {
             String configJson = openRewardLive.getConfigJson();
             LiveWatchConfig config = JSON.parseObject(configJson, LiveWatchConfig.class);
-            if (config.getEnabled()) {
+            if (config.getEnabled() && 1 == config.getParticipateCondition()) {
                 List<LiveWatchUser> liveWatchUsers = liveWatchUserService.checkOnlineNoRewardUser(openRewardLive.getLiveId(), now);
                 if (liveWatchUsers == null || liveWatchUsers.isEmpty()) {
                     continue;
@@ -633,7 +633,7 @@ public class Task {
     }
 
     /**
-     * 定时扫描开启的直播间,检查是否到了打标签的时间
+     * 定时扫描开启的直播间,检查是否到了打标签的时间,然后把正在看直播的用户拆分为 直播用户和回放用户
      * 每10秒执行一次
      */
     @Scheduled(cron = "0/10 * * * * ?")
@@ -896,6 +896,9 @@ public class Task {
                             List<LiveWatchLog> batch = updateLog.subList(i, end);
                             liveWatchLogService.batchUpdateLiveWatchLog(batch);
                         }
+                        for (LiveWatchLog liveWatchLog : updateLog) {
+                            redisCache.setCacheObject("live:watch:log:cache:" + liveWatchLog.getLogId(), liveWatchLog, 1, TimeUnit.HOURS);
+                        }
                     }
                     
                 } catch (Exception e) {
@@ -923,7 +926,6 @@ public class Task {
             // 查询 LiveWatchLog
             LiveWatchLog queryLog = new LiveWatchLog();
             queryLog.setLiveId(liveId);
-            queryLog.setUserId(userId);
             queryLog.setQwUserId(String.valueOf(qwUserId));
             queryLog.setExternalContactId(exId);
 

+ 7 - 3
fs-live-app/src/main/java/com/fs/live/websocket/service/WebSocketServer.java

@@ -137,8 +137,14 @@ public class WebSocketServer {
             room.put(userId, session);
             
             // 存储用户进入直播间的时间到 Redis(用于计算在线时长)
+            // 如果已经存在进入时间,说明是重连,不应该覆盖,保持原来的进入时间
             String entryTimeKey = String.format(USER_ENTRY_TIME_KEY, liveId, userId);
-            redisCache.setCacheObject(entryTimeKey, System.currentTimeMillis(), 24, TimeUnit.HOURS);
+            Long existingEntryTime = redisCache.getCacheObject(entryTimeKey);
+            if (existingEntryTime == null) {
+                // 首次连接,记录进入时间
+                redisCache.setCacheObject(entryTimeKey, System.currentTimeMillis(), 24, TimeUnit.HOURS);
+            }
+            // 如果是重连,不覆盖进入时间,保持原来的进入时间以便正确计算总时长
             
             // 直播间浏览量 +1
             redisCache.incr(PAGE_VIEWS_KEY + liveId, 1);
@@ -1178,7 +1184,6 @@ public class WebSocketServer {
         try {
             LiveWatchLog queryLog = new LiveWatchLog();
             queryLog.setLiveId(liveId);
-            queryLog.setUserId(userId);
             queryLog.setQwUserId(String.valueOf(qwUserId));
             queryLog.setExternalContactId(externalContactId);
             
@@ -1302,7 +1307,6 @@ public class WebSocketServer {
             // 查询 LiveWatchLog
             LiveWatchLog queryLog = new LiveWatchLog();
             queryLog.setLiveId(liveId);
-            queryLog.setUserId(userId);
             queryLog.setCompanyId(companyId);
             queryLog.setCompanyUserId(companyUserId);
             

+ 1 - 1
fs-service/src/main/java/com/fs/fastGpt/service/impl/AiHookServiceImpl.java

@@ -819,7 +819,7 @@ public class AiHookServiceImpl implements AiHookService {
                                         .append("\uD83C\uDF39\uD83C\uDF39\uD83C\uDF39");
                             case 3:
                                 ExpressInfoDTO expressInfo = getExpress(fsStoreOrder.getOrderId());
-                                sBuilder.append("您购买的有一个包裹 ");
+                                sBuilder.append("您有一个包裹 ");
                                 sBuilder.append(" 已经查询到了,正在配送中了。\n");
                                 if(expressInfo != null && expressInfo.getTraces() != null && !expressInfo.getTraces().isEmpty()){
                                     List<TracesDTO> traces = expressInfo.getTraces();

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

@@ -35,4 +35,9 @@ public class FsStorePaymentError extends BaseEntity
     @Excel(name = "0未处理 1已处理")
     private Integer status;
 
+
+    private Long orderId;
+
+    private Integer businessType;
+
 }

+ 2 - 2
fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java

@@ -312,9 +312,9 @@ public interface FsUserMapper
 
     UserDetailsVO getCountWatchCourse (@Param("userId") Long userId, @Param("fsUserId") Long fsUserId, @Param("dateTag") String dateTag,@Param("userCompanyId")  Long userCompanyId);
 
-    UserDetailsVO getCountAnswer(@Param("userId") Long userId, @Param("fsUserId") Long fsUserId, @Param("dateTag") String dateTag);
+    UserDetailsVO getCountAnswer(@Param("userCompanyId") Long userCompanyId, @Param("fsUserId") Long fsUserId, @Param("dateTag") String dateTag);
 
-    UserDetailsVO getCountRedPacket(@Param("userId") Long userId, @Param("fsUserId") Long fsUserId, @Param("dateTag") String dateTag);
+    UserDetailsVO getCountRedPacket(@Param("userCompanyId") Long userCompanyId, @Param("fsUserId") Long fsUserId, @Param("dateTag") String dateTag);
 
     FsUserSummaryCountVO countUserSummary(@Param("userId") Long userId, @Param("companyId") Long companyId);
 

+ 9 - 0
fs-service/src/main/java/com/fs/his/service/IFsStorePaymentErrorService.java

@@ -0,0 +1,9 @@
+package com.fs.his.service;
+
+import com.fs.his.domain.FsStorePaymentError;
+
+import java.util.List;
+
+public interface IFsStorePaymentErrorService {
+    List<FsStorePaymentError> selectFsStorePaymentErrorList(FsStorePaymentError fsStorePaymentError);
+}

+ 21 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentErrorServiceImpl.java

@@ -0,0 +1,21 @@
+package com.fs.his.service.impl;
+
+import com.fs.his.domain.FsStorePaymentError;
+import com.fs.his.mapper.FsStorePaymentErrorMapper;
+import com.fs.his.service.IFsStorePaymentErrorService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class FsStorePaymentErrorServiceImpl implements IFsStorePaymentErrorService {
+    @Autowired
+    private FsStorePaymentErrorMapper fsStorePaymentErrorMapper;
+
+    public List<FsStorePaymentError> selectFsStorePaymentErrorList(FsStorePaymentError fsStorePaymentError){
+        return fsStorePaymentErrorMapper.selectFsStorePaymentErrorList(fsStorePaymentError);
+    }
+
+
+}

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

@@ -48,9 +48,7 @@ import com.fs.his.domain.*;
 import com.fs.his.dto.PayConfigDTO;
 import com.fs.his.enums.PaymentMethodEnum;
 import com.fs.his.mapper.*;
-import com.fs.his.param.FsStorePaymentParam;
-import com.fs.his.param.PayOrderParam;
-import com.fs.his.param.WxSendRedPacketParam;
+import com.fs.his.param.*;
 import com.fs.his.service.IFsInquiryOrderService;
 
 import com.fs.his.param.WxSendRedPacketParam;
@@ -217,6 +215,9 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
     @Value("${cloud_host.company_name}")
     private String signProjectName;
 
+    @Autowired
+    private FsStorePaymentErrorMapper fsStorePaymentErrorMapper;
+
     /**
      * 红包账户锁
      */
@@ -1648,18 +1649,56 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
         return "SUCCESS";
     }
 
+    long TWENTY_DAYS_IN_MILLIS = 1728000000L;// 使用毫秒判断,20天 = 20 * 24 * 60 * 60 * 1000 毫秒
     @Override
     public void synchronizePayStatus() {
         FsStorePayment queryParam = new FsStorePayment();
         queryParam.setStatus(0);//未支付
-        queryParam.setBeginTime(DateUtils.addDateDays(-1));
+//        queryParam.setBeginTime(DateUtils.addDateDays(-1));
         queryParam.setEndTime(DateUtils.getDate());
         List<FsStorePayment> list = selectFsStorePaymentList(queryParam);
         if (list != null && !list.isEmpty()) {
             List<CompletableFuture<Void>> futures = new ArrayList<>();
             for (FsStorePayment fsStorePayment : list) {
                 CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
-                    updateFsStorePaymentByDecryptForm(fsStorePayment.getPaymentId());
+                    try {
+                        updateFsStorePaymentByDecryptForm(fsStorePayment.getPaymentId());
+                        //查询是否改为已支付
+                        FsStorePayment finalPayment = fsStorePaymentMapper.selectFsStorePaymentByPaymentId(fsStorePayment.getPaymentId());
+                        try {
+                            Date createTime = finalPayment.getCreateTime();
+                            Date now = new Date();
+                            long value = now.getTime() - createTime.getTime();
+                            if(finalPayment.getStatus() == 0
+                                    && finalPayment.getBusinessType() == 3
+                                    && (value > TWENTY_DAYS_IN_MILLIS)
+                                    && finalPayment.getBusinessId() != null){
+                                //套餐包超过20天取消订单
+                                FsPackageOrderCancelParam param = new FsPackageOrderCancelParam();
+                                param.setOrderId(Long.valueOf(finalPayment.getBusinessId()));
+                                packageOrderService.cancel(param);
+                            }
+                        } catch (NumberFormatException e) {
+                            logger.info("定时任务:同步支付状态超时取消订单失败,payment_id:{}",fsStorePayment.getPaymentId());
+                        }
+                    } catch (Exception e) {
+                        //添加失败记录
+                        FsStorePaymentError fsStorePaymentError = new FsStorePaymentError();
+                        fsStorePaymentError.setOrderFlowNo(fsStorePayment.getTradeNo());
+                        String businessId = fsStorePayment.getBusinessId();
+                        fsStorePaymentError.setBusinessType(fsStorePayment.getBusinessType());
+                        fsStorePaymentError.setMsg(e.getMessage());
+                        fsStorePaymentError.setStatus(0);
+                        fsStorePaymentError.setCreateTime(new Date());
+                        if (businessId != null && fsStorePayment.getBusinessType() == 3) {
+                            fsStorePaymentError.setOrderId(Long.valueOf(businessId));
+                            FsPackageOrder fsPackageOrder = packageOrderService.selectFsPackageOrderByOrderId(Long.valueOf(businessId));
+                            if (fsPackageOrder != null) {
+                                fsStorePaymentError.setOrderNo(fsPackageOrder.getOrderSn());
+                            }
+                        }
+                        fsStorePaymentErrorMapper.insertFsStorePaymentError(fsStorePaymentError);
+                    }
                     logger.info("定时任务:同步支付状态,payment_id:{}",fsStorePayment.getPaymentId());
                 });
                 futures.add(future);

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

@@ -835,10 +835,10 @@ public class FsUserServiceImpl implements IFsUserService {
     @Override
     public UserDetailsVO getUserDetails(Long userId, Long fsUserId, String dateTag, Long userCompanyId) {
         UserDetailsVO countWatchCourse = fsUserMapper.getCountWatchCourse(userId, fsUserId, dateTag, userCompanyId);
-        FsUserCompanyUser fsUserCompanyUser = userCompanyUserService.selectFsUserCompanyUserById(userCompanyId);
+//        FsUserCompanyUser fsUserCompanyUser = userCompanyUserService.selectFsUserCompanyUserById(userCompanyId);
 
-        UserDetailsVO countAnswer = fsUserMapper.getCountAnswer(fsUserCompanyUser.getCompanyUserId(), fsUserId, dateTag);
-        UserDetailsVO countRedPacket = fsUserMapper.getCountRedPacket(fsUserCompanyUser.getCompanyUserId(), fsUserId, dateTag);
+        UserDetailsVO countAnswer = fsUserMapper.getCountAnswer(userCompanyId, fsUserId, dateTag);
+        UserDetailsVO countRedPacket = fsUserMapper.getCountRedPacket(userCompanyId, fsUserId, dateTag);
         UserDetailsVO vo = new UserDetailsVO();
         if (countWatchCourse != null) {
             BeanUtils.copyProperties(countWatchCourse, vo);

+ 1 - 1
fs-service/src/main/java/com/fs/live/domain/LiveOrder.java

@@ -96,7 +96,7 @@ public class LiveOrder extends BaseEntity {
     private String payType;
 
     /** 订单状态(-1 : 申请退款 -2 : 退货成功 0:已取消 1:待支付 2:待发货;3:待收货;4:待评价;5:已完成) */
-    @Excel(name = "订单状态", readConverterExp = "-=1,:=,申=请退款,-=2,:=,退=货成功,1=:待支付,2=:待发货;3:待收货;4:待评价;5:已完成")
+    @Excel(name = "订单状态", readConverterExp = "-=1,:=,申=请退款,-=2,:=,退=货成功,1=:待支付,2=:待发货;3:待收货;4:待评价;5:已完成;6:被拆分")
     private Integer status;
 
     /** 0 未退款 1 申请中 2 已退款 */

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

@@ -783,21 +783,23 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
             Map<String, Integer> liveFlagWithCache = liveWatchUserService.getLiveFlagWithCache(order.getLiveId());
             if (liveFlagWithCache != null && liveFlagWithCache.containsKey("liveFlag") && 1 == liveFlagWithCache.get("liveFlag")) {
                 try {
-                    LiveWatchLog queryLog = new LiveWatchLog();
-                    queryLog.setLiveId(order.getLiveId());
-                    queryLog.setUserId(Long.valueOf(order.getUserId()));
-                    queryLog.setCompanyId(order.getCompanyId());
-                    queryLog.setCompanyUserId(order.getCompanyUserId());
-
-                    List<LiveWatchLog> logs = liveWatchLogService.selectLiveWatchLogList(queryLog);
-                    if (logs != null && !logs.isEmpty()) {
-                        for (LiveWatchLog log : logs) {
-                            if (log.getLogType() == null || log.getLogType() != 2) {
-                                log.setLiveBuy(1);
-                                liveWatchLogService.updateLiveWatchLog(log);
+                    LiveUserFirstEntry liveUserFirstEntry = liveUserFirstEntryService.selectEntityByLiveIdUserId(order.getLiveId(), Long.parseLong(order.getUserId()));
+                    if (liveUserFirstEntry != null && liveUserFirstEntry.getExternalContactId()!=null && liveUserFirstEntry.getExternalContactId() > 0 &&  liveUserFirstEntry.getQwUserId()!=null && liveUserFirstEntry.getQwUserId() > 0) {
+                        LiveWatchLog queryLog = new LiveWatchLog();
+                        queryLog.setLiveId(order.getLiveId());
+                        queryLog.setQwUserId(String.valueOf(liveUserFirstEntry.getQwUserId()));
+                        queryLog.setExternalContactId(liveUserFirstEntry.getExternalContactId());
+                        List<LiveWatchLog> logs = liveWatchLogService.selectLiveWatchLogList(queryLog);
+                        if (logs != null && !logs.isEmpty()) {
+                            for (LiveWatchLog log : logs) {
+                                if (log.getLogType() == null || log.getLogType() != 2) {
+                                    log.setLiveBuy(1);
+                                    liveWatchLogService.updateLiveWatchLog(log);
+                                }
                             }
                         }
                     }
+
                 } catch (Exception e) {
                     log.error("更新 updateLiveWatchLog LiveWatchLog logType 异常(连接时):liveId={}, userId={}, error={}",
                             order.getLiveId(), order.getUserId(), e.getMessage(), e);

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

@@ -84,13 +84,13 @@ public class LiveVideoServiceImpl implements ILiveVideoService
     @Override
     public int insertLiveVideo(LiveVideo liveVideo)
     {
-        if (LiveEnum.contains(cloudHostProper.getCompanyName())) {
-            liveVideo.setVideoUrl(liveVideo.getLineOne());
-            liveVideo.setFinishStatus(1);
-        }else {
+//        if (LiveEnum.contains(cloudHostProper.getCompanyName())) {
+//            liveVideo.setVideoUrl(liveVideo.getLineOne());
+//            liveVideo.setFinishStatus(1);
+//        }else {
             // 直播ID为-1,则新增 直播视频库
             liveVideo.setFinishStatus(0);
-        }
+//        }
 
         if (liveVideo.getLiveId() == -1) {
             liveVideo.setCreateTime(DateUtils.getNowDate());

+ 11 - 0
fs-service/src/main/java/com/fs/qw/domain/QwCompany.java

@@ -85,4 +85,15 @@ public class QwCompany extends BaseEntity
     private Long createUserId;
     // 创建部门
     private Long createDeptId;
+
+    /**
+     * 御君方云医小程序原始id
+     */
+    private String yjfyyAppId;
+    /**
+     * 御君方云医应用id
+     */
+    private String yjfyyAgentId;
+
+    private String yjfyySchema;
 }

+ 4 - 0
fs-service/src/main/java/com/fs/qw/service/impl/QwUserServiceImpl.java

@@ -1309,6 +1309,10 @@ public class QwUserServiceImpl implements IQwUserService
         WxWorkGetQrCodeDTO wxWorkGetQrCodeDTO = new WxWorkGetQrCodeDTO();
         wxWorkGetQrCodeDTO.setUuid(qwUser.getUid());
         try {
+            redisCache.deleteObject("qrCode:uuid:"+qwUser.getUid());
+            redisCache.deleteObject("qrCodeUid:"+qwUser.getUid());
+            redisCache.deleteObject("qrCode:qwUserId:"+qwUser.getId());
+            redisCache.deleteObject("qrCodeUid:qwUserId:"+qwUser.getId());
             wxWorkService.LoginOut(wxWorkGetQrCodeDTO,qwUser.getServerId());
         }catch (Exception e){
 

+ 6 - 0
fs-service/src/main/java/com/fs/sop/mapper/QwSopTempRulesMapper.java

@@ -99,4 +99,10 @@ public interface QwSopTempRulesMapper extends BaseMapper<QwSopTempRules> {
     List<QwSopTempRules> listByTempIdAndNameAndDayNum(@Param("id") String id, @Param("dayNum") Integer dayNum);
 
     void deleteByIdList(@Param("ids") List<String> ids);
+
+    List<Long> getTempOfficialIdsForOpen(@Param("tempId")String tempId);
+
+    List<Long> getTempOfficialIdsForClose(@Param("tempId") String tempId);
+
+    int updateTempRulesOfficialBatch(@Param("ids") List<Long> ids,@Param("official") Integer official);
 }

+ 22 - 0
fs-service/src/main/java/com/fs/sop/params/BatchOpenOrCloseOfficialParam.java

@@ -0,0 +1,22 @@
+package com.fs.sop.params;
+
+import lombok.Data;
+
+/**
+ * @author MixLiu
+ * @date 2025/12/22 上午10:30)
+ */
+@Data
+public class BatchOpenOrCloseOfficialParam {
+
+    /**
+     * 模板id
+     */
+    private String tempId;
+
+    /**
+     * 是否官方 0 关闭 1 开启
+     */
+    private Integer isOfficial;
+
+}

+ 10 - 0
fs-service/src/main/java/com/fs/sop/service/IQwSopTempService.java

@@ -1,8 +1,10 @@
 package com.fs.sop.service;
 
+import com.fs.common.core.domain.R;
 import com.fs.qw.vo.SortDayVo;
 import com.fs.sop.domain.QwSopTemp;
 import com.fs.sop.domain.QwSopTempDay;
+import com.fs.sop.params.BatchOpenOrCloseOfficialParam;
 import com.fs.sop.params.QwSopShareTempParam;
 import com.fs.sop.vo.QwSopTempRedPackageVo;
 
@@ -101,4 +103,12 @@ public interface IQwSopTempService {
     List<String> getSelectableRange();
 
     void syncTemplate(Long courseId);
+
+    /**
+     * sop模板update一键开关官方群发
+     * @param param
+     * @return
+     */
+    R batchOpenOrCloseOfficial(BatchOpenOrCloseOfficialParam param);
+
 }

+ 30 - 0
fs-service/src/main/java/com/fs/sop/service/impl/QwSopTempServiceImpl.java

@@ -8,9 +8,11 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fs.common.BeanCopyUtils;
 import com.fs.common.annotation.DataSource;
+import com.fs.common.core.domain.R;
 import com.fs.common.enums.DataSourceType;
 import com.fs.common.exception.base.BaseException;
 import com.fs.common.utils.PubFun;
+import com.fs.common.utils.StringUtils;
 import com.fs.company.domain.Company;
 import com.fs.company.service.ICompanyService;
 import com.fs.config.cloud.CloudHostProper;
@@ -30,6 +32,8 @@ import com.fs.qw.vo.QwUserVO;
 import com.fs.qw.vo.SortDayVo;
 import com.fs.sop.domain.*;
 import com.fs.sop.mapper.QwSopTempMapper;
+import com.fs.sop.mapper.QwSopTempRulesMapper;
+import com.fs.sop.params.BatchOpenOrCloseOfficialParam;
 import com.fs.sop.params.QwSopShareTempParam;
 import com.fs.sop.service.*;
 import com.fs.sop.vo.QwSopTempRedPackageVo;
@@ -84,6 +88,8 @@ public class QwSopTempServiceImpl implements IQwSopTempService {
     private final ICompanyService companyService;
     private final ThreadPoolTaskExecutor threadPoolTaskExecutor;
 
+    @Autowired
+    QwSopTempRulesMapper qwSopTempRulesMapper;
     /**
      * 查询sop模板
      *
@@ -788,4 +794,28 @@ public class QwSopTempServiceImpl implements IQwSopTempService {
 //        }
     }
 
+    /**
+     * sop模板update一键开关官方群发
+     * @param param
+     * @return
+     */
+    public R batchOpenOrCloseOfficial(BatchOpenOrCloseOfficialParam param){
+        List<Long> updateIds = new ArrayList<>();
+        if(StringUtils.isBlank(param.getTempId())){
+            return R.error("参数错误,请确认模板id是否正确");
+        }
+        if(Integer.valueOf(1).equals(param.getIsOfficial())){
+            updateIds = qwSopTempRulesMapper.getTempOfficialIdsForOpen(param.getTempId());
+        }else if(Integer.valueOf(0).equals(param.getIsOfficial())){
+            updateIds = qwSopTempRulesMapper.getTempOfficialIdsForClose(param.getTempId());
+        }else{
+            return R.error("参数错误,请确认选择类型是否正确");
+        }
+
+        if(null != updateIds && !updateIds.isEmpty()){
+            qwSopTempRulesMapper.updateTempRulesOfficialBatch(updateIds, param.getIsOfficial());
+        }
+        return  R.ok("操作成功");
+    }
+
 }

+ 11 - 1
fs-service/src/main/resources/mapper/his/FsStorePaymentErrorMapper.xml

@@ -11,10 +11,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="msg"    column="msg"    />
         <result property="status"    column="status"    />
         <result property="createTime"    column="create_time"    />
+        <result property="orderId"    column="order_id"    />
+        <result property="businessType"    column="business_type"    />
     </resultMap>
 
     <sql id="selectFsStorePaymentErrorVo">
-        select id, order_flow_no, order_no, msg, status, create_time from fs_store_payment_error
+        select id, order_flow_no, order_no, msg, status, create_time,order_id,business_type from fs_store_payment_error
     </sql>
 
     <select id="selectFsStorePaymentErrorList" parameterType="FsStorePaymentError" resultMap="FsStorePaymentErrorResult">
@@ -23,6 +25,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="orderFlowNo != null  and orderFlowNo != ''"> and order_flow_no = #{orderFlowNo}</if>
             <if test="orderNo != null  and orderNo != ''"> and order_no = #{orderNo}</if>
             <if test="msg != null  and msg != ''"> and msg = #{msg}</if>
+            <if test="orderId != null "> and order_id = #{orderId}</if>
+            <if test="businessType != null "> and business_type = #{businessType}</if>
             <if test="status != null "> and status = #{status}</if>
         </where>
     </select>
@@ -41,6 +45,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="msg != null">msg,</if>
             <if test="status != null">status,</if>
             <if test="createTime != null">create_time,</if>
+            <if test="orderId != null">order_id,</if>
+            <if test="businessType != null">business_type,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="id != null">#{id},</if>
@@ -49,6 +55,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="msg != null">#{msg},</if>
             <if test="status != null">#{status},</if>
             <if test="createTime != null">#{createTime},</if>
+            <if test="orderId != null">#{orderId},</if>
+            <if test="businessType != null">#{businessType},</if>
          </trim>
     </insert>
 
@@ -60,6 +68,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="msg != null">msg = #{msg},</if>
             <if test="status != null">status = #{status},</if>
             <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="orderId != null">order_id = #{orderId},</if>
+            <if test="businessType != null">business_type = #{businessType},</if>
         </trim>
         where id = #{id}
     </update>

+ 13 - 4
fs-service/src/main/resources/mapper/his/FsUserMapper.xml

@@ -861,7 +861,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                     </when>
                 </choose>
             </if>
-            and fs_user.user_id = #{fsUserId} and fucu.company_user_id =#{userId}
+            and fs_user.user_id = #{fsUserId}
+            <if test="userCompanyId!=null">
+                and fucu.id = #{userCompanyId}
+            </if>
         </where>
         GROUP BY
         fs_user.user_id
@@ -892,7 +895,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                     </when>
                 </choose>
             </if>
-            and fs_user.user_id = #{fsUserId} and fucu.company_user_id =#{userId}
+            and fs_user.user_id = #{fsUserId}
+            <if test="userCompanyId!=null">
+                and fucu.id = #{userCompanyId}
+            </if>
         </where>
         GROUP BY
         fs_user.user_id
@@ -927,7 +933,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                     </when>
                 </choose>
             </if>
-            and  fs_user.user_id = #{fsUserId} and fucu.company_user_id =#{userId}
+            and  fs_user.user_id = #{fsUserId}
+            <if test="userCompanyId!=null">
+                and fucu.id = #{userCompanyId}
+            </if>
         </where>
         GROUP BY
         fs_user.user_id
@@ -1991,7 +2000,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="selectFsUserVOListByProjectNew" resultType="com.fs.his.vo.FsUserVO">
         SELECT
             u.user_id, u.nick_name, u.avatar, u.phone, u.integral, u.now_money,
-            ucu.project_id,ucu.company_user_id as companyUserId,ucu.create_time as bindTime,ucu.status,
+            ucu.project_id,ucu.id as companyUserId,ucu.create_time as bindTime,ucu.status,
             company.company_name,
             cu.nick_name   companyUserNickName
         FROM

+ 16 - 1
fs-service/src/main/resources/mapper/qw/QwCompanyMapper.xml

@@ -30,10 +30,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="msgPrivateKey"    column="msg_private_key"    />
         <result property="miniAppId"    column="mini_app_id"    />
         <result property="companyServerNum"    column="company_server_num"    />
+        <result property="yjfyyAppId"    column="yjfyy_app_id"    />
+        <result property="yjfyyAgentId"    column="yjfyy_agent_id"    />
+        <result property="yjfyySchema"    column="yjfyy_schema"    />
     </resultMap>
 
     <sql id="selectQwCompanyVo">
-        select id, corp_id, corp_name, open_secret, open_corp_id, server_agent_id, server_book_corp_id, server_book_secret, token, encoding_aes_key, provider_secret, realm_name_url, notify_url, chat_toolbar, chat_toolbar_oauth, company_ids, status, create_time, update_time, create_by,is_buy,mini_app_id,company_server_num from qw_company
+        select id, corp_id, corp_name, open_secret, open_corp_id, server_agent_id, server_book_corp_id, server_book_secret, token, encoding_aes_key, provider_secret, realm_name_url, notify_url, chat_toolbar, chat_toolbar_oauth, company_ids, status, create_time, update_time, create_by,is_buy,mini_app_id,company_server_num,yjfyy_app_id,yjfyy_agent_id,yjfyy_schema from qw_company
     </sql>
 
     <select id="selectQwCompanyList" parameterType="QwCompany" resultMap="QwCompanyResult">
@@ -58,6 +61,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isBuy != null "> and isBuy = #{isBuy}</if>
             <if test="createDeptId != null "> and create_dept_id = #{createDeptId}</if>
             <if test="createUserId != null "> and create_user_id = #{createUserId}</if>
+            <if test="yjfyyAppId != null  and yjfyyAppId != ''"> and yjfyy_app_id = #{yjfyyAppId}</if>
+            <if test="yjfyyAgentId != null  and yjfyyAgentId != ''"> and yjfyy_agent_id = #{yjfyyAgentId}</if>
+            <if test="yjfyySchema != null  and yjfyySchema != ''"> and yjfyy_schema = #{yjfyySchema}</if>
         </where>
     </select>
 
@@ -99,6 +105,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="companyServerNum != null">company_server_num,</if>
             <if test="createUserId != null != null">create_user_id,</if>
             <if test="createDeptId != null">create_dept_id,</if>
+            <if test="yjfyyAppId != null">yjfyy_app_id,</if>
+            <if test="yjfyyAgentId != null">yjfyy_agent_id,</if>
+            <if test="yjfyySchema != null">yjfyy_schema,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="corpId != null">#{corpId},</if>
@@ -125,6 +134,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="companyServerNum != null">#{companyServerNum},</if>
             <if test="createUserId != null">#{createUserId},</if>
             <if test="createDeptId != null">#{createDeptId},</if>
+            <if test="yjfyyAppId != null">#{yjfyyAppId},</if>
+            <if test="yjfyyAgentId != null">#{yjfyyAgentId},</if>
+            <if test="yjfyySchema != null">#{yjfyySchema},</if>
          </trim>
     </insert>
 
@@ -153,6 +165,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isBuy != null">is_buy = #{isBuy},</if>
             <if test="miniAppId != null">mini_app_id = #{miniAppId},</if>
             <if test="companyServerNum != null">company_server_num = #{companyServerNum},</if>
+            <if test="yjfyyAppId != null">yjfyy_app_id = #{yjfyyAppId},</if>
+            <if test="yjfyyAgentId != null">yjfyy_agent_id = #{yjfyyAgentId},</if>
+            <if test="yjfyySchema != null">yjfyy_schema = #{yjfyySchema},</if>
         </trim>
         where id = #{id}
     </update>

+ 26 - 0
fs-service/src/main/resources/mapper/sop/QwSopTempRulesMapper.xml

@@ -134,4 +134,30 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             CAST(#{item} AS UUID)
         </foreach>
     </delete>
+
+    <select id="getTempOfficialIdsForOpen" parameterType="java.lang.String" resultType="java.lang.Long">
+        select tt.id from
+                         (
+                          select
+                              t.id,
+                              RANK() OVER (PARTITION by t.day_id ORDER BY t.sorts ) AS rank_num
+                          from qw_sop_temp_rules  t
+                          where t.temp_id = #{tempId}
+                          ) tt
+        where tt.rank_num = 1
+    </select>
+
+    <select id="getTempOfficialIdsForClose" parameterType="java.lang.String" resultType="java.lang.Long">
+        select id from qw_sop_temp_rules where temp_id = #{tempId}  and  is_official = 1
+    </select>
+
+    <update id="updateTempRulesOfficialBatch" >
+        update qw_sop_temp_rules
+        set is_official = #{official}
+        where id in
+        <foreach item="item" collection="ids" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </update>
+
 </mapper>