Forráskód Böngészése

Merge remote-tracking branch 'origin/bjcz_his_scrm' into bjcz_his_scrm

# Conflicts:
#	fs-admin/src/main/java/com/fs/course/controller/FsCourseQuestionBankController.java
#	fs-service/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodDaysServiceImpl.java
#	fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderScrmMapper.java
#	fs-service/src/main/java/com/fs/hisStore/service/IFsStoreOrderScrmService.java
#	fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
#	fs-user-app/src/main/java/com/fs/app/controller/store/CompanyUserScrmController.java
吴树波 1 hete
szülő
commit
fdd37ad679
28 módosított fájl, 433 hozzáadás és 324 törlés
  1. 18 6
      fs-admin/src/main/java/com/fs/course/controller/FsCourseQuestionBankController.java
  2. 12 2
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreHealthOrderScrmController.java
  3. 21 3
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java
  4. 13 0
      fs-admin/src/main/java/com/fs/qw/qwTask/qwTask.java
  5. 1 1
      fs-company/src/main/java/com/fs/company/controller/live/LiveController.java
  6. 1 1
      fs-company/src/main/java/com/fs/company/controller/store/FsUserAddressController.java
  7. 0 1
      fs-company/src/main/java/com/fs/company/controller/store/FsUserController.java
  8. 2 1
      fs-company/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java
  9. 1 1
      fs-service/src/main/java/com/fs/company/mapper/CompanyMapper.java
  10. 0 2
      fs-service/src/main/java/com/fs/course/service/IFsCourseQuestionBankService.java
  11. 0 1
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseQuestionBankServiceImpl.java
  12. 21 5
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodDaysServiceImpl.java
  13. 13 0
      fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java
  14. 6 0
      fs-service/src/main/java/com/fs/his/service/IFsUserService.java
  15. 32 0
      fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java
  16. 1 0
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderScrmMapper.java
  17. 5 2
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductScrmMapper.java
  18. 3 3
      fs-service/src/main/java/com/fs/hisStore/param/FsUserAddressAddEditParam.java
  19. 4 0
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreOrderScrmService.java
  20. 139 185
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
  21. 0 1
      fs-service/src/main/java/com/fs/qw/service/IQwExternalContactService.java
  22. 2 2
      fs-service/src/main/java/com/fs/qw/service/impl/QwWatchLogServiceImpl.java
  23. 1 1
      fs-service/src/main/java/com/fs/sop/mapper/SopUserLogsMapper.java
  24. 2 2
      fs-service/src/main/resources/application-druid-bjczwh-test.yml
  25. 2 2
      fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml
  26. 21 0
      fs-service/src/main/resources/mapper/his/FsUserMapper.xml
  27. 2 3
      fs-service/src/main/resources/mapper/sop/SopUserLogsMapper.xml
  28. 110 99
      fs-user-app/src/main/java/com/fs/app/controller/store/CompanyUserScrmController.java

+ 18 - 6
fs-admin/src/main/java/com/fs/course/controller/FsCourseQuestionBankController.java

@@ -161,14 +161,26 @@ public class FsCourseQuestionBankController extends BaseController
 
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         Long userId = loginUser.getUser().getUserId();
+
+        // 读取配置
         String json = configService.selectConfigByKey("course.config");
         CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
-        if (ObjectUtil.isNotEmpty(config.getIsBound())&&config.getIsBound()){
-            String message = fsCourseQuestionBankService.importData(list, loginUser.getUser().getNickName(),userId);
-            return AjaxResult.success(message);
-        }
-        String message = fsCourseQuestionBankService.importData(list, loginUser.getUser().getNickName(),null);
-        return AjaxResult.success(message);
+
+        // 绑定状态控制 userId
+        Long finalUserId = (ObjectUtil.isNotEmpty(config.getIsBound()) && config.getIsBound())
+                ? userId
+                : null;
+
+        // 调用 service
+        String result =
+                fsCourseQuestionBankService.importData(list, loginUser.getUser().getNickName(), finalUserId);
+
+        // 返回 message + failList
+        Map<String, Object> resp = new HashMap<>();
+        resp.put("message", result);
+        resp.put("failList", list);
+
+        return AjaxResult.success(resp);
     }
 
     @GetMapping(value = "/getByIds")

+ 12 - 2
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreHealthOrderScrmController.java

@@ -110,6 +110,8 @@ public class FsStoreHealthOrderScrmController extends BaseController {
             for (FsStoreOrderVO vo : list) {
                 if(vo.getPhone()!=null){
                     vo.setPhone(vo.getPhone().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2"));
+                }
+                if(vo.getUserPhone()!=null){
                     vo.setUserPhone(vo.getUserPhone().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2"));
                 }
                 if (CloudHostUtils.hasCloudHostName("康年堂")){
@@ -121,7 +123,11 @@ public class FsStoreHealthOrderScrmController extends BaseController {
                 }
                 //
                 if (loginUser.getPermissions().contains("his:storeAfterSales:finance") || loginUser.getPermissions().contains("*:*:*")) {
-                    vo.setFPrice(vo.getCost().multiply(BigDecimal.valueOf(vo.getTotalNum())));
+                    if (vo.getCost() != null && vo.getTotalNum() != null) {
+                        vo.setFPrice(vo.getCost().multiply(BigDecimal.valueOf(vo.getTotalNum())));
+                    } else {
+                        vo.setFPrice(BigDecimal.ZERO);
+                    }
                 } else {
                     vo.setPayPostage(BigDecimal.ZERO);
                     vo.setCost(BigDecimal.ZERO);
@@ -309,7 +315,11 @@ public class FsStoreHealthOrderScrmController extends BaseController {
                 }
                 //
                 if (loginUser.getPermissions().contains("his:storeAfterSales:finance") || loginUser.getPermissions().contains("*:*:*")) {
-                    vo.setFPrice(vo.getCost().multiply(BigDecimal.valueOf(vo.getTotalNum())));
+                    if (vo.getCost() != null && vo.getTotalNum() != null) {
+                        vo.setFPrice(vo.getCost().multiply(BigDecimal.valueOf(vo.getTotalNum())));
+                    } else {
+                        vo.setFPrice(BigDecimal.ZERO);
+                    }
                 } else {
                     vo.setPayPostage(BigDecimal.ZERO);
                     vo.setCost(BigDecimal.ZERO);

+ 21 - 3
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java

@@ -203,6 +203,8 @@ public class FsStoreOrderScrmController extends BaseController {
             for (FsStoreOrderVO vo : list) {
                 if(vo.getPhone()!=null){
                     vo.setPhone(vo.getPhone().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2"));
+                }
+                if(vo.getUserPhone()!=null){
                     vo.setUserPhone(vo.getUserPhone().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2"));
                 }
                 if (CloudHostUtils.hasCloudHostName("康年堂")){
@@ -214,7 +216,11 @@ public class FsStoreOrderScrmController extends BaseController {
                 }
                 //
                 if (loginUser.getPermissions().contains("his:storeAfterSales:finance") || loginUser.getPermissions().contains("*:*:*")) {
-                    vo.setFPrice(vo.getCost().multiply(BigDecimal.valueOf(vo.getTotalNum())));
+                    if (vo.getCost() != null && vo.getTotalNum() != null) {
+                        vo.setFPrice(vo.getCost().multiply(BigDecimal.valueOf(vo.getTotalNum())));
+                    } else {
+                        vo.setFPrice(BigDecimal.ZERO);
+                    }
                 } else {
                     vo.setPayPostage(BigDecimal.ZERO);
                     vo.setCost(BigDecimal.ZERO);
@@ -268,6 +274,8 @@ public class FsStoreOrderScrmController extends BaseController {
             for (FsStoreOrderVO vo : list) {
                 if(vo.getPhone()!=null){
                     vo.setPhone(vo.getPhone().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2"));
+                }
+                if(vo.getUserPhone()!=null){
                     vo.setUserPhone(vo.getUserPhone().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2"));
                 }
 
@@ -471,7 +479,11 @@ public class FsStoreOrderScrmController extends BaseController {
                 }
                 //
                 if (loginUser.getPermissions().contains("his:storeAfterSales:finance") || loginUser.getPermissions().contains("*:*:*")) {
-                    vo.setFPrice(vo.getCost().multiply(BigDecimal.valueOf(vo.getTotalNum())));
+                    if (vo.getCost() != null && vo.getTotalNum() != null) {
+                        vo.setFPrice(vo.getCost().multiply(BigDecimal.valueOf(vo.getTotalNum())));
+                    } else {
+                        vo.setFPrice(BigDecimal.ZERO);
+                    }
                 } else {
                     vo.setPayPostage(BigDecimal.ZERO);
                     vo.setCost(BigDecimal.ZERO);
@@ -526,7 +538,11 @@ public class FsStoreOrderScrmController extends BaseController {
                 }
                 //
                 if (loginUser.getPermissions().contains("his:storeAfterSales:finance") || loginUser.getPermissions().contains("*:*:*")) {
-                    vo.setFPrice(vo.getCost().multiply(BigDecimal.valueOf(vo.getTotalNum())));
+                    if (vo.getCost() != null && vo.getTotalNum() != null) {
+                        vo.setFPrice(vo.getCost().multiply(BigDecimal.valueOf(vo.getTotalNum())));
+                    } else {
+                        vo.setFPrice(BigDecimal.ZERO);
+                    }
                 } else {
                     vo.setPayPostage(BigDecimal.ZERO);
                     vo.setCost(BigDecimal.ZERO);
@@ -801,6 +817,8 @@ public class FsStoreOrderScrmController extends BaseController {
             for (FsStoreOrderVO vo : list) {
                 if(vo.getPhone()!=null){
                     vo.setPhone(vo.getPhone().replaceAll("(\\d{3})\\d*(\\d{1})", "$1****$2"));
+                }
+                if(vo.getUserPhone()!=null){
                     vo.setUserPhone(vo.getUserPhone().replaceAll("(\\d{3})\\d*(\\d{1})", "$1****$2"));
                 }
 

+ 13 - 0
fs-admin/src/main/java/com/fs/qw/qwTask/qwTask.java

@@ -1,6 +1,7 @@
 package com.fs.qw.qwTask;
 
 import com.fs.course.service.IFsUserCourseService;
+import com.fs.his.service.IFsUserService;
 import com.fs.qw.domain.QwIpadServerLog;
 import com.fs.qw.domain.QwUser;
 import com.fs.qw.mapper.QwUserMapper;
@@ -72,6 +73,9 @@ public class qwTask {
     @Autowired
     private WxWorkService wxWorkService;
 
+    @Autowired
+    private IFsUserService fsUserService;
+
 
     //正在使用
     public void qwExternalContact()
@@ -286,4 +290,13 @@ public class qwTask {
         qwUserMapper.updateQwUser(u);
     }
 
+    /**
+     * 自动解除误封禁的用户
+     * 定时任务:将 fs_user 表中 status=0 且 remark 为 null 的用户
+     * 自动恢复为 status=1,并设置 remark="自动解除封禁"
+     */
+    public void autoUnbanMistakenlyDisabledUsers() {
+        fsUserService.autoUnbanMistakenlyDisabledUsers();
+    }
+
 }

+ 1 - 1
fs-company/src/main/java/com/fs/company/controller/live/LiveController.java

@@ -54,7 +54,7 @@ public class LiveController extends BaseController
     /**
      * 查询未结束直播间
      */
-    @PreAuthorize("@ss.hasPermi('live:live:list')")
+//    @PreAuthorize("@ss.hasPermi('live:live:list')")
     @GetMapping("/listToLiveNoEnd")
     public TableDataInfo listToLiveNoEnd(Live live)
     {

+ 1 - 1
fs-company/src/main/java/com/fs/company/controller/store/FsUserAddressController.java

@@ -103,7 +103,7 @@ public class FsUserAddressController extends BaseController
     /**
      * 新增用户地址
      */
-    @PreAuthorize("@ss.hasPermi('his:userAddress:add')")
+//    @PreAuthorize("@ss.hasPermi('his:userAddress:add')")
     @Log(title = "用户地址", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody FsUserAddress fsUserAddress)

+ 0 - 1
fs-company/src/main/java/com/fs/company/controller/store/FsUserController.java

@@ -203,7 +203,6 @@ public class FsUserController extends BaseController
     /**
      * 新增用户
      */
-    @PreAuthorize("@ss.hasPermi('his:user:add')")
     @Log(title = "用户", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody FsUser fsUser)

+ 2 - 1
fs-company/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java

@@ -85,7 +85,6 @@ public class FsStoreOrderScrmController extends BaseController
     /**
      * 查询订单列表
      */
-    @PreAuthorize("@ss.hasPermi('store:storeOrder:list')")
     @GetMapping("/list")
     public TableDataInfo list(FsStoreOrderParam param)
     {
@@ -408,6 +407,8 @@ public class FsStoreOrderScrmController extends BaseController
             for (FsStoreOrderVO vo : list) {
                 if(vo.getPhone()!=null){
                     vo.setPhone(vo.getPhone().replaceAll("(\\d{3})\\d*(\\d{1})", "$1****$2"));
+                }
+                if(vo.getUserPhone()!=null){
                     vo.setUserPhone(vo.getUserPhone().replaceAll("(\\d{3})\\d*(\\d{1})", "$1****$2"));
                 }
 

+ 1 - 1
fs-service/src/main/java/com/fs/company/mapper/CompanyMapper.java

@@ -155,7 +155,7 @@ public interface CompanyMapper
 
 
     @Select({"<script> " +
-            "select c.*,cu.user_name,qu.used_num,t1.config_value->>'$.mchId' as mchId FROM company c LEFT JOIN company_user cu ON c.user_id =cu.user_id  " +
+            "select c.*,cu.user_name,qu.used_num,IF(t1.config_value IS NOT NULL AND t1.config_value != '', t1.config_value->>'$.mchId', NULL) as mchId FROM company c LEFT JOIN company_user cu ON c.user_id =cu.user_id  " +
             " left join company_config t1 on t1.config_key = 'redPacket:config' and t1.company_id = c.company_id " +
             "LEFT JOIN (select company_id, count(id) as used_num from qw_user where server_id is not null and server_status = 1 group by company_id) qu ON qu.company_id = c.company_id " +
             "where c.is_del=0 " +

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

@@ -3,10 +3,8 @@ package com.fs.course.service;
 import com.fs.common.core.domain.R;
 import com.fs.course.domain.FsCourseQuestionBank;
 import com.fs.course.dto.FsCourseQuestionBankImportDTO;
-import com.fs.course.dto.ImportResultDTO;
 import com.fs.course.param.FsCourseQuestionAnswerUParam;
 
-import javax.validation.constraints.Size;
 import java.util.List;
 
 /**

+ 0 - 1
fs-service/src/main/java/com/fs/course/service/impl/FsCourseQuestionBankServiceImpl.java

@@ -11,7 +11,6 @@ import com.fs.common.utils.StringUtils;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.*;
 import com.fs.course.dto.FsCourseQuestionBankImportDTO;
-import com.fs.course.dto.ImportResultDTO;
 import com.fs.course.mapper.*;
 import com.fs.course.param.FsCourseQuestionAnswerUParam;
 import com.fs.course.service.IFsCourseQuestionBankService;

+ 21 - 5
fs-service/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodDaysServiceImpl.java

@@ -20,6 +20,7 @@ import com.fs.course.param.CompanyRedPacketParam;
 import com.fs.course.param.CourseAnalysisParam;
 import com.fs.course.param.PeriodCountParam;
 import com.fs.course.service.IFsUserCoursePeriodDaysService;
+import com.fs.course.service.IFsUserCourseVideoService;
 import com.fs.course.vo.FsPeriodCountVO;
 import com.fs.course.vo.PeriodRedPacketVO;
 import com.fs.course.vo.UpdateCourseTimeVo;
@@ -32,6 +33,7 @@ import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -53,7 +55,6 @@ import java.util.stream.Collectors;
  * @date 2025-04-16
  */
 @Service
-@AllArgsConstructor
 @Slf4j
 public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCoursePeriodDaysMapper, FsUserCoursePeriodDays> implements IFsUserCoursePeriodDaysService {
 
@@ -63,7 +64,22 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
     private final SysConfigMapper sysConfigMapper;
 
     private final FsUserCoursePeriodDaysMapper fsUserCoursePeriodDaysMapper;
-    private final FsUserCourseVideoMapper fsUserCourseVideoMapper;
+
+    @Lazy
+    private final IFsUserCourseVideoService fsUserCourseVideoService;
+
+    public FsUserCoursePeriodDaysServiceImpl(
+            FsUserCoursePeriodMapper fsUserCoursePeriodMapper,
+            FsUserMapper fsUserMapper,
+            SysConfigMapper sysConfigMapper,
+            FsUserCoursePeriodDaysMapper fsUserCoursePeriodDaysMapper,
+            @Lazy IFsUserCourseVideoService fsUserCourseVideoService) {
+        this.fsUserCoursePeriodMapper = fsUserCoursePeriodMapper;
+        this.fsUserMapper = fsUserMapper;
+        this.sysConfigMapper = sysConfigMapper;
+        this.fsUserCoursePeriodDaysMapper = fsUserCoursePeriodDaysMapper;
+        this.fsUserCourseVideoService = fsUserCourseVideoService;
+    }
 
     @Autowired
     private FsUserCourseVideoRedPackageMapper fsUserCourseVideoRedPackageMapper;
@@ -167,7 +183,7 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
         AtomicInteger i = new AtomicInteger(0);
         FsUserCourseVideo fsUserCourseVideo = new FsUserCourseVideo();
         fsUserCourseVideo.setCourseId(entity.getCourseId());
-        List<FsUserCourseVideo> videoList = fsUserCourseVideoMapper.selectFsUserCourseVideoListByCourseId(fsUserCourseVideo);
+        List<FsUserCourseVideo> videoList = fsUserCourseVideoService.selectFsUserCourseVideoListByCourseId(fsUserCourseVideo);
         Map<Long, FsUserCourseVideo> videoMap = PubFun.listToMapByGroupObject(videoList, FsUserCourseVideo::getVideoId);
         List<FsUserCoursePeriodDays> collect = entity.getVideoIds().stream().map(e -> {
             FsUserCourseVideo video = videoMap.get(e);
@@ -280,7 +296,7 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
             // 7. 获取视频详情并按courseSort排序
             FsUserCourseVideo queryVideo = new FsUserCourseVideo();
             queryVideo.setCourseId(param.getCourseId());
-            List<FsUserCourseVideo> videoList = fsUserCourseVideoMapper.selectFsUserCourseVideoListByCourseId(queryVideo);
+            List<FsUserCourseVideo> videoList = fsUserCourseVideoService.selectFsUserCourseVideoListByCourseId(queryVideo);
             Map<Long, FsUserCourseVideo> videoMap = PubFun.listToMapByGroupObject(videoList, FsUserCourseVideo::getVideoId);
 
             // 8. 验证视频是否都存在
@@ -330,7 +346,7 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
                     // 按日期排序,获取最后一个课程的日期
                     LocalDate lastDate = existingDays.stream()
                             .map(FsUserCoursePeriodDays::getDayDate)
-                            .filter(Objects::nonNull)
+                            .filter(date -> date != null)
                             .max(LocalDate::compareTo)
                             .orElse(period.getPeriodStartingTime().plusDays(startLesson - 2));
 

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

@@ -469,4 +469,17 @@ public interface FsUserMapper
     void updateUserOrderCountAndAmount(@Param("userId") Long userId, @Param("amount") BigDecimal amount);
 
     List<FsUser> selectFsUserListByPhone(String phone);
+
+    /**
+     * 查询被误封禁的用户(status=0且remark为null)
+     * @return 用户列表
+     */
+    List<FsUser> selectMistakenlyDisabledUsers();
+
+    /**
+     * 自动解除被误封禁的用户(status=0且remark为null)
+     * 将status改为1,remark设置为"自动解除封禁"
+     * @return 更新的记录数
+     */
+    int autoUnbanMistakenlyDisabledUsers();
 }

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

@@ -200,6 +200,12 @@ public interface IFsUserService
 
     List<FsUser> selectUserByIds(String userIds);
 
+    /**
+     * 自动解除被误封禁的用户(status=0且remark为null)
+     * @return 解除封禁的用户数量
+     */
+    int autoUnbanMistakenlyDisabledUsers();
+
 
     /**
      * 根据组合key(用户昵称+id)查询用户信息

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

@@ -1576,4 +1576,36 @@ public class FsUserServiceImpl implements IFsUserService {
         return fsUserMapper.selectFsUserListByPhone(phone);
     }
 
+    /**
+     * 自动解除被误封禁的用户(status=0且remark为null)
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int autoUnbanMistakenlyDisabledUsers() {
+        try {
+            // 查询所有status=0且remark为null的用户
+            List<FsUser> disabledUsers = fsUserMapper.selectMistakenlyDisabledUsers();
+            
+            if (disabledUsers == null || disabledUsers.isEmpty()) {
+                logger.info("自动解除封禁定时任务:未发现需要解除的用户");
+                return 0;
+            }
+
+            String[] userIds = disabledUsers.stream()
+                    .map(user -> String.valueOf(user.getUserId()))
+                    .toArray(String[]::new);
+            
+            // 批量更新:设置status=1,remark="自动解除封禁"
+            int count = fsUserMapper.autoUnbanMistakenlyDisabledUsers();
+            
+            logger.info("自动解除封禁定时任务:成功解除 {} 个用户的封禁状态,用户ID: {}", 
+                    count, String.join(", ", userIds));
+            
+            return count;
+        } catch (Exception e) {
+            logger.error("自动解除封禁定时任务执行失败:{}", e.getMessage(), e);
+            throw e;
+        }
+    }
+
 }

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

@@ -1415,4 +1415,5 @@ public interface FsStoreOrderScrmMapper
 
     @Select("select * from fs_store_order_scrm where  `status`=2 and (extend_order_id is not null and extend_order_id != '') and (delivery_id is not null and delivery_id != '')")
     List<FsStoreOrderScrm> selectShippedOrder();
+
 }

+ 5 - 2
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductScrmMapper.java

@@ -193,7 +193,11 @@ public interface FsStoreProductScrmMapper
             "<if test = 'maps.isStores != null and maps.isStores == 1   '>"+
             "inner join fs_store_scrm fs on fs.store_id = p.store_id and fs.is_audit = 1 " +
             "</if>" +
-            "where p.is_del=0 and p.is_show=1  and p.is_audit = '1'" +
+            "where p.is_del=0 and p.is_show=1 " +
+            // 改为可选审核条件,如果不需要审核就不加这个条件
+            "<if test = 'maps.isStores != null and maps.isStores == 1'>" +
+            "and p.is_audit = '1'" +
+            "</if>" +
             "<if test = 'maps.productName != null and  maps.productName !=\"\"    '> " +
             "and (p.product_name like CONCAT('%',#{maps.productName},'%')  or p.keyword like concat('%',#{maps.productName},'%') ) " +
             "</if>" +
@@ -230,7 +234,6 @@ public interface FsStoreProductScrmMapper
             "<if test = 'maps.salesOrder != null  and maps.salesOrder==\"asc\" '> " +
             "order by p.sales asc " +
             "</if>" +
-
             "<if test = 'maps.newOrder != null and maps.newOrder==\"desc\" '> " +
             "and p.is_new =1 order by p.create_time desc  " +
             "</if>" +

+ 3 - 3
fs-service/src/main/java/com/fs/hisStore/param/FsUserAddressAddEditParam.java

@@ -35,15 +35,15 @@ public class FsUserAddressAddEditParam implements Serializable
     private String phone;
 
     /** 收货人所在省 */
-    @NotBlank(message = "收货人地址不能为空")
+//    @NotBlank(message = "收货人地址不能为空")
     private String province;
 
     /** 收货人所在市 */
-    @NotBlank(message = "收货人地址不能为空")
+//    @NotBlank(message = "收货人地址不能为空")
     private String city;
 
     /** 收货人所在区 */
-    @NotBlank(message = "收货人地址不能为空")
+//    @NotBlank(message = "收货人地址不能为空")
     private String district;
 
     /** 收货人详细地址 */

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

@@ -354,6 +354,10 @@ public interface IFsStoreOrderScrmService
 
     R receiveWaybillPush(String body);
 
+
+    R importDeliveryNoteExpress(List<FsOrderDeliveryNoteDTO> dtoList, String miniAppId);
+
+
     /**
      * 套餐包制单
      * @param companyUser 销售

+ 139 - 185
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -399,6 +399,9 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
     @Autowired
     private IFsStoreCartScrmService fsStoreCartScrmService;
 
+    @Autowired
+    private CompanyUserUserMapper companyUserUserMapper;
+
     @PostConstruct
     public void initErpServiceMap() {
         erpServiceMap = new HashMap<>();
@@ -3177,6 +3180,12 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                 }
 
                 FsShippingTemplatesRegionScrm shippingTemplatesRegion = shippingTemplatesRegionMap.get(tempId);
+
+                // 如果该运费模板在当前城市没有配置运费区域,跳过该商品
+                if (shippingTemplatesRegion == null) {
+                    continue;
+                }
+
                 BigDecimal price = NumberUtil.round(NumberUtil.mul(storeCartVO.getCartNum(),
                         storeCartVO.getPrice()), 2);
                 if (!templateDTOMap.containsKey(tempId)) {
@@ -5013,7 +5022,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                 return R.ok("接收成功").put("code", "ok");
             }
             String failMsg = addParam.getFailMsg();
-            if (com.hc.openapi.tool.util.StringUtils.isNotBlank(failMsg)) {
+            if (StringUtils.isNotBlank(failMsg)) {
                 if (failMsg.equals("暂未结果, 请稍后再查")) {
                     return R.ok("接收成功").put("code", "ok");
                 }
@@ -5068,7 +5077,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                             if (rlsDetails != null && !rlsDetails.isEmpty()) {
                                 RlsDetail rlsDetail = rlsDetails.get(0);
                                 String proName = rlsDetail.getProName();
-                                if (com.hc.openapi.tool.util.StringUtils.isNotBlank(proName)) {
+                                if (StringUtils.isNotBlank(proName)) {
                                     FsStoreOrderScrm order = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(orderNumber);
                                     if (order != null && order.getStatus() == 2) {
                                         order.setDeliveryId(mailNumber);
@@ -5140,194 +5149,139 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         return null;
     }
 
-//    @Override
-//    public List<FsStoreOrderDeliveryNoteExportVO> getDeliveryNote(FsStoreOrderParam param) {
-//        return fsStoreOrderMapper.getDeliveryNote(param);
-//    }
-//
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public R importDeliveryNoteExpress(List<FsOrderDeliveryNoteDTO> dtoList, String appId) {
-//        try {
-//            StringBuilder builder = new StringBuilder();
-//            //获取商城配置
-//            String json = configService.selectConfigByKey("store.config");
-//            StoreConfig config = JSONUtil.toBean(json, StoreConfig.class);
-//
-//            List<FsOrderDeliveryNoteDTO> successList = new ArrayList<>(dtoList.size());
-//            //提前获取所有必要数据
-//            Map<String, String> expressDeliveryMap = buildExpressDeliveryMap();
-//            //提取所有有效订单号
-//            List<String> orderCodeList = new ArrayList<>(dtoList.size());
-//            for (int i = 0; i < dtoList.size(); i++) {
-//                FsOrderDeliveryNoteDTO dto = dtoList.get(i);
-//                if (StringUtils.isEmpty(dto.getOrderNumber())) {
-//                    builder.append("数据第").append(i + 2).append("行系统订单为空!").append(System.lineSeparator());
-//                }
-//                if (StringUtils.isEmpty(dto.getLogisticsCompany())) {
-//                    builder.append("数据第").append(i + 2).append("行物流公司为空!").append(System.lineSeparator());
-//                }
-//                if (StringUtils.isEmpty(dto.getDeliveryId())) {
-//                    builder.append("数据第").append(i + 2).append("行快递单号为空!").append(System.lineSeparator());
-//                } else {
-//                    //处理订单ID信息
-//                    String originalOrderNumber = dto.getOrderNumber();
-//                    String processedOrderNumber = extractNumbers(originalOrderNumber);
-//                    dto.setOrderNumber(processedOrderNumber);
-//                    orderCodeList.add(dto.getOrderNumber());
-//                }
-//            }
-//
-//            //批量查询订单信息
-//            if (orderCodeList.isEmpty()) {
-//                return R.ok(builder.toString());
-//            }
-//            List<FsStoreOrderCodeOpenIdVo> orderCodeOpenIdVoList = fsStoreOrderMapper.selectOrderCodeOpenIdInOrderCode(orderCodeList);
-//            Map<String, OrderOpenIdTransDTO> orderMap = new HashMap<>(orderCodeOpenIdVoList.size());
-//            Map<String, List<FsStoreOrderCodeOpenIdVo>> orderDetailsMap = new HashMap<>(orderCodeOpenIdVoList.size());
-//
-//            for (FsStoreOrderCodeOpenIdVo vo : orderCodeOpenIdVoList) {
-//                orderMap.computeIfAbsent(vo.getId(), k -> {
-//                    OrderOpenIdTransDTO dto = new OrderOpenIdTransDTO();
-//                    dto.setOpenId(vo.getOpenId());
-//                    dto.setTransactionId(vo.getOutTransId());
-//                    return dto;
-//                });
-//
-//                orderDetailsMap
-//                        .computeIfAbsent(vo.getId(), k -> new ArrayList<>())
-//                        .add(vo);
-//            }
-//            final WxMaService wxService = WxMaConfiguration.getMaService(appId);
-//            String uploadTime = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"))
-//                    .format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
-//
-//            for (int i = 0; i < dtoList.size(); i++) {
-//                FsOrderDeliveryNoteDTO dto = dtoList.get(i);
-//                int rowNum = i + 2;
-//                if (StringUtils.isEmpty(dto.getOrderNumber())) {
-//                    continue;
-//                }
-//                if (StringUtils.isEmpty(dto.getDeliveryId())) {
-//                    builder.append("数据第").append(rowNum).append("行快递单号为空!")
-//                            .append(System.lineSeparator());
-//                    continue;
-//                }
-//
-//                if (StringUtils.isEmpty(dto.getLogisticsCompany())) {
-//                    builder.append("数据第").append(rowNum).append("行快递公司编号为空!")
-//                            .append(System.lineSeparator());
-//                    continue;
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R importDeliveryNoteExpress(List<FsOrderDeliveryNoteDTO> dtoList, String appId) {
+        try {
+            StringBuilder builder = new StringBuilder();
+            //获取商城配置
+            String json = configService.selectConfigByKey("store.config");
+            StoreConfig config = JSONUtil.toBean(json, StoreConfig.class);
+
+            List<FsOrderDeliveryNoteDTO> successList = new ArrayList<>(dtoList.size());
+            //提前获取所有必要数据
+            Map<String, String> expressDeliveryMap = buildExpressDeliveryMap();
+            //提取所有有效订单号
+            List<String> orderCodeList = new ArrayList<>(dtoList.size());
+            for (int i = 0; i < dtoList.size(); i++) {
+                FsOrderDeliveryNoteDTO dto = dtoList.get(i);
+                if (StringUtils.isEmpty(dto.getOrderNumber())) {
+                    builder.append("数据第").append(i + 2).append("行系统订单为空!").append(System.lineSeparator());
+                }
+                if (StringUtils.isEmpty(dto.getLogisticsCompany())) {
+                    builder.append("数据第").append(i + 2).append("行物流公司为空!").append(System.lineSeparator());
+                }
+                if (StringUtils.isEmpty(dto.getDeliveryId())) {
+                    builder.append("数据第").append(i + 2).append("行快递单号为空!").append(System.lineSeparator());
+                } else {
+                    //处理订单ID信息
+                    String originalOrderNumber = dto.getOrderNumber();
+                    String processedOrderNumber = extractNumbers(originalOrderNumber);
+                    dto.setOrderNumber(processedOrderNumber);
+                    orderCodeList.add(dto.getOrderNumber());
+                }
+            }
+
+            //批量查询订单信息
+            if (orderCodeList.isEmpty()) {
+                return R.ok(builder.toString());
+            }
+            List<FsStoreOrderCodeOpenIdVo> orderCodeOpenIdVoList = fsStoreOrderMapper.selectOrderCodeOpenIdInOrderCode(orderCodeList);
+            Map<String, OrderOpenIdTransDTO> orderMap = new HashMap<>(orderCodeOpenIdVoList.size());
+            Map<String, List<FsStoreOrderCodeOpenIdVo>> orderDetailsMap = new HashMap<>(orderCodeOpenIdVoList.size());
+
+            for (FsStoreOrderCodeOpenIdVo vo : orderCodeOpenIdVoList) {
+                orderMap.computeIfAbsent(vo.getId(), k -> {
+                    OrderOpenIdTransDTO dto = new OrderOpenIdTransDTO();
+                    dto.setOpenId(vo.getOpenId());
+                    dto.setTransactionId(vo.getOutTransId());
+                    return dto;
+                });
+
+                orderDetailsMap
+                        .computeIfAbsent(vo.getId(), k -> new ArrayList<>())
+                        .add(vo);
+            }
+            final WxMaService wxService = WxMaConfiguration.getMaService(appId);
+            String uploadTime = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"))
+                    .format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
+
+            for (int i = 0; i < dtoList.size(); i++) {
+                FsOrderDeliveryNoteDTO dto = dtoList.get(i);
+                int rowNum = i + 2;
+                if (StringUtils.isEmpty(dto.getOrderNumber())) {
+                    continue;
+                }
+                if (StringUtils.isEmpty(dto.getDeliveryId())) {
+                    builder.append("数据第").append(rowNum).append("行快递单号为空!")
+                            .append(System.lineSeparator());
+                    continue;
+                }
+
+                if (StringUtils.isEmpty(dto.getLogisticsCompany())) {
+                    builder.append("数据第").append(rowNum).append("行快递公司编号为空!")
+                            .append(System.lineSeparator());
+                    continue;
+                }
+//                if (dto.getDeliveryStatus() == null) {
+//                    dto.setDeliveryStatus(0);
 //                }
-////                if (dto.getDeliveryStatus() == null) {
-////                    dto.setDeliveryStatus(0);
-////                }
-////                if (ObjectUtil.isNotNull(dto.getDeliveryTime())) {
-////                    dto.setDeliveryTime(parseCstToDateOnlyString(dto.getDeliveryTime()));
-////                }
-////
-////                if (ObjectUtil.isNotNull(dto.getDeliveryPayTime()) &&
-////                        !dto.getDeliveryPayTime().isEmpty()) {
-////                    dto.setDeliveryPayTime(parseCstToDateOnlyString(dto.getDeliveryPayTime()));
-////                }
-//                // 验证快递公司
-//                String deliverySn = expressDeliveryMap.get(dto.getLogisticsCompany());
-//                if (deliverySn == null) {
-//                    builder.append("数据第").append(rowNum).append("行订单号为")
-//                            .append(dto.getOrderNumber()).append("物流公司名称异常")
-//                            .append(System.lineSeparator());
-//                    continue;
+//                if (ObjectUtil.isNotNull(dto.getDeliveryTime())) {
+//                    dto.setDeliveryTime(parseCstToDateOnlyString(dto.getDeliveryTime()));
 //                }
-//                dto.setDeliverySn(deliverySn);
 //
-//                // 检查订单是否存在
-//                String orderNumber = dto.getOrderNumber();
-//                OrderOpenIdTransDTO orderInfo = orderMap.get(orderNumber);
-//                if (orderInfo == null) {
-//                    builder.append("数据第").append(rowNum).append("行订单号")
-//                            .append(orderNumber).append("不存在").append(System.lineSeparator());
-//                    continue;
-//                }
-//                //验证是否开启微信发货
-//                if (config.getIsWeChatShipping() != null && config.getIsWeChatShipping()) {
-//                    // 上传物流信息到微信
-//                    List<FsStoreOrderCodeOpenIdVo> orderDetails = orderDetailsMap.get(orderNumber);
-//                    if (uploadShippingInfoToWechat(wxService, orderInfo, orderDetails, dto, uploadTime)) {
-//                        successList.add(dto);
-//                    } else {
-//                        builder.append("数据第").append(rowNum).append("行订单号为")
-//                                .append(orderNumber).append("上传微信失败").append(System.lineSeparator());
-//                    }
-//                } else {
-//                    successList.add(dto);
+//                if (ObjectUtil.isNotNull(dto.getDeliveryPayTime()) &&
+//                        !dto.getDeliveryPayTime().isEmpty()) {
+//                    dto.setDeliveryPayTime(parseCstToDateOnlyString(dto.getDeliveryPayTime()));
 //                }
-//            }
-//
-//            //批量更新数据
-//            if (!successList.isEmpty()) {
-//                batchUpdateDeliveryNotes(successList);
-//            }
-//
-//            return R.ok(builder.toString().equals("") ? "操作成功!" : builder.toString());
-//        } catch (Exception e) {
-//            log.error("导入发货单快递信息失败", e);
-//            return R.error("导入失败:" + e.getMessage());
-//        }
-//    }
+                // 验证快递公司
+                String deliverySn = expressDeliveryMap.get(dto.getLogisticsCompany());
+                if (deliverySn == null) {
+                    builder.append("数据第").append(rowNum).append("行订单号为")
+                            .append(dto.getOrderNumber()).append("物流公司名称异常")
+                            .append(System.lineSeparator());
+                    continue;
+                }
+                dto.setDeliverySn(deliverySn);
+
+                // 检查订单是否存在
+                String orderNumber = dto.getOrderNumber();
+                OrderOpenIdTransDTO orderInfo = orderMap.get(orderNumber);
+                if (orderInfo == null) {
+                    builder.append("数据第").append(rowNum).append("行订单号")
+                            .append(orderNumber).append("不存在").append(System.lineSeparator());
+                    continue;
+                }
+                //验证是否开启微信发货
+                if (config.getIsWeChatShipping() != null && config.getIsWeChatShipping()) {
+                    // 上传物流信息到微信
+                    List<FsStoreOrderCodeOpenIdVo> orderDetails = orderDetailsMap.get(orderNumber);
+                    if (uploadShippingInfoToWechat(wxService, orderInfo, orderDetails, dto, uploadTime)) {
+                        successList.add(dto);
+                    } else {
+                        builder.append("数据第").append(rowNum).append("行订单号为")
+                                .append(orderNumber).append("上传微信失败").append(System.lineSeparator());
+                    }
+                } else {
+                    successList.add(dto);
+                }
+            }
+
+            //批量更新数据
+            if (!successList.isEmpty()) {
+                batchUpdateDeliveryNotes(successList);
+            }
+
+            return R.ok(builder.toString().equals("") ? "操作成功!" : builder.toString());
+        } catch (Exception e) {
+            log.error("导入发货单快递信息失败", e);
+            return R.error("导入失败:" + e.getMessage());
+        }
+    }
+
 
-//    @Override
-//    @Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED)
-//    public void refreshOrderSettlementStatus() {
-//        try {
-//            // 判断是否对接微信发货
-//            String json = configService.selectConfigByKey("store.config");
-//            StoreConfig config = JSONUtil.toBean(json, StoreConfig.class);
-//            logger.info("进入微信结算订单定时任务--------------->{}", "start");
-//            if (config != null && config.getIsWeChatShipping() != null && config.getIsWeChatShipping()) {
-//                // 获取未结算订单
-//                List<FsStoreOrderScrm> orderScrmList = fsStoreOrderMapper.getUnsettledOrder();
-//
-////                String payConfig = configService.selectConfigByKey("store.pay");
-//                String payConfig = configService.selectConfigByKey("his.pay");
-//                JSONObject js = JSON.parseObject(payConfig);
-//                String appId = js.getString("appId");
-//
-//                if (ObjectUtil.isNotNull(appId) && !appId.isEmpty()) {
-//                    final WxMaService wxService = WxMaConfiguration.getMaService(appId);
-//
-//                    if (!orderScrmList.isEmpty()) {
-//                        for (FsStoreOrderScrm order : orderScrmList) {
-//                            WxMaOrderShippingInfoGetRequest request = new WxMaOrderShippingInfoGetRequest();
-//                            request.setTransactionId(order.getBankTransactionId());
-//                            WxMaOrderShippingInfoGetResponse response;
-//
-//                            try {
-//                                response = wxService.getWxMaOrderShippingService().get(request);
-//
-//                                if (response.getErrCode().equals(0)) {
-//                                    // 订单状态枚举:(1) 待发货;(2) 已发货;(3) 确认收货;(4) 交易完成;(5) 已退款
-//                                    if (response.getOrder().getOrderState().equals(3) || response.getOrder().getOrderState().equals(4)) {
-//                                        if (order.getStatus() == OrderInfoEnum.STATUS_2.getValue()) {
-//                                            this.finishOrder(order.getId());
-//                                        }
-//                                    }
-//                                    logger.info("请求信息------------------------》{}", response);
-//                                }
-//
-//                            } catch (WxErrorException e) {
-//                                logger.info("异常信息------------------------》{}", e.getMessage());
-//                                continue;
-//                            }
-//                        }
-//                    }
-//                }
-//            }
-//        } catch (Exception e) {
-//            e.getStackTrace();
-//        } finally {
-//            logger.info("进入微信结算订单定时任务--------------->{}", "end");
-//        }
-//    }
 
     private void batchUpdateDeliveryNotes(List<FsOrderDeliveryNoteDTO> list) {
         int batchSize = 500;

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

@@ -258,5 +258,4 @@ public interface IQwExternalContactService extends IService<QwExternalContact> {
      * */
     QwExternalContact selectQwUserListVOByQwUserIdAndCorpIdAndExternalUserId(ExternalContactParam externalContactParam);
 
-    List<QwExternalContact> selectQwUserAndLevel(List<Long> qwUserIdList, List<String> levelList, boolean isReg);
 }

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

@@ -210,7 +210,7 @@ public class QwWatchLogServiceImpl extends ServiceImpl<QwWatchLogMapper, QwWatch
         for (QwWatchLogStatisticsListVO vo : vos) {
             Long id = vo.getId();
             Date createTime = vo.getCreateTime();
-            QwWatchLogStatisticsListVO stat = qwWatchLogMapper.selectQwWatchLogByQwUserId(id, createTime);
+            QwWatchLogStatisticsListVO stat = qwWatchLogMapper.selectQwExtCountByDayAndOther(id, createTime);
             vo.setD1Online(stat.getD1Online());
             vo.setD1Over(stat.getD1Over());
             vo.setFirstOnline(stat.getFirstOnline());
@@ -357,7 +357,7 @@ public class QwWatchLogServiceImpl extends ServiceImpl<QwWatchLogMapper, QwWatch
         for (QwWatchLogStatisticsListVO vo : vos) {
             Long id = vo.getId();
             Date createTime = vo.getCreateTime();
-            QwWatchLogStatisticsListVO stat = qwWatchLogMapper.selectQwWatchLogByQwUserId(id, createTime);
+            QwWatchLogStatisticsListVO stat = qwWatchLogMapper.selectQwExtCountByDayAndOther(id, createTime);
             vo.setD1Online(stat.getD1Online());
             vo.setD1Over(stat.getD1Over());
             vo.setFirstOnline(stat.getFirstOnline());

+ 1 - 1
fs-service/src/main/java/com/fs/sop/mapper/SopUserLogsMapper.java

@@ -349,7 +349,7 @@ List<SopUserLogsVO> selectSopUserLogsGroupListByParam(@Param("maps") SopUserLogs
     List<SopUserLogs> queryAllSopUserLogs();
 
     @DataSource(DataSourceType.SOP)
-    List<SopUserLogs> selectSopUserLogsListByIds(List<String> ids);
+    List<SopUserLogs> selectSopUserLogsListByIds(@Param("ids") List<String> ids);
 
     @DataSource(DataSourceType.SOP)
     void updateSopuserLogsDateById(UpdateSopUserLogDateVo vo);

+ 2 - 2
fs-service/src/main/resources/application-druid-bjczwh-test.yml

@@ -39,7 +39,7 @@ spring:
             druid:
                 # 主库数据源
                 master:
-                    url: jdbc:mysql://1.95.177.188:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    url: jdbc:mysql://1.95.54.246:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                     username: czwh
                     password: Ylrz_1q2w3e4r5t6y
                 # 从库数据源
@@ -94,7 +94,7 @@ spring:
             druid:
                 # 主库数据源
                 master:
-                    url: jdbc:mysql://1.95.177.188:3306/fs_his_sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    url: jdbc:mysql://1.95.54.246:3306/fs_his_sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                     username: czwh
                     password: Ylrz_1q2w3e4r5t6y
                 # 初始连接数

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

@@ -144,10 +144,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 and l.camp_period_time &lt;= #{maps.scheduleEndTime}
             </if>
             <if test= 'maps.upSTime != null '>
-                and l.update_time &gt;= #{maps.upSTime}
+                and DATE(l.update_time) &gt;= DATE(#{maps.upSTime})
             </if>
             <if test='maps.upETime != null '>
-                and l.update_time &lt;= #{maps.upETime}
+                and DATE(l.update_time) &lt;= DATE(#{maps.upETime})
             </if>
             <if test="maps.sopIds != null and maps.sopIds.size() > 0">
                 and l.sop_id in

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

@@ -2433,5 +2433,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         select * from fs_user where phone=#{phone}
     </select>
 
+    <!-- 查询被误封禁的用户(status=0且remark为null) -->
+    <select id="selectMistakenlyDisabledUsers" resultMap="FsUserResult">
+        SELECT *
+        FROM fs_user
+        WHERE status = 0
+          AND (remark IS NULL OR remark = '')
+          AND is_del = 0
+        ORDER BY user_id
+    </select>
+
+    <!-- 自动解除被误封禁的用户(status=0且remark为null) -->
+    <update id="autoUnbanMistakenlyDisabledUsers">
+        UPDATE fs_user
+        SET status = 1,
+            remark = '自动解除封禁',
+            update_time = NOW()
+        WHERE status = 0
+          AND (remark IS NULL OR remark = '')
+          AND is_del = 0
+    </update>
+
 
 </mapper>

+ 2 - 3
fs-service/src/main/resources/mapper/sop/SopUserLogsMapper.xml

@@ -446,7 +446,7 @@
         </where>
     </select>
 
-    <select id="selectSopUserLogsListByIds" resultType="java.util.Map">
+    <select id="selectSopUserLogsListByIds" resultType="com.fs.sop.domain.SopUserLogs">
         select
             id,
             sop_id,
@@ -456,9 +456,8 @@
             status
         from sop_user_logs
         <where>
-            status = 0
             <if test="ids != null and ids.size() > 0">
-                and id in
+                id in
                 <foreach collection="ids" item="item" open="(" close=")" separator=",">
                     #{item}
                 </foreach>

+ 110 - 99
fs-user-app/src/main/java/com/fs/app/controller/store/CompanyUserScrmController.java

@@ -3,6 +3,7 @@ package com.fs.app.controller.store;
 
 import cn.hutool.core.img.ImgUtil;
 import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.qrcode.QrCodeUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
@@ -16,7 +17,6 @@ import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.exception.CustomException;
 import com.fs.common.utils.CloudHostUtils;
-import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.sign.Md5Utils;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyUser;
@@ -35,6 +35,12 @@ import com.fs.fastgptApi.util.AudioUtils;
 import com.fs.fastgptApi.vo.AudioVO;
 import com.fs.framework.security.SecurityUtils;
 import com.fs.his.dto.PayConfigDTO;
+import com.fs.sop.domain.QwSopTempVoice;
+import com.fs.sop.service.IQwSopTempVoiceService;
+import com.fs.system.service.ISysConfigService;
+import com.fs.system.oss.CloudStorageService;
+import com.fs.system.oss.OSSFactory;
+import com.fs.his.dto.PayConfigDTO;
 import com.fs.his.service.IFsPrescribeService;
 import com.fs.sop.domain.QwSopTempVoice;
 import com.fs.sop.service.IQwSopTempVoiceService;
@@ -64,19 +70,20 @@ import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 import static com.fs.app.controller.CompanyUserController.SOP_TEMP_VOICE_KEY;
+import java.util.stream.Collectors;
 
 
 @Api("销售中心")
 @RestController
-@RequestMapping(value = "/store/app/companyUser")
+@RequestMapping(value="/store/app/companyUser")
 public class CompanyUserScrmController extends AppBaseController {
-    @Autowired
-    private ISysConfigService configService;
+
+    private static final String SOP_TEMP_VOICE_KEY = "sop:temp:voice";
+
     @Autowired
     private FSConfig fsConfig;
     @Autowired
-    RedisCache redisCache;
-
+    private RedisCache redisCache;
     @Autowired
     private ICompanyUserService companyUserService;
     @Autowired
@@ -84,38 +91,41 @@ public class CompanyUserScrmController extends AppBaseController {
 
     @Autowired
     private ICompanyUserUserService companyUserUserService;
-
-
     @Autowired
-    private CompanyUserMapper companyUserMapper;
-
+    private IQwSopTempVoiceService voiceService;
     @Autowired
-    private IFsPrescribeService fsPrescribeService;
+    private ISysConfigService configService;
     @Autowired
-    private IQwSopTempVoiceService voiceService;
+    private CompanyUserMapper companyUserMapper;
+    @Autowired
+    private AiHostProper aiHostProper;
     @Autowired
     private FastgptChatVoiceHomoMapper fastgptChatVoiceHomoMapper;
+
+
+
     @Autowired
-    AiHostProper aiHostProper;
+    private IFsPrescribeService fsPrescribeService;
+
 
     @PostMapping("/login")
-    public R Login(@RequestBody CompanyUserLoginParam param, HttpServletRequest request) {
+    public R Login(@RequestBody CompanyUserLoginParam param, HttpServletRequest request){
         try {
-            CompanyUser companyUser = companyUserService.selectUserByUserName(param.getUserName());
-            if (companyUser == null || companyUser.getDelFlag().equals("1")) {
+            CompanyUser companyUser=companyUserService.selectUserByUserName(param.getUserName());
+            if(companyUser==null||companyUser.getDelFlag().equals("1")){
                 return R.error("用户不存在");
             }
-            if (!companyUser.getStatus().equals("0")) {
+            if(!companyUser.getStatus().equals("0")){
                 return R.error("用户已禁用");
 
             }
-            String pwd = SecurityUtils.encryptPassword(param.getPassword());
-            if (!SecurityUtils.matchesPassword(param.getPassword(), companyUser.getPassword())) {
+            String pwd=SecurityUtils.encryptPassword(param.getPassword());
+            if(!SecurityUtils.matchesPassword(param.getPassword(),companyUser.getPassword())){
                 return R.error("密码不正确");
             }
-            redisCache.setCacheObject("company-user-token:" + Md5Utils.hash(companyUser.getUserId().toString()), companyUser.getUserId(), 5, TimeUnit.DAYS);
+            redisCache.setCacheObject("company-user-token:"+Md5Utils.hash(companyUser.getUserId().toString()),companyUser.getUserId(),5, TimeUnit.DAYS);
             return R.ok().put("companyUserToken", Md5Utils.hash(companyUser.getUserId().toString()));
-        } catch (Exception e) {
+        } catch (Exception e){
 
             return R.error("操作异常");
         }
@@ -124,51 +134,50 @@ public class CompanyUserScrmController extends AppBaseController {
     @Login
     @ApiOperation("绑定销售")
     @PostMapping("/bindCompanyUser")
-    public R bindCompanyUser(@Validated @RequestBody FsBindCompanyUserParam param, HttpServletRequest request) {
-        CompanyUserUser map = new CompanyUserUser();
+    public R bindCompanyUser(@Validated @RequestBody FsBindCompanyUserParam param, HttpServletRequest request){
+        CompanyUserUser map=new CompanyUserUser();
         map.setCompanyUserId(param.getCompanyUserId());
         map.setUserId(Long.parseLong(getUserId()));
-        List<CompanyUserUser> list = companyUserUserService.selectCompanyUserUserList(map);
-        if (list == null || list.size() == 0) {
-            CompanyUser companyUser = companyUserService.selectCompanyUserById(param.getCompanyUserId());
-            if (companyUser != null && companyUser.getStatus().equals("0")) {
+        List<CompanyUserUser> list= companyUserUserService.selectCompanyUserUserList(map);
+        if(list==null||list.size()==0){
+            CompanyUser companyUser=companyUserService.selectCompanyUserById(param.getCompanyUserId());
+            if(companyUser!=null&&companyUser.getStatus().equals("0")){
                 map.setCompanyId(companyUser.getCompanyId());
                 companyUserUserService.insertCompanyUserUser(map);
             }
         }
         return R.ok();
     }
-
     @ApiOperation("获取销售信息")
     @GetMapping("/getUserInfo")
-    public R getUserInfo(@RequestParam("token") String token, HttpServletRequest request) {
-        Long userId = redisCache.getCacheObject("company-user-token:" + token);
-        if (userId == null) {
-            return R.error(403, "用户失效");
+    public R getUserInfo(@RequestParam("token")String token, HttpServletRequest request){
+        Long userId=redisCache.getCacheObject("company-user-token:"+token);
+        if(userId==null){
+            return R.error(403,"用户失效");
         }
-        CompanyUser companyUser = companyUserService.selectCompanyUserById(userId);
-        if (companyUser == null || companyUser.getDelFlag().equals("1")) {
+        CompanyUser companyUser=companyUserService.selectCompanyUserById(userId);
+        if(companyUser==null||companyUser.getDelFlag().equals("1")){
             return R.error("用户不存在");
         }
-        if (!companyUser.getStatus().equals("0")) {
+        if(!companyUser.getStatus().equals("0")){
             return R.error("用户已禁用");
         }
-        return R.ok().put("data", companyUser);
+        return R.ok().put("data",companyUser);
     }
 
     @ApiOperation("获取销售名片")
     @GetMapping("/getCompanyUserCard")
-    public R getCompanyUserCard(@RequestParam("cardId") Long cardId, HttpServletRequest request) {
+    public R getCompanyUserCard(@RequestParam("cardId")Long cardId,HttpServletRequest request){
         //获取用户码
-        CompanyUserCard companyUserCard = companyUserCardService.selectCompanyUserCardById(cardId);
-        return R.ok().put("data", companyUserCard);
+        CompanyUserCard companyUserCard=companyUserCardService.selectCompanyUserCardById(cardId);
+        return R.ok().put("data",companyUserCard);
     }
 
     @GetMapping("/query/{id}")
-    public R querySopVoiceById(@PathVariable("id") Long id) {
+    public R querySopVoiceById(@PathVariable("id") Long id){
         QwSopTempVoice tempVoice = voiceService.selectQwSopTempVoiceById(id);
         AudioVO audioVO = new AudioVO();
-        if (tempVoice != null) {
+        if(tempVoice != null){
             audioVO.setId(tempVoice.getId());
             audioVO.setVoiceTxt(tempVoice.getVoiceTxt());
             audioVO.setUrl(tempVoice.getVoiceUrl());
@@ -179,23 +188,24 @@ public class CompanyUserScrmController extends AppBaseController {
         return R.ok().put("data", audioVO);
     }
 
+    @Login
     @ApiOperation("获取支付宝收款码")
     @GetMapping("/getQrImg")
-    public R getQrImg(@RequestParam("token") String token, HttpServletRequest request) {
-        Long userId = redisCache.getCacheObject("company-user-token:" + token);
+    public R getQrImg(@RequestParam("token")String token,HttpServletRequest request){
+        Long userId=redisCache.getCacheObject("company-user-token:"+token);
         try {
-            CompanyUser companyUser = companyUserService.selectCompanyUserById(userId);
+            CompanyUser companyUser=companyUserService.selectCompanyUserById(userId);
             File newFile = new File("qr.jpg");
             File newFileT = new File("simsunb.ttf");
             try {
-                InputStream stream = getClass().getClassLoader().getResourceAsStream("qr.jpg");
+                InputStream stream =  getClass().getClassLoader().getResourceAsStream("qr.jpg");
                 FileUtils.copyInputStreamToFile(stream, newFile);
                 // if(!newFile.exists()){
                 //     InputStream stream =  getClass().getClassLoader().getResourceAsStream("fx.jpg");
                 //     FileUtils.copyInputStreamToFile(stream, newFile);
                 // }
-                if (!newFileT.exists()) {
-                    InputStream streamT = getClass().getClassLoader()
+                if(!newFileT.exists()){
+                    InputStream streamT =  getClass().getClassLoader()
                             .getResourceAsStream("simsunb.ttf");
                     FileUtils.copyInputStreamToFile(streamT, newFileT);
                 }
@@ -205,9 +215,10 @@ public class CompanyUserScrmController extends AppBaseController {
             }
 
             try {
-                String url = fsConfig.getQrPath() + "/qr-" + userId + ".jpg";
+                String url=fsConfig.getQrPath()+"/qr-"+userId+".jpg";
                 File outputFile = new File(url);
-                if (!outputFile.exists()) {
+                if(!outputFile.exists())
+                {
                     try {
                         outputFile.createNewFile();
 
@@ -227,8 +238,9 @@ public class CompanyUserScrmController extends AppBaseController {
 //                        100, //y坐标修正值。 默认在中间,偏移量相对于中间偏移
 //                        0.8f//透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
 //                );
-                File qr = new File(fsConfig.getQrPath() + "/qr-" + userId + ".png");
-                if (!qr.exists()) {
+                File qr = new File(fsConfig.getQrPath()+"/qr-"+userId+".png");
+                if(!qr.exists())
+                {
                     try {
                         qr.createNewFile();
 
@@ -236,8 +248,8 @@ public class CompanyUserScrmController extends AppBaseController {
                         e.printStackTrace();
                     }
                 }
-                QrCodeUtil.generate("http://alipay.yjf.runtzh.com/#/?companyId=" + companyUser.getCompanyId() + "&companyUserId=" + companyUser.getUserId(), 200, 200,
-                        FileUtil.file(fsConfig.getQrPath() + "/qr-" + userId + ".png"));
+                QrCodeUtil.generate( "http://alipay.yjf.runtzh.com/#/?companyId="+companyUser.getCompanyId()+"&companyUserId="+companyUser.getUserId(), 200, 200,
+                        FileUtil.file(fsConfig.getQrPath()+"/qr-"+userId+".png"));
                 ImgUtil.pressImage(
                         newFile,
                         outputFile,
@@ -246,13 +258,13 @@ public class CompanyUserScrmController extends AppBaseController {
                         20, //y坐标修正值。 默认在中间,偏移量相对于中间偏移
                         1f
                 );
-                return R.ok().put("url", "profile/qr/qr-" + userId + ".jpg");
+                return R.ok().put("url","profile/qr/qr-"+userId+".jpg");
 
             } catch (Exception e) {
                 e.printStackTrace();
                 return R.error("操作异常");
             }
-        } catch (Exception e) {
+        } catch (Exception e){
 
             return R.error("操作异常");
         }
@@ -260,31 +272,31 @@ public class CompanyUserScrmController extends AppBaseController {
 
     @ApiOperation("获取公司收款码")
     @GetMapping("/getCompanyWxaCodeByPayment")
-    public R getCompanyWxaCodeByPayment(@RequestParam("companyId") Long companyId,
+    public R getCompanyWxaCodeByPayment(@RequestParam("companyId")Long companyId,
                                         @RequestParam(value = "appId", required = false) String appId,
                                         @RequestParam(required = false) Long companyUserId,
-                                        HttpServletRequest request) {
+                                        HttpServletRequest request){
 
         String json = configService.selectConfigByKey("his.pay");
         PayConfigDTO payConfigDTO = JSONUtil.toBean(json, PayConfigDTO.class);
-        if (appId == null || appId.trim().isEmpty()) {
+        if (appId == null || appId.trim().isEmpty() ) {
             appId = payConfigDTO.getAppId();
         }
         //获取用户码
         String WxaCode;
-        if (CloudHostUtils.hasCloudHostName("鸿森堂")) {
+        if(CloudHostUtils.hasCloudHostName("鸿森堂")) {
             WxaCode = redisCache.getCacheObject("company-wxa-code:" + companyId + ":" + appId + ":" + companyUserId);
         } else {
             WxaCode = redisCache.getCacheObject("company-wxa-code:" + companyId + ":" + appId);
         }
-        return R.ok().put("data", WxaCode);
+        return R.ok().put("data",WxaCode);
     }
 
 
     @ApiOperation("上传声纹")
     @PostMapping("/addVoicePrintUrl")
     public R addVoicePrintUrl(@RequestBody companyUserAddPrintParam param) throws Exception {
-        Long userId = param.getCompanyUserId();
+        Long userId=param.getCompanyUserId();
         CompanyUser companyUser = new CompanyUser();
         companyUser.setUserId(userId);
         companyUser.setVoicePrintUrl(param.getVoicePrintUrl());
@@ -305,8 +317,8 @@ public class CompanyUserScrmController extends AppBaseController {
 
         try {
             CloseableHttpClient httpClient = HttpClients.createDefault();
-            HttpPost httpPost = new HttpPost(aiHostProper.getCommonApi() + "/app/common/addCompanyAudio");
-            String json = "{\"url\":\"" + wavUrl + "\",\"id\":\"" + userId + "\"}";
+            HttpPost httpPost = new HttpPost(aiHostProper.getCommonApi()+"/app/common/addCompanyAudio");
+            String json = "{\"url\":\""+wavUrl+"\",\"id\":\""+userId+"\"}";
             StringEntity entity = new StringEntity(json);
             httpPost.setEntity(entity);
             httpPost.setHeader("Content-type", "application/json");
@@ -315,8 +327,8 @@ public class CompanyUserScrmController extends AppBaseController {
             if (response.getStatusLine().getStatusCode() == 200) {
                 String responseBody = EntityUtils.toString(response.getEntity());
                 JSONObject jsonObject = JSON.parseObject(responseBody);
-                Integer code = (Integer) jsonObject.get("code");
-                if (code == 200) {
+                Integer code = (Integer)jsonObject.get("code");
+                if (code==200){
                     voiceService.insertQwSopTempVoiceModel(userId);
                     return R.ok();
                 }
@@ -334,44 +346,44 @@ public class CompanyUserScrmController extends AppBaseController {
     }
 
     @GetMapping("/querySopVoiceList")
-    public TableDataInfo querySopVoiceList(@RequestParam("companyUserId") Long companyUserId, @RequestParam("recordType") Integer recordType) {
+    public TableDataInfo querySopVoiceList(@RequestParam("companyUserId")Long companyUserId,@RequestParam("recordType") Integer recordType){
         startPage();
         QwSopTempVoice sopTempVoice = new QwSopTempVoice();
         sopTempVoice.setRecordType(recordType);
 
-        Long userId = companyUserId;
+        Long userId=companyUserId;
         sopTempVoice.setCompanyUserId(userId);
         List<QwSopTempVoice> sopTempVoices = voiceService.selectQwSopTempVoiceNewList(sopTempVoice);
         return getDataTable(sopTempVoices);
     }
 
     @GetMapping("/createUserAllVoice")
-    public R createUserAllVoice(@RequestParam("companyUserId") Long companyUserId) {
+    public R createUserAllVoice(@RequestParam("companyUserId")Long companyUserId){
         QwSopTempVoice sopTempVoice = new QwSopTempVoice();
         sopTempVoice.setRecordType(0);
 
-        if (companyUserId == null) {
-            throw new CustomException("未登录", 403);
+        if(companyUserId==null){
+            throw  new CustomException("未登录",403);
         }
 
-        if (companyUserId != null) {
+        if(companyUserId != null){
             CompanyUser companyUser = companyUserMapper.selectCompanyUserByCompanyUserId(companyUserId);
-            if (companyUser != null && companyUser.getVoicePrintUrl() == null) {
-                return R.ok().put("code", 201).put("msg", "账号未录制声纹,请录制后再试!");
+            if(companyUser != null && companyUser.getVoicePrintUrl() == null){
+                return R.ok().put("code",201).put("msg","账号未录制声纹,请录制后再试!");
             }
         }
 
         sopTempVoice.setCompanyUserId(companyUserId);
         List<QwSopTempVoice> sopTempVoices = voiceService.selectQwSopTempVoiceNewList(sopTempVoice);
-        if (sopTempVoices != null && !sopTempVoices.isEmpty()) {
+        if(sopTempVoices != null && !sopTempVoices.isEmpty()){
             List<Long> newCompanyUserId = redisCache.getVoiceAllList(SOP_TEMP_VOICE_KEY);
-            if (newCompanyUserId != null && newCompanyUserId.contains(companyUserId)) {
-                return R.error().put("code", 202).put("msg", "语音还未转换完成,请完成后再添加!");
-            } else {
-                redisCache.setVoice(SOP_TEMP_VOICE_KEY, companyUserId);
-                sopTempVoices.forEach(m -> m.setVoiceTxt(m.getVoiceTxt().replace(" ", "")));
+            if(newCompanyUserId != null && newCompanyUserId.contains(companyUserId)){
+                return R.error().put("code",202).put("msg","语音还未转换完成,请完成后再添加!");
+            }else{
+                redisCache.setVoice(SOP_TEMP_VOICE_KEY,companyUserId);
+                sopTempVoices.forEach(m -> m.setVoiceTxt(m.getVoiceTxt().replace(" ","")));
                 redisCache.setVoiceList(SOP_TEMP_VOICE_KEY + ":" + companyUserId, sopTempVoices);
-                return R.ok().put("msg", "语音已加入队列进行转换,请耐心等待!");
+                return R.ok().put("msg","语音已加入队列进行转换,请耐心等待!");
             }
         }
         return null;
@@ -379,30 +391,30 @@ public class CompanyUserScrmController extends AppBaseController {
 
 
     @GetMapping("/companyUserVoice")
-    public R companyUserVoice(@RequestParam("companyUserId") Long companyUserId, @RequestParam("id") Long id) {
+    public R companyUserVoice(@RequestParam("companyUserId")Long companyUserId,@RequestParam("id") Long id){
         AudioVO audioVO = new AudioVO();
 
 
         List<QwSopTempVoice> sopTempVoices = redisCache.getVoiceAllList(SOP_TEMP_VOICE_KEY + ":" + companyUserId);
-        if (sopTempVoices != null && !sopTempVoices.isEmpty()) {
+        if(sopTempVoices != null && !sopTempVoices.isEmpty()){
             List<Long> collect = sopTempVoices.stream().map(QwSopTempVoice::getId).collect(Collectors.toList());
-            if (collect.contains(id)) {
-                return R.ok().put("code", 202).put("msg", "该语音已进入转换,请完成后再试。");
+            if (collect.contains(id)){
+                return R.ok().put("code",202).put("msg","该语音已进入转换,请完成后再试。");
             }
         }
 
-        if (companyUserId != null) {
+        if(companyUserId != null){
             CompanyUser companyUser = companyUserMapper.selectCompanyUserByCompanyUserId(companyUserId);
-            if (companyUser != null && companyUser.getVoicePrintUrl() == null) {
-                return R.ok().put("code", 201).put("msg", "账号未录制声纹,请录制后再试!");
+            if(companyUser != null && companyUser.getVoicePrintUrl() == null){
+                return R.ok().put("code",201).put("msg","账号未录制声纹,请录制后再试!");
             }
         }
 
         QwSopTempVoice qwSopTempVoice = voiceService.selectQwSopTempVoiceById(id);
-        if (qwSopTempVoice != null && qwSopTempVoice.getCompanyUserId() != null) {
+        if(qwSopTempVoice != null && qwSopTempVoice.getCompanyUserId() != null){
             List<FastgptChatVoiceHomo> homos = fastgptChatVoiceHomoMapper.selectFastgptChatVoiceHomoList(new FastgptChatVoiceHomo());
-            audioVO = AudioUtils.createUserUrlAndUrl(homos, qwSopTempVoice.getCompanyUserId(), qwSopTempVoice.getVoiceTxt().replace(" ", ""));
-            if (audioVO != null && audioVO.getWavUrl() != null && audioVO.getUrl() != null) {
+            audioVO = AudioUtils.createUserUrlAndUrl(homos,qwSopTempVoice.getCompanyUserId(), qwSopTempVoice.getVoiceTxt().replace(" ",""));
+            if(audioVO != null && audioVO.getWavUrl() != null &&  audioVO.getUrl() != null){
                 qwSopTempVoice.setVoiceUrl(audioVO.getUrl());
                 qwSopTempVoice.setUserVoiceUrl(audioVO.getWavUrl());
                 qwSopTempVoice.setDuration(audioVO.getDuration());
@@ -415,28 +427,27 @@ public class CompanyUserScrmController extends AppBaseController {
 
     /**
      * 当只有user_voice_url时,生成表中对应条的voice_url
-     *
-     * @param userVoiceUrl wav格式的语音文件
-     * @param id           qw_sop_temp_voice的id
+     * @param userVoiceUrl  wav格式的语音文件
+     * @param id            qw_sop_temp_voice的id
      * @return
      */
     @GetMapping("/companyUserVoiceNew")
-    public R companyUserVoiceNew(@RequestParam("companyUserId") Long companyUserId, @RequestParam("id") Long id, @RequestParam("userVoiceUrl") String userVoiceUrl) {
+    public R companyUserVoiceNew( @RequestParam("companyUserId")Long companyUserId,@RequestParam("id") Long id,@RequestParam("userVoiceUrl") String userVoiceUrl){
 
         AudioVO audioVO = new AudioVO();
 
         List<QwSopTempVoice> sopTempVoices = redisCache.getVoiceAllList(SOP_TEMP_VOICE_KEY + ":" + companyUserId);
-        if (sopTempVoices != null && !sopTempVoices.isEmpty()) {
+        if(sopTempVoices != null && !sopTempVoices.isEmpty()){
             List<Long> collect = sopTempVoices.stream().map(QwSopTempVoice::getId).collect(Collectors.toList());
-            if (collect.contains(id)) {
-                return R.ok().put("code", 202).put("msg", "该语音已进入转换,请完成后再试。");
+            if (collect.contains(id)){
+                return R.ok().put("code",202).put("msg","该语音已进入转换,请完成后再试。");
             }
         }
 
         QwSopTempVoice qwSopTempVoice = voiceService.selectQwSopTempVoiceByIdAndUserVoiceUrl(id);
-        if (qwSopTempVoice != null && qwSopTempVoice.getId() != null) {
+        if(qwSopTempVoice != null && qwSopTempVoice.getId() != null){
             audioVO = AudioUtils.createVoiceUrl(qwSopTempVoice.getCompanyUserId(), userVoiceUrl);
-            if (audioVO != null && audioVO.getUrl() != null) {
+            if(audioVO != null && audioVO.getUrl() != null){
                 qwSopTempVoice.setVoiceUrl(audioVO.getUrl());
                 qwSopTempVoice.setUserVoiceUrl(userVoiceUrl);
                 qwSopTempVoice.setDuration(audioVO.getDuration());