Pārlūkot izejas kodu

app登录,bug修复

wangxy 1 nedēļu atpakaļ
vecāks
revīzija
a0f897780d
21 mainītis faili ar 405 papildinājumiem un 104 dzēšanām
  1. 8 3
      fs-admin/src/main/java/com/fs/his/task/Task.java
  2. 3 0
      fs-company/src/main/java/com/fs/user/FsUserAdminController.java
  3. 1 1
      fs-service/src/main/java/com/fs/course/param/FsCourseQuestionAnswerUParam.java
  4. 1 1
      fs-service/src/main/java/com/fs/course/param/FsCourseSendRewardUParam.java
  5. 11 2
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseQuestionBankServiceImpl.java
  6. 10 4
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java
  7. 19 17
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  8. 2 0
      fs-service/src/main/java/com/fs/his/domain/FsUser.java
  9. 4 0
      fs-service/src/main/java/com/fs/his/mapper/FsIntegralOrderMapper.java
  10. 5 0
      fs-service/src/main/java/com/fs/his/service/IFsIntegralOrderService.java
  11. 2 0
      fs-service/src/main/java/com/fs/his/service/IFsUserService.java
  12. 5 0
      fs-service/src/main/java/com/fs/his/service/impl/FsIntegralOrderServiceImpl.java
  13. 42 1
      fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java
  14. 38 11
      fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java
  15. 10 0
      fs-service/src/main/java/com/fs/store/param/h5/FsUserPageListExportParam.java
  16. 7 2
      fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml
  17. 51 31
      fs-service/src/main/resources/mapper/his/FsUserMapper.xml
  18. 167 31
      fs-user-app/src/main/java/com/fs/app/controller/AppLoginController.java
  19. 13 0
      fs-user-app/src/main/java/com/fs/app/controller/CompanyUserController.java
  20. 2 0
      fs-user-app/src/main/java/com/fs/app/param/FsBindCompanyUserParam.java
  21. 4 0
      fs-user-app/src/main/java/com/fs/app/param/FsUserEditPhoneParam.java

+ 8 - 3
fs-admin/src/main/java/com/fs/his/task/Task.java

@@ -1740,7 +1740,12 @@ public class Task {
             param.setOrderId(order.getOrderId());
             packageOrderService.cancel(param);
         });
-
+        //积分订单
+        List<FsIntegralOrder> integralOrderList = fsIntegralOrderService.selectOutTimeOrderList();
+        //取消订单
+        List<CompletableFuture<Void>> integralOrderFutures = cancelOrdersAsync(integralOrderList, order -> {
+            fsIntegralOrderService.cannelOrder(order.getOrderId());
+        });
         // 等待所有任务完成
         waitForAllTasksToComplete(orderFutures);
         waitForAllTasksToComplete(packageOrderFutures);
@@ -1781,9 +1786,9 @@ public class Task {
     }
 
     //普通订单批量推送聚水潭
-    public void CreateJSTAndHis() throws Exception {
+    public void createJSTAndHis() throws Exception {
         List<Long> omsList = fsStoreOrderMapper.selectFsJSTStoreOrderNoCreateOms();
-        fsStoreOrderService.createJSTOmsOrder(omsList);
+        fsStoreOrderService.createJSTOmsOrderBatch(omsList);
     }
 
 

+ 3 - 0
fs-company/src/main/java/com/fs/user/FsUserAdminController.java

@@ -107,6 +107,9 @@ public class FsUserAdminController extends BaseController {
     public AjaxResult projectUserExport(@RequestBody FsUserPageListExportParam param) {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         param.setCompanyId(loginUser.getCompany().getCompanyId());
+        param.setSaleUserId(String.valueOf(loginUser.getUser().getUserId()));
+        param.setIsAdmin(loginUser.getUser().isAdmin());
+        param.setDeptId(loginUser.getUser().getDeptId());
         if(param.getPhone()!=null && !"".equals(param.getPhone())){
             param.setPhone(PhoneUtil.encryptPhone(param.getPhone()));
         }

+ 1 - 1
fs-service/src/main/java/com/fs/course/param/FsCourseQuestionAnswerUParam.java

@@ -23,7 +23,7 @@ public class FsCourseQuestionAnswerUParam implements Serializable
     private Long videoId;//小节Id
     private String qwUserId;
     private Long companyUserId;
-    private Long companyId;
+//    private Long companyId;
     private Long courseId;
     private String corpId;
     private Integer linkType;

+ 1 - 1
fs-service/src/main/java/com/fs/course/param/FsCourseSendRewardUParam.java

@@ -23,7 +23,7 @@ public class FsCourseSendRewardUParam implements Serializable
     @NotNull(message = "客服参数不能为空")
     private Long companyUserId;
     @NotNull(message = "经销商参数不能为空")
-    private Long companyId;
+//    private Long companyId;
     @NotNull(message = "课程参数不能为空")
     private Long courseId;
     private String corpId;

+ 11 - 2
fs-service/src/main/java/com/fs/course/service/impl/FsCourseQuestionBankServiceImpl.java

@@ -8,6 +8,8 @@ import com.fs.common.core.domain.R;
 import com.fs.common.exception.ServiceException;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.mapper.CompanyUserMapper;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.*;
 import com.fs.course.dto.FsCourseQuestionBankImportDTO;
@@ -58,6 +60,9 @@ public class FsCourseQuestionBankServiceImpl implements IFsCourseQuestionBankSer
     @Autowired
     private FsUserCourseCategoryMapper courseCategoryMapper;
 
+    @Autowired
+    private CompanyUserMapper companyUserMapper;
+
     /**
      * 查询题库
      *
@@ -222,7 +227,7 @@ public class FsCourseQuestionBankServiceImpl implements IFsCourseQuestionBankSer
         logs.setUserId(param.getUserId());
         logs.setVideoId(param.getVideoId());
         logs.setCourseId(param.getCourseId());
-        logs.setCompanyId(param.getCompanyId());
+        logs.setCompanyId(log.getCompanyId());
         logs.setCompanyUserId(param.getCompanyUserId());
         logs.setQwUserId(param.getQwUserId() != null ? param.getQwUserId() : null );
         logs.setQuestionJson(JSONObject.toJSONString(questions));
@@ -360,6 +365,10 @@ public class FsCourseQuestionBankServiceImpl implements IFsCourseQuestionBankSer
         //日志id
         Long logId = null;
 
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getUserId());
+        if(companyUser==null){
+            return R.error("不存在员工");
+        }
         FsCourseAnswerLogs rightLog = new FsCourseAnswerLogs();
         //判断短链类型
         if (param.getLinkType()!=null&&param.getLinkType()==1){
@@ -442,7 +451,7 @@ public class FsCourseQuestionBankServiceImpl implements IFsCourseQuestionBankSer
         logs.setUserId(param.getUserId());
         logs.setVideoId(param.getVideoId());
         logs.setCourseId(param.getCourseId());
-        logs.setCompanyId(param.getCompanyId());
+        logs.setCompanyId(companyUser.getCompanyId());
         logs.setCompanyUserId(param.getCompanyUserId());
         logs.setQwUserId(param.getQwUserId() != null ? param.getQwUserId() : null );
         logs.setQuestionJson(JSONObject.toJSONString(param.getQuestions()));

+ 10 - 4
fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java

@@ -1598,7 +1598,9 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
 //        List<Long> allDeptIds = fsCourseWatchLogMapper.selectAllDeptIds(param);
         List<Long> allDeptIds = deptBaseData.stream().map(WatchLogReportVO::getDeptId).collect(Collectors.toList());
         param.setDeptIds(allDeptIds);
-
+        //符合条件的营期Id
+        List<Long> periods = deptBaseData.stream().map(WatchLogReportVO::getPeriodId).collect(Collectors.toList());
+        param.setPeriodIds(periods);
         if (CollectionUtils.isEmpty(allDeptIds)) {
             return Collections.emptyList();
         }
@@ -1611,12 +1613,16 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
         List<WatchLogReportVO> allStats = fsCourseWatchLogMapper.selectWatchStatsByDeptBatch(param);
 
         // 7. 将统计数据转换为Map便于后续查找
-        Map<Long, WatchLogReportVO> statsMap = allStats.stream()
-                .collect(Collectors.toMap(WatchLogReportVO::getDeptId, Function.identity()));
+        Map<String, WatchLogReportVO> statsMap = allStats.stream()
+                .collect(Collectors.toMap(
+                        item -> item.getDeptId() + "_" + item.getPeriodId(),
+                        Function.identity()
+                ));
 
         // 7. 将统计数据合并到基础数据中
         for (WatchLogReportVO item : deptBaseData) {
-            WatchLogReportVO stats = statsMap.get(item.getDeptId());
+            String key = item.getDeptId() + "_" + item.getPeriodId();
+            WatchLogReportVO stats = statsMap.getOrDefault(key, new WatchLogReportVO());
             if (stats != null) {
                 item.setTotalLogCount(stats.getTotalLogCount());
                 item.setFinishedCount(stats.getFinishedCount());

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

@@ -1474,7 +1474,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService {
         // 确定红包金额
         BigDecimal amount = BigDecimal.ZERO;
         //获取公司课程的红包金额
-        CompanyCourseRedpacket redPackage = fsUserCourseVideoMapper.getOpenRedpacket(param.getCompanyId(), param.getVideoId());
+        CompanyCourseRedpacket redPackage = fsUserCourseVideoMapper.getOpenRedpacket(companyUser.getCompanyId(), param.getVideoId());
 
         if (redPackage != null && redPackage.getRedPacketMoney() != null) {
             amount = redPackage.getRedPacketMoney();
@@ -1505,7 +1505,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService {
         packetParam.setAmount(amount);
         packetParam.setSource(param.getSource());
         packetParam.setRedPacketMode(config.getRedPacketMode());
-        packetParam.setCompanyId(param.getCompanyId());
+        packetParam.setCompanyId(companyUser.getCompanyId());
         packetParam.setAppId(param.getAppId());
         packetParam.setUser(user);
 
@@ -1523,7 +1523,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService {
             // 添加红包记录
             redPacketLog.setCourseId(param.getCourseId());
 
-            redPacketLog.setCompanyId(param.getCompanyId());
+            redPacketLog.setCompanyId(companyUser.getCompanyId());
             redPacketLog.setUserId(param.getUserId());
             redPacketLog.setVideoId(param.getVideoId());
             redPacketLog.setStatus(0);
@@ -1564,7 +1564,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService {
             // 添加红包记录
             redPacketLog = new FsCourseRedPacketLog();
             redPacketLog.setCourseId(param.getCourseId());
-            redPacketLog.setCompanyId(param.getCompanyId());
+            redPacketLog.setCompanyId(log.getCompanyId());
             redPacketLog.setUserId(param.getUserId());
             redPacketLog.setVideoId(param.getVideoId());
             redPacketLog.setStatus(2);
@@ -1653,7 +1653,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService {
 
         // 确定红包金额
         BigDecimal amount = BigDecimal.ZERO;
-        FsUserCourseVideoRedPackage redPackage = fsUserCourseVideoRedPackageMapper.selectRedPacketByCompanyId(param.getVideoId(), param.getCompanyId(), param.getPeriodId());
+        FsUserCourseVideoRedPackage redPackage = fsUserCourseVideoRedPackageMapper.selectRedPacketByCompanyId(param.getVideoId(), log.getCompanyId(), param.getPeriodId());
 
         if (redPackage != null && redPackage.getRedPacketMoney() != null) {
             amount = redPackage.getRedPacketMoney();
@@ -1688,7 +1688,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService {
         packetParam.setAmount(amount);
         packetParam.setSource(param.getSource());
         packetParam.setRedPacketMode(config.getRedPacketMode());
-        packetParam.setCompanyId(param.getCompanyId());
+        packetParam.setCompanyId(log.getCompanyId());
         packetParam.setAppId(param.getAppId());
         packetParam.setUser(user);
 
@@ -1712,7 +1712,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService {
                     return R.error("奖励发送失败,请联系客服");
                 }
             } else {
-                Company company = companyMapper.selectCompanyById(param.getCompanyId());
+                Company company = companyMapper.selectCompanyById(log.getCompanyId());
                 BigDecimal money = company.getMoney();
                 if (money.compareTo(BigDecimal.ZERO) <= 0) {
                     return R.error("服务商余额不足,请联系群主服务器充值!");
@@ -1726,7 +1726,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService {
                 // 添加红包记录
                 redPacketLog = new FsCourseRedPacketLog();
                 redPacketLog.setCourseId(param.getCourseId());
-                redPacketLog.setCompanyId(param.getCompanyId());
+                redPacketLog.setCompanyId(log.getCompanyId());
                 redPacketLog.setUserId(param.getUserId());
                 redPacketLog.setVideoId(param.getVideoId());
                 redPacketLog.setStatus(2);
@@ -1794,7 +1794,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService {
             // 添加红包记录
             redPacketLog.setCourseId(param.getCourseId());
 //            redPacketLog.setOutBatchNo(sendRedPacket.get("orderCode").toString());
-            redPacketLog.setCompanyId(param.getCompanyId());
+            redPacketLog.setCompanyId(companyUser.getCompanyId());
             redPacketLog.setUserId(param.getUserId());
             redPacketLog.setVideoId(param.getVideoId());
             redPacketLog.setStatus(1);
@@ -1877,7 +1877,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService {
         FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
         redPacketLog.setCourseId(param.getCourseId());
         redPacketLog.setOutBatchNo(integralLogs.getId().toString());
-        redPacketLog.setCompanyId(param.getCompanyId());
+        redPacketLog.setCompanyId(log.getCompanyId());
         redPacketLog.setUserId(param.getUserId());
         redPacketLog.setVideoId(param.getVideoId());
         redPacketLog.setStatus(1);
@@ -2034,6 +2034,11 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService {
             return ResponseResult.fail(504, "已被禁用,请联系管理员#" + fsUser.getUserId());
         }
 
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getCompanyUserId());
+        //判断该销售是否存在
+        if (companyUser == null) {
+            return ResponseResult.fail(405, "当前销售不存在");
+        }
         //公开课
         if (param.getIsOpenCourse() != null && param.getIsOpenCourse() == 1) {
             FsCourseWatchLog watchCourseVideo = courseWatchLogMapper.getCourseWatchLogByUser(param.getUserId(), param.getVideoId(), null);
@@ -2048,6 +2053,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService {
             } else {
                 FsCourseWatchLog fsCourseWatchLog = new FsCourseWatchLog();
                 BeanUtils.copyProperties(param, fsCourseWatchLog);
+                fsCourseWatchLog.setCompanyId(companyUser.getCompanyId());
                 fsCourseWatchLog.setSendType(1);
                 fsCourseWatchLog.setDuration(0L);
                 fsCourseWatchLog.setCreateTime(new Date());
@@ -2067,12 +2073,6 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService {
         if (!isUserCoursePeriodValid(param)) {
             return ResponseResult.fail(504, "请观看最新的课程项目");
         }
-
-        //判断该销售是否存在
-        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getCompanyUserId());
-        if (companyUser == null) {
-            return ResponseResult.fail(405, "当前销售不存在");
-        }
         if(param.getTypeFlag()==2){
             //小程序看课需要判断是否注册
             //营期公司的开关状态
@@ -2154,6 +2154,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService {
 
             FsCourseWatchLog updateLog = new FsCourseWatchLog();
             updateLog.setLogId(watchCourseVideo.getLogId());
+            updateLog.setCompanyId(companyUser.getCompanyId());
             updateLog.setPeriodId(param.getPeriodId());
             updateLog.setProject(courseProject);
             updateLog.setUpdateTime(new Date());
@@ -2164,6 +2165,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService {
         } else {
             FsCourseWatchLog fsCourseWatchLog = new FsCourseWatchLog();
             BeanUtils.copyProperties(param, fsCourseWatchLog);
+            fsCourseWatchLog.setCompanyId(companyUser.getCompanyId());
             fsCourseWatchLog.setSendType(1);
             fsCourseWatchLog.setDuration(0L);
             fsCourseWatchLog.setCreateTime(new Date());
@@ -3310,7 +3312,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService {
             FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
             redPacketLog.setCourseId(param.getCourseId());
             redPacketLog.setOutBatchNo(integralLogs.getId().toString());
-            redPacketLog.setCompanyId(param.getCompanyId());
+            redPacketLog.setCompanyId(log.getCompanyId());
             redPacketLog.setUserId(param.getUserId());
             redPacketLog.setVideoId(param.getVideoId());
             redPacketLog.setStatus(1);

+ 2 - 0
fs-service/src/main/java/com/fs/his/domain/FsUser.java

@@ -182,6 +182,8 @@ public class FsUser extends BaseEntity
      */
     private String appId;
 
+    private String appOpenId;
+
 
     /** 推广上级用户ID */
     private Long spreadUserId;

+ 4 - 0
fs-service/src/main/java/com/fs/his/mapper/FsIntegralOrderMapper.java

@@ -127,5 +127,9 @@ public interface FsIntegralOrderMapper extends BaseMapper<FsIntegralOrder>
     @Select("select order_code,extend_order_id from fs_integral_order where extend_order_id is not null and `status`=1 and create_time > '2026-01-10 00:00:00'")
     List<FsIntegralOrder> selectJstOmsIntegralOrderdeliveryOp();
 
+    //查询超时30分钟的订单
+    @Select("select * from fs_integral_order where status = 1 and is_pay=0 and create_time < DATE_SUB(CURDATE(), INTERVAL 30 MINUTE)")
+    List<FsIntegralOrder> selectOutTimeOrderList();
+
 
 }

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

@@ -114,4 +114,9 @@ public interface IFsIntegralOrderService
     void createOmsIntegralOrder(List<Long> orderIds) throws ParseException, InterruptedException;
 
     void deliveryIntegralOrderOrder(String orderCode, String deliveryId, String deliverCode, String deliverName);
+
+    /**
+     * 超时30分钟订单
+     */
+    List<FsIntegralOrder> selectOutTimeOrderList();
 }

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

@@ -269,4 +269,6 @@ public interface IFsUserService
     Boolean  bindUserToSales(Long userId, String inviteCode);
 
     R updatePasswordByPhone(String password, String encryptPhone);
+
+    int realDeleteFsUserByUserId(Long userId);
 }

+ 5 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsIntegralOrderServiceImpl.java

@@ -1080,6 +1080,11 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
         }
     }
 
+    @Override
+    public List<FsIntegralOrder> selectOutTimeOrderList() {
+        return fsIntegralOrderMapper.selectOutTimeOrderList();
+    }
+
     /**
      * 处理手机号脱敏
      */

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

@@ -269,6 +269,8 @@ public class FsUserServiceImpl implements IFsUserService {
         fsUser.setUpdateTime(DateUtils.getNowDate());
         if (fsUser.getPhone() != null && fsUser.getPhone().length() == 11 && fsUser.getPhone().matches("\\d+")) {
             fsUser.setPhone(encryptPhone(fsUser.getPhone()));
+        }else if(fsUser.getPhone() != null && fsUser.getPhone().length() > 11){
+            fsUser.setPhone(fsUser.getPhone());
         } else {
             fsUser.setPhone(null);
         }
@@ -1747,6 +1749,29 @@ public class FsUserServiceImpl implements IFsUserService {
      */
     @Override
     public Long selectProjectUserExportCount(FsUserPageListExportParam param) {
+        String companyUserId = param.getSaleUserId();
+        if (StringUtils.isNotBlank(companyUserId)) {
+            Long companyUser = Long.parseLong(companyUserId);
+            Set<Long> userIds = companyUserCacheService.selectUserAllCompanyUserId(companyUser);
+            if (userIds != null || userIds.size() <= 1) {
+                List<Integer> roles = fsUserCompanyUserMapper.selectCountByUserId(companyUser);
+                if (param.getDeptId() != null) {
+                    if (roles.contains(1)) {
+                        //部门经理需要查询对应部门下的销售
+                        userIds = new HashSet<>(fsUserCompanyUserMapper.selectUserIdByDeptId(param.getDeptId()));
+                    }
+                }
+                if (param.getIsAdmin() != null && param.getIsAdmin()) {
+                    List<CompanyUser> companyUsers = companyUserMapper.selectCompanyUserByCompanyId(param.getCompanyId());
+                    userIds = companyUsers.stream().map(CompanyUser::getUserId).collect(Collectors.toSet());
+                }
+            }
+            param.setCompanyUserIds(userIds);
+        }
+        // 如果有单个销售ID,就不传ID列表
+        if (param.getCompanyUserId() != null && !param.getCompanyUserId().isEmpty()) {
+            param.setCompanyUserIds(null); // 清空列表参数
+        }
         return fsUserMapper.selectProjectUserExportCount(param);
     }
 
@@ -1756,11 +1781,18 @@ public class FsUserServiceImpl implements IFsUserService {
     @Override
     public void exportProjectUserData(FsUserPageListExportParam param) {
         // 找出下级销售
-        String companyUserId = param.getCompanyUserId();
+        String companyUserId = param.getSaleUserId();
         if (StringUtils.isNotBlank(companyUserId)) {
             Long companyUser = Long.parseLong(companyUserId);
             Set<Long> userIds = companyUserCacheService.selectUserAllCompanyUserId(companyUser);
             if (userIds != null || userIds.size() <= 1) {
+                List<Integer> roles = fsUserCompanyUserMapper.selectCountByUserId(companyUser);
+                if (param.getDeptId() != null) {
+                    if (roles.contains(1)) {
+                        //部门经理需要查询对应部门下的销售
+                        userIds = new HashSet<>(fsUserCompanyUserMapper.selectUserIdByDeptId(param.getDeptId()));
+                    }
+                }
                 if (param.getIsAdmin() != null && param.getIsAdmin()) {
                     List<CompanyUser> companyUsers = companyUserMapper.selectCompanyUserByCompanyId(param.getCompanyId());
                     userIds = companyUsers.stream().map(CompanyUser::getUserId).collect(Collectors.toSet());
@@ -1769,6 +1801,10 @@ public class FsUserServiceImpl implements IFsUserService {
             param.setCompanyUserIds(userIds);
         }
 
+        // 如果有单个销售ID,就不传ID列表
+        if (param.getCompanyUserId() != null && !param.getCompanyUserId().isEmpty()) {
+            param.setCompanyUserIds(null); // 清空列表参数
+        }
         List<FsUserPageListExportVO> fsUserPageListVOS = fsUserMapper.FsUserPageListExportVO(param);
         Map<Long, CompanyTag> tagMap = companyTagCacheService.queryAllTagMap();
         //获取会员的最新的看课状态和最后看课时间
@@ -1901,4 +1937,9 @@ public class FsUserServiceImpl implements IFsUserService {
         return R.ok();
     }
 
+    @Override
+    public int realDeleteFsUserByUserId(Long userId) {
+        return fsUserMapper.deleteFsUserByUserId(userId);
+    }
+
 }

+ 38 - 11
fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java

@@ -1466,17 +1466,44 @@ public class OpenIMServiceImpl implements OpenIMService {
             // 发送成功的
             if(openImBatchResponseDataDTO != null){
                 List<OpenImBatchResponseDataDTO.Results> results = openImBatchResponseDataDTO.getResults();
-                Map<String, OpenImBatchResponseDataDTO.Results> resultsMap = results.stream().collect(Collectors.toMap(OpenImBatchResponseDataDTO.Results::getRecvID, v -> v));
-                List<String> actualRecvIdList = openImBatchResponseDataDTO.getResults().stream().map(OpenImBatchResponseDataDTO.Results::getRecvID).collect(Collectors.toList());
-                List<FsImMsgSendDetail> successList = imMsgSendDetailList.stream().filter(v -> actualRecvIdList.contains("U" + v.getUserId())).map(v -> {
-                    v.setActualSendTime(new Date(resultsMap.get("U" + v.getUserId()).getSendTime()))
-                            .setSendStatus(1).setParamJson(JSON.toJSONString(openImBatchMsgDTO))
-                            .setStatus(0)
-                            .setResultMessage(JSON.toJSONString(openImBatchResponseDataDTO))
-                            .setUpdateTime(new Date());
-                    return v;
-                }).collect(Collectors.toList());
-                updateList.addAll(successList);
+                // 添加空值检查
+                if (results != null && !results.isEmpty()) {
+                    // 过滤掉null元素并建立映射
+                    Map<String, OpenImBatchResponseDataDTO.Results> resultsMap = results.stream()
+                            .filter(Objects::nonNull)
+                            .filter(result -> result.getRecvID() != null)
+                            .collect(Collectors.toMap(OpenImBatchResponseDataDTO.Results::getRecvID, v -> v, (existing, replacement) -> existing));
+
+                    List<String> actualRecvIdList = results.stream()
+                            .filter(Objects::nonNull)
+                            .map(OpenImBatchResponseDataDTO.Results::getRecvID)
+                            .filter(Objects::nonNull)
+                            .collect(Collectors.toList());
+
+                    List<FsImMsgSendDetail> successList = imMsgSendDetailList.stream()
+                            .filter(v -> actualRecvIdList.contains("U" + v.getUserId()))
+                            .map(v -> {
+                                OpenImBatchResponseDataDTO.Results result = resultsMap.get("U" + v.getUserId());
+                                if (result != null && result.getSendTime() != null) {
+                                    v.setActualSendTime(new Date(result.getSendTime()))
+                                            .setSendStatus(1)
+                                            .setParamJson(JSON.toJSONString(openImBatchMsgDTO))
+                                            .setStatus(0)
+                                            .setResultMessage(JSON.toJSONString(openImBatchResponseDataDTO))
+                                            .setUpdateTime(new Date());
+                                } else {
+                                    // 如果找不到对应的结果,设置为失败状态
+                                    v.setSendStatus(1)
+                                            .setParamJson(JSON.toJSONString(openImBatchMsgDTO))
+                                            .setStatus(1)
+                                            .setResultMessage("未找到发送结果")
+                                            .setUpdateTime(new Date());
+                                }
+                                return v;
+                            })
+                            .collect(Collectors.toList());
+                    updateList.addAll(successList);
+                }
             }
             fsImMsgSendDetailServiceImpl.updateBatchById(updateList);
         }

+ 10 - 0
fs-service/src/main/java/com/fs/store/param/h5/FsUserPageListExportParam.java

@@ -85,5 +85,15 @@ public class FsUserPageListExportParam implements Serializable {
 
     private Long taskId;
 
+    /**
+     * 部门id
+     */
+    private Long deptId;
+
+    /**
+     * 当前销售id
+     */
+    private  String  saleUserId;
+
 }
 

+ 7 - 2
fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml

@@ -1771,6 +1771,7 @@ FROM
     <select id="selectCompanyBaseDataOptimized" resultType="com.fs.his.vo.WatchLogReportVO">
         SELECT
         d.dept_id AS deptId,
+        log.period_id periodId,
         d.dept_name AS salesDept,
         c.company_name AS salesCompany,
         COUNT(DISTINCT cu.user_id) AS salesCount,
@@ -1816,7 +1817,7 @@ FROM
         <if test="nickName != null and nickName != ''">
             AND u.nick_name LIKE CONCAT('%', #{nickName}, '%')
         </if>
-        GROUP BY d.dept_id, d.dept_name, c.company_name
+        GROUP BY d.dept_id, d.dept_name,log.period_id, c.company_name
     </select>
     <select id="selectAllDeptIds" resultType="java.lang.Long">
         SELECT DISTINCT d.dept_id
@@ -1884,6 +1885,10 @@ FROM
         <foreach collection="deptIds" item="deptId" open="(" separator="," close=")">
             #{deptId}
         </foreach>
+        and  log.period_id in
+        <foreach collection="periodIds" item="periodId" open="(" separator="," close=")">
+            #{periodId}
+        </foreach>
         <if test="sTime != null and eTime != null">
             AND DATE(log.create_time) BETWEEN #{sTime} AND #{eTime}
         </if>
@@ -1906,7 +1911,7 @@ FROM
         <if test="userId != null and userId != ''">
             AND log.user_id = #{userId}
         </if>
-        GROUP BY d.dept_id
+        GROUP BY d.dept_id,log.period_id
     </select>
     <select id="selectCompanyBaseDataWithIds" resultType="com.fs.his.vo.WatchLogReportVO">
         SELECT

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

@@ -370,7 +370,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         fs_user.nick_name as nickname,
         fs_user.avatar,
         fs_user.phone,
-        fs_user.create_time,
+        ucu.update_time createTime,
         fs_user.remark,
         ucu.id,
         ucu.status,
@@ -406,10 +406,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 <!--                AND ucu.company_user_id = #{companyUserId}-->
 <!--            </if>-->
             <if test="registerStartTime != null and registerStartTime !='' ">
-                AND fs_user.create_time &gt;= CONCAT(#{registerStartTime}, ' 00:00:00')
+                AND ucu.update_time >= #{registerStartTime}
             </if>
             <if test="registerEndTime != null and registerEndTime !='' ">
-                AND fs_user.create_time &lt;= CONCAT(#{registerEndTime}, ' 23:59:59')
+                <![CDATA[
+                AND ucu.update_time < date_add(#{registerEndTime}, interval 1 day)
+            ]]>
             </if>
 <!--            <if test="companyUserIds != null and companyUserIds.size > 0">-->
 <!--                AND ucu.company_user_id in-->
@@ -444,23 +446,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="companyId != null">
                 AND ucu.company_id = #{companyId}
             </if>
-            <if test="companyUserId != null and companyUserId != '' ">
-                AND ucu.company_user_id = #{companyUserId}
-            </if>
+            <choose>
+                <when test="companyUserIds != null and companyUserIds.size > 0">
+                    AND ucu.company_user_id in
+                    <foreach collection="companyUserIds" item="item" index="index" open="(" separator="," close=")">
+                        ${item}
+                    </foreach>
+                </when>
+                <when test="companyUserId != null and companyUserId != '' ">
+                    AND ucu.company_user_id = #{companyUserId}
+                </when>
+            </choose>
             <if test="registerStartTime != null and registerStartTime !='' ">
                 AND ucu.update_time >= #{registerStartTime}
             </if>
             <if test="registerEndTime != null and registerEndTime !='' ">
-            <![CDATA[
+                <![CDATA[
                 AND ucu.update_time < date_add(#{registerEndTime}, interval 1 day)
             ]]>
             </if>
-            <if test="companyUserIds != null and companyUserIds.size > 0">
-                AND ucu.company_user_id in
-                <foreach collection="companyUserIds" item="item" index="index" open="(" separator="," close=")">
-                    ${item}
-                </foreach>
-            </if>
             <if test="nickname != null and nickname != ''">
                 AND fs_user.nick_name like concat('%', #{nickname},'%')
             </if>
@@ -2442,9 +2446,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="companyId != null">
                 AND ucu.company_id = #{companyId}
             </if>
-            <if test="companyUserId != null and companyUserId != '' ">
-                AND ucu.company_user_id = #{companyUserId}
-            </if>
+            <choose>
+                <when test="companyUserIds != null and companyUserIds.size > 0">
+                    AND ucu.company_user_id in
+                    <foreach collection="companyUserIds" item="item" index="index" open="(" separator="," close=")">
+                        ${item}
+                    </foreach>
+                </when>
+                <when test="companyUserId != null and companyUserId != '' ">
+                    AND ucu.company_user_id = #{companyUserId}
+                </when>
+            </choose>
             <if test="registerStartTime != null and registerStartTime !='' ">
                 AND ucu.update_time >= #{registerStartTime}
             </if>
@@ -2453,12 +2465,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 AND ucu.update_time < date_add(#{registerEndTime}, interval 1 day)
             ]]>
             </if>
-            <if test="companyUserIds != null and companyUserIds.size > 0">
-                AND ucu.company_user_id in
-                <foreach collection="companyUserIds" item="item" index="index" open="(" separator="," close=")">
-                    ${item}
-                </foreach>
-            </if>
+<!--            <if test="companyUserIds != null and companyUserIds.size > 0">-->
+<!--                AND ucu.company_user_id in-->
+<!--                <foreach collection="companyUserIds" item="item" index="index" open="(" separator="," close=")">-->
+<!--                    ${item}-->
+<!--                </foreach>-->
+<!--            </if>-->
             <if test="nickname != null and nickname != ''">
                 AND fs_user.nick_name like concat('%', #{nickname},'%')
             </if>
@@ -2495,9 +2507,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="companyId != null">
                 AND ucu.company_id = #{companyId}
             </if>
-            <if test="companyUserId != null and companyUserId != '' ">
-                AND ucu.company_user_id = #{companyUserId}
-            </if>
+            <choose>
+                <when test="companyUserIds != null and companyUserIds.size > 0">
+                    AND ucu.company_user_id in
+                    <foreach collection="companyUserIds" item="item" index="index" open="(" separator="," close=")">
+                        ${item}
+                    </foreach>
+                </when>
+                <when test="companyUserId != null and companyUserId != '' ">
+                    AND ucu.company_user_id = #{companyUserId}
+                </when>
+            </choose>
             <if test="registerStartTime != null and registerStartTime !='' ">
                 AND ucu.update_time &gt;= #{registerStartTime}
             </if>
@@ -2506,12 +2526,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 AND ucu.update_time < date_add(#{registerEndTime}, interval 1 day)
             ]]>
             </if>
-            <if test="companyUserIds != null and companyUserIds.size > 0">
-                AND ucu.company_user_id in
-                <foreach collection="companyUserIds" item="item" index="index" open="(" separator="," close=")">
-                    ${item}
-                </foreach>
-            </if>
+<!--            <if test="companyUserIds != null and companyUserIds.size > 0">-->
+<!--                AND ucu.company_user_id in-->
+<!--                <foreach collection="companyUserIds" item="item" index="index" open="(" separator="," close=")">-->
+<!--                    ${item}-->
+<!--                </foreach>-->
+<!--            </if>-->
             <if test="nickname != null and nickname != ''">
                 AND fs_user.nick_name like concat('%', #{nickname},'%')
             </if>

+ 167 - 31
fs-user-app/src/main/java/com/fs/app/controller/AppLoginController.java

@@ -12,6 +12,8 @@ import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.exception.ServiceException;
 import com.fs.common.service.ISmsService;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.ip.IpUtils;
 import com.fs.common.utils.sign.Md5Utils;
 import com.fs.core.config.WxOpenProperties;
 import com.fs.his.config.FsSysConfig;
@@ -185,10 +187,13 @@ public class AppLoginController extends AppBaseController{
                 }
                 user.setUnionId(unionid);
                 user.setCreateTime(new Date());
+                user.setAppId(openProperties.getAppId());
                 user.setStatus(1);
                 if (StringUtils.isNotEmpty(param.getJpushId())) {
                     user.setJpushId(param.getJpushId());
                 }
+                String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                user.setLastIp(ipAddr);
                 userService.insertFsUser(user);
                 map.put("isNew", true);
                 map.put("unionid",unionid);
@@ -219,16 +224,61 @@ public class AppLoginController extends AppBaseController{
 
     @ApiOperation("绑定手机号")
     @PostMapping("/setPhone")
+    @Transactional(rollbackFor = Exception.class)
     public R setPhone(@Validated @RequestBody FsUserEditPhoneParam param) {
         logger.info("fcj 绑定手机号入参:{}", param);
         FsUser user = userService.selectFsUserByUnionid(param.getUnionId());
         if (user==null){
             return R.error("用户数据不存在");
         }
+        //验证码绑定,需要校验验证码
+        if (param.getBindType()!=null){
+            String redisCode = redisCache.getCacheObject("sms:code:" + param.getPhone());
+            if (StringUtils.isEmpty(redisCode)){
+                return R.error("验证码已过期,请重新发送");
+            }
+            if (!redisCode.equals(param.getCode())) {
+                return R.error("验证码错误");
+            }
+            redisCache.deleteObject("sms:code:" + param.getPhone());
+        }
         FsUser userMap = findUserByPhone(param.getPhone());
-//        if (userMap!=null){
-//            return R.error("该手机号已绑定其他账号");
-//        }
+        //绑定的手机号已存在用户的情况,将微信登录的时候创建的新号的UnionId移动到老号中,删除新号(将两个号合并)
+        if (userMap!=null){
+            if (userMap.getUserId().equals(user.getUserId())) {
+                user.setPhone(param.getPhone());
+                user.setLoginDevice(param.getLoginDevice());
+                user.setSource(param.getSource());
+                String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                user.setLastIp(ipAddr);
+                userService.updateFsUser(user);
+                return generateTokenAndReturn(user);
+            }
+            if (StringUtils.isNotEmpty(userMap.getUnionId())&&!userMap.getUnionId().equals(user.getUnionId())){
+                return R.error("该手机号已绑定其他微信");
+            }
+            //如果存在手机号也有用户,微信也有用户,保留创建时间比较久的用户
+            FsUser keepUser;
+            FsUser deleteUser;
+            if (userMap.getCreateTime().before(user.getCreateTime())){
+                keepUser = userMap;
+                deleteUser = user;
+            }else {
+                keepUser = user;
+                deleteUser = userMap;
+            }
+            keepUser.setLoginDevice(param.getLoginDevice() != null ? param.getLoginDevice() : null);
+            keepUser.setSource(param.getSource());
+            keepUser.setUnionId(user.getUnionId());
+            keepUser.setPhone(param.getPhone());
+            String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+            keepUser.setLastIp(ipAddr);
+            if (userService.updateFsUser(keepUser)>0){
+                userService.realDeleteFsUserByUserId(deleteUser.getUserId());
+                return generateTokenAndReturn(keepUser);
+            }
+            return R.error("绑定手机号失败");
+        }
         user.setPhone(param.getPhone());
         user.setLoginDevice(param.getLoginDevice() != null ? param.getLoginDevice() : null );
         user.setSource(param.getSource()!= null ? param.getSource() : null);
@@ -237,6 +287,8 @@ public class AppLoginController extends AppBaseController{
         userMap.setSource(param.getSource());
         userMap.setUserId(user.getUserId());
         userMap.setPhone(param.getPhone());
+        String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+        userMap.setLastIp(ipAddr);
         if (userService.updateFsUser(userMap)>0){
             return generateTokenAndReturn(user);
         }
@@ -245,10 +297,14 @@ public class AppLoginController extends AppBaseController{
 
     @ApiOperation("绑定微信")
     @PostMapping("/bindWeChat")
+    @Transactional(rollbackFor = Exception.class)
     public R bindWeChat(@Validated @RequestBody FsUserEditUnionidParam param) {
         try {
             logger.info("zyp app绑定微信,param:{}", param);
             Map result = WxUtil.getAccessToken(param.getCode(), openProperties.getAppId(), openProperties.getSecret());
+            if (!result.containsKey("access_token")) {
+                return R.error("微信授权失败");
+            }
             String accessToken = result.get("access_token").toString();
             String unionid = result.get("unionid").toString();
             String openid = result.get("openid").toString();
@@ -259,21 +315,63 @@ public class AppLoginController extends AppBaseController{
             FsUser user = findUserByPhone(param.getPhone());
             if (user!=null && StringUtils.isEmpty(user.getUnionId())){
                 FsUser userByUnionId = userMapper.selectFsUserByUnionid(unionid);
-//                if (userByUnionId!=null){
-//                    return R.error("该微信已绑定其他用户,请勿重复绑定!");
-//                }
-                user.setSource(param.getSource() != null ? param.getSource() : null );
-                user.setLoginDevice(param.getLoginDevice() != null ? param.getLoginDevice() : null);
-                user.setNickName(nickname);
-                user.setAvatar(avatar);
-                user.setSex(sex);
-                user.setUnionId(unionid);
-                if (userService.updateFsUser(user)>0){
-                    return generateTokenAndReturn(user);
+                //绑定的微信已存在用户的情况,将手机号一键登录的时候创建的新号的手机号移动到老号中,删除新号(将两个号合并)
+                if (userByUnionId!=null){
+                    if (StringUtils.isNotEmpty(userByUnionId.getPhone())&&!user.getPhone().equals(userByUnionId.getPhone())){
+                        return R.error("该微信已绑定其他手机号");
+                    }
+                    if (userByUnionId.getUserId().equals(user.getUserId())) {
+                        user.setPhone(param.getPhone());
+                        user.setLoginDevice(param.getLoginDevice());
+                        user.setSource(param.getSource());
+                        user.setUnionId(unionid);
+                        String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                        user.setLastIp(ipAddr);
+                        userService.updateFsUser(user);
+                        return generateTokenAndReturn(user);
+                    }
+                    FsUser keepUser;
+                    FsUser deleteUser;
+                    if (user.getCreateTime().before(userByUnionId.getCreateTime())){
+                        keepUser = user;
+                        deleteUser = userByUnionId;
+                    } else {
+                        keepUser = userByUnionId;
+                        deleteUser = user;
+                    }
+                    keepUser.setUnionId(unionid);
+                    keepUser.setPhone(param.getPhone());
+                    keepUser.setSource(param.getSource() != null ? param.getSource() : null );
+                    keepUser.setLoginDevice(param.getLoginDevice() != null ? param.getLoginDevice() : null);
+                    keepUser.setNickName(nickname);
+                    keepUser.setAvatar(avatar);
+                    keepUser.setSex(sex);
+                    String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                    keepUser.setLastIp(ipAddr);
+                    if (userService.updateFsUser(keepUser)>0){
+                        userService.realDeleteFsUserByUserId(deleteUser.getUserId());
+                        return generateTokenAndReturn(keepUser);
+                    }
+                    else {
+                        return R.error("绑定微信失败");
+                    }
+                }else {
+                    user.setSource(param.getSource() != null ? param.getSource() : null );
+                    user.setLoginDevice(param.getLoginDevice() != null ? param.getLoginDevice() : null);
+                    user.setNickName(nickname);
+                    user.setAvatar(avatar);
+                    user.setSex(sex);
+                    user.setUnionId(unionid);
+                    user.setAppOpenId(openid);
+                    String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                    user.setLastIp(ipAddr);
+                    if (userService.updateFsUser(user)>0){
+                        return generateTokenAndReturn(user);
+                    }
+                    else {
+                        return R.error("绑定微信失败");
+                    }
                 }
-//                else {
-//                    return R.error("绑定微信失败");
-//                }
             }
             return R.error("数据参数异常!");
         }catch (Exception e){
@@ -282,10 +380,16 @@ public class AppLoginController extends AppBaseController{
         }
     }
 
+
     private void updateExistingUserJpushId(FsUser user, String jpushId) {
         FsUser userMap = new FsUser();
         userMap.setUserId(user.getUserId());
         userMap.setJpushId(jpushId);
+        if (StringUtils.isNotEmpty(user.getAppOpenId())) {
+            userMap.setAppOpenId(user.getAppOpenId());
+        }
+        String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+        userMap.setLastIp(ipAddr);
         userService.updateFsUser(userMap);
     }
 
@@ -329,20 +433,30 @@ public class AppLoginController extends AppBaseController{
     }
 
     private R handleLoginType3(FsUserLoginParam param) {
-        if (StringUtils.isEmpty(param.getPhone())) {
-            return R.error("获取手机号失败");
-        }
         // 根据手机号查询用户
-        FsUser user = findUserByPhone(param.getPhone());
-        if (user == null) {
-            createNewUser(param);
+        FsUser user = null;
+        List<FsUser> usersByPhone = findUsersByPhone(param.getPhone());
+        if (CollectionUtil.isEmpty(usersByPhone)){
+            FsUser newUser = createNewUser(param);
+            if (StringUtils.isNotEmpty(newUser.getJpushId())) {
+//                try {
+//                    //发送注册优惠券
+//                    fsUserCouponService.sendRegisterCoupon(newUser);
+//                } catch (Exception e) {
+//                    logger.error("发送注册优惠券失败:{}",e.getMessage());
+//                }
+            }
             return R.ok().put("isNew",true).put("phone",encryptPhone(param.getPhone()));
-        } else {
+        }
+        if (usersByPhone.size()==1){
+            user = usersByPhone.get(0);
             if (user.getUnionId()==null){
                 if (user.getPhone().length()<=11){
                     FsUser fsUser = new FsUser();
                     fsUser.setUserId(user.getUserId());
                     fsUser.setPhone(encryptPhone(param.getPhone()));
+                    String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                    fsUser.setLastIp(ipAddr);
                     userMapper.updateFsUser(fsUser);
                     logger.info("zyp \n【手机加密】:{}",encryptPhone(param.getPhone()));
                 }
@@ -350,11 +464,33 @@ public class AppLoginController extends AppBaseController{
             }
             if (StringUtils.isNotEmpty(param.getJpushId())) {
                 updateExistingUserJpushId(user, param.getJpushId());
+//                try {
+//                    //发送注册优惠券
+//                    fsUserCouponService.sendRegisterCoupon(user);
+//                } catch (Exception e) {
+//                    logger.error("发送注册优惠券失败:{}",e.getMessage());
+//                }
             }
+        }else {
+            return R.ok().put("users",usersByPhone);
         }
         return generateTokenAndReturn(user);
     }
 
+    private List<FsUser> findUsersByPhone(String phone) {
+        // 先根据加密手机号查询用户
+        String jiami = (encryptPhone(phone));
+        List<FsUser> fsUsers = userMapper.selectFsUsersByPhoneLimitOne(jiami);
+        if (CollectionUtil.isEmpty(fsUsers)) {
+            fsUsers = userMapper.selectFsUsersByPhoneLimitOne(encryptPhoneOldKey(phone));
+        }
+        // 如果没有找到用户,再根据手机号查询
+        if (CollectionUtil.isEmpty(fsUsers)) {
+            fsUsers = userMapper.selectFsUsersByPhoneLimitOne(phone);
+
+        }
+        return fsUsers;
+    }
     private FsUser createNewUser(FsUserLoginParam param) {
         FsUser newUser = new FsUser();
         newUser.setLoginDevice(param.getLoginDevice() != null ? param.getLoginDevice() : null);
@@ -436,13 +572,13 @@ public class AppLoginController extends AppBaseController{
     public R sendCode(@RequestBody Map<String, String> body){
         String phone = body.get("phone");
         String encryptPhone = encryptPhone(phone);
-        List<FsUser> user = userService.selectFsUserListByPhone(encryptPhone);
-        if(CollectionUtil.isEmpty(user)){
-            user = userService.selectFsUserListByPhone(encryptPhoneOldKey(phone));
-        }
-        if (CollectionUtil.isEmpty(user)){
-            return R.error("此电话号码未绑定用户");
-        }
+//        List<FsUser> user = userService.selectFsUserListByPhone(encryptPhone);
+//        if(CollectionUtil.isEmpty(user)){
+//            user = userService.selectFsUserListByPhone(encryptPhoneOldKey(phone));
+//        }
+//        if (CollectionUtil.isEmpty(user)){
+//            return R.error("此电话号码未绑定用户");
+//        }
 
         // 验证码 key(3分钟有效)
         String smsCodeKey = "sms:code:" + phone;

+ 13 - 0
fs-user-app/src/main/java/com/fs/app/controller/CompanyUserController.java

@@ -13,6 +13,7 @@ import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.SecurityUtils;
+import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.sign.Md5Utils;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.domain.CompanyUserUser;
@@ -26,6 +27,7 @@ import com.fs.fastGpt.domain.FastgptChatVoiceHomo;
 import com.fs.fastGpt.mapper.FastgptChatVoiceHomoMapper;
 import com.fs.fastgptApi.util.AudioUtils;
 import com.fs.fastgptApi.vo.AudioVO;
+import com.fs.his.domain.FsUser;
 import com.fs.his.param.*;
 import com.fs.his.service.IFsPrescribeService;
 import com.fs.his.service.IFsUserService;
@@ -47,6 +49,7 @@ import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.util.EntityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -57,6 +60,8 @@ import java.util.List;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
+import static com.fs.his.utils.PhoneUtil.encryptPhone;
+
 
 @Api("销售接口")
 @RestController
@@ -131,10 +136,18 @@ public class CompanyUserController extends AppBaseController {
     @Login
     @ApiOperation("绑定销售")
     @PostMapping("/bindCompanyUser")
+    @Transactional
     public R bindCompanyUser(@Validated @RequestBody FsBindCompanyUserParam param, HttpServletRequest request) {
         CompanyUserUser map = new CompanyUserUser();
         map.setCompanyUserId(param.getCompanyUserId());
         map.setUserId(Long.parseLong(getUserId()));
+        FsUser user = fsUserService.selectFsUserByUserId(Long.parseLong(getUserId()));
+        //设置用户手机号
+        if(user != null && StringUtils.isNotEmpty(param.getPhone())){
+            //加密手机号
+            user.setPhone(param.getPhone());
+            fsUserService.updateFsUser(user);
+        }
         List<CompanyUserUser> list = companyUserUserService.selectCompanyUserUserList(map);
         if (list == null || list.size() == 0) {
             CompanyUser companyUser = companyUserService.selectCompanyUserById(param.getCompanyUserId());

+ 2 - 0
fs-user-app/src/main/java/com/fs/app/param/FsBindCompanyUserParam.java

@@ -12,4 +12,6 @@ public class FsBindCompanyUserParam implements Serializable {
 
     private Long companyUserId;
 
+    private  String phone;
+
 }

+ 4 - 0
fs-user-app/src/main/java/com/fs/app/param/FsUserEditPhoneParam.java

@@ -21,4 +21,8 @@ public class FsUserEditPhoneParam implements Serializable {
     private String jpushId;
 
     private String source;
+
+    private Integer bindType;
+    //验证码
+    private String code;
 }