فهرست منبع

Merge remote-tracking branch 'origin/企微聊天' into 企微聊天

yh 1 هفته پیش
والد
کامیت
8b90e83ba3
28فایلهای تغییر یافته به همراه747 افزوده شده و 37 حذف شده
  1. 8 0
      fs-common/src/main/java/com/fs/common/utils/DateUtils.java
  2. 0 2
      fs-company-app/src/main/java/com/fs/app/controller/FsUserController.java
  3. 3 0
      fs-company-app/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java
  4. 2 0
      fs-service/src/main/java/com/fs/course/param/FsCourseLinkCreateParam.java
  5. 2 0
      fs-service/src/main/java/com/fs/course/param/newfs/FsCourseSortLinkParam.java
  6. 18 4
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java
  7. 5 0
      fs-service/src/main/java/com/fs/his/config/AppConfig.java
  8. 2 0
      fs-service/src/main/java/com/fs/his/config/IntegralConfig.java
  9. 39 0
      fs-service/src/main/java/com/fs/his/domain/FsUserPlayer.java
  10. 6 0
      fs-service/src/main/java/com/fs/his/enums/FsUserIntegralLogTypeEnum.java
  11. 2 2
      fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java
  12. 67 0
      fs-service/src/main/java/com/fs/his/mapper/FsUserPlayerMapper.java
  13. 2 0
      fs-service/src/main/java/com/fs/his/param/FsUserAddIntegralParam.java
  14. 67 0
      fs-service/src/main/java/com/fs/his/service/IFsUserPlayerService.java
  15. 23 18
      fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java
  16. 19 0
      fs-service/src/main/java/com/fs/his/service/impl/FsUserIntegralLogsServiceImpl.java
  17. 131 0
      fs-service/src/main/java/com/fs/his/service/impl/FsUserPlayerServiceImpl.java
  18. 4 6
      fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java
  19. 12 0
      fs-service/src/main/java/com/fs/his/vo/FsUserPlayerVo.java
  20. 1 0
      fs-service/src/main/java/com/fs/im/service/OpenIMService.java
  21. 40 0
      fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java
  22. 9 2
      fs-service/src/main/resources/mapper/his/FsUserMapper.xml
  23. 96 0
      fs-service/src/main/resources/mapper/his/FsUserPlayerMapper.xml
  24. 14 1
      fs-user-app/src/main/java/com/fs/app/controller/AdvController.java
  25. 21 2
      fs-user-app/src/main/java/com/fs/app/controller/AppLoginController.java
  26. 101 0
      fs-user-app/src/main/java/com/fs/app/controller/game/PlayerController.java
  27. 28 0
      fs-user-app/src/main/java/com/fs/app/param/Pagination.java
  28. 25 0
      fs-user-app/src/main/java/com/fs/app/param/UserRequestParam.java

+ 8 - 0
fs-common/src/main/java/com/fs/common/utils/DateUtils.java

@@ -276,6 +276,14 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         cal.add(Calendar.DATE, days);
         return new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
     }
+    public static Date addDateDay(int days) {
+        return Date.from(
+                LocalDate.now()
+                        .plusDays(days)
+                        .atStartOfDay(ZoneId.systemDefault())
+                        .toInstant()
+        );
+    }
     /**
      * 获取到当天时间的开始:当天0时0分0秒0毫秒
      * @return

+ 0 - 2
fs-company-app/src/main/java/com/fs/app/controller/FsUserController.java

@@ -86,10 +86,8 @@ public class FsUserController extends AppBaseController {
     public ResponseResult<PageInfo<FsUserPageListVO>> pageList(@RequestBody FsUserPageListParam param) {
         log.debug("用户会员分页列表 param: {}", JSON.toJSONString(param));
         param.setUserId(Long.parseLong(getUserId()));
-//        PageHelper.startPage(param.getPageNum(), param.getPageSize());
         param.setIsHidePhoneMiddle(false);
         PageInfo<FsUserPageListVO> fsUserPageListVOPageInfo = fsUserService.selectFsUserPageList(param);
-//        PageInfo<FsUserPageListVO> pageInfo = new PageInfo<>(list);
         return ResponseResult.ok(fsUserPageListVOPageInfo);
     }
 

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

@@ -185,8 +185,11 @@ public class FsUserCourseVideoController extends AppBaseController {
 
         R courseSortLink = fsUserCourseService.createCourseSortLink(fsCourseLinkCreateParam);
         String url = courseSortLink.get("url").toString();
+        String linkId=courseSortLink.get("linkId").toString();
+
         Map<String, Object> map = new HashMap<>();
         map.put("url", url);
+        map.put("linkId", linkId);
         return R.ok(map);
     }
 

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

@@ -40,4 +40,6 @@ public class FsCourseLinkCreateParam {
 
     private Long projectId;//项目ID
 
+    private String type; // 1-app
+
 }

+ 2 - 0
fs-service/src/main/java/com/fs/course/param/newfs/FsCourseSortLinkParam.java

@@ -41,4 +41,6 @@ public class FsCourseSortLinkParam {
     @ApiModelProperty(value = "项目id")
     private Long projectId;
 
+    private String type; // 1-app
+
 }

+ 18 - 4
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java

@@ -586,7 +586,7 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
         BeanUtils.copyProperties(link, courseMap);
         courseMap.setProjectId(param.getProjectId());
         String courseJson = JSON.toJSONString(courseMap);
-        link.setRealLink(realLink + courseJson);
+        link.setRealLink(("1".equals(param.getType()) ?appRealLink:realLink) + courseJson);
 
         link.setCreateTime(new Date());
 
@@ -595,9 +595,23 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
         link.setUpdateTime(calendar.getTime());
         int i = fsCourseLinkMapper.insertFsCourseLink(link);
         if (i > 0){
-            String domainName = getDomainName(param.getCompanyUserId(), config);
-            String sortLink = domainName + shortLink + link.getLink();
-            return R.ok().put("url", sortLink).put("link", random);
+            if ("1".equals(param.getType())){
+                if (CloudHostUtils.hasCloudHostName("金牛明医")){
+                    String domainName = getDomainName(param.getCompanyUserId(), config);
+                    String sortLink = domainName+"/courseH5"+ link.getRealLink().replace("/#","");
+                    sortLink.replaceAll("\\\\", "");
+                    return R.ok().put("url", sortLink).put("link", random).put("linkId", link.getLinkId());
+                }
+                String domainName = getDomainName(param.getCompanyUserId(), config);
+                String sortLink = domainName+ link.getRealLink().replace("/#","");
+                sortLink = sortLink.replaceAll("\\\\", "");
+                return R.ok().put("url", sortLink).put("link", random).put("linkId", link.getLinkId());
+            }else {
+                String domainName = getDomainName(param.getCompanyUserId(), config);
+                String sortLink = domainName + shortLink + link.getLink();
+                return R.ok().put("url", sortLink).put("link", random).put("linkId", link.getLinkId());
+
+            }
         }
         return R.error("生成链接失败!");
     }

+ 5 - 0
fs-service/src/main/java/com/fs/his/config/AppConfig.java

@@ -13,4 +13,9 @@ public class AppConfig {
     private Long courseId;
     private List<FsUserCourseVideoVO> fsCourse;
     private Integer unbindLimit;
+
+    private String corpId; //APP客服配置 企业主体id
+    private String corpUrl; //APP客服配置 企业主体链接
+    private Integer addIntegral; //玩一局游戏加多少积分
+    private Integer defaultRewardGold; //看视频获取多少金币
 }

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

@@ -26,4 +26,6 @@ public class IntegralConfig implements Serializable {
     private Integer integralAddPatient;//新用户完善就诊人获得积分
     private Integer integralAddUserAddress;//新用户填写收货地址获取积分
     private Integer integralSubscriptCourse;//付费课程订阅积分比例
+    private Integer downloadAppIntegral; // 首次下载app获取积分
+    private Integer integralPlayGame; // 首次下载app获取积分
 }

+ 39 - 0
fs-service/src/main/java/com/fs/his/domain/FsUserPlayer.java

@@ -0,0 +1,39 @@
+package com.fs.his.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户游戏记录对象 fs_user_player
+ *
+ * @author fs
+ * @date 2026-02-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsUserPlayer extends BaseEntity{
+
+    /** 主键id */
+    @TableId
+    private Long id;
+
+    @Excel(name = "用户id")
+    private Long userId;
+
+    /** 游戏类型 */
+    @Excel(name = "游戏类型")
+    private Integer gameId;
+
+    /** 等级 */
+    @Excel(name = "等级")
+    private Integer level;
+
+    /** 星星数 */
+    @Excel(name = "星星数")
+    private String star;
+
+
+}

+ 6 - 0
fs-service/src/main/java/com/fs/his/enums/FsUserIntegralLogTypeEnum.java

@@ -33,6 +33,12 @@ public enum FsUserIntegralLogTypeEnum {
     TYPE_23(23,"管理员添加"),
     TYPE_24(24, "付费课程订阅"),
     TYPE_25(25, "app取消积分订单"),
+//    TYPE_26(26, "直播红包积分"),
+    TYPE_27(27, "直播完课积分"),
+    TYPE_26(26, "直播红包积分"),
+//    TYPE_27(27, "积分订单取消退回积分"),
+    TYPE_28(28, "首次下载APP获取积分"),
+    TYPE_29(29,"玩游戏获取积分"),
     ;
 
 

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

@@ -134,8 +134,8 @@ public interface FsUserMapper
             "</script>"})
     List<FsUserExportListVO> selectFsUserExportListVO(FsUserParam fsUser);
 
-    @Update("update fs_user set is_del=1 where user_id=#{userId}")
-    int updateFsUserByUserId(Long userId);
+
+    int updateFsUserByUserId(@Param("userId") Long userId,@Param("remark")String remark);
 
     @Select("select f1.*,f2.nick_name tui_name,f2.phone tui_phone FROM fs_user f1 LEFT JOIN fs_user f2 ON f1.tui_user_id =f2.user_id where f1.user_id=#{userId} ")
     FsUserVO selectFsUserVoByUserId(Long userId);

+ 67 - 0
fs-service/src/main/java/com/fs/his/mapper/FsUserPlayerMapper.java

@@ -0,0 +1,67 @@
+package com.fs.his.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.his.domain.FsUserPlayer;
+import com.fs.his.vo.FsUserPlayerVo;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 用户游戏记录Mapper接口
+ * 
+ * @author fs
+ * @date 2026-02-25
+ */
+public interface FsUserPlayerMapper extends BaseMapper<FsUserPlayer>{
+    /**
+     * 查询用户游戏记录
+     * 
+     * @param id 用户游戏记录主键
+     * @return 用户游戏记录
+     */
+    FsUserPlayer selectFsUserPlayerById(Long id);
+
+    /**
+     * 查询用户游戏记录列表
+     * 
+     * @param fsUserPlayer 用户游戏记录
+     * @return 用户游戏记录集合
+     */
+    List<FsUserPlayer> selectFsUserPlayerList(FsUserPlayer fsUserPlayer);
+
+    /**
+     * 新增用户游戏记录
+     * 
+     * @param fsUserPlayer 用户游戏记录
+     * @return 结果
+     */
+    int insertFsUserPlayer(FsUserPlayer fsUserPlayer);
+
+    /**
+     * 修改用户游戏记录
+     * 
+     * @param fsUserPlayer 用户游戏记录
+     * @return 结果
+     */
+    int updateFsUserPlayer(FsUserPlayer fsUserPlayer);
+
+    /**
+     * 删除用户游戏记录
+     * 
+     * @param id 用户游戏记录主键
+     * @return 结果
+     */
+    int deleteFsUserPlayerById(Long id);
+
+    /**
+     * 批量删除用户游戏记录
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteFsUserPlayerByIds(Long[] ids);
+
+    FsUserPlayerVo selectFsUserByUserIdAndGameId(@Param("userId") Long userId,@Param("gameId") Integer gameId);
+
+    int updateFsUserPlayerByUserIdAndGameId(FsUserPlayer fsUserPlayer);
+}

+ 2 - 0
fs-service/src/main/java/com/fs/his/param/FsUserAddIntegralParam.java

@@ -15,4 +15,6 @@ public class FsUserAddIntegralParam implements Serializable {
 
     private Integer type; //类型1浏览商品 2刷视频 3邀请奖励 4被邀请奖励
 
+    private Long integral;
+
 }

+ 67 - 0
fs-service/src/main/java/com/fs/his/service/IFsUserPlayerService.java

@@ -0,0 +1,67 @@
+package com.fs.his.service;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.his.domain.FsUser;
+import com.fs.his.domain.FsUserPlayer;
+import com.fs.his.vo.FsUserPlayerVo;
+
+/**
+ * 用户游戏记录Service接口
+ * 
+ * @author fs
+ * @date 2026-02-25
+ */
+public interface IFsUserPlayerService extends IService<FsUserPlayer>{
+    /**
+     * 查询用户游戏记录
+     * 
+     * @param id 用户游戏记录主键
+     * @return 用户游戏记录
+     */
+    FsUserPlayer selectFsUserPlayerById(Long id);
+
+    /**
+     * 查询用户游戏记录列表
+     * 
+     * @param fsUserPlayer 用户游戏记录
+     * @return 用户游戏记录集合
+     */
+    List<FsUserPlayer> selectFsUserPlayerList(FsUserPlayer fsUserPlayer);
+
+    /**
+     * 新增用户游戏记录
+     * 
+     * @param fsUserPlayer 用户游戏记录
+     * @return 结果
+     */
+    int insertFsUserPlayer(FsUserPlayer fsUserPlayer);
+
+    /**
+     * 修改用户游戏记录
+     * 
+     * @param fsUserPlayer 用户游戏记录
+     * @return 结果
+     */
+    int updateFsUserPlayer(FsUserPlayer fsUserPlayer);
+
+    /**
+     * 批量删除用户游戏记录
+     * 
+     * @param ids 需要删除的用户游戏记录主键集合
+     * @return 结果
+     */
+    int deleteFsUserPlayerByIds(Long[] ids);
+
+    /**
+     * 删除用户游戏记录信息
+     * 
+     * @param id 用户游戏记录主键
+     * @return 结果
+     */
+    int deleteFsUserPlayerById(Long id);
+
+    FsUserPlayerVo selectFsUserByUserIdAndGameId(Long userId,Integer gameId);
+
+    int updateFsUserPlayerByUserIdAndGameId(FsUserPlayer fsUserPlayer);
+}

+ 23 - 18
fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java

@@ -1885,34 +1885,39 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
             for (FsStorePayment fsStorePayment : list) {
                 CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
                     try {
-                        updateFsStorePaymentByDecryptForm(fsStorePayment.getPaymentId(),null);
-                        //查询是否改为已支付
-                        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);
+                        //查询订单是否是20天前且已取消的订单
+                        if (fsStorePayment.getCreateTime().before(DateUtils.addDateDay(-20))) {
+                            logger.info("定时任务:同步支付状态在20天前,取消同步,payment_id:{}",fsStorePayment.getPaymentId());
+                        } else {
+                            updateFsStorePaymentByDecryptForm(fsStorePayment.getPaymentId(),null);
+                            //查询是否改为已支付
+                            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 (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());
+                        String businessId = fsStorePayment.getBusinessId();
                         if (businessId != null && fsStorePayment.getBusinessType() == 3) {
                             fsStorePaymentError.setOrderId(Long.valueOf(businessId));
                             FsPackageOrder fsPackageOrder = packageOrderService.selectFsPackageOrderByOrderId(Long.valueOf(businessId));

+ 19 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsUserIntegralLogsServiceImpl.java

@@ -209,11 +209,30 @@ public class FsUserIntegralLogsServiceImpl implements IFsUserIntegralLogsService
                     return addProductIntegral(config.getIntegralProduct(),user.getUserId(),user.getIntegral());
                 case 2:
                     return addVideoIntegral(config.getIntegralFirstVideo(),config.getIntegralFinishVideo(),user.getUserId(),user.getIntegral());
+                case 3:
+                    return addGameIntegral(param.getIntegral(),user.getUserId(),user.getIntegral());
             }
         }
         return R.error("用户信息不存在");
     }
 
+    public R addGameIntegral(Long integral,Long userId,Long userIntegral) {
+        FsUser userMap=new FsUser();
+        userMap.setUserId(userId);
+        userMap.setIntegral(userIntegral+integral);
+        fsUserMapper.updateFsUser(userMap);
+        FsUserIntegralLogs integralLogs = new FsUserIntegralLogs();
+        integralLogs.setIntegral(integral);
+        integralLogs.setUserId(userId);
+        integralLogs.setBalance(userMap.getIntegral());
+        integralLogs.setLogType(FsUserIntegralLogTypeEnum.TYPE_29.getValue());
+        integralLogs.setCreateTime(new Date());
+        if (fsUserIntegralLogsMapper.insertFsUserIntegralLogs(integralLogs)>0){
+            return R.ok("玩游戏获得"+integral+"积分");
+        }
+        return R.error("获取积分失败");
+    }
+
     /**
      * 更新积分通用
      * @param param

+ 131 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsUserPlayerServiceImpl.java

@@ -0,0 +1,131 @@
+package com.fs.his.service.impl;
+
+import java.util.List;
+import com.fs.common.utils.DateUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.his.domain.FsUser;
+import com.fs.his.domain.FsUserPlayer;
+import com.fs.his.mapper.FsUserMapper;
+import com.fs.his.mapper.FsUserPlayerMapper;
+import com.fs.his.service.IFsUserPlayerService;
+import com.fs.his.service.IFsUserService;
+import com.fs.his.vo.FsUserPlayerVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 用户游戏记录Service业务层处理
+ * 
+ * @author fs
+ * @date 2026-02-25
+ */
+@Service
+public class FsUserPlayerServiceImpl extends ServiceImpl<FsUserPlayerMapper, FsUserPlayer> implements IFsUserPlayerService {
+
+    @Autowired
+    private FsUserMapper fsUserMapper;
+
+
+    /**
+     * 查询用户游戏记录
+     * 
+     * @param id 用户游戏记录主键
+     * @return 用户游戏记录
+     */
+    @Override
+    public FsUserPlayer selectFsUserPlayerById(Long id)
+    {
+        return baseMapper.selectFsUserPlayerById(id);
+    }
+
+    /**
+     * 查询用户游戏记录列表
+     * 
+     * @param fsUserPlayer 用户游戏记录
+     * @return 用户游戏记录
+     */
+    @Override
+    public List<FsUserPlayer> selectFsUserPlayerList(FsUserPlayer fsUserPlayer)
+    {
+        return baseMapper.selectFsUserPlayerList(fsUserPlayer);
+    }
+
+    /**
+     * 新增用户游戏记录
+     * 
+     * @param fsUserPlayer 用户游戏记录
+     * @return 结果
+     */
+    @Override
+    public int insertFsUserPlayer(FsUserPlayer fsUserPlayer)
+    {
+        fsUserPlayer.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertFsUserPlayer(fsUserPlayer);
+    }
+
+    /**
+     * 修改用户游戏记录
+     * 
+     * @param fsUserPlayer 用户游戏记录
+     * @return 结果
+     */
+    @Override
+    public int updateFsUserPlayer(FsUserPlayer fsUserPlayer)
+    {
+        fsUserPlayer.setUpdateTime(DateUtils.getNowDate());
+        return baseMapper.updateFsUserPlayer(fsUserPlayer);
+    }
+
+    /**
+     * 批量删除用户游戏记录
+     * 
+     * @param ids 需要删除的用户游戏记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserPlayerByIds(Long[] ids)
+    {
+        return baseMapper.deleteFsUserPlayerByIds(ids);
+    }
+
+    /**
+     * 删除用户游戏记录信息
+     * 
+     * @param id 用户游戏记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserPlayerById(Long id)
+    {
+        return baseMapper.deleteFsUserPlayerById(id);
+    }
+
+    @Override
+    public FsUserPlayerVo selectFsUserByUserIdAndGameId(Long userId,Integer gameId) {
+        if (userId == null || gameId == null) {
+            return null;
+        }
+        FsUserPlayerVo fsUserPlayerVo = baseMapper.selectFsUserByUserIdAndGameId(userId, gameId);
+        if(fsUserPlayerVo == null){
+            //查询用户是否存在
+            FsUser fsUser = fsUserMapper.selectFsUserByUserId(userId);
+            if(fsUser == null){
+                return null;
+            }
+            FsUserPlayer fsUserPlayer = new FsUserPlayer();
+            fsUserPlayer.setGameId(gameId);
+            fsUserPlayer.setUserId(userId);
+            fsUserPlayer.setLevel(1); //等级
+            fsUserPlayer.setStar("{}"); //星星数
+            insertFsUserPlayer(fsUserPlayer);
+            fsUserPlayerVo = baseMapper.selectFsUserByUserIdAndGameId(userId, gameId);
+        }
+        return fsUserPlayerVo;
+    }
+
+    @Override
+    public int updateFsUserPlayerByUserIdAndGameId(FsUserPlayer fsUserPlayer) {
+        fsUserPlayer.setUpdateTime(DateUtils.getNowDate());
+        return baseMapper.updateFsUserPlayerByUserIdAndGameId(fsUserPlayer);
+    }
+}

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

@@ -26,10 +26,7 @@ import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.enums.ImTypeEnum;
 import com.fs.common.param.LoginMaWxParam;
-import com.fs.common.utils.DateUtils;
-import com.fs.common.utils.DictUtils;
-import com.fs.common.utils.ParseUtils;
-import com.fs.common.utils.StringUtils;
+import com.fs.common.utils.*;
 import com.fs.company.cache.ICompanyTagCacheService;
 import com.fs.company.cache.ICompanyUserCacheService;
 import com.fs.company.domain.*;
@@ -279,7 +276,7 @@ public class FsUserServiceImpl implements IFsUserService {
     @Override
     public int deleteFsUserByUserIds(Long[] userIds) {
         for (Long userId : userIds) {
-            fsUserMapper.updateFsUserByUserId(userId);
+            fsUserMapper.updateFsUserByUserId(userId,null);
         }
         return userIds.length;
     }
@@ -292,7 +289,8 @@ public class FsUserServiceImpl implements IFsUserService {
      */
     @Override
     public int deleteFsUserByUserId(Long userId) {
-        return fsUserMapper.updateFsUserByUserId(userId);
+        String remark = "由于绑定手机号或者绑定微信有重复用户,删除最新用户";
+        return fsUserMapper.updateFsUserByUserId(userId,remark);
     }
 
     /**

+ 12 - 0
fs-service/src/main/java/com/fs/his/vo/FsUserPlayerVo.java

@@ -0,0 +1,12 @@
+package com.fs.his.vo;
+
+import com.fs.his.domain.FsUserPlayer;
+import lombok.Data;
+
+@Data
+public class FsUserPlayerVo extends FsUserPlayer {
+    private String nickName;
+    private String avatar;
+    private Long integral;
+
+}

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

@@ -89,4 +89,5 @@ public interface OpenIMService {
 
     OpenImResponseDTO doctorSendMsgToUser(Long userId,Long doctorId,Integer type,Integer status);
 
+    OpenImResponseDTO getFriendList(String userID, int pageNumber, int showNumber,Integer applyType);
 }

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

@@ -1628,4 +1628,44 @@ public class OpenIMServiceImpl implements OpenIMService {
         openImMsgDTO.setContent(content);
         return openIMSendMsg(openImMsgDTO);
     }
+
+    @Override
+    public OpenImResponseDTO getFriendList(String userID, int pageNumber, int showNumber,Integer applyType) {
+        String adminToken = getAdminToken();
+        JSONObject jsonObject = new JSONObject();
+        Map<String,Object> map = new HashMap<>();
+        map.put("pageNumber", pageNumber);
+        map.put("showNumber", showNumber);
+        jsonObject.put("userID",userID);
+        jsonObject.put("pagination",map);
+        if (applyType == 1){
+            String body = HttpRequest.post(IMConfig.URL+"/friend/get_friend_list")
+                    .header("operationID", String.valueOf(System.currentTimeMillis()))
+                    .header("token", adminToken)
+                    .body(jsonObject.toString())
+                    .execute()
+                    .body();
+            OpenImResponseDTO responseDTO= JSONUtil.toBean(body,OpenImResponseDTO.class);
+            return responseDTO;
+        }else if (applyType == 2){
+            String body = HttpRequest.post(IMConfig.URL+"/friend/get_self_friend_apply_list")
+                    .header("operationID", String.valueOf(System.currentTimeMillis()))
+                    .header("token", adminToken)
+                    .body(jsonObject.toString())
+                    .execute()
+                    .body();
+            OpenImResponseDTO responseDTO= JSONUtil.toBean(body,OpenImResponseDTO.class);
+            return responseDTO;
+        }else if (applyType == 3){
+            String body = HttpRequest.post(IMConfig.URL+"/friend/get_friend_apply_list")
+                    .header("operationID", String.valueOf(System.currentTimeMillis()))
+                    .header("token", adminToken)
+                    .body(jsonObject.toString())
+                    .execute()
+                    .body();
+            OpenImResponseDTO responseDTO= JSONUtil.toBean(body,OpenImResponseDTO.class);
+            return responseDTO;
+        }
+        return null;
+    }
 }

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

@@ -281,8 +281,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             AND fs_user_company_user.project_id = #{projectId}
         </if>
         <if test="keyword != null and keyword !='' ">
-            AND (fs_user.nick_name LIKE concat('%',#{keyword},'%')
-            or  fs_user.phone LIKE concat('%',#{keyword},'%')
+            AND (fs_user.nick_name   LIKE concat('%',#{keyword} COLLATE utf8mb4_unicode_ci,'%')
+            or  fs_user.phone  LIKE concat('%',#{keyword} COLLATE utf8mb4_unicode_ci,'%')
             )
         </if>
         <if test="registerStartTime != null and registerStartTime !='' ">
@@ -746,6 +746,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <update id="updatePasswordByPhone">
         update fs_user set password = #{password} where phone = #{encryptPhone}
     </update>
+    <update id="updateFsUserByUserId">
+        update fs_user set is_del=1
+                       <if test="remark != null and remark != ''">
+                           ,remark = #{remark}
+                       </if>
+                       where user_id=#{userId}
+    </update>
 
     <select id="selectUserListByMap" resultType="com.fs.his.vo.OptionsVO">
         select

+ 96 - 0
fs-service/src/main/resources/mapper/his/FsUserPlayerMapper.xml

@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.his.mapper.FsUserPlayerMapper">
+    
+    <resultMap type="FsUserPlayer" id="FsUserPlayerResult">
+        <result property="id"    column="id"    />
+        <result property="userId"    column="user_id"    />
+        <result property="gameId"    column="game_id"    />
+        <result property="level"    column="level"    />
+        <result property="star"    column="star"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectFsUserPlayerVo">
+        select id, user_id, game_id, level, star, create_time, update_time from fs_user_player
+    </sql>
+
+    <select id="selectFsUserPlayerList" parameterType="FsUserPlayer" resultMap="FsUserPlayerResult">
+        <include refid="selectFsUserPlayerVo"/>
+        <where>  
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="gameId != null "> and game_id = #{gameId}</if>
+            <if test="level != null "> and `level` = #{level}</if>
+            <if test="star != null "> and star = #{star}</if>
+        </where>
+    </select>
+    
+    <select id="selectFsUserPlayerById" parameterType="Long" resultMap="FsUserPlayerResult">
+        <include refid="selectFsUserPlayerVo"/>
+        where id = #{id}
+    </select>
+    <select id="selectFsUserByUserIdAndGameId" resultType="com.fs.his.vo.FsUserPlayerVo">
+        select fup.id, fup.user_id, fup.game_id, fup.level, fup.star, fup.create_time, fup.update_time,fu.nick_name,
+               fu.avatar,fu.integral
+        from fs_user_player fup
+        inner join fs_user fu on fu.user_id = fup.user_id
+        WHERE
+            fup.user_id = #{userId} and fup.game_id = #{gameId}
+    </select>
+
+    <insert id="insertFsUserPlayer" parameterType="FsUserPlayer" useGeneratedKeys="true" keyProperty="id">
+        insert into fs_user_player
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="userId != null">user_id,</if>
+            <if test="gameId != null">game_id,</if>
+            <if test="level != null">`level`,</if>
+            <if test="star != null">star,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="userId != null">#{userId},</if>
+            <if test="gameId != null">#{gameId},</if>
+            <if test="level != null">#{level},</if>
+            <if test="star != null">#{star},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateFsUserPlayer" parameterType="FsUserPlayer">
+        update fs_user_player
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="gameId != null">game_id = #{gameId},</if>
+            <if test="level != null">`level` = #{level},</if>
+            <if test="star != null">star = #{star},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+    <update id="updateFsUserPlayerByUserIdAndGameId">
+        update fs_user_player
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="level != null">`level` = #{level},</if>
+            <if test="star != null">star = #{star},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where user_Id = #{userId} and game_id = #{gameId}
+    </update>
+
+    <delete id="deleteFsUserPlayerById" parameterType="Long">
+        delete from fs_user_player where id = #{id}
+    </delete>
+
+    <delete id="deleteFsUserPlayerByIds" parameterType="String">
+        delete from fs_user_player where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 14 - 1
fs-user-app/src/main/java/com/fs/app/controller/AdvController.java

@@ -1,6 +1,7 @@
 package com.fs.app.controller;
 
 
+import com.fs.common.utils.StringUtils;
 import com.fs.his.param.FsAdvUParam;
 import com.fs.app.utils.JwtUtils;
 import com.fs.common.core.domain.R;
@@ -8,18 +9,22 @@ import com.fs.his.domain.FsAdv;
 import com.fs.his.service.IFsAdvService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.List;
+import java.util.stream.Collectors;
 
 
 @Api("广告位接口")
 @RestController
 @RequestMapping(value="/app/adv")
+@Slf4j
 public class AdvController {
 	@Autowired
     JwtUtils jwtUtils;
@@ -29,8 +34,16 @@ public class AdvController {
 //	@Cacheable(value="getAdvList", key="#map")
 	@ApiOperation("获取首页广告位")
 	@GetMapping("/getAdvList")
-	public R getAdvList(FsAdvUParam map){
+	public R getAdvList(FsAdvUParam map, HttpServletRequest request){
 		List<FsAdv> list=advService.selectFsAdvListUVO(map);
+		try {
+			String sourceType = request.getHeader("sourcetype");
+			if(StringUtils.isNotBlank(sourceType)){
+				list = list.stream().filter(item->!item.getAdvTitle().equals("app下载")).collect(Collectors.toList());
+			}
+		} catch (Exception e) {
+			log.error("获取首页广告位,获取header报错:{}",e.getMessage());
+		}
 		return R.ok().put("data",list);
 	}
 

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

@@ -23,6 +23,7 @@ import com.fs.his.service.IFsUserNewTaskService;
 import com.fs.his.service.IFsUserService;
 import com.fs.his.utils.ConfigUtil;
 import com.fs.his.vo.FsUserRegisterParam;
+import com.fs.im.service.OpenIMService;
 import com.fs.watch.domain.WatchDeviceSetup;
 import com.fs.watch.domain.WatchUser;
 import com.fs.watch.service.WatchUserService;
@@ -66,6 +67,10 @@ public class AppLoginController extends AppBaseController{
 
     @Autowired
     private ISmsService smsService;
+
+    @Autowired
+    private OpenIMService openIMService;
+
     @ApiOperation("注册app用户")
     @PostMapping("/register")
     @RepeatSubmit
@@ -490,7 +495,8 @@ public class AppLoginController extends AppBaseController{
             keepUser.setUnionId(user.getUnionId());
             keepUser.setPhone(param.getPhone());
             if (userService.updateFsUser(keepUser)>0){
-                userService.realDeleteFsUserByUserId(deleteUser.getUserId());
+//                userService.realDeleteFsUserByUserId(deleteUser.getUserId());
+                userService.deleteFsUserByUserId(deleteUser.getUserId());
                 return generateTokenAndReturn(keepUser);
             }
             return R.error("绑定手机号失败");
@@ -559,7 +565,8 @@ public class AppLoginController extends AppBaseController{
                     keepUser.setAvatar(avatar);
                     keepUser.setSex(sex);
                     if (userService.updateFsUser(keepUser)>0){
-                        userService.realDeleteFsUserByUserId(deleteUser.getUserId());
+//                        userService.realDeleteFsUserByUserId(deleteUser.getUserId());
+                        userService.deleteFsUserByUserId(deleteUser.getUserId());
                         return generateTokenAndReturn(keepUser);
                     }
                     else {
@@ -923,4 +930,16 @@ public class AppLoginController extends AppBaseController{
         // 不存在,追加到末尾
         return currentAppIds + "," + newAppId;
     }
+
+    /**
+     * 获取好友申请列表
+     *
+     * @param userRequestParam
+     * @return
+     */
+    @PostMapping("/getFriendList")
+    public R getFriendList(@RequestBody UserRequestParam userRequestParam)
+    {
+        return R.ok().put("data",openIMService.getFriendList(userRequestParam.getUserID(),userRequestParam.getPagination().getPageNumber(),userRequestParam.getPagination().getShowNumber(),userRequestParam.getApplyType()));
+    }
 }

+ 101 - 0
fs-user-app/src/main/java/com/fs/app/controller/game/PlayerController.java

@@ -0,0 +1,101 @@
+package com.fs.app.controller.game;
+
+import cn.hutool.json.JSONUtil;
+import com.fs.app.annotation.Login;
+import com.fs.app.controller.AppBaseController;
+import com.fs.common.core.domain.R;
+import com.fs.his.config.AppConfig;
+import com.fs.his.config.IntegralConfig;
+import com.fs.his.domain.FsUser;
+import com.fs.his.domain.FsUserPlayer;
+import com.fs.his.param.FsUserAddIntegralParam;
+import com.fs.his.service.IFsUserIntegralLogsService;
+import com.fs.his.service.IFsUserPlayerService;
+import com.fs.his.service.IFsUserService;
+import com.fs.his.vo.FsUserPlayerVo;
+import com.fs.system.service.ISysConfigService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+
+import static com.fs.his.utils.PhoneUtil.decryptPhoneMk;
+
+
+@RestController
+@RequestMapping("/app/player")
+public class PlayerController extends AppBaseController {
+
+    @Autowired
+    private IFsUserIntegralLogsService userIntegralLogsService;
+    @Autowired
+    private IFsUserPlayerService userPlayerService;
+    @Autowired
+    private ISysConfigService configService;
+
+    @PostMapping("/updateCurrency")
+    @ApiOperation("玩家货币更新")
+    public R updateCurrency(@RequestBody FsUserAddIntegralParam param){
+        param.setUserId(param.getUserId());
+        param.setType(3);//游戏添加积分
+        return userIntegralLogsService.addIntegral(param);
+    }
+
+    /**
+     * 获取用户信息
+     * @param userId
+     * @return     */
+    @ApiOperation("获取用户信息")
+    @GetMapping("/getUserInfo")
+    public R getUserInfo(@RequestParam Long userId,@RequestParam Integer gameId){
+        try {
+            FsUserPlayerVo user=userPlayerService.selectFsUserByUserIdAndGameId(userId,gameId);
+            Map<String,Object> map=new HashMap<>();
+            map.put("user",user);
+            return R.ok(map);
+        } catch (Exception e){
+            return R.error("操作异常");
+        }
+    }
+
+    /**
+     * 获取游戏配置
+     * @param gameId
+     * @return
+     * */
+    @ApiOperation("获取游戏配置")
+    @GetMapping("/config")
+    public R config(@RequestParam Integer gameId){
+        String json = configService.selectConfigByKey("app.config");
+        AppConfig config = JSONUtil.toBean(json, AppConfig.class);
+        if (config == null) {
+            return R.error("游戏配置错误");
+        }else {
+            return R.ok().put("data",config);
+        }
+    }
+
+    /**
+     * 更新用户等级
+     * @param param
+     * @return
+    */
+    @ApiOperation("更新用户等级")
+    @PostMapping("/updateUserPlayer")
+    public R updateUserPlayer(@RequestBody FsUserPlayer param){
+        if (param.getUserId() == null) {
+            return R.error();
+        }
+        FsUserPlayer fsUserPlayer = new FsUserPlayer();
+        fsUserPlayer.setUserId(param.getUserId());
+        fsUserPlayer.setGameId(param.getGameId());
+        fsUserPlayer.setStar(param.getStar());
+        fsUserPlayer.setLevel(param.getLevel());
+        userPlayerService.updateFsUserPlayerByUserIdAndGameId(fsUserPlayer);
+        return R.ok();
+    }
+
+}

+ 28 - 0
fs-user-app/src/main/java/com/fs/app/param/Pagination.java

@@ -0,0 +1,28 @@
+package com.fs.app.param;
+
+public class Pagination {
+    private int pageNumber;
+    private int showNumber;
+
+    public Pagination(int pageNumber, int showNumber) {
+        this.pageNumber = pageNumber;
+        this.showNumber = showNumber;
+    }
+
+    // Getters and Setters
+    public int getPageNumber() {
+        return pageNumber;
+    }
+
+    public void setPageNumber(int pageNumber) {
+        this.pageNumber = pageNumber;
+    }
+
+    public int getShowNumber() {
+        return showNumber;
+    }
+
+    public void setShowNumber(int showNumber) {
+        this.showNumber = showNumber;
+    }
+}

+ 25 - 0
fs-user-app/src/main/java/com/fs/app/param/UserRequestParam.java

@@ -0,0 +1,25 @@
+package com.fs.app.param;
+
+import lombok.Data;
+
+@Data
+public class UserRequestParam {
+
+    /**
+     * 会员id
+     */
+    private String userID;
+
+    /**
+     * 好友申请类型
+     */
+    private Integer applyType;
+
+    /**
+     * 请求参数
+     */
+    private Pagination pagination;
+
+}
+
+