Переглянути джерело

Merge remote-tracking branch 'origin/Payment-Configuration' into Payment-Configuration

yys 2 тижнів тому
батько
коміт
b6fab5238f

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

@@ -349,7 +349,13 @@ public class FsUserCourseVideoController extends AppBaseController {
         if(batchSendCourseDTO.getIsUrgeCourse()==null){
             batchSendCourseDTO.setIsUrgeCourse(false);
         }
-        return openIMService.batchSendCourseLimit(batchSendCourseDTO);
+
+        // 异步调用
+        openIMService.batchSendCourseLimit(batchSendCourseDTO);
+        OpenImResponseDTO openImResponseDTO = new OpenImResponseDTO();
+        openImResponseDTO.setErrCode(0);
+        openImResponseDTO.setErrMsg("异步发送,详细请看明细");
+        return openImResponseDTO;
     }
 
     @ApiOperation("会员一键催课")

+ 57 - 0
fs-company/src/main/java/com/fs/app/controller/im/FsImMsgSendLogController.java

@@ -0,0 +1,57 @@
+package com.fs.app.controller.im;
+
+import com.fs.app.service.param.FsImMsgSendLogRequest;
+import com.fs.app.service.param.FsImMsgSendLogResponse;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.im.domain.FsImMsgSendLog;
+import com.fs.im.service.IFsImMsgSendLogService;
+import com.github.pagehelper.PageHelper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * OpenIM 消息发送记录主表 Controller
+ */
+@RestController
+@RequestMapping("/app/im")
+public class FsImMsgSendLogController extends BaseController {
+
+    @Autowired
+    private IFsImMsgSendLogService fsImMsgSendLogService;
+
+    /**
+     * 查询 OpenIM 消息发送记录列表
+     */
+    @GetMapping("/listImMsgSendLog")
+    public TableDataInfo list(FsImMsgSendLogRequest request) {
+        PageHelper.startPage(request.getPageNum(), request.getPageSize());
+        List<FsImMsgSendLogResponse> list = fsImMsgSendLogService.selectFsImMsgSendLogInfoList(request);
+        return getDataTable(list);
+    }
+
+//    /**
+//     * 导出 OpenIM 消息发送记录列表
+//     */
+//    @GetMapping("/exportImMsgSendLog")
+//    public void export(HttpServletResponse response, FsImMsgSendLogRequest request) {
+//        List<FsImMsgSendLog> list = fsImMsgSendLogService.exportFsImMsgSendLog(request);
+//        ExcelUtil<FsImMsgSendLog> util = new ExcelUtil<>(FsImMsgSendLog.class);
+//        util.exportExcel(response, list, "OpenIM 消息发送记录");
+//    }
+//
+    /**
+     * 获取发送状态统计
+     */
+    @GetMapping("/getImMsgSendStatistics")
+    public R statistics(FsImMsgSendLogRequest request) {
+        return fsImMsgSendLogService.getFsImMsgSendStatistics(request);
+    }
+}

+ 65 - 0
fs-service/src/main/java/com/fs/app/service/param/FsImMsgSendLogRequest.java

@@ -0,0 +1,65 @@
+package com.fs.app.service.param;
+
+import com.fs.common.core.domain.BaseEntity;
+import com.fs.common.core.page.PageDomain;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * OpenIM 消息发送记录请求参数
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsImMsgSendLogRequest extends PageDomain {
+
+    /** 销售 ID */
+    private Long companyUserId;
+
+    /** 公司 ID */
+    private Long companyId;
+
+    /** 课程 ID */
+    private Long courseId;
+
+    /** 课程名称 */
+    private String courseName;
+
+    /** 视频 ID */
+    private Long videoId;
+
+    /** 视频标题 */
+    private String videoName;
+
+    /** 发送内容 */
+    private String sendTitle;
+
+    /** 预计发送开始时间 */
+    private String planSendStartTime;
+
+    /** 预计发送结束时间 */
+    private String planSendEndTime;
+
+    /** 发送类型(1-定时;2-实时) */
+    private Integer sendType;
+
+    /** 发送方式(1-APP;2-销售后台) */
+    private Integer sendMode;
+
+    /** 发送状态(1-已发送;2-待发送) */
+    private Integer sendStatus;
+
+    /** 执行状态 执行状态,0-正常;1-失败*/
+    private Integer status;
+
+    /** 消息类型(1-发课;2-催课) */
+    private Integer msgType;
+
+    /** 项目 ID */
+    private Long projectId;
+
+    /** 创建开始时间 */
+    private String createTimeStartTime;
+
+    /** 创建结束时间 */
+    private String createTimeEndTime;
+}

+ 78 - 0
fs-service/src/main/java/com/fs/app/service/param/FsImMsgSendLogResponse.java

@@ -0,0 +1,78 @@
+package com.fs.app.service.param;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * OpenIM 消息发送记录响应参数
+ */
+@Data
+public class FsImMsgSendLogResponse {
+
+    /** 发送记录 id */
+    private Long logId;
+
+    /** 用户 ID(从详情表获取) */
+    private Long userId;
+
+    /** 销售 id(发送人 id) */
+    private Long companyUserId;
+
+    /** 公司 id */
+    private Long companyId;
+
+    /** 课程 id */
+    private Long courseId;
+
+    /** 课程名称 */
+    private String courseName;
+
+    /** 视频 id */
+    private Long videoId;
+
+    /** 视频标题 */
+    private String videoName;
+
+    /** 项目 ID */
+    private Long projectId;
+
+    /** 发送内容 */
+    private String sendTitle;
+
+    /** 预计发送时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date planSendTime;
+
+    /** 发送类型,1-定时;2-实时 */
+    private Integer sendType;
+
+    /** 发送方式,1-app;2-销售后台 */
+    private Integer sendMode;
+
+    /** 是否催课,1-是;0-否 */
+    private Boolean isUrgeCourse;
+
+    /** 消息类型,1-发课;2-催课 */
+    private Integer msgType;
+
+    /** 发送状态,1-已发送;2-待发送 */
+    private Integer sendStatus;
+
+    /** 执行状态,0-正常;1-失败 */
+    private Integer status;
+
+    /** 重试次数 */
+    private Integer count;
+
+    /** 执行结果 */
+    private String resultMessage;
+
+    /** 异常信息 */
+    private String exceptionInfo;
+
+    /** 创建时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+}

+ 23 - 0
fs-service/src/main/java/com/fs/app/service/param/FsImMsgSendLogStatisticsResponse.java

@@ -0,0 +1,23 @@
+package com.fs.app.service.param;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * OpenIM 消息发送记录响应参数
+ */
+@Data
+public class FsImMsgSendLogStatisticsResponse {
+    // 总数
+    private Long total;
+    // 已发送
+    private Long sent;
+    // 等待中
+    private Long pending;
+    // 异常
+    private Long failed;
+
+
+}

+ 25 - 2
fs-service/src/main/java/com/fs/gtPush/service/impl/uniPush2ServiceImpl.java

@@ -17,6 +17,7 @@ import com.fs.gtPush.domain.PushResult;
 import com.fs.gtPush.domain.UniPushLog;
 import com.fs.gtPush.service.UniPushLogService;
 import com.fs.gtPush.service.uniPush2Service;
+import com.fs.his.enums.PushLogTypeEnum;
 import com.fs.im.config.IMConfig;
 import com.fs.im.service.OpenIMService;
 import com.fs.system.service.ISysConfigService;
@@ -30,6 +31,7 @@ import org.springframework.stereotype.Service;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Objects;
 
 @Service
 @Slf4j
@@ -142,6 +144,17 @@ public class uniPush2ServiceImpl implements uniPush2Service {
         return null;
     }
 
+    /**
+     *
+     * @param userId 接收人id
+     * @param businessId 相关id
+     * @param purl 推送地址
+     * @param title
+     * @param content
+     * @param type 推送类型
+     * @param desType 推送类型详细类型
+     * @param imJsonString
+     */
     @Override
     public void pushIm(Long userId, Long businessId, String purl, String title, String content, Float type, Integer desType, String imJsonString) {
         try {
@@ -303,16 +316,26 @@ public class uniPush2ServiceImpl implements uniPush2Service {
                                    Float type, Integer desType, String imJsonString) {
         if (userId == null) return null;
         String jpushId = "";
-        FsUser fsUser = userService.selectFsUserByUserId(userId);
-        if (fsUser == null){
+        if (Objects.equals(type, PushLogTypeEnum.UTOC.getValue())){
             CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
             if (companyUser == null){
                 return null;
             }
             jpushId = companyUser.getJpushId();
         } else {
+            FsUser fsUser = userService.selectFsUserByUserId(userId);
             jpushId = fsUser.getJpushId();
         }
+//        FsUser fsUser = userService.selectFsUserByUserId(userId);
+//        if (fsUser == null){
+//            CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
+//            if (companyUser == null){
+//                return null;
+//            }
+//            jpushId = companyUser.getJpushId();
+//        } else {
+//            jpushId = fsUser.getJpushId();
+//        }
 
         if (StringUtils.isBlank(jpushId) || "0".equals(jpushId) || "string".equals(jpushId)) {
             return null;

+ 2 - 2
fs-service/src/main/java/com/fs/his/enums/PushLogTypeEnum.java

@@ -17,8 +17,8 @@ public enum PushLogTypeEnum {
     ORDER_INTEGRAL(0.4f,"积分订单通知"),
     HEALTH(1f,"健康管理类通知"),
     MARKET(2f,"营销类通知"),
-    COURSE(3f,"课程类通知");
-
+    COURSE(3f,"课程类通知"),
+    UTOC(4f,"用户发给销售类通知");
 
 
 

+ 18 - 15
fs-service/src/main/java/com/fs/his/service/impl/FsInquiryOrderMsgServiceImpl.java

@@ -18,6 +18,7 @@ import com.fs.gtPush.service.uniPush2Service;
 import com.fs.his.domain.*;
 import com.fs.his.dto.FsInquiryOrderPatientDTO;
 import com.fs.his.enums.PushLogDesTypeEnum;
+import com.fs.his.enums.PushLogTypeEnum;
 import com.fs.his.mapper.*;
 import com.fs.his.param.FsInquiryOrderMsgListDParam;
 import com.fs.his.param.ImMsgParam;
@@ -441,11 +442,13 @@ public class FsInquiryOrderMsgServiceImpl implements IFsInquiryOrderMsgService {
 
             }
             String jsonStr = objectMapper.writeValueAsString(openImMsgCallBackVO);
+            PushLogTypeEnum pushLogTypeEnum = PushLogTypeEnum.HEALTH;
             if (msgContentType != null) {
                 if (to.startsWith("U")) {
                     a = to.replace("U", "");
                 } else if (to.startsWith("C")) {
                     a = to.replace("C", "");
+                    pushLogTypeEnum = PushLogTypeEnum.UTOC;
                 }
                 switch (msgContentType) {
                     case 1601:
@@ -470,7 +473,7 @@ public class FsInquiryOrderMsgServiceImpl implements IFsInquiryOrderMsgService {
                         OpenImResponseDTOTest responseDTO1 = JSONUtil.toBean(result1, OpenImResponseDTOTest.class);
                         List<OpenIMServiceImpl.UserInfo> users = responseDTO1.getData().getUsersInfo();
 
-                        uniPush2Service.pushIm(Long.parseLong(a), 0l, "", users.get(0).getNickname(), "通话消息", 1f, PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
+                        uniPush2Service.pushIm(Long.parseLong(a), 0l, "", users.get(0).getNickname(), "通话消息", pushLogTypeEnum.getValue(), PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
 
                         break;
                     //普通消息
@@ -478,7 +481,7 @@ public class FsInquiryOrderMsgServiceImpl implements IFsInquiryOrderMsgService {
                         type = 1;
                         jsonNode = objectMapper.readTree(content);
                         cont = jsonNode.get("content").asText();
-                        uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), cont, 1f, PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
+                        uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), cont, pushLogTypeEnum.getValue(), PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
 
                         break;
                     //语音消息
@@ -506,7 +509,7 @@ public class FsInquiryOrderMsgServiceImpl implements IFsInquiryOrderMsgService {
 ////                                deviceSetUpService.sendMp3(deviceSendParam);
 //                            }
 //                        }
-                        uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), "语音消息", 1f, PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
+                        uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), "语音消息", pushLogTypeEnum.getValue(), PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
                         break;
                     //图片消息
                     case 102:
@@ -523,7 +526,7 @@ public class FsInquiryOrderMsgServiceImpl implements IFsInquiryOrderMsgService {
                         openImMsgCallBackVO.setContent("");
                         jsonStr = objectMapper.writeValueAsString(openImMsgCallBackVO);
                         type = 3;
-                        uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), "图片消息", 1f, PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
+                        uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), "图片消息", pushLogTypeEnum.getValue(), PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
                         break;
                     //视频消息
                     case 104:
@@ -540,7 +543,7 @@ public class FsInquiryOrderMsgServiceImpl implements IFsInquiryOrderMsgService {
                         openImMsgCallBackVO.setContent("");
                         jsonStr = objectMapper.writeValueAsString(openImMsgCallBackVO);
                         type = 4;
-                        uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), "视频消息", 1f, PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
+                        uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), "视频消息", pushLogTypeEnum.getValue(), PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
                         break;
                     //文件消息
                     case 105:
@@ -549,7 +552,7 @@ public class FsInquiryOrderMsgServiceImpl implements IFsInquiryOrderMsgService {
                         type = 4;
                         openImMsgCallBackVO.setContent("");
                         jsonStr = objectMapper.writeValueAsString(openImMsgCallBackVO);
-                        uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), "文件消息", 1f, PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
+                        uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), "文件消息", pushLogTypeEnum.getValue(), PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
                         break;
                     //自定义消息
                     case 110:
@@ -568,7 +571,7 @@ public class FsInquiryOrderMsgServiceImpl implements IFsInquiryOrderMsgService {
                             type = 5;
                             user = fsUserMapper.selectFsUserByUserId(Long.parseLong(a));
                             if (StringUtils.isNotEmpty(user.getJpushId())) {
-                                uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), "电子处方单", 1f, PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
+                                uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), "电子处方单", pushLogTypeEnum.getValue(), PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
                             }
                             break;
                         } else if (data.equals("report")) {
@@ -581,7 +584,7 @@ public class FsInquiryOrderMsgServiceImpl implements IFsInquiryOrderMsgService {
                             type = 6;
                             user = fsUserMapper.selectFsUserByUserId(Long.parseLong(a));
                             if (StringUtils.isNotEmpty(user.getJpushId())) {
-                                uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), "问诊报告单", 1f, PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
+                                uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), "问诊报告单", pushLogTypeEnum.getValue(), PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
                             }
                             break;
                         } else if (data.equals("follow")) {
@@ -590,7 +593,7 @@ public class FsInquiryOrderMsgServiceImpl implements IFsInquiryOrderMsgService {
                             //orderId = payload.get("extension").get("followId").asLong();
                             user = fsUserMapper.selectFsUserByUserId(Long.parseLong(a));
                             if (StringUtils.isNotEmpty(user.getJpushId())) {
-                                uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), "随访单", 1f, PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
+                                uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), "随访单", pushLogTypeEnum.getValue(), PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
                             }
                             break;
                         } else if (data.equals("drugReport")) {
@@ -599,7 +602,7 @@ public class FsInquiryOrderMsgServiceImpl implements IFsInquiryOrderMsgService {
                             type = 8;
                             user = fsUserMapper.selectFsUserByUserId(Long.parseLong(a));
                             if (StringUtils.isNotEmpty(user.getJpushId())) {
-                                uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), "用药报告单", 1f, PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
+                                uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), "用药报告单", pushLogTypeEnum.getValue(), PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
                             }
                             break;
                         } else if (data.equals("package")) {
@@ -613,7 +616,7 @@ public class FsInquiryOrderMsgServiceImpl implements IFsInquiryOrderMsgService {
                             openImMsgCallBackVO.setContent("");
                             jsonStr = objectMapper.writeValueAsString(openImMsgCallBackVO);
                             if (StringUtils.isNotEmpty(user.getJpushId())) {
-                                uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), "套餐包", 1f, PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
+                                uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), "套餐包", pushLogTypeEnum.getValue(), PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
                             }
                             break;
                         } else if (data.equals("couponPackage")) {
@@ -624,7 +627,7 @@ public class FsInquiryOrderMsgServiceImpl implements IFsInquiryOrderMsgService {
                             openImMsgCallBackVO.setContent("");
                             jsonStr = objectMapper.writeValueAsString(openImMsgCallBackVO);
                             if (StringUtils.isNotEmpty(user.getJpushId())) {
-                                uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), "私域疗法券", 1f, PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
+                                uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), "私域疗法券", pushLogTypeEnum.getValue(), PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
                             }
                             break;
                         } else if (data.equals("inquirySelect")) {
@@ -635,7 +638,7 @@ public class FsInquiryOrderMsgServiceImpl implements IFsInquiryOrderMsgService {
                             openImMsgCallBackVO.setContent("");
                             jsonStr = objectMapper.writeValueAsString(openImMsgCallBackVO);
                             if (StringUtils.isNotEmpty(user.getJpushId())) {
-                                uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), "会诊", 1f, PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
+                                uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), "会诊", pushLogTypeEnum.getValue(), PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
                             }
                             break;
                         } else if (data.equals("startInquiry") || data.equals("finishInquiry")) {
@@ -643,7 +646,7 @@ public class FsInquiryOrderMsgServiceImpl implements IFsInquiryOrderMsgService {
                             type = 1;
                             user = fsUserMapper.selectFsUserByUserId(Long.parseLong(a));
                             if (StringUtils.isNotEmpty(user.getJpushId())) {
-                                uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), "接诊通知", 1f, PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
+                                uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), "接诊通知", pushLogTypeEnum.getValue(), PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
                             }
                             break;
                         } else if (data.equals("course")) {
@@ -651,7 +654,7 @@ public class FsInquiryOrderMsgServiceImpl implements IFsInquiryOrderMsgService {
                             type = 1;
                             user = fsUserMapper.selectFsUserByUserId(Long.parseLong(a));
                             if (StringUtils.isNotEmpty(user.getJpushId())) {
-                                uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), cont, 1f, PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
+                                uniPush2Service.pushIm(Long.parseLong(a), 0l, "", openImMsgCallBackVO.getSenderNickname(), cont, pushLogTypeEnum.getValue(), PushLogDesTypeEnum.IM_MSG.getValue(), jsonStr);
                             }
                             break;
                         }

+ 6 - 0
fs-service/src/main/java/com/fs/im/mapper/FsImMsgSendLogMapper.java

@@ -4,6 +4,9 @@ import java.util.List;
 import java.util.Map;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.app.service.param.FsImMsgSendLogRequest;
+import com.fs.app.service.param.FsImMsgSendLogResponse;
+import com.fs.app.service.param.FsImMsgSendLogStatisticsResponse;
 import com.fs.course.vo.newfs.FsImSendLogVO;
 import com.fs.im.domain.FsImMsgSendLog;
 import org.apache.ibatis.annotations.Param;
@@ -72,4 +75,7 @@ public interface FsImMsgSendLogMapper extends BaseMapper<FsImMsgSendLog>{
 
     List<FsImMsgSendLog> selectSendLogListByDetailId(@Param("params") Map<String, Object> params);
 
+    List<FsImMsgSendLogResponse> selectFsImMsgSendLogInfoList(FsImMsgSendLogRequest request);
+
+    FsImMsgSendLogStatisticsResponse getFsImMsgSendStatistics(FsImMsgSendLogRequest request);
 }

+ 32 - 0
fs-service/src/main/java/com/fs/im/service/IFsImMsgSendLogService.java

@@ -4,6 +4,9 @@ import java.util.List;
 import java.util.Map;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.app.service.param.FsImMsgSendLogRequest;
+import com.fs.app.service.param.FsImMsgSendLogResponse;
+import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
 import com.fs.course.vo.newfs.FsImSendLogVO;
 import com.fs.im.domain.FsImMsgSendLog;
@@ -91,4 +94,33 @@ public interface IFsImMsgSendLogService extends IService<FsImMsgSendLog>{
      */
     FsImMsgSendLogVO selectFsImMsgSendLogDetail(Long logId);
 
+    /**
+     * 查询 OpenIM 消息发送记录信息列表
+     * @param request 请求参数
+     * @return 消息发送记录列表
+     */
+    List<FsImMsgSendLogResponse> selectFsImMsgSendLogInfoList(FsImMsgSendLogRequest request);
+
+    R getFsImMsgSendStatistics(FsImMsgSendLogRequest request);
+
+//    /**
+//     * 导出 OpenIM 消息发送记录
+//     * @param request 请求参数
+//     * @return 消息发送记录列表
+//     */
+//    List<FsImMsgSendLog> exportFsImMsgSendLog(FsImMsgSendLogRequest request);
+//
+//    /**
+//     * 查询消息发送详情列表
+//     * @param fsImMsgSendDetail 查询参数
+//     * @return 消息发送详情列表
+//     */
+//    List<FsImMsgSendDetail> selectFsImMsgSendDetailList(FsImMsgSendDetail fsImMsgSendDetail);
+//
+//    /**
+//     * 获取发送状态统计
+//     * @param request 请求参数
+//     * @return 统计信息
+//     */
+//    Map<String, Object> getFsImMsgSendStatistics(FsImMsgSendLogRequest request);
 }

+ 20 - 0
fs-service/src/main/java/com/fs/im/service/impl/FsImMsgSendLogServiceImpl.java

@@ -1,10 +1,15 @@
 package com.fs.im.service.impl;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fs.app.service.param.FsImMsgSendLogRequest;
+import com.fs.app.service.param.FsImMsgSendLogResponse;
+import com.fs.app.service.param.FsImMsgSendLogStatisticsResponse;
+import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.DateUtils;
@@ -191,4 +196,19 @@ public class FsImMsgSendLogServiceImpl extends ServiceImpl<FsImMsgSendLogMapper,
         fsImMsgSendLogVO.setDetailList(fsImMsgSendDetails);
         return fsImMsgSendLogVO;
     }
+
+    /**
+     * 查询 OpenIM 消息发送记录信息列表
+     */
+    @Override
+    public List<FsImMsgSendLogResponse> selectFsImMsgSendLogInfoList(FsImMsgSendLogRequest request) {
+       return baseMapper.selectFsImMsgSendLogInfoList(request);
+    }
+
+    @Override
+    public R getFsImMsgSendStatistics(FsImMsgSendLogRequest request) {
+        FsImMsgSendLogStatisticsResponse log=baseMapper.getFsImMsgSendStatistics(request);
+
+        return null;
+    }
 }

+ 1 - 0
fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java

@@ -1207,6 +1207,7 @@ public class OpenIMServiceImpl implements OpenIMService {
 
 
     @Override
+    @Async
     public OpenImResponseDTO batchSendCourseLimit(BatchSendCourseDTO batchSendCourseDTO) {
         ObjectMapper objectMapper = new ObjectMapper();
         objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 忽略 null 字段

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

@@ -2449,7 +2449,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </if>
     </select>
     <select id="selectFsUserListByPhone" resultType="com.fs.his.domain.FsUser">
-        select * from fs_user where phone=#{phone}
+        select * from fs_user where phone=#{phone} and is_del = 0 order by create_time
     </select>
     <!-- 查询用户列表(用于积分管理) -->
     <select id="selectFsUserListForIntegral" parameterType="FsUser" resultMap="FsUserResult">

+ 63 - 0
fs-service/src/main/resources/mapper/im/FsImMsgSendLogMapper.xml

@@ -207,6 +207,69 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 #{logDetailId}
             </foreach>
     </select>
+    <select id="selectFsImMsgSendLogInfoList" resultType="com.fs.app.service.param.FsImMsgSendLogResponse">
+        SELECT
+        d.log_id AS logId,
+        l.company_user_id AS companyUserId,
+        l.company_id AS companyId,
+        l.course_id AS courseId,
+        l.course_name AS courseName,
+        l.video_id AS videoId,
+        l.video_name AS videoName,
+        l.project_id AS projectId,
+        l.send_title AS sendTitle,
+        l.plan_send_time AS planSendTime,
+        l.send_type AS sendType,
+        l.send_mode AS sendMode,
+        l.is_urge_course AS isUrgeCourse,
+        l.msg_type AS msgType,
+        l.send_status AS sendStatus,
+        l.count AS count,
+        l.create_time AS createTime,
+        d.user_id AS userId,
+        d.status AS status,
+        d.exception_info AS exceptionInfo
+        FROM fs_im_msg_send_log l
+        LEFT JOIN fs_im_msg_send_detail d ON l.log_id = d.log_id
+        <where>
+            <if test="companyUserId != null"> AND l.company_user_id = #{companyUserId}</if>
+            <if test="companyId != null"> AND l.company_id = #{companyId}</if>
+            <if test="courseId != null"> AND l.course_id = #{courseId}</if>
+            <if test="courseName != null and courseName != ''"> AND l.course_name like concat('%', #{courseName}, '%')</if>
+            <if test="videoId != null"> AND l.video_id = #{videoId}</if>
+            <if test="videoName != null and videoName != ''"> AND l.video_name like concat('%', #{videoName}, '%')</if>
+            <if test="sendTitle != null and sendTitle != ''"> AND l.send_title like concat('%', #{sendTitle}, '%')</if>
+            <if test="planSendStartTime != null and planSendEndTime != null">
+                AND l.plan_send_time between #{planSendStartTime} and #{planSendEndTime}
+            </if>
+            <if test="sendType != null"> AND l.send_type = #{sendType}</if>
+            <if test="sendMode != null"> AND l.send_mode = #{sendMode}</if>
+            <if test="sendStatus != null"> AND l.send_status = #{sendStatus}</if>
+            <if test="msgType != null"> AND l.msg_type = #{msgType}</if>
+            <if test="projectId != null"> AND l.project_id = #{projectId}</if>
+            <if test="createTimeStartTime != null and createTimeEndTime != null">
+                AND d.create_time between #{createTimeStartTime} and #{createTimeEndTime}
+            </if>
+            <if test="status != null"> AND d.status = #{status}</if>
+        </where>
+        ORDER BY l.create_time DESC
+    </select>
+
+    <select id="getFsImMsgSendStatistics" resultType="com.fs.app.service.param.FsImMsgSendLogStatisticsResponse">
+        SELECT
+            count(d.log_id) as total,
+            sum(case when d.status = 0 then 1 else 0 end) as sent,
+            sum(case when d.send_status = 2 then 1 else 0 end) as pending,
+            sum(case when d.status = 1 then 1 else 0 end) as failed,
+
+            COUNT(DISTINCT log.log_id) AS total,
+            COUNT(DISTINCT log.log_id) FILTER (WHERE log.send_status = 1) AS sent,
+            COUNT(DISTINCT log.log_id) FILTER (WHERE log.send_status = 2) AS pending,
+            COUNT(DISTINCT log.log_id) FILTER (WHERE log.send_status = 3) AS failed
+        FROM
+            FROM fs_im_msg_send_log l
+        LEFT JOIN fs_im_msg_send_detail d ON l.log_id = d.log_id
+    </select>
 
 
 </mapper>

+ 16 - 11
fs-user-app/src/main/java/com/fs/app/controller/AppLoginController.java

@@ -499,18 +499,23 @@ public class AppLoginController extends AppBaseController{
             return R.error("验证码错误");
         }
 
-        updateExistingUserJpushId(user.get(0), map.get("jpushId"));
-        if (user.get(0).getUnionId()==null){
-            if (user.get(0).getPhone().length()<=11){
-                FsUser fsUser = new FsUser();
-                fsUser.setUserId(user.get(0).getUserId());
-                fsUser.setPhone(encryptPhone(phone));
-                userMapper.updateFsUser(fsUser);
-                logger.info("zyp \n【手机加密】:{}",encryptPhone(phone));
-            }
-            return R.ok(generateTokenAndReturn(user.get(0))).put("isNew",true).put("phone",encryptPhone(phone));
+        FsUser info=user.get(0);
+        FsUser userMap = new FsUser();
+        userMap.setUserId(info.getUserId());
+        String jpushId = map.get("jpushId");
+        if(StringUtils.isNotEmpty(jpushId)){
+            userMap.setJpushId(jpushId);
+        }
+        if(info.getAppCreateTime()== null){
+            userMap.setAppCreateTime(new Date());
         }
-        return generateTokenAndReturn(user.get(0));
+        if(info.getUnionId()==null && info.getPhone().length()<=11){
+            userMap.setPhone(encryptPhone(phone));
+        }
+        userMap.setUpdateTime(new Date());
+        userService.updateFsUser(userMap);
+
+        return generateTokenAndReturn(info);
     }
 
     @PostMapping("/resetPassword")