Procházet zdrojové kódy

Merge branch 'refs/heads/master' into master_feat_job_20250507

xdd před 4 týdny
rodič
revize
0b428152ad
78 změnil soubory, kde provedl 1285 přidání a 673 odebrání
  1. 1 1
      .gitignore
  2. 1 0
      fs-admin/src/main/java/com/fs/core/config/SecurityConfig.java
  3. 14 0
      fs-admin/src/main/java/com/fs/store/controller/FsExpressController.java
  4. 5 5
      fs-admin/src/main/java/com/fs/user/FsUserAdminController.java
  5. 1 1
      fs-common/pom.xml
  6. 1 1
      fs-common/src/main/java/com/fs/common/utils/TimeUtils.java
  7. 1 0
      fs-company/src/main/java/com/fs/course/controller/FsCourseWatchLogController.java
  8. 11 0
      fs-company/src/main/java/com/fs/qw/QwExternalContactController.java
  9. 5 0
      fs-company/src/main/java/com/fs/qw/vo/QwExternalContactVO.java
  10. 2 0
      fs-company/src/main/java/com/fs/qw/vo/QwWatchLogStatisticsListVO.java
  11. 11 9
      fs-company/src/main/java/com/fs/user/FsUserAdminController.java
  12. 42 0
      fs-qw-task/src/main/java/com/fs/app/task/UserCourseWatchCountTask.java
  13. 5 5
      fs-service-system/pom.xml
  14. 11 0
      fs-service-system/src/main/java/com/fs/company/cache/ICompanyTagCacheService.java
  15. 9 0
      fs-service-system/src/main/java/com/fs/company/cache/ICompanyUserCacheService.java
  16. 36 0
      fs-service-system/src/main/java/com/fs/company/cache/impl/CompanyTagCacheServiceImpl.java
  17. 32 0
      fs-service-system/src/main/java/com/fs/company/cache/impl/CompanyUserCacheServiceImpl.java
  18. 13 0
      fs-service-system/src/main/java/com/fs/company/dto/CompanyIdAndUserDTO.java
  19. 14 8
      fs-service-system/src/main/java/com/fs/company/mapper/CompanyTagMapper.java
  20. 4 0
      fs-service-system/src/main/java/com/fs/company/mapper/CompanyUserMapper.java
  21. 14 8
      fs-service-system/src/main/java/com/fs/company/service/ICompanyTagService.java
  22. 3 0
      fs-service-system/src/main/java/com/fs/company/service/ICompanyUserService.java
  23. 19 8
      fs-service-system/src/main/java/com/fs/company/service/impl/CompanyTagServiceImpl.java
  24. 10 0
      fs-service-system/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java
  25. 4 0
      fs-service-system/src/main/java/com/fs/course/domain/FsCourseLink.java
  26. 4 0
      fs-service-system/src/main/java/com/fs/course/domain/FsCourseRealLink.java
  27. 3 0
      fs-service-system/src/main/java/com/fs/course/param/FsCourseLinkCreateParam.java
  28. 3 0
      fs-service-system/src/main/java/com/fs/course/param/newfs/FsCourseSortLinkParam.java
  29. 2 2
      fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  30. 6 2
      fs-service-system/src/main/java/com/fs/kingbos/domian/KingbosOrderData.java
  31. 1 1
      fs-service-system/src/main/java/com/fs/kingbos/domian/KingbosOrderResponse.java
  32. 47 0
      fs-service-system/src/main/java/com/fs/kingbos/enums/OrderStatusEnum.java
  33. 1 1
      fs-service-system/src/main/java/com/fs/kingbos/service/K9OrderService.java
  34. 153 57
      fs-service-system/src/main/java/com/fs/kingbos/service/impl/K9OrderServiceImpl.java
  35. 8 0
      fs-service-system/src/main/java/com/fs/qw/cache/IQwExternalContactCacheService.java
  36. 12 0
      fs-service-system/src/main/java/com/fs/qw/cache/impl/QwExternalContactCacheServiceImpl.java
  37. 19 0
      fs-service-system/src/main/java/com/fs/qw/converter/QwExternalContactConverter.java
  38. 20 0
      fs-service-system/src/main/java/com/fs/qw/dto/GetQwRepeatDataDTO.java
  39. 8 0
      fs-service-system/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java
  40. 3 0
      fs-service-system/src/main/java/com/fs/qw/mapper/QwGroupChatUserMapper.java
  41. 1 1
      fs-service-system/src/main/java/com/fs/qw/mapper/QwUserMapper.java
  42. 11 0
      fs-service-system/src/main/java/com/fs/qw/service/IQwExternalContactService.java
  43. 62 0
      fs-service-system/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java
  44. 9 2
      fs-service-system/src/main/java/com/fs/qw/service/impl/QwWatchLogServiceImpl.java
  45. 39 0
      fs-service-system/src/main/java/com/fs/qw/vo/GetQwRepeatDataVO.java
  46. 5 0
      fs-service-system/src/main/java/com/fs/qw/vo/QwExternalContactVO.java
  47. 1 0
      fs-service-system/src/main/java/com/fs/sop/params/SendUserLogsInfoMsgParam.java
  48. 1 0
      fs-service-system/src/main/java/com/fs/sop/params/SopUserLogsInfoByIdsHasUserIdParam.java
  49. 19 8
      fs-service-system/src/main/java/com/fs/sop/service/impl/SopUserLogsInfoServiceImpl.java
  50. 4 0
      fs-service-system/src/main/java/com/fs/store/domain/FsStoreProduct.java
  51. 43 0
      fs-service-system/src/main/java/com/fs/store/dto/ExpressResultDTO.java
  52. 11 8
      fs-service-system/src/main/java/com/fs/store/mapper/FsUserCourseCountMapper.java
  53. 6 0
      fs-service-system/src/main/java/com/fs/store/param/h5/FsUserPageListParam.java
  54. 10 1
      fs-service-system/src/main/java/com/fs/store/service/IFsStoreOrderService.java
  55. 10 8
      fs-service-system/src/main/java/com/fs/store/service/IFsUserCourseCountService.java
  56. 1 1
      fs-service-system/src/main/java/com/fs/store/service/IFsUserService.java
  57. 8 0
      fs-service-system/src/main/java/com/fs/store/service/cache/IFsUserCourseCountCacheService.java
  58. 7 1
      fs-service-system/src/main/java/com/fs/store/service/cache/impl/FsUserCourseCacheServiceImpl.java
  59. 36 0
      fs-service-system/src/main/java/com/fs/store/service/cache/impl/FsUserCourseCountCacheServiceImpl.java
  60. 3 3
      fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreAfterSalesServiceImpl.java
  61. 4 4
      fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreCartServiceImpl.java
  62. 29 44
      fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreOrderServiceImpl.java
  63. 13 8
      fs-service-system/src/main/java/com/fs/store/service/impl/FsUserCourseCountServiceImpl.java
  64. 78 6
      fs-service-system/src/main/java/com/fs/store/service/impl/FsUserServiceImpl.java
  65. 4 0
      fs-service-system/src/main/java/com/fs/store/vo/h5/FsUserPageListVO.java
  66. 12 6
      fs-service-system/src/main/resources/mapper/company/CompanyTagMapper.xml
  67. 6 0
      fs-service-system/src/main/resources/mapper/company/CompanyUserMapper.xml
  68. 3 0
      fs-service-system/src/main/resources/mapper/course/FsCourseAnswerLogsMapper.xml
  69. 3 0
      fs-service-system/src/main/resources/mapper/course/FsCourseRedPacketLogMapper.xml
  70. 20 14
      fs-service-system/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml
  71. 15 0
      fs-service-system/src/main/resources/mapper/qw/QwGroupChatUserMapper.xml
  72. 1 1
      fs-service-system/src/main/resources/mapper/store/FsStoreProductMapper.xml
  73. 3 0
      fs-service-system/src/main/resources/mapper/store/FsUserCourseCountMapper.xml
  74. 36 193
      fs-service-system/src/main/resources/mapper/store/FsUserMapper.xml
  75. 3 93
      fs-user-app/src/main/java/com/fs/app/controller/PayController.java
  76. 25 59
      fs-user-app/src/main/java/com/fs/app/controller/StoreOrderController.java
  77. 183 102
      fs-user-app/src/main/java/com/fs/app/controller/WxUserController.java
  78. 1 1
      fs-user-app/src/main/resources/application.yml

+ 1 - 1
.gitignore

@@ -6,7 +6,7 @@ target/
 !**/src/main/**/target/
 !**/src/test/**/target/
 #*.yml
-logback.xml
+#logback.xml
 
 ### STS ###
 .apt_generated

+ 1 - 0
fs-admin/src/main/java/com/fs/core/config/SecurityConfig.java

@@ -114,6 +114,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
 //                .antMatchers("/hwcloud/upload/progress").anonymous()
                 .antMatchers("/common/uploadHuaWeiObs").anonymous()
 //                .antMatchers("/hwcloud/upload/videoUrl").anonymous()
+                .antMatchers("/store/express/expressNotify").anonymous()
                 .antMatchers("/common/uploadWang").anonymous()
                 .antMatchers("/common/upload").anonymous()
                 .antMatchers("/profile/**").anonymous()

+ 14 - 0
fs-admin/src/main/java/com/fs/store/controller/FsExpressController.java

@@ -5,6 +5,10 @@ import java.util.List;
 import com.fs.common.core.domain.R;
 import com.fs.company.domain.Company;
 import com.fs.company.service.ICompanyService;
+import com.fs.store.dto.ExpressNotifyDTO;
+import com.fs.store.dto.ExpressResultDTO;
+import com.fs.store.service.IFsStoreOrderService;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -40,6 +44,9 @@ public class FsExpressController extends BaseController
     @Autowired
     private ICompanyService companyService;
 
+    @Autowired
+    private IFsStoreOrderService orderService;
+
     /**
      * 查询快递公司列表
      */
@@ -131,4 +138,11 @@ public class FsExpressController extends BaseController
         List<Long> list = companyService.selectCompanyByOmsCode(omsCode);
         return R.ok().put("data2",list);
     }
+
+    @ApiOperation("物流信息回调")
+    @PostMapping(path = "/expressNotify" )
+    public ExpressResultDTO expressNotify(ExpressNotifyDTO notifyDTO) throws Exception
+    {
+        return orderService.updateDeliveryItem(notifyDTO);
+    }
 }

+ 5 - 5
fs-admin/src/main/java/com/fs/user/FsUserAdminController.java

@@ -37,12 +37,12 @@ public class FsUserAdminController extends BaseController {
     @PostMapping("/list")
     @ApiOperation("会员列表(与移动端使用的相同查询)")
     public R pageList(@RequestBody FsUserPageListParam param) {
-        PageHelper.startPage(param.getPageNum(), param.getPageSize());
-        List<FsUserPageListVO> list = fsUserService.selectFsUserPageList(param);
-        PageInfo<FsUserPageListVO> pageInfo = new PageInfo<>(list);
+//        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+        TableDataInfo tableDataInfo = fsUserService.selectFsUserPageListNew(param);
+//        PageInfo<FsUserPageListVO> pageInfo = new PageInfo<>(list);
         Map<String, Object> result = new HashMap<>();
-        result.put("rows", pageInfo.getList());
-        result.put("total", pageInfo.getTotal());
+        result.put("rows", tableDataInfo.getRows());
+        result.put("total", tableDataInfo.getTotal());
         return R.ok(result);
     }
 

+ 1 - 1
fs-common/pom.xml

@@ -117,7 +117,7 @@
         <dependency>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>
-            <version>5.3.3</version>
+            <version>5.8.22</version> <!-- 强制指定最新版本 -->
         </dependency>
         <dependency>
             <groupId>org.projectlombok</groupId>

+ 1 - 1
fs-common/src/main/java/com/fs/common/utils/TimeUtils.java

@@ -230,7 +230,7 @@ public class TimeUtils
         }
 
         public Map<String, Object> toMap() {
-            return BeanUtil.beanToMap(this);
+            return BeanUtil.beanToMap(this, false, true);
         }
 
         public String getSqlDateFormat() {

+ 1 - 0
fs-company/src/main/java/com/fs/course/controller/FsCourseWatchLogController.java

@@ -184,6 +184,7 @@ public class FsCourseWatchLogController extends BaseController
     {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         param.setCompanyId( loginUser.getCompany().getCompanyId());
+        param.setCompanyUserId(loginUser.getUser().getUserId());
         List<FsCourseWatchLogListVO> list = fsCourseWatchLogService.selectFsCourseWatchLogListVONew(param);
         TableDataInfo rspData = new TableDataInfo();
         rspData.setCode(HttpStatus.SUCCESS);

+ 11 - 0
fs-company/src/main/java/com/fs/qw/QwExternalContactController.java

@@ -17,6 +17,8 @@ import com.fs.crm.service.ICrmCustomerService;
 import com.fs.crm.vo.CrmMyCustomerListQueryVO;
 import com.fs.core.security.LoginUser;
 import com.fs.core.web.service.TokenService;
+import com.fs.qw.dto.GetQwRepeatDataDTO;
+import com.fs.qw.vo.GetQwRepeatDataVO;
 import com.fs.store.service.IFsUserService;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.param.*;
@@ -73,6 +75,15 @@ public class QwExternalContactController extends BaseController
         List<QwExternalContactVO> list = qwExternalContactService.selectQwExternalContactListVO(qwExternalContact);
         return getDataTable(list);
     }
+
+    /**
+     * 企微获取重粉数据
+     */
+    @PostMapping("/qwRepeatData")
+    public R getQwRepeatData(@RequestBody GetQwRepeatDataDTO dto){
+        List<GetQwRepeatDataVO> qwRepeatData = qwExternalContactService.getQwRepeatData(dto);
+        return R.ok().put("data",qwRepeatData);
+    }
     /**
      * 同步企业微信客户
      */

+ 5 - 0
fs-company/src/main/java/com/fs/qw/vo/QwExternalContactVO.java

@@ -111,4 +111,9 @@ public class QwExternalContactVO {
     private Long level;
     @Excel(name = "等级升降")
     private Long levelType;
+
+    /**
+     * 是否重粉
+     */
+    private Integer isRepeat;
 }

+ 2 - 0
fs-company/src/main/java/com/fs/qw/vo/QwWatchLogStatisticsListVO.java

@@ -10,6 +10,8 @@ public class QwWatchLogStatisticsListVO {
     private Long id;
     private String qwUserName;
     private String companyUserName;
+    private Long companyUserId;
+    private Long companyId;
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date createTime;
     private Long line;//进线数

+ 11 - 9
fs-company/src/main/java/com/fs/user/FsUserAdminController.java

@@ -6,6 +6,7 @@ import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.utils.ServletUtils;
+import com.fs.company.cache.ICompanyUserCacheService;
 import com.fs.core.security.LoginUser;
 import com.fs.core.web.service.TokenService;
 import com.fs.store.param.h5.FsUserPageListParam;
@@ -32,6 +33,9 @@ public class FsUserAdminController extends BaseController {
     @Autowired
     private IFsUserService fsUserService;
 
+    @Autowired
+    private ICompanyUserCacheService companyUserCacheService;
+
     @Autowired
     private TokenService tokenService;
 
@@ -39,18 +43,16 @@ public class FsUserAdminController extends BaseController {
     @PostMapping("/list")
     @ApiOperation("会员列表(与移动端使用的相同查询)")
     public TableDataInfo pageList(@RequestBody FsUserPageListParam param) {
+//        startPage();
+
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         param.setCompanyId(loginUser.getCompany().getCompanyId());
-        param.setPcLoginUserId(loginUser.getUser().getUserId());
+        param.setCompanyUserId(String.valueOf(loginUser.getUser().getUserId()));
 
-        List<FsUserPageListVO> list = fsUserService.selectFsUserPageListNew(param);
-        Long total = fsUserService.selectFsUserCount(param);
-        TableDataInfo rspData = new TableDataInfo();
-        rspData.setCode(HttpStatus.SUCCESS);
-        rspData.setMsg("查询成功");
-        rspData.setRows(list);
-        rspData.setTotal(total);
-        return rspData;
+        if(param.getCompanyUserId() == null) {
+            throw new IllegalArgumentException("当前销售不存在!");
+        }
+        return fsUserService.selectFsUserPageListNew(param);
     }
 
     @PostMapping("/auditUser")

+ 42 - 0
fs-qw-task/src/main/java/com/fs/app/task/UserCourseWatchCountTask.java

@@ -0,0 +1,42 @@
+package com.fs.app.task;
+
+import com.fs.common.core.redis.RedisCache;
+import com.fs.course.mapper.FsCourseWatchLogMapper;
+import com.fs.course.service.IFsCourseWatchLogService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+public class UserCourseWatchCountTask {
+
+    @Autowired
+    private FsCourseWatchLogMapper courseWatchLogMapper;
+
+    @Autowired
+    RedisCache redisCache;
+
+    @Autowired
+    private IFsCourseWatchLogService courseWatchLogService;
+
+
+    /**
+     * 每天两点进行会员看课统计
+     */
+    @Scheduled(cron = "0 0 2 * * ?")  // 2点0分0秒执行
+    public void userCourseCountTask() {
+        try {
+            log.info("会员看课统计任务执行----------开始");
+            //
+
+            log.info("会员看课统计任务执行----------结束");
+        } catch (Exception e) {
+            log.error("会员看课统计任务执行----------定时任务执行失败", e);
+        }
+
+    }
+
+
+}

+ 5 - 5
fs-service-system/pom.xml

@@ -40,11 +40,11 @@
             <version>1.5.21</version>
         </dependency>
 
-        <dependency>
-            <groupId>cn.hutool</groupId>
-            <artifactId>hutool-all</artifactId>
-            <version>5.3.7</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>cn.hutool</groupId>-->
+<!--            <artifactId>hutool-all</artifactId>-->
+<!--            <version>5.3.7</version>-->
+<!--        </dependency>-->
         <!-- oss -->
         <dependency>
             <groupId>com.qiniu</groupId>

+ 11 - 0
fs-service-system/src/main/java/com/fs/company/cache/ICompanyTagCacheService.java

@@ -0,0 +1,11 @@
+package com.fs.company.cache;
+
+import com.fs.company.dto.CompanyIdAndUserDTO;
+
+import java.util.Map;
+
+public interface ICompanyTagCacheService {
+    String findUserTagByUserId(Long userId);
+
+    Map<Long, String> queryAllTagMap();
+}

+ 9 - 0
fs-service-system/src/main/java/com/fs/company/cache/ICompanyUserCacheService.java

@@ -12,6 +12,7 @@ import com.fs.qw.vo.QwUserVO;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 ;
 
@@ -29,5 +30,13 @@ public interface ICompanyUserCacheService {
      * @return 物业公司管理员信息
      */
     public CompanyUser selectCompanyUserById(Long userId);
+    public String selectCompanyUserNameUserById(Long userId);
+
+    /**
+     * 查询当前用户所有的下级销售
+     * @param companyUserId
+     * @return String
+     */
+    public Set<Long> selectUserAllCompanyUserId(Long companyUserId);
 
 }

+ 36 - 0
fs-service-system/src/main/java/com/fs/company/cache/impl/CompanyTagCacheServiceImpl.java

@@ -0,0 +1,36 @@
+package com.fs.company.cache.impl;
+
+import com.fs.company.cache.ICompanyTagCacheService;
+import com.fs.company.service.ICompanyTagService;
+import com.github.benmanes.caffeine.cache.Cache;
+import com.github.benmanes.caffeine.cache.Caffeine;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@Service
+public class CompanyTagCacheServiceImpl implements ICompanyTagCacheService {
+
+    @Autowired
+    private ICompanyTagService companyTagService;
+    private static final Cache<Long,String> COMPANY_TAG_CACHE = Caffeine.newBuilder()
+            .maximumSize(1000)
+            .expireAfterWrite(5, TimeUnit.MINUTES)
+            .build();
+
+    private static final Cache<Long,Map<Long, String>> COMPANY_USER_TAG_CACHE = Caffeine.newBuilder()
+            .maximumSize(1000)
+            .expireAfterWrite(5, TimeUnit.MINUTES)
+            .build();
+    @Override
+    public String findUserTagByUserId(Long key) {
+        return COMPANY_TAG_CACHE.get(key,e-> companyTagService.findUserTagByUserId(key));
+    }
+
+    @Override
+    public Map<Long, String> queryAllTagMap() {
+        return COMPANY_USER_TAG_CACHE.get(0L, e-> companyTagService.queryAllTagMap());
+    }
+}

+ 32 - 0
fs-service-system/src/main/java/com/fs/company/cache/impl/CompanyUserCacheServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fs.company.cache.impl;
 
+import com.fasterxml.jackson.databind.util.ArrayIterator;
 import com.fs.company.cache.ICompanyCacheService;
 import com.fs.company.cache.ICompanyUserCacheService;
 import com.fs.company.domain.Company;
@@ -13,7 +14,11 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
 
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 @Service
 @Slf4j
@@ -26,8 +31,35 @@ public class CompanyUserCacheServiceImpl implements ICompanyUserCacheService {
             .maximumSize(1000)
             .expireAfterWrite(3, TimeUnit.MINUTES)
             .build();
+
+    private static final Cache<Long,Set<Long>> COMPANY_USER_CACHE = Caffeine.newBuilder()
+            .maximumSize(1000)
+            .expireAfterWrite(5, TimeUnit.MINUTES)
+            .build();
+
+    private static final Cache<Long,String> COMPANY_USER_NAME_CACHE = Caffeine.newBuilder()
+            .maximumSize(1000)
+            .expireAfterWrite(5, TimeUnit.MINUTES)
+            .build();
+
+
     @Override
     public CompanyUser selectCompanyUserById(Long userId) {
         return USER_CACHE.get(userId,e-> companyUserService.selectCompanyUserByUserId(userId));
     }
+
+    @Override
+    public String selectCompanyUserNameUserById(Long userId) {
+        return COMPANY_USER_NAME_CACHE.get(userId,e-> companyUserService.selectCompanyUserNameUserById(userId));
+    }
+
+    @Override
+    public Set<Long> selectUserAllCompanyUserId(Long companyUserId) {
+        return COMPANY_USER_CACHE.get(companyUserId,e->{
+            List<Long> longs = companyUserService.selectUserAllCompanyUserId(companyUserId);
+            Set<Long> set = new HashSet<>(longs);
+            set.add(companyUserId);
+            return set;
+        });
+    }
 }

+ 13 - 0
fs-service-system/src/main/java/com/fs/company/dto/CompanyIdAndUserDTO.java

@@ -0,0 +1,13 @@
+package com.fs.company.dto;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+@EqualsAndHashCode
+@Data
+public class CompanyIdAndUserDTO implements Serializable {
+    private Long companyId;
+    private Long companyUserId;
+}

+ 14 - 8
fs-service-system/src/main/java/com/fs/company/mapper/CompanyTagMapper.java

@@ -4,19 +4,21 @@ import java.util.List;
 import java.util.Map;
 
 import com.fs.company.domain.CompanyTag;
+import com.fs.company.dto.CompanyIdAndUserDTO;
+import org.apache.ibatis.annotations.MapKey;
 import org.apache.ibatis.annotations.Param;
 
 /**
  * companyMapper接口
- * 
+ *
  * @author fs
  * @date 2025-04-02
  */
-public interface CompanyTagMapper 
+public interface CompanyTagMapper
 {
     /**
      * 查询company
-     * 
+     *
      * @param tagId companyID
      * @return company
      */
@@ -24,7 +26,7 @@ public interface CompanyTagMapper
 
     /**
      * 查询company列表
-     * 
+     *
      * @param companyTag company
      * @return company集合
      */
@@ -32,7 +34,7 @@ public interface CompanyTagMapper
 
     /**
      * 新增company
-     * 
+     *
      * @param companyTag company
      * @return 结果
      */
@@ -40,7 +42,7 @@ public interface CompanyTagMapper
 
     /**
      * 修改company
-     * 
+     *
      * @param companyTag company
      * @return 结果
      */
@@ -48,7 +50,7 @@ public interface CompanyTagMapper
 
     /**
      * 删除company
-     * 
+     *
      * @param tagId companyID
      * @return 结果
      */
@@ -56,7 +58,7 @@ public interface CompanyTagMapper
 
     /**
      * 批量删除company
-     * 
+     *
      * @param tagIds 需要删除的数据ID
      * @return 结果
      */
@@ -75,4 +77,8 @@ public interface CompanyTagMapper
      * @return  list
      */
     List<CompanyTag> selectCompanyTagListByUserId(@Param("userId") Long userId);
+
+    String findUserTagByUserId(@Param("userId") Long userId);
+    @MapKey("tag_id")
+    Map<Long,String> queryAllTagMap();
 }

+ 4 - 0
fs-service-system/src/main/java/com/fs/company/mapper/CompanyUserMapper.java

@@ -287,4 +287,8 @@ public interface CompanyUserMapper
      * @return  list
      */
     List<OptionsVO> selectCompanyUserListByMap(@Param("params") Map<String, Object> params);
+
+    List<Long> selectUserAllCompanyUserId(@Param("companyUserId") Long companyUserId);
+
+    String selectCompanyUserNameUserById(@Param("userId") Long userId);
 }

+ 14 - 8
fs-service-system/src/main/java/com/fs/company/service/ICompanyTagService.java

@@ -4,18 +4,20 @@ import java.util.List;
 import java.util.Map;
 
 import com.fs.company.domain.CompanyTag;
+import com.fs.company.dto.CompanyIdAndUserDTO;
+import org.apache.ibatis.annotations.MapKey;
 
 /**
  * companyService接口
- * 
+ *
  * @author fs
  * @date 2025-04-02
  */
-public interface ICompanyTagService 
+public interface ICompanyTagService
 {
     /**
      * 查询company
-     * 
+     *
      * @param tagId companyID
      * @return company
      */
@@ -23,7 +25,7 @@ public interface ICompanyTagService
 
     /**
      * 查询company列表
-     * 
+     *
      * @param companyTag company
      * @return company集合
      */
@@ -31,7 +33,7 @@ public interface ICompanyTagService
 
     /**
      * 新增company
-     * 
+     *
      * @param companyTag company
      * @return 结果
      */
@@ -39,7 +41,7 @@ public interface ICompanyTagService
 
     /**
      * 修改company
-     * 
+     *
      * @param companyTag company
      * @return 结果
      */
@@ -47,7 +49,7 @@ public interface ICompanyTagService
 
     /**
      * 批量删除company
-     * 
+     *
      * @param tagIds 需要删除的companyID
      * @return 结果
      */
@@ -55,7 +57,7 @@ public interface ICompanyTagService
 
     /**
      * 删除company信息
-     * 
+     *
      * @param tagId companyID
      * @return 结果
      */
@@ -73,4 +75,8 @@ public interface ICompanyTagService
      * @return list
      */
     List<CompanyTag> selectCompanyTagListByMap(Map<String, Object> params);
+
+    Map<Long,String> queryAllTagMap();
+
+    String findUserTagByUserId(Long key);
 }

+ 3 - 0
fs-service-system/src/main/java/com/fs/company/service/ICompanyUserService.java

@@ -31,6 +31,9 @@ public interface ICompanyUserService {
      * @return 物业公司管理员信息
      */
     public CompanyUser selectCompanyUserById(Long userId);
+    public String selectCompanyUserNameUserById(Long userId);
+
+    public List<Long> selectUserAllCompanyUserId(Long companyUserId);
 
     /**
      * 查询物业公司管理员信息列表

+ 19 - 8
fs-service-system/src/main/java/com/fs/company/service/impl/CompanyTagServiceImpl.java

@@ -5,6 +5,7 @@ import java.util.List;
 import java.util.Map;
 
 import com.fs.common.utils.DateUtils;
+import com.fs.company.dto.CompanyIdAndUserDTO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.fs.company.mapper.CompanyTagMapper;
@@ -13,19 +14,19 @@ import com.fs.company.service.ICompanyTagService;
 
 /**
  * companyService业务层处理
- * 
+ *
  * @author fs
  * @date 2025-04-02
  */
 @Service
-public class CompanyTagServiceImpl implements ICompanyTagService 
+public class CompanyTagServiceImpl implements ICompanyTagService
 {
     @Autowired
     private CompanyTagMapper companyTagMapper;
 
     /**
      * 查询company
-     * 
+     *
      * @param tagId companyID
      * @return company
      */
@@ -37,7 +38,7 @@ public class CompanyTagServiceImpl implements ICompanyTagService
 
     /**
      * 查询company列表
-     * 
+     *
      * @param companyTag company
      * @return company
      */
@@ -49,7 +50,7 @@ public class CompanyTagServiceImpl implements ICompanyTagService
 
     /**
      * 新增company
-     * 
+     *
      * @param companyTag company
      * @return 结果
      */
@@ -62,7 +63,7 @@ public class CompanyTagServiceImpl implements ICompanyTagService
 
     /**
      * 修改company
-     * 
+     *
      * @param companyTag company
      * @return 结果
      */
@@ -74,7 +75,7 @@ public class CompanyTagServiceImpl implements ICompanyTagService
 
     /**
      * 批量删除company
-     * 
+     *
      * @param tagIds 需要删除的companyID
      * @return 结果
      */
@@ -86,7 +87,7 @@ public class CompanyTagServiceImpl implements ICompanyTagService
 
     /**
      * 删除company信息
-     * 
+     *
      * @param tagId companyID
      * @return 结果
      */
@@ -117,4 +118,14 @@ public class CompanyTagServiceImpl implements ICompanyTagService
     public List<CompanyTag> selectCompanyTagListByMap(Map<String, Object> params) {
         return companyTagMapper.selectCompanyTagListByMap(params);
     }
+
+    @Override
+    public Map<Long, String> queryAllTagMap() {
+        return companyTagMapper.queryAllTagMap();
+    }
+
+    @Override
+    public String findUserTagByUserId(Long key) {
+        return companyTagMapper.findUserTagByUserId(key);
+    }
 }

+ 10 - 0
fs-service-system/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java

@@ -74,6 +74,16 @@ public class CompanyUserServiceImpl implements ICompanyUserService
         return companyUserMapper.selectCompanyUserById(userId);
     }
 
+    @Override
+    public String selectCompanyUserNameUserById(Long userId) {
+        return companyUserMapper.selectCompanyUserNameUserById(userId);
+    }
+
+    @Override
+    public List<Long> selectUserAllCompanyUserId(Long companyUserId) {
+        return companyUserMapper.selectUserAllCompanyUserId(companyUserId);
+    }
+
     /**
      * 查询物业公司管理员信息列表
      *

+ 4 - 0
fs-service-system/src/main/java/com/fs/course/domain/FsCourseLink.java

@@ -2,6 +2,7 @@ package com.fs.course.domain;
 
 import com.fs.common.annotation.Excel;
 import com.fs.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -62,4 +63,7 @@ public class FsCourseLink extends BaseEntity
     @Excel(name = "营期id")
     private Long periodId;
 
+    @ApiModelProperty(value = "营期课程id")
+    private Long id;
+
 }

+ 4 - 0
fs-service-system/src/main/java/com/fs/course/domain/FsCourseRealLink.java

@@ -1,5 +1,6 @@
 package com.fs.course.domain;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -38,4 +39,7 @@ public class FsCourseRealLink implements Serializable
 
     private Long periodId;
 
+    @ApiModelProperty(value = "营期课程id")
+    private Long id;
+
 }

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

@@ -34,4 +34,7 @@ public class FsCourseLinkCreateParam {
 
     private Long periodId;
 
+    @ApiModelProperty(value = "营期课程id")
+    private Long id;
+
 }

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

@@ -35,4 +35,7 @@ public class FsCourseSortLinkParam {
     @ApiModelProperty(value = "营期id")
     private Long periodId;
 
+    @ApiModelProperty(value = "营期课程id")
+    private Long id;
+
 }

+ 2 - 2
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -747,7 +747,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         }
 
         if(periodDays != null && periodDays.getLastJoinTime() !=null && LocalDateTime.now().isAfter(periodDays.getLastJoinTime())) {
-            R.error(403,"已超过领取红包时间");
+            return R.error(403,"已超过领取红包时间");
         }
 
         // 确定红包金额
@@ -987,7 +987,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             periodDays = fsUserCoursePeriodDays.get(0);
         }
         if(periodDays.getStatus() != 1){
-            ResponseResult.fail(403, "当前课程未开始或已结束,暂不能看课");
+            return ResponseResult.fail(403, "当前课程未开始或已结束,暂不能看课");
         }
 
         String json = configService.selectConfigByKey("course.config");

+ 6 - 2
fs-service-system/src/main/java/com/fs/kingbos/domian/KingbosOrderData.java

@@ -13,7 +13,7 @@ public class KingbosOrderData {
     // 订单来源
     private String cordersource;
     // 订单下单时间
-    private Date dorder_date;
+    private String dorder_date;
     // 店铺买家编号
     private String cshop_buyer_id;
     // 平台类型
@@ -41,7 +41,7 @@ public class KingbosOrderData {
     // 物流成本
     private BigDecimal fpostcost;
     // 最后更新时间
-    private Date dmodified;
+    private String dmodified;
     // 收件人(省)
     private String creceiver_state;
     // 收件人(城市)
@@ -64,4 +64,8 @@ public class KingbosOrderData {
     private String cwarehouse_code;
     // 仓库名称
     private String cwarehouse_name;
+    //货到付款
+    private Integer bis_cod;
+    //代收金额
+    private BigDecimal fshouldpaymoney;
 }

+ 1 - 1
fs-service-system/src/main/java/com/fs/kingbos/domian/KingbosOrderResponse.java

@@ -4,7 +4,7 @@ import lombok.Data;
 
 @Data
 public class KingbosOrderResponse {
-    private Boolean isSuccess; //true:请求成功;false:请求失败;
+    private Boolean IsSuccess; //true:请求成功;false:请求失败;
     private String cbilid; //平台单号
     private String errmsg;  //错误信息
 }

+ 47 - 0
fs-service-system/src/main/java/com/fs/kingbos/enums/OrderStatusEnum.java

@@ -0,0 +1,47 @@
+package com.fs.kingbos.enums;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public enum OrderStatusEnum {
+
+    /**
+     * 发货失败
+     */
+    FAILURE("Failure", "发货失败"),
+
+    /**
+     * 未发货
+     */
+    NO_DELIVERED("NoDelivered", "未发货"),
+
+    /**
+     * 发货中
+     */
+    DELIVERING("Delivering", "发货中"),
+
+    /**
+     * 已发货
+     */
+    SENT("Sent", "已发货"),
+
+    /**
+     * 已取消
+     */
+    CANCELLED("Cancelled", "已取消"),
+
+    /**
+     * 已退货
+     */
+    RETURN("Return", "已退货");
+
+    private String code;
+    private String desc;
+
+}

+ 1 - 1
fs-service-system/src/main/java/com/fs/kingbos/service/K9OrderService.java

@@ -11,5 +11,5 @@ public interface K9OrderService {
 
     KingbosOrderResponse refundOrder(KingbosRefundOrderRequest request);
 
-    void createOmsOrder(Long orderId) throws ParseException;
+    void createOmsOrder(Long orderId,String orderStatus);
 }

+ 153 - 57
fs-service-system/src/main/java/com/fs/kingbos/service/impl/K9OrderServiceImpl.java

@@ -5,8 +5,10 @@ import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.fs.common.config.FSSysConfig;
+import com.fs.common.exception.ServiceException;
 import com.fs.common.utils.StringUtils;
 import com.fs.kingbos.domian.*;
+import com.fs.kingbos.enums.OrderStatusEnum;
 import com.fs.kingbos.service.K9OrderService;
 import com.fs.kingbos.util.SignUtil;
 import com.fs.kingbos.util.UrlUtil;
@@ -16,19 +18,28 @@ import com.fs.store.dto.FsStoreCartDTO;
 import com.fs.store.mapper.FsStoreOrderMapper;
 import com.fs.store.mapper.FsStoreProductMapper;
 import com.fs.store.service.IFsStoreOrderItemService;
+import lombok.extern.slf4j.Slf4j;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+
 import java.math.BigDecimal;
 import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
+
+import static com.fs.kingbos.enums.OrderStatusEnum.CANCELLED;
+import static com.fs.kingbos.enums.OrderStatusEnum.NO_DELIVERED;
 
 @Service
+@Slf4j
 public class K9OrderServiceImpl implements K9OrderService {
     public final static Logger logger = LoggerFactory.getLogger(K9OrderServiceImpl.class);
     @Autowired
@@ -46,11 +57,12 @@ public class K9OrderServiceImpl implements K9OrderService {
         param.set("data", request.getData());
         param.set("d1_data", request.getD1_data());
         String timeStep = System.currentTimeMillis() + "";
+        logger.info("zyp \n【金博网络订单推送参数】:"+param);
         String sign = SignUtil.sign(param.toString(),sysConfig.getKingbosSecret(), sysConfig.getKingbosan(), timeStep);
         String url = UrlUtil.getUrl(sysConfig.getKingbosUrl(),sign, timeStep);
         String json = param.toString();
         String result = HttpUtil.post(url, json);
-        logger.info("zyp \n【金博网络订单】:"+result);
+        logger.info("zyp \n【金博网络订单推送返回】:"+result);
         KingbosOrderResponse response = JSONUtil.toBean(result, KingbosOrderResponse.class);
         return response;
     }
@@ -74,79 +86,163 @@ public class K9OrderServiceImpl implements K9OrderService {
 
     @Override
     @Transactional
-    public void createOmsOrder(Long orderId) throws ParseException {
-        FsStoreOrder order=fsStoreOrderMapper.selectFsStoreOrderById(orderId);
-        if(StringUtils.isEmpty(order.getExtendOrderId())&&order.getStatus()!=1){
-            return;
+    public void createOmsOrder(Long orderId,String orderStatus){
+        logger.info("【金博网络订单】开始创建订单,订单ID: {}", orderId);
+        try {
+            // 1. 获取订单信息并验证
+            FsStoreOrder order = fsStoreOrderMapper.selectFsStoreOrderById(orderId);
+            logger.info("【金博网络订单】订单信息获取成功,订单号: {}", order.getOrderCode());
+
+            // 2. 构建金博订单数据
+            KingbosOrderData data = buildKingbosOrderData(order,orderStatus);
+            logger.info("【金博网络订单】订单数据构建完成,金博订单号: {}", data.getCo_id());
+
+            // 3. 构建订单明细数据
+            List<KingbosOrderD1Data> d1Datas = buildOrderDetailData(order, data.getCdo_id());
+            logger.info("【金博网络订单】订单明细数据构建完成,明细数量: {}", d1Datas.size());
+
+            // 4. 发送订单请求
+            KingbosOrderResponse response = sendOrderRequest(data, d1Datas);
+            if (response.getIsSuccess()){
+                FsStoreOrder order1 = new FsStoreOrder();
+                order1.setId(order.getId());
+                order1.setExtendOrderId(response.getCbilid());
+                fsStoreOrderMapper.updateFsStoreOrder(order1);
+                logger.info("【金博网络订单】订单创建完成,订单ID: {}", orderId);
+            }else {
+                logger.error("【金博网络订单】创建订单失败,订单ID: {}, 错误信息: {}", orderId, response.getErrmsg());
+            }
+        } catch (Exception e) {
+            logger.error("【金博网络订单】创建订单失败,订单ID: {}, 错误信息: {}", orderId, e.getMessage(), e);
+            throw e;
         }
-        //组装金博data
+    }
+
+
+    private KingbosOrderData buildKingbosOrderData(FsStoreOrder order,String orderStatus) {
+        logger.debug("【金博网络订单】开始构建订单数据,订单号: {}", order.getOrderCode());
         KingbosOrderData data = new KingbosOrderData();
-        data.setCordersource("中康未来智慧药房");
-        data.setDorder_date(order.getCreateTime());
-        data.setCshop_buyer_id("zkwlzhyf100");//传固定值不可变
-        data.setCplatformtype("zkwlzhyfminiapp");
-        data.setCshop_id("zkwlzhyf2024");//中康未来智慧药房
-        data.setCshop_name("中康未来智慧药房");
+        // 设置基础信息
+        data.setCordersource("MALL");
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        data.setDorder_date(sdf.format(order.getCreateTime()));
+//        data.setCshop_buyer_id("zk2025");
+        data.setCplatformtype("99");
+        data.setCshop_id("zk2025");
+        data.setCshop_name("自建商城");
+        String orderSn = "";
+        // 设置订单编号
+        if (orderStatus.equals(NO_DELIVERED.getCode())){
+            orderSn= IdUtil.getSnowflake(0, 0).nextIdStr();
+        }else if (orderStatus.equals(CANCELLED.getCode())){
+            orderSn = order.getExtendOrderId();
+        }
+
         data.setCso_id(order.getOrderCode());
-        String orderSn = IdUtil.getSnowflake(0, 0).nextIdStr();
         data.setCo_id(orderSn);
         data.setCdo_id(orderSn);
+
+        // 设置金额信息
         data.setFpay_amount(order.getPayPrice());
         data.setFpaid_amount(order.getPayMoney());
         data.setFfreight(order.getTotalPostage());
         data.setFfree_amount(order.getCouponPrice());
-        data.setCstatus("待发货");
         data.setFpostcost(BigDecimal.ZERO);
-        data.setDmodified(new Date());
-        String[] address=order.getUserAddress().split(" ");
+
+        // 设置状态和时间
+        data.setCstatus(orderStatus);//未发货
+        data.setDmodified(sdf.format(order.getUpdateTime()));
+
+        // 设置收货信息
+        setReceiverInfo(data, order);
+
+        // 设置仓库信息
+        data.setCwarehouse_code(sysConfig.getCwarehouseCode());
+        data.setCwarehouse_name(sysConfig.getCwarehouseName());
+
+        // 设置货到付款信息
+        if (!order.getPayType().equals("1")) {
+            data.setBis_cod(1);
+            data.setFshouldpaymoney(order.getDeliveryPayMoney());
+        }
+
+        return data;
+    }
+
+    private void setReceiverInfo(KingbosOrderData data, FsStoreOrder order) {
+        logger.debug("【金博网络订单】开始处理收货信息,订单号: {}", order.getOrderCode());
+        String[] address = order.getUserAddress().split(" ");
+        if (address.length < 3) {
+            logger.error("【金博网络订单】收货地址格式不正确,订单号: {}, 地址: {}", order.getOrderCode(), order.getUserAddress());
+            throw new ServiceException("收货地址格式不正确");
+        }
+
         data.setCreceiver_state(address[0]);
         data.setCreceiver_city(address[1]);
         data.setCreceiver_district(address[2]);
-        //处理地址多空隔问题
-        if(address.length>3){
-            StringBuffer addrs=new StringBuffer();
-            for(int i=3;i<address.length;i++){
-                addrs.append(address[i]);
-            }
-            data.setCreceiver_address(addrs.toString());
-        }
-        else if(address.length==3){
-            data.setCreceiver_address(address[2]);
-        }
-        //处理地址字符问题
-        data.setCreceiver_address(data.getCreceiver_address().replace("+","加"));
-        data.setCreceiver_address(data.getCreceiver_address().replace("\n",""));
+
+        // 处理详细地址
+        String detailAddress = address.length > 3 ?
+            String.join("", Arrays.copyOfRange(address, 3, address.length)) :
+            address[2];
+
+        // 处理特殊字符
+        detailAddress = detailAddress.replace("+", "加")
+                                   .replace("\n", "");
+
+        data.setCreceiver_address(detailAddress);
         data.setCreceiver_name(order.getRealName());
         data.setCreceiver_mobile(order.getUserPhone());
-        data.setCexpress_name(order.getDeliveryName());
-        data.setCexpress_code("SF");
-        data.setCwarehouse_code(sysConfig.getCwarehouseCode());
-        data.setCwarehouse_name(sysConfig.getCwarehouseName());
-        List<KingbosOrderD1Data> d1Datas = new ArrayList<>();
-        FsStoreOrderItem itemMap=new FsStoreOrderItem();
-        itemMap.setOrderId(order.getId());
-        List<FsStoreOrderItem> orderItems=storeOrderItemService.selectFsStoreOrderItemList(itemMap);
-        for (FsStoreOrderItem orderItem: orderItems){
-            FsStoreCartDTO cartDTO= JSONUtil.toBean(orderItem.getJsonInfo(),FsStoreCartDTO.class);
-            KingbosOrderD1Data item = new KingbosOrderD1Data();
-            item.setCdo_id(data.getCdo_id());
-            item.setCo_id(data.getCo_id());
-            item.setCsku_id(cartDTO.getBarCode());
-            item.setCgoodsid(cartDTO.getBarCode());
-            item.setCname(cartDTO.getProductName());
-            item.setCshop_sku_id(cartDTO.getBarCode());
-            item.setIqty(new BigDecimal(orderItem.getNum()));
-            item.setFprice(cartDTO.getPrice());
-            item.setFamount(new BigDecimal(orderItem.getNum()).multiply(cartDTO.getPrice()));
-            item.setCordersource(data.getCordersource());
-            item.setIsreturn(0);
-            item.setFpromoamount(BigDecimal.ZERO);
-            d1Datas.add(item);
-        }
+
+    }
+
+    private List<KingbosOrderD1Data> buildOrderDetailData(FsStoreOrder order, String orderId) {
+        logger.debug("【金博网络订单】开始构建订单明细,订单号: {}", order.getOrderCode());
+        FsStoreOrderItem query = new FsStoreOrderItem();
+        query.setOrderId(order.getId());
+        List<FsStoreOrderItem> orderItems = storeOrderItemService.selectFsStoreOrderItemList(query);
+
+        List<KingbosOrderD1Data> d1Datas = orderItems.stream()
+            .map(item -> buildOrderDetailItem(item, orderId))
+            .collect(Collectors.toList());
+
+        logger.debug("【金博网络订单】订单明细构建完成,订单号: {}, 明细数量: {}", order.getOrderCode(), d1Datas.size());
+        return d1Datas;
+    }
+
+    private KingbosOrderD1Data buildOrderDetailItem(FsStoreOrderItem orderItem, String orderId) {
+        FsStoreCartDTO cartDTO = JSONUtil.toBean(orderItem.getJsonInfo(), FsStoreCartDTO.class);
+        BigDecimal quantity = new BigDecimal(orderItem.getNum());
+
+        KingbosOrderD1Data item = new KingbosOrderD1Data();
+        item.setCdo_id(orderId);
+        item.setCo_id(orderId);
+        item.setCsku_id(cartDTO.getBarCode());
+        item.setCgoodsid(cartDTO.getBarCode());
+        item.setCname(cartDTO.getProductName());
+        item.setCshop_sku_id(cartDTO.getSku());
+        item.setIqty(quantity);
+        item.setFprice(cartDTO.getPrice());
+        item.setFamount(quantity.multiply(cartDTO.getPrice()));
+        item.setCordersource("MALL");
+        item.setFpromoamount(BigDecimal.ZERO);
+
+        return item;
+    }
+
+    private KingbosOrderResponse sendOrderRequest(KingbosOrderData data, List<KingbosOrderD1Data> d1Datas) {
+        logger.info("【金博网络订单】开始发送订单请求,金博订单号: {}", data.getCo_id());
         KingbosOrderRequest request = new KingbosOrderRequest();
         request.setData(data);
         request.setD1_data(d1Datas);
-        KingbosOrderResponse response = this.addOrder(request);
-        logger.info("\n【金博网络订单】: addOrder  res:{}", response);
+
+        try {
+            KingbosOrderResponse response = this.addOrder(request);
+            logger.info("【金博网络订单】订单请求发送成功,金博订单号: {}, 响应结果: {}", data.getCo_id(), response);
+            return response;
+        } catch (Exception e) {
+            logger.error("【金博网络订单】订单请求发送失败,金博订单号: {}, 错误信息: {}", data.getCo_id(), e.getMessage(), e);
+            throw e;
+        }
     }
 }

+ 8 - 0
fs-service-system/src/main/java/com/fs/qw/cache/IQwExternalContactCacheService.java

@@ -8,4 +8,12 @@ public interface IQwExternalContactCacheService {
      * @return 企业微信客户
      */
     String selectQwExternalContactById(Long id);
+
+    /**
+     * 查询是否宠粉
+     *
+     * @param id 企业微信客户主键
+     * @return 企业微信客户
+     */
+    Integer selectQwIsRepeat(Long id);
 }

+ 12 - 0
fs-service-system/src/main/java/com/fs/qw/cache/impl/QwExternalContactCacheServiceImpl.java

@@ -23,6 +23,11 @@ public class QwExternalContactCacheServiceImpl implements IQwExternalContactCach
             .expireAfterWrite(12, TimeUnit.HOURS)
             .build();
 
+    private static final Cache<Long,Integer> QW_REPEAT_CACHE = Caffeine.newBuilder()
+            .maximumSize(5000)
+            .expireAfterWrite(3, TimeUnit.MINUTES)
+            .build();
+
 
     @Override
     public String selectQwExternalContactById(Long id) {
@@ -34,4 +39,11 @@ public class QwExternalContactCacheServiceImpl implements IQwExternalContactCach
             return "-";
         });
     }
+
+    @Override
+    public Integer selectQwIsRepeat(Long id) {
+        return QW_REPEAT_CACHE.get(id,e->{
+            return qwExternalContactService.selectQwIsRepeat(id);
+        });
+    }
 }

+ 19 - 0
fs-service-system/src/main/java/com/fs/qw/converter/QwExternalContactConverter.java

@@ -0,0 +1,19 @@
+package com.fs.qw.converter;
+
+import com.fs.qw.domain.QwExternalContact;
+import com.fs.qw.vo.GetQwRepeatDataVO;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
+import org.mapstruct.factory.Mappers;
+
+@Mapper
+public interface QwExternalContactConverter {
+
+    QwExternalContactConverter INSTANT = Mappers.getMapper(QwExternalContactConverter.class);
+    @Mappings({
+            @Mapping(source = "companyId",target = "companyId"),
+            @Mapping(source = "companyUserId",target = "companyUserId")
+    })
+    GetQwRepeatDataVO convert(QwExternalContact contact);
+}

+ 20 - 0
fs-service-system/src/main/java/com/fs/qw/dto/GetQwRepeatDataDTO.java

@@ -0,0 +1,20 @@
+package com.fs.qw.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 获取重粉数据
+ */
+@Data
+public class GetQwRepeatDataDTO implements Serializable {
+    /**
+     * 外部联系人ID
+     */
+    private String externalUserID;
+    /**
+     * 企微id
+     */
+    private String corpId;
+}

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

@@ -374,4 +374,12 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
     int batchUpdateContactByIds(@Param("list") List<Map<Long, Integer>> list);
 
     List<QwExternalContactVOTime> selectQwExternalContactListVOByUserIds(@Param("ids") List<String> ids);
+
+    /**
+     * 查询外部联系人是否宠粉
+     * @param id
+     * @return
+     */
+    @Select("select is_repeat from qw_external_contact where user_id=${userId} limit 1")
+    Integer selectQwIsRepeat(@Param("userId") Long id);
 }

+ 3 - 0
fs-service-system/src/main/java/com/fs/qw/mapper/QwGroupChatUserMapper.java

@@ -4,6 +4,7 @@ import com.fs.qw.domain.QwGroupChatUser;
 import com.fs.qw.param.QwGroupChatUserDataType;
 import com.fs.qw.vo.QwGroupChatUserVO;
 import com.fs.sop.domain.SopUserLogsInfo;
+import com.fs.sop.params.SopUserLogsInfoByIdsHasUserIdParam;
 import org.apache.ibatis.annotations.Delete;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
@@ -145,4 +146,6 @@ public interface QwGroupChatUserMapper
     List<QwGroupChatUser> selectUserIsChat(@Param("externalUserId") String externalUserId);
 
     List<QwGroupChatUser> selectByChatId(SopUserLogsInfo sopUserLogsInfo);
+
+    List<SopUserLogsInfo> selectByIdAndRegister(SopUserLogsInfoByIdsHasUserIdParam userIdParam);
 }

+ 1 - 1
fs-service-system/src/main/java/com/fs/qw/mapper/QwUserMapper.java

@@ -36,7 +36,7 @@ public interface QwUserMapper extends BaseMapper<QwUser>
      */
     public QwUser selectQwUserById(Long id);
 
-    @Select("select welcome_text,qw_user_name from qw_user where id = #{id}")
+    @Select("select welcome_text,qw_user_name,qw_user_id from qw_user where id = #{id}")
     public QwUser selectQwUserByIdByWeComeText(@Param("id") Long id);
     /**
      * 根据companyUserId查询企微用户

+ 11 - 0
fs-service-system/src/main/java/com/fs/qw/service/IQwExternalContactService.java

@@ -5,10 +5,12 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
 import com.fs.qw.domain.QwExternalContact;
+import com.fs.qw.dto.GetQwRepeatDataDTO;
 import com.fs.qw.param.*;
 import com.fs.qw.param.newparam.ExternalContactPageListParam;
 import com.fs.qw.result.QwExternalContactLogVo;
 import com.fs.qw.result.QwExternalContactVo;
+import com.fs.qw.vo.GetQwRepeatDataVO;
 import com.fs.qw.vo.QwExternalContactVO;
 import com.fs.qw.vo.QwSopRuleTimeVO;
 import com.fs.qw.vo.newvo.ExternalContactDetailsVO;
@@ -198,4 +200,13 @@ public interface IQwExternalContactService extends IService<QwExternalContact> {
     Boolean disabledUser(String[] ids, boolean status);
 
     List<QwExternalContactVOTime> selectQwExternalContactListVOByUserIds(List<String> externalIdList);
+
+    /**
+     * 获取企微重粉数据
+     * @param dto
+     * @return
+     */
+    List<GetQwRepeatDataVO> getQwRepeatData(GetQwRepeatDataDTO dto);
+
+    Integer selectQwIsRepeat(Long id);
 }

+ 62 - 0
fs-service-system/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java

@@ -3,6 +3,7 @@ package com.fs.qw.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONException;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.ad.enums.AdUploadType;
@@ -11,6 +12,8 @@ import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.PubFun;
 import com.fs.common.utils.StringUtils;
+import com.fs.company.cache.ICompanyCacheService;
+import com.fs.company.cache.ICompanyUserCacheService;
 import com.fs.company.service.ICompanyConfigService;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.FsCourseSop;
@@ -25,6 +28,7 @@ import com.fs.course.service.IFsCourseLinkService;
 import com.fs.crm.domain.CrmCustomer;
 import com.fs.crm.mapper.CrmCustomerMapper;
 import com.fs.qw.domain.*;
+import com.fs.qw.dto.GetQwRepeatDataDTO;
 import com.fs.qw.mapper.*;
 import com.fs.qw.param.*;
 import com.fs.qw.param.newparam.ExternalContactPageListParam;
@@ -57,6 +61,7 @@ import com.fs.system.domain.SysConfig;
 import com.fs.system.service.ISysConfigService;
 import com.fs.voice.utils.StringUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.http.client.utils.DateUtils;
 import org.apache.rocketmq.spring.core.RocketMQTemplate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -4499,6 +4504,63 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
         return qwExternalContactMapper.selectQwExternalContactListVOByUserIds(ids);
     }
 
+
+    @Autowired
+    private ICompanyCacheService companyCacheService;
+    @Autowired
+    private ICompanyUserCacheService companyUserCacheService;
+    @Override
+    public List<GetQwRepeatDataVO> getQwRepeatData(GetQwRepeatDataDTO dto) {
+
+        List<QwExternalContact> externalContactList = qwExternalContactMapper
+                .selectList(buildQuery(dto));
+        List<GetQwRepeatDataVO> result = new ArrayList<>();
+        for (QwExternalContact qwExternalContact : externalContactList) {
+            GetQwRepeatDataVO getQwRepeatDataVO = new GetQwRepeatDataVO();
+            getQwRepeatDataVO.setCompanyId(qwExternalContact.getCompanyId());
+            if(qwExternalContact.getCompanyId() != null) {
+                String companyName = companyCacheService.selectCompanyNameById(qwExternalContact.getCompanyId());
+                getQwRepeatDataVO.setCompanyName(companyName);
+            }
+            getQwRepeatDataVO.setCompanyUserId(qwExternalContact.getCompanyUserId());
+            if(qwExternalContact.getCompanyUserId() != null) {
+                String companyUserName = companyUserCacheService.selectCompanyUserNameUserById(qwExternalContact.getCompanyUserId());
+                getQwRepeatDataVO.setCompanyUserName(companyUserName);
+            }
+            getQwRepeatDataVO.setSaleerWx(qwExternalContact.getQwUserId());
+            Date createTime = qwExternalContact.getCreateTime();
+            if(createTime != null) {
+                getQwRepeatDataVO.setCreateDate(DateUtils.formatDate(createTime, "yyyy-MM-dd HH:mm:ss"));
+            }
+
+            result.add(getQwRepeatDataVO);
+        }
+
+        return result;
+    }
+
+    public LambdaQueryWrapper<QwExternalContact> buildQuery(GetQwRepeatDataDTO dto){
+        String corpId = dto.getCorpId();
+        String externalUserID = dto.getExternalUserID();
+        LambdaQueryWrapper<QwExternalContact> eq = new LambdaQueryWrapper<QwExternalContact>()
+                .select(QwExternalContact::getFsUserId,
+                        QwExternalContact::getCompanyId,
+                        QwExternalContact::getCompanyUserId,
+                        QwExternalContact::getName,
+                        QwExternalContact::getQwUserId,
+                        QwExternalContact::getCreateTime
+                )
+                .eq(QwExternalContact::getExternalUserId, externalUserID)
+                .eq(QwExternalContact::getCorpId, corpId);
+
+        return eq;
+    }
+
+    @Override
+    public Integer selectQwIsRepeat(Long id) {
+        return qwExternalContactMapper.selectQwIsRepeat(id);
+    }
+
     //发送好友欢迎语
     void SyncAddSendWelcome(QwExternalContact qwExternalContact, QwUser qwUser, String corpId) {
         QwFriendWelcomeVO qwFriendWelcomeVO = qwFriendWelcomeMapper.selectQwFriendWelcomeByUserIdVO(qwUser.getId(), corpId);

+ 9 - 2
fs-service-system/src/main/java/com/fs/qw/service/impl/QwWatchLogServiceImpl.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.common.constant.HttpStatus;
 import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.exception.CustomException;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.DictUtils;
 import com.fs.company.cache.ICompanyCacheService;
@@ -27,6 +28,8 @@ import com.fs.store.service.cache.IFsUserCacheService;
 import com.fs.store.service.cache.IFsUserCourseCacheService;
 import com.github.pagehelper.PageInfo;
 import com.hc.openapi.tool.util.StringUtils;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.http.util.Asserts;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -174,7 +177,9 @@ public class QwWatchLogServiceImpl extends ServiceImpl<QwWatchLogMapper, QwWatch
         // 获取当前公司下的所有销售
         if(param.getCompanyUserId()  == null){
             List<CompanyUser> companyUsers = companyUserMapper.selectCompanyUserByCompanyId(param.getCompanyId());
-
+            if(CollectionUtils.isEmpty(companyUsers)){
+                throw new CustomException("该公司下面没有任何销售!");
+            }
             userIds = companyUsers.stream()
                     .map(CompanyUser::getUserId)
                     .filter(Objects::nonNull)
@@ -276,7 +281,9 @@ public class QwWatchLogServiceImpl extends ServiceImpl<QwWatchLogMapper, QwWatch
         List<Long> userIds;
         if(param.getCompanyUserId()  == null){
             List<CompanyUser> companyUsers = companyUserMapper.selectCompanyUserByCompanyId(param.getCompanyId());
-
+            if(CollectionUtils.isEmpty(companyUsers)){
+                throw new CustomException("该公司下面没有任何销售!");
+            }
             userIds = companyUsers.stream()
                     .map(CompanyUser::getUserId)
                     .filter(Objects::nonNull)

+ 39 - 0
fs-service-system/src/main/java/com/fs/qw/vo/GetQwRepeatDataVO.java

@@ -0,0 +1,39 @@
+package com.fs.qw.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 获取重粉数据VO
+ */
+@Data
+public class GetQwRepeatDataVO implements Serializable {
+    /**
+     * 所属公司
+     */
+    private Long companyId;
+    /**
+     * 公司名称
+     */
+    private String companyName;
+    /**
+     * 销售ID
+     */
+    private Long companyUserId;
+    /**
+     * 销售
+     */
+    private String companyUserName;
+    /**
+     * 销售-微信号
+     */
+    private Long saleerWx;
+
+    /**
+     * 创建时间
+     */
+    private String createDate;
+}

+ 5 - 0
fs-service-system/src/main/java/com/fs/qw/vo/QwExternalContactVO.java

@@ -111,4 +111,9 @@ public class QwExternalContactVO {
     private Long level;
     @Excel(name = "等级升降")
     private Long levelType;
+
+    /**
+     * 是否重粉
+     */
+    private Integer isRepeat;
 }

+ 1 - 0
fs-service-system/src/main/java/com/fs/sop/params/SendUserLogsInfoMsgParam.java

@@ -18,4 +18,5 @@ public class SendUserLogsInfoMsgParam {
     private String startTime;
     private String corpId;
     private Integer isRegister;
+    private Integer filterMode;
 }

+ 1 - 0
fs-service-system/src/main/java/com/fs/sop/params/SopUserLogsInfoByIdsHasUserIdParam.java

@@ -7,4 +7,5 @@ public class SopUserLogsInfoByIdsHasUserIdParam {
 
     private String[] ids;
     private Integer isRegister;
+    private String qwUserId;
 }

+ 19 - 8
fs-service-system/src/main/java/com/fs/sop/service/impl/SopUserLogsInfoServiceImpl.java

@@ -19,6 +19,7 @@ import com.fs.fastGpt.mapper.FastGptChatReplaceWordsMapper;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.domain.QwUser;
 import com.fs.qw.mapper.QwExternalContactMapper;
+import com.fs.qw.mapper.QwGroupChatUserMapper;
 import com.fs.qw.mapper.QwUserMapper;
 import com.fs.qw.service.impl.AsyncSopTestService;
 import com.fs.qw.vo.QwSopCourseFinishTempSetting;
@@ -116,6 +117,8 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
 
     @Autowired
     private CompanyUserMapper companyUserMapper;
+    @Autowired
+    private QwGroupChatUserMapper qwGroupChatUserMapper;
 
     @Override
     public void save(SopUserLogsInfo sopUserLogsInfo) {
@@ -363,13 +366,6 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
 
         List<FastGptChatReplaceWords> words = fastGptChatReplaceWordsMapper.selectAllFastGptChatReplaceWords();
 
-//        List<SopUserLogsInfo> sopUserLogsInfos = sopUserLogsInfoMapper.selectSopUserLogsInfoByIds(param.getIds());
-        SopUserLogsInfoByIdsHasUserIdParam userIdParam=new SopUserLogsInfoByIdsHasUserIdParam();
-        userIdParam.setIds(param.getIds());
-        userIdParam.setIsRegister(param.getIsRegister());
-
-        List<SopUserLogsInfo> sopUserLogsInfos = sopUserLogsInfoMapper.selectSopUserLogsInfoByIdsHasUserId(userIdParam);
-
         String[] userKey = param.getUserIdParam().split("\\|");
         String qwUserId = userKey[0].trim();
         String companyUserId = userKey[1].trim();
@@ -378,9 +374,24 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
         QwUser qwUser = qwUserMapper.selectQwUserByIdByWeComeText(Long.valueOf(qwUserId));
 
         if (qwUser == null) {
-              return R.error().put("msg","企业微信用户不存在:"+qwUserId);
+            return R.error().put("msg","企业微信用户不存在:"+qwUserId);
         }
 
+
+//        List<SopUserLogsInfo> sopUserLogsInfos = sopUserLogsInfoMapper.selectSopUserLogsInfoByIds(param.getIds());
+        SopUserLogsInfoByIdsHasUserIdParam userIdParam=new SopUserLogsInfoByIdsHasUserIdParam();
+        userIdParam.setIds(param.getIds());
+        userIdParam.setIsRegister(param.getIsRegister());
+        userIdParam.setQwUserId(qwUser.getQwUserId());
+        List<SopUserLogsInfo> sopUserLogsInfos;
+        if(param.getFilterMode() == 1){
+            sopUserLogsInfos = sopUserLogsInfoMapper.selectSopUserLogsInfoByIdsHasUserId(userIdParam);
+        }else{
+            sopUserLogsInfos = qwGroupChatUserMapper.selectByIdAndRegister(userIdParam);
+        }
+        if(sopUserLogsInfos.isEmpty()){
+            return R.ok();
+        }
         String json = configService.selectConfigByKey("course.config");
         CourseConfig config = JSON.parseObject(json, CourseConfig.class);
 

+ 4 - 0
fs-service-system/src/main/java/com/fs/store/domain/FsStoreProduct.java

@@ -1,6 +1,9 @@
 package com.fs.store.domain;
 
 import java.math.BigDecimal;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fs.common.annotation.Excel;
 import com.fs.common.core.domain.BaseEntity;
 import lombok.Data;
@@ -25,6 +28,7 @@ public class FsStoreProduct extends BaseEntity
     @Excel(name = "商品图片")
     private String image;
 
+    @TableField(strategy = FieldStrategy.IGNORED)
     private String video;
 
     /** 轮播图 */

+ 43 - 0
fs-service-system/src/main/java/com/fs/store/dto/ExpressResultDTO.java

@@ -0,0 +1,43 @@
+package com.fs.store.dto;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+
+
+public class ExpressResultDTO extends HashMap<String, Object> {
+    private static final long serialVersionUID = 1L;
+
+    public ExpressResultDTO() {
+
+    }
+
+    private static String getCurrentTimeString() {
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        return LocalDateTime.now().format(formatter);
+    }
+
+    public static ExpressResultDTO success(String EBusinessID) {
+        ExpressResultDTO result = new ExpressResultDTO();
+        result.put("EBusinessID", EBusinessID);
+        result.put("UpdateTime", getCurrentTimeString());
+        result.put("Success", true);
+        result.put("Reason", "");
+        return result;
+    }
+
+    public static ExpressResultDTO error(String EBusinessID, String reason) {
+        ExpressResultDTO result = new ExpressResultDTO();
+        result.put("EBusinessID", EBusinessID);
+        result.put("UpdateTime", getCurrentTimeString());
+        result.put("Success", false);
+        result.put("Reason", reason);
+        return result;
+    }
+
+    @Override
+    public ExpressResultDTO put(String key, Object value) {
+        super.put(key, value);
+        return this;
+    }
+}

+ 11 - 8
fs-service-system/src/main/java/com/fs/store/mapper/FsUserCourseCountMapper.java

@@ -2,18 +2,19 @@ package com.fs.store.mapper;
 
 import java.util.List;
 import com.fs.store.domain.FsUserCourseCount;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 用户看课统计Mapper接口
- * 
+ *
  * @author fs
  * @date 2025-04-02
  */
-public interface FsUserCourseCountMapper 
+public interface FsUserCourseCountMapper
 {
     /**
      * 查询用户看课统计
-     * 
+     *
      * @param id 用户看课统计ID
      * @return 用户看课统计
      */
@@ -21,7 +22,7 @@ public interface FsUserCourseCountMapper
 
     /**
      * 查询用户看课统计列表
-     * 
+     *
      * @param fsUserCourseCount 用户看课统计
      * @return 用户看课统计集合
      */
@@ -29,7 +30,7 @@ public interface FsUserCourseCountMapper
 
     /**
      * 新增用户看课统计
-     * 
+     *
      * @param fsUserCourseCount 用户看课统计
      * @return 结果
      */
@@ -37,7 +38,7 @@ public interface FsUserCourseCountMapper
 
     /**
      * 修改用户看课统计
-     * 
+     *
      * @param fsUserCourseCount 用户看课统计
      * @return 结果
      */
@@ -45,7 +46,7 @@ public interface FsUserCourseCountMapper
 
     /**
      * 删除用户看课统计
-     * 
+     *
      * @param id 用户看课统计ID
      * @return 结果
      */
@@ -53,9 +54,11 @@ public interface FsUserCourseCountMapper
 
     /**
      * 批量删除用户看课统计
-     * 
+     *
      * @param ids 需要删除的数据ID
      * @return 结果
      */
     public int deleteFsUserCourseCountByIds(Long[] ids);
+
+    FsUserCourseCount findByUserId(@Param("userId") Long userId);
 }

+ 6 - 0
fs-service-system/src/main/java/com/fs/store/param/h5/FsUserPageListParam.java

@@ -6,6 +6,8 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.util.List;
+import java.util.Set;
 
 
 @Data
@@ -63,11 +65,15 @@ public class FsUserPageListParam implements Serializable {
      */
     private Long companyId;
 
+    private Set<Long> companyUserIds;
+
     /**
      * 销售端登录用户id(该字段用于区分之前的登录用户)
      */
     private Long pcLoginUserId;
 
 
+
+
 }
 

+ 10 - 1
fs-service-system/src/main/java/com/fs/store/service/IFsStoreOrderService.java

@@ -13,6 +13,7 @@ import com.fs.company.domain.CompanyUser;
 import com.fs.erp.domain.ErpOrder;
 import com.fs.store.domain.FsStoreOrder;
 import com.fs.store.dto.ExpressNotifyDTO;
+import com.fs.store.dto.ExpressResultDTO;
 import com.fs.store.dto.FsStoreOrderComputeDTO;
 import com.fs.store.dto.StoreOrderExpressExportDTO;
 import com.fs.store.param.*;
@@ -196,10 +197,18 @@ public interface IFsStoreOrderService
 
     int uploadItemJson(FsStoreOrder order);
 
-    void updateDeliveryItem(ExpressNotifyDTO notifyDTO);
+    ExpressResultDTO updateDeliveryItem(ExpressNotifyDTO notifyDTO);
 
     FsStoreOrder selectOrderByUserIdLimit1(Long userId);
 
 
     List<FsStoreOrder> selectFsStoreOrderStatisticsByUserId(List<Long> fsUserIdList);
+
+
+    /**
+     * 完成订单
+     * @param orderId 订单id
+     * @return R
+     */
+    R finishStoreOrder(Long orderId);
 }

+ 10 - 8
fs-service-system/src/main/java/com/fs/store/service/IFsUserCourseCountService.java

@@ -5,15 +5,15 @@ import com.fs.store.domain.FsUserCourseCount;
 
 /**
  * 用户看课统计Service接口
- * 
+ *
  * @author fs
  * @date 2025-04-02
  */
-public interface IFsUserCourseCountService 
+public interface IFsUserCourseCountService
 {
     /**
      * 查询用户看课统计
-     * 
+     *
      * @param id 用户看课统计ID
      * @return 用户看课统计
      */
@@ -21,7 +21,7 @@ public interface IFsUserCourseCountService
 
     /**
      * 查询用户看课统计列表
-     * 
+     *
      * @param fsUserCourseCount 用户看课统计
      * @return 用户看课统计集合
      */
@@ -29,7 +29,7 @@ public interface IFsUserCourseCountService
 
     /**
      * 新增用户看课统计
-     * 
+     *
      * @param fsUserCourseCount 用户看课统计
      * @return 结果
      */
@@ -37,7 +37,7 @@ public interface IFsUserCourseCountService
 
     /**
      * 修改用户看课统计
-     * 
+     *
      * @param fsUserCourseCount 用户看课统计
      * @return 结果
      */
@@ -45,7 +45,7 @@ public interface IFsUserCourseCountService
 
     /**
      * 批量删除用户看课统计
-     * 
+     *
      * @param ids 需要删除的用户看课统计ID
      * @return 结果
      */
@@ -53,9 +53,11 @@ public interface IFsUserCourseCountService
 
     /**
      * 删除用户看课统计信息
-     * 
+     *
      * @param id 用户看课统计ID
      * @return 结果
      */
     public int deleteFsUserCourseCountById(Long id);
+
+    FsUserCourseCount findByUserId(Long userId);
 }

+ 1 - 1
fs-service-system/src/main/java/com/fs/store/service/IFsUserService.java

@@ -138,7 +138,7 @@ public interface IFsUserService
     List<FsUser> getUserListLimit(FsUser fsUser);
 
     List<FsUserPageListVO> selectFsUserPageList(FsUserPageListParam param);
-    List<FsUserPageListVO> selectFsUserPageListNew(FsUserPageListParam param);
+    TableDataInfo selectFsUserPageListNew(FsUserPageListParam param);
     Long selectFsUserCount(FsUserPageListParam param);
 
     UserListPageVO getUserNumber(Long userId);

+ 8 - 0
fs-service-system/src/main/java/com/fs/store/service/cache/IFsUserCourseCountCacheService.java

@@ -0,0 +1,8 @@
+package com.fs.store.service.cache;
+
+import com.fs.store.domain.FsUserCourseCount;
+
+public interface IFsUserCourseCountCacheService {
+
+    public FsUserCourseCount findByUserId(Long userId);
+}

+ 7 - 1
fs-service-system/src/main/java/com/fs/store/service/cache/impl/FsUserCourseCacheServiceImpl.java

@@ -35,6 +35,12 @@ public class FsUserCourseCacheServiceImpl implements IFsUserCourseCacheService {
         if(courseId == null) {
             return "-";
         }
-        return COURSE_ID_AND_NAME.get(courseId, e-> fsUserCourseService.selectFsUserCourseByCourseId(courseId).getCourseName());
+        return COURSE_ID_AND_NAME.get(courseId, e-> {
+            FsUserCourse course = fsUserCourseService.selectFsUserCourseByCourseId(courseId);
+            if(course == null) {
+                return "-";
+            }
+            return course.getCourseName();
+        });
     }
 }

+ 36 - 0
fs-service-system/src/main/java/com/fs/store/service/cache/impl/FsUserCourseCountCacheServiceImpl.java

@@ -0,0 +1,36 @@
+package com.fs.store.service.cache.impl;
+
+import com.fs.store.domain.FsUserCourseCount;
+import com.fs.store.service.IFsUserCourseCountService;
+import com.fs.store.service.cache.IFsUserCourseCountCacheService;
+import com.github.benmanes.caffeine.cache.Cache;
+import com.github.benmanes.caffeine.cache.Caffeine;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.concurrent.TimeUnit;
+
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class FsUserCourseCountCacheServiceImpl implements IFsUserCourseCountCacheService {
+    private static final Cache<Long, FsUserCourseCount> USER_COURSE_COUNT_CACHE = Caffeine.newBuilder()
+            .maximumSize(1000)
+            .expireAfterWrite(3, TimeUnit.MINUTES)
+            .build();
+
+
+    @Autowired
+    private IFsUserCourseCountService fsUserCourseCountService;
+
+
+    @Override
+    public FsUserCourseCount findByUserId(Long userId) {
+        return USER_COURSE_COUNT_CACHE.get(userId,e->{
+            FsUserCourseCount fsUserCourseCount = fsUserCourseCountService.findByUserId(userId);
+            return fsUserCourseCount;
+        });
+    }
+}

+ 3 - 3
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreAfterSalesServiceImpl.java

@@ -198,9 +198,9 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService
         if(order.getStatus()==0){
             return R.error("未支付订单不能申请售后");
         }
-//        if(StringUtils.isEmpty(order.getExtendOrderId())){
-//            return R.error("仓库未生成订单,暂时不能申请退款,请联系客服");
-//        }
+        if(StringUtils.isEmpty(order.getExtendOrderId())){
+            return R.error("仓库未生成订单,暂时不能申请退款,请联系客服");
+        }
         if(order.getStatus()== OrderInfoEnum.STATUS_NE3.getValue()){
             return R.error("已取消订单不能申请售后");
         }

+ 4 - 4
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreCartServiceImpl.java

@@ -143,7 +143,7 @@ public class FsStoreCartServiceImpl implements IFsStoreCartService
                     .isBuy(cartParam.getIsBuy())
                     .build();
             storeCart.setCreateTime(new Date());
-            checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
+//            checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
             fsStoreCartMapper.insertFsStoreCart(storeCart);
             return R.ok().put("id",storeCart.getId());
 
@@ -169,7 +169,7 @@ public class FsStoreCartServiceImpl implements IFsStoreCartService
                         .isBuy(0)
                         .build();
                 storeCart.setCreateTime(new Date());
-                checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
+//                checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
                 fsStoreCartMapper.insertFsStoreCart(storeCart);
                 return R.ok().put("id",storeCart.getId());
             }
@@ -177,7 +177,7 @@ public class FsStoreCartServiceImpl implements IFsStoreCartService
                 storeCart=cart.get(0);
                 storeCart.setCartNum(cartParam.getCartNum() + cart.get(0).getCartNum());
                 storeCart.setUpdateTime(new Date());
-                checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
+//                checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
                 fsStoreCartMapper.updateFsStoreCart(storeCart);
                 return R.ok().put("id",storeCart.getId());
             }
@@ -199,7 +199,7 @@ public class FsStoreCartServiceImpl implements IFsStoreCartService
     @Override
     public R changeNum(long userId, FsStoreCartNumParam cartParam) {
         FsStoreCart cart=fsStoreCartMapper.selectFsStoreCartById(cartParam.getId());
-        checkProductStock(cart.getProductId(),cart.getProductAttrValueId());
+//        checkProductStock(cart.getProductId(),cart.getProductAttrValueId());
         cart.setCartNum(cartParam.getNumber());
         cart.setUpdateTime(new Date());
         fsStoreCartMapper.updateFsStoreCart(cart);

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 29 - 44
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreOrderServiceImpl.java


+ 13 - 8
fs-service-system/src/main/java/com/fs/store/service/impl/FsUserCourseCountServiceImpl.java

@@ -10,19 +10,19 @@ import com.fs.store.service.IFsUserCourseCountService;
 
 /**
  * 用户看课统计Service业务层处理
- * 
+ *
  * @author fs
  * @date 2025-04-02
  */
 @Service
-public class FsUserCourseCountServiceImpl implements IFsUserCourseCountService 
+public class FsUserCourseCountServiceImpl implements IFsUserCourseCountService
 {
     @Autowired
     private FsUserCourseCountMapper fsUserCourseCountMapper;
 
     /**
      * 查询用户看课统计
-     * 
+     *
      * @param id 用户看课统计ID
      * @return 用户看课统计
      */
@@ -34,7 +34,7 @@ public class FsUserCourseCountServiceImpl implements IFsUserCourseCountService
 
     /**
      * 查询用户看课统计列表
-     * 
+     *
      * @param fsUserCourseCount 用户看课统计
      * @return 用户看课统计
      */
@@ -46,7 +46,7 @@ public class FsUserCourseCountServiceImpl implements IFsUserCourseCountService
 
     /**
      * 新增用户看课统计
-     * 
+     *
      * @param fsUserCourseCount 用户看课统计
      * @return 结果
      */
@@ -59,7 +59,7 @@ public class FsUserCourseCountServiceImpl implements IFsUserCourseCountService
 
     /**
      * 修改用户看课统计
-     * 
+     *
      * @param fsUserCourseCount 用户看课统计
      * @return 结果
      */
@@ -72,7 +72,7 @@ public class FsUserCourseCountServiceImpl implements IFsUserCourseCountService
 
     /**
      * 批量删除用户看课统计
-     * 
+     *
      * @param ids 需要删除的用户看课统计ID
      * @return 结果
      */
@@ -84,7 +84,7 @@ public class FsUserCourseCountServiceImpl implements IFsUserCourseCountService
 
     /**
      * 删除用户看课统计信息
-     * 
+     *
      * @param id 用户看课统计ID
      * @return 结果
      */
@@ -93,4 +93,9 @@ public class FsUserCourseCountServiceImpl implements IFsUserCourseCountService
     {
         return fsUserCourseCountMapper.deleteFsUserCourseCountById(id);
     }
+
+    @Override
+    public FsUserCourseCount findByUserId(Long userId) {
+        return fsUserCourseCountMapper.findByUserId(userId);
+    }
 }

+ 78 - 6
fs-service-system/src/main/java/com/fs/store/service/impl/FsUserServiceImpl.java

@@ -3,14 +3,18 @@ package com.fs.store.service.impl;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.fs.common.constant.HttpStatus;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.utils.DateUtils;
+import com.fs.common.utils.StringUtils;
+import com.fs.company.cache.ICompanyTagCacheService;
 import com.fs.company.cache.ICompanyUserCacheService;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyTagUser;
 import com.fs.company.domain.CompanyUser;
+import com.fs.company.dto.CompanyIdAndUserDTO;
 import com.fs.company.mapper.CompanyMapper;
 import com.fs.company.mapper.CompanyTagUserMapper;
 import com.fs.company.mapper.CompanyUserMapper;
@@ -22,12 +26,10 @@ import com.fs.course.vo.newfs.FsCourseAnalysisCountVO;
 import com.fs.course.vo.newfs.FsCourseAnalysisVO;
 import com.fs.course.vo.newfs.FsUserCourseVideoPageListVO;
 import com.fs.his.vo.OptionsVO;
+import com.fs.qw.cache.IQwExternalContactCacheService;
 import com.fs.qw.param.QwFsUserParam;
 import com.fs.qw.vo.QwFsUserVO;
-import com.fs.store.domain.FsStoreOrder;
-import com.fs.store.domain.FsStoreOrderItem;
-import com.fs.store.domain.FsUser;
-import com.fs.store.domain.FsUserBill;
+import com.fs.store.domain.*;
 import com.fs.store.dto.FsStoreCartDTO;
 import com.fs.store.dto.FsUserTransferParamDTO;
 import com.fs.store.enums.BillDetailEnum;
@@ -40,10 +42,12 @@ import com.fs.store.param.h5.FsUserPageListParam;
 import com.fs.store.param.h5.UserStatisticsCommonParam;
 import com.fs.store.service.IFsUserBillService;
 import com.fs.store.service.IFsUserService;
+import com.fs.store.service.cache.IFsUserCourseCountCacheService;
 import com.fs.store.vo.FSUserVO;
 import com.fs.store.vo.FsCompanyUserListQueryVO;
 import com.fs.store.vo.FsUserTuiVO;
 import com.fs.store.vo.h5.*;
+import com.github.pagehelper.PageInfo;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.http.util.Asserts;
@@ -100,6 +104,14 @@ public class FsUserServiceImpl implements IFsUserService
     @Autowired
     private CompanyMapper companyMapper;
 
+    @Autowired
+    private IFsUserCourseCountCacheService fsUserCourseCountCacheService;
+
+    @Autowired
+    private ICompanyTagCacheService companyTagCacheService;
+
+    @Autowired
+    private IQwExternalContactCacheService qwExternalContactCacheService;
     /**
      * 查询用户
      *
@@ -438,8 +450,68 @@ public class FsUserServiceImpl implements IFsUserService
     }
 
     @Override
-    public List<FsUserPageListVO> selectFsUserPageListNew(FsUserPageListParam param) {
-        return fsUserMapper.selectFsUserPageListNew(param);
+    public TableDataInfo selectFsUserPageListNew(FsUserPageListParam param) {
+        // 找出下级销售
+        String companyUserId = param.getCompanyUserId();
+        if(companyUserId != null) {
+            Long companyUser = Long.parseLong(companyUserId);
+            Set<Long> userIds = companyUserCacheService.selectUserAllCompanyUserId(companyUser);
+            param.setCompanyUserIds(userIds);
+        }
+
+        List<FsUserPageListVO> fsUserPageListVOS = fsUserMapper.selectFsUserPageListNew(param);
+        for (FsUserPageListVO item : fsUserPageListVOS) {
+            if(item.getCompanyUserId() != null) {
+                String companyUserName = companyUserCacheService.selectCompanyUserNameUserById(item.getCompanyUserId());
+                if(companyUserName != null) {
+                    item.setCompanyUserNickName(companyUserName);
+                }
+            }
+            if(item.getUserId() != null) {
+                FsUserCourseCount byUserId = fsUserCourseCountCacheService.findByUserId(item.getUserId());
+                if(byUserId != null) {
+                    item.setWatchCourseCount(byUserId.getWatchCourseCount());
+                    item.setMissCourseCount(byUserId.getMissCourseCount());
+                    item.setMissCourseStatus(byUserId.getMissCourseStatus());
+                    if(StringUtils.isNotEmpty(byUserId.getPartCourseCount())){
+                        item.setPartCourseCount(Long.valueOf(byUserId.getPartCourseCount()));
+                    }
+                    item.setCourseCountStatus(byUserId.getStatus());
+                    item.setStopWatchDays(byUserId.getStopWatchDays());
+                    item.setCompleteWatchDate(byUserId.getCompleteWatchDate());
+                }
+
+                String userTagByUserId = companyTagCacheService.findUserTagByUserId(item.getUserId());
+                if(StringUtils.isNotEmpty(userTagByUserId)) {
+                    String[] split = userTagByUserId.split(",");
+                    Map<Long, String> tagMap = companyTagCacheService.queryAllTagMap();
+                    Set<String> tagNames = new HashSet<>();
+                    for (String tag : split) {
+                        if(tag != null) {
+                            Long tagL = Long.parseLong(tag);
+                            String tagName = tagMap.get(tagL);
+                            tagNames.add(tagName);
+                        }
+                    }
+                    item.setTagIds(userTagByUserId);
+                    item.setTag(String.join(",",tagNames));
+                }
+
+                // 是否宠粉
+                Integer isRepeat = qwExternalContactCacheService.selectQwIsRepeat(item.getUserId());
+                if(isRepeat != null) {
+                    item.setIsRepeat(isRepeat);
+                }
+            }
+        }
+
+        TableDataInfo rspData = new TableDataInfo();
+        rspData.setCode(HttpStatus.SUCCESS);
+        rspData.setMsg("查询成功");
+        rspData.setRows(fsUserPageListVOS);
+
+        rspData.setTotal(this.selectFsUserCount(param));
+        return rspData;
     }
 
     @Override

+ 4 - 0
fs-service-system/src/main/java/com/fs/store/vo/h5/FsUserPageListVO.java

@@ -80,4 +80,8 @@ public class FsUserPageListVO {
     @ApiModelProperty(value = "是否属于当前销售")
     private int isCurrentCompanyUser;
 
+    /**
+     * 是否宠粉
+     */
+    private Integer isRepeat;
 }

+ 12 - 6
fs-service-system/src/main/resources/mapper/company/CompanyTagMapper.xml

@@ -3,7 +3,7 @@
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.fs.company.mapper.CompanyTagMapper">
-    
+
     <resultMap type="CompanyTag" id="CompanyTagResult">
         <result property="tagId"    column="tag_id"    />
         <result property="companyId"    column="company_id"    />
@@ -17,12 +17,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <select id="selectCompanyTagList" parameterType="CompanyTag" resultMap="CompanyTagResult">
         <include refid="selectCompanyTagVo"/>
-        <where>  
+        <where>
             <if test="companyId != null "> and company_id = #{companyId}</if>
             <if test="tag != null  and tag != ''"> and tag = #{tag}</if>
         </where>
     </select>
-    
+
     <select id="selectCompanyTagById" parameterType="Long" resultMap="CompanyTagResult">
         <include refid="selectCompanyTagVo"/>
         where tag_id = #{tagId}
@@ -50,6 +50,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         inner join company_tag_user ctu on ctu.company_id = ct.company_id and find_in_set(ct.tag_id, ctu.tag_ids) > 0
         where ctu.user_id = #{userId}
     </select>
+    <select id="findUserTagByUserId" resultType="java.lang.String">
+        select tag_ids from company_tag_user where user_id = ${userId} limit 1
+    </select>
+    <select id="queryAllTagMap" resultType="java.util.Map">
+        select tag_id,tag from company_tag
+    </select>
 
     <insert id="insertCompanyTag" parameterType="CompanyTag" useGeneratedKeys="true" keyProperty="tagId">
         insert into company_tag
@@ -80,10 +86,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </delete>
 
     <delete id="deleteCompanyTagByIds" parameterType="String">
-        delete from company_tag where tag_id in 
+        delete from company_tag where tag_id in
         <foreach item="tagId" collection="array" open="(" separator="," close=")">
             #{tagId}
         </foreach>
     </delete>
-    
-</mapper>
+
+</mapper>

+ 6 - 0
fs-service-system/src/main/resources/mapper/company/CompanyUserMapper.xml

@@ -457,5 +457,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             </if>
         </where>
     </select>
+    <select id="selectUserAllCompanyUserId" resultType="java.lang.Long">
+        select distinct user_id from company_user where parent_id=${companyUserId}
+    </select>
+    <select id="selectCompanyUserNameUserById" resultType="java.lang.String">
+        select concat(nick_name,'_',user_name) from company_user where user_id=${userId} limit 1
+    </select>
 
 </mapper>

+ 3 - 0
fs-service-system/src/main/resources/mapper/course/FsCourseAnswerLogsMapper.xml

@@ -192,6 +192,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="courseId != null">course_id,</if>
             <if test="questionJson != null">question_json,</if>
             <if test="watchLogId != null">watch_log_id,</if>
+            <if test="periodId != null">period_id,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="userId != null">#{userId},</if>
@@ -204,6 +205,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="courseId != null">#{courseId},</if>
             <if test="questionJson != null">#{questionJson},</if>
             <if test="watchLogId != null">#{watchLogId},</if>
+            <if test="periodId != null">#{periodId},</if>
          </trim>
     </insert>
 
@@ -219,6 +221,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="qwUserId != null">qw_user_id = #{qwUserId},</if>
             <if test="courseId != null">course_id = #{courseId},</if>
             <if test="watchLogId != null">watch_log_id = #{watchLogId},</if>
+            <if test="periodId != null">period_id = #{periodId},</if>
         </trim>
         where log_id = #{logId}
     </update>

+ 3 - 0
fs-service-system/src/main/resources/mapper/course/FsCourseRedPacketLogMapper.xml

@@ -110,6 +110,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updateTime != null">update_time,</if>
             <if test="watchLogId != null">watch_log_id,</if>
             <if test="remark != null">remark,</if>
+            <if test="periodId != null">period_id,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="courseId != null">#{courseId},</if>
@@ -125,6 +126,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updateTime != null">#{updateTime},</if>
             <if test="watchLogId != null">#{watchLogId},</if>
             <if test="remark != null">#{remark},</if>
+            <if test="periodId != null">#{periodId},</if>
          </trim>
     </insert>
 
@@ -144,6 +146,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updateTime != null">update_time = #{updateTime},</if>
             <if test="watchLogId != null">watch_log_id = #{watchLogId},</if>
             <if test="remark != null">remark = #{remark},</if>
+            <if test="periodId != null">period_id = #{periodId},</if>
         </trim>
         where log_id = #{logId}
     </update>

+ 20 - 14
fs-service-system/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml

@@ -210,6 +210,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="finishTime != null">finish_time,</if>
             <if test="sendFinishMsg != null">send_finish_msg,</if>
             <if test="campPeriodTime != null">camp_period_time,</if>
+            <if test="periodId != null">period_id,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="userId != null">#{userId},</if>
@@ -229,6 +230,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="finishTime != null">#{finishTime},</if>
             <if test="sendFinishMsg != null">#{sendFinishMsg},</if>
             <if test="campPeriodTime != null">#{campPeriodTime},</if>
+            <if test="periodId != null">#{periodId},</if>
         </trim>
     </insert>
 
@@ -343,6 +345,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="finishTime != null">finish_time = #{finishTime},</if>
             <if test="sendFinishMsg != null">send_finish_msg = #{sendFinishMsg},</if>
             <if test="lastHeartbeatTime != null">last_heartbeat_time = #{lastHeartbeatTime},</if>
+            <if test="periodId != null">period_id = #{periodId},</if>
         </trim>
         where log_id = #{logId}
     </update>
@@ -535,28 +538,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 AND company_user_id = #{maps.companyUserId}
             </if>
             <if test= 'maps.sTime != null '>
-                and DATE(l.create_time) &gt;= DATE(#{maps.sTime})
+                and DATE(create_time) &gt;= DATE(#{maps.sTime})
             </if>
             <if test='maps.eTime != null '>
-                and DATE(l.create_time) &lt;= DATE(#{maps.eTime})
+                and DATE(create_time) &lt;= DATE(#{maps.eTime})
             </if>
             <if test= 'maps.scheduleStartTime != null '>
-                and DATE(l.camp_period_time) &gt;= DATE(#{maps.scheduleStartTime})
+                and DATE(camp_period_time) &gt;= DATE(#{maps.scheduleStartTime})
             </if>
             <if test='maps.scheduleEndTime != null '>
-                and DATE(l.camp_period_time) &lt;= DATE(#{maps.scheduleEndTime})
+                and DATE(camp_period_time) &lt;= DATE(#{maps.scheduleEndTime})
             </if>
             <if test= 'maps.upSTime != null '>
-                and DATE(l.update_time) &gt;= DATE(#{maps.upSTime})
+                and DATE(update_time) &gt;= DATE(#{maps.upSTime})
             </if>
             <if test='maps.upETime != null '>
-                and DATE(l.update_time) &lt;= DATE(#{maps.upETime})
+                and DATE(update_time) &lt;= DATE(#{maps.upETime})
             </if>
             <if test="maps.sourceType != null">
                 and send_type = #{maps.sourceType}
             </if>
             <if test="maps.sopIds != null and maps.sopIds.size() > 0">
-            and l.sop_id in
+            and sop_id in
                 AND sop_id IN
                 <foreach item="sopId" index="index" collection="maps.sopIds" open="(" separator="," close=")">
                     #{sopId}
@@ -590,25 +593,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 AND company_user_id = #{maps.companyUserId}
             </if>
             <if test= 'maps.sTime != null '>
-                and DATE(l.create_time) &gt;= DATE(#{maps.sTime})
+                and DATE(create_time) &gt;= DATE(#{maps.sTime})
             </if>
             <if test='maps.eTime != null '>
-                and DATE(l.create_time) &lt;= DATE(#{maps.eTime})
+                and DATE(create_time) &lt;= DATE(#{maps.eTime})
             </if>
             <if test= 'maps.scheduleStartTime != null '>
-                and DATE(l.camp_period_time) &gt;= DATE(#{maps.scheduleStartTime})
+                and DATE(camp_period_time) &gt;= DATE(#{maps.scheduleStartTime})
             </if>
             <if test='maps.scheduleEndTime != null '>
-                and DATE(l.camp_period_time) &lt;= DATE(#{maps.scheduleEndTime})
+                and DATE(camp_period_time) &lt;= DATE(#{maps.scheduleEndTime})
             </if>
             <if test= 'maps.upSTime != null '>
-                and DATE(l.update_time) &gt;= DATE(#{maps.upSTime})
+                and DATE(update_time) &gt;= DATE(#{maps.upSTime})
             </if>
             <if test='maps.upETime != null '>
-                and DATE(l.update_time) &lt;= DATE(#{maps.upETime})
+                and DATE(update_time) &lt;= DATE(#{maps.upETime})
+            </if>
+            <if test="maps.sourceType != null">
+                and send_type = #{maps.sourceType}
             </if>
             <if test="maps.sopIds != null and maps.sopIds.size() > 0">
-                and l.sop_id in
+                and sop_id in
                 AND sop_id IN
                 <foreach item="sopId" index="index" collection="maps.sopIds" open="(" separator="," close=")">
                     #{sopId}

+ 15 - 0
fs-service-system/src/main/resources/mapper/qw/QwGroupChatUserMapper.xml

@@ -65,6 +65,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="selectByChatId" resultType="com.fs.qw.domain.QwGroupChatUser">
         select * from qw_group_chat_user a where a.chat_id = #{chatId} and type = 2
     </select>
+    <select id="selectByIdAndRegister" resultType="com.fs.sop.domain.SopUserLogsInfo">
+        select
+            a.user_id as external_contact_id,
+            a.chat_id,
+            b.id external_id,
+            b.user_id qw_user_id,
+            a.corp_id,
+            b.name external_user_name,
+            b.fs_user_id
+        from qw_group_chat_user a inner join qw_external_contact b on a.user_id = b.external_user_id and b.user_id = #{qwUserId}
+        where a.id in <foreach collection="ids" item="item" open="(" separator="," close=")">#{item}</foreach>
+        <if test="isRegister != null and isRegister == 1">
+            b.fs_user_id is not null
+        </if>
+    </select>
 
     <insert id="insertOrUpdateQwGroupChatUser" parameterType="QwGroupChatUser" useGeneratedKeys="true" keyProperty="id">
         insert into qw_group_chat_user

+ 1 - 1
fs-service-system/src/main/resources/mapper/store/FsStoreProductMapper.xml

@@ -196,7 +196,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="prescribeName != null">#{prescribeName},</if>
             <if test="isDisplay != null">#{isDisplay},</if>
             <if test="tuiCateId != null">#{tuiCateId},</if>
-            <if test="companyIds != null and companyIds != ''">#{company_ids},</if>
+            <if test="companyIds != null and companyIds != ''">#{companyIds},</if>
          </trim>
     </insert>
 

+ 3 - 0
fs-service-system/src/main/resources/mapper/store/FsUserCourseCountMapper.xml

@@ -52,6 +52,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectFsUserCourseCountVo"/>
         where id = #{id}
     </select>
+    <select id="findByUserId" resultType="com.fs.store.domain.FsUserCourseCount">
+        select * from fs_user_course_count where user_id = ${userId} limit 1
+    </select>
 
     <insert id="insertFsUserCourseCount" parameterType="FsUserCourseCount">
         insert into fs_user_course_count

+ 36 - 193
fs-service-system/src/main/resources/mapper/store/FsUserMapper.xml

@@ -378,133 +378,39 @@
 
     <select id="selectFsUserPageListNew" resultType="FsUserPageListVO">
         SELECT
-        fs_user.*,
-        fs_user_course_count.id,
-        fs_user_course_count.watch_course_count,
-        fs_user_course_count.miss_course_count,
-        fs_user_course_count.miss_course_status,
-        fs_user_course_count.course_ids,
-        fs_user_course_count.part_course_count,
-        fs_user_course_count.last_watch_date,
-        fs_user_course_count.STATUS AS courseCountStatus,
-        fs_user_course_count.stop_watch_days,
-        fs_user_course_count.complete_watch_date,
-        GROUP_CONCAT(DISTINCT company_tag.tag) AS tag,
-        GROUP_CONCAT(DISTINCT company_tag.tag_id) AS tagIds,
-        company_user.nick_name as companyUserNickName,
-        if(fs_user.company_user_id = #{pcLoginUserId} or company_user.parent_id = #{pcLoginUserId}, 1, 0) as isCurrentCompanyUser
-        FROM
-        (SELECT
-        fu.user_id
+        fs_user.user_id,
+        fs_user.nickname,
+        fs_user.avatar,
+        fs_user.phone,
+        fs_user.status,
+        fs_user.create_time,
+        fs_user.remark,
+        fs_user.company_user_id,
+        fs_user.company_id
         FROM
-        fs_user fu
-        LEFT JOIN company_user cu ON fu.company_user_id = cu.user_id
-        LEFT JOIN fs_user_course_count fucc ON fu.user_id = fucc.user_id
-        LEFT JOIN company_tag_user ctu ON fu.user_id = ctu.user_id
+        fs_user
         <where>
-            <if test="userId != null and userId !='' ">
-                AND (cu.user_id = #{userId} OR cu.parent_id = #{userId})
-            </if>
-            <if test="companyUserId != null and companyUserId !='' ">
-                AND cu.user_id = #{companyUserId}
-            </if>
-<!--            <choose>-->
-<!--                <when test = "isBlack">-->
-<!--                    AND fu.status = 0-->
-<!--                </when>-->
-<!--                <otherwise>-->
-<!--                    AND fu.status = 1-->
-<!--                </otherwise>-->
-<!--            </choose>-->
-            <if test="keyword != null and keyword !='' ">
-                AND (fu.nickname LIKE concat('%',#{keyword},'%')
-                OR fu.phone LIKE concat('%',#{keyword},'%')
-                )
-            </if>
+            fs_user.is_del = 0
             <if test="registerStartTime != null and registerStartTime !='' ">
-                AND fu.create_time &gt;= #{registerStartTime}
+                AND fs_user.create_time &gt;= #{registerStartTime}
             </if>
             <if test="registerEndTime != null and registerEndTime !='' ">
-                AND fu.create_time &lt;= #{registerEndTime}
+                AND fs_user.create_time &lt;= #{registerEndTime}
             </if>
-            <if test="tagIds != null and tagIds.length > 0">
-                AND
-                <foreach collection="tagIds" item="item" index="index" open="(" separator="or" close=")">
-                    ctu.tag_ids LIKE concat('%"',#{item},'"%')
+            <if test="companyUserIds != null and companyUserIds.size > 0">
+                AND fs_user.company_user_id in
+                <foreach collection="companyUserIds" item="item" index="index" open="(" separator="," close=")">
+                    ${item}
                 </foreach>
             </if>
-            <if test="tabValue != null and tabValue !='' ">
-                <choose>
-                    <when test = "tabValue == 1">
-                        AND DAY(fu.create_time) = DAY(NOW())
-                    </when>
-                    <when test = "tabValue == 2">
-                        AND DAY(fucc.complete_watch_date) = DAY(NOW())
-                    </when>
-                    <when test = "tabValue == 3">
-                        AND fucc.status = 3
-                    </when>
-                </choose>
+            <if test="nickname != null and nickname != ''">
+                AND fs_user.nickname like concat(#{nickname},'%')
             </if>
-            <if test="watchCourseType != null and watchCourseType !='' ">
-                <choose>
-                    <when test = "watchCourseType == 1">
-                        AND fucc.status = 3
-                    </when>
-                    <when test = "watchCourseType == 2">
-                        AND fucc.status = 1
-                    </when>
-                    <when test = "watchCourseType == 3">
-                        AND fucc.status = 2
-                    </when>
-                </choose>
-            </if>
-            <if test="missCourseStatus != null and missCourseStatus !='' ">
-                <choose>
-                    <when test = "missCourseStatus == 1">
-                        AND fucc.miss_course_status = 1
-                    </when>
-                    <when test = "missCourseStatus == 2">
-                        AND fucc.miss_course_status = 2
-                    </when>
-                </choose>
-            </if>
-            <if test="nickname !=null and nickname != ''">
-                AND fu.nickname like concat(#{nickname},'%')
-            </if>
-            <if test="phone != null and phone !=''">
-                AND fu.phone like concat(#{phone},'%')
-            </if>
-            <if test="companyId != null">
-                AND fu.company_id = ${companyId}
+            <if test="phone != null and phone != ''">
+                AND fs_user.phone = #{phone}
             </if>
         </where>
-        GROUP BY fu.user_id
-        <if test="continueMissCourseSort != null and continueMissCourseSort !='' ">
-            ORDER BY
-            <choose>
-                <when test = "continueMissCourseSort == 0">
-                    fucc.miss_course_days DESC
-                </when>
-                <when test = "continueMissCourseSort == 1">
-                    fucc.miss_course_days ASC
-                </when>
-                <when test = "continueMissCourseSort == 2">
-                    fu.create_time DESC
-                </when>
-                <when test = "continueMissCourseSort == 3">
-                    fu.nickname ASC
-                </when>
-            </choose>
-        </if>
-        LIMIT ${(pageNum-1)*pageSize},${pageSize}
-        ) temp_user_ids
-        JOIN fs_user ON temp_user_ids.user_id = fs_user.user_id
-        LEFT JOIN company_user ON fs_user.company_user_id = company_user.user_id
-        LEFT JOIN fs_user_course_count ON fs_user.user_id = fs_user_course_count.user_id
-        LEFT JOIN company_tag_user ON fs_user.user_id = company_tag_user.user_id
-        LEFT JOIN company_tag ON FIND_IN_SET(company_tag.tag_id, company_tag_user.tag_ids) > 0
-        GROUP BY fs_user.user_id
+        limit ${(pageNum-1)*pageSize},${pageSize}
     </select>
 
     <select id="selectFsUserPageList" resultType="FsUserPageListVO">
@@ -769,7 +675,7 @@
     <select id="countTag" resultType="FsUserSummaryCountTagVO">
         SELECT
             company_tag.tag AS tagName,
-            count( fs_user.user_id ) AS userCount
+            count( fs_user.user_id ) AS number
         FROM
             company_tag_user
                 LEFT JOIN fs_user ON fs_user.user_id = company_tag_user.user_id
@@ -1316,91 +1222,28 @@
 
     <select id="selectFsUserPageListCount" resultType="java.lang.Long">
         SELECT
-        COUNT(DISTINCT fu.user_id) as total_count
+        count(1)
         FROM
-        fs_user fu
-        LEFT JOIN fs_user_course_count fucc ON fu.user_id = fucc.user_id
+        fs_user
         <where>
-            <if test="companyId != null">
-                AND fu.company_id = ${companyId}
-            </if>
-            <if test="phone != null and phone !=''">
-                AND fu.phone like concat(#{phone},'%')
-            </if>
-            <if test="nickname !=null and nickname != ''">
-                AND fu.nickname like concat(#{nickname},'%')
-            </if>
-            <if test="userId != null and userId !='' ">
-                AND (cu.user_id = #{userId} OR cu.parent_id = #{userId})
-            </if>
-            <if test="companyUserId != null and companyUserId !='' ">
-                AND cu.user_id = #{companyUserId}
-            </if>
-            <choose>
-                <when test = "isBlack">
-                    AND fu.status = 0
-                </when>
-                <otherwise>
-                    AND fu.status = 1
-                </otherwise>
-            </choose>
-            <if test="keyword != null and keyword !='' ">
-                AND (fu.nickname LIKE concat(#{keyword},'%')
-                OR fu.phone LIKE concat(#{keyword},'%')
-                )
-            </if>
+            fs_user.is_del = 0
             <if test="registerStartTime != null and registerStartTime !='' ">
-                AND fu.create_time &gt;= #{registerStartTime}
+                AND fs_user.create_time &gt;= #{registerStartTime}
             </if>
             <if test="registerEndTime != null and registerEndTime !='' ">
-                AND fu.create_time &lt;= #{registerEndTime}
+                AND fs_user.create_time &lt;= #{registerEndTime}
             </if>
-            <if test="tagIds != null and tagIds.length > 0">
-                AND EXISTS (
-                SELECT 1 FROM company_tag_user ctu2
-                WHERE fu.user_id = ctu2.user_id
-                AND (
-                <foreach collection="tagIds" item="item" index="index" separator="OR">
-                    ctu2.tag_ids LIKE concat(#{item},'"%')
+            <if test="companyUserIds != null and companyUserIds.size > 0">
+                AND fs_user.company_user_id in
+                <foreach collection="companyUserIds" item="item" index="index" open="(" separator="," close=")">
+                    ${item}
                 </foreach>
-                )
-                )
             </if>
-            <if test="tabValue != null and tabValue !='' ">
-                <choose>
-                    <when test = "tabValue == 1">
-                        AND DAY(fu.create_time) = DAY(NOW())
-                    </when>
-                    <when test = "tabValue == 2">
-                        AND DAY(fucc.complete_watch_date) = DAY(NOW())
-                    </when>
-                    <when test = "tabValue == 3">
-                        AND fucc.status = 3
-                    </when>
-                </choose>
+            <if test="nickname != null and nickname!=''">
+                AND fs_user.nickname like concat(#{nickname},'%')
             </if>
-            <if test="watchCourseType != null and watchCourseType !='' ">
-                <choose>
-                    <when test = "watchCourseType == 1">
-                        AND fucc.status = 3
-                    </when>
-                    <when test = "watchCourseType == 2">
-                        AND fucc.status = 1
-                    </when>
-                    <when test = "watchCourseType == 3">
-                        AND fucc.status = 2
-                    </when>
-                </choose>
-            </if>
-            <if test="missCourseStatus != null and missCourseStatus !='' ">
-                <choose>
-                    <when test = "missCourseStatus == 1">
-                        AND fucc.miss_course_status = 1
-                    </when>
-                    <when test = "missCourseStatus == 2">
-                        AND fucc.miss_course_status = 2
-                    </when>
-                </choose>
+            <if test="phone != null and phone!=''">
+                AND fs_user.phone = #{phone}
             </if>
         </where>
     </select>

+ 3 - 93
fs-user-app/src/main/java/com/fs/app/controller/PayController.java

@@ -5,7 +5,6 @@ import com.alibaba.fastjson.JSON;
 import com.fs.common.config.FSSysConfig;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.redis.RedisCache;
-import com.fs.common.exception.CustomException;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.erp.service.IErpOrderService;
@@ -14,22 +13,18 @@ import com.fs.pay.pay.domain.OrderCallback;
 import com.fs.pay.pay.domain.OrderResult;
 import com.fs.pay.pay.dto.OrderQueryDTO;
 import com.fs.pay.pay.service.PayService;
-import com.fs.pay.pay.service.impl.PayApiServiceImpl;
 import com.fs.pay.pay.util.PayUtil;
-import com.fs.store.domain.*;
-import com.fs.store.enums.*;
-import com.fs.store.service.*;
 import com.fs.pay.service.dto.PayNotifyDTO;
 import com.fs.pay.service.dto.RefundNotifyDTO;
 import com.fs.pay.service.dto.TradeOrder;
+import com.fs.store.domain.FsStorePayment;
+import com.fs.store.service.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
@@ -86,7 +81,7 @@ public class PayController {
         //验证
         HuiFuResult o = JSON.parseObject(resp_data, HuiFuResult.class);
         logger.info("汇付支付回调:"+o);
-        if(o.getResp_code().equals("00000000")){
+        if(o.getResp_code().equals("00000000") && o.getNotify_type().equals("1")){
             String[] order=o.getReq_seq_id().split("-");
             switch (order[0]) {
                 case "store":
@@ -127,89 +122,4 @@ public class PayController {
 
 
 
-    @ApiOperation("小雨点第三方支付回调")
-    @PostMapping(value="/payNotify")
-    public String payNotify(HttpServletRequest request,PayNotifyDTO dto) throws Exception {
-            if("SUCCESS".equals(dto.getOrderStatus())) {
-                //订单号
-                String tradeNo = dto.getMerchOrderNo();
-                List<TradeOrder> tradeOrders= JSON.parseArray(dto.getTradeOrders(),TradeOrder.class);
-                if(tradeOrders!=null&&tradeOrders.size()>0){
-                    for(TradeOrder tradeOrder:tradeOrders){
-                        String[] order=tradeOrder.getSubMerchOrderNo().split("-");
-                        switch (order[0]) {
-                            case "store":
-                                orderService.payConfirm(1,null,order[1], tradeNo,dto.getBankTransactionId(),dto.getBankSerialNo());
-                                return "success";
-                            case "store_remain":
-                                orderService.payRemainConfirm( order[1], tradeNo,dto.getBankTransactionId(),dto.getBankSerialNo());
-                                return "success";
-                            case "payment":
-                                return storePaymentService.payConfirm(order[1], tradeNo,dto.getBankTransactionId(),dto.getBankSerialNo());
-                        }
-                    }
-                }
-            }
-            return "success";
-    }
-    @ApiOperation("小雨点第三方退款回调")
-    @PostMapping(value="/refundNotify")
-    public String refundNotify(HttpServletRequest request, RefundNotifyDTO dto) throws Exception {
-        if("SUCCESS".equals(dto.getOrderStatus())) {
-            String[] orderIds=dto.getOrigMerchOrderNo().split("-");
-            FsStorePayment storePayment=null;
-            switch (orderIds[0]) {
-                case "store":
-                    storePayment=storePaymentService.selectFsStorePaymentByCode(orderIds[1]);
-                    if(storePayment!=null){
-                        storePayment.setRefundMoney(BigDecimal.valueOf(Double.parseDouble(dto.getAmount())));
-                        storePayment.setStatus(-1);
-                        storePayment.setRefundTime(new Date());
-                        storePaymentService.updateFsStorePayment(storePayment);
-                    }
-                    return "success";
-                case "store_remain":
-                    storePayment=storePaymentService.selectFsStorePaymentByCode(orderIds[1]);
-                    if(storePayment!=null){
-                        storePayment.setRefundMoney(BigDecimal.valueOf(Double.parseDouble(dto.getAmount())));
-                        storePayment.setStatus(-1);
-                        storePayment.setRefundTime(new Date());
-                        storePaymentService.updateFsStorePayment(storePayment);
-                    }
-                    return "success";
-                case "doctor":
-                   return "success";
-                case "payment":
-                    storePaymentService.refund(orderIds[1]);
-                    return "success";
-            }
-            return "success";
-        }
-        return "success";
-    }
-
-
-//    @Transactional
-//    public String paymentOp(String payCode,String tradeNo,String bankTransactionId,String bankSerialNo) {
-//
-//        //更新订单状态
-//        FsStorePayment storePayment=storePaymentService.selectFsStorePaymentByCode(payCode);
-//        if(!storePayment.getStatus().equals(0)){
-//            return "";
-//        }
-//        storePayment.setStatus(1);
-//        storePayment.setPayTime(new Date());
-//        storePayment.setTradeNo(tradeNo);
-//        storePayment.setBankSerialNo(bankSerialNo);
-//        storePayment.setBankTransactionId(bankTransactionId);
-//        storePaymentService.updateFsStorePayment(storePayment);
-//        //增加佣金
-//        if(storePayment.getCompanyId()!=null&&storePayment.getCompanyId()>0){
-//            companyService.addCompanyPaymentMoney(storePayment);
-//        }
-//        return "success";
-//
-//    }
-
-
 }

+ 25 - 59
fs-user-app/src/main/java/com/fs/app/controller/StoreOrderController.java

@@ -2,41 +2,30 @@ package com.fs.app.controller;
 
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
-
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.TypeReference;
 import com.fs.app.annotation.Login;
-import com.fs.common.annotation.Log;
-import com.fs.common.annotation.RepeatSubmit;
-
 import com.fs.common.config.FSSysConfig;
 import com.fs.common.core.domain.R;
-import com.fs.common.enums.BusinessType;
 import com.fs.common.exception.CustomException;
-import com.fs.common.utils.*;
+import com.fs.common.utils.IpUtil;
+import com.fs.common.utils.ParseUtils;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.ip.IpUtils;
+import com.fs.erp.service.IErpOrderService;
 import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.huifuPay.domain.HuifuCreateOrderResult;
 import com.fs.huifuPay.service.HuiFuService;
-import com.fs.pay.pay.config.PayConfig;
-import com.fs.pay.pay.domain.CreateWxOrderResult;
 import com.fs.pay.pay.domain.OrderResult;
 import com.fs.pay.pay.dto.OrderQueryDTO;
-import com.fs.pay.pay.dto.WxJspayDTO;
 import com.fs.pay.pay.service.PayService;
-import com.fs.pay.pay.service.impl.PayApiServiceImpl;
-import com.fs.pay.service.dto.PayQueryDTO;
-import com.fs.store.domain.*;
-import com.fs.system.domain.SysConfig;
-import com.fs.wx.miniapp.config.WxMaConfiguration;
-import com.fs.wx.miniapp.config.WxMaProperties;
-import com.fs.wx.pay.config.WxPayProperties;
-import com.fs.erp.service.IErpOrderService;
+import com.fs.pay.service.IPayService;
 import com.fs.store.config.StoreConfig;
-
+import com.fs.store.domain.*;
 import com.fs.store.dto.FsStoreOrderComputeDTO;
 import com.fs.store.enums.OrderInfoEnum;
 import com.fs.store.mapper.FsStorePaymentMapper;
@@ -44,26 +33,20 @@ import com.fs.store.param.*;
 import com.fs.store.service.*;
 import com.fs.store.vo.FsMyStoreOrderListQueryVO;
 import com.fs.store.vo.FsStoreOrderItemVO;
-import com.fs.pay.service.IPayService;
-import com.fs.pay.service.dto.CreatePayDTO;
-import com.fs.pay.service.dto.PayDTO;
-import com.fs.pay.service.dto.TradeOrder;
 import com.fs.system.service.ISysConfigService;
-import com.github.binarywang.wxpay.bean.entpay.EntPayResult;
+import com.fs.wx.miniapp.config.WxMaConfiguration;
+import com.fs.wx.miniapp.config.WxMaProperties;
+import com.fs.wx.pay.config.WxPayProperties;
 import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
 import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
 import com.github.binarywang.wxpay.config.WxPayConfig;
 import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.EntPayService;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
-import com.google.gson.Gson;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import lombok.Synchronized;
 import me.chanjar.weixin.common.error.WxErrorException;
-import org.apache.catalina.servlets.DefaultServlet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -78,8 +61,6 @@ import java.util.*;
 import java.util.concurrent.TimeUnit;
 
 
-
-
 @Api("商城接口")
 @RestController
 @RequestMapping(value="/app/storeOrder")
@@ -241,7 +222,6 @@ public class StoreOrderController extends  AppBaseController {
     //@Synchronized
     public R pay(HttpServletRequest request, @Validated @RequestBody FsStoreOrderPayParam param)
     {
-        logger.info("zzf \n【pay】:"+param.getOrderId()+"的订单支付类型为"+param.getPayType());
         FsStoreOrder order=orderService.selectFsStoreOrderById(param.getOrderId());
         if(order==null){
             return R.error("订单不存在");
@@ -259,6 +239,7 @@ public class StoreOrderController extends  AppBaseController {
             //已改价处理
             if(order.getIsEditMoney()!=null&&order.getIsEditMoney()==1){
                 //改过价不做处理
+
             }
             else{
                 String config=configService.selectConfigByKey("store.config");
@@ -285,7 +266,6 @@ public class StoreOrderController extends  AppBaseController {
             }
             String payCode = IdUtil.getSnowflake(0, 0).nextIdStr();
 //            order.setOrderCode(orderCode);
-            //易宝支付
             if(order.getPayType().equals("1")||order.getPayType().equals("2")){
                 String json = configService.selectConfigByKey("store.pay");
                 FsPayConfig fsPayConfig = JSON.parseObject(json, FsPayConfig.class);
@@ -306,29 +286,6 @@ public class StoreOrderController extends  AppBaseController {
                 storePayment.setOrderId(order.getId());
                 fsStorePaymentMapper.insertFsStorePayment(storePayment);
 
-//                //创建订单
-//                WxJspayDTO p = new WxJspayDTO();
-//                // 使用setter方法为对象赋值
-//                p.setPayMoney(order.getPayMoney().toString());
-//                p.setLowOrderId("store-"+payCode);
-//                p.setBody("商城订单支付");
-//                p.setIsMinipg("1");
-//                p.setReturnUrl(PayConfig.notifyUrl);
-//                p.setOpenId(user.getMaOpenId());
-//                p.setAttach("");
-//                p.setStoreid("0");
-//                CreateWxOrderResult wxOrder = ybPayService.createWxOrder(p);
-//                if(wxOrder.getStatus().equals("100")){
-//                    FsStorePayment ment=new FsStorePayment();
-//                    ment.setPaymentId(storePayment.getPaymentId());
-//                    ment.setTradeNo(wxOrder.getUpOrderId());
-//                    fsStorePaymentMapper.updateFsStorePayment(ment);
-//                    redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
-//                    return R.ok().put("payType",param.getPayType()).put("result",wxOrder.getPay_info());
-//                }
-//                else{
-//                    return R.error(wxOrder.getMessage());
-//                }
                 if (fsPayConfig.getType().equals("hf")){
                     HuiFuCreateOrder o = new HuiFuCreateOrder();
                     o.setTradeType("T_MINIAPP");
@@ -337,7 +294,7 @@ public class StoreOrderController extends  AppBaseController {
                     o.setTransAmt(storePayment.getPayMoney().toString());
                     o.setGoodsDesc("商城订单支付");
                     HuifuCreateOrderResult result = huiFuService.createOrder(o);
-                    if(result.getBank_code()!=null&&result.getBank_code().equals("00000000")){
+                    if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
                         FsStorePayment mt=new FsStorePayment();
                         mt.setPaymentId(storePayment.getPaymentId());
                         mt.setTradeNo(result.getHf_seq_id());
@@ -520,14 +477,17 @@ public class StoreOrderController extends  AppBaseController {
                 o.setGoodsDesc("商城订单尾款支付");
                 HuifuCreateOrderResult result = huiFuService.createOrder(o);
                 //创建订单
-                if(result.getBank_code()!=null&&result.getBank_code().equals("00000000")){
+                if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
+
                     FsStorePayment mt=new FsStorePayment();
                     mt.setPaymentId(storePayment.getPaymentId());
                     mt.setTradeNo(result.getHf_seq_id());
                     fsStorePaymentMapper.updateFsStorePayment(mt);
                     redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
                     Map<String, Object> resultMap = JSON.parseObject(result.getPay_info(), new TypeReference<Map<String, Object>>() {});
-                    return R.ok().put("result",resultMap);
+                    String s = (String) resultMap.get("package");
+                    resultMap.put("packageValue",s);
+                    return R.ok().put("payType",param.getPayType()).put("result",resultMap);
                 }
                 else{
                     return R.error(result.getResp_desc());
@@ -635,13 +595,16 @@ public class StoreOrderController extends  AppBaseController {
                 o.setTransAmt(storePayment.getPayMoney().toString());
                 o.setGoodsDesc("商城订单支付");
                 HuifuCreateOrderResult result = huiFuService.createOrder(o);
-                if(result.getBank_code()!=null&&result.getBank_code().equals("00000000")){
+                if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
+
                     FsStorePayment mt=new FsStorePayment();
                     mt.setPaymentId(storePayment.getPaymentId());
                     mt.setTradeNo(result.getHf_seq_id());
                     fsStorePaymentMapper.updateFsStorePayment(mt);
                     redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
                     Map<String, Object> resultMap = JSON.parseObject(result.getPay_info(), new TypeReference<Map<String, Object>>() {});
+                    String s = (String) resultMap.get("package");
+                    resultMap.put("packageValue",s);
                     return R.ok().put("result",resultMap);
                 }
                 else{
@@ -752,13 +715,16 @@ public class StoreOrderController extends  AppBaseController {
                 o.setTransAmt(storePayment.getPayMoney().toString());
                 o.setGoodsDesc("商城订单支付");
                 HuifuCreateOrderResult result = huiFuService.createOrder(o);
-                if(result.getBank_code()!=null&&result.getBank_code().equals("00000000")){
+                if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
+
                     FsStorePayment mt=new FsStorePayment();
                     mt.setPaymentId(storePayment.getPaymentId());
                     mt.setTradeNo(result.getHf_seq_id());
                     fsStorePaymentMapper.updateFsStorePayment(mt);
                     redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
                     Map<String, Object> resultMap = JSON.parseObject(result.getPay_info(), new TypeReference<Map<String, Object>>() {});
+                    String s = (String) resultMap.get("package");
+                    resultMap.put("packageValue",s);
                     return R.ok().put("result",resultMap);
                 }
                 else{

+ 183 - 102
fs-user-app/src/main/java/com/fs/app/controller/WxUserController.java

@@ -1,43 +1,40 @@
 package com.fs.app.controller;
 
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
+import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
 import cn.hutool.core.date.DateTime;
-import cn.hutool.core.util.StrUtil;
 import com.fs.app.annotation.Login;
 import com.fs.app.utils.JwtUtils;
 import com.fs.common.core.domain.R;
-import com.fs.common.core.redis.RedisCache;
 import com.fs.common.exception.CustomException;
-import com.fs.common.utils.OrderUtils;
-import com.fs.store.param.LoginMpWxParam;
 import com.fs.common.utils.IpUtil;
-import com.fs.wx.miniapp.config.WxMaConfiguration;
-import com.fs.wx.miniapp.config.WxMaProperties;
+import com.fs.common.utils.OrderUtils;
 import com.fs.store.domain.FsUser;
+import com.fs.store.param.LoginMpWxParam;
 import com.fs.store.param.LoginWxParam;
 import com.fs.store.service.IFsUserService;
-import com.fs.wx.mp.config.WxMpConfiguration;
+import com.fs.wx.miniapp.config.WxMaConfiguration;
+import com.fs.wx.miniapp.config.WxMaProperties;
 import com.fs.wx.mp.config.WxMpProperties;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.Synchronized;
 import me.chanjar.weixin.common.bean.WxOAuth2UserInfo;
 import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
+import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.mp.api.WxMpService;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.bind.annotation.*;
-
-import cn.binarywang.wx.miniapp.api.WxMaService;
-import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
-import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
-import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
-import me.chanjar.weixin.common.error.WxErrorException;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import java.util.Date;
-import java.util.concurrent.TimeUnit;
 
 /**
  * 微信小程序用户接口
@@ -66,103 +63,187 @@ public class WxUserController extends AppBaseController{
      */
     @ApiOperation("登录")
     @PostMapping("/login")
-    public R login( @RequestBody LoginMpWxParam param) {
+    public R login(@RequestBody LoginMpWxParam param) {
         if (StringUtils.isBlank(param.getCode())) {
             return R.error("code不存在");
         }
+
         final WxMaService wxService = WxMaConfiguration.getMaService(maProperties.getConfigs().get(0).getAppid());
         try {
+            // 获取微信会话信息
             WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
-            this.logger.info(session.getSessionKey());
-            this.logger.info(session.getOpenid());
-            // 解密
-            WxMaPhoneNumberInfo phoneNoInfo = wxService.getUserService().getPhoneNoInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
-            FsUser user=userService.selectFsUserByMaOpenId(session.getOpenid());
+            logger.info("获取微信会话信息成功 - openid: {}, sessionKey: {}", session.getOpenid(), session.getSessionKey());
+
+            // 获取手机号信息
+            WxMaPhoneNumberInfo phoneNoInfo = wxService.getUserService().getPhoneNoInfo(
+                session.getSessionKey(),
+                param.getEncryptedData(),
+                param.getIv()
+            );
+            logger.info("获取手机号信息成功 - phone: {}", phoneNoInfo.getPhoneNumber());
+
+            // 获取用户IP
             String ip = IpUtil.getRequestIp();
-            if(user==null){
-                //查询手机号是否存在,如果存在,更新
-                FsUser checkPhone=userService.selectFsUserByPhone(phoneNoInfo.getPhoneNumber());
-                if(checkPhone!=null){
-                    if(checkPhone.getMaOpenId()==null){
-                        user=checkPhone;
-                        FsUser userMap=new FsUser();
-                        userMap.setMaOpenId(session.getOpenid());
-                        userMap.setUserId(checkPhone.getUserId());
-                        userMap.setUpdateTime(new DateTime());
-                        userMap.setLastIp(ip);
-                        userService.updateFsUser(userMap);
-                    }
-                    else{
-                        throw new CustomException("此手机号已存在");
-                    }
-                }
-                else{
-                    //写入
-                    user=new FsUser();
-                    if(StringUtils.isNotEmpty(param.getUserCode())){
-                        FsUser tuiUser=userService.selectFsUserByUserCode(param.getUserCode());
-                        if(tuiUser!=null){
-                            user.setIsPromoter(1);
-                            user.setSpreadUserId(tuiUser.getUserId());
-                        }
-                    }
-                    user.setUserCode(OrderUtils.genUserCode());
-                    user.setPhone(phoneNoInfo.getPhoneNumber());
-                    user.setUsername(phoneNoInfo.getPhoneNumber());
-                    user.setNickname("微信用户");
-                    user.setStatus(1);
-                    user.setMaOpenId(session.getOpenid());
-                    user.setLastIp(ip);
-                    user.setIsWeixinAuth(0);
-                    user.setCreateTime(new Date());
-                    userService.insertFsUser(user);
-                }
-           }
-           else{
-               FsUser userMap=new FsUser();
-               userMap.setPhone(phoneNoInfo.getPhoneNumber());
-               userMap.setUserId(user.getUserId());
-               userMap.setUpdateTime(new DateTime());
-               userMap.setLastIp(ip);
-               userService.updateFsUser(userMap);
-           }
-           String token = jwtUtils.generateToken(user.getUserId());
-           return R.ok("登录成功").put("token",token).put("user", user);
+
+            // 查找或创建用户
+            FsUser user = findOrCreateUser(session, phoneNoInfo, ip, param.getUserCode());
+
+            // 生成token
+            String token = jwtUtils.generateToken(user.getUserId());
+
+            // 记录登录日志
+            logger.info("用户登录成功 - userId: {}, phone: {}", user.getUserId(), user.getPhone());
+
+            return R.ok("登录成功")
+                .put("token", token)
+                .put("user", user);
+
         } catch (WxErrorException e) {
-            //this.logger.error(e.getMessage(), e);
-            return R.error("授权失败,"+e.getMessage());
+            logger.error("微信授权失败: {}", e.getMessage(), e);
+            return R.error("授权失败: " + e.getMessage());
+        } catch (CustomException e) {
+            logger.error("业务处理异常: {}", e.getMessage(), e);
+            return R.error(e.getMessage());
+        } catch (Exception e) {
+            logger.error("系统异常: {}", e.getMessage(), e);
+            return R.error("系统异常,请稍后重试");
+        }
+    }
+
+    /**
+     * 查找或创建用户
+     */
+    private FsUser findOrCreateUser(WxMaJscode2SessionResult session,
+                                  WxMaPhoneNumberInfo phoneNoInfo,
+                                  String ip,
+                                  String userCode) {
+        // 优先通过unionid查找用户
+        FsUser user = null;
+        if (session.getUnionid() != null) {
+            user = userService.selectFsUserByUnionid(session.getUnionid());
+            if (user == null) {
+                user = userService.selectFsUserByMaOpenId(session.getOpenid());
+            }
+        } else {
+            user = userService.selectFsUserByMaOpenId(session.getOpenid());
+        }
+
+        if (user == null) {
+            // 检查手机号是否已存在
+            FsUser checkPhone = userService.selectFsUserByPhone(phoneNoInfo.getPhoneNumber());
+            if (checkPhone != null) {
+                if (checkPhone.getMaOpenId() == null) {
+                    // 更新已存在用户的信息
+                    user = updateExistingUser(checkPhone, session, ip);
+                } else {
+                    throw new CustomException("此手机号已被其他微信账号绑定");
+                }
+            } else {
+                // 创建新用户
+                user = createNewUser(session, phoneNoInfo, ip, userCode);
+            }
+        } else {
+            // 更新用户信息
+            updateUserInfo(user, phoneNoInfo, ip);
+        }
+
+        return user;
+    }
+
+    /**
+     * 更新已存在用户的信息
+     */
+    private FsUser updateExistingUser(FsUser existingUser, WxMaJscode2SessionResult session, String ip) {
+        FsUser userMap = new FsUser();
+        userMap.setMaOpenId(session.getOpenid());
+        userMap.setUserId(existingUser.getUserId());
+        userMap.setUpdateTime(new DateTime());
+        userMap.setLastIp(ip);
+        if (session.getUnionid() != null) {
+            userMap.setUnionId(session.getUnionid());
+        }
+        userService.updateFsUser(userMap);
+        return existingUser;
+    }
+
+    /**
+     * 创建新用户
+     */
+    private FsUser createNewUser(WxMaJscode2SessionResult session,
+                               WxMaPhoneNumberInfo phoneNoInfo,
+                               String ip,
+                               String userCode) {
+        FsUser user = new FsUser();
+
+        // 处理推荐关系
+        if (StringUtils.isNotEmpty(userCode)) {
+            FsUser tuiUser = userService.selectFsUserByUserCode(userCode);
+            if (tuiUser != null) {
+                user.setIsPromoter(1);
+                user.setSpreadUserId(tuiUser.getUserId());
+            }
         }
+
+        // 设置用户基本信息
+        user.setUserCode(OrderUtils.genUserCode());
+        user.setPhone(phoneNoInfo.getPhoneNumber());
+        user.setUsername(phoneNoInfo.getPhoneNumber());
+        user.setNickname("微信用户");
+        user.setStatus(1);
+        user.setMaOpenId(session.getOpenid());
+        user.setLastIp(ip);
+        user.setIsWeixinAuth(0);
+        user.setCreateTime(new Date());
+
+        if (session.getUnionid() != null) {
+            user.setUnionId(session.getUnionid());
+        }
+
+        userService.insertFsUser(user);
+        return user;
+    }
+
+    /**
+     * 更新用户信息
+     */
+    private void updateUserInfo(FsUser user, WxMaPhoneNumberInfo phoneNoInfo, String ip) {
+        FsUser userMap = new FsUser();
+        userMap.setPhone(phoneNoInfo.getPhoneNumber());
+        userMap.setUserId(user.getUserId());
+        userMap.setUpdateTime(new DateTime());
+        userMap.setLastIp(ip);
+        userService.updateFsUser(userMap);
     }
 
-//    /**
-//     * <pre>
-//     * 获取微信用户信息
-//     * </pre>
-//     */
-//    @Login
-//    @ApiOperation("获取微信小程序用户信息")
-//    @PostMapping("/getWeixinInfo")
-//    public R getWeixinInfo(@RequestBody LoginMpWxParam param) {
-//        final WxMaService wxService = WxMaConfiguration.getMaService(maProperties.getConfigs().get(0).getAppid());
-//        try {
-//            WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
-//            // 用户信息校验
-//            if (!wxService.getUserService().checkUserInfo(session.getSessionKey(), param.getRawData(), param.getSignature())) {
-//                return R.error("user check failed");
-//            }
-//            // 解密用户信息
-//            WxMaUserInfo userInfo = wxService.getUserService().getUserInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
-//            FsUser user=userService.selectFsUserById(Long.parseLong(getUserId()));
-//            user.setNickname(userInfo.getNickName());
-//            user.setAvatar(userInfo.getAvatarUrl());
-//            user.setIsWeixinAuth(1);
-//            userService.updateFsUser(user);
-//            return R.ok();
-//        } catch (WxErrorException e) {
-//            e.printStackTrace();
-//        }
-//        return R.ok("授权成功");
-//    }
+    /**
+     * <pre>
+     * 获取微信用户信息
+     * </pre>
+     */
+    @Login
+    @ApiOperation("获取微信小程序用户信息")
+    @PostMapping("/getWeixinInfo")
+    public R getWeixinInfo(@RequestBody LoginMpWxParam param) {
+        final WxMaService wxService = WxMaConfiguration.getMaService(maProperties.getConfigs().get(0).getAppid());
+        try {
+            WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
+            // 用户信息校验
+            if (!wxService.getUserService().checkUserInfo(session.getSessionKey(), param.getRawData(), param.getSignature())) {
+                return R.error("user check failed");
+            }
+            // 解密用户信息
+            WxMaUserInfo userInfo = wxService.getUserService().getUserInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
+            FsUser user=userService.selectFsUserById(Long.parseLong(getUserId()));
+            user.setNickname(userInfo.getNickName());
+            user.setAvatar(userInfo.getAvatarUrl());
+            user.setIsWeixinAuth(1);
+            userService.updateFsUser(user);
+            return R.ok();
+        } catch (WxErrorException e) {
+            e.printStackTrace();
+        }
+        return R.ok("授权成功");
+    }
 
     @ApiOperation("小程序登录")
     @PostMapping("/loginByMiniApp")

+ 1 - 1
fs-user-app/src/main/resources/application.yml

@@ -25,7 +25,7 @@ fs:
 # 开发环境配置
 server:
   # 服务器的HTTP端口,默认为8113
-  port: 8113
+  port: 7014
   servlet:
     # 应用的访问路径
     context-path: /

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů