Explorar o código

Merge remote-tracking branch 'origin/master'

zyp hai 1 día
pai
achega
1d39e69f1f
Modificáronse 29 ficheiros con 355 adicións e 63 borrados
  1. 12 4
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductScrmController.java
  2. 5 3
      fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java
  3. 3 0
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  4. 2 0
      fs-service/src/main/java/com/fs/course/vo/FsCourseWatchLogStatisticsListVO.java
  5. 2 2
      fs-service/src/main/java/com/fs/erp/service/impl/DfOrderServiceImpl.java
  6. 34 0
      fs-service/src/main/java/com/fs/fastGpt/service/impl/AiHookServiceImpl.java
  7. 12 0
      fs-service/src/main/java/com/fs/his/dto/FindUsersByDTO.java
  8. 4 0
      fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java
  9. 12 0
      fs-service/src/main/java/com/fs/his/param/FindUserByParam.java
  10. 2 0
      fs-service/src/main/java/com/fs/his/param/FsInquiryOrderDoPayParam.java
  11. 2 0
      fs-service/src/main/java/com/fs/his/param/FsPackageOrderDoPayParam.java
  12. 2 0
      fs-service/src/main/java/com/fs/his/param/FsStoreOrderDoPayParam.java
  13. 8 0
      fs-service/src/main/java/com/fs/his/service/IFsUserService.java
  14. 35 10
      fs-service/src/main/java/com/fs/his/service/impl/FsPackageOrderServiceImpl.java
  15. 34 9
      fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderServiceImpl.java
  16. 7 0
      fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java
  17. 4 2
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductScrmServiceImpl.java
  18. 3 0
      fs-service/src/main/java/com/fs/qw/domain/QwExternalContact.java
  19. 2 0
      fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java
  20. 3 0
      fs-service/src/main/java/com/fs/sop/mapper/QwSopLogsMapper.java
  21. 2 2
      fs-service/src/main/resources/mapper/course/FsUserCourseVideoMapper.xml
  22. 38 0
      fs-service/src/main/resources/mapper/his/FsUserMapper.xml
  23. 3 0
      fs-service/src/main/resources/mapper/qw/QwExternalContactMapper.xml
  24. 10 0
      fs-service/src/main/resources/mapper/sop/QwSopLogsMapper.xml
  25. 9 5
      fs-service/src/main/resources/mapper/sop/QwSopMapper.xml
  26. 20 12
      fs-service/src/main/resources/mapper/sop/SopUserLogsMapper.xml
  27. 38 14
      fs-user-app/src/main/java/com/fs/app/controller/InquiryOrderController.java
  28. 37 0
      fs-user-app/src/main/java/com/fs/app/controller/UserController.java
  29. 10 0
      fs-user-app/src/main/java/com/fs/app/param/FriendsSearchParam.java

+ 12 - 4
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductScrmController.java

@@ -1,5 +1,6 @@
 package com.fs.hisStore.controller;
 
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
@@ -22,6 +23,7 @@ import com.fs.hisStore.service.IFsStoreProductAttrValueScrmService;
 import com.fs.hisStore.service.IFsStoreProductScrmService;
 import com.mysql.cj.util.StringUtils;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -39,6 +41,7 @@ import java.util.List;
  * @author fs
  * @date 2022-03-15
  */
+@Slf4j
 @RestController
 @RequestMapping("/store/store/storeProduct")
 public class FsStoreProductScrmController extends BaseController
@@ -73,6 +76,7 @@ public class FsStoreProductScrmController extends BaseController
     @GetMapping("/list")
     public TableDataInfo list(FsStoreProductScrm fsStoreProduct)
     {
+        log.info("查询商品列表 参数: {}", fsStoreProduct);
         startPage();
         List<FsStoreProductListVO> list;
         if(StringUtils.isNullOrEmpty(fsStoreProduct.getBarCode())){
@@ -134,12 +138,16 @@ public class FsStoreProductScrmController extends BaseController
     @PostMapping(value = "/addOrEdit")
     public R addOrEdit(@RequestBody FsStoreProductAddEditParam fsStoreProduct)
     {
-        if (fsStoreProduct.getIsShow() ==1){
-            logger.info("商品上架:{}",fsStoreProduct.getProductName()+new Date());
+        if(ObjectUtils.isNotNull(fsStoreProduct.getIsShow())) {
+            if (fsStoreProduct.getIsShow() ==1){
+                logger.info("商品上架:{}",fsStoreProduct.getProductName()+new Date());
+            }
         }
 
-        if (fsStoreProduct.getIsDisplay() ==1){
-            logger.info("商品前端展示:{}",fsStoreProduct.getProductName()+new Date());
+        if(ObjectUtils.isNotNull(fsStoreProduct.getIsDisplay())) {
+            if (fsStoreProduct.getIsDisplay() ==1){
+                logger.info("商品前端展示:{}",fsStoreProduct.getProductName()+new Date());
+            }
         }
         return fsStoreProductService.addOrEdit(fsStoreProduct);
     }

+ 5 - 3
fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java

@@ -109,9 +109,11 @@ public class CompanyServiceImpl implements ICompanyService
     @Override
     public Company selectCompanyById(Long companyId){
         Company company = companyMapper.selectCompanyById(companyId);
-        List<CompanyMiniapp> miniApp = companyMiniappService.getMiniAppListByCompanyList(Collections.singletonList(company.getCompanyId()));
-        company.setMiniAppMaster(GET_MINI_APP_STR.apply(0, miniApp));
-        company.setMiniAppServer(GET_MINI_APP_STR.apply(1, miniApp));
+        if(company != null) {
+            List<CompanyMiniapp> miniApp = companyMiniappService.getMiniAppListByCompanyList(Collections.singletonList(company.getCompanyId()));
+            company.setMiniAppMaster(GET_MINI_APP_STR.apply(0, miniApp));
+            company.setMiniAppServer(GET_MINI_APP_STR.apply(1, miniApp));
+        }
         return company;
     }
 

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

@@ -2512,6 +2512,9 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         FsUserCourseVideo courseVideo = fsUserCourseVideoMapper.selectFsUserCourseVideoByVideoIdAndUserId(videoId,userId);
 
         BeanCopyUtils.copy(courseVideo,fsUserCourseVideoQVO);
+        if(courseVideo != null && courseVideo.getRedPacketMoney() != null){
+            fsUserCourseVideoQVO.setRedPacketMoney(courseVideo.getRedPacketMoney().toString());
+        }
 
         if (StringUtils.isNotEmpty(courseVideo.getQuestionBankId())){
             List<FsCourseQuestionBank> fsCourseQuestionBanks = courseQuestionBankMapper.selectFsCourseQuestionBankByIdVO(courseVideo.getQuestionBankId().split(","));

+ 2 - 0
fs-service/src/main/java/com/fs/course/vo/FsCourseWatchLogStatisticsListVO.java

@@ -30,6 +30,8 @@ public class FsCourseWatchLogStatisticsListVO {
     private String type3;
     @Excel(name = "看课中断")
     private String type4;
+    @Excel(name = "上线数")
+    private Long onLineNum;
     @Excel(name = "企业微信员工名称")
     private String qwUserName;
 

+ 2 - 2
fs-service/src/main/java/com/fs/erp/service/impl/DfOrderServiceImpl.java

@@ -474,8 +474,8 @@ public class DfOrderServiceImpl implements IErpOrderService
             orderPayMethod = 1;
         } else { // 如果是线上付款
             orderPayMethod = 2;
-            // 货到付款金额 = 物流代收金额-优惠金额
-            vo.setCollectingMoney(fsStoreOrder.getPayDelivery().subtract(couponPrice).doubleValue());
+            // 货到付款金额 = 订单剩余支付金额
+            vo.setCollectingMoney(fsStoreOrder.getPayRemain().doubleValue());
             vo.setCollectionCardNumber(config.getMonthlyCard()); // 就是月结账号
         }
         //订单付款方式 1:在线支付 2:货到付款

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

@@ -450,6 +450,12 @@ public class AiHookServiceImpl implements AiHookService {
             if(!contentEmj.contains("表情包")){
                 if(!contentEmj.isEmpty()){
                     addSaveAiMsg(1,1,contentEmj,user,fastGptChatSession.getSessionId(),role.getRoleId(),qwExternalContacts,fastGptChatSession.getUserId(),null,null,null);
+                    //通过用户发送的对话去查询用户是否为新客,是就删除sop,否就不做处理
+                    cleanNewUserDialogue(user, qwExternalContacts);
+                    //用户是未回复状态
+                    if(qwExternalContacts.getIsReply() == 0){
+                        qwExternalContactMapper.updateQwExternalContactIsRePlyById(qwExternalContacts.getId());
+                    }
                 }else {
                     contentEmj ="用户发送表情:"+qwContent;
                     if (type==16){
@@ -592,6 +598,34 @@ public class AiHookServiceImpl implements AiHookService {
         return R.ok();
     }
 
+    /**
+     * 通过用户发送的对话去查询用户是否为新客,是就删除sop,否就不做处理
+     * @param user
+     * @param qwExternalContacts
+     */
+    private void cleanNewUserDialogue(QwUser user, QwExternalContact qwExternalContacts) {
+        String redisKey = "qwNewChat:" + user.getQwUserId() + ":" + user.getCorpId() + ":" + qwExternalContacts.getExternalUserId();
+        String key  = (String) redisCache.getCacheObject(redisKey);
+        if(!StringUtil.strIsNullOrEmpty(key)){
+            try {
+                QwSopLogs qwSopLogs = new QwSopLogs();
+                qwSopLogs.setQwUserid(user.getQwUserId());
+                qwSopLogs.setCorpId(user.getCorpId());
+                qwSopLogs.setExternalUserId(qwExternalContacts.getExternalUserId());
+                qwSopLogs.setSendStatus(3L);
+                qwSopLogs.setSendType(4);
+                List<QwSopLogs> qwSopLogsList = qwSopLogsMapper.selectQwSopLogsList(qwSopLogs);
+                if(qwSopLogsList != null && !qwSopLogsList.isEmpty()){
+                    qwSopLogsMapper.batchUpdateQwSopLogsNewUserById(qwSopLogsList);
+                }
+            } catch (Exception e) {
+                log.error("停用新客对话sop失败:" + redisKey + "原因:" + e);
+            }finally {
+                redisCache.deleteObject(redisKey);
+            }
+        }
+    }
+
 
 
     /**

+ 12 - 0
fs-service/src/main/java/com/fs/his/dto/FindUsersByDTO.java

@@ -0,0 +1,12 @@
+package com.fs.his.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class FindUsersByDTO implements Serializable {
+    private Long id;
+    private Long type;
+    private String name;
+}

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

@@ -8,6 +8,8 @@ import com.fs.course.domain.FsUserWatchStatistics;
 import com.fs.course.param.CourseAnalysisParam;
 import com.fs.course.vo.newfs.FsCourseAnalysisCountVO;
 import com.fs.his.domain.FsUser;
+import com.fs.his.dto.FindUsersByDTO;
+import com.fs.his.param.FindUserByParam;
 import com.fs.his.param.FsUserParam;
 import com.fs.his.vo.FsUserVO;
 import com.fs.his.vo.FsUserExportListVO;
@@ -395,4 +397,6 @@ public interface FsUserMapper
     List<FsCompanyUserListQueryVO> selectFsCompanyUserListQuery(@Param("maps")FsUser fsUser);
 
     List<FsUser> selectFsUserListLimit(FsUser fsUser);
+
+    List<FindUsersByDTO> findUsersByParam(FindUserByParam param);
 }

+ 12 - 0
fs-service/src/main/java/com/fs/his/param/FindUserByParam.java

@@ -0,0 +1,12 @@
+package com.fs.his.param;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class FindUserByParam implements Serializable {
+    private Integer pageNum;
+    private Integer pageSize;
+    private String keywords;
+}

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

@@ -9,4 +9,6 @@ public class FsInquiryOrderDoPayParam implements Serializable {
     Long orderId;
     Long userId;
 
+    private String appId;
+
 }

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

@@ -10,4 +10,6 @@ public class FsPackageOrderDoPayParam implements Serializable {
     @NotNull(message = "订单号不能为空")
     Long orderId;
     Long userId;
+
+    private String appId;
 }

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

@@ -10,4 +10,6 @@ public class FsStoreOrderDoPayParam implements Serializable {
     @NotNull(message = "订单号不能为空")
     Long orderId;
     Long userId;
+
+    private String appId;
 }

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

@@ -12,6 +12,8 @@ import com.fs.course.param.newfs.FsUserCourseBeMemberParam;
 import com.fs.course.vo.newfs.FsCourseAnalysisVO;
 import com.fs.his.domain.FsUser;
 import com.fs.his.domain.FsUserAddress;
+import com.fs.his.dto.FindUsersByDTO;
+import com.fs.his.param.FindUserByParam;
 import com.fs.his.param.FsUserParam;
 import com.fs.his.vo.FsUserVO;
 import com.fs.his.vo.FsUserExportListVO;
@@ -46,6 +48,12 @@ public interface IFsUserService
      */
     public FsUser selectFsUserByUserId(Long userId);
 
+    /**
+     * 通过参数查找用户
+     * @param param 参数
+     * @return 用户列表
+     */
+    public List<FindUsersByDTO> findUserByParam(FindUserByParam param);
     /**
      * 查询用户列表
      *

+ 35 - 10
fs-service/src/main/java/com/fs/his/service/impl/FsPackageOrderServiceImpl.java

@@ -162,6 +162,9 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
     @Autowired
     private FsUserWxMapper fsUserWxMapper;
 
+    @Autowired
+    private IFsUserWxService userWxService;
+
     /**
      * 查询套餐订单
      *
@@ -876,20 +879,42 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
             return R.error("非法操作");
         }
 
-        FsUser user=userService.selectFsUserByUserId(param.getUserId());
-
+//        FsUser user=userService.selectFsUserByUserId(param.getUserId());
+//
+//        String json = configService.selectConfigByKey("his.pay");
+//        PayConfigDTO payConfigDTO = JSONUtil.toBean(json, PayConfigDTO.class);
+//
+//        String openId = Objects.isNull(user) ? "" : user.getMaOpenId();
+//        if (StringUtils.isBlank(openId)){
+//            Wrapper<FsUserWx> queryWrapper = Wrappers.<FsUserWx>lambdaQuery()
+//                    .eq(FsUserWx::getFsUserId, param.getUserId())
+//                    .eq(FsUserWx::getAppId, payConfigDTO.getAppId());
+//            FsUserWx fsUserWx = fsUserWxMapper.selectOne(queryWrapper);
+//            if (Objects.nonNull(fsUserWx)){
+//                openId = fsUserWx.getOpenId();
+//            }
+//        }
+        FsUser user = userService.selectFsUserByUserId(param.getUserId());
+        //在线支付
         String json = configService.selectConfigByKey("his.pay");
         PayConfigDTO payConfigDTO = JSONUtil.toBean(json, PayConfigDTO.class);
-
-        String openId = Objects.isNull(user) ? "" : user.getMaOpenId();
-        if (StringUtils.isBlank(openId)){
-            Wrapper<FsUserWx> queryWrapper = Wrappers.<FsUserWx>lambdaQuery()
-                    .eq(FsUserWx::getFsUserId, param.getUserId())
-                    .eq(FsUserWx::getAppId, payConfigDTO.getAppId());
-            FsUserWx fsUserWx = fsUserWxMapper.selectOne(queryWrapper);
-            if (Objects.nonNull(fsUserWx)){
+        String openId = "";
+        if (StringUtils.isNotEmpty(param.getAppId())) {
+            FsUserWx fsUserWx = userWxService.selectByAppIdAndUserId(param.getAppId(), param.getUserId(), 1);
+            if (fsUserWx != null) {
                 openId = fsUserWx.getOpenId();
             }
+        } else {
+            openId = Objects.isNull(user) ? "" : user.getMaOpenId();
+            if (StringUtils.isBlank(openId)){
+                Wrapper<FsUserWx> queryWrapper = Wrappers.<FsUserWx>lambdaQuery()
+                        .eq(FsUserWx::getFsUserId, param.getUserId())
+                        .eq(FsUserWx::getAppId, payConfigDTO.getAppId());
+                FsUserWx fsUserWx = fsUserWxMapper.selectOne(queryWrapper);
+                if (Objects.nonNull(fsUserWx)){
+                    openId = fsUserWx.getOpenId();
+                }
+            }
         }
 
         if(user!=null&& StringUtils.isNotEmpty(openId)){

+ 34 - 9
fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderServiceImpl.java

@@ -277,6 +277,9 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
     @Autowired
     private FsUserWxMapper fsUserWxMapper;
 
+    @Autowired
+    private IFsUserWxService userWxService;
+
     @Value("${express.omsCode}")
     private String expressOmsCode;
 
@@ -2647,21 +2650,43 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
             return R.error("订单状态不正确");
         }
 
+//        FsUser user = userService.selectFsUserByUserId(param.getUserId());
+//
+//        //在线支付
+//        String json = configService.selectConfigByKey("his.pay");
+//        PayConfigDTO payConfigDTO = JSONUtil.toBean(json, PayConfigDTO.class);
+//
+//        String openId = Objects.isNull(user) ? "" : user.getMaOpenId();
+//        if (StringUtils.isBlank(openId)){
+//            Wrapper<FsUserWx> queryWrapper = Wrappers.<FsUserWx>lambdaQuery()
+//                    .eq(FsUserWx::getFsUserId, param.getUserId())
+//                    .eq(FsUserWx::getAppId, payConfigDTO.getAppId());
+//            FsUserWx fsUserWx = fsUserWxMapper.selectOne(queryWrapper);
+//            if (Objects.nonNull(fsUserWx)){
+//                openId = fsUserWx.getOpenId();
+//            }
+//        }
         FsUser user = userService.selectFsUserByUserId(param.getUserId());
-
         //在线支付
         String json = configService.selectConfigByKey("his.pay");
         PayConfigDTO payConfigDTO = JSONUtil.toBean(json, PayConfigDTO.class);
-
-        String openId = Objects.isNull(user) ? "" : user.getMaOpenId();
-        if (StringUtils.isBlank(openId)){
-            Wrapper<FsUserWx> queryWrapper = Wrappers.<FsUserWx>lambdaQuery()
-                    .eq(FsUserWx::getFsUserId, param.getUserId())
-                    .eq(FsUserWx::getAppId, payConfigDTO.getAppId());
-            FsUserWx fsUserWx = fsUserWxMapper.selectOne(queryWrapper);
-            if (Objects.nonNull(fsUserWx)){
+        String openId = "";
+        if (StringUtils.isNotEmpty(param.getAppId())) {
+            FsUserWx fsUserWx = userWxService.selectByAppIdAndUserId(param.getAppId(), param.getUserId(), 1);
+            if (fsUserWx != null) {
                 openId = fsUserWx.getOpenId();
             }
+        } else {
+            openId = Objects.isNull(user) ? "" : user.getMaOpenId();
+            if (StringUtils.isBlank(openId)){
+                Wrapper<FsUserWx> queryWrapper = Wrappers.<FsUserWx>lambdaQuery()
+                        .eq(FsUserWx::getFsUserId, param.getUserId())
+                        .eq(FsUserWx::getAppId, payConfigDTO.getAppId());
+                FsUserWx fsUserWx = fsUserWxMapper.selectOne(queryWrapper);
+                if (Objects.nonNull(fsUserWx)){
+                    openId = fsUserWx.getOpenId();
+                }
+            }
         }
 
         if (user != null && StringUtils.isNotEmpty(openId)) {

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

@@ -40,8 +40,10 @@ import com.fs.his.config.IntegralConfig;
 import com.fs.his.domain.*;
 import com.fs.his.domain.FsUserAddress;
 import com.fs.his.domain.FsUserIntegralLogs;
+import com.fs.his.dto.FindUsersByDTO;
 import com.fs.his.enums.FsUserIntegralLogTypeEnum;
 import com.fs.his.mapper.*;
+import com.fs.his.param.FindUserByParam;
 import com.fs.his.param.FsUserAddIntegralTemplateParam;
 import com.fs.his.param.FsUserParam;
 import com.fs.his.service.IFsUserIntegralLogsService;
@@ -173,6 +175,11 @@ public class FsUserServiceImpl implements IFsUserService
         return fsUserMapper.selectFsUserByUserId(userId);
     }
 
+    @Override
+    public List<FindUsersByDTO> findUserByParam(FindUserByParam param) {
+        return fsUserMapper.findUsersByParam(param);
+    }
+
     /**
      * 查询用户列表
      *

+ 4 - 2
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductScrmServiceImpl.java

@@ -167,8 +167,10 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
                 String[] split = item.getCompanyIds().split(",");
 
                 for (String companyId : split) {
-                    String companyName = companyCacheService.selectCompanyNameById(Long.valueOf(companyId));
-                    companyNameList.add(companyName);
+                    if(StringUtils.isNotBlank(companyId)) {
+                        String companyName = companyCacheService.selectCompanyNameById(Long.valueOf(companyId));
+                        companyNameList.add(companyName);
+                    }
                 }
                 item.setCompanyName(String.join(",",companyNameList));
             }

+ 3 - 0
fs-service/src/main/java/com/fs/qw/domain/QwExternalContact.java

@@ -145,4 +145,7 @@ public class QwExternalContact extends BaseEntity
     // 是否已购0 否 1程序内下单 2程序外下单
     private Integer payOrder;
 
+    //用户是否回复  0未回复  1已回复
+    private Integer isReply;
+
 }

+ 2 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java

@@ -435,4 +435,6 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
     List<QwUserDelLossLogVO> selectQwUserDelLossList(@Param("param") QwUserDelLossLogParam param);
 
     List<QwExternalContact> selectQwExternalContactByFsUserIdAndCompany(@Param("userId")Long userId,@Param("companyUserId") Long companyUserId);
+
+    void updateQwExternalContactIsRePlyById(@Param("id")Long id);
 }

+ 3 - 0
fs-service/src/main/java/com/fs/sop/mapper/QwSopLogsMapper.java

@@ -329,4 +329,7 @@ public interface QwSopLogsMapper extends BaseMapper<QwSopLogs> {
 
     @DataSource(DataSourceType.SOP)
     void batchUpdateQwSopLogsById(@Param("data") List<QwSopLogs> logs);
+
+    @DataSource(DataSourceType.SOP)
+    void batchUpdateQwSopLogsNewUserById(@Param("data")List<QwSopLogs> qwSopLogsList);
 }

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

@@ -361,8 +361,8 @@
         and fcpd.del_flag = 0 and video.is_del = 0 and fcp.del_flag = '0' and c.del_flag = '0'
     </select>
 
-    <select id="selectFsUserCourseVideoByVideoIdAndUserId" resultType="com.fs.course.domain.FsUserCourseVideo">
-        select *  from fs_user_course_video
+    <select id="selectFsUserCourseVideoByVideoIdAndUserId" resultMap="FsUserCourseVideoResult">
+        <include refid="selectFsUserCourseVideoVo"/>
         where video_id=#{videoId} and is_del = 0
         <if test="userId != null">
            and user_id = #{userId}

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

@@ -1891,4 +1891,42 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         order by user_id desc
         limit 10
     </select>
+    <select id="findUsersByParam" resultType="com.fs.his.dto.FindUsersByDTO">
+        SELECT user_id as id, 0 as type,
+        CONCAT(user_id, '_', IFNULL(nick_name, '')) as name
+        FROM fs_user
+        WHERE user_id = #{keywords}
+        UNION
+        <!-- fs_user 按nick_name前缀搜索 -->
+        SELECT user_id as id, 0 as type,
+        CONCAT(user_id, '_', IFNULL(nick_name, '')) as name
+        FROM fs_user
+        WHERE nick_name LIKE CONCAT(#{keywords}, '%')
+        UNION
+        <!-- fs_user 按phone精确搜索(仅当keywords是数字时) -->
+        <if test="keywords.matches('\\d+')">
+            SELECT user_id as id, 0 as type,
+            CONCAT(user_id, '_', IFNULL(nick_name, '')) as name
+            FROM fs_user
+            WHERE phone = #{keywords}
+            UNION
+        </if>
+        <!-- company_user相关查询 -->
+        SELECT user_id as id, 1 as type,
+        IFNULL(nick_name, '') as name
+        FROM company_user
+        WHERE user_id = #{keywords}
+        UNION
+        SELECT user_id as id, 1 as type,
+        IFNULL(nick_name, '') as name
+        FROM company_user
+        WHERE nick_name LIKE CONCAT(#{keywords}, '%')
+        <if test="keywords.matches('\\d+')">
+            UNION
+            SELECT user_id as id, 1 as type,
+            IFNULL(nick_name, '') as name
+            FROM company_user
+            WHERE phonenumber = #{keywords}
+        </if>
+    </select>
 </mapper>

+ 3 - 0
fs-service/src/main/resources/mapper/qw/QwExternalContactMapper.xml

@@ -599,6 +599,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             #{id}
         </foreach>
     </update>
+    <update id="updateQwExternalContactIsRePlyById">
+        update qw_external_contact set is_reply = 1 where id = #{id}
+    </update>
 
     <select id="selectExternalByFsUserIds" resultType="QwExternalContact">
         select * from qw_external_contact

+ 10 - 0
fs-service/src/main/resources/mapper/sop/QwSopLogsMapper.xml

@@ -824,6 +824,16 @@
             #{log.id}
         </foreach>
     </update>
+    <update id="batchUpdateQwSopLogsNewUserById">
+        UPDATE  qw_sop_logs
+        SET
+        send_status = 5,
+        remark = '新客对话已回复'
+        WHERE id IN
+        <foreach collection="data" item="log" open="(" separator="," close=")">
+            #{log.id}
+        </foreach>
+    </update>
 
     <select id="selectByQwUserId" resultType="com.fs.sop.domain.QwSopLogs">
         select ql.*,

+ 9 - 5
fs-service/src/main/resources/mapper/sop/QwSopMapper.xml

@@ -425,13 +425,17 @@
         FROM sop_user_logs log
         RIGHT JOIN qw_sop ON log.sop_id = qw_sop.id
         <where>
-        <![CDATA[
+            <![CDATA[
             log.start_time <= CURDATE()
+            ]]>
             AND log.status = 1
-            AND qw_sop.status in(2,3)
-            AND qw_sop.is_auto_sop = 1 AND log.start_time >= #{startDate}
-            AND log.start_time <= #{endDate}
-         ]]>
+            AND qw_sop.status in(2,3,6)
+            <if test="startDate!=null and endDate!=null">
+                <![CDATA[
+                AND log.start_time >= #{startDate}
+                AND log.start_time <= #{endDate}
+            ]]>
+            </if>
             <if test="companyId != null">
                 AND qw_sop.company_id = ${companyId}
             </if>

+ 20 - 12
fs-service/src/main/resources/mapper/sop/SopUserLogsMapper.xml

@@ -436,23 +436,31 @@
         </where>
     </select>
     <select id="querySopUserLogsByParam" resultType="com.fs.sop.domain.SopUserLogs">
-        <![CDATA[
         SELECT DISTINCT log.id as id,
-                        log.qw_user_id as qw_user_id,
-                        log.start_time as start_time,
-                        log.sop_id as sop_id
+        log.qw_user_id as qw_user_id,
+        log.start_time as start_time,
+        log.sop_id as sop_id
         FROM sop_user_logs log
-                 LEFT JOIN qw_sop ON log.sop_id = qw_sop.id
-        WHERE log.start_time <= CURDATE()
-          AND log.status = 1
-          AND qw_sop.status in(2,3)
-          AND (
-            (qw_sop.is_auto_sop = 1 AND log.start_time >= #{startDate}
+        LEFT JOIN qw_sop ON log.sop_id = qw_sop.id
+        <where>
+            <![CDATA[
+            log.start_time <= CURDATE()
+            ]]>
+            AND log.status = 1
+            AND qw_sop.status in(2,3)
+
+            <if test="startDate != null and endDate != null">
+                AND (
+                <![CDATA[
+                log.start_time >= #{startDate}
                 AND log.start_time <= #{endDate}
+            ]]>
+
                 )
-            )
+            </if>
+
+        </where>
         ORDER BY log.start_time DESC
-        ]]>
     </select>
 
     <select id="getSopUserLogsInfoById" resultType="com.fs.sop.domain.SopUserLogs">

+ 38 - 14
fs-user-app/src/main/java/com/fs/app/controller/InquiryOrderController.java

@@ -111,6 +111,8 @@ public class InquiryOrderController extends  AppBaseController {
 
     @Autowired
     private ISysConfigService configService;
+    @Autowired
+    private IFsUserWxService userWxService;
     @Login
     @ApiOperation("确认订单")
     @PostMapping("/confirm")
@@ -243,23 +245,45 @@ public class InquiryOrderController extends  AppBaseController {
     @PostMapping("/payment")
     public R payment(HttpServletRequest request, @Validated @RequestBody FsInquiryOrderDoPayParam param)
     {
-        String json=configService.selectConfigByKey("his.pay");
-        PayConfigDTO payConfigDTO= JSONUtil.toBean(json, PayConfigDTO.class);
-        param.setUserId(Long.parseLong(getUserId()));
-        FsInquiryOrder order=inquiryOrderService.selectFsInquiryOrderByOrderId(param.getOrderId());
-
-        FsUser user=userService.selectFsUserByUserId(Long.parseLong(getUserId()));
-
-        String openId = Objects.isNull(user) ? "" : user.getMaOpenId();
-        if (StringUtils.isBlank(openId)){
-            Wrapper<FsUserWx> queryWrapper = Wrappers.<FsUserWx>lambdaQuery()
-                    .eq(FsUserWx::getFsUserId, Long.parseLong(getUserId()))
-                    .eq(FsUserWx::getAppId, payConfigDTO.getAppId());
-            FsUserWx fsUserWx = fsUserWxMapper.selectOne(queryWrapper);
-            if (Objects.nonNull(fsUserWx)){
+        FsUser user = userService.selectFsUserByUserId(param.getUserId());
+        //在线支付
+        String json = configService.selectConfigByKey("his.pay");
+        PayConfigDTO payConfigDTO = JSONUtil.toBean(json, PayConfigDTO.class);
+        String openId = "";
+        if (StringUtils.isNotEmpty(param.getAppId())) {
+            FsUserWx fsUserWx = userWxService.selectByAppIdAndUserId(param.getAppId(), param.getUserId(), 1);
+            if (fsUserWx != null) {
                 openId = fsUserWx.getOpenId();
             }
+        } else {
+            openId = Objects.isNull(user) ? "" : user.getMaOpenId();
+            if (StringUtils.isBlank(openId)){
+                Wrapper<FsUserWx> queryWrapper = Wrappers.<FsUserWx>lambdaQuery()
+                        .eq(FsUserWx::getFsUserId, param.getUserId())
+                        .eq(FsUserWx::getAppId, payConfigDTO.getAppId());
+                FsUserWx fsUserWx = fsUserWxMapper.selectOne(queryWrapper);
+                if (Objects.nonNull(fsUserWx)){
+                    openId = fsUserWx.getOpenId();
+                }
+            }
         }
+        //String json=configService.selectConfigByKey("his.pay");
+        //PayConfigDTO payConfigDTO= JSONUtil.toBean(json, PayConfigDTO.class);
+        param.setUserId(Long.parseLong(getUserId()));
+        FsInquiryOrder order=inquiryOrderService.selectFsInquiryOrderByOrderId(param.getOrderId());
+
+        //FsUser user=userService.selectFsUserByUserId(Long.parseLong(getUserId()));
+
+//        String openId = Objects.isNull(user) ? "" : user.getMaOpenId();
+//        if (StringUtils.isBlank(openId)){
+//            Wrapper<FsUserWx> queryWrapper = Wrappers.<FsUserWx>lambdaQuery()
+//                    .eq(FsUserWx::getFsUserId, Long.parseLong(getUserId()))
+//                    .eq(FsUserWx::getAppId, payConfigDTO.getAppId());
+//            FsUserWx fsUserWx = fsUserWxMapper.selectOne(queryWrapper);
+//            if (Objects.nonNull(fsUserWx)){
+//                openId = fsUserWx.getOpenId();
+//            }
+//        }
 
         if (StringUtils.isBlank(openId)){
             return R.error("用户OPENID不存在");

+ 37 - 0
fs-user-app/src/main/java/com/fs/app/controller/UserController.java

@@ -1,8 +1,10 @@
 package com.fs.app.controller;
 
 
+import cn.hutool.core.lang.Validator;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.fs.app.annotation.Login;
+import com.fs.app.param.FriendsSearchParam;
 import com.fs.app.param.FsDoctorRegisterParam;
 import com.fs.app.param.FsUserEditParam;
 import com.fs.common.core.domain.R;
@@ -14,12 +16,15 @@ import com.fs.course.service.IFsUserCourseVideoService;
 import com.fs.his.domain.FsDoctor;
 import com.fs.his.domain.FsPackage;
 import com.fs.his.domain.FsUser;
+import com.fs.his.dto.FindUsersByDTO;
+import com.fs.his.param.FindUserByParam;
 import com.fs.his.param.FsUserCouponUParam;
 import com.fs.his.param.FsUserEditPushParam;
 import com.fs.his.service.IFsDoctorService;
 import com.fs.his.service.IFsPackageService;
 import com.fs.his.service.IFsUserCouponService;
 import com.fs.his.service.IFsUserService;
+import com.fs.his.utils.PhoneUtil;
 import com.fs.his.utils.qrcode.QRCodeUtils;
 import com.fs.his.vo.FsDoctorListUVO;
 import com.fs.his.vo.FsUserCouponCountUVO;
@@ -31,12 +36,14 @@ import com.fs.system.oss.OSSFactory;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.google.zxing.WriterException;
+import io.jsonwebtoken.lang.Assert;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.parameters.P;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -48,6 +55,7 @@ import java.awt.image.BufferedImage;
 import java.io.*;
 import java.math.BigDecimal;
 import java.net.URL;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -77,6 +85,35 @@ public class UserController extends  AppBaseController {
     @Autowired
     private IFsUserCourseVideoService courseVideoService;
 
+
+    @Autowired
+    private IFsUserService fsUserService;
+    @Login
+    @ApiOperation("获取用户信息")
+    @PostMapping("/friendsSearch")
+    public R friendsSearch(@RequestBody FindUserByParam param){
+        if(param.getPageNum() == null) {
+            throw new IllegalArgumentException("分页参数 pageNum 不能为空!");
+        }
+        if(param.getPageSize() == null) {
+            throw new IllegalArgumentException("分页参数 pageSize 不能为空!");
+        }
+
+        if(StringUtils.isBlank(param.getKeywords())) {
+            return R.ok().put("data",new ArrayList<>());
+        }
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+
+        if(StringUtils.isNotBlank(param.getKeywords())){
+            if(Validator.isMobile(param.getKeywords())) {
+                param.setKeywords(PhoneUtil.encryptPhone(param.getKeywords()));
+            }
+        }
+        List<FindUsersByDTO> list = fsUserService.findUserByParam(param);
+        PageInfo<FindUsersByDTO> listPageInfo=new PageInfo<>(list);
+
+        return R.ok().put("data", listPageInfo);
+    }
     /**
      * 获取用户信息
      * @param request

+ 10 - 0
fs-user-app/src/main/java/com/fs/app/param/FriendsSearchParam.java

@@ -0,0 +1,10 @@
+package com.fs.app.param;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class FriendsSearchParam implements Serializable {
+    private String keyword;
+}