Browse Source

Merge branch 'master' of http://1.14.104.71:10880/root/ylrz_his_scrm_java

caoliqin 1 week ago
parent
commit
6a509d06b4
53 changed files with 750 additions and 255 deletions
  1. 8 4
      fs-admin/src/main/java/com/fs/course/task/CompanyBalanceTask.java
  2. 9 12
      fs-admin/src/main/java/com/fs/his/controller/FsStoreOrderController.java
  3. 13 12
      fs-admin/src/main/java/com/fs/hisStore/task/MallStoreTask.java
  4. 27 27
      fs-admin/src/main/java/com/fs/task/SgTestController.java
  5. 0 2
      fs-admin/src/main/java/com/fs/task/SyncTuLinStudentInfoTask.java
  6. 0 103
      fs-admin/src/test/java/com/fs/course/controller/OpenIMServiceTest.java
  7. 8 0
      fs-company/src/main/java/com/fs/company/controller/course/FsUserCoursePeriodController.java
  8. 10 1
      fs-company/src/main/java/com/fs/company/controller/qw/QwSopLogsController.java
  9. 2 0
      fs-service/src/main/java/com/fs/company/service/ICompanyService.java
  10. 66 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java
  11. 4 0
      fs-service/src/main/java/com/fs/course/service/impl/BalanceRollbackErrorServiceImpl.java
  12. 56 4
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  13. 3 0
      fs-service/src/main/java/com/fs/course/vo/UserWatchLogListVo.java
  14. 199 17
      fs-service/src/main/java/com/fs/erp/service/impl/DfOrderServiceImpl.java
  15. 10 7
      fs-service/src/main/java/com/fs/his/mapper/FsDfAccountMapper.java
  16. 9 7
      fs-service/src/main/java/com/fs/his/service/IFsDfAccountService.java
  17. 12 7
      fs-service/src/main/java/com/fs/his/service/impl/FsDfAccountServiceImpl.java
  18. 2 0
      fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderServiceImpl.java
  19. 1 1
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderScrmMapper.java
  20. 2 0
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreOrderScrmService.java
  21. 30 8
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
  22. 12 3
      fs-service/src/main/java/com/fs/qw/service/impl/QwUserServiceImpl.java
  23. 7 0
      fs-service/src/main/java/com/fs/store/vo/h5/FsUserPageListVO.java
  24. 17 0
      fs-service/src/main/java/com/fs/tulin/entity/PeriodInfo.java
  25. 9 1
      fs-service/src/main/java/com/fs/tulin/mapper/TulinInfoSyncLogMapper.java
  26. 30 19
      fs-service/src/main/java/com/fs/tulin/service/impl/TulinInfoSyncLogServiceImpl.java
  27. 6 6
      fs-service/src/main/resources/application-common.yml
  28. 7 0
      fs-service/src/main/resources/application-config-druid-ddgy.yml
  29. 7 0
      fs-service/src/main/resources/application-config-druid-hat.yml
  30. 6 0
      fs-service/src/main/resources/application-config-druid-hcl.yml
  31. 6 0
      fs-service/src/main/resources/application-config-druid-hdt.yml
  32. 7 0
      fs-service/src/main/resources/application-config-druid-hst.yml
  33. 6 0
      fs-service/src/main/resources/application-config-druid-hyt.yml
  34. 6 0
      fs-service/src/main/resources/application-config-druid-jnmy.yml
  35. 6 0
      fs-service/src/main/resources/application-config-druid-jnsyj.yml
  36. 6 0
      fs-service/src/main/resources/application-config-druid-jzzx.yml
  37. 6 0
      fs-service/src/main/resources/application-config-druid-knt.yml
  38. 7 0
      fs-service/src/main/resources/application-config-druid-kyt.yml
  39. 6 0
      fs-service/src/main/resources/application-config-druid-nmgyt.yml
  40. 6 0
      fs-service/src/main/resources/application-config-druid-qdtst.yml
  41. 7 0
      fs-service/src/main/resources/application-config-druid-sxjz.yml
  42. 6 0
      fs-service/src/main/resources/application-config-myhk.yml
  43. 7 1
      fs-service/src/main/resources/application-config-zkzh.yml
  44. 3 1
      fs-service/src/main/resources/mapper/course/FsUserCompanyBindMapper.xml
  45. 4 0
      fs-service/src/main/resources/mapper/his/FsDfAccountMapper.xml
  46. 7 7
      fs-service/src/main/resources/mapper/his/FsStoreOrderMapper.xml
  47. 3 1
      fs-service/src/main/resources/mapper/his/FsUserMapper.xml
  48. 15 0
      fs-service/src/main/resources/mapper/tulin/TulinInfoSyncLogMapper.xml
  49. 10 2
      fs-user-app/src/main/java/com/fs/app/controller/CourseController.java
  50. 20 1
      fs-user-app/src/main/java/com/fs/app/controller/UserController.java
  51. 1 0
      fs-user-app/src/main/java/com/fs/app/controller/course/CourseFsUserController.java
  52. 32 0
      fs-user-app/src/main/java/com/fs/app/controller/course/CourseQwController.java
  53. 1 1
      fs-user-app/src/main/java/com/fs/app/utils/JwtUtils.java

+ 8 - 4
fs-admin/src/main/java/com/fs/course/task/CompanyBalanceTask.java

@@ -1,5 +1,6 @@
 package com.fs.course.task;
 package com.fs.course.task;
 
 
+import com.fs.company.service.ICompanyService;
 import com.fs.course.service.BalanceRollbackErrorService;
 import com.fs.course.service.BalanceRollbackErrorService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.context.event.ApplicationReadyEvent;
 import org.springframework.boot.context.event.ApplicationReadyEvent;
@@ -19,16 +20,19 @@ public class CompanyBalanceTask {
     @Autowired
     @Autowired
     private BalanceRollbackErrorService balanceRollbackErrorService;
     private BalanceRollbackErrorService balanceRollbackErrorService;
 
 
+    @Autowired
+    private ICompanyService companyService;
+
 
 
     /**
     /**
-     * @Description: 每 ? 秒从缓存获取余额同步到公司账户中 todo 待完善
+     * @Description: 每10分钟从缓存获取余额同步到公司账户中
      * @Param:
      * @Param:
      * @Return:
      * @Return:
      * @Author xgb
      * @Author xgb
      * @Date 2025/10/22 10:56
      * @Date 2025/10/22 10:56
      */
      */
     public void syncCompanyBalance() {
     public void syncCompanyBalance() {
-
+        companyService.syncCompanyBalance();
     }
     }
 
 
     /**
     /**
@@ -43,13 +47,13 @@ public class CompanyBalanceTask {
     }
     }
 
 
     /**
     /**
-     * @Description: spring启动执行 查询余额报存到缓存中 当缓存没数据时
+     * @Description: spring启动执行 initCompanyBalance 查询余额报存到缓存中
+     * 如果新增公司可以重启admin或者定时配置一下这个方法手动执行一次
      * @Param:
      * @Param:
      * @Return:
      * @Return:
      * @Author xgb
      * @Author xgb
      * @Date 2025/10/22 11:52
      * @Date 2025/10/22 11:52
      */
      */
-    @EventListener(ApplicationReadyEvent.class)
     public void initCompanyBalance() {
     public void initCompanyBalance() {
         balanceRollbackErrorService.initCompanyBalance();
         balanceRollbackErrorService.initCompanyBalance();
 
 

+ 9 - 12
fs-admin/src/main/java/com/fs/his/controller/FsStoreOrderController.java

@@ -770,19 +770,16 @@ public class FsStoreOrderController extends BaseController
 
 
     private FsStoreOrderDf getDFInfo(String loginAccount) {
     private FsStoreOrderDf getDFInfo(String loginAccount) {
         //查询订单账户 判断是否存在该订单账户
         //查询订单账户 判断是否存在该订单账户
-        List<DFConfigVo> erpAccounts = fsStoreOrderService.getErpAccount();
+        FsDfAccount erpAccount = fsDfAccountService.selectFsDfAccountByAccount(loginAccount);
         FsStoreOrderDf df = new FsStoreOrderDf();
         FsStoreOrderDf df = new FsStoreOrderDf();
-        for (DFConfigVo erpAccount : erpAccounts) {
-            if (loginAccount.equals(erpAccount.getLoginAccount())){
-                //添加df记录
-                df.setAppKey(erpAccount.getDfAppKey());
-                df.setAppSecret(erpAccount.getDfAppsecret());
-                df.setLoginAccount(loginAccount);
-                df.setMonthlyCard(erpAccount.getMonthlyCard());
-                df.setExpressProductCode(erpAccount.getExpressProductCode());
-                df.setStatus(0);
-                break;
-            }
+        if (erpAccount != null){
+            //添加df记录
+            df.setAppKey(erpAccount.getDfAppKey());
+            df.setAppSecret(erpAccount.getDfAppsecret());
+            df.setLoginAccount(loginAccount);
+            df.setMonthlyCard(erpAccount.getMonthlyCard());
+            df.setExpressProductCode(erpAccount.getExpressProductCode());
+            df.setStatus(0);
         }
         }
         return df;
         return df;
     }
     }

+ 13 - 12
fs-admin/src/main/java/com/fs/hisStore/task/MallStoreTask.java

@@ -207,23 +207,24 @@ public class MallStoreTask
             ErpOrderQueryRequert request = new ErpOrderQueryRequert();
             ErpOrderQueryRequert request = new ErpOrderQueryRequert();
             request.setCode(order.getExtendOrderId());
             request.setCode(order.getExtendOrderId());
             IErpOrderService erpOrderService = getErpOrderService();
             IErpOrderService erpOrderService = getErpOrderService();
-            ErpOrderQueryResponse response = erpOrderService.getOrder(request);
-            if(response.getOrders()!=null&&response.getOrders().size()>0){
-                for(ErpOrderQuery orderQuery : response.getOrders()){
-                    if(orderQuery.getDeliverys()!=null&&orderQuery.getDeliverys().size()>0){
-                        for(ErpDeliverys delivery:orderQuery.getDeliverys()){
-                            if(delivery.getDelivery()&&StringUtils.isNotEmpty(delivery.getMail_no())){
-                                //更新商订单状态 删除REDIS
-                                orderService.deliveryOrder(order.getOrderCode(),delivery.getMail_no(),delivery.getExpress_code(),delivery.getExpress_name());
-                                redisCache.deleteObject(DELIVERY+":"+order.getExtendOrderId());
+            ErpOrderQueryResponse response = erpOrderService.getScrmOrder(request);
+            if (erpOrderService != dfOrderService) {
+                if(response.getOrders()!=null && !response.getOrders().isEmpty()){
+                    for(ErpOrderQuery orderQuery : response.getOrders()){
+                        if(orderQuery.getDeliverys()!=null&&orderQuery.getDeliverys().size()>0){
+                            for(ErpDeliverys delivery:orderQuery.getDeliverys()){
+                                if(delivery.getDelivery()&&StringUtils.isNotEmpty(delivery.getMail_no())){
+                                    //更新商订单状态 删除REDIS
+                                    orderService.deliveryOrder(order.getOrderCode(),delivery.getMail_no(),delivery.getExpress_code(),delivery.getExpress_name());
+                                    redisCache.deleteObject(DELIVERY+":"+order.getExtendOrderId());
+                                }
                             }
                             }
-                        }
 
 
+                        }
                     }
                     }
-                }
 
 
+                }
             }
             }
-
         }
         }
 
 
     }
     }

+ 27 - 27
fs-admin/src/main/java/com/fs/task/SgTestController.java

@@ -1,27 +1,27 @@
-package com.fs.task;
-
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-
-/**
- * @description:
- * @author: Guos
- * @time: 2025/10/23 下午2:18
- */
-@RestController
-@RequestMapping("/sg/test")
-public class SgTestController {
-
-    @Resource
-    private SyncTuLinStudentInfoTask syncTuLinStudentInfoTask;
-
-
-    @RequestMapping("/execute")
-    public void execute(){
-        syncTuLinStudentInfoTask.execute();
-    }
-
-
-}
+//package com.fs.task;
+//
+//import org.springframework.web.bind.annotation.RequestMapping;
+//import org.springframework.web.bind.annotation.RestController;
+//
+//import javax.annotation.Resource;
+//
+///**
+// * @description:
+// * @author: Guos
+// * @time: 2025/10/23 下午2:18
+// */
+//@RestController
+//@RequestMapping("/sg/test")
+//public class SgTestController {
+//
+//    @Resource
+//    private SyncTuLinStudentInfoTask syncTuLinStudentInfoTask;
+//
+//
+//    @RequestMapping("/execute")
+//    public void execute(){
+//        syncTuLinStudentInfoTask.execute();
+//    }
+//
+//
+//}

+ 0 - 2
fs-admin/src/main/java/com/fs/task/SyncTuLinStudentInfoTask.java

@@ -1,10 +1,8 @@
 package com.fs.task;
 package com.fs.task;
 
 
-import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fs.tulin.service.ITulinInfoSyncLogService;
 import com.fs.tulin.service.ITulinInfoSyncLogService;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
-
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 
 
 /**
 /**

+ 0 - 103
fs-admin/src/test/java/com/fs/course/controller/OpenIMServiceTest.java

@@ -1,103 +0,0 @@
-package com.fs.course.controller;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fs.FSApplication;
-import com.fs.common.annotation.DataSource;
-import com.fs.im.dto.OpenImMsgDTO;
-import com.fs.im.dto.OpenImResponseDTO;
-import com.fs.im.service.OpenIMService;
-import lombok.extern.slf4j.Slf4j;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.test.context.ActiveProfiles;
-
-import static org.junit.Assert.assertNotNull;
-
-@Slf4j
-@ActiveProfiles("druid-fby-test")
-@RunWith(org.springframework.test.context.junit4.SpringRunner.class)
-@SpringBootTest(classes = FSApplication.class)
-public class OpenIMServiceTest {
-
-    @Autowired
-    private OpenIMService openIMService;
-    @Test
-    public void openIMSendMsg() {
-        OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
-        openImMsgDTO.setSendID("fbyC8584");
-        openImMsgDTO.setRecvID("fbyU1077739");
-//        openImMsgDTO.setGroupID("group789");
-        openImMsgDTO.setSenderNickname("测试用户");
-        openImMsgDTO.setSenderFaceURL("https://example.com/avatar.jpg");
-        openImMsgDTO.setSenderPlatformID(1);
-        openImMsgDTO.setContentType(101);
-        openImMsgDTO.setSessionType(1);
-        openImMsgDTO.setOnlineOnly(false);
-        openImMsgDTO.setNotOfflinePush(false);
-        openImMsgDTO.setSendTime(System.currentTimeMillis());
-        openImMsgDTO.setEx("额外信息");
-
-        // Content
-        OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
-        content.setContent("Hello World");
-        content.setData("test data");
-        content.setDescription("测试消息");
-        content.setExtension("ext");
-        openImMsgDTO.setContent(content);
-
-        // OfflinePushInfo
-        OpenImMsgDTO.OfflinePushInfo offlinePushInfo = new OpenImMsgDTO.OfflinePushInfo();
-        offlinePushInfo.setTitle("新消息");
-        offlinePushInfo.setDesc("您收到一条新消息");
-        offlinePushInfo.setEx("push ex");
-        offlinePushInfo.setIOSPushSound("default");
-        offlinePushInfo.setIOSBadgeCount(true);
-        openImMsgDTO.setOfflinePushInfo(offlinePushInfo);
-
-        // 调用方法
-        OpenImResponseDTO result = openIMService.openIMSendMsg(openImMsgDTO);
-
-        // 断言
-        assertNotNull(result);
-    }
-
-    @Test
-    public void aiAutoReply() {
-    }
-
-    @Test
-    public void sendUtil() {
-    }
-
-    @Test
-    public void sendUtilUserToDoctor() {
-    }
-
-    @Test
-    public void editConversation() {
-    }
-
-    @Test
-    public void sendCourse() throws JsonProcessingException {
-        Long userId = 1077739L;
-        Long companyUserId = 8584L;
-        String url = "https://example.com/course/123";
-        String title = "Java编程基础课程";
-        String linkImageUrl = "https://example.com/images/course-cover.jpg";
-        String cropId = "crop_123456";
-
-        OpenImResponseDTO actualResponse = openIMService.sendCourse(
-                userId, companyUserId, url, title, linkImageUrl, cropId
-        );
-        log.info("返回结果: {}",actualResponse);
-    }
-
-    @Test
-    public void sendPackageUtil() {
-    }
-}

+ 8 - 0
fs-company/src/main/java/com/fs/company/controller/course/FsUserCoursePeriodController.java

@@ -1,11 +1,13 @@
 package com.fs.company.controller.course;
 package com.fs.company.controller.course;
 
 
+import cn.hutool.core.util.ObjectUtil;
 import com.fs.common.annotation.Log;
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.enums.BusinessType;
+import com.fs.common.exception.CustomException;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.course.domain.FsUserCoursePeriod;
 import com.fs.course.domain.FsUserCoursePeriod;
@@ -74,6 +76,9 @@ public class FsUserCoursePeriodController extends BaseController {
     @ApiOperation("自定义查询主列表分页")
     @ApiOperation("自定义查询主列表分页")
     public R pageList(@RequestBody FsUserCoursePeriod fsUserCoursePeriod)
     public R pageList(@RequestBody FsUserCoursePeriod fsUserCoursePeriod)
     {
     {
+        if (ObjectUtil.isNotEmpty(fsUserCoursePeriod.getTrainingCampId())){
+            throw new CustomException("训练营不能为空!");
+        }
 //        startPage();
 //        startPage();
         PageHelper.startPage(fsUserCoursePeriod.getPageNum(), fsUserCoursePeriod.getPageSize());
         PageHelper.startPage(fsUserCoursePeriod.getPageNum(), fsUserCoursePeriod.getPageSize());
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
@@ -120,6 +125,9 @@ public class FsUserCoursePeriodController extends BaseController {
     @PostMapping
     @PostMapping
     public AjaxResult add(@RequestBody FsUserCoursePeriod fsUserCoursePeriod)
     public AjaxResult add(@RequestBody FsUserCoursePeriod fsUserCoursePeriod)
     {
     {
+        if (ObjectUtil.isNotEmpty(fsUserCoursePeriod.getTrainingCampId())){
+            throw new CustomException("训练营不能为空!");
+        }
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         fsUserCoursePeriod.setCompanyId(loginUser.getCompany().getCompanyId().toString());
         fsUserCoursePeriod.setCompanyId(loginUser.getCompany().getCompanyId().toString());
         return toAjax(fsUserCoursePeriodService.insertFsUserCoursePeriod(fsUserCoursePeriod));
         return toAjax(fsUserCoursePeriodService.insertFsUserCoursePeriod(fsUserCoursePeriod));

+ 10 - 1
fs-company/src/main/java/com/fs/company/controller/qw/QwSopLogsController.java

@@ -1,10 +1,12 @@
 package com.fs.company.controller.qw;
 package com.fs.company.controller.qw;
 
 
+import cn.hutool.core.util.ObjectUtil;
 import com.fs.common.annotation.Log;
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.core.redis.RedisCache;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.common.utils.poi.ExcelUtil;
@@ -60,7 +62,8 @@ public class QwSopLogsController extends BaseController
 
 
     @Autowired
     @Autowired
     private ICompanyUserService iCompanyUserService;
     private ICompanyUserService iCompanyUserService;
-
+    @Autowired
+    private RedisCache redisCache;
     @Autowired
     @Autowired
     private CompanyDeptServiceImpl companyDeptService;
     private CompanyDeptServiceImpl companyDeptService;
 
 
@@ -266,6 +269,12 @@ public class QwSopLogsController extends BaseController
     @PutMapping("/editCourseQwSopLogs/{ids}")
     @PutMapping("/editCourseQwSopLogs/{ids}")
     public AjaxResult editCourseQwSopLogs(@PathVariable String[] ids)
     public AjaxResult editCourseQwSopLogs(@PathVariable String[] ids)
     {
     {
+       if (ObjectUtil.isNotEmpty(ids)){
+           for (String id : ids) {
+               String key = "qw:logs:pad:send:id:" + id;
+               redisCache.deleteObject(key);
+           }
+       }
         return toAjax(iQwSopLogsService.editCourseQwSopLogs(ids));
         return toAjax(iQwSopLogsService.editCourseQwSopLogs(ids));
     }
     }
 
 

+ 2 - 0
fs-service/src/main/java/com/fs/company/service/ICompanyService.java

@@ -167,4 +167,6 @@ public interface ICompanyService
     List<OptionsVO> getCompanyListByCorpId(String corpId);
     List<OptionsVO> getCompanyListByCorpId(String corpId);
 
 
     void subtractCompanyMoneyHourse(BigDecimal money, Long companyId, LocalTime start, LocalTime end);
     void subtractCompanyMoneyHourse(BigDecimal money, Long companyId, LocalTime start, LocalTime end);
+
+    void syncCompanyBalance();
 }
 }

+ 66 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java

@@ -8,7 +8,9 @@ import java.util.stream.Collectors;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
+import com.fs.common.constant.FsConstants;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.SecurityUtils;
 import com.fs.common.utils.SecurityUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.StringUtils;
@@ -46,6 +48,7 @@ import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyService;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.TransactionTemplate;
 
 
 import static com.fs.company.service.impl.CompanyMiniappServiceImpl.GET_MINI_APP_STR;
 import static com.fs.company.service.impl.CompanyMiniappServiceImpl.GET_MINI_APP_STR;
 
 
@@ -97,6 +100,12 @@ public class CompanyServiceImpl implements ICompanyService
     @Autowired
     @Autowired
     private CompanyUserMapper companyUserMapper;
     private CompanyUserMapper companyUserMapper;
 
 
+    @Autowired
+    private RedisCache redisCache;
+
+    @Autowired
+    private TransactionTemplate transactionTemplate;
+
     @Override
     @Override
     public List<OptionsVO> selectAllCompanyList(Long deptId) {
     public List<OptionsVO> selectAllCompanyList(Long deptId) {
         return companyMapper.selectAllCompanyList(deptId);
         return companyMapper.selectAllCompanyList(deptId);
@@ -1285,4 +1294,61 @@ public class CompanyServiceImpl implements ICompanyService
             }
             }
         }
         }
     }
     }
+
+    /**
+     * @Description: 同步公司余额到数据库中
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2025/10/24 16:49
+     */
+    @Override
+    public void syncCompanyBalance() {
+        Company query = new Company();
+        query.setIsDel(0);
+        // 查询公司列表 同步公司余额
+        List<Company> companyList = companyMapper.selectCompanyList(query);
+        Optional.ofNullable(companyList)
+                .ifPresent(list -> list.forEach(company -> {
+                    try {
+                        transactionTemplate.execute(status -> {
+                            String moneyStr = redisCache.getCacheObject(FsConstants.COMPANY_MONEY_KEY + company.getCompanyId());
+                            if (StringUtils.isNotEmpty(moneyStr)) {
+                                BigDecimal redisMoney = new BigDecimal(moneyStr);
+                                BigDecimal dbMoney = company.getMoney();
+                                BigDecimal amount = redisMoney.subtract(dbMoney); // 计算差额
+
+                                // 只有当余额不一致时才更新
+                                if (amount.compareTo(BigDecimal.ZERO) != 0) {
+                                    company.setMoney(redisMoney);
+                                    int updateResult = companyMapper.updateCompany(company);
+                                    if(updateResult != 1){
+                                        logger.error("更新公司余额失败,公司ID: {}", company.getCompanyId());
+                                        throw new RuntimeException("更新公司余额失败");
+                                    }
+
+                                    // 记录余额变更日志
+                                    CompanyMoneyLogs log = new CompanyMoneyLogs();
+                                    log.setCompanyId(company.getCompanyId());
+                                    log.setRemark("同步公司余额,差额: " + amount);
+                                    log.setMoney(amount);
+                                    log.setLogsType(15);
+                                    log.setBalance(redisMoney);
+                                    log.setCreateTime(new Date());
+
+                                    int logResult = moneyLogsMapper.insertCompanyMoneyLogs(log);
+                                    if(logResult != 1){
+                                        logger.error("添加公司余额日志失败,公司ID: {}", company.getCompanyId());
+                                        throw new RuntimeException("添加公司余额日志失败");
+                                    }
+                                }
+                            }
+                            return null;
+                        });
+                    } catch (Exception e) {
+                        logger.error("同步公司余额失败,公司ID: {}", company.getCompanyId(), e);
+                    }
+                }));
+    }
+
 }
 }

+ 4 - 0
fs-service/src/main/java/com/fs/course/service/impl/BalanceRollbackErrorServiceImpl.java

@@ -15,6 +15,8 @@ import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.event.ApplicationReadyEvent;
+import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
@@ -87,6 +89,8 @@ public class BalanceRollbackErrorServiceImpl extends ServiceImpl<BalanceRollback
     }
     }
 
 
     @Override
     @Override
+    // todo
+//    @EventListener(ApplicationReadyEvent.class)
     public void initCompanyBalance() {
     public void initCompanyBalance() {
 
 
         // 查询公司表 Company
         // 查询公司表 Company

+ 56 - 4
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -1491,12 +1491,60 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         //2025.6.19 红包金额为0的时候
         //2025.6.19 红包金额为0的时候
         if (amount.compareTo(BigDecimal.ZERO)>0){
         if (amount.compareTo(BigDecimal.ZERO)>0){
 
 
+            Company company = companyMapper.selectCompanyById(param.getCompanyId());
+            BigDecimal money = company.getMoney();
+            if (money.compareTo(BigDecimal.ZERO)<=0) {
+                return R.error("服务商余额不足,请联系群主服务器充值!");
+            }
+
+            // 发送红包
+            R sendRedPacket = paymentService.sendRedPacket(packetParam);
+            if (sendRedPacket.get("code").equals(200)) {
+                FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
+                TransferBillsResult transferBillsResult;
+                if (sendRedPacket.get("isNew").equals(1)){
+                    transferBillsResult = (TransferBillsResult)sendRedPacket.get("data");
+                    redPacketLog.setResult(JSON.toJSONString(sendRedPacket));
+                    redPacketLog.setOutBatchNo(transferBillsResult.getOutBillNo());
+                    redPacketLog.setBatchId(transferBillsResult.getTransferBillNo());
+                }else {
+                    redPacketLog.setOutBatchNo(sendRedPacket.get("orderCode").toString());
+                    redPacketLog.setBatchId(sendRedPacket.get("batchId").toString());
+                }
+                // 添加红包记录
+                redPacketLog.setCourseId(param.getCourseId());
+                redPacketLog.setCompanyId(param.getCompanyId());
+                redPacketLog.setUserId(param.getUserId());
+                redPacketLog.setVideoId(param.getVideoId());
+                redPacketLog.setStatus(0);
+                redPacketLog.setQwUserId(param.getQwUserId() != null ? param.getQwUserId() : null);
+                redPacketLog.setCompanyUserId(param.getCompanyUserId());
+                redPacketLog.setCreateTime(new Date());
+                redPacketLog.setAmount(amount);
+                redPacketLog.setWatchLogId(log.getLogId() != null ? log.getLogId() : null);
+                redPacketLog.setPeriodId(param.getPeriodId());
+                redPacketLog.setAppId(param.getAppId());
+
+                redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
+
+                // 更新观看记录的奖励类型
+                log.setRewardType(config.getRewardType());
+                courseWatchLogMapper.updateFsCourseWatchLog(log);
+
+                return sendRedPacket;
+            } else {
+                return R.error("奖励发送失败,请联系客服");
+            }
+
+            // 先注释 20251024 redis 余额 充值没有考虑 其余扣减没有考虑
             // ===================== 20251022 xgb 修改 本次修改目的为了实时扣减公司余额=====================
             // ===================== 20251022 xgb 修改 本次修改目的为了实时扣减公司余额=====================
             // 1 使用redis缓存加锁 预扣减余额 红包发送失败 恢复redis缓存余额,如果回滚失败登记异常记录表 定时任务重新回滚余额
             // 1 使用redis缓存加锁 预扣减余额 红包发送失败 恢复redis缓存余额,如果回滚失败登记异常记录表 定时任务重新回滚余额
             // 2 另起定时任务 同步缓存余额到redis中
             // 2 另起定时任务 同步缓存余额到redis中
             // 3 启动系统时查询公司账户余额(这个时候要保证余额正确)保存到redis缓存中
             // 3 启动系统时查询公司账户余额(这个时候要保证余额正确)保存到redis缓存中
 
 
+
             // 预设值异常对象
             // 预设值异常对象
+            /*
             BalanceRollbackError balanceRollbackError = new BalanceRollbackError();
             BalanceRollbackError balanceRollbackError = new BalanceRollbackError();
             balanceRollbackError.setCompanyId(packetParam.getCompanyId());
             balanceRollbackError.setCompanyId(packetParam.getCompanyId());
             balanceRollbackError.setUserId(user.getUserId());
             balanceRollbackError.setUserId(user.getUserId());
@@ -1554,6 +1602,8 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 }
                 }
             }
             }
 
 
+
+
             // 调用第三方接口(锁外操作)
             // 调用第三方接口(锁外操作)
             R sendRedPacket;
             R sendRedPacket;
             try {
             try {
@@ -1562,7 +1612,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 logger.error("红包发送异常: 异常请求参数{}",packetParam, e);
                 logger.error("红包发送异常: 异常请求参数{}",packetParam, e);
                 // 异常时回滚余额
                 // 异常时回滚余额
 
 
-                rollbackBalance(balanceRollbackError);
+//                rollbackBalance(balanceRollbackError);
                 return R.error("奖励发送失败,请联系客服");
                 return R.error("奖励发送失败,请联系客服");
             }
             }
 
 
@@ -1600,12 +1650,14 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 courseWatchLogMapper.updateFsCourseWatchLog(log);
                 courseWatchLogMapper.updateFsCourseWatchLog(log);
                 // 发送成功,记录日志等操作
                 // 发送成功,记录日志等操作
                 return sendRedPacket;
                 return sendRedPacket;
+
+
             } else {
             } else {
                 // 发送失败,回滚余额
                 // 发送失败,回滚余额
-                rollbackBalance(balanceRollbackError);
+//                rollbackBalance(balanceRollbackError);
                 return R.error("奖励发送失败,请联系客服");
                 return R.error("奖励发送失败,请联系客服");
             }
             }
-
+             */
             // ===================== 本次修改目的为了实时扣减公司余额=====================
             // ===================== 本次修改目的为了实时扣减公司余额=====================
         } else {
         } else {
             FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
             FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
@@ -1822,7 +1874,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         redPacketLog.setWatchLogId(log.getLogId() !=null ? log.getLogId() : null);
         redPacketLog.setWatchLogId(log.getLogId() !=null ? log.getLogId() : null);
         redPacketLog.setPeriodId(param.getPeriodId());
         redPacketLog.setPeriodId(param.getPeriodId());
         redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
         redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
-        return R.ok("奖励发放成功").put("rewardType",config.getRewardType());
+        return R.ok("积分奖励发放成功").put("rewardType",config.getRewardType());
     }
     }
 
 
     @Override
     @Override

+ 3 - 0
fs-service/src/main/java/com/fs/course/vo/UserWatchLogListVo.java

@@ -25,6 +25,9 @@ public class UserWatchLogListVo {
     private String projectName;
     private String projectName;
     private String courseName;
     private String courseName;
     private String videoName;
     private String videoName;
+    //所属企微
     private String qwUserName;
     private String qwUserName;
+    //所属企微主体
+    private String corpName;
 
 
 }
 }

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

@@ -7,6 +7,9 @@ import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.fs.common.event.TemplateBean;
+import com.fs.common.event.TemplateEvent;
+import com.fs.common.event.TemplateListenEnum;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.DateUtils;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyService;
 import com.fs.erp.domain.ErpDeliverys;
 import com.fs.erp.domain.ErpDeliverys;
@@ -27,12 +30,18 @@ import com.fs.his.service.IFsExpressService;
 import com.fs.his.service.IFsStoreOrderLogsService;
 import com.fs.his.service.IFsStoreOrderLogsService;
 import com.fs.his.service.IFsStoreOrderService;
 import com.fs.his.service.IFsStoreOrderService;
 import com.fs.his.utils.ConfigUtil;
 import com.fs.his.utils.ConfigUtil;
+import com.fs.hisStore.domain.FsExpressScrm;
 import com.fs.hisStore.domain.FsStoreOrderItemScrm;
 import com.fs.hisStore.domain.FsStoreOrderItemScrm;
 import com.fs.hisStore.domain.FsStoreOrderScrm;
 import com.fs.hisStore.domain.FsStoreOrderScrm;
 import com.fs.hisStore.domain.FsStoreProductScrm;
 import com.fs.hisStore.domain.FsStoreProductScrm;
+import com.fs.hisStore.enums.OrderInfoEnum;
+import com.fs.hisStore.enums.OrderLogEnum;
+import com.fs.hisStore.enums.ShipperCodeEnum;
 import com.fs.hisStore.mapper.FsStoreOrderItemScrmMapper;
 import com.fs.hisStore.mapper.FsStoreOrderItemScrmMapper;
 import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
 import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
 import com.fs.hisStore.mapper.FsStoreProductScrmMapper;
 import com.fs.hisStore.mapper.FsStoreProductScrmMapper;
+import com.fs.hisStore.service.IFsExpressScrmService;
+import com.fs.hisStore.service.IFsStoreOrderScrmService;
 import com.fs.hisStore.vo.FsStoreOrderItemVO;
 import com.fs.hisStore.vo.FsStoreOrderItemVO;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
 import com.fs.system.mapper.SysConfigMapper;
@@ -51,8 +60,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 
 
 @Service
 @Service
 @Slf4j
 @Slf4j
-public class DfOrderServiceImpl implements IErpOrderService
-{
+public class DfOrderServiceImpl implements IErpOrderService {
 //    @Autowired
 //    @Autowired
 //    ConfigUtil configUtil;
 //    ConfigUtil configUtil;
 
 
@@ -89,6 +97,9 @@ public class DfOrderServiceImpl implements IErpOrderService
     @Autowired
     @Autowired
     private IFsStoreOrderLogsService fsStoreOrderLogsService;
     private IFsStoreOrderLogsService fsStoreOrderLogsService;
 
 
+    @Autowired
+    private IFsStoreOrderScrmService fsStoreOrderScrmLogsService;
+
     @Autowired
     @Autowired
     private ICompanyService companyService;
     private ICompanyService companyService;
 
 
@@ -97,6 +108,10 @@ public class DfOrderServiceImpl implements IErpOrderService
 
 
     @Autowired
     @Autowired
     private IFsExpressService expressService;
     private IFsExpressService expressService;
+
+    @Autowired
+    private IFsExpressScrmService expressScrmService;
+
     @Autowired
     @Autowired
     private IFsStoreOrderService fsStoreOrderService;
     private IFsStoreOrderService fsStoreOrderService;
 
 
@@ -126,7 +141,7 @@ public class DfOrderServiceImpl implements IErpOrderService
         String orderCode = order.getOrderCode();
         String orderCode = order.getOrderCode();
         FsStoreOrder fsStoreOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(orderCode);
         FsStoreOrder fsStoreOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(orderCode);
         FsStoreOrderDf df = fsStoreOrderDfMapper.selectFsStoreOrderDfByOrderId(fsStoreOrder.getOrderId());
         FsStoreOrderDf df = fsStoreOrderDfMapper.selectFsStoreOrderDfByOrderId(fsStoreOrder.getOrderId());
-        if (df == null){
+        if (df == null) {
             return null;
             return null;
         }
         }
         Long dfAccountId = getSFAccountIndex(fsStoreOrder.getOrderId());
         Long dfAccountId = getSFAccountIndex(fsStoreOrder.getOrderId());
@@ -240,7 +255,7 @@ public class DfOrderServiceImpl implements IErpOrderService
             if (order != null) {
             if (order != null) {
                 //获取下单账户
                 //获取下单账户
                 FsStoreOrderDf df = fsStoreOrderDfMapper.selectFsStoreOrderDfByOrderId(order.getOrderId());
                 FsStoreOrderDf df = fsStoreOrderDfMapper.selectFsStoreOrderDfByOrderId(order.getOrderId());
-                if(df == null){
+                if (df == null) {
                     return null;
                     return null;
                 }
                 }
                 Long dfAccountId = getSFAccountIndex(order.getOrderId());
                 Long dfAccountId = getSFAccountIndex(order.getOrderId());
@@ -261,7 +276,30 @@ public class DfOrderServiceImpl implements IErpOrderService
 
 
     @Override
     @Override
     public ErpOrderQueryResponse getScrmOrder(ErpOrderQueryRequert param) {
     public ErpOrderQueryResponse getScrmOrder(ErpOrderQueryRequert param) {
-        return null;
+        ErpOrderQueryResponse response = new ErpOrderQueryResponse();
+        String orderNumber = param.getCode();
+        if (StrUtil.isNotBlank(orderNumber)) {
+            FsStoreOrderScrm order = fsStoreOrderScrmMapper.selectFsStoreOrderByOrderCode(orderNumber);
+            if (order != null) {
+                //获取下单账户
+                FsStoreOrderDf df = fsStoreOrderDfMapper.selectFsStoreOrderDfByOrderId(order.getId());
+                if (df == null) {
+                    return null;
+                }
+                Long dfAccountId = getSFAccountIndex(order.getId());
+                if (dfAccountId != null) {
+                    Map<String, Object> orderResultQueryParam = new HashMap<>();
+                    orderResultQueryParam.put("orderNumber", orderNumber);
+                    orderResultQueryParam.put("exInterfaceType", df.getStatus());
+                    getOrderScrmResult(orderResultQueryParam, dfAccountId);
+                    return response;
+                }
+            }
+            response.setErrorDesc("该订单不存在/顺丰账户不存在");
+        } else {
+            response.setErrorDesc("未获取到原始订单号");
+        }
+        return response;
     }
     }
 
 
     @Override
     @Override
@@ -290,7 +328,7 @@ public class DfOrderServiceImpl implements IErpOrderService
         try {
         try {
             String response = client.execute(RequestUrlEnum.ORDER_DELIVERY_STATUS, map, dfAccountId);
             String response = client.execute(RequestUrlEnum.ORDER_DELIVERY_STATUS, map, dfAccountId);
             DFApiResponse dfApiResponse = JSON.parseObject(response, DFApiResponse.class);
             DFApiResponse dfApiResponse = JSON.parseObject(response, DFApiResponse.class);
-            if ("运单不存在".equals(dfApiResponse.getMsg())){
+            if ("运单不存在".equals(dfApiResponse.getMsg())) {
 
 
                 //查看原来物流状态
                 //查看原来物流状态
                 cancelOrder(order);
                 cancelOrder(order);
@@ -352,7 +390,7 @@ public class DfOrderServiceImpl implements IErpOrderService
                         Map<String, Object> config = (Map<String, Object>) JSON.parse(sysConfig.getConfigValue());
                         Map<String, Object> config = (Map<String, Object>) JSON.parse(sysConfig.getConfigValue());
                         Object isUpdateOrder = config.get("isUpdateOrder");
                         Object isUpdateOrder = config.get("isUpdateOrder");
                         if (isUpdateOrder == null || "1".equals(isUpdateOrder.toString())) {
                         if (isUpdateOrder == null || "1".equals(isUpdateOrder.toString())) {
-                            fsStoreOrderService.getGoods(order.getOrderId(),"物流自动");
+                            fsStoreOrderService.getGoods(order.getOrderId(), "物流自动");
                         }
                         }
                         break;
                         break;
                     case 10:
                     case 10:
@@ -386,7 +424,7 @@ public class DfOrderServiceImpl implements IErpOrderService
             order.setDeliverySn("");
             order.setDeliverySn("");
             fsStoreOrderMapper.updateFsStoreOrder(order);
             fsStoreOrderMapper.updateFsStoreOrder(order);
             fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.UPDATE_ORDER_DF.getValue(),
             fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.UPDATE_ORDER_DF.getValue(),
-                    "运单不存在,"+FsStoreOrderLogEnum.UPDATE_ORDER_DF.getDesc());
+                    "运单不存在," + FsStoreOrderLogEnum.UPDATE_ORDER_DF.getDesc());
         } else {
         } else {
             //有物流信息->售后处理
             //有物流信息->售后处理
             //取消订单
             //取消订单
@@ -396,7 +434,7 @@ public class DfOrderServiceImpl implements IErpOrderService
             afterSalesParam.setOperator("代服管家");
             afterSalesParam.setOperator("代服管家");
             fsStoreOrderService.afterSales(afterSalesParam);
             fsStoreOrderService.afterSales(afterSalesParam);
             fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.REFUND_ORDER_DF.getValue(),
             fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.REFUND_ORDER_DF.getValue(),
-                    "运单不存在,"+FsStoreOrderLogEnum.REFUND_ORDER_DF.getDesc());
+                    "运单不存在," + FsStoreOrderLogEnum.REFUND_ORDER_DF.getDesc());
         }
         }
         FsStoreOrderDf df = new FsStoreOrderDf();
         FsStoreOrderDf df = new FsStoreOrderDf();
         df.setOrderId(order.getOrderId());
         df.setOrderId(order.getOrderId());
@@ -404,6 +442,7 @@ public class DfOrderServiceImpl implements IErpOrderService
         df.setUpdateTime(new Date());
         df.setUpdateTime(new Date());
         fsStoreOrderDfMapper.updateFsStoreOrderDf(df);
         fsStoreOrderDfMapper.updateFsStoreOrderDf(df);
     }
     }
+
     /**
     /**
      * 获取erp推送参数
      * 获取erp推送参数
      *
      *
@@ -438,7 +477,7 @@ public class DfOrderServiceImpl implements IErpOrderService
                 orderResultQueryParam.put("orderNumber", order.getPlatform_code());
                 orderResultQueryParam.put("orderNumber", order.getPlatform_code());
                 orderResultQueryParam.put("exInterfaceType", df.getStatus());
                 orderResultQueryParam.put("exInterfaceType", df.getStatus());
                 try {
                 try {
-                    getOrderResult(orderResultQueryParam,dfAccountId);
+                    getOrderScrmResult(orderResultQueryParam, dfAccountId);
                 } catch (Exception e) {
                 } catch (Exception e) {
                     log.info("推送订单完成,查询订单问题{}", e.getMessage());
                     log.info("推送订单完成,查询订单问题{}", e.getMessage());
                 }
                 }
@@ -489,7 +528,7 @@ public class DfOrderServiceImpl implements IErpOrderService
                 orderResultQueryParam.put("orderNumber", order.getPlatform_code());
                 orderResultQueryParam.put("orderNumber", order.getPlatform_code());
                 orderResultQueryParam.put("exInterfaceType", df.getStatus());
                 orderResultQueryParam.put("exInterfaceType", df.getStatus());
                 try {
                 try {
-                    getOrderResult(orderResultQueryParam,dfAccountId);
+                    getOrderResult(orderResultQueryParam, dfAccountId);
                 } catch (Exception e) {
                 } catch (Exception e) {
                     log.info("推送订单完成,查询订单问题{}", e.getMessage());
                     log.info("推送订单完成,查询订单问题{}", e.getMessage());
                 }
                 }
@@ -636,7 +675,12 @@ public class DfOrderServiceImpl implements IErpOrderService
                 skuVo.setProductName(product.getProductName()); //商品名称
                 skuVo.setProductName(product.getProductName()); //商品名称
                 com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(item.getJsonInfo());
                 com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(item.getJsonInfo());
                 skuVo.setSkuCode(jsonObject.getString("sku")); //sku编码
                 skuVo.setSkuCode(jsonObject.getString("sku")); //sku编码
-                skuVo.setProductCode(jsonObject.getString("barCode")); //商品编号
+                String barCode = jsonObject.getString("barCode");
+                if (StringUtils.isNotBlank(barCode)) {
+                    skuVo.setProductCode(barCode); //商品编号
+                } else {
+                    skuVo.setProductCode(item.getProductId().toString()); //商品编号
+                }
                 skuVo.setAttributeNames(jsonObject.getString("sku")); //商品规格,格式:颜色:红色,尺寸:L码....以此类推
                 skuVo.setAttributeNames(jsonObject.getString("sku")); //商品规格,格式:颜色:红色,尺寸:L码....以此类推
                 skuVo.setProductNumber(Math.toIntExact(item.getNum())); //商品预定数量
                 skuVo.setProductNumber(Math.toIntExact(item.getNum())); //商品预定数量
                 skuVo.setPrice(product.getPrice().doubleValue()); //商品单价
                 skuVo.setPrice(product.getPrice().doubleValue()); //商品单价
@@ -767,7 +811,6 @@ public class DfOrderServiceImpl implements IErpOrderService
     }
     }
 
 
 
 
-
     /**
     /**
      * 获取账户索引 后续添加规则
      * 获取账户索引 后续添加规则
      *
      *
@@ -814,12 +857,12 @@ public class DfOrderServiceImpl implements IErpOrderService
                         if (bspOrderResponse != null) {
                         if (bspOrderResponse != null) {
                             String failMsg = bspOrderResponse.getFailMsg();
                             String failMsg = bspOrderResponse.getFailMsg();
                             if (StringUtils.isNotBlank(failMsg)) {
                             if (StringUtils.isNotBlank(failMsg)) {
-                                if (failMsg.equals("暂未结果, 请稍后再查")){
+                                if (failMsg.equals("暂未结果, 请稍后再查")) {
                                     return;
                                     return;
                                 }
                                 }
                                 //下单失败 返回未推送状态
                                 //下单失败 返回未推送状态
-                                String  orderNumber = bspOrderResponse.getOrderNumber();
-                                rollBackOrder(orderNumber,failMsg);
+                                String orderNumber = bspOrderResponse.getOrderNumber();
+                                rollBackOrder(orderNumber, failMsg);
                             } else {
                             } else {
                                 setExpress(bspOrderResponse);
                                 setExpress(bspOrderResponse);
                             }
                             }
@@ -845,7 +888,56 @@ public class DfOrderServiceImpl implements IErpOrderService
         }
         }
     }
     }
 
 
-    private void rollBackOrder(String orderNumber,String failMsg) {
+    private void getOrderScrmResult(Map<String, Object> map, Long dfAccountId) {
+        try {
+            String status = map.get("exInterfaceType").toString();
+            log.info("开始查询订单结果,参数为: {}", JSON.toJSONString(map));
+            String response = client.execute(RequestUrlEnum.ORDER_RESULT, map, dfAccountId);
+            DFApiResponse dfApiResponse = JSON.parseObject(response, DFApiResponse.class);
+            if (dfApiResponse != null && "ok".equals(dfApiResponse.getCode())) {
+                log.info("查询订单结果,结果: {}", JSON.toJSONString(dfApiResponse));
+                Object result = dfApiResponse.getResult();
+                if (result != null) {
+                    String jsonString = JSON.toJSONString(result);
+                    //下单
+                    if ("1".equals(status)) {
+                        //下单结果
+                        BspOrderResponseWrapper bspOrderResponse = JSONUtil.toBean(jsonString, BspOrderResponseWrapper.class);
+                        if (bspOrderResponse != null) {
+                            String failMsg = bspOrderResponse.getFailMsg();
+                            if (StringUtils.isNotBlank(failMsg)) {
+                                if (failMsg.equals("暂未结果, 请稍后再查")) {
+                                    return;
+                                }
+                                //下单失败 返回未推送状态
+                                String orderNumber = bspOrderResponse.getOrderNumber();
+                                rollBackOrderScrm(orderNumber, failMsg);
+                            } else {
+                                setExpressScrm(bspOrderResponse);
+                            }
+                        }
+                    } else if ("2".equals(status)) {
+                        //取消订单
+                        DFCancelOrderResultResponse cancelResponse = JSONUtil.toBean(jsonString, DFCancelOrderResultResponse.class);
+                        if (cancelResponse != null) {
+                            if (cancelResponse.getIsCancelSuss() == 1) {
+                                log.info("查询订单取消成功,返回结果{}", JSON.toJSONString(cancelResponse));
+                            } else {
+                                log.info("查询订单取消失败,返回结果{}", JSON.toJSONString(cancelResponse));
+                            }
+                        }
+                    }
+                }
+
+            } else {
+                log.info(String.format("查询订单失败,原因: %s", dfApiResponse.getMsg()));
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void rollBackOrder(String orderNumber, String failMsg) {
         FsStoreOrder fsStoreOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(orderNumber);
         FsStoreOrder fsStoreOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(orderNumber);
         FsStoreOrder tempOrder = new FsStoreOrder();
         FsStoreOrder tempOrder = new FsStoreOrder();
         tempOrder.setOrderId(fsStoreOrder.getOrderId());
         tempOrder.setOrderId(fsStoreOrder.getOrderId());
@@ -860,6 +952,21 @@ public class DfOrderServiceImpl implements IErpOrderService
         //推送失败消息
         //推送失败消息
     }
     }
 
 
+    private void rollBackOrderScrm(String orderNumber, String failMsg) {
+        FsStoreOrderScrm fsStoreOrder = fsStoreOrderScrmMapper.selectFsStoreOrderByOrderCode(orderNumber);
+        FsStoreOrder tempOrder = new FsStoreOrder();
+        tempOrder.setOrderId(fsStoreOrder.getId());
+        tempOrder.setExtendOrderId("");
+        fsStoreOrderMapper.updateFsStoreOrder(tempOrder);
+        FsStoreOrderDf df = new FsStoreOrderDf();
+        df.setOrderId(fsStoreOrder.getId());
+        df.setStatus(OrderInfoEnum.STATUS_1.getValue()); //回到默认
+        df.setFailMsg(failMsg); //失败消息
+        df.setUpdateTime(new Date());
+        fsStoreOrderDfMapper.updateFsStoreOrderDf(df);
+        //推送失败消息
+    }
+
     /**
     /**
      * 顺丰会有自己的轨迹推送 不使用快递鸟(代服务管家设置推送地址)
      * 顺丰会有自己的轨迹推送 不使用快递鸟(代服务管家设置推送地址)
      *
      *
@@ -931,4 +1038,79 @@ public class DfOrderServiceImpl implements IErpOrderService
             }
             }
         }
         }
     }
     }
+
+    /**
+     * 顺丰会有自己的轨迹推送 不使用快递鸟(代服务管家设置推送地址)
+     *
+     * @param bspResponse
+     */
+    private void setExpressScrm(BspOrderResponseWrapper bspResponse) {
+        String orderNumber = bspResponse.getOrderNumber();
+        //快递单号
+        String mailNumber = bspResponse.getMailNumber();
+        //快递名字
+        BspOrderResponse bspOrderResponse = bspResponse.getBspResponse();
+        if (bspOrderResponse != null) {
+            AtomicBoolean flag = new AtomicBoolean(false);
+            List<OrderResponse> list = bspOrderResponse.getBody();
+            if (list != null && !list.isEmpty()) {
+                for (OrderResponse orderResponse : list) {
+                    List<RlsInfo> rlsInfo = orderResponse.getRlsInfo();
+                    if (rlsInfo != null && !rlsInfo.isEmpty()) {
+                        for (RlsInfo info : rlsInfo) {
+                            List<RlsDetail> rlsDetails = info.getRlsDetail();
+                            if (rlsDetails != null && !rlsDetails.isEmpty()) {
+                                for (RlsDetail rlsDetail : rlsDetails) {
+                                    String proCode = rlsDetail.getProCode();
+                                    if (StringUtils.isNotBlank(proCode)) {
+                                        FsStoreOrderScrm order = fsStoreOrderScrmMapper.selectFsStoreOrderByOrderCode(orderNumber);
+                                        if (order != null && order.getStatus() == OrderInfoEnum.STATUS_1.getValue()) {
+                                            FsExpressScrm express = expressScrmService.selectFsExpressByOmsCode(order.getDeliveryCode());
+                                            if (express != null) {
+                                                order.setDeliveryName(proCode);
+                                                order.setDeliverySn(express.getOmsCode());
+                                            }
+                                            order.setStatus(OrderInfoEnum.STATUS_2.getValue());
+                                            order.setDeliveryId(mailNumber);
+                                            order.setDeliverySendTime(new Date());
+
+                                            fsStoreOrderScrmMapper.updateFsStoreOrder(order);
+                                            fsStoreOrderScrmLogsService.create(order.getId(), FsStoreOrderLogEnum.DELIVERY_GOODS.getValue(), FsStoreOrderLogEnum.DELIVERY_GOODS.getDesc());
+                                            //订阅物流回调
+//                                            String lastFourNumber = "";
+//                                            if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())) {
+//                                                lastFourNumber = order.getUserPhone();
+//                                                if (lastFourNumber.length() == 11) {
+//                                                    lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
+//                                                }
+//                                            }
+//                                            expressService.subscribeEspress(order.getOrderCode(), order.getDeliverySn(), order.getDeliveryId(), lastFourNumber);
+
+//                                            TemplateBean templateBean = TemplateBean.builder()
+//                                                    .orderId(order.getId().toString())
+//                                                    .orderCode(order.getOrderCode().toString())
+//                                                    .deliveryId(order.getDeliveryId())
+//                                                    .deliveryName(order.getDeliveryName())
+//                                                    .userId(order.getUserId())
+//                                                    .templateType(TemplateListenEnum.TYPE_2.getValue())
+//                                                    .build();
+//                                            publisher.publishEvent(new TemplateEvent(this, templateBean));
+                                        }
+                                        flag.set(true);
+                                    }
+                                    break;
+                                }
+                            }
+
+                        }
+                        if (flag.get()) {
+                            break;
+                        }
+                    }
+
+                }
+            }
+        }
+    }
+
 }
 }

+ 10 - 7
fs-service/src/main/java/com/fs/his/mapper/FsDfAccountMapper.java

@@ -3,17 +3,18 @@ package com.fs.his.mapper;
 import java.util.List;
 import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.his.domain.FsDfAccount;
 import com.fs.his.domain.FsDfAccount;
+import org.apache.ibatis.annotations.Param;
 
 
 /**
 /**
  * 代服账户Mapper接口
  * 代服账户Mapper接口
- * 
+ *
  * @author fs
  * @author fs
  * @date 2025-10-13
  * @date 2025-10-13
  */
  */
 public interface FsDfAccountMapper extends BaseMapper<FsDfAccount>{
 public interface FsDfAccountMapper extends BaseMapper<FsDfAccount>{
     /**
     /**
      * 查询代服账户
      * 查询代服账户
-     * 
+     *
      * @param id 代服账户主键
      * @param id 代服账户主键
      * @return 代服账户
      * @return 代服账户
      */
      */
@@ -21,7 +22,7 @@ public interface FsDfAccountMapper extends BaseMapper<FsDfAccount>{
 
 
     /**
     /**
      * 查询代服账户列表
      * 查询代服账户列表
-     * 
+     *
      * @param fsDfAccount 代服账户
      * @param fsDfAccount 代服账户
      * @return 代服账户集合
      * @return 代服账户集合
      */
      */
@@ -29,7 +30,7 @@ public interface FsDfAccountMapper extends BaseMapper<FsDfAccount>{
 
 
     /**
     /**
      * 新增代服账户
      * 新增代服账户
-     * 
+     *
      * @param fsDfAccount 代服账户
      * @param fsDfAccount 代服账户
      * @return 结果
      * @return 结果
      */
      */
@@ -37,7 +38,7 @@ public interface FsDfAccountMapper extends BaseMapper<FsDfAccount>{
 
 
     /**
     /**
      * 修改代服账户
      * 修改代服账户
-     * 
+     *
      * @param fsDfAccount 代服账户
      * @param fsDfAccount 代服账户
      * @return 结果
      * @return 结果
      */
      */
@@ -45,7 +46,7 @@ public interface FsDfAccountMapper extends BaseMapper<FsDfAccount>{
 
 
     /**
     /**
      * 删除代服账户
      * 删除代服账户
-     * 
+     *
      * @param id 代服账户主键
      * @param id 代服账户主键
      * @return 结果
      * @return 结果
      */
      */
@@ -53,9 +54,11 @@ public interface FsDfAccountMapper extends BaseMapper<FsDfAccount>{
 
 
     /**
     /**
      * 批量删除代服账户
      * 批量删除代服账户
-     * 
+     *
      * @param ids 需要删除的数据主键集合
      * @param ids 需要删除的数据主键集合
      * @return 结果
      * @return 结果
      */
      */
     int deleteFsDfAccountByIds(Long[] ids);
     int deleteFsDfAccountByIds(Long[] ids);
+
+    FsDfAccount selectFsDfAccountByAccount(@Param("loginAccount") String loginAccount);
 }
 }

+ 9 - 7
fs-service/src/main/java/com/fs/his/service/IFsDfAccountService.java

@@ -6,14 +6,14 @@ import com.fs.his.domain.FsDfAccount;
 
 
 /**
 /**
  * 代服账户Service接口
  * 代服账户Service接口
- * 
+ *
  * @author fs
  * @author fs
  * @date 2025-10-13
  * @date 2025-10-13
  */
  */
 public interface IFsDfAccountService extends IService<FsDfAccount>{
 public interface IFsDfAccountService extends IService<FsDfAccount>{
     /**
     /**
      * 查询代服账户
      * 查询代服账户
-     * 
+     *
      * @param id 代服账户主键
      * @param id 代服账户主键
      * @return 代服账户
      * @return 代服账户
      */
      */
@@ -21,7 +21,7 @@ public interface IFsDfAccountService extends IService<FsDfAccount>{
 
 
     /**
     /**
      * 查询代服账户列表
      * 查询代服账户列表
-     * 
+     *
      * @param fsDfAccount 代服账户
      * @param fsDfAccount 代服账户
      * @return 代服账户集合
      * @return 代服账户集合
      */
      */
@@ -29,7 +29,7 @@ public interface IFsDfAccountService extends IService<FsDfAccount>{
 
 
     /**
     /**
      * 新增代服账户
      * 新增代服账户
-     * 
+     *
      * @param fsDfAccount 代服账户
      * @param fsDfAccount 代服账户
      * @return 结果
      * @return 结果
      */
      */
@@ -37,7 +37,7 @@ public interface IFsDfAccountService extends IService<FsDfAccount>{
 
 
     /**
     /**
      * 修改代服账户
      * 修改代服账户
-     * 
+     *
      * @param fsDfAccount 代服账户
      * @param fsDfAccount 代服账户
      * @return 结果
      * @return 结果
      */
      */
@@ -45,7 +45,7 @@ public interface IFsDfAccountService extends IService<FsDfAccount>{
 
 
     /**
     /**
      * 批量删除代服账户
      * 批量删除代服账户
-     * 
+     *
      * @param ids 需要删除的代服账户主键集合
      * @param ids 需要删除的代服账户主键集合
      * @return 结果
      * @return 结果
      */
      */
@@ -53,9 +53,11 @@ public interface IFsDfAccountService extends IService<FsDfAccount>{
 
 
     /**
     /**
      * 删除代服账户信息
      * 删除代服账户信息
-     * 
+     *
      * @param id 代服账户主键
      * @param id 代服账户主键
      * @return 结果
      * @return 结果
      */
      */
     int deleteFsDfAccountById(Long id);
     int deleteFsDfAccountById(Long id);
+
+    FsDfAccount selectFsDfAccountByAccount(String loginAccount);
 }
 }

+ 12 - 7
fs-service/src/main/java/com/fs/his/service/impl/FsDfAccountServiceImpl.java

@@ -11,7 +11,7 @@ import com.fs.his.service.IFsDfAccountService;
 
 
 /**
 /**
  * 代服账户Service业务层处理
  * 代服账户Service业务层处理
- * 
+ *
  * @author fs
  * @author fs
  * @date 2025-10-13
  * @date 2025-10-13
  */
  */
@@ -20,7 +20,7 @@ public class FsDfAccountServiceImpl extends ServiceImpl<FsDfAccountMapper, FsDfA
 
 
     /**
     /**
      * 查询代服账户
      * 查询代服账户
-     * 
+     *
      * @param id 代服账户主键
      * @param id 代服账户主键
      * @return 代服账户
      * @return 代服账户
      */
      */
@@ -32,7 +32,7 @@ public class FsDfAccountServiceImpl extends ServiceImpl<FsDfAccountMapper, FsDfA
 
 
     /**
     /**
      * 查询代服账户列表
      * 查询代服账户列表
-     * 
+     *
      * @param fsDfAccount 代服账户
      * @param fsDfAccount 代服账户
      * @return 代服账户
      * @return 代服账户
      */
      */
@@ -44,7 +44,7 @@ public class FsDfAccountServiceImpl extends ServiceImpl<FsDfAccountMapper, FsDfA
 
 
     /**
     /**
      * 新增代服账户
      * 新增代服账户
-     * 
+     *
      * @param fsDfAccount 代服账户
      * @param fsDfAccount 代服账户
      * @return 结果
      * @return 结果
      */
      */
@@ -57,7 +57,7 @@ public class FsDfAccountServiceImpl extends ServiceImpl<FsDfAccountMapper, FsDfA
 
 
     /**
     /**
      * 修改代服账户
      * 修改代服账户
-     * 
+     *
      * @param fsDfAccount 代服账户
      * @param fsDfAccount 代服账户
      * @return 结果
      * @return 结果
      */
      */
@@ -70,7 +70,7 @@ public class FsDfAccountServiceImpl extends ServiceImpl<FsDfAccountMapper, FsDfA
 
 
     /**
     /**
      * 批量删除代服账户
      * 批量删除代服账户
-     * 
+     *
      * @param ids 需要删除的代服账户主键
      * @param ids 需要删除的代服账户主键
      * @return 结果
      * @return 结果
      */
      */
@@ -82,7 +82,7 @@ public class FsDfAccountServiceImpl extends ServiceImpl<FsDfAccountMapper, FsDfA
 
 
     /**
     /**
      * 删除代服账户信息
      * 删除代服账户信息
-     * 
+     *
      * @param id 代服账户主键
      * @param id 代服账户主键
      * @return 结果
      * @return 结果
      */
      */
@@ -91,4 +91,9 @@ public class FsDfAccountServiceImpl extends ServiceImpl<FsDfAccountMapper, FsDfA
     {
     {
         return baseMapper.deleteFsDfAccountById(id);
         return baseMapper.deleteFsDfAccountById(id);
     }
     }
+
+    @Override
+    public FsDfAccount selectFsDfAccountByAccount(String loginAccount) {
+        return baseMapper.selectFsDfAccountByAccount(loginAccount);
+    }
 }
 }

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

@@ -1120,6 +1120,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
         StringBuilder failureMsg = new StringBuilder();
         StringBuilder failureMsg = new StringBuilder();
         for (FsStoreProductDeliverExcelVO vo : list) {
         for (FsStoreProductDeliverExcelVO vo : list) {
             try {
             try {
+                log.info("原始数据:{}",JSON.toJSONString(vo));
                 FsStoreOrder o = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(vo.getOrderCode());
                 FsStoreOrder o = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(vo.getOrderCode());
                 if (storeId != null) {
                 if (storeId != null) {
                     if (o.getStoreId() != storeId) {
                     if (o.getStoreId() != storeId) {
@@ -1162,6 +1163,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
                 }
                 }
                 FsStore store = fsStoreMapper.selectFsStoreByStoreId(o.getStoreId());
                 FsStore store = fsStoreMapper.selectFsStoreByStoreId(o.getStoreId());
                 int i = fsStoreOrderMapper.updateFsStoreOrderByOrderCode(fsStoreOrder);
                 int i = fsStoreOrderMapper.updateFsStoreOrderByOrderCode(fsStoreOrder);
+                log.info("手动发货导入订单号:订单号为"+fsStoreOrder.getOrderCode() + "快递单号为:" + fsStoreOrder.getDeliverySn());
                 String lastFourNumber = "";
                 String lastFourNumber = "";
                 if (fsStoreOrder.getDeliveryCode().equals(ShipperCodeEnum.SF.getValue())) {
                 if (fsStoreOrder.getDeliveryCode().equals(ShipperCodeEnum.SF.getValue())) {
                     if (store.getSendPhone() != null) {
                     if (store.getSendPhone() != null) {

+ 1 - 1
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderScrmMapper.java

@@ -1029,7 +1029,7 @@ public interface FsStoreOrderScrmMapper
     @Select("select id from fs_store_order_scrm WHERE `status`= 1  and  extend_order_id is null ")
     @Select("select id from fs_store_order_scrm WHERE `status`= 1  and  extend_order_id is null ")
     List<Long> selectFsStoreOrderNoCreateOms();
     List<Long> selectFsStoreOrderNoCreateOms();
 
 
-    @Select("select * from fs_store_order_scrm where status = 1 and extend_order_id is not null and delivery_id is null ")
+    @Select("select * from fs_store_order_scrm where status = 1 and extend_order_id is not null and extend_order_id != '' and delivery_id is null ")
     List<FsStoreOrderScrm> selectUpdateExpress();
     List<FsStoreOrderScrm> selectUpdateExpress();
 
 
     @Select("select fso.id from fs_store_order_scrm fso inner join fs_store_order_audit_scrm fsoa on fsoa.order_id = fso.id where fso.`status`= 1 and fso.extend_order_id is null and fsoa.audit_status = 4")
     @Select("select fso.id from fs_store_order_scrm fso inner join fs_store_order_audit_scrm fsoa on fsoa.order_id = fso.id where fso.`status`= 1 and fso.extend_order_id is null and fsoa.audit_status = 4")

+ 2 - 0
fs-service/src/main/java/com/fs/hisStore/service/IFsStoreOrderScrmService.java

@@ -314,4 +314,6 @@ public interface IFsStoreOrderScrmService
     Map<String, BigDecimal> selectFsStoreOrderStatistics(FsStoreOrderParam param);
     Map<String, BigDecimal> selectFsStoreOrderStatistics(FsStoreOrderParam param);
 
 
     String selectFsStoreOrderProductStatistics(FsStoreOrderParam param);
     String selectFsStoreOrderProductStatistics(FsStoreOrderParam param);
+
+    int create(Long orderId, String type, String msg);
 }
 }

+ 30 - 8
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -352,6 +352,9 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
 
 
     //ERP 类型到服务的映射
     //ERP 类型到服务的映射
     private Map<Integer, IErpOrderService> erpServiceMap;
     private Map<Integer, IErpOrderService> erpServiceMap;
+    @Autowired
+    private FsStoreOrderLogsScrmMapper fsStoreOrderLogsScrmMapper;
+
     @PostConstruct
     @PostConstruct
     public void initErpServiceMap() {
     public void initErpServiceMap() {
         erpServiceMap = new HashMap<>();
         erpServiceMap = new HashMap<>();
@@ -607,6 +610,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
 
 
     @Override
     @Override
     public FsStoreOrderComputeDTO computedOrder(long uid, FsStoreOrderComputedParam param) {
     public FsStoreOrderComputeDTO computedOrder(long uid, FsStoreOrderComputedParam param) {
+        logger.info("computedOrder param:{},uid:{}", param,uid);
         String cartIds = redisCache.getCacheObject("orderKey:" + param.getOrderKey());
         String cartIds = redisCache.getCacheObject("orderKey:" + param.getOrderKey());
         if (ObjectUtil.isNull(cartIds)) {
         if (ObjectUtil.isNull(cartIds)) {
             throw new CustomException("订单已过期", 501);
             throw new CustomException("订单已过期", 501);
@@ -1896,19 +1900,27 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
             payment.setPaytime(new Timestamp(timeLong));
             payment.setPaytime(new Timestamp(timeLong));
         }
         }
         payments.add(payment);
         payments.add(payment);
-        if (order.getCompanyId() != null) {
-
-            FsExpressScrm express = expressService.selectFsExpressByOmsCode("SF.0235402855");
+        if (CloudHostUtils.hasCloudHostName("康年堂")){
+            FsExpressScrm express = expressService.selectFsExpressByOmsCode("SF");
             erpOrder.setExpress_code(express.getOmsCode());
             erpOrder.setExpress_code(express.getOmsCode());
             order.setDeliveryName(express.getName());
             order.setDeliveryName(express.getName());
             order.setDeliverySn(express.getCode());
             order.setDeliverySn(express.getCode());
-
         } else {
         } else {
-            FsExpressScrm express = expressService.selectFsExpressByOmsCode("SF.0235402855");
-            erpOrder.setExpress_code(express.getOmsCode());
-            order.setDeliveryName(express.getName());
-            order.setDeliverySn(express.getCode());
+            if (order.getCompanyId() != null) {
+
+                FsExpressScrm express = expressService.selectFsExpressByOmsCode("SF.0235402855");
+                erpOrder.setExpress_code(express.getOmsCode());
+                order.setDeliveryName(express.getName());
+                order.setDeliverySn(express.getCode());
+
+            } else {
+                FsExpressScrm express = expressService.selectFsExpressByOmsCode("SF.0235402855");
+                erpOrder.setExpress_code(express.getOmsCode());
+                order.setDeliveryName(express.getName());
+                order.setDeliverySn(express.getCode());
+            }
         }
         }
+
         erpOrder.setPayments(payments);
         erpOrder.setPayments(payments);
         if (order.getCompanyId() != null) {
         if (order.getCompanyId() != null) {
             Company company = companyService.selectCompanyById(order.getCompanyId());
             Company company = companyService.selectCompanyById(order.getCompanyId());
@@ -4467,6 +4479,16 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         return fsStoreOrderMapper.selectFsStoreOrderProductStatistics(param);
         return fsStoreOrderMapper.selectFsStoreOrderProductStatistics(param);
     }
     }
 
 
+    @Override
+    public int create(Long orderId, String type, String msg) {
+        FsStoreOrderLogsScrm logs=new FsStoreOrderLogsScrm();
+        logs.setOrderId(orderId);
+        logs.setChangeType(type);
+        logs.setChangeMessage(msg);
+        logs.setCreateTime(new Date());
+        return fsStoreOrderLogsScrmMapper.insertFsStoreOrderLogs(logs);
+    }
+
     private static final DateTimeFormatter CST_FORMATTER = DateTimeFormatter
     private static final DateTimeFormatter CST_FORMATTER = DateTimeFormatter
             .ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US)
             .ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US)
             .withZone(ZoneId.of("Asia/Shanghai"));
             .withZone(ZoneId.of("Asia/Shanghai"));

+ 12 - 3
fs-service/src/main/java/com/fs/qw/service/impl/QwUserServiceImpl.java

@@ -14,6 +14,7 @@ import com.ecloud.sdk.ecs.v1.model.VmRebootRequest;
 import com.ecloud.sdk.ecs.v1.model.VmRebootResponse;
 import com.ecloud.sdk.ecs.v1.model.VmRebootResponse;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.utils.CloudHostUtils;
 import com.fs.common.utils.PubFun;
 import com.fs.common.utils.PubFun;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.domain.CompanyUser;
@@ -23,6 +24,7 @@ import com.fs.company.service.ICompanyUserService;
 import com.fs.config.ai.AiHostProper;
 import com.fs.config.ai.AiHostProper;
 import com.fs.config.cloud.CloudHostProper;
 import com.fs.config.cloud.CloudHostProper;
 import com.fs.his.config.FsSysConfig;
 import com.fs.his.config.FsSysConfig;
+import com.fs.his.domain.FsDfAccount;
 import com.fs.his.utils.ConfigUtil;
 import com.fs.his.utils.ConfigUtil;
 import com.fs.ipad.IpadSendUtils;
 import com.fs.ipad.IpadSendUtils;
 import com.fs.ipad.param.WxSendAtMsgParam;
 import com.fs.ipad.param.WxSendAtMsgParam;
@@ -531,7 +533,10 @@ public class QwUserServiceImpl implements IQwUserService
         if (result.getData().flag){
         if (result.getData().flag){
             QwUser qwUser=new QwUser();
             QwUser qwUser=new QwUser();
             qwUser.setAppKey(appKey);
             qwUser.setAppKey(appKey);
-            qwUser.setLoginCodeUrl(result.getData().ipAddress);
+            if (!CloudHostUtils.hasCloudHostName("内蒙古一贴")) {
+                qwUser.setLoginCodeUrl(result.getData().ipAddress);
+            }
+//            qwUser.setLoginCodeUrl(result.getData().ipAddress);
 
 
             int i = qwUserMapper.updateQwUserByAppKeyToUrl(qwUser);
             int i = qwUserMapper.updateQwUserByAppKeyToUrl(qwUser);
             if (i>0){
             if (i>0){
@@ -668,7 +673,9 @@ public class QwUserServiceImpl implements IQwUserService
                 if (result.getData().flag){
                 if (result.getData().flag){
                     QwUser qwUser=new QwUser();
                     QwUser qwUser=new QwUser();
                     qwUser.setAppKey(appKey);
                     qwUser.setAppKey(appKey);
-                    qwUser.setLoginCodeUrl(result.getData().ipAddress);
+                    if (!CloudHostUtils.hasCloudHostName("内蒙古一贴")) {
+                        qwUser.setLoginCodeUrl(result.getData().ipAddress);
+                    }
 
 
                     int i = qwUserMapper.updateQwUserByAppKeyToUrl(qwUser);
                     int i = qwUserMapper.updateQwUserByAppKeyToUrl(qwUser);
                     if (i>0){
                     if (i>0){
@@ -742,7 +749,9 @@ public class QwUserServiceImpl implements IQwUserService
                 if (result.getData().flag){
                 if (result.getData().flag){
                     QwUser qwUser=new QwUser();
                     QwUser qwUser=new QwUser();
                     qwUser.setAppKey(appKey);
                     qwUser.setAppKey(appKey);
-                    qwUser.setLoginCodeUrl(result.getData().ipAddress);
+                    if (!CloudHostUtils.hasCloudHostName("内蒙古一贴")) {
+                        qwUser.setLoginCodeUrl(result.getData().ipAddress);
+                    }
 
 
                     int i = qwUserMapper.updateQwUserByAppKeyToUrl(qwUser);
                     int i = qwUserMapper.updateQwUserByAppKeyToUrl(qwUser);
                     if (i>0){
                     if (i>0){

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

@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
 
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.Date;
 
 
 /**
 /**
@@ -99,4 +100,10 @@ public class FsUserPageListVO {
     @ApiModelProperty(value = "用户-项目-销售ID")
     @ApiModelProperty(value = "用户-项目-销售ID")
     private Long userCompanyUserId;
     private Long userCompanyUserId;
 
 
+    @ApiModelProperty(value = "用户积分")
+    private BigDecimal integral;
+
+    @ApiModelProperty(value = "是否购买 1:是 0 否")
+    private BigDecimal isBuy;
+
 }
 }

+ 17 - 0
fs-service/src/main/java/com/fs/tulin/entity/PeriodInfo.java

@@ -0,0 +1,17 @@
+package com.fs.tulin.entity;
+
+import lombok.Data;
+
+/**
+ * @description:
+ * @author: Guos
+ * @time: 2025/10/24 上午10:32
+ */
+@Data
+public class PeriodInfo{
+
+    private Long courseId;
+
+    private String courseName;
+
+}

+ 9 - 1
fs-service/src/main/java/com/fs/tulin/mapper/TulinInfoSyncLogMapper.java

@@ -1,7 +1,8 @@
 package com.fs.tulin.mapper;
 package com.fs.tulin.mapper;
 
 
+
+import com.fs.tulin.entity.PeriodInfo;
 import com.fs.tulin.entity.QwExUserInfo;
 import com.fs.tulin.entity.QwExUserInfo;
-import com.fs.tulin.entity.StudentInfo;
 import com.fs.tulin.entity.TulinInfoSyncLog;
 import com.fs.tulin.entity.TulinInfoSyncLog;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Param;
@@ -47,4 +48,11 @@ public interface TulinInfoSyncLogMapper {
      */
      */
     List<QwExUserInfo> selectStudentInfo();
     List<QwExUserInfo> selectStudentInfo();
 
 
+    /**
+     * 根据用户id查询
+     * @param fsUserId
+     * @return
+     */
+    List<PeriodInfo> selectPeriodInfo(@Param("fsUserId") Long fsUserId);
+
 }
 }

+ 30 - 19
fs-service/src/main/java/com/fs/tulin/service/impl/TulinInfoSyncLogServiceImpl.java

@@ -1,6 +1,7 @@
 package com.fs.tulin.service.impl;
 package com.fs.tulin.service.impl;
 
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fs.tulin.entity.PeriodInfo;
 import com.fs.tulin.entity.QwExUserInfo;
 import com.fs.tulin.entity.QwExUserInfo;
 import com.fs.tulin.entity.StudentInfo;
 import com.fs.tulin.entity.StudentInfo;
 import com.fs.tulin.entity.TulinInfoSyncLog;
 import com.fs.tulin.entity.TulinInfoSyncLog;
@@ -11,6 +12,7 @@ import com.fs.tulin.utils.PharmacyEnum;
 import com.fs.tulin.utils.SyncStudentInfoService;
 import com.fs.tulin.utils.SyncStudentInfoService;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.core.env.Environment;
 import org.springframework.core.env.Environment;
@@ -36,9 +38,10 @@ public class TulinInfoSyncLogServiceImpl implements ITulinInfoSyncLogService {
     private final Environment environment;
     private final Environment environment;
 
 
     private final String PROD_URL = "https://papi.xiangyue.life/api/v1/mp/sync/student?sign=%s&t=%d";
     private final String PROD_URL = "https://papi.xiangyue.life/api/v1/mp/sync/student?sign=%s&t=%d";
-    private final String DEV_URL = "https://api.xiangyue.life/api/v1/mp/sync/student?sign=%s&t=%d";
 
 
+    private final String DEV_URL = "https://api.xiangyue.life/api/v1/mp/sync/student?sign=%s&t=%d";
 
 
+    private final String PROD_CORPID = "lRz72QOIYBxJW2RBAp2UYe1ckjVpixHL";
     @Override
     @Override
     public void syncInfo() {
     public void syncInfo() {
         // 获取当前激活的profile
         // 获取当前激活的profile
@@ -58,26 +61,12 @@ public class TulinInfoSyncLogServiceImpl implements ITulinInfoSyncLogService {
                 studentInfo.setColumn_name(ColumnNameEnum.GYBNX.getName());
                 studentInfo.setColumn_name(ColumnNameEnum.GYBNX.getName());
                 studentInfo.setPharmacy_id(PharmacyEnum.YJKYSY.getPharmacyId());
                 studentInfo.setPharmacy_id(PharmacyEnum.YJKYSY.getPharmacyId());
                 studentInfo.setService_phone("15141712344");
                 studentInfo.setService_phone("15141712344");
-                try {
-                    TulinInfoSyncLog tulinInfoSyncLog = SyncStudentInfoService.send(PROD_URL,"lRz72QOIYBxJW2RBAp2UYe1ckjVpixHL", studentInfo);
-                    tulinInfoSyncLog.setFsUserId(qwExUserInfo.getFs_user_id());
-                    insert(tulinInfoSyncLog);
-                } catch (JsonProcessingException e) {
-                    throw new RuntimeException(e);
+                List<PeriodInfo> periodInfos = tulinInfoSyncLogMapper.selectPeriodInfo(qwExUserInfo.getFs_user_id());
+                if(CollectionUtils.isNotEmpty(periodInfos)){
+                    studentInfo.setPeriod_name(periodInfos.get(0).getCourseName());
                 }
                 }
-            }
-        }
-        if(activeProfile.equals("dev")) {
-            log.info("线下开始执行数据同步");
-            for (QwExUserInfo qwExUserInfo : qwExUserInfos) {
-                StudentInfo studentInfo = new StudentInfo();
-                BeanUtils.copyProperties(qwExUserInfo, studentInfo);
-                studentInfo.setAppid("wx6688e6b9b6fb8700");
-                studentInfo.setColumn_name(ColumnNameEnum.GYBNX.getName());
-                studentInfo.setPharmacy_id(PharmacyEnum.YJKYSY.getPharmacyId());
-                studentInfo.setService_phone("15141712344");
                 try {
                 try {
-                    TulinInfoSyncLog tulinInfoSyncLog = SyncStudentInfoService.send(PROD_URL,"lRz72QOIYBxJW2RBAp2UYe1ckjVpixHL", studentInfo);
+                    TulinInfoSyncLog tulinInfoSyncLog = SyncStudentInfoService.send(PROD_URL,PROD_CORPID, studentInfo);
                     tulinInfoSyncLog.setFsUserId(qwExUserInfo.getFs_user_id());
                     tulinInfoSyncLog.setFsUserId(qwExUserInfo.getFs_user_id());
                     insert(tulinInfoSyncLog);
                     insert(tulinInfoSyncLog);
                 } catch (JsonProcessingException e) {
                 } catch (JsonProcessingException e) {
@@ -85,6 +74,28 @@ public class TulinInfoSyncLogServiceImpl implements ITulinInfoSyncLogService {
                 }
                 }
             }
             }
         }
         }
+//        if(activeProfile.equals("dev")) {
+//            log.info("线下开始执行数据同步");
+//            for (QwExUserInfo qwExUserInfo : qwExUserInfos) {
+//                StudentInfo studentInfo = new StudentInfo();
+//                BeanUtils.copyProperties(qwExUserInfo, studentInfo);
+//                studentInfo.setAppid("wx6688e6b9b6fb8700");
+//                studentInfo.setColumn_name(ColumnNameEnum.GYBNX.getName());
+//                studentInfo.setPharmacy_id(PharmacyEnum.YJKYSY.getPharmacyId());
+//                studentInfo.setService_phone("15141712344");
+//                List<PeriodInfo> periodInfos = tulinInfoSyncLogMapper.selectPeriodInfo(qwExUserInfo.getFs_user_id());
+//                if(CollectionUtils.isNotEmpty(periodInfos)){
+//                    studentInfo.setPeriod_name(periodInfos.get(0).getCourseName());
+//                }
+//                try {
+//                    TulinInfoSyncLog tulinInfoSyncLog = SyncStudentInfoService.send(PROD_URL,PROD_CORPID, studentInfo);
+//                    tulinInfoSyncLog.setFsUserId(qwExUserInfo.getFs_user_id());
+//                    insert(tulinInfoSyncLog);
+//                } catch (JsonProcessingException e) {
+//                    throw new RuntimeException(e);
+//                }
+//            }
+//        }
     }
     }
 
 
 
 

+ 6 - 6
fs-service/src/main/resources/application-common.yml

@@ -14,12 +14,12 @@ fs:
   addressEnabled: false
   addressEnabled: false
   # 验证码类型 math 数组计算 char 字符验证
   # 验证码类型 math 数组计算 char 字符验证
   captchaType: math
   captchaType: math
-  jwt:
-    # 加密秘钥
-    secret: f4e2e52034348f86b67cde581c0f9eb5
-    # token有效时长,7天,单位秒
-    expire: 31536000
-    header: AppToken
+#  jwt:
+#    # 加密秘钥
+#    secret: f4e2e52034348f86b67cde581c0f9eb5
+#    # token有效时长,7天,单位秒
+#    expire: 31536000
+#    header: AppToken
 # 开发环境配置
 # 开发环境配置
 server:
 server:
   servlet:
   servlet:

+ 7 - 0
fs-service/src/main/resources/application-config-druid-ddgy.yml

@@ -66,9 +66,16 @@ watch:
 fs :
 fs :
   commonApi: http://172.16.0.65:8010
   commonApi: http://172.16.0.65:8010
   h5CommonApi: http://172.16.0.65:8010
   h5CommonApi: http://172.16.0.65:8010
+  jwt:
+    # 加密秘钥
+    secret: f4e2e52034348f86b67cde581c0f9eb5
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 nuonuo:
 nuonuo:
   key: 10924508
   key: 10924508
   secret: A2EB20764D304D16
   secret: A2EB20764D304D16
+
 # 存储捅配置
 # 存储捅配置
 tencent_cloud_config:
 tencent_cloud_config:
   secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT
   secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT

+ 7 - 0
fs-service/src/main/resources/application-config-druid-hat.yml

@@ -66,9 +66,16 @@ watch:
 fs :
 fs :
   commonApi: http://172.16.0.45:8010
   commonApi: http://172.16.0.45:8010
   h5CommonApi: http://172.16.0.45:8010
   h5CommonApi: http://172.16.0.45:8010
+  jwt:
+    # 加密秘钥
+    secret: f4e2e52034348f86b67cde581c0f9eb5
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 nuonuo:
 nuonuo:
   key: 10924508
   key: 10924508
   secret: A2EB20764D304D16
   secret: A2EB20764D304D16
+
 # 存储捅配置
 # 存储捅配置
 tencent_cloud_config:
 tencent_cloud_config:
   secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT
   secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT

+ 6 - 0
fs-service/src/main/resources/application-config-druid-hcl.yml

@@ -62,6 +62,12 @@ watch:
 fs :
 fs :
   commonApi: http://192.168.0.93:8010
   commonApi: http://192.168.0.93:8010
   h5CommonApi: http://192.168.0.93:8010
   h5CommonApi: http://192.168.0.93:8010
+  jwt:
+    # 加密秘钥
+    secret: f4e2e52034348f86b67cde581c0f9eb5
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 nuonuo:
 nuonuo:
   key: 10924508
   key: 10924508
   secret: A2EB20764D304D16
   secret: A2EB20764D304D16

+ 6 - 0
fs-service/src/main/resources/application-config-druid-hdt.yml

@@ -65,6 +65,12 @@ watch:
 fs :
 fs :
   commonApi: http://192.168.0.70:8010
   commonApi: http://192.168.0.70:8010
   h5CommonApi: http://119.29.195.254:8010
   h5CommonApi: http://119.29.195.254:8010
+  jwt:
+    # 加密秘钥
+    secret: f4e2e52034348f86b67cde581c0f9eb5
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 nuonuo:
 nuonuo:
   key: 10924508
   key: 10924508
   secret: A2EB20764D304D16
   secret: A2EB20764D304D16

+ 7 - 0
fs-service/src/main/resources/application-config-druid-hst.yml

@@ -62,9 +62,16 @@ watch:
 fs :
 fs :
   commonApi: http://172.16.0.26:7771
   commonApi: http://172.16.0.26:7771
   h5CommonApi: http://172.16.0.26:7771
   h5CommonApi: http://172.16.0.26:7771
+  jwt:
+    # 加密秘钥
+    secret: f4e2e52034348f86b67cde581c0f9eb5
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 nuonuo:
 nuonuo:
   key: 10924508
   key: 10924508
   secret: A2EB20764D304D16
   secret: A2EB20764D304D16
+
 # 存储捅配置
 # 存储捅配置
 tencent_cloud_config:
 tencent_cloud_config:
   secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT
   secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT

+ 6 - 0
fs-service/src/main/resources/application-config-druid-hyt.yml

@@ -57,6 +57,12 @@ watch:
 fs :
 fs :
   commonApi: http://192.168.0.18:7771
   commonApi: http://192.168.0.18:7771
   h5CommonApi: http://192.168.0.18:7771
   h5CommonApi: http://192.168.0.18:7771
+  jwt:
+    # 加密秘钥
+    secret: f4e2e52034348f86b67cde581c0f9eb5
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 nuonuo:
 nuonuo:
   key: 10924509
   key: 10924509
   secret: A2EB20764D304D16
   secret: A2EB20764D304D16

+ 6 - 0
fs-service/src/main/resources/application-config-druid-jnmy.yml

@@ -60,6 +60,12 @@ watch:
 fs :
 fs :
   commonApi: http://192.168.0.18:7771
   commonApi: http://192.168.0.18:7771
   h5CommonApi: http://192.168.0.18:7771
   h5CommonApi: http://192.168.0.18:7771
+  jwt:
+    # 加密秘钥
+    secret: f4e2e52034348f86b67cde581c0f9eb5
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 nuonuo:
 nuonuo:
   key: 10924508
   key: 10924508
   secret: A2EB20764D304D16
   secret: A2EB20764D304D16

+ 6 - 0
fs-service/src/main/resources/application-config-druid-jnsyj.yml

@@ -65,6 +65,12 @@ watch:
 fs :
 fs :
   commonApi: http://172.16.0.29:8010
   commonApi: http://172.16.0.29:8010
   h5CommonApi: http://119.29.195.254:8010
   h5CommonApi: http://119.29.195.254:8010
+  jwt:
+    # 加密秘钥
+    secret: f4e2e52034348f86b67cde581c0f9eb5
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 nuonuo:
 nuonuo:
   key: 10924508
   key: 10924508
   secret: A2EB20764D304D16
   secret: A2EB20764D304D16

+ 6 - 0
fs-service/src/main/resources/application-config-druid-jzzx.yml

@@ -66,6 +66,12 @@ watch:
 fs :
 fs :
   commonApi: http://192.168.0.238:8010
   commonApi: http://192.168.0.238:8010
   h5CommonApi: http://192.168.0.238:8010
   h5CommonApi: http://192.168.0.238:8010
+  jwt:
+    # 加密秘钥
+    secret: f4e2e52034348f86b67cde581c0f9eb5
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 nuonuo:
 nuonuo:
   key: 10924508
   key: 10924508
   secret: A2EB20764D304D16
   secret: A2EB20764D304D16

+ 6 - 0
fs-service/src/main/resources/application-config-druid-knt.yml

@@ -60,6 +60,12 @@ watch:
 fs :
 fs :
   commonApi: http://192.168.0.196:7771
   commonApi: http://192.168.0.196:7771
   h5CommonApi: http://192.168.0.196:7771
   h5CommonApi: http://192.168.0.196:7771
+  jwt:
+    # 加密秘钥
+    secret: f4e2e52034348f86b67cde581c0f9eb5
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 nuonuo:
 nuonuo:
   key: 10924508
   key: 10924508
   secret: A2EB20764D304D16
   secret: A2EB20764D304D16

+ 7 - 0
fs-service/src/main/resources/application-config-druid-kyt.yml

@@ -62,9 +62,16 @@ watch:
 fs :
 fs :
   commonApi: http://172.17.0.10:8010
   commonApi: http://172.17.0.10:8010
   h5CommonApi: http://172.17.0.10:8010
   h5CommonApi: http://172.17.0.10:8010
+  jwt:
+    # 加密秘钥
+    secret: f4e2e52034348f86b67cde581c0f9eb5
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 nuonuo:
 nuonuo:
   key: 10924508
   key: 10924508
   secret: A2EB20764D304D16
   secret: A2EB20764D304D16
+
 # 存储捅配置
 # 存储捅配置
 tencent_cloud_config:
 tencent_cloud_config:
   secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT
   secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT

+ 6 - 0
fs-service/src/main/resources/application-config-druid-nmgyt.yml

@@ -65,6 +65,12 @@ watch:
 fs :
 fs :
   commonApi: http://172.16.0.9:8010
   commonApi: http://172.16.0.9:8010
   h5CommonApi: http://192.168.0.18:7771
   h5CommonApi: http://192.168.0.18:7771
+  jwt:
+    # 加密秘钥
+    secret: f4e2e52034348f86b67cde581c0f9eb5
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 nuonuo:
 nuonuo:
   key: 10924508
   key: 10924508
   secret: A2EB20764D304D16
   secret: A2EB20764D304D16

+ 6 - 0
fs-service/src/main/resources/application-config-druid-qdtst.yml

@@ -62,6 +62,12 @@ watch:
 fs :
 fs :
   commonApi: http://10.206.0.16:8010
   commonApi: http://10.206.0.16:8010
   h5CommonApi: http://10.206.0.16:8010
   h5CommonApi: http://10.206.0.16:8010
+  jwt:
+    # 加密秘钥
+    secret: f4e2e52034348f86b67cde581c0f9eb5
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 nuonuo:
 nuonuo:
   key: 10924508
   key: 10924508
   secret: A2EB20764D304D16
   secret: A2EB20764D304D16

+ 7 - 0
fs-service/src/main/resources/application-config-druid-sxjz.yml

@@ -66,9 +66,16 @@ watch:
 fs :
 fs :
   commonApi: http://172.27.0.12:8010
   commonApi: http://172.27.0.12:8010
   h5CommonApi: http://172.27.0.12:8010
   h5CommonApi: http://172.27.0.12:8010
+  jwt:
+    # 加密秘钥
+    secret: f4e2e52034348f86b67cde581c0f9eb5
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 nuonuo:
 nuonuo:
   key: 10924508
   key: 10924508
   secret: A2EB20764D304D16
   secret: A2EB20764D304D16
+
 # 存储捅配置
 # 存储捅配置
 tencent_cloud_config:
 tencent_cloud_config:
   secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT
   secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT

+ 6 - 0
fs-service/src/main/resources/application-config-myhk.yml

@@ -65,6 +65,12 @@ watch:
 
 
 fs :
 fs :
   commonApi: http://172.27.0.7:8010
   commonApi: http://172.27.0.7:8010
+  jwt:
+    # 加密秘钥
+    secret: f4e2e52034348f86b67cde581c0f9eb5
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 nuonuo:
 nuonuo:
   key: 10924508
   key: 10924508
   secret: A2EB20764D304D16
   secret: A2EB20764D304D16

+ 7 - 1
fs-service/src/main/resources/application-config-zkzh.yml

@@ -110,7 +110,7 @@ tencent_cloud_config:
   secret_key: u5SuS80342xzx8FRBukza9lVNHKNMSaB
   secret_key: u5SuS80342xzx8FRBukza9lVNHKNMSaB
   bucket: zkzh-1323137866
   bucket: zkzh-1323137866
   app_id: 1323137866
   app_id: 1323137866
-  region: chongqing
+  region: ap-chongqing
   proxy: zkzh
   proxy: zkzh
 cloud_host:
 cloud_host:
   company_name: 中康
   company_name: 中康
@@ -134,6 +134,12 @@ watch:
 
 
 fs:
 fs:
   commonApi: http://172.21.76.167:8010
   commonApi: http://172.21.76.167:8010
+  jwt:
+    # 加密秘钥
+    secret: f4e2e52034348f86b67cde581c0f9eb5
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 nuonuo:
 nuonuo:
   key: 10924508
   key: 10924508
   secret: A2EB20764D304D16
   secret: A2EB20764D304D16

+ 3 - 1
fs-service/src/main/resources/mapper/course/FsUserCompanyBindMapper.xml

@@ -135,7 +135,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         c.dict_label projectName,
         c.dict_label projectName,
         e.course_name,
         e.course_name,
         IF(g.company_user_id = #{userId}, g.qw_user_name, '其他') qwUserName,
         IF(g.company_user_id = #{userId}, g.qw_user_name, '其他') qwUserName,
-        f.title videoName
+        f.title videoName,
+        qc.corp_name
         from
         from
         fs_user_company_bind a
         fs_user_company_bind a
         left join fs_user b on a.fs_user_id = b.user_id
         left join fs_user b on a.fs_user_id = b.user_id
@@ -143,6 +144,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         left join fs_user_course e on a.course_id = e.course_id
         left join fs_user_course e on a.course_id = e.course_id
         left join fs_user_course_video f on a.video_id = f.video_id
         left join fs_user_course_video f on a.video_id = f.video_id
         left join qw_user g on g.id = a.qw_user_id
         left join qw_user g on g.id = a.qw_user_id
+        left join qw_company qc on qc.id = a.qw_company_id
         <where>
         <where>
             <if test="externalUserId != null">
             <if test="externalUserId != null">
                 and a.qw_external_contact_id = #{externalUserId}
                 and a.qw_external_contact_id = #{externalUserId}

+ 4 - 0
fs-service/src/main/resources/mapper/his/FsDfAccountMapper.xml

@@ -50,6 +50,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectFsDfAccountVo"/>
         <include refid="selectFsDfAccountVo"/>
         where id = #{id}
         where id = #{id}
     </select>
     </select>
+    <select id="selectFsDfAccountByAccount" resultType="com.fs.his.domain.FsDfAccount">
+        <include refid="selectFsDfAccountVo"/>
+        where login_account like #{loginAccount}
+    </select>
 
 
     <insert id="insertFsDfAccount" parameterType="FsDfAccount" useGeneratedKeys="true" keyProperty="id">
     <insert id="insertFsDfAccount" parameterType="FsDfAccount" useGeneratedKeys="true" keyProperty="id">
         insert into fs_df_account
         insert into fs_df_account

+ 7 - 7
fs-service/src/main/resources/mapper/his/FsStoreOrderMapper.xml

@@ -571,7 +571,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             and so.status = #{maps.status}
             and so.status = #{maps.status}
         </if>
         </if>
         <if test="maps.status == 6">
         <if test="maps.status == 6">
-            and so.`status`= 1
+            and so.`status`= 2
             and (
             and (
             so.store_id in (select store_id from fs_store where delivery_type=2 or delivery_type=1)
             so.store_id in (select store_id from fs_store where delivery_type=2 or delivery_type=1)
             )
             )
@@ -779,7 +779,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 and so.status = #{maps.status}
                 and so.status = #{maps.status}
             </if>
             </if>
             <if test="maps.status == 6">
             <if test="maps.status == 6">
-                and so.`status`= 1
+                and so.`status`= 2
                 and (
                 and (
                 so.store_id in (select store_id from fs_store where delivery_type=2 or delivery_type=1)
                 so.store_id in (select store_id from fs_store where delivery_type=2 or delivery_type=1)
                 )
                 )
@@ -997,7 +997,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 and so.status = #{maps.status}
                 and so.status = #{maps.status}
             </if>
             </if>
             <if test="maps.status == 6">
             <if test="maps.status == 6">
-                and so.`status`= 1
+                and so.`status`= 2
                 and (
                 and (
                 so.store_id in (select store_id from fs_store where delivery_type=2 or delivery_type=1)
                 so.store_id in (select store_id from fs_store where delivery_type=2 or delivery_type=1)
                 )
                 )
@@ -1221,7 +1221,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             and so.status = #{maps.status}
             and so.status = #{maps.status}
         </if>
         </if>
         <if test="maps.status == 6">
         <if test="maps.status == 6">
-            and so.`status`= 1
+            and so.`status`= 2
             and ( so.store_id in (select store_id from fs_store where delivery_type=2 or delivery_type=1))
             and ( so.store_id in (select store_id from fs_store where delivery_type=2 or delivery_type=1))
             and  (so.extend_order_id is null or  so.extend_order_id like '')
             and  (so.extend_order_id is null or  so.extend_order_id like '')
         </if>
         </if>
@@ -1453,7 +1453,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             AND so.status = #{maps.status}
             AND so.status = #{maps.status}
         </if>
         </if>
         <if test="maps.status == 6">
         <if test="maps.status == 6">
-            AND so.`status` = 1
+            AND so.`status` = 2
             AND (
             AND (
             so.store_id IN (SELECT store_id FROM fs_store WHERE delivery_type=2 OR delivery_type=1)
             so.store_id IN (SELECT store_id FROM fs_store WHERE delivery_type=2 OR delivery_type=1)
             )
             )
@@ -1703,7 +1703,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 and so.status = #{maps.status}
                 and so.status = #{maps.status}
             </if>
             </if>
             <if test="maps.status == 6">
             <if test="maps.status == 6">
-                and so.`status`= 1
+                and so.`status`= 2
                 and (
                 and (
                 so.store_id in (select store_id from fs_store where delivery_type=2 or delivery_type=1)
                 so.store_id in (select store_id from fs_store where delivery_type=2 or delivery_type=1)
                 )
                 )
@@ -1914,7 +1914,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 and so.status = #{maps.status}
                 and so.status = #{maps.status}
             </if>
             </if>
             <if test="maps.status == 6">
             <if test="maps.status == 6">
-                and so.`status`= 1
+                and so.`status`= 2
                 and (
                 and (
                 so.store_id in (select store_id from fs_store where delivery_type=2 or delivery_type=1)
                 so.store_id in (select store_id from fs_store where delivery_type=2 or delivery_type=1)
                 )
                 )

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

@@ -342,7 +342,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         fs_user.remark,
         fs_user.remark,
         ucu.company_user_id,
         ucu.company_user_id,
         ucu.company_id,
         ucu.company_id,
-        ucu.project_id
+        ucu.project_id,
+        fs_user.integral,
+        if(fs_user.pay_count>0,1,0) as isBuy
         FROM
         FROM
         fs_user
         fs_user
         left join fs_user_company_user ucu on ucu.user_id = fs_user.user_id
         left join fs_user_company_user ucu on ucu.user_id = fs_user.user_id

+ 15 - 0
fs-service/src/main/resources/mapper/tulin/TulinInfoSyncLogMapper.xml

@@ -79,4 +79,19 @@
 
 
     </select>
     </select>
 
 
+    <resultMap id="selectCourseInfoMap" type="com.fs.tulin.entity.PeriodInfo">
+        <id column="course_id" property="courseId" />
+        <result column="course_name" property="courseName" />
+    </resultMap>
+
+    <select id="selectPeriodInfo" resultMap="selectCourseInfoMap">
+        SELECT DISTINCT fcwl.course_id, fuc.course_name
+        FROM
+            fs_course_watch_log AS fcwl
+                INNER JOIN fs_user_course AS fuc ON fuc.course_id  = fcwl.course_id
+        WHERE
+            fcwl.user_id = #{fsUserId}
+          AND fcwl.sop_id IS NOT NULL
+    </select>
+
 </mapper>
 </mapper>

+ 10 - 2
fs-user-app/src/main/java/com/fs/app/controller/CourseController.java

@@ -45,7 +45,8 @@ public class CourseController extends  AppBaseController{
     private IFsUserCourseStudyLogService courseStudyLogService;
     private IFsUserCourseStudyLogService courseStudyLogService;
     @Autowired
     @Autowired
     private IFsCourseSopAppLinkService courseSopAppLinkService;
     private IFsCourseSopAppLinkService courseSopAppLinkService;
-
+    @Autowired
+    ITencentCloudCosService tencentCloudCosService;
 
 
 //    @Cacheable(value="getCourseCate" )
 //    @Cacheable(value="getCourseCate" )
     @ApiOperation("获取分类")
     @ApiOperation("获取分类")
@@ -332,5 +333,12 @@ public class CourseController extends  AppBaseController{
         param.setUserId(Long.parseLong(getUserId()));
         param.setUserId(Long.parseLong(getUserId()));
         return courseService.getIntegralByCourseVideo(param);
         return courseService.getIntegralByCourseVideo(param);
     }
     }
-
+    @GetMapping("/videoTranscode")
+    public void videoTranscode(){
+        tencentCloudCosService.videoTranscode();
+    }
+    @GetMapping("/updateUrl")
+    public void updateUrl(){
+        tencentCloudCosService.updateUrl();
+    }
 }
 }

+ 20 - 1
fs-user-app/src/main/java/com/fs/app/controller/UserController.java

@@ -12,6 +12,7 @@ import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.exception.CustomException;
 import com.fs.common.exception.CustomException;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.sign.Md5Utils;
 import com.fs.common.utils.sign.Md5Utils;
+import com.fs.company.domain.CompanyUser;
 import com.fs.course.service.IFsUserCourseVideoService;
 import com.fs.course.service.IFsUserCourseVideoService;
 import com.fs.his.domain.FsDoctor;
 import com.fs.his.domain.FsDoctor;
 import com.fs.his.domain.FsPackage;
 import com.fs.his.domain.FsPackage;
@@ -39,6 +40,7 @@ import com.google.zxing.WriterException;
 import io.jsonwebtoken.lang.Assert;
 import io.jsonwebtoken.lang.Assert;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.BeanUtils;
@@ -134,7 +136,24 @@ public class UserController extends  AppBaseController {
             return R.error("操作异常");
             return R.error("操作异常");
         }
         }
     }
     }
-
+    @Login
+    @ApiOperation("获取用户信息ByUserId")
+    @GetMapping("/getUserInfoByUserId")
+    public R getUserInfoByUserId(
+            @ApiParam(required = true, name = "userId", value = "用户ID") @RequestParam(value = "userId", required = false) Long userId,
+            HttpServletRequest request){
+        try {
+            FsUser user=userService.selectFsUserByUserId(userId);
+            if (user.getPhone()!=null&&user.getPhone().length()>11&&!user.getPhone().matches("\\d+")){
+                user.setPhone(decryptPhoneMk(user.getPhone()));
+            }
+            Map<String,Object> map=new HashMap<>();
+            map.put("user",user);
+            return R.ok(map);
+        } catch (Exception e){
+            return R.error("操作异常");
+        }
+    }
     @Login
     @Login
     @ApiOperation("判断用户是否存在头像昵称")
     @ApiOperation("判断用户是否存在头像昵称")
     @GetMapping("/checkUserInfo")
     @GetMapping("/checkUserInfo")

+ 1 - 0
fs-user-app/src/main/java/com/fs/app/controller/course/CourseFsUserController.java

@@ -113,6 +113,7 @@ public class CourseFsUserController extends AppBaseController {
     @ApiOperation("答题")
     @ApiOperation("答题")
     @PostMapping("/courseAnswer")
     @PostMapping("/courseAnswer")
     @UserOperationLog(operationType = FsUserOperationEnum.ANSWER)
     @UserOperationLog(operationType = FsUserOperationEnum.ANSWER)
+    @RepeatSubmit
     public R courseAnswer(@RequestBody FsCourseQuestionAnswerUParam param){
     public R courseAnswer(@RequestBody FsCourseQuestionAnswerUParam param){
         if (ObjectUtil.isEmpty(param.getUserId())){
         if (ObjectUtil.isEmpty(param.getUserId())){
             Long userId = Long.parseLong(getUserId());
             Long userId = Long.parseLong(getUserId());

+ 32 - 0
fs-user-app/src/main/java/com/fs/app/controller/course/CourseQwController.java

@@ -7,6 +7,7 @@ import com.fs.app.annotation.Login;
 import com.fs.app.controller.AppBaseController;
 import com.fs.app.controller.AppBaseController;
 import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.R;
+import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.core.utils.OrderCodeUtils;
 import com.fs.core.utils.OrderCodeUtils;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.config.CourseConfig;
@@ -24,6 +25,7 @@ import com.fs.system.service.ISysConfigService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.github.pagehelper.PageInfo;
 import com.hc.openapi.tool.fastjson.JSON;
 import com.hc.openapi.tool.fastjson.JSON;
+import io.jsonwebtoken.Claims;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import io.swagger.annotations.ApiParam;
@@ -36,7 +38,9 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 import javax.validation.Valid;
 import java.util.ArrayList;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.List;
+import java.util.Map;
 
 
 @Api("企微看课接口")
 @Api("企微看课接口")
 @RestController
 @RestController
@@ -413,4 +417,32 @@ public class CourseQwController extends AppBaseController {
         return R.ok().put("data",course);
         return R.ok().put("data",course);
     }
     }
 
 
+
+    @ApiOperation("检测是否登录")
+    @GetMapping("/checkLogin")
+    public R checkLogin(){
+        try {
+            HttpServletRequest request = ServletUtils.getRequest();
+            //获取用户凭证
+            String token = request.getHeader(jwtUtils.getHeader());
+            if(StringUtils.isBlank(token)){
+                token = request.getParameter(jwtUtils.getHeader());
+            }
+            //检查token是否存在
+            if (StringUtils.isBlank(token)) {
+                return R.error(4001, "登录凭证不能为空,重新授权");
+            }
+            Claims claims=jwtUtils.getClaimByToken(token);
+            if(claims==null || jwtUtils.isTokenExpired(claims.getExpiration())){
+                return R.error(4004,"回传token校验失败,重新授权");
+            }
+            return R.ok();
+
+        }catch (Exception e){
+            logger.error("检测登录状态异常: {}", e.getMessage(), e);
+            return R.error("系统异常,请稍后重试");
+        }
+
+    }
+
 }
 }

+ 1 - 1
fs-user-app/src/main/java/com/fs/app/utils/JwtUtils.java

@@ -49,7 +49,7 @@ public class JwtUtils {
                     .parseClaimsJws(token)
                     .parseClaimsJws(token)
                     .getBody();
                     .getBody();
         }catch (Exception e){
         }catch (Exception e){
-            logger.debug("validate is token error ", e);
+            logger.error("验证令牌错误", e);
             return null;
             return null;
         }
         }
     }
     }